From 205f02125f584eb2c4e99052bca14e6d7a30787f Mon Sep 17 00:00:00 2001 From: Song Gao Date: Tue, 22 Sep 2020 14:27:55 +0800 Subject: [PATCH 01/60] executor: add an OOMAction for copIterator to adaptive control the memory usage (#19246) --- distsql/distsql.go | 11 +- distsql/distsql_test.go | 2 +- executor/analyze.go | 4 +- executor/executor_test.go | 90 ++++++++++++++++ kv/kv.go | 2 +- store/tikv/coprocessor.go | 218 ++++++++++++++++++++++++++++++++++++-- util/mock/client.go | 3 +- 7 files changed, 314 insertions(+), 16 deletions(-) diff --git a/distsql/distsql.go b/distsql/distsql.go index a224b29764b92..3bf8e1d652fe4 100644 --- a/distsql/distsql.go +++ b/distsql/distsql.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tipb/go-tipb" ) @@ -44,7 +45,7 @@ func Select(ctx context.Context, sctx sessionctx.Context, kvReq *kv.Request, fie if !sctx.GetSessionVars().EnableStreaming { kvReq.Streaming = false } - resp := sctx.GetClient().Send(ctx, kvReq, sctx.GetSessionVars().KVVars) + resp := sctx.GetClient().Send(ctx, kvReq, sctx.GetSessionVars().KVVars, sctx.GetSessionVars().StmtCtx.MemTracker) if resp == nil { err := errors.New("client returns nil response") return nil, err @@ -104,8 +105,8 @@ func SelectWithRuntimeStats(ctx context.Context, sctx sessionctx.Context, kvReq // Analyze do a analyze request. func Analyze(ctx context.Context, client kv.Client, kvReq *kv.Request, vars *kv.Variables, - isRestrict bool) (SelectResult, error) { - resp := client.Send(ctx, kvReq, vars) + isRestrict bool, sessionMemTracker *memory.Tracker) (SelectResult, error) { + resp := client.Send(ctx, kvReq, vars, sessionMemTracker) if resp == nil { return nil, errors.New("client returns nil response") } @@ -125,7 +126,9 @@ func Analyze(ctx context.Context, client kv.Client, kvReq *kv.Request, vars *kv. // Checksum sends a checksum request. func Checksum(ctx context.Context, client kv.Client, kvReq *kv.Request, vars *kv.Variables) (SelectResult, error) { - resp := client.Send(ctx, kvReq, vars) + // FIXME: As BR have dependency of `Checksum` and TiDB also introduced BR as dependency, Currently we can't edit + // Checksum function signature. The two-way dependence should be removed in future. + resp := client.Send(ctx, kvReq, vars, nil) if resp == nil { return nil, errors.New("client returns nil response") } diff --git a/distsql/distsql_test.go b/distsql/distsql_test.go index 5a5cfa8230db1..6942b7c32d60b 100644 --- a/distsql/distsql_test.go +++ b/distsql/distsql_test.go @@ -312,7 +312,7 @@ func (s *testSuite) TestAnalyze(c *C) { Build() c.Assert(err, IsNil) - response, err := Analyze(context.TODO(), s.sctx.GetClient(), request, kv.DefaultVars, true) + response, err := Analyze(context.TODO(), s.sctx.GetClient(), request, kv.DefaultVars, true, s.sctx.GetSessionVars().StmtCtx.MemTracker) c.Assert(err, IsNil) result, ok := response.(*selectResult) diff --git a/executor/analyze.go b/executor/analyze.go index 0667a61a26697..0561d81793b9d 100755 --- a/executor/analyze.go +++ b/executor/analyze.go @@ -283,7 +283,7 @@ func (e *AnalyzeIndexExec) fetchAnalyzeResult(ranges []*ranger.Range, isNullRang return err } ctx := context.TODO() - result, err := distsql.Analyze(ctx, e.ctx.GetClient(), kvReq, e.ctx.GetSessionVars().KVVars, e.ctx.GetSessionVars().InRestrictedSQL) + result, err := distsql.Analyze(ctx, e.ctx.GetClient(), kvReq, e.ctx.GetSessionVars().KVVars, e.ctx.GetSessionVars().InRestrictedSQL, e.ctx.GetSessionVars().StmtCtx.MemTracker) if err != nil { return err } @@ -468,7 +468,7 @@ func (e *AnalyzeColumnsExec) buildResp(ranges []*ranger.Range) (distsql.SelectRe return nil, err } ctx := context.TODO() - result, err := distsql.Analyze(ctx, e.ctx.GetClient(), kvReq, e.ctx.GetSessionVars().KVVars, e.ctx.GetSessionVars().InRestrictedSQL) + result, err := distsql.Analyze(ctx, e.ctx.GetClient(), kvReq, e.ctx.GetSessionVars().KVVars, e.ctx.GetSessionVars().InRestrictedSQL, e.ctx.GetSessionVars().StmtCtx.MemTracker) if err != nil { return nil, err } diff --git a/executor/executor_test.go b/executor/executor_test.go index 31efebdbccd34..248f65a1e0c2b 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -6391,3 +6391,93 @@ func (s *testSuite) TestIssue13758(c *C) { "", )) } + +func (s *testSerialSuite) TestCoprocessorOOMAction(c *C) { + // Assert Coprocessor OOMAction + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec(`set @@tidb_wait_split_region_finish=1`) + // create table for non keep-order case + tk.MustExec("drop table if exists t5") + tk.MustExec("create table t5(id int)") + tk.MustQuery(`split table t5 between (0) and (10000) regions 10`).Check(testkit.Rows("9 1")) + // create table for keep-order case + tk.MustExec("drop table if exists t6") + tk.MustExec("create table t6(id int, index(id))") + tk.MustQuery(`split table t6 between (0) and (10000) regions 10`).Check(testkit.Rows("10 1")) + tk.MustQuery("split table t6 INDEX id between (0) and (10000) regions 10;").Check(testkit.Rows("10 1")) + count := 10 + for i := 0; i < count; i++ { + tk.MustExec(fmt.Sprintf("insert into t5 (id) values (%v)", i)) + tk.MustExec(fmt.Sprintf("insert into t6 (id) values (%v)", i)) + } + + testcases := []struct { + name string + sql string + }{ + { + name: "keep Order", + sql: "select * from t6 order by id", + }, + { + name: "non keep Order", + sql: "select * from t5", + }, + } + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMAction = config.OOMActionCancel + }) + quota := count * 15 + // assert oom action + for _, testcase := range testcases { + c.Log(testcase.name) + se, err := session.CreateSession4Test(s.store) + c.Check(err, IsNil) + tk.Se = se + tk.MustExec("use test") + tk.MustExec("set @@tidb_distsql_scan_concurrency = 30") + tk.MustExec(fmt.Sprintf("set @@tidb_mem_quota_query=%v;", quota)) + var expect []string + for i := 0; i < count; i++ { + expect = append(expect, fmt.Sprintf("%v", i)) + } + tk.MustQuery(testcase.sql).Sort().Check(testkit.Rows(expect...)) + // assert oom action worked by max consumed > memory quota + c.Assert(tk.Se.GetSessionVars().StmtCtx.MemTracker.MaxConsumed(), Greater, int64(quota)) + se.Close() + } + + // assert oom fallback + for _, testcase := range testcases { + c.Log(testcase.name) + se, err := session.CreateSession4Test(s.store) + c.Check(err, IsNil) + tk.Se = se + tk.MustExec("use test") + tk.MustExec("set tidb_distsql_scan_concurrency = 2") + tk.MustExec("set @@tidb_mem_quota_query=1;") + err = tk.QueryToErr(testcase.sql) + c.Assert(err, NotNil) + c.Assert(err.Error(), Matches, "Out Of Memory Quota.*") + se.Close() + } + + // assert disable + failpoint.Enable("github.com/pingcap/tidb/store/tikv/testRateLimitActionDisable", `return(true)`) + defer failpoint.Disable("github.com/pingcap/tidb/store/tikv/testRateLimitActionDisable") + for _, testcase := range testcases { + c.Log(testcase.name) + se, err := session.CreateSession4Test(s.store) + c.Check(err, IsNil) + tk.Se = se + tk.MustExec("use test") + tk.MustExec("set @@tidb_distsql_scan_concurrency = 30") + tk.MustExec(fmt.Sprintf("set @@tidb_mem_quota_query=%v;", quota)) + err = tk.QueryToErr(testcase.sql) + c.Assert(err, NotNil) + c.Assert(err.Error(), Matches, "Out Of Memory Quota.*") + se.Close() + } +} diff --git a/kv/kv.go b/kv/kv.go index 602a7f4268884..1d682b958e584 100644 --- a/kv/kv.go +++ b/kv/kv.go @@ -297,7 +297,7 @@ type ReturnedValue struct { // Client is used to send request to KV layer. type Client interface { // Send sends request to KV layer, returns a Response. - Send(ctx context.Context, req *Request, vars *Variables) Response + Send(ctx context.Context, req *Request, vars *Variables, sessionMemTracker *memory.Tracker) Response // IsRequestTypeSupported checks if reqType and subType is supported. IsRequestTypeSupported(reqType, subType int64) bool diff --git a/store/tikv/coprocessor.go b/store/tikv/coprocessor.go index 6be90a02e9bbd..aca8a7b8c0c3e 100644 --- a/store/tikv/coprocessor.go +++ b/store/tikv/coprocessor.go @@ -56,7 +56,7 @@ type CopClient struct { } // Send builds the request and gets the coprocessor iterator response. -func (c *CopClient) Send(ctx context.Context, req *kv.Request, vars *kv.Variables) kv.Response { +func (c *CopClient) Send(ctx context.Context, req *kv.Request, vars *kv.Variables, sessionMemTracker *memory.Tracker) kv.Response { if req.StoreType == kv.TiFlash && req.BatchCop { logutil.BgLogger().Debug("send batch requests") return c.sendBatch(ctx, req, vars) @@ -76,7 +76,9 @@ func (c *CopClient) Send(ctx context.Context, req *kv.Request, vars *kv.Variable memTracker: req.MemTracker, replicaReadSeed: c.replicaReadSeed, rpcCancel: NewRPCanceller(), + maxID: &maxIDHandler{}, } + it.maxID.maxID = 0 it.minCommitTSPushed.data = make(map[uint64]struct{}, 5) it.tasks = tasks if it.concurrency > len(tasks) { @@ -93,6 +95,10 @@ func (c *CopClient) Send(ctx context.Context, req *kv.Request, vars *kv.Variable it.respChan = make(chan *copResponse, it.concurrency) it.sendRate = newRateLimit(it.concurrency) } + it.actionOnExceed = newRateLimitAction(uint(cap(it.sendRate.token)), sync.NewCond(&sync.Mutex{})) + if sessionMemTracker != nil { + sessionMemTracker.FallbackOldAndSetNewAction(it.actionOnExceed) + } if !it.req.Streaming { ctx = context.WithValue(ctx, RPCCancellerCtxKey{}, it.rpcCancel) @@ -103,6 +109,7 @@ func (c *CopClient) Send(ctx context.Context, req *kv.Request, vars *kv.Variable // copTask contains a related Region and KeyRange for a kv.Request. type copTask struct { + id uint32 region RegionVerID ranges *copRanges @@ -383,7 +390,11 @@ type copIterator struct { // If keepOrder, results are stored in copTask.respChan, read them out one by one. tasks []*copTask - curr int + // curr indicates the curr id of the finished copTask + curr int + + // maxID indicates the max id of the running copTask + maxID *maxIDHandler // sendRate controls the sending rate of copIteratorTaskSender sendRate *rateLimit @@ -406,6 +417,8 @@ type copIterator struct { closed uint32 minCommitTSPushed + + actionOnExceed *rateLimitAction } // copIteratorWorker receives tasks from copIteratorTaskSender, handles tasks and sends the copResponse to respChan. @@ -424,6 +437,10 @@ type copIteratorWorker struct { replicaReadSeed uint32 sendRate *rateLimit + + actionOnExceed *rateLimitAction + + maxID *maxIDHandler } // copIteratorTaskSender sends tasks to taskCh then wait for the workers to exit. @@ -497,12 +514,13 @@ func (worker *copIteratorWorker) run(ctx context.Context) { if respCh == nil { respCh = task.respChan } - worker.handleTask(ctx, task, respCh) close(task.respChan) - if worker.respChan != nil { + worker.maxID.setMaxIDIfLarger(task.id) + worker.actionOnExceed.destroyTokenIfNeeded(func() { worker.sendRate.putToken() - } + }) + worker.actionOnExceed.waitIfNeeded() if worker.vars != nil && worker.vars.Killed != nil && atomic.LoadUint32(worker.vars.Killed) == 1 { return } @@ -539,6 +557,8 @@ func (it *copIterator) open(ctx context.Context) { replicaReadSeed: it.replicaReadSeed, sendRate: it.sendRate, + actionOnExceed: it.actionOnExceed, + maxID: it.maxID, } go worker.run(ctx) } @@ -551,11 +571,12 @@ func (it *copIterator) open(ctx context.Context) { } taskSender.respChan = it.respChan go taskSender.run() + it.actionOnExceed.setEnabled(true) } func (sender *copIteratorTaskSender) run() { // Send tasks to feed the worker goroutines. - for _, t := range sender.tasks { + for i, t := range sender.tasks { // we control the sending rate to prevent all tasks // being done (aka. all of the responses are buffered) by copIteratorWorker. // We keep the number of inflight tasks within the number of 2 * concurrency when Keep Order is true. @@ -565,6 +586,7 @@ func (sender *copIteratorTaskSender) run() { if exit { break } + t.id = uint32(i) exit = sender.sendToTaskCh(t) if exit { break @@ -638,18 +660,23 @@ func (it *copIterator) Next(ctx context.Context) (kv.ResultSubset, error) { ok bool closed bool ) + // If data order matters, response should be returned in the same order as copTask slice. // Otherwise all responses are returned from a single channel. if it.respChan != nil { // Get next fetched resp from chan resp, ok, closed = it.recvFromRespCh(ctx, it.respChan) if !ok || closed { + it.actionOnExceed.close() return nil, nil } + // The respCh has been drained out + it.actionOnExceed.broadcastIfNeeded(len(it.respChan) < 1) } else { for { if it.curr >= len(it.tasks) { // Resp will be nil if iterator is finishCh. + it.actionOnExceed.close() return nil, nil } task := it.tasks[it.curr] @@ -661,10 +688,15 @@ func (it *copIterator) Next(ctx context.Context) (kv.ResultSubset, error) { if ok { break } + finishedTaskID := it.tasks[it.curr].id // Switch to next task. it.tasks[it.curr] = nil it.curr++ - it.sendRate.putToken() + maxID := it.maxID.getMaxID() + // The tasks whose id is less than maxID are assumed that being sending to their task channel. + // So the response channel would be thought as drained out if the current taskID is greater or equal than + // the maxID as all the workers are being suspended at that time. + it.actionOnExceed.broadcastIfNeeded(finishedTaskID >= maxID) } } @@ -1154,6 +1186,7 @@ func (it *copIterator) Close() error { close(it.finishCh) } it.rpcCancel.CancelAll() + it.actionOnExceed.close() it.wg.Wait() return nil } @@ -1195,3 +1228,174 @@ func (it copErrorResponse) Next(ctx context.Context) (kv.ResultSubset, error) { func (it copErrorResponse) Close() error { return nil } + +// rateLimitAction an OOM Action which is used to control the token if OOM triggered. The token number should be +// set on initial. Each time the Action is triggered, one token would be destroyed. If the count of the token is less +// than 2, the action would be delegated to the fallback action. +type rateLimitAction struct { + // enabled indicates whether the rateLimitAction is permitted to Action. 1 means permitted, 0 denied. + enabled uint32 + fallbackAction memory.ActionOnExceed + // totalTokenNum indicates the total token at initial + totalTokenNum uint + cond struct { + *sync.Cond + // exceeded indicates whether have encountered OOM situation. + exceeded bool + // remainingTokenNum indicates the count of tokens which still exists + remainingTokenNum uint + // isTokenDestroyed indicates whether there is one token has been isTokenDestroyed after Action been triggered + isTokenDestroyed bool + once sync.Once + } +} + +func newRateLimitAction(totalTokenNumber uint, cond *sync.Cond) *rateLimitAction { + return &rateLimitAction{ + totalTokenNum: totalTokenNumber, + cond: struct { + *sync.Cond + exceeded bool + remainingTokenNum uint + isTokenDestroyed bool + once sync.Once + }{ + Cond: cond, + exceeded: false, + remainingTokenNum: totalTokenNumber, + once: sync.Once{}, + }, + } +} + +// Action implements ActionOnExceed.Action +func (e *rateLimitAction) Action(t *memory.Tracker) { + failpoint.Inject("testRateLimitActionDisable", func(val failpoint.Value) { + if val.(bool) { + e.setEnabled(false) + } + }) + + if !e.isEnabled() { + if e.fallbackAction != nil { + e.fallbackAction.Action(t) + } + return + } + e.conditionLock() + defer e.conditionUnlock() + e.cond.once.Do(func() { + if e.cond.remainingTokenNum < 2 { + e.setEnabled(false) + logutil.BgLogger().Info("memory exceed quota, rateLimitAction delegate to fallback action", + zap.Uint("total token count", e.totalTokenNum)) + if e.fallbackAction != nil { + e.fallbackAction.Action(t) + } + return + } + logutil.BgLogger().Info("memory exceeds quota, destroy one token now.", + zap.Int64("consumed", t.BytesConsumed()), + zap.Int64("quota", t.GetBytesLimit()), + zap.Uint("total token count", e.totalTokenNum), + zap.Uint("remaining token count", e.cond.remainingTokenNum)) + e.cond.isTokenDestroyed = false + e.cond.exceeded = true + }) +} + +// SetLogHook implements ActionOnExceed.SetLogHook +func (e *rateLimitAction) SetLogHook(hook func(uint64)) { + +} + +// SetFallback implements ActionOnExceed.SetFallback +func (e *rateLimitAction) SetFallback(a memory.ActionOnExceed) { + e.fallbackAction = a +} + +// broadcastIfNeeded will check whether the copWorkers is under suspended status. +// If they are, `broadcastIfNeeded` would try to recover them if there are no more +// copResponse remained in the channel. +func (e *rateLimitAction) broadcastIfNeeded(needed bool) { + e.conditionLock() + defer e.conditionUnlock() + if e.cond.exceeded && needed { + e.cond.exceeded = false + e.cond.Broadcast() + e.cond.once = sync.Once{} + } +} + +// destroyTokenIfNeeded will check the `exceed` flag after copWorker finished one task. +// If the exceed flag is true and there is no token been destroyed before, one token will be destroyed, +// or the token would be return back. +func (e *rateLimitAction) destroyTokenIfNeeded(returnToken func()) { + e.conditionLock() + defer e.conditionUnlock() + // If actionOnExceed has been triggered and there is no token have been destroyed before, + // destroy one token. + if e.cond.exceeded && !e.cond.isTokenDestroyed { + e.cond.remainingTokenNum = e.cond.remainingTokenNum - 1 + e.cond.isTokenDestroyed = true + } else { + returnToken() + } +} + +func (e *rateLimitAction) waitIfNeeded() { + e.conditionLock() + defer e.conditionUnlock() + for e.cond.exceeded { + e.cond.Wait() + } +} + +func (e *rateLimitAction) conditionLock() { + e.cond.L.Lock() +} + +func (e *rateLimitAction) conditionUnlock() { + e.cond.L.Unlock() +} + +func (e *rateLimitAction) close() { + e.setEnabled(false) + e.conditionLock() + defer e.conditionUnlock() + e.cond.exceeded = false + e.cond.isTokenDestroyed = false + // broadcast the signal in order not to leak worker goroutine if it is being suspended + e.cond.Broadcast() +} + +func (e *rateLimitAction) setEnabled(enabled bool) { + newValue := uint32(0) + if enabled { + newValue = uint32(1) + } + atomic.StoreUint32(&e.enabled, newValue) +} + +func (e *rateLimitAction) isEnabled() bool { + return atomic.LoadUint32(&e.enabled) > 0 +} + +type maxIDHandler struct { + sync.Mutex + maxID uint32 +} + +func (handler *maxIDHandler) getMaxID() uint32 { + handler.Lock() + defer handler.Unlock() + return handler.maxID +} + +func (handler *maxIDHandler) setMaxIDIfLarger(newID uint32) { + handler.Lock() + defer handler.Unlock() + if newID > handler.maxID { + handler.maxID = newID + } +} diff --git a/util/mock/client.go b/util/mock/client.go index 46496df7f3aca..5acb099328ad4 100644 --- a/util/mock/client.go +++ b/util/mock/client.go @@ -17,6 +17,7 @@ import ( "context" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/util/memory" ) // Client implement kv.Client interface, mocked from "CopClient" defined in @@ -27,6 +28,6 @@ type Client struct { } // Send implement kv.Client interface. -func (c *Client) Send(ctx context.Context, req *kv.Request, kv *kv.Variables) kv.Response { +func (c *Client) Send(ctx context.Context, req *kv.Request, kv *kv.Variables, sessionMemTracker *memory.Tracker) kv.Response { return c.MockResponse } From 8d798bbee1e2dd1121d9ac5b14e15fb190dbc22f Mon Sep 17 00:00:00 2001 From: Arenatlx Date: Tue, 22 Sep 2020 14:49:24 +0800 Subject: [PATCH 02/60] ddl: generate a unique name for changing column and changing indexes (#19774) --- ddl/column.go | 76 +++++++++++++++++--- ddl/column_type_change_test.go | 2 +- ddl/db_test.go | 127 +++++++++++++++++++++++++++++++++ 3 files changed, 196 insertions(+), 9 deletions(-) diff --git a/ddl/column.go b/ddl/column.go index 71a48b10431d4..e39be312f19b3 100644 --- a/ddl/column.go +++ b/ddl/column.go @@ -732,7 +732,7 @@ func (w *worker) onModifyColumn(d *ddlCtx, t *meta.Meta, job *model.Job) (ver in if jobParam.changingCol == nil { changingColPos := &ast.ColumnPosition{Tp: ast.ColumnPositionNone} - newColName := model.NewCIStr(fmt.Sprintf("%s%s", changingColumnPrefix, oldCol.Name.O)) + newColName := model.NewCIStr(genChangingColumnUniqueName(tblInfo, oldCol)) if mysql.HasPriKeyFlag(oldCol.Flag) { job.State = model.JobStateCancelled msg := "tidb_enable_change_column_type is true and this column has primary key flag" @@ -752,7 +752,7 @@ func (w *worker) onModifyColumn(d *ddlCtx, t *meta.Meta, job *model.Job) (ver in jobParam.changingIdxs = make([]*model.IndexInfo, 0, len(idxInfos)) for i, idxInfo := range idxInfos { newIdxInfo := idxInfo.Clone() - newIdxInfo.Name = model.NewCIStr(fmt.Sprintf("%s%s", changingIndexPrefix, newIdxInfo.Name.O)) + newIdxInfo.Name = model.NewCIStr(genChangingIndexUniqueName(tblInfo, idxInfo)) newIdxInfo.ID = allocateIndexID(tblInfo) newIdxInfo.Columns[offsets[i]].Name = newColName newIdxInfo.Columns[offsets[i]].Offset = jobParam.changingCol.Offset @@ -909,9 +909,9 @@ func (w *worker) doModifyColumnTypeWithData( oldIdxIDs := make([]int64, 0, len(changingIdxs)) tblInfo.Columns = tblInfo.Columns[:len(tblInfo.Columns)-1] for _, cIdx := range changingIdxs { - idxName := strings.TrimPrefix(cIdx.Name.O, changingIndexPrefix) + idxName := getChangingIndexOriginName(cIdx) for i, idx := range tblInfo.Indices { - if strings.EqualFold(idxName, idx.Name.L) { + if strings.EqualFold(idxName, idx.Name.O) { cIdx.Name = model.NewCIStr(idxName) tblInfo.Indices[i] = cIdx oldIdxIDs = append(oldIdxIDs, idx.ID) @@ -919,11 +919,12 @@ func (w *worker) doModifyColumnTypeWithData( } } } + changingColumnUniqueName := changingCol.Name changingCol.Name = colName changingCol.ChangeStateInfo = nil tblInfo.Indices = tblInfo.Indices[:len(tblInfo.Indices)-len(changingIdxs)] // Adjust table column offset. - if err = adjustColumnInfoInModifyColumn(job, tblInfo, changingCol, oldCol, pos); err != nil { + if err = adjustColumnInfoInModifyColumn(job, tblInfo, changingCol, oldCol, pos, changingColumnUniqueName.L); err != nil { // TODO: Do rollback. return ver, errors.Trace(err) } @@ -1166,7 +1167,7 @@ func (w *worker) doModifyColumn( } } - if err := adjustColumnInfoInModifyColumn(job, tblInfo, newCol, oldCol, pos); err != nil { + if err := adjustColumnInfoInModifyColumn(job, tblInfo, newCol, oldCol, pos, ""); err != nil { return ver, errors.Trace(err) } @@ -1184,7 +1185,7 @@ func (w *worker) doModifyColumn( } func adjustColumnInfoInModifyColumn( - job *model.Job, tblInfo *model.TableInfo, newCol, oldCol *model.ColumnInfo, pos *ast.ColumnPosition) error { + job *model.Job, tblInfo *model.TableInfo, newCol, oldCol *model.ColumnInfo, pos *ast.ColumnPosition, changingColUniqueLowerName string) error { // We need the latest column's offset and state. This information can be obtained from the store. newCol.Offset = oldCol.Offset newCol.State = oldCol.State @@ -1245,7 +1246,14 @@ func adjustColumnInfoInModifyColumn( // Change offset and name in indices. for _, idx := range tblInfo.Indices { for _, c := range idx.Columns { - cName := strings.ToLower(strings.TrimPrefix(c.Name.O, changingColumnPrefix)) + cName := c.Name.L + // With the unique changing column name, the format is designed as `_Col$_xx_uniqueNum`. + // The suffix `_uniqueNum` will be trimmed when we get the origin changing column name. + // There is a possibility that some other column named as `xx_xx_xx`, and it will be get + // trimmed as `xx_xx`. So here we check here and only do the trim for the changing index column. + if len(changingColUniqueLowerName) != 0 && c.Name.L == changingColUniqueLowerName { + cName = strings.ToLower(getChangingColumnOriginName(c)) + } if newCol, ok := columnChanged[cName]; ok { c.Name = newCol.Name c.Offset = newCol.Offset @@ -1506,3 +1514,55 @@ func indexInfosToIDList(idxInfos []*model.IndexInfo) []int64 { } return ids } + +func genChangingColumnUniqueName(tblInfo *model.TableInfo, oldCol *model.ColumnInfo) string { + suffix := 0 + newColumnNamePrefix := fmt.Sprintf("%s%s", changingColumnPrefix, oldCol.Name.O) + newColumnLowerName := fmt.Sprintf("%s_%d", strings.ToLower(newColumnNamePrefix), suffix) + // Check whether the new column name is used. + columnNameMap := make(map[string]bool, len(tblInfo.Columns)) + for _, col := range tblInfo.Columns { + columnNameMap[col.Name.L] = true + } + for columnNameMap[newColumnLowerName] { + suffix++ + newColumnLowerName = fmt.Sprintf("%s_%d", strings.ToLower(newColumnNamePrefix), suffix) + } + return fmt.Sprintf("%s_%d", newColumnNamePrefix, suffix) +} + +func genChangingIndexUniqueName(tblInfo *model.TableInfo, idxInfo *model.IndexInfo) string { + suffix := 0 + newIndexNamePrefix := fmt.Sprintf("%s%s", changingIndexPrefix, idxInfo.Name.O) + newIndexLowerName := fmt.Sprintf("%s_%d", strings.ToLower(newIndexNamePrefix), suffix) + // Check whether the new index name is used. + indexNameMap := make(map[string]bool, len(tblInfo.Indices)) + for _, idx := range tblInfo.Indices { + indexNameMap[idx.Name.L] = true + } + for indexNameMap[newIndexLowerName] { + suffix++ + newIndexLowerName = fmt.Sprintf("%s_%d", strings.ToLower(newIndexNamePrefix), suffix) + } + return fmt.Sprintf("%s_%d", newIndexNamePrefix, suffix) +} + +func getChangingColumnOriginName(changingCol *model.IndexColumn) string { + colName := strings.ToLower(strings.TrimPrefix(changingCol.Name.O, changingColumnPrefix)) + // Since the unique colName may contain the suffix number (columnName_num), better trim the suffix. + var pos int + if pos = strings.LastIndex(colName, "_"); pos == -1 { + return colName + } + return colName[:pos] +} + +func getChangingIndexOriginName(changingIdx *model.IndexInfo) string { + idxName := strings.TrimPrefix(changingIdx.Name.O, changingIndexPrefix) + // Since the unique idxName may contain the suffix number (indexName_num), better trim the suffix. + var pos int + if pos = strings.LastIndex(idxName, "_"); pos == -1 { + return idxName + } + return idxName[:pos] +} diff --git a/ddl/column_type_change_test.go b/ddl/column_type_change_test.go index 4a04cda14def0..0fb8b91071298 100644 --- a/ddl/column_type_change_test.go +++ b/ddl/column_type_change_test.go @@ -174,7 +174,7 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeStateBetweenInteger(c *C checkErr = errors.New("len(cols) is not right") } else if getModifyColumn(c, internalTK.Se.(sessionctx.Context), "test", "t", "c2", true).Flag&parser_mysql.PreventNullInsertFlag == uint(0) { checkErr = errors.New("old col's flag is not right") - } else if getModifyColumn(c, internalTK.Se.(sessionctx.Context), "test", "t", "_Col$_c2", true) == nil { + } else if getModifyColumn(c, internalTK.Se.(sessionctx.Context), "test", "t", "_Col$_c2_0", true) == nil { checkErr = errors.New("changingCol is nil") } } diff --git a/ddl/db_test.go b/ddl/db_test.go index d8b705d00a8c7..135f8bd274d84 100644 --- a/ddl/db_test.go +++ b/ddl/db_test.go @@ -28,6 +28,7 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" @@ -5486,3 +5487,129 @@ func (s *testSerialDBSuite) TestCreateTableWithIntegerLengthWaring(c *C) { tk.MustExec("drop table if exists t") } + +func (s *testSerialDBSuite) TestColumnTypeChangeGenUniqueChangingName(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + + enableChangeColumnType := tk.Se.GetSessionVars().EnableChangeColumnType + tk.Se.GetSessionVars().EnableChangeColumnType = true + defer func() { + tk.Se.GetSessionVars().EnableChangeColumnType = enableChangeColumnType + config.RestoreFunc()() + }() + + hook := &ddl.TestDDLCallback{} + var checkErr error + assertChangingColName := "_col$_c2_0" + assertChangingIdxName := "_idx$_idx_0" + hook.OnJobUpdatedExported = func(job *model.Job) { + if job.SchemaState == model.StateDeleteOnly && job.Type == model.ActionModifyColumn { + var ( + newCol *model.ColumnInfo + oldColName *model.CIStr + modifyColumnTp byte + updatedAutoRandomBits uint64 + changingCol *model.ColumnInfo + changingIdxs []*model.IndexInfo + ) + pos := &ast.ColumnPosition{} + err := job.DecodeArgs(&newCol, &oldColName, pos, &modifyColumnTp, &updatedAutoRandomBits, &changingCol, &changingIdxs) + if err != nil { + checkErr = err + return + } + if changingCol.Name.L != assertChangingColName { + checkErr = errors.New("changing column name is incorrect") + } else if changingIdxs[0].Name.L != assertChangingIdxName { + checkErr = errors.New("changing index name is incorrect") + } + } + } + d := s.dom.DDL() + originHook := d.GetHook() + d.(ddl.DDLForTest).SetHook(hook) + defer d.(ddl.DDLForTest).SetHook(originHook) + + tk.MustExec("create table if not exists t(c1 varchar(256), c2 bigint, `_col$_c2` varchar(10), unique _idx$_idx(c1), unique idx(c2));") + tk.MustExec("alter table test.t change column c2 cC2 tinyint after `_col$_c2`") + c.Assert(checkErr, IsNil) + + t := testGetTableByName(c, tk.Se, "test", "t") + c.Assert(len(t.Meta().Columns), Equals, 3) + c.Assert(t.Meta().Columns[0].Name.O, Equals, "c1") + c.Assert(t.Meta().Columns[0].Offset, Equals, 0) + c.Assert(t.Meta().Columns[1].Name.O, Equals, "_col$_c2") + c.Assert(t.Meta().Columns[1].Offset, Equals, 1) + c.Assert(t.Meta().Columns[2].Name.O, Equals, "cC2") + c.Assert(t.Meta().Columns[2].Offset, Equals, 2) + + c.Assert(len(t.Meta().Indices), Equals, 2) + c.Assert(t.Meta().Indices[0].Name.O, Equals, "_idx$_idx") + c.Assert(t.Meta().Indices[1].Name.O, Equals, "idx") + + c.Assert(len(t.Meta().Indices[0].Columns), Equals, 1) + c.Assert(t.Meta().Indices[0].Columns[0].Name.O, Equals, "c1") + c.Assert(t.Meta().Indices[0].Columns[0].Offset, Equals, 0) + + c.Assert(len(t.Meta().Indices[1].Columns), Equals, 1) + c.Assert(t.Meta().Indices[1].Columns[0].Name.O, Equals, "cC2") + c.Assert(t.Meta().Indices[1].Columns[0].Offset, Equals, 2) + + assertChangingColName1 := "_col$__col$_c1_1" + assertChangingColName2 := "_col$__col$__col$_c1_0_1" + query1 := "alter table t modify column _col$_c1 tinyint" + query2 := "alter table t modify column _col$__col$_c1_0 tinyint" + hook.OnJobUpdatedExported = func(job *model.Job) { + if (job.Query == query1 || job.Query == query2) && job.SchemaState == model.StateDeleteOnly && job.Type == model.ActionModifyColumn { + var ( + newCol *model.ColumnInfo + oldColName *model.CIStr + modifyColumnTp byte + updatedAutoRandomBits uint64 + changingCol *model.ColumnInfo + changingIdxs []*model.IndexInfo + ) + pos := &ast.ColumnPosition{} + err := job.DecodeArgs(&newCol, &oldColName, pos, &modifyColumnTp, &updatedAutoRandomBits, &changingCol, &changingIdxs) + if err != nil { + checkErr = err + return + } + if job.Query == query1 && changingCol.Name.L != assertChangingColName1 { + checkErr = errors.New("changing column name is incorrect") + } + if job.Query == query2 && changingCol.Name.L != assertChangingColName2 { + checkErr = errors.New("changing column name is incorrect") + } + } + } + d.(ddl.DDLForTest).SetHook(hook) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table if not exists t(c1 bigint, _col$_c1 bigint, _col$__col$_c1_0 bigint, _col$__col$__col$_c1_0_0 bigint)") + tk.MustExec("alter table t modify column c1 tinyint") + tk.MustExec("alter table t modify column _col$_c1 tinyint") + c.Assert(checkErr, IsNil) + tk.MustExec("alter table t modify column _col$__col$_c1_0 tinyint") + c.Assert(checkErr, IsNil) + tk.MustExec("alter table t change column _col$__col$__col$_c1_0_0 _col$__col$__col$_c1_0_0 tinyint") + + t = testGetTableByName(c, tk.Se, "test", "t") + c.Assert(len(t.Meta().Columns), Equals, 4) + c.Assert(t.Meta().Columns[0].Name.O, Equals, "c1") + c.Assert(t.Meta().Columns[0].Tp, Equals, mysql.TypeTiny) + c.Assert(t.Meta().Columns[0].Offset, Equals, 0) + c.Assert(t.Meta().Columns[1].Name.O, Equals, "_col$_c1") + c.Assert(t.Meta().Columns[1].Tp, Equals, mysql.TypeTiny) + c.Assert(t.Meta().Columns[1].Offset, Equals, 1) + c.Assert(t.Meta().Columns[2].Name.O, Equals, "_col$__col$_c1_0") + c.Assert(t.Meta().Columns[2].Tp, Equals, mysql.TypeTiny) + c.Assert(t.Meta().Columns[2].Offset, Equals, 2) + c.Assert(t.Meta().Columns[3].Name.O, Equals, "_col$__col$__col$_c1_0_0") + c.Assert(t.Meta().Columns[3].Tp, Equals, mysql.TypeTiny) + c.Assert(t.Meta().Columns[3].Offset, Equals, 3) + + tk.MustExec("drop table if exists t") +} From 650515a420078112d63797b8b8e21fbb33c0678d Mon Sep 17 00:00:00 2001 From: HuaiyuXu <391585975@qq.com> Date: Tue, 22 Sep 2020 14:58:38 +0800 Subject: [PATCH 03/60] executor: fix data race in test (#20142) --- executor/join_test.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/executor/join_test.go b/executor/join_test.go index 4a3f97a143a3c..0a52aa8b94899 100644 --- a/executor/join_test.go +++ b/executor/join_test.go @@ -2094,8 +2094,14 @@ func (s *testSuiteJoinSerial) TestInlineProjection4HashJoinIssue15316(c *C) { } func (s *testSuiteJoinSerial) TestIssue18070(c *C) { - config.GetGlobalConfig().OOMAction = config.OOMActionCancel - defer func() { config.GetGlobalConfig().OOMAction = config.OOMActionLog }() + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMAction = config.OOMActionCancel + }) + defer func() { + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMAction = config.OOMActionLog + }) + }() tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2") From 640cb42f5486ebd83d489b3f14a873730be0ee55 Mon Sep 17 00:00:00 2001 From: Yuanjia Zhang Date: Tue, 22 Sep 2020 15:11:59 +0800 Subject: [PATCH 04/60] executor: do not reorder handles when building requests for `IndexMergeJoin` (#20138) --- executor/builder.go | 34 +++++++++++++----------- executor/distsql.go | 2 +- executor/index_lookup_join.go | 2 +- executor/index_lookup_merge_join.go | 2 +- executor/index_lookup_merge_join_test.go | 13 +++++++++ executor/index_merge_reader.go | 2 +- 6 files changed, 36 insertions(+), 19 deletions(-) diff --git a/executor/builder.go b/executor/builder.go index 921228815f147..93f283c7b734e 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -2943,21 +2943,21 @@ type mockPhysicalIndexReader struct { } func (builder *dataReaderBuilder) buildExecutorForIndexJoin(ctx context.Context, lookUpContents []*indexJoinLookUpContent, - IndexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager) (Executor, error) { - return builder.buildExecutorForIndexJoinInternal(ctx, builder.Plan, lookUpContents, IndexRanges, keyOff2IdxOff, cwc) + IndexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager, canReorderHandles bool) (Executor, error) { + return builder.buildExecutorForIndexJoinInternal(ctx, builder.Plan, lookUpContents, IndexRanges, keyOff2IdxOff, cwc, canReorderHandles) } func (builder *dataReaderBuilder) buildExecutorForIndexJoinInternal(ctx context.Context, plan plannercore.Plan, lookUpContents []*indexJoinLookUpContent, - IndexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager) (Executor, error) { + IndexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager, canReorderHandles bool) (Executor, error) { switch v := plan.(type) { case *plannercore.PhysicalTableReader: - return builder.buildTableReaderForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc) + return builder.buildTableReaderForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc, canReorderHandles) case *plannercore.PhysicalIndexReader: return builder.buildIndexReaderForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc) case *plannercore.PhysicalIndexLookUpReader: return builder.buildIndexLookUpReaderForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc) case *plannercore.PhysicalUnionScan: - return builder.buildUnionScanForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc) + return builder.buildUnionScanForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc, canReorderHandles) // The inner child of IndexJoin might be Projection when a combination of the following conditions is true: // 1. The inner child fetch data using indexLookupReader // 2. PK is not handle @@ -2969,7 +2969,7 @@ func (builder *dataReaderBuilder) buildExecutorForIndexJoinInternal(ctx context. // Need to support physical selection because after PR 16389, TiDB will push down all the expr supported by TiKV or TiFlash // in predicate push down stage, so if there is an expr which only supported by TiFlash, a physical selection will be added after index read case *plannercore.PhysicalSelection: - childExec, err := builder.buildExecutorForIndexJoinInternal(ctx, v.Children()[0], lookUpContents, IndexRanges, keyOff2IdxOff, cwc) + childExec, err := builder.buildExecutorForIndexJoinInternal(ctx, v.Children()[0], lookUpContents, IndexRanges, keyOff2IdxOff, cwc, canReorderHandles) if err != nil { return nil, err } @@ -2986,9 +2986,10 @@ func (builder *dataReaderBuilder) buildExecutorForIndexJoinInternal(ctx context. } func (builder *dataReaderBuilder) buildUnionScanForIndexJoin(ctx context.Context, v *plannercore.PhysicalUnionScan, - values []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager) (Executor, error) { + values []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, + cwc *plannercore.ColWithCmpFuncManager, canReorderHandles bool) (Executor, error) { childBuilder := &dataReaderBuilder{Plan: v.Children()[0], executorBuilder: builder.executorBuilder} - reader, err := childBuilder.buildExecutorForIndexJoin(ctx, values, indexRanges, keyOff2IdxOff, cwc) + reader, err := childBuilder.buildExecutorForIndexJoin(ctx, values, indexRanges, keyOff2IdxOff, cwc, canReorderHandles) if err != nil { return nil, err } @@ -3001,7 +3002,8 @@ func (builder *dataReaderBuilder) buildUnionScanForIndexJoin(ctx context.Context } func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Context, v *plannercore.PhysicalTableReader, - lookUpContents []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager) (Executor, error) { + lookUpContents []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, + cwc *plannercore.ColWithCmpFuncManager, canReorderHandles bool) (Executor, error) { e, err := buildNoRangeTableReader(builder.executorBuilder, v) if err != nil { return nil, err @@ -3037,10 +3039,10 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte } if tbInfo.GetPartitionInfo() == nil { - return builder.buildTableReaderFromHandles(ctx, e, handles) + return builder.buildTableReaderFromHandles(ctx, e, handles, canReorderHandles) } if !builder.ctx.GetSessionVars().UseDynamicPartitionPrune() { - return builder.buildTableReaderFromHandles(ctx, e, handles) + return builder.buildTableReaderFromHandles(ctx, e, handles, canReorderHandles) } e.kvRangeBuilder = kvRangeBuilderFromHandles(handles) @@ -3091,10 +3093,12 @@ func (builder *dataReaderBuilder) buildTableReaderBase(ctx context.Context, e *T return e, nil } -func (builder *dataReaderBuilder) buildTableReaderFromHandles(ctx context.Context, e *TableReaderExecutor, handles []kv.Handle) (*TableReaderExecutor, error) { - sort.Slice(handles, func(i, j int) bool { - return handles[i].Compare(handles[j]) < 0 - }) +func (builder *dataReaderBuilder) buildTableReaderFromHandles(ctx context.Context, e *TableReaderExecutor, handles []kv.Handle, canReorderHandles bool) (*TableReaderExecutor, error) { + if canReorderHandles { + sort.Slice(handles, func(i, j int) bool { + return handles[i].Compare(handles[j]) < 0 + }) + } var b distsql.RequestBuilder b.SetTableHandles(getPhysicalTableID(e.table), handles) return builder.buildTableReaderBase(ctx, e, b) diff --git a/executor/distsql.go b/executor/distsql.go index 0bcb484a9d588..fe5810b8b92cd 100644 --- a/executor/distsql.go +++ b/executor/distsql.go @@ -569,7 +569,7 @@ func (e *IndexLookUpExecutor) buildTableReader(ctx context.Context, handles []kv plans: e.tblPlans, } tableReaderExec.buildVirtualColumnInfo() - tableReader, err := e.dataReaderBuilder.buildTableReaderFromHandles(ctx, tableReaderExec, handles) + tableReader, err := e.dataReaderBuilder.buildTableReaderFromHandles(ctx, tableReaderExec, handles, true) if err != nil { logutil.Logger(ctx).Error("build table reader from handles failed", zap.Error(err)) return nil, err diff --git a/executor/index_lookup_join.go b/executor/index_lookup_join.go index d1f4fcef7cc34..8dde95a671c5b 100644 --- a/executor/index_lookup_join.go +++ b/executor/index_lookup_join.go @@ -653,7 +653,7 @@ func (iw *innerWorker) fetchInnerResults(ctx context.Context, task *lookUpJoinTa atomic.AddInt64(&iw.stats.fetch, int64(time.Since(start))) }() } - innerExec, err := iw.readerBuilder.buildExecutorForIndexJoin(ctx, lookUpContent, iw.indexRanges, iw.keyOff2IdxOff, iw.nextColCompareFilters) + innerExec, err := iw.readerBuilder.buildExecutorForIndexJoin(ctx, lookUpContent, iw.indexRanges, iw.keyOff2IdxOff, iw.nextColCompareFilters, true) if err != nil { return err } diff --git a/executor/index_lookup_merge_join.go b/executor/index_lookup_merge_join.go index df9b5931f8dc2..73396875e6659 100644 --- a/executor/index_lookup_merge_join.go +++ b/executor/index_lookup_merge_join.go @@ -496,7 +496,7 @@ func (imw *innerMergeWorker) handleTask(ctx context.Context, task *lookUpMergeJo dLookUpKeys[i], dLookUpKeys[lenKeys-i-1] = dLookUpKeys[lenKeys-i-1], dLookUpKeys[i] } } - imw.innerExec, err = imw.readerBuilder.buildExecutorForIndexJoin(ctx, dLookUpKeys, imw.indexRanges, imw.keyOff2IdxOff, imw.nextColCompareFilters) + imw.innerExec, err = imw.readerBuilder.buildExecutorForIndexJoin(ctx, dLookUpKeys, imw.indexRanges, imw.keyOff2IdxOff, imw.nextColCompareFilters, false) if err != nil { return err } diff --git a/executor/index_lookup_merge_join_test.go b/executor/index_lookup_merge_join_test.go index b30f452cf6486..f52b652d346a9 100644 --- a/executor/index_lookup_merge_join_test.go +++ b/executor/index_lookup_merge_join_test.go @@ -93,6 +93,19 @@ func (s *testSuite9) TestIssue19408(c *C) { tk.MustExec("commit") } +func (s *testSuite9) TestIssue20137(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1 (id bigint(20) unsigned, primary key(id))") + tk.MustExec("create table t2 (id bigint(20) unsigned)") + tk.MustExec("insert into t1 values (8738875760185212610)") + tk.MustExec("insert into t1 values (9814441339970117597)") + tk.MustExec("insert into t2 values (8738875760185212610)") + tk.MustExec("insert into t2 values (9814441339970117597)") + tk.MustQuery("select /*+ INL_MERGE_JOIN(t1, t2) */ * from t2 left join t1 on t1.id = t2.id order by t1.id").Check( + testkit.Rows("8738875760185212610 8738875760185212610", "9814441339970117597 9814441339970117597")) +} + func (s *testSuiteWithData) TestIndexJoinOnSinglePartitionTable(c *C) { // For issue 19145 tk := testkit.NewTestKitWithInit(c, s.store) diff --git a/executor/index_merge_reader.go b/executor/index_merge_reader.go index 69458f8365fd5..db2eeb54536f3 100644 --- a/executor/index_merge_reader.go +++ b/executor/index_merge_reader.go @@ -419,7 +419,7 @@ func (e *IndexMergeReaderExecutor) buildFinalTableReader(ctx context.Context, ha plans: e.tblPlans, } tableReaderExec.buildVirtualColumnInfo() - tableReader, err := e.dataReaderBuilder.buildTableReaderFromHandles(ctx, tableReaderExec, handles) + tableReader, err := e.dataReaderBuilder.buildTableReaderFromHandles(ctx, tableReaderExec, handles, false) if err != nil { logutil.Logger(ctx).Error("build table reader from handles failed", zap.Error(err)) return nil, err From 6a10e21292a87c61de18faade6a6176dbe62c6a8 Mon Sep 17 00:00:00 2001 From: djshow832 <873581766@qq.com> Date: Tue, 22 Sep 2020 16:05:00 +0800 Subject: [PATCH 05/60] ddl: stablize testSerialSuite.TestCancelAddIndexPanic (#19761) --- ddl/serial_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ddl/serial_test.go b/ddl/serial_test.go index d1c9dd8ac0736..c54db5cf44dfa 100644 --- a/ddl/serial_test.go +++ b/ddl/serial_test.go @@ -591,7 +591,11 @@ func (s *testSerialSuite) TestCancelAddIndexPanic(c *C) { } c.Assert(checkErr, IsNil) c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[ddl:8214]Cancelled DDL job") + errMsg := err.Error() + // Cancelling the job can either succeed or not, it depends on whether the cancelled job takes affect. + // For now, there's no way to guarantee that cancelling will always take effect. + // TODO: After issue #17904 is fixed, there is no need to tolerate it here. + c.Assert(strings.HasPrefix(errMsg, "[ddl:8214]Cancelled DDL job") || strings.HasPrefix(errMsg, "[ddl:8211]DDL job rollback"), IsTrue) } func (s *testSerialSuite) TestRecoverTableByJobID(c *C) { From c303b0576094f5508d23760e852a2fc2519d6283 Mon Sep 17 00:00:00 2001 From: Kenan Yao Date: Tue, 22 Sep 2020 19:13:38 +0800 Subject: [PATCH 06/60] statistics: support dump/load/gc extended statistics (#19260) --- statistics/handle/dump.go | 59 ++++++++++++++++++++++++++++-- statistics/handle/dump_test.go | 36 +++++++++++++++++++ statistics/handle/gc.go | 61 ++++++++++++++++++++++++++++++-- statistics/handle/gc_test.go | 34 ++++++++++++++++++ statistics/handle/handle_test.go | 30 ++++++++++++++++ 5 files changed, 216 insertions(+), 4 deletions(-) diff --git a/statistics/handle/dump.go b/statistics/handle/dump.go index 16295569d76c0..18729063b48a9 100644 --- a/statistics/handle/dump.go +++ b/statistics/handle/dump.go @@ -33,11 +33,61 @@ type JSONTable struct { TableName string `json:"table_name"` Columns map[string]*jsonColumn `json:"columns"` Indices map[string]*jsonColumn `json:"indices"` + ExtStats []*jsonExtendedStats `json:"ext_stats"` Count int64 `json:"count"` ModifyCount int64 `json:"modify_count"` Partitions map[string]*JSONTable `json:"partitions"` } +type jsonExtendedStats struct { + StatsName string `json:"stats_name"` + DB string `json:"db"` + ColIDs []int64 `json:"cols"` + Tp uint8 `json:"type"` + ScalarVals float64 `json:"scalar_vals"` + StringVals string `json:"string_vals"` +} + +func dumpJSONExtendedStats(statsColl *statistics.ExtendedStatsColl) []*jsonExtendedStats { + if statsColl == nil || len(statsColl.Stats) == 0 { + return nil + } + stats := make([]*jsonExtendedStats, 0, len(statsColl.Stats)) + for key, item := range statsColl.Stats { + js := &jsonExtendedStats{ + StatsName: key.StatsName, + DB: key.DB, + ColIDs: item.ColIDs, + Tp: item.Tp, + ScalarVals: item.ScalarVals, + StringVals: item.StringVals, + } + stats = append(stats, js) + } + return stats +} + +func extendedStatsFromJSON(statsColl []*jsonExtendedStats) *statistics.ExtendedStatsColl { + if len(statsColl) == 0 { + return nil + } + stats := statistics.NewExtendedStatsColl() + for _, js := range statsColl { + key := statistics.ExtendedStatsKey{ + StatsName: js.StatsName, + DB: js.DB, + } + item := &statistics.ExtendedStatsItem{ + ColIDs: js.ColIDs, + Tp: js.Tp, + ScalarVals: js.ScalarVals, + StringVals: js.StringVals, + } + stats.Stats[key] = item + } + return stats +} + type jsonColumn struct { Histogram *tipb.Histogram `json:"histogram"` CMSketch *tipb.CMSketch `json:"cm_sketch"` @@ -115,6 +165,7 @@ func (h *Handle) tableStatsToJSON(dbName string, tableInfo *model.TableInfo, phy for _, idx := range tbl.Indices { jsonTbl.Indices[idx.Info.Name.L] = dumpJSONCol(&idx.Histogram, idx.CMSketch) } + jsonTbl.ExtStats = dumpJSONExtendedStats(tbl.ExtendedStats) return jsonTbl, nil } @@ -167,8 +218,11 @@ func (h *Handle) loadStatsFromJSON(tableInfo *model.TableInfo, physicalID int64, return errors.Trace(err) } } - err = h.SaveMetaToStorage(tbl.PhysicalID, tbl.Count, tbl.ModifyCount) - return err + err = h.SaveExtendedStatsToStorage(tbl.PhysicalID, tbl.ExtendedStats, true) + if err != nil { + return errors.Trace(err) + } + return h.SaveMetaToStorage(tbl.PhysicalID, tbl.Count, tbl.ModifyCount) } // TableStatsFromJSON loads statistic from JSONTable and return the Table of statistic. @@ -224,5 +278,6 @@ func TableStatsFromJSON(tableInfo *model.TableInfo, physicalID int64, jsonTbl *J tbl.Columns[col.ID] = col } } + tbl.ExtendedStats = extendedStatsFromJSON(jsonTbl.ExtStats) return tbl, nil } diff --git a/statistics/handle/dump_test.go b/statistics/handle/dump_test.go index 2d4dcc52ff637..d68181e0e8cab 100644 --- a/statistics/handle/dump_test.go +++ b/statistics/handle/dump_test.go @@ -184,3 +184,39 @@ func (s *testStatsSuite) TestDumpPseudoColumns(c *C) { _, err = h.DumpStatsToJSON("test", tbl.Meta(), nil) c.Assert(err, IsNil) } + +func (s *testStatsSuite) TestDumpExtendedStats(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("insert into t values(1,5),(2,4),(3,3),(4,2),(5,1)") + h := s.do.StatsHandle() + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + tk.MustExec("create statistics s1(correlation) on t(a,b)") + tk.MustExec("analyze table t") + + is := s.do.InfoSchema() + tableInfo, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tbl := h.GetTableStats(tableInfo.Meta()) + jsonTbl, err := h.DumpStatsToJSON("test", tableInfo.Meta(), nil) + c.Assert(err, IsNil) + loadTbl, err := handle.TableStatsFromJSON(tableInfo.Meta(), tableInfo.Meta().ID, jsonTbl) + c.Assert(err, IsNil) + assertTableEqual(c, loadTbl, tbl) + + cleanEnv(c, s.store, s.do) + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + c.Assert(h.Update(is), IsNil) + wg.Done() + }() + err = h.LoadStatsFromJSON(is, jsonTbl) + wg.Wait() + c.Assert(err, IsNil) + loadTblInStorage := h.GetTableStats(tableInfo.Meta()) + assertTableEqual(c, loadTblInStorage, tbl) +} diff --git a/statistics/handle/gc.go b/statistics/handle/gc.go index 3264485e6b703..65f978c82c7b0 100644 --- a/statistics/handle/gc.go +++ b/statistics/handle/gc.go @@ -15,13 +15,16 @@ package handle import ( "context" + "encoding/json" "fmt" "time" "github.com/cznic/mathutil" "github.com/pingcap/errors" "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/sqlexec" + "go.uber.org/zap" ) // GCStats will garbage collect the useless stats info. For dropped tables, we will first update their version so that @@ -34,7 +37,8 @@ func (h *Handle) GCStats(is infoschema.InfoSchema, ddlLease time.Duration) error if h.LastUpdateVersion() < offset { return nil } - sql := fmt.Sprintf("select table_id from mysql.stats_meta where version < %d", h.LastUpdateVersion()-offset) + gcVer := h.LastUpdateVersion() - offset + sql := fmt.Sprintf("select table_id from mysql.stats_meta where version < %d", gcVer) rows, _, err := h.restrictedExec.ExecRestrictedSQL(sql) if err != nil { return errors.Trace(err) @@ -44,7 +48,7 @@ func (h *Handle) GCStats(is infoschema.InfoSchema, ddlLease time.Duration) error return errors.Trace(err) } } - return nil + return h.removeDeletedExtendedStats(gcVer) } func (h *Handle) gcTableStats(is infoschema.InfoSchema, physicalID int64) error { @@ -91,6 +95,41 @@ func (h *Handle) gcTableStats(is infoschema.InfoSchema, physicalID int64) error } } } + // Mark records in mysql.stats_extended as `deleted`. + sql = fmt.Sprintf("select stats_name, db, column_ids from mysql.stats_extended where table_id = %d and status in (%d, %d)", physicalID, StatsStatusAnalyzed, StatsStatusInited) + rows, _, err = h.restrictedExec.ExecRestrictedSQL(sql) + if err != nil { + return errors.Trace(err) + } + if len(rows) == 0 { + return nil + } + for _, row := range rows { + statsName, db, strColIDs := row.GetString(0), row.GetString(1), row.GetString(2) + var colIDs []int64 + err = json.Unmarshal([]byte(strColIDs), &colIDs) + if err != nil { + logutil.BgLogger().Debug("decode column IDs failed", zap.String("column_ids", strColIDs), zap.Error(err)) + return errors.Trace(err) + } + for _, colID := range colIDs { + found := false + for _, col := range tblInfo.Columns { + if colID == col.ID { + found = true + break + } + } + if !found { + err = h.MarkExtendedStatsDeleted(statsName, db, physicalID) + if err != nil { + logutil.BgLogger().Debug("update stats_extended status failed", zap.String("stats_name", statsName), zap.String("db", db), zap.Error(err)) + return errors.Trace(err) + } + break + } + } + } return nil } @@ -148,5 +187,23 @@ func (h *Handle) DeleteTableStatsFromKV(physicalID int64) (err error) { sqls = append(sqls, fmt.Sprintf("delete from mysql.stats_buckets where table_id = %d", physicalID)) sqls = append(sqls, fmt.Sprintf("delete from mysql.stats_top_n where table_id = %d", physicalID)) sqls = append(sqls, fmt.Sprintf("delete from mysql.stats_feedback where table_id = %d", physicalID)) + sqls = append(sqls, fmt.Sprintf("update mysql.stats_extended set version = %d, status = %d where table_id = %d and status in (%d, %d)", startTS, StatsStatusDeleted, physicalID, StatsStatusAnalyzed, StatsStatusInited)) return execSQLs(context.Background(), exec, sqls) } + +func (h *Handle) removeDeletedExtendedStats(version uint64) (err error) { + h.mu.Lock() + defer h.mu.Unlock() + exec := h.mu.ctx.(sqlexec.SQLExecutor) + ctx := context.Background() + _, err = exec.Execute(ctx, "begin pessimistic") + if err != nil { + return errors.Trace(err) + } + defer func() { + err = finishTransaction(ctx, exec, err) + }() + sql := fmt.Sprintf("delete from mysql.stats_extended where status = %d and version < %d", StatsStatusDeleted, version) + _, err = exec.Execute(ctx, sql) + return +} diff --git a/statistics/handle/gc_test.go b/statistics/handle/gc_test.go index e84cc38816dfb..733fbfebe31ca 100644 --- a/statistics/handle/gc_test.go +++ b/statistics/handle/gc_test.go @@ -89,3 +89,37 @@ func (s *testStatsSuite) TestGCPartition(c *C) { c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) testKit.MustQuery("select count(*) from mysql.stats_meta").Check(testkit.Rows("0")) } + +func (s *testStatsSuite) TestGCExtendedStats(c *C) { + defer cleanEnv(c, s.store, s.do) + testKit := testkit.NewTestKit(c, s.store) + testKit.MustExec("use test") + testKit.MustExec("create table t(a int, b int, c int)") + testKit.MustExec("insert into t values (1,1,1),(2,2,2),(3,3,3)") + testKit.MustExec("create statistics s1(correlation) on t(a,b)") + testKit.MustExec("create statistics s2(correlation) on t(b,c)") + testKit.MustExec("analyze table t") + + testKit.MustQuery("select stats_name, db, type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended").Sort().Check(testkit.Rows( + "s1 test 2 [1,2] 1 1", + "s2 test 2 [2,3] 1 1", + )) + testKit.MustExec("alter table t drop column a") + testKit.MustQuery("select stats_name, db, type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended").Sort().Check(testkit.Rows( + "s1 test 2 [1,2] 1 1", + "s2 test 2 [2,3] 1 1", + )) + h := s.do.StatsHandle() + h.SetLastUpdateVersion(math.MaxUint64) + ddlLease := time.Duration(0) + c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + testKit.MustQuery("select stats_name, db, type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended").Check(testkit.Rows( + "s2 test 2 [2,3] 1 1", + )) + testKit.MustExec("drop table t") + testKit.MustQuery("select stats_name, db, type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended").Check(testkit.Rows( + "s2 test 2 [2,3] 1 1", + )) + c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + testKit.MustQuery("select stats_name, db, type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended").Check(testkit.Rows()) +} diff --git a/statistics/handle/handle_test.go b/statistics/handle/handle_test.go index 9453bb237b24b..3cc530b47cc70 100644 --- a/statistics/handle/handle_test.go +++ b/statistics/handle/handle_test.go @@ -180,6 +180,36 @@ func assertTableEqual(c *C, a *statistics.Table, b *statistics.Table) { c.Assert(a.Columns[i].CMSketch.Equal(b.Columns[i].CMSketch), IsTrue) } } + c.Assert(isSameExtendedStats(a.ExtendedStats, b.ExtendedStats), IsTrue) +} + +func isSameExtendedStats(a, b *statistics.ExtendedStatsColl) bool { + aEmpty := (a == nil) || len(a.Stats) == 0 + bEmpty := (b == nil) || len(b.Stats) == 0 + if (aEmpty && !bEmpty) || (!aEmpty && bEmpty) { + return false + } + if aEmpty && bEmpty { + return true + } + if len(a.Stats) != len(b.Stats) { + return false + } + for aKey, aItem := range a.Stats { + bItem, ok := b.Stats[aKey] + if !ok { + return false + } + for i, id := range aItem.ColIDs { + if id != bItem.ColIDs[i] { + return false + } + } + if (aItem.Tp != bItem.Tp) || (aItem.ScalarVals != bItem.ScalarVals) || (aItem.StringVals != bItem.StringVals) { + return false + } + } + return true } func (s *testStatsSuite) TestStatsStoreAndLoad(c *C) { From 151ef8492bb5ab8394fb39b439cb029dd82776aa Mon Sep 17 00:00:00 2001 From: Kenan Yao Date: Tue, 22 Sep 2020 19:17:42 +0800 Subject: [PATCH 07/60] statistics: prioritize low selectivity indexes in the greedy search procedure of `Selectivity()` (#20038) --- planner/core/cbo_test.go | 32 + ...lyzeSuiteTestLowSelIndexGreedySearchT.json | 99365 ++++++++++++++++ planner/core/testdata/analyze_suite_in.json | 6 + planner/core/testdata/analyze_suite_out.json | 16 + statistics/selectivity.go | 14 +- 5 files changed, 99430 insertions(+), 3 deletions(-) create mode 100644 planner/core/testdata/analyzeSuiteTestLowSelIndexGreedySearchT.json diff --git a/planner/core/cbo_test.go b/planner/core/cbo_test.go index 07c2d212c533d..5ee932438bed0 100644 --- a/planner/core/cbo_test.go +++ b/planner/core/cbo_test.go @@ -815,6 +815,38 @@ func (s *testAnalyzeSuite) TestLimitCrossEstimation(c *C) { } } +func (s *testAnalyzeSuite) TestLowSelIndexGreedySearch(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + testKit := testkit.NewTestKit(c, store) + defer func() { + dom.Close() + store.Close() + }() + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t (a varchar(32) default null, b varchar(10) default null, c varchar(12) default null, d varchar(32) default null, e bigint(10) default null, key idx1 (d,a), key idx2 (a,c), key idx3 (c,b), key idx4 (e))") + err = s.loadTableStats("analyzeSuiteTestLowSelIndexGreedySearchT.json", dom) + c.Assert(err, IsNil) + var input []string + var output []struct { + SQL string + Plan []string + } + // The test purposes are: + // - index `idx2` runs much faster than `idx4` experimentally; + // - estimated row count of IndexLookUp should be 0; + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) + }) + testKit.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) + } +} + func (s *testAnalyzeSuite) TestUpdateProjEliminate(c *C) { store, dom, err := newStoreWithBootstrap() c.Assert(err, IsNil) diff --git a/planner/core/testdata/analyzeSuiteTestLowSelIndexGreedySearchT.json b/planner/core/testdata/analyzeSuiteTestLowSelIndexGreedySearchT.json new file mode 100644 index 0000000000000..ca4a0120899bc --- /dev/null +++ b/planner/core/testdata/analyzeSuiteTestLowSelIndexGreedySearchT.json @@ -0,0 +1,99365 @@ +{ + "database_name": "test", + "table_name": "t", + "columns": { + "b": { + "histogram": { + "ndv": 2, + "buckets": [ + { + "count": 87399192, + "lower_bound": "QUxT", + "upper_bound": "RUNP", + "repeats": 87215220 + } + ] + }, + "cm_sketch": { + "rows": [ + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 98, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 98, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 98, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 98, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 98, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + } + ], + "top_n": [ + { + "data": "AgZFQ08=", + "count": 87197679 + }, + { + "data": "AgZBTFM=", + "count": 201415 + } + ], + "default_value": 0 + }, + "null_count": 0, + "tot_col_size": 444408069, + "last_update_version": 419082401542832168, + "correlation": 0.99605 + }, + "a": { + "histogram": { + "ndv": 263360, + "buckets": [ + { + "count": 349596, + "lower_bound": "MTI0MDAwNDAzODY=", + "upper_bound": "NDE=", + "repeats": 17809 + }, + { + "count": 699193, + "lower_bound": "NDI=", + "upper_bound": "SkwxNjQxNjg=", + "repeats": 331 + }, + { + "count": 1048790, + "lower_bound": "SkwxNzA0MDM=", + "upper_bound": "TDMw", + "repeats": 26548 + }, + { + "count": 1424606, + "lower_bound": "TDMx", + "upper_bound": "UDEwMzMwMzA=", + "repeats": 35287 + }, + { + "count": 1861602, + "lower_bound": "UDEwMzM4NzM=", + "upper_bound": "UDEwODgwNDY=", + "repeats": 87721 + }, + { + "count": 2228679, + "lower_bound": "UDEwODgwODU=", + "upper_bound": "UDExMTk4NjM=", + "repeats": 175111 + }, + { + "count": 2578276, + "lower_bound": "UDExMjAzMjY=", + "upper_bound": "UDExMzMzMjQ=", + "repeats": 331 + }, + { + "count": 3111411, + "lower_bound": "UDExMzk0ODA=", + "upper_bound": "UDExNDIwNTI=", + "repeats": 332413 + }, + { + "count": 3740685, + "lower_bound": "UDExNDM3MDM=", + "upper_bound": "UDExNDYwMjA=", + "repeats": 515932 + }, + { + "count": 4099022, + "lower_bound": "UDExNDg2ODU=", + "upper_bound": "UDExNjU1MDc=", + "repeats": 9070 + }, + { + "count": 4623417, + "lower_bound": "UDExNjcy", + "upper_bound": "UDExNzU2NzU=", + "repeats": 437281 + }, + { + "count": 4973014, + "lower_bound": "UDExOTEw", + "upper_bound": "UDEyMDc3NDY=", + "repeats": 331 + }, + { + "count": 5322610, + "lower_bound": "UDEyMTA4MTQ=", + "upper_bound": "UDEyMTYxOTM=", + "repeats": 331 + }, + { + "count": 5680947, + "lower_bound": "UDEyMTYxOTc=", + "upper_bound": "UDEyMzY0OTc=", + "repeats": 26548 + }, + { + "count": 6135423, + "lower_bound": "UDEyMzY4NjU=", + "upper_bound": "UDEyNTg5NzM=", + "repeats": 175111 + }, + { + "count": 6633598, + "lower_bound": "UDEyNTkyMDE=", + "upper_bound": "UDEyNjUwNjE=", + "repeats": 245023 + }, + { + "count": 7297832, + "lower_bound": "UDEyNjU0NjM=", + "upper_bound": "UDEyNjcxNTE=", + "repeats": 419803 + }, + { + "count": 7734828, + "lower_bound": "UDEyNjczNDU=", + "upper_bound": "UDEyODAwNzQ=", + "repeats": 210067 + }, + { + "count": 8617560, + "lower_bound": "UDEyODAxMDM=", + "upper_bound": "UDEzMDE0MDQ=", + "repeats": 550888 + }, + { + "count": 9106995, + "lower_bound": "UDEzMDE5MTM=", + "upper_bound": "UDEzMjAwODc=", + "repeats": 349891 + }, + { + "count": 9474072, + "lower_bound": "UDEzMjgx", + "upper_bound": "UDEzMjk4", + "repeats": 26548 + }, + { + "count": 10077126, + "lower_bound": "UDEzMjk5", + "upper_bound": "UDEzMzExNDY=", + "repeats": 323674 + }, + { + "count": 10444203, + "lower_bound": "UDEzMzEy", + "upper_bound": "UDEzOTE3Mg==", + "repeats": 17809 + }, + { + "count": 10793800, + "lower_bound": "UDEzOTgxOTU=", + "upper_bound": "UDE0Mzc4", + "repeats": 331 + }, + { + "count": 11143396, + "lower_bound": "UDE0Mzc4MDE=", + "upper_bound": "UDE0NjkxNjE=", + "repeats": 331 + }, + { + "count": 11492993, + "lower_bound": "UDE0NzQ1MDQ=", + "upper_bound": "UDE5OTYyODk=", + "repeats": 331 + }, + { + "count": 11851330, + "lower_bound": "UDIwMTg2NDg=", + "upper_bound": "UDIwNjkwNTE=", + "repeats": 26548 + }, + { + "count": 12235886, + "lower_bound": "UDIwNjkxNzQ=", + "upper_bound": "UDIxMjQw", + "repeats": 44026 + }, + { + "count": 12585483, + "lower_bound": "UDIxNjQz", + "upper_bound": "UDI1NjI4", + "repeats": 331 + }, + { + "count": 12935080, + "lower_bound": "UDI1NjM0", + "upper_bound": "UDMzMQ==", + "repeats": 331 + }, + { + "count": 13284677, + "lower_bound": "UDMzMTA4", + "upper_bound": "UDMzODE0Mg==", + "repeats": 131416 + }, + { + "count": 13634273, + "lower_bound": "UDM0MDIy", + "upper_bound": "UDQxNzEwMA==", + "repeats": 331 + }, + { + "count": 13983870, + "lower_bound": "UDQyMjc0OQ==", + "upper_bound": "UDQ1Nzk0MQ==", + "repeats": 331 + }, + { + "count": 14342207, + "lower_bound": "UDQ2NTQw", + "upper_bound": "UDUwNDcz", + "repeats": 35287 + }, + { + "count": 14752983, + "lower_bound": "UDUwNDkx", + "upper_bound": "UDUzMzY2Mg==", + "repeats": 157633 + }, + { + "count": 15155019, + "lower_bound": "UDUzMzY5Nw==", + "upper_bound": "UDU5OTI=", + "repeats": 87721 + }, + { + "count": 15609495, + "lower_bound": "UDYwMTY5MA==", + "upper_bound": "UDY4NDg=", + "repeats": 113938 + }, + { + "count": 15959092, + "lower_bound": "UDY4NDk=", + "upper_bound": "UDY5Mjk5Mg==", + "repeats": 331 + }, + { + "count": 16334908, + "lower_bound": "UDY5NDU5MQ==", + "upper_bound": "UDc3NTAwMg==", + "repeats": 26548 + }, + { + "count": 16719465, + "lower_bound": "UDc3NTEwNw==", + "upper_bound": "UDc4MzYxMQ==", + "repeats": 96460 + }, + { + "count": 17069062, + "lower_bound": "UDc4MzYzNA==", + "upper_bound": "UDgyMjQzMw==", + "repeats": 96460 + }, + { + "count": 17488578, + "lower_bound": "UDgyMjUxMg==", + "upper_bound": "UDg0NjU4Mg==", + "repeats": 96460 + }, + { + "count": 17978013, + "lower_bound": "UDg0NzgwOQ==", + "upper_bound": "UDg4NDM2MQ==", + "repeats": 148894 + }, + { + "count": 18336350, + "lower_bound": "UDg4NDM3Ng==", + "upper_bound": "UDg5MDI0MA==", + "repeats": 44026 + }, + { + "count": 18764606, + "lower_bound": "UDg5MDQ2Mw==", + "upper_bound": "UDkzMTYyOQ==", + "repeats": 105199 + }, + { + "count": 19157902, + "lower_bound": "UDkzMTYzNQ==", + "upper_bound": "UDk3NzQzMw==", + "repeats": 52765 + }, + { + "count": 19647338, + "lower_bound": "UDk4MzM4MA==", + "upper_bound": "UDk5ODQ2Mw==", + "repeats": 140155 + }, + { + "count": 19996935, + "lower_bound": "UDk5ODQ4", + "upper_bound": "UTExMjM2MQ==", + "repeats": 9070 + }, + { + "count": 20346531, + "lower_bound": "UTExMjY3MA==", + "upper_bound": "UTEyNjIwMQ==", + "repeats": 17809 + }, + { + "count": 20696128, + "lower_bound": "UTEyNjQ0OQ==", + "upper_bound": "UTEzMTU2Nw==", + "repeats": 331 + }, + { + "count": 21045725, + "lower_bound": "UTEzMzEwNA==", + "upper_bound": "UTE0NjExOA==", + "repeats": 331 + }, + { + "count": 21395322, + "lower_bound": "UTE0NjU0NA==", + "upper_bound": "UTE2NTk3", + "repeats": 331 + }, + { + "count": 21849798, + "lower_bound": "UTE2NTk5Ng==", + "upper_bound": "UTE2OTQyMg==", + "repeats": 113938 + }, + { + "count": 22330493, + "lower_bound": "UTE2OTQzNQ==", + "upper_bound": "UTE2OTU0MA==", + "repeats": 201328 + }, + { + "count": 22732529, + "lower_bound": "UTE2OTU1MQ==", + "upper_bound": "UTE2OTYwNA==", + "repeats": 192589 + }, + { + "count": 23134566, + "lower_bound": "UTE2OTg3Ng==", + "upper_bound": "UTE3MDAxNw==", + "repeats": 201328 + }, + { + "count": 23571562, + "lower_bound": "UTE3MDAzOA==", + "upper_bound": "UTE3MDEyNA==", + "repeats": 192589 + }, + { + "count": 23956118, + "lower_bound": "UTE3MDEzMg==", + "upper_bound": "UTE3MDIwNQ==", + "repeats": 192589 + }, + { + "count": 24419334, + "lower_bound": "UTE3MDI1Mw==", + "upper_bound": "UTE3MDM2NQ==", + "repeats": 140155 + }, + { + "count": 24891289, + "lower_bound": "UTE3MDM2Ng==", + "upper_bound": "UTE3MDQwNw==", + "repeats": 166372 + }, + { + "count": 25275846, + "lower_bound": "UTE3MDQxOA==", + "upper_bound": "UTE3MDQ1Ng==", + "repeats": 140155 + }, + { + "count": 25730322, + "lower_bound": "UTE3MDUzMQ==", + "upper_bound": "UTE3MDYwNg==", + "repeats": 122677 + }, + { + "count": 26324636, + "lower_bound": "UTE3MDYxOQ==", + "upper_bound": "UTE3MDYzMw==", + "repeats": 271240 + }, + { + "count": 26717932, + "lower_bound": "UTE3MTIzMg==", + "upper_bound": "UTE4MjI3OA==", + "repeats": 61504 + }, + { + "count": 27076269, + "lower_bound": "UTE4MjI4OA==", + "upper_bound": "UTE4NDY1OQ==", + "repeats": 35287 + }, + { + "count": 27522005, + "lower_bound": "UTE4NDc0MA==", + "upper_bound": "UTE4NjQ0Ng==", + "repeats": 166372 + }, + { + "count": 27976481, + "lower_bound": "UTE4NjU0Mg==", + "upper_bound": "UTE4ODEwMQ==", + "repeats": 105199 + }, + { + "count": 28326078, + "lower_bound": "UTE4ODMxOA==", + "upper_bound": "UTE5Mjg4Ng==", + "repeats": 331 + }, + { + "count": 28684414, + "lower_bound": "UTE5MzQ2OA==", + "upper_bound": "UTE5MzUwNg==", + "repeats": 26548 + }, + { + "count": 29034011, + "lower_bound": "UTE5MzUwNw==", + "upper_bound": "UTE5OTY1MQ==", + "repeats": 331 + }, + { + "count": 29540926, + "lower_bound": "UTIwMDA5Ng==", + "upper_bound": "UTM1ODky", + "repeats": 166372 + }, + { + "count": 29890523, + "lower_bound": "UTM1OTM4", + "upper_bound": "UTUzMzI=", + "repeats": 331 + }, + { + "count": 30240120, + "lower_bound": "UTUzOTI2", + "upper_bound": "UTc5OTky", + "repeats": 331 + }, + { + "count": 30589717, + "lower_bound": "UTgwODk0", + "upper_bound": "UjQxODY3", + "repeats": 331 + }, + { + "count": 31157811, + "lower_bound": "UjUwMzA1", + "upper_bound": "VDEwMTc=", + "repeats": 245023 + }, + { + "count": 31507408, + "lower_bound": "VDEwMTk=", + "upper_bound": "VDEzMjU=", + "repeats": 331 + }, + { + "count": 31891965, + "lower_bound": "VDEzMjY=", + "upper_bound": "VDE0NDU=", + "repeats": 52765 + }, + { + "count": 32250301, + "lower_bound": "VDE0NDk=", + "upper_bound": "VDE0OTQ=", + "repeats": 26548 + }, + { + "count": 35352973, + "lower_bound": "VDE0OTU=", + "upper_bound": "VDE0OTU=", + "repeats": 3093937 + }, + { + "count": 35711309, + "lower_bound": "VDE0OTY=", + "upper_bound": "VDE1MDY=", + "repeats": 44026 + }, + { + "count": 36087126, + "lower_bound": "VDE1MDg=", + "upper_bound": "VDE1MjM=", + "repeats": 113938 + }, + { + "count": 36445463, + "lower_bound": "VDE1MjU=", + "upper_bound": "VDE1MzI=", + "repeats": 122677 + }, + { + "count": 36830019, + "lower_bound": "VDE1MzQ=", + "upper_bound": "VDE1NDc=", + "repeats": 52765 + }, + { + "count": 37179616, + "lower_bound": "VDE1NTA=", + "upper_bound": "VDE1NTU=", + "repeats": 9070 + }, + { + "count": 37721491, + "lower_bound": "VDE1NTc=", + "upper_bound": "VDE1NzQ=", + "repeats": 236284 + }, + { + "count": 39425775, + "lower_bound": "VDE1NzY=", + "upper_bound": "VDE1ODY=", + "repeats": 1468483 + }, + { + "count": 39854031, + "lower_bound": "VDE1ODc=", + "upper_bound": "VDE1OTY=", + "repeats": 157633 + }, + { + "count": 40990221, + "lower_bound": "VDE1OTc=", + "upper_bound": "VDE2MDU=", + "repeats": 917926 + }, + { + "count": 41348557, + "lower_bound": "VDE2MDY=", + "upper_bound": "VDE2MTU=", + "repeats": 78982 + }, + { + "count": 41724374, + "lower_bound": "VDE2MTY=", + "upper_bound": "VDE2MTY=", + "repeats": 367369 + }, + { + "count": 42082710, + "lower_bound": "VDE2MTc=", + "upper_bound": "VDE2MzQ=", + "repeats": 9070 + }, + { + "count": 42441047, + "lower_bound": "VDE2MzU=", + "upper_bound": "VDE2NDY=", + "repeats": 52765 + }, + { + "count": 42921743, + "lower_bound": "VDE2NDg=", + "upper_bound": "VDE2NTY=", + "repeats": 253762 + }, + { + "count": 43280079, + "lower_bound": "VDE2NTc=", + "upper_bound": "VDE2NzA=", + "repeats": 70243 + }, + { + "count": 43655896, + "lower_bound": "VDE2NzQ=", + "upper_bound": "VDE2OTE=", + "repeats": 35287 + }, + { + "count": 44014233, + "lower_bound": "VDE2OTI=", + "upper_bound": "VDE2OTY=", + "repeats": 70243 + }, + { + "count": 44363829, + "lower_bound": "VDE2OTk=", + "upper_bound": "VDE3MjA=", + "repeats": 17809 + }, + { + "count": 44722166, + "lower_bound": "VDE3MjQ=", + "upper_bound": "VDE3Mzg=", + "repeats": 26548 + }, + { + "count": 45543718, + "lower_bound": "VDE3NDI=", + "upper_bound": "VDE3NTQ=", + "repeats": 524671 + }, + { + "count": 45945755, + "lower_bound": "VDE3NTY=", + "upper_bound": "VDE3NjA=", + "repeats": 87721 + }, + { + "count": 46435190, + "lower_bound": "VDE3NjI=", + "upper_bound": "VDE3NzI=", + "repeats": 236284 + }, + { + "count": 46863446, + "lower_bound": "VDE3Nzc=", + "upper_bound": "VDE4MDE=", + "repeats": 140155 + }, + { + "count": 47213043, + "lower_bound": "VDE4MDQ=", + "upper_bound": "VDE4MjM=", + "repeats": 35287 + }, + { + "count": 48628910, + "lower_bound": "VDE4MjQ=", + "upper_bound": "VDE4MzE=", + "repeats": 1319920 + }, + { + "count": 49039686, + "lower_bound": "VDE4MzI=", + "upper_bound": "VDE4NDk=", + "repeats": 87721 + }, + { + "count": 49467942, + "lower_bound": "VDE4NTA=", + "upper_bound": "VDE4Njk=", + "repeats": 210067 + }, + { + "count": 49869978, + "lower_bound": "VDE4NzA=", + "upper_bound": "VDE4ODQ=", + "repeats": 52765 + }, + { + "count": 50219575, + "lower_bound": "VDE4ODk=", + "upper_bound": "VDE5MDQ=", + "repeats": 26548 + }, + { + "count": 50612872, + "lower_bound": "VDE5MDY=", + "upper_bound": "VDE5MTk=", + "repeats": 253762 + }, + { + "count": 51041128, + "lower_bound": "VDE5MjA=", + "upper_bound": "VDE5Mzc=", + "repeats": 218806 + }, + { + "count": 51408204, + "lower_bound": "VDE5Mzg=", + "upper_bound": "VDE5NTI=", + "repeats": 44026 + }, + { + "count": 52002519, + "lower_bound": "VDE5NTk=", + "upper_bound": "VDE5Nzg=", + "repeats": 306196 + }, + { + "count": 53907821, + "lower_bound": "VDE5ODE=", + "upper_bound": "VDE5ODY=", + "repeats": 1844260 + }, + { + "count": 54257418, + "lower_bound": "VDE5ODg=", + "upper_bound": "VDIwNjI=", + "repeats": 9070 + }, + { + "count": 54738113, + "lower_bound": "VDIwNjM=", + "upper_bound": "VDIwNzk=", + "repeats": 131416 + }, + { + "count": 55096450, + "lower_bound": "VDIwODE=", + "upper_bound": "VDIwOTA=", + "repeats": 9070 + }, + { + "count": 55481007, + "lower_bound": "VDIwOTI=", + "upper_bound": "VDIwOTc=", + "repeats": 262501 + }, + { + "count": 57430009, + "lower_bound": "VDIwOTg=", + "upper_bound": "VDIxMDg=", + "repeats": 1914172 + }, + { + "count": 57910704, + "lower_bound": "VDIxMTE=", + "upper_bound": "VDIxMzA=", + "repeats": 148894 + }, + { + "count": 62140825, + "lower_bound": "VDIxMzQ=", + "upper_bound": "VDIxMzQ=", + "repeats": 4221268 + }, + { + "count": 62534121, + "lower_bound": "VDIxMzg=", + "upper_bound": "VDIxNTE=", + "repeats": 245023 + }, + { + "count": 62883718, + "lower_bound": "VDIxNTI=", + "upper_bound": "VDIxNjk=", + "repeats": 61504 + }, + { + "count": 63233315, + "lower_bound": "VDIxNzU=", + "upper_bound": "VDIyMTA=", + "repeats": 9070 + }, + { + "count": 63582912, + "lower_bound": "VDIyMTE=", + "upper_bound": "VDIyNDk=", + "repeats": 35287 + }, + { + "count": 64054867, + "lower_bound": "VDIyNTA=", + "upper_bound": "VDIyNjU=", + "repeats": 271240 + }, + { + "count": 65208537, + "lower_bound": "VDIyNjc=", + "upper_bound": "VDIyODA=", + "repeats": 804319 + }, + { + "count": 65619313, + "lower_bound": "VDIyODE=", + "upper_bound": "VDIyOTM=", + "repeats": 175111 + }, + { + "count": 67716893, + "lower_bound": "VDIyOTU=", + "upper_bound": "VDIyOTY=", + "repeats": 2053996 + }, + { + "count": 69429918, + "lower_bound": "VDIzMDI=", + "upper_bound": "VDIzMDM=", + "repeats": 1695697 + }, + { + "count": 69788254, + "lower_bound": "VDIzMDU=", + "upper_bound": "VDIzMDk=", + "repeats": 26548 + }, + { + "count": 70190291, + "lower_bound": "VDIzMTI=", + "upper_bound": "VDIzMTU=", + "repeats": 279979 + }, + { + "count": 70784605, + "lower_bound": "VDIzMTY=", + "upper_bound": "VDIzMjY=", + "repeats": 454759 + }, + { + "count": 71134202, + "lower_bound": "VDIzMjc=", + "upper_bound": "VDIzMzY=", + "repeats": 9070 + }, + { + "count": 71597418, + "lower_bound": "VDIzMzc=", + "upper_bound": "VDIzNTI=", + "repeats": 175111 + }, + { + "count": 72628728, + "lower_bound": "VDIzNTM=", + "upper_bound": "VDIzNTc=", + "repeats": 874231 + }, + { + "count": 72978325, + "lower_bound": "VDIzNTk=", + "upper_bound": "VDIzNzU=", + "repeats": 26548 + }, + { + "count": 73389101, + "lower_bound": "VDIzNzc=", + "upper_bound": "VDIzNzc=", + "repeats": 402325 + }, + { + "count": 73747438, + "lower_bound": "VDIzNzg=", + "upper_bound": "VDIzOTE=", + "repeats": 17809 + }, + { + "count": 74149474, + "lower_bound": "VDIzOTI=", + "upper_bound": "VDI0MDE=", + "repeats": 70243 + }, + { + "count": 74770008, + "lower_bound": "VDI0MDI=", + "upper_bound": "VDI0MzE=", + "repeats": 349891 + }, + { + "count": 75137085, + "lower_bound": "VDI0MzQ=", + "upper_bound": "VDI0NDE=", + "repeats": 26548 + }, + { + "count": 75512901, + "lower_bound": "VDI0NDQ=", + "upper_bound": "VDI0NTk=", + "repeats": 44026 + }, + { + "count": 75958637, + "lower_bound": "VDI0NjA=", + "upper_bound": "VDI0Njc=", + "repeats": 236284 + }, + { + "count": 76316974, + "lower_bound": "VDI0Njk=", + "upper_bound": "VDI0OTE=", + "repeats": 113938 + }, + { + "count": 76675311, + "lower_bound": "VDI0OTQ=", + "upper_bound": "VDI1MzE=", + "repeats": 105199 + }, + { + "count": 77059867, + "lower_bound": "VDI1MzI=", + "upper_bound": "VDI1NTY=", + "repeats": 70243 + }, + { + "count": 77453163, + "lower_bound": "VDI1NjM=", + "upper_bound": "VDI1ODY=", + "repeats": 44026 + }, + { + "count": 77811500, + "lower_bound": "VDI1OTA=", + "upper_bound": "VDI2MjM=", + "repeats": 9070 + }, + { + "count": 78283456, + "lower_bound": "VDI2MjY=", + "upper_bound": "VDI2NTA=", + "repeats": 227545 + }, + { + "count": 78676752, + "lower_bound": "VDI2NTE=", + "upper_bound": "VDI2NTc=", + "repeats": 44026 + }, + { + "count": 79253587, + "lower_bound": "VDI2NjA=", + "upper_bound": "VDI2NzM=", + "repeats": 402325 + }, + { + "count": 79620663, + "lower_bound": "VDI2NzQ=", + "upper_bound": "VDI3MDA=", + "repeats": 17809 + }, + { + "count": 80005220, + "lower_bound": "VDI3MDk=", + "upper_bound": "VDI3MTE=", + "repeats": 262501 + }, + { + "count": 80363557, + "lower_bound": "VDI3MTU=", + "upper_bound": "VDI3MzA=", + "repeats": 44026 + }, + { + "count": 80713153, + "lower_bound": "VDI3MzE=", + "upper_bound": "VDI3Mzc=", + "repeats": 331 + }, + { + "count": 81071490, + "lower_bound": "VDI3Mzk=", + "upper_bound": "VDI3NTQ=", + "repeats": 9070 + }, + { + "count": 81421087, + "lower_bound": "VDI3NTU=", + "upper_bound": "VDI3Nzc=", + "repeats": 331 + }, + { + "count": 81788163, + "lower_bound": "VDI3ODA=", + "upper_bound": "VDI4MTQ=", + "repeats": 35287 + }, + { + "count": 82198940, + "lower_bound": "VDI4MTU=", + "upper_bound": "VDI4MzQ=", + "repeats": 157633 + }, + { + "count": 82627196, + "lower_bound": "VDI4MzY=", + "upper_bound": "VDI4NTM=", + "repeats": 175111 + }, + { + "count": 83037972, + "lower_bound": "VDI4NTc=", + "upper_bound": "VDI4NjA=", + "repeats": 332413 + }, + { + "count": 83466228, + "lower_bound": "VDI4NjE=", + "upper_bound": "VDI4NzY=", + "repeats": 87721 + }, + { + "count": 83815825, + "lower_bound": "VDI4Nzc=", + "upper_bound": "VDI5NDk=", + "repeats": 331 + }, + { + "count": 84200381, + "lower_bound": "VDI5NTE=", + "upper_bound": "VDMwMDE=", + "repeats": 35287 + }, + { + "count": 84549978, + "lower_bound": "VDMwMDc=", + "upper_bound": "VDMwODA=", + "repeats": 331 + }, + { + "count": 84952014, + "lower_bound": "VDMwODU=", + "upper_bound": "VDMyMDg=", + "repeats": 70243 + }, + { + "count": 85301611, + "lower_bound": "VDMyMDk=", + "upper_bound": "VDMyODA=", + "repeats": 35287 + }, + { + "count": 85756087, + "lower_bound": "VDMyODM=", + "upper_bound": "VDMzMDk=", + "repeats": 262501 + }, + { + "count": 86140643, + "lower_bound": "VDMzMTA=", + "upper_bound": "VDMzNDQ=", + "repeats": 78982 + }, + { + "count": 86490240, + "lower_bound": "VDMzNDY=", + "upper_bound": "VDMzNzE=", + "repeats": 331 + }, + { + "count": 86839837, + "lower_bound": "VDMzNzM=", + "upper_bound": "VDMzOTM=", + "repeats": 331 + }, + { + "count": 87224393, + "lower_bound": "VDMzOTc=", + "upper_bound": "VDQ=", + "repeats": 96460 + }, + { + "count": 87399192, + "lower_bound": "VDg=", + "upper_bound": "VjQwOTU3MTY=", + "repeats": 331 + } + ] + }, + "cm_sketch": { + "rows": [ + { + "counters": [ + 1050, + 6651, + 5776, + 18999, + 5235, + 2368, + 848, + 4533, + 5467, + 23699, + 16143, + 49061, + 7631, + 4404, + 10081, + 7161, + 483, + 10708, + 2207, + 6298, + 1455, + 17281, + 2766, + 2872, + 6490, + 9744, + 121462, + 159149, + 758, + 38463, + 14209, + 14153, + 44890, + 12625, + 10873, + 1366, + 36163, + 4916, + 11204, + 41635, + 18021, + 22353, + 3401, + 4328, + 1551, + 25816, + 6449, + 4475, + 1194, + 5447, + 6686, + 1286, + 31758, + 28074, + 28792, + 2145, + 1098, + 33383, + 64328, + 86773, + 1055, + 12205, + 3682, + 8172, + 2218, + 2063, + 85978, + 2752, + 4981, + 2093, + 89399, + 21374, + 5896, + 6417, + 4078, + 2000, + 38477, + 78039, + 15280, + 72661, + 1059, + 4949, + 7613, + 3547, + 17160, + 6023, + 6858, + 19509, + 6867, + 10017, + 13131, + 980, + 2094, + 42089, + 337863, + 2060, + 8319, + 17594, + 22303, + 6245, + 21681, + 2966, + 2709, + 33736, + 18025, + 3224, + 95820, + 104230, + 4475, + 2570, + 2731, + 1281, + 813, + 6349, + 8435, + 2149, + 2081, + 2365, + 5673, + 11971, + 11765, + 24272, + 38335, + 18243, + 7611, + 93819, + 8846, + 1728, + 69038, + 22543, + 995, + 1158, + 14523, + 54155, + 1908, + 27747, + 20085, + 10077, + 714, + 1773, + 38147, + 10262, + 8073, + 4528, + 842, + 25064, + 63842, + 988, + 1927, + 1863, + 4278, + 8753, + 8033, + 86971, + 7290, + 4398, + 1119, + 9342, + 9190, + 26258, + 55529, + 12980, + 96625, + 3469, + 5496, + 4782, + 4956, + 18018, + 6272, + 57210, + 309818, + 101621, + 2797, + 2476, + 18911, + 3116, + 30324, + 1741, + 9944, + 35256, + 1434, + 35937, + 1462, + 62493, + 46111, + 4718, + 911, + 576, + 9844, + 98034, + 5674, + 17006, + 193968, + 71894, + 1320, + 7531, + 6225, + 910, + 46321, + 523, + 14745, + 4289, + 1976, + 7238, + 85041, + 5761, + 19356, + 7737, + 4618, + 4087, + 13784, + 4716, + 9892, + 4148, + 28171, + 9030, + 103577, + 3352, + 2581, + 710, + 36179, + 4802, + 61447, + 8829, + 7591, + 66487, + 989, + 21935, + 8862, + 4990, + 67249, + 2486, + 1297, + 8997, + 2007, + 4399, + 2031, + 7017, + 4355, + 799, + 15233, + 36619, + 169158, + 7413, + 2810, + 95442, + 1262, + 124091, + 10492, + 219884, + 2614, + 2249, + 37682, + 5253, + 15393, + 2202, + 4607, + 2283, + 17354, + 34348, + 114299, + 6298, + 27857, + 749, + 5245, + 1701, + 131337, + 62925, + 9299, + 1803, + 13260, + 80011, + 14505, + 19378, + 17022, + 124320, + 68210, + 3309, + 5221, + 12523, + 12965, + 122906, + 23596, + 8355, + 3045, + 87797, + 1572, + 20294, + 4998, + 116274, + 5325, + 123134, + 38496, + 47399, + 3546, + 1884, + 28768, + 241189, + 1991, + 5638, + 28068, + 2075, + 118152, + 44455, + 9518, + 16114, + 122679, + 11755, + 210480, + 6938, + 23072, + 5319, + 2192, + 1174, + 1177, + 47227, + 37730, + 9982, + 16014, + 953, + 6216, + 241030, + 28348, + 1560, + 219086, + 2006, + 18037, + 31611, + 2191, + 9785, + 80376, + 891, + 2396, + 11562, + 9816, + 55541, + 46412, + 6473, + 47269, + 1019, + 776, + 6637, + 1872, + 15147, + 4427, + 4321, + 32578, + 12944, + 3772, + 4566, + 13621, + 3150, + 1246, + 40708, + 18593, + 7169, + 2798, + 18325, + 2794, + 2274, + 27756, + 32315, + 9691, + 5022, + 198657, + 1531, + 15057, + 115592, + 4864, + 9996, + 15426, + 8712, + 7030, + 17804, + 36412, + 3894, + 841, + 7486, + 2802, + 1071, + 64550, + 24675, + 39691, + 14682, + 994, + 5246, + 2235, + 7870, + 4974, + 3680, + 57907, + 17220, + 6289, + 45116, + 7993, + 1224, + 1928, + 216564, + 6017, + 1286, + 80351, + 28005, + 37005, + 5058, + 18357, + 7736, + 4291, + 1133, + 10266, + 3939, + 1188, + 6203, + 2081, + 1215, + 15174, + 2900, + 6092, + 2345, + 3561, + 3967, + 14537, + 143031, + 2982, + 70601, + 138653, + 3730, + 22320, + 5180, + 4959, + 28517, + 24162, + 24561, + 182957, + 6227, + 2186, + 79986, + 8161, + 9843, + 55398, + 161609, + 1196, + 58779, + 26444, + 47477, + 26820, + 24694, + 3378, + 150740, + 48989, + 30520, + 2116, + 31023, + 8380, + 1845, + 40320, + 116654, + 3251, + 10282, + 20585, + 2219, + 1383, + 3880, + 7972, + 41498, + 19077, + 23012, + 25889, + 10391, + 832, + 45622, + 6155, + 1681, + 22009, + 7191, + 3200, + 4226, + 2284, + 1175, + 8051, + 1513, + 1559, + 156630, + 6060, + 1438, + 3224, + 25956, + 5577, + 4028, + 2324, + 41625, + 21262, + 840, + 5026, + 1338, + 10853, + 12864, + 76620, + 65277, + 3722, + 17038, + 43104, + 33509, + 7866, + 738, + 13943, + 4616, + 30407, + 2036, + 14611, + 75237, + 939, + 12002, + 6624, + 58901, + 23731, + 1189, + 6827, + 36432, + 3697, + 6290, + 44008, + 6776, + 2448, + 3938, + 9156, + 15758, + 19615, + 10678, + 788, + 720, + 12411, + 33761, + 57892, + 17791, + 21937, + 5116, + 49031, + 7684, + 887, + 23674, + 2480, + 6534, + 46859, + 1007, + 11443, + 3707, + 8370, + 30759, + 4629, + 3379, + 161626, + 874, + 733, + 5630, + 13520, + 6957, + 108441, + 2530, + 1557, + 12575, + 15385, + 2160, + 3382, + 11774, + 9421, + 9262, + 3924, + 974, + 32111, + 1206, + 2653, + 33953, + 2621, + 42490, + 72422, + 67797, + 245791, + 80245, + 60450, + 279102, + 231937, + 1536, + 3513, + 1075, + 3025, + 209199, + 11513, + 3571, + 27813, + 7097, + 7301, + 11440, + 3149, + 951, + 14836, + 9837, + 7824, + 190840, + 29844, + 3233, + 6511, + 8983, + 86883, + 3792, + 17678, + 629, + 10839, + 10955, + 47170, + 20794, + 28520, + 39848, + 5835, + 4441, + 2315, + 7609, + 17642, + 928, + 2134, + 7895, + 66151, + 4518, + 24193, + 17442, + 1041, + 1953, + 76362, + 20544, + 38614, + 59693, + 3947, + 5389, + 22876, + 29259, + 2468, + 43535, + 24363, + 2765, + 32858, + 44512, + 19567, + 61623, + 60962, + 33306, + 9968, + 960, + 2248, + 6566, + 7065, + 2121, + 20610, + 635, + 2558, + 2349, + 9732, + 6612, + 17886, + 189674, + 5328, + 28588, + 1533, + 30754, + 31669, + 2353, + 5632, + 1060, + 1771, + 30212, + 18842, + 1453, + 6330, + 1369, + 22078, + 4096, + 24249, + 58774, + 17390, + 2578, + 16495, + 7907, + 3738, + 1154, + 9041, + 4414, + 2013, + 2581, + 1102, + 35033, + 4539, + 16539, + 18441, + 2735, + 113495, + 25347, + 2855, + 6604, + 5569, + 4175, + 11862, + 536, + 162661, + 930, + 2090, + 8540, + 724, + 5506, + 11301, + 9949, + 55707, + 2546, + 27869, + 4653, + 1381, + 43196, + 51530, + 33773, + 4669, + 78414, + 950, + 12839, + 14717, + 17833, + 16520, + 12590, + 21300, + 14536, + 124516, + 22339, + 16681, + 163878, + 1796, + 7615, + 15399, + 1365, + 12373, + 7267, + 27176, + 4653, + 98647, + 214773, + 65836, + 2738, + 92927, + 12086, + 123892, + 55212, + 24381, + 43121, + 4790, + 9306, + 2066, + 1835, + 1421, + 49097, + 1274, + 2584, + 31069, + 10279, + 9725, + 7871, + 26408, + 14986, + 17514, + 7655, + 9702, + 163758, + 1253, + 6988, + 3802, + 20734, + 135959, + 1501, + 169002, + 610, + 96220, + 6097, + 1250, + 1684, + 48978, + 5636, + 5021, + 31430, + 17738, + 18615, + 51635, + 4277, + 50961, + 765, + 9251, + 213173, + 7342, + 2487, + 55850, + 1544, + 13437, + 1648, + 5025, + 15132, + 1694, + 946, + 11749, + 45805, + 16638, + 26962, + 4241, + 33744, + 9625, + 30105, + 13654, + 32403, + 1110, + 95973, + 7248, + 26312, + 15920, + 85843, + 3433, + 12578, + 46129, + 33099, + 6958, + 6448, + 4199, + 31440, + 3370, + 5091, + 13559, + 47201, + 21719, + 6452, + 15233, + 7078, + 3500, + 134352, + 4081, + 3121, + 692, + 21988, + 100256, + 47895, + 8226, + 53020, + 2499, + 3908, + 8718, + 674, + 1331, + 4593, + 4796, + 2431, + 150305, + 21529, + 110309, + 10011, + 15413, + 15814, + 20337, + 749, + 161248, + 1671, + 110440, + 12025, + 620, + 23161, + 42045, + 12918, + 17080, + 1424, + 21212, + 6114, + 63320, + 34046, + 36533, + 11441, + 1265, + 751, + 67147, + 8320, + 50314, + 41363, + 13760, + 61753, + 23977, + 2363, + 2703, + 4421, + 1425, + 5129, + 1509, + 661, + 3517, + 11950, + 144688, + 17713, + 4154, + 12795, + 1762, + 33996, + 3791, + 45567, + 857, + 54765, + 528, + 92847, + 43977, + 25958, + 20740, + 13195, + 1240, + 3727, + 6302, + 57392, + 8153, + 167001, + 162529, + 1318, + 24086, + 110861, + 1464, + 54403, + 6043, + 72809, + 13942, + 8126, + 14262, + 1740, + 34219, + 26792, + 16418, + 21905, + 998, + 7523, + 558, + 28941, + 5174, + 7045, + 31264, + 2217, + 14860, + 5807, + 8636, + 31169, + 9650, + 163768, + 50846, + 628, + 46023, + 14359, + 872, + 9311, + 19419, + 15927, + 4102, + 790, + 29709, + 14009, + 582, + 2073, + 17412, + 2783, + 65309, + 11243, + 1117, + 6390, + 283644, + 1691, + 6635, + 24112, + 8521, + 7067, + 3036, + 1801, + 13237, + 5604, + 1476, + 3310, + 2489, + 3632, + 7901, + 4802, + 6581, + 8993, + 28142, + 1649, + 28634, + 24657, + 40034, + 14558, + 7632, + 94890, + 54392, + 2127, + 1768, + 24563, + 1808, + 9740, + 1223, + 3188, + 3779, + 10790, + 3702, + 3560, + 11308, + 6518, + 130754, + 980, + 35831, + 17822, + 2135, + 1174, + 24521, + 4229, + 3191, + 6589, + 63330, + 8523, + 7058, + 8305, + 4555, + 29547, + 52834, + 6459, + 51251, + 2858, + 23621, + 15832, + 117570, + 140421, + 4880, + 10166, + 1981, + 3047, + 3585, + 4573, + 41097, + 7880, + 26040, + 5437, + 12705, + 824, + 2111, + 192121, + 23681, + 2277, + 9816, + 4367, + 22870, + 14862, + 4363, + 27137, + 2462, + 963, + 14823, + 6355, + 71249, + 7168, + 32007, + 9033, + 5042, + 25032, + 2899, + 13737, + 89286, + 51936, + 2277, + 71214, + 23403, + 75958, + 28959, + 7972, + 8478, + 1253, + 737, + 96655, + 430, + 18443, + 38109, + 9220, + 484524, + 17652, + 3553, + 4208, + 28721, + 945, + 37837, + 6016, + 74569, + 13251, + 932, + 14555, + 85105, + 20712, + 8154, + 2043, + 17738, + 231788, + 33690, + 19577, + 5535, + 11034, + 8082, + 12822, + 698, + 6938, + 8723, + 65730, + 42805, + 7881, + 13682, + 13006, + 178646, + 127642, + 9489, + 25382, + 32020, + 941, + 5068, + 28202, + 38303, + 14696, + 9497, + 26096, + 15681, + 968, + 14875, + 66250, + 78362, + 5697, + 1798, + 8495, + 723, + 3394, + 18560, + 761, + 1039, + 3461, + 110322, + 2679, + 777, + 10035, + 945, + 118463, + 33747, + 1989, + 4325, + 17685, + 3173, + 1633, + 2955, + 31443, + 7762, + 7455, + 7971, + 6174, + 3343, + 1014, + 6868, + 2341, + 36628, + 2655, + 3027, + 5506, + 6981, + 9409, + 125834, + 887, + 89559, + 53337, + 11992, + 4250, + 7285, + 162933, + 856, + 14746, + 4399, + 8907, + 2085, + 21470, + 17317, + 1371, + 11739, + 55149, + 947, + 128828, + 10255, + 73838, + 36071, + 17981, + 3410, + 84509, + 51658, + 21192, + 13206, + 24289, + 2233, + 33074, + 515, + 6108, + 26854, + 916, + 3172, + 2718, + 79314, + 1056, + 7953, + 1680, + 22102, + 4158, + 94438, + 992, + 138719, + 5435, + 7121, + 2903, + 26959, + 2179, + 4713, + 35792, + 3406, + 12875, + 3222, + 15033, + 137973, + 4719, + 11860, + 4256, + 197140, + 21011, + 8139, + 34232, + 4828, + 159829, + 5807, + 120436, + 102820, + 14992, + 20824, + 158216, + 1409, + 10490, + 7579, + 2599, + 127413, + 2997, + 20502, + 95101, + 1232, + 9093, + 2510, + 2608, + 25691, + 18583, + 8968, + 20400, + 11041, + 112518, + 2741, + 3974, + 7367, + 8252, + 3310, + 6161, + 5669, + 123022, + 2131, + 3448, + 28354, + 7397, + 665, + 11084, + 3600, + 5899, + 156784, + 2749, + 9121, + 1204, + 1481, + 5733, + 8786, + 22749, + 2395, + 4553, + 12803, + 23485, + 12261, + 1609, + 5861, + 3448, + 7961, + 3854, + 49310, + 2166, + 14262, + 168750, + 43150, + 92342, + 21572, + 60476, + 66081, + 49968, + 27183, + 3863, + 7647, + 1469, + 61472, + 5349, + 16368, + 4008, + 166628, + 988, + 287224, + 70726, + 1978, + 30021, + 29640, + 7323, + 186886, + 28542, + 5945, + 36751, + 180563, + 20070, + 3440, + 26504, + 8692, + 907, + 44876, + 8169, + 944, + 29647, + 190766, + 16550, + 208670, + 411980, + 633, + 6086, + 10096, + 41387, + 28406, + 21421, + 1732, + 3376, + 745, + 4510, + 17013, + 9805, + 13264, + 43432, + 11952, + 58241, + 17162, + 602, + 30461, + 8071, + 238948, + 1278, + 124235, + 3252, + 51185, + 4210, + 1516, + 109421, + 69764, + 58012, + 12192, + 2777, + 3071, + 1297, + 18038, + 4338, + 19569, + 9952, + 8689, + 171892, + 101251, + 18953, + 9103, + 14618, + 55855, + 123185, + 23160, + 1075, + 82253, + 1321, + 14697, + 6440, + 886, + 9294, + 22234, + 109577, + 14811, + 7802, + 214943, + 14379, + 56123, + 21417, + 2109, + 15149, + 14235, + 834, + 13357, + 152833, + 53580, + 9449, + 41219, + 30182, + 14941, + 415, + 101958, + 35320, + 46706, + 24510, + 20722, + 47795, + 2911, + 8698, + 10046, + 202268, + 11382, + 66887, + 129995, + 11649, + 4914, + 2978, + 9052, + 252093, + 21715, + 5401, + 29763, + 5131, + 7877, + 33727, + 200297, + 100529, + 1256, + 1026, + 7429, + 714, + 21034, + 102939, + 34677, + 31870, + 23964, + 2579, + 3512, + 174543, + 2924, + 19618, + 1615, + 5990, + 77111, + 132757, + 10676, + 50536, + 18698, + 35825, + 593, + 15185, + 114653, + 10528, + 51800, + 6730, + 6269, + 67910, + 5782, + 3218, + 49678, + 48553, + 987, + 15041, + 4966, + 199414, + 3831, + 6025, + 3425, + 18693, + 1482, + 7721, + 20487, + 20757, + 41355, + 19421, + 10511, + 26828, + 12618, + 2478, + 30099, + 12968, + 8764, + 13082, + 9835, + 26838, + 2555, + 52560, + 3938, + 3888, + 29880, + 12431, + 6825, + 71212, + 4963, + 2591, + 9053, + 3123, + 3679, + 14243, + 3133, + 2844, + 15784, + 1519, + 620, + 43747, + 24986, + 1287, + 192360, + 24584, + 90415, + 1333, + 2047, + 8043, + 15375, + 31194, + 192371, + 37857, + 24863, + 7154, + 4277, + 64568, + 88418, + 3193, + 18792, + 1221, + 25620, + 4157, + 3312, + 9790, + 2106, + 440, + 25592, + 28669, + 16555, + 11202, + 1031, + 451, + 1069, + 48933, + 4142, + 3089, + 51651, + 702, + 5836, + 79579, + 11549, + 26699, + 1428, + 10961, + 9945, + 2297, + 49999, + 21630, + 12972, + 3928, + 6801, + 22736, + 10409, + 1020, + 12062, + 43901, + 5451, + 5069, + 33763, + 25032, + 9026, + 5766, + 3914, + 5713, + 4478, + 118252, + 2927, + 32791, + 82951, + 4595, + 250491, + 48894, + 77358, + 4699, + 3342, + 6683, + 948, + 20151, + 17636, + 59805, + 42847, + 13359, + 4056, + 19728, + 21211, + 12156, + 3853, + 3176, + 2145, + 37117, + 2496, + 9489, + 1082, + 29230, + 3485, + 3664, + 4509, + 4645, + 1402, + 8294, + 169792, + 643, + 10387, + 60367, + 97064, + 3570, + 7514, + 32137, + 30282, + 6633, + 67683, + 16413, + 8042, + 4124, + 32086, + 47122, + 4043, + 14897, + 61575, + 92700, + 9347, + 7900, + 36874, + 11040, + 1660, + 155708, + 8089, + 24131, + 106715, + 10773, + 11060, + 97699, + 189553, + 7281, + 9488, + 14170, + 8693, + 9810, + 5529, + 936, + 5477, + 724, + 4001, + 1292, + 6660, + 1673, + 8015, + 40965, + 18094, + 5516, + 37059, + 1081, + 69531, + 17966, + 5734, + 503, + 59062, + 5036, + 15111, + 784, + 114738, + 55426, + 696, + 10919, + 69811, + 16116, + 14475, + 1829, + 1384, + 2261, + 36494, + 1670, + 5379, + 6949, + 4546, + 12611, + 2442, + 74918, + 20164, + 56660, + 985, + 72721, + 8132, + 40925, + 6013, + 5542, + 18123, + 162852, + 67397, + 2401, + 2219, + 114674, + 14710, + 4362, + 7902, + 20406, + 57812, + 917, + 3890, + 801, + 33020, + 116115, + 11345, + 159961, + 44698, + 20783, + 2387, + 9841, + 51376, + 75398, + 16228, + 1031, + 14606, + 13709, + 159258, + 40076, + 5996, + 2111, + 88333, + 6939, + 29440, + 20447, + 9337, + 46732, + 24154, + 6642, + 201479, + 1939, + 717, + 3191, + 65599, + 25554, + 2042, + 34170, + 779, + 17383, + 5697, + 59202, + 1826, + 4418, + 52031, + 6792, + 24155, + 6217, + 125606, + 3334, + 538, + 4221, + 921, + 27373, + 1188, + 7919, + 64800, + 47483, + 25153, + 5509, + 20587, + 671, + 2659, + 11709, + 5481, + 34105, + 9316, + 2170, + 25824, + 11906, + 60378, + 4495, + 10549, + 8856, + 747, + 35369, + 6793, + 837, + 3348, + 172974, + 12293, + 2634, + 12126, + 13389, + 2450, + 7193, + 6099, + 13115, + 1064, + 7614, + 251030, + 41997, + 115404, + 18878, + 141817, + 7655, + 17008, + 66809, + 19756, + 48644, + 15074, + 1109, + 133831, + 55302, + 25071, + 260541, + 2526, + 34555, + 33514, + 21565, + 27473, + 2155, + 4309, + 26469, + 191273, + 28569, + 7249, + 18383, + 24391, + 18192, + 30916, + 11422, + 22971, + 5332, + 52834, + 36251, + 166609, + 25714, + 2180, + 19100, + 4155, + 283181, + 5538, + 114217, + 56992, + 18820, + 18975, + 1749, + 53432, + 35475, + 5047, + 220082, + 115573, + 4986, + 807, + 14593, + 47125, + 15753, + 130834, + 33092, + 79857, + 64977, + 42476, + 5219, + 1883, + 5304, + 674, + 1045, + 6568, + 35669, + 11956, + 112673, + 531, + 15501, + 4968, + 12235, + 62118, + 29373, + 30292, + 43009, + 20886, + 829, + 872, + 5221, + 1049, + 627, + 10476, + 1434, + 1143, + 42128, + 919, + 6017, + 17701, + 31853, + 12265, + 7303, + 9491, + 36621, + 17671, + 29749, + 3048, + 78055, + 6337, + 1889, + 41458, + 959, + 5684, + 1556, + 6040, + 54635, + 13744, + 3799, + 16509, + 39109, + 32785, + 4038, + 31911, + 9242, + 17639, + 140168, + 53131, + 6867, + 15007, + 3580, + 3457, + 153585, + 8061, + 1103, + 145797, + 3715, + 1937, + 40045, + 30595, + 701, + 1499, + 22602, + 988, + 7662, + 5099, + 12136, + 34347, + 4878, + 5408, + 67297, + 5359, + 6217, + 936, + 163996, + 7155, + 1395, + 31870, + 1014, + 38339, + 741, + 10920, + 25515, + 2107, + 2982, + 23505, + 70379, + 39659, + 42085, + 209156, + 24538, + 13421, + 11936, + 972, + 2277, + 3886, + 16120, + 89422, + 27005, + 11022, + 22085, + 37168, + 16280, + 14840, + 1440, + 67262, + 25866, + 3158, + 124793, + 5375, + 15435, + 10869, + 4554, + 7998, + 6565, + 7365, + 17973, + 1620, + 22344, + 6191, + 27839, + 1264, + 11608, + 30912, + 3323, + 5961, + 9929, + 14284, + 23299, + 13627, + 13861, + 67780, + 9089, + 6786, + 2526, + 2040, + 7305, + 172037, + 24274, + 23742, + 6707, + 44374, + 172966, + 77377, + 6652, + 8693, + 132752, + 8438, + 25423, + 9845, + 140151, + 495, + 4616, + 18739, + 2800, + 19823, + 23021, + 44757, + 1080, + 2488, + 6678, + 9953, + 2115, + 82642, + 1606, + 2619, + 36302, + 29892, + 185319, + 6446, + 2875, + 18525, + 17152, + 1298, + 4223, + 23812, + 5295 + ] + }, + { + "counters": [ + 21242, + 1651, + 3222, + 1676, + 8610, + 7676, + 5906, + 2330, + 1866, + 9180, + 11327, + 24698, + 11312, + 3970, + 20628, + 7347, + 1599, + 17084, + 59309, + 2651, + 22089, + 2845, + 5520, + 8681, + 1423, + 12950, + 23560, + 36725, + 8536, + 16960, + 105613, + 142042, + 11131, + 3601, + 1188, + 56912, + 11167, + 12000, + 74012, + 48195, + 51074, + 67463, + 2177, + 8450, + 2796, + 5808, + 18557, + 7007, + 188997, + 21321, + 8513, + 10382, + 8063, + 66603, + 7236, + 79903, + 18701, + 2943, + 97364, + 62724, + 24622, + 9361, + 119258, + 3644, + 3371, + 24524, + 21905, + 7890, + 3004, + 16693, + 33173, + 2550, + 22397, + 15003, + 1436, + 5616, + 1357, + 6876, + 4459, + 9867, + 70240, + 1213, + 82157, + 58952, + 41878, + 15999, + 15836, + 3093, + 54141, + 30753, + 51153, + 3392, + 9533, + 7549, + 27724, + 33719, + 11292, + 809, + 37072, + 62374, + 14330, + 6659, + 1942, + 24744, + 26104, + 23223, + 39200, + 1527, + 2931, + 81425, + 59040, + 7803, + 18844, + 3357, + 15084, + 38562, + 14954, + 33930, + 28024, + 33269, + 6971, + 17560, + 1257, + 196778, + 16629, + 187606, + 10237, + 15567, + 24026, + 1962, + 2869, + 7522, + 1126, + 71129, + 181073, + 2726, + 113220, + 5516, + 5483, + 43142, + 9063, + 85511, + 2256, + 265708, + 6310, + 1737, + 15756, + 197889, + 92714, + 21614, + 13579, + 12803, + 4081, + 825, + 29347, + 92582, + 660, + 467, + 121160, + 1023, + 86236, + 1150, + 4951, + 68158, + 8028, + 2530, + 8040, + 14744, + 11293, + 4787, + 1121, + 30378, + 3495, + 3699, + 2229, + 123594, + 1873, + 2976, + 11433, + 77438, + 70815, + 2982, + 11057, + 3038, + 4152, + 3262, + 872, + 10078, + 69395, + 15444, + 2805, + 107586, + 12996, + 4548, + 6329, + 33381, + 10412, + 18782, + 1660, + 33162, + 4004, + 15826, + 1074, + 2156, + 9245, + 7789, + 2768, + 3207, + 57390, + 21604, + 1578, + 4855, + 5533, + 825, + 2313, + 158401, + 68995, + 876, + 104480, + 4148, + 589, + 5820, + 20139, + 28638, + 5543, + 95026, + 37079, + 2381, + 116081, + 81548, + 4880, + 19512, + 2488, + 11921, + 1517, + 20273, + 1567, + 28980, + 41667, + 23749, + 34508, + 161703, + 27958, + 18109, + 1774, + 8993, + 1460, + 47055, + 1292, + 3222, + 31206, + 60205, + 34647, + 78839, + 32608, + 4359, + 2555, + 102234, + 135359, + 2090, + 736, + 5407, + 634, + 20916, + 70323, + 29295, + 7935, + 40991, + 2560, + 46630, + 60697, + 14836, + 12234, + 82409, + 20167, + 5005, + 2518, + 4006, + 4381, + 19385, + 12891, + 6597, + 15563, + 613, + 29472, + 11889, + 2351, + 1736, + 156091, + 78145, + 5298, + 13681, + 2183, + 12043, + 2633, + 18355, + 101094, + 22759, + 4162, + 21386, + 2504, + 75251, + 1623, + 18509, + 14558, + 20850, + 7271, + 2551, + 2173, + 6530, + 6430, + 1182, + 2531, + 5504, + 11664, + 10554, + 4134, + 4749, + 9173, + 38034, + 88086, + 45910, + 2005, + 79758, + 5618, + 241087, + 7840, + 917, + 1030, + 54383, + 13673, + 58804, + 27226, + 8466, + 17526, + 41295, + 2975, + 5496, + 23883, + 13964, + 10382, + 874, + 14054, + 57224, + 1426, + 8149, + 2073, + 168043, + 2768, + 17011, + 2673, + 57389, + 1632, + 4555, + 31255, + 123888, + 12966, + 1941, + 38325, + 24034, + 3364, + 3930, + 83451, + 1702, + 107783, + 3813, + 5580, + 5500, + 2411, + 62057, + 19931, + 4845, + 7572, + 1020, + 136260, + 2104, + 3046, + 2404, + 659, + 13982, + 10618, + 28264, + 4358, + 4421, + 3857, + 3824, + 13396, + 60593, + 10357, + 2930, + 963, + 2357, + 3614, + 88087, + 22653, + 46761, + 181460, + 3954, + 12362, + 91217, + 18546, + 259523, + 20105, + 19698, + 9439, + 1241, + 45869, + 4975, + 29073, + 11712, + 9500, + 8111, + 11248, + 6696, + 46179, + 20856, + 10709, + 29591, + 18104, + 11681, + 1679, + 7998, + 7658, + 120727, + 15209, + 67089, + 4085, + 162490, + 1828, + 18056, + 3838, + 12483, + 19941, + 29225, + 27318, + 6305, + 13179, + 13719, + 42234, + 166887, + 58459, + 5848, + 2580, + 15325, + 27241, + 11141, + 10679, + 2968, + 37561, + 802, + 24897, + 11009, + 8800, + 35629, + 9022, + 34751, + 32545, + 7900, + 6259, + 35820, + 8279, + 1715, + 32534, + 698, + 920, + 1366, + 11143, + 39157, + 28948, + 211137, + 12003, + 13289, + 19566, + 5790, + 826, + 3124, + 6839, + 37689, + 4655, + 90207, + 1297, + 872, + 20749, + 2148, + 13210, + 40989, + 508, + 170566, + 212223, + 3881, + 1562, + 22030, + 115825, + 4517, + 1769, + 38853, + 3018, + 491, + 47653, + 1223, + 140049, + 7127, + 11403, + 39425, + 47286, + 23068, + 78497, + 742, + 1387, + 30088, + 1205, + 2269, + 2150, + 120780, + 62156, + 157553, + 7134, + 10909, + 10108, + 13457, + 14664, + 7957, + 11182, + 3174, + 46946, + 33206, + 5809, + 8370, + 912, + 6921, + 1390, + 4245, + 6159, + 187331, + 6349, + 5423, + 13938, + 14063, + 1300, + 3509, + 11105, + 48492, + 30337, + 902, + 55152, + 67306, + 3445, + 6894, + 934, + 1152, + 6605, + 3435, + 9096, + 1375, + 85173, + 6889, + 50912, + 84883, + 4201, + 20623, + 9030, + 7242, + 758, + 23656, + 330137, + 3922, + 3336, + 776, + 21096, + 8248, + 5993, + 6753, + 1068, + 35224, + 19595, + 138201, + 119043, + 1344, + 4246, + 78450, + 4435, + 29739, + 2593, + 47589, + 50665, + 5482, + 63205, + 3452, + 17085, + 10017, + 183399, + 22358, + 26194, + 1203, + 20325, + 5088, + 51844, + 11629, + 7839, + 13521, + 95988, + 11837, + 36533, + 100311, + 5606, + 102615, + 16871, + 15905, + 98250, + 7168, + 5567, + 2838, + 21521, + 2777, + 4665, + 1283, + 1176, + 9871, + 4238, + 76151, + 218595, + 21774, + 54816, + 65622, + 7433, + 44964, + 11307, + 3225, + 10649, + 34730, + 20843, + 2944, + 11042, + 25883, + 777, + 35264, + 20496, + 8743, + 1596, + 38279, + 2132, + 8651, + 27164, + 98922, + 1382, + 24214, + 218532, + 4810, + 1107, + 609, + 6091, + 3269, + 20789, + 23178, + 919, + 57764, + 5355, + 78919, + 34321, + 2950, + 13960, + 66782, + 5212, + 11825, + 8128, + 134801, + 14752, + 11471, + 7148, + 6636, + 6608, + 16802, + 10000, + 34267, + 13965, + 11857, + 2399, + 3968, + 2413, + 11804, + 15870, + 116648, + 1268, + 3859, + 4136, + 540, + 16647, + 374323, + 1373, + 4134, + 22828, + 58234, + 6242, + 40058, + 15519, + 51495, + 6777, + 6365, + 2145, + 1962, + 34150, + 31297, + 2255, + 6962, + 1719, + 233940, + 603, + 20506, + 10364, + 722, + 8940, + 20418, + 47802, + 4160, + 25205, + 17523, + 5000, + 10388, + 1490, + 4031, + 35408, + 37510, + 3567, + 21020, + 40085, + 27559, + 10230, + 1058, + 37383, + 3723, + 9684, + 2424, + 4439, + 7811, + 2116, + 76081, + 3054, + 52287, + 17457, + 42083, + 4451, + 26516, + 29039, + 88418, + 11708, + 82148, + 26244, + 458, + 5534, + 5520, + 25968, + 11388, + 305012, + 9465, + 52056, + 49487, + 4235, + 107847, + 59957, + 8039, + 742, + 6929, + 1215, + 8989, + 1533, + 1915, + 5866, + 11411, + 15579, + 2360, + 59472, + 27840, + 40893, + 208416, + 42679, + 1165, + 26087, + 34565, + 8588, + 7655, + 2494, + 20300, + 192064, + 4033, + 36259, + 15141, + 13833, + 2070, + 982, + 77892, + 1883, + 23844, + 16504, + 5837, + 32093, + 80330, + 7985, + 9179, + 5955, + 10463, + 741, + 4136, + 100828, + 13199, + 1326, + 1274, + 92470, + 4531, + 38795, + 589, + 55510, + 14969, + 27081, + 2475, + 28907, + 274424, + 12279, + 37842, + 29046, + 12203, + 3142, + 24728, + 26229, + 136494, + 12239, + 9211, + 2933, + 20871, + 54948, + 6197, + 9640, + 127274, + 4376, + 14448, + 1604, + 115618, + 4004, + 10763, + 1653, + 121582, + 163769, + 24950, + 74835, + 697, + 22595, + 9953, + 11394, + 20310, + 9545, + 525, + 733, + 3952, + 9192, + 11588, + 3486, + 3620, + 8688, + 28264, + 110767, + 8949, + 4554, + 49607, + 66873, + 84264, + 77742, + 14020, + 4521, + 1032, + 1132, + 42058, + 1225, + 26799, + 104551, + 24625, + 5814, + 60052, + 29214, + 6491, + 9066, + 1576, + 8276, + 2174, + 2551, + 3451, + 2213, + 7635, + 9065, + 6280, + 5431, + 1121, + 64270, + 8300, + 15961, + 65724, + 17943, + 1719, + 5229, + 1097, + 9084, + 11042, + 14795, + 63419, + 3275, + 1671, + 53371, + 22791, + 10206, + 16175, + 197261, + 29981, + 43957, + 7516, + 4177, + 2409, + 58681, + 3597, + 25308, + 3506, + 27697, + 1433, + 2996, + 4275, + 3607, + 3124, + 6129, + 22345, + 50042, + 8649, + 2450, + 29792, + 161882, + 6623, + 1232, + 6420, + 7585, + 25332, + 56920, + 5606, + 6441, + 174976, + 3127, + 4560, + 1476, + 337, + 7159, + 262781, + 871, + 10923, + 473, + 178169, + 65611, + 12401, + 3934, + 22271, + 36607, + 3018, + 26077, + 46855, + 1518, + 27011, + 1458, + 3753, + 9015, + 3297, + 1040, + 6467, + 37697, + 757, + 29312, + 7210, + 3623, + 19745, + 3269, + 4084, + 17114, + 556, + 36217, + 462, + 137117, + 1236, + 1127, + 11849, + 951, + 1073, + 61855, + 7114, + 7727, + 12546, + 4281, + 47727, + 4934, + 4548, + 9278, + 33311, + 4183, + 19927, + 11211, + 3184, + 10019, + 13437, + 8612, + 71793, + 9310, + 35545, + 2407, + 56910, + 3192, + 5238, + 163161, + 69620, + 1702, + 5366, + 31847, + 23831, + 22702, + 6175, + 7166, + 4559, + 2683, + 8660, + 1396, + 23234, + 4184, + 2625, + 5018, + 2791, + 3464, + 5319, + 6094, + 1107, + 16154, + 15314, + 1891, + 217556, + 37623, + 161646, + 114046, + 3641, + 4034, + 14950, + 23829, + 147423, + 2352, + 1053, + 12090, + 291052, + 6695, + 1298, + 23291, + 22791, + 8947, + 5084, + 2236, + 74699, + 18998, + 8027, + 5438, + 1216, + 2362, + 6498, + 2124, + 9755, + 5566, + 41637, + 20334, + 39778, + 4609, + 532, + 9582, + 8608, + 1506, + 3275, + 6986, + 5820, + 89043, + 75455, + 4135, + 2239, + 11970, + 1051, + 936, + 11523, + 1386, + 158933, + 15436, + 31356, + 12438, + 3213, + 113657, + 16146, + 66495, + 11104, + 5466, + 29417, + 1590, + 2827, + 8951, + 4593, + 95164, + 25125, + 26913, + 15181, + 14260, + 1366, + 69389, + 41626, + 33326, + 5553, + 8741, + 48756, + 11842, + 10488, + 8004, + 12168, + 144219, + 80973, + 4396, + 3038, + 22073, + 3991, + 14325, + 2196, + 13189, + 56353, + 23390, + 48942, + 783, + 29107, + 22455, + 271933, + 676, + 22206, + 108110, + 1087, + 1066, + 69117, + 1196, + 6002, + 6570, + 1034, + 58700, + 552, + 67021, + 929, + 8908, + 5525, + 1198, + 10697, + 45102, + 5398, + 307643, + 21152, + 26862, + 3907, + 1883, + 5461, + 4684, + 5313, + 241583, + 5435, + 14295, + 10535, + 24235, + 38736, + 77900, + 6497, + 26371, + 5703, + 2337, + 40293, + 3736, + 1153, + 1709, + 3974, + 5919, + 25015, + 48634, + 13387, + 37977, + 46857, + 43125, + 7239, + 3139, + 19427, + 5780, + 8659, + 102544, + 15304, + 4585, + 6275, + 4309, + 12024, + 11891, + 24263, + 27718, + 28151, + 1171, + 4947, + 6256, + 1398, + 1427, + 3101, + 15402, + 4420, + 49800, + 99844, + 180074, + 11543, + 58344, + 2307, + 4850, + 11262, + 3556, + 8735, + 5375, + 88712, + 12584, + 2374, + 4230, + 31618, + 15366, + 9592, + 2023, + 5168, + 16302, + 12047, + 1329, + 840, + 55994, + 3154, + 9902, + 166468, + 8069, + 1988, + 11457, + 4017, + 2885, + 17247, + 9067, + 15058, + 4558, + 19948, + 2497, + 10178, + 13720, + 98997, + 7154, + 12895, + 1207, + 753, + 56850, + 1038, + 27720, + 6329, + 82889, + 146202, + 4059, + 21400, + 804, + 37033, + 22855, + 22302, + 7043, + 18039, + 22574, + 2070, + 16763, + 1295, + 109268, + 4744, + 1049, + 7809, + 27224, + 3301, + 7353, + 2340, + 3766, + 8360, + 16476, + 1029, + 862, + 89312, + 3650, + 1155, + 4862, + 5807, + 8078, + 80704, + 15698, + 8845, + 63364, + 1360, + 8598, + 2738, + 5862, + 1036, + 21347, + 546, + 76811, + 7371, + 16355, + 35620, + 24225, + 14624, + 36183, + 87137, + 2683, + 1104, + 3697, + 2579, + 982, + 6279, + 9529, + 1850, + 21049, + 180551, + 736, + 459, + 121130, + 7052, + 13257, + 35333, + 30155, + 47575, + 13683, + 12604, + 11195, + 3669, + 19985, + 8430, + 7914, + 46823, + 8035, + 1835, + 9370, + 44099, + 8890, + 4865, + 1034, + 14401, + 6838, + 4208, + 29669, + 7391, + 10912, + 32878, + 4044, + 7755, + 9071, + 2195, + 22897, + 5582, + 9053, + 28534, + 4729, + 0, + 1299, + 2113, + 88126, + 5264, + 30298, + 13074, + 3519, + 16087, + 22988, + 3920, + 6284, + 3399, + 130834, + 34554, + 3166, + 3672, + 953, + 3873, + 2124, + 4087, + 955, + 2783, + 12154, + 47958, + 5246, + 117837, + 4527, + 939, + 47665, + 3683, + 2419, + 9543, + 10893, + 10713, + 1292, + 1040, + 5613, + 6188, + 4698, + 156420, + 7252, + 1263, + 97326, + 5057, + 7610, + 54183, + 6657, + 4487, + 3363, + 5361, + 10311, + 1478, + 7226, + 1564, + 34054, + 19421, + 50170, + 4855, + 43259, + 58744, + 9918, + 7764, + 1531, + 6347, + 923, + 132872, + 88272, + 267517, + 7003, + 9878, + 11538, + 3121, + 210166, + 28472, + 10435, + 10602, + 12871, + 3936, + 53120, + 114068, + 28851, + 94878, + 1326, + 2301, + 156374, + 2892, + 13155, + 9902, + 58538, + 8669, + 3720, + 9813, + 2184, + 7755, + 155129, + 2198, + 1504, + 64152, + 6030, + 28121, + 2087, + 3482, + 681, + 18925, + 4966, + 220696, + 33588, + 2395, + 7023, + 12557, + 5939, + 1974, + 9921, + 7404, + 435694, + 5276, + 1277, + 1099, + 1010, + 1643, + 58704, + 7823, + 9419, + 12610, + 17644, + 1250, + 93607, + 10608, + 736, + 104371, + 23859, + 22506, + 12116, + 16909, + 31282, + 9582, + 7780, + 4698, + 42875, + 13508, + 3797, + 6382, + 3802, + 6114, + 879, + 717, + 175205, + 48554, + 3093, + 937, + 8650, + 1596, + 31254, + 45403, + 226836, + 44782, + 19879, + 2092, + 10929, + 38189, + 5174, + 7853, + 17266, + 15932, + 30631, + 19963, + 2146, + 1514, + 1134, + 2521, + 3961, + 7602, + 20471, + 79544, + 40141, + 8497, + 1110, + 698, + 43880, + 34060, + 796, + 1441, + 2452, + 8660, + 14544, + 2679, + 837, + 4532, + 26926, + 174109, + 4560, + 44605, + 11982, + 6280, + 3036, + 31098, + 36629, + 2571, + 3714, + 19025, + 13474, + 11980, + 12246, + 408, + 1781, + 44419, + 186210, + 6984, + 10886, + 62146, + 323053, + 76326, + 3846, + 1708, + 6475, + 646, + 2871, + 169372, + 4357, + 1859, + 3272, + 164023, + 2781, + 13030, + 44668, + 2691, + 2241, + 8335, + 6193, + 1590, + 4915, + 10014, + 21399, + 5498, + 162658, + 115509, + 31572, + 3368, + 1695, + 8490, + 2057, + 14661, + 6144, + 9381, + 35533, + 81441, + 66914, + 6572, + 5609, + 6544, + 4626, + 2944, + 7877, + 28769, + 3454, + 7030, + 146822, + 2983, + 6846, + 178121, + 170350, + 3131, + 97051, + 155787, + 10569, + 19240, + 453, + 10524, + 999, + 17231, + 17571, + 8778, + 2425, + 56195, + 70253, + 8060, + 1950, + 3011, + 1557, + 41726, + 944, + 26975, + 549, + 4111, + 7313, + 15973, + 22419, + 33648, + 11055, + 4795, + 38210, + 11867, + 15122, + 15036, + 87803, + 13165, + 103038, + 4208, + 1514, + 92018, + 1748, + 2760, + 149761, + 899, + 15229, + 55703, + 8265, + 15314, + 9766, + 37139, + 205254, + 16980, + 36446, + 17179, + 1317, + 45216, + 5238, + 22800, + 5220, + 19231, + 1222, + 11420, + 4430, + 5077, + 4006, + 14401, + 26497, + 876, + 17436, + 2669, + 9709, + 47629, + 36689, + 7116, + 2720, + 1457, + 9889, + 13795, + 28662, + 174987, + 1548, + 3541, + 36841, + 24716, + 1712, + 38596, + 22847, + 20051, + 12317, + 3406, + 21098, + 157128, + 1283, + 8949, + 26281, + 79940, + 2915, + 11188, + 791, + 5494, + 22164, + 5326, + 68119, + 14526, + 7888, + 8721, + 1826, + 29550, + 4830, + 114219, + 2677, + 1119, + 10247, + 23934, + 1272, + 47034, + 3467, + 2039, + 2014, + 695, + 150213, + 11739, + 2298, + 8271, + 18517, + 57402, + 13556, + 1936, + 38584, + 44901, + 7777, + 58505, + 90183, + 37617, + 35276, + 1359, + 160734, + 11185, + 5511, + 14224, + 33448, + 3843, + 2840, + 41425, + 22108, + 9856, + 381151, + 33288, + 15539, + 47886, + 10406, + 4153, + 7296, + 26602, + 1318, + 1918, + 15187, + 3797, + 4056, + 5710, + 11425, + 81295, + 11092, + 6574, + 3456, + 4340, + 1473, + 10430, + 8127, + 43435, + 27931, + 18629, + 1171, + 7385, + 255668, + 11752, + 1460, + 5396, + 4732, + 74511, + 1175, + 5793, + 5858, + 54185, + 2540, + 1362, + 3591, + 13827, + 4520, + 176324, + 6089, + 11965, + 5504, + 6450, + 9141, + 5576, + 1051, + 21441, + 6790, + 1559, + 6439, + 80308, + 8173, + 25597, + 24861, + 8336, + 985, + 878, + 178395, + 12886, + 17406, + 22897, + 14517, + 4011, + 5352, + 1871, + 42528, + 9412, + 4844, + 164905, + 11224, + 51570, + 4203, + 9732, + 13905, + 6248, + 52108, + 46208, + 105915, + 19859, + 7277, + 1660, + 6445, + 2932, + 38796, + 9556, + 3211, + 11579, + 19840, + 84057, + 68335, + 11737, + 66139, + 3731, + 12588, + 18375, + 8612, + 14670, + 9108, + 84822, + 5620, + 1089, + 7817, + 326961, + 179409, + 9221, + 2996, + 35226, + 16778, + 721, + 3149, + 167976, + 5639, + 33802, + 12777, + 58944, + 9295, + 9087, + 3862, + 164520, + 38182, + 8420, + 7461, + 16499, + 6628, + 276710, + 7483, + 177590, + 61125, + 5015, + 18776, + 29908, + 61171, + 23688, + 29051, + 12766, + 1333, + 16582, + 1241, + 1310, + 3665, + 106270, + 69399, + 5253, + 26730, + 18376, + 149973, + 41949, + 1448, + 6039, + 3791, + 40926, + 6672, + 5438, + 6994, + 33677, + 1175, + 6058, + 32126, + 830, + 7736, + 8454, + 74177, + 16229, + 52632, + 5706, + 24086, + 1788, + 4734, + 7084, + 1895, + 16427, + 1420, + 29952, + 1447, + 4487, + 56156, + 9859, + 15043, + 47819, + 43742, + 110147, + 4749, + 167359, + 28607, + 155888, + 24324, + 37369, + 6387, + 8161, + 76256, + 232319, + 2133, + 40603, + 10858, + 4202, + 940, + 9315, + 4135, + 37912, + 32115, + 14551, + 6459, + 15409, + 37292, + 984, + 6362, + 1838, + 4819, + 1746, + 2530, + 77388, + 46149, + 41954, + 24302, + 50728, + 56967, + 899, + 202301, + 5243, + 144841, + 9324, + 3159, + 59327, + 4271, + 1175, + 6826, + 1023, + 3845, + 16941, + 991, + 3728, + 13639, + 5664, + 30922, + 2982, + 7005, + 2741, + 38188, + 17884, + 5413, + 6346, + 6256, + 2127, + 1076, + 14361, + 192266, + 283226, + 2980, + 612, + 3584, + 1729, + 1542, + 4743, + 68549, + 4192, + 4318, + 36175, + 10274, + 32521, + 2088, + 4713, + 23963, + 49149, + 12251, + 2471, + 6026, + 1290, + 6440, + 22782, + 45448, + 10629, + 12443, + 60596, + 2123, + 7791, + 8975, + 8502, + 209755, + 5937, + 1165, + 219612 + ] + }, + { + "counters": [ + 2595, + 1363, + 3062, + 102227, + 4918, + 4503, + 37025, + 37203, + 3833, + 3133, + 1885, + 43257, + 8977, + 23212, + 6516, + 5020, + 1894, + 219574, + 28583, + 8677, + 21609, + 35521, + 11297, + 22754, + 17257, + 2630, + 6529, + 3970, + 36794, + 19734, + 30036, + 4226, + 64257, + 7158, + 51120, + 71197, + 4865, + 1342, + 10758, + 11695, + 7422, + 74089, + 2690, + 15806, + 21573, + 4027, + 15721, + 4248, + 3694, + 6027, + 10672, + 486, + 1676, + 199274, + 19688, + 4658, + 77489, + 21836, + 96706, + 85318, + 14080, + 1595, + 12761, + 4701, + 3526, + 15762, + 31397, + 3711, + 7681, + 7915, + 41995, + 56727, + 15684, + 2824, + 5410, + 20031, + 58748, + 265374, + 1896, + 360873, + 1104, + 4217, + 343337, + 6448, + 1527, + 608, + 5641, + 21537, + 8546, + 7459, + 157715, + 1427, + 17594, + 32607, + 46414, + 1127, + 19770, + 1270, + 1074, + 16997, + 163917, + 2426, + 48883, + 1576, + 5563, + 99824, + 1224, + 1309, + 13159, + 8227, + 6186, + 4405, + 25089, + 25627, + 3767, + 87716, + 6638, + 105493, + 15449, + 7875, + 3677, + 28153, + 1341, + 25869, + 4999, + 19592, + 713, + 101725, + 1221, + 6516, + 11721, + 1788, + 1252, + 4930, + 4134, + 7186, + 27161, + 1652, + 172894, + 3900, + 7093, + 1540, + 43709, + 114745, + 9060, + 140190, + 3689, + 12680, + 81065, + 60350, + 1671, + 5490, + 20344, + 5539, + 12393, + 211520, + 6094, + 42061, + 11414, + 6371, + 11415, + 2159, + 4116, + 50842, + 2477, + 6248, + 16614, + 88196, + 10605, + 50542, + 119152, + 6037, + 2111, + 85344, + 6883, + 7170, + 11713, + 45091, + 3552, + 17592, + 9023, + 817, + 45681, + 18289, + 6630, + 10980, + 1658, + 25090, + 2458, + 1852, + 108101, + 856, + 9427, + 2258, + 112959, + 14348, + 3404, + 1896, + 5493, + 7475, + 3145, + 18869, + 6704, + 27277, + 9556, + 91347, + 10670, + 1849, + 2987, + 827, + 2822, + 84197, + 11015, + 34582, + 4092, + 3226, + 36275, + 13494, + 10633, + 12224, + 1016, + 11929, + 1508, + 6216, + 5703, + 5780, + 38288, + 4387, + 2426, + 4060, + 3617, + 37834, + 189300, + 28074, + 183951, + 121452, + 2204, + 3063, + 9587, + 10716, + 6203, + 3020, + 26513, + 76648, + 4287, + 60743, + 34865, + 25116, + 905, + 21161, + 13060, + 23197, + 394, + 59004, + 4333, + 25387, + 74046, + 78148, + 7568, + 11949, + 2676, + 12635, + 58724, + 29803, + 14841, + 68901, + 2299, + 4275, + 7652, + 13039, + 14810, + 2827, + 2859, + 5510, + 12318, + 59580, + 7761, + 38254, + 2684, + 5445, + 19835, + 3824, + 11276, + 16883, + 4414, + 8770, + 5741, + 36057, + 3300, + 4107, + 7503, + 4660, + 38735, + 3612, + 40602, + 6739, + 17478, + 1732, + 57920, + 8610, + 191291, + 9384, + 33186, + 6350, + 6806, + 4413, + 13135, + 3827, + 6288, + 24266, + 58486, + 1466, + 17837, + 271241, + 10195, + 4817, + 44643, + 10505, + 1910, + 6258, + 4277, + 29740, + 191163, + 19667, + 5193, + 81565, + 13010, + 3668, + 874, + 0, + 28312, + 49695, + 27019, + 34981, + 17649, + 47910, + 4068, + 63901, + 1207, + 2766, + 161487, + 163845, + 1397, + 3648, + 6150, + 7254, + 21165, + 45606, + 49616, + 2992, + 33838, + 8104, + 4880, + 13947, + 31082, + 618, + 15020, + 3734, + 45996, + 2603, + 3453, + 15710, + 30701, + 17909, + 9691, + 7452, + 33796, + 3495, + 5109, + 2867, + 3083, + 23137, + 36338, + 5459, + 45500, + 19591, + 12187, + 53953, + 1508, + 2557, + 3342, + 7156, + 20707, + 3867, + 938, + 39570, + 5954, + 83326, + 647, + 6756, + 37522, + 45277, + 18757, + 160934, + 213563, + 15663, + 74845, + 948, + 16871, + 520, + 1545, + 5787, + 75535, + 161916, + 2372, + 3782, + 7199, + 1089, + 11255, + 47601, + 22683, + 4138, + 98846, + 52740, + 85429, + 10011, + 27856, + 1140, + 36750, + 31948, + 24863, + 3792, + 7851, + 873, + 3208, + 52665, + 6723, + 67265, + 209623, + 3188, + 42562, + 19871, + 8273, + 5269, + 8324, + 5366, + 2812, + 5848, + 1361, + 17559, + 19429, + 2130, + 1386, + 14767, + 20871, + 56571, + 58230, + 2994, + 1556, + 11195, + 21487, + 13122, + 1974, + 3524, + 58268, + 6825, + 17537, + 2129, + 13488, + 2630, + 22242, + 106721, + 26836, + 3430, + 492, + 27031, + 16403, + 5723, + 12072, + 3811, + 136948, + 4045, + 1142, + 5649, + 2621, + 5606, + 46359, + 1762, + 1750, + 27488, + 10989, + 960, + 95605, + 1820, + 174987, + 90232, + 255077, + 2699, + 25829, + 21636, + 22976, + 8162, + 2669, + 9001, + 4162, + 153632, + 83443, + 1334, + 4480, + 2396, + 33433, + 6440, + 458, + 14609, + 1468, + 47085, + 46195, + 1868, + 32467, + 2932, + 3052, + 2950, + 5776, + 3439, + 46929, + 10856, + 92937, + 3595, + 27654, + 3928, + 6614, + 17283, + 14998, + 2449, + 16214, + 2954, + 2525, + 6286, + 27946, + 25074, + 2810, + 1047, + 3685, + 3902, + 28199, + 36638, + 1251, + 151562, + 5671, + 2368, + 5799, + 822, + 4597, + 1483, + 170153, + 16410, + 17131, + 8929, + 145968, + 104597, + 15052, + 9172, + 10790, + 1089, + 41643, + 1488, + 7704, + 3375, + 2190, + 15108, + 2947, + 14795, + 31982, + 10278, + 141720, + 89573, + 211597, + 6827, + 8955, + 52961, + 1152, + 126408, + 26375, + 4473, + 4060, + 4202, + 20583, + 3594, + 493, + 70049, + 731, + 2324, + 4508, + 8437, + 1096, + 77807, + 24305, + 7677, + 3552, + 2382, + 5056, + 5031, + 28021, + 14327, + 4643, + 11120, + 2807, + 1308, + 21641, + 9174, + 25051, + 3972, + 51703, + 4380, + 7406, + 31623, + 63388, + 1954, + 144638, + 1938, + 12987, + 206838, + 38788, + 64211, + 117863, + 60210, + 12441, + 4233, + 7149, + 7640, + 706, + 26280, + 57249, + 4154, + 3124, + 2584, + 26730, + 1435, + 2632, + 713, + 12672, + 766, + 11666, + 4169, + 2682, + 4463, + 12174, + 24444, + 29143, + 3398, + 37593, + 5388, + 5969, + 15408, + 93254, + 13037, + 10752, + 14219, + 221649, + 163666, + 148554, + 5261, + 1550, + 14389, + 12313, + 16353, + 12577, + 2541, + 17980, + 25311, + 116178, + 31601, + 3149, + 3374, + 993, + 11866, + 292159, + 1680, + 9310, + 8424, + 3850, + 10664, + 8577, + 7040, + 8364, + 3389, + 4405, + 29346, + 9577, + 20353, + 951, + 14792, + 114326, + 10929, + 86344, + 23460, + 3002, + 41561, + 3530, + 1644, + 12274, + 2991, + 6721, + 9129, + 62673, + 19191, + 33392, + 12426, + 5297, + 3374, + 31531, + 3317, + 6301, + 622, + 5680, + 17191, + 5056, + 8400, + 6726, + 1154, + 2946, + 3515, + 2354, + 510, + 6152, + 86092, + 78159, + 3419, + 2064, + 13358, + 2877, + 36310, + 8555, + 1255, + 52138, + 2639, + 624, + 12109, + 27786, + 140307, + 33745, + 3696, + 14900, + 9503, + 3764, + 8451, + 7606, + 9998, + 1474, + 1043, + 4879, + 4271, + 1497, + 5764, + 7346, + 15778, + 192985, + 13421, + 1637, + 15987, + 39303, + 1593, + 256786, + 49811, + 16051, + 18286, + 1234, + 21656, + 5277, + 84786, + 16861, + 1408, + 12315, + 50026, + 43624, + 4869, + 13202, + 7326, + 37655, + 5382, + 141093, + 64464, + 16793, + 41603, + 5268, + 27331, + 6974, + 6464, + 27512, + 2095, + 165130, + 15330, + 2759, + 1898, + 20758, + 162051, + 3849, + 3281, + 11822, + 56968, + 49163, + 4149, + 8442, + 10986, + 18736, + 4937, + 27706, + 5513, + 23901, + 5151, + 13593, + 2155, + 103937, + 954, + 2083, + 26094, + 1528, + 2051, + 3871, + 1737, + 1152, + 56609, + 5515, + 13872, + 2958, + 5832, + 14597, + 5804, + 15153, + 36003, + 4520, + 17230, + 1048, + 2676, + 62915, + 5659, + 98968, + 59031, + 603, + 73807, + 36436, + 250312, + 1599, + 25477, + 4393, + 1111, + 13571, + 1110, + 51975, + 5030, + 1688, + 1107, + 3953, + 2794, + 150808, + 185336, + 12714, + 3711, + 12173, + 42786, + 4616, + 4309, + 22081, + 1097, + 60007, + 48624, + 1864, + 1179, + 5410, + 935, + 160776, + 1503, + 18678, + 51149, + 270297, + 1622, + 5965, + 60481, + 23321, + 2136, + 7634, + 6731, + 6051, + 19237, + 1709, + 4663, + 67102, + 26963, + 36049, + 9060, + 182253, + 3487, + 62790, + 15964, + 19586, + 57977, + 10208, + 11147, + 27822, + 103317, + 1978, + 34639, + 141480, + 116184, + 548, + 27790, + 10255, + 21137, + 46064, + 2349, + 263758, + 4864, + 29599, + 10193, + 49207, + 1014, + 21461, + 45652, + 35582, + 5859, + 7513, + 3643, + 79255, + 60172, + 6495, + 3006, + 2192, + 6832, + 2230, + 11482, + 6595, + 34386, + 53636, + 115681, + 35202, + 252591, + 511, + 2077, + 3261, + 13277, + 4592, + 5910, + 3911, + 4976, + 52271, + 31949, + 11596, + 4050, + 11476, + 84855, + 9800, + 6879, + 43102, + 1851, + 1606, + 74970, + 64314, + 92709, + 71168, + 194906, + 4477, + 225744, + 2604, + 3032, + 1242, + 7573, + 75894, + 10741, + 14693, + 605, + 12523, + 1215, + 26611, + 2169, + 1797, + 12238, + 7713, + 81013, + 14063, + 874, + 7350, + 4567, + 61602, + 25082, + 3607, + 19899, + 5452, + 5093, + 6094, + 4053, + 2383, + 57077, + 106289, + 33194, + 15945, + 847, + 980, + 20112, + 152726, + 22178, + 2672, + 143978, + 86157, + 96073, + 8605, + 1683, + 31637, + 17620, + 7239, + 73201, + 16508, + 72368, + 118369, + 156576, + 48855, + 6498, + 86127, + 48885, + 2018, + 7235, + 8716, + 128864, + 97023, + 12311, + 21139, + 24905, + 5800, + 16209, + 841, + 24945, + 1639, + 1583, + 55176, + 45605, + 5005, + 2043, + 10193, + 1400, + 25253, + 2041, + 26812, + 22167, + 18051, + 10337, + 27568, + 968, + 11222, + 34852, + 10052, + 2393, + 21149, + 32807, + 563, + 14155, + 85843, + 732, + 6199, + 17772, + 57604, + 8210, + 4066, + 4550, + 6705, + 2741, + 3292, + 3162, + 882, + 9497, + 41462, + 5754, + 10603, + 175231, + 32532, + 6722, + 54746, + 10580, + 136889, + 68715, + 30984, + 7591, + 18864, + 5234, + 11131, + 1844, + 17848, + 29013, + 17594, + 6363, + 34606, + 8253, + 10300, + 15461, + 8318, + 2944, + 3962, + 27702, + 25955, + 8309, + 4100, + 1080, + 4876, + 1553, + 13320, + 4886, + 8079, + 8945, + 72836, + 2023, + 10267, + 105145, + 10745, + 28545, + 40357, + 6995, + 1130, + 834, + 4432, + 19048, + 1791, + 60261, + 43301, + 34913, + 21225, + 10466, + 35450, + 7429, + 2457, + 48701, + 2692, + 47649, + 1224, + 3165, + 808, + 131575, + 31185, + 4960, + 1464, + 86634, + 666, + 2764, + 1456, + 143187, + 1100, + 820, + 137037, + 173297, + 2973, + 1266, + 12423, + 17013, + 4615, + 1693, + 15577, + 2584, + 4358, + 19716, + 42924, + 1002, + 128165, + 6959, + 15030, + 2566, + 34485, + 1512, + 6740, + 11479, + 1046, + 17303, + 9381, + 25289, + 16190, + 40326, + 19019, + 4967, + 8073, + 10058, + 833, + 1464, + 32944, + 3982, + 10252, + 38170, + 160042, + 115435, + 795, + 66036, + 62858, + 30394, + 48580, + 28325, + 17136, + 9305, + 38865, + 18807, + 73949, + 11599, + 1669, + 70071, + 3808, + 188168, + 14216, + 112600, + 146060, + 6906, + 57194, + 6056, + 4829, + 12304, + 2086, + 111607, + 9165, + 968, + 3183, + 1392, + 75363, + 31807, + 246057, + 18212, + 3282, + 2994, + 4030, + 4505, + 3422, + 174899, + 50517, + 7487, + 6773, + 168998, + 1116, + 10697, + 11803, + 6539, + 2056, + 1792, + 10524, + 7598, + 18203, + 9132, + 28654, + 71416, + 23574, + 14364, + 6727, + 1686, + 1052, + 81485, + 28818, + 13777, + 27845, + 5738, + 1397, + 6055, + 778, + 52580, + 17575, + 5631, + 7490, + 176326, + 1087, + 7688, + 22998, + 860, + 8957, + 2509, + 1335, + 103341, + 8724, + 34864, + 6096, + 1778, + 26240, + 10612, + 2042, + 7598, + 20926, + 31597, + 56873, + 8595, + 8096, + 619, + 5486, + 32231, + 59292, + 9357, + 3828, + 5226, + 1491, + 10331, + 1842, + 61111, + 344441, + 8335, + 98050, + 21305, + 23523, + 121127, + 24912, + 6609, + 10041, + 7382, + 3761, + 9226, + 4763, + 12174, + 6401, + 8527, + 3216, + 10214, + 2141, + 11914, + 6095, + 121497, + 11518, + 13203, + 84470, + 985, + 80623, + 34625, + 29413, + 44881, + 20623, + 4392, + 48843, + 10329, + 14803, + 4257, + 76840, + 432, + 6404, + 1709, + 671, + 718, + 59828, + 8385, + 45973, + 41328, + 7758, + 247832, + 198579, + 160845, + 8922, + 155607, + 13524, + 9644, + 2466, + 9027, + 1825, + 16418, + 21006, + 54374, + 1417, + 6783, + 1131, + 10586, + 128739, + 51716, + 2584, + 14852, + 13510, + 60307, + 4061, + 17078, + 888, + 2730, + 30570, + 93892, + 2983, + 15275, + 7421, + 165292, + 61802, + 10217, + 17486, + 4739, + 18178, + 26910, + 980, + 13129, + 10926, + 4061, + 689, + 3148, + 920, + 57378, + 199314, + 2473, + 6599, + 2997, + 7379, + 88167, + 5334, + 8348, + 14375, + 1385, + 2735, + 1987, + 5730, + 5745, + 13762, + 3496, + 4470, + 188949, + 3634, + 9292, + 1404, + 7830, + 17124, + 43363, + 8871, + 3137, + 155464, + 1756, + 1128, + 33016, + 3020, + 20005, + 50001, + 7668, + 1281, + 169312, + 3421, + 6987, + 6724, + 96965, + 23352, + 105152, + 16491, + 8570, + 998, + 2438, + 18782, + 11090, + 118376, + 4838, + 17440, + 2981, + 27789, + 2206, + 1484, + 1092, + 2139, + 884, + 9533, + 104511, + 2760, + 1403, + 56204, + 560, + 566, + 16052, + 94976, + 5591, + 916, + 18105, + 1130, + 14095, + 55519, + 19103, + 1847, + 2834, + 465, + 5541, + 14608, + 4586, + 19921, + 19488, + 6254, + 2422, + 42989, + 10816, + 44914, + 1039, + 54809, + 9447, + 4575, + 1368, + 35093, + 29357, + 7684, + 9387, + 4698, + 45201, + 10529, + 3541, + 21420, + 1344, + 7395, + 134106, + 21806, + 7340, + 23426, + 6019, + 3235, + 29921, + 1110, + 1575, + 5151, + 22785, + 166086, + 57547, + 1313, + 177466, + 7332, + 2470, + 4369, + 104727, + 47985, + 5756, + 3115, + 478, + 84460, + 914, + 1155, + 14845, + 1961, + 3479, + 21649, + 9217, + 373, + 11486, + 26635, + 28865, + 9090, + 10980, + 1141, + 1255, + 52286, + 57703, + 2327, + 5134, + 2032, + 2127, + 1499, + 1983, + 2418, + 25064, + 107492, + 3375, + 49364, + 4253, + 5883, + 3523, + 22052, + 21611, + 13298, + 575, + 260775, + 4172, + 118427, + 60034, + 2291, + 65108, + 4334, + 958, + 1442, + 22577, + 4265, + 7093, + 11078, + 46190, + 4989, + 47571, + 15201, + 5083, + 7379, + 15246, + 4991, + 51296, + 41428, + 53487, + 31569, + 11601, + 11056, + 24954, + 12423, + 12679, + 13693, + 4514, + 2475, + 3136, + 11898, + 4768, + 1397, + 8906, + 3879, + 70196, + 5312, + 12230, + 58000, + 9383, + 4541, + 5490, + 1052, + 3834, + 3864, + 6585, + 4022, + 24879, + 66459, + 1134, + 28795, + 30117, + 16157, + 25411, + 3690, + 1430, + 930, + 13496, + 713, + 10913, + 3237, + 52090, + 11171, + 5000, + 875, + 11837, + 18250, + 10407, + 7315, + 2142, + 116898, + 22032, + 1386, + 14205, + 20709, + 47752, + 19121, + 320118, + 158808, + 6511, + 224433, + 43494, + 12731, + 54970, + 14569, + 4654, + 16559, + 29726, + 1562, + 130052, + 3871, + 163642, + 99619, + 37429, + 3893, + 5885, + 5115, + 3094, + 29194, + 1955, + 51930, + 77297, + 2114, + 3787, + 4131, + 3788, + 2571, + 5422, + 28314, + 22650, + 61103, + 23397, + 9187, + 1682, + 119588, + 105224, + 935, + 3725, + 9510, + 618, + 2033, + 6289, + 1257, + 2596, + 102317, + 36171, + 6488, + 1851, + 4888, + 16672, + 162413, + 1000, + 16183, + 1245, + 32198, + 4053, + 19049, + 14122, + 643, + 5159, + 3600, + 11304, + 95429, + 1070, + 1334, + 1023, + 1322, + 52005, + 4567, + 7707, + 4233, + 2005, + 4472, + 1580, + 75416, + 7625, + 9819, + 14176, + 14228, + 16576, + 1132, + 13106, + 52873, + 10459, + 199860, + 23691, + 5359, + 32094, + 114101, + 14976, + 37510, + 16012, + 4185, + 20753, + 9737, + 5122, + 48385, + 33445, + 1129, + 989, + 17147, + 893, + 24864, + 1057, + 2296, + 27378, + 10401, + 7198, + 32561, + 2120, + 8307, + 215406, + 21610, + 160843, + 22375, + 9109, + 3498, + 28050, + 36603, + 6516, + 39604, + 3291, + 825, + 4546, + 92958, + 33472, + 61774, + 28181, + 52326, + 1044, + 2242, + 2856, + 3397, + 17971, + 727, + 7963, + 2367, + 8406, + 10502, + 5549, + 1327, + 12588, + 15677, + 95075, + 808, + 6617, + 22805, + 5807, + 38062, + 713, + 1041, + 91130, + 133986, + 14239, + 4390, + 57422, + 5968, + 37833, + 6169, + 152564, + 9529, + 23808, + 19307, + 10605, + 2390, + 30481, + 3124, + 52809, + 2033, + 38015, + 15405, + 60365, + 20081, + 23187, + 22685, + 176244, + 6209, + 2185, + 71376, + 42133, + 198870, + 4319, + 5291, + 37299, + 18268, + 4329, + 43168, + 32887, + 10488, + 15669, + 38032, + 6146, + 10285, + 87339, + 1321, + 11329, + 701, + 2946, + 719, + 5885, + 4517, + 29111, + 2896, + 6753, + 1917, + 16711, + 10530, + 7029, + 15761, + 8889, + 54718, + 22480, + 1081, + 1378, + 5173, + 3550, + 16697, + 5723, + 16657, + 70232, + 4554, + 4957, + 5795, + 1438, + 669, + 45101, + 1653, + 1042, + 16074, + 45451, + 16441, + 8854, + 10176, + 517, + 983, + 8006, + 1693, + 11006, + 11301, + 7695, + 4796, + 1272, + 917, + 27498, + 12861, + 9520, + 3225, + 6043, + 87360, + 19269, + 9036, + 1036, + 169241, + 5936, + 1310, + 1908, + 1543, + 7489, + 3880, + 34997, + 3850, + 19927, + 2422, + 28250, + 86041, + 7277, + 8018, + 4110, + 2089, + 1458, + 77201, + 1223, + 7257, + 39846, + 76826, + 838, + 2878, + 7027, + 26300, + 20273, + 25276, + 24521, + 1703, + 510, + 30844, + 15659, + 10456, + 861, + 23757, + 4330, + 595, + 26455, + 12838, + 166810, + 124151, + 77522, + 6556, + 1017, + 195807, + 7431, + 3126, + 4652, + 4645, + 6140, + 12836, + 62135, + 3048, + 21876, + 4355, + 1675, + 1157, + 78114, + 8812, + 1463, + 756, + 11475, + 33753, + 1167, + 21583, + 3714, + 6217, + 3630, + 81324, + 278525, + 160778, + 8758, + 7736, + 22447, + 54820, + 1562, + 1029, + 6802, + 13418, + 169671, + 12775, + 3680, + 1741, + 426, + 100600, + 2441, + 57548, + 27617, + 12056, + 9388, + 2150, + 1683, + 6346, + 1152, + 17347, + 2896, + 6334, + 8278, + 9701, + 4269, + 7845, + 92225, + 113775, + 4599, + 1363, + 6581, + 2059, + 14572, + 18571, + 6031, + 56057, + 577, + 76450, + 6245, + 49355, + 7610, + 155606, + 105325, + 51184, + 21301, + 19481, + 30799, + 50855, + 60081, + 8634, + 34238, + 1459, + 5996, + 1367, + 27891, + 106726, + 2157, + 34255, + 2019, + 79799, + 1235, + 4426, + 34235, + 50073, + 7742, + 127676, + 39968, + 21344, + 110586, + 1252, + 183981, + 1908, + 24872, + 5550, + 32351, + 184197, + 2366, + 1740, + 1275, + 7675, + 1280, + 1754, + 134287, + 1534, + 22751, + 37253, + 33371, + 187712, + 10076, + 604, + 20786, + 65331, + 2166, + 44969, + 83989, + 192823, + 6500, + 62253, + 1571 + ] + }, + { + "counters": [ + 11191, + 7387, + 23990, + 23944, + 6212, + 39200, + 16312, + 57199, + 2447, + 1103, + 78554, + 1423, + 10149, + 3041, + 2814, + 2932, + 101357, + 2765, + 5079, + 112174, + 1728, + 1436, + 6156, + 15058, + 2928, + 4697, + 4503, + 1648, + 1684, + 7798, + 4366, + 32599, + 109361, + 61495, + 38296, + 6836, + 3762, + 854, + 243317, + 4971, + 112645, + 82622, + 4514, + 4568, + 14751, + 23883, + 3340, + 40537, + 26093, + 2404, + 47089, + 14882, + 1989, + 27481, + 30328, + 843, + 20941, + 5323, + 89083, + 6395, + 10517, + 17299, + 3693, + 8135, + 221937, + 51166, + 14917, + 3408, + 1980, + 47325, + 113049, + 1303, + 88460, + 2676, + 3952, + 58382, + 72955, + 33755, + 2204, + 29188, + 116632, + 5652, + 2071, + 6353, + 55577, + 15670, + 5007, + 17304, + 166633, + 12452, + 25126, + 2282, + 21249, + 28918, + 1777, + 128552, + 179074, + 4999, + 8544, + 159865, + 3824, + 12895, + 1652, + 1743, + 10196, + 37149, + 167176, + 18109, + 2852, + 3142, + 65083, + 7474, + 764, + 44332, + 4569, + 15359, + 907, + 37416, + 5279, + 30905, + 2504, + 127470, + 7784, + 1000, + 45857, + 206011, + 2605, + 85539, + 81647, + 8674, + 2874, + 4811, + 2205, + 3181, + 914, + 26348, + 8230, + 2216, + 31414, + 7031, + 832, + 12696, + 46574, + 656, + 5202, + 8845, + 58798, + 2283, + 19655, + 34684, + 5249, + 15826, + 8385, + 9666, + 4837, + 20205, + 615, + 4678, + 8545, + 79977, + 45809, + 5228, + 1431, + 17497, + 19047, + 3763, + 74933, + 40142, + 23224, + 81668, + 52665, + 1147, + 5415, + 151833, + 104366, + 60358, + 66628, + 20884, + 17163, + 6181, + 171813, + 30247, + 22194, + 19869, + 2117, + 95725, + 5604, + 168899, + 12282, + 12502, + 10136, + 4471, + 3060, + 1832, + 1010, + 19962, + 9506, + 64435, + 12280, + 13363, + 7214, + 11410, + 5100, + 21332, + 4551, + 1585, + 54344, + 192556, + 9454, + 1425, + 23461, + 69669, + 6201, + 75330, + 5278, + 9712, + 4817, + 2505, + 995, + 6689, + 94006, + 1110, + 129509, + 15596, + 1697, + 6199, + 35846, + 3749, + 4215, + 1137, + 11808, + 19191, + 77797, + 10674, + 7404, + 124246, + 21749, + 43864, + 23981, + 2968, + 926, + 74130, + 4962, + 17861, + 637, + 24352, + 4299, + 5285, + 118994, + 102082, + 12111, + 1990, + 8841, + 5567, + 18075, + 9122, + 212972, + 12939, + 239305, + 153445, + 10771, + 25847, + 14091, + 35319, + 4666, + 21399, + 930, + 576, + 8924, + 4005, + 1825, + 1747, + 10650, + 13805, + 785, + 13133, + 710, + 9397, + 3053, + 5873, + 1879, + 6834, + 5499, + 4290, + 29723, + 170166, + 1985, + 8358, + 30736, + 2232, + 9626, + 8619, + 110547, + 29031, + 70543, + 8990, + 321956, + 15012, + 4393, + 14014, + 8595, + 24208, + 54232, + 11769, + 142006, + 10169, + 76810, + 32292, + 3235, + 1447, + 2235, + 7835, + 2065, + 26771, + 25269, + 967, + 2125, + 1636, + 34907, + 3420, + 130131, + 6131, + 8594, + 11230, + 662, + 7573, + 170865, + 108146, + 8373, + 43407, + 2401, + 55065, + 6964, + 37483, + 3556, + 69570, + 1144, + 22893, + 29708, + 1175, + 1064, + 1739, + 1039, + 1462, + 2472, + 18997, + 20046, + 3889, + 5086, + 9798, + 163755, + 3331, + 477, + 22653, + 3501, + 95612, + 70096, + 23336, + 1566, + 19185, + 49985, + 1697, + 22767, + 31039, + 18168, + 8799, + 6890, + 11330, + 52569, + 15682, + 8000, + 971, + 12512, + 4410, + 44708, + 656, + 3405, + 24310, + 1530, + 1260, + 1554, + 37602, + 4908, + 89461, + 10673, + 2150, + 4522, + 119125, + 15724, + 2249, + 1175, + 23163, + 25551, + 18831, + 2900, + 17091, + 18837, + 13979, + 20206, + 168709, + 1664, + 44253, + 6604, + 1392, + 8621, + 109891, + 4100, + 8131, + 68560, + 6880, + 105303, + 1869, + 7796, + 5951, + 11298, + 1363, + 2366, + 3587, + 118972, + 1873, + 143092, + 5741, + 2856, + 163770, + 12468, + 962, + 558, + 55623, + 78184, + 27677, + 3845, + 3341, + 4389, + 18807, + 58945, + 102735, + 18052, + 4164, + 19999, + 244579, + 1154, + 1239, + 8131, + 4235, + 12607, + 89854, + 8986, + 64409, + 4374, + 19133, + 13274, + 188850, + 9526, + 39149, + 41561, + 19733, + 15135, + 6398, + 2799, + 236009, + 12647, + 4774, + 12553, + 30507, + 40226, + 4277, + 7729, + 29521, + 22516, + 26806, + 966, + 1611, + 51154, + 34000, + 5088, + 70349, + 30655, + 20865, + 4141, + 34352, + 136205, + 48137, + 24083, + 6551, + 2547, + 3725, + 8009, + 625, + 7383, + 9111, + 67490, + 122351, + 2123, + 47444, + 20754, + 1841, + 26744, + 42289, + 5408, + 30792, + 17530, + 945, + 156209, + 9665, + 5967, + 6905, + 5440, + 4549, + 1877, + 914, + 13112, + 3749, + 38126, + 9462, + 9398, + 56089, + 19196, + 312489, + 5154, + 3960, + 876, + 862, + 55480, + 1512, + 11240, + 491, + 3582, + 1171, + 190036, + 47756, + 4055, + 3978, + 10506, + 1380, + 6071, + 4128, + 12398, + 12438, + 995, + 971, + 11912, + 1954, + 2629, + 2164, + 4458, + 608, + 3024, + 70836, + 14115, + 10796, + 18362, + 8318, + 4441, + 55543, + 1953, + 6306, + 115564, + 1515, + 12219, + 18658, + 84714, + 10526, + 205509, + 7437, + 1481, + 6459, + 3840, + 31137, + 44246, + 126465, + 29247, + 1174, + 4960, + 7151, + 3197, + 6793, + 65847, + 96604, + 92295, + 13236, + 1580, + 2085, + 1640, + 38953, + 30440, + 15319, + 13384, + 19381, + 6280, + 8707, + 6624, + 158281, + 16243, + 15771, + 989, + 635, + 187060, + 1609, + 6410, + 6022, + 2750, + 69129, + 800, + 18833, + 103666, + 133856, + 14527, + 18023, + 55341, + 39639, + 13221, + 157080, + 47413, + 10839, + 15841, + 9370, + 2125, + 5130, + 5966, + 11575, + 26256, + 22193, + 5981, + 38697, + 9681, + 4216, + 7197, + 5296, + 54230, + 30005, + 9324, + 475, + 50370, + 23736, + 1609, + 24737, + 80585, + 8662, + 42063, + 13967, + 5866, + 444, + 16203, + 699, + 89864, + 11820, + 7022, + 11746, + 11755, + 1129, + 4436, + 4239, + 16873, + 2893, + 1559, + 10772, + 11579, + 5783, + 5368, + 57616, + 6629, + 54862, + 6592, + 93792, + 2610, + 5919, + 80298, + 41156, + 1241, + 3584, + 896, + 4640, + 10547, + 561, + 2796, + 82506, + 6209, + 13533, + 125334, + 9821, + 7935, + 9305, + 7516, + 197828, + 6357, + 2114, + 5217, + 1290, + 87568, + 32473, + 51970, + 858, + 6352, + 157495, + 10078, + 10764, + 15442, + 7629, + 664, + 86532, + 3804, + 2341, + 9477, + 1610, + 105589, + 15242, + 9192, + 777, + 17946, + 137911, + 40026, + 18912, + 1385, + 15253, + 8752, + 570, + 5593, + 24932, + 1496, + 38208, + 14545, + 249580, + 33400, + 7289, + 9022, + 3770, + 74984, + 2353, + 2629, + 94178, + 36891, + 24519, + 2392, + 7535, + 9276, + 2034, + 4977, + 9132, + 40889, + 17970, + 1367, + 981, + 1113, + 92285, + 48190, + 1068, + 152253, + 930, + 23194, + 0, + 2559, + 4548, + 5491, + 7822, + 5995, + 6373, + 74178, + 3919, + 7292, + 92558, + 6095, + 2082, + 112433, + 27633, + 1252, + 2079, + 26132, + 14313, + 4105, + 4314, + 16412, + 5989, + 12525, + 12406, + 13254, + 784, + 32859, + 10330, + 20716, + 27225, + 131866, + 24138, + 21270, + 927, + 7565, + 6484, + 1998, + 1027, + 11170, + 16598, + 7146, + 3685, + 1433, + 1533, + 20785, + 8274, + 3753, + 6511, + 32104, + 101187, + 3749, + 53143, + 8169, + 1766, + 41746, + 5789, + 100884, + 537, + 869, + 8433, + 652, + 2337, + 7820, + 48898, + 69828, + 10227, + 131752, + 4011, + 2509, + 165421, + 57058, + 802, + 5454, + 73592, + 22968, + 10542, + 72633, + 13545, + 20347, + 9249, + 7205, + 5478, + 5908, + 5179, + 18155, + 11226, + 9894, + 3868, + 6003, + 18089, + 44490, + 782, + 20408, + 1634, + 5058, + 29603, + 32996, + 9230, + 16670, + 172514, + 21843, + 12159, + 2471, + 6276, + 5669, + 204317, + 17316, + 27775, + 66561, + 21918, + 484, + 7060, + 30753, + 12224, + 11102, + 889, + 11020, + 13238, + 622, + 6126, + 9438, + 38710, + 137442, + 4535, + 3564, + 16445, + 29006, + 16197, + 1179, + 15490, + 1515, + 2530, + 4528, + 178558, + 2840, + 80064, + 5550, + 13962, + 34778, + 75373, + 2359, + 22880, + 894, + 29651, + 15669, + 5306, + 31537, + 9633, + 36636, + 2048, + 11110, + 4086, + 23410, + 2324, + 9192, + 4858, + 2121, + 920, + 8573, + 5176, + 6792, + 11011, + 2290, + 40398, + 8518, + 3880, + 4303, + 16120, + 17781, + 37404, + 34037, + 138824, + 4224, + 125697, + 11325, + 12326, + 6668, + 26156, + 20397, + 1846, + 5802, + 6328, + 1508, + 3457, + 4640, + 5193, + 16583, + 6558, + 18335, + 11667, + 11348, + 1806, + 8768, + 3489, + 603, + 157457, + 116027, + 39387, + 9580, + 4438, + 3415, + 1725, + 36049, + 712, + 91197, + 5330, + 37076, + 34160, + 5317, + 11988, + 1472, + 2686, + 86141, + 1669, + 26902, + 115361, + 15377, + 5860, + 19400, + 1440, + 5866, + 16857, + 40511, + 9019, + 28097, + 1309, + 29058, + 47669, + 92936, + 11883, + 25763, + 35501, + 6965, + 23171, + 6609, + 1275, + 3388, + 2923, + 30501, + 2213, + 27211, + 8627, + 1235, + 18146, + 3866, + 107121, + 870, + 10002, + 40381, + 6775, + 553, + 18402, + 17645, + 1520, + 29891, + 7257, + 7241, + 18150, + 2294, + 2016, + 7338, + 27871, + 24005, + 36896, + 2540, + 4709, + 923, + 44922, + 747, + 15376, + 3113, + 19513, + 15967, + 196442, + 3544, + 48240, + 11341, + 626, + 23911, + 5269, + 10531, + 9229, + 4350, + 5911, + 1181, + 6561, + 1371, + 4155, + 1967, + 33273, + 1586, + 4597, + 2272, + 1061, + 45863, + 2876, + 26944, + 8455, + 78815, + 9776, + 17277, + 1767, + 8429, + 24453, + 86708, + 5777, + 3473, + 47330, + 8384, + 550, + 39923, + 20344, + 324095, + 14487, + 586, + 10493, + 4142, + 14209, + 19920, + 2110, + 3792, + 8107, + 5302, + 66585, + 151407, + 5571, + 10246, + 1050, + 37380, + 2011, + 23371, + 66934, + 7654, + 50482, + 16355, + 8552, + 27003, + 19691, + 14710, + 21156, + 2220, + 5197, + 6468, + 34008, + 15187, + 3716, + 10859, + 132487, + 255847, + 5131, + 8834, + 90489, + 40392, + 4606, + 13075, + 14775, + 2766, + 56032, + 2094, + 145392, + 17491, + 218484, + 4089, + 7039, + 27331, + 22653, + 69035, + 1386, + 13582, + 35004, + 14653, + 17292, + 63500, + 25514, + 3194, + 185648, + 625, + 76173, + 71312, + 19209, + 1742, + 2820, + 15547, + 4772, + 8639, + 7447, + 2079, + 1890, + 2451, + 6899, + 1170, + 1513, + 2826, + 92930, + 1293, + 116567, + 16108, + 14348, + 7661, + 26493, + 31550, + 60905, + 2282, + 163648, + 27199, + 1358, + 4107, + 5763, + 13418, + 3482, + 6028, + 72987, + 16064, + 41307, + 52015, + 13390, + 14267, + 2339, + 25935, + 9207, + 1851, + 27301, + 2754, + 25761, + 12836, + 7196, + 99473, + 17053, + 10695, + 7425, + 80922, + 7283, + 2584, + 653, + 38022, + 2011, + 23267, + 9926, + 8523, + 752, + 6362, + 81978, + 5087, + 7931, + 750, + 22809, + 12725, + 7069, + 2136, + 11243, + 902, + 2417, + 1142, + 17067, + 268428, + 7770, + 9984, + 77759, + 7586, + 164870, + 22016, + 133845, + 7030, + 31651, + 5215, + 51108, + 99944, + 3779, + 2086, + 736, + 30682, + 884, + 805, + 12908, + 993, + 40669, + 1052, + 6578, + 32491, + 7479, + 1032, + 203588, + 1323, + 80366, + 8430, + 504, + 12856, + 171020, + 14235, + 12897, + 53878, + 21717, + 10657, + 32037, + 35808, + 5431, + 46355, + 22824, + 5115, + 16702, + 1917, + 5814, + 5742, + 19876, + 13780, + 197928, + 1118, + 266377, + 86070, + 6765, + 6890, + 7487, + 2540, + 1477, + 3573, + 5127, + 21048, + 5818, + 219460, + 1401, + 12143, + 449, + 1348, + 4761, + 5752, + 200175, + 6347, + 1018, + 175113, + 19425, + 14492, + 40942, + 26744, + 743, + 6606, + 5412, + 5702, + 16480, + 6528, + 3781, + 7860, + 653, + 1402, + 1781, + 10889, + 125841, + 18034, + 8510, + 21481, + 194151, + 187962, + 176807, + 14224, + 8612, + 2127, + 907, + 4648, + 17601, + 12931, + 8381, + 16327, + 1573, + 2344, + 1933, + 1207, + 50706, + 20295, + 15985, + 70080, + 86671, + 160013, + 32629, + 4122, + 64236, + 32736, + 10811, + 1094, + 52901, + 8301, + 1863, + 4513, + 6364, + 1632, + 80989, + 7758, + 1690, + 64644, + 22509, + 3408, + 603, + 53633, + 75710, + 6409, + 6496, + 7540, + 20905, + 32367, + 21249, + 10795, + 36342, + 9949, + 964, + 1021, + 202857, + 3499, + 8586, + 2080, + 501, + 78283, + 12043, + 27114, + 233196, + 27418, + 14460, + 154075, + 12103, + 18786, + 35491, + 1750, + 14408, + 4819, + 16234, + 66998, + 5467, + 52577, + 7996, + 13729, + 16246, + 14557, + 7329, + 9136, + 39223, + 9498, + 159147, + 1422, + 10115, + 1417, + 44199, + 5793, + 4824, + 3513, + 2491, + 11532, + 81953, + 189918, + 129671, + 49512, + 2377, + 972, + 1180, + 1795, + 17868, + 33370, + 6273, + 707, + 21423, + 4136, + 2099, + 2424, + 12743, + 1155, + 2733, + 14976, + 40667, + 1004, + 66590, + 51823, + 29219, + 38829, + 2930, + 5924, + 23987, + 5845, + 85317, + 31760, + 2277, + 4655, + 56870, + 26814, + 24409, + 5857, + 70028, + 104282, + 2400, + 7030, + 2377, + 9138, + 49484, + 60271, + 2868, + 33069, + 21518, + 39530, + 3772, + 34415, + 2699, + 901, + 3259, + 7620, + 958, + 29506, + 24438, + 480, + 7986, + 254283, + 2874, + 3140, + 13748, + 1070, + 2903, + 2443, + 885, + 4835, + 92080, + 5276, + 11779, + 5064, + 1661, + 7130, + 4166, + 1660, + 1978, + 2105, + 21669, + 11194, + 3293, + 11351, + 163088, + 6999, + 2373, + 50942, + 41427, + 27759, + 19903, + 1207, + 9119, + 461, + 40287, + 68495, + 5626, + 7434, + 744, + 53805, + 55352, + 106000, + 902, + 567, + 11219, + 883, + 2191, + 34805, + 2906, + 5070, + 6449, + 6599, + 25846, + 4647, + 6807, + 76659, + 626, + 5671, + 12848, + 2776, + 90371, + 1814, + 5961, + 27551, + 35954, + 4825, + 1336, + 5881, + 5464, + 2081, + 5657, + 19802, + 32027, + 52684, + 51473, + 16331, + 2876, + 21190, + 33580, + 7331, + 18082, + 965, + 49103, + 2231, + 4839, + 7567, + 8845, + 6006, + 18316, + 7274, + 1599, + 6876, + 34912, + 11325, + 741, + 3594, + 72849, + 3567, + 9554, + 20079, + 7165, + 1996, + 1128, + 183918, + 20201, + 2794, + 41236, + 2800, + 2119, + 777, + 1671, + 11234, + 2743, + 786, + 2845, + 168865, + 3113, + 23303, + 18303, + 5966, + 8018, + 9418, + 15066, + 18947, + 21416, + 1061, + 4426, + 24703, + 12599, + 9268, + 9711, + 60862, + 5516, + 20419, + 3244, + 9910, + 8285, + 1643, + 16676, + 5890, + 13400, + 14330, + 13711, + 3633, + 28697, + 7346, + 20084, + 2339, + 1837, + 49920, + 2650, + 138340, + 33931, + 52039, + 66744, + 74475, + 3335, + 11148, + 1518, + 162753, + 162344, + 47369, + 52832, + 1445, + 1532, + 508, + 157084, + 16353, + 215791, + 2352, + 37315, + 4290, + 128463, + 3860, + 5362, + 742, + 55997, + 4907, + 8843, + 656, + 1147, + 149065, + 45152, + 18293, + 27076, + 29180, + 786, + 861, + 1045, + 1250, + 13780, + 2243, + 8807, + 44310, + 21778, + 3319, + 268009, + 4750, + 3018, + 22339, + 3519, + 1599, + 58820, + 4989, + 48944, + 1533, + 7529, + 8768, + 6097, + 4418, + 2824, + 20735, + 26586, + 5675, + 10115, + 17844, + 2723, + 14025, + 14212, + 8517, + 47407, + 6988, + 19153, + 102074, + 62742, + 3975, + 41787, + 9847, + 57966, + 21060, + 5425, + 3722, + 4319, + 16402, + 40325, + 3784, + 3491, + 41495, + 2806, + 982, + 53847, + 121612, + 13914, + 1329, + 104343, + 12866, + 9777, + 58373, + 7730, + 2841, + 20153, + 54637, + 4897, + 2875, + 3484, + 9484, + 31605, + 65156, + 62302, + 28335, + 39023, + 10814, + 3306, + 10602, + 1003, + 43508, + 225450, + 171934, + 20190, + 147169, + 7404, + 9624, + 5048, + 984, + 14652, + 1321, + 60596, + 46105, + 12188, + 25326, + 72905, + 203930, + 85397, + 1241, + 10106, + 48014, + 5229, + 128623, + 44845, + 28860, + 1582, + 3518, + 10712, + 16004, + 27906, + 6616, + 505, + 3227, + 8065, + 1169, + 20472, + 16213, + 5607, + 24345, + 44728, + 15589, + 810, + 184442, + 886, + 147486, + 17279, + 2132, + 3085, + 3734, + 805, + 1014, + 29404, + 168704, + 102793, + 3872, + 5282, + 17049, + 6602, + 629, + 7566, + 68902, + 94432, + 38749, + 81645, + 1058, + 118977, + 24721, + 19608, + 1450, + 23679, + 182249, + 15279, + 26559, + 123500, + 9266, + 10689, + 10583, + 7422, + 5574, + 56833, + 2040, + 24335, + 12055, + 5819, + 16761, + 895, + 105511, + 12409, + 1457, + 493, + 23337, + 1232, + 80490, + 9410, + 5088, + 1016, + 50036, + 3433, + 8505, + 33581, + 28070, + 16066, + 1010, + 95899, + 9943, + 16623, + 11291, + 10845, + 6406, + 85003, + 5271, + 248327, + 8114, + 9937, + 18506, + 61443, + 14714, + 42952, + 1460, + 5728, + 1069, + 3688, + 7663, + 55655, + 1331, + 71907, + 37630, + 3072, + 5261, + 1618, + 26063, + 71124, + 86833, + 2580, + 12571, + 79008, + 115624, + 28501, + 68970, + 16340, + 1262, + 12116, + 804, + 92830, + 11026, + 12572, + 12159, + 15903, + 49732, + 178543, + 9538, + 1143, + 2348, + 35003, + 2778, + 433265, + 3194, + 6646, + 47486, + 3013, + 272568, + 3066, + 12223, + 5261, + 581, + 7708, + 59610, + 3728, + 2067, + 895, + 2775, + 78834, + 49527, + 4410, + 4192, + 16178, + 2707, + 58449, + 4070, + 98925, + 1124, + 1471, + 6070, + 33947, + 62774, + 223291, + 4598, + 8524, + 11444, + 45771, + 7967, + 3956, + 52453, + 14600, + 512, + 37262, + 4492, + 12555, + 830, + 29482, + 2416, + 84708, + 4257, + 12957, + 2649, + 19504, + 14675, + 14503, + 3715, + 31259, + 5572, + 7082, + 13263, + 88735, + 13393, + 4020, + 32679, + 74097, + 4697, + 6014, + 1149, + 927, + 1567, + 79893, + 8036, + 56866, + 4320, + 6483, + 144387, + 2702, + 28826, + 717, + 4035, + 2581, + 27731, + 36436, + 2814, + 36961, + 18556, + 28854, + 44776, + 4469, + 14161, + 4109, + 3818, + 3860, + 24215, + 9780, + 2680, + 29176, + 40877, + 1315, + 6203, + 682, + 3572, + 74660, + 3263, + 5537, + 1354, + 3163, + 17453, + 3334, + 27261, + 3526, + 14664, + 7563, + 53194, + 69779, + 43283, + 3564, + 3172, + 1122, + 2000, + 17593, + 4349, + 3971, + 1367, + 280220, + 778, + 819, + 65200, + 1892, + 29834, + 10844, + 5791, + 6472, + 31507, + 27651, + 43737, + 2658, + 16899, + 3452, + 1521, + 3598, + 91343, + 657, + 34485, + 7330, + 23361, + 42129, + 7789, + 3867, + 4089, + 16410, + 5445, + 2644, + 17942, + 46107, + 3076, + 22053, + 1767, + 6144, + 1335, + 24444, + 67054, + 8626, + 194967, + 8612, + 591, + 76697, + 5458, + 33415, + 25999, + 2507, + 21919, + 37266, + 13429, + 74006, + 5186, + 16647 + ] + }, + { + "counters": [ + 1312, + 3224, + 52071, + 9545, + 23574, + 1299, + 10759, + 34587, + 25185, + 2457, + 184773, + 28934, + 2156, + 2382, + 74527, + 4960, + 2049, + 67067, + 1588, + 34465, + 895, + 3291, + 14234, + 6629, + 2734, + 1170, + 23928, + 23865, + 49092, + 1996, + 2168, + 6192, + 65206, + 12452, + 37054, + 10578, + 13983, + 77495, + 6684, + 4227, + 19320, + 10131, + 1090, + 17973, + 17977, + 11756, + 86718, + 276499, + 4279, + 18920, + 10184, + 8226, + 32056, + 1220, + 95872, + 20125, + 1067, + 17472, + 21935, + 67240, + 567, + 1798, + 25746, + 10040, + 61644, + 254235, + 3305, + 41445, + 1716, + 3309, + 22041, + 4786, + 23849, + 15674, + 15426, + 9657, + 85051, + 19525, + 2595, + 18792, + 3616, + 99467, + 3393, + 4946, + 808, + 4430, + 1310, + 13606, + 37135, + 83694, + 2257, + 7526, + 52530, + 8766, + 85753, + 1181, + 81685, + 5033, + 4803, + 4890, + 6070, + 14805, + 1663, + 18207, + 12185, + 1839, + 3482, + 1707, + 1406, + 19902, + 2238, + 2221, + 9072, + 30047, + 33336, + 7874, + 821, + 2568, + 3382, + 4996, + 20949, + 70909, + 8908, + 7064, + 38281, + 7450, + 29365, + 2490, + 4766, + 8085, + 20797, + 11799, + 2646, + 116234, + 2190, + 1226, + 65660, + 4705, + 203929, + 12520, + 8416, + 679, + 2521, + 3739, + 4220, + 33999, + 6350, + 9923, + 5634, + 16130, + 11249, + 164685, + 3568, + 2471, + 2849, + 6084, + 6158, + 1681, + 10483, + 1902, + 2986, + 65297, + 27766, + 150644, + 3876, + 95295, + 1366, + 18001, + 1387, + 8718, + 128626, + 12670, + 38883, + 6070, + 1660, + 8117, + 16554, + 20949, + 1301, + 82473, + 1874, + 180072, + 4124, + 5571, + 2580, + 37890, + 83896, + 10096, + 1993, + 54673, + 11683, + 11791, + 49086, + 11441, + 66731, + 2829, + 8444, + 2057, + 1343, + 19335, + 59507, + 10081, + 116560, + 70373, + 5106, + 6521, + 5393, + 3668, + 13522, + 7283, + 24063, + 868, + 2382, + 1879, + 1859, + 4842, + 29912, + 15987, + 6900, + 341354, + 200684, + 419, + 14291, + 34012, + 28204, + 1152, + 88710, + 2101, + 1291, + 4057, + 12487, + 3432, + 129204, + 217940, + 21384, + 2661, + 3271, + 24816, + 2559, + 29140, + 13658, + 644, + 16377, + 21322, + 16251, + 1371, + 2337, + 17022, + 4130, + 17784, + 69194, + 15784, + 1632, + 2647, + 3580, + 55169, + 3906, + 169765, + 29435, + 36401, + 10516, + 19567, + 13144, + 1339, + 12098, + 8264, + 95169, + 33652, + 112419, + 156753, + 4774, + 61008, + 1248, + 189528, + 80211, + 146913, + 2641, + 4868, + 39040, + 6407, + 12603, + 6951, + 86953, + 3955, + 2351, + 10374, + 21680, + 33295, + 17289, + 1975, + 3716, + 12668, + 74303, + 4699, + 914, + 1731, + 4755, + 5388, + 2878, + 6862, + 22892, + 24513, + 10226, + 30986, + 6321, + 6502, + 1847, + 7583, + 7117, + 12828, + 4163, + 2335, + 2131, + 8026, + 22905, + 4868, + 13489, + 167629, + 20598, + 5311, + 3451, + 4411, + 8343, + 1716, + 11626, + 12916, + 92609, + 2591, + 1706, + 3978, + 66161, + 9061, + 11928, + 38366, + 16231, + 4199, + 178773, + 5121, + 1459, + 338929, + 2849, + 119171, + 15348, + 5113, + 4354, + 152866, + 780, + 155504, + 11771, + 180413, + 6703, + 5994, + 6823, + 3756, + 586, + 2023, + 5120, + 2026, + 6816, + 701, + 4599, + 8380, + 54663, + 7703, + 1410, + 113673, + 58698, + 21715, + 370910, + 4364, + 118127, + 7416, + 48447, + 24900, + 6681, + 1470, + 33213, + 28087, + 769, + 19941, + 36360, + 3370, + 5638, + 6120, + 5088, + 29373, + 62304, + 60259, + 226182, + 267615, + 4219, + 3394, + 194448, + 73616, + 46599, + 38685, + 1237, + 792, + 31326, + 729, + 9037, + 5237, + 3294, + 8693, + 7413, + 3011, + 72321, + 24797, + 650, + 6675, + 654, + 145419, + 35427, + 35756, + 4650, + 9772, + 48718, + 6600, + 509688, + 11107, + 1231, + 275347, + 8764, + 9015, + 10609, + 7937, + 2278, + 78751, + 923, + 6651, + 2621, + 1533, + 9017, + 1098, + 5696, + 22934, + 27911, + 59654, + 899, + 4571, + 73840, + 30283, + 22687, + 3327, + 2622, + 858, + 121920, + 22173, + 9506, + 4958, + 162770, + 7138, + 59775, + 1949, + 701, + 4170, + 3750, + 6672, + 4657, + 9272, + 9067, + 29393, + 94934, + 7136, + 21010, + 10155, + 2299, + 744, + 14003, + 2065, + 7222, + 48996, + 5023, + 19619, + 56209, + 1435, + 37300, + 8224, + 136194, + 1231, + 5106, + 4552, + 48831, + 11580, + 17822, + 11337, + 74495, + 5904, + 16238, + 10315, + 730, + 90569, + 5435, + 43558, + 44837, + 76317, + 553, + 7242, + 55848, + 2631, + 9998, + 951, + 353818, + 6396, + 1388, + 17332, + 1794, + 65301, + 2978, + 156229, + 98894, + 36454, + 15529, + 10465, + 50802, + 12555, + 5362, + 421529, + 20584, + 24673, + 671, + 2057, + 1341, + 63972, + 7904, + 14845, + 5901, + 4038, + 18729, + 12297, + 8629, + 1084, + 12952, + 18151, + 3281, + 7010, + 842, + 37047, + 5330, + 12395, + 1653, + 10134, + 19538, + 96477, + 9581, + 4261, + 41097, + 37927, + 2973, + 22129, + 9438, + 16852, + 8449, + 31129, + 2108, + 1305, + 7160, + 730, + 10688, + 4152, + 57838, + 4285, + 45814, + 11685, + 4149, + 149162, + 12157, + 7738, + 49801, + 12512, + 4544, + 11951, + 2918, + 7615, + 1885, + 1682, + 604, + 15015, + 47487, + 21740, + 9215, + 4033, + 6956, + 15491, + 10319, + 57212, + 21605, + 5635, + 4529, + 11252, + 32567, + 53999, + 7031, + 5896, + 3479, + 10813, + 104317, + 10735, + 57772, + 53670, + 22240, + 66210, + 91753, + 11308, + 2634, + 6148, + 2489, + 15945, + 1677, + 2342, + 5035, + 6732, + 17442, + 2292, + 3047, + 5113, + 15439, + 1729, + 16859, + 18459, + 25713, + 141048, + 155625, + 14359, + 43928, + 1547, + 1275, + 914, + 8757, + 4660, + 18824, + 122575, + 2338, + 2146, + 3730, + 24169, + 6058, + 5011, + 3459, + 1423, + 5106, + 25363, + 131697, + 5232, + 34239, + 19207, + 12986, + 178610, + 130111, + 52244, + 32426, + 17428, + 9015, + 29629, + 3526, + 3347, + 11982, + 13871, + 2960, + 86136, + 11935, + 1752, + 5156, + 8358, + 6306, + 21717, + 6546, + 4105, + 13903, + 867, + 3659, + 17314, + 147717, + 6150, + 22678, + 94559, + 50030, + 19941, + 457, + 510, + 66971, + 12777, + 13798, + 1646, + 5168, + 4677, + 45111, + 171040, + 5108, + 165502, + 15975, + 2441, + 70011, + 150230, + 26109, + 822, + 24217, + 9012, + 15804, + 794, + 21816, + 7147, + 8160, + 1396, + 1405, + 4691, + 10384, + 2596, + 13345, + 2316, + 6219, + 83700, + 4023, + 8734, + 1065, + 8455, + 4034, + 6328, + 23415, + 6467, + 76332, + 3786, + 4218, + 1143, + 3347, + 1628, + 1179, + 13926, + 1005, + 3236, + 21337, + 92872, + 104202, + 1384, + 3113, + 4081, + 26266, + 326, + 2046, + 6422, + 2487, + 14865, + 61872, + 54607, + 16944, + 1632, + 23198, + 40082, + 2029, + 130968, + 3130, + 21947, + 1268, + 5492, + 1904, + 3425, + 2053, + 2366, + 68871, + 8875, + 35821, + 8932, + 238563, + 23023, + 3071, + 39869, + 86011, + 5823, + 12469, + 6762, + 25197, + 15247, + 21749, + 2450, + 11722, + 80538, + 8213, + 3014, + 21885, + 179839, + 35819, + 249166, + 7665, + 21614, + 6848, + 28229, + 1609, + 9511, + 15390, + 36530, + 1234, + 994, + 633, + 2346, + 22758, + 60980, + 612, + 29815, + 2572, + 15694, + 2827, + 78824, + 7099, + 44448, + 17023, + 11012, + 42175, + 231043, + 1865, + 1213, + 1325, + 25538, + 13045, + 27878, + 46610, + 4302, + 7270, + 2136, + 30006, + 24543, + 26595, + 6864, + 10084, + 5867, + 211666, + 19501, + 88967, + 1019, + 29806, + 206756, + 37192, + 10788, + 129033, + 30447, + 666, + 169152, + 20678, + 1236, + 117840, + 2803, + 3645, + 9381, + 1318, + 23782, + 5336, + 5908, + 4419, + 4949, + 1243, + 121180, + 6072, + 738, + 6405, + 75443, + 41689, + 2917, + 11105, + 8965, + 11250, + 6879, + 20612, + 175307, + 25152, + 5055, + 11143, + 6118, + 10662, + 11543, + 6819, + 6330, + 227027, + 33510, + 4694, + 3328, + 18787, + 23814, + 7171, + 29556, + 1015, + 4983, + 26006, + 1000, + 36916, + 4495, + 1364, + 4472, + 44483, + 2919, + 2145, + 31723, + 4535, + 6399, + 1503, + 11770, + 2292, + 986, + 97176, + 3846, + 1854, + 27123, + 1512, + 44705, + 2949, + 6423, + 5958, + 752, + 9129, + 14238, + 46862, + 21293, + 1809, + 60511, + 6376, + 107120, + 168959, + 3661, + 1031, + 1166, + 30427, + 26196, + 598, + 1913, + 18739, + 20635, + 56713, + 8568, + 98254, + 34530, + 8074, + 8568, + 7076, + 8959, + 13668, + 11924, + 3726, + 18775, + 210116, + 30589, + 4562, + 7387, + 12677, + 64674, + 10457, + 44239, + 3271, + 1844, + 159133, + 1713, + 18359, + 10358, + 4499, + 2065, + 3494, + 24978, + 15714, + 21803, + 2640, + 83069, + 1111, + 9442, + 34855, + 6095, + 6148, + 4877, + 2765, + 39663, + 42055, + 14011, + 27790, + 35248, + 16792, + 25306, + 71354, + 8800, + 38404, + 55090, + 1233, + 1701, + 73774, + 2146, + 70842, + 2939, + 67480, + 3929, + 1962, + 4619, + 82396, + 41190, + 12166, + 7785, + 6034, + 18924, + 22190, + 9445, + 8315, + 32574, + 10475, + 8782, + 28542, + 2119, + 1541, + 7525, + 132111, + 2166, + 7293, + 21157, + 63214, + 6977, + 3439, + 215698, + 6444, + 78019, + 101566, + 3602, + 13939, + 678, + 1303, + 9432, + 29683, + 13980, + 1004, + 26104, + 20479, + 16908, + 2331, + 1820, + 11731, + 13956, + 1320, + 14959, + 125420, + 1492, + 12947, + 56053, + 21405, + 1070, + 1747, + 139876, + 16655, + 65264, + 27024, + 36540, + 10095, + 146062, + 7348, + 2325, + 11595, + 1092, + 61003, + 8436, + 16104, + 4128, + 164011, + 1018, + 124096, + 613, + 1035, + 1857, + 18392, + 157325, + 38275, + 1852, + 114311, + 51621, + 19205, + 3392, + 18207, + 54943, + 7960, + 39151, + 18716, + 1815, + 1545, + 6423, + 2304, + 5525, + 48366, + 1165, + 10024, + 4003, + 8516, + 2318, + 43237, + 165742, + 9278, + 3402, + 9377, + 65770, + 13654, + 2032, + 2536, + 726, + 5509, + 3438, + 24136, + 22902, + 1602, + 3691, + 4428, + 11063, + 2836, + 675, + 1338, + 3135, + 135004, + 48958, + 25082, + 606, + 15123, + 19188, + 18309, + 32337, + 2311, + 114292, + 55378, + 5065, + 1929, + 1185, + 29634, + 9077, + 957, + 44017, + 533, + 13246, + 2836, + 33350, + 3918, + 29106, + 134620, + 1321, + 10192, + 688, + 19175, + 11720, + 192682, + 2965, + 14711, + 19780, + 2852, + 10203, + 7487, + 20819, + 20961, + 3463, + 6917, + 6176, + 59216, + 2892, + 1148, + 6482, + 24459, + 753, + 43469, + 7545, + 3749, + 13966, + 29547, + 46033, + 14885, + 31475, + 5167, + 38890, + 13011, + 5481, + 26049, + 7062, + 759, + 5114, + 22108, + 779, + 6690, + 188391, + 4364, + 12518, + 8081, + 12553, + 11242, + 7438, + 13099, + 922, + 4827, + 462, + 185850, + 4378, + 6746, + 9890, + 178434, + 40384, + 8543, + 14006, + 23657, + 3513, + 2862, + 564, + 11313, + 1691, + 43167, + 3876, + 3621, + 6349, + 786, + 29468, + 1857, + 9257, + 73125, + 11628, + 3384, + 29051, + 8814, + 2949, + 2498, + 50696, + 12526, + 1189, + 11032, + 63688, + 43353, + 881, + 6474, + 28731, + 564, + 1598, + 63475, + 27955, + 270913, + 2029, + 75782, + 2135, + 38176, + 1580, + 6641, + 1701, + 1043, + 17579, + 33245, + 1295, + 218303, + 79172, + 1539, + 27194, + 1979, + 1753, + 10841, + 27716, + 1621, + 26227, + 785, + 7882, + 16138, + 2326, + 24199, + 11564, + 67542, + 5078, + 16754, + 711, + 3930, + 9008, + 29160, + 33029, + 8578, + 12462, + 29298, + 2327, + 85345, + 6942, + 10950, + 3017, + 26248, + 3990, + 53157, + 2476, + 3181, + 4397, + 6428, + 17568, + 12152, + 11194, + 2179, + 1575, + 599, + 6171, + 69846, + 9644, + 46020, + 1121, + 30450, + 3074, + 152545, + 1225, + 16846, + 14558, + 8933, + 20823, + 1239, + 12685, + 56780, + 3222, + 104401, + 973, + 291476, + 193876, + 11830, + 28260, + 3094, + 2428, + 3033, + 1334, + 2007, + 9794, + 3917, + 8349, + 85782, + 2395, + 10040, + 24526, + 19591, + 24606, + 24603, + 35454, + 39204, + 30551, + 13450, + 48399, + 611, + 12438, + 6931, + 8881, + 5709, + 65209, + 3907, + 16487, + 12184, + 190973, + 26853, + 1470, + 6030, + 32435, + 3347, + 129297, + 9570, + 6593, + 19972, + 2423, + 72447, + 1033, + 35728, + 6625, + 787, + 6839, + 12453, + 1073, + 855, + 8302, + 40149, + 3351, + 27521, + 25617, + 982, + 3545, + 4583, + 74123, + 1042, + 2033, + 8095, + 267600, + 7822, + 2044, + 4720, + 155553, + 4639, + 1986, + 44612, + 134365, + 62483, + 1276, + 19270, + 10515, + 4667, + 35826, + 419, + 2046, + 76103, + 41315, + 41781, + 1031, + 30746, + 38893, + 51990, + 1343, + 7671, + 8459, + 42178, + 5632, + 12064, + 9454, + 86828, + 2499, + 9018, + 1157, + 14647, + 4660, + 2616, + 8920, + 3171, + 16406, + 7805, + 2455, + 5231, + 31745, + 5696, + 16411, + 17032, + 156814, + 6364, + 5651, + 8385, + 1606, + 27250, + 9823, + 116418, + 1747, + 24442, + 659, + 1328, + 1482, + 3940, + 37846, + 44803, + 8534, + 1975, + 19443, + 8670, + 1102, + 53488, + 20763, + 3919, + 2853, + 16159, + 3133, + 71337, + 862, + 609, + 643, + 0, + 35941, + 1682, + 82612, + 1046, + 10942, + 28953, + 7017, + 3305, + 37168, + 6958, + 58749, + 1647, + 15373, + 18590, + 9108, + 101687, + 24192, + 10238, + 3132, + 21464, + 111268, + 5468, + 6423, + 1591, + 108783, + 20040, + 1622, + 8620, + 8217, + 6579, + 2277, + 2777, + 5937, + 1538, + 32376, + 25673, + 5439, + 99309, + 1381, + 1957, + 168261, + 4221, + 12300, + 753, + 16931, + 39074, + 2891, + 13781, + 24154, + 14435, + 14445, + 1141, + 8280, + 13389, + 11880, + 28516, + 642, + 16862, + 24323, + 1875, + 5396, + 14519, + 9718, + 5112, + 92784, + 2479, + 70585, + 8043, + 1730, + 81411, + 13995, + 35794, + 55053, + 93806, + 217791, + 11671, + 3352, + 12160, + 2862, + 900, + 20291, + 5134, + 45430, + 130967, + 55624, + 1455, + 50839, + 4267, + 4027, + 46199, + 18144, + 2782, + 103911, + 140308, + 3449, + 1806, + 699, + 36065, + 19822, + 17173, + 27964, + 2690, + 138503, + 19307, + 3369, + 7634, + 11883, + 65172, + 14125, + 6239, + 854, + 7419, + 2131, + 17524, + 1359, + 64983, + 92416, + 27542, + 45512, + 138935, + 2909, + 9573, + 99775, + 10182, + 4593, + 5884, + 1881, + 6013, + 1941, + 62738, + 17333, + 6182, + 36422, + 64973, + 6782, + 2688, + 1580, + 859, + 3975, + 992, + 13096, + 44360, + 17466, + 4509, + 54629, + 2035, + 6649, + 45688, + 2338, + 3839, + 1273, + 45825, + 3319, + 63959, + 3657, + 5711, + 8040, + 35902, + 60371, + 20261, + 6072, + 6482, + 36596, + 4124, + 3782, + 33523, + 8159, + 34196, + 11584, + 4968, + 9571, + 61961, + 10186, + 10695, + 1180, + 85139, + 25498, + 593, + 2345, + 4611, + 49623, + 4587, + 3822, + 6105, + 1855, + 131015, + 45492, + 32360, + 1646, + 21853, + 57850, + 14155, + 21411, + 60397, + 9025, + 177124, + 32806, + 11241, + 6727, + 1045, + 216373, + 37719, + 107157, + 6170, + 12691, + 11695, + 820, + 8318, + 709, + 5282, + 8493, + 39673, + 9205, + 2958, + 38346, + 109290, + 5811, + 1625, + 3305, + 46874, + 3047, + 3146, + 26881, + 6333, + 30304, + 1201, + 6998, + 6117, + 938, + 30940, + 1848, + 1570, + 9301, + 2153, + 33427, + 1456, + 108419, + 57706, + 10118, + 71306, + 46003, + 8616, + 8480, + 103268, + 19993, + 26492, + 20839, + 13879, + 5810, + 1163, + 69351, + 3501, + 9455, + 3050, + 3645, + 658, + 69229, + 6085, + 5497, + 19719, + 110417, + 1613, + 8053, + 4633, + 3069, + 65716, + 82908, + 78645, + 49418, + 3436, + 223720, + 42268, + 4390, + 4896, + 1360, + 142786, + 31901, + 22183, + 5974, + 6436, + 136056, + 12673, + 769, + 25753, + 2486, + 14847, + 6788, + 3112, + 117094, + 1253, + 13955, + 11388, + 5445, + 3814, + 3484, + 66060, + 28794, + 6520, + 3083, + 4144, + 17847, + 1557, + 1028, + 9046, + 28229, + 38245, + 3754, + 1965, + 4116, + 6043, + 2135, + 47080, + 2336, + 7306, + 3534, + 1315, + 34112, + 262858, + 8937, + 14355, + 9460, + 24259, + 4132, + 35550, + 916, + 3244, + 98351, + 19817, + 778, + 48085, + 39894, + 5188, + 10522, + 30003, + 14718, + 725, + 8771, + 106615, + 12139, + 19971, + 50105, + 5640, + 32216, + 23952, + 4539, + 61556, + 4187, + 1282, + 18578, + 174827, + 6286, + 5929, + 6937, + 662, + 16977, + 48140, + 4292, + 2520, + 2671, + 35078, + 1678, + 17861, + 40666, + 3771, + 7776, + 14345, + 15939, + 7365, + 3846, + 831, + 6107, + 3179, + 8495, + 1871, + 35951, + 1330, + 4351, + 163855, + 2284, + 11598, + 26889, + 61625, + 36043, + 174087, + 1264, + 10426, + 14713, + 5228, + 1594, + 4472, + 472, + 537, + 4773, + 1650, + 40996, + 6268, + 81631, + 10315, + 44007, + 8671, + 6080, + 19223, + 44806, + 156758, + 2124, + 1168, + 4711, + 114472, + 55438, + 30381, + 3851, + 1453, + 25891, + 24868, + 5274, + 1604, + 2367, + 37311, + 27198, + 19579, + 5235, + 23563, + 47191, + 10431, + 5546, + 82320, + 1020, + 2719, + 131667, + 7058, + 1554, + 49080, + 1538, + 204476, + 17862, + 3060, + 54611, + 8939, + 1051, + 6816, + 10848, + 2478, + 16910, + 5669, + 165109, + 8195, + 81953, + 9579, + 5980, + 7533, + 50150, + 18309, + 7527, + 83592, + 16563, + 8666, + 24671, + 14914, + 37735, + 50267, + 3862, + 8237, + 1740, + 29848, + 63882, + 40956, + 1568, + 5677, + 68702, + 5919, + 225038, + 153599, + 21168, + 45355, + 1478, + 147841, + 4924, + 22922, + 6803, + 1456, + 10090, + 8175, + 106271, + 11617, + 9628, + 31807, + 25777, + 25461, + 1893, + 5299, + 4933, + 7117, + 2585, + 166565, + 15151, + 855, + 29315, + 1535, + 10935, + 12929, + 16124, + 22130, + 3716, + 165638, + 7210, + 9426, + 1439, + 212900, + 4132, + 1177, + 1464, + 5447, + 33577, + 4768, + 585, + 9680, + 3092, + 26329, + 21669, + 1424, + 276512, + 3096, + 1981, + 69572, + 4825, + 230949, + 4758, + 6980, + 3010, + 26781, + 23088, + 8110, + 766, + 4920, + 5155, + 61408, + 153688, + 108155, + 7509, + 110205, + 14861, + 7982, + 36957, + 959, + 7897, + 162501, + 3774, + 2259, + 53361, + 65212, + 831, + 62728, + 55234, + 2510, + 3357, + 5100, + 16338, + 8448, + 12964, + 8158, + 1788, + 3625, + 9357, + 68947, + 18104, + 21372, + 9031, + 877, + 97321, + 50854, + 813, + 9690, + 8106, + 4264, + 55719, + 7590, + 1771, + 12519, + 32038, + 27413, + 3498, + 51046, + 7231, + 40028, + 5419, + 2629, + 1245, + 903, + 12150, + 13068, + 109838, + 2967, + 647, + 6587, + 2595, + 43109, + 11027, + 307951, + 1756, + 21584, + 66429, + 8060, + 275047 + ] + } + ], + "top_n": [ + { + "data": "AgpUMjEzNA==", + "count": 4242373 + }, + { + "data": "AgpUMjY1Mg==", + "count": 192452 + }, + { + "data": "AgpUMTkxOQ==", + "count": 230644 + }, + { + "data": "AgpUMjEwOA==", + "count": 1863248 + }, + { + "data": "AgpUMTYxNg==", + "count": 277998 + }, + { + "data": "AgpUMjM3Nw==", + "count": 365715 + }, + { + "data": "AhBQMTMyMDA4Nw==", + "count": 383172 + }, + { + "data": "AgpUMjA3MQ==", + "count": 180759 + }, + { + "data": "AgpUMjMyNg==", + "count": 509388 + }, + { + "data": "AgpUMjI5Ng==", + "count": 1845058 + }, + { + "data": "AgpUMTc1OQ==", + "count": 265415 + }, + { + "data": "AgpUMTk4Ng==", + "count": 2024641 + }, + { + "data": "AhBQMTMzMTE0Ng==", + "count": 323934 + }, + { + "data": "AgpUMTk3OA==", + "count": 260046 + }, + { + "data": "AhBQMTE0NjAyMA==", + "count": 566012 + }, + { + "data": "AhBQMTE3NTY3NQ==", + "count": 408522 + }, + { + "data": "AgpUMjMxNQ==", + "count": 262842 + }, + { + "data": "AgpUMTY1Ng==", + "count": 287954 + }, + { + "data": "AgpUMzMwOQ==", + "count": 202080 + }, + { + "data": "AgpUMjg2MA==", + "count": 305493 + }, + { + "data": "AgpUMjcxMQ==", + "count": 287248 + }, + { + "data": "AgpUMTgzMQ==", + "count": 1247690 + }, + { + "data": "AgpUMjY3Mw==", + "count": 455423 + }, + { + "data": "AhBQMTI2NzE1MQ==", + "count": 387311 + }, + { + "data": "Ag5QODg0Mzc2", + "count": 274286 + }, + { + "data": "AgpUMjA5Nw==", + "count": 249413 + }, + { + "data": "AgpUMjQzMQ==", + "count": 289750 + }, + { + "data": "AhBQMTMwMTQwNA==", + "count": 570748 + }, + { + "data": "AhBQMTE0MjA1Mg==", + "count": 335599 + }, + { + "data": "AgpUMTQ5NQ==", + "count": 3059803 + }, + { + "data": "AgpUMTYwNQ==", + "count": 905982 + }, + { + "data": "AgpUMTU1MQ==", + "count": 217916 + }, + { + "data": "AgpUMTU4Ng==", + "count": 1515788 + }, + { + "data": "AgpUMTc1NA==", + "count": 529339 + }, + { + "data": "AgpUMjI2NQ==", + "count": 267658 + }, + { + "data": "AgpUMjMwMw==", + "count": 1566780 + }, + { + "data": "AgpUMjM1Nw==", + "count": 778283 + }, + { + "data": "AgpUMjI4MA==", + "count": 622771 + }, + { + "data": "Ag5RMTcwNjMz", + "count": 156060 + }, + { + "data": "AgpUMjczNQ==", + "count": 229183 + } + ], + "default_value": 0 + }, + "null_count": 0, + "tot_col_size": 688725305, + "last_update_version": 419082401529724998, + "correlation": 0.059051 + }, + "e": { + "histogram": { + "ndv": 4264448, + "buckets": [ + { + "count": 1118709, + "lower_bound": "MQ==", + "upper_bound": "MQ==", + "repeats": 1109873 + }, + { + "count": 1590665, + "lower_bound": "Mg==", + "upper_bound": "Mw==", + "repeats": 235973 + }, + { + "count": 1966481, + "lower_bound": "NA==", + "upper_bound": "Nw==", + "repeats": 61193 + }, + { + "count": 2359778, + "lower_bound": "OA==", + "upper_bound": "MTI=", + "repeats": 78671 + }, + { + "count": 2744334, + "lower_bound": "MTM=", + "upper_bound": "MTk=", + "repeats": 43715 + }, + { + "count": 3093931, + "lower_bound": "MjA=", + "upper_bound": "MzM=", + "repeats": 20 + }, + { + "count": 3443528, + "lower_bound": "MzQ=", + "upper_bound": "NTI=", + "repeats": 20 + }, + { + "count": 3793124, + "lower_bound": "NTM=", + "upper_bound": "Njg=", + "repeats": 26237 + }, + { + "count": 4151461, + "lower_bound": "NzA=", + "upper_bound": "ODY=", + "repeats": 8759 + }, + { + "count": 4518538, + "lower_bound": "ODc=", + "upper_bound": "MTA5", + "repeats": 17498 + }, + { + "count": 4894354, + "lower_bound": "MTEx", + "upper_bound": "MTM2", + "repeats": 26237 + }, + { + "count": 5252691, + "lower_bound": "MTM3", + "upper_bound": "MTY0", + "repeats": 17498 + }, + { + "count": 5602288, + "lower_bound": "MTY1", + "upper_bound": "MTg5", + "repeats": 20 + }, + { + "count": 5951884, + "lower_bound": "MTkw", + "upper_bound": "MjE1", + "repeats": 17498 + }, + { + "count": 6301481, + "lower_bound": "MjE2", + "upper_bound": "MjQ3", + "repeats": 20 + }, + { + "count": 6659818, + "lower_bound": "MjQ4", + "upper_bound": "Mjc1", + "repeats": 8759 + }, + { + "count": 7009415, + "lower_bound": "Mjc2", + "upper_bound": "MzA1", + "repeats": 20 + }, + { + "count": 7359011, + "lower_bound": "MzA2", + "upper_bound": "MzQz", + "repeats": 20 + }, + { + "count": 7708608, + "lower_bound": "MzQ0", + "upper_bound": "Mzgx", + "repeats": 20 + }, + { + "count": 8058205, + "lower_bound": "Mzgy", + "upper_bound": "NDI3", + "repeats": 20 + }, + { + "count": 8416542, + "lower_bound": "NDI4", + "upper_bound": "NDY5", + "repeats": 8759 + }, + { + "count": 8766138, + "lower_bound": "NDcw", + "upper_bound": "NTEz", + "repeats": 20 + }, + { + "count": 9115735, + "lower_bound": "NTE0", + "upper_bound": "NTU0", + "repeats": 20 + }, + { + "count": 9474072, + "lower_bound": "NTU1", + "upper_bound": "NjMw", + "repeats": 17498 + }, + { + "count": 9823669, + "lower_bound": "NjMx", + "upper_bound": "Njk5", + "repeats": 20 + }, + { + "count": 10173265, + "lower_bound": "NzAx", + "upper_bound": "NzY5", + "repeats": 20 + }, + { + "count": 10522862, + "lower_bound": "Nzcw", + "upper_bound": "ODM4", + "repeats": 20 + }, + { + "count": 10872459, + "lower_bound": "ODQ0", + "upper_bound": "OTMx", + "repeats": 8759 + }, + { + "count": 11222056, + "lower_bound": "OTMy", + "upper_bound": "MTAzMg==", + "repeats": 20 + }, + { + "count": 11571653, + "lower_bound": "MTAzMw==", + "upper_bound": "MTEyMw==", + "repeats": 8759 + }, + { + "count": 11921249, + "lower_bound": "MTEyNA==", + "upper_bound": "MTIxNA==", + "repeats": 20 + }, + { + "count": 12270846, + "lower_bound": "MTIxNw==", + "upper_bound": "MTMwNg==", + "repeats": 20 + }, + { + "count": 12629183, + "lower_bound": "MTMxNQ==", + "upper_bound": "MTQxMA==", + "repeats": 8759 + }, + { + "count": 12978780, + "lower_bound": "MTQxMQ==", + "upper_bound": "MTU3Ng==", + "repeats": 20 + }, + { + "count": 13337116, + "lower_bound": "MTU3Nw==", + "upper_bound": "MTY3Mg==", + "repeats": 8759 + }, + { + "count": 13686713, + "lower_bound": "MTY3Mw==", + "upper_bound": "MTc1Mw==", + "repeats": 20 + }, + { + "count": 14036310, + "lower_bound": "MTc2MQ==", + "upper_bound": "MTg2Mg==", + "repeats": 20 + }, + { + "count": 14394646, + "lower_bound": "MTg2Mw==", + "upper_bound": "MjAwOA==", + "repeats": 8759 + }, + { + "count": 14744243, + "lower_bound": "MjAxMQ==", + "upper_bound": "MjEzNg==", + "repeats": 20 + }, + { + "count": 15093840, + "lower_bound": "MjEzNw==", + "upper_bound": "MjI2MQ==", + "repeats": 20 + }, + { + "count": 15443437, + "lower_bound": "MjI2Mw==", + "upper_bound": "MjQwMw==", + "repeats": 20 + }, + { + "count": 15801773, + "lower_bound": "MjQwNg==", + "upper_bound": "MjUyOA==", + "repeats": 8759 + }, + { + "count": 16151370, + "lower_bound": "MjUzMQ==", + "upper_bound": "MjY2MQ==", + "repeats": 20 + }, + { + "count": 16500967, + "lower_bound": "MjY2NA==", + "upper_bound": "MjgyMA==", + "repeats": 20 + }, + { + "count": 16850564, + "lower_bound": "MjgzMQ==", + "upper_bound": "Mjk3OQ==", + "repeats": 20 + }, + { + "count": 17200160, + "lower_bound": "Mjk4OA==", + "upper_bound": "MzE2Ng==", + "repeats": 20 + }, + { + "count": 17549757, + "lower_bound": "MzE2OA==", + "upper_bound": "MzM5OA==", + "repeats": 20 + }, + { + "count": 17899354, + "lower_bound": "MzQwMQ==", + "upper_bound": "MzU3Ng==", + "repeats": 20 + }, + { + "count": 18248951, + "lower_bound": "MzU3OA==", + "upper_bound": "Mzc4Mg==", + "repeats": 20 + }, + { + "count": 18598548, + "lower_bound": "Mzc4OA==", + "upper_bound": "NDAwMQ==", + "repeats": 20 + }, + { + "count": 18948144, + "lower_bound": "NDAxMw==", + "upper_bound": "NDE4NA==", + "repeats": 20 + }, + { + "count": 19297741, + "lower_bound": "NDE4OA==", + "upper_bound": "NDM3Mg==", + "repeats": 8759 + }, + { + "count": 19647338, + "lower_bound": "NDM3Nw==", + "upper_bound": "NDU4OQ==", + "repeats": 20 + }, + { + "count": 19996935, + "lower_bound": "NDU5Mw==", + "upper_bound": "NDgyMQ==", + "repeats": 20 + }, + { + "count": 20346531, + "lower_bound": "NDgzNg==", + "upper_bound": "NTA0NQ==", + "repeats": 17498 + }, + { + "count": 20696128, + "lower_bound": "NTA1MA==", + "upper_bound": "NTMzOQ==", + "repeats": 20 + }, + { + "count": 21045725, + "lower_bound": "NTM0OQ==", + "upper_bound": "NTYxNg==", + "repeats": 20 + }, + { + "count": 21395322, + "lower_bound": "NTYxOA==", + "upper_bound": "NTg5MA==", + "repeats": 8759 + }, + { + "count": 21744918, + "lower_bound": "NTg5OQ==", + "upper_bound": "NjE3OQ==", + "repeats": 20 + }, + { + "count": 22094515, + "lower_bound": "NjE4MA==", + "upper_bound": "NjQwMQ==", + "repeats": 20 + }, + { + "count": 22444112, + "lower_bound": "NjQxNg==", + "upper_bound": "NjY1OQ==", + "repeats": 20 + }, + { + "count": 22793709, + "lower_bound": "NjY2Nw==", + "upper_bound": "Njk4Mw==", + "repeats": 20 + }, + { + "count": 23143306, + "lower_bound": "Njk4OQ==", + "upper_bound": "NzI3MQ==", + "repeats": 20 + }, + { + "count": 23492902, + "lower_bound": "NzI3OQ==", + "upper_bound": "NzYwNA==", + "repeats": 8759 + }, + { + "count": 23842499, + "lower_bound": "NzYxNQ==", + "upper_bound": "Nzk3Mw==", + "repeats": 20 + }, + { + "count": 24192096, + "lower_bound": "Nzk3NA==", + "upper_bound": "ODIxNQ==", + "repeats": 20 + }, + { + "count": 24541693, + "lower_bound": "ODIxNg==", + "upper_bound": "ODYzNQ==", + "repeats": 20 + }, + { + "count": 24891289, + "lower_bound": "ODYzNw==", + "upper_bound": "ODk5NA==", + "repeats": 20 + }, + { + "count": 25240886, + "lower_bound": "ODk5OA==", + "upper_bound": "OTMzNQ==", + "repeats": 20 + }, + { + "count": 25590483, + "lower_bound": "OTMzNg==", + "upper_bound": "OTY5NA==", + "repeats": 20 + }, + { + "count": 25940080, + "lower_bound": "OTcxMw==", + "upper_bound": "MTAwMDk=", + "repeats": 20 + }, + { + "count": 26289676, + "lower_bound": "MTAwMTM=", + "upper_bound": "MTAyODg=", + "repeats": 20 + }, + { + "count": 26639273, + "lower_bound": "MTAyOTc=", + "upper_bound": "MTA3MDc=", + "repeats": 20 + }, + { + "count": 26988870, + "lower_bound": "MTA3MTg=", + "upper_bound": "MTEwODA=", + "repeats": 8759 + }, + { + "count": 27338467, + "lower_bound": "MTEwODQ=", + "upper_bound": "MTE0MDg=", + "repeats": 20 + }, + { + "count": 27688064, + "lower_bound": "MTE0MjY=", + "upper_bound": "MTE3NzY=", + "repeats": 20 + }, + { + "count": 28037660, + "lower_bound": "MTE3ODQ=", + "upper_bound": "MTIxNTA=", + "repeats": 20 + }, + { + "count": 28387257, + "lower_bound": "MTIxNzY=", + "upper_bound": "MTI1MzE=", + "repeats": 20 + }, + { + "count": 28736854, + "lower_bound": "MTI1NTA=", + "upper_bound": "MTMwNzE=", + "repeats": 20 + }, + { + "count": 29086451, + "lower_bound": "MTMxMTY=", + "upper_bound": "MTM0NTk=", + "repeats": 20 + }, + { + "count": 29436047, + "lower_bound": "MTM0Njk=", + "upper_bound": "MTM5NDY=", + "repeats": 20 + }, + { + "count": 29785644, + "lower_bound": "MTM5NDk=", + "upper_bound": "MTQzMjE=", + "repeats": 20 + }, + { + "count": 30135241, + "lower_bound": "MTQzMjg=", + "upper_bound": "MTQ3NDk=", + "repeats": 20 + }, + { + "count": 30484838, + "lower_bound": "MTQ3NTQ=", + "upper_bound": "MTUxOTM=", + "repeats": 20 + }, + { + "count": 30834434, + "lower_bound": "MTUxOTY=", + "upper_bound": "MTU2Mjk=", + "repeats": 20 + }, + { + "count": 31184031, + "lower_bound": "MTU2NDA=", + "upper_bound": "MTYwMzU=", + "repeats": 20 + }, + { + "count": 31533628, + "lower_bound": "MTYwMzY=", + "upper_bound": "MTY0Mjk=", + "repeats": 20 + }, + { + "count": 31883225, + "lower_bound": "MTY0NTk=", + "upper_bound": "MTY5Mzc=", + "repeats": 20 + }, + { + "count": 32232822, + "lower_bound": "MTY5Njg=", + "upper_bound": "MTczMDU=", + "repeats": 20 + }, + { + "count": 32582418, + "lower_bound": "MTczNDc=", + "upper_bound": "MTc3OTk=", + "repeats": 20 + }, + { + "count": 32932015, + "lower_bound": "MTc4Mzk=", + "upper_bound": "MTgyNTg=", + "repeats": 20 + }, + { + "count": 33281612, + "lower_bound": "MTgyNjA=", + "upper_bound": "MTg2ODg=", + "repeats": 8759 + }, + { + "count": 33631209, + "lower_bound": "MTg3MDI=", + "upper_bound": "MTkxMzg=", + "repeats": 20 + }, + { + "count": 33980805, + "lower_bound": "MTkxNTI=", + "upper_bound": "MTk1OTM=", + "repeats": 20 + }, + { + "count": 34330402, + "lower_bound": "MTk1OTc=", + "upper_bound": "MjAyMTU=", + "repeats": 20 + }, + { + "count": 34679999, + "lower_bound": "MjAyMzY=", + "upper_bound": "MjA5NDU=", + "repeats": 20 + }, + { + "count": 35029596, + "lower_bound": "MjA5NjM=", + "upper_bound": "MjE1NTQ=", + "repeats": 20 + }, + { + "count": 35379192, + "lower_bound": "MjE2MDI=", + "upper_bound": "MjIxMjY=", + "repeats": 20 + }, + { + "count": 35728789, + "lower_bound": "MjIxNjk=", + "upper_bound": "MjI3NjU=", + "repeats": 20 + }, + { + "count": 36078386, + "lower_bound": "MjI3NzA=", + "upper_bound": "MjMyNDQ=", + "repeats": 20 + }, + { + "count": 36427983, + "lower_bound": "MjMyNjg=", + "upper_bound": "MjM4NDU=", + "repeats": 20 + }, + { + "count": 36777579, + "lower_bound": "MjM4NjE=", + "upper_bound": "MjQ0ODk=", + "repeats": 20 + }, + { + "count": 37127176, + "lower_bound": "MjQ1MjA=", + "upper_bound": "MjUzNTY=", + "repeats": 20 + }, + { + "count": 37476773, + "lower_bound": "MjUzODc=", + "upper_bound": "MjU4OTc=", + "repeats": 20 + }, + { + "count": 37826370, + "lower_bound": "MjU5NTk=", + "upper_bound": "MjY1Mzg=", + "repeats": 20 + }, + { + "count": 38175967, + "lower_bound": "MjY1NTU=", + "upper_bound": "MjcxNTk=", + "repeats": 20 + }, + { + "count": 38525563, + "lower_bound": "MjcxODA=", + "upper_bound": "Mjc2Nzk=", + "repeats": 20 + }, + { + "count": 38875160, + "lower_bound": "Mjc2ODM=", + "upper_bound": "MjgyNzE=", + "repeats": 20 + }, + { + "count": 39224757, + "lower_bound": "MjgyNzc=", + "upper_bound": "MjkwNzc=", + "repeats": 20 + }, + { + "count": 39574354, + "lower_bound": "MjkwODU=", + "upper_bound": "Mjk3Njk=", + "repeats": 20 + }, + { + "count": 39923950, + "lower_bound": "Mjk3ODA=", + "upper_bound": "MzA1MDc=", + "repeats": 20 + }, + { + "count": 40273547, + "lower_bound": "MzA1MTI=", + "upper_bound": "MzEwNzM=", + "repeats": 20 + }, + { + "count": 40623144, + "lower_bound": "MzEwOTc=", + "upper_bound": "MzE4NDI=", + "repeats": 20 + }, + { + "count": 40972741, + "lower_bound": "MzE4NzI=", + "upper_bound": "MzI2MTk=", + "repeats": 20 + }, + { + "count": 41322337, + "lower_bound": "MzI2MjI=", + "upper_bound": "MzM0MzM=", + "repeats": 20 + }, + { + "count": 41671934, + "lower_bound": "MzM0Mzg=", + "upper_bound": "MzQyOTQ=", + "repeats": 20 + }, + { + "count": 42021531, + "lower_bound": "MzQzMzk=", + "upper_bound": "MzUxNTE=", + "repeats": 20 + }, + { + "count": 42371128, + "lower_bound": "MzUxNjU=", + "upper_bound": "MzU5MDE=", + "repeats": 20 + }, + { + "count": 42720725, + "lower_bound": "MzU5MDg=", + "upper_bound": "MzY3MDA=", + "repeats": 20 + }, + { + "count": 43070321, + "lower_bound": "MzY3MTk=", + "upper_bound": "Mzc3NDU=", + "repeats": 20 + }, + { + "count": 43419918, + "lower_bound": "Mzc4MTM=", + "upper_bound": "Mzg2ODk=", + "repeats": 20 + }, + { + "count": 43769515, + "lower_bound": "Mzg2OTA=", + "upper_bound": "Mzk4Mjg=", + "repeats": 20 + }, + { + "count": 44119112, + "lower_bound": "Mzk5NTg=", + "upper_bound": "NDA1OTc=", + "repeats": 20 + }, + { + "count": 44477448, + "lower_bound": "NDA1OTk=", + "upper_bound": "NDE2MzA=", + "repeats": 8759 + }, + { + "count": 44827045, + "lower_bound": "NDE2NzY=", + "upper_bound": "NDIzNzk=", + "repeats": 20 + }, + { + "count": 45176642, + "lower_bound": "NDIzOTg=", + "upper_bound": "NDM1Mjg=", + "repeats": 20 + }, + { + "count": 45526239, + "lower_bound": "NDM1Mjk=", + "upper_bound": "NDQzNzQ=", + "repeats": 20 + }, + { + "count": 45875835, + "lower_bound": "NDQ0MDg=", + "upper_bound": "NDUzMzE=", + "repeats": 20 + }, + { + "count": 46225432, + "lower_bound": "NDUzNzA=", + "upper_bound": "NDYzODU=", + "repeats": 20 + }, + { + "count": 46575029, + "lower_bound": "NDYzOTQ=", + "upper_bound": "NDc0NDM=", + "repeats": 20 + }, + { + "count": 46924626, + "lower_bound": "NDc0NDQ=", + "upper_bound": "NDgwNTU=", + "repeats": 20 + }, + { + "count": 47274222, + "lower_bound": "NDgwNzU=", + "upper_bound": "NDg5MjA=", + "repeats": 20 + }, + { + "count": 47623819, + "lower_bound": "NDg5Mzk=", + "upper_bound": "NTAxMjQ=", + "repeats": 20 + }, + { + "count": 47973416, + "lower_bound": "NTAyMDQ=", + "upper_bound": "NTEzMzk=", + "repeats": 20 + }, + { + "count": 48323013, + "lower_bound": "NTEzOTM=", + "upper_bound": "NTIyMzg=", + "repeats": 8759 + }, + { + "count": 48672610, + "lower_bound": "NTIyNDQ=", + "upper_bound": "NTM0MTg=", + "repeats": 20 + }, + { + "count": 49022206, + "lower_bound": "NTM0NjA=", + "upper_bound": "NTQ3MTg=", + "repeats": 20 + }, + { + "count": 49371803, + "lower_bound": "NTQ3ODA=", + "upper_bound": "NTYwMzc=", + "repeats": 20 + }, + { + "count": 49721400, + "lower_bound": "NTYwNTY=", + "upper_bound": "NTcyNDU=", + "repeats": 20 + }, + { + "count": 50070997, + "lower_bound": "NTcyNDg=", + "upper_bound": "NTg2NzA=", + "repeats": 20 + }, + { + "count": 50420593, + "lower_bound": "NTg2ODg=", + "upper_bound": "NTk5NzE=", + "repeats": 20 + }, + { + "count": 50770190, + "lower_bound": "NTk5OTc=", + "upper_bound": "NjEyNjU=", + "repeats": 20 + }, + { + "count": 51119787, + "lower_bound": "NjEyNjg=", + "upper_bound": "NjIyODU=", + "repeats": 20 + }, + { + "count": 51469384, + "lower_bound": "NjIyOTE=", + "upper_bound": "NjM2NTM=", + "repeats": 20 + }, + { + "count": 51818980, + "lower_bound": "NjM2Nzc=", + "upper_bound": "NjQ3MDQ=", + "repeats": 20 + }, + { + "count": 52168577, + "lower_bound": "NjQ3NTU=", + "upper_bound": "NjY4Mzc=", + "repeats": 20 + }, + { + "count": 52518174, + "lower_bound": "NjY4NTE=", + "upper_bound": "NjgyMDk=", + "repeats": 20 + }, + { + "count": 52867771, + "lower_bound": "NjgyNTA=", + "upper_bound": "Njk2Njg=", + "repeats": 20 + }, + { + "count": 53217368, + "lower_bound": "Njk4MDU=", + "upper_bound": "NzEwNTE=", + "repeats": 20 + }, + { + "count": 53566964, + "lower_bound": "NzExMDI=", + "upper_bound": "NzI3Nzc=", + "repeats": 20 + }, + { + "count": 53916561, + "lower_bound": "NzI5NDA=", + "upper_bound": "NzQ2OTE=", + "repeats": 20 + }, + { + "count": 54266158, + "lower_bound": "NzQ3MTk=", + "upper_bound": "NzYzOTI=", + "repeats": 20 + }, + { + "count": 54615755, + "lower_bound": "NzYzOTk=", + "upper_bound": "Nzc5ODE=", + "repeats": 20 + }, + { + "count": 54965351, + "lower_bound": "NzgxMjA=", + "upper_bound": "Nzk2Njc=", + "repeats": 20 + }, + { + "count": 55314948, + "lower_bound": "Nzk2ODU=", + "upper_bound": "ODE1MDI=", + "repeats": 20 + }, + { + "count": 55664545, + "lower_bound": "ODE1MTY=", + "upper_bound": "ODMwMDA=", + "repeats": 20 + }, + { + "count": 56014142, + "lower_bound": "ODMwNDg=", + "upper_bound": "ODQ5NzA=", + "repeats": 20 + }, + { + "count": 56363738, + "lower_bound": "ODUwNzU=", + "upper_bound": "ODY2NTE=", + "repeats": 20 + }, + { + "count": 56713335, + "lower_bound": "ODY2NTM=", + "upper_bound": "ODgyNTA=", + "repeats": 20 + }, + { + "count": 57062932, + "lower_bound": "ODgzMjg=", + "upper_bound": "ODk4NTg=", + "repeats": 20 + }, + { + "count": 57412529, + "lower_bound": "ODk5NDI=", + "upper_bound": "OTE3NjU=", + "repeats": 20 + }, + { + "count": 57762125, + "lower_bound": "OTE3Njc=", + "upper_bound": "OTM4MTA=", + "repeats": 20 + }, + { + "count": 58120462, + "lower_bound": "OTM5MDU=", + "upper_bound": "OTU4Mzc=", + "repeats": 8759 + }, + { + "count": 58470059, + "lower_bound": "OTU4Mzg=", + "upper_bound": "OTg1MjE=", + "repeats": 20 + }, + { + "count": 58819656, + "lower_bound": "OTg3ODE=", + "upper_bound": "MTAxMDI4", + "repeats": 20 + }, + { + "count": 59169252, + "lower_bound": "MTAxMTUy", + "upper_bound": "MTAyOTEz", + "repeats": 20 + }, + { + "count": 59518849, + "lower_bound": "MTAyOTU1", + "upper_bound": "MTA1Mzg3", + "repeats": 20 + }, + { + "count": 59868446, + "lower_bound": "MTA1NDI0", + "upper_bound": "MTA3MDg3", + "repeats": 20 + }, + { + "count": 60218043, + "lower_bound": "MTA3MDk5", + "upper_bound": "MTA4ODA1", + "repeats": 20 + }, + { + "count": 60567640, + "lower_bound": "MTA4ODIx", + "upper_bound": "MTExMDAx", + "repeats": 20 + }, + { + "count": 60917236, + "lower_bound": "MTExMDEy", + "upper_bound": "MTEzNTEy", + "repeats": 20 + }, + { + "count": 61266833, + "lower_bound": "MTEzNTM5", + "upper_bound": "MTE1NjU2", + "repeats": 20 + }, + { + "count": 61616430, + "lower_bound": "MTE1Njg2", + "upper_bound": "MTE4MzA2", + "repeats": 20 + }, + { + "count": 61966027, + "lower_bound": "MTE4MzA4", + "upper_bound": "MTIwNjg0", + "repeats": 20 + }, + { + "count": 62315623, + "lower_bound": "MTIwNzMx", + "upper_bound": "MTIzMzg4", + "repeats": 20 + }, + { + "count": 62665220, + "lower_bound": "MTIzNDMy", + "upper_bound": "MTI2NDIz", + "repeats": 20 + }, + { + "count": 63014817, + "lower_bound": "MTI2NjE4", + "upper_bound": "MTI4OTIx", + "repeats": 20 + }, + { + "count": 63364414, + "lower_bound": "MTI5MDc5", + "upper_bound": "MTMyMjM3", + "repeats": 20 + }, + { + "count": 63714010, + "lower_bound": "MTMyMjY5", + "upper_bound": "MTM2MDk1", + "repeats": 20 + }, + { + "count": 64063607, + "lower_bound": "MTM2MTE2", + "upper_bound": "MTM5NDA2", + "repeats": 20 + }, + { + "count": 64413204, + "lower_bound": "MTM5NDY3", + "upper_bound": "MTQyNzkw", + "repeats": 20 + }, + { + "count": 64762801, + "lower_bound": "MTQyNzk2", + "upper_bound": "MTQ2NDM4", + "repeats": 20 + }, + { + "count": 65112398, + "lower_bound": "MTQ2NTU4", + "upper_bound": "MTUwNTUx", + "repeats": 20 + }, + { + "count": 65461994, + "lower_bound": "MTUwNTY3", + "upper_bound": "MTUzNTM2", + "repeats": 20 + }, + { + "count": 65811591, + "lower_bound": "MTUzNTYy", + "upper_bound": "MTU3MjIx", + "repeats": 20 + }, + { + "count": 66161188, + "lower_bound": "MTU3NjQ1", + "upper_bound": "MTYxMTIz", + "repeats": 20 + }, + { + "count": 66510785, + "lower_bound": "MTYxMjYz", + "upper_bound": "MTY2MjMz", + "repeats": 20 + }, + { + "count": 66860381, + "lower_bound": "MTY2MzEx", + "upper_bound": "MTcwODgx", + "repeats": 20 + }, + { + "count": 67209978, + "lower_bound": "MTcxMDI4", + "upper_bound": "MTc2NzQy", + "repeats": 20 + }, + { + "count": 67559575, + "lower_bound": "MTc3MDY2", + "upper_bound": "MTgyNTk0", + "repeats": 20 + }, + { + "count": 67909172, + "lower_bound": "MTgzMDM5", + "upper_bound": "MTkwNDAw", + "repeats": 20 + }, + { + "count": 68258768, + "lower_bound": "MTkwOTUz", + "upper_bound": "MTk4NzU4", + "repeats": 20 + }, + { + "count": 68608365, + "lower_bound": "MTk4ODI2", + "upper_bound": "MjA1MTYz", + "repeats": 20 + }, + { + "count": 68957962, + "lower_bound": "MjA1Mjc2", + "upper_bound": "MjExNjAz", + "repeats": 20 + }, + { + "count": 69307559, + "lower_bound": "MjExODMw", + "upper_bound": "MjE2NTE5", + "repeats": 20 + }, + { + "count": 69657156, + "lower_bound": "MjE2NzQz", + "upper_bound": "MjI2MDg3", + "repeats": 20 + }, + { + "count": 70006752, + "lower_bound": "MjI2MjQy", + "upper_bound": "MjMyNjIy", + "repeats": 20 + }, + { + "count": 70356349, + "lower_bound": "MjMyOTc3", + "upper_bound": "MjQxMTQw", + "repeats": 20 + }, + { + "count": 70705946, + "lower_bound": "MjQxMzA0", + "upper_bound": "MjUwNTQ1", + "repeats": 20 + }, + { + "count": 71055543, + "lower_bound": "MjUwNjAy", + "upper_bound": "MjU5Mzg0", + "repeats": 20 + }, + { + "count": 71405139, + "lower_bound": "MjU5NDg3", + "upper_bound": "MjcwODg3", + "repeats": 20 + }, + { + "count": 71754736, + "lower_bound": "MjcxMjIz", + "upper_bound": "Mjc5OTU5", + "repeats": 20 + }, + { + "count": 72104333, + "lower_bound": "MjgwMTYx", + "upper_bound": "Mjk0OTgy", + "repeats": 20 + }, + { + "count": 72453930, + "lower_bound": "Mjk1MTcz", + "upper_bound": "MzA4Mzkx", + "repeats": 20 + }, + { + "count": 72803526, + "lower_bound": "MzA4NDgz", + "upper_bound": "MzI0ODM3", + "repeats": 20 + }, + { + "count": 73153123, + "lower_bound": "MzI0OTM5", + "upper_bound": "MzQyMjU4", + "repeats": 20 + }, + { + "count": 73502720, + "lower_bound": "MzQyNjU3", + "upper_bound": "MzU2ODkw", + "repeats": 20 + }, + { + "count": 73852317, + "lower_bound": "MzU3MDYy", + "upper_bound": "Mzc3MTI3", + "repeats": 20 + }, + { + "count": 74201914, + "lower_bound": "Mzc3ODIw", + "upper_bound": "MzkxMzE0", + "repeats": 20 + }, + { + "count": 74551510, + "lower_bound": "MzkxNjE1", + "upper_bound": "NDA3NjE0", + "repeats": 20 + }, + { + "count": 74901107, + "lower_bound": "NDA3NjMy", + "upper_bound": "NDI3ODM5", + "repeats": 20 + }, + { + "count": 75250704, + "lower_bound": "NDI4NzIw", + "upper_bound": "NDQ4MDQ1", + "repeats": 20 + }, + { + "count": 75600301, + "lower_bound": "NDUwNjAz", + "upper_bound": "NDc3MzUw", + "repeats": 20 + }, + { + "count": 75949897, + "lower_bound": "NDc3NDQx", + "upper_bound": "NTExMzQ1", + "repeats": 20 + }, + { + "count": 76299494, + "lower_bound": "NTExNDkx", + "upper_bound": "NTMzOTk4", + "repeats": 20 + }, + { + "count": 76649091, + "lower_bound": "NTM0MDEw", + "upper_bound": "NTU3MjQz", + "repeats": 20 + }, + { + "count": 76998688, + "lower_bound": "NTU3ODAx", + "upper_bound": "NTkwNDc4", + "repeats": 20 + }, + { + "count": 77348284, + "lower_bound": "NTkwOTY3", + "upper_bound": "NjE1OTI0", + "repeats": 20 + }, + { + "count": 77697881, + "lower_bound": "NjE2Njk5", + "upper_bound": "NjUzMjIz", + "repeats": 20 + }, + { + "count": 78047478, + "lower_bound": "NjUzNjIx", + "upper_bound": "NjkwOTEx", + "repeats": 20 + }, + { + "count": 78397075, + "lower_bound": "NjkzMDk4", + "upper_bound": "NzMzMDk2", + "repeats": 20 + }, + { + "count": 78746671, + "lower_bound": "NzM1MjI0", + "upper_bound": "NzczNDA0", + "repeats": 20 + }, + { + "count": 79096268, + "lower_bound": "NzczNjM3", + "upper_bound": "ODM1NzYy", + "repeats": 20 + }, + { + "count": 79445865, + "lower_bound": "ODM2MDgy", + "upper_bound": "ODg0MTk3", + "repeats": 20 + }, + { + "count": 79795462, + "lower_bound": "ODg0OTUz", + "upper_bound": "OTQ1Mjg1", + "repeats": 20 + }, + { + "count": 80145059, + "lower_bound": "OTQ1Mjg3", + "upper_bound": "OTk0OTQ4", + "repeats": 20 + }, + { + "count": 80494655, + "lower_bound": "OTk2NzY1", + "upper_bound": "MTAzOTAzNA==", + "repeats": 20 + }, + { + "count": 80844252, + "lower_bound": "MTAzOTM5Nw==", + "upper_bound": "MTA5NzAwOQ==", + "repeats": 20 + }, + { + "count": 81193849, + "lower_bound": "MTA5Nzc3OA==", + "upper_bound": "MTE1MjAxNg==", + "repeats": 20 + }, + { + "count": 81543446, + "lower_bound": "MTE1MzA1Mg==", + "upper_bound": "MTIwNTQ3Mg==", + "repeats": 20 + }, + { + "count": 81893042, + "lower_bound": "MTIwNjI4NA==", + "upper_bound": "MTI0OTEyNg==", + "repeats": 20 + }, + { + "count": 82242639, + "lower_bound": "MTI1MTY2MA==", + "upper_bound": "MTMyMDcxMQ==", + "repeats": 20 + }, + { + "count": 82592236, + "lower_bound": "MTMyMDk4Mw==", + "upper_bound": "MTM2NjkwOA==", + "repeats": 20 + }, + { + "count": 82941833, + "lower_bound": "MTM2Nzc5OQ==", + "upper_bound": "MTQyMDg2Nw==", + "repeats": 20 + }, + { + "count": 83291429, + "lower_bound": "MTQyMTEyNA==", + "upper_bound": "MTQ3NjAzNg==", + "repeats": 20 + }, + { + "count": 83641026, + "lower_bound": "MTQ3NzEwMg==", + "upper_bound": "MTUyODUxMg==", + "repeats": 20 + }, + { + "count": 83990623, + "lower_bound": "MTUyOTQ4OA==", + "upper_bound": "MTYyMDg1Mw==", + "repeats": 20 + }, + { + "count": 84340220, + "lower_bound": "MTYyMTk2Nw==", + "upper_bound": "MTcwMzM4Nw==", + "repeats": 20 + }, + { + "count": 84689817, + "lower_bound": "MTcxMTc2Nw==", + "upper_bound": "MTgxOTY3Mg==", + "repeats": 20 + }, + { + "count": 85039413, + "lower_bound": "MTgyMjQxMA==", + "upper_bound": "MTkxMjUyOQ==", + "repeats": 20 + }, + { + "count": 85389010, + "lower_bound": "MTkxMjg5OQ==", + "upper_bound": "MjE5ODA4MA==", + "repeats": 20 + }, + { + "count": 85738607, + "lower_bound": "MjIwNTkwMQ==", + "upper_bound": "MjUzNTY5MQ==", + "repeats": 20 + }, + { + "count": 86088204, + "lower_bound": "MjU0NjMxMg==", + "upper_bound": "Mjg2MzM1NA==", + "repeats": 20 + }, + { + "count": 86437800, + "lower_bound": "MjkwMzIyNA==", + "upper_bound": "MzI0NDQxNA==", + "repeats": 20 + }, + { + "count": 86787397, + "lower_bound": "MzI2NzI5MA==", + "upper_bound": "MzU5OTA0Mg==", + "repeats": 20 + }, + { + "count": 87136994, + "lower_bound": "MzYxMTgzOA==", + "upper_bound": "Mzk0NDE0Mg==", + "repeats": 20 + }, + { + "count": 87399192, + "lower_bound": "Mzk1MTg5Nw==", + "upper_bound": "NDIyNTYxNQ==", + "repeats": 20 + } + ] + }, + "cm_sketch": { + "rows": [ + { + "counters": [ + 34369, + 37996, + 37649, + 36983, + 37175, + 46973, + 40106, + 45874, + 30448, + 38932, + 46568, + 36438, + 36476, + 45829, + 33221, + 48051, + 46166, + 37653, + 41324, + 31656, + 36087, + 41867, + 39704, + 45794, + 55984, + 37698, + 42657, + 38277, + 41421, + 38158, + 35734, + 40221, + 31583, + 26399, + 39772, + 37170, + 37639, + 34755, + 28988, + 55983, + 45798, + 43614, + 52651, + 46922, + 37414, + 36893, + 48335, + 38676, + 28496, + 40293, + 42382, + 31166, + 34358, + 61030, + 39535, + 34876, + 48836, + 54847, + 34443, + 41835, + 31717, + 50315, + 41641, + 42732, + 40527, + 42640, + 37426, + 48543, + 40745, + 46318, + 41599, + 33961, + 44884, + 45739, + 39260, + 46117, + 31019, + 38148, + 30635, + 44513, + 40472, + 33241, + 36879, + 35510, + 52300, + 46824, + 32765, + 68839, + 37017, + 37429, + 38878, + 41236, + 39584, + 36921, + 48473, + 33359, + 39556, + 43333, + 37432, + 34731, + 39853, + 54870, + 46884, + 45212, + 42898, + 32037, + 40388, + 41217, + 42812, + 38292, + 36909, + 55170, + 39217, + 39554, + 44862, + 46075, + 46904, + 45241, + 41907, + 43354, + 43941, + 39405, + 35414, + 43466, + 40597, + 41382, + 40984, + 32398, + 41214, + 43383, + 38601, + 43492, + 44660, + 37966, + 32901, + 40106, + 47933, + 35675, + 71476, + 56873, + 32289, + 37786, + 34337, + 30112, + 42653, + 36822, + 33981, + 43794, + 29867, + 43437, + 38624, + 36468, + 34001, + 45458, + 44641, + 43636, + 56936, + 54471, + 33305, + 39615, + 41516, + 42499, + 44693, + 55957, + 36023, + 35089, + 49701, + 38066, + 32097, + 35296, + 35722, + 39110, + 41169, + 29932, + 51952, + 44569, + 37704, + 43702, + 43615, + 43682, + 44837, + 41963, + 38092, + 38264, + 38835, + 43472, + 39441, + 49134, + 40895, + 42796, + 55085, + 41176, + 40760, + 34146, + 34008, + 39504, + 41058, + 33950, + 43339, + 42636, + 38305, + 42782, + 34289, + 45530, + 35938, + 36805, + 37519, + 31434, + 49871, + 38457, + 31395, + 37333, + 36045, + 31982, + 39873, + 37875, + 38956, + 41318, + 52238, + 50052, + 50042, + 36004, + 44959, + 36672, + 39918, + 44056, + 28075, + 47036, + 41706, + 36503, + 33709, + 35364, + 43216, + 40162, + 39259, + 38058, + 47146, + 35288, + 27560, + 38179, + 44290, + 31465, + 46195, + 41290, + 38686, + 46560, + 44392, + 31836, + 30653, + 34353, + 53192, + 35250, + 48466, + 35985, + 37937, + 38462, + 38134, + 47804, + 43596, + 43165, + 43169, + 48861, + 41548, + 36564, + 42765, + 50928, + 34322, + 47629, + 38549, + 57261, + 61296, + 54301, + 35541, + 36339, + 40977, + 31044, + 37678, + 43815, + 31833, + 37509, + 40195, + 40085, + 33514, + 38926, + 42085, + 43714, + 39805, + 27854, + 39448, + 39489, + 38410, + 37810, + 49453, + 42696, + 38966, + 42196, + 46806, + 35467, + 30374, + 47883, + 41402, + 47718, + 42512, + 41885, + 34533, + 58199, + 32578, + 33753, + 49851, + 56949, + 43162, + 30628, + 34652, + 41953, + 34737, + 41995, + 34680, + 36700, + 41087, + 71591, + 39435, + 54364, + 46555, + 32625, + 59795, + 41493, + 28863, + 38681, + 32433, + 39122, + 44134, + 36205, + 34076, + 38534, + 49944, + 42196, + 59020, + 45281, + 38183, + 39194, + 36272, + 38573, + 40826, + 48922, + 27916, + 34354, + 34341, + 33839, + 36379, + 38045, + 63680, + 61411, + 31950, + 33399, + 46901, + 40814, + 30220, + 69108, + 44092, + 44848, + 38313, + 35649, + 33728, + 32612, + 40980, + 41041, + 39487, + 36693, + 41034, + 42913, + 37334, + 52305, + 32640, + 35386, + 40556, + 43992, + 38737, + 43199, + 41100, + 67283, + 39859, + 46873, + 36596, + 48425, + 29556, + 43279, + 58266, + 42022, + 46434, + 37424, + 31421, + 42923, + 32246, + 38051, + 35936, + 41577, + 33989, + 38337, + 31006, + 43553, + 39268, + 37570, + 35805, + 38051, + 36317, + 37970, + 40706, + 36945, + 33413, + 43768, + 37399, + 38866, + 29478, + 35385, + 40503, + 38524, + 42619, + 34622, + 34102, + 75487, + 35449, + 29102, + 39001, + 29427, + 31405, + 44153, + 34165, + 49176, + 49158, + 46036, + 37545, + 61908, + 41772, + 40658, + 53633, + 31606, + 30170, + 41986, + 64626, + 49298, + 55377, + 33768, + 38336, + 34343, + 31032, + 40121, + 33606, + 39384, + 33383, + 37618, + 33101, + 41969, + 36348, + 41628, + 40926, + 46052, + 39979, + 33455, + 42045, + 41943, + 30981, + 46857, + 53925, + 33251, + 33833, + 32999, + 41286, + 41068, + 34972, + 37855, + 43834, + 53143, + 47573, + 50050, + 31602, + 73811, + 40234, + 39366, + 34156, + 39912, + 39300, + 33869, + 68015, + 48179, + 43199, + 50718, + 56470, + 36335, + 36804, + 37342, + 48958, + 51658, + 32453, + 46361, + 47403, + 40373, + 41174, + 29313, + 38115, + 31817, + 39968, + 34915, + 32752, + 33592, + 42320, + 34409, + 34145, + 33304, + 42865, + 36849, + 40604, + 33071, + 38824, + 26182, + 40662, + 39871, + 38657, + 52606, + 41080, + 65341, + 46113, + 36077, + 36303, + 36096, + 41491, + 41848, + 30788, + 42492, + 47119, + 39918, + 58503, + 32588, + 68513, + 54673, + 31291, + 45584, + 42781, + 33528, + 38108, + 35533, + 38260, + 39956, + 38879, + 39950, + 49647, + 44227, + 38031, + 60172, + 36685, + 47635, + 38602, + 35547, + 32841, + 40313, + 37066, + 39597, + 38373, + 34393, + 53129, + 44151, + 27959, + 33629, + 32540, + 38866, + 58766, + 45852, + 40800, + 48109, + 47184, + 32991, + 56847, + 34681, + 38053, + 45677, + 43455, + 33463, + 39645, + 38187, + 40291, + 32290, + 39776, + 35811, + 31417, + 40063, + 44439, + 36658, + 43131, + 41446, + 39397, + 42527, + 45160, + 27542, + 68918, + 48813, + 44378, + 41089, + 34521, + 46823, + 42153, + 29670, + 38828, + 49621, + 46042, + 39532, + 43754, + 39038, + 31612, + 44921, + 57492, + 37542, + 40804, + 60374, + 44622, + 49739, + 31803, + 31317, + 49763, + 32136, + 39139, + 59759, + 38926, + 27505, + 50199, + 42473, + 31483, + 37583, + 41393, + 42450, + 42060, + 35199, + 33707, + 44523, + 34204, + 33047, + 43224, + 58762, + 58266, + 39964, + 39307, + 38040, + 43783, + 37445, + 40013, + 43970, + 28305, + 41008, + 34663, + 43358, + 36894, + 38209, + 46229, + 42648, + 45922, + 52206, + 54027, + 48495, + 35755, + 34588, + 38590, + 57485, + 47403, + 42852, + 27396, + 36591, + 40907, + 32444, + 40736, + 47096, + 49275, + 37650, + 35901, + 34462, + 36193, + 32197, + 56180, + 42534, + 66453, + 39212, + 49103, + 37577, + 36165, + 45970, + 34402, + 43202, + 72768, + 33631, + 36522, + 35100, + 35177, + 31887, + 39804, + 34957, + 40419, + 36591, + 38010, + 43252, + 40766, + 32864, + 41396, + 61568, + 43364, + 34109, + 35023, + 43598, + 28741, + 43294, + 34451, + 40640, + 38136, + 33734, + 39113, + 53444, + 45113, + 37773, + 34507, + 38431, + 44031, + 35830, + 43895, + 36545, + 44922, + 49193, + 55533, + 37392, + 47009, + 49510, + 53230, + 40553, + 35982, + 33390, + 39581, + 41217, + 41327, + 39797, + 34942, + 47963, + 35332, + 34336, + 52980, + 36236, + 35761, + 44957, + 42630, + 45496, + 36660, + 46976, + 62640, + 37623, + 42642, + 39135, + 32398, + 42129, + 41876, + 54365, + 48430, + 49459, + 44279, + 31242, + 42912, + 43275, + 39362, + 29770, + 36142, + 34461, + 32259, + 43266, + 43679, + 38816, + 39133, + 41973, + 42683, + 36525, + 41723, + 43545, + 39029, + 65826, + 44247, + 48081, + 25756, + 57529, + 42470, + 35364, + 41234, + 39896, + 46763, + 46346, + 48981, + 40532, + 39354, + 48105, + 44675, + 55045, + 38182, + 33988, + 34741, + 39866, + 52099, + 32574, + 40892, + 33011, + 43601, + 37064, + 38439, + 51933, + 30518, + 43222, + 32690, + 43570, + 43290, + 39386, + 31479, + 37308, + 39751, + 40247, + 40921, + 32972, + 31627, + 44797, + 29892, + 47063, + 33541, + 35378, + 46618, + 47908, + 47040, + 49944, + 40345, + 36116, + 32779, + 53018, + 41673, + 38852, + 41861, + 39467, + 34890, + 34729, + 37401, + 44095, + 36867, + 47453, + 29810, + 48503, + 56974, + 46792, + 34123, + 32990, + 47255, + 71993, + 43814, + 33284, + 38322, + 38315, + 78208, + 39372, + 49423, + 45970, + 45373, + 37608, + 41078, + 35587, + 41867, + 50515, + 36108, + 39058, + 33014, + 30327, + 47144, + 37763, + 41507, + 30972, + 33394, + 34500, + 40757, + 40947, + 45136, + 38306, + 33503, + 38276, + 33858, + 60082, + 35809, + 46998, + 35595, + 46819, + 44658, + 41887, + 43117, + 46348, + 27120, + 37536, + 33362, + 36790, + 46565, + 35511, + 33305, + 43674, + 36698, + 54149, + 33886, + 60692, + 53957, + 36157, + 38611, + 32972, + 40323, + 36192, + 62111, + 39338, + 58343, + 41304, + 43742, + 51257, + 38539, + 30411, + 41538, + 35356, + 36009, + 34845, + 51172, + 61870, + 41149, + 42451, + 37536, + 41100, + 44857, + 53160, + 40804, + 36889, + 45029, + 42043, + 46966, + 51638, + 38537, + 48090, + 34984, + 67040, + 38079, + 52540, + 32084, + 36785, + 44740, + 31725, + 55324, + 36881, + 40998, + 32767, + 28799, + 64256, + 45970, + 52566, + 39480, + 54930, + 40383, + 55121, + 30599, + 48253, + 36110, + 39220, + 40765, + 32933, + 35335, + 34442, + 62782, + 53560, + 46759, + 37054, + 53876, + 44438, + 42282, + 47564, + 42104, + 40670, + 47337, + 40340, + 58012, + 54640, + 29498, + 36333, + 42250, + 39462, + 44449, + 33447, + 46110, + 33185, + 34586, + 38007, + 33390, + 37795, + 34702, + 40864, + 26200, + 31010, + 43424, + 38007, + 35122, + 64514, + 39476, + 35971, + 44549, + 32846, + 38382, + 39659, + 33802, + 39886, + 53540, + 40740, + 39029, + 61298, + 44004, + 32296, + 54092, + 34904, + 54148, + 37652, + 44248, + 41026, + 51642, + 37243, + 56956, + 37578, + 35567, + 37863, + 37176, + 36821, + 40388, + 34793, + 47382, + 36131, + 45726, + 35633, + 44518, + 51530, + 47467, + 44913, + 40279, + 44874, + 47729, + 35734, + 35308, + 51115, + 30653, + 33514, + 39541, + 44252, + 61501, + 36721, + 49644, + 47396, + 48465, + 45532, + 40930, + 48205, + 31436, + 34454, + 50106, + 44114, + 29881, + 35851, + 41650, + 34744, + 43899, + 45070, + 31893, + 35036, + 39591, + 36752, + 36515, + 41610, + 41723, + 44353, + 36902, + 42502, + 44703, + 47372, + 37292, + 32029, + 35186, + 40569, + 39306, + 37250, + 31448, + 36554, + 36359, + 52641, + 54496, + 29965, + 46549, + 32966, + 40828, + 35628, + 42401, + 40006, + 49900, + 58418, + 32593, + 34891, + 42623, + 32838, + 48473, + 40092, + 47648, + 42406, + 61286, + 38580, + 40721, + 43749, + 50491, + 35482, + 37251, + 44732, + 38373, + 40376, + 40748, + 30789, + 31570, + 28749, + 50709, + 32155, + 29856, + 40926, + 43587, + 33849, + 37622, + 48280, + 45672, + 38458, + 34183, + 41675, + 38016, + 42481, + 41666, + 49643, + 43136, + 30727, + 34113, + 37773, + 32646, + 34530, + 38619, + 38278, + 41757, + 52231, + 37658, + 49618, + 32489, + 50655, + 42618, + 34962, + 36315, + 59317, + 37984, + 49521, + 40366, + 31502, + 37117, + 48199, + 37048, + 35245, + 33430, + 49624, + 38401, + 54627, + 41984, + 38789, + 29799, + 35571, + 41706, + 38448, + 36588, + 34294, + 39743, + 38656, + 59236, + 41907, + 42385, + 46603, + 43838, + 33924, + 36141, + 44824, + 38544, + 38818, + 36976, + 32688, + 51082, + 46166, + 38432, + 41474, + 45420, + 51429, + 31572, + 38688, + 38993, + 41770, + 40044, + 33615, + 42071, + 29844, + 41884, + 26460, + 29405, + 36358, + 37523, + 33531, + 42032, + 38555, + 49064, + 29034, + 32757, + 49284, + 40663, + 27960, + 42645, + 35055, + 51921, + 34815, + 31236, + 35441, + 34535, + 36702, + 36997, + 38431, + 43616, + 40101, + 61418, + 40259, + 47434, + 64514, + 43334, + 38926, + 33214, + 32451, + 38935, + 39126, + 46142, + 37623, + 41447, + 28766, + 43842, + 43324, + 32920, + 29983, + 40949, + 55360, + 62036, + 36027, + 35491, + 32527, + 43935, + 32134, + 36936, + 42930, + 46134, + 39310, + 39099, + 56477, + 37346, + 33518, + 34913, + 53505, + 35156, + 52563, + 39391, + 49302, + 39667, + 36730, + 41243, + 53909, + 58791, + 37169, + 35453, + 44657, + 48769, + 40558, + 36515, + 37074, + 50434, + 33339, + 29772, + 40958, + 36782, + 39593, + 56590, + 40984, + 32458, + 31691, + 34856, + 38723, + 33794, + 33579, + 36625, + 56686, + 43194, + 38641, + 57173, + 53297, + 30420, + 33698, + 45441, + 34844, + 38415, + 37260, + 33177, + 52812, + 38937, + 34957, + 55538, + 32925, + 36070, + 32580, + 36366, + 35312, + 46840, + 49598, + 48750, + 50143, + 37239, + 39635, + 41729, + 36170, + 52252, + 33540, + 39489, + 37230, + 46235, + 49257, + 41814, + 32929, + 50512, + 35733, + 43669, + 36560, + 39827, + 37310, + 45221, + 48286, + 32301, + 31510, + 30867, + 45534, + 40215, + 37472, + 36561, + 34872, + 40596, + 44187, + 81259, + 47486, + 44589, + 61889, + 37228, + 39182, + 39178, + 38540, + 42453, + 51930, + 42012, + 60941, + 46795, + 41945, + 33880, + 38009, + 41873, + 33439, + 40321, + 48480, + 41583, + 44750, + 46451, + 35196, + 47572, + 47433, + 43863, + 43194, + 27022, + 54929, + 40222, + 31684, + 36796, + 46926, + 37434, + 29493, + 57675, + 37391, + 37504, + 42555, + 42372, + 41841, + 38347, + 40909, + 41461, + 40003, + 38724, + 31751, + 34587, + 38185, + 42517, + 38679, + 33091, + 42490, + 45070, + 53216, + 41453, + 39648, + 41824, + 36853, + 33005, + 45800, + 43099, + 39899, + 41181, + 48106, + 38156, + 59802, + 38399, + 33363, + 56162, + 33231, + 42932, + 41398, + 29383, + 41470, + 36393, + 36930, + 38378, + 53346, + 39069, + 36416, + 42190, + 39068, + 38899, + 41567, + 42767, + 50294, + 29447, + 38045, + 31843, + 37309, + 39757, + 41662, + 44394, + 37223, + 45466, + 32317, + 46957, + 57898, + 46660, + 36277, + 44589, + 44193, + 57150, + 35591, + 44484, + 39539, + 37948, + 51203, + 33212, + 41959, + 37740, + 35180, + 35711, + 48261, + 30258, + 35341, + 42050, + 36820, + 38368, + 37557, + 34382, + 40980, + 59371, + 28587, + 30258, + 42708, + 43174, + 34410, + 30998, + 44139, + 35214, + 54493, + 45077, + 34372, + 40463, + 34571, + 32907, + 46372, + 41397, + 40185, + 40252, + 33783, + 37256, + 35725, + 30936, + 58674, + 55910, + 46302, + 42720, + 48699, + 38148, + 33667, + 30382, + 33426, + 33630, + 38759, + 49846, + 32863, + 31123, + 32943, + 48923, + 54076, + 46326, + 50293, + 55960, + 34414, + 38756, + 33170, + 43374, + 35389, + 39009, + 51022, + 34356, + 45273, + 48499, + 30245, + 39728, + 35077, + 38600, + 43744, + 46278, + 44984, + 44617, + 36322, + 32464, + 29812, + 42906, + 48191, + 45414, + 37594, + 41994, + 38755, + 40275, + 30458, + 43579, + 38257, + 59214, + 39532, + 39991, + 65790, + 50690, + 33413, + 37768, + 39532, + 32295, + 36873, + 39878, + 61954, + 38540, + 53901, + 56440, + 62032, + 41525, + 41227, + 34763, + 38614, + 41206, + 37353, + 53733, + 45893, + 46305, + 31671, + 48632, + 40355, + 55135, + 37334, + 44931, + 39224, + 39890, + 42715, + 38822, + 51902, + 46206, + 48661, + 33094, + 32897, + 44935, + 40278, + 44787, + 49363, + 40057, + 37048, + 36596, + 37847, + 45554, + 43285, + 35972, + 48018, + 43514, + 40147, + 62503, + 41661, + 34292, + 58408, + 69712, + 44003, + 41498, + 42859, + 42510, + 37899, + 37081, + 36837, + 36482, + 37920, + 39759, + 53251, + 46209, + 37320, + 39360, + 33283, + 43665, + 40723, + 32883, + 33593, + 36768, + 32599, + 42518, + 66128, + 33604, + 37398, + 35450, + 31465, + 36562, + 39824, + 65538, + 40915, + 45884, + 39669, + 48991, + 39007, + 34068, + 39471, + 41456, + 48578, + 47460, + 43097, + 55348, + 31424, + 37244, + 40092, + 45980, + 42366, + 29723, + 46694, + 43790, + 38084, + 39864, + 31003, + 41564, + 35177, + 32783, + 31757, + 53046, + 37540, + 33866, + 46434, + 62553, + 35600, + 34277, + 48624, + 33832, + 31095, + 54764, + 31960, + 30208, + 42656, + 43853, + 46346, + 54090, + 36230, + 42507, + 52458, + 39414, + 43710, + 32502, + 36112, + 32157, + 41612, + 34331, + 35692, + 36546, + 39617, + 35602, + 55652, + 43086, + 35028, + 39446, + 41241, + 48324, + 35980, + 33496, + 36579, + 39794, + 30463, + 32368, + 43993, + 66627, + 42356, + 67875, + 36068, + 40376, + 58482, + 37800, + 47664, + 50285, + 49502, + 46384, + 43082, + 40554, + 37294, + 42089, + 33944, + 34920, + 48081, + 38968, + 40907, + 31325, + 40773, + 53125, + 45997, + 43873, + 37252, + 37521, + 36855, + 34685, + 47875, + 39687, + 44876, + 43763, + 32476, + 45462, + 34421, + 46784, + 47853, + 36422, + 50077, + 34684, + 49438, + 37659, + 54338, + 42254, + 28236, + 32497, + 42103, + 42384, + 39914, + 61508, + 36734, + 44331, + 41658, + 56693, + 34894, + 39726, + 48017, + 55443, + 34801, + 39151, + 33140, + 36882, + 38436, + 40581, + 81199, + 42659, + 41480, + 32417, + 41497, + 36571, + 37805, + 36865, + 28268, + 30989, + 33100, + 43554, + 41827, + 39078, + 47091, + 39726, + 36261, + 41765, + 42877, + 41873, + 87200, + 36938, + 35127, + 35179, + 50812, + 47208, + 34258, + 38089, + 36679, + 49339, + 32594, + 41087, + 38933, + 42275, + 36607, + 40716, + 49894, + 38422, + 45614, + 47173, + 35520, + 47958, + 48001, + 35776, + 47286, + 42892, + 59247, + 35760, + 42026, + 51171, + 40702, + 38935, + 43868, + 54577, + 30525, + 37528, + 34840, + 42764, + 32662, + 44743, + 33371, + 37765, + 34385, + 41454, + 40720, + 48545, + 53225, + 46605, + 52668, + 40052, + 39846, + 32564, + 49107, + 45146, + 33164, + 27081, + 37642, + 36627, + 48941, + 39269, + 54355, + 43327, + 46958, + 55256, + 40730, + 45160, + 40354, + 38834, + 39150, + 69540, + 36802, + 30718, + 37743, + 47426, + 50888, + 53578, + 36268, + 32940, + 38997, + 28236, + 39146, + 35311, + 63603, + 51576, + 39594, + 39303, + 43367, + 37000, + 39812, + 41700, + 32481, + 38442, + 39420, + 40394, + 43106, + 42458, + 80996, + 43135, + 33778, + 35415, + 35998, + 46890, + 38032, + 32937, + 42599, + 32150, + 39925, + 33141, + 43560, + 31124, + 40801, + 39327, + 27185, + 42883, + 39512, + 47153, + 39469, + 56565, + 51238, + 35312, + 41516, + 62691, + 43672, + 50177, + 57368, + 69978, + 38516, + 35172, + 34398, + 39184, + 47866, + 45313, + 56395, + 33460, + 65352, + 43373, + 46386, + 40509, + 41653, + 41637, + 41344, + 40845, + 33538, + 41513, + 43757, + 47518, + 35054, + 38827, + 49982, + 40779, + 35270, + 28300, + 30157, + 37817, + 31838, + 35690, + 34378, + 42689, + 49023, + 32789, + 34216, + 49156, + 69014, + 35153, + 33272, + 54586, + 37399, + 55355, + 34579, + 37169, + 51002, + 38717, + 49090, + 30988, + 34429, + 46248, + 37070, + 33592, + 32210, + 46855, + 49815, + 77879, + 36070, + 33207, + 47300, + 35228, + 37512, + 32846, + 32939, + 38103, + 41652, + 35383, + 38476, + 47427, + 39058, + 48358, + 33658, + 41157, + 41513, + 36368, + 36697, + 34846, + 37321, + 28925, + 49840, + 47349, + 61471, + 34853, + 44658, + 42520, + 49573, + 33034, + 33417, + 37286, + 30861, + 34346, + 39912, + 43193, + 41429, + 37890, + 41892, + 43018, + 43647, + 34433, + 37991, + 38387, + 36638, + 45040, + 42620, + 38106, + 30149, + 80696, + 49129, + 34103, + 32117, + 51831, + 63341, + 42981, + 42562, + 34561, + 45831, + 43576, + 43310, + 44763, + 51069, + 44452, + 41172, + 32323, + 36433, + 42239, + 32560, + 37590, + 48037, + 33560, + 34048, + 42026, + 32509, + 55588, + 37608 + ] + }, + { + "counters": [ + 35175, + 54795, + 31860, + 46209, + 43165, + 47798, + 37352, + 36214, + 46355, + 41463, + 33566, + 67479, + 32480, + 36735, + 38932, + 39017, + 37675, + 44466, + 56179, + 32380, + 45785, + 39358, + 53199, + 44178, + 44933, + 40265, + 23988, + 44771, + 30126, + 41224, + 40080, + 47121, + 36104, + 64743, + 32799, + 53047, + 39914, + 40179, + 42058, + 37055, + 42750, + 50696, + 37059, + 31840, + 51237, + 33305, + 31168, + 42192, + 51050, + 35027, + 38730, + 28310, + 48228, + 50852, + 47684, + 37965, + 44965, + 33601, + 37187, + 35796, + 40414, + 39077, + 39296, + 33152, + 37838, + 41488, + 39190, + 35291, + 35413, + 37482, + 33471, + 42251, + 43044, + 39078, + 46456, + 35961, + 40625, + 40328, + 50531, + 46520, + 33145, + 34196, + 37723, + 38071, + 31894, + 41917, + 35714, + 57212, + 45983, + 38280, + 27972, + 37259, + 40233, + 37655, + 35982, + 40976, + 46031, + 32247, + 44465, + 39557, + 38239, + 46311, + 45627, + 37579, + 29314, + 66121, + 34127, + 40693, + 42142, + 47725, + 45932, + 40146, + 41082, + 37802, + 38932, + 56506, + 41591, + 38478, + 43951, + 24006, + 39551, + 33462, + 47451, + 36605, + 32294, + 31128, + 32208, + 40109, + 41959, + 37729, + 34129, + 51384, + 34269, + 36038, + 41530, + 52221, + 49181, + 34632, + 32983, + 43326, + 31786, + 31235, + 42459, + 31440, + 32794, + 37299, + 33869, + 36554, + 42025, + 49653, + 35104, + 31704, + 33179, + 44246, + 41644, + 44177, + 44125, + 36440, + 41261, + 29245, + 38975, + 39396, + 24748, + 36387, + 50196, + 59054, + 40981, + 37162, + 32635, + 30209, + 37347, + 49294, + 34158, + 42163, + 46917, + 44656, + 51685, + 39471, + 33087, + 43936, + 38842, + 47409, + 32031, + 37758, + 52348, + 33636, + 43952, + 45004, + 55721, + 33366, + 33964, + 49502, + 42293, + 35213, + 59111, + 32193, + 37001, + 35666, + 34969, + 39004, + 40889, + 62596, + 47761, + 52164, + 39272, + 35145, + 51340, + 35175, + 51674, + 45834, + 46662, + 34383, + 37311, + 50766, + 41153, + 50515, + 37570, + 42866, + 39729, + 54214, + 35220, + 39602, + 45961, + 34293, + 33601, + 40422, + 33542, + 50728, + 30691, + 58477, + 54591, + 48378, + 45591, + 35766, + 37756, + 32631, + 43670, + 34448, + 32086, + 36016, + 38155, + 34478, + 43316, + 38091, + 40976, + 37538, + 35447, + 38022, + 35899, + 40028, + 60021, + 38869, + 42148, + 43250, + 29558, + 42460, + 41199, + 35134, + 37967, + 34183, + 34251, + 37980, + 35528, + 39444, + 29109, + 35824, + 30801, + 46729, + 38640, + 31524, + 33678, + 42278, + 39779, + 40138, + 38963, + 36055, + 36813, + 30870, + 33894, + 40345, + 56696, + 31671, + 44579, + 35106, + 57041, + 43578, + 50593, + 33125, + 54005, + 39274, + 38782, + 30540, + 48317, + 33641, + 44603, + 51162, + 37058, + 26366, + 45262, + 35529, + 40733, + 36106, + 43722, + 35623, + 54159, + 43135, + 43875, + 42811, + 54700, + 40593, + 47257, + 50083, + 33738, + 41113, + 54787, + 36814, + 41644, + 45049, + 55509, + 34145, + 43018, + 43494, + 64327, + 34002, + 44404, + 40710, + 42139, + 43725, + 56012, + 48870, + 43822, + 44879, + 34077, + 51623, + 62380, + 39007, + 52079, + 44270, + 51184, + 36379, + 41220, + 37390, + 43588, + 30860, + 38877, + 63287, + 55635, + 31412, + 44916, + 40666, + 46506, + 28629, + 46832, + 37959, + 28920, + 29912, + 35600, + 35027, + 32537, + 32508, + 52742, + 28362, + 32197, + 31944, + 86187, + 49705, + 37594, + 58276, + 35092, + 115160, + 32217, + 38214, + 36575, + 39297, + 38684, + 37158, + 41821, + 31419, + 68973, + 46375, + 38399, + 45209, + 49879, + 51771, + 46827, + 35250, + 33637, + 39132, + 52416, + 26767, + 28883, + 53569, + 38602, + 54544, + 44409, + 44149, + 41254, + 54764, + 36019, + 41467, + 41908, + 41088, + 46476, + 39541, + 38517, + 36985, + 41918, + 32773, + 39853, + 38662, + 43988, + 51974, + 34322, + 43521, + 38432, + 36572, + 34600, + 38060, + 33370, + 50743, + 40557, + 40628, + 31290, + 44021, + 41622, + 34916, + 35422, + 52697, + 42130, + 33533, + 30937, + 42909, + 31338, + 49801, + 41929, + 45209, + 40433, + 41215, + 30013, + 38411, + 33254, + 42987, + 32024, + 36747, + 42408, + 54871, + 25515, + 43430, + 59583, + 54136, + 42701, + 36550, + 23821, + 35201, + 44624, + 36473, + 39871, + 33715, + 39963, + 33291, + 29053, + 49024, + 39960, + 36010, + 32794, + 44163, + 53663, + 59795, + 41449, + 33531, + 37528, + 34889, + 36619, + 42106, + 40506, + 33121, + 43880, + 33120, + 33999, + 31984, + 43073, + 47331, + 70322, + 39746, + 39643, + 29984, + 50158, + 39376, + 39946, + 29751, + 37042, + 45674, + 42302, + 38263, + 38285, + 40681, + 28051, + 51623, + 32733, + 40902, + 31617, + 40565, + 36082, + 43157, + 40472, + 41423, + 46738, + 42042, + 38552, + 35804, + 31719, + 44677, + 48985, + 37767, + 43258, + 43910, + 39857, + 37036, + 50537, + 31239, + 41450, + 54451, + 40247, + 30788, + 35910, + 43795, + 39990, + 30601, + 44306, + 41314, + 36786, + 37880, + 49959, + 37608, + 39792, + 40882, + 31936, + 31020, + 37390, + 36071, + 54606, + 48396, + 39991, + 42330, + 33260, + 37253, + 36798, + 38804, + 31137, + 39521, + 33809, + 30247, + 41734, + 48967, + 53408, + 54077, + 32022, + 30285, + 41922, + 42056, + 31105, + 37961, + 34728, + 48834, + 32888, + 42549, + 36925, + 36995, + 44699, + 43034, + 52601, + 51061, + 34276, + 31989, + 42923, + 41975, + 47929, + 38837, + 35574, + 52447, + 37289, + 41861, + 50758, + 29792, + 49922, + 62263, + 31943, + 34585, + 40094, + 46593, + 52783, + 50526, + 41512, + 41834, + 48218, + 35950, + 42979, + 47908, + 34459, + 34370, + 54720, + 32655, + 41242, + 43447, + 37215, + 41121, + 33651, + 38837, + 38582, + 32806, + 34004, + 41701, + 34667, + 34923, + 52588, + 38161, + 32267, + 41811, + 40114, + 40487, + 43433, + 32210, + 56852, + 36153, + 60848, + 36580, + 44468, + 31742, + 37358, + 34055, + 37350, + 37838, + 54691, + 38108, + 30245, + 35260, + 36445, + 32329, + 36594, + 43474, + 42259, + 39130, + 33999, + 35777, + 40921, + 30057, + 35871, + 32947, + 44743, + 37862, + 51842, + 33555, + 36637, + 38770, + 48664, + 47808, + 41813, + 33166, + 32322, + 42225, + 35933, + 46375, + 57394, + 35581, + 46223, + 40317, + 30512, + 54039, + 44770, + 40430, + 44698, + 40037, + 38416, + 39131, + 42693, + 40420, + 45118, + 37310, + 39108, + 43137, + 45458, + 31174, + 38870, + 39794, + 47918, + 36466, + 40387, + 39513, + 45085, + 43981, + 47828, + 44937, + 45898, + 47079, + 46415, + 34781, + 47939, + 30537, + 45741, + 56243, + 54376, + 44352, + 34676, + 46693, + 44967, + 46767, + 43257, + 36875, + 32507, + 36654, + 33711, + 39959, + 39158, + 36662, + 27902, + 43295, + 45181, + 39908, + 55253, + 45352, + 37027, + 39608, + 55863, + 52798, + 31679, + 29312, + 40206, + 57855, + 34917, + 35809, + 46755, + 35837, + 57785, + 33039, + 40930, + 46824, + 32862, + 28422, + 39538, + 56820, + 61183, + 41245, + 40240, + 77078, + 41808, + 48115, + 37656, + 46825, + 41462, + 46683, + 48069, + 36514, + 64701, + 68633, + 32316, + 44213, + 65231, + 38749, + 30249, + 52903, + 45212, + 41382, + 43628, + 53630, + 33124, + 37902, + 39238, + 38132, + 44056, + 39928, + 68020, + 39928, + 36885, + 47452, + 37731, + 35623, + 33516, + 49359, + 45163, + 35811, + 42691, + 37308, + 56206, + 34998, + 31611, + 42194, + 38350, + 33623, + 49914, + 32898, + 58591, + 43775, + 59812, + 36993, + 48388, + 43117, + 48813, + 51714, + 37300, + 51752, + 44255, + 52148, + 33946, + 34261, + 42155, + 38796, + 33437, + 40953, + 34072, + 35935, + 35336, + 36595, + 35929, + 38028, + 38738, + 49129, + 39092, + 51561, + 37234, + 53481, + 40873, + 43015, + 53921, + 51660, + 45622, + 50206, + 46838, + 39934, + 35230, + 37416, + 49382, + 40121, + 41314, + 66411, + 42902, + 42899, + 41360, + 30660, + 35261, + 56396, + 41349, + 42468, + 36893, + 38935, + 47073, + 51522, + 43164, + 51611, + 38275, + 28374, + 35297, + 32427, + 50697, + 53413, + 52697, + 61011, + 43058, + 36453, + 55867, + 36354, + 45702, + 32940, + 34020, + 51360, + 34968, + 42114, + 31986, + 34907, + 38933, + 30936, + 43251, + 39272, + 34708, + 34227, + 33274, + 32773, + 30942, + 43065, + 33378, + 47795, + 52770, + 53430, + 37216, + 43318, + 38730, + 41187, + 48152, + 37252, + 38432, + 45224, + 40956, + 41558, + 30030, + 42678, + 44762, + 37264, + 40080, + 39148, + 31497, + 49235, + 33464, + 35754, + 43265, + 32493, + 30223, + 51183, + 55888, + 30157, + 35022, + 33005, + 30055, + 43667, + 40018, + 42132, + 37353, + 42634, + 33729, + 40765, + 35964, + 32987, + 49960, + 34489, + 36860, + 32629, + 35888, + 51303, + 38456, + 45708, + 55863, + 47667, + 39686, + 54306, + 38831, + 43979, + 34457, + 37559, + 33412, + 51851, + 29895, + 56465, + 43935, + 35947, + 44928, + 35462, + 34454, + 36821, + 46021, + 48513, + 57775, + 34769, + 40237, + 31672, + 31557, + 56012, + 34499, + 50447, + 38380, + 46177, + 32337, + 35554, + 36802, + 44073, + 38104, + 67164, + 46312, + 41244, + 33136, + 43361, + 46826, + 36308, + 41325, + 59991, + 39847, + 43014, + 59354, + 49719, + 52127, + 28070, + 35572, + 26618, + 28490, + 39735, + 65715, + 45381, + 43019, + 41579, + 35935, + 31178, + 44530, + 48916, + 57462, + 43717, + 47491, + 39393, + 42269, + 32771, + 39543, + 29315, + 35614, + 42603, + 55822, + 28735, + 37663, + 38549, + 50129, + 33365, + 43495, + 42963, + 33714, + 81234, + 52722, + 38883, + 30521, + 41270, + 48381, + 31160, + 42275, + 49794, + 43616, + 33648, + 36566, + 50424, + 46317, + 28539, + 35748, + 46052, + 59840, + 32942, + 37285, + 30600, + 32224, + 46480, + 36525, + 37896, + 44628, + 35070, + 38340, + 32320, + 48406, + 59185, + 37142, + 43458, + 69109, + 43737, + 35568, + 35378, + 50945, + 34950, + 33111, + 56009, + 48438, + 61060, + 38548, + 37531, + 41062, + 29902, + 41528, + 32413, + 40651, + 37823, + 50988, + 32829, + 35842, + 41914, + 30579, + 43708, + 41106, + 37644, + 32905, + 60808, + 44579, + 34019, + 49953, + 38167, + 41096, + 40464, + 67907, + 38764, + 42882, + 39760, + 41628, + 34027, + 33613, + 38821, + 56298, + 45448, + 45244, + 36157, + 37079, + 40635, + 51419, + 34910, + 42361, + 39477, + 40920, + 60008, + 39928, + 43175, + 40680, + 49234, + 37725, + 31512, + 34714, + 44076, + 71270, + 51321, + 48885, + 36070, + 42918, + 34124, + 35111, + 38965, + 37623, + 52955, + 62821, + 46990, + 34898, + 38628, + 47548, + 51648, + 37525, + 41545, + 35226, + 30277, + 54439, + 40667, + 48538, + 43907, + 44624, + 48759, + 33208, + 43679, + 44779, + 39778, + 31133, + 39447, + 45980, + 46265, + 39962, + 37260, + 54483, + 39229, + 38922, + 40390, + 46768, + 43562, + 45084, + 46023, + 36659, + 53432, + 43247, + 44396, + 52896, + 53186, + 43449, + 41221, + 29907, + 35581, + 43504, + 46917, + 42816, + 26129, + 31836, + 61154, + 54895, + 39444, + 40681, + 40041, + 48153, + 41806, + 53170, + 34064, + 37091, + 51894, + 49356, + 47764, + 44590, + 50872, + 42436, + 66766, + 48705, + 34810, + 32458, + 53957, + 46435, + 54624, + 36533, + 48774, + 49510, + 33378, + 38150, + 35983, + 41997, + 32563, + 32695, + 39954, + 49981, + 35872, + 47193, + 31815, + 39763, + 49475, + 29373, + 41340, + 35217, + 29069, + 44433, + 40002, + 44496, + 49957, + 38711, + 41679, + 34443, + 40517, + 26830, + 41420, + 28405, + 37249, + 33003, + 41542, + 43309, + 36263, + 45253, + 51378, + 50699, + 59926, + 40334, + 35075, + 38642, + 32610, + 38405, + 44417, + 41322, + 41670, + 41481, + 43850, + 46822, + 33337, + 39983, + 46033, + 42506, + 37670, + 30130, + 51944, + 45504, + 64615, + 40942, + 36141, + 38245, + 40657, + 32465, + 54396, + 45113, + 43393, + 54532, + 30999, + 40561, + 32384, + 51380, + 51446, + 37631, + 50138, + 30624, + 45180, + 55221, + 36068, + 55485, + 33717, + 38469, + 31772, + 49603, + 38880, + 33440, + 40731, + 43821, + 57889, + 39387, + 51728, + 46135, + 42254, + 34201, + 40196, + 42121, + 43841, + 43313, + 36917, + 40284, + 42567, + 39398, + 37884, + 35954, + 32491, + 35978, + 43017, + 42522, + 37707, + 43542, + 33493, + 42253, + 38482, + 35668, + 45213, + 40942, + 34502, + 33710, + 56641, + 51788, + 41346, + 31944, + 56367, + 33786, + 39564, + 40241, + 28759, + 40500, + 39952, + 38335, + 53759, + 32073, + 40030, + 45344, + 34741, + 40944, + 38036, + 43244, + 61207, + 43720, + 40873, + 34841, + 43222, + 37619, + 43396, + 41553, + 38133, + 33566, + 43260, + 44075, + 35700, + 38333, + 45355, + 35696, + 38322, + 41291, + 41419, + 38683, + 39288, + 55300, + 42343, + 42769, + 44707, + 50400, + 53219, + 38875, + 38780, + 38096, + 53531, + 37382, + 47205, + 38448, + 36176, + 44088, + 47516, + 43046, + 40793, + 38059, + 34393, + 37663, + 40207, + 38756, + 48271, + 41698, + 43658, + 37474, + 47658, + 42499, + 39522, + 45324, + 42646, + 36832, + 30205, + 40837, + 41888, + 39661, + 37503, + 58820, + 37420, + 32764, + 40886, + 38988, + 48189, + 41551, + 54060, + 39752, + 57156, + 28540, + 38266, + 36234, + 43747, + 38055, + 51199, + 49848, + 44138, + 44485, + 31313, + 41329, + 40210, + 36590, + 36098, + 40688, + 43071, + 36296, + 47933, + 32207, + 43871, + 37056, + 48541, + 50827, + 38122, + 54015, + 30719, + 39855, + 34285, + 38365, + 40075, + 36423, + 53366, + 33492, + 42560, + 45563, + 46661, + 32997, + 35261, + 32543, + 62583, + 41957, + 44514, + 39666, + 45961, + 45358, + 74273, + 34964, + 49870, + 47959, + 34716, + 44238, + 55860, + 34941, + 39902, + 38072, + 46631, + 42099, + 42622, + 28559, + 47216, + 38615, + 39278, + 38236, + 37449, + 39700, + 75782, + 39612, + 45736, + 43191, + 49039, + 53673, + 42741, + 33484, + 29640, + 39864, + 45749, + 47580, + 37408, + 50183, + 41220, + 39019, + 42793, + 55667, + 32962, + 50853, + 35851, + 36505, + 35639, + 33560, + 41290, + 31905, + 42837, + 45186, + 48494, + 38635, + 40484, + 38025, + 41712, + 44427, + 50856, + 39073, + 39519, + 51465, + 49241, + 54804, + 33490, + 44106, + 42078, + 33974, + 37691, + 43086, + 39969, + 60560, + 78815, + 40745, + 39694, + 46192, + 46808, + 30452, + 30117, + 43277, + 38447, + 39925, + 40103, + 44932, + 57616, + 36709, + 30878, + 35419, + 33930, + 38093, + 41058, + 38812, + 43982, + 57037, + 34527, + 48161, + 41756, + 43304, + 38315, + 47048, + 48099, + 37763, + 34020, + 40330, + 42400, + 34810, + 59937, + 35306, + 37224, + 37453, + 37803, + 47080, + 42689, + 35507, + 36616, + 46283, + 43857, + 39122, + 28522, + 41450, + 34407, + 26637, + 30277, + 40724, + 33629, + 48560, + 52387, + 49272, + 39235, + 49007, + 30704, + 35025, + 41026, + 41261, + 33543, + 33779, + 35642, + 31879, + 30359, + 48149, + 36310, + 44537, + 43778, + 32076, + 37287, + 33707, + 29364, + 40107, + 46739, + 32690, + 44281, + 47654, + 37984, + 29522, + 32940, + 60522, + 44922, + 31219, + 47015, + 31893, + 45536, + 35948, + 36518, + 44063, + 40102, + 31353, + 39434, + 38325, + 36390, + 42029, + 55227, + 40047, + 29364, + 39429, + 34610, + 37631, + 66978, + 33102, + 34775, + 39635, + 34243, + 38222, + 35467, + 50394, + 36495, + 46102, + 39176, + 35423, + 34158, + 33729, + 53346, + 30506, + 42393, + 33945, + 41355, + 36169, + 42134, + 41146, + 44281, + 42990, + 32340, + 33182, + 52171, + 36520, + 36540, + 35356, + 38047, + 39965, + 45343, + 42553, + 71333, + 36065, + 36523, + 33184, + 39186, + 49626, + 37309, + 39208, + 39153, + 34136, + 37022, + 48904, + 39970, + 52583, + 37958, + 45449, + 38761, + 32228, + 52626, + 36542, + 39069, + 52477, + 43274, + 42351, + 51305, + 38193, + 35261, + 38922, + 45383, + 59322, + 33501, + 49186, + 39342, + 29753, + 43599, + 41167, + 43270, + 55337, + 35548, + 43489, + 43789, + 32286, + 35218, + 35970, + 38397, + 38183, + 41839, + 30556, + 47099, + 36905, + 44004, + 36943, + 32959, + 51494, + 38825, + 34602, + 43833, + 41493, + 50624, + 39639, + 42032, + 38076, + 34284, + 36774, + 30458, + 30286, + 48511, + 62505, + 30320, + 36994, + 39051, + 32339, + 48889, + 38973, + 37197, + 31953, + 51056, + 35466, + 48349, + 36022, + 35035, + 37601, + 33812, + 46371, + 34751, + 37074, + 30703, + 34795, + 38012, + 36580, + 80692, + 58376, + 33085, + 42368, + 59149, + 38099, + 41936, + 29878, + 46649, + 42905, + 47066, + 39092, + 43380, + 42425, + 37440, + 40439, + 40256, + 42321, + 41648, + 42379, + 51948, + 41222, + 41858, + 28794, + 36754, + 36893, + 44788, + 47318, + 42067, + 36770, + 34102, + 40360, + 39863, + 35092, + 28610, + 42800, + 34829, + 34482, + 41412, + 42086, + 42262, + 60463, + 30711, + 37755, + 64420, + 35467, + 37248, + 38024, + 37861, + 44368, + 32307, + 55183, + 35104, + 35823, + 36025, + 31860, + 50757, + 32732, + 40215, + 40927, + 43123, + 46550, + 38005, + 36091, + 37867, + 47059, + 35606, + 33451, + 41003, + 48489, + 54948, + 42176, + 47944, + 26410, + 48796, + 42118, + 45627, + 41560, + 35174, + 37964, + 41034, + 44223, + 33922, + 40455, + 41292, + 46615, + 37454, + 41471, + 32578, + 35145, + 47741, + 34332, + 55152, + 39183, + 40893, + 46141, + 35914, + 37589, + 41624, + 46461, + 45603, + 47272, + 36941, + 36300, + 54779, + 35348, + 50333, + 36969, + 50950, + 34619, + 36382, + 32721, + 38603, + 41642, + 46026, + 34582, + 34856, + 31645, + 50425, + 34793, + 57951, + 32068, + 34256, + 57238, + 40969, + 41898, + 39413, + 36294, + 40514, + 35459, + 40196, + 38491, + 39800, + 37525, + 32529, + 39170, + 32747, + 42494, + 37740, + 41739, + 42105, + 51118, + 40718, + 43241, + 30357, + 50300, + 38479, + 38814, + 32256, + 49481, + 36741, + 38256, + 42072, + 39979, + 42974, + 38191, + 36881, + 39299, + 34804, + 49619, + 41658, + 55667, + 38978, + 35914, + 50423, + 36358, + 41827, + 46585, + 44357, + 39860, + 32869, + 41771, + 56477, + 26625, + 45343, + 35834, + 31640, + 36778, + 52187, + 37234, + 36556, + 42581, + 46646, + 39796, + 37587, + 44248, + 35864, + 60451, + 40930, + 38062, + 41027, + 30807, + 37281, + 36087, + 53185, + 40775, + 36033, + 34905, + 36834, + 58454, + 47361, + 28060, + 53057, + 34156, + 34397, + 42433, + 63273, + 43823, + 41073, + 38425, + 42883, + 36813, + 44859, + 46812, + 48358, + 50302, + 35552, + 43937, + 39072, + 40238, + 44563, + 42395, + 38552, + 44675, + 34610, + 43550, + 41480, + 45793, + 44272, + 47186, + 34170, + 46478, + 33543, + 31423, + 33246, + 32154, + 40355, + 42077, + 37645, + 57229, + 50186, + 30590, + 46420, + 53952, + 56998, + 32802, + 50349, + 38116, + 32014, + 29708, + 36077, + 32887, + 42540, + 40308, + 28753, + 35179, + 47924, + 36027, + 42233, + 28917, + 31431, + 35218, + 34190, + 35134, + 37519, + 39812, + 37600, + 48931, + 65422, + 30051, + 31238, + 36794, + 32548, + 37077, + 50571, + 42211, + 31091, + 38848, + 31944, + 43128, + 36050, + 35109, + 41380, + 33889, + 41639, + 43393, + 32655, + 45887, + 43216, + 36157, + 34106, + 36870, + 38649, + 47529, + 37993, + 37052, + 37960, + 38080, + 53555, + 36064, + 46492, + 47401, + 49820, + 38272, + 42531, + 49465, + 48000, + 40870, + 53902, + 40815, + 36339, + 48849, + 39377 + ] + }, + { + "counters": [ + 35785, + 43274, + 43991, + 38074, + 45279, + 45008, + 43688, + 42093, + 49371, + 40657, + 42675, + 36001, + 49818, + 37820, + 42518, + 54358, + 32689, + 57867, + 39058, + 53727, + 46495, + 40266, + 52292, + 46010, + 39963, + 29923, + 47721, + 34374, + 40475, + 33651, + 34308, + 56136, + 31123, + 49915, + 38208, + 38199, + 30800, + 43859, + 35905, + 40960, + 39460, + 49196, + 44931, + 46266, + 52269, + 40538, + 40320, + 44379, + 44252, + 34525, + 52315, + 47685, + 69700, + 39073, + 38771, + 31904, + 44865, + 30805, + 45202, + 33387, + 37475, + 38219, + 48128, + 42233, + 38302, + 48447, + 35650, + 50116, + 36461, + 36948, + 45280, + 40762, + 49785, + 38156, + 39737, + 41476, + 38331, + 51993, + 35046, + 42179, + 28939, + 37978, + 42157, + 79814, + 35673, + 34192, + 40355, + 32576, + 30000, + 48752, + 37007, + 45225, + 46554, + 64005, + 38195, + 43324, + 44250, + 40051, + 43780, + 37524, + 36508, + 60567, + 49237, + 36593, + 44458, + 34718, + 35664, + 54936, + 43474, + 37011, + 45669, + 31616, + 32849, + 38173, + 48515, + 34368, + 41445, + 46289, + 44673, + 36866, + 60698, + 42820, + 37228, + 49929, + 37983, + 43117, + 36993, + 43674, + 32093, + 58362, + 35197, + 56734, + 35827, + 35217, + 34971, + 48583, + 51782, + 50591, + 37275, + 41197, + 54612, + 41361, + 39792, + 53500, + 41035, + 42615, + 36937, + 29576, + 32634, + 40907, + 36203, + 33776, + 32953, + 36492, + 38851, + 61376, + 44488, + 38636, + 34217, + 51094, + 43335, + 37943, + 41095, + 30566, + 43939, + 35858, + 33978, + 34819, + 36544, + 36971, + 42618, + 39080, + 35113, + 37313, + 36481, + 44847, + 38107, + 38515, + 32775, + 40832, + 34609, + 36993, + 43987, + 47422, + 44352, + 40682, + 49880, + 43309, + 35499, + 43905, + 39849, + 36497, + 43636, + 45732, + 32498, + 54160, + 35639, + 37771, + 37362, + 48972, + 39517, + 45346, + 42797, + 39290, + 33930, + 65036, + 40456, + 29102, + 36101, + 36361, + 54977, + 34396, + 42546, + 34327, + 46595, + 59048, + 35395, + 44106, + 48831, + 44531, + 30353, + 36366, + 63753, + 50569, + 36977, + 32187, + 39630, + 39949, + 43889, + 46661, + 40593, + 28520, + 47011, + 66865, + 45650, + 33743, + 36049, + 35718, + 40114, + 47053, + 32462, + 42266, + 44211, + 56510, + 46168, + 46476, + 36144, + 41713, + 38948, + 37181, + 30662, + 36551, + 49817, + 47450, + 63495, + 32138, + 33640, + 37604, + 47434, + 45154, + 45357, + 50807, + 29212, + 39034, + 37033, + 45033, + 35552, + 41224, + 36347, + 37896, + 34765, + 34610, + 29689, + 50284, + 34700, + 33970, + 47416, + 38446, + 49342, + 40594, + 36647, + 48896, + 65079, + 46481, + 39746, + 45239, + 28845, + 30481, + 53442, + 39287, + 42969, + 37751, + 36262, + 46567, + 42540, + 39758, + 35122, + 32148, + 36430, + 42869, + 33722, + 41039, + 31516, + 38698, + 43407, + 36057, + 41873, + 38979, + 32093, + 31491, + 31879, + 35422, + 44990, + 35561, + 56811, + 37526, + 50928, + 36710, + 47819, + 45957, + 39725, + 30645, + 45702, + 37462, + 31104, + 34785, + 37914, + 35774, + 53404, + 33466, + 59362, + 42294, + 46376, + 50802, + 35370, + 47471, + 32225, + 39408, + 38553, + 45051, + 56411, + 37193, + 40386, + 44648, + 43477, + 38684, + 28307, + 39564, + 42207, + 37159, + 51356, + 43595, + 33541, + 55248, + 45042, + 41569, + 30926, + 45171, + 41790, + 58221, + 37652, + 39453, + 33257, + 38920, + 38155, + 41757, + 56470, + 37489, + 36963, + 35324, + 41092, + 44038, + 44095, + 41586, + 34580, + 43029, + 29860, + 34899, + 49758, + 33575, + 36615, + 45907, + 43992, + 39461, + 32228, + 34219, + 42181, + 42307, + 35226, + 45826, + 38403, + 54881, + 54159, + 38429, + 34626, + 35757, + 31469, + 44861, + 53607, + 33482, + 35505, + 46373, + 41589, + 37224, + 42073, + 37902, + 40548, + 36665, + 38899, + 48763, + 37551, + 38708, + 38542, + 40146, + 38086, + 29809, + 42159, + 44212, + 34764, + 37757, + 41629, + 31555, + 45660, + 58990, + 40244, + 43045, + 42453, + 40148, + 50989, + 42177, + 30927, + 50738, + 38776, + 31618, + 32297, + 31344, + 42080, + 44674, + 41414, + 43065, + 43237, + 35781, + 41896, + 52291, + 34403, + 24955, + 53526, + 48656, + 39210, + 32057, + 54665, + 58815, + 37558, + 46213, + 36258, + 33159, + 41343, + 36281, + 43308, + 44129, + 46620, + 46216, + 48123, + 45629, + 45563, + 30716, + 31721, + 42460, + 40194, + 36054, + 34909, + 51176, + 31747, + 36628, + 36534, + 41962, + 38118, + 41894, + 34241, + 32546, + 35840, + 40193, + 54183, + 40512, + 52179, + 35883, + 37130, + 43083, + 35915, + 44954, + 44078, + 34192, + 43555, + 39179, + 46524, + 33742, + 28998, + 40193, + 40459, + 60604, + 55037, + 33462, + 57798, + 35051, + 53496, + 51254, + 43711, + 56863, + 37012, + 35440, + 46794, + 38238, + 32495, + 37849, + 37656, + 38935, + 43195, + 50681, + 35002, + 37182, + 35330, + 53157, + 35069, + 38727, + 49294, + 43960, + 39370, + 41501, + 37478, + 50677, + 41418, + 39933, + 60265, + 34305, + 39146, + 29342, + 42373, + 32808, + 32360, + 36486, + 34172, + 36132, + 50946, + 42619, + 55272, + 54976, + 32810, + 36805, + 36095, + 46211, + 38953, + 41721, + 40239, + 38223, + 68765, + 33567, + 36808, + 40268, + 32434, + 34099, + 33787, + 43590, + 31950, + 34988, + 41959, + 51735, + 57424, + 46328, + 57863, + 46171, + 28656, + 33698, + 35689, + 42799, + 47075, + 31353, + 38352, + 41365, + 34809, + 33958, + 43626, + 36293, + 53963, + 33198, + 32931, + 46353, + 35629, + 39574, + 42316, + 69230, + 33070, + 31820, + 35850, + 35821, + 33737, + 33367, + 34604, + 50116, + 34943, + 40931, + 57876, + 42633, + 45302, + 44878, + 44789, + 35510, + 47315, + 34860, + 47260, + 54798, + 34603, + 41426, + 29772, + 33959, + 35130, + 37135, + 35168, + 30165, + 35868, + 35613, + 35927, + 34614, + 32924, + 40311, + 34927, + 40767, + 34413, + 45655, + 26986, + 29804, + 42850, + 30725, + 38284, + 42992, + 40781, + 35709, + 44331, + 47395, + 46221, + 42154, + 31925, + 27195, + 32822, + 43492, + 44416, + 40596, + 42561, + 38235, + 47069, + 38218, + 39758, + 34186, + 35137, + 36387, + 35743, + 34459, + 42070, + 37232, + 31805, + 38495, + 43177, + 75539, + 43198, + 34109, + 37707, + 35621, + 44792, + 35113, + 33908, + 68681, + 40260, + 37694, + 32949, + 50154, + 35658, + 37424, + 45261, + 38373, + 61038, + 53416, + 51831, + 35939, + 30574, + 57990, + 36793, + 38351, + 62240, + 41958, + 40960, + 29824, + 34299, + 33991, + 29691, + 39047, + 48587, + 41515, + 35580, + 43907, + 33666, + 31816, + 43703, + 41265, + 44170, + 42091, + 46585, + 31591, + 35804, + 35852, + 37261, + 31614, + 48424, + 40270, + 43727, + 42414, + 38854, + 45676, + 29485, + 40019, + 35615, + 42260, + 34372, + 40517, + 40364, + 50732, + 38692, + 45658, + 37535, + 73060, + 35786, + 45578, + 40101, + 37307, + 32709, + 35274, + 28414, + 47509, + 33995, + 38594, + 36044, + 40171, + 34501, + 36607, + 43026, + 47332, + 42524, + 34198, + 36155, + 37176, + 54551, + 41448, + 38372, + 54681, + 47089, + 54870, + 31715, + 39689, + 44937, + 38561, + 35128, + 40403, + 39951, + 46474, + 49443, + 48207, + 39035, + 46480, + 33540, + 59177, + 41138, + 47642, + 35074, + 38982, + 37757, + 44331, + 42636, + 34958, + 53936, + 30662, + 40410, + 64178, + 41824, + 39078, + 36326, + 53544, + 36421, + 45848, + 57577, + 38952, + 40779, + 36680, + 39072, + 43741, + 44526, + 37718, + 36131, + 39398, + 35177, + 52607, + 43771, + 43700, + 42341, + 37980, + 43668, + 45445, + 38018, + 31171, + 60111, + 38173, + 54089, + 35768, + 77204, + 32065, + 42850, + 34323, + 40674, + 35279, + 51154, + 42847, + 31368, + 40170, + 42655, + 34280, + 34224, + 42692, + 51773, + 31603, + 47514, + 56571, + 32015, + 31811, + 43565, + 39209, + 36276, + 33360, + 43894, + 43345, + 36605, + 46749, + 40084, + 34488, + 48892, + 32480, + 29621, + 56300, + 39302, + 43913, + 40392, + 40122, + 44018, + 28339, + 37515, + 33716, + 34453, + 38643, + 35154, + 45640, + 38682, + 43726, + 41730, + 30770, + 36990, + 43224, + 28435, + 38599, + 52953, + 42702, + 47207, + 36872, + 34661, + 43726, + 41873, + 53284, + 32599, + 38065, + 40759, + 39668, + 56245, + 45617, + 39205, + 38193, + 42359, + 39878, + 40049, + 40916, + 52141, + 38247, + 48784, + 43320, + 34274, + 34473, + 50405, + 40774, + 37162, + 39949, + 29438, + 54437, + 53424, + 36469, + 46564, + 36635, + 44033, + 35376, + 49813, + 37227, + 32471, + 45515, + 36172, + 33080, + 46014, + 42407, + 39349, + 37525, + 59187, + 58995, + 39563, + 39494, + 43299, + 46501, + 35376, + 37348, + 31795, + 40967, + 38461, + 41840, + 41156, + 31514, + 42980, + 35133, + 39540, + 51128, + 53935, + 36900, + 49270, + 40237, + 38275, + 40657, + 47098, + 34307, + 38022, + 26870, + 51805, + 50723, + 49062, + 50197, + 35887, + 46617, + 35506, + 42182, + 39283, + 37390, + 39461, + 32678, + 42802, + 45856, + 32108, + 40675, + 38872, + 33564, + 54310, + 45679, + 36944, + 35155, + 41531, + 33478, + 48693, + 46095, + 29958, + 41024, + 33355, + 41819, + 41521, + 33263, + 41947, + 36614, + 39651, + 42612, + 35848, + 38095, + 43468, + 36927, + 39346, + 46131, + 51515, + 32308, + 38250, + 47210, + 31035, + 40519, + 43768, + 40874, + 38729, + 57764, + 34072, + 32094, + 35694, + 31978, + 55210, + 35142, + 32021, + 48123, + 39253, + 46204, + 30321, + 48364, + 38025, + 43332, + 34722, + 43298, + 50707, + 39696, + 30791, + 59567, + 38349, + 46009, + 47444, + 37668, + 41209, + 49569, + 37429, + 40170, + 34458, + 38167, + 34025, + 42771, + 48657, + 36968, + 36487, + 42355, + 34362, + 37684, + 48356, + 45324, + 39600, + 48972, + 35281, + 32518, + 56716, + 41607, + 50344, + 42104, + 40261, + 39515, + 64260, + 37732, + 42642, + 43011, + 39354, + 35193, + 37337, + 56309, + 37064, + 41028, + 32439, + 34985, + 29765, + 62726, + 41311, + 41076, + 30514, + 31113, + 42528, + 28054, + 53649, + 40070, + 33351, + 36060, + 34821, + 44843, + 67195, + 41539, + 39307, + 33156, + 42749, + 29680, + 38362, + 37442, + 47195, + 49408, + 44068, + 47150, + 51603, + 57970, + 32731, + 38132, + 37601, + 41192, + 33743, + 43924, + 40731, + 42633, + 40702, + 55312, + 46601, + 42824, + 43987, + 46950, + 38850, + 50199, + 49561, + 47239, + 46900, + 38456, + 57314, + 39339, + 49425, + 40942, + 31160, + 36048, + 42987, + 39431, + 44292, + 31963, + 52080, + 34845, + 37725, + 25328, + 33897, + 33563, + 28310, + 35996, + 53732, + 41025, + 37507, + 40945, + 37216, + 41219, + 30489, + 33661, + 37123, + 67131, + 33392, + 47483, + 34322, + 32768, + 42152, + 48887, + 36824, + 41857, + 49323, + 34217, + 45879, + 37196, + 54483, + 27832, + 51367, + 31288, + 52563, + 50469, + 30130, + 43938, + 51450, + 35049, + 49308, + 61365, + 66769, + 49487, + 46512, + 60386, + 36620, + 39857, + 42357, + 35231, + 36897, + 50607, + 45607, + 41248, + 51161, + 42819, + 35231, + 42345, + 26105, + 36810, + 39069, + 57370, + 48265, + 50023, + 40803, + 41542, + 40659, + 34002, + 46153, + 37358, + 35223, + 31551, + 36117, + 51024, + 37972, + 44331, + 35720, + 33149, + 39583, + 38381, + 33643, + 47334, + 34438, + 36299, + 31785, + 35878, + 51360, + 45112, + 44335, + 31329, + 42375, + 39147, + 34734, + 31689, + 46312, + 48846, + 29954, + 29176, + 44764, + 40443, + 35538, + 47161, + 69091, + 46584, + 40801, + 36053, + 44552, + 38802, + 46417, + 48703, + 46250, + 43349, + 33376, + 39356, + 34710, + 39202, + 48882, + 62002, + 40513, + 33334, + 38124, + 60892, + 47053, + 32868, + 36715, + 55423, + 44619, + 66574, + 46050, + 46647, + 49075, + 37722, + 41710, + 32717, + 39379, + 43683, + 40955, + 39882, + 45310, + 42382, + 41419, + 36956, + 56881, + 42856, + 48484, + 47939, + 31660, + 24281, + 46504, + 32152, + 42715, + 38687, + 35239, + 35258, + 44090, + 37424, + 45993, + 34723, + 36312, + 42992, + 32277, + 35446, + 49039, + 37599, + 43791, + 31660, + 31951, + 45724, + 36781, + 42839, + 37898, + 56254, + 42012, + 36094, + 33958, + 55776, + 32834, + 40054, + 42769, + 49866, + 47187, + 45396, + 29277, + 50548, + 39815, + 39132, + 34552, + 40153, + 51515, + 31328, + 39942, + 39002, + 43928, + 45873, + 42881, + 43357, + 35297, + 34661, + 36452, + 52908, + 34383, + 41480, + 49355, + 36871, + 34625, + 39741, + 40389, + 37044, + 32820, + 63907, + 39568, + 44005, + 28173, + 44210, + 31219, + 39794, + 47924, + 44331, + 42151, + 43344, + 40883, + 39595, + 45930, + 34378, + 36537, + 76177, + 39298, + 51886, + 40185, + 42257, + 40731, + 41564, + 66515, + 28648, + 41837, + 44689, + 31228, + 52606, + 36077, + 37676, + 31406, + 46904, + 36316, + 29755, + 44986, + 36841, + 39949, + 36787, + 48191, + 30809, + 44422, + 39160, + 47445, + 43040, + 37515, + 29284, + 34622, + 43097, + 45404, + 42884, + 49628, + 34951, + 32795, + 35118, + 43112, + 41289, + 32383, + 34203, + 40286, + 35203, + 34785, + 41743, + 46358, + 42536, + 35266, + 33821, + 36027, + 47118, + 34451, + 35616, + 44745, + 34894, + 49879, + 43798, + 56488, + 46948, + 42746, + 31792, + 46113, + 48266, + 45485, + 47408, + 36618, + 25079, + 49955, + 33269, + 39437, + 38306, + 43524, + 83303, + 37904, + 31094, + 36997, + 50173, + 35854, + 33093, + 36810, + 49743, + 48821, + 40851, + 41565, + 41593, + 32402, + 37940, + 49196, + 33840, + 36473, + 34005, + 33281, + 39367, + 40863, + 38722, + 35826, + 52605, + 40227, + 48589, + 52466, + 38880, + 44272, + 29112, + 39082, + 41528, + 48899, + 43828, + 40750, + 32457, + 39555, + 30836, + 84290, + 40695, + 44200, + 36522, + 53730, + 31309, + 52255, + 37347, + 43398, + 41070, + 30884, + 38790, + 42374, + 40277, + 35028, + 67718, + 40044, + 53724, + 38735, + 43295, + 30745, + 42797, + 43363, + 44302, + 41975, + 44103, + 34955, + 34186, + 41015, + 36855, + 68658, + 34574, + 39789, + 38203, + 35575, + 32457, + 58860, + 38682, + 30748, + 37746, + 32349, + 34542, + 44107, + 34166, + 31608, + 37278, + 37697, + 36263, + 49234, + 41448, + 34816, + 46315, + 36862, + 49208, + 41394, + 43928, + 42242, + 48105, + 40496, + 43594, + 38201, + 45854, + 46772, + 32433, + 40270, + 31644, + 39694, + 36270, + 42597, + 34348, + 38074, + 56153, + 36734, + 32730, + 34714, + 37658, + 54912, + 33835, + 31491, + 35268, + 39496, + 38045, + 51502, + 48412, + 40448, + 39649, + 41241, + 35150, + 29833, + 32390, + 41667, + 38291, + 55778, + 30163, + 46555, + 38504, + 39746, + 43385, + 48234, + 33509, + 35669, + 67839, + 42609, + 34866, + 49592, + 51803, + 33427, + 54050, + 36603, + 34729, + 47751, + 44043, + 37586, + 58568, + 50790, + 42975, + 48647, + 51275, + 47594, + 32573, + 38820, + 40575, + 36895, + 49294, + 35460, + 48740, + 35040, + 56737, + 30733, + 33031, + 54839, + 46385, + 33954, + 37887, + 59213, + 35348, + 54821, + 35386, + 47150, + 48896, + 41332, + 42160, + 34457, + 37386, + 37651, + 37617, + 41125, + 41552, + 30732, + 46328, + 38115, + 48487, + 51901, + 52135, + 36499, + 34901, + 33370, + 40543, + 50361, + 45236, + 35445, + 58402, + 43748, + 31645, + 29351, + 37293, + 38593, + 40511, + 47386, + 35093, + 52559, + 29480, + 47543, + 39789, + 57179, + 42211, + 50626, + 34573, + 42858, + 43042, + 44008, + 35403, + 38000, + 41917, + 49292, + 41607, + 39083, + 31945, + 44896, + 46230, + 45309, + 36313, + 33665, + 46145, + 43075, + 47931, + 26435, + 34454, + 34563, + 43851, + 50543, + 56244, + 32881, + 36407, + 43479, + 32013, + 40531, + 47353, + 69088, + 44976, + 41426, + 43470, + 49226, + 41789, + 36528, + 48685, + 38920, + 38486, + 36065, + 43768, + 47046, + 35280, + 36515, + 40385, + 38878, + 55317, + 41845, + 32554, + 43906, + 36826, + 51556, + 30732, + 33739, + 42372, + 38138, + 45098, + 31017, + 41391, + 64005, + 45992, + 40846, + 60680, + 33755, + 42025, + 46846, + 32912, + 42513, + 42588, + 35942, + 39463, + 30180, + 40138, + 50829, + 34447, + 53856, + 41347, + 37377, + 49198, + 57251, + 38025, + 42111, + 37877, + 39771, + 35339, + 55826, + 30604, + 34856, + 32491, + 34313, + 32895, + 55256, + 28631, + 32811, + 38219, + 37955, + 51695, + 36986, + 41848, + 53638, + 34164, + 33508, + 35405, + 34900, + 45392, + 37969, + 40674, + 38562, + 56721, + 40426, + 50834, + 52862, + 35990, + 42945, + 37395, + 39039, + 38072, + 31319, + 41650, + 50278, + 37308, + 41394, + 35204, + 42609, + 30512, + 29478, + 55765, + 43736, + 36430, + 63545, + 33430, + 31909, + 61248, + 55315, + 32278, + 37884, + 50126, + 50168, + 36946, + 34464, + 37518, + 40876, + 39460, + 33506, + 40763, + 46780, + 43931, + 29287, + 34192, + 43320, + 39044, + 30240, + 36737, + 40726, + 44230, + 37845, + 36402, + 36766, + 35184, + 48421, + 42217, + 55192, + 41003, + 33377, + 41360, + 34722, + 37662, + 33714, + 34490, + 44674, + 39808, + 27344, + 34740, + 37369, + 48654, + 45383, + 32078, + 37496, + 41428, + 34781, + 38445, + 32083, + 34644, + 45631, + 39548, + 49208, + 41766, + 32694, + 40144, + 29312, + 42635, + 33299, + 28235, + 39072, + 43577, + 44018, + 44745, + 64177, + 41033, + 36850, + 47228, + 37136, + 27969, + 48339, + 29986, + 37554, + 50330, + 52510, + 58401, + 33834, + 45459, + 39736, + 60036, + 50065, + 40006, + 35650, + 46062, + 39613, + 32500, + 38871, + 36628, + 50021, + 40979, + 39267, + 56647, + 38981, + 42454, + 43034, + 33115, + 40408, + 59252, + 39144, + 46175, + 70565, + 37945, + 39574, + 44376, + 36233, + 31798, + 41979, + 41802, + 36239, + 48017, + 30966, + 58453, + 35334, + 43676, + 51292, + 54186, + 58061, + 47567, + 49457, + 37703, + 49346, + 39887, + 41090, + 41705, + 36365, + 56003, + 51177, + 51830, + 32873, + 48070, + 38097, + 35686, + 45801, + 46724, + 36677, + 39569, + 52505, + 56578, + 40527, + 36929, + 45883, + 59749, + 40612, + 34466, + 32532, + 38867, + 32058, + 31019, + 49022, + 40945, + 41107, + 31405, + 33662, + 36049, + 45956, + 30533, + 38061, + 58833, + 36998, + 33213, + 49453, + 37591, + 42649, + 31172, + 41670, + 37684, + 44399, + 34615, + 41952, + 32693, + 32879, + 44436, + 35777, + 48059, + 43294, + 40724, + 42331, + 75215, + 37864, + 33645, + 38404, + 35622, + 36908, + 35119, + 31658, + 62710, + 29581, + 37556, + 44329, + 36336, + 39869, + 49173, + 51727, + 61364, + 41270, + 52193, + 36382, + 47535, + 39322, + 37019, + 48600, + 51977, + 58125, + 40461, + 42285, + 41615, + 45196, + 34917, + 42077, + 60501, + 41353, + 44524, + 40815, + 35593, + 36910, + 32223, + 26701, + 55872, + 29325, + 31668, + 34204, + 60836, + 52011, + 40785, + 33874, + 38735, + 50544, + 40754, + 32026, + 32726, + 32319, + 52788, + 56235, + 32741, + 52579, + 37781, + 34450, + 39400, + 59151, + 36503, + 38801, + 37095, + 44872, + 35097, + 38207, + 31095, + 32865, + 46814, + 35407, + 39963, + 36842, + 49630, + 39687, + 30904, + 39851, + 37866, + 29545, + 39644, + 30606, + 47074, + 40395, + 43986, + 39815, + 30313, + 41766, + 37149, + 43678, + 43990, + 48587, + 49913, + 42501, + 31789, + 41579, + 39156, + 32567, + 44662, + 39867, + 44517, + 40178, + 36598, + 42591, + 51547, + 70161, + 43786, + 32671, + 32388 + ] + }, + { + "counters": [ + 37810, + 42645, + 47216, + 35267, + 44707, + 30307, + 42055, + 39158, + 32957, + 46980, + 43216, + 42438, + 39448, + 43647, + 44642, + 42961, + 32469, + 38376, + 29351, + 45351, + 41896, + 38139, + 34897, + 41231, + 44064, + 30867, + 43296, + 43230, + 45848, + 33124, + 41371, + 32397, + 60841, + 52724, + 41529, + 32720, + 36160, + 33729, + 44519, + 44160, + 42489, + 40584, + 40458, + 47997, + 44397, + 36710, + 40389, + 45020, + 35358, + 39949, + 28295, + 51557, + 42123, + 31577, + 36868, + 39648, + 36858, + 42056, + 42581, + 46807, + 48749, + 80745, + 38339, + 38693, + 41050, + 37375, + 34132, + 44696, + 35087, + 46651, + 37204, + 38329, + 44003, + 35169, + 38663, + 31010, + 36177, + 39781, + 62170, + 35743, + 38206, + 48027, + 47658, + 42033, + 45034, + 40166, + 34769, + 48337, + 45808, + 30097, + 28814, + 32272, + 45564, + 36152, + 38320, + 34044, + 35313, + 47951, + 47908, + 38056, + 35025, + 45162, + 47900, + 42936, + 38296, + 45683, + 34776, + 37416, + 50438, + 45812, + 35956, + 39316, + 35933, + 31640, + 49212, + 35110, + 46776, + 43390, + 31496, + 45686, + 39148, + 38585, + 45746, + 41388, + 39626, + 39530, + 36872, + 38645, + 34832, + 35302, + 35995, + 40747, + 26633, + 46335, + 60532, + 30483, + 44903, + 39212, + 40859, + 38154, + 49876, + 40485, + 43139, + 54519, + 51303, + 38367, + 53019, + 33801, + 48064, + 45993, + 46296, + 47162, + 45287, + 36955, + 39544, + 35690, + 54042, + 48477, + 32616, + 45675, + 35265, + 47040, + 38675, + 72795, + 44412, + 34761, + 28440, + 33711, + 41532, + 39545, + 47849, + 33643, + 34992, + 40991, + 47830, + 40039, + 36647, + 46564, + 44040, + 35872, + 49029, + 57379, + 32837, + 34477, + 30906, + 35832, + 34581, + 35595, + 31505, + 38815, + 31424, + 34267, + 41838, + 39195, + 33550, + 52736, + 41539, + 35564, + 41752, + 34569, + 32639, + 52541, + 54073, + 71266, + 33600, + 49934, + 41267, + 36422, + 35005, + 41863, + 36862, + 52514, + 40231, + 33126, + 33134, + 38893, + 32291, + 43836, + 39369, + 40844, + 51859, + 41704, + 45978, + 43950, + 49203, + 47342, + 52140, + 58554, + 34914, + 42914, + 54646, + 49712, + 30891, + 42617, + 38474, + 35765, + 42135, + 50593, + 45896, + 37941, + 35757, + 39339, + 35320, + 42459, + 33185, + 41769, + 42668, + 35900, + 38212, + 34131, + 36295, + 60754, + 31928, + 51849, + 29792, + 41241, + 34639, + 32245, + 33751, + 36779, + 49988, + 38976, + 41072, + 54919, + 48259, + 64831, + 37022, + 60121, + 29531, + 34709, + 38218, + 39491, + 39829, + 41987, + 39242, + 47013, + 48266, + 29264, + 37791, + 35426, + 45309, + 42742, + 45640, + 34529, + 53966, + 34193, + 36847, + 37058, + 39191, + 37236, + 36662, + 34747, + 34960, + 53960, + 36408, + 42822, + 47445, + 53888, + 52022, + 71253, + 43751, + 35955, + 38853, + 34478, + 32631, + 37138, + 54091, + 28267, + 49412, + 41353, + 36156, + 37770, + 41404, + 59133, + 30420, + 39183, + 40760, + 36461, + 41248, + 46590, + 77117, + 53802, + 39853, + 43331, + 36025, + 35616, + 37269, + 38792, + 38774, + 44203, + 35158, + 33811, + 38424, + 40466, + 42409, + 42602, + 33230, + 36013, + 32771, + 38646, + 40450, + 42727, + 36049, + 34941, + 44374, + 40118, + 55643, + 33863, + 28768, + 47681, + 37011, + 34880, + 42706, + 41226, + 59183, + 28052, + 44785, + 51501, + 35012, + 35769, + 60765, + 55841, + 55407, + 40168, + 39109, + 34112, + 44519, + 39220, + 35475, + 38093, + 37136, + 64856, + 51839, + 47833, + 38324, + 45626, + 43507, + 37429, + 35602, + 54304, + 53060, + 40329, + 45397, + 39503, + 32063, + 34544, + 49465, + 30506, + 43505, + 32933, + 36783, + 51892, + 34410, + 31538, + 38775, + 35794, + 34979, + 45423, + 41811, + 41561, + 39528, + 55362, + 42611, + 45336, + 54888, + 31730, + 41475, + 56566, + 35924, + 29043, + 40045, + 55082, + 42729, + 36058, + 34859, + 39529, + 35773, + 51034, + 38259, + 52854, + 40439, + 32872, + 34773, + 53424, + 40822, + 37672, + 32151, + 40835, + 38674, + 38820, + 60486, + 39979, + 44966, + 44134, + 44365, + 38738, + 39594, + 35977, + 30880, + 29528, + 47767, + 40625, + 34571, + 35489, + 31919, + 36563, + 32286, + 56258, + 37166, + 32908, + 55409, + 37697, + 34239, + 37854, + 41689, + 45255, + 38824, + 42562, + 33558, + 47634, + 32706, + 36430, + 51750, + 35469, + 33977, + 49062, + 66664, + 39896, + 40610, + 38426, + 28898, + 35438, + 45979, + 38635, + 34415, + 42343, + 36701, + 35897, + 36022, + 34739, + 45942, + 29396, + 32822, + 45461, + 39987, + 39187, + 36894, + 41141, + 33168, + 50775, + 41649, + 33383, + 30971, + 39283, + 44429, + 29944, + 35990, + 44502, + 43048, + 56201, + 30952, + 42337, + 28787, + 42915, + 42838, + 34617, + 42157, + 40976, + 36317, + 37625, + 56154, + 29419, + 38127, + 30562, + 36318, + 34541, + 45792, + 37078, + 47415, + 37774, + 32908, + 32152, + 39687, + 32672, + 45924, + 39900, + 52852, + 55461, + 32520, + 38325, + 54169, + 41098, + 33769, + 41991, + 39557, + 47780, + 35093, + 38493, + 37219, + 31678, + 50185, + 34849, + 41395, + 43163, + 35278, + 44921, + 55837, + 37481, + 38040, + 60100, + 42562, + 33629, + 42094, + 49644, + 36835, + 59306, + 40680, + 43162, + 43050, + 39428, + 41459, + 41414, + 32700, + 38477, + 47297, + 28284, + 46619, + 40708, + 36315, + 34646, + 45380, + 40506, + 35816, + 44712, + 34361, + 41623, + 39269, + 34214, + 35158, + 30631, + 30980, + 35877, + 33678, + 31452, + 33773, + 36305, + 39824, + 46165, + 33118, + 36383, + 39371, + 45286, + 39744, + 29996, + 40746, + 46163, + 36623, + 37136, + 36293, + 57324, + 50542, + 32695, + 44422, + 39474, + 40796, + 50486, + 37032, + 39061, + 31380, + 51660, + 29279, + 44424, + 39242, + 34902, + 40398, + 45586, + 42626, + 44768, + 53985, + 46787, + 41183, + 54128, + 49446, + 43541, + 42451, + 42302, + 39495, + 42442, + 45206, + 46430, + 36210, + 47387, + 36785, + 37195, + 43609, + 41722, + 61648, + 37893, + 40649, + 36756, + 44785, + 45054, + 41550, + 38478, + 37606, + 39000, + 54873, + 37342, + 40350, + 47121, + 34327, + 38468, + 55115, + 36978, + 48145, + 46118, + 29119, + 35690, + 40016, + 37778, + 36874, + 34588, + 31710, + 39386, + 33495, + 37143, + 34888, + 45697, + 36985, + 44451, + 35466, + 42904, + 34530, + 34838, + 49210, + 38494, + 52071, + 34223, + 33998, + 38201, + 35728, + 41082, + 41197, + 40848, + 42308, + 32276, + 36207, + 52218, + 30391, + 37160, + 33909, + 40633, + 49741, + 34457, + 43632, + 43139, + 39398, + 39367, + 52229, + 37958, + 32666, + 42477, + 34355, + 51979, + 41448, + 66789, + 47983, + 37214, + 38280, + 35921, + 29394, + 28647, + 53021, + 37078, + 35464, + 45756, + 38584, + 36861, + 61082, + 33694, + 36451, + 68847, + 43220, + 42232, + 35692, + 41977, + 51383, + 44155, + 43135, + 38298, + 28998, + 30732, + 34060, + 42317, + 49363, + 33608, + 40908, + 35823, + 43583, + 39030, + 45001, + 46603, + 38061, + 36114, + 37134, + 33775, + 40145, + 47236, + 40372, + 33840, + 55448, + 46613, + 39151, + 39036, + 31691, + 37617, + 62765, + 52004, + 41881, + 41816, + 40486, + 38725, + 36349, + 37903, + 50848, + 39441, + 38091, + 43898, + 41791, + 52472, + 54965, + 37312, + 34920, + 32584, + 36613, + 45518, + 43237, + 31781, + 35166, + 33618, + 31314, + 44858, + 42884, + 49508, + 47354, + 41252, + 28379, + 51217, + 49432, + 45950, + 33012, + 35464, + 82176, + 37741, + 36335, + 44121, + 36217, + 36272, + 58903, + 60765, + 36356, + 35393, + 32508, + 38516, + 39070, + 47572, + 55948, + 39029, + 35378, + 30677, + 39668, + 55083, + 44393, + 42568, + 54124, + 56095, + 49003, + 44085, + 47662, + 38541, + 47384, + 32621, + 33726, + 31574, + 65992, + 39515, + 36635, + 50219, + 37420, + 41816, + 38362, + 34045, + 38732, + 44300, + 39030, + 42301, + 33619, + 32878, + 42536, + 61585, + 58369, + 41405, + 42938, + 46430, + 38858, + 36832, + 40256, + 35730, + 40029, + 46695, + 43758, + 41867, + 53521, + 43865, + 41342, + 39532, + 44382, + 41510, + 30550, + 33447, + 31231, + 41347, + 37894, + 39215, + 43370, + 38659, + 55812, + 45536, + 30267, + 42640, + 40160, + 35909, + 33601, + 41375, + 45555, + 38828, + 36479, + 63064, + 42584, + 33840, + 55512, + 37614, + 45614, + 38379, + 51937, + 33725, + 32248, + 51062, + 40971, + 40482, + 39938, + 39278, + 39545, + 35591, + 57339, + 35528, + 33943, + 36144, + 52197, + 62337, + 38204, + 35858, + 50533, + 35730, + 35198, + 31013, + 49448, + 41766, + 46309, + 45719, + 43189, + 36779, + 32619, + 49184, + 36605, + 32005, + 52492, + 42360, + 45330, + 54340, + 48950, + 64609, + 31143, + 44285, + 42505, + 33480, + 51741, + 59000, + 39655, + 32532, + 50544, + 36389, + 32522, + 37877, + 32567, + 51105, + 41266, + 36542, + 33248, + 47456, + 42347, + 34646, + 52310, + 41737, + 38900, + 34487, + 34562, + 40904, + 31373, + 41672, + 35731, + 38593, + 58366, + 40340, + 39409, + 34872, + 35233, + 43090, + 41468, + 41117, + 72189, + 37583, + 41755, + 32709, + 49161, + 36711, + 35449, + 57794, + 64699, + 41879, + 34344, + 39625, + 35743, + 38670, + 31283, + 30617, + 36052, + 36094, + 45153, + 49760, + 34324, + 38223, + 51612, + 34181, + 36785, + 36862, + 32565, + 43886, + 60707, + 65294, + 57610, + 49017, + 40863, + 50479, + 31407, + 42769, + 44425, + 46071, + 40104, + 41365, + 38438, + 34923, + 44782, + 53745, + 48186, + 33801, + 35008, + 42281, + 51703, + 44825, + 35504, + 41464, + 38325, + 36171, + 33697, + 44589, + 40713, + 48646, + 45797, + 43554, + 41598, + 47898, + 36250, + 42144, + 46731, + 47632, + 33552, + 31817, + 45850, + 39050, + 52276, + 31017, + 39139, + 46830, + 41409, + 45912, + 35755, + 40424, + 41141, + 51715, + 49369, + 38819, + 59749, + 33828, + 34702, + 36192, + 51037, + 46671, + 35483, + 44827, + 41352, + 39959, + 27639, + 37854, + 46380, + 43774, + 32554, + 35428, + 39613, + 35259, + 47583, + 45540, + 38485, + 46949, + 59622, + 44751, + 54853, + 37869, + 35009, + 39186, + 40238, + 42172, + 36300, + 31155, + 37161, + 41214, + 49046, + 40418, + 34744, + 40826, + 40564, + 38220, + 40630, + 36894, + 41784, + 38516, + 42652, + 58966, + 44908, + 32757, + 38633, + 33391, + 32829, + 33816, + 44940, + 36881, + 47973, + 33148, + 50425, + 35638, + 34857, + 58157, + 40950, + 61192, + 38939, + 69660, + 28237, + 50320, + 33350, + 40233, + 48477, + 35381, + 46412, + 44555, + 34929, + 56466, + 39968, + 51769, + 39969, + 49556, + 42364, + 65026, + 33116, + 41255, + 57625, + 39838, + 39233, + 32734, + 42968, + 33775, + 33581, + 40514, + 45650, + 28584, + 37432, + 38702, + 37880, + 32525, + 38690, + 36224, + 45252, + 30506, + 46030, + 40128, + 42258, + 57338, + 55687, + 28703, + 44188, + 42673, + 41465, + 37689, + 27689, + 38692, + 57140, + 40263, + 35304, + 39334, + 42351, + 33663, + 39444, + 60869, + 41371, + 43716, + 36023, + 71833, + 44488, + 31022, + 37162, + 36705, + 47421, + 37348, + 34335, + 29386, + 51041, + 34111, + 39962, + 43577, + 35911, + 45657, + 31458, + 32512, + 30369, + 36877, + 64368, + 42897, + 43844, + 32051, + 47701, + 35774, + 38725, + 48926, + 38841, + 33870, + 40449, + 50691, + 34445, + 54079, + 34838, + 50660, + 34938, + 42550, + 44932, + 48800, + 35973, + 49324, + 40320, + 43185, + 45085, + 41483, + 39665, + 42697, + 37339, + 40283, + 36856, + 30495, + 34625, + 47083, + 40899, + 45455, + 72043, + 39935, + 41288, + 37605, + 32287, + 29343, + 38520, + 37299, + 42670, + 36247, + 34137, + 32507, + 42416, + 37050, + 46299, + 44423, + 40885, + 36522, + 35616, + 42926, + 44294, + 30354, + 32957, + 40244, + 54457, + 42336, + 36368, + 39094, + 42434, + 32577, + 35580, + 40818, + 35814, + 29672, + 28856, + 54177, + 35996, + 34718, + 39091, + 44820, + 42837, + 33849, + 29551, + 44446, + 43848, + 30111, + 48410, + 36082, + 62151, + 39788, + 41653, + 40731, + 34358, + 46575, + 41099, + 33039, + 47842, + 44815, + 39151, + 36714, + 34158, + 39915, + 35628, + 34443, + 46325, + 38778, + 40304, + 32014, + 34930, + 48973, + 53253, + 61464, + 36103, + 45360, + 39112, + 44751, + 35451, + 37066, + 31734, + 40648, + 28435, + 32636, + 34177, + 47260, + 50312, + 42926, + 60517, + 41105, + 27905, + 42468, + 32993, + 34307, + 44118, + 34182, + 48553, + 33482, + 49259, + 36639, + 44584, + 42288, + 43919, + 34125, + 28522, + 37948, + 41737, + 38967, + 44899, + 46752, + 29430, + 38250, + 34458, + 51981, + 35251, + 33389, + 52437, + 32491, + 44474, + 56774, + 35053, + 53305, + 40904, + 41693, + 38460, + 43310, + 31211, + 57734, + 61194, + 31648, + 34090, + 48414, + 43946, + 45399, + 37396, + 43823, + 42265, + 41523, + 31206, + 39462, + 38353, + 42850, + 45642, + 38003, + 35459, + 59048, + 42148, + 43834, + 53108, + 36682, + 40600, + 36592, + 31223, + 31458, + 38548, + 40907, + 35940, + 28307, + 34887, + 34685, + 34022, + 40045, + 48666, + 42963, + 38719, + 39152, + 38161, + 32993, + 33606, + 46927, + 29928, + 34213, + 48060, + 38912, + 38243, + 37568, + 66798, + 35521, + 39196, + 35178, + 40708, + 36931, + 38022, + 33693, + 43873, + 35661, + 55534, + 52766, + 30911, + 39699, + 36157, + 41486, + 55770, + 38127, + 34894, + 45835, + 36285, + 38559, + 35665, + 37648, + 34737, + 35696, + 49580, + 41117, + 36053, + 45312, + 45954, + 31075, + 36689, + 41592, + 35218, + 49669, + 40902, + 52570, + 35160, + 56731, + 35348, + 37136, + 41553, + 39858, + 58005, + 39763, + 34505, + 50801, + 37479, + 36839, + 40956, + 45607, + 35454, + 36741, + 49257, + 61594, + 40389, + 40493, + 32439, + 45089, + 31466, + 43543, + 37148, + 49710, + 40316, + 30882, + 34778, + 47798, + 35361, + 29121, + 45132, + 42292, + 40468, + 49672, + 36458, + 37746, + 36739, + 62018, + 36615, + 47676, + 37344, + 45208, + 37597, + 32750, + 37893, + 35014, + 48830, + 41497, + 31892, + 47831, + 40302, + 31176, + 36217, + 32628, + 39328, + 39487, + 40772, + 41255, + 29632, + 41006, + 46650, + 44654, + 40949, + 47869, + 39534, + 38972, + 31558, + 36023, + 35977, + 45477, + 45893, + 29317, + 57215, + 42510, + 47257, + 36383, + 66030, + 37341, + 41748, + 33964, + 48104, + 45383, + 28276, + 40554, + 36826, + 43220, + 33123, + 45889, + 43367, + 46913, + 49886, + 61958, + 35922, + 29855, + 42842, + 46418, + 38697, + 42884, + 30800, + 34968, + 39850, + 45910, + 48318, + 34590, + 43269, + 41419, + 46653, + 36468, + 38724, + 29932, + 55547, + 39516, + 40070, + 66438, + 36427, + 31553, + 37752, + 36846, + 33269, + 28787, + 33667, + 51611, + 34916, + 50677, + 48665, + 57986, + 52476, + 31843, + 37302, + 50475, + 43440, + 47581, + 36046, + 32280, + 37176, + 32604, + 41828, + 41715, + 44153, + 39376, + 29528, + 37730, + 39608, + 60226, + 48144, + 35357, + 41060, + 48076, + 47799, + 32687, + 34534, + 34066, + 46842, + 47853, + 55777, + 57761, + 38049, + 45280, + 41046, + 46877, + 61266, + 51397, + 32807, + 35030, + 36565, + 31754, + 34403, + 45093, + 69374, + 62049, + 36775, + 36690, + 57070, + 46548, + 40562, + 36244, + 41651, + 52505, + 43350, + 31585, + 36478, + 48493, + 36730, + 44888, + 36561, + 39910, + 36350, + 43565, + 41269, + 52453, + 44447, + 39701, + 38708, + 39398, + 44803, + 48055, + 55690, + 37343, + 58219, + 40962, + 36634, + 31277, + 43330, + 29380, + 43695, + 38274, + 41968, + 50353, + 48255, + 58015, + 46526, + 41546, + 42675, + 45934, + 39141, + 30515, + 46793, + 54529, + 57363, + 32840, + 28391, + 38967, + 34972, + 39318, + 41685, + 33837, + 39478, + 28798, + 38268, + 30234, + 32846, + 34148, + 67650, + 40611, + 41339, + 40095, + 29027, + 38088, + 39561, + 42517, + 60831, + 44424, + 34401, + 30268, + 47316, + 29062, + 35207, + 47594, + 38664, + 54210, + 30781, + 33415, + 45722, + 34649, + 32436, + 33007, + 40658, + 37384, + 37916, + 38044, + 31580, + 48740, + 37984, + 36013, + 42943, + 48586, + 60036, + 41366, + 42636, + 36212, + 40381, + 43419, + 58388, + 42148, + 47292, + 42555, + 42361, + 56821, + 38480, + 40681, + 52464, + 32566, + 30205, + 52090, + 36209, + 47652, + 48186, + 48816, + 42050, + 33366, + 35632, + 76701, + 38449, + 36163, + 42873, + 39109, + 51685, + 72487, + 43024, + 51886, + 38535, + 67319, + 32229, + 53332, + 48064, + 36929, + 41512, + 47568, + 47460, + 30226, + 40825, + 41970, + 70242, + 46510, + 30784, + 32615, + 34022, + 37349, + 50337, + 61854, + 38305, + 43703, + 46813, + 36591, + 32958, + 44411, + 44554, + 42561, + 47931, + 52149, + 59131, + 28379, + 49207, + 61287, + 37248, + 47726, + 33498, + 38218, + 46286, + 34624, + 59389, + 39073, + 40017, + 33444, + 36638, + 40117, + 58726, + 40514, + 52544, + 42261, + 33883, + 46798, + 42685, + 38015, + 46484, + 32169, + 34292, + 49270, + 40815, + 33985, + 37800, + 43211, + 32581, + 44657, + 46070, + 39996, + 40566, + 41280, + 41006, + 37368, + 41200, + 42797, + 40532, + 51530, + 34819, + 56993, + 41266, + 38391, + 40321, + 39243, + 34879, + 36756, + 31421, + 63298, + 51878, + 46596, + 37911, + 42179, + 38106, + 32026, + 48384, + 43019, + 42244, + 40778, + 42984, + 35891, + 34635, + 56707, + 32644, + 29292, + 34921, + 23752, + 53968, + 33436, + 45121, + 46703, + 43264, + 34035, + 31979, + 49613, + 28229, + 50535, + 30041, + 28732, + 40736, + 54710, + 38081, + 36751, + 37936, + 42423, + 34942, + 39453, + 33233, + 34145, + 58793, + 33035, + 43717, + 34254, + 43683, + 30790, + 37334, + 44467, + 41144, + 38523, + 35452, + 35853, + 29657, + 45635, + 30140, + 50897, + 34932, + 43018, + 31722, + 58172, + 36403, + 53597, + 33530, + 33753, + 45474, + 37378, + 42303, + 41526, + 45894, + 36014, + 42119, + 39178, + 42358, + 59763, + 40040, + 36416, + 40016, + 59961, + 41563, + 33798, + 46529, + 41549, + 39434, + 41388, + 53169, + 58088, + 31554, + 65852, + 45748, + 30832, + 46772, + 40653, + 35677, + 42343, + 42666, + 31567, + 32207, + 39047, + 37363, + 37951, + 37792, + 35850, + 50997, + 34115, + 36532, + 42290, + 32226, + 40635, + 40728, + 41638, + 43161, + 40697, + 37159, + 42463, + 36772, + 44555, + 45608, + 40691, + 37575, + 44475, + 29750, + 67995, + 38219, + 42966, + 29235, + 31253, + 32631, + 40418, + 35962, + 64639, + 28719, + 48791, + 38596, + 44654, + 32194, + 32112, + 32352, + 49144, + 31913, + 40162, + 43136, + 50967, + 31748, + 33610, + 45607, + 37225, + 45293, + 31415, + 46653, + 44983, + 37122, + 35090, + 42881, + 36443, + 41237, + 35674, + 50717, + 33417, + 77848, + 36642, + 31855, + 49052, + 36995, + 51347, + 42031, + 37852, + 39962, + 37216, + 44239, + 30735, + 45232, + 34094, + 37290, + 34537, + 36705, + 44759, + 43680, + 31676, + 41752, + 31797, + 37645, + 37433, + 40134, + 46335, + 46878, + 47958, + 40806, + 38262, + 30368, + 32348, + 37823, + 52879, + 37572, + 70824, + 46105, + 54151, + 55773, + 35561, + 36014, + 42263, + 38861, + 42328, + 36701, + 51625, + 39995, + 46336, + 40429, + 36020, + 37553, + 31749, + 42350, + 50567, + 43727, + 33285, + 48609, + 34916, + 37090, + 36159, + 50904, + 44824, + 42087, + 43911, + 35032, + 58547, + 41979, + 37219, + 38963, + 53451, + 38088, + 33489 + ] + }, + { + "counters": [ + 45582, + 37333, + 40758, + 41191, + 39331, + 41530, + 47169, + 34591, + 34779, + 41716, + 42607, + 42954, + 37337, + 31736, + 36492, + 42521, + 37019, + 38921, + 31362, + 44251, + 40345, + 40173, + 37895, + 34111, + 40002, + 33245, + 31421, + 41730, + 37657, + 45698, + 37530, + 44836, + 35221, + 39205, + 36308, + 37752, + 39544, + 36796, + 35571, + 38769, + 40687, + 41154, + 40308, + 41459, + 40998, + 50445, + 61044, + 31007, + 43956, + 33373, + 52664, + 37108, + 31789, + 47286, + 39541, + 33736, + 36305, + 35156, + 45571, + 36082, + 37275, + 43802, + 32940, + 33139, + 46509, + 40233, + 30351, + 39171, + 40085, + 42624, + 40396, + 52736, + 34893, + 38567, + 29791, + 49858, + 48841, + 47524, + 45705, + 44240, + 36002, + 29577, + 36808, + 44032, + 29354, + 41666, + 55564, + 40950, + 49732, + 40343, + 35911, + 40383, + 38869, + 39374, + 29247, + 44046, + 24883, + 46313, + 32071, + 52150, + 39782, + 37556, + 37146, + 35012, + 32703, + 42268, + 40904, + 33550, + 31846, + 31967, + 42582, + 43619, + 40811, + 42508, + 75269, + 38511, + 45513, + 35498, + 53945, + 39299, + 42151, + 43735, + 39372, + 39422, + 31906, + 38822, + 44442, + 41907, + 32519, + 38887, + 31196, + 37901, + 42675, + 53487, + 42151, + 34331, + 45830, + 36091, + 35680, + 41130, + 33880, + 41360, + 39508, + 44118, + 45575, + 41931, + 45641, + 39059, + 62041, + 31644, + 58798, + 39588, + 37264, + 37219, + 47331, + 38395, + 50381, + 36853, + 59261, + 40719, + 34772, + 32201, + 38056, + 57469, + 35882, + 47613, + 47087, + 50772, + 42537, + 33118, + 40487, + 45102, + 31725, + 34815, + 58826, + 30318, + 34628, + 46403, + 40497, + 40769, + 35297, + 37182, + 39650, + 30848, + 41071, + 52762, + 43272, + 38605, + 51437, + 36334, + 29421, + 38262, + 37516, + 34597, + 45343, + 43928, + 37964, + 31016, + 28585, + 44100, + 49982, + 35487, + 40885, + 42071, + 42108, + 39287, + 34342, + 55355, + 50693, + 31789, + 40513, + 37899, + 27796, + 33718, + 31732, + 40681, + 53761, + 45082, + 45951, + 35987, + 46505, + 65912, + 42255, + 38890, + 43707, + 34080, + 34110, + 36164, + 55615, + 41418, + 31845, + 47733, + 31484, + 63257, + 54903, + 40529, + 48227, + 42672, + 41254, + 40028, + 32986, + 51170, + 57629, + 42626, + 34263, + 34595, + 48986, + 40423, + 38534, + 46678, + 34084, + 33637, + 28980, + 37440, + 43407, + 43584, + 51494, + 44987, + 72366, + 36386, + 33526, + 42802, + 41684, + 35313, + 40452, + 37920, + 30616, + 32899, + 32850, + 40618, + 37747, + 46055, + 37450, + 44362, + 35285, + 45804, + 41555, + 37031, + 42606, + 36875, + 34096, + 46365, + 44393, + 33947, + 36436, + 34983, + 48578, + 40572, + 36559, + 33581, + 27847, + 38904, + 49246, + 46276, + 59150, + 35256, + 33349, + 38811, + 34930, + 41109, + 28816, + 29661, + 40536, + 40654, + 31468, + 32606, + 36296, + 33351, + 46929, + 42275, + 29726, + 35232, + 41693, + 51535, + 52717, + 45270, + 36778, + 34280, + 42077, + 34384, + 45244, + 43517, + 44056, + 40519, + 34635, + 41979, + 31039, + 35061, + 40081, + 37097, + 37373, + 50895, + 44864, + 51979, + 41648, + 34173, + 39011, + 33944, + 32916, + 43644, + 42673, + 31074, + 39438, + 37607, + 51213, + 44481, + 34791, + 44022, + 36766, + 41705, + 40515, + 42469, + 45507, + 33257, + 31946, + 38201, + 34388, + 34154, + 47331, + 41335, + 41346, + 31979, + 43882, + 36741, + 37748, + 35817, + 38153, + 45545, + 36702, + 36774, + 57557, + 67531, + 48828, + 41394, + 49530, + 29549, + 44080, + 37162, + 47608, + 57649, + 48445, + 39267, + 40283, + 42057, + 46677, + 32153, + 45484, + 36373, + 31599, + 43145, + 55347, + 37908, + 33244, + 41381, + 41585, + 37905, + 38682, + 48535, + 55721, + 38340, + 40091, + 31666, + 39505, + 34962, + 47586, + 59105, + 44328, + 40255, + 40607, + 46582, + 48169, + 41498, + 42321, + 59188, + 35032, + 42466, + 46847, + 34808, + 38663, + 64684, + 34777, + 47849, + 43155, + 38230, + 35892, + 40786, + 62019, + 60184, + 34220, + 44651, + 30390, + 30235, + 60184, + 42884, + 50727, + 43073, + 42502, + 36398, + 51786, + 41262, + 37678, + 28783, + 50036, + 39154, + 35830, + 44377, + 65761, + 37881, + 45965, + 53963, + 35492, + 35093, + 37536, + 34285, + 35963, + 32484, + 46409, + 44988, + 41830, + 36525, + 45073, + 36666, + 56294, + 33844, + 35333, + 48562, + 44591, + 43499, + 44230, + 63794, + 34001, + 38176, + 38379, + 50923, + 48044, + 49316, + 53401, + 37682, + 40921, + 41103, + 38822, + 39222, + 41608, + 35372, + 58399, + 43209, + 39826, + 25113, + 35165, + 50350, + 57921, + 52178, + 32296, + 42352, + 32045, + 57286, + 47236, + 32262, + 32538, + 46220, + 45209, + 40366, + 37351, + 39860, + 48090, + 34714, + 57384, + 33611, + 27278, + 42695, + 27960, + 37893, + 36253, + 43209, + 41614, + 34220, + 40466, + 42305, + 28980, + 30978, + 47462, + 42365, + 33631, + 38094, + 31819, + 42998, + 30168, + 39098, + 40671, + 37080, + 47044, + 50562, + 41273, + 45405, + 56679, + 43243, + 52303, + 39995, + 34763, + 42097, + 41286, + 31758, + 34786, + 43549, + 40787, + 34759, + 36967, + 41785, + 46052, + 27666, + 31575, + 37021, + 57492, + 51754, + 45031, + 43903, + 47825, + 47308, + 37182, + 43581, + 51264, + 35342, + 35930, + 28396, + 36448, + 43124, + 51646, + 38268, + 34265, + 36876, + 41800, + 50206, + 60878, + 43744, + 49409, + 38222, + 28721, + 39752, + 34287, + 57862, + 32732, + 69575, + 47728, + 56153, + 49143, + 45625, + 44947, + 42211, + 39780, + 55443, + 39642, + 34857, + 52645, + 31402, + 52144, + 50007, + 46636, + 42110, + 31992, + 44339, + 41952, + 44838, + 36130, + 33349, + 38359, + 32077, + 43956, + 40878, + 38972, + 37446, + 37228, + 44312, + 39482, + 34457, + 29299, + 39703, + 78442, + 49296, + 39752, + 36386, + 38776, + 46451, + 34690, + 35028, + 37563, + 37884, + 57872, + 67127, + 42633, + 37010, + 39854, + 36411, + 37369, + 52534, + 30204, + 55839, + 34878, + 44196, + 38845, + 37167, + 42138, + 41765, + 45418, + 41014, + 48708, + 50617, + 30016, + 46093, + 48138, + 42682, + 39246, + 37400, + 39313, + 44166, + 55295, + 37481, + 37362, + 35928, + 33170, + 52870, + 33360, + 44300, + 40210, + 40802, + 46353, + 67738, + 35715, + 44829, + 52677, + 32967, + 47182, + 29068, + 50155, + 33723, + 41810, + 40220, + 76419, + 32825, + 52208, + 64886, + 62025, + 42226, + 44729, + 37312, + 38174, + 51000, + 31593, + 42436, + 50129, + 82794, + 31517, + 51638, + 31680, + 36573, + 55762, + 59898, + 56611, + 35138, + 36072, + 42169, + 42707, + 46817, + 36046, + 35870, + 44139, + 40344, + 37855, + 41133, + 46121, + 37234, + 51493, + 42685, + 39925, + 42743, + 41402, + 38405, + 34256, + 32893, + 43135, + 40574, + 40824, + 37539, + 56470, + 37701, + 52935, + 42333, + 40588, + 35285, + 43437, + 38882, + 33326, + 38230, + 39422, + 75026, + 35855, + 35703, + 64014, + 47164, + 37066, + 50343, + 42576, + 45279, + 37483, + 52575, + 27946, + 41812, + 37759, + 37807, + 40564, + 58607, + 34212, + 58900, + 36027, + 49562, + 51506, + 56236, + 41685, + 38982, + 44424, + 38252, + 36660, + 36196, + 34317, + 35413, + 71810, + 37706, + 51445, + 43723, + 34241, + 41087, + 30333, + 35933, + 34464, + 44279, + 34341, + 58659, + 38161, + 56456, + 31960, + 38115, + 57549, + 39826, + 32621, + 37924, + 42833, + 37866, + 36317, + 38157, + 33666, + 66569, + 48385, + 46439, + 37793, + 39532, + 31618, + 37153, + 41549, + 42810, + 61073, + 37019, + 54245, + 46912, + 33635, + 42338, + 34549, + 63107, + 32715, + 46140, + 34620, + 46601, + 47662, + 52541, + 43408, + 36087, + 38064, + 33276, + 38906, + 35743, + 43268, + 47100, + 46845, + 36306, + 31822, + 46712, + 43010, + 40497, + 52493, + 40652, + 46484, + 35967, + 43503, + 38194, + 34382, + 40867, + 65294, + 29447, + 32717, + 35773, + 43764, + 54459, + 35056, + 36049, + 39289, + 47306, + 36387, + 41353, + 40755, + 44181, + 40340, + 33944, + 36644, + 51557, + 45175, + 48237, + 47995, + 48357, + 38396, + 57703, + 38004, + 59696, + 35965, + 39528, + 35644, + 41176, + 40169, + 51816, + 36251, + 34687, + 38682, + 38838, + 38895, + 36025, + 49686, + 41622, + 60326, + 36755, + 36798, + 41242, + 53699, + 36485, + 74864, + 33639, + 34894, + 51558, + 57965, + 42165, + 56281, + 43447, + 72990, + 51237, + 36215, + 50323, + 31834, + 45574, + 36807, + 47282, + 43133, + 32997, + 33656, + 34319, + 56973, + 41747, + 41612, + 37811, + 34744, + 32125, + 42543, + 34733, + 37198, + 34764, + 39542, + 39227, + 34552, + 37208, + 33513, + 35975, + 42231, + 42001, + 27656, + 31170, + 41297, + 41737, + 25812, + 40949, + 37287, + 39030, + 49919, + 35442, + 41624, + 33384, + 28403, + 79398, + 35649, + 28828, + 33888, + 33766, + 36344, + 37904, + 41232, + 29959, + 41477, + 28924, + 51553, + 35412, + 71970, + 50429, + 33534, + 65417, + 44484, + 27277, + 29794, + 43313, + 54346, + 38201, + 30213, + 48800, + 32066, + 39316, + 38055, + 42790, + 32439, + 51356, + 24507, + 52429, + 38611, + 39852, + 30409, + 36926, + 42780, + 45198, + 46162, + 33955, + 57768, + 33895, + 45735, + 44889, + 43536, + 37417, + 39980, + 40070, + 42279, + 38682, + 33194, + 47899, + 39621, + 44652, + 47988, + 59053, + 42031, + 37434, + 59219, + 40619, + 36732, + 46855, + 59533, + 32883, + 43863, + 39742, + 40062, + 40163, + 50086, + 40672, + 38664, + 34120, + 40955, + 35142, + 53280, + 30917, + 38983, + 38074, + 39007, + 48262, + 47320, + 46696, + 40391, + 45668, + 38960, + 33021, + 47208, + 39062, + 44984, + 34219, + 37177, + 55663, + 41667, + 35204, + 34661, + 37552, + 38802, + 36626, + 38475, + 44013, + 45046, + 44294, + 41115, + 50824, + 47055, + 32576, + 49022, + 63615, + 34990, + 35384, + 37699, + 32325, + 36414, + 29499, + 32343, + 38123, + 53159, + 42921, + 33397, + 36213, + 40962, + 33890, + 29805, + 49660, + 31404, + 42004, + 47557, + 35125, + 56707, + 53498, + 30669, + 42966, + 40197, + 32209, + 49247, + 42110, + 39240, + 52893, + 34928, + 39286, + 40701, + 31679, + 42415, + 41766, + 57094, + 32394, + 40489, + 35477, + 40971, + 38679, + 42533, + 33403, + 41415, + 44177, + 35939, + 58181, + 42829, + 35358, + 44000, + 58152, + 33223, + 39754, + 46012, + 36486, + 38494, + 36174, + 49530, + 41471, + 45858, + 54050, + 42377, + 47904, + 47366, + 37480, + 38627, + 31398, + 39907, + 41169, + 48011, + 41815, + 44575, + 36177, + 32694, + 40635, + 45644, + 49467, + 35414, + 52249, + 47332, + 42937, + 42442, + 57349, + 37364, + 34225, + 37446, + 57336, + 29639, + 41257, + 55746, + 53954, + 33280, + 42635, + 46352, + 34004, + 43123, + 32605, + 40680, + 36830, + 29530, + 40197, + 47734, + 47876, + 48372, + 40878, + 54758, + 37259, + 53531, + 39128, + 43250, + 47302, + 38695, + 45077, + 58557, + 44059, + 38657, + 33642, + 47755, + 72163, + 37109, + 33951, + 50171, + 32815, + 33078, + 41812, + 48867, + 31871, + 42217, + 55574, + 46271, + 33305, + 29469, + 38670, + 35045, + 34443, + 42264, + 41494, + 41900, + 55354, + 38051, + 36486, + 29945, + 43758, + 31825, + 62406, + 38995, + 42871, + 35895, + 41715, + 33126, + 42374, + 50834, + 42554, + 37362, + 30649, + 32375, + 32949, + 42851, + 55610, + 29902, + 36265, + 37337, + 37187, + 34541, + 41059, + 35190, + 34832, + 38315, + 52908, + 33668, + 47354, + 35110, + 35408, + 43792, + 37102, + 40906, + 37845, + 58074, + 40937, + 36500, + 35682, + 41365, + 44618, + 37351, + 34606, + 40900, + 39741, + 37320, + 38237, + 29827, + 33915, + 32099, + 31756, + 36744, + 37167, + 43616, + 44141, + 35682, + 52486, + 39926, + 36491, + 46295, + 41620, + 42953, + 31742, + 34650, + 45411, + 34208, + 32015, + 42602, + 72805, + 33999, + 35710, + 29577, + 57943, + 35248, + 36168, + 49285, + 45692, + 44371, + 34763, + 34600, + 32448, + 38982, + 32974, + 51924, + 63370, + 41635, + 38087, + 38961, + 49721, + 31427, + 31039, + 30255, + 44119, + 36044, + 51882, + 67945, + 31665, + 39930, + 45050, + 36222, + 45101, + 35216, + 34979, + 38319, + 38561, + 39589, + 33264, + 37251, + 32168, + 31078, + 35262, + 51965, + 38619, + 38086, + 38774, + 46185, + 50981, + 44262, + 50495, + 45673, + 44400, + 54524, + 40368, + 38672, + 58006, + 36183, + 34263, + 30584, + 35722, + 36499, + 36799, + 35918, + 43669, + 39720, + 30311, + 41626, + 48572, + 47038, + 32569, + 37330, + 49480, + 36591, + 42067, + 30102, + 32239, + 45959, + 38965, + 29563, + 37603, + 31908, + 34609, + 39663, + 44231, + 33780, + 33184, + 50418, + 34520, + 36648, + 34542, + 36267, + 34606, + 41961, + 39338, + 35259, + 50766, + 35636, + 46240, + 59794, + 45769, + 42823, + 32108, + 38595, + 49824, + 29120, + 45731, + 40581, + 37677, + 36558, + 37852, + 44698, + 36326, + 38204, + 31495, + 34107, + 36750, + 49760, + 46040, + 38356, + 42890, + 46814, + 31703, + 42939, + 42002, + 38237, + 40807, + 37425, + 40851, + 27037, + 42005, + 41082, + 38406, + 43077, + 36955, + 33614, + 43608, + 33621, + 37593, + 38288, + 38760, + 41720, + 45844, + 43339, + 28350, + 47199, + 38489, + 36243, + 46224, + 29698, + 38131, + 47210, + 28693, + 62714, + 32594, + 38335, + 30718, + 30739, + 27897, + 46352, + 44260, + 41269, + 33980, + 44396, + 54509, + 33017, + 36289, + 35178, + 49535, + 34104, + 45498, + 48527, + 33405, + 39964, + 35921, + 57650, + 49277, + 43994, + 40667, + 52030, + 38671, + 31208, + 31705, + 49395, + 46784, + 31493, + 33417, + 43717, + 37800, + 43399, + 37172, + 38039, + 63838, + 51868, + 39404, + 51127, + 35076, + 37865, + 49413, + 47143, + 42415, + 41396, + 33356, + 43987, + 62368, + 34487, + 36659, + 41754, + 30749, + 43018, + 38648, + 40917, + 81178, + 41903, + 63584, + 39075, + 42044, + 35256, + 49750, + 44774, + 34884, + 40988, + 37712, + 34643, + 33817, + 55795, + 41602, + 58382, + 36065, + 46120, + 36712, + 38052, + 56578, + 34469, + 41084, + 44776, + 40664, + 41569, + 41189, + 37929, + 54749, + 43844, + 29701, + 48900, + 25621, + 37268, + 31963, + 42419, + 41341, + 38492, + 43643, + 41176, + 52479, + 34030, + 48572, + 42223, + 47087, + 41982, + 45747, + 43975, + 82762, + 39968, + 43246, + 33465, + 46629, + 40861, + 33441, + 41825, + 42626, + 47117, + 34006, + 35239, + 37505, + 38507, + 46379, + 39265, + 48532, + 42269, + 36392, + 41237, + 32655, + 42253, + 45708, + 33584, + 37199, + 49175, + 45561, + 61292, + 31956, + 56923, + 48917, + 47229, + 48951, + 38383, + 31324, + 56593, + 36026, + 38865, + 43581, + 43589, + 46001, + 32521, + 51576, + 40061, + 33186, + 55760, + 38410, + 66535, + 52447, + 34419, + 36040, + 43078, + 41662, + 31947, + 47060, + 37134, + 34895, + 30453, + 40399, + 44401, + 42640, + 39946, + 32328, + 52302, + 32932, + 53692, + 38612, + 36160, + 47567, + 47288, + 66878, + 37216, + 34410, + 30613, + 36204, + 33862, + 39910, + 53380, + 34704, + 43574, + 37749, + 31647, + 44931, + 50828, + 39695, + 60233, + 36904, + 34449, + 37532, + 33540, + 36330, + 35342, + 33681, + 34472, + 68639, + 56998, + 36516, + 36534, + 44117, + 36485, + 35360, + 39925, + 39245, + 34808, + 45424, + 37123, + 47272, + 39240, + 37356, + 43800, + 44157, + 35480, + 36692, + 42391, + 43046, + 43225, + 40780, + 39823, + 35312, + 36073, + 49888, + 44436, + 33506, + 45051, + 33231, + 34456, + 32693, + 37917, + 35358, + 33686, + 37465, + 31638, + 45451, + 44428, + 43133, + 45652, + 54563, + 31856, + 42115, + 32702, + 37408, + 30140, + 40900, + 39762, + 32203, + 35414, + 31728, + 41638, + 39921, + 35197, + 37629, + 36581, + 35986, + 37831, + 36808, + 41726, + 30105, + 34172, + 31209, + 48882, + 32230, + 35371, + 50702, + 49396, + 34084, + 38138, + 36447, + 47263, + 46526, + 39783, + 33835, + 47574, + 42697, + 42472, + 41773, + 36500, + 39962, + 49055, + 39175, + 36638, + 36626, + 57071, + 28181, + 41600, + 33700, + 47416, + 31422, + 38028, + 54365, + 37475, + 41760, + 49367, + 46866, + 53023, + 51196, + 41591, + 42346, + 31686, + 40426, + 34691, + 43725, + 41450, + 35614, + 39984, + 31703, + 34173, + 34182, + 41671, + 33545, + 39770, + 36876, + 29414, + 36683, + 30012, + 35765, + 49880, + 37125, + 48126, + 53841, + 28472, + 37455, + 34284, + 40322, + 26424, + 50328, + 41325, + 33935, + 38724, + 48041, + 32410, + 44737, + 48450, + 38646, + 43154, + 45159, + 39255, + 33709, + 43627, + 27274, + 45005, + 38432, + 43241, + 46098, + 43840, + 35931, + 55512, + 38722, + 34500, + 67643, + 39738, + 57671, + 38590, + 33482, + 34581, + 52715, + 42201, + 32944, + 34540, + 43485, + 40667, + 32155, + 46881, + 51727, + 67565, + 33471, + 39824, + 30559, + 41692, + 31686, + 37879, + 32629, + 50777, + 45661, + 31262, + 55345, + 40136, + 32126, + 36805, + 39405, + 64570, + 38219, + 60674, + 44084, + 32046, + 42085, + 42951, + 34661, + 38258, + 38712, + 44467, + 37814, + 51054, + 42131, + 36624, + 33636, + 34692, + 44872, + 43767, + 49344, + 40920, + 42990, + 41437, + 32633, + 35109, + 46830, + 36903, + 40267, + 47530, + 44478, + 70176, + 34671, + 30157, + 34369, + 29449, + 43766, + 33835, + 34234, + 34510, + 41662, + 50042, + 35361, + 43206, + 44347, + 57140, + 38472, + 45928, + 36729, + 34801, + 62704, + 48725, + 42186, + 30785, + 38198, + 36791, + 33672, + 34674, + 31244, + 40255, + 47708, + 27943, + 38749, + 33265, + 38184, + 59046, + 43749, + 32240, + 47294, + 51083, + 46280, + 50946, + 39728, + 32767, + 43783, + 44054, + 42842, + 51902, + 36191, + 36894, + 38534, + 45299, + 33747, + 42142, + 35408, + 35709, + 43982, + 37089, + 33553, + 35188, + 57155, + 38591, + 43518, + 38708, + 35874, + 29643, + 36694, + 62345, + 42214, + 42035, + 51707, + 39593, + 51959, + 32966, + 51339, + 43006, + 34930, + 35108, + 36671, + 32854, + 39995, + 37786, + 44385, + 41104, + 46689, + 43985, + 34741, + 47923, + 32195, + 36281, + 40405, + 32253, + 40473, + 35667, + 53327, + 39746, + 38977, + 32467, + 49434, + 33004, + 45199, + 47498, + 33743, + 40389, + 57400, + 39994, + 31819, + 35349, + 44607, + 90291, + 44415, + 49678, + 33581, + 37096, + 49345, + 33929, + 34315, + 31960, + 40602, + 32011, + 50653, + 41879, + 38601, + 45367, + 55387, + 32113, + 47728, + 39692, + 37646, + 46366, + 39899, + 45377, + 42304, + 46125, + 42241, + 40596, + 64030, + 31849, + 32708, + 34394, + 51354, + 43742, + 59586, + 45129, + 45449, + 41081, + 30179, + 46559, + 49131, + 35428, + 38611, + 39621, + 30113, + 43911, + 39454, + 47274, + 46142, + 42717, + 39616, + 35737, + 33521, + 37943, + 33251, + 38330, + 39746, + 48208, + 37707, + 47008, + 37938, + 32225, + 41540, + 30560, + 66137, + 28111, + 41036, + 41591, + 49317, + 37652, + 65717, + 36125, + 36629, + 32650, + 39131, + 46373, + 45380, + 49248, + 32201, + 33017, + 34829, + 31235, + 48469, + 35287, + 36250, + 36246, + 36118, + 31735, + 52432, + 34425, + 45783, + 30903, + 35826, + 44206, + 31979, + 37722, + 63466, + 62454, + 53521, + 38222, + 37594, + 50557, + 32876, + 38900, + 40862, + 37617, + 57466, + 40880, + 38223, + 35726, + 34361, + 43091, + 51628, + 35159, + 35461, + 32219, + 34556, + 28191, + 43397, + 36597, + 39262 + ] + } + ], + "top_n": [ + { + "data": "CA4=", + "count": 81000 + }, + { + "data": "CPwD", + "count": 11060 + }, + { + "data": "CKgC", + "count": 19693 + }, + { + "data": "CBQ=", + "count": 62527 + }, + { + "data": "CAQ=", + "count": 242073 + }, + { + "data": "CNAC", + "count": 13709 + }, + { + "data": "CBw=", + "count": 41344 + }, + { + "data": "CEA=", + "count": 27255 + }, + { + "data": "CJgD", + "count": 11572 + }, + { + "data": "CIoF", + "count": 6201 + }, + { + "data": "CCA=", + "count": 34252 + }, + { + "data": "CAw=", + "count": 95159 + }, + { + "data": "CAg=", + "count": 133814 + }, + { + "data": "CKYB", + "count": 22005 + }, + { + "data": "CK4M", + "count": 3566 + }, + { + "data": "CPoB", + "count": 23471 + }, + { + "data": "CMQB", + "count": 19993 + }, + { + "data": "CO4G", + "count": 1804 + }, + { + "data": "CAo=", + "count": 111789 + }, + { + "data": "CBo=", + "count": 48374 + }, + { + "data": "CMwI", + "count": 8773 + }, + { + "data": "CD4=", + "count": 27052 + }, + { + "data": "CDQ=", + "count": 26340 + }, + { + "data": "CBI=", + "count": 61603 + }, + { + "data": "CLAB", + "count": 13353 + }, + { + "data": "CCY=", + "count": 32444 + }, + { + "data": "CBA=", + "count": 75851 + }, + { + "data": "CAY=", + "count": 162276 + }, + { + "data": "CCI=", + "count": 40210 + }, + { + "data": "CFI=", + "count": 29309 + }, + { + "data": "CKgB", + "count": 12266 + }, + { + "data": "CJAC", + "count": 11990 + }, + { + "data": "CB4=", + "count": 42518 + }, + { + "data": "CBg=", + "count": 42105 + }, + { + "data": "CMQE", + "count": 10599 + }, + { + "data": "CAI=", + "count": 1073673 + }, + { + "data": "CH4=", + "count": 15369 + }, + { + "data": "CGo=", + "count": 17887 + }, + { + "data": "CBY=", + "count": 50210 + }, + { + "data": "COoC", + "count": 13540 + } + ], + "default_value": 0 + }, + "null_count": 0, + "tot_col_size": 328809523, + "last_update_version": 419082401752547432, + "correlation": -0.037462 + }, + "d": { + "histogram": { + "ndv": 806400, + "buckets": [ + { + "count": 19344, + "lower_bound": "MDAxYTE5Njk2MjdmNDYyMDhlY2M3NDNhNTRhOTY3YjE=", + "upper_bound": "MDEyOWZmOTUzNmQ5NGFiM2I1OWQyMGJmMzM2YzBjNTY=", + "repeats": 488 + }, + { + "count": 38688, + "lower_bound": "MDEzYmZjMTQyOWRmNGFjM2FiMTc0ZGJkOGQ4MmM5ZmM=", + "upper_bound": "MDI1YTQ1Nzc4ZjMzNDYxNmEzYzFiNTQ1MzMyM2U3OTc=", + "repeats": 971 + }, + { + "count": 58032, + "lower_bound": "MDI2M2FlM2NjMWMzNDVjNDhkNmY4M2IyN2EwMTIzYTM=", + "upper_bound": "MDM3OGQxZWU1MmRjNGY5YjkyZDFhNDkzMWY3NTIxYTg=", + "repeats": 5 + }, + { + "count": 77376, + "lower_bound": "MDM3OWFjZWQyNWY5NDYwYzk5YmYxNWFlNWYzNWJkNjI=", + "upper_bound": "MDQ2OGI3OThiMjBkNGQyM2EwZjMwMTRjMDg2MjRmM2Q=", + "repeats": 5 + }, + { + "count": 98171, + "lower_bound": "MDQ3MTVhYzdkOWY3NGNkNThiYWMzNzViMzRiNzEyODQ=", + "upper_bound": "MDUzMTRmZDQ4NzA0NDMzM2I1MzQ3MGNhOTlhZTBlOWE=", + "repeats": 2903 + }, + { + "count": 117516, + "lower_bound": "MDU0ZTIxYjIzY2RiNDNkZDkxMjlmOGY1YzUxZmFhZTk=", + "upper_bound": "MDY3MGMzODVlOTczNDE4MzgyODE1OWY2MjE0YWI4NDU=", + "repeats": 5 + }, + { + "count": 136860, + "lower_bound": "MDY3MGM3Y2IwY2FmNGI1NGIyZjRlMWJjNjJlNTViNTY=", + "upper_bound": "MDc2MDk1ZTY0NWM4NGJhYWJjMDIzY2VkOWIzYmQwNTE=", + "repeats": 5 + }, + { + "count": 156204, + "lower_bound": "MDc2M2ZmNTk4YjFjNGUxNjgwYTQ5M2Y2M2QwMGEyNDQ=", + "upper_bound": "MDg4MDY5YTVkZGFjNGQ5NDkwN2ZiNjZjYzVjZWRlZmM=", + "repeats": 488 + }, + { + "count": 176516, + "lower_bound": "MDg4MGE1MTlmYTZjNGIxOGI2MjdhNGEwMDQ2OTYyMWQ=", + "upper_bound": "MDk1YmQ4MGRlMTAyNGYyNmI3MGQwNjU3Mjk3NmJkYzQ=", + "repeats": 1937 + }, + { + "count": 197311, + "lower_bound": "MDk2N2Y2YjRhODkxNDY4OTlkOWEzM2Y4ZjJmM2FmZWM=", + "upper_bound": "MGEyOGRlNGFkYmNhNGY5OTg3M2NjNWU0ZmJhZWNkNGU=", + "repeats": 1454 + }, + { + "count": 216655, + "lower_bound": "MGEzZmI1NWZlODY4NDJkZTlkYzExYjNmMTE3MzhmZmM=", + "upper_bound": "MGIzNGExYjY5MGEwNDU4MjkxMjk2Y2Q4MTcyMGJkZTE=", + "repeats": 5 + }, + { + "count": 235999, + "lower_bound": "MGI0YzE3NGFmYWE5NGIyMWJlNWFkZmMwYTg2ZGJlNTQ=", + "upper_bound": "MGM2ZGU4ODJlN2Y0NGIxMWEzODAxNmE4YjUxMGJiNTY=", + "repeats": 5 + }, + { + "count": 255827, + "lower_bound": "MGM3NTdkYjAzYjVkNDZhMThiNWI0MjkxY2FiMjlkY2I=", + "upper_bound": "MGQ5ZGMyMmU3MDc0NDcwMjliOTYzOGU0YWEwODlhZTg=", + "repeats": 488 + }, + { + "count": 275171, + "lower_bound": "MGRhMGFlMmUxYmJjNGNiYjkzYzEyNDMxZDdkMWE2OGI=", + "upper_bound": "MGU5ZGZlNjhiNTg2NDU2MWE0MTIwMWFmZjE2OWM0NzI=", + "repeats": 5 + }, + { + "count": 294515, + "lower_bound": "MGU5ZTVhN2FmMjliNDNmM2JlM2ZmOGQ2ZjIxOWU0NGM=", + "upper_bound": "MGY2ZDExMjY3NTUwNDA1NjkyZjQ3NTk3ZGY2ZjJiZWI=", + "repeats": 5 + }, + { + "count": 313860, + "lower_bound": "MGY3MzhmYTJkYTM2NDdiMWFiOTdjZGEyYWVhNGRiYjE=", + "upper_bound": "MTBiZjA3MWUyNGJiNGViNjgzMjg5ODIyYTcxYjEwNDY=", + "repeats": 5 + }, + { + "count": 333204, + "lower_bound": "MTBiZjVhOTE2NTNjNDZkN2EwOTRkYzI1MzYzOTE0ZGE=", + "upper_bound": "MTFmNzkzMTdmYzJkNDBmZDg1NTY5ZDQ4N2QxNzExNDM=", + "repeats": 5 + }, + { + "count": 352548, + "lower_bound": "MTFmYjMyNTZiZGI1NGIzMDk3NjAxYzAzNGRmNTIwMGQ=", + "upper_bound": "MTM2NTg2OGIyNjU5NDA0Y2E4ZGFhYjMzNzczZWZkNGM=", + "repeats": 5 + }, + { + "count": 371892, + "lower_bound": "MTM2ZDdjYmZhNTI2NDFjNzgyY2EyMDk2MTdmOWI2Y2M=", + "upper_bound": "MTQ2NDAyY2I4MTFiNDY3ZDkzOTFlZTFkODllOWQ1ZGM=", + "repeats": 5 + }, + { + "count": 391237, + "lower_bound": "MTQ2NzQ4NTNkZDhkNDQyOWI4YTAxNmJkNjUzMDY0YmU=", + "upper_bound": "MTU0NDhiYzdhMmYzNDMyNzgyMTQzNDcxY2YwOGM1MWY=", + "repeats": 5 + }, + { + "count": 410581, + "lower_bound": "MTU0ODM5YTMyMDYwNDA1NzlmZjA5MTAyYjA3NDBlOGI=", + "upper_bound": "MTY0MzFhNGE2NWJlNGE0ZThmMjJhYjkxYWRmNTc5YzU=", + "repeats": 5 + }, + { + "count": 430409, + "lower_bound": "MTY0Y2ZhZjFmNjI0NGJmYmI1OTU3NDgxMWFmZjBhNjk=", + "upper_bound": "MTc0OTFhZGYwMWU2NGEyN2ExMWEwZDIyMGMyMzRhZDE=", + "repeats": 488 + }, + { + "count": 451687, + "lower_bound": "MTc1NGFmYzIxZmUyNDk4MWI0MTNhMDk4ZWIyYzI5NzM=", + "upper_bound": "MTg4MjdmYzg0Njk1NDExYjhjZDg4OWEyMjIyODI0MWI=", + "repeats": 1937 + }, + { + "count": 471032, + "lower_bound": "MTg4NDIzNDgzOGJkNGFkYWJkYzI5ZDA1MDM0N2M5OTg=", + "upper_bound": "MTlhYzNiYWQ0Y2E2NDVhNTgzMmViMDk3YTYxY2ExZTk=", + "repeats": 5 + }, + { + "count": 490376, + "lower_bound": "MTliOTY5MGRiMzFjNDYyZDg4MjNmZTFlZTExM2ZlNzM=", + "upper_bound": "MWFiMWZmM2FlZGIzNGI5YzgzYWUwOWJiMDY4OTRkOTU=", + "repeats": 488 + }, + { + "count": 510204, + "lower_bound": "MWFiNjQwNDFmZDliNDM2Yjg4OGJmZTZlNmEwM2U4ZmY=", + "upper_bound": "MWI2NjIxNDZhNDkwNGFjOWE2NWUyMzQ2MjNlOWUxNzI=", + "repeats": 1454 + }, + { + "count": 529548, + "lower_bound": "MWI3Yjc5MDdiYmI0NDJjN2E0NTI5YzZhZDQ2OTQxM2M=", + "upper_bound": "MWM2ZDQ1MzQ0MjMwNGYxY2E5ZDYzYmY4MmQyNjIwMzM=", + "repeats": 5 + }, + { + "count": 548892, + "lower_bound": "MWM2ZjU0ZWMwYzllNGRlMGFlMGU3ZWZmMmNjMzk3NmY=", + "upper_bound": "MWQ3MDBkMTJjYThhNDQ5ZTkxNDkyMjdkMDUyMTFhMGU=", + "repeats": 5 + }, + { + "count": 568720, + "lower_bound": "MWQ3NDk0Zjk3YzQ3NDcyZWJlZTQ0MjljYjM0NjhkYzE=", + "upper_bound": "MWVjYjAyNGM2MzVlNDBkMjg5MTJjMzE0NmU5Njc4YjI=", + "repeats": 488 + }, + { + "count": 588064, + "lower_bound": "MWVjZDBiMjQ2MDkxNGQ2MWI3ZWNhZThlYWU5ZDU4MmQ=", + "upper_bound": "MWZmNzU3MzY0Nzg3NGIzNWFmZDg0MDNiOGEwN2E2YWE=", + "repeats": 5 + }, + { + "count": 607408, + "lower_bound": "MWZmZWExNTI4MGJhNGM5ZmIyYjZjNjVkYjc2NDllNWM=", + "upper_bound": "MjFhYzNlNWQ4ZjNlNGFlYzg4ZWUwZThkZjY0MjdiMWI=", + "repeats": 488 + }, + { + "count": 633039, + "lower_bound": "MjFiOWZkNTM3NDI4NDU2NTkzZmE0Nzc1ZjU3MTk0ZjA=", + "upper_bound": "MjJlZDcxMTE2ZTU5NGE2ZDhkYWEzNjI2ZTA2YWM3OWY=", + "repeats": 8216 + }, + { + "count": 652384, + "lower_bound": "MjJmYjIxZWYxMzE5NGI2NGE5MTRiMWU4YzExYmNmNWE=", + "upper_bound": "MjNhYWI3YWNkYzA3NGZjYjg4NTgzNmFmNWI0YmJmMmQ=", + "repeats": 488 + }, + { + "count": 671728, + "lower_bound": "MjNhYzUyZjBkZDI4NDFmZTljYzc5OTk5YjE2MDZlMDQ=", + "upper_bound": "MjQ3NzhkMTgxYWI3NGVlZWEwNjMyNDM1ZjRmZjk4ZWM=", + "repeats": 5 + }, + { + "count": 691072, + "lower_bound": "MjQ4MzFmZjllNzExNDJhZDhmYzdkYWM3OGUyNzRlZjA=", + "upper_bound": "MjU4MTkwZmJlMGYzNGI3NDg5M2U4YzQ5YjdmMWZmNTA=", + "repeats": 5 + }, + { + "count": 711384, + "lower_bound": "MjVhN2IwMzQyYzEyNGU2YzhmNWVhZWZhMzJlMTVhMDc=", + "upper_bound": "MjZiNDQ4ZTJhMDZiNGFjM2JiZWRhNTY4NDEwZGFmY2Y=", + "repeats": 971 + }, + { + "count": 730728, + "lower_bound": "MjZiYmQzMTczNmRkNDYwODgwNjVjOTU3YTU1Yjc3ZWI=", + "upper_bound": "MjczZGM2YTc1MGFjNGNhOWJmZGIyOGE0ZDA0Y2IyOTg=", + "repeats": 5 + }, + { + "count": 750072, + "lower_bound": "Mjc1MGNhZDQ1NGRhNDhmMGE5NjJmMTM4NTA5OTVhOTE=", + "upper_bound": "Mjg5ZGRjZjlmN2VhNDcyYjllYzI5MjZiODFhOGUzZTc=", + "repeats": 5 + }, + { + "count": 769416, + "lower_bound": "MjhhZWFjNzc1OTk3NGM1N2I5MGJlYThlNDc2Y2ExZTI=", + "upper_bound": "Mjk0ZjE4NDVhMTRhNDA2MTgwNDNlYzg1ZGRiYTcxOWE=", + "repeats": 488 + }, + { + "count": 788761, + "lower_bound": "Mjk1NTMyNmM0NzMzNGJlYzkzMDczNDVlOTk3MGNjMmI=", + "upper_bound": "MmEyMWJlY2JkNGM2NGE3OWE4YzMxMWRkYzIwMDQyZWM=", + "repeats": 971 + }, + { + "count": 808105, + "lower_bound": "MmEzNjNjNGM3OGE2NDAzNmI4YjUzNmI1ZTRmNTZlZmE=", + "upper_bound": "MmI0MDlhNzA1ZWVhNDkxNzljYmUyYTc1ZmM4MjA4ZjI=", + "repeats": 5 + }, + { + "count": 827449, + "lower_bound": "MmI1NDE5OWEzMmY5NDg3YTg2NzIxODcwZDhkYTY5NTY=", + "upper_bound": "MmMyNjkyOWI2NzlmNGRlZGIxZDgwNzdmZTdkNzc0OTQ=", + "repeats": 5 + }, + { + "count": 847277, + "lower_bound": "MmMyOTFlNGY1NTIyNGQxNWI1MGE3YTIzOTg2NDIxNTE=", + "upper_bound": "MmQ0MWVjZmE5NTg2NDBiYzg5NGUyZTIzMDI3NDkyNzY=", + "repeats": 488 + }, + { + "count": 866621, + "lower_bound": "MmQ0ODUzMDlmMzg0NDcyZGI0MDk5NzhmOTAzODE3ZGU=", + "upper_bound": "MmUyZmQyMjg4N2NlNDdmMjhkOGM1OTM0M2ZjYmU3YTg=", + "repeats": 488 + }, + { + "count": 888867, + "lower_bound": "MmUzMDdjMGMxYjdiNGNhZDgwYjk2Mzk5MjhkNzJkYzk=", + "upper_bound": "MmU3ZmEzNTAxM2MyNDg0ZjlhZGQzMTNjNDI3MGY4NWQ=", + "repeats": 11597 + }, + { + "count": 908211, + "lower_bound": "MmU4NmIyODExYTg5NGI1OTg1MGNhNGRmMDUzNmFhMTQ=", + "upper_bound": "MmY3YjIzMDgxZTQzNDQxNTljZGY0M2QyNDVkY2UyY2U=", + "repeats": 5 + }, + { + "count": 927555, + "lower_bound": "MmY4MTRiYTE3OWFlNDZkZjk3MjdkODYyMDMyNjk0YTI=", + "upper_bound": "MzA4ZjI0ZWM3ZmNjNDIwMDk4ODVkMmNjZmZhN2YwNGY=", + "repeats": 5 + }, + { + "count": 950285, + "lower_bound": "MzA4ZjM4ZTg4YjFkNGRmYjgzMDEyYjI3YTQ5NjYyNGI=", + "upper_bound": "MzEyZjlkNzBlMTgxNDAyMjkxYjUxY2RhMzkzNWJhMDU=", + "repeats": 3386 + }, + { + "count": 969629, + "lower_bound": "MzEzM2RjZjVjNjFhNDU5ZWFjNTllZWM4YTdkOTNkZDc=", + "upper_bound": "MzI2NjNhZGY3NGZkNGQzYTkyMDcxNDFlZWUzZjk2ZDU=", + "repeats": 5 + }, + { + "count": 989457, + "lower_bound": "MzI3ZmUwM2NlYzNiNGE3YTg5ZWEzZTE5NDg3YjA3ODA=", + "upper_bound": "MzM4ZjBiNWIxYjdjNDRhYTlkNjEwMGYyNzM5YTkyNGE=", + "repeats": 488 + }, + { + "count": 1008801, + "lower_bound": "MzM5MTZjOGRjZTQ3NGVhMmEwM2UwMjNkZTI0YTUzY2E=", + "upper_bound": "MzQ3NGQ5OTJlMTNlNGJiZDg1Zjg5NGY3YzljZGQxYjU=", + "repeats": 5 + }, + { + "count": 1028145, + "lower_bound": "MzQ3ODUzMzgzMjZlNDQ1ZDkwMTU5NDFiYWNlNTY2YTk=", + "upper_bound": "MzUzNGM3YzAzZmU4NGM4OGI1YzQyZGM0OTc5NTlkODk=", + "repeats": 5 + }, + { + "count": 1047490, + "lower_bound": "MzUzZWYzMTNlZDMwNDBlMGI3MzRkZmQ5OWQyNWMxMGY=", + "upper_bound": "MzY4ZjRkNzc2Njg5NDI5ZmIzZDBiZDc5NzY1ODJmODg=", + "repeats": 488 + }, + { + "count": 1066834, + "lower_bound": "MzY5MTg2ZmEyMDY0NDIxNDg1NmE0M2NlMWE3ZGMzMDg=", + "upper_bound": "Mzc5NzBjYmQwMWEwNGMxMWE3NmIwMDYwMmM5NTk5YmM=", + "repeats": 5 + }, + { + "count": 1086178, + "lower_bound": "MzdhMDdlNTM4NzY3NDFjZTllZTFjNmMxZmU3YzA2ZTY=", + "upper_bound": "MzhjZjU3ZjFjOTkzNGFiOGI1MzY4M2NkN2NiNDQwMTY=", + "repeats": 971 + }, + { + "count": 1105522, + "lower_bound": "MzhkMmE0ZGFlMzVhNDlkMDhmYzExNjA4YjEyMjAyNDU=", + "upper_bound": "Mzk4MmVjMDAwM2ZiNDVlMjg4MGYxYjk5ZjY3Y2NmMGE=", + "repeats": 5 + }, + { + "count": 1124867, + "lower_bound": "Mzk4YzcwZjI1ZGRjNDViYjg3YmZmNmIzNzMzODhiNmQ=", + "upper_bound": "M2E1ZmZiNzU0M2IwNDI2MmE5Y2NlZThkYWE2MmQwMWM=", + "repeats": 5 + }, + { + "count": 1144694, + "lower_bound": "M2E3MTYzMjUxMzRlNDgxMGI3NDg4ZWEyYmJlMzg4NDE=", + "upper_bound": "M2I3MjRkZWYyMzE2NGE0MmFjY2NhYTI2MjEzMzUwOWY=", + "repeats": 488 + }, + { + "count": 1164039, + "lower_bound": "M2I3M2ZiZjc3NDQ2NGY4NTgzMWU2ZGY1YjMwZjM0OTQ=", + "upper_bound": "M2M3OWNmZmY2ZDE0NGNlZDk5Zjg3MjkwOGQ2ZDVmYjc=", + "repeats": 5 + }, + { + "count": 1183866, + "lower_bound": "M2M3ZGJlMGRkMGYxNDczYWFjYjA3ZWE0OGY4YzY5Zjk=", + "upper_bound": "M2Q2YjljYjM2MjU3NDM3MWFmZGUwODkyNGFlODA5Yjk=", + "repeats": 971 + }, + { + "count": 1203694, + "lower_bound": "M2Q2ZTIyYjVlZGFiNDkyYWJiMThlODM5OWE2Yzg2ZmI=", + "upper_bound": "M2RkZTkwZGEyYzYyNGMyN2IyZTgzZGY0MmRjNTkwNzE=", + "repeats": 488 + }, + { + "count": 1223039, + "lower_bound": "M2RlMGQzY2U2NTFiNGM0MjkyMDM4YmZiZGZmMDkyNzk=", + "upper_bound": "M2VkN2M2NjhmYzI5NGM4NGIxYTMyMTIwYmU2Y2E2ZGI=", + "repeats": 5 + }, + { + "count": 1242866, + "lower_bound": "M2VmZWRlYjc3YjY1NGIxMWJkMmExY2U0ZDZlMDI1YTY=", + "upper_bound": "NDAwNWVjMTk1MTkzNGY1NzhjN2ZmZmIzODdhMzg0MTM=", + "repeats": 971 + }, + { + "count": 1262211, + "lower_bound": "NDAxMDY2M2E2MTFjNDdiODk4ZGRkODQzODFjYjFiM2U=", + "upper_bound": "NDEwZTIyMDM4ZWZlNGE4YTk4MDZlMzE2ZGVjMzZkMTQ=", + "repeats": 5 + }, + { + "count": 1281555, + "lower_bound": "NDExMzU2OTJjODM3NGVmMWI3ZjM5YjllMGM1NzE2YTA=", + "upper_bound": "NDI5MDY1ZjE0ZDE4NGI2NThiYThmYTJlYzAxMzZkOGY=", + "repeats": 5 + }, + { + "count": 1301383, + "lower_bound": "NDI5NzdiMjY5MWIyNDM0NmI2MDQyYTM5NDVjNjFhYWI=", + "upper_bound": "NDQwNmY2NmIwNzg1NDY2NzliZjI1N2NlMTY3NTVjNjE=", + "repeats": 488 + }, + { + "count": 1320727, + "lower_bound": "NDQxMmEyYWExZDhiNDYxYTlhMDY0YmUyNjhjYjA0MmE=", + "upper_bound": "NDUwNGJhMWM1MDYyNDQzZDk4NTUwNjRjOGE1M2JiOWE=", + "repeats": 5 + }, + { + "count": 1340071, + "lower_bound": "NDUwOTEwNDk1MDVhNGQ1OGI5ZTRlNGE4MmNhMzI5NzU=", + "upper_bound": "NDYzNmM5YTE4ZWI2NDhmMGJmMzdkNzc2ZDI5YmUzNWE=", + "repeats": 5 + }, + { + "count": 1359415, + "lower_bound": "NDYzN2U2NDcxMDZhNDE4NzlhM2U5ZGVmOTgzN2M4ZTg=", + "upper_bound": "NDc0MjY5MTVmMTQyNDlkYzg3Yzc4NzVjYWJiM2UyMTk=", + "repeats": 5 + }, + { + "count": 1378760, + "lower_bound": "NDc0Y2I5NGNmNzk0NDA2YjlhZjU3NDFkNjZiNzllZDU=", + "upper_bound": "NDg4NTI4MGY3MDRjNDMwYjg5ZTJjZmQ1NTFmYjY0ODQ=", + "repeats": 5 + }, + { + "count": 1398104, + "lower_bound": "NDg4YTk3ZDNiMjdmNGNjZDk2ZjVkMDA0NGYwNGU0NjU=", + "upper_bound": "NDlhY2VlMmVlNzI5NGZkNTg0YWEwYWUwYzFmYjM0OWI=", + "repeats": 971 + }, + { + "count": 1417932, + "lower_bound": "NDliNjg3MDMxZjRkNGRiOTg3YjA1Yzg4NWQ5Yzg3NmY=", + "upper_bound": "NGFlM2M3ZTlhNDY2NGFkNzk2NWQ2YmYzYWQxZjk5MDY=", + "repeats": 971 + }, + { + "count": 1437276, + "lower_bound": "NGFmMzE3MGZlN2QxNDlmY2ExNTliOTQ2MDE2NzI4NDY=", + "upper_bound": "NGI5ZWE4NDNhNTRkNDIyMTlhYzBhNjgxZGQ1ZmM0MTM=", + "repeats": 5 + }, + { + "count": 1456620, + "lower_bound": "NGJhNTBlNWRhM2ViNGIwNGJkMTQyODIyOWQ4MmMzMDU=", + "upper_bound": "NGQwYjIyODM1ZTk4NDQzZmJiZGFmZTVlMmRmNWU0MjI=", + "repeats": 5 + }, + { + "count": 1475964, + "lower_bound": "NGQwZjNjNGJlNzYyNDkxY2EyN2JkZGY0YTBmMzUzYTk=", + "upper_bound": "NGRiODMwNjFjY2U3NDMwNzhjNWQzYTEyOTA5NWU4YjI=", + "repeats": 5 + }, + { + "count": 1496276, + "lower_bound": "NGRiZjdlMzM2YTY5NDYxMDhhNGIzYjgyYzJjMDhjZjQ=", + "upper_bound": "NGU1YWJjMTljZjNjNGFiNWFkZGU2NDI2N2JmMmQwYjI=", + "repeats": 971 + }, + { + "count": 1515620, + "lower_bound": "NGU2MDExNTA0NDY0NGI3ZTg1YmMyYzk3NzA3Y2FkZmE=", + "upper_bound": "NGY1NzZkZDFlMjAyNDk1MTg4OTQ5ZjEzYWE3NTJjNGQ=", + "repeats": 5 + }, + { + "count": 1534964, + "lower_bound": "NGY1ODExNjVjMzBlNDE4NzkwNDc3Y2ZhMjUxMTgyMTc=", + "upper_bound": "NTA3ZDQ1YzQ2MzA5NDAxMGI4NzFkMGRkYjczZmQ0MjQ=", + "repeats": 5 + }, + { + "count": 1554309, + "lower_bound": "NTA4MWE0MmVmMTRiNGViZmFjYTIyMGFkNTA4MTRmMWE=", + "upper_bound": "NTE0N2M1Yzg3ODFiNDhlMWE0MTI3YjIyNGM3MzUyZGQ=", + "repeats": 5 + }, + { + "count": 1574136, + "lower_bound": "NTE1MDU0Y2ZkM2Y5NGM0YzllMGRlNGVmZWYyMWViOGU=", + "upper_bound": "NTI3ZWU0ODc3MDgzNGM2ZWE2ZmVjNmY2ZGEwZTgzNjU=", + "repeats": 1454 + }, + { + "count": 1594931, + "lower_bound": "NTI4MWY1MDI1Y2QwNDlmOGIxYmQwYzM5ZDllMWU2OGI=", + "upper_bound": "NTM3ZGRlYTcxZTUwNDBlNWFlOWE3YzUwNzEwZTYwYTY=", + "repeats": 5318 + }, + { + "count": 1614276, + "lower_bound": "NTM4ZDQ3NTVhN2E0NDg4Zjg4YzRhZDI5MTdiMDk4MmE=", + "upper_bound": "NTQ4MDM5ZDRhNzFjNDU5MDlkZTQxOTBjOWI2ODYwNDE=", + "repeats": 5 + }, + { + "count": 1633620, + "lower_bound": "NTQ4NDQ1ODBhMzAyNDE2MWFmZTY1YzM5ZmM2M2U3MTI=", + "upper_bound": "NTVhYjMzZTc1MDViNDk1ZTllYmUyYWQ5Y2Q2ZTgxMTM=", + "repeats": 5 + }, + { + "count": 1652964, + "lower_bound": "NTViYzg0ZmE3MjJkNGEwNGJjNmNkNmY1NmIzNTJlYjM=", + "upper_bound": "NTY5OGM2M2IwODY1NDhiZDhlOGI0MjJhNThlYWRiNzA=", + "repeats": 5 + }, + { + "count": 1672308, + "lower_bound": "NTZhOThjZDc1YzU0NDA3ZWJiNDU0NzRlY2JlNDcwMDU=", + "upper_bound": "NTdiMGZkMjc1Njg5NGQ0ZDhlMTc5MGE1ZDZmN2RkYjc=", + "repeats": 5 + }, + { + "count": 1691653, + "lower_bound": "NTdjOTVhN2FhZWM1NGI0OGI5ZjdjODYxZmMzMzQ5Mzc=", + "upper_bound": "NThlMDYyYTVmZWU1NGFmNmE1ZTdmNmVjNThhNzBkMzU=", + "repeats": 5 + }, + { + "count": 1710997, + "lower_bound": "NThmYWUwMmRiNTU1NDY4YTk0OGZlYmY1ZThiMTVmNjg=", + "upper_bound": "NTliZTUxOGUyMDU0NDY5MWI1NzI1Nzk4MGZiMjhhNjU=", + "repeats": 5 + }, + { + "count": 1730341, + "lower_bound": "NTljZGY2ZGI1NzBiNGU3NTkyM2Y1ZWI4N2YwMDc0MDM=", + "upper_bound": "NWIwMWNmZmJmOGE2NDBhZThkY2FjNjhiYmZkMWFmNmQ=", + "repeats": 488 + }, + { + "count": 1749685, + "lower_bound": "NWIwOTVlMmMxY2UwNDhiNTg4MGRkYjFmY2MwOWUyYjU=", + "upper_bound": "NWMwZmM5NWMwNjNlNGU5MGI2Y2E2OWM1M2JjNGVhZTY=", + "repeats": 5 + }, + { + "count": 1769030, + "lower_bound": "NWMxMzBhMjdmY2I5NGE5NThhNTBjZjQ1NGMxYmRiODk=", + "upper_bound": "NWQwNTNkYzIyMjE3NDEzOThmY2MyYTM3ZDQ1M2YxY2I=", + "repeats": 5 + }, + { + "count": 1788374, + "lower_bound": "NWQwYzExMGNkOTIyNGY4ZDk0OGY0YWI2MjM1Mzg2OWI=", + "upper_bound": "NWUyZTc0YzliOTE3NGFlZGEwMzg0YmYzYTg4ZjAwYjI=", + "repeats": 5 + }, + { + "count": 1807718, + "lower_bound": "NWU0MDEzYzA5MjQ1NGNmYmEwMjBhNzdkMmFkZDBiNzY=", + "upper_bound": "NWYyOGRmOTRjZmZkNDBlZDkwYzExYzdmODQ5MjViMjI=", + "repeats": 488 + }, + { + "count": 1827062, + "lower_bound": "NWYyYTE1Zjg4OWI4NDVkMzhjOWQ4NjliZGNmY2ViYTE=", + "upper_bound": "NjA1ZmY5MThkOTY5NDVhMWFiZWY2MjRiZDYxMjQ4Zjk=", + "repeats": 5 + }, + { + "count": 1846406, + "lower_bound": "NjA3ODk2YTEzODhkNGI0NmI5MDFlODY1ZTFhYmVmNGY=", + "upper_bound": "NjFlNWQ0ZDBmYWJlNDhiYzg5N2YyNGIyYTU2YjM4OGM=", + "repeats": 5 + }, + { + "count": 1866234, + "lower_bound": "NjFlYjhkNWRkZGVhNDQwYzliMzk0N2EyZWQ3ZTI4OTk=", + "upper_bound": "NjJkNTUxZDBhZmJiNDk4MDhhOWJiYWJiMzIxZGFiMTE=", + "repeats": 488 + }, + { + "count": 1887513, + "lower_bound": "NjJkYzZlZDZjZmQ1NDNiNTkyOTBhYjU0OWNmMmQxZWY=", + "upper_bound": "NjNjODJlNjc3MjJlNDgwMmI1MTdlNDZjNmFkMDQ0MWY=", + "repeats": 5318 + }, + { + "count": 1906857, + "lower_bound": "NjNjOTAzYzhkNTJmNDZhYTg4YTVjMDJhNTI1YTNjMWQ=", + "upper_bound": "NjRkY2NhNTkxNzhlNGJiMjgxY2IzMGM4ZGFhNDU0NjA=", + "repeats": 5 + }, + { + "count": 1926685, + "lower_bound": "NjRlMmIwMmMxNTlkNDgyOTkzZWM4YWY2ZjM3NWIxNzI=", + "upper_bound": "NjYyNDc1NzAzODBjNDUxOWI0NmY1NGM2NmFkYjdkYWM=", + "repeats": 971 + }, + { + "count": 1946513, + "lower_bound": "NjYyNjA2YjU4MDBlNGI1MWFlYTE2YjU1YWMyZGQ4ZDQ=", + "upper_bound": "Njc3NzA0NWFhNjMwNDI2NzgxNWQyNDQ1YzBlMGZiMGQ=", + "repeats": 971 + }, + { + "count": 1965857, + "lower_bound": "Njc5MWUzNzk2YzBiNDI3N2FjYzgwMzkxYTdhZmEzMjk=", + "upper_bound": "NjhjYWE4MDc4YzcxNGIyNWEyYmRkMjk2MDhhNDA5MjA=", + "repeats": 1454 + }, + { + "count": 1987136, + "lower_bound": "NjhjZTlmNTc4ZmFmNGMzNDgzYjQ3Njg0ZTMzNWNiMTU=", + "upper_bound": "NmExZGE1MWFjYzc5NDYyYmE3ODkwYjhmNDM3MWZjODY=", + "repeats": 1937 + }, + { + "count": 2006480, + "lower_bound": "NmExZTIxNGY4ZjkzNDU2MGEyZDBlNDlhNDE4YTYxNDU=", + "upper_bound": "NmFlMzViYTY3YzIyNDRkYTk3ZGI5MDQ4YWQ5NWNkNjU=", + "repeats": 5 + }, + { + "count": 2025824, + "lower_bound": "NmFlNjhmMWE0OGQwNGI0NTkwMTdiN2FhODlmNDZiNWU=", + "upper_bound": "NmMwNWE5ZmJjN2RkNDcyYTk1OWE1MTFmMjllMDY4Njk=", + "repeats": 5 + }, + { + "count": 2045168, + "lower_bound": "NmMxNDJlMjNkNzY0NDhlOTk4OGIwMWUyOTliZGI4ZmY=", + "upper_bound": "NmNiYzA1ZjQ0ZjIzNDM0N2E3MDgyZmRjYTQyODU4MmQ=", + "repeats": 5 + }, + { + "count": 2064513, + "lower_bound": "NmNkMTJhZmViYTcwNGM2MDg3MjBlNTc1NTViYTc4MTM=", + "upper_bound": "NmRmZGNjMWU3ZGI3NDNkYjk1YThiYzNmOTE4OTE4ZDg=", + "repeats": 5 + }, + { + "count": 2083857, + "lower_bound": "NmRmZWM4ZWJjZjEwNDU2NWFiYTBmM2RkY2RlMWRiZjg=", + "upper_bound": "NmYwZDYxZTRiZWM3NGM4MWFmNDljMDcyYjk3ZmYzYmE=", + "repeats": 971 + }, + { + "count": 2103201, + "lower_bound": "NmYxMjgzNDQxYmNkNDA4MGE4NTgwNGJhYjVjNzk2MmU=", + "upper_bound": "NmZiNzA3YWFiYjY2NDg0NDk4YTQzZDNhMDkwZWRkODc=", + "repeats": 5 + }, + { + "count": 2122545, + "lower_bound": "NmZjNTUwODQzM2Y2NDJmM2IxYTFhZjg2NmUzNzI5YWI=", + "upper_bound": "NzBlMzBiYTFlNDJiNGU2MTkxMDZmMWZkMzIxZDE3MGI=", + "repeats": 488 + }, + { + "count": 2142373, + "lower_bound": "NzBlODg4YTgxMzBjNDE2NGIzYTJmZjc0M2U3YmU0NjQ=", + "upper_bound": "NzIyM2VkOWZjMTgzNDYyNzkyY2RjOWRlZDY2Yjg2Y2I=", + "repeats": 971 + }, + { + "count": 2161717, + "lower_bound": "NzIzMjI4OWE1YjQ2NDlkZmE1MTFkNTliNmZiZTkzZTE=", + "upper_bound": "NzM4MTExMDU1MjNiNDhmNWIwZDA2ZWM2ZGU1MThjODk=", + "repeats": 5 + }, + { + "count": 2181062, + "lower_bound": "NzM4NzdkMTBlOGFhNDYzMTg3NmEyNzczNzJlNDU0MTU=", + "upper_bound": "NzQ5MTk2YjkxNWM2NGRlNmEzYWYyYmFmMTUzODQyMWM=", + "repeats": 5 + }, + { + "count": 2200406, + "lower_bound": "NzRhMzhhZTlmYzUyNDNkNGEzNmUyYjNkZThkODY5NzU=", + "upper_bound": "NzYxOWNkMzQ4MzJkNGEzNDlmY2VkYTAxZDg4ZTk2YWU=", + "repeats": 5 + }, + { + "count": 2220234, + "lower_bound": "NzYzN2ZjODBhMzk2NDM4OGIyNjg3NWI5YWEzMmQ2YmQ=", + "upper_bound": "NzcxNWNhYmQ4Mjk5NDBlNWIwNzJkMTZmNmJkYzZkYzI=", + "repeats": 1454 + }, + { + "count": 2239578, + "lower_bound": "NzcxYWVlNWZjYjRlNDRiMmJkZGU4YWQwOTI5OTQ5NTI=", + "upper_bound": "Nzg0ZDA4MDRiNWU3NGQ0OGJmNDFhNDYzNzk2YTNjYTU=", + "repeats": 488 + }, + { + "count": 2258922, + "lower_bound": "Nzg1NDVjYmZjMDc3NDhlNmFjNGY5YjBmNDljNjYxYjM=", + "upper_bound": "NzlhZWI4ZWRiOGE1NGE3OGE0OGQ0N2JiNTA3YjZlZGU=", + "repeats": 5 + }, + { + "count": 2278266, + "lower_bound": "NzliMjE1M2M5OWE2NGQwNzllNzBkYzg1M2YwOGE0ODY=", + "upper_bound": "N2IxNmJkZTQwNzM5NGNiNjg5NmQ5Y2FiMzA3YjY2NDc=", + "repeats": 488 + }, + { + "count": 2298094, + "lower_bound": "N2IxZTJiYjAxNDA4NDBhMmE1YWVmMjI2NWNkYjFhODE=", + "upper_bound": "N2MxNWU3YjM1MDE4NDUxMThlN2RmNTJhZDRiYjIyN2I=", + "repeats": 971 + }, + { + "count": 2317438, + "lower_bound": "N2MxNjFiNTUzNjVhNGJkOThmNzhhMTcwODkzMjk1ZDk=", + "upper_bound": "N2NjNTNiODM2ZjBkNGVmYTkxN2FkMjJlODNkNjFkZTM=", + "repeats": 5 + }, + { + "count": 2339201, + "lower_bound": "N2NjNThlYTg4ZDhlNDQ3NmJmM2VlODM2NWVlMDBmMGQ=", + "upper_bound": "N2RmOGEyZjI3NTYzNGJkZDkxNDllNDllMDBjNWQ4ZjQ=", + "repeats": 2420 + }, + { + "count": 2359029, + "lower_bound": "N2UwMmMwOWM0MzExNGQzZmJkYjMxNGE5Zjg5ODBiMGU=", + "upper_bound": "N2YzMjk0NDA1NWUyNDE3ZTk1NDY4YzExYTRkMGJjODg=", + "repeats": 488 + }, + { + "count": 2378373, + "lower_bound": "N2YzMmRkOTFlNTgwNDM2YWJmM2M1OGVhOGE3ZTdhMGU=", + "upper_bound": "ODA3OTQ4YWIwNjU0NDMwYzg2MDQzODYzYjRmYmI4Zjg=", + "repeats": 5 + }, + { + "count": 2397717, + "lower_bound": "ODA5NjhiNzdhMjMzNDM0MmJkMjM0YmM1OGFkYjU3OTE=", + "upper_bound": "ODFkNjg5NTc1MjI0NDE5MThmMjc3NTQ4ZjIzZmFmNmY=", + "repeats": 5 + }, + { + "count": 2417545, + "lower_bound": "ODFkN2U2NmUwNjdlNDcxYmEyMmRlZTg1MWUwZjU4NTg=", + "upper_bound": "ODMwMGM2NWM0M2MwNDc5NjkyMzgzYzE4MzU1MGJjNWI=", + "repeats": 488 + }, + { + "count": 2436889, + "lower_bound": "ODMwMWY4YjE5N2NmNDlmYmE4MDdmYjI0Mjg2ZmY0ZDU=", + "upper_bound": "ODQ0ZTEwZTYxNTliNGU1MTliNmZjODk2ZjdkNTgyNTM=", + "repeats": 5 + }, + { + "count": 2456717, + "lower_bound": "ODQ2NDNhZGIyNTZiNDQxZDlhNzFlZTA0MDg5ZjljZmI=", + "upper_bound": "ODUzY2YxODU0NDJjNDNlN2JmMzJmMjgwMDA3YjdkMzA=", + "repeats": 488 + }, + { + "count": 2476061, + "lower_bound": "ODU0N2YyMjNhOTA2NDA4NmI0NjFhNDViNjFlYjM1ZDg=", + "upper_bound": "ODYyMTQ3MGU2MTIzNGYwYmEwYmQ1ZTdiY2U3ZGRiZmM=", + "repeats": 5 + }, + { + "count": 2495405, + "lower_bound": "ODYyNTYyODIwOWE0NDYzMmFjYmNjY2EwYThjZjcyZTM=", + "upper_bound": "ODc3N2U0YTBkZGMwNGVmNDg3NTQxODRiYjE3ZTFkOGI=", + "repeats": 5 + }, + { + "count": 2514750, + "lower_bound": "ODc4MTllM2ViN2UyNGI3YjhhNDQ1OWY4OWM4ZmZkYzM=", + "upper_bound": "ODg4MjU3MTZlYTdmNDZkNDhiMTU0YjJmZGJlNjkxMTI=", + "repeats": 5 + }, + { + "count": 2534094, + "lower_bound": "ODg5ZmU0NWIxOGYwNGM0OGJjZWMwYmQ5NjZlOGIyYjg=", + "upper_bound": "ODk4ZjY2ZDkwMDA5NDExNjg0YzNmODY5MGZkZDdkNTM=", + "repeats": 971 + }, + { + "count": 2554889, + "lower_bound": "ODk5MDhlYTVmZDUwNDNhYzhmZDY0YjI2ZTQ1YmVmZWU=", + "upper_bound": "OGE4NjdlMmY5ODdmNDdjZmE0OWIxMDFiN2FiOTQ0MDY=", + "repeats": 1454 + }, + { + "count": 2575200, + "lower_bound": "OGE4ZTJkN2FjNjhiNGVjN2E3ODE0YzdhODAyNzY2ZmY=", + "upper_bound": "OGJjMTdlMTk3MTY5NDJlZWI4NzVkODdmN2Y3MTU3NTg=", + "repeats": 971 + }, + { + "count": 2595512, + "lower_bound": "OGJkODQ1NDhiYjgwNDcyNmE2MmFkM2ZkMDE5ZmYxYjg=", + "upper_bound": "OGQ1ZjQyZmM4ZjY3NDg3ZWEzMzc2ODhkODVhOTU2ZjY=", + "repeats": 1937 + }, + { + "count": 2614856, + "lower_bound": "OGQ2MWE2MTA2NmZmNDFhNTk4ZTcyZjE0ODFjMGM4NDc=", + "upper_bound": "OGViNmMwYjczNGY4NDk0MDkxZTU0Nzk5Y2Y0MDk0YTE=", + "repeats": 5 + }, + { + "count": 2634200, + "lower_bound": "OGViYzM1NjY0NWE2NDVhMzkyNzFjNzhjZmU4MWUwZjA=", + "upper_bound": "OTA0MTlkMDIzMjMxNDQzNjg2ODQ0OGMxYmM1ZjIxNjY=", + "repeats": 488 + }, + { + "count": 2653545, + "lower_bound": "OTA0M2YwMjkyNWE5NGQxODhkZWY4ODhkNTY5Zjg0MGM=", + "upper_bound": "OTE2MGMyZWRiOGE1NGFiNWExM2UzMWVjNzM0NDNlYmE=", + "repeats": 5 + }, + { + "count": 2672889, + "lower_bound": "OTE2NjBhZGIzZDMwNGQxM2JiODJiMTI2YmNjOWVlZGQ=", + "upper_bound": "OTJkOWZlOWIzMGEwNGU2YjljNDNjNDIwMTg3ODI1MzI=", + "repeats": 5 + }, + { + "count": 2692717, + "lower_bound": "OTJkYjgwNThiMTZkNGNmZWE5MWM0MDUzZGNjNTZiNjQ=", + "upper_bound": "OTQxMTQ2MmM0MjBiNGU5MDg2Y2NhYTIyNDNjMDMwMDY=", + "repeats": 488 + }, + { + "count": 2712061, + "lower_bound": "OTQxZjIwMDY5MmUzNGJhMWEwYWEyZThjMjEzZWE0MzI=", + "upper_bound": "OTU1MjFkZDVmMzg0NDQyNDg1NWU3ZWU2NDdlY2UxYzU=", + "repeats": 5 + }, + { + "count": 2735758, + "lower_bound": "OTU1MjRlYzg5ZWI0NGM5YmEzNGU0ZDc2OWM1MDUxOWM=", + "upper_bound": "OTVjMThlNGM3ZTYyNGYzY2FmZGE5ZDUxZmE1ODdlYWQ=", + "repeats": 5318 + }, + { + "count": 2756069, + "lower_bound": "OTVlOWVkNWJkZTgwNGJmYWI5NDZiNjIxOTdmODA4YjM=", + "upper_bound": "OTZmMDA5ZjA0NDY1NGFjNThlNjgzYjU5MzI2MDI4NmQ=", + "repeats": 1454 + }, + { + "count": 2775413, + "lower_bound": "OTZmODNlNDU0YWJlNGZiMGIwMTFjZGU2ZjY1MzYzMmM=", + "upper_bound": "OTgwNjI2ZTIzMzViNGRkM2ExODgwYzdjZmExZjhlYWQ=", + "repeats": 5 + }, + { + "count": 2794757, + "lower_bound": "OTgwYTAzMjk0OWJlNDU0YmFkZDY4ZTU1MDk1NWY2ZGY=", + "upper_bound": "OThkOWEzOGZiZDI0NDNlZWE1YTQxYjc5NDg0OGFjMzE=", + "repeats": 5 + }, + { + "count": 2814102, + "lower_bound": "OThkYjMzOTE3YjFlNDVjZjhlZDJlOGI5YmViMTExYzY=", + "upper_bound": "OTk5MmU2YmQzNWE4NDlhZjgyOTgyZDgxY2QxNDlhNTk=", + "repeats": 5 + }, + { + "count": 2833446, + "lower_bound": "OTk5OGI3NTE2YjBlNGJhYzlhMWI2MTc0MTY4YzNlNTI=", + "upper_bound": "OWFiMjA3ZDExZmFlNGQ5ZWJhMDRhN2NkYTEwYTY3OTg=", + "repeats": 5 + }, + { + "count": 2853274, + "lower_bound": "OWFiNDFmZjViMmRmNDYxYWE3OWJhM2RmNjUzMjQ1YWI=", + "upper_bound": "OWI4YTkwYjYyYzJiNDAwMjlhMmRkY2JjNGU1N2Q3ZjE=", + "repeats": 488 + }, + { + "count": 2872618, + "lower_bound": "OWI5YjI3OWQ0NWNlNDQ2NDlkMjk4OGY5YWI1MjIwMDc=", + "upper_bound": "OWM0NjE4MWMwMmNkNGJmY2IyZDI1NTRiZTMzMjFiNDA=", + "repeats": 5 + }, + { + "count": 2893413, + "lower_bound": "OWM1YWYyMjg1ZmI4NGNiMmJiZWUzZTdhMmM0OWU0NzE=", + "upper_bound": "OWQ3N2U2YzM4ZTdlNDExMGFjMzhjYTBjNjA2ZDMxOWY=", + "repeats": 1454 + }, + { + "count": 2912757, + "lower_bound": "OWQ3OGI5MzI3MDFlNDEwN2EzNmYzNTY2NWUwNWUwY2E=", + "upper_bound": "OWVlNGZkY2U4OWE4NDA0YzkxZGIzNmVlYzM2MDIwY2Q=", + "repeats": 5 + }, + { + "count": 2932101, + "lower_bound": "OWVmOGRlNGRjMGU1NDczZmEzYTY3NmExMDg4ZjU3N2M=", + "upper_bound": "OWZhNDQ2Zjk2OTI4NGU4NzljZThmMzNhODRkYmFhMjI=", + "repeats": 5 + }, + { + "count": 2952413, + "lower_bound": "OWZiOTdiZWI2MTZlNDRkMmI5OTBjMWYzNjFiMTFlMjY=", + "upper_bound": "YTBjYWE3YzllZDFkNDVjOTkzNDMzYzhiYWI1MWQ3ZjU=", + "repeats": 971 + }, + { + "count": 2971757, + "lower_bound": "YTBkMTVhNjJhYzA3NDk1YTgwYjQ5ZjY2NjM2ZDRhNmQ=", + "upper_bound": "YTFhNjBiMzcyMmUyNGIzMWI5NWZkNGYwNjFmZGMxZGM=", + "repeats": 5 + }, + { + "count": 2991101, + "lower_bound": "YTFiMTI2OGRiZGJhNGYyYmFjZDlhN2JmZTIzZmYwNGM=", + "upper_bound": "YTI4NDNlNDkwNmFhNGRjOGI1YzRiYzI2YWVlNmFkN2Y=", + "repeats": 5 + }, + { + "count": 3010446, + "lower_bound": "YTI4ZDNiYWFjYWM5NGE1ZWEyNmQ4MDMxNDU0MjIzZjg=", + "upper_bound": "YTMxZGEwNGVlYjMyNGJkY2E2Njg0YjQzYmM1NWY1Zjc=", + "repeats": 5 + }, + { + "count": 3029790, + "lower_bound": "YTMyN2Y0OGI3YzI0NDE0ZGI4MDRmNDYyZjZhNDkyMzk=", + "upper_bound": "YTNkMzljYjdjMmViNDQ3NjgyM2I1NjUxN2UzYjE0Mjk=", + "repeats": 1454 + }, + { + "count": 3049134, + "lower_bound": "YTNkNDVmMmQwNTgxNGUzOWEyY2Q5Nzk2YTgxZWRlYWI=", + "upper_bound": "YTRhMmU0NWM1NDhlNDQwNmFiYWRmZjEzNzdhM2IyOGY=", + "repeats": 5 + }, + { + "count": 3068478, + "lower_bound": "YTRhM2VjN2I1MzgwNDY5NGJlYzFhZTM4ZjA0ZGU4OTI=", + "upper_bound": "YTVhNTc4YmRkYWJhNDQyNmEzYTA5YWIyYzA2NGNhM2E=", + "repeats": 5 + }, + { + "count": 3087823, + "lower_bound": "YTVhZTgwYWQyZjQ2NGMzOTk4ZGRiMTMwMTI0MTY0ODU=", + "upper_bound": "YTZhZGRkNDk2NWY0NDZkNDhhZjYyMmI4ZDlhOTliOTI=", + "repeats": 5 + }, + { + "count": 3107167, + "lower_bound": "YTZiMWM0MTA4ZTA3NDQzYmI0ZTZjNmUxMTUwOWJhZDk=", + "upper_bound": "YTdjOTJkNWE2NmMxNGZhMmFhZTczMDg5OGEyMzQzNGY=", + "repeats": 5 + }, + { + "count": 3126511, + "lower_bound": "YTdjOTliZWU4MWQ0NGMzMjgzYWM5NGQ3ZGM4NzNkNzE=", + "upper_bound": "YTkwNGIwMTMzNDUzNGNlMmJmY2M5NDczMjdhODgwYTU=", + "repeats": 5 + }, + { + "count": 3145855, + "lower_bound": "YTkwN2MyNGEzOTdkNDY5Nzg1ZjY5NDliNzgzY2JiNjA=", + "upper_bound": "YTlkYzYwMmRmMmFjNGZhMmJkY2E5ODI2ZDMyNDhkYzc=", + "repeats": 488 + }, + { + "count": 3168585, + "lower_bound": "YTllMzZiNWM1NjBkNGQ1YjljODNmMjIwMzE3NDlmMDI=", + "upper_bound": "YWIwOTk5ZDJlOGUwNGFhODg0NzEyZDU4MWMxMjhjN2Q=", + "repeats": 3386 + }, + { + "count": 3187929, + "lower_bound": "YWIwYjllYWMzYWQ4NDc5MWE2NDc5MTIyOTNmODFkZWE=", + "upper_bound": "YWJjMjUzMTQ1NGM0NDZkYTgzNjdkMjgyODU4ZThjMGE=", + "repeats": 5 + }, + { + "count": 3207273, + "lower_bound": "YWJjNDk1MWY2ZjQxNDg0MjgxODgwZjUyNDViYTYwZWI=", + "upper_bound": "YWQwOTA0NTZkMjBkNDJhYWE1ZGVkMDc1ZDhlMjRiZTY=", + "repeats": 5 + }, + { + "count": 3226617, + "lower_bound": "YWQwYWY1Y2MzNzc3NGYyZThhODY4NTA3MjRkYWFmOWE=", + "upper_bound": "YWRmYzZiYWIxNTFjNDQ2MWI5OGE2NTIwMWRiYTUyMTU=", + "repeats": 5 + }, + { + "count": 3247412, + "lower_bound": "YWUwZGFiYmViY2ZhNDZhYTk5YmNiOTQ4OGQ1NWI3OWM=", + "upper_bound": "YWVhMGJlZDFkNTRiNGVkNWEzNTg0NGNlYzQ4NDQzZTQ=", + "repeats": 2420 + }, + { + "count": 3267240, + "lower_bound": "YWViNjgxNjU2Zjg0NGE5NDkzNDliMzlmODliYzJlZTc=", + "upper_bound": "YWZhZTUyNzQ4OGQ4NDhkMjk5ZmQyMDBhMzIwNWU3NTM=", + "repeats": 971 + }, + { + "count": 3286585, + "lower_bound": "YWZiMDU4OTJlOGRhNDQwZmI3ZDE0MGVhZjRmMGNhY2U=", + "upper_bound": "YjA4ZmY0Njc4OWVhNDgwNGE1NTZiMDA3MjJiNTg2Nzg=", + "repeats": 5 + }, + { + "count": 3305929, + "lower_bound": "YjA5MmZlYzA5ODhmNGIwMGE0YjhiZmVmZGNjMTczZmU=", + "upper_bound": "YjE2MmUwMzU0NThmNDQ2Nzk4NWQyNjM5ZThkYWZmNjg=", + "repeats": 5 + }, + { + "count": 3325273, + "lower_bound": "YjE2ZWQ1MGI2YzU1NGNiN2JhZjQ5N2MzNjU5NDBjMjU=", + "upper_bound": "YjI2MGU4Y2Q4NDUyNDRmYTk4MDNkMzE3MjgzM2UyODY=", + "repeats": 5 + }, + { + "count": 3345584, + "lower_bound": "YjI2OWNmZWIyZmVhNDVmOTk0MGM5ZTMwMTQ2N2VkMmU=", + "upper_bound": "YjM1YmJlMGE3NThmNDkzZDgxODdjNTFjMzRhZGFiYzk=", + "repeats": 1937 + }, + { + "count": 3365412, + "lower_bound": "YjM2MDRiZTRmYzljNDg2YzkzZDAxNGNmNWZhOGFjYWY=", + "upper_bound": "YjQ4YjQwZTFlYjRlNGY1ZGJhOGNmMGIxODk0YjhlZGQ=", + "repeats": 488 + }, + { + "count": 3385240, + "lower_bound": "YjRhODkwZTMxNjI2NDA0OGE0NmY2MTU1ZDg1NmQwNWM=", + "upper_bound": "YjU1ODA0YWIyY2JkNDFkZjlkMjFjNmUwMDFlNWRmYmY=", + "repeats": 488 + }, + { + "count": 3406035, + "lower_bound": "YjU2OWQyNmE5NDYwNGQ3M2IxZTFmMDNmODNlZmE4Mzc=", + "upper_bound": "YjY1MzA5ZWU4NGQwNDA1Yzk1NDUzNGNhNTFiOGNkZTI=", + "repeats": 1454 + }, + { + "count": 3425379, + "lower_bound": "YjY1NzY4ZjRmODljNGRlNTliM2UxYWIzNzljMGU5OGY=", + "upper_bound": "YjcxMjYxNzg0MmIzNDI0MGFjNWUyNmE2YzI0MjIzMTY=", + "repeats": 5 + }, + { + "count": 3444724, + "lower_bound": "YjczMjQzYTJkNDVlNDljMjg4ZTVmZWU5OGU2MTgwOWQ=", + "upper_bound": "Yjg3ZjMyOTA2OTk5NDU2OTkwMzZhOGYyMDU2OTBlOGU=", + "repeats": 5 + }, + { + "count": 3464551, + "lower_bound": "Yjg4MDNlNTQ0NWFjNGQzOTljOGFiN2YwYjIyNDBjMTA=", + "upper_bound": "YjlhMGI3NjA2ZjkyNDYxMWFhMzNmNThiM2UwMmFiNTA=", + "repeats": 488 + }, + { + "count": 3483896, + "lower_bound": "YjlhM2M2YzEyYTE2NDg1NjhiNTZjZWViNTNiM2ViMmI=", + "upper_bound": "YmE2ZDU4NGU3YWRjNGM5YzhmMzdjZWExYzgyZjAxNGE=", + "repeats": 5 + }, + { + "count": 3503240, + "lower_bound": "YmE2ZmM2MWNmZmMxNDQyMThjYzE5ODZiYzE4YTM4MTI=", + "upper_bound": "YmIxZGJjYzFiZTViNGNjNTg5ZDJmNWRkZGM5OWE1YjQ=", + "repeats": 5 + }, + { + "count": 3522584, + "lower_bound": "YmIxZWZhOTIyZWM5NDZjMjlmMzQ0MTVjZmRjYjUwM2E=", + "upper_bound": "YmJmNDI3MWUyNTY3NDU2YmIzMmE4NWVlNzhmMWFlMDc=", + "repeats": 5 + }, + { + "count": 3541928, + "lower_bound": "YmJmNzM5YTljMzkwNDc4NWJlMWU5MmUxYjMxYmYyNjc=", + "upper_bound": "YmNkNWRhMmFjZWM2NDc0ZGFmOWIyYzA3Yjk2YjJiMzk=", + "repeats": 488 + }, + { + "count": 3561273, + "lower_bound": "YmNmMzVkZmJiOTFlNDFhMjgzMTgzYTAyNDZjNDY0MmE=", + "upper_bound": "YmRkOGZmMjQ1OTIyNDAyZWJmM2QzODY3ZDU3MDY0ODA=", + "repeats": 5 + }, + { + "count": 3582068, + "lower_bound": "YmRlZTdhYjgxZmI1NGY4MjllM2VhODU4Y2YzNzM2ODg=", + "upper_bound": "YmVhYTU3OWFlZjU2NGM4MzlhMDc1ZTcwZGVlZDU0ODM=", + "repeats": 1454 + }, + { + "count": 3601412, + "lower_bound": "YmVhZDI5MGVlMTI0NDFkNjhhNjZlNzgwNTMxYWJkYmQ=", + "upper_bound": "YmZiYzJhY2Y2NjE2NGZlOGFmYmQwZDFhZWUxZmVhMWE=", + "repeats": 5 + }, + { + "count": 3620756, + "lower_bound": "YmZjNTgzYTlmZjQzNDJjZDk2OTEzYTZjNzMzZjM1ZmI=", + "upper_bound": "YzEwYzRmNjU4NTNmNDc2MmE1M2IyOTI4NTFkOTVjOWE=", + "repeats": 5 + }, + { + "count": 3640100, + "lower_bound": "YzExMTA0NmFkMWFhNDhhYTg1Yzg2MzQ1ZjVkMWY4YjA=", + "upper_bound": "YzIxYjAwOGFiOGU4NGY2MGFhMmU0NjFiODg5YjFkYmY=", + "repeats": 5 + }, + { + "count": 3659445, + "lower_bound": "YzIyMzY0MzViMWFjNGE0OWEyZGI5ZDU3NmFiYTU5MmE=", + "upper_bound": "YzMxOWEwZTAwM2FjNGFkYTk4ZmU5NjE0NTdkZWM4NmU=", + "repeats": 488 + }, + { + "count": 3679272, + "lower_bound": "YzMxYmNkZjJhYTM0NDA4N2FjN2IwYTg0MGQxNWUzZGQ=", + "upper_bound": "YzNlYTNhNjFlN2E5NDNkOTkxMGYyYmYzZWYzZTcwN2E=", + "repeats": 971 + }, + { + "count": 3698617, + "lower_bound": "YzNlYzIyMjQ4NTIxNDI2MGI3ZWQxMDMyNzQxY2E4MTU=", + "upper_bound": "YzRlOWFhZjFlY2U4NDhlYzg1MTkxNGZjZTQ5MGY1ZmY=", + "repeats": 5 + }, + { + "count": 3718444, + "lower_bound": "YzUwODUxNWNkYWY4NGNiYWE4YTFmYmVhZmZhOWFiZTI=", + "upper_bound": "YzYyYzkxNzU0MzVhNGFhZjg5NTVhMzA2NDc0ODE2ZTM=", + "repeats": 971 + }, + { + "count": 3737789, + "lower_bound": "YzYzMzkzNmE4MDc5NDU4MmEyMGU5MzhmYjk2ZjA3ODA=", + "upper_bound": "Yzc4ZjdlM2I2N2U1NDQxZjg4Njk5NmZjOTZiYTg5NGM=", + "repeats": 5 + }, + { + "count": 3757617, + "lower_bound": "Yzc5OTU1M2JjY2JhNGM1ZTk1NzMyZGE2Mjg2Yzk5ZDc=", + "upper_bound": "Yzg4OWQxZTdiMGE1NGViNjkwM2RjZjc4NmFiNWViZGE=", + "repeats": 488 + }, + { + "count": 3776961, + "lower_bound": "Yzg5ZjY5MzllMTU5NDlhZjhjNGNmM2IwMTQxNzQzM2I=", + "upper_bound": "Yzk4MDVkMmYyNWY2NDhjODgwMjRmMmYxNzI2NjRhODI=", + "repeats": 5 + }, + { + "count": 3796305, + "lower_bound": "YzlhNGJiZjc1YzI3NGIyNGFlOWQ0MjI2YzY5NTcyOTE=", + "upper_bound": "Y2FlZjA3MjY0ZDhjNDA0YWI4MzE3NjdhZGM4MzUxZWU=", + "repeats": 5 + }, + { + "count": 3815649, + "lower_bound": "Y2FmM2NmNWYzYjA4NGU2ZmIzNGZjNjkxY2RlNzdhZDc=", + "upper_bound": "Y2MzMDE5NTc0NjJkNDIxNjk5M2M2YjQzODAyZjczNDE=", + "repeats": 5 + }, + { + "count": 3834993, + "lower_bound": "Y2MzM2RiNTA0ZDlhNDIwZjhlNzQ0MjBlOWI0ZmRjMTE=", + "upper_bound": "Y2QyNjcwYmQyYzZhNDE5Y2ExNzI3OGM5MWEyZWU5MjY=", + "repeats": 5 + }, + { + "count": 3854338, + "lower_bound": "Y2QyZWI5NzQxYTJiNGRiNTlkYTc1Y2NhNmFmNmI0Y2U=", + "upper_bound": "Y2UwMzgzOGU1YTY5NGJmNmE2MTFjNTI5MjZiMjAxZmE=", + "repeats": 5 + }, + { + "count": 3873682, + "lower_bound": "Y2UwYjY1MTc2NzdkNDQ5Mzg0YTkxNjQwMzI2NThkY2I=", + "upper_bound": "Y2YwMjk1OTNhYmIyNDMzMjkxNTJlM2VkODA1OTkyMWM=", + "repeats": 5 + }, + { + "count": 3893026, + "lower_bound": "Y2YyOWU2MjgxNjgxNDFmMThiNTBiY2VjZTgxYTQ1ZGM=", + "upper_bound": "ZDAwYTY1MzA4NGM1NDg3N2E1YzA4Mzg5MzI3ZTU2YTI=", + "repeats": 971 + }, + { + "count": 3912370, + "lower_bound": "ZDAwYjE2OWM5ZDljNDllOThjZGM0MmUxNDU3MGM3ZWI=", + "upper_bound": "ZDE1OTc5NzllMmM1NDhhOGI0N2M5MDQ0MjU0NzVkOTI=", + "repeats": 5 + }, + { + "count": 3931715, + "lower_bound": "ZDE2MjAwYzNlNDMwNDdjYzhhOThiMzYwZDY3ZDljYzA=", + "upper_bound": "ZDJhYjM2NWFhM2FlNDhmMmJhNDBmYTlmYTBiMTU5N2Q=", + "repeats": 5 + }, + { + "count": 3951542, + "lower_bound": "ZDJiODhkZjdiMWJlNDcwYzk2ZDE5ZTk0MmEwY2RhZDI=", + "upper_bound": "ZDM3NjU1MjY1MmJlNDA1ZDljOWFjYzY4ZDhmM2NiZTI=", + "repeats": 488 + }, + { + "count": 3970887, + "lower_bound": "ZDM3OWVkMGYzNzYxNGVmODg2ZWU4ZTZhZDg2ZTgyMmU=", + "upper_bound": "ZDQ3YWIyNGE5YWI5NDc5NGE5ZTVhMWRlZDIxN2U5Zjg=", + "repeats": 971 + }, + { + "count": 3991198, + "lower_bound": "ZDQ4MjA0NTQxOGEzNGZmY2I0NzVjNzc5ZmY0ODk3NjM=", + "upper_bound": "ZDVkNzE0MzQ2NjJkNDhhMWI4ODU2ZTFjODE0ZWVjZWI=", + "repeats": 971 + }, + { + "count": 4010542, + "lower_bound": "ZDVkZGZjN2RmNmY1NDk2ODg4ZmY2NjgyMDMyNDcxZjk=", + "upper_bound": "ZDcxNDY5NWQyNTY4NDM5Mjk3ZjcyZmM2MTJmMzYzYzU=", + "repeats": 488 + }, + { + "count": 4029887, + "lower_bound": "ZDczMzliNjMyMTNkNDJjOTllZDZlNjFhMDNjY2ZlYzM=", + "upper_bound": "ZDgzMThjNjcyODgxNDViYmJkZWZhNTI5ZmJlMmI4NWY=", + "repeats": 5 + }, + { + "count": 4049231, + "lower_bound": "ZDgzN2ZkN2FlNDU4NDY1N2FhM2VkNTJhMzA1OGJmYzM=", + "upper_bound": "ZDkxMmU0NzVhMmZiNDMwMjg1MGJiMDg1ZDJiODY4NTQ=", + "repeats": 5 + }, + { + "count": 4068575, + "lower_bound": "ZDkyMWZkYjQwYTMxNDg1NmEzNTUwYTgxM2NlOTNiZmE=", + "upper_bound": "ZGExZmZkZjkzYTJiNDU1NjgyMjkxNjFkYmY5YjMxNWU=", + "repeats": 5 + }, + { + "count": 4087919, + "lower_bound": "ZGEyMDcyMmU4NDQwNDgwMGIzOTE3ZjliMjc0ODZlNmM=", + "upper_bound": "ZGFjNzRiZTkyOTQ2NDI0OWFjZWFhZTY2ODY1MzZlNDk=", + "repeats": 971 + }, + { + "count": 4107264, + "lower_bound": "ZGFjOGFmNmYwNTgzNGM1Y2IyNzUyZWFkYzFhMjkxMTM=", + "upper_bound": "ZGJjOWM5ODE0Njg1NDFhZTgzZGJkZmE4MzUyZTYxMDU=", + "repeats": 5 + }, + { + "count": 4127091, + "lower_bound": "ZGJmOTMwYjkyMjUzNGEwOWI5YzQ0MTNhMzI4YWY0OWE=", + "upper_bound": "ZGQyMjUxNWU5ZGRhNDQ2MTk4Y2ZkOWRmOWU3OTE2Yzc=", + "repeats": 488 + }, + { + "count": 4146436, + "lower_bound": "ZGQzNGU4YWIzYTNjNGMyN2I0N2Q0NzU1NmRhYTJiZWM=", + "upper_bound": "ZGUxOTI4NDc1NTRjNDFhNzk5NTgwZGQ2YWFkZTFjYjc=", + "repeats": 5 + }, + { + "count": 4165780, + "lower_bound": "ZGUxZWY0ZjViZjZhNDVjYjlkMTg2ZjBlYWYxODM1OGQ=", + "upper_bound": "ZGVkZDg1ZDE1NWM2NGJkNWIxMmVkMGQ4Zjk4ZDUyNGM=", + "repeats": 5 + }, + { + "count": 4185608, + "lower_bound": "ZGYwOGJmZDZiMzg5NGZjMDlmNmM2OTU0YjlmYzk0ZDg=", + "upper_bound": "ZTA0MzllZmUwNDg5NDRlM2JiNTliZDVhMjE3NTVlMTU=", + "repeats": 488 + }, + { + "count": 4204952, + "lower_bound": "ZTA0ZDhmMzBiMDM2NDZjOWJmNzBlMmQ2NzM3NGI5ZmM=", + "upper_bound": "ZTE5YTJmZDFhZjc1NGRjNmIyMjUyYmQ2YmFlOWFkMmI=", + "repeats": 5 + }, + { + "count": 4224296, + "lower_bound": "ZTE5YWIxMzQ2YTBlNDNjNTk0MjQwMjE4ZDliOTI1NzA=", + "upper_bound": "ZTJhZjg1NmUwN2I1NGU4NjhhMjgxNTVmNmM3MWJjN2I=", + "repeats": 5 + }, + { + "count": 4244124, + "lower_bound": "ZTJjODU4YTE1NmQ3NDBjZmJhMDIzOTMxMjY1YjI5ODU=", + "upper_bound": "ZTNiNTJkOTdjZjNhNGU2YmJkNjllNTM5MzIxN2Y1OWM=", + "repeats": 488 + }, + { + "count": 4264919, + "lower_bound": "ZTNiZDgyN2NhM2I4NGEwNGE5YWQ4NzRhYWMwNGQzMmU=", + "upper_bound": "ZTQ2MzUxMTdkNWYwNDI4MTg4NGFmMTVjNDYxNWY0OTY=", + "repeats": 6767 + }, + { + "count": 4284747, + "lower_bound": "ZTQ2ODhmMWMxODA3NGRjOWEzODM3OTUxZDRiMjg2YzU=", + "upper_bound": "ZTUzOTI1YzgyMjMyNDQwYWE2YWJlZjgyZjYxMmQwNzE=", + "repeats": 971 + }, + { + "count": 4304091, + "lower_bound": "ZTUzZTM5YzBjZmVjNDdiNWI0NDNjNWM2YTc3MjBlNTk=", + "upper_bound": "ZTYxZmJkOGFkMzQxNDRiMDkxYTRlYjU0NjdlN2ExYTI=", + "repeats": 5 + }, + { + "count": 4323919, + "lower_bound": "ZTYzOTA5ZGM4MWVlNDIxMmE2ZjhmY2NjNmE1ODFjZTA=", + "upper_bound": "ZTcyOTc2Y2NlNGE0NGUzZGFhMDQ0ZGExMmMyYTc5Y2E=", + "repeats": 971 + }, + { + "count": 4343263, + "lower_bound": "ZTcyOWJiY2FlMDU5NDlkNmJlY2VkMGZlMmJjZjkxY2Q=", + "upper_bound": "ZTgwMDQ1NWU1ZjQ2NDA3YWE4YmZlYWRmNTgxMzUzY2Q=", + "repeats": 488 + }, + { + "count": 4362607, + "lower_bound": "ZTgxYTBhY2NkYTkzNGI1N2JiYjQ3M2M1M2NiZjAyNmU=", + "upper_bound": "ZThkMjNkNjk1NTEzNDk2NGFlYzU4MTYwZmQ2Y2RhNWY=", + "repeats": 488 + }, + { + "count": 4381952, + "lower_bound": "ZThlZTZiMmZlZWNmNGRjY2I3OTRmMzU4YWUwZWQwYTE=", + "upper_bound": "ZTllNWNhYjNjMzkxNDRhZjg0MjJkZDVmYWFjM2Y1OTQ=", + "repeats": 5 + }, + { + "count": 4401779, + "lower_bound": "ZTllNzJmNGI1NjI5NDlmOGI3ZDk0ZGUxOTJlYTYxZDU=", + "upper_bound": "ZWFlN2NlMDI0OTk1NGMyMWFlZDExMTZhYjIyODIzNGE=", + "repeats": 3386 + }, + { + "count": 4421124, + "lower_bound": "ZWFmMjg5YTI4Mzc5NGUzNmIzNjIwN2RhNDNmN2FlNmE=", + "upper_bound": "ZWJjMGJiZTRkMGQ5NDkyY2IxOTVhZmU2OWI3MjI0ZmY=", + "repeats": 5 + }, + { + "count": 4440468, + "lower_bound": "ZWJjMzI1ZTVjNmZjNGFhMmE3Y2E3NzYwN2I2NTk1MmM=", + "upper_bound": "ZWM2ODQ0ZDk4YTFlNGVhZWEwMWIyYTdhZmRkNTAxYzI=", + "repeats": 488 + }, + { + "count": 4459812, + "lower_bound": "ZWM3MDMzMDU2MWRmNDA1YjlmY2Q2YmRjYmFkOGQxZWY=", + "upper_bound": "ZWQ0OWZhMzQ0MzFlNDhjYmE3YTdhOTlmNmM5YWY2MzM=", + "repeats": 5 + }, + { + "count": 4488345, + "lower_bound": "ZWQ1MTcyYTUwZTgzNGNiOWI1NjdiODg3YmM3Mjk2Y2Y=", + "upper_bound": "ZWRjZmFhNWIwNmI3NGQxMWI2NzkxMzg5NmQ1M2IzMGI=", + "repeats": 15944 + }, + { + "count": 4507689, + "lower_bound": "ZWRkYjM1N2E0MGU5NDFlMGI2OTI3ODkzOTk4NDMyZTc=", + "upper_bound": "ZWVlZTgyZjc2NzU0NDJkNzgzNzgyNDcwYWJhYjM5Mjk=", + "repeats": 5 + }, + { + "count": 4527033, + "lower_bound": "ZWVmM2U4ZjdiZmE2NGI4Mzg3YjBjNDBkMjk5MWJkMTY=", + "upper_bound": "ZWZmZGNiNzMzMDc4NGU2YzlmODZmOWZhOTFkNTM4ZjA=", + "repeats": 5 + }, + { + "count": 4546378, + "lower_bound": "ZjAxNWYxNWRlNDFmNDhmZmE2OWJiNjNiY2IwNzc3M2E=", + "upper_bound": "ZjEwMGEwYWY4YjEwNGI0ZjkyYjBiOWZjZGM0NDJlODM=", + "repeats": 5 + }, + { + "count": 4565722, + "lower_bound": "ZjEzMGU3MzRmOGYyNGY4Yzg3NjVjNTA2MmZkODUwYTc=", + "upper_bound": "ZjIyYTM3MDcwNmYwNGYyNzhiNWM4ODYwMmQ3OTg2Mzg=", + "repeats": 5 + }, + { + "count": 4585066, + "lower_bound": "ZjIyYWZjZmY1N2E0NGVkNGE2YTQ2NDQwOWNkMmRiOGY=", + "upper_bound": "ZjMwOTI4Zjg5YTgxNGFiODg4ZWI0YTUwMTgwN2FlNGI=", + "repeats": 971 + }, + { + "count": 4604410, + "lower_bound": "ZjMwZTJlMmE2NTNjNGQ3MWE4MTI1ZjI0ZTY5MGFhM2U=", + "upper_bound": "ZjNlMDc2MWFhMjQ5NDJkZWJjMWNlZmZiOTIyOGE3NTA=", + "repeats": 5 + }, + { + "count": 4623755, + "lower_bound": "ZjNlMDg0NjFiNDliNDhhN2JiOTczZjZlOTMwMGNkYTI=", + "upper_bound": "ZjU3ZmE3MjU3ZGI0NGVjNjllNTk1NjU5ZmJiNGQ1Zjc=", + "repeats": 971 + }, + { + "count": 4643099, + "lower_bound": "ZjU4YTg1N2EzZmJlNGZmNzgzZDIyZDg1ZDM4NTk5MmE=", + "upper_bound": "ZjY5ZDM2YjA5Y2U1NGIwMTk3MTk1YzAzOGVkNjJmODY=", + "repeats": 5 + }, + { + "count": 4662443, + "lower_bound": "ZjZhODdhZjJlYWE1NDJlMGIyOTY5ZTQ0MWViMzU4Zjc=", + "upper_bound": "ZjczZGE3ZDA2MjIwNDU5NmI1M2UwMTcwZDNmMmMxMDU=", + "repeats": 5 + }, + { + "count": 4681787, + "lower_bound": "Zjc0Njg1YTM0OTY3NGIyYWJiOTQ5OWU2OWYzMjFlOTI=", + "upper_bound": "ZjgzOTQ2YzE2YWU0NGQyZjgzOGIyYmY4NzhjMjlhYmY=", + "repeats": 5 + }, + { + "count": 4701131, + "lower_bound": "Zjg0NGFhNjRjYzBjNDc1OTk0ZWQzYmEzZGJlYWQ3MWY=", + "upper_bound": "Zjk3YjE5YWI5YmQ3NGVlY2JjMzNlZTBmYzhlYmMxMWQ=", + "repeats": 5 + }, + { + "count": 4720476, + "lower_bound": "Zjk3ZDQ5OTU5OTFiNGMwYWJlODdkZjY4Mjg5ZDNlOTY=", + "upper_bound": "ZmE1MDI4NzY5OTQ4NDY3M2I5MzM0YTE3MzAxZTc0YzA=", + "repeats": 5 + }, + { + "count": 4740304, + "lower_bound": "ZmE1Mzk4ODZiMWUyNDcwNjhhOThlNzc5NjY0M2Q0MjY=", + "upper_bound": "ZmIzMzYzMDI5YjgxNDEwNGFmM2JjNDE2M2U5MDFmMGY=", + "repeats": 488 + }, + { + "count": 4759648, + "lower_bound": "ZmIzNGE3YzE5ZmFiNDZhMWE4MGNkYzgxNmY4NTEzNGY=", + "upper_bound": "ZmMxNzVjY2MyNGM3NDBjY2E2YmRjZDk4Y2MzNTY3ZWE=", + "repeats": 5 + }, + { + "count": 4780443, + "lower_bound": "ZmMxOWM0YzZhNmQwNDk1MGFhMmRkNWNmZTYzNGMyYmE=", + "upper_bound": "ZmQyMzFiODQwMGYyNGQzNDk4MGNlZjU4NjIzMzgyOTI=", + "repeats": 3386 + }, + { + "count": 4799787, + "lower_bound": "ZmQyM2IyNWIwYTIxNGNlMmFmYzcwNTA4YjVmOWI0Yzk=", + "upper_bound": "ZmRkZDRiYTQwOTgzNGU3ZDg2MWZkYmM3YmVmOGY5NzQ=", + "repeats": 5 + }, + { + "count": 4819131, + "lower_bound": "ZmRlMjJiNmE3YzEwNDBiOGE0NTZkMzFiYzY0ZjZkM2U=", + "upper_bound": "ZmVlODkwODE2OGM2NDY0MTk2MjBjNTQxZmFhMjVjNjg=", + "repeats": 5 + }, + { + "count": 4836058, + "lower_bound": "ZmYwNDAyYjBjNWUzNGFhYTljNDZhZTM4Zjk3OGI4Y2U=", + "upper_bound": "ZmZlNTg0ZDBkZmNjNGJiM2FjYWQ5M2RkY2I5YTkzOGI=", + "repeats": 5 + } + ] + }, + "cm_sketch": { + "rows": [ + { + "counters": [ + 969, + 1508, + 1021, + 1273, + 1884, + 2764, + 1927, + 1322, + 2450, + 2835, + 1014, + 2577, + 2415, + 2348, + 1817, + 1909, + 3396, + 4112, + 2202, + 2093, + 1246, + 4245, + 1163, + 1585, + 1913, + 1183, + 2540, + 1608, + 2078, + 692, + 1815, + 2561, + 1531, + 1850, + 3204, + 4860, + 1344, + 1272, + 1831, + 999, + 929, + 1276, + 3333, + 1055, + 1103, + 2438, + 906, + 2674, + 1471, + 3156, + 3596, + 2486, + 1234, + 1329, + 2452, + 678, + 1329, + 2132, + 2158, + 768, + 1201, + 2416, + 2620, + 5031, + 1436, + 2312, + 2809, + 1765, + 2301, + 3045, + 2503, + 1181, + 3334, + 1187, + 1063, + 1533, + 3841, + 1325, + 2713, + 4497, + 1183, + 2834, + 1207, + 3112, + 1945, + 2086, + 2647, + 2360, + 2145, + 1589, + 1206, + 2416, + 2890, + 1186, + 3443, + 2986, + 2448, + 2100, + 1845, + 1307, + 2104, + 1836, + 1205, + 1275, + 2680, + 2212, + 2987, + 1157, + 5727, + 3582, + 722, + 5798, + 1938, + 2312, + 5468, + 1716, + 3089, + 1903, + 1118, + 3285, + 2496, + 2041, + 1363, + 2941, + 2077, + 3455, + 2771, + 2328, + 1292, + 2532, + 3266, + 1243, + 2274, + 2173, + 718, + 992, + 2160, + 3456, + 4524, + 2080, + 1737, + 3213, + 1772, + 2060, + 5358, + 2573, + 2717, + 1666, + 5445, + 2519, + 2276, + 1931, + 2784, + 2099, + 3284, + 2547, + 1875, + 1281, + 2698, + 1483, + 2169, + 1801, + 1955, + 2284, + 1693, + 2798, + 1805, + 2527, + 1762, + 1600, + 2121, + 3733, + 871, + 7582, + 3977, + 3150, + 1938, + 2080, + 3075, + 1444, + 1493, + 1859, + 3947, + 4498, + 1380, + 2798, + 1107, + 4724, + 2969, + 2149, + 1338, + 704, + 2849, + 1946, + 2928, + 4010, + 1929, + 1883, + 3986, + 1046, + 3079, + 5554, + 2321, + 4373, + 2498, + 2401, + 1638, + 1404, + 2002, + 891, + 1982, + 4574, + 809, + 2908, + 1693, + 1669, + 1068, + 2549, + 2263, + 1951, + 1594, + 3112, + 695, + 1829, + 2095, + 2013, + 1525, + 1733, + 2277, + 1604, + 2567, + 2690, + 2625, + 1008, + 2496, + 2710, + 2913, + 3229, + 2265, + 3464, + 3477, + 4304, + 1372, + 4711, + 2528, + 1566, + 743, + 1703, + 974, + 2914, + 1840, + 1460, + 2272, + 1427, + 937, + 1828, + 1583, + 998, + 666, + 1023, + 2581, + 1735, + 3204, + 1801, + 949, + 3972, + 994, + 2601, + 3066, + 1383, + 2850, + 1431, + 2248, + 1286, + 4660, + 4246, + 914, + 733, + 2967, + 1847, + 3950, + 4370, + 1517, + 2832, + 1735, + 7731, + 1248, + 2931, + 720, + 3486, + 881, + 3069, + 1265, + 1809, + 2791, + 2202, + 1389, + 1848, + 1058, + 2876, + 3043, + 2773, + 1497, + 2477, + 2338, + 702, + 2497, + 1888, + 4186, + 2444, + 844, + 1303, + 4183, + 2101, + 1534, + 2544, + 673, + 2654, + 2930, + 2855, + 3302, + 3560, + 1515, + 1789, + 1943, + 1410, + 3234, + 970, + 1999, + 4249, + 2491, + 1733, + 3976, + 2197, + 2721, + 850, + 4740, + 1313, + 2128, + 1646, + 2856, + 3408, + 2244, + 2968, + 2239, + 3141, + 3431, + 6849, + 2951, + 2783, + 1880, + 3026, + 2313, + 2566, + 1384, + 1630, + 2081, + 3046, + 2001, + 3733, + 4783, + 2594, + 1131, + 3066, + 963, + 1959, + 2728, + 3556, + 723, + 2493, + 2672, + 3153, + 2357, + 2885, + 1563, + 4256, + 3112, + 3589, + 2855, + 2644, + 3763, + 1584, + 1128, + 3932, + 2827, + 3438, + 2575, + 2547, + 1219, + 1423, + 1740, + 1156, + 2304, + 1326, + 1630, + 1068, + 2403, + 4787, + 1316, + 2065, + 1941, + 2993, + 1638, + 2390, + 2341, + 2903, + 3262, + 547, + 1314, + 3388, + 1060, + 2258, + 1882, + 4587, + 2596, + 3216, + 1908, + 1938, + 1703, + 1666, + 4197, + 3404, + 2863, + 1744, + 3696, + 1457, + 2816, + 1197, + 2015, + 1948, + 1666, + 1556, + 3004, + 1471, + 1267, + 3854, + 2302, + 1060, + 2313, + 3575, + 800, + 4513, + 2322, + 3744, + 2419, + 1912, + 2634, + 3255, + 2505, + 1530, + 2290, + 1615, + 3904, + 5057, + 2372, + 2191, + 1483, + 2847, + 2330, + 1809, + 1500, + 2797, + 1635, + 3326, + 2580, + 1351, + 847, + 681, + 1778, + 4134, + 3368, + 3605, + 943, + 3070, + 1906, + 3074, + 3732, + 2753, + 1610, + 1503, + 3571, + 1586, + 652, + 4172, + 1870, + 2815, + 3327, + 7370, + 810, + 2228, + 1785, + 1678, + 1596, + 1452, + 1462, + 1058, + 2633, + 1310, + 2045, + 890, + 754, + 2849, + 1154, + 3658, + 4976, + 2427, + 3826, + 2948, + 1488, + 2385, + 929, + 1514, + 2653, + 1804, + 823, + 2257, + 1094, + 1428, + 1583, + 3328, + 1380, + 1796, + 1831, + 1529, + 1645, + 1071, + 1898, + 3304, + 1815, + 2548, + 1744, + 1342, + 2628, + 2021, + 2135, + 1795, + 2647, + 1960, + 2980, + 552, + 1742, + 939, + 2319, + 2474, + 2971, + 2816, + 3341, + 4647, + 1038, + 1687, + 2694, + 3383, + 2310, + 2180, + 2636, + 2254, + 921, + 6259, + 1904, + 905, + 1921, + 2248, + 2671, + 2246, + 2708, + 3622, + 1620, + 1312, + 1766, + 1721, + 1586, + 1304, + 1493, + 1074, + 998, + 3875, + 2519, + 4548, + 1679, + 858, + 2569, + 2114, + 1280, + 1863, + 1716, + 2602, + 1498, + 993, + 3598, + 2106, + 1423, + 2030, + 3198, + 1813, + 622, + 2462, + 2341, + 1490, + 1448, + 1319, + 1926, + 3725, + 1303, + 2419, + 2339, + 3327, + 4877, + 1371, + 3548, + 2866, + 2040, + 3094, + 1501, + 2580, + 2093, + 1491, + 4333, + 3192, + 1356, + 3149, + 2306, + 1359, + 2077, + 3265, + 1693, + 2256, + 6116, + 1809, + 1240, + 3734, + 1890, + 4485, + 4282, + 2777, + 2098, + 1690, + 1289, + 2732, + 2603, + 2382, + 3184, + 5164, + 2566, + 1826, + 1720, + 1213, + 2624, + 3153, + 1805, + 3034, + 1034, + 1718, + 3300, + 2132, + 1888, + 1984, + 2265, + 1447, + 1955, + 1183, + 1565, + 2015, + 3860, + 1797, + 2674, + 1627, + 1460, + 3482, + 1627, + 1847, + 960, + 2749, + 1802, + 2606, + 1537, + 2890, + 2696, + 2152, + 3236, + 2016, + 4209, + 1962, + 2642, + 4788, + 653, + 2849, + 4692, + 2193, + 1811, + 1640, + 1216, + 3716, + 1903, + 2562, + 5490, + 4428, + 900, + 716, + 2471, + 2117, + 2332, + 2469, + 3035, + 1258, + 995, + 3044, + 3383, + 1704, + 2184, + 2236, + 1823, + 1606, + 2140, + 4348, + 1911, + 237, + 2085, + 3684, + 2425, + 2733, + 3914, + 3799, + 1826, + 1980, + 4195, + 715, + 3606, + 3037, + 1988, + 1990, + 1670, + 1154, + 4470, + 1470, + 1677, + 3866, + 2897, + 1378, + 733, + 1045, + 3011, + 3183, + 4057, + 2691, + 1382, + 844, + 5552, + 2495, + 997, + 2292, + 1915, + 801, + 2847, + 1998, + 2034, + 3056, + 1408, + 2554, + 1939, + 925, + 1378, + 1239, + 3510, + 3085, + 3427, + 1551, + 1297, + 3833, + 1381, + 2398, + 1292, + 3086, + 3352, + 1667, + 1354, + 1733, + 2545, + 1421, + 1202, + 1631, + 1423, + 2086, + 2745, + 2795, + 3254, + 6272, + 1868, + 966, + 2148, + 3923, + 2371, + 2449, + 3177, + 2463, + 2043, + 2526, + 783, + 2955, + 4499, + 674, + 798, + 2637, + 2957, + 1811, + 3620, + 2859, + 2049, + 1652, + 2815, + 2275, + 1878, + 1220, + 3545, + 2130, + 3708, + 1048, + 935, + 2056, + 1352, + 1610, + 4349, + 2320, + 2894, + 3057, + 3230, + 2075, + 1710, + 2357, + 2016, + 2224, + 3671, + 1131, + 1945, + 1930, + 2810, + 2965, + 1461, + 2956, + 1605, + 3206, + 2803, + 1878, + 3497, + 1608, + 2559, + 1426, + 2705, + 1532, + 2908, + 3102, + 2212, + 2886, + 1462, + 1571, + 1618, + 701, + 3232, + 1774, + 2551, + 1863, + 4326, + 2590, + 930, + 1213, + 2274, + 2177, + 1901, + 3507, + 2285, + 1843, + 1326, + 1585, + 2680, + 5407, + 2734, + 2373, + 885, + 2099, + 2070, + 1489, + 3478, + 2106, + 1545, + 1715, + 3429, + 4199, + 1971, + 2105, + 931, + 2254, + 1368, + 2065, + 3104, + 1643, + 1410, + 3088, + 1688, + 3795, + 3002, + 2965, + 1342, + 1282, + 2038, + 3463, + 1098, + 2273, + 2588, + 2502, + 2490, + 4307, + 2876, + 2464, + 1886, + 2564, + 2195, + 591, + 1250, + 3179, + 982, + 1702, + 1347, + 1983, + 4620, + 3660, + 755, + 1812, + 1199, + 2926, + 1679, + 1830, + 698, + 2075, + 1708, + 3164, + 1936, + 2943, + 1548, + 3321, + 4498, + 3225, + 1993, + 2257, + 1775, + 2951, + 1186, + 3019, + 2256, + 2302, + 722, + 2034, + 914, + 2488, + 5569, + 1556, + 1106, + 1654, + 3112, + 819, + 2365, + 1850, + 846, + 1506, + 4160, + 3829, + 1639, + 2244, + 2989, + 1537, + 2286, + 2779, + 2187, + 1505, + 936, + 3339, + 4775, + 1405, + 4047, + 1334, + 3296, + 690, + 2696, + 884, + 2674, + 4045, + 2072, + 1739, + 2812, + 1737, + 3671, + 1470, + 3005, + 2305, + 1916, + 2798, + 4951, + 1527, + 2006, + 1709, + 2296, + 3126, + 2229, + 3024, + 1517, + 768, + 3047, + 1633, + 3232, + 1613, + 4116, + 2588, + 676, + 1777, + 2961, + 1499, + 2493, + 1850, + 1412, + 3150, + 3259, + 1150, + 1917, + 3317, + 1806, + 2137, + 2691, + 1050, + 701, + 2768, + 1905, + 2485, + 3451, + 2901, + 2253, + 1366, + 3684, + 1698, + 808, + 2473, + 3670, + 3196, + 1089, + 2360, + 4488, + 1997, + 2012, + 1691, + 2680, + 2103, + 1652, + 2906, + 2241, + 1367, + 1389, + 925, + 811, + 2390, + 3455, + 3962, + 909, + 2078, + 1948, + 6223, + 1526, + 5076, + 2262, + 1652, + 2839, + 2117, + 1847, + 1030, + 4638, + 3542, + 3791, + 1510, + 5546, + 4070, + 1668, + 1692, + 1249, + 1745, + 2055, + 2911, + 1892, + 2010, + 2527, + 1574, + 1610, + 1845, + 3637, + 705, + 1387, + 2458, + 5861, + 2446, + 2337, + 1583, + 3068, + 2345, + 7296, + 1292, + 1596, + 970, + 3816, + 3187, + 3408, + 3016, + 1132, + 3473, + 923, + 1318, + 1411, + 4413, + 2260, + 2971, + 2075, + 2615, + 1027, + 2371, + 549, + 4757, + 2944, + 2672, + 793, + 2152, + 1254, + 3311, + 1952, + 1974, + 1938, + 3073, + 1909, + 5598, + 1776, + 1901, + 3261, + 1776, + 767, + 2550, + 3178, + 2066, + 1598, + 2796, + 2379, + 2398, + 2573, + 2390, + 1132, + 2217, + 3353, + 1202, + 5961, + 5133, + 2796, + 1384, + 3665, + 1183, + 2010, + 5378, + 2120, + 869, + 1275, + 2022, + 870, + 2990, + 862, + 607, + 1742, + 1719, + 4967, + 2419, + 1228, + 4052, + 1576, + 3601, + 1538, + 2219, + 2356, + 1446, + 2066, + 2443, + 1843, + 5805, + 3094, + 2819, + 736, + 1939, + 1889, + 1321, + 3598, + 1250, + 778, + 1957, + 1631, + 2471, + 1853, + 840, + 2514, + 832, + 2428, + 3206, + 3846, + 2520, + 771, + 693, + 1495, + 1458, + 855, + 1167, + 3240, + 3042, + 2985, + 1840, + 2529, + 3179, + 1208, + 3317, + 2141, + 963, + 1725, + 2436, + 1564, + 1796, + 677, + 2075, + 2530, + 3479, + 1474, + 1344, + 4018, + 4154, + 991, + 1846, + 2004, + 1837, + 679, + 1502, + 1051, + 1775, + 1371, + 2478, + 1156, + 1934, + 2197, + 2326, + 1348, + 2548, + 2839, + 1389, + 2301, + 2202, + 2445, + 2910, + 1187, + 3530, + 2501, + 1016, + 2579, + 584, + 2713, + 2313, + 2693, + 1604, + 643, + 4485, + 1248, + 4931, + 3748, + 2249, + 743, + 1165, + 2235, + 1210, + 2668, + 2978, + 1412, + 1444, + 2081, + 1056, + 1866, + 2309, + 2432, + 1221, + 3454, + 3901, + 2199, + 2770, + 1515, + 1701, + 763, + 3947, + 2252, + 2396, + 1682, + 3369, + 4506, + 2069, + 2921, + 881, + 2483, + 1820, + 2538, + 1761, + 3375, + 1763, + 1212, + 1487, + 1133, + 1592, + 3401, + 2376, + 1469, + 2049, + 3350, + 1544, + 1991, + 4641, + 1060, + 4543, + 1255, + 5218, + 1530, + 689, + 3465, + 1527, + 2845, + 1598, + 1534, + 2490, + 3924, + 2614, + 1084, + 1794, + 1269, + 2689, + 2061, + 1219, + 1918, + 3538, + 2433, + 2564, + 2675, + 1794, + 3186, + 2933, + 2926, + 2156, + 831, + 827, + 2450, + 1953, + 2993, + 1885, + 2723, + 7795, + 1952, + 1974, + 2235, + 1835, + 1706, + 3418, + 1010, + 1475, + 1269, + 2207, + 2271, + 4199, + 1795, + 2897, + 4443, + 3706, + 2425, + 5516, + 3918, + 4051, + 4808, + 2212, + 3338, + 3143, + 2040, + 1908, + 1947, + 875, + 1513, + 1114, + 3035, + 788, + 1088, + 1712, + 1948, + 901, + 2332, + 1584, + 1754, + 2590, + 2563, + 2818, + 2593, + 2829, + 2098, + 1670, + 1877, + 2460, + 1186, + 4221, + 2232, + 1977, + 991, + 2636, + 2682, + 2868, + 1720, + 1906, + 2610, + 1935, + 1950, + 2038, + 2815, + 2917, + 2178, + 3229, + 2165, + 2383, + 2494, + 596, + 1997, + 2490, + 978, + 899, + 4275, + 1623, + 1207, + 1645, + 631, + 717, + 2668, + 2387, + 1046, + 1740, + 1856, + 2398, + 1643, + 818, + 2554, + 1269, + 2067, + 2090, + 3510, + 1106, + 2090, + 1975, + 2492, + 1091, + 598, + 1041, + 1520, + 2829, + 3120, + 1498, + 2433, + 1628, + 2157, + 5302, + 4224, + 2331, + 1318, + 6301, + 4219, + 1346, + 886, + 2781, + 1831, + 1106, + 3260, + 2986, + 2877, + 3203, + 1171, + 2021, + 2065, + 2210, + 1599, + 2364, + 1561, + 2621, + 989, + 3986, + 1023, + 2461, + 1850, + 2219, + 2291, + 1640, + 1571, + 3169, + 4044, + 2992, + 1748, + 1688, + 2549, + 2627, + 2657, + 2934, + 1525, + 1407, + 1376, + 2158, + 4291, + 3848, + 1046, + 1597, + 2520, + 2715, + 849, + 4407, + 1535, + 5333, + 625, + 1739, + 1329, + 1788, + 1635, + 1478, + 1347, + 2980, + 1775, + 6496, + 3007, + 1919, + 3724, + 3963, + 1754, + 1548, + 3371, + 2661, + 2135, + 1364, + 1482, + 1607, + 730, + 2312, + 2150, + 1970, + 2000, + 2591, + 2974, + 1319, + 1552, + 3351, + 1585, + 1750, + 2014, + 1165, + 2778, + 1852, + 1812, + 1163, + 2303, + 5236, + 1280, + 1340, + 1328, + 3198, + 2808, + 2720, + 2008, + 2650, + 2321, + 1198, + 2116, + 2118, + 3267, + 1444, + 2431, + 1310, + 3254, + 1890, + 1842, + 1690, + 3340, + 1928, + 1260, + 2852, + 2186, + 2465, + 2757, + 5421, + 1340, + 1231, + 1661, + 1394, + 2099, + 3268, + 3708, + 1278, + 2330, + 2505, + 3439, + 2859, + 3559, + 1826, + 1612, + 2483, + 1932, + 814, + 2147, + 1588, + 2346, + 2558, + 1888, + 2197, + 1662, + 984, + 789, + 815, + 1736, + 1185, + 1666, + 1424, + 2378, + 762, + 3008, + 1331, + 5512, + 1516, + 2263, + 2465, + 2001, + 2643, + 1905, + 4757, + 2844, + 3003, + 3065, + 853, + 3232, + 1271, + 1955, + 1455, + 1463, + 820, + 3686, + 2337, + 4034, + 3080, + 1835, + 2170, + 1784, + 2393, + 4241, + 3323, + 3515, + 1924, + 2625, + 3669, + 1467, + 2030, + 755, + 2995, + 4061, + 2965, + 1779, + 1744, + 3773, + 2074, + 2844, + 1554, + 1525, + 1729, + 2102, + 3031, + 1616, + 1786, + 1277, + 1838, + 1221, + 1506, + 1961, + 1621, + 2127, + 1292, + 2351, + 2774, + 872, + 4005, + 4018, + 2647, + 1396, + 2175, + 2568, + 2482, + 2196, + 1869, + 869, + 4436, + 2585, + 3644, + 2040, + 1188, + 1627, + 1514, + 1859, + 1803, + 2883, + 3638, + 2390, + 1408, + 3631, + 2310, + 3366, + 1646, + 3803, + 2022, + 695, + 2568, + 2140, + 3081, + 1145, + 1939, + 1841, + 979, + 4321, + 605, + 2457, + 3049, + 2326, + 2492, + 3874, + 3136, + 2581, + 4043, + 2860, + 961, + 1377, + 2354, + 1859, + 1191, + 1856, + 1532, + 2032, + 3376, + 959, + 1529, + 1950, + 2100, + 2508, + 1959, + 1055, + 2302, + 1103, + 2940, + 2172, + 976, + 2174, + 2342, + 3044, + 2663, + 1215, + 3479, + 5742, + 3619, + 3374, + 2043, + 1681, + 2089, + 1602, + 1680, + 2173, + 4300, + 1388, + 1168, + 1744, + 995, + 1726, + 2700, + 2650, + 2003, + 1880, + 2490, + 1410, + 3916, + 3415, + 1712, + 1200, + 725, + 4736, + 675, + 1929, + 1538, + 3489, + 1642, + 3423, + 2109, + 882, + 1905, + 4159, + 1396, + 2429, + 3629, + 976, + 3583, + 2069, + 1178, + 1756, + 2794, + 1354, + 2116, + 850, + 2410, + 1358, + 1530, + 2607, + 2053, + 1744, + 831, + 1157, + 3474, + 2015, + 695, + 4307, + 1912, + 5702, + 2078, + 3758, + 3863, + 3216, + 5115, + 3151, + 1680, + 1375, + 3400, + 1107, + 1017, + 2756, + 1798, + 973, + 3041, + 2216, + 1983, + 1237, + 1865, + 2399, + 2692, + 2617, + 2572, + 1427, + 1472, + 3770, + 1494, + 895, + 2472, + 1623, + 2306, + 1331, + 1459, + 3678, + 2140, + 3684, + 772, + 1072, + 710, + 1677, + 1965, + 2140, + 3663, + 1935, + 2860, + 3434, + 2115, + 2916, + 2391, + 1231, + 2772, + 3076, + 959, + 2861, + 1443, + 1356, + 3121, + 1384, + 1549, + 843, + 1637, + 2642, + 2785, + 1886, + 2864, + 2363, + 2115, + 4348, + 3072, + 1653, + 1647, + 664, + 2464, + 1121, + 1191, + 3290, + 5469, + 2229, + 4137, + 2277, + 1565, + 2741, + 1193, + 1292, + 2934, + 928, + 2500, + 1907, + 1788, + 1794, + 1237, + 2084, + 2306, + 1018, + 1662, + 2297, + 3718, + 3675, + 3638, + 2619, + 2831, + 2410, + 2008, + 3943, + 2459, + 2211, + 2694, + 5578, + 4136, + 3001, + 2989, + 2253, + 1545, + 3165, + 853, + 3194, + 1070, + 2059, + 2599, + 1654, + 2277, + 4047, + 2016, + 2865, + 2285, + 1349, + 1791, + 3321, + 2515, + 1914, + 2305, + 1441, + 2483, + 6679, + 1300, + 907, + 2075, + 1020, + 1983, + 3307, + 3518, + 1693, + 2198, + 2267, + 1707, + 2184, + 1663, + 3556, + 3255, + 1737, + 1565, + 2884, + 1411, + 3167, + 2279, + 3192, + 1870, + 2607, + 970, + 2991, + 2083, + 4688, + 2635, + 3512, + 2169, + 1098, + 1795, + 3680, + 1513, + 2100, + 2613, + 2751, + 1909, + 1466, + 2861, + 2890, + 785, + 1436, + 3603, + 3172, + 2244, + 1999, + 8708, + 3105, + 1612, + 768, + 1141, + 2807, + 2422, + 1481, + 590, + 4111, + 3882, + 1047, + 3124, + 777, + 2412, + 2354, + 1102, + 2910, + 4867, + 1756, + 3557, + 2687, + 1762, + 2628, + 3096, + 2596, + 1821, + 2210, + 2382, + 1558, + 3488, + 2565, + 1555, + 4164, + 1374, + 3906, + 2060, + 2184, + 3012, + 1059, + 1938, + 2152, + 1172, + 2007, + 1651 + ] + }, + { + "counters": [ + 2960, + 3751, + 2410, + 1537, + 4044, + 5659, + 2290, + 4501, + 1773, + 2298, + 1996, + 1562, + 1870, + 4511, + 2667, + 3341, + 1040, + 1187, + 683, + 2298, + 1259, + 1395, + 2060, + 4976, + 2114, + 2408, + 1434, + 1142, + 878, + 1645, + 1533, + 2021, + 1582, + 2619, + 2691, + 2002, + 2113, + 1687, + 1967, + 2070, + 2683, + 1599, + 1463, + 1744, + 3109, + 4742, + 2455, + 2234, + 831, + 3376, + 3778, + 1221, + 1017, + 1631, + 1816, + 1111, + 1917, + 1488, + 2047, + 2881, + 2442, + 3808, + 1806, + 1455, + 1605, + 3048, + 2669, + 1937, + 2090, + 2270, + 859, + 2295, + 4275, + 2305, + 4879, + 2070, + 3072, + 2993, + 790, + 1913, + 1586, + 2567, + 3116, + 1757, + 3995, + 2522, + 2163, + 2558, + 2602, + 1585, + 3136, + 1277, + 3307, + 912, + 1814, + 2756, + 3812, + 1962, + 2827, + 1474, + 2314, + 1846, + 3616, + 1049, + 1611, + 2605, + 1458, + 2142, + 4332, + 2111, + 627, + 1391, + 2750, + 3586, + 704, + 1203, + 2664, + 3232, + 2230, + 3071, + 3050, + 3392, + 1168, + 3182, + 1815, + 3077, + 773, + 1927, + 1561, + 3253, + 863, + 6665, + 2136, + 1112, + 1901, + 1458, + 2691, + 783, + 5909, + 568, + 4266, + 1171, + 2736, + 2091, + 786, + 1265, + 1718, + 3668, + 908, + 1769, + 1792, + 2039, + 2645, + 2500, + 3906, + 1357, + 2839, + 1085, + 1479, + 4905, + 1487, + 1976, + 2873, + 1776, + 3412, + 2546, + 642, + 2635, + 2900, + 2539, + 1613, + 2948, + 1540, + 744, + 3089, + 3429, + 2677, + 2341, + 1042, + 1707, + 1114, + 739, + 2416, + 2440, + 2767, + 2506, + 3999, + 6847, + 2032, + 2998, + 1057, + 1795, + 2132, + 2051, + 2084, + 3605, + 2385, + 1784, + 1890, + 1057, + 2538, + 2468, + 4772, + 1074, + 1941, + 3071, + 2615, + 2314, + 3063, + 2295, + 3958, + 2139, + 1226, + 3917, + 832, + 3067, + 1789, + 1723, + 3318, + 794, + 2621, + 2470, + 3247, + 2017, + 1125, + 3917, + 1182, + 1236, + 1026, + 866, + 2375, + 1818, + 2393, + 569, + 3984, + 2474, + 2312, + 3180, + 1640, + 974, + 4494, + 2786, + 1369, + 2143, + 3209, + 2399, + 3898, + 1605, + 2774, + 1599, + 3573, + 1593, + 1757, + 3896, + 3997, + 858, + 3025, + 785, + 2260, + 3469, + 1968, + 2857, + 3444, + 1641, + 1776, + 3386, + 2355, + 1611, + 1970, + 1083, + 1672, + 1500, + 1639, + 1376, + 4162, + 1961, + 4654, + 773, + 1522, + 1410, + 2668, + 942, + 4897, + 4053, + 1812, + 777, + 2655, + 2788, + 1729, + 1693, + 1175, + 1230, + 2859, + 1246, + 1607, + 2195, + 1994, + 1709, + 2447, + 1349, + 1952, + 2042, + 2538, + 2151, + 1639, + 1450, + 2766, + 2051, + 3344, + 3409, + 1496, + 1812, + 4020, + 4373, + 1926, + 1105, + 3314, + 2283, + 6586, + 1294, + 1945, + 3217, + 1084, + 3127, + 2162, + 1497, + 1366, + 2802, + 2974, + 1417, + 3347, + 4712, + 1192, + 1448, + 1019, + 2776, + 1994, + 2861, + 1615, + 2126, + 2949, + 2989, + 2540, + 1495, + 2380, + 1032, + 1548, + 2551, + 1346, + 2087, + 3867, + 2103, + 1951, + 2421, + 793, + 2209, + 3045, + 2388, + 2255, + 4591, + 2054, + 1713, + 1505, + 1111, + 2535, + 1296, + 2519, + 3445, + 3274, + 1718, + 2989, + 1199, + 4073, + 694, + 1665, + 2138, + 3950, + 1642, + 1696, + 1053, + 2182, + 2233, + 2458, + 5198, + 1638, + 3113, + 1356, + 2501, + 3824, + 1118, + 2928, + 2203, + 3452, + 1883, + 1130, + 819, + 2768, + 2363, + 2347, + 3743, + 2846, + 2312, + 2636, + 3039, + 704, + 2187, + 3335, + 2408, + 4547, + 2053, + 1967, + 2012, + 735, + 1756, + 1264, + 3354, + 709, + 2363, + 3692, + 936, + 755, + 1380, + 2927, + 2040, + 1412, + 1068, + 3145, + 3015, + 983, + 3251, + 1540, + 2031, + 2443, + 2595, + 1452, + 2131, + 4015, + 763, + 1059, + 1260, + 3115, + 2668, + 935, + 2990, + 2326, + 3042, + 539, + 3026, + 1976, + 1349, + 1811, + 1386, + 3014, + 826, + 3029, + 1389, + 2024, + 1501, + 2207, + 1560, + 2291, + 2347, + 1671, + 2104, + 1701, + 1697, + 1727, + 3743, + 1733, + 1441, + 3370, + 1767, + 4350, + 1453, + 2717, + 2191, + 996, + 1175, + 1180, + 1427, + 3822, + 855, + 1529, + 3360, + 1447, + 1909, + 2668, + 1942, + 2691, + 795, + 3707, + 3704, + 2049, + 3292, + 2284, + 2818, + 4543, + 1584, + 4757, + 821, + 3970, + 2716, + 3328, + 1349, + 810, + 3774, + 2448, + 3293, + 1560, + 1180, + 2383, + 978, + 3137, + 2483, + 4304, + 2721, + 2884, + 1089, + 965, + 4627, + 1529, + 1787, + 2033, + 4150, + 2871, + 1508, + 1826, + 3274, + 619, + 1188, + 3670, + 3170, + 1301, + 1629, + 4544, + 4155, + 2510, + 1639, + 2059, + 5795, + 2699, + 5274, + 4138, + 1670, + 1634, + 2097, + 1900, + 2719, + 3017, + 1544, + 1694, + 1055, + 3332, + 3722, + 2754, + 1994, + 2456, + 2886, + 3170, + 5384, + 1126, + 1934, + 753, + 3250, + 2298, + 577, + 2587, + 1892, + 1711, + 3409, + 1750, + 1357, + 2090, + 2568, + 2408, + 1815, + 1838, + 2467, + 2004, + 2223, + 2296, + 1378, + 2481, + 844, + 2346, + 5798, + 1593, + 1563, + 1369, + 2571, + 3220, + 2631, + 2200, + 1889, + 4373, + 2505, + 6004, + 3403, + 2021, + 3368, + 1874, + 1163, + 813, + 2498, + 2731, + 2703, + 1828, + 721, + 1770, + 1037, + 2235, + 1249, + 1119, + 2962, + 3303, + 5876, + 3690, + 1810, + 2414, + 3656, + 1324, + 1394, + 1642, + 3188, + 1371, + 4635, + 3239, + 4371, + 1746, + 1774, + 2573, + 1663, + 2090, + 3286, + 2166, + 2411, + 1191, + 1450, + 2918, + 2252, + 3014, + 1163, + 2597, + 1264, + 3805, + 2101, + 1229, + 1958, + 2160, + 962, + 2790, + 1699, + 2963, + 1059, + 1465, + 2323, + 4435, + 2093, + 1295, + 2527, + 1678, + 1441, + 4164, + 3145, + 4531, + 1353, + 2316, + 3363, + 1294, + 1754, + 1900, + 1703, + 1642, + 1972, + 1875, + 808, + 2257, + 3399, + 1764, + 955, + 1077, + 1309, + 4389, + 2522, + 2022, + 2514, + 644, + 1952, + 1374, + 3432, + 1741, + 2581, + 784, + 1686, + 4447, + 1064, + 2500, + 2021, + 3314, + 1957, + 1575, + 1727, + 1357, + 2727, + 2035, + 3229, + 2304, + 1583, + 2584, + 2143, + 1894, + 708, + 1430, + 3075, + 2476, + 1154, + 2492, + 1376, + 1996, + 2260, + 2431, + 1172, + 2076, + 2090, + 1850, + 2125, + 1811, + 3392, + 3402, + 3348, + 1808, + 1427, + 3755, + 1870, + 1800, + 3069, + 1889, + 1024, + 3511, + 1857, + 1705, + 3655, + 2465, + 3375, + 3441, + 1627, + 2503, + 2491, + 2566, + 873, + 1131, + 2731, + 896, + 2181, + 1398, + 1195, + 1072, + 989, + 1930, + 5045, + 4468, + 5199, + 2247, + 1322, + 2282, + 1612, + 1952, + 2434, + 3076, + 4424, + 2198, + 2272, + 1930, + 1985, + 1082, + 1372, + 3050, + 2051, + 4807, + 2823, + 2023, + 1628, + 551, + 650, + 1969, + 3487, + 896, + 1789, + 2177, + 2352, + 1051, + 2952, + 1687, + 1951, + 3086, + 2623, + 2906, + 2639, + 1540, + 1213, + 1379, + 1530, + 3379, + 2364, + 1407, + 2508, + 1132, + 3939, + 1859, + 2156, + 2952, + 1538, + 793, + 733, + 3219, + 2942, + 1622, + 1513, + 1512, + 2211, + 2433, + 2059, + 2144, + 939, + 4128, + 1428, + 868, + 1716, + 1011, + 4703, + 2191, + 4772, + 3018, + 2311, + 6049, + 2782, + 4640, + 2326, + 1778, + 3223, + 2575, + 2803, + 1158, + 4073, + 4170, + 3460, + 796, + 1710, + 1504, + 611, + 1839, + 925, + 2443, + 1376, + 3180, + 1582, + 1602, + 3447, + 3684, + 2039, + 1249, + 3085, + 4435, + 3817, + 1381, + 3385, + 2436, + 3457, + 2141, + 1897, + 1913, + 2623, + 2364, + 3346, + 2780, + 1405, + 4368, + 2246, + 3545, + 1003, + 1621, + 2875, + 3051, + 1745, + 1536, + 1782, + 5545, + 2038, + 2171, + 2822, + 890, + 1185, + 1788, + 3002, + 2019, + 4733, + 2023, + 2506, + 1853, + 2982, + 2143, + 1352, + 1787, + 903, + 4773, + 1113, + 1397, + 3381, + 3443, + 2454, + 1241, + 1010, + 1782, + 1726, + 1830, + 1256, + 3258, + 3162, + 1553, + 2133, + 1775, + 669, + 3154, + 3721, + 2843, + 3798, + 2924, + 2840, + 2601, + 2022, + 2624, + 4617, + 4045, + 2671, + 1552, + 2625, + 1684, + 3601, + 985, + 3600, + 3552, + 1204, + 2851, + 2507, + 2301, + 2278, + 2715, + 1456, + 2524, + 2360, + 3065, + 1148, + 2323, + 1887, + 1847, + 2941, + 3333, + 4635, + 4589, + 1221, + 1103, + 1960, + 1840, + 4355, + 1483, + 3583, + 1706, + 2216, + 5137, + 2023, + 3094, + 1697, + 1355, + 6237, + 1667, + 2587, + 3301, + 3111, + 5992, + 1179, + 1840, + 4867, + 4242, + 1846, + 4838, + 1063, + 2546, + 2811, + 1180, + 1232, + 1603, + 1971, + 5092, + 5018, + 656, + 1802, + 5148, + 1128, + 825, + 1813, + 3777, + 1916, + 2278, + 4032, + 1873, + 2472, + 2353, + 3229, + 1892, + 3463, + 1206, + 2767, + 2318, + 1792, + 2379, + 969, + 1071, + 1113, + 1410, + 4598, + 1425, + 1575, + 3143, + 2730, + 1658, + 2158, + 986, + 892, + 3483, + 2447, + 1635, + 2274, + 1750, + 2956, + 3186, + 1599, + 1661, + 2726, + 1291, + 3053, + 1477, + 1619, + 3049, + 1587, + 890, + 2386, + 5902, + 1840, + 760, + 2091, + 2534, + 1462, + 2473, + 5378, + 2005, + 1752, + 1644, + 2889, + 2673, + 690, + 2207, + 1987, + 1055, + 2161, + 670, + 2327, + 2967, + 2224, + 2304, + 2534, + 2274, + 1650, + 1943, + 4377, + 3375, + 1857, + 2488, + 3296, + 1934, + 2799, + 2914, + 3185, + 1429, + 3262, + 2091, + 1933, + 1584, + 839, + 1880, + 1032, + 2924, + 915, + 2385, + 3345, + 4305, + 955, + 1738, + 2160, + 2147, + 866, + 1616, + 1565, + 1499, + 862, + 3068, + 4322, + 2129, + 5850, + 1683, + 2697, + 1652, + 2226, + 1488, + 2516, + 2644, + 1461, + 1669, + 2512, + 1979, + 3594, + 1512, + 2445, + 2147, + 1337, + 1918, + 1150, + 2371, + 2213, + 1520, + 839, + 3080, + 2070, + 2497, + 2015, + 1487, + 1825, + 2710, + 1926, + 2023, + 4821, + 2153, + 5677, + 1821, + 3654, + 3778, + 888, + 1589, + 2527, + 4374, + 1833, + 2014, + 3022, + 2989, + 2981, + 532, + 3204, + 1440, + 1144, + 1794, + 1550, + 3270, + 1946, + 2652, + 3138, + 1706, + 1755, + 4934, + 3612, + 2360, + 4264, + 1554, + 2537, + 1061, + 801, + 4458, + 4080, + 2869, + 1378, + 2170, + 793, + 912, + 1247, + 2597, + 2355, + 1126, + 1321, + 1700, + 2016, + 1268, + 725, + 3141, + 1354, + 2359, + 4513, + 3798, + 1266, + 1617, + 2157, + 1516, + 3307, + 2003, + 1537, + 3642, + 4199, + 1041, + 2500, + 4650, + 601, + 1419, + 1295, + 1329, + 2587, + 2455, + 1289, + 2112, + 2397, + 742, + 1676, + 2619, + 2101, + 4510, + 1127, + 1510, + 1074, + 2558, + 794, + 2555, + 914, + 2197, + 2108, + 4411, + 3349, + 2352, + 2109, + 2210, + 1272, + 4675, + 2499, + 1224, + 2172, + 2649, + 1215, + 2646, + 1421, + 1739, + 1813, + 1872, + 1651, + 2721, + 2428, + 3289, + 2603, + 2695, + 987, + 3272, + 5277, + 1166, + 1099, + 2780, + 2829, + 2320, + 2327, + 1365, + 2920, + 2073, + 524, + 3728, + 3586, + 1663, + 3225, + 2147, + 1306, + 2598, + 2137, + 1326, + 2851, + 2303, + 1054, + 3731, + 1736, + 3497, + 1892, + 784, + 2640, + 1812, + 3750, + 2671, + 940, + 1606, + 4540, + 2030, + 907, + 936, + 1623, + 2785, + 1895, + 2979, + 3068, + 2500, + 2103, + 1787, + 981, + 2164, + 2424, + 1347, + 2022, + 2104, + 781, + 1267, + 3271, + 3246, + 6162, + 2020, + 1509, + 2484, + 2663, + 2339, + 2874, + 2378, + 4312, + 2454, + 1892, + 1240, + 1644, + 2482, + 717, + 1889, + 4290, + 1519, + 3918, + 2058, + 1323, + 4909, + 1229, + 2851, + 2576, + 2844, + 1013, + 2001, + 1470, + 2763, + 2511, + 2691, + 2470, + 2209, + 2254, + 5819, + 2204, + 613, + 2709, + 3051, + 1215, + 2606, + 1847, + 2800, + 1790, + 1439, + 1213, + 1600, + 1846, + 4393, + 1686, + 2896, + 2053, + 1782, + 2153, + 3508, + 1188, + 4686, + 2315, + 3750, + 1231, + 685, + 3414, + 1906, + 1863, + 4242, + 2234, + 2069, + 2717, + 3625, + 2459, + 2695, + 1692, + 2732, + 3302, + 1602, + 4349, + 3873, + 2783, + 4465, + 1556, + 1759, + 3841, + 1050, + 2558, + 1413, + 2221, + 1517, + 2553, + 2093, + 2542, + 1641, + 1585, + 754, + 1558, + 1099, + 1061, + 4028, + 3211, + 1546, + 4181, + 1250, + 2615, + 2758, + 1965, + 2840, + 5649, + 1948, + 1412, + 1579, + 2319, + 2017, + 2118, + 1639, + 1770, + 660, + 650, + 3170, + 2880, + 1240, + 2419, + 1992, + 4796, + 1645, + 2243, + 1574, + 1410, + 2448, + 1572, + 2336, + 1851, + 2196, + 672, + 2564, + 891, + 2591, + 2795, + 2229, + 3282, + 1554, + 2560, + 4100, + 1570, + 1201, + 966, + 989, + 2409, + 2904, + 1682, + 4153, + 1401, + 1669, + 1383, + 2442, + 3022, + 1439, + 3028, + 1432, + 1182, + 3002, + 1834, + 2924, + 2145, + 2290, + 905, + 2250, + 1685, + 1624, + 3630, + 1528, + 2452, + 2242, + 1887, + 1484, + 742, + 969, + 2946, + 2121, + 3665, + 1727, + 3195, + 2590, + 1786, + 1789, + 1236, + 1181, + 2406, + 609, + 1492, + 2516, + 3702, + 2395, + 1318, + 2624, + 2537, + 1886, + 1512, + 2490, + 3090, + 2410, + 2270, + 3745, + 1341, + 1490, + 2041, + 2259, + 2275, + 1294, + 2333, + 1601, + 2949, + 1034, + 3529, + 1859, + 4285, + 2629, + 1873, + 1361, + 2906, + 3525, + 1802, + 2382, + 1916, + 2049, + 2396, + 1819, + 910, + 2195, + 1229, + 4888, + 1552, + 1942, + 1435, + 826, + 1342, + 1938, + 1775, + 1829, + 712, + 1264, + 1408, + 1558, + 2195, + 2879, + 1129, + 828, + 4830, + 2767, + 1442, + 1478, + 2028, + 1349, + 1513, + 1956, + 2170, + 1307, + 1271, + 2378, + 1981, + 3054, + 2867, + 2390, + 1429, + 836, + 2710, + 3737, + 1542, + 3515, + 1830, + 2074, + 2438, + 2870, + 3495, + 1044, + 4520, + 3437, + 2271, + 2771, + 1843, + 1221, + 687, + 1111, + 2702, + 1018, + 2354, + 2263, + 3997, + 2431, + 2162, + 1751, + 1619, + 1544, + 3567, + 1752, + 4030, + 2037, + 4028, + 707, + 2963, + 1534, + 5134, + 2148, + 1936, + 7895, + 1322, + 1673, + 1048, + 3616, + 1986, + 1406, + 3239, + 2215, + 3229, + 3374, + 1941, + 4009, + 722, + 2638, + 729, + 1798, + 2500, + 4884, + 5813, + 2368, + 1932, + 1694, + 716, + 1669, + 2235, + 1658, + 1474, + 2792, + 1770, + 1952, + 2990, + 1065, + 2732, + 1738, + 2288, + 2875, + 2162, + 3130, + 1931, + 5306, + 1970, + 3054, + 1694, + 3517, + 3736, + 1907, + 1218, + 1510, + 1974, + 2161, + 2580, + 4929, + 2661, + 740, + 2284, + 2463, + 1455, + 2475, + 1463, + 1793, + 2778, + 2707, + 1221, + 2650, + 1545, + 2467, + 2472, + 1183, + 1023, + 3939, + 1382, + 4683, + 1370, + 3419, + 5680, + 2044, + 2419, + 1285, + 5124, + 1251, + 2277, + 2266, + 3619, + 1756, + 1535, + 1354, + 1674, + 2547, + 2894, + 2591, + 2528, + 2048, + 1539, + 3312, + 608, + 1340, + 3932, + 2665, + 1781, + 1755, + 1605, + 1524, + 1604, + 2757, + 1685, + 1960, + 1439, + 1874, + 1518, + 1855, + 3404, + 1123, + 2035, + 1818, + 1360, + 2969, + 3908, + 1363, + 592, + 1357, + 1493, + 2819, + 2348, + 2805, + 2573, + 2368, + 1271, + 2727, + 1669, + 3307, + 1744, + 616, + 6035, + 2723, + 2413, + 2803, + 1683, + 4219, + 567, + 2695, + 1984, + 2422, + 1399, + 1112, + 2014, + 3779, + 2539, + 935, + 2334, + 1683, + 3266, + 2352, + 4014, + 1353, + 4199, + 1804, + 3456, + 3302, + 4344, + 2786, + 3245, + 2792, + 1669, + 1808, + 2892, + 2879, + 2276, + 3110, + 1549, + 2585, + 1356, + 2208, + 635, + 1505, + 2101, + 3687, + 3638, + 2971, + 4573, + 1124, + 2578, + 1065, + 2346, + 829, + 2644, + 2742, + 4317, + 2727, + 1099, + 4096, + 2135, + 1068, + 1049, + 2017, + 2318, + 1839, + 1651, + 1304, + 1678, + 1586, + 2390, + 1263, + 3418, + 2394, + 1768, + 2834, + 1436, + 4288, + 2402, + 2288, + 1234, + 2633, + 1738, + 2503, + 4058, + 2796, + 846, + 3205, + 922, + 947, + 1970, + 3155, + 758, + 1972, + 1523, + 2652, + 1561, + 1897, + 1933, + 2811, + 2346, + 1193, + 3265, + 1769, + 1766, + 3532, + 1466, + 2462, + 2505, + 3821, + 6303, + 1613, + 1791, + 3192, + 2224, + 2422, + 1683, + 3432, + 2752, + 2037, + 2392, + 1512, + 1950, + 2353, + 1744, + 1411, + 2207, + 3260, + 2113, + 1356, + 3286, + 1915, + 1847, + 1949, + 2612, + 1370, + 1975, + 1340, + 2578, + 3834, + 959, + 1997, + 1087, + 1929, + 944, + 1545, + 2930, + 2153, + 2935, + 1403, + 6149, + 732, + 3331, + 1270, + 3161, + 3295, + 2002, + 1231, + 2592, + 889, + 3095, + 3109, + 3299, + 3448, + 3108, + 2860, + 2499, + 2556, + 3311, + 2406, + 1475, + 1545, + 1051, + 2292, + 3122, + 2417, + 769, + 1114, + 2536, + 1954, + 3267, + 2136, + 1694, + 794, + 3007, + 1051, + 2465, + 1745, + 1652, + 2389, + 2015, + 2043, + 3239, + 4257, + 2743, + 3329, + 2183, + 5332, + 3380, + 962, + 1572, + 1805, + 2374, + 6546, + 1796, + 1520, + 3380, + 3206, + 1192, + 749, + 2121, + 2504, + 3554, + 1101, + 1847, + 1388, + 1310, + 1571, + 5641, + 1828, + 1487, + 1652, + 1665, + 2345, + 1072, + 2310, + 2207, + 2308, + 1936, + 3052, + 1329, + 2314, + 1854, + 2911, + 1615, + 2463, + 1630, + 1613, + 1007, + 1647, + 4037, + 888, + 916, + 3516, + 2237, + 1570, + 2531, + 1916, + 2001, + 2360, + 3576, + 4531, + 769, + 3012, + 1661, + 968, + 3369, + 2335, + 1840, + 1998, + 3152, + 2652, + 3584, + 2862, + 3453, + 2480, + 4007, + 4256, + 2543, + 2205, + 2314, + 3356, + 609, + 3019, + 5902, + 2719, + 2136, + 1819, + 2985, + 1824, + 2496, + 1889, + 3201, + 735, + 2710, + 1943, + 853, + 3097, + 2445, + 5115, + 2961, + 1327, + 2571, + 928, + 2763, + 2686, + 1276, + 1426, + 1827, + 1751, + 2213, + 3695, + 2050 + ] + }, + { + "counters": [ + 1342, + 1555, + 2419, + 1214, + 3573, + 1230, + 2648, + 1835, + 2968, + 3497, + 2278, + 2807, + 1515, + 5374, + 1710, + 2068, + 2006, + 2846, + 3554, + 2763, + 1202, + 1883, + 1469, + 682, + 1199, + 1869, + 2513, + 1314, + 2070, + 2170, + 2086, + 984, + 4014, + 3840, + 2128, + 2226, + 1897, + 1615, + 3314, + 763, + 508, + 2168, + 883, + 3028, + 1045, + 1987, + 3080, + 2839, + 3103, + 2577, + 1887, + 4354, + 2354, + 1025, + 727, + 816, + 1300, + 1324, + 1456, + 2225, + 2049, + 4337, + 2473, + 1688, + 3592, + 1453, + 1308, + 4824, + 3969, + 1517, + 3032, + 1845, + 1834, + 4222, + 1872, + 3028, + 3126, + 2807, + 2053, + 1342, + 1465, + 2768, + 3079, + 727, + 1436, + 652, + 1830, + 5648, + 1094, + 2973, + 3057, + 1337, + 4111, + 2941, + 3415, + 3294, + 1881, + 1206, + 2168, + 657, + 3011, + 1436, + 3865, + 764, + 2212, + 1800, + 3133, + 2143, + 2283, + 2096, + 1725, + 871, + 2943, + 1613, + 1014, + 1353, + 4177, + 1110, + 624, + 1689, + 2451, + 2089, + 4192, + 2689, + 1356, + 2407, + 2903, + 4992, + 1571, + 2493, + 2245, + 1222, + 1626, + 3062, + 2045, + 2341, + 2564, + 1988, + 3513, + 3734, + 2708, + 2019, + 2237, + 2277, + 1283, + 1618, + 2000, + 1438, + 4239, + 2930, + 3923, + 2885, + 1535, + 3764, + 1904, + 3857, + 2816, + 1589, + 1616, + 2209, + 2731, + 2230, + 1341, + 3551, + 1765, + 2218, + 1482, + 1526, + 2227, + 2435, + 1129, + 2446, + 1811, + 1552, + 3565, + 5904, + 1452, + 2801, + 2273, + 1732, + 3030, + 1649, + 771, + 2546, + 3494, + 1030, + 1576, + 1612, + 3321, + 2047, + 921, + 1159, + 713, + 796, + 4210, + 2824, + 1166, + 6048, + 1807, + 1051, + 1264, + 1767, + 1919, + 2825, + 785, + 1451, + 2469, + 1599, + 1484, + 2518, + 2864, + 1629, + 1144, + 3261, + 2017, + 2133, + 2134, + 1836, + 2757, + 3093, + 988, + 1293, + 2085, + 2146, + 3618, + 2781, + 4073, + 1578, + 856, + 2200, + 1849, + 3731, + 3059, + 4453, + 1540, + 1954, + 1108, + 3112, + 2149, + 1202, + 4327, + 5460, + 1357, + 1533, + 2364, + 3142, + 745, + 1630, + 2183, + 3354, + 2907, + 2805, + 1466, + 3828, + 4234, + 1682, + 3368, + 1067, + 3168, + 1417, + 2882, + 2025, + 1537, + 791, + 772, + 2620, + 3929, + 615, + 4164, + 3822, + 1301, + 2074, + 3633, + 2344, + 3560, + 2897, + 3808, + 1670, + 1263, + 965, + 4759, + 2554, + 2583, + 2397, + 2785, + 2533, + 1513, + 5371, + 3801, + 6564, + 2432, + 3745, + 3691, + 1675, + 542, + 3108, + 2220, + 1128, + 3951, + 1382, + 668, + 2978, + 783, + 1384, + 3206, + 1017, + 2391, + 2081, + 2247, + 1043, + 1974, + 809, + 1172, + 2364, + 4631, + 1260, + 3691, + 2557, + 2996, + 2305, + 1743, + 868, + 1667, + 2612, + 1273, + 1528, + 1971, + 3023, + 2591, + 3101, + 3527, + 2976, + 1644, + 3872, + 1940, + 1582, + 2533, + 3527, + 2021, + 1645, + 2406, + 1968, + 2212, + 1921, + 1673, + 3285, + 1237, + 1681, + 2890, + 2170, + 4811, + 1898, + 2671, + 2946, + 1423, + 2060, + 3087, + 1331, + 1185, + 3498, + 1261, + 2286, + 2572, + 2406, + 3775, + 2332, + 1493, + 1286, + 1111, + 1250, + 1177, + 2243, + 1733, + 3563, + 2321, + 3812, + 1386, + 1341, + 2957, + 2008, + 4388, + 2104, + 3073, + 2562, + 1756, + 1214, + 1798, + 1914, + 2332, + 1044, + 3378, + 1674, + 1717, + 3201, + 3183, + 1669, + 4758, + 3038, + 1835, + 1511, + 639, + 3277, + 2614, + 2458, + 2277, + 2512, + 1533, + 3684, + 1402, + 2645, + 2024, + 1332, + 1904, + 2086, + 2014, + 1922, + 885, + 3808, + 2264, + 1564, + 3017, + 1043, + 1674, + 1494, + 3219, + 1059, + 1129, + 2513, + 758, + 2071, + 3348, + 2067, + 1751, + 1042, + 1391, + 1126, + 1502, + 1723, + 1523, + 3961, + 2601, + 1711, + 2386, + 3332, + 1321, + 2438, + 3135, + 1705, + 2540, + 2562, + 2570, + 4057, + 2881, + 1929, + 3550, + 1414, + 3280, + 975, + 2562, + 624, + 968, + 1414, + 2413, + 1030, + 3071, + 1017, + 1864, + 1158, + 1160, + 935, + 2685, + 1364, + 1811, + 1375, + 1980, + 3287, + 2891, + 1668, + 1075, + 695, + 4152, + 2079, + 877, + 2914, + 550, + 2083, + 2145, + 1979, + 1689, + 2296, + 1819, + 676, + 2469, + 1640, + 5235, + 2308, + 3536, + 1861, + 1693, + 2040, + 816, + 1539, + 2232, + 1882, + 1142, + 3009, + 873, + 2113, + 3388, + 769, + 703, + 1585, + 2150, + 2155, + 961, + 2642, + 2020, + 5825, + 1649, + 1491, + 1100, + 5119, + 958, + 3116, + 7124, + 1564, + 1380, + 2102, + 1233, + 1622, + 2969, + 1587, + 2305, + 1969, + 2096, + 1401, + 2858, + 1754, + 1467, + 1530, + 1054, + 1079, + 4882, + 1376, + 2033, + 2045, + 3312, + 3667, + 795, + 1990, + 2525, + 4726, + 710, + 1125, + 4142, + 1360, + 3018, + 766, + 3364, + 3130, + 2378, + 2127, + 1025, + 811, + 1510, + 2665, + 3611, + 2653, + 1238, + 1763, + 3497, + 2162, + 1554, + 2128, + 2575, + 3432, + 2029, + 3097, + 1863, + 1730, + 1571, + 3656, + 3700, + 3093, + 1378, + 2931, + 2346, + 2141, + 3144, + 1105, + 2663, + 1184, + 3197, + 6590, + 3236, + 2751, + 1676, + 1427, + 1515, + 1595, + 2130, + 1662, + 1681, + 2263, + 4745, + 1847, + 3057, + 3298, + 1538, + 3647, + 2541, + 1856, + 2479, + 1147, + 1861, + 505, + 1383, + 1352, + 1318, + 2204, + 2106, + 1702, + 1745, + 2095, + 1134, + 1297, + 1526, + 1830, + 2040, + 1187, + 976, + 2371, + 3577, + 1683, + 2053, + 2147, + 3870, + 3021, + 1993, + 1057, + 1434, + 2798, + 2141, + 1278, + 2158, + 4960, + 2977, + 2471, + 3643, + 921, + 2579, + 2469, + 1553, + 2761, + 1242, + 2999, + 1756, + 2609, + 1661, + 1347, + 2123, + 3556, + 1824, + 2347, + 2297, + 1472, + 2679, + 907, + 821, + 2373, + 2876, + 3070, + 2323, + 2808, + 1960, + 1821, + 2690, + 2189, + 3244, + 2330, + 2115, + 4251, + 1451, + 3309, + 1189, + 3867, + 3148, + 3827, + 2027, + 4193, + 1712, + 3758, + 1729, + 1706, + 1759, + 2736, + 2442, + 2232, + 1803, + 1104, + 2629, + 1813, + 3417, + 1358, + 1000, + 4544, + 2739, + 3266, + 2994, + 4314, + 933, + 2139, + 1166, + 3878, + 1262, + 1315, + 2181, + 1908, + 5262, + 2394, + 3982, + 1319, + 3249, + 1038, + 2160, + 1585, + 1401, + 1449, + 1908, + 2659, + 3338, + 1122, + 2924, + 3397, + 2793, + 4968, + 2091, + 565, + 2162, + 2373, + 1534, + 2892, + 2487, + 1105, + 1873, + 3199, + 1769, + 1553, + 1648, + 2142, + 2665, + 1901, + 1969, + 2111, + 868, + 4418, + 2138, + 1249, + 2445, + 1972, + 6563, + 4018, + 2184, + 3698, + 802, + 3375, + 1803, + 2229, + 1735, + 3520, + 2074, + 4436, + 3441, + 2158, + 1335, + 960, + 1375, + 1382, + 1761, + 1195, + 2254, + 6505, + 685, + 3750, + 3030, + 2492, + 3605, + 2294, + 2754, + 1945, + 1714, + 2372, + 1562, + 1767, + 1856, + 1513, + 2994, + 5132, + 4089, + 1437, + 1333, + 1094, + 1220, + 2808, + 2405, + 2122, + 2374, + 2719, + 1540, + 2855, + 2100, + 1559, + 2329, + 3577, + 1602, + 2480, + 3482, + 1386, + 3799, + 2735, + 2590, + 2127, + 5608, + 2465, + 2379, + 3926, + 2550, + 1683, + 2096, + 1977, + 915, + 2772, + 1861, + 2328, + 1998, + 3881, + 1611, + 744, + 1050, + 2230, + 1405, + 1689, + 1385, + 3300, + 2599, + 1420, + 1915, + 1899, + 1751, + 1870, + 1999, + 1207, + 2439, + 3354, + 5397, + 2204, + 2658, + 2351, + 3678, + 3882, + 1685, + 1901, + 1627, + 1165, + 815, + 2346, + 2158, + 2219, + 2127, + 4602, + 1672, + 1596, + 1425, + 2234, + 2816, + 2323, + 1226, + 1914, + 4558, + 1523, + 2808, + 2356, + 1026, + 3408, + 3617, + 1808, + 2290, + 2939, + 2483, + 3320, + 1421, + 2571, + 4908, + 2314, + 2310, + 1723, + 2065, + 944, + 4810, + 1035, + 2182, + 2216, + 1803, + 4510, + 1543, + 2522, + 1289, + 2339, + 2037, + 4157, + 2483, + 1585, + 2502, + 2111, + 2502, + 4150, + 2114, + 3176, + 3244, + 2180, + 1672, + 2854, + 1118, + 3710, + 1295, + 1802, + 1534, + 2853, + 3953, + 4440, + 3209, + 1183, + 1328, + 1287, + 2513, + 1403, + 1551, + 2061, + 2626, + 2373, + 3314, + 5677, + 1880, + 5312, + 1881, + 2870, + 1751, + 3882, + 3227, + 2996, + 2428, + 2657, + 1514, + 2856, + 1403, + 4558, + 1643, + 3032, + 1341, + 5538, + 2653, + 1088, + 3191, + 926, + 3774, + 2114, + 6362, + 2162, + 598, + 2569, + 2709, + 884, + 945, + 2955, + 3002, + 3545, + 788, + 2388, + 2251, + 1670, + 1445, + 1427, + 2196, + 1542, + 1123, + 2152, + 1639, + 3547, + 1987, + 1883, + 4304, + 848, + 2792, + 2966, + 2209, + 779, + 2721, + 2296, + 2461, + 2560, + 2142, + 2132, + 2502, + 2775, + 879, + 4190, + 1426, + 3577, + 1988, + 1841, + 1610, + 1842, + 1925, + 3343, + 1221, + 2188, + 696, + 1356, + 830, + 3255, + 2106, + 4006, + 670, + 2240, + 2452, + 949, + 1660, + 2463, + 2778, + 2369, + 2597, + 3424, + 2072, + 2298, + 2644, + 1022, + 2285, + 7394, + 1490, + 1160, + 2221, + 2091, + 1791, + 689, + 1260, + 992, + 2864, + 3142, + 2129, + 1838, + 1721, + 1734, + 2908, + 1815, + 961, + 1345, + 1096, + 2032, + 2292, + 2486, + 2340, + 4388, + 6345, + 4150, + 1491, + 1932, + 2824, + 2870, + 1518, + 1790, + 2988, + 1392, + 1125, + 2893, + 5038, + 1826, + 3240, + 3402, + 1212, + 2611, + 1102, + 1375, + 3106, + 996, + 685, + 928, + 2130, + 1414, + 1786, + 1019, + 1709, + 2339, + 2904, + 1031, + 3664, + 2319, + 2061, + 2047, + 2589, + 1268, + 1852, + 2556, + 1039, + 3846, + 2563, + 1689, + 3308, + 4403, + 2601, + 2705, + 2174, + 1060, + 2441, + 1818, + 1945, + 1018, + 2097, + 1967, + 2043, + 2873, + 1064, + 2671, + 1723, + 1268, + 1115, + 1582, + 2626, + 1891, + 2042, + 1291, + 2064, + 2394, + 3679, + 3091, + 4449, + 3208, + 1739, + 4152, + 4165, + 1289, + 2375, + 2980, + 3078, + 2611, + 2370, + 2427, + 2977, + 4401, + 2052, + 2950, + 1300, + 2872, + 1931, + 3901, + 1089, + 1971, + 1247, + 2539, + 2955, + 2513, + 1288, + 2070, + 787, + 3011, + 1918, + 2630, + 792, + 1278, + 3124, + 3058, + 1874, + 2383, + 3327, + 4560, + 2206, + 1996, + 1098, + 2257, + 876, + 2419, + 1631, + 2954, + 3452, + 2478, + 2363, + 1393, + 1374, + 1539, + 2991, + 2228, + 3227, + 4534, + 3817, + 2555, + 1897, + 2343, + 2368, + 768, + 2399, + 895, + 1459, + 3313, + 1452, + 3442, + 850, + 4408, + 4385, + 1835, + 2260, + 2508, + 1686, + 2160, + 4707, + 2153, + 1218, + 3186, + 1863, + 2794, + 3060, + 2340, + 1612, + 1288, + 2383, + 1217, + 1571, + 4303, + 866, + 1112, + 966, + 736, + 2863, + 3558, + 5232, + 3718, + 1359, + 1725, + 1724, + 2687, + 1933, + 1990, + 2335, + 2656, + 1237, + 1066, + 721, + 1937, + 996, + 3451, + 3142, + 2346, + 1357, + 3621, + 1353, + 1508, + 1310, + 1120, + 4172, + 1420, + 3182, + 2139, + 3400, + 2465, + 878, + 1125, + 1181, + 2086, + 1362, + 2367, + 534, + 1966, + 1126, + 2983, + 3239, + 1299, + 1374, + 5052, + 2748, + 2415, + 3209, + 1761, + 3148, + 851, + 1649, + 3290, + 1307, + 1390, + 3511, + 569, + 1104, + 2772, + 2737, + 1996, + 1108, + 2049, + 616, + 3819, + 2917, + 1631, + 1220, + 2081, + 2340, + 954, + 1061, + 1513, + 876, + 2449, + 2662, + 1522, + 1647, + 3266, + 1562, + 3104, + 3891, + 2265, + 1784, + 862, + 3568, + 652, + 924, + 3172, + 1430, + 1849, + 3313, + 1547, + 3939, + 5002, + 2949, + 713, + 5452, + 4202, + 2961, + 2185, + 879, + 2171, + 2378, + 1015, + 2648, + 2399, + 1601, + 808, + 777, + 2910, + 2860, + 1978, + 3339, + 4090, + 3543, + 3056, + 4557, + 3566, + 3482, + 1672, + 1513, + 1181, + 4762, + 1867, + 2182, + 4953, + 1846, + 2316, + 2351, + 1990, + 2217, + 4648, + 3060, + 3749, + 4669, + 2606, + 1529, + 4520, + 725, + 2198, + 1948, + 3335, + 2749, + 2289, + 2248, + 2789, + 2105, + 2195, + 2165, + 1292, + 1670, + 2224, + 2155, + 2839, + 2663, + 1314, + 6218, + 3087, + 741, + 1493, + 2140, + 2225, + 4140, + 818, + 2040, + 1888, + 3850, + 2717, + 1300, + 2746, + 1069, + 2483, + 1279, + 4797, + 1496, + 800, + 1272, + 1670, + 3828, + 799, + 1070, + 2626, + 2888, + 3217, + 1328, + 1571, + 1923, + 2255, + 3865, + 2094, + 2534, + 2356, + 2544, + 1882, + 1813, + 2395, + 2087, + 2946, + 1709, + 1303, + 4846, + 2139, + 1274, + 2670, + 2554, + 1611, + 1199, + 877, + 2679, + 2320, + 3038, + 2971, + 1952, + 5107, + 2244, + 1219, + 1905, + 4432, + 2474, + 2647, + 1875, + 2083, + 2461, + 1662, + 1211, + 1905, + 3041, + 1992, + 2753, + 2104, + 2621, + 2489, + 2794, + 2412, + 3543, + 3224, + 883, + 2635, + 3363, + 1229, + 1162, + 2069, + 2494, + 1222, + 807, + 2362, + 1506, + 2872, + 1818, + 3172, + 1352, + 4953, + 2012, + 2229, + 1565, + 2591, + 1546, + 2406, + 3178, + 1010, + 2587, + 548, + 1419, + 658, + 2400, + 5111, + 2297, + 683, + 1511, + 2530, + 1343, + 3316, + 4738, + 2370, + 1840, + 1478, + 2333, + 2817, + 2369, + 2212, + 1002, + 1950, + 1562, + 2225, + 1840, + 4461, + 1751, + 2108, + 2018, + 2355, + 2039, + 1959, + 1348, + 1783, + 2078, + 2803, + 1728, + 3170, + 2505, + 1613, + 4735, + 1482, + 2667, + 3598, + 1708, + 1383, + 2560, + 1326, + 2712, + 5611, + 2951, + 5444, + 2731, + 2978, + 2075, + 1590, + 3382, + 3557, + 2256, + 2446, + 4517, + 2429, + 2908, + 2625, + 3159, + 2723, + 1723, + 715, + 1679, + 2981, + 2451, + 892, + 2642, + 1669, + 1599, + 1645, + 1405, + 981, + 2833, + 1301, + 2621, + 2141, + 2187, + 4108, + 1041, + 2565, + 2274, + 2170, + 2302, + 1658, + 2387, + 653, + 2045, + 1837, + 2191, + 999, + 3193, + 2537, + 3204, + 1045, + 2706, + 5682, + 2377, + 2669, + 4478, + 2089, + 3519, + 1469, + 3286, + 1421, + 3398, + 2334, + 1557, + 2159, + 1400, + 1335, + 4149, + 1919, + 1826, + 3857, + 1499, + 1996, + 4051, + 2345, + 611, + 3000, + 748, + 1655, + 2982, + 1408, + 2807, + 4378, + 2394, + 3751, + 651, + 1913, + 3390, + 4215, + 1923, + 1189, + 2096, + 2501, + 2131, + 3236, + 4017, + 2298, + 920, + 1241, + 2943, + 848, + 606, + 1514, + 1079, + 3630, + 1534, + 2418, + 2115, + 1601, + 2444, + 2115, + 3140, + 2342, + 1734, + 2811, + 4162, + 1991, + 622, + 1072, + 3312, + 2148, + 1420, + 1242, + 2703, + 1966, + 2629, + 3208, + 4407, + 1920, + 2050, + 1210, + 1570, + 1166, + 2736, + 3827, + 2642, + 973, + 2680, + 2724, + 2425, + 2938, + 2506, + 2094, + 2023, + 906, + 1539, + 2162, + 2499, + 1886, + 1778, + 1517, + 1398, + 3431, + 1548, + 1940, + 1499, + 994, + 2306, + 2153, + 1945, + 1504, + 2464, + 1471, + 4496, + 1731, + 1443, + 1423, + 2607, + 2067, + 5276, + 1015, + 4814, + 4433, + 3458, + 1512, + 4647, + 2671, + 1681, + 1127, + 4943, + 4770, + 1381, + 3644, + 2099, + 2438, + 2280, + 1072, + 2324, + 1553, + 2198, + 958, + 1600, + 2441, + 3863, + 2249, + 1875, + 1915, + 1345, + 1536, + 1078, + 4699, + 1864, + 4124, + 4045, + 3077, + 2142, + 3835, + 1515, + 1574, + 1160, + 2469, + 2721, + 3678, + 2350, + 2413, + 2397, + 1396, + 1846, + 4286, + 1682, + 2649, + 896, + 3272, + 2425, + 2565, + 2138, + 2296, + 790, + 1161, + 4090, + 2688, + 1596, + 1598, + 1549, + 712, + 763, + 1430, + 3205, + 3868, + 2441, + 2202, + 2704, + 1819, + 1637, + 6052, + 1965, + 1072, + 1171, + 1132, + 1336, + 2368, + 2097, + 2481, + 2105, + 1746, + 2160, + 1100, + 1867, + 3149, + 1578, + 3079, + 2232, + 1523, + 2129, + 2182, + 2909, + 3966, + 1701, + 3327, + 1717, + 3274, + 1741, + 1696, + 2173, + 3597, + 3315, + 5050, + 976, + 2208, + 2193, + 1097, + 1047, + 2855, + 2838, + 1430, + 2536, + 857, + 1466, + 4983, + 2390, + 2276, + 5238, + 2649, + 1552, + 1659, + 3196, + 1369, + 3358, + 1179, + 1123, + 3841, + 2192, + 2985, + 5075, + 2710, + 5710, + 2101, + 3941, + 1751, + 3141, + 1452, + 4991, + 4419, + 1792, + 1495, + 2502, + 1688, + 920, + 1900, + 1610, + 1285, + 2009, + 1836, + 2817, + 1096, + 1728, + 2311, + 1915, + 4827, + 3334, + 5606, + 1534, + 3621, + 1231, + 1585, + 1261, + 2517, + 2496, + 4581, + 1446, + 3197, + 2527, + 1748, + 1712, + 4542, + 2406, + 3116, + 1421, + 1814, + 1855, + 2376, + 1067, + 1862, + 1932, + 2748, + 3088, + 1380, + 2125, + 1864, + 3776, + 2751, + 3844, + 2793, + 1816, + 3196, + 2101, + 1551, + 2827, + 2548, + 1994, + 2006, + 1370, + 1015, + 2508, + 2785, + 2173, + 1896, + 1680, + 1807, + 2689, + 2634, + 1287, + 6716, + 2050, + 1159, + 1397, + 2294, + 2478, + 1248, + 2450, + 1655, + 2508, + 1410, + 1480, + 4185, + 1324, + 2564, + 1263, + 4365, + 2060, + 2463, + 1285, + 723, + 1795, + 3551, + 1130, + 1699, + 2035, + 2253, + 2301, + 1617, + 1385, + 2893, + 3100, + 2943, + 1771, + 2492, + 1784, + 2338, + 2471, + 1997, + 2077, + 2998, + 1316, + 1815, + 1323, + 2229, + 1399, + 3052, + 2374, + 1720, + 3003, + 1696, + 4037, + 3311, + 2059, + 1249, + 2259, + 1291, + 1216, + 1442, + 2761, + 1754, + 5819, + 845, + 2699, + 2501, + 1273, + 1113, + 1217, + 1768, + 1825, + 1069, + 1675, + 3177, + 1964, + 2068, + 2100, + 4076, + 2473, + 953, + 1689, + 3832, + 2080, + 1797, + 1680, + 2740, + 1457, + 1881, + 1923, + 1917, + 1784, + 4953, + 2365, + 2003, + 2225, + 2390, + 822, + 782, + 2272, + 2653, + 2701, + 1606, + 1811, + 1838, + 3626, + 2148, + 1004, + 3075, + 641, + 2878, + 1656, + 2502, + 2971, + 4253, + 2179, + 1281, + 1282, + 7273, + 2885, + 1566, + 3744, + 3698, + 4599, + 1784, + 2348, + 2065 + ] + }, + { + "counters": [ + 2361, + 3464, + 2340, + 1285, + 2284, + 3473, + 1579, + 3910, + 2351, + 2097, + 1042, + 1407, + 1999, + 3256, + 2511, + 3046, + 2009, + 1874, + 1732, + 2673, + 2221, + 1238, + 2331, + 2202, + 2026, + 1581, + 1831, + 1958, + 3609, + 4339, + 5959, + 3135, + 1681, + 765, + 2787, + 2617, + 1997, + 4474, + 1068, + 1484, + 3746, + 1473, + 2118, + 1422, + 885, + 1866, + 1011, + 578, + 3305, + 2583, + 2037, + 790, + 885, + 2363, + 3414, + 1578, + 1404, + 1695, + 6826, + 2591, + 4801, + 2211, + 2652, + 1914, + 2349, + 4505, + 2380, + 2559, + 1643, + 748, + 1748, + 1991, + 2017, + 3922, + 1956, + 3656, + 1720, + 2762, + 2233, + 4088, + 2747, + 1466, + 3862, + 1474, + 1248, + 1334, + 2193, + 2092, + 1480, + 2056, + 3100, + 1835, + 3064, + 2052, + 1031, + 2141, + 2620, + 1192, + 1523, + 958, + 1431, + 1674, + 695, + 1812, + 3038, + 1417, + 4038, + 2866, + 1507, + 644, + 1056, + 1858, + 3606, + 3428, + 2612, + 2072, + 3151, + 1943, + 1277, + 3707, + 1584, + 2275, + 1593, + 3286, + 1963, + 827, + 2460, + 967, + 2156, + 598, + 3243, + 1667, + 1876, + 3011, + 2044, + 1617, + 1657, + 2215, + 1653, + 1832, + 2875, + 861, + 948, + 3636, + 1791, + 2797, + 2687, + 1759, + 3872, + 1589, + 2511, + 1083, + 1611, + 1218, + 1691, + 3037, + 588, + 8878, + 2330, + 1192, + 1286, + 3356, + 1360, + 3082, + 4366, + 1914, + 1774, + 1404, + 1123, + 1769, + 1357, + 2803, + 2529, + 899, + 2339, + 1152, + 2348, + 1032, + 966, + 681, + 2458, + 1218, + 2760, + 2216, + 4346, + 2332, + 2737, + 737, + 1170, + 2055, + 2920, + 3264, + 5198, + 3906, + 3352, + 2385, + 2528, + 3714, + 1720, + 2165, + 2668, + 2794, + 1388, + 2769, + 3021, + 2550, + 1153, + 1801, + 2891, + 2163, + 1557, + 4202, + 1195, + 3903, + 2318, + 1659, + 1275, + 3101, + 1645, + 1987, + 5947, + 1656, + 3094, + 1289, + 1784, + 1076, + 2856, + 1910, + 2323, + 1331, + 5882, + 3189, + 2921, + 2533, + 3031, + 1221, + 1694, + 1460, + 2210, + 1849, + 2635, + 1363, + 1349, + 1916, + 2396, + 1899, + 4883, + 1931, + 1193, + 2358, + 1740, + 734, + 2172, + 1493, + 2239, + 5584, + 3364, + 1549, + 1756, + 1979, + 5988, + 2347, + 2243, + 1732, + 2688, + 1116, + 1112, + 2284, + 719, + 885, + 2151, + 983, + 1528, + 2439, + 2117, + 1409, + 1432, + 1890, + 3272, + 2071, + 2208, + 4443, + 2556, + 327, + 2143, + 554, + 900, + 1202, + 3697, + 1558, + 2870, + 2833, + 1756, + 2823, + 1659, + 2503, + 1399, + 2186, + 3086, + 3785, + 6969, + 1116, + 1810, + 4454, + 1902, + 1612, + 1546, + 1302, + 2152, + 1228, + 1877, + 1078, + 1679, + 2465, + 1093, + 2021, + 3129, + 907, + 2365, + 1761, + 2564, + 2548, + 2683, + 3072, + 1017, + 3319, + 2085, + 1380, + 4011, + 3177, + 3611, + 1435, + 1557, + 2542, + 1862, + 3547, + 954, + 822, + 1758, + 1412, + 3351, + 1448, + 4800, + 1767, + 2835, + 2307, + 2911, + 1579, + 2420, + 2325, + 1350, + 5411, + 1034, + 1574, + 1846, + 2385, + 2488, + 4789, + 2306, + 2881, + 819, + 2367, + 1651, + 1139, + 3653, + 1043, + 3786, + 3065, + 1801, + 1784, + 992, + 3574, + 2231, + 4424, + 2800, + 1542, + 2657, + 2225, + 3091, + 1385, + 1698, + 1891, + 2858, + 2577, + 1697, + 1940, + 4087, + 2361, + 3570, + 1243, + 3791, + 3282, + 3463, + 2036, + 1004, + 1272, + 2838, + 1969, + 1535, + 2525, + 2736, + 914, + 1514, + 5240, + 1631, + 1078, + 1682, + 3600, + 2590, + 1819, + 2883, + 3859, + 1453, + 678, + 2030, + 3141, + 2180, + 1332, + 3673, + 4313, + 1716, + 1654, + 3589, + 1708, + 2440, + 1596, + 1423, + 1304, + 843, + 795, + 3701, + 1888, + 1948, + 2324, + 1957, + 1726, + 2328, + 2194, + 1504, + 2235, + 1514, + 2214, + 1244, + 1757, + 2800, + 3136, + 1580, + 3333, + 2013, + 2207, + 2454, + 1457, + 1003, + 1168, + 1247, + 3626, + 2481, + 2353, + 2267, + 3366, + 1478, + 1946, + 2008, + 3040, + 2986, + 1686, + 990, + 1615, + 3161, + 1581, + 5430, + 1653, + 2216, + 3379, + 2100, + 1706, + 2785, + 3324, + 1696, + 2897, + 3194, + 1396, + 3736, + 1678, + 699, + 1997, + 5614, + 3328, + 1133, + 3957, + 698, + 2269, + 2410, + 2706, + 2758, + 3276, + 876, + 1906, + 3474, + 1766, + 4060, + 3305, + 2294, + 3603, + 3442, + 2159, + 1630, + 1059, + 4456, + 2994, + 4329, + 2231, + 1573, + 1829, + 2898, + 1644, + 1338, + 3227, + 1602, + 2749, + 1006, + 1364, + 2678, + 1315, + 822, + 3013, + 2702, + 2638, + 1065, + 3689, + 1689, + 778, + 1627, + 1867, + 5585, + 1434, + 2111, + 1632, + 2510, + 3082, + 1083, + 894, + 4300, + 927, + 1308, + 2436, + 3356, + 2318, + 699, + 1631, + 1806, + 1800, + 3637, + 2492, + 859, + 786, + 3025, + 2351, + 2310, + 2141, + 2848, + 3650, + 2099, + 3188, + 2477, + 939, + 2315, + 2418, + 3467, + 1263, + 1391, + 1228, + 2799, + 3453, + 1618, + 2928, + 2434, + 2421, + 1896, + 2280, + 626, + 1054, + 1732, + 1273, + 1912, + 1508, + 4746, + 4074, + 2737, + 2214, + 2073, + 2667, + 2148, + 4746, + 2161, + 2287, + 1871, + 2042, + 3697, + 663, + 2304, + 3709, + 1544, + 1348, + 2430, + 1994, + 4414, + 2306, + 3696, + 2819, + 3409, + 3812, + 873, + 2256, + 2530, + 1544, + 2756, + 1050, + 4137, + 2735, + 1234, + 2575, + 3364, + 1188, + 3281, + 2847, + 966, + 3538, + 2266, + 1781, + 2873, + 1496, + 2194, + 1410, + 1830, + 1516, + 1894, + 3392, + 2168, + 1663, + 2422, + 2049, + 2196, + 1865, + 5242, + 1741, + 2878, + 3375, + 3261, + 2397, + 3705, + 1667, + 3133, + 914, + 1695, + 3787, + 1884, + 1481, + 2942, + 3871, + 828, + 2163, + 812, + 2843, + 2347, + 2800, + 1449, + 3516, + 1903, + 2667, + 1792, + 1798, + 2693, + 5288, + 2593, + 2955, + 2121, + 2906, + 1950, + 734, + 4680, + 7404, + 3627, + 1882, + 738, + 851, + 878, + 1831, + 1766, + 1027, + 2817, + 1988, + 1063, + 828, + 1655, + 2421, + 1658, + 2211, + 2927, + 2856, + 1325, + 2251, + 2781, + 2832, + 2429, + 2363, + 3067, + 860, + 1704, + 2246, + 751, + 1323, + 2081, + 1491, + 3797, + 1476, + 2091, + 849, + 605, + 639, + 1361, + 3703, + 2406, + 968, + 3618, + 5193, + 1635, + 3361, + 1568, + 2352, + 2946, + 1581, + 3864, + 2471, + 2789, + 3224, + 5793, + 2467, + 3213, + 2199, + 3147, + 2178, + 1573, + 2229, + 3524, + 1953, + 3198, + 1592, + 2489, + 2322, + 929, + 2791, + 1817, + 4921, + 2444, + 1789, + 3872, + 1344, + 2244, + 2025, + 1613, + 1311, + 2472, + 2986, + 5291, + 1075, + 1872, + 3461, + 1597, + 5000, + 1771, + 895, + 3057, + 2506, + 994, + 3638, + 2895, + 2206, + 2743, + 2845, + 2028, + 2044, + 2030, + 4177, + 3231, + 1984, + 2991, + 1612, + 1839, + 1120, + 2088, + 4963, + 2524, + 3315, + 4343, + 2293, + 5044, + 2321, + 2309, + 1798, + 3023, + 1184, + 660, + 2502, + 1848, + 1668, + 589, + 2516, + 3065, + 1804, + 994, + 2437, + 2080, + 527, + 3280, + 3407, + 1810, + 3326, + 1102, + 2193, + 4206, + 4545, + 1172, + 3319, + 1804, + 3695, + 2039, + 3305, + 2227, + 1975, + 2063, + 1996, + 853, + 1428, + 3126, + 2173, + 2573, + 4319, + 4359, + 2694, + 2324, + 1495, + 2173, + 3279, + 1672, + 1842, + 2249, + 1588, + 1908, + 2466, + 900, + 1449, + 3103, + 2951, + 1368, + 5250, + 2056, + 1826, + 3710, + 1597, + 3750, + 2187, + 2402, + 4108, + 1093, + 2242, + 2856, + 1371, + 2015, + 3436, + 1833, + 5136, + 1206, + 3466, + 7033, + 1974, + 3595, + 2915, + 2514, + 1402, + 1432, + 3988, + 3218, + 1467, + 2058, + 1714, + 2108, + 1977, + 2347, + 2635, + 2270, + 2171, + 3894, + 2501, + 2761, + 2369, + 2176, + 1839, + 4164, + 3757, + 2711, + 785, + 2427, + 2296, + 3663, + 982, + 951, + 2668, + 1566, + 3452, + 2615, + 1766, + 1317, + 1737, + 2630, + 2609, + 2432, + 4344, + 3310, + 1584, + 3412, + 2544, + 1391, + 4371, + 1708, + 1997, + 2874, + 3289, + 2564, + 2419, + 1121, + 1788, + 1709, + 1373, + 1772, + 3084, + 1938, + 1581, + 1144, + 1453, + 2419, + 1771, + 2987, + 1924, + 2438, + 2108, + 1816, + 1759, + 3575, + 957, + 2343, + 1639, + 1049, + 3591, + 2900, + 2415, + 3110, + 1903, + 2870, + 809, + 2084, + 968, + 1565, + 2592, + 2733, + 1587, + 2114, + 1254, + 1822, + 2313, + 3071, + 1471, + 2358, + 2669, + 1727, + 2014, + 2407, + 3343, + 2131, + 1862, + 4562, + 1625, + 1905, + 3965, + 2923, + 3021, + 1856, + 1939, + 1056, + 2417, + 1820, + 4095, + 2058, + 1042, + 2735, + 1969, + 3174, + 2328, + 3435, + 2174, + 858, + 1069, + 2429, + 1816, + 3759, + 1492, + 1685, + 2375, + 769, + 1268, + 1801, + 3764, + 1670, + 1884, + 1199, + 1791, + 3131, + 2427, + 1263, + 1165, + 2847, + 1767, + 1181, + 2541, + 1351, + 4878, + 2520, + 2451, + 3879, + 1088, + 1860, + 1278, + 1850, + 1437, + 1624, + 3009, + 3512, + 1200, + 726, + 2017, + 1124, + 1735, + 629, + 1926, + 3679, + 3830, + 1404, + 2043, + 2117, + 1026, + 2180, + 1406, + 4914, + 1984, + 3186, + 1867, + 2384, + 1505, + 3847, + 2288, + 2597, + 3243, + 1800, + 4012, + 3736, + 3543, + 1879, + 2117, + 1802, + 2318, + 1225, + 1828, + 1730, + 1031, + 1620, + 857, + 3160, + 2924, + 1311, + 814, + 2920, + 2500, + 1887, + 3342, + 1397, + 756, + 3118, + 1255, + 1788, + 3121, + 1856, + 2689, + 2257, + 2057, + 2106, + 1030, + 2614, + 2338, + 3270, + 2305, + 3140, + 2559, + 2417, + 3051, + 1690, + 2550, + 1538, + 2486, + 2363, + 2470, + 1528, + 1876, + 2591, + 2361, + 2811, + 2097, + 1155, + 2571, + 2173, + 3101, + 1482, + 1557, + 1417, + 2836, + 6233, + 1062, + 1531, + 3242, + 2162, + 1682, + 1860, + 1878, + 2796, + 1414, + 2460, + 2182, + 2695, + 1826, + 4264, + 1083, + 1628, + 1780, + 2310, + 1751, + 1128, + 3543, + 3083, + 2037, + 4133, + 1999, + 882, + 2152, + 1395, + 1822, + 1428, + 1734, + 1284, + 2412, + 2008, + 793, + 3701, + 1890, + 2712, + 1872, + 3375, + 2855, + 2295, + 1561, + 2376, + 3603, + 5369, + 1726, + 3207, + 3637, + 819, + 974, + 2262, + 1931, + 2320, + 3266, + 2398, + 1060, + 675, + 4680, + 1531, + 3162, + 2492, + 1835, + 2339, + 919, + 2522, + 2057, + 3153, + 1024, + 1720, + 1761, + 2577, + 3303, + 1366, + 2126, + 1103, + 2631, + 1864, + 1407, + 1211, + 914, + 5185, + 2041, + 2446, + 1441, + 1815, + 4272, + 2128, + 2337, + 2070, + 2103, + 1400, + 3298, + 2170, + 5124, + 1666, + 1501, + 1898, + 1044, + 3184, + 1041, + 2499, + 1677, + 713, + 1984, + 3098, + 985, + 1992, + 2397, + 1649, + 2108, + 1649, + 2770, + 3661, + 2960, + 1700, + 3248, + 1487, + 1476, + 1760, + 674, + 2640, + 4387, + 2872, + 1883, + 3488, + 3250, + 1259, + 2537, + 1375, + 2633, + 3415, + 1667, + 2779, + 2278, + 3474, + 1943, + 3400, + 3334, + 2063, + 2318, + 1175, + 2348, + 2016, + 1482, + 1559, + 1027, + 2155, + 4934, + 1462, + 1692, + 2254, + 1196, + 3720, + 5278, + 1025, + 2363, + 1305, + 2869, + 1992, + 1700, + 928, + 1963, + 3158, + 877, + 1555, + 2546, + 2669, + 1876, + 3182, + 3704, + 3029, + 2747, + 2629, + 3091, + 3717, + 2823, + 2167, + 1160, + 2116, + 2398, + 1787, + 1811, + 1564, + 3027, + 1076, + 1639, + 4354, + 582, + 1483, + 3494, + 2632, + 5111, + 4858, + 2942, + 1303, + 1247, + 4215, + 1757, + 2333, + 2471, + 1379, + 3497, + 1278, + 2671, + 1564, + 3389, + 1724, + 2647, + 1173, + 750, + 3071, + 2055, + 4634, + 1483, + 1705, + 3063, + 1946, + 3309, + 2243, + 2671, + 9344, + 716, + 2690, + 1196, + 830, + 1616, + 3070, + 2305, + 2123, + 2467, + 3887, + 2657, + 1191, + 2963, + 529, + 1851, + 1322, + 2041, + 1727, + 2067, + 2036, + 2671, + 6286, + 1744, + 2043, + 2017, + 818, + 2411, + 2992, + 1040, + 2585, + 2293, + 1212, + 2533, + 3524, + 2704, + 1221, + 1267, + 851, + 4143, + 2400, + 1852, + 2980, + 1570, + 2418, + 2065, + 1406, + 5299, + 1882, + 1610, + 3134, + 3384, + 5905, + 2846, + 3815, + 3506, + 2814, + 2138, + 3619, + 1440, + 3367, + 1982, + 1218, + 1822, + 3059, + 1036, + 1060, + 1867, + 3131, + 613, + 4423, + 1109, + 2591, + 1669, + 1894, + 1059, + 1834, + 1172, + 1416, + 3564, + 1288, + 2202, + 699, + 4298, + 1582, + 3966, + 3549, + 1893, + 2323, + 1322, + 1841, + 2354, + 3745, + 2516, + 2119, + 1395, + 2056, + 3639, + 1588, + 2606, + 1639, + 2020, + 1914, + 1813, + 2123, + 2789, + 813, + 2098, + 2050, + 2304, + 1329, + 874, + 778, + 1762, + 2474, + 1645, + 891, + 2305, + 2905, + 3359, + 1898, + 2162, + 764, + 1725, + 1278, + 1106, + 2747, + 2137, + 2655, + 2851, + 4015, + 2470, + 1447, + 2742, + 3338, + 2944, + 1939, + 2614, + 1596, + 656, + 778, + 1880, + 2173, + 2380, + 3078, + 705, + 606, + 2002, + 2400, + 2066, + 2523, + 4694, + 2870, + 722, + 2112, + 3328, + 2966, + 1024, + 1658, + 2475, + 4587, + 1884, + 1503, + 771, + 4210, + 2363, + 644, + 2936, + 1372, + 2216, + 1261, + 2008, + 3176, + 1786, + 2826, + 3833, + 2087, + 2275, + 1336, + 2362, + 1740, + 2396, + 2825, + 2258, + 3440, + 1861, + 2266, + 2761, + 830, + 2218, + 2309, + 3960, + 2143, + 3093, + 1389, + 976, + 1778, + 999, + 2538, + 4459, + 2945, + 1718, + 1409, + 2331, + 1055, + 3952, + 1560, + 3520, + 3603, + 3470, + 2846, + 2435, + 1897, + 2165, + 1051, + 1909, + 5377, + 2174, + 2332, + 5163, + 1596, + 2038, + 3229, + 3272, + 1644, + 2185, + 2163, + 2656, + 2609, + 1635, + 4110, + 3424, + 3148, + 2480, + 1923, + 1945, + 2378, + 1802, + 4071, + 3362, + 2167, + 2705, + 2177, + 3328, + 3662, + 1087, + 2139, + 2443, + 2810, + 2274, + 1751, + 2321, + 1545, + 1816, + 3333, + 2901, + 3032, + 1110, + 3152, + 1786, + 3031, + 2335, + 1443, + 1678, + 3323, + 2825, + 1804, + 4278, + 2737, + 4041, + 3234, + 1325, + 3213, + 4177, + 2621, + 1109, + 2286, + 3191, + 1296, + 1414, + 3711, + 1788, + 758, + 1272, + 2088, + 1543, + 2760, + 1473, + 2594, + 1036, + 3672, + 1679, + 982, + 1182, + 2545, + 1148, + 2900, + 3270, + 2467, + 1878, + 5788, + 1938, + 4999, + 2785, + 3396, + 1715, + 2150, + 1080, + 2295, + 3154, + 1759, + 2203, + 920, + 4934, + 649, + 1516, + 5015, + 1245, + 1676, + 726, + 1693, + 3434, + 2227, + 4109, + 2654, + 669, + 3068, + 3618, + 729, + 1540, + 3677, + 963, + 879, + 1613, + 1703, + 1364, + 2181, + 2719, + 1155, + 1101, + 856, + 2511, + 3420, + 4455, + 2407, + 1490, + 1340, + 631, + 2672, + 2401, + 2496, + 899, + 3346, + 2754, + 2619, + 1334, + 3513, + 1055, + 1110, + 3091, + 1419, + 1798, + 1450, + 1365, + 1743, + 2141, + 2254, + 1081, + 627, + 1566, + 3234, + 2798, + 1455, + 4464, + 2133, + 2535, + 2250, + 2293, + 1971, + 1045, + 1994, + 4104, + 3863, + 2621, + 1923, + 3314, + 2804, + 2208, + 670, + 2714, + 2591, + 1662, + 1355, + 600, + 2266, + 2808, + 2289, + 2621, + 2432, + 1607, + 2244, + 2425, + 2917, + 1213, + 1235, + 1851, + 1098, + 1461, + 1780, + 1480, + 1108, + 4500, + 1768, + 1880, + 3455, + 900, + 1937, + 3829, + 2735, + 2017, + 2764, + 2245, + 4261, + 3847, + 1971, + 1884, + 1859, + 1234, + 1614, + 4605, + 1316, + 2040, + 5125, + 2033, + 2601, + 4340, + 1301, + 1115, + 2652, + 3797, + 1517, + 1139, + 2860, + 1127, + 2133, + 1874, + 2030, + 3177, + 3049, + 1959, + 3913, + 1825, + 2108, + 2134, + 2930, + 1457, + 1852, + 2866, + 3603, + 420, + 835, + 1419, + 669, + 2149, + 2032, + 1189, + 1600, + 1793, + 3047, + 2187, + 2534, + 4761, + 1886, + 1733, + 903, + 2993, + 3071, + 1941, + 1688, + 876, + 1439, + 1209, + 1651, + 1816, + 1824, + 2416, + 1517, + 2933, + 2197, + 1950, + 1133, + 2810, + 956, + 2421, + 1752, + 2173, + 1492, + 1434, + 1952, + 3867, + 2497, + 2353, + 2575, + 2162, + 2645, + 1000, + 1739, + 4446, + 2212, + 1523, + 2641, + 1616, + 1409, + 2311, + 1296, + 1209, + 2307, + 3202, + 1050, + 5075, + 1854, + 724, + 2246, + 2711, + 2237, + 918, + 2447, + 2213, + 1430, + 3230, + 2735, + 3326, + 1446, + 1678, + 910, + 2338, + 1131, + 4580, + 1594, + 5165, + 1344, + 3899, + 1837, + 798, + 3470, + 2759, + 5572, + 3089, + 1169, + 946, + 2760, + 1988, + 3673, + 1990, + 1368, + 2316, + 2431, + 4526, + 1019, + 2224, + 2353, + 1434, + 2775, + 4393, + 1211, + 2920, + 2144, + 877, + 1352, + 1730, + 2393, + 2825, + 3913, + 626, + 1903, + 1562, + 4500, + 1037, + 1701, + 2328, + 3171, + 7710, + 1695, + 3640, + 2228, + 2975, + 831, + 2037, + 3208, + 1517, + 1758, + 1737, + 2711, + 2103, + 2947, + 1314, + 580, + 1885, + 1746, + 5930, + 2675, + 1981, + 2399, + 3624, + 2257, + 1193, + 1383, + 1856, + 1852, + 4208, + 821, + 2446, + 674, + 3851, + 3321, + 1797, + 1226, + 1950, + 2053, + 3784, + 1757, + 3448, + 2376, + 759, + 2574, + 1252, + 3644, + 5116, + 3882, + 1919, + 6858, + 4505, + 3307, + 3583, + 3113, + 2551, + 1497, + 4441, + 1057, + 2445, + 1461, + 2233, + 1686, + 2612, + 1582, + 2794, + 754, + 2720, + 2886, + 3255, + 2789, + 2600, + 2058, + 4839, + 619, + 3179, + 1531, + 3490, + 3255, + 1393, + 1566, + 950, + 2026, + 970, + 3215, + 4923, + 2465, + 3566, + 1323, + 770, + 1382, + 2113, + 4079, + 1997, + 3691, + 1612, + 2266, + 2361, + 2108, + 4574, + 2563, + 1762, + 1803, + 1875, + 1430, + 1132, + 2134, + 958, + 2886, + 1946, + 1905, + 2124, + 1821, + 4646, + 1324, + 2345, + 2148, + 2397, + 2395, + 1718, + 2266, + 1176 + ] + }, + { + "counters": [ + 2410, + 1300, + 2997, + 2476, + 3712, + 2672, + 2432, + 1562, + 3309, + 3943, + 1714, + 939, + 6248, + 1688, + 2305, + 2132, + 2984, + 4916, + 4899, + 2671, + 2029, + 1995, + 2329, + 3835, + 1527, + 1049, + 3146, + 2353, + 1754, + 2725, + 1899, + 2149, + 1737, + 2813, + 3676, + 2915, + 2073, + 2079, + 649, + 3881, + 2176, + 1785, + 1767, + 2430, + 3186, + 818, + 2718, + 3121, + 2659, + 1239, + 1900, + 880, + 2127, + 2376, + 3422, + 2094, + 2692, + 2804, + 3124, + 2890, + 2028, + 1571, + 1264, + 1979, + 1950, + 2992, + 1774, + 4500, + 1278, + 1164, + 1719, + 2232, + 1426, + 2719, + 1941, + 1538, + 2253, + 1159, + 1321, + 1400, + 833, + 4515, + 3514, + 3334, + 1636, + 1681, + 1621, + 920, + 1933, + 3469, + 2198, + 2040, + 1671, + 1796, + 904, + 4375, + 2780, + 3444, + 3147, + 1984, + 961, + 1718, + 1802, + 1907, + 1534, + 1029, + 2431, + 1273, + 1154, + 2009, + 2785, + 783, + 4382, + 1144, + 1850, + 1402, + 1124, + 2938, + 1451, + 1745, + 1035, + 2982, + 4287, + 1322, + 2533, + 1066, + 3632, + 2943, + 932, + 3905, + 1431, + 1768, + 1801, + 2013, + 3692, + 1059, + 742, + 1661, + 2928, + 989, + 2059, + 2652, + 1453, + 1770, + 594, + 1433, + 3526, + 4687, + 3080, + 2238, + 3019, + 2316, + 1060, + 614, + 1357, + 2956, + 998, + 1864, + 1914, + 1404, + 1836, + 2446, + 959, + 2197, + 1366, + 782, + 2354, + 836, + 1280, + 1643, + 2963, + 1395, + 1922, + 1418, + 1660, + 2755, + 3412, + 4943, + 1810, + 1069, + 3504, + 2324, + 3172, + 2087, + 2556, + 3451, + 3218, + 5593, + 4324, + 715, + 3180, + 2942, + 2703, + 2666, + 3340, + 1418, + 1241, + 3445, + 2417, + 783, + 3003, + 1241, + 2703, + 684, + 3066, + 3211, + 1775, + 3649, + 4432, + 2801, + 2216, + 3998, + 884, + 1260, + 2457, + 3105, + 2245, + 2998, + 3201, + 2069, + 2104, + 2117, + 676, + 2340, + 3277, + 1094, + 796, + 1466, + 1229, + 1419, + 2227, + 3529, + 1249, + 2479, + 5370, + 974, + 3105, + 2425, + 1752, + 3281, + 4589, + 4309, + 1289, + 1775, + 2682, + 3268, + 2178, + 2069, + 1431, + 2374, + 1271, + 2004, + 689, + 1660, + 1742, + 2127, + 1843, + 1429, + 3444, + 1919, + 2543, + 1572, + 1118, + 2127, + 1810, + 1025, + 1296, + 902, + 1869, + 1423, + 1951, + 2052, + 1659, + 2974, + 3221, + 2682, + 1759, + 3116, + 2618, + 2262, + 2335, + 2575, + 933, + 3137, + 2543, + 1263, + 1501, + 1027, + 1227, + 2683, + 1148, + 1543, + 1647, + 1036, + 932, + 2191, + 6463, + 3625, + 1874, + 1320, + 2235, + 5395, + 4427, + 2707, + 2078, + 2058, + 2159, + 2802, + 1639, + 2575, + 2196, + 3029, + 1558, + 3394, + 2853, + 2438, + 3905, + 3821, + 1455, + 1968, + 1554, + 1272, + 4072, + 2210, + 2524, + 1296, + 2416, + 1203, + 3014, + 6448, + 2578, + 2244, + 3564, + 2183, + 1870, + 3157, + 1438, + 3641, + 3379, + 1671, + 3864, + 2681, + 3454, + 2600, + 2866, + 2279, + 3428, + 3687, + 3067, + 2722, + 2789, + 2687, + 981, + 2143, + 2643, + 1356, + 733, + 2945, + 2053, + 1176, + 929, + 2269, + 1230, + 2040, + 2525, + 3078, + 1844, + 1599, + 2084, + 1731, + 3059, + 1849, + 1769, + 1982, + 1448, + 1739, + 4102, + 1173, + 2454, + 2282, + 1425, + 2705, + 3237, + 1416, + 2304, + 801, + 1601, + 3874, + 1861, + 1586, + 1434, + 1302, + 2086, + 2165, + 4724, + 1775, + 2853, + 1059, + 2052, + 2247, + 2688, + 3303, + 2105, + 5604, + 4073, + 3118, + 947, + 2123, + 1986, + 2736, + 1581, + 2025, + 1734, + 1689, + 1229, + 1999, + 3209, + 2996, + 2270, + 1280, + 1767, + 3694, + 1619, + 2902, + 718, + 3330, + 2036, + 1673, + 760, + 3666, + 884, + 2752, + 1980, + 2285, + 2886, + 2342, + 955, + 3247, + 2767, + 3755, + 2719, + 1606, + 2811, + 4118, + 1337, + 1637, + 4609, + 2620, + 1655, + 582, + 2160, + 3193, + 3559, + 2395, + 2271, + 3242, + 2192, + 2137, + 2484, + 1722, + 3410, + 4872, + 3754, + 1856, + 3403, + 2403, + 1054, + 2451, + 1735, + 4097, + 1248, + 2310, + 2292, + 4951, + 2719, + 1960, + 6072, + 1989, + 3554, + 1800, + 2909, + 2001, + 833, + 2368, + 1836, + 8411, + 1799, + 920, + 2270, + 2326, + 4314, + 1842, + 3306, + 2042, + 1300, + 5862, + 1379, + 1396, + 981, + 2141, + 1944, + 994, + 1641, + 699, + 1643, + 1486, + 1238, + 2401, + 3322, + 1554, + 1576, + 2387, + 3085, + 1676, + 3694, + 793, + 2601, + 2112, + 2859, + 1560, + 1876, + 1340, + 1435, + 1369, + 4140, + 2373, + 1563, + 5382, + 953, + 3847, + 1636, + 1461, + 2601, + 1232, + 703, + 1348, + 2086, + 2348, + 1340, + 2792, + 1450, + 1875, + 1191, + 1365, + 1075, + 3207, + 2725, + 3675, + 3243, + 5097, + 1017, + 1445, + 1164, + 2814, + 1651, + 2110, + 2113, + 2301, + 2155, + 2302, + 2979, + 1698, + 3437, + 1554, + 3612, + 3018, + 1779, + 5234, + 4267, + 2135, + 1075, + 523, + 2162, + 1731, + 1864, + 2744, + 966, + 3052, + 1519, + 2064, + 2918, + 1725, + 4697, + 1033, + 1691, + 2708, + 2625, + 771, + 771, + 2557, + 1241, + 2801, + 2446, + 2256, + 1009, + 2741, + 1592, + 2492, + 3048, + 3584, + 4088, + 2454, + 1583, + 2193, + 4750, + 1250, + 1401, + 2226, + 2004, + 3837, + 650, + 3707, + 998, + 2302, + 1012, + 2663, + 786, + 3028, + 1963, + 983, + 797, + 2432, + 2436, + 1941, + 2190, + 3161, + 2747, + 2267, + 1691, + 2482, + 936, + 1205, + 3048, + 911, + 4566, + 3416, + 2405, + 3493, + 2074, + 636, + 1423, + 2791, + 1640, + 1615, + 1922, + 1326, + 807, + 1929, + 1636, + 3363, + 5564, + 1081, + 2769, + 3330, + 1497, + 2035, + 1256, + 965, + 3076, + 3671, + 3156, + 1162, + 1799, + 1603, + 3280, + 1371, + 2175, + 882, + 1200, + 2150, + 1935, + 3703, + 1001, + 722, + 1285, + 624, + 3451, + 2420, + 2420, + 1336, + 1794, + 1554, + 2120, + 1934, + 2463, + 3210, + 2306, + 2566, + 1684, + 1966, + 1653, + 3502, + 2473, + 4314, + 3645, + 1132, + 1245, + 3117, + 1007, + 2442, + 2087, + 3110, + 2624, + 1934, + 2155, + 2482, + 2883, + 738, + 867, + 1430, + 2561, + 2583, + 802, + 2491, + 1843, + 2439, + 3021, + 2434, + 2158, + 3138, + 3997, + 2047, + 2080, + 935, + 1111, + 1762, + 1809, + 3443, + 1722, + 1429, + 1517, + 4654, + 685, + 797, + 1687, + 3922, + 1647, + 2002, + 1347, + 3154, + 1313, + 2051, + 2063, + 1656, + 748, + 3268, + 2229, + 827, + 1482, + 1970, + 3279, + 2678, + 1890, + 3551, + 825, + 3435, + 1742, + 2422, + 3448, + 1010, + 1529, + 1816, + 2925, + 1071, + 2057, + 870, + 2437, + 2028, + 741, + 2090, + 1857, + 1668, + 5982, + 1821, + 2078, + 1318, + 1349, + 2034, + 2063, + 677, + 1523, + 882, + 1992, + 1225, + 2097, + 1846, + 1863, + 3429, + 1269, + 1995, + 2713, + 1415, + 1343, + 3157, + 3017, + 2180, + 2390, + 3410, + 2783, + 1585, + 830, + 1552, + 1342, + 1710, + 3946, + 1490, + 1978, + 1574, + 1910, + 1330, + 3017, + 2442, + 2593, + 1230, + 2041, + 1412, + 3614, + 2050, + 996, + 2078, + 4185, + 1839, + 1838, + 2460, + 603, + 2342, + 2547, + 2702, + 2223, + 1388, + 2291, + 3743, + 2473, + 3189, + 3802, + 1712, + 2053, + 1515, + 1911, + 4985, + 6697, + 1658, + 2413, + 2510, + 2345, + 2399, + 2086, + 1519, + 4157, + 2284, + 3109, + 2179, + 3647, + 3250, + 2300, + 902, + 1217, + 3067, + 2904, + 4657, + 3071, + 1011, + 4364, + 989, + 1016, + 1181, + 3682, + 1349, + 3123, + 3582, + 1272, + 2428, + 2197, + 3412, + 848, + 1392, + 1664, + 3112, + 2653, + 2676, + 2859, + 1864, + 2186, + 1223, + 1162, + 4370, + 1456, + 4325, + 2642, + 1692, + 1804, + 1698, + 1797, + 1664, + 2103, + 2706, + 3439, + 4196, + 1458, + 1586, + 2597, + 1967, + 2339, + 2752, + 1352, + 954, + 2711, + 3148, + 1965, + 2680, + 1309, + 3787, + 832, + 1408, + 2217, + 1908, + 3725, + 1096, + 1342, + 1027, + 2068, + 3232, + 2287, + 4584, + 2428, + 2699, + 1889, + 3982, + 1615, + 2327, + 1330, + 5331, + 2356, + 1012, + 2073, + 1502, + 1525, + 3787, + 2429, + 1634, + 1138, + 3314, + 717, + 3313, + 2859, + 3984, + 2158, + 1841, + 1409, + 1520, + 643, + 1615, + 1695, + 2317, + 1207, + 2292, + 1725, + 2015, + 2475, + 2928, + 888, + 1407, + 3911, + 2527, + 1431, + 1238, + 1075, + 2029, + 1682, + 1294, + 780, + 981, + 716, + 1719, + 2704, + 1632, + 2118, + 4557, + 1563, + 1129, + 1757, + 5055, + 4458, + 1544, + 2391, + 1767, + 1277, + 2757, + 1981, + 1391, + 2307, + 1448, + 3306, + 1656, + 2928, + 2438, + 1298, + 2228, + 974, + 3081, + 728, + 3089, + 1329, + 2265, + 1687, + 1695, + 2678, + 1933, + 2784, + 5301, + 1292, + 4643, + 1308, + 1369, + 851, + 4882, + 1388, + 3251, + 1789, + 2581, + 2539, + 1575, + 2539, + 2174, + 2107, + 1923, + 7287, + 511, + 2061, + 1177, + 972, + 7803, + 1309, + 2019, + 2186, + 3625, + 2273, + 2623, + 2900, + 2254, + 1913, + 1540, + 1840, + 2094, + 2675, + 2329, + 1576, + 1813, + 1882, + 2822, + 3235, + 826, + 3820, + 2883, + 3097, + 1320, + 1074, + 6178, + 2555, + 1592, + 2499, + 1814, + 1371, + 1832, + 2404, + 1746, + 2616, + 1690, + 781, + 2508, + 2087, + 1403, + 1559, + 2315, + 1617, + 800, + 2526, + 2443, + 2164, + 1244, + 1628, + 2728, + 3212, + 1700, + 2488, + 2440, + 2565, + 865, + 2194, + 3080, + 4134, + 740, + 3797, + 2239, + 2404, + 3396, + 3410, + 2345, + 2072, + 610, + 2441, + 3069, + 2916, + 2207, + 1206, + 871, + 2615, + 1243, + 2991, + 1241, + 1862, + 2300, + 1822, + 3050, + 2381, + 3482, + 817, + 3832, + 2173, + 1364, + 1184, + 2573, + 2371, + 2597, + 1362, + 831, + 869, + 881, + 2782, + 2430, + 2915, + 2176, + 2391, + 2892, + 1939, + 1996, + 3643, + 4169, + 1712, + 2948, + 1602, + 2063, + 4176, + 4742, + 1777, + 3955, + 727, + 2914, + 1960, + 2353, + 990, + 1448, + 3056, + 1728, + 2249, + 1294, + 2559, + 2318, + 3039, + 2381, + 2562, + 1537, + 2536, + 1966, + 1162, + 1197, + 2652, + 5059, + 671, + 1862, + 2074, + 2477, + 3828, + 2774, + 699, + 2781, + 4686, + 4580, + 2944, + 1821, + 2114, + 3468, + 2997, + 1888, + 2324, + 2733, + 1156, + 1118, + 4182, + 1997, + 2108, + 4202, + 2592, + 1051, + 3036, + 3616, + 4061, + 4971, + 2576, + 2822, + 2435, + 1536, + 1182, + 2742, + 1916, + 3807, + 3569, + 2663, + 3780, + 4601, + 2083, + 4034, + 2599, + 1752, + 2126, + 3778, + 1757, + 1725, + 2208, + 888, + 4000, + 1285, + 1449, + 3285, + 2315, + 936, + 2491, + 1430, + 993, + 2375, + 2213, + 2784, + 2841, + 3307, + 3242, + 772, + 2623, + 1513, + 2162, + 1623, + 2275, + 2985, + 3232, + 2070, + 2089, + 3788, + 1924, + 2404, + 3280, + 1965, + 2253, + 3133, + 1890, + 3152, + 1140, + 2890, + 2276, + 1538, + 1930, + 2145, + 2959, + 3534, + 2305, + 3051, + 2484, + 1609, + 3094, + 1465, + 2300, + 2139, + 4119, + 1531, + 3497, + 2550, + 2099, + 2949, + 3334, + 1258, + 1779, + 751, + 1039, + 2364, + 1979, + 1865, + 2591, + 712, + 1598, + 1747, + 1821, + 1820, + 2658, + 1978, + 2808, + 1939, + 4337, + 3256, + 4725, + 2085, + 1774, + 2482, + 1720, + 1773, + 2632, + 2254, + 2464, + 3429, + 1763, + 1981, + 3280, + 1335, + 3146, + 2642, + 664, + 1143, + 1403, + 1188, + 3812, + 3525, + 1649, + 1178, + 2308, + 3261, + 2308, + 1629, + 3247, + 2638, + 1099, + 2321, + 2019, + 2176, + 2156, + 1349, + 1648, + 3212, + 810, + 1643, + 599, + 1612, + 5122, + 1952, + 3542, + 3575, + 1378, + 1913, + 1094, + 1273, + 615, + 2319, + 3511, + 2107, + 1095, + 2373, + 2453, + 617, + 1604, + 1570, + 1075, + 714, + 1939, + 1102, + 3244, + 1676, + 996, + 2429, + 4277, + 2454, + 3559, + 2683, + 2617, + 1688, + 701, + 3667, + 2215, + 2010, + 1466, + 1227, + 768, + 1033, + 3002, + 2578, + 3835, + 3225, + 1516, + 2695, + 3421, + 3345, + 1311, + 3297, + 3795, + 2167, + 1331, + 1655, + 1751, + 4126, + 2855, + 2042, + 2337, + 3106, + 2509, + 3394, + 1709, + 2629, + 2449, + 1590, + 976, + 5158, + 920, + 1505, + 1317, + 1548, + 2717, + 2707, + 2385, + 2698, + 1135, + 1852, + 2134, + 889, + 1949, + 3428, + 3951, + 3102, + 968, + 2271, + 977, + 4261, + 1837, + 1660, + 1991, + 3903, + 2417, + 2626, + 1401, + 2839, + 2538, + 2423, + 634, + 2510, + 1721, + 2669, + 1643, + 2105, + 2745, + 2107, + 2741, + 1130, + 2879, + 1983, + 1501, + 1669, + 694, + 3125, + 3088, + 5343, + 1246, + 3196, + 2826, + 1737, + 1400, + 2693, + 534, + 3668, + 1681, + 1814, + 3512, + 3739, + 1757, + 2468, + 2066, + 1947, + 4456, + 984, + 3068, + 3160, + 1697, + 3117, + 2222, + 1200, + 1686, + 1668, + 3470, + 991, + 1283, + 2635, + 2811, + 615, + 1992, + 1891, + 2384, + 2209, + 2954, + 2306, + 4832, + 3219, + 1674, + 3163, + 1328, + 3342, + 2785, + 3066, + 1430, + 2282, + 978, + 2138, + 995, + 2123, + 2560, + 1632, + 1145, + 2855, + 1504, + 4104, + 2163, + 2825, + 2055, + 2866, + 848, + 2564, + 2306, + 1767, + 716, + 2370, + 975, + 1963, + 2788, + 2845, + 1760, + 1833, + 2700, + 1374, + 3166, + 1823, + 1126, + 2315, + 3381, + 848, + 3604, + 3273, + 731, + 1428, + 1690, + 3060, + 4187, + 2102, + 1799, + 1547, + 1658, + 1661, + 1840, + 1224, + 1275, + 3790, + 2651, + 1471, + 1180, + 4670, + 1787, + 2368, + 2242, + 4259, + 1589, + 889, + 2279, + 1668, + 2562, + 3575, + 7567, + 1881, + 1582, + 2543, + 4274, + 693, + 635, + 1931, + 2143, + 1720, + 2340, + 2034, + 1662, + 2184, + 2462, + 994, + 2031, + 2221, + 1840, + 1671, + 579, + 4670, + 3305, + 3430, + 2822, + 2178, + 1593, + 858, + 3209, + 2270, + 1685, + 1107, + 1273, + 2848, + 3161, + 3007, + 2111, + 1441, + 2901, + 1025, + 4994, + 1290, + 2257, + 4910, + 1884, + 2877, + 1078, + 2729, + 1608, + 860, + 1675, + 1808, + 1607, + 1568, + 2552, + 3636, + 1582, + 2003, + 1507, + 3623, + 2661, + 1959, + 2398, + 1298, + 1438, + 2804, + 2947, + 2827, + 1657, + 2311, + 2554, + 2074, + 1892, + 2132, + 1574, + 2770, + 2238, + 2620, + 2815, + 2329, + 2172, + 1734, + 1182, + 3399, + 2967, + 1195, + 1235, + 2329, + 2596, + 4951, + 1283, + 3974, + 4059, + 2297, + 4393, + 2418, + 2330, + 2168, + 3757, + 1385, + 3254, + 3733, + 1355, + 1642, + 2278, + 1815, + 2489, + 2028, + 1078, + 2313, + 1242, + 2382, + 862, + 2064, + 912, + 768, + 2910, + 2911, + 2894, + 6975, + 1613, + 2460, + 2783, + 1180, + 1716, + 2072, + 2450, + 4359, + 2639, + 1609, + 1046, + 2734, + 3441, + 3022, + 4828, + 2103, + 3580, + 1445, + 2152, + 1861, + 1796, + 4411, + 1843, + 1330, + 4704, + 1071, + 1048, + 3258, + 1024, + 1114, + 3345, + 2196, + 1546, + 1912, + 3151, + 3607, + 1180, + 1252, + 2792, + 931, + 727, + 824, + 2915, + 1685, + 1327, + 3038, + 1849, + 1895, + 5706, + 721, + 2452, + 2681, + 1908, + 2329, + 3450, + 1716, + 2887, + 3486, + 1186, + 6689, + 3849, + 3063, + 1349, + 2271, + 3248, + 3801, + 1110, + 3133, + 3284, + 1634, + 3200, + 3389, + 1535, + 2392, + 1920, + 3370, + 1286, + 1915, + 1728, + 2251, + 2546, + 711, + 1534, + 2185, + 2630, + 2202, + 1021, + 2377, + 2830, + 1021, + 2571, + 3660, + 992, + 1442, + 3040, + 2391, + 2156, + 3939, + 3381, + 4238, + 2120, + 4252, + 1667, + 1656, + 2537, + 2259, + 1964, + 2532, + 3046, + 2819, + 1720, + 948, + 3044, + 1980, + 1769, + 2995, + 2178, + 2395, + 3384, + 2667, + 919, + 1680, + 4718, + 3171, + 616, + 2199, + 5930, + 2631, + 5713, + 1739, + 3107, + 976, + 3015, + 2253, + 1152, + 2126, + 1187, + 2090, + 3197, + 3336, + 1440, + 4660, + 2961, + 1290, + 2970, + 1559, + 2380, + 2981, + 3266, + 2438, + 2374, + 2369, + 1150, + 1972, + 1602, + 1767, + 3177, + 4306, + 2300, + 1546, + 6229, + 2269, + 2347, + 1544, + 1543, + 2047, + 2853, + 1940, + 2031, + 2163, + 3057, + 1721, + 3594, + 776, + 2185, + 1556, + 2042, + 5527, + 1067, + 3168, + 4463, + 3232, + 4570, + 2450, + 1433, + 2547, + 3806, + 3978, + 2613, + 3909, + 2008, + 1696, + 1683, + 3576, + 2840, + 5919, + 1831, + 1712, + 5381, + 1547, + 1518, + 3235, + 3523, + 2598, + 2379, + 630, + 1650, + 1999, + 2909, + 2926, + 1529, + 3260, + 2050, + 2145, + 1084, + 2467, + 2752, + 2423, + 2362, + 2884, + 2715, + 1956, + 2665, + 786, + 1810, + 2240, + 1742, + 2802, + 1652, + 4679, + 2440, + 1359, + 2731, + 1628, + 1241, + 4059, + 2634, + 1856, + 2809, + 2413, + 6326, + 566, + 922, + 5217, + 2460, + 2387, + 4271, + 2456, + 865, + 3783, + 2694, + 1347, + 1517, + 2388, + 2238, + 1814, + 2443, + 4180, + 3291, + 2371, + 2118, + 1447, + 1240, + 3252, + 3831, + 1784, + 1053, + 3386, + 1877, + 4982, + 2231, + 1376, + 1567, + 3990, + 2633, + 3841, + 2213, + 1298, + 2235, + 1681, + 1783, + 1128, + 748, + 2504, + 1709, + 2888, + 2987, + 1608, + 1298, + 2191, + 1877, + 1548, + 2246, + 2035, + 1995, + 1972, + 2556, + 1972, + 1409, + 2768, + 2420, + 1415, + 2000, + 3927, + 1727, + 3380, + 2302, + 2604, + 2763, + 3822, + 3855, + 1993, + 1038, + 3591, + 1675, + 945, + 2476, + 1838, + 2329, + 1889, + 3356, + 3022, + 3508, + 1272, + 4294, + 2320, + 1926, + 3584, + 1906, + 2311, + 1678, + 1888, + 4365, + 1148, + 566, + 1155, + 2829, + 2637, + 2391, + 1342, + 1324, + 1890, + 4412, + 930, + 2761, + 4842, + 2030, + 3058, + 736, + 3322, + 2096, + 1873, + 3362, + 3206, + 3421, + 3844, + 997, + 1043, + 6884, + 1955, + 1431, + 1439 + ] + } + ], + "top_n": [ + { + "data": "AkA3ZjExMzRmMTA4ZTc0YWM1YjIyODBjMDgzYjlmNGIyYw==", + "count": 2561 + }, + { + "data": "AkBlZGNmYWE1YjA2Yjc0ZDExYjY3OTEzODk2ZDUzYjMwYg==", + "count": 15145 + }, + { + "data": "AkAwNDllNDE3M2Y2ZjU0NTRiOGZlOTA0MjI0NGJlZDBmNw==", + "count": 3010 + }, + { + "data": "AkBlNDYzNTExN2Q1ZjA0MjgxODg0YWYxNWM0NjE1ZjQ5Ng==", + "count": 6337 + }, + { + "data": "AkA5ZjA4YTkwYWZhYTA0ZGVmODU1ZjNmYTEzODYwZWZkZA==", + "count": 1692 + }, + { + "data": "AkA2ZjcwMTIxYjkyMjc0NDRkODRlYWNlNmQ3NzNlYzk3ZQ==", + "count": 2851 + }, + { + "data": "AkAwYTk5NGM5Yzg1ZWM0NDUyODc2OTg2YWQzYjNlNDJlNg==", + "count": 743 + }, + { + "data": "AkBkNTBmMDQ5OGZkN2E0YmM5YWIwNjBkNmJlNzhlMDM4OA==", + "count": 1379 + }, + { + "data": "AkBmNzA2ODY0NWU2NTU0NGQwYWUzYjVmMDY0M2Y4NTY3Mg==", + "count": 2064 + }, + { + "data": "AkA0ZjcyYjk2NjkwYjE0NTAxODUzMDk5ZjIzOWFhYzVjYw==", + "count": 4256 + }, + { + "data": "AkBiZTM3ZWNkNjRkODI0MWI4ODVkYmRkNzI1ZDk5OGYzYQ==", + "count": 3365 + }, + { + "data": "AkBmZDIzMWI4NDAwZjI0ZDM0OTgwY2VmNTg2MjMzODI5Mg==", + "count": 3678 + }, + { + "data": "AkBlY2I4MjU4ZGJmYzA0MmY5OGE5ZmM0YzdlZjYwZmFkMw==", + "count": 824 + }, + { + "data": "AkBlYWU3Y2UwMjQ5OTU0YzIxYWVkMTExNmFiMjI4MjM0YQ==", + "count": 1932 + }, + { + "data": "AkA0YWYzMTcwZmU3ZDE0OWZjYTE1OWI5NDYwMTY3Mjg0Ng==", + "count": 1897 + }, + { + "data": "AkAyZTFiYjIzYTVlNDk0MjVlYTQ4MDA3YzVmNjg0Mjg4ZA==", + "count": 3329 + }, + { + "data": "AkAwMmY0MjQ5NjRkMTc0MzlmYWU4ZjY1M2UwMjE0ZTkyOA==", + "count": 2548 + }, + { + "data": "AkBhZTliOTNiZjQwNjM0MWJjYjAzODk0NGRkNWQxYTMyYw==", + "count": 1571 + }, + { + "data": "AkAyZTdmYTM1MDEzYzI0ODRmOWFkZDMxM2M0MjcwZjg1ZA==", + "count": 10629 + }, + { + "data": "AkA5NWMxOGU0YzdlNjI0ZjNjYWZkYTlkNTFmYTU4N2VhZA==", + "count": 1885 + }, + { + "data": "AkAzMGQxOGUyNWU5OTU0YTgyYWZmZjU1MmIxYjVkZTMxZA==", + "count": 1021 + }, + { + "data": "AkAwNTMxNGZkNDg3MDQ0MzMzYjUzNDcwY2E5OWFlMGU5YQ==", + "count": 1844 + }, + { + "data": "AkA1OTk3NDhlNmJmYTA0ODFkYjM4ODgzYmFjOTFmYTBiZA==", + "count": 5077 + }, + { + "data": "AkA5ZjJlNmE0NzMxYTk0MDJmOWM1NDZkYjUxNDI4OGUwNw==", + "count": 2089 + }, + { + "data": "AkA1MzdkZGVhNzFlNTA0MGU1YWU5YTdjNTA3MTBlNjBhNg==", + "count": 3086 + }, + { + "data": "AkA5YmQzNDAyMmE4YjY0MDY4OTAxNzFlM2U1Y2JkNTQ0NQ==", + "count": 5040 + }, + { + "data": "AkBiOWJlMjZmNTAzYjQ0MDYwOWQ1MThmOTA5NjJhOTBiYw==", + "count": 2212 + }, + { + "data": "AkBkOGM5NTZkN2M4YWY0ZTA5ODFhYTRmYjljZmVkYWU5YQ==", + "count": 2659 + }, + { + "data": "AkBiYmZiNDA4ZDIyOTk0YWZkYWNmZTdiNDQzZDRiYzEwZQ==", + "count": 2061 + }, + { + "data": "AkA0ZTExNTY5MDdkYjg0NWY5ODllZjI3NTY4YzgxZGViYw==", + "count": 2305 + }, + { + "data": "AkBkZTlmOGRiZDFiZDE0ZDQyOWFiYjczNWNhOWQxOWZkYg==", + "count": 527 + }, + { + "data": "AkA5NmNjMWRmNDAxYjc0YWYyYTU3YTA2YTdkZDVhMzFhNg==", + "count": 3401 + }, + { + "data": "AkAzMTJmOWQ3MGUxODE0MDIyOTFiNTFjZGEzOTM1YmEwNQ==", + "count": 2623 + }, + { + "data": "AkBlNzg2OWVhZGJmMjc0YTlkOGE2YjIyZWY2ZjNjNTgzYw==", + "count": 1488 + }, + { + "data": "AkAyMmVkNzExMTZlNTk0YTZkOGRhYTM2MjZlMDZhYzc5Zg==", + "count": 4041 + }, + { + "data": "AkA0NDU4NjNjNzBjNzA0ZWE2OTdkMzgzZmQ3NDI0NjFmOA==", + "count": 2399 + }, + { + "data": "AkBhYjA5OTlkMmU4ZTA0YWE4ODQ3MTJkNTgxYzEyOGM3ZA==", + "count": 2125 + }, + { + "data": "AkA2M2M4MmU2NzcyMmU0ODAyYjUxN2U0NmM2YWQwNDQxZg==", + "count": 3332 + }, + { + "data": "AkBhM2E5ZWJhZGRjY2Y0M2ZlYmFlNmQ1MGU0MjJlOTJjNw==", + "count": 2736 + }, + { + "data": "AkAyOTcxNjNiMTI3NDU0NmJjOTg2MGQ3ZGJmNDMzZjlmOQ==", + "count": 422 + } + ], + "default_value": 0 + }, + "null_count": 82563134, + "tot_col_size": 166302542, + "last_update_version": 419082401555939337, + "correlation": 0.010142 + }, + "c": { + "histogram": { + "ndv": 13, + "buckets": [ + { + "count": 410776, + "lower_bound": "QUNUSVZJVFk=", + "upper_bound": "QkdS", + "repeats": 235953 + }, + { + "count": 821552, + "lower_bound": "R1JPVVA=", + "upper_bound": "R1JPVVA=", + "repeats": 410733 + }, + { + "count": 1459566, + "lower_bound": "SU5GT1JNQVRJT04=", + "upper_bound": "TElWRQ==", + "repeats": 506862 + }, + { + "count": 19664818, + "lower_bound": "UE9TVA==", + "upper_bound": "UE9TVA==", + "repeats": 18203337 + }, + { + "count": 30729555, + "lower_bound": "UVVFU1RJT04=", + "upper_bound": "UVVFU1RJT04=", + "repeats": 11063574 + }, + { + "count": 87372972, + "lower_bound": "U0FMRVM=", + "upper_bound": "VE9QSUM=", + "repeats": 56593764 + }, + { + "count": 87399192, + "lower_bound": "VklERU8=", + "upper_bound": "VklERU8=", + "repeats": 26217 + } + ] + }, + "cm_sketch": { + "rows": [ + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 50, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 15061, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 522, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 221, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 167, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 81, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 44, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 31, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6090, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 341, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 755, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 31, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 50, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 221, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 755, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 341, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 81, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 167, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 44, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 15061, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6090, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 522, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11, + 0 + ] + }, + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 755, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 341, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 15061, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 31, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 50, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 81, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 221, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 522, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 44, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 167, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6090, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6090, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 15061, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 167, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 522, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 81, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 755, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 50, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 221, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 31, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 341, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 44, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 221, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 50, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6090, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 44, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 167, + 0, + 0, + 0, + 0, + 755, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 31, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 522, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 341, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 81, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 15061, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + } + ], + "top_n": [ + { + "data": "AhBRVUVTVElPTg==", + "count": 10925328 + }, + { + "data": "AgpHUk9VUA==", + "count": 371494 + }, + { + "data": "AgZCR1I=", + "count": 245742 + }, + { + "data": "AgpWSURFTw==", + "count": 12239 + }, + { + "data": "AghQT1NU", + "count": 18373229 + }, + { + "data": "AghMSVZF", + "count": 476625 + }, + { + "data": "Ag5BUlRJQ0xF", + "count": 64163 + }, + { + "data": "AgZTVkQ=", + "count": 41411 + }, + { + "data": "AgpTQUxFUw==", + "count": 25767 + }, + { + "data": "AgpUT1BJQw==", + "count": 56552967 + }, + { + "data": "AhBBQ1RJVklUWQ==", + "count": 175536 + }, + { + "data": "AhZJTkZPUk1BVElPTg==", + "count": 111315 + } + ], + "default_value": 0 + }, + "null_count": 0, + "tot_col_size": 637995166, + "last_update_version": 419082401542832213, + "correlation": 0.46293 + } + }, + "indices": { + "idx1": { + "histogram": { + "ndv": 1078302, + "buckets": [ + { + "count": 995227, + "lower_bound": "AAEwM2UxNGYyZf83MTc4NDU3Zv9iZGY4YzA0NP9hMDQxZDM1Nf8AAAAAAAAAAPc=", + "upper_bound": "AAFQMTAxMTI4AP4=", + "repeats": 2 + }, + { + "count": 1778783, + "lower_bound": "AAFQMTAxMTI4MP8AAAAAAAAAAPc=", + "upper_bound": "AAFQMTEwODY4NP8AAAAAAAAAAPc=", + "repeats": 1 + }, + { + "count": 2217344, + "lower_bound": "AAFQMTEwODcwMP8AAAAAAAAAAPc=", + "upper_bound": "AAFQMTEzODEwMP8AAAAAAAAAAPc=", + "repeats": 114 + }, + { + "count": 3830063, + "lower_bound": "AAFQMTEzODExMv8AAAAAAAAAAPc=", + "upper_bound": "AAFQMTE2NTYxMv8AAAAAAAAAAPc=", + "repeats": 1 + }, + { + "count": 4718486, + "lower_bound": "AAFQMTE2NTYxNf8AAAAAAAAAAPc=", + "upper_bound": "AAFQMTIwODcxNP8AAAAAAAAAAPc=", + "repeats": 748 + }, + { + "count": 5299812, + "lower_bound": "AAFQMTIwODcxN/8AAAAAAAAAAPc=", + "upper_bound": "AAFQMTIzMjIzOf8AAAAAAAAAAPc=", + "repeats": 154 + }, + { + "count": 5759489, + "lower_bound": "AAFQMTIzMjI0MP8AAAAAAAAAAPc=", + "upper_bound": "AAFQMTI1NzMxOP8AAAAAAAAAAPc=", + "repeats": 1 + }, + { + "count": 7182181, + "lower_bound": "AAFQMTI1NzMyNv8AAAAAAAAAAPc=", + "upper_bound": "AAFQMTI3MjIAAP0=", + "repeats": 2017 + }, + { + "count": 7855400, + "lower_bound": "AAFQMTI3MjIxMP8AAAAAAAAAAPc=", + "upper_bound": "AAFQMTI4Nzc5M/8AAAAAAAAAAPc=", + "repeats": 11 + }, + { + "count": 8552593, + "lower_bound": "AAFQMTI4Nzc5Of8AAAAAAAAAAPc=", + "upper_bound": "AAFQMTMwMTYwM/8AAAAAAAAAAPc=", + "repeats": 1 + }, + { + "count": 9106255, + "lower_bound": "AAFQMTMwMTYxMv8AAAAAAAAAAPc=", + "upper_bound": "AAFQMTMyNjMxMv8AAAAAAAAAAPc=", + "repeats": 1 + }, + { + "count": 9424760, + "lower_bound": "AAFQMTMyNjMxNv8AAAAAAAAAAPc=", + "upper_bound": "AAFQMTMyOTkAAP0=", + "repeats": 17638 + }, + { + "count": 10354070, + "lower_bound": "AAFQMTMyOTkxOP8AAAAAAAAAAPc=", + "upper_bound": "AAFQMTM4NDU3M/8AAAAAAAAAAPc=", + "repeats": 38 + }, + { + "count": 11210219, + "lower_bound": "AAFQMTM4NDU3OP8AAAAAAAAAAPc=", + "upper_bound": "AAFQMTY5NDA5NP8AAAAAAAAAAPc=", + "repeats": 92 + }, + { + "count": 11647341, + "lower_bound": "AAFQMTY5NDExN/8AAAAAAAAAAPc=", + "upper_bound": "AAFQMjA3NTA4Of8AAAAAAAAAAPc=", + "repeats": 9430 + }, + { + "count": 12386612, + "lower_bound": "AAFQMjA3NTA5Mf8AAAAAAAAAAPc=", + "upper_bound": "AAFQMjc4NDAAAP0=", + "repeats": 857 + }, + { + "count": 13184621, + "lower_bound": "AAFQMjc4NDEAAP0=", + "upper_bound": "AAFQMzg1NTQzAP4=", + "repeats": 2 + }, + { + "count": 13803540, + "lower_bound": "AAFQMzg1NjQ1AP4=", + "upper_bound": "AAFQNDY0MzM5AP4=", + "repeats": 6 + }, + { + "count": 14199816, + "lower_bound": "AAFQNDY0MzQAAP0=", + "upper_bound": "AAFQNTAxOAAAAPw=", + "repeats": 17 + }, + { + "count": 14622116, + "lower_bound": "AAFQNTAxOTEAAP0=", + "upper_bound": "AAFQNTQ2MTYAAP0=", + "repeats": 11 + }, + { + "count": 15416260, + "lower_bound": "AAFQNTQ2MjkyAP4=", + "upper_bound": "AAFQNjg0ODg3AP4=", + "repeats": 4332 + }, + { + "count": 15857926, + "lower_bound": "AAFQNjg0OQAAAPw=", + "upper_bound": "AAFQNzQ2NTg4AP4=", + "repeats": 701 + }, + { + "count": 16540514, + "lower_bound": "AAFQNzQ2NjAwAP4=", + "upper_bound": "AAFQODAwOTE2AP4=", + "repeats": 1 + }, + { + "count": 16781657, + "lower_bound": "AAFQODAwOTI3AP4=", + "upper_bound": "AAFQODM3MzkAAP0=", + "repeats": 12 + }, + { + "count": 17240778, + "lower_bound": "AAFQODM3Mzk5AP4=", + "upper_bound": "AAFQODcyMTcAAP0=", + "repeats": 54 + }, + { + "count": 18065273, + "lower_bound": "AAFQODcyMTcwAP4=", + "upper_bound": "AAFQOTA5NDA0AP4=", + "repeats": 44 + }, + { + "count": 18388651, + "lower_bound": "AAFQOTA5NDEwAP4=", + "upper_bound": "AAFQOTM4OTAxAP4=", + "repeats": 9 + }, + { + "count": 18717430, + "lower_bound": "AAFQOTM4OTIyAP4=", + "upper_bound": "AAFQOTgyNzk5AP4=", + "repeats": 1 + }, + { + "count": 19040435, + "lower_bound": "AAFQOTgyODAzAP4=", + "upper_bound": "AAFQOTk4MjMAAP0=", + "repeats": 6454 + }, + { + "count": 19534266, + "lower_bound": "AAFQOTk4MjMwAP4=", + "upper_bound": "AAFRMTEzOTQ5AP4=", + "repeats": 8 + }, + { + "count": 20261161, + "lower_bound": "AAFRMTEzOTUAAP0=", + "upper_bound": "AAFRMTM0NjkAAP0=", + "repeats": 8586 + }, + { + "count": 20680839, + "lower_bound": "AAFRMTM0NjkxAP4=", + "upper_bound": "AAFRMTU5NzI5AP4=", + "repeats": 10526 + }, + { + "count": 20927662, + "lower_bound": "AAFRMTU5NzMAAP0=", + "upper_bound": "AAFRMTY3OTMzAP4=", + "repeats": 13 + }, + { + "count": 21140081, + "lower_bound": "AAFRMTY3OTM5AP4=", + "upper_bound": "AAFRMTY5NDEAAP0=", + "repeats": 24 + }, + { + "count": 22088743, + "lower_bound": "AAFRMTY5NDEwAP4=", + "upper_bound": "AAFRMTY5NjY2AP4=", + "repeats": 12 + }, + { + "count": 22259988, + "lower_bound": "AAFRMTY5NjY4AP4=", + "upper_bound": "AAFRMTY5OTc2AP4=", + "repeats": 3 + }, + { + "count": 23047879, + "lower_bound": "AAFRMTY5OTgwAP4=", + "upper_bound": "AAFRMTcwMTM1AP4=", + "repeats": 1 + }, + { + "count": 23199895, + "lower_bound": "AAFRMTcwMTQAAP0=", + "upper_bound": "AAFRMTcwMjQAAP0=", + "repeats": 19 + }, + { + "count": 23507861, + "lower_bound": "AAFRMTcwMjQ0AP4=", + "upper_bound": "AAFRMTcwMzI4AP4=", + "repeats": 126241 + }, + { + "count": 23827886, + "lower_bound": "AAFRMTcwMzMwAP4=", + "upper_bound": "AAFRMTcwMzk4AP4=", + "repeats": 26 + }, + { + "count": 24620593, + "lower_bound": "AAFRMTcwNAAAAPw=", + "upper_bound": "AAFRMTcwNDY0AP4=", + "repeats": 26 + }, + { + "count": 24621201, + "lower_bound": "AAFRMTcwNDcwAP4=", + "upper_bound": "AAFRMTcwNTI3AP4=", + "repeats": 7 + }, + { + "count": 25759490, + "lower_bound": "AAFRMTcwNTMAAP0=", + "upper_bound": "AAFRMTgwMzcAAP0=", + "repeats": 6 + }, + { + "count": 26621227, + "lower_bound": "AAFRMTgwMzcwAP4=", + "upper_bound": "AAFRMTg2MTYyAP4=", + "repeats": 4 + }, + { + "count": 27070214, + "lower_bound": "AAFRMTg2MTYzAP4=", + "upper_bound": "AAFRMTg4MDQwAP4=", + "repeats": 193 + }, + { + "count": 27363322, + "lower_bound": "AAFRMTg4MDQyAP4=", + "upper_bound": "AAFRMTg5MDQ4AP4=", + "repeats": 10 + }, + { + "count": 27603180, + "lower_bound": "AAFRMTg5MDUAAP0=", + "upper_bound": "AAFRMTkzMTcyAP4=", + "repeats": 10 + }, + { + "count": 28475621, + "lower_bound": "AAFRMTkzMTczAP4=", + "upper_bound": "AAFRMjAzODE4AP4=", + "repeats": 470 + }, + { + "count": 28689531, + "lower_bound": "AAFRMjAzODE5AP4=", + "upper_bound": "AAFRMjczMQAAAPw=", + "repeats": 410 + }, + { + "count": 29148549, + "lower_bound": "AAFRMjczMTAAAP0=", + "upper_bound": "AAFRNDcxMTEAAP0=", + "repeats": 110 + }, + { + "count": 29462944, + "lower_bound": "AAFRNDcxMgAAAPw=", + "upper_bound": "AAFRNjUzODIAAP0=", + "repeats": 60 + }, + { + "count": 29783424, + "lower_bound": "AAFRNjUzODUAAP0=", + "upper_bound": "AAFROTEyMDkAAP0=", + "repeats": 9617 + }, + { + "count": 30017756, + "lower_bound": "AAFROTEyMQAAAPw=", + "upper_bound": "AAFTNjgyMgAAAPw=", + "repeats": 778 + }, + { + "count": 30711272, + "lower_bound": "AAFTNjgyNwAAAPw=", + "upper_bound": "AAFUMTI0MgAAAPw=", + "repeats": 72 + }, + { + "count": 30946227, + "lower_bound": "AAFUMTI0NAAAAPw=", + "upper_bound": "AAFUMTQwOQAAAPw=", + "repeats": 121 + }, + { + "count": 31408457, + "lower_bound": "AAFUMTQxMAAAAPw=", + "upper_bound": "AAFUMTQ5MwAAAPw=", + "repeats": 93410 + }, + { + "count": 31992962, + "lower_bound": "AAFUMTQ5NAAAAPw=", + "upper_bound": "AAFUMTUwMgAAAPw=", + "repeats": 69722 + }, + { + "count": 32035488, + "lower_bound": "AAFUMTUwMwAAAPw=", + "upper_bound": "AAFUMTUxMQAAAPw=", + "repeats": 1566 + }, + { + "count": 32219170, + "lower_bound": "AAFUMTUxMgAAAPw=", + "upper_bound": "AAFUMTUxOQAAAPw=", + "repeats": 1138 + }, + { + "count": 32591304, + "lower_bound": "AAFUMTUyMAAAAPw=", + "upper_bound": "AAFUMTUyNwAAAPw=", + "repeats": 6352 + }, + { + "count": 33006064, + "lower_bound": "AAFUMTUyOAAAAPw=", + "upper_bound": "AAFUMTU0NAAAAPw=", + "repeats": 261 + }, + { + "count": 33627550, + "lower_bound": "AAFUMTU0NQAAAPw=", + "upper_bound": "AAFUMTU2MAAAAPw=", + "repeats": 70970 + }, + { + "count": 34114321, + "lower_bound": "AAFUMTU2MQAAAPw=", + "upper_bound": "AAFUMTU4MAAAAPw=", + "repeats": 1037 + }, + { + "count": 35861063, + "lower_bound": "AAFUMTU4MQAAAPw=", + "upper_bound": "AAFUMTU5MAAAAPw=", + "repeats": 5282 + }, + { + "count": 36311621, + "lower_bound": "AAFUMTU5MQAAAPw=", + "upper_bound": "AAFUMTU5OAAAAPw=", + "repeats": 3946 + }, + { + "count": 36408817, + "lower_bound": "AAFUMTYwMAAAAPw=", + "upper_bound": "AAFUMTYwMgAAAPw=", + "repeats": 75070 + }, + { + "count": 37391308, + "lower_bound": "AAFUMTYwMwAAAPw=", + "upper_bound": "AAFUMTYwNgAAAPw=", + "repeats": 45732 + }, + { + "count": 37459214, + "lower_bound": "AAFUMTYwNwAAAPw=", + "upper_bound": "AAFUMTYxMAAAAPw=", + "repeats": 5417 + }, + { + "count": 37644209, + "lower_bound": "AAFUMTYxMQAAAPw=", + "upper_bound": "AAFUMTYxNAAAAPw=", + "repeats": 103812 + }, + { + "count": 38073319, + "lower_bound": "AAFUMTYxNQAAAPw=", + "upper_bound": "AAFUMTYyMAAAAPw=", + "repeats": 60630 + }, + { + "count": 38210017, + "lower_bound": "AAFUMTYyMQAAAPw=", + "upper_bound": "AAFUMTYyOAAAAPw=", + "repeats": 5908 + }, + { + "count": 38424867, + "lower_bound": "AAFUMTYyOQAAAPw=", + "upper_bound": "AAFUMTYzNwAAAPw=", + "repeats": 10288 + }, + { + "count": 38796404, + "lower_bound": "AAFUMTYzOAAAAPw=", + "upper_bound": "AAFUMTY0OAAAAPw=", + "repeats": 40785 + }, + { + "count": 39431512, + "lower_bound": "AAFUMTY0OQAAAPw=", + "upper_bound": "AAFUMTY2NAAAAPw=", + "repeats": 1828 + }, + { + "count": 39633903, + "lower_bound": "AAFUMTY2NQAAAPw=", + "upper_bound": "AAFUMTY3NgAAAPw=", + "repeats": 19320 + }, + { + "count": 40107527, + "lower_bound": "AAFUMTY3NwAAAPw=", + "upper_bound": "AAFUMTY5MgAAAPw=", + "repeats": 208273 + }, + { + "count": 40567949, + "lower_bound": "AAFUMTY5MwAAAPw=", + "upper_bound": "AAFUMTcwOQAAAPw=", + "repeats": 6071 + }, + { + "count": 40693336, + "lower_bound": "AAFUMTcxMAAAAPw=", + "upper_bound": "AAFUMTcyMAAAAPw=", + "repeats": 27294 + }, + { + "count": 41065599, + "lower_bound": "AAFUMTcyMQAAAPw=", + "upper_bound": "AAFUMTczNgAAAPw=", + "repeats": 528 + }, + { + "count": 41274198, + "lower_bound": "AAFUMTczNwAAAPw=", + "upper_bound": "AAFUMTc0NgAAAPw=", + "repeats": 70196 + }, + { + "count": 41961348, + "lower_bound": "AAFUMTc0NwAAAPw=", + "upper_bound": "AAFUMTc1NAAAAPw=", + "repeats": 532715 + }, + { + "count": 42283292, + "lower_bound": "AAFUMTc1NQAAAPw=", + "upper_bound": "AAFUMTc1OQAAAPw=", + "repeats": 115146 + }, + { + "count": 42461881, + "lower_bound": "AAFUMTc2MAAAAPw=", + "upper_bound": "AAFUMTc2NwAAAPw=", + "repeats": 1556 + }, + { + "count": 42890394, + "lower_bound": "AAFUMTc2OAAAAPw=", + "upper_bound": "AAFUMTc3MgAAAPw=", + "repeats": 184945 + }, + { + "count": 43438080, + "lower_bound": "AAFUMTc3MwAAAPw=", + "upper_bound": "AAFUMTgwNQAAAPw=", + "repeats": 2849 + }, + { + "count": 43722466, + "lower_bound": "AAFUMTgwNgAAAPw=", + "upper_bound": "AAFUMTgyMwAAAPw=", + "repeats": 39125 + }, + { + "count": 43817760, + "lower_bound": "AAFUMTgyNAAAAPw=", + "upper_bound": "AAFUMTgyNwAAAPw=", + "repeats": 1797 + }, + { + "count": 45080907, + "lower_bound": "AAFUMTgyOAAAAPw=", + "upper_bound": "AAFUMTgzMQAAAPw=", + "repeats": 423007 + }, + { + "count": 45385785, + "lower_bound": "AAFUMTgzMgAAAPw=", + "upper_bound": "AAFUMTg0OAAAAPw=", + "repeats": 56693 + }, + { + "count": 45635084, + "lower_bound": "AAFUMTg0OQAAAPw=", + "upper_bound": "AAFUMTg2NQAAAPw=", + "repeats": 3649 + }, + { + "count": 46224224, + "lower_bound": "AAFUMTg2NgAAAPw=", + "upper_bound": "AAFUMTg4MQAAAPw=", + "repeats": 34579 + }, + { + "count": 46411786, + "lower_bound": "AAFUMTg4MgAAAPw=", + "upper_bound": "AAFUMTg5MgAAAPw=", + "repeats": 35211 + }, + { + "count": 46636917, + "lower_bound": "AAFUMTg5MwAAAPw=", + "upper_bound": "AAFUMTkwOAAAAPw=", + "repeats": 14548 + }, + { + "count": 47079843, + "lower_bound": "AAFUMTkwOQAAAPw=", + "upper_bound": "AAFUMTkyNQAAAPw=", + "repeats": 25089 + }, + { + "count": 47656881, + "lower_bound": "AAFUMTkyNgAAAPw=", + "upper_bound": "AAFUMTk0MAAAAPw=", + "repeats": 17367 + }, + { + "count": 47837282, + "lower_bound": "AAFUMTk0MQAAAPw=", + "upper_bound": "AAFUMTk1NgAAAPw=", + "repeats": 1935 + }, + { + "count": 48193533, + "lower_bound": "AAFUMTk1NwAAAPw=", + "upper_bound": "AAFUMTk3MgAAAPw=", + "repeats": 1674 + }, + { + "count": 50617739, + "lower_bound": "AAFUMTk3MwAAAPw=", + "upper_bound": "AAFUMTk4NgAAAPw=", + "repeats": 795216 + }, + { + "count": 50875995, + "lower_bound": "AAFUMTk4OAAAAPw=", + "upper_bound": "AAFUMjA0NgAAAPw=", + "repeats": 34 + }, + { + "count": 50938675, + "lower_bound": "AAFUMjA1NAAAAPw=", + "upper_bound": "AAFUMjA2NAAAAPw=", + "repeats": 1189 + }, + { + "count": 51465336, + "lower_bound": "AAFUMjA2NQAAAPw=", + "upper_bound": "AAFUMjA4MQAAAPw=", + "repeats": 65098 + }, + { + "count": 51738621, + "lower_bound": "AAFUMjA4MgAAAPw=", + "upper_bound": "AAFUMjA4OQAAAPw=", + "repeats": 9961 + }, + { + "count": 52095088, + "lower_bound": "AAFUMjA5MAAAAPw=", + "upper_bound": "AAFUMjA5NwAAAPw=", + "repeats": 234840 + }, + { + "count": 52133298, + "lower_bound": "AAFUMjA5OAAAAPw=", + "upper_bound": "AAFUMjEwNQAAAPw=", + "repeats": 3390 + }, + { + "count": 54161301, + "lower_bound": "AAFUMjEwNgAAAPw=", + "upper_bound": "AAFUMjExNgAAAPw=", + "repeats": 386 + }, + { + "count": 54454560, + "lower_bound": "AAFUMjExNwAAAPw=", + "upper_bound": "AAFUMjEzMwAAAPw=", + "repeats": 25228 + }, + { + "count": 58885394, + "lower_bound": "AAFUMjEzNAAAAPw=", + "upper_bound": "AAFUMjE0OQAAAPw=", + "repeats": 7965 + }, + { + "count": 59545618, + "lower_bound": "AAFUMjE1MAAAAPw=", + "upper_bound": "AAFUMjE4MQAAAPw=", + "repeats": 660 + }, + { + "count": 59907658, + "lower_bound": "AAFUMjE4MgAAAPw=", + "upper_bound": "AAFUMjIxNwAAAPw=", + "repeats": 23968 + }, + { + "count": 60180878, + "lower_bound": "AAFUMjIxOAAAAPw=", + "upper_bound": "AAFUMjI1MAAAAPw=", + "repeats": 8240 + }, + { + "count": 60907452, + "lower_bound": "AAFUMjI1MQAAAPw=", + "upper_bound": "AAFUMjI3MwAAAPw=", + "repeats": 3282 + }, + { + "count": 61671871, + "lower_bound": "AAFUMjI3NAAAAPw=", + "upper_bound": "AAFUMjI4OAAAAPw=", + "repeats": 28682 + }, + { + "count": 63815760, + "lower_bound": "AAFUMjI4OQAAAPw=", + "upper_bound": "AAFUMjMwMAAAAPw=", + "repeats": 679 + }, + { + "count": 65436840, + "lower_bound": "AAFUMjMwMQAAAPw=", + "upper_bound": "AAFUMjMwNwAAAPw=", + "repeats": 26648 + }, + { + "count": 66067335, + "lower_bound": "AAFUMjMwOAAAAPw=", + "upper_bound": "AAFUMjMxNQAAAPw=", + "repeats": 223385 + }, + { + "count": 66129551, + "lower_bound": "AAFUMjMxNgAAAPw=", + "upper_bound": "AAFUMjMyMwAAAPw=", + "repeats": 3539 + }, + { + "count": 67134090, + "lower_bound": "AAFUMjMyNAAAAPw=", + "upper_bound": "AAFUMjMzMQAAAPw=", + "repeats": 20083 + }, + { + "count": 67401483, + "lower_bound": "AAFUMjMzMgAAAPw=", + "upper_bound": "AAFUMjM0NwAAAPw=", + "repeats": 4415 + }, + { + "count": 68542307, + "lower_bound": "AAFUMjM0OAAAAPw=", + "upper_bound": "AAFUMjM1NwAAAPw=", + "repeats": 764386 + }, + { + "count": 68973142, + "lower_bound": "AAFUMjM1OQAAAPw=", + "upper_bound": "AAFUMjM3NAAAAPw=", + "repeats": 8627 + }, + { + "count": 69612508, + "lower_bound": "AAFUMjM3NQAAAPw=", + "upper_bound": "AAFUMjM4NQAAAPw=", + "repeats": 50151 + }, + { + "count": 70120739, + "lower_bound": "AAFUMjM4NgAAAPw=", + "upper_bound": "AAFUMjQwMAAAAPw=", + "repeats": 172042 + }, + { + "count": 70373834, + "lower_bound": "AAFUMjQwMQAAAPw=", + "upper_bound": "AAFUMjQxNgAAAPw=", + "repeats": 387 + }, + { + "count": 70765494, + "lower_bound": "AAFUMjQxNwAAAPw=", + "upper_bound": "AAFUMjQzMwAAAPw=", + "repeats": 1430 + }, + { + "count": 71171435, + "lower_bound": "AAFUMjQzNAAAAPw=", + "upper_bound": "AAFUMjQ0NgAAAPw=", + "repeats": 2149 + }, + { + "count": 71485042, + "lower_bound": "AAFUMjQ0NwAAAPw=", + "upper_bound": "AAFUMjQ2MgAAAPw=", + "repeats": 21310 + }, + { + "count": 72010575, + "lower_bound": "AAFUMjQ2MwAAAPw=", + "upper_bound": "AAFUMjQ3OAAAAPw=", + "repeats": 5774 + }, + { + "count": 72211578, + "lower_bound": "AAFUMjQ3OQAAAPw=", + "upper_bound": "AAFUMjQ5NAAAAPw=", + "repeats": 3548 + }, + { + "count": 72220706, + "lower_bound": "AAFUMjQ5NQAAAPw=", + "upper_bound": "AAFUMjQ5NwAAAPw=", + "repeats": 768 + }, + { + "count": 72390530, + "lower_bound": "AAFUMjQ5OAAAAPw=", + "upper_bound": "AAFUMjUyOQAAAPw=", + "repeats": 5559 + }, + { + "count": 72868012, + "lower_bound": "AAFUMjUzMAAAAPw=", + "upper_bound": "AAFUMjU1NgAAAPw=", + "repeats": 38444 + }, + { + "count": 73149274, + "lower_bound": "AAFUMjU1NwAAAPw=", + "upper_bound": "AAFUMjU4OAAAAPw=", + "repeats": 3226 + }, + { + "count": 73380580, + "lower_bound": "AAFUMjU4OQAAAPw=", + "upper_bound": "AAFUMjYyMAAAAPw=", + "repeats": 2877 + }, + { + "count": 74133606, + "lower_bound": "AAFUMjYyMQAAAPw=", + "upper_bound": "AAFUMjY1MgAAAPw=", + "repeats": 174301 + }, + { + "count": 74302794, + "lower_bound": "AAFUMjY1MwAAAPw=", + "upper_bound": "AAFUMjY2OQAAAPw=", + "repeats": 9515 + }, + { + "count": 74800849, + "lower_bound": "AAFUMjY3MAAAAPw=", + "upper_bound": "AAFUMjY3MwAAAPw=", + "repeats": 287673 + }, + { + "count": 75150486, + "lower_bound": "AAFUMjY3NAAAAPw=", + "upper_bound": "AAFUMjcwNgAAAPw=", + "repeats": 159 + }, + { + "count": 75671378, + "lower_bound": "AAFUMjcwNwAAAPw=", + "upper_bound": "AAFUMjcyMwAAAPw=", + "repeats": 97497 + }, + { + "count": 76217090, + "lower_bound": "AAFUMjcyNAAAAPw=", + "upper_bound": "AAFUMjczOQAAAPw=", + "repeats": 1545 + }, + { + "count": 76459068, + "lower_bound": "AAFUMjc0MAAAAPw=", + "upper_bound": "AAFUMjc1NQAAAPw=", + "repeats": 33479 + }, + { + "count": 76594414, + "lower_bound": "AAFUMjc1NgAAAPw=", + "upper_bound": "AAFUMjc3MQAAAPw=", + "repeats": 27977 + }, + { + "count": 76768610, + "lower_bound": "AAFUMjc3MgAAAPw=", + "upper_bound": "AAFUMjc3MwAAAPw=", + "repeats": 33973 + }, + { + "count": 76943201, + "lower_bound": "AAFUMjc3NQAAAPw=", + "upper_bound": "AAFUMjgwNgAAAPw=", + "repeats": 17929 + }, + { + "count": 77546408, + "lower_bound": "AAFUMjgwNwAAAPw=", + "upper_bound": "AAFUMjgzNAAAAPw=", + "repeats": 101103 + }, + { + "count": 77780590, + "lower_bound": "AAFUMjgzNQAAAPw=", + "upper_bound": "AAFUMjg1MQAAAPw=", + "repeats": 5134 + }, + { + "count": 78465073, + "lower_bound": "AAFUMjg1MgAAAPw=", + "upper_bound": "AAFUMjg2NwAAAPw=", + "repeats": 5395 + }, + { + "count": 78630919, + "lower_bound": "AAFUMjg2OAAAAPw=", + "upper_bound": "AAFUMjg3MwAAAPw=", + "repeats": 107571 + }, + { + "count": 79134459, + "lower_bound": "AAFUMjg3NAAAAPw=", + "upper_bound": "AAFUMjkzNwAAAPw=", + "repeats": 5743 + }, + { + "count": 79553293, + "lower_bound": "AAFUMjkzOAAAAPw=", + "upper_bound": "AAFUMjk4NQAAAPw=", + "repeats": 4489 + }, + { + "count": 80050803, + "lower_bound": "AAFUMjk4NgAAAPw=", + "upper_bound": "AAFUMzExNQAAAPw=", + "repeats": 4482 + }, + { + "count": 80174592, + "lower_bound": "AAFUMzExNgAAAPw=", + "upper_bound": "AAFUMzEzOQAAAPw=", + "repeats": 6603 + }, + { + "count": 80321833, + "lower_bound": "AAFUMzE0MAAAAPw=", + "upper_bound": "AAFUMzIwMwAAAPw=", + "repeats": 10084 + }, + { + "count": 80528122, + "lower_bound": "AAFUMzIwNAAAAPw=", + "upper_bound": "AAFUMzI3MQAAAPw=", + "repeats": 231 + }, + { + "count": 81319416, + "lower_bound": "AAFUMzI3MgAAAPw=", + "upper_bound": "AAFUMzMzMAAAAPw=", + "repeats": 14727 + }, + { + "count": 81696220, + "lower_bound": "AAFUMzMzMQAAAPw=", + "upper_bound": "AAFUMzM2MwAAAPw=", + "repeats": 776 + }, + { + "count": 82032494, + "lower_bound": "AAFUMzM2NAAAAPw=", + "upper_bound": "AAFUMzM5NwAAAPw=", + "repeats": 9314 + }, + { + "count": 82151308, + "lower_bound": "AAFUMzM5OAAAAPw=", + "upper_bound": "AAFUMzQ1NAAAAPw=", + "repeats": 13222 + }, + { + "count": 82546748, + "lower_bound": "AAFUMzQ1NQAAAPw=", + "upper_bound": "AAFWMzIwNjkyM/8AAAAAAAAAAPc=", + "repeats": 21 + }, + { + "count": 82769256, + "lower_bound": "AAFWMzIyNjg3OP8AAAAAAAAAAPc=", + "upper_bound": "ATBhYzQwMTZk/2QwMTU0YjBl/zlkYjVhNzcz/zc3NjUxN2Uy/wAAAAAAAAAA9wFUMTUyNQAAAPw=", + "repeats": 1 + }, + { + "count": 83171355, + "lower_bound": "ATBhYzQwZDhl/zJiNzI0OWVj/2EwNTY3NjQw/zVlNWVmNTJl/wAAAAAAAAAA9wEyMDE2MDYwN/8yMTYxMTQAAP0=", + "upper_bound": "ATIxYTk0OGE4/2U2MTU0OGNi/2I5ODU0YjI2/zAxYzM3OWE1/wAAAAAAAAAA9wFUMjMyNQAAAPw=", + "repeats": 1 + }, + { + "count": 83288117, + "lower_bound": "ATIxYTk1MTNh/zgwYjM0MTFl/2E4MTcxMmY0/zJjODdjZmM5/wAAAAAAAAAA9wFUMTk4NgAAAPw=", + "upper_bound": "ATI3ZWE0MjMw/zYzNGY0OTFl/zkyOGRhNTE4/2I3YTYyODJi/wAAAAAAAAAA9wFUMTU5NgAAAPw=", + "repeats": 1 + }, + { + "count": 83727538, + "lower_bound": "ATI3ZWE0MmJm/zYyN2M0MzM5/zljNjNkOTQ0/zhjMGMxN2U5/wAAAAAAAAAA9wFUMjI5NgAAAPw=", + "upper_bound": "ATNlNGI5YmQ4/zY4ZmY0YWU2/2I0MjdkZGE0/2M4ZGUxZjNk/wAAAAAAAAAA9wFUMjU3MwAAAPw=", + "repeats": 4 + }, + { + "count": 83852399, + "lower_bound": "ATNlNGJhMjY0/zMzZDI0MzU1/2E1MDhlYjU3/zE2NjRlNDUx/wAAAAAAAAAA9wFUMTk0OQAAAPw=", + "upper_bound": "ATQ1OTYzMDUw/zUwNTY0NGEw/zg5MzViYTVk/zE5MGYxNjk1/wAAAAAAAAAA9wFRMTcwNDA3AP4=", + "repeats": 1 + }, + { + "count": 84290444, + "lower_bound": "ATQ1OTYzMTcy/zY5YmY0Y2Nm/zgwY2NhNTQw/zYwZDg2ZmRl/wAAAAAAAAAA9wFUMTUzMgAAAPw=", + "upper_bound": "ATVjODE4ZjIy/2E2YjQ0MTdl/zhiNjYyMjEw/2ExMTEwZmY5/wAAAAAAAAAA9wFUMTQ5NQAAAPw=", + "repeats": 993 + }, + { + "count": 84577674, + "lower_bound": "ATVjODE5NzA4/zM2MWM0NTk0/zk3NzM4OWI0/2UwZDZmZWUx/wAAAAAAAAAA9wFUMjY3NwAAAPw=", + "upper_bound": "ATZkMDRkOTcw/zU5YTY0MGE0/2FhNTViNWM0/2ZmYjAxMWQy/wAAAAAAAAAA9wFUMjU3OQAAAPw=", + "repeats": 1 + }, + { + "count": 84675179, + "lower_bound": "ATZkMDRkZWI1/2ExZmY0ZmVh/zk4MTAyMTVi/zk2NzY0MWU5/wAAAAAAAAAA9wFUMjI5MAAAAPw=", + "upper_bound": "ATcyMjViZTU3/zA1ZTA0Mjc1/zhjYmY1ZDZh/2NhZDA5NTAz/wAAAAAAAAAA9wFRMzY0NjQAAP0=", + "repeats": 1 + }, + { + "count": 85091099, + "lower_bound": "ATcyMjVlMzZh/zViZjY0NzM0/zhiMTMwOTZj/2FjZjQ0NzA4/wAAAAAAAAAA9wFUMjQ0NAAAAPw=", + "upper_bound": "ATg5NTBiMzA5/2I4NzA0YmM5/2JiZWE3NmE1/zVhYmNmNzA4/wAAAAAAAAAA9wFUMTQ5NQAAAPw=", + "repeats": 277 + }, + { + "count": 85382905, + "lower_bound": "ATg5NTBkYzRh/zI5NTM0YjZm/zgxMmVlNTc5/2I2MDAxYjk1/wAAAAAAAAAA9wExOAAAAAAAAPk=", + "upper_bound": "ATk5NmQ2ZjA1/zYwN2Y0MWQz/2JlNWVjOWYz/2UxNmEyNTJk/wAAAAAAAAAA9wFUMjY3MwAAAPw=", + "repeats": 1 + }, + { + "count": 85667606, + "lower_bound": "ATk5NmQ4MjFh/zFmN2M0OWU0/2I3OWI0NzFm/zIyZmZjOTcy/wAAAAAAAAAA9wFUMjg1MwAAAPw=", + "upper_bound": "AWE3ODdiODI4/2U2YjI0ODNm/2E4MzgxYjU5/zRkMWUwYzAw/wAAAAAAAAAA9wFUMTQ5NQAAAPw=", + "repeats": 707 + }, + { + "count": 85890224, + "lower_bound": "AWE3ODdiZTI1/2EzNGE0YzZk/2JkODU5NTVl/zNmNDAwZmRk/wAAAAAAAAAA9wFUMzM4MQAAAPw=", + "upper_bound": "AWIyNzhmNmZl/2YxZjE0NzFm/2I0MzljNjZi/zQ0ODA3MmJk/wAAAAAAAAAA9wFUMjQ3NAAAAPw=", + "repeats": 1 + }, + { + "count": 86319875, + "lower_bound": "AWIyNzkwZGI5/zE5NmQ0NGZk/zhhNzM0NzFh/zhlNjk2MmI2/wAAAAAAAAAA9wFUMTI5NwAAAPw=", + "upper_bound": "AWM3OTJlY2Fh/zUxNmY0NWU0/2I1ZWE0ZGNl/2IwNzBkZTRh/wAAAAAAAAAA9wFUMTQ5NQAAAPw=", + "repeats": 708 + }, + { + "count": 86496103, + "lower_bound": "AWM3OTJmMzVi/2ZjNDM0N2Yx/2EyMDA0ZDA0/2ZiYjU3YmZk/wAAAAAAAAAA9wFUMjg3NwAAAPw=", + "upper_bound": "AWQxYjI2YjJl/2JhZWY0YmQy/zk2OTJlNzQ0/zc0OTkwOGVk/wAAAAAAAAAA9wFRMTAyODMAAP0=", + "repeats": 1 + }, + { + "count": 86914096, + "lower_bound": "AWQxYjI4NDU0/zU2ZmY0MjU5/zg4YjIyOGY1/zg5ODU1ZTE1/wAAAAAAAAAA9wEyMDE3MTEyMf8zMDU5MjQAAP0=", + "upper_bound": "AWU3ZmU2MmJm/2RiYmM0ZGQ2/zlmMGMzNmRi/zE2ZjM4MmYy/wAAAAAAAAAA9wFUMTgyMAAAAPw=", + "repeats": 79 + }, + { + "count": 87225906, + "lower_bound": "AWU3ZmU3MDFi/zkxZDU0MjY0/2JiMjg3Yjhk/zkyNzg5MDli/wAAAAAAAAAA9wFUMTU4NgAAAPw=", + "upper_bound": "AWY3NTQ2ZjQy/zA4MWY0YmU4/zlhODhkZTVi/2EwMDUzNjVi/wAAAAAAAAAA9wFUMTQ5NQAAAPw=", + "repeats": 616 + }, + { + "count": 87400037, + "lower_bound": "AWY3NTQ3Yjk2/zc0MzU0Zjc3/2EwYzE1MDc4/2QwMzAyNWZi/wAAAAAAAAAA9wEyMDE2MDYwN/8yMTYxMTQAAP0=", + "upper_bound": "AWZmZmZmOWE4/zI5OGI0ZGIy/zk2YzIwMDA5/2U1YTNlOTNl/wAAAAAAAAAA9wFUMTk4NgAAAPw=", + "repeats": 1 + } + ] + }, + "cm_sketch": { + "rows": [ + { + "counters": [ + 14069, + 8269, + 47022, + 7561, + 11571, + 37235, + 7135, + 5075, + 66438, + 20261, + 7614, + 27915, + 9339, + 21314, + 3396, + 9985, + 295487, + 8197, + 4890, + 13236, + 8936, + 17342, + 25562, + 20212, + 165119, + 6463, + 11640, + 19293, + 36256, + 7895, + 17939, + 9106, + 88859, + 16528, + 10451, + 16922, + 1535032, + 18136, + 4385, + 6430, + 100170, + 6889, + 7299, + 9315, + 8943, + 75381, + 10936, + 4699, + 166008, + 4598, + 14012, + 165623, + 4065, + 7744, + 32675, + 7681, + 13369, + 79554, + 11031, + 34648, + 36037, + 4195, + 15815, + 5854, + 2959, + 10905, + 8057, + 85491, + 40946, + 55679, + 37835, + 7695, + 8815, + 192160, + 7457, + 39360, + 9871, + 19841, + 30171, + 5988, + 18758, + 27706, + 48961, + 10418, + 21295, + 26727, + 151063, + 19799, + 18992, + 20777, + 6837, + 61019, + 4539, + 3130, + 5920, + 5124, + 32291, + 27325, + 8541, + 8873, + 8581, + 335385, + 12028, + 5126, + 6471, + 52866, + 9780, + 4095, + 36283, + 129852, + 20645, + 73841, + 11540, + 48498, + 6321, + 2864, + 8204, + 29825, + 3937, + 8103, + 84631, + 51894, + 30248, + 57719, + 50241, + 6074, + 6862, + 117466, + 5960, + 60470, + 8551, + 10814, + 190799, + 25363, + 19875, + 7733, + 190211, + 16776, + 143921, + 75307, + 11074, + 33206, + 54789, + 62647, + 15366, + 28870, + 9360, + 13136, + 5240, + 16052, + 57861, + 10080, + 41297, + 38039, + 8429, + 12696, + 8955, + 18393, + 6892, + 183057, + 40944, + 6229, + 13756, + 35190, + 8654, + 11641, + 11547, + 13270, + 8430, + 59968, + 5191, + 30426, + 16219, + 85958, + 14511, + 8707, + 19455, + 6516, + 14354, + 5649, + 185934, + 29635, + 12222, + 16284, + 12949, + 11417, + 45442, + 4381, + 43967, + 14073, + 3833, + 8388, + 131125, + 118558, + 3559, + 16924, + 47261, + 32156, + 35713, + 13838, + 9025, + 43714, + 7349, + 12798, + 18816, + 57146, + 5249, + 17253, + 9752, + 8399, + 166972, + 95971, + 39875, + 40144, + 60175, + 63956, + 21486, + 11920, + 15950, + 83200, + 29840, + 7069, + 5928, + 34868, + 14902, + 7540, + 10699, + 6353, + 19551, + 90215, + 17124, + 15311, + 5584, + 30427, + 23334, + 13288, + 6571, + 13519, + 104776, + 8806, + 25662, + 58740, + 7077, + 209335, + 20055, + 12978, + 10165, + 250146, + 5294, + 26403, + 73800, + 26964, + 43714, + 45425, + 60400, + 299511, + 6747, + 19882, + 9816, + 5519, + 38989, + 4077, + 26223, + 22555, + 189468, + 44062, + 150037, + 5319, + 404755, + 26056, + 16628, + 74973, + 87911, + 15118, + 11860, + 20335, + 8456, + 54699, + 11658, + 18712, + 8570, + 34662, + 28872, + 162736, + 11524, + 25574, + 4147, + 88498, + 6459, + 49066, + 17843, + 264896, + 7412, + 178563, + 6597, + 10027, + 14404, + 5532, + 10069, + 23660, + 13331, + 31683, + 8829, + 136210, + 87744, + 16324, + 13554, + 33361, + 9573, + 14399, + 44736, + 11338, + 35932, + 26457, + 17897, + 8029, + 121610, + 9008, + 15021, + 5566, + 14380, + 117446, + 5103, + 7071, + 23549, + 21340, + 7042, + 7903, + 20166, + 11558, + 46821, + 61000, + 25221, + 384747, + 30124, + 34263, + 10056, + 7467, + 11869, + 7397, + 57215, + 24712, + 5431, + 21609, + 208218, + 13683, + 5030, + 534039, + 41354, + 5350, + 128808, + 18884, + 4509, + 9390, + 15575, + 22826, + 71490, + 6464, + 8669, + 64079, + 8391, + 11088, + 15942, + 53327, + 87668, + 9040, + 119832, + 20241, + 5763, + 5946, + 58684, + 89367, + 4371, + 8317, + 30030, + 13721, + 87555, + 27655, + 6089, + 6052, + 11500, + 4480, + 19221, + 6777, + 13341, + 8748, + 4444, + 10283, + 13925, + 4816, + 11775, + 4104, + 26387, + 12674, + 58232, + 6291, + 10640, + 41864, + 16290, + 3860, + 35124, + 193839, + 124940, + 20313, + 72920, + 28329, + 11113, + 15806, + 27391, + 9375, + 10412, + 9560, + 5759, + 14260, + 7070, + 3548, + 18685, + 11751, + 8689, + 41299, + 56390, + 18346, + 13445, + 14216, + 17091, + 23097, + 33869, + 15237, + 5423, + 4268, + 39588, + 78403, + 10612, + 47770, + 8482, + 10949, + 53868, + 5020, + 6940, + 40573, + 155923, + 14352, + 76609, + 10731, + 13754, + 11848, + 7215, + 123644, + 20199, + 23149, + 4844, + 2573, + 28985, + 4978, + 24578, + 15857, + 35269, + 13736, + 4870, + 21393, + 5603, + 16890, + 59753, + 5706, + 7911, + 249450, + 2213, + 11668, + 90032, + 102186, + 10228, + 9774, + 42336, + 17294, + 119078, + 18158, + 19444, + 10971, + 12996, + 43686, + 10802, + 7042, + 16104, + 14109, + 65530, + 7787, + 7354, + 8667, + 24428, + 128521, + 6247, + 7116, + 97613, + 67145, + 47117, + 25364, + 7472, + 5368, + 283770, + 53234, + 4619, + 22439, + 10596, + 18196, + 11569, + 18238, + 120539, + 55972, + 4376, + 16240, + 40083, + 8861, + 13726, + 6374, + 19228, + 40026, + 54642, + 18822, + 609489, + 38421, + 21200, + 15487, + 9183, + 35488, + 96872, + 88280, + 7801, + 16741, + 11530, + 5456, + 40786, + 7725, + 10351, + 9796, + 151438, + 11656, + 16545, + 9396, + 20179, + 89538, + 6168, + 28294, + 16708, + 197373, + 19591, + 8801, + 14785, + 5819, + 12195, + 7815, + 7627, + 10399, + 7381, + 10503, + 47755, + 5533, + 166092, + 10258, + 6332, + 22219, + 4782, + 43150, + 23847, + 4817, + 16490, + 11335, + 21132, + 9549, + 8603, + 8361, + 4234, + 7916, + 47818, + 8632, + 6052, + 27065, + 8034, + 11557, + 22173, + 257959, + 73728, + 48112, + 10635, + 4477, + 67922, + 14605, + 11322, + 29637, + 17347, + 91021, + 6137, + 4690, + 6519, + 40999, + 6921, + 9550, + 13408, + 23441, + 7954, + 5292, + 9344, + 23655, + 35346, + 67047, + 40542, + 9273, + 13296, + 8671, + 140035, + 8728, + 48754, + 13186, + 8621, + 283057, + 48422, + 4701, + 7752, + 11946, + 7088, + 7571, + 6996, + 9806, + 24707, + 24939, + 6526, + 16953, + 9724, + 3881, + 370321, + 10413, + 7663, + 5288, + 9796, + 7296, + 35497, + 5318, + 14629, + 128893, + 8347, + 8140, + 20311, + 3555, + 126162, + 19389, + 17613, + 10239, + 13614, + 14403, + 11740, + 14121, + 181643, + 3231, + 15742, + 38895, + 4842, + 16035, + 5229, + 234394, + 61266, + 6370, + 11588, + 11427, + 82998, + 161402, + 15044, + 6354, + 11247, + 7275, + 66508, + 8978, + 15905, + 60884, + 43399, + 25648, + 6177, + 13096, + 16222, + 1908537, + 70412, + 20913, + 8066, + 26806, + 5578, + 11222, + 11332, + 29248, + 50954, + 18533, + 8043, + 6481, + 5543, + 72539, + 5442, + 4766, + 62966, + 4936, + 133239, + 4857, + 190763, + 149612, + 5079, + 28680, + 11649, + 18078, + 23758, + 5749, + 77727, + 10813, + 44850, + 21395, + 8171, + 22853, + 33563, + 592342, + 6636, + 34392, + 22005, + 291588, + 10864, + 6139, + 12916, + 24648, + 10956, + 118414, + 11805, + 7375, + 26560, + 7764, + 58100, + 9136, + 213400, + 9249, + 133747, + 68864, + 36431, + 107959, + 5819, + 43392, + 40209, + 6184, + 16004, + 10900, + 18227, + 11631, + 26101, + 10554, + 84373, + 99393, + 16613, + 4910, + 9179, + 6614, + 28887, + 6119, + 117988, + 19125, + 13431, + 69277, + 48129, + 13398, + 16080, + 8440, + 158141, + 18157, + 237685, + 5230, + 6533, + 5893, + 12648, + 11819, + 20961, + 24168, + 15960, + 3290, + 3690, + 7078, + 5459, + 19713, + 9227, + 8439, + 6249, + 21022, + 6116, + 5991, + 326702, + 6994, + 6671, + 15170, + 9943, + 4802, + 11398, + 37462, + 12745, + 15411, + 327884, + 3863, + 31085, + 63692, + 8830, + 937657, + 8727, + 4311, + 7673, + 3513, + 36861, + 28712, + 22565, + 17191, + 11442, + 8413, + 27557, + 13591, + 6214, + 18742, + 20270, + 34306, + 36791, + 9928, + 29051, + 28961, + 13961, + 4745, + 22499, + 6604, + 64065, + 10875, + 14972, + 9810, + 31797, + 13096, + 8271, + 4489, + 11150, + 59963, + 28065, + 5928, + 6741, + 6668, + 39719, + 36860, + 37071, + 20392, + 49744, + 10275, + 7489, + 6618, + 23953, + 6197, + 5699, + 18459, + 11105, + 10841, + 8488, + 10798, + 19853, + 19763, + 10311, + 11022, + 20310, + 14456, + 11113, + 4533, + 4633, + 13712, + 9478, + 11039, + 7377, + 13602, + 13818, + 26763, + 9545, + 100482, + 14159, + 95013, + 27552, + 5967, + 9299, + 27115, + 9592, + 12828, + 5277, + 5143, + 21335, + 15497, + 13057, + 11356, + 347806, + 210260, + 34767, + 10518, + 13871, + 12044, + 107097, + 7373, + 7070, + 11360, + 30117, + 25578, + 6196, + 10594, + 6239, + 63390, + 156551, + 42712, + 4069, + 13602, + 18954, + 21285, + 6150, + 11877, + 8857, + 21899, + 250493, + 57429, + 13256, + 208281, + 6706, + 76038, + 146548, + 9899, + 58516, + 9981, + 20960, + 8620, + 32326, + 79142, + 5495, + 14771, + 236419, + 3457, + 5216, + 22276, + 25329, + 6485, + 13046, + 7592, + 17454, + 10878, + 77877, + 4132, + 64907, + 13942, + 328162, + 11444, + 17250, + 102236, + 8693, + 4681, + 11725, + 15093, + 22980, + 11144, + 16608, + 135713, + 125397, + 9483, + 440766, + 7478, + 9584, + 9344, + 12020, + 11498, + 126465, + 5529, + 22063, + 12541, + 8328, + 9395, + 68800, + 3138, + 16182, + 5747, + 25424, + 12531, + 2977, + 20789, + 8238, + 39751, + 20873, + 124231, + 47115, + 108957, + 38508, + 175032, + 17387, + 9195, + 6919, + 18201, + 3729, + 188130, + 29254, + 11321, + 168698, + 73886, + 5430, + 7130, + 9059, + 145002, + 6778, + 11908, + 4485, + 7519, + 146948, + 40419, + 3040, + 24133, + 14372, + 24925, + 11574, + 20510, + 8087, + 32033, + 6507, + 20371, + 151903, + 18911, + 9476, + 73912, + 8810, + 8133, + 28257, + 44765, + 5100, + 10767, + 4171, + 7771, + 11562, + 13145, + 4638, + 7531, + 7232, + 59071, + 38656, + 26528, + 22170, + 10154, + 5101, + 4360, + 24998, + 10538, + 13237, + 5865, + 19785, + 6729, + 275090, + 7115, + 19293, + 62245, + 17391, + 5586, + 14474, + 16842, + 9566, + 103695, + 259889, + 212672, + 23290, + 27306, + 162287, + 76203, + 8579, + 195343, + 49269, + 456373, + 50868, + 40122, + 74717, + 25405, + 16811, + 10108, + 56603, + 116663, + 17443, + 12082, + 10357, + 35392, + 13281, + 19568, + 52606, + 29170, + 51909, + 45288, + 20064, + 8821, + 8349, + 8592, + 67641, + 30426, + 16554, + 23431, + 9538, + 8978, + 44563, + 7929, + 63315, + 7127, + 270414, + 12992, + 162731, + 47124, + 2971, + 8668, + 116201, + 206994, + 61716, + 31833, + 6192, + 8761, + 70387, + 6045, + 44033, + 23186, + 6959, + 13453, + 5568, + 6724, + 12555, + 10247, + 7038, + 12214, + 32809, + 17448, + 4927, + 5108, + 10082, + 8365, + 31168, + 17093, + 24381, + 9019, + 38920, + 15247, + 13523, + 11051, + 16512, + 298573, + 6873, + 10266, + 15647, + 147849, + 7630, + 30764, + 31789, + 68173, + 6543, + 6845, + 36338, + 25367, + 5129, + 10769, + 24368, + 31583, + 4124, + 66727, + 6650, + 19495, + 8370, + 9298, + 9727, + 60269, + 74414, + 12997, + 5409, + 47197, + 12880, + 8495, + 5432, + 30252, + 7227, + 9795, + 37133, + 6059, + 62022, + 4290, + 9943, + 12046, + 17125, + 7983, + 45429, + 10089, + 3986, + 9826, + 17336, + 13766, + 36974, + 10031, + 17489, + 17140, + 9684, + 8735, + 12829, + 224311, + 14479, + 12320, + 35116, + 6955, + 8712, + 5258, + 16201, + 41629, + 10733, + 90051, + 26322, + 7457, + 7473, + 94583, + 142531, + 7467, + 336336, + 5486, + 65720, + 141784, + 14236, + 39517, + 32834, + 27163, + 10831, + 149676, + 168473, + 6180, + 11182, + 34783, + 18340, + 10492, + 6754, + 5786, + 27290, + 158531, + 7830, + 20410, + 30584, + 29592, + 46003, + 34366, + 9463, + 23999, + 4662, + 23048, + 19932, + 18783, + 4240, + 29378, + 182390, + 7473, + 111551, + 47354, + 10356, + 37039, + 81674, + 25302, + 24753, + 184601, + 7175, + 165698, + 17835, + 5988, + 10139, + 30463, + 295756, + 6386, + 9390, + 11336, + 8271, + 4717, + 9558, + 22680, + 40584, + 22451, + 63971, + 14535, + 270796, + 21572, + 12656, + 52337, + 5626, + 12621, + 8445, + 9536, + 4010, + 40274, + 18944, + 6082, + 8869, + 48212, + 5044, + 31068, + 14287, + 5604, + 13095, + 17616, + 68461, + 11266, + 16577, + 76842, + 31295, + 10327, + 8483, + 12124, + 80582, + 18948, + 11176, + 29794, + 4984, + 14034, + 6147, + 6903, + 12340, + 25304, + 6489, + 8343, + 29359, + 189386, + 17712, + 5692, + 56891, + 16807, + 25326, + 9523, + 6041, + 48149, + 33558, + 40734, + 6883, + 29010, + 337296, + 6650, + 87106, + 160389, + 10448, + 57211, + 8678, + 5679, + 11621, + 9301, + 8556, + 15697, + 41228, + 10456, + 7034, + 110059, + 150708, + 35587, + 17899, + 13093, + 21385, + 15168, + 42789, + 12850, + 6557, + 7587, + 10828, + 11873, + 5674, + 11478, + 8671, + 6730, + 11501, + 25680, + 63424, + 6410, + 1581459, + 53301, + 11376, + 5132, + 23895, + 5624, + 7355, + 30013, + 7376, + 14894, + 7016, + 8167, + 9726, + 96448, + 18810, + 5613, + 5592, + 16089, + 11982, + 7401, + 19339, + 6151, + 200558, + 115782, + 4291, + 5594, + 11122, + 15149, + 35099, + 53924, + 2956, + 11849, + 16355, + 14270, + 79407, + 14917, + 15364, + 62739, + 6005, + 627318, + 11217, + 167320, + 22325, + 75661, + 40644, + 16442, + 4750, + 13302, + 9914, + 5656, + 5785, + 8527, + 312548, + 6559, + 6093, + 5054, + 19805, + 15931, + 6198, + 3957, + 11044, + 63473, + 155459, + 7253, + 9966, + 270857, + 18501, + 38240, + 7599, + 14824, + 30674, + 12829, + 6122, + 3539, + 10925, + 263842, + 9611, + 13016, + 7902, + 7639, + 45548, + 12357, + 23523, + 34299, + 19668, + 14865, + 6677, + 26566, + 14986, + 4870, + 8603, + 11734, + 8117, + 32134, + 162834, + 28932, + 41162, + 5903, + 38430, + 48182, + 6279, + 27914, + 7202, + 108665, + 41136, + 30647, + 28422, + 5061, + 9663, + 7317, + 17317, + 6068, + 86518, + 17960, + 34452, + 15406, + 17272, + 7096, + 41443, + 9482, + 8962, + 4186, + 4325880, + 27914, + 8486, + 6577, + 9759, + 22470, + 9770, + 5853, + 8940, + 4131, + 11899, + 14735, + 28681, + 24530, + 12739, + 50333, + 15265, + 13715, + 6869, + 13947, + 102082, + 195020, + 56462, + 8547, + 15846, + 8717, + 13529, + 5262, + 18511, + 26393, + 6139, + 12643, + 14153, + 39779, + 39148, + 9825, + 28048, + 6496, + 7086, + 24043, + 126060, + 11776, + 150715, + 48061, + 12863, + 25338, + 97916, + 4801, + 6282, + 12144, + 94575, + 5560, + 6235, + 8278, + 93429, + 93036, + 53980, + 172232, + 8167, + 18043, + 9179, + 9215, + 29974, + 13297, + 27115, + 27014, + 66589, + 51408, + 13561, + 10878, + 127182, + 34547, + 60843, + 94884, + 13153, + 10598, + 26462, + 9071, + 64120, + 68430, + 17679, + 62221, + 309428, + 15680, + 10231, + 6915, + 3712, + 47922, + 12857, + 13849, + 9025, + 77191, + 22677, + 8384, + 13014, + 4544, + 6623, + 10537, + 8546, + 8846, + 28164, + 7107, + 15173, + 3949, + 11966, + 22890, + 9683, + 218441, + 72501, + 11370, + 10601, + 6249, + 13135, + 22491, + 10644, + 33875, + 22099, + 13496, + 5330, + 44711, + 22205, + 28856, + 9914, + 7947, + 406331, + 272057, + 68213, + 50794, + 18838, + 24662, + 12142, + 29263, + 7214, + 84578, + 15280, + 33333, + 16889, + 85503, + 19210, + 12304, + 46934, + 49080, + 188433, + 42184, + 13934, + 21148, + 13484, + 5255, + 278687, + 203970, + 12607, + 7097, + 3750, + 6799, + 169330, + 3421, + 22445, + 8645, + 205836, + 4296, + 22211, + 166453, + 65545, + 20621, + 12424, + 5844, + 25489, + 12347, + 7960, + 7399, + 33767, + 10464, + 9320, + 7763, + 7440, + 6370, + 35733, + 6059, + 31087, + 40300, + 17261, + 23892, + 47034, + 5814, + 275511, + 5948, + 30830, + 63926, + 7995, + 101917, + 13529, + 20670, + 6335, + 13315, + 7348, + 61395, + 39858, + 12823, + 37086, + 12588, + 159408, + 35296, + 18491, + 38682, + 9771, + 6792, + 12087, + 8587, + 54856, + 78128, + 62214, + 10718, + 13766, + 17371, + 20431, + 39196, + 8799, + 5273, + 37474, + 7206, + 20590, + 4693, + 42918, + 10945, + 26020, + 7213, + 76256, + 35629, + 3525, + 15853, + 450121, + 20943, + 9158, + 7863, + 12848, + 7162, + 12885, + 5522, + 9211, + 5320, + 8690, + 17245, + 32718, + 6150, + 4874, + 36814, + 42981, + 7181, + 8660, + 8155, + 6315, + 6008, + 30997, + 3419, + 8080, + 10844, + 133636, + 5780, + 19799, + 9585, + 7239, + 11192, + 4499, + 84662, + 8124, + 15175, + 6969, + 164855, + 13761, + 6965, + 63590, + 8232, + 86965, + 6523, + 41963, + 7444, + 18196, + 77122, + 7330, + 11036, + 7912, + 13920, + 5414, + 107385, + 21275, + 46901, + 12717, + 4815, + 10533, + 72617, + 108231, + 9786, + 12895, + 20984, + 261153, + 80714, + 20474, + 10695, + 216041, + 46153, + 13944, + 18851, + 9264, + 7493, + 9111, + 13955, + 13030, + 31980, + 6438, + 11087, + 13913, + 9436, + 31178, + 10271, + 3367, + 5447, + 18405, + 15534, + 16863, + 19140, + 5879, + 6595, + 20444, + 50613, + 10174, + 9324, + 15778, + 7160, + 6116, + 5967, + 12111, + 165566, + 7220, + 219605, + 25485, + 22501, + 133865, + 44123, + 15971, + 10458, + 103448, + 10391, + 42021, + 33340, + 21981, + 7045, + 24689, + 5089, + 169010, + 18251, + 7031, + 9208, + 8221, + 6944, + 354956, + 42910, + 20748, + 64256, + 27442, + 11664, + 10365, + 220120, + 1257838, + 65958, + 4811, + 7629, + 5516, + 16144, + 23622, + 6605, + 25458, + 5629, + 24702, + 7729, + 5204, + 16391, + 28940, + 11270, + 90165, + 7503, + 7317, + 6841, + 5522, + 12348, + 9226, + 150120, + 10996, + 21126, + 138265, + 10113, + 7476, + 8965, + 133734, + 16761, + 18832, + 86078, + 16651, + 11610, + 99752, + 73911, + 6243, + 8714, + 6066, + 10715, + 44757, + 9856, + 16159, + 7717, + 11910, + 10307, + 82767, + 62857, + 10330, + 16303, + 7736, + 56448, + 29612, + 6909, + 4504, + 4549, + 9704, + 16978, + 60605, + 12629, + 94915, + 13709, + 22189, + 8778, + 9808, + 52737, + 109803, + 7386, + 4729, + 9912, + 32525, + 16015, + 2770, + 11043, + 6395, + 19725, + 8593, + 18350, + 19255, + 13891, + 19682, + 15595, + 29950, + 3484, + 29250, + 11769, + 29898, + 167895, + 276745, + 49594, + 4407, + 7604, + 19242, + 32266, + 7851, + 6110, + 177559, + 12273, + 7651, + 22873, + 4479, + 6609, + 14297, + 5064, + 5435, + 66461, + 20961, + 91113, + 18497, + 13634, + 6154, + 14950, + 8788, + 13924, + 15844, + 11287, + 5629, + 14200, + 5772, + 12382, + 10320, + 13059, + 54274, + 69281, + 27497, + 147556, + 6923, + 7163, + 7198, + 1935672, + 124061, + 22658, + 15773, + 9563, + 21290, + 42651, + 8170, + 18807, + 15602, + 5382, + 34419, + 8640, + 12042, + 16400, + 6219, + 81056, + 3010, + 13834, + 14062, + 11531, + 9468, + 5429, + 128561, + 5431, + 8344, + 3260, + 8107, + 35996, + 299440, + 26362, + 7140, + 12524, + 14814, + 7604, + 7804, + 15196, + 62647, + 10164, + 48503, + 30136, + 24267, + 84096, + 7184, + 6389, + 9240, + 23078, + 43081, + 123722, + 38145, + 89830, + 11061, + 10241, + 5933, + 11231, + 23136, + 10997, + 47737, + 10122, + 16396, + 11634, + 16840, + 29125, + 3758, + 19630, + 22723, + 6928, + 9963, + 8399, + 30367, + 20515, + 20634, + 8967 + ] + }, + { + "counters": [ + 5739, + 206134, + 18552, + 274905, + 7041, + 12702, + 9321, + 5132, + 5804, + 89440, + 5061, + 26085, + 11622, + 307189, + 125163, + 172490, + 22387, + 1862910, + 10112, + 10265, + 21301, + 4608, + 14717, + 5517, + 6859, + 11834, + 279525, + 25236, + 29622, + 8426, + 4315, + 20224, + 15241, + 20346, + 6017, + 7915, + 52518, + 14073, + 16778, + 53977, + 14941, + 13424, + 4187, + 32496, + 8909, + 45903, + 3179, + 30781, + 13492, + 18518, + 29724, + 10508, + 16244, + 134765, + 4632, + 4255, + 15219, + 7126, + 4292812, + 48211, + 30204, + 14612, + 5767, + 7849, + 19640, + 12348, + 7746, + 56939, + 22076, + 67767, + 16088, + 24976, + 16009, + 26898, + 29543, + 16481, + 14716, + 19577, + 32539, + 97126, + 19038, + 28797, + 39847, + 11786, + 10156, + 152572, + 11846, + 34369, + 8932, + 55136, + 20060, + 4910, + 7356, + 3640, + 139825, + 11797, + 26592, + 68526, + 5810, + 6055, + 23090, + 10244, + 7718, + 22535, + 615753, + 6818, + 32107, + 12728, + 66867, + 175423, + 4883, + 6664, + 10435, + 22629, + 7465, + 115400, + 18001, + 26963, + 49206, + 16976, + 16850, + 12586, + 70994, + 5938, + 3767, + 3393, + 260617, + 26827, + 14103, + 54090, + 49723, + 3459, + 9652, + 105552, + 39866, + 14073, + 7761, + 21939, + 150422, + 8192, + 22400, + 6694, + 17340, + 9076, + 56041, + 5013, + 9841, + 10067, + 17802, + 223264, + 7696, + 14685, + 9326, + 6646, + 12837, + 48840, + 16603, + 10504, + 14663, + 27478, + 32359, + 4973, + 5354, + 38274, + 2781, + 7840, + 5897, + 5690, + 14039, + 11893, + 10721, + 33362, + 13049, + 35869, + 3290, + 17284, + 197317, + 10297, + 178204, + 13468, + 8398, + 12728, + 24624, + 24122, + 21081, + 82270, + 7530, + 32423, + 23444, + 10665, + 7526, + 12110, + 18267, + 86425, + 7668, + 6553, + 103179, + 18802, + 16934, + 5924, + 7875, + 8825, + 11622, + 10008, + 23907, + 6676, + 76523, + 15702, + 5444, + 141770, + 6883, + 18558, + 39328, + 18865, + 14587, + 23782, + 20916, + 27958, + 19631, + 28340, + 13062, + 19058, + 42265, + 22669, + 3409, + 29625, + 26389, + 27082, + 4517, + 6606, + 17275, + 10327, + 341135, + 13964, + 5151, + 10213, + 30015, + 33851, + 24197, + 9327, + 15410, + 47986, + 11706, + 17171, + 202080, + 9254, + 175872, + 5700, + 8112, + 15876, + 10710, + 10660, + 17222, + 28553, + 3718, + 4894, + 11102, + 6300, + 48723, + 17015, + 7452, + 13266, + 8284, + 15455, + 9000, + 30327, + 13578, + 6489, + 9536, + 108349, + 14746, + 40862, + 10580, + 4897, + 5369, + 281959, + 3733, + 88187, + 26784, + 79962, + 4400, + 1273491, + 18987, + 167489, + 8915, + 15462, + 5490, + 12030, + 33219, + 10625, + 112032, + 23562, + 6271, + 7907, + 5296, + 6967, + 10920, + 6783, + 15254, + 23653, + 20617, + 21820, + 5253, + 8935, + 7113, + 9731, + 6920, + 17010, + 6729, + 49732, + 169012, + 10525, + 5469, + 4805, + 7568, + 20587, + 36061, + 218173, + 14164, + 10530, + 6331, + 22577, + 381453, + 3880, + 19462, + 62185, + 12370, + 10320, + 20069, + 369613, + 87024, + 55043, + 174664, + 17282, + 13281, + 12682, + 33584, + 24308, + 11906, + 90920, + 14216, + 7832, + 8203, + 10999, + 20208, + 14657, + 33154, + 86050, + 47746, + 20372, + 17085, + 7130, + 6015, + 14431, + 69993, + 191856, + 6821, + 22628, + 74211, + 14453, + 24604, + 27313, + 9090, + 25862, + 48313, + 44574, + 14870, + 12145, + 6429, + 52074, + 4964, + 7421, + 7274, + 5469, + 95507, + 12985, + 12164, + 73904, + 9513, + 2392, + 18512, + 37971, + 9535, + 11549, + 5571, + 140189, + 13282, + 88800, + 219577, + 47640, + 6268, + 10982, + 10705, + 88616, + 66050, + 34225, + 15247, + 35076, + 12445, + 10739, + 17124, + 13252, + 25024, + 8319, + 122426, + 14428, + 56938, + 7159, + 4232, + 14228, + 10223, + 9158, + 61529, + 14853, + 25247, + 17739, + 31158, + 11333, + 14724, + 80334, + 9708, + 5276, + 6093, + 8157, + 11731, + 51818, + 5998, + 16239, + 7058, + 9570, + 55355, + 16257, + 23107, + 14175, + 62844, + 10454, + 6717, + 76818, + 9578, + 33523, + 7038, + 12811, + 13654, + 8747, + 7612, + 8368, + 85785, + 6746, + 11351, + 27905, + 8406, + 90722, + 12428, + 204369, + 12555, + 20482, + 67209, + 4721, + 29876, + 6377, + 5895, + 7464, + 5047, + 5162, + 25467, + 12850, + 5330, + 11348, + 41065, + 4016, + 124572, + 109567, + 10461, + 8797, + 6401, + 8661, + 8547, + 5863, + 5709, + 11295, + 6172, + 4733, + 6046, + 3272, + 32884, + 210248, + 78301, + 8134, + 3017, + 6321, + 157205, + 33422, + 61571, + 16400, + 16510, + 17342, + 101460, + 8198, + 47261, + 24996, + 9804, + 20441, + 169344, + 68346, + 23497, + 10005, + 31612, + 11938, + 10871, + 28053, + 8274, + 8402, + 9230, + 109830, + 104045, + 10056, + 6982, + 258402, + 5912, + 9064, + 56934, + 44897, + 14795, + 16326, + 11947, + 4854, + 10989, + 20700, + 70562, + 23112, + 72724, + 21742, + 9350, + 135589, + 11104, + 6411, + 1895151, + 11415, + 8722, + 20274, + 25258, + 21822, + 26897, + 18985, + 27047, + 21338, + 97505, + 61591, + 32139, + 299975, + 7441, + 13005, + 3685, + 36532, + 7883, + 5605, + 59928, + 19572, + 11093, + 4483, + 39503, + 10323, + 111665, + 265719, + 14901, + 6052, + 6787, + 25442, + 43303, + 7682, + 9157, + 15435, + 57563, + 5370, + 54159, + 49559, + 42527, + 15134, + 6747, + 7758, + 5895, + 8877, + 34254, + 13619, + 6084, + 26088, + 5710, + 8539, + 20124, + 24841, + 5214, + 8675, + 3957, + 9915, + 55680, + 8701, + 11903, + 5936, + 14387, + 39612, + 27119, + 38797, + 10212, + 96404, + 35884, + 32409, + 7390, + 34311, + 46461, + 6742, + 41133, + 18193, + 12058, + 5027, + 8455, + 6297, + 7051, + 7644, + 6906, + 6114, + 8597, + 12652, + 61175, + 8138, + 6241, + 14130, + 6662, + 14381, + 16235, + 8644, + 10788, + 293907, + 20785, + 157224, + 7566, + 6934, + 48579, + 14774, + 37716, + 4986, + 15018, + 9917, + 164600, + 6982, + 206068, + 60477, + 11825, + 166908, + 5174, + 8852, + 34831, + 12625, + 35896, + 10628, + 286747, + 8876, + 19842, + 17219, + 16688, + 31654, + 5910, + 14303, + 163632, + 280651, + 8782, + 7849, + 33533, + 17359, + 7403, + 4161, + 26575, + 42807, + 50801, + 21514, + 5931, + 39413, + 5277, + 17018, + 14972, + 79153, + 76525, + 16463, + 128585, + 27555, + 13204, + 42391, + 63202, + 16984, + 19760, + 26276, + 68714, + 7991, + 21987, + 4604, + 33769, + 3634, + 7060, + 28468, + 26322, + 16212, + 4552, + 32973, + 28672, + 92222, + 16986, + 19087, + 41490, + 6939, + 6186, + 9316, + 22474, + 12578, + 14566, + 80214, + 24599, + 309198, + 8077, + 9458, + 8417, + 5424, + 9236, + 18638, + 61462, + 54065, + 24812, + 14532, + 152603, + 7994, + 26309, + 48731, + 30887, + 6188, + 12744, + 9842, + 111441, + 7623, + 99342, + 19481, + 13178, + 74432, + 11205, + 44295, + 144160, + 18682, + 3695, + 11009, + 6975, + 16663, + 21423, + 14281, + 18742, + 5834, + 7097, + 5179, + 6464, + 20778, + 6386, + 5615, + 23588, + 13750, + 11926, + 9116, + 15693, + 262738, + 48061, + 12093, + 4732, + 13494, + 6529, + 25917, + 39750, + 42257, + 67884, + 42057, + 6157, + 26690, + 10217, + 9416, + 60377, + 5108, + 11875, + 7827, + 3841, + 10810, + 23271, + 40774, + 356222, + 19725, + 11824, + 8441, + 13702, + 4563, + 70066, + 4842, + 35979, + 73024, + 173411, + 14592, + 3870, + 348863, + 30692, + 133224, + 158167, + 23674, + 21237, + 26219, + 5685, + 6590, + 6865, + 85444, + 55681, + 7172, + 10423, + 7755, + 42468, + 6755, + 8591, + 7330, + 9809, + 21752, + 6290, + 21645, + 7065, + 54052, + 12616, + 7898, + 10591, + 5653, + 8076, + 20295, + 139431, + 6826, + 148004, + 8974, + 196296, + 3836, + 3286, + 41820, + 541042, + 5659, + 9980, + 24539, + 22463, + 34842, + 10695, + 178122, + 5965, + 3955, + 52300, + 18113, + 10716, + 116663, + 8952, + 7853, + 23242, + 9304, + 5864, + 7050, + 5934, + 14888, + 6277, + 335660, + 9191, + 42522, + 31985, + 12488, + 11256, + 3867, + 21110, + 23419, + 31223, + 12493, + 17853, + 11256, + 22623, + 9575, + 11441, + 11857, + 14566, + 14160, + 6398, + 14904, + 23710, + 6711, + 28004, + 8841, + 32565, + 10122, + 12548, + 42170, + 18739, + 11677, + 15601, + 7052, + 4135, + 5035, + 5157, + 49242, + 21175, + 51731, + 14459, + 37009, + 5291, + 9943, + 21002, + 6395, + 10720, + 73404, + 23634, + 39832, + 15928, + 51726, + 5933, + 7350, + 8554, + 13136, + 5927, + 26521, + 38309, + 3809, + 11062, + 46741, + 27397, + 36792, + 8044, + 7337, + 49136, + 143264, + 122260, + 9496, + 26052, + 7760, + 13362, + 51414, + 9389, + 5327, + 8129, + 22165, + 6008, + 7886, + 16727, + 6742, + 33816, + 11244, + 8237, + 11178, + 17298, + 37798, + 19456, + 10891, + 5122, + 6828, + 99817, + 193915, + 71202, + 22065, + 9764, + 14817, + 5608, + 22850, + 213221, + 17346, + 23836, + 7791, + 9926, + 7123, + 4340, + 210525, + 17739, + 98936, + 176457, + 4187, + 10238, + 6634, + 194965, + 18432, + 4033, + 71382, + 21309, + 54132, + 14539, + 32894, + 5003, + 8055, + 35142, + 57009, + 6604, + 165638, + 233339, + 11443, + 10622, + 317479, + 36537, + 150287, + 19789, + 44584, + 6859, + 7754, + 91713, + 41255, + 7905, + 77114, + 5414, + 63522, + 7230, + 39686, + 13212, + 5782, + 29751, + 46006, + 15529, + 8134, + 6976, + 12369, + 44487, + 12702, + 6616, + 4239, + 11975, + 20148, + 7395, + 14892, + 4708, + 24148, + 11028, + 142656, + 67202, + 29940, + 27690, + 63880, + 569509, + 56966, + 26374, + 87314, + 26267, + 12822, + 9677, + 137736, + 8363, + 268269, + 14579, + 18258, + 13636, + 6200, + 5983, + 17156, + 15288, + 32843, + 12010, + 65997, + 43003, + 6350, + 5751, + 135371, + 12173, + 19644, + 38624, + 12086, + 9860, + 33661, + 50746, + 21225, + 23020, + 9877, + 8029, + 31333, + 5422, + 17446, + 7247, + 27714, + 49296, + 9897, + 13825, + 4950, + 5249, + 11020, + 17239, + 16173, + 22598, + 11242, + 8777, + 163318, + 60592, + 93917, + 9525, + 25347, + 65408, + 3298, + 16587, + 178114, + 4783, + 12203, + 21843, + 7401, + 21701, + 7649, + 32551, + 16977, + 12637, + 10797, + 5121, + 27386, + 41563, + 52586, + 583749, + 60967, + 49768, + 25170, + 15677, + 10202, + 11049, + 24756, + 356726, + 5559, + 93226, + 13944, + 48959, + 173875, + 87378, + 425279, + 3719, + 9874, + 7067, + 8683, + 15976, + 11386, + 19422, + 10396, + 22864, + 20888, + 9031, + 8991, + 8956, + 146627, + 19018, + 293077, + 39451, + 62853, + 6914, + 5730, + 7350, + 9324, + 6212, + 22131, + 15734, + 4970, + 6061, + 61478, + 271859, + 17254, + 10319, + 28783, + 60853, + 39454, + 16627, + 14048, + 7341, + 7324, + 6710, + 15544, + 8654, + 6359, + 33580, + 7895, + 96526, + 38686, + 210574, + 61238, + 7035, + 20476, + 15709, + 71560, + 58512, + 5964, + 102037, + 7503, + 6155, + 24447, + 6000, + 13566, + 134056, + 80485, + 8156, + 11619, + 4449, + 4550, + 8843, + 17844, + 8941, + 6628, + 9812, + 9040, + 8605, + 26630, + 22031, + 10755, + 8693, + 39203, + 12808, + 167296, + 171987, + 37013, + 5052, + 4783, + 61187, + 24612, + 48600, + 11034, + 8395, + 9690, + 14963, + 8979, + 10954, + 13248, + 222326, + 8044, + 2802, + 100959, + 286582, + 115868, + 26887, + 5349, + 90004, + 45279, + 151604, + 14238, + 11217, + 8501, + 23773, + 127868, + 12179, + 8780, + 64347, + 143170, + 38824, + 19488, + 13670, + 22453, + 24105, + 63530, + 20915, + 11795, + 42256, + 31115, + 22774, + 10648, + 23014, + 7448, + 392995, + 7882, + 9510, + 10807, + 5798, + 8651, + 62362, + 9270, + 5168, + 13085, + 372079, + 4228, + 80484, + 93243, + 169703, + 78110, + 19901, + 9974, + 6512, + 7120, + 22517, + 10089, + 13709, + 76237, + 10844, + 5652, + 4246, + 31251, + 35389, + 2700, + 15561, + 10527, + 11427, + 36781, + 24395, + 5616, + 9003, + 75875, + 7020, + 82749, + 10051, + 19373, + 20915, + 21081, + 151682, + 30031, + 12975, + 15020, + 43012, + 9316, + 31005, + 19033, + 5306, + 5188, + 38354, + 89275, + 50852, + 296324, + 43570, + 59609, + 6541, + 7011, + 5211, + 15754, + 16113, + 8219, + 12870, + 9112, + 47954, + 12056, + 23788, + 27609, + 4151, + 31964, + 156480, + 38916, + 13702, + 18568, + 26386, + 16397, + 10323, + 40004, + 24614, + 14666, + 21765, + 15202, + 177664, + 6410, + 5683, + 6547, + 11947, + 19146, + 5955, + 11007, + 8878, + 12324, + 7738, + 5559, + 11967, + 83432, + 34512, + 28104, + 32285, + 22514, + 10593, + 12793, + 11343, + 30788, + 31431, + 5825, + 44700, + 9522, + 88717, + 9692, + 11360, + 4994, + 33519, + 8788, + 26415, + 28662, + 12422, + 69885, + 5463, + 48759, + 217441, + 17923, + 8299, + 1544259, + 13575, + 77178, + 15926, + 5419, + 12831, + 119203, + 124132, + 62123, + 16005, + 12138, + 5231, + 35418, + 51870, + 11312, + 4241, + 11067, + 124208, + 12975, + 14009, + 39319, + 11296, + 20455, + 4517, + 4849, + 68204, + 110970, + 9890, + 7943, + 23463, + 4755, + 20087, + 9957, + 6533, + 10701, + 82460, + 7970, + 12945, + 24481, + 10285, + 25966, + 3954, + 10125, + 237826, + 34704, + 402487, + 109921, + 4568, + 117273, + 8943, + 55781, + 6228, + 23494, + 4844, + 22499, + 104872, + 21613, + 19282, + 4679, + 5637, + 24967, + 4320, + 9244, + 69795, + 5924, + 6686, + 134242, + 62426, + 6318, + 14851, + 7672, + 35401, + 5159, + 7353, + 14076, + 51870, + 24430, + 7648, + 27417, + 15002, + 10265, + 25230, + 45635, + 8950, + 13793, + 157636, + 35327, + 5773, + 38326, + 8023, + 16387, + 20044, + 9092, + 125434, + 7334, + 7640, + 5779, + 42723, + 10207, + 69508, + 33365, + 22332, + 27915, + 8429, + 4797, + 17182, + 13799, + 7851, + 5290, + 3734, + 15606, + 11474, + 18031, + 5187, + 28652, + 38408, + 9812, + 5006, + 70552, + 113284, + 45551, + 5094, + 10306, + 14083, + 11242, + 6897, + 7846, + 4936, + 40480, + 4783, + 52614, + 38337, + 10655, + 7044, + 13042, + 16273, + 5684, + 7145, + 25569, + 170398, + 12602, + 209302, + 10115, + 7170, + 6146, + 9852, + 13208, + 11232, + 87073, + 41287, + 6054, + 31314, + 15080, + 31657, + 62974, + 171400, + 162553, + 15833, + 116301, + 20925, + 10659, + 37641, + 3907, + 137738, + 60224, + 187287, + 9542, + 3961, + 9814, + 7419, + 12926, + 23003, + 7352, + 7751, + 55325, + 15466, + 7800, + 9781, + 5087, + 7855, + 5281, + 37823, + 5363, + 4537, + 37278, + 10689, + 6824, + 41637, + 10993, + 17940, + 89203, + 6277, + 16425, + 43368, + 31487, + 32479, + 8294, + 110898, + 12593, + 12161, + 6303, + 11961, + 10967, + 6108, + 33227, + 137480, + 12479, + 15361, + 6008, + 88585, + 12854, + 11161, + 16593, + 10174, + 20014, + 12126, + 53240, + 18456, + 22775, + 80146, + 45344, + 25770, + 208869, + 5152, + 51529, + 47862, + 7955, + 11396, + 9605, + 19824, + 23118, + 46509, + 336926, + 40901, + 5052, + 44373, + 80275, + 6638, + 128221, + 75178, + 259043, + 6715, + 13858, + 9815, + 14583, + 5370, + 10096, + 21484, + 112850, + 33991, + 11248, + 4453, + 150286, + 6019, + 21617, + 53334, + 6329, + 15037, + 24361, + 13592, + 10115, + 86575, + 6248, + 13196, + 51930, + 18932, + 5304, + 70886, + 10938, + 10161, + 6728, + 30276, + 5551, + 18616, + 18096, + 10428, + 10746, + 4739, + 22500, + 8785, + 17110, + 5231, + 54467, + 109217, + 9403, + 14811, + 54420, + 105738, + 5845, + 77563, + 7213, + 11796, + 6260, + 21742, + 156961, + 8840, + 10586, + 60822, + 6719, + 18626, + 63184, + 47637, + 14962, + 5303, + 36243, + 17167, + 6910, + 5823, + 4134, + 19605, + 64305, + 8516, + 11139, + 8722, + 75629, + 6448, + 7374, + 7298, + 5214, + 6167, + 5933, + 12176, + 51228, + 134578, + 16912, + 12519, + 10607, + 11402, + 12585, + 7967, + 8550, + 12384, + 9591, + 44820, + 28791, + 7675, + 16295, + 124855, + 15870, + 9418, + 11653, + 29486, + 10930, + 9309, + 10148, + 22117, + 17010, + 6843, + 7339, + 23924, + 6396, + 14174, + 4886, + 26119, + 80397, + 24700, + 13513, + 4640, + 10535, + 14378, + 20399, + 12271, + 93444, + 11131, + 7735, + 4613, + 7827, + 13203, + 8991, + 184342, + 5770, + 9766, + 7803, + 9705, + 27989, + 190856, + 8841, + 4589, + 41744, + 11502, + 8257, + 20938, + 9810, + 4849, + 20357, + 8148, + 9263, + 8658, + 125266, + 47883, + 51416, + 18643, + 6158, + 31822, + 9100, + 4844, + 24937, + 40799, + 9876, + 6819, + 8052, + 18012, + 31428, + 12733, + 102279, + 147045, + 8528, + 141920, + 6659, + 4505, + 20599, + 31796, + 1047527, + 3763, + 17620, + 14942, + 7483, + 22169, + 24890, + 25747, + 28779, + 6902, + 15965, + 20303, + 9236, + 4384, + 278065, + 253428, + 9277, + 11274, + 5588, + 57204, + 34269, + 8250, + 7542, + 7917, + 21306, + 357996, + 7766, + 25640, + 36127, + 18431, + 67960, + 36790, + 4786, + 45992, + 9724, + 5789, + 9855, + 286572, + 46937, + 9392, + 3491, + 4080, + 21427, + 8689, + 6241, + 20389, + 165430, + 11032, + 14691, + 20593, + 36510, + 50873, + 5336, + 8386, + 15033, + 80852, + 7394, + 9587, + 270898, + 14598, + 11429, + 176044, + 33481, + 65171, + 6381, + 17564, + 24838, + 7111, + 5152, + 6200, + 4833, + 12015, + 5608, + 4983, + 22929, + 10323, + 169740, + 139732, + 6300, + 117078, + 197216, + 9954, + 5957, + 25028, + 54165, + 11446, + 8099, + 81586, + 9168, + 5019, + 77767, + 11164, + 13451, + 40841, + 7332, + 60467, + 8856, + 11346, + 93418, + 3991, + 14963, + 3735, + 10413, + 6681, + 6319, + 16577, + 5218, + 79191, + 40260, + 29687, + 194970, + 8433, + 33575, + 29788, + 8733, + 312026, + 7669, + 10948, + 16396, + 10385, + 203411, + 9386, + 6774, + 57103, + 24841, + 22111, + 4616, + 9154, + 4904, + 17776, + 7226, + 11099, + 26974, + 12918, + 7578, + 8198, + 7992, + 9675, + 40705, + 13125, + 45728, + 3735, + 12922, + 7892, + 26166, + 4547, + 14479, + 10885, + 13745, + 14486, + 11290, + 132752, + 7283, + 50936, + 32768, + 107157, + 74857, + 31818, + 4248, + 56395, + 11981, + 18278, + 13531, + 17596, + 35245, + 8568, + 22141, + 16972, + 6651, + 11201, + 5086, + 2279, + 64603, + 41711, + 9512, + 4697, + 16395, + 6190, + 7415, + 9274, + 7149, + 9214, + 38101, + 26999, + 234717, + 5798, + 8090, + 11736, + 7640, + 11097, + 61151, + 103583, + 443126, + 640924, + 1575590, + 9307, + 19320, + 36516, + 8067, + 61806, + 10347, + 9527, + 25106, + 8990, + 8891, + 6296, + 119519, + 25671, + 7471, + 4722, + 40799, + 8338, + 6611, + 14486, + 56032, + 9100, + 73428, + 12184, + 8734, + 4504, + 9857, + 50187, + 9514, + 5485, + 12918, + 3958, + 19129, + 30665, + 23670, + 20647, + 5052, + 12821, + 12731, + 5754, + 72170, + 22988, + 7293, + 21692, + 55373, + 32252, + 18085, + 14687, + 56660, + 87331, + 14711, + 29120, + 14622, + 43992, + 97353, + 7549, + 5484, + 29571, + 7292, + 15218, + 167962, + 21131, + 15572, + 17724, + 18124, + 9842, + 8734 + ] + }, + { + "counters": [ + 7535, + 7949, + 5275, + 30373, + 16190, + 45341, + 5588, + 11504, + 75258, + 14165, + 175560, + 6021, + 8444, + 114571, + 11396, + 19100, + 365337, + 9971, + 169275, + 14908, + 23087, + 20814, + 45394, + 105388, + 24005, + 14404, + 11348, + 19056, + 92240, + 85035, + 5912, + 6566, + 5907, + 9837, + 11541, + 5954, + 17639, + 11184, + 11419, + 4721, + 3665, + 7704, + 100243, + 166385, + 14209, + 284055, + 4825, + 6373, + 9833, + 12359, + 7342, + 14927, + 22837, + 116280, + 4648, + 48707, + 8387, + 54219, + 19399, + 19695, + 27066, + 47924, + 26210, + 12143, + 8356, + 11764, + 15654, + 4595, + 11808, + 14503, + 292990, + 3457, + 8372, + 20771, + 11640, + 229039, + 4759, + 5006, + 12934, + 89657, + 13118, + 9944, + 41197, + 93877, + 7045, + 8659, + 55618, + 13117, + 41087, + 42294, + 48415, + 164417, + 12249, + 12571, + 18233, + 6724, + 6169, + 213119, + 7362, + 7203, + 2971, + 269302, + 10556, + 8128, + 17838, + 193687, + 7180, + 1975498, + 25489, + 8609, + 8719, + 40328, + 44161, + 10262, + 13903, + 6327, + 7330, + 6728, + 7906, + 54312, + 16060, + 32271, + 25511, + 65577, + 287560, + 6738, + 41405, + 8153, + 10222, + 8092, + 23532, + 10019, + 8714, + 15226, + 4198, + 32058, + 8015, + 14633, + 15422, + 15292, + 14639, + 6619, + 34185, + 9696, + 15932, + 7844, + 54747, + 10668, + 10456, + 8795, + 17732, + 11721, + 15472, + 16715, + 6422, + 17555, + 39731, + 11233, + 57216, + 28022, + 6287, + 175580, + 7289, + 13535, + 6136, + 3723, + 8172, + 7736, + 17886, + 50938, + 14248, + 95660, + 6254, + 7093, + 26375, + 84501, + 17187, + 44783, + 4181, + 57495, + 420633, + 29903, + 222700, + 18650, + 28501, + 4816, + 145058, + 73397, + 6711, + 5856, + 16133, + 42775, + 19027, + 9566, + 31139, + 46933, + 4042, + 42166, + 439579, + 77469, + 7587, + 20133, + 12276, + 14679, + 106347, + 103292, + 11012, + 17308, + 105095, + 8751, + 16670, + 13530, + 5820, + 15000, + 74345, + 40111, + 11743, + 8712, + 7310, + 98009, + 13077, + 17880, + 14456, + 30960, + 63151, + 33863, + 10128, + 16426, + 7341, + 11850, + 5136, + 47152, + 7549, + 99074, + 8858, + 7209, + 7506, + 10874, + 5990, + 17374, + 249662, + 60308, + 22793, + 25701, + 9242, + 24086, + 6328, + 160353, + 17866, + 23767, + 8129, + 65566, + 8153, + 4744, + 99478, + 9040, + 20459, + 9819, + 19587, + 31206, + 13595, + 7794, + 12758, + 73878, + 25521, + 5145, + 12229, + 14701, + 60326, + 5136, + 13013, + 8336, + 81776, + 5005, + 6289, + 15133, + 12335, + 40422, + 9793, + 6160, + 13171, + 8876, + 13834, + 13650, + 9073, + 5549, + 14357, + 236406, + 12231, + 4747, + 15681, + 22828, + 8774, + 42029, + 36759, + 108808, + 37959, + 42604, + 19902, + 7216, + 26350, + 6485, + 16952, + 9479, + 292915, + 62605, + 8158, + 205830, + 21130, + 6756, + 7178, + 8006, + 6455, + 4642, + 37188, + 8221, + 71331, + 24898, + 6618, + 46539, + 12895, + 13675, + 3153, + 158069, + 101513, + 4748, + 40231, + 38507, + 10830, + 189899, + 10053, + 5172, + 354647, + 10598, + 33415, + 18860, + 10792, + 47611, + 5875, + 18226, + 34230, + 9055, + 69717, + 9517, + 11739, + 6742, + 18566, + 7654, + 60362, + 134817, + 5812, + 8984, + 16789, + 89161, + 7147, + 5923, + 37234, + 11739, + 81514, + 11467, + 102758, + 15106, + 46941, + 336872, + 42028, + 10480, + 4755, + 31841, + 7273, + 10398, + 14967, + 6007, + 19283, + 201090, + 6539, + 7571, + 3490, + 251162, + 55664, + 99812, + 224879, + 29658, + 9987, + 3963, + 7489, + 5071, + 9876, + 10100, + 48917, + 19034, + 5634, + 37369, + 19037, + 13580, + 185387, + 2147091, + 16453, + 12399, + 29200, + 149403, + 55983, + 45972, + 124534, + 5720, + 18798, + 256655, + 7231, + 10901, + 46707, + 73210, + 6229, + 50047, + 34800, + 74268, + 6939, + 12801, + 6830, + 55451, + 10955, + 4638, + 5330, + 13289, + 6491, + 6843, + 3381, + 5095, + 10987, + 10439, + 13114, + 8395, + 47388, + 7072, + 9205, + 10910, + 15153, + 5640, + 13923, + 34107, + 10877, + 52858, + 11901, + 14423, + 6536, + 89144, + 150944, + 23950, + 6354, + 67446, + 6969, + 7105, + 16893, + 9632, + 7405, + 138870, + 165778, + 18989, + 5222, + 174079, + 51099, + 10621, + 7763, + 22057, + 26211, + 11613, + 3314, + 142677, + 11646, + 4375, + 12311, + 14005, + 4781, + 6964, + 45820, + 6960, + 22913, + 100841, + 14027, + 14466, + 3729, + 11523, + 9211, + 11349, + 21619, + 22163, + 4863, + 9918, + 63455, + 3189, + 21347, + 39882, + 3583, + 6377, + 9985, + 17345, + 3979, + 8536, + 7548, + 11233, + 219901, + 6541, + 21116, + 77042, + 260576, + 55708, + 100137, + 4754, + 63094, + 10293, + 32828, + 85188, + 39778, + 16292, + 46042, + 653518, + 336183, + 18656, + 29488, + 10705, + 4469, + 10380, + 6021, + 14478, + 6066, + 56868, + 4924, + 7378, + 21788, + 11622, + 7562, + 6236, + 6081, + 7716, + 38881, + 6731, + 51953, + 27064, + 8702, + 7865, + 6245, + 60996, + 119024, + 28276, + 11730, + 6828, + 45035, + 19076, + 295023, + 185481, + 4190, + 8440, + 7839, + 39973, + 48567, + 20225, + 1588264, + 13804, + 7820, + 12134, + 36030, + 22842, + 16629, + 64088, + 7309, + 10182, + 187504, + 71523, + 42926, + 3949, + 171236, + 4405, + 337298, + 18591, + 7382, + 6696, + 7278, + 6134, + 9385, + 31309, + 4455, + 20928, + 64068, + 22820, + 8197, + 10748, + 12030, + 7446, + 8703, + 20534, + 18226, + 12971, + 8147, + 23821, + 14153, + 8316, + 96907, + 10940, + 15966, + 24241, + 5737, + 5785, + 16628, + 4089, + 31313, + 23959, + 279791, + 15947, + 37422, + 141377, + 10207, + 17477, + 203948, + 77294, + 44254, + 458661, + 8021, + 12798, + 15555, + 14334, + 35742, + 54003, + 7397, + 3517, + 3558, + 42362, + 8561, + 5577, + 8949, + 76812, + 8619, + 3519, + 97025, + 12732, + 60829, + 4101, + 6876, + 4803, + 29037, + 139759, + 4888, + 7204, + 9433, + 11257, + 9943, + 50084, + 14489, + 11111, + 300614, + 15315, + 12759, + 11354, + 5679, + 5022, + 8143, + 12669, + 90573, + 6033, + 21831, + 7151, + 6209, + 20027, + 30456, + 48570, + 6053, + 22978, + 14924, + 60255, + 1574328, + 7009, + 4541, + 11511, + 7982, + 14164, + 6894, + 4752, + 6688, + 10942, + 9651, + 8544, + 15023, + 9894, + 7508, + 5307, + 4251322, + 290911, + 6014, + 53949, + 190357, + 9404, + 25514, + 7304, + 21907, + 7753, + 4384, + 29783, + 8236, + 7813, + 8190, + 169205, + 104331, + 7372, + 62405, + 106193, + 5732, + 9749, + 6855, + 12514, + 24056, + 17980, + 11681, + 5672, + 155040, + 11460, + 45912, + 6928, + 60119, + 21208, + 35481, + 26750, + 15285, + 18043, + 12218, + 28923, + 40941, + 167840, + 38326, + 20287, + 49788, + 934611, + 9621, + 94818, + 9171, + 60871, + 4512, + 21494, + 7046, + 6965, + 21247, + 29995, + 13665, + 59113, + 7227, + 18156, + 60611, + 8325, + 7644, + 36845, + 41306, + 7178, + 151069, + 14634, + 7242, + 4742, + 25869, + 9445, + 9765, + 24101, + 27578, + 9552, + 16301, + 24017, + 6198, + 27873, + 3665, + 103137, + 10645, + 70681, + 1282123, + 12845, + 8845, + 24968, + 5593, + 6282, + 15527, + 14060, + 4328, + 5479, + 112815, + 45483, + 6495, + 14293, + 22085, + 20704, + 5680, + 18153, + 9291, + 25296, + 8291, + 15958, + 39587, + 10247, + 13948, + 6290, + 32596, + 15564, + 46861, + 10851, + 39836, + 10693, + 4470, + 40033, + 6283, + 7056, + 12213, + 4277, + 158451, + 24895, + 44654, + 5643, + 8569, + 4505, + 53322, + 17871, + 22388, + 9651, + 7345, + 8599, + 34961, + 118085, + 8638, + 9780, + 21272, + 85452, + 44812, + 7264, + 27765, + 10198, + 11026, + 28648, + 5819, + 5286, + 9345, + 11590, + 9146, + 13447, + 23458, + 10689, + 209712, + 22021, + 28358, + 11034, + 5734, + 16425, + 10927, + 14614, + 158670, + 259560, + 3738, + 27310, + 26843, + 14233, + 14144, + 5671, + 13253, + 23933, + 8721, + 18557, + 8562, + 53644, + 132314, + 12738, + 10236, + 264470, + 10493, + 19896, + 64488, + 68940, + 11156, + 11628, + 6938, + 21463, + 326387, + 10865, + 7061, + 15260, + 10023, + 133070, + 6876, + 7620, + 164415, + 19287, + 5855, + 215033, + 8300, + 13015, + 9454, + 5420, + 8020, + 9186, + 10812, + 18881, + 4005, + 15786, + 5093, + 93708, + 70367, + 8867, + 14769, + 15959, + 29177, + 87398, + 211683, + 23538, + 28789, + 62757, + 123117, + 10391, + 109356, + 25854, + 28145, + 6196, + 8438, + 24806, + 147292, + 10433, + 7740, + 12059, + 128717, + 64210, + 6726, + 8401, + 27041, + 4643, + 5028, + 7198, + 49262, + 3927, + 9857, + 24172, + 8408, + 31351, + 29442, + 74120, + 10177, + 7311, + 13758, + 7829, + 3194, + 48168, + 21567, + 8391, + 47557, + 5527, + 19963, + 4516, + 10379, + 13626, + 35267, + 12777, + 5908, + 51574, + 6274, + 17801, + 19888, + 87957, + 7834, + 89637, + 14172, + 19337, + 269906, + 9358, + 39596, + 4856, + 14121, + 58393, + 58187, + 9599, + 67925, + 9114, + 7774, + 9185, + 90904, + 6733, + 15876, + 58466, + 81624, + 4663, + 34326, + 15062, + 68475, + 5381, + 10736, + 53357, + 184926, + 64053, + 4040, + 32911, + 13270, + 46838, + 5280, + 109796, + 5495, + 4401, + 7631, + 61895, + 10632, + 37348, + 5634, + 48181, + 12432, + 20742, + 8965, + 28904, + 7988, + 10556, + 11694, + 79963, + 71306, + 11671, + 6193, + 9032, + 24319, + 13517, + 83110, + 5480, + 3938, + 9701, + 76944, + 119461, + 5573, + 43420, + 34237, + 11839, + 17904, + 19343, + 5618, + 8610, + 38449, + 10736, + 16682, + 5872, + 7955, + 18760, + 8086, + 225441, + 84418, + 7412, + 18933, + 59285, + 8002, + 39792, + 53917, + 4835, + 17171, + 9081, + 5401, + 3250, + 141643, + 12646, + 6662, + 12886, + 107001, + 4806, + 6940, + 4796, + 11621, + 11898, + 251129, + 3519, + 53256, + 47516, + 9554, + 9227, + 8854, + 19205, + 24005, + 13504, + 113370, + 3884, + 9927, + 4953, + 58304, + 272784, + 5796, + 92175, + 5906, + 38415, + 13813, + 30622, + 16166, + 14816, + 189342, + 27688, + 7903, + 15064, + 8310, + 9222, + 7861, + 23692, + 110949, + 4659, + 25838, + 42350, + 19815, + 23978, + 13336, + 33142, + 27021, + 115730, + 25121, + 21059, + 64576, + 25889, + 12371, + 9850, + 8734, + 46111, + 4177, + 6764, + 5801, + 33999, + 25256, + 9382, + 3807, + 4467, + 11315, + 157158, + 5814, + 4047, + 11933, + 8133, + 4439, + 39576, + 14938, + 31557, + 20172, + 6897, + 19977, + 3414, + 16390, + 10002, + 12404, + 15247, + 11835, + 41174, + 60702, + 17217, + 74160, + 9968, + 11100, + 7269, + 21291, + 28398, + 174431, + 24277, + 7266, + 9673, + 3390, + 147724, + 17183, + 9031, + 64020, + 3417, + 6567, + 4214, + 4913, + 240903, + 28581, + 85682, + 4464, + 6958, + 12447, + 15190, + 18828, + 116028, + 14269, + 12325, + 57204, + 7938, + 84284, + 46543, + 5471, + 13179, + 35903, + 5355, + 50560, + 62204, + 29552, + 10700, + 195827, + 6007, + 45787, + 16017, + 33835, + 11835, + 5593, + 4457, + 6576, + 81197, + 41774, + 7859, + 10444, + 16021, + 55297, + 23499, + 39405, + 4013, + 96370, + 44355, + 40070, + 4297, + 8255, + 13563, + 10184, + 17825, + 53147, + 13517, + 6905, + 5748, + 137376, + 15799, + 17936, + 5456, + 9594, + 27802, + 12010, + 71420, + 8945, + 6283, + 6689, + 5229, + 5094, + 22340, + 50638, + 78825, + 20570, + 5595, + 38417, + 73998, + 10702, + 16234, + 7570, + 39111, + 120982, + 7536, + 408238, + 159913, + 22438, + 20605, + 248783, + 13556, + 17784, + 162961, + 6014, + 326579, + 10320, + 167770, + 25381, + 218368, + 59755, + 32088, + 9954, + 25137, + 23488, + 6561, + 6508, + 6291, + 5021, + 241721, + 6262, + 22149, + 343418, + 12042, + 21562, + 9869, + 27039, + 34074, + 4332, + 106873, + 27951, + 6745, + 8718, + 11302, + 9981, + 17488, + 6879, + 7725, + 15800, + 8273, + 35844, + 19723, + 7052, + 7185, + 421875, + 12532, + 46894, + 17004, + 21673, + 57569, + 10319, + 14520, + 54158, + 22101, + 13413, + 79926, + 9111, + 5903, + 131630, + 30754, + 6366, + 11878, + 48047, + 4723, + 21727, + 10354, + 12622, + 9288, + 91312, + 13100, + 15834, + 17883, + 4906, + 73211, + 144767, + 35726, + 32365, + 8672, + 15953, + 6462, + 13764, + 13331, + 65397, + 5519, + 8352, + 13962, + 175674, + 14581, + 33309, + 25407, + 54147, + 11762, + 15022, + 17070, + 7696, + 5856, + 39857, + 6686, + 78286, + 12876, + 7258, + 10392, + 12083, + 7929, + 5247, + 21827, + 10390, + 6897, + 63878, + 35361, + 27739, + 10634, + 12613, + 297283, + 3014, + 10625, + 34583, + 112340, + 22087, + 8283, + 14778, + 13804, + 31607, + 39732, + 10000, + 6360, + 10335, + 6123, + 14632, + 7304, + 7544, + 12554, + 4977, + 18415, + 5524, + 10601, + 15448, + 95395, + 42035, + 26993, + 69312, + 17287, + 4695, + 274216, + 8413, + 3658, + 5405, + 9320, + 13044, + 14710, + 250645, + 37385, + 10535, + 8322, + 6453, + 7680, + 8963, + 7013, + 7687, + 28170, + 4255, + 11524, + 8776, + 4559, + 17344, + 12634, + 189614, + 40628, + 13134, + 92370, + 7162, + 9033, + 57832, + 29259, + 11377, + 8032, + 12979, + 129599, + 221508, + 11274, + 10373, + 12747, + 7854, + 8580, + 8655, + 25843, + 13408, + 7116, + 166493, + 17124, + 167409, + 17395, + 14115, + 8389, + 29604, + 104263, + 12032, + 35059, + 7459, + 21385, + 21955, + 8037, + 80936, + 177485, + 135647, + 11047, + 5456, + 13823, + 5077, + 16834, + 131031, + 8704, + 9093, + 11698, + 6957, + 8038, + 14638, + 9198, + 11890, + 9160, + 14860, + 9626, + 180398, + 60707, + 45948, + 11117, + 144900, + 73780, + 5289, + 18782, + 23748, + 10965, + 54739, + 4022, + 5969, + 9212, + 11260, + 35641, + 6647, + 18859, + 9942, + 35917, + 6347, + 3894, + 20920, + 17225, + 79783, + 55532, + 14257, + 9723, + 36983, + 6700, + 129639, + 7311, + 7405, + 10365, + 84838, + 576333, + 4085, + 18922, + 9396, + 10466, + 65479, + 102785, + 57999, + 66158, + 8004, + 27755, + 11735, + 22293, + 8815, + 9744, + 20574, + 9479, + 8316, + 5960, + 14662, + 75374, + 123856, + 3959, + 8825, + 29443, + 9530, + 8207, + 16472, + 27565, + 4215, + 31521, + 43704, + 5983, + 30832, + 12799, + 6485, + 10867, + 11917, + 10059, + 11275, + 10267, + 7149, + 15856, + 8195, + 163818, + 5591, + 83275, + 6375, + 7490, + 17373, + 9633, + 8223, + 26125, + 5448, + 9846, + 50451, + 10387, + 4897, + 12778, + 12622, + 6457, + 28476, + 9983, + 10072, + 31236, + 35609, + 82088, + 8117, + 5943, + 25541, + 26525, + 66654, + 11965, + 18386, + 44201, + 12770, + 4133, + 5059, + 22053, + 25333, + 14921, + 9460, + 29769, + 50778, + 4890, + 21040, + 5229, + 24712, + 9320, + 35962, + 2793, + 4679, + 11795, + 9216, + 13338, + 5596, + 6914, + 24453, + 9507, + 12873, + 11647, + 13359, + 11352, + 9201, + 47898, + 23701, + 4508, + 16173, + 128032, + 12784, + 4708, + 165016, + 41656, + 9892, + 70972, + 8277, + 34958, + 7223, + 8044, + 15407, + 5682, + 20145, + 50043, + 13657, + 172340, + 16403, + 15197, + 7095, + 9784, + 4125, + 67695, + 9698, + 6011, + 33770, + 5293, + 5579, + 24351, + 5192, + 12399, + 18936, + 73283, + 7269, + 18792, + 5282, + 59095, + 5762, + 8034, + 12757, + 11280, + 6214, + 13424, + 19050, + 18026, + 11886, + 52810, + 33022, + 57728, + 9268, + 11225, + 7619, + 56844, + 306137, + 5099, + 26134, + 8078, + 22905, + 14085, + 6415, + 10640, + 41438, + 95302, + 83621, + 9469, + 21705, + 16538, + 3811, + 7051, + 18561, + 40720, + 4564, + 32525, + 100043, + 62535, + 10404, + 13976, + 26634, + 23035, + 9298, + 126855, + 12696, + 13888, + 6308, + 28300, + 149814, + 7768, + 103023, + 6862, + 17918, + 58768, + 41466, + 39144, + 26702, + 4872, + 7805, + 56862, + 10739, + 8024, + 17672, + 21581, + 133592, + 8906, + 211336, + 10935, + 20414, + 7655, + 68589, + 14386, + 91786, + 538941, + 10842, + 11646, + 13230, + 7991, + 30106, + 14918, + 12427, + 32054, + 19130, + 7548, + 9509, + 14496, + 5556, + 12384, + 24433, + 13126, + 9311, + 7355, + 15015, + 13632, + 6039, + 6957, + 11586, + 63097, + 611785, + 19239, + 133839, + 31118, + 41629, + 6750, + 30559, + 24034, + 15064, + 12472, + 14980, + 20988, + 5769, + 26181, + 29887, + 18258, + 4586, + 40895, + 15455, + 47802, + 61251, + 251945, + 6622, + 10951, + 13138, + 14582, + 10929, + 8027, + 49396, + 27546, + 8146, + 21384, + 6300, + 79827, + 4895, + 13587, + 81780, + 11414, + 16277, + 7847, + 9349, + 15216, + 16869, + 7277, + 22460, + 78021, + 364574, + 4086, + 8519, + 8792, + 8027, + 11997, + 75053, + 15294, + 175513, + 27233, + 5487, + 4450, + 4103, + 8484, + 15885, + 12091, + 40584, + 12179, + 63883, + 35757, + 52037, + 10229, + 4083, + 15264, + 22772, + 28437, + 6840, + 11857, + 38818, + 16302, + 8602, + 4798, + 8673, + 6800, + 47362, + 31975, + 11095, + 14862, + 6809, + 5082, + 13250, + 8289, + 6198, + 7960, + 69580, + 12739, + 15064, + 249368, + 17175, + 12372, + 53219, + 13271, + 15094, + 95261, + 9685, + 30076, + 168110, + 10251, + 4582, + 14479, + 5304, + 51903, + 14128, + 97314, + 4866, + 14476, + 143028, + 36078, + 4234, + 8788, + 9787, + 22460, + 41427, + 4724, + 85900, + 233226, + 33149, + 9063, + 8025, + 9489, + 21710, + 7907, + 6689, + 12367, + 6186, + 9555, + 30349, + 9051, + 20363, + 90681, + 150580, + 5677, + 9637, + 8699, + 7291, + 20277, + 15362, + 10475, + 7836, + 46693, + 44070, + 30983, + 28385, + 27355, + 6059, + 8435, + 5265, + 11942, + 20062, + 10633, + 9938, + 6135, + 6097, + 5429, + 17661, + 30379, + 10677, + 20186, + 10149, + 12184, + 57336, + 12793, + 65985, + 4647, + 12403, + 35207, + 11935, + 8619, + 36504, + 29845, + 348769, + 15429, + 16072, + 7612, + 31696, + 40669, + 5778, + 11304, + 13262, + 12370, + 6410, + 5420, + 4621, + 19135, + 84905, + 9208, + 10517, + 8767, + 62633, + 9505, + 6630, + 8048, + 19642, + 4979, + 289660, + 5864, + 15001, + 11095, + 61377, + 8969, + 17569, + 6378, + 19979, + 26887, + 7474, + 11230, + 111738, + 11309, + 92279, + 8505, + 23181, + 7433, + 19033, + 24680, + 35463, + 13775, + 16161, + 68622, + 7053, + 7183, + 102268, + 3832, + 7333, + 8117, + 15040, + 11817, + 24734, + 23528, + 278634, + 4915, + 267611, + 9246, + 47294, + 38821, + 29799, + 41109, + 8184, + 78604, + 31984, + 7877, + 31808, + 9318, + 4343, + 7425, + 15929, + 9505, + 83339, + 8073, + 11380, + 13168, + 44190, + 7690, + 18911, + 56454, + 65915, + 11631, + 133497, + 4103, + 41521, + 82355, + 10113, + 5770, + 145279, + 4478, + 41273, + 80006, + 27338, + 291211, + 102962, + 4500, + 28184, + 20125, + 11918, + 93354, + 70760, + 16190, + 8832, + 15719, + 119458, + 62062, + 9526, + 10372, + 7102, + 10179, + 30070, + 12535, + 7535, + 9758, + 25149, + 11860, + 35951, + 3081, + 32468, + 10683, + 25691, + 5866, + 43469, + 7327, + 10874, + 6281, + 11739, + 157371, + 18385, + 43826 + ] + }, + { + "counters": [ + 6683, + 14721, + 28645, + 26667, + 21038, + 184780, + 5067, + 5334, + 35772, + 36744, + 32395, + 237880, + 38817, + 67863, + 3197, + 10690, + 7935, + 7004, + 23666, + 14426, + 13923, + 16504, + 18716, + 11277, + 23196, + 18096, + 9099, + 6808, + 13935, + 8959, + 37702, + 76791, + 7901, + 10227, + 8394, + 6502, + 67689, + 6686, + 247784, + 44089, + 4498, + 15991, + 11336, + 35779, + 26252, + 23681, + 19966, + 6988, + 8606, + 29801, + 11737, + 25156, + 7235, + 5935, + 6888, + 8325, + 9088, + 18072, + 4947, + 33304, + 167957, + 15604, + 75061, + 10257, + 46962, + 19774, + 11025, + 188117, + 26487, + 50547, + 5383, + 3678, + 4821, + 302765, + 20460, + 5198, + 170133, + 16591, + 10314, + 5542, + 27971, + 6549, + 85919, + 9837, + 7767, + 10177, + 21873, + 15256, + 9992, + 15909, + 14809, + 39288, + 8059, + 16186, + 30488, + 274251, + 6595, + 5622, + 6681, + 55803, + 20681, + 5331, + 228366, + 83376, + 27487, + 9812, + 227906, + 52102, + 5699, + 168400, + 5012, + 7902, + 12585, + 225954, + 16506, + 10388, + 7036, + 10972, + 21985, + 18590, + 27856, + 29990, + 16108, + 18376, + 51970, + 11644, + 20503, + 296255, + 136666, + 10789, + 26187, + 119937, + 121316, + 179883, + 11379, + 153662, + 62501, + 16934, + 4834, + 20595, + 36042, + 10615, + 6223, + 15440, + 38785, + 33765, + 10276, + 9412, + 99633, + 313573, + 17154, + 32481, + 9253, + 7641, + 3994, + 79528, + 5639, + 99940, + 10855, + 143887, + 5393, + 9344, + 7445, + 22554, + 53697, + 30238, + 4982, + 334018, + 7915, + 71192, + 5923, + 18107, + 11183, + 55999, + 28908, + 22524, + 4586, + 15007, + 22867, + 15721, + 7913, + 7316, + 8552, + 120752, + 12656, + 33225, + 11749, + 13993, + 7836, + 8184, + 69587, + 30318, + 31671, + 57981, + 12847, + 141324, + 39618, + 1869562, + 30728, + 41396, + 16108, + 10724, + 13187, + 9966, + 4705, + 21745, + 90785, + 10842, + 10039, + 90986, + 11594, + 12079, + 10098, + 7548, + 124264, + 7905, + 28354, + 19663, + 8023, + 8366, + 9880, + 6140, + 57625, + 10143, + 4943, + 99998, + 7711, + 29774, + 25796, + 15177, + 6754, + 13155, + 15685, + 22139, + 72922, + 52300, + 6682, + 11475, + 37358, + 9901, + 6727, + 15785, + 4426, + 5807, + 3024, + 39527, + 21881, + 31421, + 10993, + 71097, + 25174, + 92098, + 69753, + 214327, + 1898104, + 10385, + 6315, + 12137, + 71612, + 5520, + 5579, + 79378, + 9632, + 11405, + 3588, + 3215, + 15341, + 22707, + 7849, + 72396, + 9135, + 91917, + 67959, + 12624, + 34761, + 11990, + 5160, + 181056, + 11500, + 50871, + 23609, + 14741, + 185122, + 71147, + 17686, + 14400, + 63178, + 6399, + 12713, + 14809, + 64305, + 61122, + 13103, + 8039, + 16910, + 10060, + 14083, + 17717, + 31356, + 85779, + 15226, + 55864, + 4476, + 18254, + 35440, + 5902, + 17679, + 8863, + 15744, + 107664, + 5608, + 4525, + 11164, + 20889, + 6895, + 57521, + 24728, + 7658, + 17592, + 7680, + 12254, + 14014, + 7712, + 5573, + 28652, + 46617, + 15415, + 16075, + 14253, + 15983, + 12860, + 13589, + 12195, + 11837, + 25862, + 9329, + 5624, + 155254, + 6824, + 8363, + 6802, + 10130, + 5680, + 13266, + 50400, + 12163, + 4701, + 111930, + 529906, + 7262, + 4794, + 66509, + 6355, + 71279, + 37770, + 18128, + 34222, + 12306, + 243626, + 17931, + 6076, + 34973, + 7912, + 163863, + 17120, + 7294, + 20682, + 10168, + 7740, + 14145, + 15170, + 28669, + 5343, + 6848, + 7734, + 7863, + 33711, + 5366, + 10104, + 5432, + 94113, + 19093, + 5481, + 7458, + 13854, + 4729, + 39766, + 8840, + 491564, + 106112, + 40534, + 43649, + 8905, + 42263, + 10889, + 27957, + 80903, + 8530, + 32690, + 3687, + 57441, + 15435, + 16718, + 11921, + 10428, + 12228, + 20643, + 31376, + 141380, + 11810, + 7602, + 7773, + 214165, + 26925, + 26747, + 4120, + 28648, + 112900, + 9786, + 68395, + 3776, + 8922, + 10642, + 8072, + 44357, + 10288, + 33180, + 9522, + 8261, + 60740, + 13018, + 26064, + 7642, + 103180, + 10500, + 10202, + 13071, + 16621, + 6787, + 6812, + 10390, + 10225, + 67255, + 28221, + 25223, + 22828, + 5694, + 54735, + 7350, + 5691, + 65395, + 11416, + 6139, + 33815, + 17321, + 15870, + 6851, + 8413, + 245045, + 84630, + 6295, + 25289, + 12786, + 39967, + 35833, + 452225, + 4525, + 21809, + 14885, + 15855, + 5875, + 10825, + 8026, + 14341, + 11344, + 10191, + 23212, + 7955, + 16511, + 39868, + 10457, + 34429, + 6056, + 6751, + 5367, + 10632, + 158376, + 72028, + 17686, + 9203, + 135874, + 6913, + 6654, + 17592, + 532281, + 11042, + 9694, + 10039, + 65377, + 4224, + 65930, + 8044, + 86115, + 5492, + 61180, + 6669, + 7702, + 16232, + 5836, + 49714, + 4829, + 8963, + 38160, + 78355, + 3588, + 24971, + 4370, + 5474, + 7265, + 20579, + 11525, + 16113, + 23331, + 7073, + 10716, + 18129, + 17484, + 7173, + 21310, + 5074, + 5807, + 20230, + 7209, + 12951, + 7380, + 10285, + 53970, + 12243, + 88508, + 7674, + 91592, + 89548, + 47014, + 7687, + 151909, + 5380, + 6079, + 25674, + 13779, + 14544, + 6065, + 54902, + 2988, + 12591, + 8526, + 186599, + 37083, + 9961, + 5455, + 13901, + 124021, + 18477, + 17116, + 67489, + 101906, + 7514, + 10454, + 16022, + 14621, + 7432, + 163961, + 4337, + 6257, + 8020, + 290867, + 295254, + 178996, + 331510, + 10575, + 13608, + 7862, + 6850, + 51877, + 9008, + 30167, + 11503, + 10904, + 18350, + 11915, + 17320, + 235914, + 6352, + 18539, + 23636, + 21779, + 4268, + 9521, + 12318, + 8696, + 18911, + 7303, + 20923, + 247342, + 6006, + 18937, + 9109, + 13533, + 8202, + 7513, + 9584, + 327541, + 97628, + 4745, + 116150, + 22021, + 95270, + 5219, + 6140, + 51091, + 16136, + 5573, + 14986, + 9089, + 19438, + 30252, + 5817, + 15065, + 33260, + 13401, + 29486, + 8799, + 33138, + 60984, + 8170, + 90784, + 72606, + 12874, + 4164, + 12201, + 11927, + 79543, + 46633, + 6828, + 44029, + 60072, + 29388, + 6379, + 6706, + 6811, + 12978, + 4791, + 416041, + 11085, + 17358, + 84914, + 10058, + 16007, + 168031, + 7924, + 11070, + 151899, + 16476, + 188870, + 9880, + 34307, + 9907, + 18878, + 13769, + 7507, + 40406, + 8534, + 21940, + 2709, + 23266, + 326312, + 27181, + 102452, + 5803, + 5531, + 165484, + 7979, + 165058, + 110411, + 7389, + 4515, + 7265, + 27279, + 12126, + 17211, + 7894, + 5600, + 8412, + 20858, + 14917, + 160357, + 3691, + 14298, + 6726, + 8397, + 13463, + 12656, + 24916, + 19335, + 24536, + 30588, + 19051, + 4664, + 39278, + 18495, + 5617, + 10855, + 5661, + 8728, + 9035, + 43841, + 5781, + 196832, + 3909, + 134920, + 6270, + 8920, + 19294, + 7365, + 164391, + 16889, + 8882, + 208672, + 10465, + 29543, + 18903, + 40901, + 71243, + 9898, + 45335, + 358385, + 247388, + 18111, + 3130, + 83131, + 5372, + 7658, + 6462, + 23857, + 18512, + 20343, + 19602, + 107686, + 8652, + 19184, + 29267, + 11299, + 43607, + 5645, + 41404, + 13682, + 9364, + 12122, + 20676, + 23402, + 10336, + 24021, + 6345, + 9598, + 6880, + 7500, + 8146, + 9417, + 16684, + 30125, + 61501, + 14680, + 11026, + 7426, + 12451, + 5908, + 5466, + 206375, + 21831, + 6856, + 3753, + 24390, + 31045, + 22695, + 7433, + 7474, + 7571, + 17886, + 4805, + 5587, + 11880, + 51492, + 5663, + 46235, + 179248, + 14794, + 165730, + 5579, + 7733, + 8982, + 6738, + 14399, + 12979, + 4918, + 28088, + 30827, + 144641, + 82592, + 8372, + 88639, + 48353, + 11342, + 63578, + 147769, + 8507, + 8120, + 9619, + 23005, + 11919, + 26442, + 18110, + 14271, + 41506, + 6814, + 12798, + 54078, + 66634, + 33039, + 11080, + 30275, + 170980, + 69664, + 88807, + 12963, + 22930, + 4806, + 11960, + 24222, + 8097, + 252609, + 11435, + 34066, + 7880, + 6497, + 10068, + 8994, + 48423, + 8744, + 19053, + 46881, + 5332, + 5701, + 19959, + 9364, + 18327, + 22815, + 7536, + 10107, + 4729, + 57056, + 34647, + 10358, + 14089, + 23054, + 12863, + 32965, + 6629, + 56691, + 14384, + 11044, + 37621, + 23996, + 130464, + 98939, + 8751, + 12169, + 8072, + 7324, + 14949, + 5942, + 36978, + 7678, + 43941, + 10375, + 15303, + 108953, + 17185, + 43898, + 8675, + 15731, + 25101, + 24824, + 20508, + 19930, + 38807, + 68387, + 3348, + 7240, + 7573, + 22175, + 10733, + 24803, + 74897, + 85957, + 6958, + 10588, + 15191, + 11011, + 17480, + 14668, + 12489, + 148773, + 4901, + 33993, + 12681, + 14988, + 26981, + 7102, + 10819, + 44253, + 30514, + 22469, + 98250, + 88541, + 78280, + 10920, + 8723, + 5370, + 12423, + 8360, + 18575, + 30535, + 8054, + 76729, + 35509, + 12020, + 5224, + 44798, + 10499, + 16921, + 6110, + 15959, + 5807, + 3730, + 10260, + 5544, + 55958, + 19118, + 14717, + 12328, + 12702, + 13704, + 8828, + 10893, + 48748, + 5012, + 13680, + 6942, + 120378, + 8097, + 5146, + 6678, + 20585, + 14757, + 198964, + 107666, + 17528, + 64216, + 83806, + 13550, + 16211, + 7806, + 27221, + 8129, + 118924, + 12210, + 11022, + 175819, + 52649, + 16263, + 6271, + 6697, + 69143, + 63244, + 32883, + 10378, + 7125, + 12266, + 8252, + 18119, + 297889, + 29523, + 44621, + 5848, + 13930, + 10156, + 7818, + 29171, + 15876, + 5618, + 15296, + 4520, + 192797, + 30547, + 5938, + 5907, + 18867, + 25710, + 90601, + 16391, + 3806, + 12116, + 13300, + 10602, + 5309, + 18629, + 9765, + 29251, + 16314, + 19068, + 48217, + 35683, + 16099, + 167244, + 8936, + 5193, + 161177, + 14575, + 47771, + 9448, + 13800, + 32754, + 74923, + 8507, + 8953, + 17530, + 55757, + 5887, + 11378, + 13389, + 51046, + 47255, + 34182, + 10639, + 14860, + 6094, + 7829, + 209083, + 10521, + 403050, + 80315, + 11663, + 22918, + 15895, + 40822, + 16962, + 37271, + 15695, + 7859, + 181586, + 5302, + 7319, + 12808, + 9373, + 84781, + 26250, + 7687, + 6684, + 73013, + 258369, + 24492, + 16663, + 30573, + 7496, + 13604, + 9635, + 22560, + 223231, + 14381, + 19009, + 10023, + 6681, + 30444, + 97480, + 7160, + 14223, + 7858, + 9064, + 3728, + 52897, + 18407, + 143303, + 14582, + 4093, + 6761, + 670634, + 32839, + 14786, + 7381, + 30896, + 4554, + 4441, + 17783, + 8761, + 6381, + 10709, + 259683, + 14313, + 92130, + 8485, + 49051, + 7607, + 10739, + 30720, + 8223, + 7527, + 8169, + 6527, + 28292, + 11564, + 5899, + 11100, + 14840, + 10376, + 12391, + 18355, + 38040, + 60078, + 24311, + 125269, + 4409, + 27151, + 13104, + 6668, + 26032, + 26298, + 4946, + 7671, + 5354, + 10148, + 123559, + 4459, + 29714, + 7520, + 5779, + 7896, + 11121, + 12847, + 15078, + 12226, + 66054, + 6361, + 6389, + 35634, + 8754, + 26184, + 4813, + 124272, + 10788, + 10832, + 13834, + 396026, + 12694, + 16081, + 14396, + 11121, + 8593, + 9233, + 9428, + 8242, + 7374, + 10849, + 9561, + 16910, + 33048, + 16915, + 1579604, + 68782, + 5575, + 48900, + 69163, + 14154, + 56728, + 156455, + 10538, + 130101, + 20583, + 5314, + 22999, + 16118, + 9866, + 7198, + 92217, + 61755, + 27346, + 59439, + 49149, + 107616, + 6552, + 67028, + 15008, + 9040, + 76422, + 7690, + 4597, + 14692, + 81277, + 5085, + 6537, + 91636, + 5937, + 12886, + 9592, + 43654, + 38509, + 16340, + 25362, + 13005, + 10486, + 4105, + 6241, + 30212, + 8657, + 7474, + 6364, + 44075, + 16690, + 6642, + 10069, + 7349, + 7033, + 5497, + 7474, + 52171, + 4679, + 36610, + 11728, + 35748, + 5157, + 12916, + 22802, + 18291, + 12332, + 25989, + 5384, + 10329, + 51014, + 5737, + 6663, + 9131, + 52744, + 256425, + 1265488, + 27909, + 107396, + 7967, + 8345, + 32590, + 5419, + 43836, + 115430, + 7461, + 6767, + 12345, + 10651, + 7275, + 5248, + 17156, + 30219, + 5204, + 8247, + 10478, + 13004, + 45092, + 17431, + 36261, + 26053, + 6189, + 171230, + 6620, + 77812, + 19234, + 8452, + 6244, + 16326, + 13901, + 13489, + 8491, + 145973, + 14040, + 61760, + 12009, + 7408, + 73799, + 24412, + 5070, + 9931, + 12035, + 26165, + 17191, + 6452, + 27569, + 7447, + 161353, + 11274, + 4873, + 67070, + 4259194, + 33693, + 15405, + 206517, + 5860, + 42803, + 121946, + 7640, + 22970, + 4541, + 7893, + 3872, + 11928, + 29455, + 7318, + 9367, + 22201, + 7173, + 616246, + 33299, + 7922, + 107572, + 8993, + 64852, + 13325, + 5207, + 55680, + 39760, + 145619, + 8165, + 75529, + 82737, + 8870, + 90260, + 8261, + 39578, + 50417, + 5783, + 7240, + 6794, + 6259, + 21440, + 16703, + 7449, + 16983, + 94299, + 6714, + 26952, + 51736, + 8567, + 19653, + 5312, + 60446, + 6284, + 3103, + 12836, + 75236, + 190662, + 17614, + 10303, + 13709, + 31690, + 36831, + 26542, + 4374, + 26263, + 7711, + 167182, + 117986, + 10008, + 38996, + 10636, + 11261, + 3528, + 184243, + 6988, + 11693, + 204959, + 18749, + 8023, + 51158, + 9780, + 5930, + 20233, + 59043, + 5201, + 6765, + 10048, + 24432, + 29846, + 15690, + 29817, + 9618, + 44948, + 5477, + 28907, + 10660, + 4543, + 23574, + 7006, + 10068, + 6528, + 58894, + 9182, + 6283, + 40482, + 19845, + 4983, + 13373, + 5075, + 6210, + 2841, + 6597, + 12732, + 16687, + 11405, + 11842, + 4287, + 20246, + 298956, + 31637, + 43600, + 23500, + 68354, + 93173, + 34056, + 9514, + 11119, + 8201, + 80681, + 16775, + 22966, + 7094, + 32579, + 8660, + 33762, + 11119, + 7918, + 4404, + 421593, + 6620, + 12192, + 3217, + 81054, + 9228, + 36306, + 46906, + 25432, + 7736, + 12361, + 169773, + 18402, + 9162, + 6566, + 68700, + 5656, + 15810, + 13568, + 24241, + 8957, + 15677, + 20269, + 184772, + 31737, + 51978, + 8813, + 7677, + 6100, + 7689, + 2904, + 13771, + 8941, + 4870, + 291965, + 9598, + 43787, + 16007, + 10077, + 6365, + 17231, + 224499, + 431523, + 26790, + 45304, + 13250, + 35678, + 160189, + 8518, + 55916, + 88771, + 218972, + 16132, + 7208, + 127190, + 9427, + 54344, + 10566, + 83004, + 4786, + 10956, + 51501, + 36978, + 13028, + 67008, + 6828, + 13095, + 35736, + 80171, + 12886, + 14051, + 16346, + 9414, + 5146, + 44077, + 93720, + 10673, + 21257, + 12228, + 5327, + 14445, + 38418, + 19007, + 10176, + 11791, + 6385, + 48625, + 20190, + 12111, + 9231, + 7776, + 8502, + 3720, + 14400, + 8820, + 10465, + 10037, + 12595, + 14778, + 13440, + 29224, + 6385, + 5041, + 8586, + 13845, + 13507, + 9432, + 16437, + 17474, + 161636, + 83628, + 13833, + 185238, + 48435, + 17104, + 108220, + 10876, + 16754, + 6527, + 121663, + 23438, + 4767, + 52866, + 13932, + 17501, + 13205, + 9412, + 56031, + 5666, + 109497, + 9569, + 14788, + 5866, + 6607, + 29671, + 180255, + 6143, + 94356, + 5038, + 4603, + 7691, + 12532, + 9546, + 18950, + 6443, + 98618, + 37222, + 52762, + 26194, + 8008, + 5043, + 12090, + 5315, + 12328, + 11109, + 8042, + 10946, + 19312, + 5194, + 4934, + 13978, + 5674, + 20940, + 9787, + 16507, + 42787, + 23278, + 6481, + 10611, + 6397, + 20647, + 4329, + 33390, + 31238, + 13571, + 9496, + 47427, + 12114, + 10614, + 4895, + 22259, + 7908, + 63214, + 46935, + 38594, + 7631, + 12277, + 19363, + 23734, + 8743, + 40039, + 14456, + 35263, + 8237, + 20758, + 8528, + 26684, + 7089, + 66726, + 5271, + 8679, + 10156, + 17983, + 52409, + 36258, + 9769, + 24111, + 101223, + 17102, + 13117, + 8048, + 22591, + 7228, + 16222, + 15256, + 39107, + 6049, + 8302, + 44823, + 45715, + 5521, + 9963, + 42673, + 7070, + 24384, + 15217, + 9079, + 5345, + 7132, + 11323, + 6080, + 17331, + 4633, + 29422, + 28904, + 81815, + 7217, + 8148, + 32387, + 5817, + 18922, + 5800, + 32622, + 4100, + 6246, + 12533, + 12748, + 10400, + 5640, + 10799, + 6651, + 6091, + 11135, + 5643, + 6450, + 23119, + 24845, + 6381, + 20567, + 137244, + 84254, + 8911, + 8876, + 43651, + 24372, + 8580, + 43869, + 17524, + 146896, + 10767, + 955323, + 29451, + 175199, + 217602, + 11681, + 17985, + 16010, + 18348, + 4814, + 155654, + 14185, + 11811, + 14717, + 21988, + 9157, + 138618, + 5766, + 14640, + 18198, + 14566, + 17668, + 13935, + 46408, + 14287, + 15007, + 9229, + 3854, + 11044, + 15995, + 8916, + 9231, + 8627, + 11014, + 11340, + 137544, + 58196, + 6538, + 12745, + 8840, + 20556, + 10755, + 10965, + 12362, + 390541, + 14782, + 8708, + 9543, + 8824, + 12125, + 13467, + 9441, + 9666, + 11570, + 8664, + 18726, + 6126, + 5958, + 5543, + 4575, + 8536, + 11620, + 10167, + 5404, + 7817, + 18010, + 8632, + 18335, + 23947, + 102429, + 26325, + 165969, + 12782, + 10463, + 18544, + 5059, + 9994, + 20977, + 82189, + 6192, + 18807, + 12790, + 63163, + 12369, + 63104, + 17606, + 17507, + 63858, + 11629, + 251600, + 43937, + 12278, + 10896, + 19203, + 14950, + 330088, + 8305, + 40561, + 40320, + 7179, + 14115, + 13085, + 40499, + 29348, + 9986, + 19106, + 9907, + 4860, + 197818, + 6966, + 3137, + 32147, + 38833, + 10137, + 6730, + 5525, + 4224, + 19950, + 8309, + 105752, + 34301, + 295529, + 5455, + 16251, + 17449, + 8977, + 12610, + 12291, + 5227, + 25411, + 47245, + 44817, + 6282, + 127708, + 11743, + 26811, + 47889, + 7643, + 8878, + 8555, + 5223, + 6238, + 19646, + 17240, + 7587, + 13328, + 15124, + 16197, + 89208, + 5297, + 5001, + 41518, + 31888, + 11144, + 10686, + 64237, + 11928, + 73854, + 27818, + 5576, + 12571, + 277800, + 19590, + 19409, + 13431, + 18156, + 128355, + 8255, + 106181, + 8228, + 13287, + 7652, + 875627, + 6406, + 10957, + 9448, + 118372, + 21081, + 41509, + 19421, + 4933, + 7019, + 16651, + 16850, + 58690, + 12592, + 187630, + 10670, + 68191, + 10081, + 37763, + 20152, + 76883, + 20586, + 20618, + 10089, + 100534, + 15919, + 7389, + 253837, + 7735, + 14365, + 7044, + 19550, + 20823, + 159008, + 29648, + 8328, + 37596, + 5955, + 9925, + 45248, + 6260, + 27196, + 186236, + 8218, + 55407, + 42357, + 77049, + 5245, + 25971, + 47586, + 4805, + 7239, + 8077, + 5739, + 17838, + 11290, + 8096, + 85958, + 7891, + 15338, + 46821, + 95740, + 13174, + 34565, + 15317, + 135882, + 84127, + 12295, + 9269, + 16546, + 8686, + 36994, + 219409, + 7192, + 10359, + 8702, + 8265, + 24241, + 135826, + 15090, + 13901, + 9377, + 14255, + 62219, + 12780, + 90630, + 7463, + 5902, + 189996, + 28422, + 7261, + 6425, + 12192, + 93175, + 15932, + 55921, + 13941, + 262711, + 7830, + 199172, + 30864, + 20461, + 37465, + 5103, + 18625, + 237507, + 10974, + 56611, + 43936, + 4973, + 7296, + 5226, + 19796, + 8295, + 26400, + 18315, + 15441, + 15612, + 14960, + 1584917, + 9817, + 6146, + 14917, + 9671, + 6228, + 268392, + 7082, + 215117, + 6682, + 7542, + 9385, + 8030, + 4337, + 21488, + 5027, + 12545, + 131830, + 28686, + 10422, + 7513, + 46334, + 84830, + 66135, + 6067, + 17562, + 86023, + 113525, + 14611, + 27968, + 6669, + 49578, + 5955, + 3903, + 37917, + 68159, + 7714, + 13565, + 36273, + 22372, + 9658, + 9587, + 79550 + ] + }, + { + "counters": [ + 9037, + 11555, + 59544, + 18076, + 277263, + 13827, + 5377, + 44401, + 22550, + 7834, + 59336, + 97492, + 7888, + 44906, + 23569, + 30471, + 9511, + 5607, + 51105, + 11150, + 23405, + 38238, + 148745, + 9854, + 20710, + 9615, + 15642, + 13554, + 15156, + 4817, + 9298, + 53590, + 12881, + 79578, + 72806, + 33974, + 8317, + 17779, + 12260, + 5384, + 22583, + 7058, + 8293, + 14632, + 3334, + 6218, + 12373, + 6297, + 20197, + 23470, + 21316, + 5952, + 19952, + 110854, + 8162, + 68212, + 31308, + 122913, + 3188, + 69088, + 6600, + 75622, + 14453, + 125858, + 8424, + 5325, + 8026, + 27711, + 13712, + 27917, + 5377, + 7714, + 22951, + 4923, + 57909, + 20883, + 4975, + 11503, + 20280, + 5633, + 28577, + 5523, + 4441, + 40434, + 19048, + 7704, + 20528, + 24159, + 81054, + 6430, + 14016, + 11324, + 418180, + 4539, + 31404, + 21896, + 41476, + 77488, + 20291, + 4330, + 24977, + 14139, + 10776, + 7604, + 53666, + 329624, + 128646, + 11125, + 232887, + 11344, + 57001, + 12420, + 4644, + 1902450, + 30287, + 7594, + 14188, + 6374, + 4599, + 22879, + 8895, + 22218, + 19714, + 43627, + 3989, + 71336, + 222540, + 12931, + 6444, + 10639, + 6496, + 13314, + 15512, + 14423, + 12468, + 79695, + 8072, + 13110, + 10967, + 15561, + 3410, + 9919, + 47826, + 8494, + 15196, + 7409, + 10184, + 8529, + 4215, + 9436, + 39671, + 121682, + 16701, + 8489, + 5069, + 6849, + 29771, + 6771, + 167347, + 4267, + 33846, + 9204, + 135134, + 470075, + 4768, + 30714, + 5719, + 11123, + 6438, + 43150, + 5856, + 7761, + 13075, + 36862, + 7740, + 48601, + 38043, + 6825, + 3940, + 8271, + 8729, + 7201, + 5552, + 8177, + 331588, + 4691, + 148833, + 18236, + 6061, + 5967, + 7363, + 16624, + 16505, + 156564, + 3660, + 64833, + 9154, + 17476, + 4849, + 64362, + 5643, + 13665, + 26599, + 7773, + 87904, + 7661, + 15935, + 54544, + 5753, + 7076, + 28137, + 10984, + 45856, + 11638, + 3410, + 77657, + 46188, + 8179, + 35190, + 13916, + 15269, + 6219, + 18108, + 13229, + 7655, + 8892, + 13832, + 9359, + 26857, + 723941, + 20184, + 7149, + 12074, + 25570, + 104819, + 9362, + 13737, + 24385, + 198800, + 38329, + 21419, + 6597, + 14402, + 56411, + 42117, + 5711, + 101198, + 25277, + 56240, + 7570, + 9316, + 11321, + 13306, + 10893, + 15543, + 4688, + 28099, + 48174, + 6935, + 9512, + 44882, + 6056, + 8026, + 9931, + 9685, + 8127, + 280957, + 24916, + 18449, + 23561, + 73747, + 51453, + 14309, + 14405, + 11461, + 66491, + 20860, + 12435, + 41313, + 5496, + 16959, + 6483, + 6721, + 11860, + 27902, + 7983, + 9233, + 2126819, + 11772, + 6172, + 18276, + 6119, + 6608, + 8842, + 9700, + 15056, + 12682, + 8736, + 86055, + 9368, + 24653, + 3610, + 160789, + 47531, + 27606, + 5514, + 32297, + 8866, + 12056, + 15587, + 117893, + 9172, + 6761, + 6110, + 94801, + 3916, + 14107, + 12050, + 59014, + 9238, + 6218, + 4495, + 285999, + 20458, + 10720, + 24851, + 18697, + 5629, + 8631, + 40995, + 132569, + 19836, + 56743, + 3083, + 36041, + 24459, + 13800, + 11574, + 5945, + 28148, + 25802, + 20433, + 17422, + 10186, + 6443, + 32604, + 103391, + 6053, + 64961, + 23944, + 8965, + 3925, + 15910, + 22051, + 36967, + 9865, + 23915, + 11960, + 8541, + 14292, + 116506, + 44928, + 48310, + 13870, + 11462, + 17091, + 18499, + 15629, + 27412, + 8899, + 12168, + 7202, + 13637, + 50354, + 12904, + 4267, + 14043, + 34075, + 43641, + 5423, + 173615, + 26463, + 7095, + 92055, + 6956, + 7756, + 33500, + 6939, + 6399, + 13074, + 6450, + 10492, + 11493, + 7805, + 11323, + 4159, + 126251, + 5368, + 12710, + 6338, + 10698, + 10982, + 11576, + 16412, + 135978, + 5849, + 16429, + 7301, + 7016, + 6982, + 9518, + 20430, + 14392, + 50181, + 17090, + 181121, + 6300, + 21614, + 19904, + 30996, + 8133, + 10791, + 14326, + 40943, + 46458, + 34079, + 16181, + 7533, + 59067, + 5528, + 60873, + 65352, + 20117, + 66272, + 23881, + 12278, + 8382, + 76934, + 9737, + 6606, + 8843, + 49663, + 7000, + 16125, + 163328, + 13026, + 7411, + 12665, + 7630, + 9912, + 31127, + 18341, + 9790, + 11309, + 12529, + 13394, + 11582, + 5775, + 5350, + 8683, + 9075, + 4912, + 7924, + 19874, + 14112, + 18395, + 9565, + 23751, + 24583, + 4711, + 13764, + 92834, + 39009, + 5448, + 36439, + 25244, + 23991, + 9331, + 23144, + 11437, + 12788, + 5873, + 80727, + 30670, + 14223, + 39577, + 47236, + 8684, + 9799, + 11348, + 28788, + 5993, + 9063, + 22229, + 38440, + 100564, + 187536, + 22913, + 16232, + 15124, + 130095, + 32123, + 119866, + 9237, + 17730, + 13833, + 8209, + 18901, + 300300, + 88612, + 3995, + 166231, + 11442, + 122743, + 29501, + 6211, + 5496, + 11578, + 10367, + 256862, + 16262, + 54047, + 3450, + 13452, + 21996, + 9016, + 6102, + 8099, + 12053, + 5129, + 29581, + 19122, + 67684, + 6116, + 6982, + 20849, + 39513, + 60512, + 13875, + 37916, + 10513, + 32007, + 19160, + 16099, + 5677, + 4596, + 6654, + 14567, + 8857, + 171031, + 6181, + 94846, + 110885, + 5982, + 12257, + 129231, + 8947, + 164784, + 41246, + 5765, + 168716, + 71371, + 8641, + 216010, + 4794, + 11278, + 5030, + 37326, + 10680, + 7611, + 7446, + 49313, + 52224, + 8962, + 8817, + 6574, + 10418, + 8457, + 20795, + 13689, + 13787, + 6723, + 14560, + 46915, + 10379, + 5093, + 23720, + 355567, + 10152, + 34953, + 7744, + 55514, + 24945, + 7089, + 8835, + 10127, + 122740, + 7967, + 5284, + 14903, + 5351, + 22955, + 24121, + 34496, + 8413, + 8474, + 120075, + 187425, + 140658, + 11031, + 24941, + 11973, + 5791, + 6435, + 8685, + 5988, + 13213, + 36180, + 13978, + 3351, + 45998, + 45230, + 9667, + 22091, + 3873, + 338799, + 37067, + 58199, + 16273, + 198796, + 39004, + 14934, + 36536, + 17403, + 31441, + 18195, + 10231, + 6405, + 20633, + 57438, + 160760, + 40349, + 10294, + 5611, + 5537, + 6934, + 118529, + 171896, + 76145, + 4953, + 4311, + 123241, + 8452, + 14793, + 15148, + 947703, + 14050, + 113865, + 18394, + 8025, + 8918, + 10645, + 8010, + 22319, + 7685, + 7941, + 18472, + 14274, + 9229, + 92852, + 72572, + 6624, + 52016, + 21970, + 7885, + 183784, + 11949, + 15157, + 8835, + 7099, + 39157, + 14085, + 15578, + 7595, + 65602, + 15200, + 17260, + 15417, + 7390, + 4379, + 154816, + 38136, + 3553, + 3314, + 43456, + 52496, + 211635, + 26866, + 164114, + 30295, + 3146, + 11538, + 20453, + 6583, + 28719, + 45084, + 41979, + 38530, + 6905, + 100394, + 8918, + 132557, + 6456, + 13696, + 12450, + 164256, + 15587, + 203887, + 8961, + 78506, + 102145, + 17361, + 17871, + 4063, + 10437, + 23387, + 9263, + 18344, + 14611, + 3591, + 11772, + 39255, + 439958, + 20036, + 7719, + 8282, + 12470, + 3406, + 4814, + 5018, + 168185, + 8640, + 64453, + 27241, + 34026, + 11443, + 10651, + 35123, + 42033, + 26774, + 16594, + 6179, + 16886, + 19805, + 11053, + 61832, + 43478, + 6348, + 20395, + 89830, + 35553, + 8177, + 6342, + 11890, + 40317, + 38017, + 6680, + 8124, + 11019, + 6976, + 4782, + 91964, + 24255, + 9810, + 161051, + 6607, + 10468, + 91844, + 191235, + 6260, + 4818, + 98619, + 38105, + 7388, + 11933, + 5045, + 74288, + 247081, + 37090, + 9571, + 11450, + 25482, + 12695, + 6687, + 17973, + 8767, + 4518, + 27757, + 11497, + 19783, + 75443, + 5243, + 81967, + 13224, + 7925, + 10762, + 32592, + 36980, + 13735, + 13681, + 162746, + 3346, + 13567, + 12324, + 12239, + 14032, + 13309, + 9742, + 17025, + 7786, + 261054, + 37380, + 8232, + 4900, + 13692, + 266310, + 71425, + 5645, + 95837, + 8672, + 5735, + 16307, + 45583, + 7424, + 16917, + 80460, + 12202, + 7877, + 19744, + 292135, + 15633, + 7573, + 8588, + 20588, + 15230, + 36807, + 5597, + 5471, + 18178, + 10755, + 5231, + 7926, + 19894, + 7112, + 310644, + 21384, + 6965, + 37419, + 85377, + 215846, + 163000, + 8604, + 402527, + 5413, + 14145, + 4725, + 46647, + 7009, + 16036, + 50311, + 3871, + 23961, + 68463, + 5197, + 7025, + 23201, + 38334, + 5418, + 12462, + 28633, + 10407, + 11085, + 13071, + 172578, + 7898, + 10559, + 18426, + 17311, + 9214, + 5114, + 16522, + 6773, + 61222, + 92183, + 15987, + 12257, + 28446, + 3620, + 128022, + 8522, + 9829, + 13129, + 232889, + 19450, + 5978, + 220206, + 26141, + 9491, + 4902, + 16446, + 619105, + 9808, + 7020, + 57109, + 7832, + 8552, + 29665, + 5374, + 26206, + 11221, + 123430, + 27422, + 25475, + 7869, + 7189, + 24145, + 12323, + 61007, + 10234, + 12053, + 32422, + 77670, + 143371, + 19651, + 6040, + 121571, + 30110, + 9413, + 69555, + 9082, + 8587, + 47659, + 61170, + 9711, + 9197, + 100551, + 5716, + 41992, + 7432, + 6218, + 13621, + 12120, + 17789, + 14428, + 15699, + 11601, + 12958, + 4834, + 22613, + 7239, + 7781, + 5230, + 9165, + 17433, + 24958, + 5325, + 41777, + 14254, + 53058, + 26169, + 55594, + 7435, + 61772, + 8282, + 75371, + 10927, + 8460, + 15852, + 9511, + 174746, + 16367, + 15784, + 9202, + 5872, + 13482, + 14304, + 29836, + 9220, + 3226, + 54384, + 7183, + 23994, + 3122, + 87666, + 6339, + 8470, + 69461, + 14212, + 131034, + 3644, + 124713, + 26679, + 3045, + 48400, + 6137, + 263021, + 11272, + 7435, + 18965, + 119801, + 38878, + 15178, + 117300, + 215787, + 5833, + 229111, + 8188, + 5237, + 95081, + 8485, + 188696, + 6120, + 26970, + 14038, + 141397, + 67211, + 20239, + 9218, + 50329, + 13282, + 52580, + 534664, + 10475, + 12778, + 87098, + 3765, + 4828, + 27744, + 10199, + 8527, + 8739, + 45858, + 41669, + 25916, + 16306, + 167979, + 7295, + 61779, + 64259, + 173761, + 44678, + 102869, + 12021, + 82312, + 71611, + 11777, + 9496, + 12079, + 15125, + 13795, + 65350, + 57283, + 19591, + 12418, + 8167, + 9551, + 37993, + 8739, + 246927, + 16503, + 157209, + 7893, + 14562, + 18929, + 19846, + 9646, + 326339, + 9291, + 82491, + 18337, + 7345, + 19667, + 6663, + 9137, + 6852, + 9450, + 26227, + 4088, + 4344, + 54356, + 13153, + 15229, + 38569, + 2979, + 39009, + 27451, + 11014, + 40038, + 4672, + 5653, + 61049, + 6374, + 184279, + 37097, + 15634, + 137484, + 13100, + 9474, + 25695, + 17201, + 5804, + 188712, + 137297, + 9157, + 4406, + 51752, + 21062, + 15398, + 20710, + 225389, + 50887, + 6810, + 16688, + 13969, + 12444, + 27968, + 4867, + 6926, + 7088, + 34716, + 5614, + 37573, + 148979, + 79608, + 15338, + 8338, + 14471, + 53559, + 6365, + 6050, + 25992, + 162320, + 215832, + 8628, + 6805, + 20708, + 9561, + 12633, + 108987, + 19230, + 10489, + 30903, + 34631, + 43141, + 7770, + 6937, + 4139, + 67395, + 141673, + 4369, + 47122, + 23768, + 6530, + 9364, + 48565, + 3816, + 9121, + 13830, + 25294, + 11557, + 15630, + 14740, + 10089, + 52348, + 11239, + 22134, + 37409, + 38948, + 5420, + 11331, + 32730, + 112832, + 11652, + 7150, + 15321, + 39859, + 9172, + 6160, + 140676, + 82662, + 11751, + 13477, + 11487, + 25128, + 34304, + 10716, + 328422, + 235909, + 7426, + 9702, + 200258, + 20575, + 2932, + 9125, + 20575, + 26822, + 8367, + 56359, + 45413, + 4102, + 14593, + 11083, + 5791, + 9687, + 9366, + 128688, + 6597, + 28394, + 4997, + 7189, + 22252, + 14344, + 13989, + 165949, + 17362, + 19409, + 11250, + 18098, + 6034, + 35638, + 168047, + 7469, + 9289, + 7637, + 20303, + 62261, + 52024, + 14768, + 165259, + 4643, + 16881, + 10229, + 12994, + 12196, + 9075, + 143374, + 7404, + 114850, + 158458, + 21098, + 41396, + 14106, + 19513, + 2484, + 16026, + 4755, + 4271, + 14186, + 14416, + 8820, + 23690, + 133020, + 54340, + 6597, + 13619, + 11232, + 7062, + 2572, + 14267, + 5523, + 37318, + 6641, + 20609, + 6864, + 20067, + 6385, + 18397, + 22344, + 13961, + 58556, + 19292, + 67153, + 6810, + 5419, + 7315, + 88243, + 28916, + 20619, + 7614, + 6426, + 5108, + 37649, + 27061, + 10348, + 66240, + 17729, + 1532707, + 6886, + 56438, + 16768, + 102468, + 17969, + 9984, + 11617, + 4863, + 11009, + 109789, + 10790, + 24919, + 41515, + 6850, + 15226, + 40912, + 27332, + 141514, + 9836, + 12502, + 27559, + 45719, + 68172, + 23226, + 10539, + 49444, + 46804, + 18948, + 5289, + 13536, + 4879, + 5511, + 18613, + 287936, + 13580, + 18851, + 7798, + 23296, + 14831, + 10659, + 38867, + 9116, + 14631, + 26593, + 8250, + 17931, + 11511, + 37548, + 62713, + 65999, + 15858, + 9353, + 42420, + 19046, + 320993, + 5255, + 20954, + 170326, + 208749, + 21761, + 7757, + 6682, + 5770, + 12588, + 75255, + 15245, + 14812, + 120635, + 42914, + 7372, + 255463, + 11818, + 27244, + 6407, + 6530, + 18352, + 58478, + 23865, + 145019, + 7685, + 12192, + 4599, + 3720, + 7670, + 46216, + 10530, + 10229, + 8514, + 7840, + 6251, + 22109, + 9494, + 11704, + 8464, + 4637, + 49293, + 11858, + 97128, + 12076, + 10975, + 12462, + 66269, + 6955, + 7416, + 17191, + 12771, + 17479, + 23956, + 95252, + 12887, + 6064, + 15585, + 10581, + 13298, + 43405, + 16613, + 59681, + 10213, + 8166, + 13871, + 49219, + 10144, + 6022, + 11731, + 13147, + 7462, + 44231, + 16273, + 15747, + 24520, + 7025, + 38124, + 3922, + 137112, + 3951, + 7913, + 4625, + 8272, + 8100, + 3918, + 46015, + 53125, + 10088, + 34331, + 13383, + 11544, + 7916, + 28751, + 14983, + 32940, + 17034, + 3410, + 12663, + 18316, + 8795, + 363273, + 14917, + 5640, + 16504, + 10199, + 6179, + 11480, + 26197, + 7556, + 4636, + 26932, + 21328, + 8316, + 13584, + 53742, + 61294, + 5442, + 62934, + 22193, + 5116, + 16975, + 93453, + 48366, + 53975, + 11487, + 10698, + 55326, + 5702, + 63315, + 24448, + 37196, + 26457, + 66897, + 48208, + 8605, + 149360, + 49630, + 32137, + 19989, + 35712, + 18072, + 20223, + 26085, + 11190, + 9441, + 44206, + 13395, + 21756, + 7490, + 243148, + 8909, + 28660, + 39351, + 52130, + 14546, + 6457, + 9981, + 43435, + 11776, + 186547, + 165211, + 11815, + 27263, + 16369, + 9025, + 6730, + 4309, + 13355, + 6963, + 49965, + 16107, + 10568, + 10386, + 315242, + 13544, + 10519, + 14368, + 9547, + 8227, + 24533, + 7931, + 66133, + 12857, + 16045, + 70429, + 62147, + 18568, + 98866, + 17254, + 6281, + 8785, + 16378, + 6094, + 7820, + 7979, + 9505, + 20552, + 12622, + 17231, + 66605, + 18414, + 36429, + 10787, + 32627, + 8697, + 9254, + 16364, + 21004, + 11651, + 7189, + 105801, + 8976, + 104023, + 15501, + 16350, + 141528, + 9656, + 70534, + 20482, + 25485, + 14201, + 9613, + 6929, + 13657, + 15426, + 9190, + 15785, + 38094, + 12643, + 7018, + 11334, + 10607, + 11124, + 23441, + 79382, + 69704, + 52208, + 37105, + 309436, + 30385, + 4869, + 9239, + 144190, + 3443, + 22965, + 14537, + 21702, + 14123, + 32571, + 5366, + 34389, + 8796, + 10936, + 30502, + 40297, + 5266, + 479535, + 7768, + 172189, + 24928, + 8470, + 7872, + 8509, + 6516, + 35215, + 11201, + 6708, + 13682, + 56510, + 13930, + 7880, + 10442, + 33473, + 3111, + 22568, + 5171, + 26148, + 6450, + 27578, + 9873, + 14725, + 19853, + 44797, + 7175, + 10876, + 38518, + 12066, + 46770, + 32216, + 3660, + 223688, + 7941, + 6863, + 9105, + 6468, + 6660, + 22024, + 52987, + 2699, + 33770, + 33622, + 12729, + 12707, + 10317, + 11946, + 110533, + 43836, + 11458, + 98087, + 40609, + 44581, + 23794, + 36427, + 8037, + 5044, + 5310, + 9888, + 54740, + 9723, + 5189, + 30952, + 8336, + 9307, + 625649, + 11225, + 10636, + 17341, + 65188, + 45790, + 106954, + 6311, + 15806, + 27772, + 41069, + 13294, + 45356, + 3982, + 21677, + 7640, + 70364, + 38511, + 4890, + 13702, + 6830, + 20935, + 12982, + 114107, + 19483, + 12646, + 40439, + 27833, + 11718, + 3525, + 17795, + 13969, + 8309, + 3368, + 72574, + 17042, + 20473, + 18869, + 11251, + 6551, + 21709, + 11397, + 45313, + 5181, + 5939, + 135915, + 19419, + 9937, + 116152, + 25744, + 33995, + 16228, + 180765, + 58718, + 9974, + 31614, + 29345, + 384425, + 25960, + 264769, + 3139, + 1293358, + 34451, + 11825, + 17044, + 23443, + 4129, + 11517, + 31402, + 22223, + 6100, + 15499, + 29704, + 56911, + 5065, + 6922, + 4401, + 28210, + 10976, + 204946, + 27922, + 11116, + 61216, + 20136, + 6924, + 23914, + 9054, + 13044, + 16707, + 101833, + 8491, + 155098, + 39993, + 40774, + 4042, + 8323, + 6095, + 11622, + 11576, + 22397, + 98551, + 310065, + 11723, + 7297, + 8736, + 14436, + 5288, + 6212, + 5347, + 50358, + 110520, + 3716, + 12093, + 53553, + 13242, + 29739, + 2940, + 4095, + 8140, + 12542, + 8469, + 1578381, + 13182, + 48976, + 5615, + 11872, + 16470, + 37152, + 5824, + 35590, + 21457, + 9669, + 20432, + 7479, + 14702, + 26004, + 41491, + 10520, + 20367, + 15516, + 11963, + 12795, + 82050, + 24770, + 5448, + 63958, + 17882, + 2823, + 55249, + 8358, + 5484, + 8445, + 8526, + 10680, + 100345, + 5943, + 24144, + 13113, + 6213, + 5628, + 8024, + 8995, + 5239, + 12255, + 137635, + 6291, + 20649, + 12862, + 13169, + 13786, + 20634, + 8612, + 9396, + 4860, + 12372, + 123723, + 166049, + 5178, + 20715, + 37072, + 3295, + 13232, + 10154, + 5862, + 10466, + 9472, + 17968, + 9154, + 13123, + 247790, + 4507, + 101764, + 8980, + 407055, + 5362, + 49196, + 9044, + 13947, + 14332, + 4477, + 108227, + 8349, + 11481, + 6192, + 207881, + 221800, + 15242, + 14832, + 7932, + 33544, + 22624, + 10230, + 270972, + 4936, + 26255, + 5880, + 36944, + 101377, + 8675, + 28833, + 18964, + 7629, + 96263, + 54360, + 10373, + 44478, + 54393, + 6849, + 105021, + 9433, + 50261, + 3452, + 152579, + 14317, + 7424, + 28889, + 11109, + 10427, + 10785, + 21547, + 11598, + 61890, + 6143, + 6543, + 5653, + 7541, + 51705, + 14419, + 8969, + 54956, + 7243, + 43326, + 9234, + 30646, + 9906, + 4280983, + 23016, + 7556, + 4733, + 9282, + 37611, + 5696, + 14922, + 22898, + 9038, + 66064, + 8271, + 12245, + 20113, + 161698, + 8740, + 13005, + 9217, + 18222, + 21714, + 6778, + 57934, + 9024, + 98990, + 6100, + 12906, + 9099, + 16395, + 7594, + 7988, + 8028, + 5376, + 15436, + 7598, + 11926, + 4322, + 301858, + 131038, + 6113, + 4597, + 4485, + 33103, + 14765, + 113146, + 5680, + 6814, + 10458, + 37056, + 9666, + 6049, + 9266, + 67905, + 12314, + 125716, + 91844, + 6098, + 11326, + 18626, + 10273, + 7647, + 7965, + 28032, + 11575, + 7940, + 170893, + 9451, + 84229, + 6640, + 254796, + 43778, + 100586, + 145095, + 24756, + 13909, + 39946, + 6532, + 14222, + 27020, + 13052, + 10388, + 7996, + 4487, + 8051, + 8565, + 26237, + 3966, + 16634, + 8108, + 148481, + 11581, + 44461, + 8306, + 12948, + 10330, + 42225, + 22155, + 26337, + 21237, + 47861, + 59958, + 7947, + 26181, + 19976, + 8531, + 14867, + 19988, + 140822, + 12123, + 35140, + 8507, + 50075, + 35904, + 8672, + 28087, + 22606, + 6956, + 16956, + 5781 + ] + } + ], + "top_n": [ + { + "data": "AA==", + "count": 82527104 + }, + { + "data": "AAFUMTk4NgAAAPw=", + "count": 2002607 + }, + { + "data": "AAFUMjM1NwAAAPw=", + "count": 744504 + }, + { + "data": "AAFUMTc1NAAAAPw=", + "count": 501265 + } + ], + "default_value": 0 + }, + "null_count": 0, + "tot_col_size": 0, + "last_update_version": 419284911767420999, + "correlation": 0 + }, + "idx3": { + "histogram": { + "ndv": 58, + "buckets": [ + { + "count": 247, + "lower_bound": "AUFDVElWSVRZ/wAAAAAAAAAA9wFBTFMAAAAAAPoBMTAAAAAAAAD5", + "upper_bound": "AUFDVElWSVRZ/wAAAAAAAAAA9wFBTFMAAAAAAPoBMTAAAAAAAAD5", + "repeats": 247 + }, + { + "count": 259072, + "lower_bound": "AUFDVElWSVRZ/wAAAAAAAAAA9wFBTFMAAAAAAPoBMjAAAAAAAAD5", + "upper_bound": "AUFDVElWSVRZ/wAAAAAAAAAA9wFBTFMAAAAAAPoBMzAAAAAAAAD5", + "repeats": 0 + }, + { + "count": 272278, + "lower_bound": "AUFDVElWSVRZ/wAAAAAAAAAA9wFBTFMAAAAAAPoBMzAAAAAAAAD5", + "upper_bound": "AUFDVElWSVRZ/wAAAAAAAAAA+A==", + "repeats": 0 + }, + { + "count": 272349, + "lower_bound": "AUFSVElDTEUA/gFFQ08AAAAAAPoBMTAAAAAAAAD5", + "upper_bound": "AUFSVElDTEUA/gFFQ08AAAAAAPoBMTAAAAAAAAD5", + "repeats": 71 + }, + { + "count": 331436, + "lower_bound": "AUFSVElDTEUA/gFFQ08AAAAAAPoBMjAAAAAAAAD5", + "upper_bound": "AUFSVElDTEUA/gFFQ08AAAAAAPoBMjAAAAAAAAD5", + "repeats": 59087 + }, + { + "count": 333116, + "lower_bound": "AUFSVElDTEUA/gFFQ08AAAAAAPoBMzAAAAAAAAD5", + "upper_bound": "AUFSVElDTEUA/gFFQ08AAAAAAPoBMzAAAAAAAAD5", + "repeats": 1680 + }, + { + "count": 335951, + "lower_bound": "AUFSVElDTEUA/gFFQ08AAAAAAPoBMzIAAAAAAAD5", + "upper_bound": "AUFSVElDTEUA/gFFQ08AAAAAAPoBMzIAAAAAAAD5", + "repeats": 2835 + }, + { + "count": 336494, + "lower_bound": "AUFSVElDTEUA/gFFQ08AAAAAAPoBMzkAAAAAAAD5", + "upper_bound": "AUFSVElDTEUA/gFFQ08AAAAAAPoBMzkAAAAAAAD5", + "repeats": 543 + }, + { + "count": 336495, + "lower_bound": "AU1PTUVOVAAA/QFFQ08AAAAAAPoBMTAAAAAAAAD5", + "upper_bound": "AU1PTUVOVAAA/QFFQ08AAAAAAPoBMTAAAAAAAAD5", + "repeats": 1 + }, + { + "count": 336496, + "lower_bound": "AU1PTUVOVAAA/QFFQ08AAAAAAPoBMjAAAAAAAAD5", + "upper_bound": "AU1PTUVOVAAA/QFFQ08AAAAAAPoBMjAAAAAAAAD5", + "repeats": 1 + }, + { + "count": 11027028, + "lower_bound": "AVBPU1QAAAAA+wFFQ08AAAAAAPoBMzIAAAAAAAD5", + "upper_bound": "AVFVRVNUSU9O/wAAAAAAAAAA9wFFQ08AAAAAAPoBMjAAAAAAAAD5", + "repeats": 0 + }, + { + "count": 84988997, + "lower_bound": "AVRPUElDAAAA/AFFQ08AAAAAAPoBMjAAAAAAAAD5", + "upper_bound": "AVRPUElDAAAA/AFFQ08AAAAAAPoBMzAAAAAAAAD5", + "repeats": 0 + }, + { + "count": 87135423, + "lower_bound": "AVRPUElDAAAA/AFFQ08AAAAAAPoBMzAAAAAAAAD5", + "upper_bound": "AVRPUElDAAAA/AFFQ08AAAAAAPoBMzIAAAAAAAD5", + "repeats": 0 + }, + { + "count": 87475767, + "lower_bound": "AVRPUElDAAAA/AFFQ08AAAAAAPoBMzIAAAAAAAD5", + "upper_bound": "AVRPUElDAAAA/AFFQ08AAAAAAPoBMzkAAAAAAAD5", + "repeats": 0 + }, + { + "count": 87784727, + "lower_bound": "AVRPUElDAAAA/AFFQ08AAAAAAPoBMzkAAAAAAAD5", + "upper_bound": "AVZJREVPAAAA/AFFQ08AAAAAAPoBMzkAAAAAAAD5", + "repeats": 0 + } + ] + }, + "cm_sketch": { + "rows": [ + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 40268, + 0, + 0, + 59087, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 560, + 0, + 0, + 0, + 0, + 454, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 29489, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 12283, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1529470, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 162814, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 41422, + 59535, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 106673, + 0, + 0, + 262, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 296677, + 0, + 0, + 0, + 0, + 0, + 0, + 247, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 239878, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 41422, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 117, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 26534, + 0, + 0, + 0, + 0, + 372426, + 0, + 0, + 0, + 179445, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2242, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 100457, + 0, + 0, + 0, + 0, + 125005, + 0, + 0, + 0, + 0, + 0, + 17041, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 139, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 622, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 111482, + 0, + 0, + 354674, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2864, + 0, + 0, + 0, + 10482318, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4318, + 0, + 0, + 0, + 0, + 0, + 0, + 173, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 47080, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 245963, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 329803, + 0, + 44664, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 477148, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 82922, + 0, + 0, + 0, + 0, + 11991, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 242, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 120, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 462081, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 37369, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8398, + 348694, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 31443, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3236, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2835, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 77989, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1565530, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11928, + 0, + 0, + 0, + 0, + 0, + 0, + 1579504, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 811993, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8310, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 19955, + 0, + 0, + 0, + 0, + 0, + 250817, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 10926229, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12283, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1680, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4013, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 49, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 330143, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 32251, + 0, + 0, + 2587, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 64216, + 25040, + 0, + 0, + 0, + 0, + 8697, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3264, + 0, + 0, + 0, + 0, + 652, + 0, + 1565318, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 371914, + 0, + 0, + 0, + 0, + 0, + 175618, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 543, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 287, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2835, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 71, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 242, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 82922, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 59535, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 175618, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 40268, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 329803, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 811993, + 0, + 0, + 0, + 0, + 652, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 462081, + 0, + 0, + 0, + 330143, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 173, + 0, + 0, + 0, + 0, + 0, + 0, + 245963, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 560, + 0, + 0, + 0, + 0, + 0, + 0, + 4013, + 0, + 0, + 0, + 0, + 0, + 372426, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1579504, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 26534, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 10482318, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4247, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8697, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 49, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 477148, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 287, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 46326, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 354674, + 17041, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2587, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11991, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 77989, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 66462, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 100457, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 19955, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2864, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 348694, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 247, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8310, + 262, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 179445, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 622, + 0, + 0, + 0, + 0, + 44664, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 239878, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1565530, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 31443, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 41422, + 0, + 0, + 0, + 0, + 0, + 12283, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 117, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8398, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 29489, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 296677, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12283, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 111482, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 59087, + 0, + 0, + 10926229, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3264, + 0, + 0, + 1565318, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11928, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2242, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 139, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 454, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 543, + 0, + 0, + 0, + 0, + 0, + 0, + 250817, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 162814, + 0, + 0, + 0, + 0, + 0, + 1529470, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 37369, + 0, + 0, + 0, + 1680, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3236, + 0, + 32251, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 106673, + 0, + 0, + 0, + 754, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 64216, + 0, + 125005, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 371914, + 120, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 32251, + 0, + 0, + 250817, + 0, + 0, + 0, + 0, + 0, + 173, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 179445, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 371914, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 64216, + 0, + 0, + 0, + 1680, + 0, + 0, + 0, + 0, + 25040, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 262, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 59535, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 239878, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 10482318, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4247, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 477148, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 77989, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 40268, + 372426, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 175618, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3236, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 117, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 41422, + 111482, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 22790, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 37369, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 26534, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8310, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 560, + 0, + 0, + 0, + 0, + 0, + 0, + 652, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 296677, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 120, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11991, + 46326, + 330143, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 29489, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 139, + 348694, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4013, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12283, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12283, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 356916, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 811993, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1565530, + 0, + 754, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 242, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 59087, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8697, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 82922, + 0, + 0, + 17041, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 49, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1579504, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1565318, + 3264, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 71, + 0, + 0, + 0, + 0, + 0, + 0, + 31443, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 454, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2864, + 0, + 0, + 125005, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 287, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 10926229, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 462081, + 0, + 100457, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 162816, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1529470, + 44664, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 41422, + 0, + 0, + 543, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 329803, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 106673, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8398, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11928, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2587, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 622, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 245963, + 0, + 0, + 0, + 0, + 0, + 0, + 247, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11928, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 296677, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 19955, + 32251, + 0, + 49, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 371914, + 0, + 0, + 0, + 0, + 0, + 477148, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 59535, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 100457, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 64216, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 139, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 10482318, + 0, + 0, + 0, + 0, + 0, + 0, + 1680, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4247, + 0, + 0, + 251059, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1579504, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 287, + 0, + 0, + 0, + 0, + 0, + 41422, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8310, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 754, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 29489, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 82922, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2242, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12283, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 372426, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 622, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 40268, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12283, + 0, + 0, + 0, + 0, + 71, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11991, + 0, + 0, + 0, + 0, + 0, + 175618, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 462081, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 247, + 0, + 59087, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 26534, + 0, + 348694, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 179445, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 46326, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2587, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1565530, + 329803, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 262, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 125005, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3236, + 0, + 0, + 0, + 0, + 1565318, + 0, + 0, + 560, + 0, + 3264, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2835, + 0, + 0, + 25040, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 454, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 652, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 239878, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 162814, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 37369, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 354674, + 0, + 0, + 0, + 1529470, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 330143, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 106673, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 31443, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 543, + 0, + 0, + 0, + 0, + 0, + 0, + 10926229, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 111482, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 245963, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4013, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 117, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 173, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 17041, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 120, + 0, + 0, + 0, + 0, + 41422, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 811993, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2864, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8398, + 0, + 0, + 0, + 0, + 0, + 8697, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 77989, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 44664, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "counters": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 37369, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2587, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 462081, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 10482318, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4247, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 71, + 0, + 0, + 0, + 0, + 0, + 0, + 59535, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 17041, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8398, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 32251, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 371914, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 11928, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4013, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 239878, + 0, + 64216, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 25040, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 44664, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2864, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 329803, + 0, + 0, + 0, + 0, + 0, + 0, + 1680, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12283, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 59087, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 250817, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 111482, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 125005, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 120, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 372426, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8697, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 811993, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 348694, + 0, + 0, + 0, + 0, + 11991, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 100457, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 117, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1565530, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 49, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1565318, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3264, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 454, + 0, + 0, + 0, + 41422, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 40268, + 0, + 0, + 0, + 41422, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 46326, + 162814, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 26534, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1529470, + 0, + 0, + 0, + 0, + 0, + 287, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 175618, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 106673, + 0, + 0, + 0, + 245963, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1579504, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 242, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 622, + 0, + 0, + 0, + 0, + 0, + 543, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 173, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 296677, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 139, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 10926229, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 77989, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 32003, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 82922, + 0, + 0, + 0, + 0, + 0, + 0, + 354674, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 754, + 0, + 0, + 0, + 19955, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 652, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 247, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 179445, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3236, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2835, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2242, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 477148, + 0, + 0, + 0, + 0, + 29489, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 330143, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8310, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 262, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12283, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + } + ], + "top_n": [ + { + "data": "AVBPU1QAAAAA+wFFQ08AAAAAAPoBMjAAAAAAAAD5", + "count": 17311236 + }, + { + "data": "AVRPUElDAAAA/AFFQ08AAAAAAPo=", + "count": 56469120 + }, + { + "data": "AVRPUElDAAAA/A==", + "count": 1513420 + }, + { + "data": "AVRPUElDAAAA/AFFQ08AAAAAAPoBMjAAAAAAAAD5", + "count": 54364810 + }, + { + "data": "AVBPU1QAAAAA+wFFQ08AAAAAAPo=", + "count": 18343231 + }, + { + "data": "AVBPU1QAAAAA+w==", + "count": 162744 + } + ], + "default_value": 0 + }, + "null_count": 0, + "tot_col_size": 0, + "last_update_version": 419285068817891416, + "correlation": 0 + }, + "idx2": { + "histogram": { + "ndv": 268129, + "buckets": [ + { + "count": 760104, + "lower_bound": "ATAxAAAAAAAA+QFHUk9VUAAAAPw=", + "upper_bound": "AUpMMTkwMTQ3/wAAAAAAAAAA9wFCR1IAAAAAAPo=", + "repeats": 9 + }, + { + "count": 1899449, + "lower_bound": "AUpMMTkwMTQ4/wAAAAAAAAAA9wFCR1IAAAAAAPo=", + "upper_bound": "AVAxMDkzOTAy/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "repeats": 1 + }, + { + "count": 2425027, + "lower_bound": "AVAxMDkzOTQ3/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "upper_bound": "AVAxMTMzMTA4/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "repeats": 1 + }, + { + "count": 3157907, + "lower_bound": "AVAxMTMzMTEy/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "upper_bound": "AVAxMTQzODE2/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "repeats": 113643 + }, + { + "count": 4594436, + "lower_bound": "AVAxMTQzODIy/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "upper_bound": "AVAxMTc3NDI5/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "repeats": 377 + }, + { + "count": 4959297, + "lower_bound": "AVAxMTc3NDMw/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "upper_bound": "AVAxMjA4MzI0/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "repeats": 527 + }, + { + "count": 5707362, + "lower_bound": "AVAxMjA4MzMw/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "upper_bound": "AVAxMjM5MTM2/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "repeats": 87 + }, + { + "count": 6405495, + "lower_bound": "AVAxMjM5MTQ2/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "upper_bound": "AVAxMjYxMzg0/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "repeats": 193 + }, + { + "count": 7559254, + "lower_bound": "AVAxMjYxMzg3/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "upper_bound": "AVAxMjc2MjI4/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "repeats": 1 + }, + { + "count": 8196246, + "lower_bound": "AVAxMjc2MjMx/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "upper_bound": "AVAxMzAxMjUx/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "repeats": 1 + }, + { + "count": 9354381, + "lower_bound": "AVAxMzAxMjcx/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "upper_bound": "AVAxMzI0MDY0/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "repeats": 1 + }, + { + "count": 9961516, + "lower_bound": "AVAxMzI0MDgx/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "upper_bound": "AVAxMzMxMTMw/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "repeats": 1 + }, + { + "count": 11034913, + "lower_bound": "AVAxMzMxMTMy/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "upper_bound": "AVAxNDQ4MDI0/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "repeats": 97 + }, + { + "count": 11674715, + "lower_bound": "AVAxNDQ4MDM4/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "upper_bound": "AVAyMDQzNTc4/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "repeats": 174 + }, + { + "count": 12694418, + "lower_bound": "AVAyMDQzNjA5/wAAAAAAAAAA9wFQT1NUAAAAAPs=", + "upper_bound": "AVAyOTY0MwAA/QFQT1NUAAAAAPs=", + "repeats": 59 + }, + { + "count": 13443030, + "lower_bound": "AVAyOTY0NgAA/QFQT1NUAAAAAPs=", + "upper_bound": "AVAzODU1NDMA/gFQT1NUAAAAAPs=", + "repeats": 2 + }, + { + "count": 14135982, + "lower_bound": "AVAzODU2NDUA/gFQT1NUAAAAAPs=", + "upper_bound": "AVA0ODg3NwAA/QFQT1NUAAAAAPs=", + "repeats": 507 + }, + { + "count": 14503538, + "lower_bound": "AVA0ODg3OAAA/QFQT1NUAAAAAPs=", + "upper_bound": "AVA1MDQ4NgAA/QFQT1NUAAAAAPs=", + "repeats": 2650 + }, + { + "count": 14940539, + "lower_bound": "AVA1MDQ4NwAA/QFQT1NUAAAAAPs=", + "upper_bound": "AVA1NjAzAAAA/AFQT1NUAAAAAPs=", + "repeats": 3 + }, + { + "count": 15548720, + "lower_bound": "AVA1NjAzNTIA/gFQT1NUAAAAAPs=", + "upper_bound": "AVA2ODA2OTUA/gFQT1NUAAAAAPs=", + "repeats": 2 + }, + { + "count": 16210943, + "lower_bound": "AVA2ODA3MDcA/gFQT1NUAAAAAPs=", + "upper_bound": "AVA3NTE4MzMA/gFQT1NUAAAAAPs=", + "repeats": 17 + }, + { + "count": 16816751, + "lower_bound": "AVA3NTE4NTUA/gFQT1NUAAAAAPs=", + "upper_bound": "AVA4MDEzMzkA/gFQT1NUAAAAAPs=", + "repeats": 1 + }, + { + "count": 17058896, + "lower_bound": "AVA4MDEzNDIA/gFQT1NUAAAAAPs=", + "upper_bound": "AVA4MzczOQAA/QFQT1NUAAAAAPs=", + "repeats": 12 + }, + { + "count": 17516347, + "lower_bound": "AVA4MzczOTkA/gFQT1NUAAAAAPs=", + "upper_bound": "AVA4Njc3ODYA/gFQT1NUAAAAAPs=", + "repeats": 1 + }, + { + "count": 18667201, + "lower_bound": "AVA4Njc3OTkA/gFQT1NUAAAAAPs=", + "upper_bound": "AVA5MzgzNDMA/gFQT1NUAAAAAPs=", + "repeats": 247 + }, + { + "count": 19609174, + "lower_bound": "AVA5MzgzNTIA/gFQT1NUAAAAAPs=", + "upper_bound": "AVExMDE2MDYA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 7 + }, + { + "count": 19831018, + "lower_bound": "AVExMDE2MTAA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExMTQxMzkA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 29 + }, + { + "count": 20252277, + "lower_bound": "AVExMTQxNDMA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExMjg2MTgA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 7 + }, + { + "count": 20731173, + "lower_bound": "AVExMjg2MgAA/QFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExNDEyNTkA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 2 + }, + { + "count": 21009593, + "lower_bound": "AVExNDEyNjAA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExNTgyODIA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 5 + }, + { + "count": 21264093, + "lower_bound": "AVExNTgyODUA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExNjY5OTUA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 2435 + }, + { + "count": 22012001, + "lower_bound": "AVExNjcwMDQA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExNjk0OTkA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 22 + }, + { + "count": 22491896, + "lower_bound": "AVExNjk1AAAA/AFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExNjk2OTMA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 8 + }, + { + "count": 22664708, + "lower_bound": "AVExNjk2OTQA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExNzAwMDUA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 11 + }, + { + "count": 23613556, + "lower_bound": "AVExNzAwMDcA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExNzAyMjMA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 1 + }, + { + "count": 24247495, + "lower_bound": "AVExNzAyMjQA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExNzA0AAAA/AFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 6 + }, + { + "count": 25047574, + "lower_bound": "AVExNzA0MDMA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExNzA0NjQA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 28 + }, + { + "count": 25048225, + "lower_bound": "AVExNzA0NzAA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExNzA1MjcA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 7 + }, + { + "count": 25516367, + "lower_bound": "AVExNzA1MwAA/QFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExNzA2MTQA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 1410 + }, + { + "count": 26286972, + "lower_bound": "AVExNzA2MTUA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExODE5NTcA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 166 + }, + { + "count": 27077170, + "lower_bound": "AVExODE5NTgA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExODYwNjIA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 14 + }, + { + "count": 27527624, + "lower_bound": "AVExODYwNjUA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExODc4MDQA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 24 + }, + { + "count": 28048251, + "lower_bound": "AVExODc4MDUA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVExOTI1MzcA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 7 + }, + { + "count": 28914156, + "lower_bound": "AVExOTI1MzkA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVEyMDA0NzkA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 1160 + }, + { + "count": 29039928, + "lower_bound": "AVEyMDA0ODAA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVEyMDQzMQAA/QFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 1228 + }, + { + "count": 29128273, + "lower_bound": "AVEyMDQzMTkA/gFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVEyMjg1NgAA/QFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 4 + }, + { + "count": 29745819, + "lower_bound": "AVEyMjg1NwAA/QFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVE0OTIyNwAA/QFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 5707 + }, + { + "count": 30130536, + "lower_bound": "AVE0OTIyOAAA/QFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVE3NDA1NAAA/QFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 19 + }, + { + "count": 30429540, + "lower_bound": "AVE3NDA2AAAA/AFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVE5MjU3OQAA/QFRVUVTVElPTv8AAAAAAAAAAPc=", + "repeats": 13 + }, + { + "count": 30627594, + "lower_bound": "AVE5MjU4AAAA/AFRVUVTVElPTv8AAAAAAAAAAPc=", + "upper_bound": "AVMzMzI0NgAA/QFTVkQAAAAAAPo=", + "repeats": 95 + }, + { + "count": 31402941, + "lower_bound": "AVMzMzM1MwAA/QFTVkQAAAAAAPo=", + "upper_bound": "AVQxMjM1AAAA/AFUT1BJQwAAAPw=", + "repeats": 248 + }, + { + "count": 31676457, + "lower_bound": "AVQxMjM2AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNDAxAAAA/AFUT1BJQwAAAPw=", + "repeats": 60 + }, + { + "count": 35461285, + "lower_bound": "AVQxNDAyAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNDk3AAAA/AFUT1BJQwAAAPw=", + "repeats": 92772 + }, + { + "count": 36194858, + "lower_bound": "AVQxNDk4AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNTI4AAAA/AFUT1BJQwAAAPw=", + "repeats": 26699 + }, + { + "count": 36657093, + "lower_bound": "AVQxNTI5AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNTQ1AAAA/AFUT1BJQwAAAPw=", + "repeats": 65808 + }, + { + "count": 37165498, + "lower_bound": "AVQxNTQ2AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNTU5AAAA/AFUT1BJQwAAAPw=", + "repeats": 22428 + }, + { + "count": 37734699, + "lower_bound": "AVQxNTYwAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNTc5AAAA/AFUT1BJQwAAAPw=", + "repeats": 105884 + }, + { + "count": 39665973, + "lower_bound": "AVQxNTgwAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNTkzAAAA/AFUT1BJQwAAAPw=", + "repeats": 90687 + }, + { + "count": 39993708, + "lower_bound": "AVQxNTk0AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNjAxAAAA/AFUT1BJQwAAAPw=", + "repeats": 7151 + }, + { + "count": 41117444, + "lower_bound": "AVQxNjAyAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNjA5AAAA/AFUT1BJQwAAAPw=", + "repeats": 3760 + }, + { + "count": 41667568, + "lower_bound": "AVQxNjEwAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNjE2AAAA/AFUT1BJQwAAAPw=", + "repeats": 300611 + }, + { + "count": 41888501, + "lower_bound": "AVQxNjE3AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNjI4AAAA/AFUT1BJQwAAAPw=", + "repeats": 5986 + }, + { + "count": 42417186, + "lower_bound": "AVQxNjI5AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNjQ0AAAA/AFUT1BJQwAAAPw=", + "repeats": 63452 + }, + { + "count": 43114527, + "lower_bound": "AVQxNjQ2AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNjU4AAAA/AFUT1BJQwAAAPw=", + "repeats": 7141 + }, + { + "count": 43403168, + "lower_bound": "AVQxNjU5AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNjc0AAAA/AFUT1BJQwAAAPw=", + "repeats": 7680 + }, + { + "count": 43702666, + "lower_bound": "AVQxNjc1AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNjg5AAAA/AFUT1BJQwAAAPw=", + "repeats": 91 + }, + { + "count": 44214579, + "lower_bound": "AVQxNjkwAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNzAyAAAA/AFUT1BJQwAAAPw=", + "repeats": 721 + }, + { + "count": 44505507, + "lower_bound": "AVQxNzA0AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNzE5AAAA/AFUT1BJQwAAAPw=", + "repeats": 864 + }, + { + "count": 44908288, + "lower_bound": "AVQxNzIwAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNzM1AAAA/AFUT1BJQwAAAPw=", + "repeats": 811 + }, + { + "count": 45129592, + "lower_bound": "AVQxNzM2AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNzQ3AAAA/AFUT1BJQwAAAPw=", + "repeats": 2540 + }, + { + "count": 45818677, + "lower_bound": "AVQxNzQ4AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNzU1AAAA/AFUT1BJQwAAAPw=", + "repeats": 353 + }, + { + "count": 46327954, + "lower_bound": "AVQxNzU2AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNzYyAAAA/AFUT1BJQwAAAPw=", + "repeats": 39886 + }, + { + "count": 46804832, + "lower_bound": "AVQxNzYzAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNzc4AAAA/AFUT1BJQwAAAPw=", + "repeats": 643 + }, + { + "count": 47080682, + "lower_bound": "AVQxNzgwAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxNzg4AAAA/AFUT1BJQwAAAPw=", + "repeats": 146192 + }, + { + "count": 47544039, + "lower_bound": "AVQxNzg5AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxODE5AAAA/AFUT1BJQwAAAPw=", + "repeats": 57321 + }, + { + "count": 49135432, + "lower_bound": "AVQxODIwAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxODQzAAAA/AFUT1BJQwAAAPw=", + "repeats": 23199 + }, + { + "count": 49543175, + "lower_bound": "AVQxODQ0AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxODYwAAAA/AFUT1BJQwAAAPw=", + "repeats": 6584 + }, + { + "count": 49816800, + "lower_bound": "AVQxODYxAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxODcxAAAA/AFUT1BJQwAAAPw=", + "repeats": 36576 + }, + { + "count": 50214152, + "lower_bound": "AVQxODcyAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxODg3AAAA/AFUT1BJQwAAAPw=", + "repeats": 512 + }, + { + "count": 50503404, + "lower_bound": "AVQxODg4AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxOTAzAAAA/AFUT1BJQwAAAPw=", + "repeats": 5170 + }, + { + "count": 50952072, + "lower_bound": "AVQxOTA0AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxOTE5AAAA/AFUT1BJQwAAAPw=", + "repeats": 72650 + }, + { + "count": 51136775, + "lower_bound": "AVQxOTIwAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxOTM1AAAA/AFUT1BJQwAAAPw=", + "repeats": 2902 + }, + { + "count": 51695823, + "lower_bound": "AVQxOTM2AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxOTQ2AAAA/AFUT1BJQwAAAPw=", + "repeats": 51328 + }, + { + "count": 51842998, + "lower_bound": "AVQxOTQ3AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxOTYyAAAA/AFUT1BJQwAAAPw=", + "repeats": 24522 + }, + { + "count": 52471359, + "lower_bound": "AVQxOTYzAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxOTc4AAAA/AFUT1BJQwAAAPw=", + "repeats": 278750 + }, + { + "count": 52552696, + "lower_bound": "AVQxOTc5AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxOTgzAAAA/AFUT1BJQwAAAPw=", + "repeats": 1586 + }, + { + "count": 54613693, + "lower_bound": "AVQxOTg0AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQxOTg2AAAA/AFUT1BJQwAAAPw=", + "repeats": 1147272 + }, + { + "count": 54919961, + "lower_bound": "AVQxOTg4AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMDU5AAAA/AFUT1BJQwAAAPw=", + "repeats": 5960 + }, + { + "count": 55259520, + "lower_bound": "AVQyMDYxAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMDc4AAAA/AFUT1BJQwAAAPw=", + "repeats": 4546 + }, + { + "count": 55864544, + "lower_bound": "AVQyMDc5AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMDk0AAAA/AFUT1BJQwAAAPw=", + "repeats": 2495 + }, + { + "count": 58074833, + "lower_bound": "AVQyMDk1AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMTA4AAAA/AFUT1BJQwAAAPw=", + "repeats": 925260 + }, + { + "count": 58277195, + "lower_bound": "AVQyMTA5AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMTI1AAAA/AFUT1BJQwAAAPw=", + "repeats": 2745 + }, + { + "count": 62756293, + "lower_bound": "AVQyMTI2AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMTM0AAAA/AFUT1BJQwAAAPw=", + "repeats": 812920 + }, + { + "count": 63201286, + "lower_bound": "AVQyMTM1AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMTUxAAAA/AFUT1BJQwAAAPw=", + "repeats": 219467 + }, + { + "count": 63636251, + "lower_bound": "AVQyMTUyAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMTgyAAAA/AFUT1BJQwAAAPw=", + "repeats": 2117 + }, + { + "count": 64002546, + "lower_bound": "AVQyMTgzAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMjE3AAAA/AFUT1BJQwAAAPw=", + "repeats": 21405 + }, + { + "count": 64753810, + "lower_bound": "AVQyMjE4AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMjY1AAAA/AFUT1BJQwAAAPw=", + "repeats": 270516 + }, + { + "count": 65711914, + "lower_bound": "AVQyMjY2AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMjgwAAAA/AFUT1BJQwAAAPw=", + "repeats": 646192 + }, + { + "count": 65898932, + "lower_bound": "AVQyMjgxAAAA/AFQT1NUAAAAAPs=", + "upper_bound": "AVQyMjkwAAAA/AFUT1BJQwAAAPw=", + "repeats": 35531 + }, + { + "count": 66080378, + "lower_bound": "AVQyMjkxAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMjk0AAAA/AFUT1BJQwAAAPw=", + "repeats": 550 + }, + { + "count": 69618762, + "lower_bound": "AVQyMjk1AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMzAzAAAA/AFUT1BJQwAAAPw=", + "repeats": 525662 + }, + { + "count": 70318188, + "lower_bound": "AVQyMzA0AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMzE2AAAA/AFUT1BJQwAAAPw=", + "repeats": 20817 + }, + { + "count": 71025006, + "lower_bound": "AVQyMzE3AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMzI2AAAA/AFUT1BJQwAAAPw=", + "repeats": 424326 + }, + { + "count": 71570284, + "lower_bound": "AVQyMzI3AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMzQyAAAA/AFUT1BJQwAAAPw=", + "repeats": 702 + }, + { + "count": 72046256, + "lower_bound": "AVQyMzQzAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMzU2AAAA/AFUT1BJQwAAAPw=", + "repeats": 42061 + }, + { + "count": 73111195, + "lower_bound": "AVQyMzU3AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMzY1AAAA/AFUT1BJQwAAAPw=", + "repeats": 0 + }, + { + "count": 73261749, + "lower_bound": "AVQyMzY2AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMzcxAAAA/AFUT1BJQwAAAPw=", + "repeats": 32148 + }, + { + "count": 73709242, + "lower_bound": "AVQyMzcyAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMzc5AAAA/AFUT1BJQwAAAPw=", + "repeats": 275 + }, + { + "count": 73922575, + "lower_bound": "AVQyMzgwAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyMzg1AAAA/AFUT1BJQwAAAPw=", + "repeats": 42541 + }, + { + "count": 74497872, + "lower_bound": "AVQyMzg2AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNDAxAAAA/AFUT1BJQwAAAPw=", + "repeats": 51679 + }, + { + "count": 74708774, + "lower_bound": "AVQyNDAyAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNDE3AAAA/AFUT1BJQwAAAPw=", + "repeats": 397 + }, + { + "count": 75111280, + "lower_bound": "AVQyNDE4AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNDMxAAAA/AFUT1BJQwAAAPw=", + "repeats": 89208 + }, + { + "count": 75579480, + "lower_bound": "AVQyNDMyAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNDQ4AAAA/AFUT1BJQwAAAPw=", + "repeats": 1668 + }, + { + "count": 76340934, + "lower_bound": "AVQyNDQ5AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNDcxAAAA/AFUT1BJQwAAAPw=", + "repeats": 3972 + }, + { + "count": 76650798, + "lower_bound": "AVQyNDcyAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNTAzAAAA/AFUT1BJQwAAAPw=", + "repeats": 1116 + }, + { + "count": 76937128, + "lower_bound": "AVQyNTA0AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNTMxAAAA/AFUT1BJQwAAAPw=", + "repeats": 140429 + }, + { + "count": 77320341, + "lower_bound": "AVQyNTMyAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNTY0AAAA/AFUT1BJQwAAAPw=", + "repeats": 5176 + }, + { + "count": 77749069, + "lower_bound": "AVQyNTY1AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNTk2AAAA/AFUT1BJQwAAAPw=", + "repeats": 4359 + }, + { + "count": 78078874, + "lower_bound": "AVQyNTk3AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNjI4AAAA/AFUT1BJQwAAAPw=", + "repeats": 1812 + }, + { + "count": 78268436, + "lower_bound": "AVQyNjI5AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNjQ5AAAA/AFUT1BJQwAAAPw=", + "repeats": 1742 + }, + { + "count": 78949732, + "lower_bound": "AVQyNjUwAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNjY2AAAA/AFUT1BJQwAAAPw=", + "repeats": 7714 + }, + { + "count": 79691069, + "lower_bound": "AVQyNjY3AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNjg5AAAA/AFUT1BJQwAAAPw=", + "repeats": 4824 + }, + { + "count": 80391238, + "lower_bound": "AVQyNjkwAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNzIzAAAA/AFUT1BJQwAAAPw=", + "repeats": 99620 + }, + { + "count": 81203918, + "lower_bound": "AVQyNzI0AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNzU1AAAA/AFUT1BJQwAAAPw=", + "repeats": 33678 + }, + { + "count": 81594333, + "lower_bound": "AVQyNzU2AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyNzg4AAAA/AFUT1BJQwAAAPw=", + "repeats": 5403 + }, + { + "count": 81718244, + "lower_bound": "AVQyNzg5AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyODA4AAAA/AFUT1BJQwAAAPw=", + "repeats": 19861 + }, + { + "count": 82473987, + "lower_bound": "AVQyODA5AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyODM5AAAA/AFUT1BJQwAAAPw=", + "repeats": 0 + }, + { + "count": 83296290, + "lower_bound": "AVQyODQwAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyODcyAAAA/AFUT1BJQwAAAPw=", + "repeats": 39273 + }, + { + "count": 83702754, + "lower_bound": "AVQyODczAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyOTA0AAAA/AFUT1BJQwAAAPw=", + "repeats": 5432 + }, + { + "count": 83741190, + "lower_bound": "AVQyOTA1AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyOTEwAAAA/AFUT1BJQwAAAPw=", + "repeats": 2456 + }, + { + "count": 84300699, + "lower_bound": "AVQyOTExAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQyOTc0AAAA/AFUT1BJQwAAAPw=", + "repeats": 5064 + }, + { + "count": 84582127, + "lower_bound": "AVQyOTc1AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQzMDM5AAAA/AFUT1BJQwAAAPw=", + "repeats": 16792 + }, + { + "count": 84591543, + "lower_bound": "AVQzMDQwAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQzMDQwAAAA/AFUT1BJQwAAAPw=", + "repeats": 8050 + }, + { + "count": 85046578, + "lower_bound": "AVQzMDQxAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQzMTcwAAAA/AFUT1BJQwAAAPw=", + "repeats": 5520 + }, + { + "count": 85685943, + "lower_bound": "AVQzMTcxAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQzMjk3AAAA/AFUT1BJQwAAAPw=", + "repeats": 333 + }, + { + "count": 86143524, + "lower_bound": "AVQzMjk4AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQzMzMxAAAA/AFUT1BJQwAAAPw=", + "repeats": 11155 + }, + { + "count": 86517706, + "lower_bound": "AVQzMzMyAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQzMzY0AAAA/AFUT1BJQwAAAPw=", + "repeats": 956 + }, + { + "count": 86703619, + "lower_bound": "AVQzMzY1AAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQzMzgyAAAA/AFUT1BJQwAAAPw=", + "repeats": 21889 + }, + { + "count": 87186150, + "lower_bound": "AVQzMzgzAAAA/AFUT1BJQwAAAPw=", + "upper_bound": "AVQ3AAAAAAAA+QFUT1BJQwAAAPw=", + "repeats": 406 + }, + { + "count": 87212604, + "lower_bound": "AVQ4AAAAAAAA+QFUT1BJQwAAAPw=", + "upper_bound": "AVYxNTMxNTEy/wAAAAAAAAAA9wFMSVZFAAAAAPs=", + "repeats": 11 + }, + { + "count": 87401316, + "lower_bound": "AVYxNTMyOTMy/wAAAAAAAAAA9wFMSVZFAAAAAPs=", + "upper_bound": "AWUwNjgzMDc3/2U5ODM0OTRj/2JkNDA2M2I5/2NiZmVkYjNi/wAAAAAAAAAA9wFHUk9VUAAAAPw=", + "repeats": 2 + } + ] + }, + "cm_sketch": { + "rows": [ + { + "counters": [ + 55593, + 51568, + 119027, + 17424, + 167428, + 24107, + 5290, + 315806, + 41083, + 38187, + 67571, + 26346, + 51025, + 28257, + 10790, + 14761, + 23152, + 153393, + 44752, + 15991, + 57748, + 12006, + 129425, + 43056, + 3624, + 5631, + 9471, + 143173, + 109073, + 12054, + 334212, + 12504, + 19892, + 8807, + 48551, + 23532, + 13459, + 252510, + 14757, + 190491, + 6053, + 52515, + 284066, + 21650, + 71713, + 35884, + 3257, + 17477, + 6680, + 17653, + 23580, + 47068, + 17064, + 4979, + 62304, + 194916, + 16897, + 82019, + 2984, + 137727, + 2043, + 23131, + 8242, + 13204, + 1553837, + 13529, + 15577, + 134977, + 88255, + 18551, + 21820, + 74163, + 47331, + 13248, + 8866, + 9088, + 17847, + 55034, + 202417, + 135729, + 49879, + 359755, + 18599, + 212071, + 20237, + 146593, + 12325, + 106309, + 23955, + 64105, + 11264, + 20545, + 13163, + 60644, + 39519, + 10956, + 37322, + 13642, + 33373, + 55813, + 18781, + 134227, + 122196, + 4093, + 9916, + 182588, + 36481, + 12353, + 5749, + 124874, + 177372, + 215227, + 3357, + 6512, + 36680, + 10087, + 12890, + 15078, + 71461, + 3994, + 16682, + 12793, + 58611, + 8390, + 5325, + 52434, + 8667, + 9484, + 13493, + 10036, + 108829, + 7781, + 13245, + 115072, + 9957, + 3095615, + 4798, + 5820, + 28817, + 3500, + 64257, + 102441, + 60955, + 72917, + 16772, + 55128, + 2108, + 394410, + 130001, + 23832, + 7367, + 1849, + 14277, + 26789, + 178054, + 59643, + 12394, + 7227, + 29217, + 9564, + 25663, + 494115, + 27518, + 32774, + 12800, + 15013, + 29816, + 18171, + 197507, + 134193, + 102793, + 5995, + 73134, + 52313, + 145513, + 77228, + 51356, + 143638, + 5557, + 5889, + 8869, + 10253, + 12162, + 40873, + 37391, + 9761, + 14124, + 95264, + 43166, + 269813, + 7527, + 69167, + 26230, + 5573, + 91420, + 352688, + 235995, + 96572, + 2212, + 13517, + 146898, + 54894, + 120428, + 4119, + 88843, + 33852, + 151273, + 11137, + 3510, + 37856, + 12313, + 100426, + 49063, + 65102, + 39045, + 58233, + 10240, + 56985, + 4253, + 29310, + 80448, + 23786, + 27123, + 13964, + 58627, + 89580, + 32674, + 18073, + 27987, + 10857, + 68442, + 79833, + 82252, + 456879, + 20019, + 44527, + 19174, + 46778, + 21360, + 38620, + 120797, + 19826, + 168716, + 6231, + 9825, + 65682, + 10018, + 37040, + 31255, + 93266, + 20565, + 56946, + 12681, + 26577, + 170713, + 15141, + 53541, + 63843, + 174430, + 20628, + 18880, + 9488, + 12211, + 165141, + 179721, + 56391, + 133758, + 5913, + 305058, + 43309, + 82293, + 23318, + 26055, + 13679, + 30840, + 67547, + 516140, + 87686, + 10137, + 4864, + 35078, + 32249, + 43655, + 23536, + 12333, + 31316, + 8028, + 17348, + 10492, + 86234, + 33710, + 3008, + 27628, + 384644, + 213427, + 117036, + 10136, + 6059, + 38693, + 63792, + 332604, + 7287, + 12156, + 63140, + 90977, + 4474, + 25838, + 21219, + 90529, + 4024, + 15543, + 40355, + 62743, + 55345, + 4273, + 96408, + 20352, + 329237, + 3382, + 4049, + 36256, + 5427, + 40115, + 108233, + 83215, + 11798, + 31456, + 16251, + 15769, + 160845, + 18051, + 118915, + 13444, + 12872, + 12670, + 15928, + 18567, + 19222, + 82510, + 56390, + 10367, + 158448, + 3588, + 22024, + 24474, + 29786, + 42118, + 21031, + 28867, + 22532, + 196111, + 2603, + 34860, + 477987, + 18935, + 4246, + 8110, + 36522, + 13340, + 5260, + 15493, + 3017, + 18336, + 3032, + 39217, + 198133, + 11649, + 10991, + 17251, + 1209075, + 31877, + 41552, + 36941, + 14873, + 186734, + 1271474, + 59058, + 2937, + 4996, + 7087, + 188825, + 261035, + 61628, + 55022, + 52416, + 219084, + 66566, + 30037, + 23675, + 105921, + 10378, + 36186, + 70625, + 8101, + 33014, + 19581, + 10725, + 68496, + 19429, + 279929, + 8937, + 34550, + 63661, + 253026, + 290455, + 7567, + 23213, + 16927, + 2104, + 13297, + 86340, + 332562, + 15460, + 10664, + 25350, + 4822, + 46723, + 101181, + 29172, + 5715, + 152231, + 18024, + 62906, + 11030, + 8179, + 46814, + 3300, + 30056, + 6560, + 5025, + 93569, + 196719, + 35686, + 12435, + 18728, + 52020, + 26835, + 10974, + 39288, + 15525, + 65070, + 30795, + 22860, + 6689, + 5462, + 27511, + 123932, + 78107, + 11988, + 61798, + 261585, + 54513, + 8280, + 64131, + 105597, + 7764, + 20293, + 166791, + 340909, + 44591, + 77316, + 22041, + 1867, + 95035, + 59416, + 18771, + 5738, + 13983, + 62569, + 4106, + 74758, + 364994, + 11093, + 54249, + 278410, + 72668, + 11467, + 60890, + 2509, + 264960, + 25346, + 40335, + 213413, + 19649, + 31114, + 108013, + 22339, + 325393, + 180002, + 38453, + 47671, + 68760, + 47000, + 24544, + 84074, + 21531, + 58485, + 36666, + 44562, + 10060, + 35585, + 15105, + 16272, + 32246, + 19457, + 29337, + 35729, + 41032, + 27172, + 24103, + 27068, + 1186, + 3106094, + 205149, + 383301, + 36402, + 159366, + 3660, + 251179, + 81415, + 16471, + 140878, + 13889, + 85222, + 13851, + 3080, + 25580, + 11182, + 8035, + 4173, + 71945, + 10150, + 26121, + 228580, + 4481, + 44083, + 4953, + 278531, + 77547, + 44533, + 21992, + 6492, + 12662, + 63920, + 114871, + 76500, + 8449, + 14633, + 16552, + 59036, + 125702, + 5167, + 67808, + 30416, + 185150, + 8604, + 66259, + 52210, + 60235, + 71748, + 75213, + 15942, + 290253, + 165120, + 314965, + 61695, + 71883, + 18502, + 148086, + 75950, + 37909, + 1605645, + 319212, + 39942, + 6632, + 172297, + 72461, + 18659, + 39497, + 41122, + 11507, + 20914, + 76680, + 3040, + 43972, + 15926, + 36099, + 145295, + 42318, + 311905, + 10250, + 13020, + 313278, + 320641, + 172354, + 37148, + 127520, + 6068, + 28181, + 44907, + 122296, + 7419, + 189530, + 31163, + 119194, + 164672, + 33969, + 27015, + 13024, + 84658, + 70168, + 39100, + 1611, + 39897, + 32937, + 12957, + 379684, + 24893, + 114052, + 93559, + 43021, + 19545, + 310463, + 12761, + 55893, + 14308, + 6645, + 104805, + 80435, + 13928, + 174729, + 238336, + 12925, + 87015, + 162297, + 52291, + 29393, + 1915, + 30628, + 72856, + 26372, + 18368, + 223881, + 27445, + 81520, + 24714, + 16246, + 113123, + 8173, + 9960, + 25870, + 9135, + 166552, + 75915, + 100978, + 21582, + 27898, + 37436, + 32474, + 575524, + 66998, + 4552, + 31836, + 108573, + 54990, + 11018, + 88868, + 74917, + 21334, + 44208, + 59795, + 34570, + 5132, + 23369, + 104190, + 73671, + 200871, + 26806, + 136406, + 11574, + 338485, + 14806, + 9287, + 20474, + 3524, + 15271, + 16948, + 54445, + 5555, + 346090, + 3686, + 88095, + 10309, + 22952, + 40901, + 46975, + 17240, + 70918, + 78190, + 172705, + 14075, + 128261, + 5750, + 29164, + 46778, + 36270, + 37455, + 163985, + 12388, + 33791, + 367855, + 9270, + 35702, + 66902, + 49546, + 26163, + 12747, + 14103, + 38977, + 41947, + 25216, + 18601, + 376764, + 13448, + 193118, + 24518, + 79321, + 33241, + 2638, + 156210, + 11347, + 65269, + 21300, + 31327, + 15360, + 31157, + 110027, + 17962, + 88163, + 30760, + 9501, + 61451, + 76875, + 13352, + 13043, + 41222, + 204386, + 89938, + 14282, + 18795, + 18623, + 317307, + 139730, + 39894, + 32939, + 6127, + 264459, + 9534, + 27623, + 54410, + 117143, + 31853, + 19368, + 52976, + 32391, + 132891, + 82213, + 609525, + 12810, + 13796, + 38363, + 11660, + 278037, + 11449, + 70797, + 20142, + 97244, + 44734, + 52972, + 10615, + 4892, + 122509, + 53717, + 72566, + 19184, + 23609, + 45422, + 11113, + 24595, + 48811, + 18751, + 19861, + 4555, + 18823, + 44176, + 24246, + 5864, + 94895, + 9860, + 37765, + 26635, + 75058, + 6821, + 4187, + 193771, + 62144, + 3251, + 287934, + 16311, + 44157, + 58133, + 35795, + 13392, + 51178, + 2148, + 148967, + 18626, + 8595, + 38217, + 69706, + 42392, + 38240, + 13012, + 27292, + 2240, + 14971, + 2012925, + 27296, + 123928, + 16801, + 40722, + 97413, + 8636, + 20558, + 21605, + 381896, + 8863, + 62413, + 29186, + 7942, + 307948, + 89903, + 40186, + 9470, + 81086, + 40417, + 12242, + 4062, + 20130, + 6649, + 5472, + 48936, + 374406, + 66369, + 14477, + 107372, + 68206, + 350902, + 42930, + 4120, + 30675, + 666918, + 111557, + 45640, + 104910, + 251759, + 52612, + 51029, + 5034, + 2811, + 9456, + 59342, + 86741, + 62801, + 142453, + 68508, + 67047, + 164138, + 65385, + 13635, + 114349, + 62464, + 98697, + 13491, + 33439, + 4514, + 52142, + 14148, + 38880, + 2923, + 7128, + 92707, + 8312, + 46489, + 18145, + 46092, + 23517, + 160313, + 32954, + 82775, + 21708, + 147072, + 156126, + 13823, + 7783, + 9190, + 7714, + 8316, + 21151, + 31583, + 11587, + 23479, + 38959, + 14809, + 144820, + 101114, + 44203, + 2639, + 66202, + 21597, + 26000, + 67790, + 242641, + 28166, + 71261, + 6990, + 82700, + 63447, + 112568, + 10136, + 18301, + 135392, + 49924, + 60491, + 8164, + 33995, + 42444, + 262917, + 32939, + 7265, + 1961738, + 173949, + 22200, + 239477, + 19201, + 25983, + 1376, + 95948, + 96335, + 141676, + 21383, + 16759, + 16228, + 13995, + 61643, + 119978, + 33101, + 63393, + 4053, + 45735, + 35868, + 5201, + 13361, + 17881, + 57344, + 38732, + 19905, + 85764, + 71265, + 28217, + 6325, + 225759, + 12807, + 13498, + 6755, + 61304, + 274570, + 30795, + 42469, + 18726, + 13703, + 36505, + 60851, + 46706, + 10666, + 54431, + 20485, + 150841, + 6847, + 110992, + 237231, + 38406, + 250737, + 122924, + 22184, + 25419, + 5799, + 10105, + 68721, + 7679, + 213633, + 40936, + 67790, + 51711, + 16463, + 10215, + 230293, + 229689, + 104486, + 16825, + 7153, + 23180, + 167093, + 8550, + 208989, + 17718, + 881934, + 28676, + 7014, + 23858, + 126344, + 36693, + 545736, + 25018, + 128882, + 14409, + 21922, + 36411, + 46856, + 297202, + 8220, + 68340, + 4527, + 28725, + 159808, + 160716, + 23233, + 13493, + 75240, + 45638, + 39539, + 7847, + 22451, + 223279, + 74771, + 5851, + 413959, + 15593, + 9241, + 69170, + 103826, + 3725, + 17903, + 56624, + 14870, + 83897, + 16448, + 53776, + 52634, + 132931, + 37521, + 7600, + 44697, + 3754, + 4686, + 10017, + 34614, + 22287, + 17076, + 113954, + 270600, + 9705, + 7922, + 189786, + 355970, + 5084, + 300135, + 48356, + 23261, + 111602, + 128903, + 26290, + 12252, + 13370, + 46847, + 14512, + 11274, + 28883, + 63752, + 23614, + 60170, + 15649, + 32653, + 16125, + 82982, + 47393, + 38345, + 20943, + 41144, + 42681, + 521058, + 116277, + 143293, + 86006, + 46057, + 50321, + 32692, + 19131, + 28833, + 29178, + 21069, + 13682, + 177500, + 59890, + 18744, + 15907, + 159541, + 198153, + 132689, + 355293, + 7545, + 15036, + 58081, + 25623, + 186338, + 15485, + 20611, + 7325, + 135543, + 13715, + 68046, + 69401, + 14549, + 9047, + 10741, + 85931, + 69481, + 30602, + 50614, + 23616, + 437219, + 401384, + 22432, + 28698, + 137283, + 4785, + 72744, + 57734, + 42274, + 77854, + 68849, + 5331, + 329934, + 187962, + 27127, + 35764, + 23771, + 61423, + 165226, + 191240, + 141747, + 14249, + 141733, + 43942, + 272269, + 54529, + 46095, + 7903, + 156545, + 326989, + 36260, + 11124, + 40332, + 27285, + 26236, + 90029, + 314431, + 135811, + 47381, + 16239, + 72225, + 8026, + 25686, + 275735, + 117433, + 46296, + 65563, + 51616, + 236174, + 29985, + 54235, + 97278, + 95586, + 20037, + 97213, + 11833, + 12381, + 17779, + 7801, + 59683, + 58462, + 83186, + 239568, + 135631, + 38297, + 7241, + 3753, + 29129, + 45950, + 72318, + 101285, + 47178, + 306684, + 3998, + 15933, + 15032, + 31902, + 16609, + 28761, + 189645, + 18658, + 39599, + 73221, + 22296, + 356202, + 8150, + 9071, + 44778, + 22605, + 2166, + 70635, + 39318, + 9638, + 237214, + 26756, + 56965, + 344177, + 57601, + 11399, + 10228, + 3288, + 32357, + 51743, + 26494, + 474123, + 56079, + 10665, + 151778, + 15882, + 5906, + 208954, + 18229, + 98063, + 1347, + 360102, + 47149, + 20165, + 5816, + 218391, + 5167, + 50602, + 12286, + 15429, + 113814, + 9698, + 4426, + 3685, + 56000, + 85801, + 20492, + 66808, + 19985, + 41903, + 11281, + 19903, + 29852, + 16464, + 35518, + 29749, + 7903, + 11421, + 59476, + 51390, + 9849, + 288657, + 6996, + 33434, + 52976, + 55214, + 78475, + 309487, + 151724, + 81728, + 8262, + 60522, + 10427, + 11415, + 81124, + 27655, + 10034, + 416512, + 18001, + 19762, + 13361, + 18157, + 93120, + 10166, + 79760, + 4321, + 79895, + 20313, + 58078, + 83396, + 5069, + 17784, + 51205, + 122569, + 2812, + 18675, + 15328, + 38547, + 33214, + 149528, + 12958, + 118070, + 59469, + 14098, + 124212, + 13094, + 17460, + 12259, + 5895, + 284438, + 8786, + 32113, + 28136, + 9290, + 33797, + 10702, + 189366, + 5459, + 16658, + 13283, + 15796, + 31036, + 58808, + 9208, + 354100, + 827301, + 48291, + 57436, + 78163, + 7121, + 9633, + 15118, + 36520, + 40336, + 18180, + 57839, + 8548, + 24278, + 16614, + 11466, + 9864, + 15505, + 314093, + 356638, + 28143, + 16772, + 261431, + 91321, + 18875, + 13943, + 8603, + 118072, + 57534, + 218066, + 39780, + 3560, + 23745, + 24055, + 28780, + 166468, + 25999, + 56436, + 185725, + 21214, + 61904, + 621701, + 19337, + 60822, + 18426, + 209748, + 574064, + 8197, + 15111, + 7215, + 25201, + 6802, + 33315, + 18328, + 24070, + 16033, + 47338, + 123593, + 85888, + 41704, + 87755, + 8910, + 24195, + 232968, + 49576, + 8880, + 96203, + 22046, + 2413, + 48915, + 31577, + 53732, + 20356, + 415848, + 56876, + 11635, + 24187, + 40013, + 189691, + 46724, + 5691, + 11595, + 16794, + 5035, + 14241, + 20442, + 285609, + 44362, + 22918, + 63411, + 71401, + 8860, + 180991, + 9974, + 68755, + 42872, + 20223, + 30081, + 21660, + 23732, + 9588, + 20108, + 17154, + 29184, + 5882, + 12147, + 176575, + 17526, + 15186, + 20916, + 13446, + 57822, + 9705, + 35742, + 54034, + 6834, + 115235, + 174446, + 40957, + 10391, + 63680, + 198281, + 15170, + 23044, + 12050, + 49947, + 57165, + 5239, + 3941, + 222560, + 58582, + 24715, + 8112, + 29443, + 9988, + 88826, + 101615, + 10241, + 56921, + 4295, + 17831, + 10415, + 5663, + 76475, + 2707, + 106598, + 46502, + 20856, + 53065, + 141686, + 84211, + 1258956, + 61694, + 20535, + 26076, + 165943, + 16931, + 207353, + 13371, + 8108, + 7556, + 210034, + 15554, + 28967, + 118603, + 31597, + 12130, + 2878, + 19980, + 24667, + 180918, + 94341, + 102143, + 3833, + 22006, + 4307, + 54218, + 184672, + 96899, + 23801, + 17454, + 215766, + 43968, + 156890, + 46577, + 21731, + 14240, + 12244, + 92281, + 162002, + 9800, + 5468, + 75542, + 11815, + 41013, + 20175, + 49666, + 12432, + 43671, + 25144, + 27774, + 2290, + 63842, + 22806, + 103978, + 67555, + 102743, + 72391, + 72093, + 17395, + 12799, + 127938, + 5359, + 2474, + 11563, + 9385, + 212790, + 102527, + 20365, + 52530, + 7144, + 5556, + 39556, + 9423, + 16281, + 8027, + 42611, + 14580, + 67017, + 99588, + 3903, + 19194, + 69740, + 52559, + 54357, + 20367, + 26640, + 21100, + 135053, + 39415, + 196024, + 24658, + 14328, + 171835, + 180213, + 104959, + 23198, + 402762, + 10066, + 23316, + 5669, + 56786, + 8583, + 5218, + 72535, + 10744, + 61187, + 3890, + 18546, + 12805, + 68206, + 11961, + 233409, + 72550, + 67773, + 62850, + 68825, + 6161, + 627147, + 154676, + 20055, + 64253, + 14892, + 19163, + 21607, + 4633, + 27914, + 44580, + 28148, + 7493, + 6741, + 3423, + 72579, + 48642, + 26172, + 97089, + 93497, + 8007, + 139872, + 20638, + 11177, + 66227, + 44202, + 14852, + 12093, + 404882, + 10361, + 46909, + 17522, + 64455, + 8459, + 18936807, + 35143, + 134275, + 29929, + 61516, + 34305, + 30292, + 32373, + 51158, + 73512, + 53785, + 56264, + 79805, + 9183, + 10140, + 20557, + 100763, + 19249, + 72180, + 47414, + 2900, + 57479, + 23835, + 75196, + 82953, + 64128, + 15596, + 2825, + 288091, + 11494, + 137854, + 9542, + 19378, + 41065, + 8980, + 30021, + 50286, + 23651, + 22050, + 5916, + 6381, + 249044, + 11944, + 59608, + 10608, + 49066, + 8457, + 62041, + 15069, + 62238, + 6235, + 8099, + 66217, + 7811, + 571740, + 12798, + 15042, + 143056, + 6924, + 70573, + 9466, + 50399, + 30732, + 5327643, + 209854, + 233571, + 113506, + 142656, + 3360, + 21340, + 37219, + 52324, + 273165, + 10394, + 263333, + 38477, + 36806, + 140417, + 9606, + 18664, + 63613, + 11346, + 197697, + 7194, + 3622, + 59502, + 84725, + 63282, + 8910, + 165631, + 8274, + 48627, + 11072, + 179209, + 4494, + 51901, + 10752, + 14249, + 1998, + 37641, + 168414, + 34317, + 25257, + 21022, + 57988, + 79723, + 13809, + 265609, + 2006, + 57754, + 266482, + 27097, + 23865, + 94950, + 23656, + 193908, + 3378, + 16089, + 96861, + 18378, + 65526, + 74447, + 26001, + 6726, + 9192, + 64376, + 60799, + 6479, + 13642, + 6274, + 21848, + 82393, + 34778, + 30448, + 51274, + 262096, + 26746, + 33392, + 142258, + 98887, + 37223, + 14024, + 16484, + 11438, + 13442, + 9156, + 121028, + 396620, + 8114, + 44185, + 237973, + 120931, + 3658, + 30153, + 43603, + 71494, + 10124, + 48657, + 21873, + 48003, + 5573, + 5619, + 12105, + 24415, + 103425, + 25833, + 161038, + 60953, + 26428, + 28178, + 18835, + 32724, + 34009, + 29325, + 96156, + 62453, + 16617, + 55826, + 32800, + 20026, + 104924, + 8881, + 44120, + 63457, + 18417, + 44694, + 29500, + 44595, + 12478, + 39239, + 9521, + 29844, + 64770, + 38825, + 40857, + 67230, + 29007, + 28320, + 11760, + 33519, + 6857, + 14439, + 55733, + 4117, + 7416, + 546045, + 44614, + 6731, + 39463, + 433964, + 17629, + 16424, + 62277, + 107677, + 52582, + 54659, + 1546458, + 56487, + 31387, + 81670, + 96110, + 123705, + 11094, + 19157, + 49808, + 29242, + 1634277, + 91331, + 193084, + 15008, + 7557, + 447749, + 257185, + 75945, + 315300, + 40769, + 107226, + 11861, + 30082, + 7530, + 44259, + 35982, + 16146, + 22587, + 7344, + 35727, + 20130, + 5323, + 11269, + 41896, + 27878, + 8382, + 59770, + 8980, + 71019, + 44353, + 47656, + 961899, + 18614, + 3417, + 10584, + 66416, + 1324264, + 10503, + 5614, + 9805, + 9169, + 132072, + 109991, + 147031, + 21724, + 58158, + 64726, + 16506, + 199580, + 24015, + 322586, + 67344, + 29920, + 105720, + 3147, + 5526, + 169321, + 22742, + 21852, + 116180, + 7479, + 9432256, + 65278, + 16068, + 18289, + 19942, + 11704, + 8260, + 7070, + 21808, + 113190, + 17644, + 3706, + 82954, + 4297, + 44505, + 38692, + 57256, + 169341, + 111764, + 31823, + 82669, + 116597, + 22822, + 3903, + 10621, + 17049, + 30317, + 418822, + 32577, + 46369, + 97938, + 103296, + 20638, + 78456, + 28895, + 130977, + 14254, + 143639, + 32735, + 19447, + 315014, + 15023, + 7046, + 3096, + 224282, + 80101, + 4809, + 55326, + 167845, + 32036, + 16057, + 18051, + 12007, + 17200, + 144219, + 24195, + 36599, + 15645, + 25746, + 7802, + 28406, + 8670, + 29753, + 23256, + 236035, + 82421, + 16337, + 6454, + 137339, + 170801, + 31410, + 55245, + 15895, + 15481, + 5217, + 2913, + 110458, + 8329, + 7864, + 41451, + 12247, + 27925, + 143297, + 78787, + 5468, + 12960, + 104139, + 9679, + 11989, + 32293, + 12722, + 29556, + 17554, + 8804, + 16915, + 8527, + 17370, + 295514, + 8731, + 18038, + 61605, + 225092, + 332998, + 2829, + 16947, + 8626, + 1727, + 17591, + 173361, + 98042, + 141377, + 15140, + 4612 + ] + }, + { + "counters": [ + 19074, + 15610, + 356640, + 70576, + 33171, + 8800, + 63682, + 101935, + 62724, + 74050, + 166077, + 183460, + 2285, + 220445, + 2534, + 391914, + 232408, + 199139, + 43890, + 8763, + 22272, + 372049, + 482775, + 79472, + 31072, + 32664, + 80071, + 30328, + 38998, + 15355, + 13236, + 112871, + 73094, + 34122, + 9344, + 48415, + 8103, + 16474, + 41414, + 105196, + 18154, + 174055, + 20241, + 24483, + 18689, + 16810, + 45128, + 21092, + 30098, + 7451, + 2827, + 9372, + 6086, + 13889, + 77992, + 31355, + 19703, + 14030, + 6356, + 117378, + 24670, + 76461, + 13574, + 27104, + 8016, + 37127, + 8360, + 19163, + 13630, + 71219, + 70689, + 5315, + 9413, + 20700, + 29811, + 23727, + 19148, + 144560, + 143956, + 19480, + 73237, + 77871, + 4183, + 6801, + 135512, + 58075, + 7374, + 78042, + 137098, + 108443, + 13147, + 24165, + 24822, + 44425, + 32286, + 172905, + 14296, + 27854, + 103343, + 17366, + 171280, + 25190, + 12407, + 58981, + 36890, + 7475, + 68979, + 32364, + 62582, + 50799, + 15173, + 93800, + 1390, + 49548, + 7259, + 38558, + 47642, + 34111, + 74325, + 131590, + 9705, + 4037, + 6267, + 30900, + 54648, + 17344, + 3576, + 64332, + 12574, + 27768, + 49889, + 261974, + 24535, + 10167, + 8874, + 182732, + 15952, + 19995, + 28324, + 41653, + 26232, + 12331, + 268742, + 130047, + 69815, + 2430, + 102397, + 62715, + 9629, + 9545, + 151678, + 21438, + 286649, + 1277, + 13006, + 4789, + 94163, + 100379, + 80293, + 13522, + 53727, + 53858, + 6041, + 14369, + 96941, + 171691, + 8187, + 60181, + 14707, + 58139, + 6291, + 164330, + 10429, + 57531, + 319264, + 22124, + 167494, + 14021, + 84339, + 13707, + 197732, + 54063, + 53846, + 12486, + 21560, + 20224, + 121027, + 12503, + 86396, + 199919, + 71331, + 53468, + 2689, + 14639, + 129105, + 3226, + 23356, + 20763, + 27131, + 42419, + 41942, + 163195, + 5866, + 6606, + 145334, + 8027, + 77135, + 7917, + 91681, + 31878, + 15104, + 1274307, + 19146, + 22479, + 51436, + 16197, + 2473, + 49048, + 5825, + 29994, + 34250, + 12197, + 243075, + 10453, + 10328, + 179744, + 3602, + 7129, + 15425, + 46205, + 129658, + 58212, + 73507, + 195825, + 83302, + 33545, + 12642, + 3672, + 22147, + 28260, + 5218, + 38226, + 55963, + 13849, + 53476, + 7617, + 13755, + 6209, + 2842, + 3243, + 150843, + 44623, + 33069, + 43809, + 35535, + 6546, + 8471, + 20329, + 31791, + 44861, + 19358, + 163569, + 10191, + 12289, + 57049, + 28677, + 16936, + 12114, + 74351, + 99492, + 19809, + 46095, + 52863, + 13582, + 284449, + 14067, + 26408, + 3558, + 29135, + 137907, + 37240, + 10815, + 8975, + 65384, + 13930, + 13790, + 6467, + 12447, + 79723, + 203861, + 22999, + 65621, + 113573, + 16749, + 35911, + 80252, + 28394, + 161425, + 187576, + 111270, + 100831, + 53660, + 2428, + 16201, + 31331, + 151125, + 192275, + 2923, + 6347, + 26649, + 10346, + 20289, + 30506, + 32810, + 13389, + 82264, + 113376, + 10896, + 70506, + 319937, + 0, + 69136, + 128335, + 7273, + 49113, + 46747, + 17198, + 3868, + 3592, + 105378, + 60130, + 121212, + 85700, + 93519, + 26358, + 57150, + 14273, + 20722, + 10669, + 21041, + 18976, + 8264, + 11739, + 6661, + 6005, + 17646, + 161380, + 182297, + 39947, + 55819, + 55131, + 14724, + 98428, + 39728, + 58923, + 80498, + 418878, + 39697, + 100644, + 11570, + 335355, + 22235, + 32896, + 14360, + 91893, + 80309, + 31216, + 7686, + 16249, + 14290, + 20703, + 222788, + 552267, + 130714, + 4973, + 6519, + 44673, + 9558, + 214532, + 40903, + 16703, + 42372, + 14836, + 24831, + 21421, + 7213, + 31940, + 42666, + 776079, + 14430, + 34642, + 22715, + 19186, + 42482, + 115564, + 20254, + 6914, + 6025, + 59457, + 13377, + 346598, + 7897, + 13015, + 60524, + 9912, + 15215, + 20341, + 16911, + 9037, + 13004, + 410671, + 24183, + 33615, + 231544, + 118067, + 13595, + 9795, + 7177, + 15935, + 170975, + 135535, + 38905, + 135209, + 25038, + 81768, + 67778, + 17110, + 103075, + 17002, + 9831, + 191471, + 37704, + 479793, + 306698, + 5366, + 45544, + 7719, + 282555, + 35352, + 105604, + 21660, + 4233, + 58546, + 8676, + 15087, + 76381, + 84254, + 161791, + 22530, + 25010, + 15449, + 15815, + 335154, + 65301, + 74524, + 10042, + 19989, + 124674, + 58800, + 28997, + 94489, + 4057, + 13923, + 105596, + 14818, + 3173, + 3435, + 68837, + 17766, + 4432, + 45473, + 6817, + 21239, + 6452, + 39547, + 60945, + 27239, + 66569, + 120776, + 26121, + 307816, + 34818, + 16774, + 148968, + 56735, + 4173, + 257186, + 23108, + 22980, + 23385, + 50566, + 441760, + 11086, + 7487, + 107746, + 307993, + 58509, + 106106, + 44330, + 7395, + 54643, + 20096, + 3065, + 69157, + 106651, + 7747, + 273402, + 79496, + 50953, + 16265, + 57252, + 18134, + 9210, + 32426, + 23434, + 48536, + 51179, + 613242, + 10639, + 24588, + 197519, + 125769, + 36651, + 4406, + 8057, + 27097, + 77426, + 51389, + 27629, + 63005, + 157825, + 6871, + 3316, + 19819, + 89086, + 13890, + 15528, + 614772, + 32257, + 179465, + 10581, + 52733, + 54749, + 120236, + 73500, + 6253, + 226796, + 423063, + 4772, + 41846, + 165864, + 87385, + 99928, + 10189, + 6051, + 66559, + 26801, + 16095, + 144340, + 9912, + 9467, + 327037, + 26586, + 65200, + 13556, + 129508, + 12866, + 4167, + 32335, + 165122, + 4205, + 81500, + 15945, + 28123, + 4107, + 240466, + 149481, + 12371, + 29371, + 224936, + 29878, + 15569, + 2244, + 14129, + 237655, + 56947, + 126524, + 16402, + 8190, + 151194, + 14965, + 28393, + 45124, + 13836, + 52969, + 525859, + 8188, + 18360, + 176870, + 47054, + 27062, + 55024, + 148291, + 284500, + 209521, + 217945, + 5460, + 104353, + 27237, + 35170, + 149057, + 12108, + 16076, + 25984, + 109231, + 64873, + 37293, + 65744, + 22314, + 2162, + 11744, + 29295, + 29182, + 38601, + 70607, + 39811, + 78901, + 19460, + 23078, + 84878, + 47045, + 52789, + 54344, + 64117, + 752126, + 10797, + 318856, + 40542, + 16110, + 13343, + 127661, + 9636, + 12386, + 179758, + 4663, + 8582, + 109338, + 20815, + 14625, + 8641, + 40078, + 36055, + 44815, + 13067, + 34391, + 35650, + 1064166, + 24997, + 29837, + 7143, + 19609, + 23363, + 15108, + 46615, + 12182, + 61478, + 255650, + 174412, + 128336, + 131575, + 44313, + 49853, + 6794, + 5000, + 18384, + 133328, + 166520, + 12880, + 197687, + 185031, + 27514, + 12953, + 37182, + 22032, + 54390, + 43792, + 75979, + 58135, + 56244, + 12154, + 37753, + 22413, + 53550, + 320840, + 25814, + 318249, + 51379, + 212845, + 12161, + 4868, + 62966, + 86810, + 126273, + 83219, + 98734, + 97644, + 11354, + 4455, + 70139, + 17775, + 113833, + 9972, + 272467, + 69983, + 7811, + 31882, + 6353, + 4169, + 418478, + 90623, + 19326, + 2011, + 32945, + 170750, + 10151, + 149458, + 22712, + 14609, + 15929, + 22119, + 5623, + 2037924, + 41482, + 54679, + 42895, + 43487, + 10842, + 55185, + 86078, + 14866, + 301979, + 394737, + 32059, + 58893, + 166459, + 84939, + 8777, + 1600201, + 3663, + 125481, + 144850, + 33226, + 13161, + 56126, + 4416, + 64758, + 73025, + 9868, + 73811, + 108858, + 28401, + 15258, + 14905, + 20275, + 225363, + 58160, + 25451, + 86808, + 481317, + 90268, + 126482, + 6194, + 61450, + 78423, + 93422, + 41172, + 2453, + 22011, + 31806, + 21673, + 28701, + 18509, + 14761, + 4550, + 977760, + 11012, + 26223, + 28636, + 20581, + 1608006, + 30137, + 53654, + 31358, + 11940, + 182671, + 25436, + 37813, + 12477, + 39400, + 4517, + 30262, + 330, + 105533, + 70430, + 49986, + 29434, + 51829, + 84352, + 59633, + 187475, + 10909, + 31527, + 11727, + 272483, + 23420, + 83618, + 10459, + 30526, + 109470, + 32028, + 46730, + 266776, + 3445, + 710272, + 200199, + 268597, + 10617, + 4989, + 54745, + 7687, + 21022, + 9211, + 6984, + 21021, + 290204, + 21406, + 22880, + 10575, + 9171, + 19085, + 46128, + 266202, + 237430, + 3832, + 48974, + 43776, + 212135, + 13892, + 22206, + 2015, + 78760, + 111604, + 27515, + 24450, + 25146, + 302370, + 31889, + 128625, + 56457, + 12356, + 25139, + 14879, + 43273, + 13749, + 33572, + 104369, + 14964, + 29667, + 10645, + 19902, + 31885, + 58762, + 48782, + 137629, + 225693, + 4414, + 6794, + 20954, + 43475, + 41114, + 13477, + 31287, + 180159, + 57453, + 17099, + 48634, + 39331, + 10855, + 117842, + 9197, + 30149, + 161943, + 27785, + 13238, + 10281, + 56479, + 76590, + 1930, + 12689, + 34852, + 43942, + 48485, + 7453, + 17838, + 162871, + 3101733, + 75764, + 51179, + 43682, + 7134, + 13504, + 30756, + 15158, + 288267, + 27457, + 168414, + 28428, + 163860, + 54793, + 655144, + 38223, + 40431, + 12526, + 90522, + 45518, + 33212, + 7588, + 9560, + 581797, + 162515, + 210131, + 49727, + 3980, + 102251, + 61872, + 92088, + 19527, + 52565, + 2802, + 135441, + 73134, + 122189, + 419344, + 23197, + 42607, + 44181, + 533382, + 46846, + 1278312, + 425855, + 64168, + 31021, + 9565, + 41911, + 283389, + 5695519, + 16896, + 63623, + 364632, + 22693, + 2591, + 27487, + 6234, + 30265, + 7404, + 19690, + 23867, + 14006, + 214291, + 6114, + 128182, + 92505, + 4645, + 10042, + 113178, + 37737, + 108239, + 4102, + 45466, + 45327, + 99936, + 50402, + 33381, + 49138, + 24821, + 23943, + 72560, + 17144, + 5859, + 12078, + 18756, + 132620, + 62660, + 72336, + 15498, + 71117, + 4481, + 3221, + 96982, + 11123, + 147380, + 22663, + 62985, + 19233, + 29885, + 42432, + 28892, + 94609, + 138502, + 2410, + 293268, + 9035, + 16581, + 27858, + 32982, + 29465, + 44342, + 88155, + 35279, + 46313, + 4859, + 111141, + 15688, + 10130, + 16734, + 8568, + 7081, + 117354, + 16489, + 10789, + 63086, + 5916, + 75553, + 9438, + 92443, + 72227, + 106529, + 58666, + 5740, + 243962, + 198235, + 10909, + 68784, + 35171, + 78709, + 50274, + 15296, + 50579, + 28696, + 40258, + 17315, + 7642, + 9443, + 10570, + 85765, + 15216, + 13435, + 4983, + 4930, + 8744, + 38184, + 4409, + 25308, + 95507, + 11767, + 62312, + 19443, + 109452, + 190490, + 112478, + 11271, + 20424, + 24182, + 8405, + 6173, + 16386, + 9133, + 18943, + 97882, + 54431, + 91759, + 36438, + 8799, + 30864, + 79662, + 25572, + 8015, + 35402, + 37690, + 28694, + 45210, + 10292, + 52120, + 41085, + 67092, + 16449, + 35879, + 108845, + 57754, + 79745, + 105544, + 16459, + 94540, + 9717, + 172335, + 22168, + 56027, + 9606501, + 52138, + 11435, + 17034, + 6208, + 4268, + 297641, + 36827, + 21470, + 11623, + 34538, + 4441, + 32961, + 58904, + 182530, + 68106, + 63654, + 21478, + 44907, + 81051, + 11567, + 11190, + 6367, + 9710, + 8730, + 406487, + 152614, + 106341, + 31241, + 34326, + 4459, + 115931, + 119658, + 39006, + 113184, + 43650, + 50598, + 19255, + 333128, + 22888, + 11939, + 60187, + 11687, + 133382, + 48688, + 28534, + 264372, + 1752, + 13203, + 1517, + 128268, + 33199, + 11232, + 226275, + 20391, + 32811, + 22230, + 19383, + 30771, + 5731, + 102350, + 68215, + 321698, + 14289, + 1874743, + 416175, + 92712, + 2337, + 43435, + 2443, + 379010, + 15102, + 11254, + 38453, + 73482, + 34470, + 11330, + 15233, + 209110, + 15651, + 5709, + 83268, + 8578, + 12438, + 8936, + 153645, + 20075, + 28922, + 7408, + 28266, + 27325, + 197756, + 123224, + 5452, + 45548, + 120875, + 1046262, + 117673, + 15288, + 10402, + 4900, + 11061, + 30387, + 24212, + 27151, + 7491, + 115254, + 51981, + 26306, + 185175, + 56304, + 25556, + 66143, + 76732, + 5022, + 42847, + 1913, + 23738, + 159820, + 185412, + 8143, + 31973, + 34385, + 15008, + 50643, + 50007, + 13057, + 25362, + 2467, + 2530, + 208216, + 4641, + 2641, + 24465, + 11401, + 52387, + 20642, + 35376, + 117047, + 15243, + 12783, + 31239, + 55245, + 19943, + 329815, + 59442, + 15011, + 4639, + 170475, + 5253, + 22914, + 23757, + 5784, + 15652, + 2169, + 22182, + 139038, + 32132, + 10686, + 18439, + 10347, + 14741, + 33562, + 77144, + 70969, + 15200, + 40052, + 36944, + 34171, + 6902, + 29837, + 3202, + 42586, + 337379, + 32141, + 26291, + 59526, + 59509, + 18913, + 29349, + 179268, + 154880, + 11029, + 29016, + 71597, + 126423, + 8554, + 41534, + 32336, + 5799, + 26466, + 65845, + 48377, + 6572, + 63087, + 3483, + 7461, + 37034, + 139041, + 48188, + 40388, + 35099, + 39664, + 156460, + 42937, + 18181, + 27995, + 47207, + 34473, + 15936, + 4508, + 122585, + 3561, + 98289, + 45413, + 15662, + 52400, + 11615, + 20065, + 7280, + 42195, + 107435, + 168080, + 198929, + 11755, + 7638, + 16892, + 446633, + 30762, + 185384, + 13045, + 164156, + 30588, + 245671, + 13820, + 19711, + 17315, + 157576, + 9674, + 7359, + 30690, + 89187, + 22381, + 43093, + 5860, + 82171, + 129241, + 24072, + 13230, + 5678, + 10964, + 10139, + 69243, + 20461, + 98923, + 92011, + 50400, + 12031, + 112322, + 97162, + 16723, + 71058, + 61488, + 228412, + 7164, + 4220, + 58329, + 13073, + 53442, + 95705, + 71833, + 9069, + 15216, + 175989, + 26616, + 104456, + 21910, + 34025, + 15469, + 8766, + 7803, + 19416, + 5269, + 57215, + 48670, + 18766, + 69153, + 50678, + 51947, + 17994, + 133078, + 74918, + 53378, + 45730, + 81787, + 298540, + 5484, + 78229, + 17164, + 51506, + 11468, + 40431, + 175847, + 6702, + 26999, + 98718, + 6036, + 63580, + 19576, + 4043, + 30880, + 97434, + 232422, + 15078, + 14628, + 202432, + 14746, + 114936, + 14750, + 22856, + 17220, + 55636, + 76005, + 122937, + 37837, + 123881, + 31038, + 41018, + 38947, + 30672, + 11945, + 9016, + 42743, + 20587, + 49183, + 10403, + 5100, + 11522, + 82603, + 10418, + 12408, + 11464, + 13695, + 8794, + 173140, + 186087, + 10651, + 28595, + 24618, + 22001, + 12998, + 15385, + 52276, + 27269, + 59067, + 76693, + 10710, + 17917, + 7332, + 19354, + 14129, + 13484, + 32415, + 76252, + 8000, + 37089, + 79308, + 123599, + 92090, + 12174, + 358788, + 223748, + 43165, + 35054, + 117901, + 58034, + 204297, + 38081, + 16736, + 27996, + 11217, + 29886, + 159016, + 46288, + 8582, + 172134, + 10964, + 30673, + 26042, + 139018, + 88785, + 89010, + 5162, + 27149, + 6501, + 79520, + 53222, + 9921, + 20500, + 79649, + 50834, + 19205, + 72084, + 3980, + 77397, + 101355, + 19014810, + 13409, + 7181, + 15664, + 148210, + 12630, + 52881, + 2810, + 87752, + 42224, + 50027, + 1963, + 13513, + 208753, + 3311, + 132394, + 4495, + 628304, + 39905, + 5066, + 275533, + 110138, + 15632, + 5395, + 4733, + 11987, + 10562, + 11704, + 55737, + 4271, + 4904, + 52709, + 104443, + 17917, + 69112, + 14454, + 30315, + 111832, + 9407, + 3656, + 192932, + 488584, + 10108, + 10484, + 159324, + 50323, + 23382, + 67417, + 181935, + 9419, + 175142, + 81699, + 5668, + 20247, + 274178, + 84854, + 363860, + 33070, + 17427, + 5322, + 85809, + 6104, + 530115, + 5721, + 48382, + 10137, + 13378, + 191248, + 32774, + 7046, + 17599, + 20266, + 43695, + 5486, + 13622, + 36153, + 24772, + 67130, + 187666, + 11761, + 104336, + 212373, + 87231, + 61495, + 68392, + 103918, + 8433, + 52902, + 76008, + 7313, + 33865, + 4156, + 40777, + 6362, + 405165, + 30374, + 130528, + 31191, + 81259, + 33804, + 12949, + 2363, + 28335, + 29924, + 165264, + 177877, + 36427, + 20669, + 13632, + 176556, + 175452, + 10662, + 233103, + 70208, + 314955, + 37561, + 11103, + 82694, + 26968, + 4590, + 47833, + 22806, + 8704, + 28391, + 4337, + 25181, + 55223, + 146133, + 147587, + 94770, + 6573, + 26432, + 19255, + 140472, + 12130, + 70030, + 89652, + 178216, + 42037, + 49682, + 24595, + 53060, + 29172, + 6501, + 1462, + 32059, + 195227, + 26501, + 204258, + 4542, + 15185, + 12538, + 60140, + 181675, + 8410, + 10045, + 20991, + 73160, + 3225, + 6938, + 110843, + 158937, + 43577, + 11213, + 13270, + 16866, + 337943, + 87251, + 34533, + 17828, + 12334, + 23587, + 82721, + 341931, + 30758, + 7674, + 30768, + 41869, + 5616, + 132004, + 12521, + 11897, + 50605, + 7493, + 14938, + 80552, + 9472, + 14894, + 24379, + 5015, + 92424, + 8949, + 26251, + 167219, + 32749, + 43772, + 21558, + 11229, + 197337, + 488796, + 19312, + 8500, + 183604, + 6336, + 7727, + 82460, + 33240, + 8883, + 65671, + 13768, + 16946, + 21499, + 13162, + 29375, + 65247, + 195087, + 128521, + 51102, + 37477, + 21822, + 176829, + 7356, + 30551, + 266182, + 2033, + 10536, + 266047, + 15308, + 8467, + 151113, + 40917, + 2860, + 18753, + 17705, + 10129, + 39954, + 15496, + 248297, + 121085, + 35257, + 3101923, + 39222, + 9605, + 40086, + 11122, + 33779, + 99833, + 183842, + 8041, + 9889, + 24552, + 58896, + 151492, + 91193, + 25255, + 5195, + 48903, + 52027, + 59719, + 54950, + 3486, + 85373, + 11251, + 10549, + 115473, + 47412, + 171613, + 6843, + 60149, + 147594, + 18408, + 16151, + 224126, + 136558, + 74799, + 97291, + 37776, + 68942, + 84040, + 14614, + 40809, + 76313, + 10585, + 117350, + 40608, + 33858, + 180628, + 88366, + 1552928, + 18822, + 19378, + 251076, + 112991, + 20236, + 21824, + 185155, + 8191, + 107660, + 116710, + 23884, + 188491, + 8796, + 8288, + 36320, + 65238, + 67937, + 1603829, + 29393, + 15119, + 39524, + 40343, + 12426, + 180933, + 99236, + 16949, + 272080, + 104697, + 19300, + 306569, + 18591, + 17130, + 24407, + 22266, + 73844, + 32982, + 14621, + 24140, + 12437, + 322869, + 55510, + 287109, + 7368, + 11904, + 53334, + 19918, + 32014, + 3217, + 17808, + 26763, + 6591, + 4391, + 5411, + 23950, + 24315, + 11125, + 120958, + 14622, + 60776, + 94355, + 18179, + 58013, + 30008, + 66255, + 239674, + 13054, + 52839, + 18707, + 181467, + 12905, + 40004, + 63743, + 60660, + 36395, + 2544, + 49788, + 38022, + 5277, + 93137, + 4215, + 11615, + 17992, + 5016, + 43341, + 48611, + 11191, + 175725, + 21230, + 64336, + 9404, + 4340, + 5203, + 5771, + 66449, + 176322, + 39973, + 9711, + 5124, + 41334, + 12191, + 26667, + 13146, + 32678, + 5926, + 39761, + 43284, + 53873, + 28413, + 1834, + 29371, + 535727, + 13588, + 35021, + 31244, + 6732, + 69280, + 49425, + 10669, + 414829, + 135701, + 6707, + 19652, + 3715, + 65911, + 4100, + 4537, + 118267, + 15036, + 187486, + 304881, + 79082, + 27602, + 95965, + 48479, + 49602, + 16752, + 12809, + 46730, + 23049, + 6107, + 201309, + 12407, + 3902, + 12420, + 47058, + 192396, + 10801, + 25788, + 9789, + 28360, + 4405, + 89079, + 23103, + 298526, + 223767, + 12263, + 40542, + 98155, + 33791, + 29819, + 15856, + 74094, + 10517, + 18853, + 29510, + 66769, + 246833, + 13865, + 9342, + 128407, + 85489, + 15432, + 181798, + 55311, + 55830, + 10904, + 35791, + 50689, + 304394, + 72357, + 2987, + 3642, + 5677, + 8231, + 179289, + 72781, + 57983, + 38299, + 35792, + 316991, + 121132, + 5352, + 62135, + 13927, + 47220, + 7699, + 9273, + 163949, + 107359, + 121298, + 269605, + 3670, + 8720, + 136034, + 198587, + 50976, + 6814, + 14238, + 921579, + 475167, + 45610, + 261495, + 69585, + 53397, + 160141, + 96809, + 202903, + 3525, + 133663, + 17979, + 5220, + 88380, + 29782, + 45489, + 84328, + 27019, + 32637, + 14266, + 43438, + 6700, + 25714, + 52802, + 84902, + 14439, + 78596, + 41446, + 23974, + 21931, + 8146, + 35434, + 54699, + 12334, + 133693, + 16211, + 85280, + 3516 + ] + }, + { + "counters": [ + 171676, + 22792, + 87648, + 13743, + 89486, + 43750, + 69908, + 50807, + 13321, + 6130, + 16772, + 77179, + 121301, + 6316, + 302756, + 66771, + 10858, + 38878, + 42372, + 14849, + 32965, + 59119, + 39723, + 186327, + 69959, + 207701, + 315909, + 77905, + 49412, + 329759, + 311750, + 164085, + 2399, + 68072, + 22723, + 21820, + 34794, + 41356, + 98102, + 7056, + 65776, + 4772, + 88150, + 29353, + 93480, + 38403, + 79688, + 16545, + 81421, + 10556, + 168212, + 11633, + 26028, + 10770, + 408595, + 25447, + 50057, + 20281, + 33329, + 7002, + 29294, + 7690, + 6518, + 4307, + 29428, + 30150, + 46274, + 30593, + 68658, + 13011, + 18976, + 14709, + 87523, + 2431, + 17493, + 62085, + 28639, + 6332, + 2887, + 10719, + 18701, + 269246, + 26521, + 2193, + 63642, + 9918, + 104506, + 178333, + 24752, + 26949, + 206295, + 55988, + 98419, + 4748, + 7587, + 5456, + 17802, + 179390, + 47123, + 15094, + 194195, + 156800, + 88865, + 8998, + 71289, + 74003, + 56262, + 48909, + 21204, + 61734, + 15400, + 63698, + 150117, + 53991, + 193893, + 6871, + 9819, + 13792, + 60783, + 17645, + 6257, + 87572, + 101182, + 36121, + 39458, + 237658, + 9877, + 6582, + 5361, + 33593, + 614219, + 47086, + 94608, + 31183, + 93045, + 65073, + 74012, + 24301, + 41546, + 21497, + 18396, + 195295, + 90341, + 20447, + 16163, + 22311, + 25123, + 114747, + 17201, + 19827, + 135074, + 24982, + 65678, + 32341, + 73773, + 27330, + 216467, + 167199, + 2334, + 66843, + 210587, + 60717, + 10331, + 34306, + 81907, + 76922, + 39000, + 10969, + 11872, + 5102, + 90960, + 20105, + 16474, + 9497, + 88455, + 22829, + 36530, + 18485, + 10698, + 16644, + 6890, + 2167, + 8956, + 4059, + 56700, + 38684, + 6611, + 18486, + 63178, + 24380, + 10592, + 207571, + 30781, + 12177, + 20571, + 31855, + 29665, + 13553, + 34862, + 5272759, + 53811, + 42751, + 61666, + 164194, + 93616, + 9382, + 86872, + 15728, + 118646, + 25360, + 61532, + 7851, + 338236, + 838966, + 17635, + 2863, + 34655, + 13212, + 13915, + 6587, + 3739, + 60633, + 137606, + 6770, + 9311, + 15133, + 42157, + 15246, + 8609, + 149371, + 22604, + 27718, + 21817, + 19432, + 29042, + 6526, + 29358, + 66237, + 108642, + 65344, + 7166, + 7058, + 9603, + 3574, + 46263, + 98059, + 1355, + 124694, + 73953, + 18860, + 6288, + 163249, + 5143, + 321217, + 61110, + 50153, + 49265, + 70619, + 109750, + 12048, + 3965, + 6027, + 177721, + 11534, + 2476, + 7529, + 7094, + 62459, + 32612, + 8695, + 8639, + 107383, + 46078, + 16504, + 293951, + 9645, + 21272, + 186172, + 18746, + 9398666, + 90765, + 173898, + 133538, + 10077, + 17934, + 35056, + 53368, + 40495, + 63800, + 13820, + 11499, + 18805, + 32802, + 3527, + 4831, + 13726, + 25204, + 120509, + 32205, + 3973, + 48819, + 17182, + 29879, + 70069, + 5650, + 92454, + 37210, + 15483, + 57739, + 2817, + 24523, + 27083, + 173729, + 95948, + 37657, + 38651, + 35137, + 28864, + 118176, + 28238, + 58129, + 13169, + 24139, + 422292, + 278985, + 3746, + 29586, + 21193, + 38485, + 45186, + 117226, + 81099, + 8561, + 19716, + 22761, + 255422, + 19559, + 13122, + 12163, + 59887, + 11263, + 70337, + 14700, + 15917, + 58188, + 280419, + 25273, + 21197, + 25324, + 49180, + 106425, + 85285, + 10438, + 79270, + 33006, + 46560, + 24945, + 191125, + 52799, + 136748, + 211046, + 4276, + 32346, + 16411, + 124203, + 18837, + 68576, + 148121, + 29986, + 146286, + 25823, + 34597, + 20953, + 26509, + 23165, + 212594, + 201080, + 11106, + 79226, + 34338, + 12384, + 14689, + 30463, + 19772, + 104094, + 51868, + 3458, + 14405, + 6049, + 38522, + 163889, + 169168, + 12684, + 8897, + 35910, + 173021, + 11525, + 84063, + 97942, + 31616, + 44945, + 9560, + 31821, + 26763, + 4286, + 18178, + 123260, + 19389, + 30895, + 87785, + 24318, + 31519, + 62434, + 11780, + 58500, + 3074, + 102230, + 92955, + 31609, + 52586, + 161467, + 91008, + 30732, + 121491, + 15790, + 24711, + 93113, + 94299, + 17941, + 206335, + 5781, + 38240, + 49176, + 19050, + 4494, + 516354, + 29082, + 13423, + 43248, + 95284, + 15287, + 120520, + 7928, + 195100, + 16258, + 8756, + 67399, + 5429, + 37948, + 51269, + 184507, + 341061, + 3700, + 4637, + 3931, + 27155, + 301323, + 69993, + 78894, + 107586, + 11282, + 9285, + 20638, + 124690, + 75136, + 302420, + 254757, + 125668, + 40095, + 11832, + 24451, + 71841, + 20748, + 218588, + 61326, + 17101, + 94772, + 14938, + 24228, + 501953, + 67844, + 10917, + 9930, + 330425, + 292268, + 4132, + 12187, + 44086, + 150209, + 171366, + 50434, + 10740, + 42541, + 5542, + 7742, + 44264, + 29309, + 65324, + 28484, + 19222, + 299318, + 187182, + 3706, + 30236, + 20402, + 4657, + 3224, + 5034, + 11410, + 338554, + 35441, + 47302, + 3175, + 30820, + 3231, + 6819, + 7740, + 235769, + 12770, + 15804, + 3763, + 6311, + 9824, + 139270, + 17751, + 83975, + 172542, + 16368, + 34418, + 40552, + 10227, + 23889, + 34238, + 276625, + 12414, + 13556, + 148266, + 61165, + 24380, + 8595, + 14073, + 18918, + 18970, + 75327, + 49877, + 20255, + 14530, + 63296, + 13435, + 282393, + 30511, + 28848, + 119641, + 19472, + 11383, + 9737, + 61643, + 17308, + 180031, + 16421, + 265246, + 8987, + 115213, + 56924, + 3915, + 20013, + 35057, + 34220, + 83809, + 6121, + 34218, + 31546, + 149725, + 36785, + 54637, + 19188, + 5783, + 106392, + 126785, + 51231, + 3867, + 13700, + 10307, + 182923, + 39249, + 233027, + 59460, + 15285, + 67179, + 161297, + 34837, + 10559, + 6159, + 139356, + 78588, + 8702, + 13951, + 2777, + 937, + 44655, + 14670, + 34168, + 152813, + 19963, + 1663, + 136895, + 16256, + 19492, + 12327, + 17940, + 44861, + 43014, + 38118, + 150018, + 3646, + 23140, + 47895, + 9299, + 21784, + 13580, + 401524, + 6098, + 58245, + 58432, + 780818, + 148242, + 16862, + 32157, + 6681, + 13701, + 272932, + 6693, + 311539, + 63023, + 5270, + 9860, + 2124277, + 70322, + 6944, + 115658, + 39308, + 34152, + 97867, + 56496, + 113318, + 5839, + 10297, + 90303, + 11440, + 3418, + 9661, + 34994, + 93110, + 8792, + 46909, + 60051, + 7494, + 18571, + 13662, + 68690, + 69350, + 39796, + 45874, + 88731, + 16480, + 5239, + 175085, + 18495, + 31395, + 13449, + 14601, + 1480, + 3560, + 293997, + 5738, + 186076, + 16852, + 16446, + 7833, + 240726, + 5774, + 144110, + 17019, + 37816, + 38283, + 6400, + 37685, + 40566, + 15542, + 18421, + 15967, + 62595, + 29636, + 77210, + 30670, + 17172, + 172552, + 44416, + 39473, + 42115, + 158564, + 6964, + 97780, + 56493, + 37413, + 21710, + 80583, + 464837, + 2373, + 149022, + 10492, + 30535, + 180041, + 5425, + 117426, + 112557, + 15742, + 114937, + 107414, + 32183, + 112956, + 3170, + 33643, + 94072, + 91268, + 51725, + 23973, + 16665, + 70496, + 426142, + 525153, + 43954, + 16286, + 4630, + 4529, + 30955, + 30483, + 43296, + 2656, + 97148, + 30683, + 26877, + 13574, + 45820, + 88756, + 77955, + 55986, + 11866, + 4536, + 92616, + 31536, + 49680, + 117699, + 26987, + 26246, + 29023, + 7825, + 159169, + 8561, + 10294, + 84549, + 27810, + 59262, + 29420, + 31000, + 193882, + 21986, + 20731, + 7283, + 11754, + 6232, + 122326, + 19522, + 171993, + 3339, + 7421, + 137598, + 93814, + 17947, + 47508, + 56913, + 65675, + 62919, + 2199, + 6169, + 41850, + 27885, + 27737, + 97434, + 20728, + 199990, + 33031, + 171290, + 25400, + 161257, + 42211, + 49431, + 1959, + 2224, + 85968, + 150834, + 8041, + 15551, + 32123, + 89625, + 14007, + 34522, + 278687, + 4841, + 123007, + 71510, + 22823, + 14957, + 63204, + 37589, + 17231, + 10824, + 32520, + 7315, + 39227, + 133545, + 82615, + 76310, + 25230, + 36095, + 91158, + 57463, + 12072, + 8149, + 1566, + 19202, + 22875, + 18971, + 1602, + 6858, + 10114, + 79751, + 120412, + 19924, + 7857, + 12720, + 173460, + 353645, + 22299, + 92496, + 60944, + 321639, + 22577, + 28055, + 87317, + 7304, + 312868, + 12028, + 4582, + 168982, + 54691, + 4668, + 17109, + 137451, + 11248, + 6475, + 10195, + 247591, + 104272, + 25255, + 36333, + 14213, + 42269, + 272231, + 34735, + 16026, + 55224, + 139066, + 42678, + 11506, + 76151, + 620564, + 58003, + 228616, + 10914, + 183619, + 16791, + 18504, + 17922, + 21940, + 17520, + 19969, + 13062, + 19123, + 82402, + 34578, + 9010, + 27542, + 37478, + 44105, + 72912, + 163766, + 2063, + 146823, + 341224, + 81688, + 4762, + 27977, + 16943, + 42318, + 40581, + 242795, + 11947, + 7094, + 95873, + 3441, + 24151, + 177375, + 16970, + 267353, + 19196, + 97438, + 51014, + 115975, + 31825, + 24689, + 8802, + 7253, + 16375, + 9269, + 7227, + 8678, + 94668, + 6645, + 7624, + 313429, + 52279, + 2169, + 38471, + 214166, + 120061, + 35654, + 26870, + 40387, + 587341, + 251904, + 13511, + 177480, + 1052319, + 42795, + 73178, + 3115628, + 86345, + 7923, + 21213, + 55689, + 20477, + 22509, + 44973, + 8419, + 20346, + 54037, + 63179, + 44399, + 150630, + 80776, + 19078, + 5185, + 13433, + 78898, + 23806, + 362645, + 109429, + 7715, + 18143, + 7286, + 15302, + 1597596, + 41261, + 62250, + 25595, + 4370, + 42668, + 19993, + 374361, + 5579, + 49664, + 16853, + 108397, + 176346, + 43320, + 6440, + 19776, + 20840, + 54136, + 48167, + 21642, + 4393, + 34868, + 166885, + 82233, + 184540, + 49830, + 25593, + 35643, + 14990, + 144859, + 79073, + 6755, + 82868, + 8973, + 73702, + 27793, + 27469, + 46277, + 73678, + 9731, + 48819, + 98199, + 43646, + 71652, + 3801, + 34874, + 77852, + 1675492, + 38149, + 26789, + 26453, + 119153, + 6592, + 32996, + 20024, + 2876, + 55554, + 97943, + 45057, + 29328, + 4590, + 55891, + 82467, + 44012, + 11493, + 58849, + 165887, + 99573, + 23849, + 112089, + 272206, + 64485, + 61291, + 15516, + 8447, + 15163, + 22670, + 14848, + 12542, + 141985, + 64510, + 68979, + 21335, + 12279, + 137909, + 313847, + 398711, + 7185, + 3832, + 222332, + 12315, + 11630, + 125383, + 259427, + 101747, + 5952, + 9552, + 37972, + 38962, + 665292, + 2894, + 7874, + 66011, + 17304, + 189962, + 67457, + 11617, + 104243, + 18757, + 34433, + 26014, + 73464, + 17642, + 10904, + 33603, + 22296, + 13376, + 11262, + 83812, + 100813, + 32692, + 28542, + 11332, + 15106, + 117066, + 104105, + 36310, + 76004, + 214153, + 76058, + 96804, + 145164, + 22901, + 26194, + 19742, + 29444, + 8024, + 33736, + 4142, + 4655, + 46051, + 34242, + 6169, + 1527, + 69050, + 3139, + 108020, + 34555, + 19745, + 165345, + 15585, + 106103, + 62968, + 15461, + 1408, + 3777, + 37230, + 61674, + 13970, + 36065, + 3622, + 11487, + 28996, + 239014, + 44527, + 86707, + 26505, + 211674, + 3363, + 62386, + 92286, + 38018, + 79436, + 13191, + 82287, + 12537, + 125784, + 43094, + 113468, + 13347, + 46821, + 148654, + 88905, + 17429, + 22260, + 41483, + 23665, + 10683, + 100867, + 113043, + 279936, + 13547, + 171719, + 22483, + 21369, + 30868, + 17834, + 11782, + 3382, + 102545, + 47450, + 71697, + 14629, + 122523, + 237893, + 10515, + 18142, + 94947, + 196027, + 13911, + 5432, + 92555, + 18949, + 51093, + 48920, + 2877, + 11953, + 25712, + 13557, + 28885, + 4797, + 36595, + 17616, + 166693, + 12836, + 6410, + 13578, + 82317, + 109736, + 51000, + 7212, + 38189, + 668477, + 10740, + 18892, + 9353, + 19241, + 60556, + 1788, + 9679, + 191901, + 5132, + 7428, + 183195, + 69908, + 152570, + 15914, + 137887, + 220257, + 27313, + 61238, + 15630, + 6262, + 19135, + 68219, + 9214, + 30555, + 248466, + 175614, + 8305, + 85772, + 14380, + 9444, + 24509, + 8473, + 29268, + 15922, + 5135, + 120874, + 17807, + 14640, + 322224, + 358748, + 41910, + 16951, + 38838, + 10417, + 95775, + 36377, + 9126, + 8043, + 2949, + 89538, + 26919, + 207090, + 40059, + 34674, + 368357, + 7599, + 8032, + 166495, + 2863, + 25199, + 8207, + 78393, + 223812, + 6325, + 64611, + 63319, + 34751, + 96099, + 43361, + 11125, + 4236, + 35343, + 153145, + 58998, + 37477, + 11847, + 60250, + 93492, + 34578, + 9482, + 29632, + 12544, + 144773, + 38652, + 2311, + 15925, + 24042, + 3199, + 33258, + 111915, + 75118, + 46734, + 31560, + 4304, + 263915, + 140533, + 26671, + 14637, + 45412, + 26784, + 73198, + 3692, + 4933, + 29266, + 86841, + 243731, + 86403, + 21510, + 28759, + 50409, + 189714, + 3740, + 76898, + 266220, + 15747, + 14446, + 25043, + 19005, + 47414, + 375912, + 287718, + 176859, + 58776, + 292963, + 29693, + 12510, + 17036, + 59398, + 128169, + 32878, + 16395, + 22816, + 10575, + 109479, + 56746, + 15547, + 201052, + 34942, + 134951, + 63159, + 8558, + 4729, + 165589, + 5302, + 66674, + 243235, + 144194, + 4282, + 5269, + 56485, + 5321, + 52043, + 86674, + 104740, + 40371, + 71081, + 49584, + 37496, + 25505, + 8417, + 15917, + 48737, + 117026, + 25062, + 168554, + 28704, + 15577, + 24330, + 31599, + 10648, + 19638, + 83091, + 46685, + 18965779, + 406826, + 6282, + 3962, + 29707, + 24016, + 137907, + 12506, + 19288, + 2521, + 167171, + 23564, + 16924, + 5098, + 19732, + 121384, + 19362, + 75086, + 201760, + 19733, + 22610, + 5302, + 125411, + 6781, + 1891932, + 20757, + 63485, + 19498, + 61680, + 25143, + 33121, + 2224, + 324278, + 145214, + 23624, + 129404, + 10568, + 22358, + 1544, + 88004, + 57789, + 37765, + 34192, + 189053, + 32942, + 98394, + 85508, + 34468, + 11025, + 51186, + 42738, + 41765, + 16618, + 570960, + 72711, + 73229, + 89487, + 81965, + 4194, + 52697, + 5280, + 346383, + 33375, + 18249, + 8177, + 313255, + 69270, + 33320, + 17312, + 61543, + 9171, + 22969, + 17024, + 14901, + 16217, + 21757, + 239896, + 56836, + 57076, + 62013, + 56116, + 7218, + 53192, + 13082, + 8059, + 105184, + 106033, + 16384, + 19495, + 316779, + 516600, + 123749, + 47530, + 72139, + 8420, + 37851, + 3658, + 31363, + 204826, + 21040, + 119438, + 153843, + 202969, + 5458, + 21632, + 359510, + 282056, + 3000, + 8306, + 66805, + 50799, + 5121, + 1629957, + 3002, + 31034, + 3110, + 42359, + 43529, + 28800, + 10369, + 89206, + 24422, + 312740, + 95697, + 8773, + 5056, + 11154, + 242543, + 132212, + 24076, + 57436, + 34103, + 268946, + 40124, + 2375, + 250136, + 8139, + 18719, + 24055, + 37586, + 133692, + 39245, + 92932, + 16084, + 97471, + 185288, + 51617, + 12536, + 9312, + 54035, + 48184, + 8297, + 6537, + 18450, + 21273, + 44668, + 32418, + 33997, + 35939, + 31695, + 67013, + 159431, + 25064, + 13450, + 9051, + 10865, + 50219, + 3645, + 17614, + 8538, + 28021, + 7893, + 38358, + 60832, + 161809, + 4825, + 9751, + 34137, + 17147, + 49232, + 114289, + 2311, + 14218, + 34054, + 27229, + 7547, + 8339, + 26100, + 30108, + 34899, + 453240, + 63485, + 5008, + 15683, + 420978, + 93234, + 10868, + 14285, + 131752, + 4904, + 3354, + 58439, + 42776, + 54651, + 90165, + 21031, + 26249, + 47786, + 53410, + 12119, + 8223, + 25399, + 273583, + 55486, + 18575, + 3921, + 71263, + 62822, + 18766, + 18054, + 14400, + 22814, + 31800, + 5965, + 111587, + 110405, + 122174, + 5064, + 179392, + 68705, + 89060, + 117610, + 47182, + 14378, + 95156, + 32742, + 543806, + 12299, + 127705, + 78920, + 49509, + 86942, + 8245, + 35652, + 48675, + 164365, + 40507, + 3964, + 29680, + 22470, + 12546, + 15914, + 7663, + 100724, + 14840, + 4788, + 29845, + 28248, + 73326, + 48158, + 241578, + 27507, + 213428, + 15201, + 421804, + 54806, + 211618, + 4718, + 64986, + 196764, + 22910, + 8548, + 80300, + 27851, + 13198, + 19793, + 165092, + 10392, + 27854, + 15976, + 10800, + 13195, + 94519, + 14289, + 47503, + 45992, + 18144, + 143886, + 87733, + 50861, + 1806997, + 24113, + 67320, + 3482, + 15567, + 71132, + 69628, + 3301197, + 205460, + 9507, + 17998, + 14679, + 64644, + 171902, + 11338, + 10893, + 38145, + 38933, + 2278, + 23713, + 13700, + 24927, + 93286, + 29130, + 44984, + 22950, + 537552, + 56108, + 15372, + 12491, + 42269, + 331773, + 4747, + 8601, + 50659, + 33118, + 3465, + 558138, + 267436, + 232037, + 6473, + 22700, + 47457, + 999328, + 31656, + 14342, + 5900, + 8490, + 156782, + 14043, + 12166, + 26491, + 15985, + 252870, + 433581, + 68573, + 70531, + 4821, + 59430, + 35647, + 328757, + 177502, + 65335, + 8581, + 87390, + 69541, + 21990, + 30627, + 8684, + 33218, + 42247, + 23515, + 34456, + 41454, + 5178, + 4760, + 108803, + 21902, + 188029, + 128333, + 90758, + 35921, + 396158, + 59765, + 11858, + 51231, + 318096, + 21353, + 83287, + 12410, + 31159, + 31745, + 5671, + 20299, + 1562560, + 5887, + 28057, + 38548, + 29696, + 8662, + 11542, + 30300, + 32397, + 104062, + 33650, + 12249, + 22975, + 155994, + 110078, + 19403, + 29300, + 12223, + 2388, + 3285, + 223823, + 168593, + 196358, + 50064, + 29368, + 71999, + 35264, + 303237, + 166508, + 74475, + 87042, + 43698, + 48953, + 38920, + 75568, + 62669, + 8612, + 15862, + 74770, + 12930, + 18631, + 23877, + 16986, + 76674, + 66604, + 12892, + 7409, + 78236, + 49976, + 93818, + 3701, + 6496, + 9505, + 413638, + 20158, + 8758, + 9576, + 3040, + 8299, + 39262, + 212592, + 21191, + 10515, + 29966, + 39521, + 139364, + 153416, + 481229, + 12026, + 8142, + 4576, + 19572, + 20449, + 13556, + 77598, + 16143, + 7478, + 18283, + 17282, + 161844, + 7595, + 77069, + 178072, + 10410, + 124111, + 7186, + 91726, + 34547, + 39394, + 111772, + 3124, + 4452, + 80636, + 10366, + 244910, + 44657, + 17173, + 20484, + 85733, + 86687, + 10741, + 106672, + 266677, + 9161, + 7383, + 24105, + 273754, + 27038, + 20073, + 47326, + 22272, + 13851, + 12829, + 11136, + 315816, + 40372, + 2117, + 133563, + 3091, + 284429, + 39887, + 105804, + 36000, + 32467, + 79114, + 21123, + 178307, + 4957, + 219842, + 34252, + 5526, + 55373, + 21893, + 133603, + 106827, + 17190, + 49555, + 53850, + 80497, + 84401, + 94692, + 168576, + 3128, + 21254, + 34962, + 219856, + 58145, + 20119, + 11951, + 24015, + 31188, + 136808, + 104983, + 39763, + 19836, + 41669, + 31519, + 31949, + 11408, + 4769, + 35430, + 45149, + 25973, + 193235, + 29931, + 8760, + 52401, + 24755, + 32400, + 105748, + 22810, + 107143, + 26249, + 18425, + 158500, + 236749, + 19068, + 105938, + 61485, + 6386, + 63833, + 20634, + 70919, + 50926, + 11089, + 15577, + 5088, + 175545, + 28905, + 414337, + 81893, + 11005, + 176532, + 21144, + 21892, + 18693, + 4037, + 76951, + 3697, + 15199, + 2005, + 19817, + 29233, + 38591, + 208386, + 5617, + 37985, + 32427, + 122265, + 20525, + 6262, + 24966, + 172183, + 45722, + 82194, + 100506, + 23815, + 2587, + 15992, + 259206, + 40030, + 61636, + 122509, + 2385, + 21052, + 6776, + 31182, + 182464, + 22915, + 10367, + 31790, + 12112, + 24252, + 9422, + 3761, + 6462, + 42586, + 7449, + 50106, + 13319, + 17193, + 5488, + 9246, + 34263, + 67683, + 4957, + 2806, + 164623, + 8606, + 22416, + 240510, + 4946, + 347406, + 73612, + 6614, + 150866, + 52197, + 39257, + 3793, + 31097, + 55155, + 23305, + 31264, + 55026, + 78334, + 18372, + 190963, + 16562, + 10404, + 1058685, + 19988, + 49021, + 1266197, + 7897, + 6723, + 74591, + 17415, + 4444, + 37547, + 16925, + 2655, + 270842, + 36691, + 295174, + 25589, + 40239 + ] + }, + { + "counters": [ + 122612, + 18880, + 29506, + 59433, + 8643, + 16020, + 6640, + 74098, + 31902, + 54940, + 6605, + 7239, + 5424, + 14429, + 60099, + 37643, + 10367, + 92848, + 10863, + 105985, + 18357, + 3468, + 15005, + 16067, + 5162, + 17547, + 178251, + 26608, + 53718, + 21802, + 96444, + 188714, + 78158, + 60970, + 73326, + 9699, + 76672, + 62811, + 18164, + 61156, + 14883, + 16633, + 32134, + 43195, + 175705, + 18164, + 104791, + 119220, + 113053, + 12682, + 60135, + 103548, + 5327, + 9288, + 3995, + 59281, + 2627, + 287035, + 93431, + 25091, + 6159, + 6980, + 16240, + 38357, + 34430, + 23712, + 82978, + 29597, + 168747, + 44784, + 20080, + 8879, + 10904, + 7758, + 161487, + 17548, + 10462, + 39690, + 263677, + 12294, + 169416, + 11946, + 59242, + 34829, + 140947, + 8838, + 114350, + 283600, + 8823, + 33810, + 46980, + 159590, + 150375, + 32555, + 84646, + 24152, + 5504, + 11442, + 141537, + 14352, + 5083, + 2025, + 83375, + 50350, + 36283, + 25572, + 22519, + 274371, + 103544, + 16853, + 7836, + 9038, + 23175, + 87901, + 63669, + 401920, + 32447, + 5722, + 479881, + 83107, + 6615, + 226636, + 50907, + 27635, + 46861, + 31684, + 41111, + 30427, + 65451, + 69305, + 28018, + 29145, + 44100, + 14807, + 40809, + 59704, + 109771, + 146500, + 121061, + 3203947, + 3731, + 26773, + 146389, + 95675, + 1075, + 132838, + 40028, + 2924, + 8434, + 114447, + 8647, + 108878, + 83891, + 20097, + 7332, + 465200, + 22198, + 9262, + 17503, + 172176, + 54621, + 25566, + 150293, + 71178, + 24003, + 206445, + 57070, + 13721, + 52439, + 19728, + 66358, + 40561, + 486855, + 29434, + 283266, + 47236, + 107515, + 38061, + 77968, + 8029, + 3173, + 23856, + 66954, + 27670, + 23015, + 93368, + 35657, + 10182, + 58856, + 8922, + 19522, + 279699, + 7718, + 52659, + 12667, + 152351, + 3353, + 61012, + 127494, + 17729, + 94121, + 100504, + 19538, + 63281, + 12088, + 82454, + 61767, + 9033, + 24230, + 33699, + 388874, + 9110, + 27745, + 27009, + 32453, + 22560, + 12545, + 19849, + 41750, + 1601375, + 19252, + 10006, + 232765, + 38646, + 17380, + 20198, + 23865, + 68824, + 18208, + 12758, + 14305, + 76580, + 70003, + 37677, + 48441, + 52759, + 42287, + 20466, + 397500, + 73127, + 9027, + 9577, + 34941, + 11116, + 21346, + 14981, + 18608, + 35335, + 236219, + 2333, + 14015, + 2507, + 40994, + 2570, + 24974, + 6440, + 6505, + 185535, + 22819, + 247774, + 3415, + 24523, + 118667, + 55211, + 415026, + 50488, + 8304, + 63743, + 6094, + 110187, + 6955, + 39648, + 13090, + 40459, + 128033, + 61337, + 55741, + 20471, + 42480, + 5148, + 3856, + 113029, + 8111, + 120310, + 7746, + 42733, + 408769, + 8023, + 2118, + 108445, + 135034, + 182879, + 8574, + 36069, + 8881, + 12457, + 58556, + 9772, + 8062, + 58604, + 55471, + 8014, + 184121, + 14654, + 16501, + 3296, + 203953, + 67299, + 62735, + 75619, + 33505, + 17442, + 22246, + 3520, + 79975, + 27163, + 19741, + 147759, + 10916, + 29789, + 531685, + 12169, + 121528, + 31900, + 2569, + 66159, + 28983, + 46908, + 1315, + 42743, + 4379, + 9547, + 10015, + 4651, + 69300, + 90864, + 406310, + 13558, + 27477, + 104042, + 13499, + 19725, + 54192, + 216465, + 11372, + 86947, + 32838, + 4667, + 32419, + 64487, + 25499, + 114730, + 3764, + 5500, + 18833, + 52148, + 47197, + 9131, + 59094, + 34731, + 22711, + 28075, + 37726, + 42117, + 22374, + 40111, + 14981, + 89643, + 12533, + 15064, + 4680, + 182962, + 215589, + 68705, + 38579, + 43203, + 15580, + 90902, + 19465, + 18300, + 5607, + 154777, + 52681, + 8513, + 13765, + 18744, + 88700, + 85726, + 26138, + 14341, + 65094, + 3917, + 41402, + 3395, + 121381, + 8100, + 59006, + 3116200, + 85669, + 14262, + 302602, + 330622, + 23390, + 10882, + 7344, + 49536, + 60293, + 70899, + 57309, + 6627, + 20096, + 11736, + 112995, + 166220, + 33205, + 4580, + 76135, + 2158, + 9003, + 218146, + 35774, + 23947, + 11139, + 15349, + 179785, + 148071, + 708886, + 8654, + 71112, + 260423, + 79213, + 115728, + 56533, + 60172, + 3359, + 13136, + 5512, + 10382, + 41896, + 8389, + 126557, + 79802, + 20227, + 9325, + 60440, + 9957, + 27115, + 18274, + 36574, + 3780, + 346216, + 54473, + 28408, + 36117, + 94303, + 41325, + 71851, + 18278, + 6971, + 19029, + 9682, + 192000, + 64700, + 3142, + 54792, + 25732, + 6789, + 22100, + 28808, + 105350, + 280474, + 34377, + 5658, + 24268, + 22225, + 149135, + 2546, + 15771, + 43365, + 79905, + 9123, + 321071, + 14602, + 5268, + 24950, + 1654, + 65801, + 33393, + 18470, + 213804, + 136457, + 84562, + 22033, + 197085, + 114795, + 120117, + 106036, + 9403, + 70584, + 32437, + 61592, + 4277, + 6143, + 271682, + 15196, + 9239, + 89479, + 38255, + 26635, + 43236, + 107001, + 246253, + 13724, + 5549, + 65410, + 40526, + 8541, + 101046, + 10739, + 10444, + 209091, + 20938, + 20632, + 221928, + 78453, + 11413, + 12379, + 15568, + 348767, + 24946, + 14870, + 73546, + 34587, + 25331, + 12187, + 92566, + 56082, + 11946, + 5437, + 42401, + 23415, + 3621215, + 22385, + 11998, + 21962, + 96674, + 641915, + 6925, + 223775, + 11931, + 25005, + 14559, + 60097, + 82702, + 2995, + 19464, + 16617, + 13257, + 7406, + 7505, + 270568, + 119805, + 23393, + 64339, + 111556, + 18664, + 245306, + 7047, + 176278, + 43464, + 90091, + 9265, + 83769, + 182104, + 64771, + 20133, + 5600, + 64897, + 135565, + 19986, + 180783, + 92321, + 18304, + 6365, + 54475, + 77430, + 12828, + 12612, + 40208, + 14137, + 953452, + 4720, + 31836, + 39002, + 475685, + 4051, + 73722, + 57240, + 29100, + 7402, + 12063, + 34200, + 431373, + 103999, + 21228, + 41013, + 193776, + 21090, + 31253, + 10278, + 63039, + 50529, + 29371, + 11333, + 162835, + 7605, + 8877, + 30410, + 4056, + 173720, + 1894, + 29962, + 32730, + 37212, + 5781, + 139116, + 84033, + 83044, + 80023, + 18885, + 199272, + 87865, + 25433, + 59149, + 8529, + 34699, + 37901, + 213278, + 14327, + 13904, + 8757, + 25841, + 208342, + 2692, + 48211, + 136637, + 6171, + 46433, + 95067, + 14409, + 249459, + 24690, + 112500, + 15779, + 132637, + 15322, + 12828, + 80545, + 33543, + 11340, + 28499, + 67259, + 52807, + 19551, + 71588, + 3965, + 78845, + 14272, + 85914, + 247946, + 10477, + 10458, + 13696, + 35241, + 33700, + 1554, + 14895, + 257456, + 32547, + 19990, + 267662, + 165333, + 94432, + 16076, + 171485, + 38461, + 49511, + 1559375, + 48467, + 9423, + 29089, + 22477, + 45692, + 12434, + 30728, + 64091, + 19016, + 9580, + 19017, + 150198, + 2726, + 66633, + 57501, + 57865, + 12771, + 308702, + 16713, + 163692, + 36548, + 237792, + 11028, + 251771, + 136121, + 94877, + 2499, + 2856, + 268573, + 13600, + 4859, + 58122, + 16869, + 105341, + 116702, + 6334, + 12418, + 9759, + 374428, + 14775, + 245297, + 99261, + 5986, + 25576, + 91392, + 29126, + 35115, + 34250, + 96172, + 55834, + 48447, + 173333, + 3598, + 122480, + 15381, + 285397, + 4085, + 25250, + 48671, + 270664, + 8789, + 11533, + 116277, + 21055, + 62331, + 11145, + 9373, + 11020, + 14977, + 38185, + 56351, + 78878, + 17050, + 58482, + 19900, + 5417, + 43222, + 15837, + 44359, + 88964, + 51964, + 54069, + 9839, + 143185, + 48583, + 9583, + 27453, + 561706, + 35555, + 121674, + 47254, + 10125, + 8674, + 10118, + 72670, + 54562, + 10592, + 10419, + 57044, + 17960, + 22920, + 10313, + 41440, + 291694, + 28808, + 10359, + 51578, + 2804, + 9460, + 22631, + 49456, + 10102, + 170281, + 5862, + 187718, + 186310, + 18012, + 10438, + 588761, + 188970, + 27864, + 12058, + 3920, + 1212591, + 34740, + 33219, + 55575, + 11363, + 18293, + 49101, + 5604, + 14992, + 9925, + 19102, + 79856, + 540221, + 105633, + 60466, + 9363, + 19484, + 30527, + 35179, + 27574, + 27313, + 3939, + 52210, + 70952, + 21801, + 2102, + 104819, + 93874, + 64626, + 94049, + 24793, + 163912, + 58976, + 33620, + 25224, + 104309, + 9713, + 28246, + 410611, + 29759, + 54462, + 168402, + 10841, + 32518, + 1436, + 203904, + 8638, + 363445, + 183911, + 9026, + 90166, + 136117, + 19626, + 6933, + 116863, + 52495, + 132305, + 266517, + 445025, + 42103, + 13034, + 14959, + 5218, + 24454, + 17703, + 22446, + 44874, + 23053, + 34770, + 25446, + 22623, + 115431, + 7311, + 23038, + 40051, + 39067, + 12507, + 19481, + 302221, + 46217, + 12441, + 153908, + 116292, + 38650, + 56245, + 10444, + 49041, + 113183, + 25580, + 16146, + 52860, + 6881, + 131002, + 39039, + 112347, + 68674, + 24796, + 73992, + 47789, + 13467, + 127655, + 8443, + 67131, + 12837, + 20132, + 97260, + 90766, + 191305, + 18262, + 87726, + 32593, + 84862, + 5903, + 200854, + 17147, + 2657, + 9961, + 38592, + 2572, + 86476, + 36042, + 8031, + 11927, + 98516, + 12885, + 15437, + 20673, + 96501, + 23880, + 363073, + 111802, + 43425, + 39870, + 41052, + 196812, + 52373, + 12777, + 195321, + 84692, + 107459, + 43472, + 16588, + 5527, + 36217, + 112167, + 93594, + 47485, + 205601, + 25680, + 6242, + 108556, + 20339, + 41977, + 30167, + 103932, + 36780, + 143429, + 58831, + 5759, + 121511, + 6328, + 155069, + 28482, + 53295, + 100406, + 36261, + 13364, + 20509, + 33001, + 10898, + 119482, + 6686, + 22244, + 15080, + 12465, + 18477, + 84949, + 53723, + 45592, + 16961, + 89347, + 34714, + 30155, + 44772, + 61252, + 40666, + 25013, + 10762, + 107979, + 14946, + 13657, + 3143, + 8941, + 6458, + 20432, + 27832, + 70681, + 42357, + 87564, + 42959, + 38634, + 4258, + 11723, + 251757, + 12545, + 2361, + 16944, + 31491, + 1555, + 36382, + 10023, + 17169, + 63981, + 23331, + 131807, + 7583, + 204912, + 6830, + 20198, + 89198, + 44656, + 168171, + 100559, + 4794, + 4542, + 66401, + 3048, + 153703, + 59640, + 98576, + 20409, + 45224, + 11467, + 35389, + 12257, + 24311, + 167573, + 10673, + 97050, + 39530, + 4053, + 150101, + 24378, + 375807, + 261954, + 14274, + 77526, + 204282, + 8618, + 12086, + 21030, + 43555, + 25032, + 139843, + 3179, + 3585, + 120930, + 5575, + 8074, + 9567, + 62902, + 1281008, + 16827, + 38542, + 51319, + 26345, + 56800, + 51386, + 7244, + 23868, + 89673, + 1836, + 8358, + 12093, + 100889, + 8149, + 44682, + 47127, + 106377, + 87849, + 218640, + 5239, + 97171, + 5119, + 19608, + 33430, + 60081, + 9907, + 194911, + 17160, + 49498, + 4078, + 19478, + 105181, + 324807, + 175968, + 27070, + 7268, + 338228, + 25843, + 5050, + 60794, + 73959, + 179057, + 3992, + 10655, + 15595, + 71685, + 1280, + 73530, + 7535, + 32855, + 70835, + 216212, + 97756, + 12983, + 199825, + 74517, + 40753, + 8702, + 363934, + 74333, + 61395, + 138897, + 9061, + 129669, + 38747, + 13776, + 5869, + 43819, + 133764, + 77524, + 278003, + 328120, + 124848, + 139589, + 118675, + 23359, + 115661, + 45238, + 50975, + 34812, + 8043, + 83862, + 11586, + 184737, + 7930, + 63792, + 74253, + 10693, + 377831, + 11194, + 237386, + 11466, + 10681, + 12709, + 43646, + 3461, + 129052, + 7151, + 8880, + 20239, + 18254, + 90697, + 13458, + 23212, + 55915, + 10396, + 1600172, + 41355, + 160512, + 68082, + 62715, + 82262, + 3093, + 10856, + 132897, + 137103, + 10063, + 12216, + 293997, + 823707, + 4749, + 24807, + 4011, + 9174, + 12466, + 36762, + 61032, + 34623, + 27867, + 6004, + 31455, + 45583, + 22351, + 43881, + 5480, + 268096, + 13918, + 140442, + 1953, + 173244, + 3895, + 49179, + 11312, + 25872, + 27600, + 297154, + 97655, + 135823, + 11367, + 45304, + 605586, + 8010, + 6455, + 23617, + 4344, + 8516, + 37220, + 1068558, + 264573, + 46230, + 11562, + 5593, + 17482, + 25240, + 10800, + 3941, + 14374, + 140864, + 82450, + 160952, + 18983522, + 5681, + 17408, + 63157, + 9905, + 137811, + 9978, + 113600, + 89567, + 289355, + 74021, + 23796, + 28517, + 56466, + 160293, + 28636, + 22699, + 21494, + 10850, + 61816, + 259221, + 28042, + 19678, + 30896, + 17477, + 4817, + 8156, + 282880, + 116568, + 72613, + 25215, + 90889, + 68498, + 10942, + 3145, + 104683, + 18739, + 205911, + 1387, + 14376, + 9388, + 170022, + 9567, + 823643, + 79741, + 334331, + 208841, + 17012, + 306902, + 7968, + 26815, + 25222, + 15295, + 15728, + 2732, + 205965, + 10818, + 118120, + 54041, + 20440, + 75632, + 5823, + 26754, + 20514, + 24406, + 139635, + 54279, + 13810, + 23673, + 22867, + 44147, + 20148, + 19292, + 21622, + 131334, + 41067, + 13778, + 14314, + 26656, + 133296, + 67351, + 7733, + 8449, + 21244, + 22456, + 28992, + 12947, + 298611, + 13146, + 11420, + 25445, + 49927, + 20021, + 280820, + 128330, + 43998, + 57459, + 7418, + 6781, + 15781, + 4487, + 2643, + 76032, + 26594, + 16210, + 12452, + 115645, + 99306, + 12817, + 1622, + 10113, + 29443, + 6032, + 32037, + 40161, + 149175, + 7404, + 55930, + 93801, + 60967, + 28327, + 112273, + 33131, + 170497, + 7290, + 82161, + 223404, + 12524, + 92511, + 25808, + 129305, + 195741, + 3823, + 21187, + 10031, + 87498, + 32698, + 11189, + 24752, + 313448, + 26251, + 4345, + 17102, + 38344, + 73327, + 165788, + 84069, + 17386, + 14362, + 33945, + 104463, + 289704, + 15585, + 34417, + 4908, + 66819, + 74432, + 38037, + 99002, + 55919, + 6857, + 5506, + 105459, + 12175, + 12180, + 3292, + 314545, + 6840, + 19290, + 6136, + 6190, + 23374, + 4529, + 45454, + 164239, + 166209, + 5740, + 62078, + 35149, + 51519, + 14094, + 41868, + 6757, + 37482, + 8092, + 158747, + 9633, + 285109, + 20839, + 201017, + 23501, + 37953, + 72111, + 107775, + 23849, + 22049, + 26483, + 17329, + 366638, + 16826, + 12600, + 271371, + 36491, + 3039, + 5448, + 6902, + 23982, + 14068, + 17658, + 78531, + 7124, + 4852, + 8286, + 267584, + 28723, + 29023, + 4429, + 28863, + 39799, + 17579, + 109026, + 53552, + 72110, + 23782, + 30791, + 54684, + 66024, + 52624, + 31102, + 57284, + 370054, + 28848, + 64876, + 16097, + 37106, + 123984, + 160927, + 40818, + 10205, + 94681, + 51150, + 12364, + 223502, + 12114, + 9548, + 32119, + 14518, + 148727, + 5484626, + 17613, + 2867, + 124945, + 249042, + 2848, + 481400, + 4805, + 9513124, + 4307, + 100567, + 13195, + 8214, + 33483, + 258319, + 654348, + 163951, + 17584, + 14790, + 32702, + 72653, + 30133, + 39614, + 80772, + 6448, + 11439, + 11946, + 176132, + 18939, + 2621, + 2228, + 83859, + 44267, + 13828, + 13570, + 62044, + 28964, + 161328, + 22813, + 49736, + 4551, + 19769, + 53535, + 5723, + 21712, + 125485, + 464006, + 28585, + 15571, + 2256, + 9801, + 10165, + 9383, + 101948, + 51805, + 28128, + 15032, + 49304, + 303287, + 133375, + 44428, + 8365, + 33748, + 42565, + 32107, + 55554, + 116022, + 17777, + 32975, + 12473, + 23175, + 21459, + 10060, + 27699, + 275211, + 35609, + 12181, + 39036, + 26768, + 53847, + 9590, + 165389, + 215868, + 10831, + 50905, + 50148, + 141117, + 13546, + 7294, + 83206, + 89189, + 58362, + 34623, + 192933, + 5500, + 80069, + 53002, + 19349, + 36121, + 14958, + 16752, + 169187, + 12344, + 23571, + 53105, + 285893, + 229116, + 36588, + 30668, + 18083, + 59175, + 19210, + 175897, + 13565, + 42531, + 22896, + 64446, + 66259, + 15894, + 60652, + 6279, + 16123, + 44384, + 35634, + 8185, + 7387, + 54874, + 6738, + 20492, + 120949, + 75191, + 153080, + 1471, + 8701, + 7056, + 24154, + 42235, + 86840, + 29947, + 93298, + 46415, + 13773, + 1873379, + 22527, + 31164, + 17954, + 110024, + 131012, + 25328, + 45244, + 11846, + 221552, + 123467, + 21414, + 24599, + 12808, + 91788, + 5992, + 56898, + 68287, + 197910, + 298563, + 18444, + 54936, + 48922, + 80547, + 5149, + 109873, + 27792, + 49896, + 107696, + 6492, + 189472, + 114713, + 23074, + 143937, + 15811, + 59488, + 37504, + 64261, + 150599, + 5496, + 35987, + 340881, + 16602, + 45201, + 42219, + 35762, + 247709, + 175028, + 27701, + 11147, + 233161, + 11266, + 61308, + 42871, + 187325, + 6164, + 11193, + 168275, + 32262, + 61700, + 255819, + 4264, + 9751, + 46687, + 52113, + 13419, + 30808, + 64091, + 7497, + 196974, + 10033, + 55984, + 41875, + 39592, + 47596, + 23326, + 35487, + 29630, + 120803, + 55481, + 6757, + 52453, + 55125, + 11385, + 4411, + 22972, + 39838, + 534219, + 36731, + 18935, + 6033, + 14325, + 189776, + 135283, + 81530, + 50662, + 58168, + 73745, + 8659, + 76831, + 1289152, + 16421, + 56394, + 90913, + 166612, + 27040, + 130189, + 138037, + 156540, + 8206, + 10592, + 62296, + 42057, + 265794, + 11594, + 7819, + 192310, + 38521, + 122104, + 1671, + 87568, + 75819, + 98738, + 9490, + 26038, + 5340, + 41045, + 17540, + 14476, + 75105, + 176789, + 3095, + 1847, + 1505, + 3371, + 3348, + 248991, + 5841, + 31530, + 9638, + 19799, + 57788, + 134317, + 26873, + 5158, + 8427, + 166702, + 25048, + 20318, + 89420, + 11632, + 101949, + 51751, + 17990, + 11110, + 6448, + 11234, + 13948, + 349243, + 80081, + 32451, + 22119, + 186945, + 9280, + 22863, + 10871, + 4270, + 17663, + 4308, + 453658, + 3869, + 7925, + 22780, + 159418, + 28161, + 43929, + 8617, + 97208, + 34369, + 48232, + 237260, + 2361, + 41706, + 11580, + 207491, + 44591, + 127367, + 6304, + 86696, + 64315, + 116248, + 161545, + 238749, + 72355, + 24565, + 60189, + 14607, + 77233, + 162917, + 25147, + 11614, + 91464, + 230502, + 12159, + 90721, + 63212, + 17740, + 144833, + 8223, + 106611, + 43187, + 106869, + 75520, + 11207, + 47401, + 14388, + 9156, + 44416, + 4061, + 121497, + 70382, + 189301, + 5193, + 29968, + 6545, + 163871, + 13728, + 11132, + 121484, + 25964, + 28690, + 8646, + 20197, + 39282, + 41560, + 31551, + 103692, + 143912, + 2827, + 17109, + 25943, + 4850, + 9703, + 16646, + 274044, + 114864, + 15302, + 150482, + 4727, + 74349, + 17992, + 45744, + 74669, + 3282, + 117995, + 51144, + 12756, + 8580, + 38261, + 45047, + 47190, + 27696, + 16500, + 35744, + 107087, + 115341, + 19429, + 27528, + 10366, + 10955, + 43179, + 37822, + 70139, + 7401, + 24829, + 532690, + 103559, + 8469, + 25465, + 7462, + 15427, + 10214, + 11835, + 11461, + 62742, + 20694, + 66664, + 52174, + 7012, + 65309, + 24286, + 6902, + 6731, + 151239, + 2887, + 167767, + 18382, + 9962, + 129167, + 4931, + 11947, + 11567, + 132907, + 86078, + 739154, + 21865, + 75813, + 92296, + 58590, + 20285, + 17885, + 49254, + 190140, + 20887, + 21611, + 30361, + 69129, + 80054, + 28521, + 4022, + 121789, + 305364, + 148071, + 61497, + 28331, + 2603, + 41911, + 59713, + 59232, + 94857, + 41218, + 16428, + 34538, + 29194, + 15345, + 60089, + 8219, + 306183, + 15102, + 35006, + 26752, + 74425, + 30101, + 6078, + 173161, + 68919, + 13958, + 164266, + 4307, + 63527, + 15745, + 90155, + 64034, + 12328, + 73214, + 8466, + 8126, + 17182, + 95276, + 37983, + 210350, + 22501, + 31972, + 78395, + 34021, + 72710, + 2425, + 17946, + 22998, + 88301, + 29756, + 15780, + 78123, + 14620, + 5716, + 3629, + 15455, + 34292, + 11556, + 1861, + 56462, + 35267, + 146414, + 72313, + 113722, + 79031, + 8426, + 49295, + 12308, + 24671, + 39006, + 31699, + 17363, + 10162, + 91904, + 46428, + 598398, + 13537, + 177515, + 65232, + 27412, + 9896, + 14436, + 45446, + 22471, + 15355, + 10503, + 49388, + 13248, + 35846, + 5233, + 248439, + 8644, + 18745, + 8451 + ] + }, + { + "counters": [ + 68574, + 126298, + 66077, + 134637, + 118691, + 9607, + 15918, + 89547, + 37106, + 10108, + 33133, + 73585, + 104442, + 20385, + 39100, + 32336, + 46843, + 53121, + 2624, + 12998, + 20259, + 34789, + 15301, + 63434, + 16699, + 643633, + 40534, + 101128, + 28964, + 13089, + 5578, + 6042, + 358450, + 20447, + 23671, + 7171, + 300722, + 200057, + 55549, + 54033, + 309369, + 4438, + 14078, + 6900, + 4936, + 2095, + 108943, + 91360, + 25336, + 16778, + 80964, + 176492, + 144914, + 32958, + 10060, + 6800, + 42349, + 62547, + 5324, + 17228, + 77841, + 2831, + 174748, + 44579, + 89393, + 24092, + 223770, + 52885, + 41065, + 5286, + 188193, + 85043, + 32447, + 3754, + 8869, + 91526, + 6220, + 21775, + 60961, + 33051, + 52638, + 161638, + 41466, + 13918, + 32403, + 32108, + 25240, + 9319, + 164256, + 1977, + 3149, + 78056, + 190068, + 7551, + 5892, + 17550, + 2774, + 19377, + 27101, + 22761, + 15107, + 14832, + 101926, + 68583, + 25368, + 6353, + 2225, + 7438, + 16609, + 14071, + 1329830, + 71544, + 80921, + 7032, + 367459, + 41490, + 18401, + 6927, + 4471, + 41027, + 273455, + 84082, + 13252, + 5839, + 341164, + 144778, + 36826, + 8397, + 310997, + 41232, + 178857, + 18956, + 142115, + 3333, + 53247, + 35519, + 7695, + 32205, + 244835, + 32493, + 55348, + 12225, + 20403, + 55761, + 4178, + 28480, + 24990, + 19605, + 7900, + 45280, + 9706, + 28217, + 14349, + 15486, + 188874, + 11280, + 7866, + 9165, + 4028, + 26868, + 17041, + 40407, + 13485, + 6116, + 27004, + 2805, + 194540, + 22997, + 92944, + 24971, + 82794, + 51446, + 24110, + 39131, + 8966, + 34128, + 32335, + 6665, + 15180, + 10533, + 113860, + 562530, + 24311, + 17644, + 4621, + 24906, + 71260, + 29355, + 91900, + 49845, + 16144, + 47371, + 148287, + 32712, + 12308, + 13574, + 36974, + 33919, + 16880, + 120393, + 20455, + 259731, + 10341, + 52406, + 10730, + 51701, + 117441, + 19769, + 19635, + 53280, + 45263, + 27762, + 115319, + 23562, + 8354, + 362595, + 467212, + 56446, + 246218, + 17011, + 6971, + 143707, + 11964, + 6721, + 109839, + 80200, + 17056, + 70092, + 104367, + 3331, + 33172, + 49104, + 12636, + 13196, + 41451, + 9471, + 34242, + 16709, + 165565, + 4625, + 138077, + 5070, + 38450, + 25407, + 27011, + 6238, + 40742, + 11837, + 11543, + 25530, + 19876, + 13645, + 18750, + 86331, + 95536, + 22572, + 22720, + 20168, + 41522, + 86234, + 24715, + 17080, + 184809, + 187789, + 56194, + 28224, + 51132, + 96498, + 17117, + 13165, + 34844, + 200323, + 68429, + 253689, + 20850, + 91868, + 38406, + 144265, + 82992, + 466577, + 134641, + 29530, + 27572, + 201766, + 4390, + 59676, + 12026, + 20185, + 6946, + 25164, + 11724, + 437400, + 7997, + 14314, + 4825, + 45409, + 9946, + 191629, + 39373, + 7719, + 23727, + 228590, + 20964, + 27060, + 263046, + 16080, + 48900, + 55402, + 121828, + 77562, + 45683, + 6463, + 36749, + 4571, + 50821, + 90629, + 17587, + 84315, + 92522, + 25528, + 49461, + 7363, + 97135, + 13076, + 9836, + 16709, + 8300, + 5447, + 25729, + 200547, + 60549, + 45270, + 167437, + 107697, + 17922, + 78410, + 231394, + 16894, + 49212, + 14920, + 5148, + 9261, + 61901, + 49876, + 71742, + 77746, + 416834, + 79810, + 185168, + 379643, + 4964, + 105070, + 26216, + 5197, + 22926, + 83803, + 21969, + 11963, + 24976, + 10950, + 72062, + 31855, + 3348, + 95938, + 168470, + 34936, + 83960, + 13773, + 453189, + 327006, + 7996, + 40074, + 124390, + 68362, + 12970, + 11829, + 116222, + 18709, + 12991, + 80444, + 67963, + 22683, + 80968, + 17307, + 72786, + 55499, + 82679, + 470526, + 18893, + 8989, + 32670, + 56077, + 255787, + 30124, + 25836, + 11838, + 6829, + 9216, + 59998, + 409106, + 14705, + 36785, + 6797, + 45158, + 23794, + 75443, + 5717, + 11550, + 28246, + 40291, + 20332, + 42409, + 16622, + 96205, + 28084, + 13735, + 29569, + 86053, + 26962, + 21793, + 95180, + 26235, + 1532, + 20288, + 118000, + 348083, + 6877, + 15498, + 16590, + 188115, + 30258, + 21994, + 17938, + 40381, + 8009, + 45990, + 172330, + 165704, + 7763, + 10608, + 46463, + 17128, + 14030, + 14204, + 18967, + 12770, + 3289700, + 4826, + 14836, + 97725, + 31547, + 146861, + 50316, + 47357, + 46533, + 9397, + 48200, + 37012, + 105330, + 109656, + 111698, + 39596, + 31077, + 16828, + 21462, + 6742, + 48275, + 190550, + 228047, + 70511, + 110392, + 12103, + 176172, + 12805, + 68998, + 52434, + 25406, + 57632, + 10457, + 10097, + 9758, + 3867, + 27989, + 4567, + 174423, + 393185, + 5238, + 16803, + 165377, + 180065, + 234119, + 23888, + 52143, + 7232, + 93533, + 5275, + 3582, + 10961, + 2389, + 13506, + 37869, + 97762, + 43626, + 21757, + 139855, + 14033, + 76747, + 163421, + 338743, + 61599, + 87963, + 115134, + 46158, + 53435, + 144149, + 6102, + 2357, + 340605, + 158013, + 26473, + 157765, + 19602, + 21591, + 70826, + 201869, + 8079, + 84874, + 260852, + 18569, + 80689, + 19832, + 3054, + 17042, + 40209, + 46522, + 14331, + 6396, + 136131, + 4260, + 9109, + 12119, + 12236, + 4121, + 23767, + 8152, + 6362, + 52309, + 95483, + 303912, + 134092, + 14369, + 12016, + 73716, + 84756, + 105789, + 89257, + 46100, + 9268, + 66284, + 9851, + 66273, + 156030, + 163535, + 19225, + 8031, + 11531, + 68270, + 18788, + 167227, + 4818, + 7488, + 129081, + 82832, + 108009, + 190208, + 38107, + 65294, + 19561, + 291545, + 6168, + 32399, + 23677, + 40107, + 37026, + 209299, + 25002, + 18672, + 265823, + 57937, + 153966, + 105388, + 13976, + 5081, + 61959, + 312774, + 7184, + 6449, + 8643, + 26969, + 56745, + 2190, + 12528, + 6428, + 35448, + 2700, + 16782, + 117806, + 5187, + 6772, + 2707, + 348788, + 13498, + 49592, + 16708, + 12981, + 63883, + 7767, + 12542, + 42249, + 14400, + 27268, + 3049, + 2763, + 7123, + 157884, + 444226, + 69554, + 39692, + 348444, + 3973, + 31224, + 80912, + 35098, + 17342, + 38621, + 12208, + 303832, + 41008, + 14099, + 43577, + 9486, + 175904, + 65852, + 25382, + 8552, + 82709, + 4229, + 25248, + 42243, + 174978, + 10120, + 17698, + 127865, + 29617, + 92282, + 35010, + 16824, + 60066, + 16864, + 110947, + 19330, + 17892, + 15976, + 88515, + 16487, + 24984, + 9757, + 33325, + 1919, + 14726, + 3597, + 9441076, + 14382, + 34436, + 32471, + 14066, + 8695, + 168515, + 25363, + 226731, + 35828, + 134866, + 9612, + 79376, + 7490, + 18967, + 30213, + 50460, + 373177, + 66371, + 57261, + 2453, + 120525, + 4011, + 12387, + 14052, + 20996, + 65719, + 23389, + 128693, + 54650, + 54202, + 53659, + 45778, + 69666, + 10514, + 108573, + 7093, + 4162, + 91651, + 40527, + 143988, + 56141, + 5894, + 109056, + 51860, + 93004, + 45635, + 9845, + 22248, + 12714, + 12010, + 61762, + 23878, + 223959, + 433759, + 42637, + 6100, + 58506, + 14733, + 87691, + 33930, + 24252, + 4049, + 4977, + 5170853, + 544340, + 5165, + 7783, + 96037, + 2750, + 6317, + 14046, + 46658, + 48956, + 86217, + 16103, + 22252, + 10351, + 41043, + 16288, + 13672, + 25461, + 328744, + 150228, + 3314, + 9064, + 11051, + 13654, + 143828, + 31708, + 45707, + 83249, + 211163, + 34155, + 170145, + 6485, + 17759, + 150930, + 19077, + 39574, + 19678, + 11096, + 41883, + 9536, + 62402, + 40235, + 77524, + 204213, + 30902, + 80324, + 73325, + 209261, + 6989, + 50643, + 138806, + 24127, + 158087, + 202427, + 21693, + 191232, + 18574, + 47155, + 10718, + 50134, + 14701, + 13814, + 5634, + 95741, + 6746, + 9246, + 8223, + 241880, + 4929, + 13473, + 265025, + 121157, + 60935, + 14462, + 40314, + 36984, + 30365, + 10514, + 231714, + 181394, + 149291, + 15119, + 43081, + 83423, + 33234, + 95265, + 29450, + 31189, + 160580, + 21747, + 199918, + 8801, + 50222, + 97106, + 10213, + 10034, + 21320, + 15158, + 93508, + 6106, + 1575, + 16649, + 221915, + 20948, + 50632, + 11595, + 4452, + 86233, + 24386, + 63697, + 177014, + 50637, + 11541, + 71289, + 36185, + 45384, + 14516, + 476466, + 16998, + 71064, + 54368, + 7097, + 9289, + 81151, + 7750, + 47328, + 11175, + 87761, + 11077, + 13903, + 8316, + 26985, + 4203, + 1586143, + 31137, + 173986, + 39583, + 159853, + 82982, + 28076, + 175453, + 105534, + 3180, + 9007, + 21065, + 19611, + 13737, + 232867, + 75553, + 16033, + 153859, + 15802, + 107751, + 25988, + 38092, + 2046, + 186706, + 8761, + 30768, + 4627, + 98369, + 23918, + 47118, + 18767, + 20190, + 12032, + 40986, + 52656, + 217073, + 32288, + 40395, + 19555, + 113285, + 45623, + 73682, + 7699, + 139022, + 5104, + 45209, + 81719, + 3394, + 2576, + 146167, + 255157, + 11228, + 12940, + 34982, + 161165, + 28738, + 45884, + 18074, + 20630, + 255053, + 29204, + 7602, + 5550, + 93157, + 406661, + 66891, + 371477, + 99428, + 257919, + 6935, + 486690, + 19769, + 8877, + 160892, + 52693, + 21708, + 61689, + 23061, + 77565, + 197540, + 37020, + 40139, + 19935, + 60414, + 24380, + 9582, + 135791, + 67511, + 49359, + 108624, + 12209, + 47522, + 67311, + 57667, + 3850, + 14457, + 78143, + 22988, + 9485, + 26787, + 16957, + 7548, + 10007, + 188932, + 93291, + 35941, + 73732, + 33867, + 113376, + 3758, + 174737, + 56424, + 49679, + 8584, + 32754, + 13901, + 6052, + 45456, + 60168, + 121693, + 63659, + 47126, + 42883, + 31685, + 15033, + 24689, + 30602, + 56564, + 140130, + 12844, + 180804, + 91771, + 32967, + 42693, + 14630, + 267244, + 15851, + 22459, + 15000, + 85020, + 5127, + 103329, + 9661, + 71408, + 6081, + 71020, + 11484, + 11541, + 6232, + 6034, + 2889, + 4434, + 8771, + 7409, + 150532, + 15900, + 18833, + 38517, + 4416, + 57192, + 15067, + 28758, + 8225, + 7017, + 17148, + 45145, + 23165, + 22516, + 6026, + 73995, + 76315, + 2086, + 174234, + 30152, + 76643, + 18742, + 16210, + 254354, + 154243, + 202500, + 91627, + 139507, + 16143, + 228158, + 181625, + 49645, + 6444, + 16035, + 132061, + 5730, + 23243, + 15254, + 11498, + 474315, + 166466, + 59215, + 33619, + 9348, + 27132, + 189993, + 55794, + 25467, + 17246, + 94270, + 37725, + 76636, + 69366, + 11953, + 315395, + 1768, + 94760, + 25553, + 16183, + 13383, + 18465, + 5936, + 88869, + 160054, + 34872, + 29983, + 5030, + 55273, + 10786, + 27591, + 123090, + 21722, + 13325, + 52678, + 20675, + 41372, + 12148, + 27064, + 83274, + 9315, + 11370, + 38326, + 9171, + 5720, + 234014, + 40147, + 19023411, + 48372, + 159083, + 36812, + 42379, + 30810, + 11184, + 6046, + 9046, + 7718, + 48351, + 236741, + 252254, + 91708, + 16901, + 167209, + 22245, + 7729, + 20183, + 25303, + 17922, + 89921, + 49661, + 33471, + 15676, + 81084, + 209426, + 1959, + 53237, + 16849, + 36726, + 234554, + 11676, + 29921, + 144999, + 194411, + 184408, + 69383, + 42624, + 19862, + 11463, + 106835, + 36193, + 113067, + 11538, + 10010, + 29584, + 47900, + 63168, + 53125, + 67985, + 44511, + 87429, + 76034, + 189547, + 130435, + 90284, + 92642, + 219128, + 3153690, + 72690, + 29732, + 290547, + 92380, + 53252, + 26371, + 2734, + 10647, + 3847, + 4014, + 67999, + 39876, + 9367, + 155196, + 23825, + 53299, + 8863, + 47404, + 20056, + 23669, + 40031, + 11844, + 24804, + 17119, + 68757, + 75964, + 3309, + 115561, + 8721, + 8653, + 8600, + 25783, + 25437, + 25281, + 40834, + 137258, + 207132, + 9355, + 7804, + 4340, + 14563, + 19548, + 75565, + 36104, + 8092, + 2221, + 290286, + 17192, + 70271, + 6275, + 31306, + 60397, + 13289, + 100191, + 60342, + 3337, + 85495, + 46527, + 25508, + 13498, + 24526, + 138394, + 9884, + 2205, + 227808, + 48540, + 24300, + 21319, + 2834, + 33711, + 54660, + 1843, + 52022, + 90345, + 134933, + 35657, + 193759, + 246164, + 7998, + 5987, + 54409, + 14091, + 22754, + 321142, + 336267, + 98101, + 38304, + 12460, + 53350, + 21519, + 5037, + 29356, + 4545, + 17451, + 6027, + 26677, + 362682, + 41739, + 10947, + 80948, + 18312, + 13025, + 8290, + 318211, + 84345, + 268670, + 11294, + 101665, + 28111, + 12107, + 85050, + 14066, + 37970, + 34965, + 81744, + 140432, + 36827, + 234720, + 29820, + 78710, + 18191, + 80882, + 424884, + 46759, + 49526, + 15934, + 69137, + 206905, + 94131, + 112089, + 322378, + 34314, + 199336, + 76489, + 32778, + 64437, + 10558, + 176162, + 44308, + 59875, + 10211, + 7179, + 28241, + 305421, + 82543, + 95977, + 68627, + 34791, + 56779, + 63227, + 26556, + 67054, + 7405, + 190894, + 23391, + 74844, + 59163, + 53604, + 12538, + 236538, + 20572, + 29886, + 19451, + 51112, + 3838, + 33501, + 5944, + 21661, + 125008, + 12271, + 2850, + 174551, + 34011, + 284360, + 172503, + 85928, + 5783, + 143478, + 22883, + 33467, + 24110, + 43440, + 221214, + 59739, + 7832, + 158673, + 24194, + 9869, + 36851, + 158187, + 45224, + 160103, + 54929, + 9283, + 105396, + 98312, + 15312, + 27976, + 57350, + 5762, + 11962, + 70167, + 103136, + 264032, + 131410, + 107728, + 17834, + 721945, + 30830, + 20677, + 66088, + 11798, + 3133627, + 5286, + 20137, + 128382, + 47693, + 84374, + 42488, + 56335, + 26366, + 51929, + 51558, + 4697, + 72780, + 249599, + 49870, + 54083, + 7535, + 1919, + 19576, + 4947, + 25318, + 157415, + 2650, + 33647, + 52538, + 34174, + 59947, + 16860, + 46219, + 24382, + 73449, + 50517, + 292178, + 12212, + 66252, + 60444, + 323758, + 10811, + 15703, + 17501, + 7021, + 2402, + 104572, + 184513, + 3338, + 50301, + 17742, + 7848, + 161119, + 76123, + 32326, + 91360, + 14736, + 38780, + 82571, + 43427, + 7163, + 26023, + 44685, + 15129, + 28039, + 12399, + 160640, + 7319, + 92140, + 3944, + 45977, + 6181, + 2834, + 23136, + 186770, + 28007, + 65930, + 6188, + 5105, + 17012, + 39446, + 22819, + 11413, + 17809, + 38240, + 19784, + 1608085, + 34698, + 346817, + 15357, + 60981, + 1620051, + 12499, + 627772, + 32840, + 45329, + 39971, + 17887, + 4416, + 155962, + 34205, + 16038, + 109185, + 12718, + 3633, + 12710, + 5901, + 12738, + 29180, + 185018, + 24966, + 30575, + 5340, + 3788, + 1509, + 5845, + 8256, + 37491, + 83873, + 8513, + 6130, + 13668, + 16991, + 13421, + 16077, + 11679, + 460410, + 10365, + 10111, + 5032, + 4110, + 23704, + 26864, + 20705, + 176760, + 26462, + 1688, + 52218, + 5160, + 150662, + 8498, + 2041868, + 68752, + 82014, + 26445, + 54364, + 8330, + 102594, + 18462, + 14349, + 543408, + 14950, + 7563, + 81448, + 44501, + 434959, + 17762, + 30580, + 52656, + 7312, + 49145, + 15762, + 20027, + 10634, + 2705, + 286539, + 16779, + 13524, + 29651, + 296815, + 6253, + 160200, + 166358, + 21511, + 8165, + 13609, + 48638, + 14661, + 23255, + 11633, + 240206, + 32005, + 12842, + 19058, + 176896, + 39588, + 22307, + 139033, + 12054, + 51110, + 67949, + 3876, + 144300, + 24850, + 53785, + 137044, + 2729, + 11445, + 29099, + 73932, + 252440, + 68591, + 12557, + 18711, + 55380, + 61795, + 8206, + 18120, + 73413, + 39028, + 24899, + 22740, + 28255, + 26958, + 62553, + 160771, + 177375, + 47536, + 118768, + 131355, + 91062, + 26824, + 7907, + 3032, + 13232, + 17631, + 296223, + 53260, + 52388, + 35400, + 8648, + 12551, + 63167, + 82065, + 38785, + 3842, + 67562, + 711338, + 16968, + 25639, + 51159, + 22637, + 23220, + 10975, + 86534, + 421999, + 132654, + 7009, + 152556, + 16887, + 25974, + 13179, + 68830, + 13643, + 23710, + 38333, + 5861, + 7473, + 175974, + 17988, + 362157, + 100048, + 14609, + 1066438, + 9811, + 20824, + 9227, + 13464, + 26275, + 93227, + 13653, + 4899, + 74912, + 10640, + 9673, + 46404, + 52904, + 38622, + 14103, + 45893, + 37677, + 49963, + 52633, + 101667, + 1656552, + 152956, + 9749, + 18263, + 7376, + 8883, + 146526, + 128382, + 27855, + 43553, + 75487, + 26349, + 10025, + 14013, + 72833, + 166052, + 10962, + 3329, + 71696, + 19242, + 16936, + 77972, + 20560, + 15407, + 195498, + 13767, + 92202, + 9783, + 4546, + 31065, + 46337, + 59761, + 61025, + 45129, + 61336, + 44222, + 159745, + 80985, + 464647, + 182951, + 79363, + 67442, + 39993, + 18042, + 7727, + 50293, + 295404, + 126502, + 28594, + 5196, + 214224, + 110824, + 13552, + 20986, + 10051, + 9533, + 17321, + 20324, + 14063, + 28775, + 15483, + 86361, + 8093, + 8433, + 94342, + 17648, + 106579, + 143310, + 68911, + 204085, + 91830, + 45991, + 9582, + 64869, + 11589, + 6157, + 23990, + 4426, + 12256, + 18122, + 68855, + 39787, + 2782, + 86554, + 14100, + 25257, + 105975, + 5992, + 28699, + 36736, + 9248, + 205308, + 172914, + 64998, + 186725, + 102446, + 34955, + 32241, + 66147, + 118898, + 18795, + 76641, + 143980, + 27356, + 12342, + 16674, + 195181, + 4898, + 9651, + 64510, + 4439, + 7127, + 38623, + 6830, + 10448, + 84681, + 105092, + 72767, + 25508, + 37244, + 23260, + 17603, + 112179, + 14123, + 7732, + 100270, + 277630, + 3813, + 8521, + 11626, + 8260, + 46531, + 22018, + 31120, + 54701, + 41571, + 103314, + 121180, + 19933, + 16529, + 95102, + 8145, + 23989, + 131353, + 24603, + 48914, + 2742, + 54873, + 26673, + 64333, + 5225, + 10665, + 13223, + 5063, + 26744, + 8381, + 109175, + 21333, + 241557, + 33226, + 8300, + 12680, + 12008, + 40591, + 111170, + 23023, + 152626, + 126174, + 106048, + 12365, + 14425, + 82743, + 9536, + 35799, + 27324, + 43619, + 26524, + 16054, + 36200, + 105881, + 4770, + 24915, + 8067, + 62684, + 13399, + 4851, + 10838, + 10900, + 4928, + 127687, + 118839, + 40219, + 327141, + 218073, + 133091, + 24060, + 31908, + 207549, + 19828, + 89709, + 69158, + 202763, + 342269, + 52559, + 1887821, + 27226, + 165003, + 209676, + 10064, + 6242, + 70877, + 49147, + 6084, + 9173, + 11457, + 26160, + 44314, + 231598, + 224494, + 180419, + 10275, + 21119, + 32847, + 3863, + 7390, + 51053, + 112269, + 70407, + 18287, + 69294, + 54622, + 639339, + 55109, + 7912, + 154047, + 139381, + 14746, + 10535, + 90851, + 38671, + 8929, + 62692, + 55688, + 2064, + 32131, + 58219, + 8770, + 19158, + 107623, + 230576, + 51590, + 259196, + 2357, + 14327, + 92634, + 22433, + 133159, + 37986, + 34225, + 18062, + 18597, + 122501, + 20178, + 32770, + 29887, + 14670, + 11544, + 4139, + 10084, + 130840, + 53800, + 5707, + 276299, + 28244, + 7448, + 72927, + 67669, + 12879, + 48599, + 64458, + 20841, + 23510, + 14006, + 21110, + 27909, + 37319, + 10637, + 10452, + 784558, + 33765, + 67737, + 21816, + 35211, + 44024, + 13332, + 14313, + 24340, + 21799, + 46220, + 11365, + 19521, + 14004, + 90776, + 15333, + 308443, + 128039, + 16822, + 22990, + 69477, + 193195, + 159718, + 309462, + 17115, + 175198, + 68910, + 13016, + 6028, + 15739, + 14558, + 28860, + 38816, + 18838, + 24509, + 21036, + 50680, + 6600, + 25014, + 49760, + 222258, + 12842, + 64766, + 26736, + 8091, + 39614, + 78139, + 61661, + 71814, + 49627, + 38921, + 60282, + 622093, + 90057, + 16957, + 24251, + 320038, + 4390, + 5280, + 14328, + 22819, + 15693, + 63601, + 33966, + 340519, + 11230, + 3242, + 48398, + 24504, + 13082, + 9961, + 6596, + 16754, + 13954, + 73289, + 73591, + 399625, + 4854, + 32138, + 310643, + 193743, + 60293, + 82516, + 206167, + 24344, + 7874, + 12319, + 440768, + 611170, + 83648, + 37878, + 73260, + 12874, + 29477, + 121676, + 5187, + 63063, + 51182, + 58818, + 18145 + ] + } + ], + "top_n": [ + { + "data": "AVQyMTM0AAAA/A==", + "count": 4181956 + }, + { + "data": "AVQyMjgwAAAA/AFUT1BJQwAAAPw=", + "count": 606137 + }, + { + "data": "AVQyMjgwAAAA/A==", + "count": 622329 + }, + { + "data": "AVQxOTg2AAAA/AFUT1BJQwAAAPw=", + "count": 2002978 + }, + { + "data": "AVQxOTg2AAAA/A==", + "count": 2047498 + }, + { + "data": "AVQyMTA4AAAA/AFUT1BJQwAAAPw=", + "count": 1896220 + }, + { + "data": "AVQyMTA4AAAA/A==", + "count": 1901484 + }, + { + "data": "AVQyMTM0AAAA/AFUT1BJQwAAAPw=", + "count": 4193826 + } + ], + "default_value": 0 + }, + "null_count": 0, + "tot_col_size": 0, + "last_update_version": 419285068791677123, + "correlation": 0 + }, + "idx4": { + "histogram": { + "ndv": 4239338, + "buckets": [ + { + "count": 265216, + "lower_bound": "A4AAAAAADOR4", + "upper_bound": "A4AAAAAADWX4", + "repeats": 0 + }, + { + "count": 527360, + "lower_bound": "A4AAAAAADWX4", + "upper_bound": "A4AAAAAADeX4", + "repeats": 0 + }, + { + "count": 789658, + "lower_bound": "A4AAAAAADeX4", + "upper_bound": "A4AAAAAADm1y", + "repeats": 0 + }, + { + "count": 1031339, + "lower_bound": "A4AAAAAADm1y", + "upper_bound": "A4AAAAAADvRQ", + "repeats": 0 + }, + { + "count": 1297071, + "lower_bound": "A4AAAAAADvRQ", + "upper_bound": "A4AAAAAAD4ia", + "repeats": 0 + }, + { + "count": 1559599, + "lower_bound": "A4AAAAAAD4ia", + "upper_bound": "A4AAAAAAEBsa", + "repeats": 0 + }, + { + "count": 1572409, + "lower_bound": "A4AAAAAAEBsa", + "upper_bound": "A4AAAAAAECJA", + "repeats": 0 + }, + { + "count": 1838142, + "lower_bound": "A4AAAAAAECJA", + "upper_bound": "A4AAAAAAELaK", + "repeats": 0 + }, + { + "count": 2100670, + "lower_bound": "A4AAAAAAELaK", + "upper_bound": "A4AAAAAAEUkK", + "repeats": 0 + }, + { + "count": 2363197, + "lower_bound": "A4AAAAAAEUkK", + "upper_bound": "A4AAAAAAEduK", + "repeats": 0 + }, + { + "count": 2427632, + "lower_bound": "A4AAAAAAEduK", + "upper_bound": "A4AAAAAAEf9/", + "repeats": 0 + }, + { + "count": 2692988, + "lower_bound": "A4AAAAAAEf9/", + "upper_bound": "A4AAAAAAEpOT", + "repeats": 0 + }, + { + "count": 2955515, + "lower_bound": "A4AAAAAAEpOT", + "upper_bound": "A4AAAAAAEyf6", + "repeats": 0 + }, + { + "count": 3217787, + "lower_bound": "A4AAAAAAEyf6", + "upper_bound": "A4AAAAAAE9K6", + "repeats": 0 + }, + { + "count": 3480059, + "lower_bound": "A4AAAAAAE9K6", + "upper_bound": "A4AAAAAAFH16", + "repeats": 0 + }, + { + "count": 3730781, + "lower_bound": "A4AAAAAAFH16", + "upper_bound": "A4AAAAAAFSC1", + "repeats": 0 + }, + { + "count": 3994733, + "lower_bound": "A4AAAAAAFSC1", + "upper_bound": "A4AAAAAAFcyN", + "repeats": 0 + }, + { + "count": 4257377, + "lower_bound": "A4AAAAAAFcyN", + "upper_bound": "A4AAAAAAFneL", + "repeats": 0 + }, + { + "count": 4519649, + "lower_bound": "A4AAAAAAFneL", + "upper_bound": "A4AAAAAAFyJL", + "repeats": 0 + }, + { + "count": 4782003, + "lower_bound": "A4AAAAAAFyJL", + "upper_bound": "A4AAAAAAF+UQ", + "repeats": 0 + }, + { + "count": 5018946, + "lower_bound": "A4AAAAAAF+UQ", + "upper_bound": "A4AAAAAAGMlZ", + "repeats": 0 + }, + { + "count": 5281090, + "lower_bound": "A4AAAAAAGMlZ", + "upper_bound": "A4AAAAAAGclZ", + "repeats": 0 + }, + { + "count": 5543234, + "lower_bound": "A4AAAAAAGclZ", + "upper_bound": "A4AAAAAAGslZ", + "repeats": 0 + }, + { + "count": 5681866, + "lower_bound": "A4AAAAAAGslZ", + "upper_bound": "A4AAAAAAG1C7", + "repeats": 0 + }, + { + "count": 5945046, + "lower_bound": "A4AAAAAAG1C7", + "upper_bound": "A4AAAAAAHFO8", + "repeats": 0 + }, + { + "count": 6207238, + "lower_bound": "A4AAAAAAHFO8", + "upper_bound": "A4AAAAAAHhOb", + "repeats": 0 + }, + { + "count": 6469382, + "lower_bound": "A4AAAAAAHhOb", + "upper_bound": "A4AAAAAAIRY+", + "repeats": 0 + }, + { + "count": 6731526, + "lower_bound": "A4AAAAAAIRY+", + "upper_bound": "A4AAAAAAJRY+", + "repeats": 0 + }, + { + "count": 6993670, + "lower_bound": "A4AAAAAAJRY+", + "upper_bound": "A4AAAAAAKRY/", + "repeats": 0 + }, + { + "count": 7079268, + "lower_bound": "A4AAAAAAKRY/", + "upper_bound": "A4AAAAAAKmSd", + "repeats": 0 + }, + { + "count": 7341412, + "lower_bound": "A4AAAAAAKmSd", + "upper_bound": "A4AAAAAALmSd", + "repeats": 0 + }, + { + "count": 7603556, + "lower_bound": "A4AAAAAALmSd", + "upper_bound": "A4AAAAAAMmSd", + "repeats": 0 + }, + { + "count": 7794785, + "lower_bound": "A4AAAAAAMmSd", + "upper_bound": "A4AAAAAANU+b", + "repeats": 0 + }, + { + "count": 8056929, + "lower_bound": "A4AAAAAANU+b", + "upper_bound": "A4AAAAAAOU+b", + "repeats": 0 + }, + { + "count": 8319073, + "lower_bound": "A4AAAAAAOU+b", + "upper_bound": "A4AAAAAAPU+e", + "repeats": 0 + }, + { + "count": 8540341, + "lower_bound": "A4AAAAAAPU+e", + "upper_bound": "+g==", + "repeats": 0 + } + ] + }, + "cm_sketch": { + "rows": [ + { + "counters": [ + 54466, + 38549, + 44283, + 46111, + 1123552, + 77754, + 42544, + 32412, + 34865, + 34339, + 52414, + 38659, + 33581, + 30879, + 110124, + 43711, + 32952, + 41609, + 47210, + 51747, + 38762, + 42531, + 34057, + 52388, + 40824, + 33924, + 37541, + 49499, + 44314, + 31376, + 37609, + 46020, + 38834, + 36661, + 37390, + 35255, + 96492, + 39647, + 36219, + 32554, + 43114, + 28575, + 36845, + 38535, + 42815, + 33455, + 35566, + 45729, + 50003, + 38020, + 37150, + 41107, + 38195, + 37781, + 39610, + 35068, + 35670, + 38282, + 39808, + 45144, + 47059, + 42531, + 28749, + 43632, + 36803, + 39079, + 39692, + 41762, + 34491, + 35889, + 33748, + 31787, + 41041, + 46182, + 31901, + 42102, + 48262, + 31363, + 39641, + 39950, + 38891, + 30145, + 30015, + 44300, + 36668, + 33206, + 38298, + 41909, + 35208, + 55450, + 33330, + 48677, + 34249, + 42918, + 33365, + 48684, + 34571, + 56859, + 45416, + 47722, + 26066, + 41120, + 34657, + 55867, + 40986, + 34413, + 49825, + 44458, + 41171, + 51510, + 34233, + 39795, + 56660, + 59410, + 38809, + 31627, + 46736, + 37295, + 43121, + 34880, + 41641, + 37297, + 47930, + 32632, + 56443, + 45829, + 43432, + 38966, + 61321, + 76891, + 63863, + 38838, + 34033, + 40771, + 74782, + 36015, + 36582, + 39824, + 40393, + 44401, + 44978, + 40285, + 41963, + 45403, + 35663, + 43247, + 77038, + 39186, + 48592, + 47183, + 32289, + 38574, + 54963, + 40888, + 46176, + 33795, + 43855, + 51186, + 46739, + 40911, + 50735, + 40725, + 30103, + 33870, + 49673, + 35587, + 47341, + 50911, + 40445, + 30112, + 39851, + 48398, + 31589, + 35695, + 38474, + 41865, + 43126, + 47909, + 37557, + 41107, + 48258, + 68131, + 39389, + 51090, + 34845, + 32472, + 45130, + 39347, + 40744, + 35511, + 32650, + 41333, + 47048, + 34328, + 46502, + 37780, + 39610, + 46579, + 43273, + 50035, + 46705, + 38756, + 44973, + 36259, + 46136, + 43623, + 36288, + 34819, + 49937, + 34974, + 46907, + 49225, + 36305, + 36053, + 30191, + 37706, + 39866, + 51551, + 44297, + 36775, + 38788, + 37298, + 44954, + 38380, + 35475, + 31471, + 28860, + 37595, + 42021, + 42094, + 45904, + 35153, + 49171, + 39562, + 35979, + 35390, + 36222, + 44954, + 36960, + 35456, + 34208, + 37359, + 51747, + 42744, + 48785, + 33972, + 41317, + 35860, + 33160, + 39071, + 89438, + 74833, + 39992, + 38324, + 40633, + 35984, + 48496, + 47131, + 40675, + 35728, + 37657, + 34632, + 43335, + 41468, + 46109, + 36254, + 35485, + 41056, + 37750, + 34429, + 43186, + 49855, + 34304, + 46522, + 39213, + 40826, + 36502, + 40415, + 51287, + 40612, + 47322, + 43874, + 47318, + 42502, + 76007, + 39871, + 27448, + 55758, + 32616, + 55324, + 49340, + 47089, + 37386, + 35290, + 35404, + 52463, + 32162, + 38962, + 42944, + 38945, + 40763, + 40117, + 35202, + 54630, + 44643, + 51674, + 44711, + 34557, + 44276, + 41141, + 51393, + 50095, + 40736, + 36191, + 30761, + 31997, + 40285, + 34157, + 33864, + 44785, + 45949, + 41442, + 34423, + 44336, + 35674, + 46925, + 49151, + 56983, + 56813, + 33014, + 44931, + 30827, + 31620, + 40394, + 34676, + 34399, + 34873, + 35856, + 47235, + 42225, + 60654, + 35466, + 53267, + 53526, + 40257, + 37954, + 58847, + 42821, + 35350, + 65592, + 30531, + 50492, + 51185, + 52855, + 31464, + 38781, + 32974, + 35492, + 33315, + 40919, + 36542, + 28456, + 52298, + 35579, + 33245, + 45085, + 38310, + 52566, + 33248, + 42892, + 41002, + 39970, + 42259, + 65819, + 53772, + 38028, + 39111, + 40533, + 65075, + 54089, + 41534, + 39018, + 49573, + 39897, + 47128, + 68537, + 41135, + 46872, + 27945, + 47128, + 32423, + 30820, + 42315, + 35720, + 36982, + 40176, + 48144, + 37796, + 39451, + 50076, + 32307, + 43852, + 26903, + 38380, + 36549, + 43471, + 47703, + 36888, + 49981, + 45244, + 36315, + 53183, + 28859, + 34458, + 28286, + 44007, + 41502, + 46420, + 33742, + 36002, + 38325, + 35266, + 35189, + 40181, + 40947, + 44474, + 32192, + 46144, + 39252, + 33388, + 33822, + 32984, + 41962, + 70056, + 36132, + 33633, + 34902, + 45598, + 44643, + 57871, + 47014, + 34410, + 38090, + 44385, + 41936, + 46652, + 34852, + 40173, + 44793, + 32685, + 51143, + 71056, + 37731, + 38256, + 33520, + 47109, + 48418, + 51877, + 37793, + 36961, + 35910, + 34188, + 62917, + 45080, + 38994, + 45906, + 38677, + 39804, + 47615, + 38698, + 51657, + 36393, + 30974, + 45897, + 36976, + 35011, + 44374, + 36129, + 38531, + 38977, + 33179, + 49621, + 31104, + 35229, + 52023, + 41835, + 38549, + 47761, + 28033, + 52796, + 36581, + 32764, + 30935, + 28544, + 38409, + 35821, + 42956, + 37260, + 47015, + 36435, + 54710, + 28535, + 34944, + 30213, + 36582, + 41953, + 36855, + 54280, + 33201, + 44938, + 31439, + 38800, + 50471, + 48519, + 34047, + 38213, + 38020, + 42559, + 28528, + 33624, + 37185, + 38410, + 31294, + 45151, + 34129, + 29907, + 54278, + 45645, + 49756, + 55826, + 55495, + 31091, + 37084, + 44848, + 39968, + 36193, + 45513, + 46024, + 38900, + 32409, + 54457, + 37817, + 40926, + 38092, + 39059, + 37366, + 58115, + 37498, + 44850, + 58226, + 46908, + 36977, + 43231, + 38582, + 38654, + 83909, + 50320, + 44034, + 34127, + 26711, + 48748, + 36229, + 38416, + 37368, + 37104, + 32856, + 42071, + 29300, + 33074, + 28519, + 73242, + 61367, + 38424, + 37427, + 40279, + 52906, + 34563, + 38287, + 32110, + 40542, + 47310, + 58593, + 37711, + 59755, + 63749, + 42966, + 34432, + 41143, + 35155, + 31611, + 41088, + 35896, + 32752, + 39301, + 52002, + 38533, + 38102, + 57785, + 40192, + 36593, + 32113, + 38111, + 79530, + 38617, + 46624, + 45965, + 32521, + 38071, + 36870, + 36564, + 52637, + 39354, + 31380, + 32213, + 34180, + 43425, + 36035, + 39743, + 50025, + 31488, + 50149, + 34214, + 33171, + 41686, + 45374, + 48744, + 38851, + 47935, + 58160, + 45207, + 38360, + 55669, + 50591, + 44360, + 53989, + 39547, + 30955, + 46282, + 43124, + 40765, + 39176, + 46898, + 50329, + 37728, + 30899, + 39347, + 41198, + 33018, + 52732, + 28541, + 37764, + 32024, + 41874, + 54656, + 34620, + 37500, + 34483, + 32641, + 54433, + 38917, + 41057, + 34124, + 36330, + 38783, + 34750, + 31137, + 30797, + 37009, + 41071, + 54305, + 31600, + 37841, + 57164, + 41272, + 39994, + 44417, + 36934, + 54176, + 41672, + 27171, + 39731, + 41527, + 47974, + 33208, + 55721, + 36091, + 43142, + 41077, + 34365, + 40258, + 41798, + 38255, + 34596, + 37408, + 46356, + 41522, + 58416, + 33526, + 39668, + 46144, + 46641, + 51520, + 46245, + 34075, + 38856, + 36472, + 35560, + 38937, + 49504, + 42796, + 35421, + 35683, + 44132, + 46966, + 39646, + 44525, + 41228, + 38443, + 41548, + 43802, + 44036, + 39401, + 51875, + 39746, + 38967, + 25972, + 28912, + 30181, + 43466, + 36659, + 47619, + 42593, + 61152, + 33856, + 42426, + 36493, + 33921, + 30675, + 37264, + 43769, + 36125, + 49803, + 40881, + 30461, + 42454, + 38530, + 58130, + 38470, + 54259, + 39391, + 41695, + 141192, + 57582, + 44638, + 33250, + 38860, + 29471, + 34476, + 35743, + 40475, + 41296, + 35824, + 56242, + 43053, + 50077, + 37662, + 42182, + 43259, + 36795, + 28876, + 40428, + 43099, + 42626, + 41666, + 36402, + 49536, + 42444, + 36833, + 34539, + 35144, + 31868, + 80426, + 34345, + 64925, + 50422, + 49815, + 37313, + 37863, + 41160, + 37142, + 54865, + 51286, + 39763, + 69259, + 44678, + 36526, + 42388, + 35420, + 34203, + 25122, + 36726, + 39260, + 45661, + 42174, + 41498, + 35643, + 52484, + 31096, + 31832, + 34847, + 42921, + 48400, + 42061, + 29569, + 39885, + 42754, + 50693, + 37068, + 34884, + 39934, + 27748, + 34297, + 32782, + 47254, + 44758, + 34620, + 41701, + 41533, + 45342, + 39793, + 38492, + 45392, + 44058, + 52839, + 39966, + 43378, + 35220, + 39320, + 43768, + 48879, + 52549, + 41658, + 33114, + 34057, + 49109, + 46240, + 38888, + 39435, + 59905, + 32768, + 36052, + 33891, + 39525, + 37142, + 38077, + 41869, + 43563, + 31651, + 33900, + 52835, + 30951, + 59330, + 31402, + 42369, + 42146, + 49794, + 38650, + 39954, + 32394, + 43216, + 53511, + 40530, + 49677, + 46440, + 40802, + 40454, + 34065, + 34795, + 40563, + 41378, + 36400, + 46226, + 37628, + 34687, + 38944, + 35442, + 37463, + 43749, + 34335, + 50402, + 29592, + 44511, + 35408, + 29916, + 49466, + 38771, + 33683, + 45824, + 43691, + 63021, + 26042, + 42767, + 35359, + 50286, + 76385, + 32817, + 40247, + 43147, + 49145, + 33657, + 38257, + 33699, + 30971, + 29278, + 33603, + 43846, + 35139, + 277504, + 38480, + 50917, + 39181, + 39073, + 45569, + 34596, + 36786, + 43314, + 36722, + 47383, + 41426, + 34300, + 27906, + 44123, + 49208, + 40879, + 44338, + 41148, + 48300, + 29368, + 34427, + 61272, + 37202, + 48226, + 38539, + 32761, + 54883, + 43271, + 40384, + 43238, + 42192, + 37753, + 55000, + 37622, + 44417, + 54911, + 30660, + 36684, + 34029, + 31149, + 31958, + 63707, + 37893, + 51621, + 35758, + 54761, + 34923, + 41716, + 47343, + 45088, + 40438, + 36153, + 37428, + 30590, + 34522, + 54182, + 47817, + 45287, + 40018, + 33207, + 45436, + 38651, + 39892, + 43398, + 38743, + 29081, + 39635, + 27584, + 34249, + 39159, + 36770, + 50231, + 42664, + 40497, + 35140, + 32107, + 50863, + 33315, + 32597, + 36824, + 39081, + 41362, + 35578, + 42304, + 48040, + 42004, + 57918, + 38275, + 29063, + 49067, + 41038, + 34638, + 42361, + 37122, + 43221, + 37220, + 36980, + 46630, + 42620, + 47681, + 45920, + 33093, + 38532, + 33132, + 43129, + 36685, + 32126, + 38474, + 38800, + 48202, + 71543, + 34913, + 67269, + 37309, + 42781, + 42208, + 42776, + 34187, + 41731, + 42413, + 35285, + 75967, + 78688, + 31123, + 35116, + 55454, + 45165, + 38366, + 37722, + 44048, + 52488, + 33081, + 32853, + 38255, + 44475, + 39882, + 44014, + 37384, + 41487, + 50296, + 54870, + 38054, + 53670, + 39389, + 44254, + 40756, + 30971, + 41946, + 40512, + 59049, + 33049, + 37680, + 38985, + 51644, + 54995, + 37807, + 43171, + 41701, + 44982, + 52612, + 30026, + 64836, + 36988, + 48361, + 33586, + 31060, + 38667, + 41939, + 43426, + 35620, + 48119, + 30492, + 36078, + 38759, + 43572, + 47712, + 40429, + 39939, + 44288, + 58460, + 41504, + 54074, + 55965, + 44707, + 41935, + 39255, + 36272, + 41725, + 41254, + 53958, + 33763, + 35004, + 32824, + 32406, + 38650, + 41274, + 35485, + 36615, + 51491, + 32264, + 45791, + 43158, + 37829, + 32176, + 33783, + 27734, + 53929, + 28390, + 45662, + 34451, + 38160, + 41642, + 36699, + 67100, + 45818, + 38146, + 40688, + 41714, + 50137, + 30102, + 34717, + 57517, + 33155, + 42330, + 52882, + 35231, + 34785, + 40072, + 33883, + 32998, + 32979, + 42902, + 33246, + 53534, + 39036, + 44137, + 35149, + 53729, + 58371, + 43027, + 46621, + 43118, + 46468, + 50006, + 46720, + 28938, + 37903, + 50142, + 34795, + 38763, + 39731, + 36004, + 43078, + 44234, + 58343, + 47290, + 46021, + 45330, + 51222, + 49189, + 36334, + 46437, + 37012, + 31052, + 33039, + 35104, + 35419, + 33003, + 49206, + 33605, + 39466, + 41147, + 35821, + 44061, + 38134, + 36167, + 35408, + 60527, + 44592, + 47917, + 47454, + 38381, + 39840, + 38716, + 30976, + 39112, + 42775, + 33219, + 37145, + 43175, + 36759, + 40166, + 122637, + 40987, + 36630, + 35003, + 60010, + 57235, + 38491, + 40434, + 32442, + 44541, + 41309, + 47077, + 57170, + 76924, + 27992, + 45188, + 35615, + 55052, + 34964, + 39696, + 48792, + 33725, + 43773, + 35616, + 47202, + 34206, + 36566, + 45624, + 37866, + 49777, + 40302, + 42542, + 38856, + 35911, + 56059, + 34522, + 40367, + 40748, + 35141, + 39785, + 36450, + 38354, + 38855, + 28981, + 34327, + 174912, + 53811, + 38819, + 44395, + 38370, + 30516, + 41872, + 35239, + 35938, + 37477, + 41029, + 33592, + 62499, + 34465, + 43063, + 40338, + 41151, + 40042, + 37178, + 44524, + 49494, + 37317, + 37305, + 45050, + 44983, + 36145, + 66360, + 43620, + 42319, + 37205, + 32068, + 32466, + 36642, + 55398, + 34532, + 41572, + 31316, + 40690, + 43604, + 50269, + 46829, + 53635, + 47723, + 38028, + 41486, + 42259, + 60516, + 44093, + 40109, + 38713, + 34554, + 31143, + 38511, + 30894, + 34358, + 52452, + 65294, + 40510, + 42084, + 34951, + 53150, + 45747, + 39232, + 39889, + 25566, + 36665, + 29306, + 45956, + 34728, + 38651, + 40516, + 42329, + 54147, + 34955, + 40125, + 53177, + 36705, + 45656, + 44793, + 37331, + 44956, + 32573, + 35584, + 38545, + 31893, + 40875, + 29044, + 35799, + 38052, + 48700, + 41477, + 34332, + 41984, + 31787, + 49778, + 47674, + 39039, + 37193, + 33122, + 55152, + 38496, + 35427, + 48046, + 58967, + 40420, + 32939, + 50810, + 36110, + 40631, + 38603, + 51990, + 40076, + 59451, + 35823, + 29587, + 40445, + 51740, + 35670, + 38313, + 44159, + 31512, + 36355, + 45683, + 40066, + 36834, + 52481, + 41698, + 40782, + 39476, + 206393, + 35308, + 40929, + 72758, + 33910, + 51820, + 40794, + 46113, + 48103, + 35141, + 78524, + 50961, + 39392, + 29454, + 33779, + 40596, + 39444, + 39678, + 33762, + 56275, + 44215, + 39897, + 41628, + 54361, + 35085, + 53631, + 36857, + 39152, + 36640, + 39469, + 38700, + 43806, + 33906, + 40304, + 33984, + 35167, + 56877, + 35757, + 42103, + 31589, + 37397, + 54627, + 35220, + 34274, + 53171, + 40426, + 36136, + 33595, + 40473, + 43594, + 37851, + 32736, + 37812, + 35512, + 38861, + 65738, + 29178, + 34403, + 37291, + 53141, + 35538, + 31350, + 68705, + 37025, + 44415, + 35458, + 34935, + 45800, + 34983, + 50375, + 32374, + 39175, + 36555, + 36116, + 35493, + 49884, + 52277, + 39468, + 42203, + 36238, + 34518, + 29506, + 43717, + 33193, + 44041, + 47718, + 43739, + 46105, + 31496, + 39554, + 57881, + 38445, + 34813, + 34943, + 36073, + 65333, + 47315, + 56315, + 51210, + 37030, + 31815, + 40985, + 47445, + 35445, + 56784, + 40541, + 63100, + 58842, + 39101, + 38420, + 37908, + 42888, + 64424, + 38864, + 33958, + 51306, + 38105, + 31201, + 31601, + 41078, + 27612, + 54438, + 33631, + 38252, + 34132, + 40451, + 36258, + 40653, + 44239, + 39344, + 38239, + 42249, + 44734, + 34610, + 44538, + 31404, + 41601, + 41691, + 44909, + 37132, + 43171, + 35793, + 33555, + 37272, + 44181, + 51015, + 43328, + 37731, + 39113, + 45517, + 48674, + 47555, + 38950, + 44381, + 46245, + 104150, + 32221, + 34135, + 44565, + 34137, + 57291, + 36949, + 49459, + 43824, + 31844, + 42995, + 52498, + 37717, + 35425, + 40079, + 37643, + 58949, + 50594, + 36046, + 52676, + 36643, + 41846, + 37207, + 39994, + 39966, + 88638, + 37333, + 39802, + 49538, + 48375, + 40359, + 50348, + 38600, + 36092, + 36817, + 43856, + 42099, + 49055, + 45169, + 41544, + 35918, + 41744, + 60797, + 37610, + 32162, + 34917, + 29449, + 38509, + 44459, + 38574, + 40290, + 35710, + 32842, + 39802, + 46415, + 30104, + 41782, + 47210, + 43372, + 42937, + 38790, + 42439, + 32947, + 156186, + 42539, + 44595, + 55346, + 38826, + 65283, + 35891, + 37027, + 40119, + 34257, + 34353, + 42607, + 41648, + 42961, + 33157, + 41603, + 40438, + 41209, + 36350, + 34110, + 39515, + 42438, + 38371, + 56556, + 43119, + 41874, + 42307, + 37227, + 40167, + 53609, + 36162, + 35400, + 36913, + 34316, + 33089, + 43075, + 31360, + 44320, + 35260, + 34420, + 35084, + 49860, + 34251, + 36226, + 34400, + 36484, + 36207, + 30816, + 46179, + 39070, + 38449, + 47353, + 38315, + 36931, + 168368, + 38809, + 44529, + 35394, + 37942, + 43083, + 36893, + 36182, + 38663, + 45350, + 38723, + 32080, + 39779, + 41206, + 43793, + 36511, + 32698, + 46778, + 37052, + 46764, + 36394, + 39528, + 36544, + 39673, + 42018, + 45306, + 45646, + 45337, + 43595, + 32571, + 37836, + 38263, + 52838, + 39448, + 27122, + 49783, + 31646, + 27619, + 47029, + 44158, + 28167, + 36566, + 33958, + 31917, + 43258, + 39196, + 40969, + 40493, + 34429, + 40115, + 52006, + 44816, + 28709, + 43129, + 43021, + 34119, + 46800, + 31346, + 38015, + 32846, + 43384, + 36947, + 34634, + 35769, + 38185, + 44168, + 36871, + 37402, + 34860, + 88175, + 29685, + 35151, + 53752, + 37089, + 44435, + 34849, + 35888, + 33467, + 45299, + 48167, + 34621, + 31711, + 39708, + 64458, + 39450, + 40114, + 52421, + 34382, + 31729, + 32037, + 46173, + 50492, + 28817, + 46069, + 40065, + 36565, + 54392, + 44661, + 39246, + 42208, + 49887, + 48175, + 40494, + 66702, + 32527, + 40148, + 45021, + 45559, + 33192, + 28478, + 43845, + 35888, + 36704, + 50277, + 55039, + 32393, + 37071, + 47913, + 46894, + 40423, + 38028, + 33427, + 43055, + 47019, + 45306, + 46782, + 32735, + 41903, + 34293, + 35325, + 34800, + 49590, + 59773, + 40631, + 32531, + 35655, + 34274, + 36004, + 37414, + 46333, + 40449, + 35885, + 42403, + 35989, + 60782, + 38936, + 42049, + 30826, + 38650, + 38417, + 33823, + 36266, + 44728, + 39720, + 49964, + 66539, + 35208, + 49934, + 34843, + 31339, + 41887, + 35858, + 35539, + 35887, + 46475, + 28778, + 31708, + 57778, + 38788, + 35902, + 44438, + 29465, + 44808, + 38734, + 38383, + 42631, + 35074, + 45483, + 33689, + 39050, + 35742, + 74865, + 40750, + 41711, + 36017, + 40110, + 54058, + 44184, + 32392, + 35410, + 34728, + 41134, + 43819, + 43387, + 60330, + 46233, + 35024, + 51248, + 55118, + 48027, + 49269, + 89422, + 37445, + 45271, + 45963, + 41647, + 31337, + 44093, + 50771, + 41111, + 45246, + 41677, + 38235, + 37455, + 36786, + 71859, + 48982, + 39873, + 77789, + 32746, + 52268, + 40375, + 32773, + 37967, + 44006, + 41268, + 38281, + 29895, + 33469, + 32601, + 41087, + 37813, + 28627, + 55904, + 52649, + 55414, + 39980, + 33397, + 43420, + 72220, + 46559, + 37092, + 38654, + 49712, + 40544, + 40702, + 42896, + 38192, + 41790, + 37241, + 66633, + 43265, + 34333, + 35667, + 32698, + 45873, + 41936, + 42833, + 46049, + 36943, + 40701, + 35998, + 43522, + 31000, + 37983, + 40484, + 29525, + 69168, + 35192, + 36908, + 52726, + 35897, + 36738, + 37361, + 62998, + 38311, + 27760, + 34658, + 36709, + 41756, + 34002, + 40701, + 42127, + 29511, + 36715, + 38323, + 37661, + 62423, + 49301, + 38696, + 55416, + 36233, + 40866, + 36346, + 37691, + 33937, + 51164, + 32940, + 35817, + 39262, + 113407, + 33071, + 67918, + 40149, + 50647, + 44429, + 48505, + 59162, + 46091, + 39828, + 32312, + 30220, + 48197, + 56978, + 63424, + 90631, + 30765, + 36823, + 36419, + 48555, + 54143, + 46714, + 42712, + 42452, + 42298, + 42965, + 46174, + 41330, + 32511, + 68457, + 42768, + 34296, + 33429, + 47445, + 40462, + 47637, + 43749, + 37863, + 33520, + 41686, + 38656, + 29721, + 55338, + 49663, + 37335, + 47003, + 55946, + 38184, + 38634, + 36126, + 38794, + 31717, + 57616, + 39218, + 45660, + 40711, + 45067, + 37504, + 35781, + 42106, + 36813, + 30429, + 38820, + 48702, + 50071, + 39343, + 33097, + 37877, + 45604, + 43228, + 41906, + 36756, + 45346, + 34079, + 31269, + 47477, + 30999, + 35681, + 48943, + 37179, + 43023, + 39159, + 38863, + 41843, + 43781, + 35138, + 32062, + 38510, + 48753, + 53196, + 48104, + 33698 + ] + }, + { + "counters": [ + 39288, + 42097, + 49075, + 30291, + 84880, + 40406, + 36005, + 34302, + 43692, + 41060, + 37409, + 29622, + 52931, + 36096, + 38659, + 31776, + 36502, + 38537, + 32325, + 38486, + 40846, + 33337, + 36808, + 32126, + 33416, + 40254, + 42965, + 35826, + 45428, + 43858, + 43875, + 37534, + 30613, + 30972, + 37558, + 36325, + 39205, + 40104, + 52544, + 37465, + 41471, + 40642, + 32648, + 39976, + 39747, + 28740, + 46482, + 68850, + 65994, + 43215, + 34436, + 37414, + 40928, + 37610, + 36965, + 38110, + 36523, + 35136, + 48201, + 38753, + 41337, + 44073, + 37797, + 44890, + 40991, + 46313, + 32421, + 32410, + 65121, + 37126, + 46197, + 36867, + 45264, + 70524, + 36114, + 35144, + 32491, + 38829, + 46142, + 46201, + 43415, + 41865, + 37074, + 44579, + 50100, + 65325, + 40397, + 33075, + 45128, + 43587, + 50103, + 36202, + 44386, + 31181, + 36974, + 32309, + 46092, + 37467, + 31228, + 39049, + 38972, + 69450, + 47240, + 43926, + 48753, + 33031, + 43499, + 38119, + 35007, + 47987, + 29610, + 42845, + 43388, + 40596, + 35257, + 48278, + 35147, + 79286, + 34927, + 45114, + 54553, + 40989, + 42511, + 53477, + 34488, + 25447, + 44344, + 68638, + 36417, + 34134, + 35494, + 39505, + 31952, + 35284, + 61028, + 49086, + 40149, + 39288, + 40712, + 40686, + 42077, + 44478, + 32280, + 33029, + 37326, + 32104, + 46023, + 34753, + 42144, + 43028, + 46950, + 34387, + 41997, + 34485, + 57272, + 33801, + 34169, + 39694, + 37516, + 41586, + 46131, + 43640, + 41004, + 49023, + 45010, + 40341, + 59133, + 49070, + 33478, + 30973, + 48628, + 73401, + 38424, + 44117, + 52265, + 34474, + 40109, + 29594, + 43874, + 62370, + 38459, + 39329, + 48335, + 40200, + 26698, + 56079, + 30195, + 57250, + 32387, + 69988, + 37465, + 33729, + 27642, + 31400, + 36883, + 51250, + 43637, + 53701, + 44988, + 31337, + 35089, + 37584, + 52636, + 45137, + 38134, + 31397, + 46550, + 32836, + 30099, + 46219, + 59317, + 49964, + 32726, + 29142, + 51822, + 57415, + 35938, + 37866, + 39632, + 31155, + 34464, + 32284, + 40124, + 45685, + 43687, + 31995, + 29691, + 38121, + 41346, + 32905, + 35015, + 39099, + 34967, + 40897, + 34134, + 36828, + 34211, + 31440, + 35904, + 35704, + 34186, + 36685, + 46131, + 33384, + 42272, + 34702, + 44301, + 41326, + 31744, + 43132, + 36302, + 33878, + 26620, + 31762, + 93857, + 40892, + 47364, + 39088, + 65444, + 31376, + 32018, + 52482, + 48371, + 30683, + 40157, + 45357, + 45949, + 36640, + 38250, + 40357, + 38784, + 57324, + 50743, + 33278, + 35485, + 35920, + 38826, + 40285, + 71262, + 58616, + 28563, + 48105, + 50388, + 48030, + 36255, + 33022, + 37550, + 62122, + 45971, + 35966, + 43592, + 33428, + 49857, + 40819, + 37453, + 35646, + 38704, + 46222, + 45553, + 46520, + 41320, + 32920, + 41401, + 42517, + 55048, + 35894, + 35030, + 37752, + 42864, + 52276, + 49179, + 43188, + 37476, + 29794, + 48014, + 48429, + 32284, + 32902, + 30973, + 39900, + 35218, + 43525, + 35786, + 40057, + 31084, + 40032, + 36468, + 35619, + 40017, + 40710, + 43783, + 39022, + 40873, + 45852, + 38099, + 42456, + 41686, + 44042, + 39066, + 45337, + 35016, + 36959, + 34844, + 43626, + 56840, + 59007, + 34641, + 35165, + 34557, + 49247, + 51175, + 30218, + 29409, + 46636, + 35038, + 42507, + 64838, + 35623, + 56953, + 53161, + 32465, + 63787, + 42409, + 43941, + 40982, + 50611, + 24521, + 45284, + 43170, + 45232, + 28189, + 38504, + 39251, + 47606, + 40453, + 46539, + 44798, + 49539, + 62452, + 30505, + 34104, + 47536, + 34518, + 51378, + 68255, + 39403, + 36474, + 57475, + 55709, + 37129, + 55947, + 36211, + 42249, + 42584, + 36772, + 39014, + 40350, + 36305, + 33188, + 40507, + 41025, + 43101, + 76305, + 36635, + 51056, + 41695, + 49069, + 41161, + 37498, + 33733, + 47597, + 44610, + 42143, + 39828, + 45279, + 46671, + 36024, + 44674, + 34697, + 42047, + 35408, + 61314, + 33359, + 49013, + 32364, + 32005, + 35847, + 39234, + 43894, + 36599, + 35645, + 35893, + 45106, + 42035, + 46570, + 45807, + 43492, + 45726, + 38285, + 39658, + 43453, + 52772, + 40435, + 66527, + 49631, + 112020, + 34361, + 33472, + 31852, + 34181, + 34000, + 56193, + 28838, + 60733, + 48631, + 36319, + 36992, + 36672, + 43305, + 37356, + 36634, + 39092, + 37233, + 46048, + 53387, + 49250, + 39281, + 35300, + 86644, + 40471, + 43337, + 63865, + 36130, + 48564, + 52723, + 37504, + 41078, + 46006, + 78168, + 34929, + 36552, + 33039, + 33942, + 52832, + 35305, + 35439, + 34506, + 38600, + 33441, + 49319, + 54267, + 35182, + 37519, + 38279, + 29687, + 42115, + 45050, + 85194, + 39252, + 50548, + 42308, + 46117, + 29674, + 37772, + 38766, + 32359, + 39779, + 35698, + 35906, + 44134, + 47642, + 33328, + 40266, + 44871, + 57928, + 57123, + 44303, + 44570, + 35693, + 29125, + 63552, + 38403, + 48289, + 51153, + 50125, + 37533, + 44699, + 77524, + 38286, + 35336, + 47725, + 43120, + 46169, + 26357, + 44406, + 31462, + 40406, + 50215, + 28399, + 59314, + 33758, + 50154, + 32602, + 43904, + 38777, + 37600, + 38485, + 37741, + 50111, + 34135, + 40828, + 38159, + 41013, + 40688, + 34673, + 41383, + 35916, + 38547, + 37416, + 43869, + 37606, + 42000, + 49751, + 33534, + 42983, + 36211, + 47062, + 41835, + 42931, + 42976, + 48070, + 46853, + 34768, + 33150, + 30476, + 49046, + 33817, + 32882, + 33027, + 34546, + 38716, + 38298, + 52991, + 54427, + 59671, + 40978, + 36751, + 49794, + 44254, + 42147, + 32927, + 43601, + 39984, + 52741, + 38937, + 36472, + 32975, + 40179, + 48561, + 63769, + 35446, + 35433, + 35759, + 43069, + 37495, + 59501, + 42601, + 47684, + 53837, + 38895, + 44116, + 67735, + 44494, + 49609, + 35701, + 44082, + 77221, + 38075, + 34894, + 37785, + 33579, + 42391, + 52786, + 41616, + 34257, + 38723, + 34151, + 29466, + 45887, + 53270, + 40441, + 37738, + 49852, + 46442, + 44059, + 40455, + 42299, + 47774, + 49093, + 42434, + 40048, + 36037, + 35304, + 30859, + 46513, + 42562, + 53622, + 55536, + 34284, + 37735, + 27103, + 46858, + 39564, + 44581, + 44887, + 35715, + 40744, + 52554, + 36761, + 29253, + 46266, + 60076, + 65526, + 42421, + 34207, + 40210, + 32209, + 57138, + 34331, + 46043, + 32941, + 37968, + 40799, + 36043, + 50535, + 41100, + 36082, + 37057, + 30776, + 33454, + 35934, + 32782, + 42868, + 37400, + 45347, + 34930, + 33096, + 32294, + 43682, + 33588, + 44013, + 44849, + 43805, + 37686, + 47369, + 43454, + 44580, + 49637, + 38902, + 39817, + 40348, + 38598, + 48537, + 42512, + 39338, + 44305, + 71435, + 46585, + 40601, + 33210, + 40539, + 49574, + 57007, + 46764, + 42893, + 28344, + 37346, + 34905, + 43115, + 45622, + 36524, + 44530, + 37934, + 33178, + 31134, + 40529, + 38375, + 50406, + 57959, + 35888, + 35803, + 42679, + 35054, + 32867, + 52375, + 48835, + 36461, + 39134, + 32372, + 40285, + 37472, + 41832, + 31886, + 46509, + 48606, + 39267, + 38648, + 32150, + 51530, + 38690, + 47940, + 1137027, + 36294, + 56900, + 37854, + 38654, + 30248, + 39040, + 41405, + 48795, + 38607, + 48546, + 36241, + 36584, + 39174, + 38609, + 33321, + 33750, + 35230, + 32705, + 45007, + 39835, + 49048, + 41866, + 35905, + 43691, + 50432, + 60910, + 42821, + 45823, + 45264, + 34274, + 36249, + 43423, + 41505, + 37006, + 32006, + 33829, + 27738, + 46618, + 35686, + 41152, + 43543, + 42514, + 39853, + 69072, + 45640, + 32963, + 41750, + 44065, + 47674, + 42937, + 35416, + 36334, + 35983, + 39885, + 39356, + 43684, + 51625, + 40092, + 35711, + 52587, + 43096, + 50801, + 33150, + 56657, + 34822, + 40207, + 34265, + 46912, + 36050, + 38544, + 42249, + 48996, + 43074, + 41705, + 36997, + 40267, + 47339, + 46891, + 40012, + 30728, + 34645, + 30902, + 38877, + 47136, + 36428, + 42375, + 41781, + 40494, + 31772, + 32334, + 32807, + 52005, + 53853, + 49659, + 45390, + 51397, + 43339, + 41979, + 40829, + 95947, + 44509, + 45944, + 38332, + 29385, + 38108, + 40726, + 39991, + 36755, + 42142, + 31223, + 32656, + 42842, + 36899, + 38585, + 76715, + 38932, + 39402, + 39240, + 44734, + 34618, + 39436, + 78858, + 49514, + 40154, + 45915, + 50102, + 43037, + 38600, + 37594, + 46244, + 40392, + 39252, + 33555, + 40806, + 62250, + 37845, + 32939, + 33755, + 44000, + 35360, + 39285, + 47054, + 37085, + 38134, + 40736, + 31805, + 49100, + 56857, + 33751, + 40062, + 69607, + 62311, + 44674, + 51030, + 38943, + 34599, + 39751, + 38411, + 47366, + 33807, + 51376, + 39137, + 38252, + 31507, + 49147, + 51764, + 39427, + 69252, + 45355, + 42918, + 39478, + 33097, + 45057, + 38131, + 125921, + 44421, + 60230, + 34578, + 36912, + 36533, + 48378, + 36523, + 32179, + 37313, + 31813, + 45141, + 38550, + 38554, + 35859, + 33989, + 58082, + 37238, + 49264, + 35356, + 33925, + 36676, + 37887, + 37216, + 30194, + 38781, + 32849, + 35843, + 53407, + 41577, + 33880, + 32942, + 33949, + 60698, + 34115, + 40238, + 35348, + 34665, + 41809, + 55942, + 31670, + 65208, + 42783, + 46810, + 43975, + 34654, + 40401, + 35740, + 39624, + 46646, + 47685, + 39122, + 39462, + 54481, + 41829, + 45585, + 33905, + 45828, + 35066, + 32948, + 34249, + 60650, + 38433, + 41491, + 43715, + 35595, + 36664, + 49949, + 42246, + 44742, + 41693, + 37663, + 60914, + 79532, + 37468, + 38360, + 57690, + 47171, + 46533, + 48141, + 33185, + 34875, + 32304, + 34628, + 32979, + 41086, + 46282, + 53254, + 42033, + 42608, + 40054, + 42535, + 39183, + 42838, + 56698, + 33445, + 45815, + 39764, + 52419, + 43150, + 32115, + 38134, + 47551, + 37574, + 30502, + 37340, + 37489, + 39444, + 49514, + 35814, + 42343, + 57425, + 43407, + 47191, + 39075, + 37018, + 36177, + 38060, + 41842, + 53406, + 35419, + 33277, + 41068, + 48434, + 40705, + 51274, + 30890, + 47219, + 41930, + 40118, + 39143, + 39974, + 29243, + 37588, + 35349, + 31045, + 44579, + 28354, + 50523, + 36392, + 35400, + 48307, + 35033, + 33691, + 62168, + 41689, + 36187, + 56187, + 32496, + 43430, + 43628, + 39589, + 46877, + 36403, + 34113, + 56989, + 47433, + 36452, + 37552, + 39694, + 41156, + 34172, + 39848, + 33920, + 32907, + 44544, + 35604, + 42088, + 43766, + 41787, + 35388, + 44759, + 43956, + 25710, + 35467, + 42173, + 37395, + 39889, + 32741, + 36769, + 42395, + 44973, + 37121, + 35767, + 33841, + 56072, + 34538, + 50664, + 46747, + 30410, + 45904, + 32969, + 32691, + 56426, + 44152, + 43050, + 34447, + 40627, + 47404, + 52609, + 63462, + 36409, + 57223, + 50209, + 33944, + 33810, + 29281, + 208734, + 34445, + 44494, + 41309, + 32158, + 31268, + 67792, + 52569, + 43454, + 36498, + 39073, + 37917, + 29780, + 42712, + 41948, + 31618, + 46753, + 42935, + 34734, + 32702, + 38018, + 40420, + 43147, + 41041, + 57742, + 31106, + 43155, + 32278, + 41679, + 32584, + 31750, + 36243, + 36511, + 45068, + 42618, + 57157, + 47703, + 29307, + 41014, + 37944, + 27449, + 35636, + 45190, + 36179, + 35052, + 37557, + 39072, + 44684, + 37890, + 43482, + 31485, + 62263, + 44648, + 32715, + 55251, + 37968, + 38054, + 44723, + 33624, + 31879, + 26759, + 41672, + 36994, + 34258, + 40720, + 58700, + 45519, + 39789, + 44163, + 35818, + 35363, + 34976, + 37278, + 55714, + 37053, + 29118, + 44854, + 38670, + 35128, + 55309, + 41018, + 47327, + 36252, + 37838, + 38512, + 35572, + 32486, + 38218, + 36891, + 31930, + 36237, + 43478, + 47428, + 62614, + 36758, + 29102, + 37555, + 32856, + 45242, + 51271, + 32840, + 59683, + 51026, + 37376, + 33830, + 40909, + 38001, + 36200, + 43433, + 43863, + 62880, + 24959, + 38651, + 31461, + 37545, + 33389, + 30801, + 35326, + 38254, + 31665, + 38408, + 30517, + 38684, + 38368, + 47386, + 48447, + 33575, + 38844, + 42723, + 36957, + 42681, + 56225, + 34287, + 37795, + 46213, + 35688, + 42636, + 36255, + 49509, + 38669, + 35601, + 35461, + 60445, + 45993, + 34602, + 42159, + 37476, + 87699, + 62382, + 32624, + 35566, + 32956, + 51989, + 40043, + 42977, + 30279, + 41095, + 47221, + 38424, + 39876, + 46896, + 38782, + 54652, + 43787, + 50497, + 47711, + 38711, + 62990, + 44286, + 48476, + 35277, + 46140, + 49083, + 37971, + 39058, + 42348, + 67048, + 39101, + 46509, + 31474, + 52662, + 37657, + 58474, + 27276, + 41369, + 40370, + 40813, + 44602, + 32717, + 41552, + 42134, + 46948, + 40399, + 42304, + 40641, + 49123, + 43694, + 35112, + 45264, + 40206, + 35237, + 43218, + 34544, + 47785, + 40144, + 37591, + 61262, + 41047, + 48652, + 34039, + 52921, + 36090, + 37753, + 33176, + 64104, + 42966, + 51138, + 35697, + 40721, + 32912, + 42079, + 69873, + 58183, + 41193, + 43432, + 39641, + 36866, + 43660, + 32826, + 57624, + 49427, + 42172, + 40381, + 40291, + 36790, + 30930, + 42680, + 44462, + 34249, + 45181, + 35432, + 42033, + 56309, + 36628, + 36124, + 40088, + 34696, + 46439, + 39920, + 42843, + 42006, + 37207, + 44969, + 44381, + 35853, + 34427, + 50970, + 43886, + 39483, + 34588, + 31658, + 48616, + 34652, + 37404, + 36606, + 50450, + 33434, + 40926, + 42366, + 42753, + 36260, + 50225, + 46176, + 42772, + 46498, + 41835, + 37344, + 35466, + 36549, + 46278, + 49584, + 48733, + 38897, + 29815, + 51717, + 57024, + 59516, + 40355, + 51897, + 42808, + 37109, + 41516, + 40524, + 41835, + 33259, + 37485, + 44963, + 30998, + 40745, + 43611, + 60854, + 33245, + 45084, + 36908, + 38818, + 74375, + 33248, + 48167, + 36320, + 39360, + 81021, + 40447, + 53750, + 39885, + 57900, + 53448, + 50935, + 40734, + 52589, + 42569, + 37634, + 50142, + 42395, + 36391, + 37038, + 31633, + 34762, + 39144, + 37278, + 47512, + 38227, + 48007, + 57245, + 60695, + 41585, + 43281, + 49946, + 37019, + 40490, + 36619, + 29186, + 39114, + 32219, + 31000, + 32871, + 37099, + 29268, + 29429, + 35161, + 33398, + 39984, + 34386, + 45173, + 36504, + 43021, + 31800, + 33980, + 281193, + 44788, + 50048, + 35159, + 47043, + 36093, + 31644, + 38206, + 44095, + 37169, + 34531, + 42150, + 82396, + 49100, + 43544, + 46062, + 80797, + 42355, + 39869, + 29012, + 37404, + 45806, + 41310, + 46407, + 36488, + 41349, + 51159, + 30318, + 28742, + 37223, + 36200, + 33443, + 43989, + 44360, + 29405, + 32101, + 44686, + 40555, + 40001, + 34706, + 35298, + 29810, + 55854, + 31224, + 45746, + 36595, + 48094, + 49314, + 53287, + 30487, + 71037, + 45352, + 51137, + 33136, + 33088, + 45517, + 44772, + 50314, + 32469, + 42827, + 37235, + 31415, + 42097, + 32737, + 33751, + 49297, + 49264, + 57823, + 35301, + 46862, + 35005, + 52358, + 40315, + 64598, + 48560, + 33439, + 50631, + 48010, + 40656, + 40452, + 32766, + 35706, + 49741, + 68055, + 40130, + 39547, + 39644, + 45850, + 30827, + 39649, + 31941, + 44727, + 42502, + 56488, + 81541, + 34509, + 32669, + 38278, + 47776, + 37631, + 41905, + 31316, + 44203, + 45662, + 43316, + 30742, + 35932, + 38513, + 32201, + 33482, + 47844, + 41483, + 40883, + 33229, + 44284, + 54122, + 39205, + 44901, + 31180, + 42337, + 51375, + 40055, + 38752, + 35740, + 42114, + 32371, + 49927, + 30997, + 44501, + 81277, + 32989, + 44535, + 35828, + 28750, + 40914, + 33330, + 41717, + 34525, + 50331, + 35630, + 33289, + 33396, + 43557, + 37496, + 39260, + 40640, + 34531, + 42168, + 34857, + 134504, + 39304, + 47625, + 41986, + 35090, + 63880, + 29501, + 39719, + 33226, + 45790, + 47315, + 49422, + 35043, + 45459, + 47335, + 41738, + 32299, + 33808, + 37266, + 41458, + 36338, + 43660, + 28262, + 41677, + 37143, + 43848, + 43276, + 40865, + 38829, + 56334, + 41220, + 60776, + 41644, + 36717, + 57731, + 37827, + 47008, + 34465, + 50254, + 37542, + 39062, + 43136, + 35988, + 35659, + 30231, + 46785, + 30522, + 68518, + 45234, + 38762, + 31226, + 39317, + 36558, + 34247, + 34233, + 34532, + 38610, + 37909, + 41642, + 38121, + 42171, + 42929, + 38561, + 46629, + 34488, + 30628, + 37996, + 55985, + 30876, + 37277, + 61250, + 39451, + 32912, + 39143, + 44542, + 32319, + 44847, + 39388, + 47231, + 52212, + 66565, + 51268, + 41783, + 38249, + 29840, + 47295, + 62334, + 63013, + 40792, + 36952, + 28939, + 41457, + 76723, + 38611, + 60836, + 39805, + 37400, + 42996, + 31071, + 44277, + 47973, + 30537, + 43930, + 55162, + 34946, + 40167, + 31539, + 62362, + 35460, + 53074, + 32638, + 52112, + 50142, + 31727, + 50334, + 41797, + 60503, + 38101, + 50116, + 52912, + 45275, + 46138, + 46467, + 42605, + 38409, + 34054, + 59228, + 28861, + 32259, + 48964, + 50507, + 44947, + 42799, + 35294, + 27369, + 39680, + 36691, + 38776, + 28489, + 39504, + 29518, + 37219, + 37163, + 41699, + 41721, + 50584, + 36972, + 30267, + 33786, + 40085, + 35713, + 38878, + 36893, + 46137, + 41675, + 46605, + 48797, + 39095, + 39322, + 31326, + 35826, + 35512, + 43049, + 37917, + 41598, + 38375, + 57075, + 39979, + 30152, + 31927, + 31666, + 48277, + 50013, + 37260, + 37807, + 43059, + 40020, + 43292, + 41102, + 43723, + 39984, + 35452, + 63767, + 30139, + 45785, + 52362, + 40272, + 32880, + 40424, + 46345, + 67971, + 35287, + 59640, + 36609, + 36252, + 41883, + 49707, + 35140, + 48359, + 42887, + 37164, + 40984, + 39234, + 63448, + 40332, + 33721, + 36104, + 44087, + 37991, + 40252, + 35302, + 36665, + 36822, + 34940, + 41995, + 43455, + 47327, + 35918, + 38126, + 37426, + 37356, + 34218, + 39937, + 45158, + 43946, + 45252, + 37566, + 35554, + 30901, + 32466, + 36660, + 36473, + 57433, + 41669, + 48796, + 56355, + 42404, + 35049, + 43806, + 45582, + 59788, + 46726, + 31454, + 68225, + 56050, + 30948, + 37229, + 38405, + 33928, + 32691, + 41971, + 46792, + 47761, + 34724, + 40923, + 36323, + 34851, + 31678, + 53142, + 42511, + 52573, + 39755, + 36955, + 33737, + 31806, + 43447, + 38991, + 35685, + 35673, + 28601, + 36642, + 29916, + 33613, + 36416, + 45245, + 32085, + 30470, + 39611, + 95026, + 36864, + 42972, + 26738, + 76060, + 40941, + 46111, + 47513, + 32207, + 28900, + 38939, + 31375, + 39037, + 34773, + 40234, + 35599, + 33849, + 35107, + 29178, + 36697, + 35681, + 63922, + 37086, + 40019, + 34435, + 31375, + 49015, + 46435, + 52087, + 56851, + 40623, + 37149, + 30566, + 175865, + 38823, + 46578, + 43055, + 32814, + 36081, + 36945, + 51793, + 36108, + 37466, + 34873, + 31615, + 46625, + 46636, + 39179, + 44757, + 43109, + 47291, + 39235, + 43655, + 36913, + 35419, + 34771, + 37816, + 35313, + 53978, + 66353, + 36289, + 39242, + 43973, + 41896, + 39574, + 34321, + 36979, + 37306, + 51573, + 36849, + 42580, + 39286, + 65467, + 33964, + 27086, + 34583, + 35875, + 47324, + 40058, + 41107, + 38393, + 31094, + 36829, + 38835, + 40642, + 37500, + 49028, + 34670, + 36003, + 140534, + 42587, + 45118, + 48887, + 36870, + 37177, + 41681, + 29001, + 48181, + 34585, + 37852, + 38964, + 38747, + 39268, + 60030, + 34438, + 35947, + 33463, + 49872, + 37153, + 53463, + 35549, + 38070, + 37896, + 36350, + 31438, + 59672, + 30351, + 30554, + 37701, + 46274, + 37940, + 47945, + 37936, + 35277, + 55141, + 36429, + 39711, + 38960, + 41270, + 38824, + 37399 + ] + }, + { + "counters": [ + 38543, + 42483, + 33829, + 42356, + 42412, + 40729, + 42377, + 45410, + 43159, + 47991, + 40201, + 51066, + 36036, + 38398, + 35822, + 283469, + 39017, + 38456, + 32361, + 42165, + 32856, + 39071, + 44292, + 42483, + 28997, + 43534, + 42606, + 35161, + 26582, + 48325, + 34732, + 37376, + 31097, + 42058, + 41196, + 46613, + 42792, + 37977, + 45961, + 37652, + 30361, + 40022, + 34886, + 33034, + 68397, + 37115, + 38740, + 49213, + 33612, + 49522, + 43041, + 25904, + 32492, + 38658, + 49635, + 48509, + 43857, + 56521, + 81051, + 63814, + 38666, + 45757, + 45853, + 47810, + 43785, + 36133, + 31523, + 41713, + 46550, + 41516, + 33503, + 43458, + 31139, + 62215, + 37101, + 39327, + 33687, + 39460, + 48226, + 36940, + 42120, + 44725, + 44098, + 39468, + 50826, + 39128, + 40438, + 35247, + 39129, + 46473, + 36676, + 39722, + 35378, + 45847, + 30386, + 35784, + 36405, + 39217, + 39061, + 47427, + 37421, + 41211, + 36795, + 32387, + 30516, + 28586, + 30354, + 49329, + 68918, + 41202, + 45916, + 45153, + 33224, + 39459, + 45384, + 44157, + 38807, + 45797, + 42913, + 29623, + 29794, + 37036, + 41292, + 32674, + 61102, + 62108, + 35751, + 37646, + 43960, + 33576, + 32242, + 42853, + 34553, + 37031, + 34352, + 38154, + 39261, + 41412, + 36544, + 35690, + 54862, + 37630, + 36465, + 35652, + 33137, + 55889, + 37735, + 53832, + 39063, + 40178, + 44302, + 79072, + 42624, + 49597, + 35968, + 57244, + 42774, + 58829, + 43893, + 40991, + 46506, + 39603, + 41326, + 41102, + 51753, + 38618, + 46746, + 33808, + 47977, + 38618, + 59225, + 39724, + 37733, + 43813, + 33132, + 59539, + 36670, + 46779, + 46775, + 37264, + 43468, + 33575, + 34566, + 64551, + 38779, + 33647, + 37012, + 36947, + 38374, + 37842, + 39432, + 56761, + 46248, + 42176, + 41405, + 35424, + 112538, + 34462, + 58035, + 36650, + 41213, + 35223, + 29403, + 43011, + 39768, + 28150, + 40529, + 36053, + 46691, + 41205, + 39449, + 49343, + 40499, + 32633, + 43302, + 46748, + 39331, + 39435, + 41663, + 30929, + 38372, + 53168, + 46309, + 54192, + 49859, + 41175, + 39135, + 42578, + 32031, + 33317, + 35965, + 42480, + 37788, + 34787, + 47782, + 30224, + 36401, + 49018, + 49481, + 69576, + 37901, + 42309, + 50993, + 46226, + 39382, + 37711, + 43305, + 103516, + 44773, + 45136, + 35332, + 33720, + 45372, + 32179, + 30068, + 33429, + 60284, + 42194, + 42905, + 42213, + 50478, + 35108, + 39978, + 39112, + 30794, + 43814, + 36725, + 64549, + 35032, + 44311, + 35494, + 40717, + 30296, + 41928, + 41814, + 46943, + 41727, + 39347, + 35693, + 43806, + 38883, + 40213, + 32632, + 70446, + 28183, + 51784, + 28015, + 41270, + 34582, + 34169, + 39903, + 44732, + 57198, + 47981, + 46327, + 42709, + 27999, + 37675, + 38481, + 40559, + 40439, + 47982, + 53073, + 40700, + 42448, + 35563, + 44098, + 37917, + 46282, + 36170, + 41717, + 38303, + 43145, + 30600, + 44763, + 53566, + 39961, + 42704, + 32185, + 44028, + 38444, + 37332, + 47071, + 75344, + 37016, + 58635, + 38472, + 44501, + 44586, + 49976, + 35456, + 34159, + 43291, + 39076, + 36182, + 31930, + 42858, + 44740, + 35691, + 33254, + 33985, + 56437, + 38050, + 37269, + 34802, + 43702, + 69904, + 33154, + 38988, + 35780, + 47590, + 33016, + 42077, + 41051, + 73099, + 33511, + 39562, + 44275, + 41272, + 37204, + 51647, + 40925, + 152094, + 40098, + 38325, + 38540, + 34436, + 36129, + 41534, + 36026, + 48188, + 40408, + 59298, + 45365, + 44589, + 40909, + 36563, + 42424, + 43891, + 38801, + 48598, + 39086, + 34369, + 42069, + 41462, + 64933, + 59419, + 35277, + 32137, + 27140, + 36825, + 32652, + 45315, + 50061, + 48286, + 57627, + 41721, + 43593, + 39826, + 29420, + 28782, + 46269, + 43291, + 58450, + 42591, + 56563, + 51153, + 43879, + 36197, + 38280, + 43001, + 41728, + 31242, + 45175, + 26321, + 46333, + 56968, + 35764, + 38390, + 44785, + 41852, + 45593, + 41210, + 43044, + 39478, + 40477, + 46822, + 29428, + 32354, + 36014, + 34735, + 36993, + 48492, + 32046, + 40400, + 33094, + 37081, + 54580, + 51191, + 36996, + 41109, + 49126, + 29336, + 34608, + 38918, + 35684, + 51362, + 37203, + 35396, + 59539, + 41483, + 45599, + 44075, + 42317, + 40642, + 46947, + 44736, + 46820, + 37824, + 37616, + 29028, + 43019, + 40797, + 65363, + 35362, + 31174, + 36701, + 42664, + 35919, + 46119, + 38846, + 35523, + 49944, + 42424, + 40088, + 35688, + 43637, + 35986, + 37451, + 129612, + 44326, + 44048, + 33750, + 47741, + 36247, + 36707, + 40822, + 40430, + 70748, + 38849, + 42708, + 38492, + 105018, + 46372, + 98506, + 54973, + 32826, + 77855, + 36487, + 44930, + 46425, + 54197, + 36879, + 38757, + 42360, + 59815, + 34331, + 40707, + 39374, + 45847, + 38165, + 34851, + 50204, + 32116, + 80736, + 46450, + 72436, + 39594, + 36489, + 42143, + 41568, + 43426, + 40030, + 41579, + 36483, + 28771, + 42524, + 44196, + 39115, + 44624, + 59701, + 64708, + 40687, + 47536, + 48953, + 34054, + 36527, + 44611, + 42580, + 39253, + 31405, + 33856, + 42048, + 41580, + 48235, + 31036, + 40374, + 49164, + 43227, + 34942, + 55726, + 32311, + 35483, + 35828, + 44729, + 33583, + 41809, + 37050, + 34529, + 38426, + 48880, + 46918, + 34048, + 55189, + 32503, + 32700, + 39947, + 37112, + 47174, + 58374, + 44715, + 50917, + 48801, + 61756, + 39325, + 35120, + 48865, + 27503, + 55903, + 51833, + 40549, + 42998, + 57217, + 45659, + 36046, + 64099, + 46663, + 35327, + 36468, + 34709, + 39083, + 33819, + 39631, + 45842, + 41148, + 39261, + 46987, + 167233, + 33264, + 64728, + 39711, + 42731, + 42708, + 48803, + 37899, + 31925, + 53623, + 33540, + 43655, + 49344, + 36983, + 46736, + 35950, + 58332, + 42038, + 86443, + 46172, + 35983, + 56851, + 41950, + 36462, + 30696, + 43323, + 60442, + 42132, + 40358, + 44616, + 37984, + 37314, + 24459, + 30545, + 33774, + 59228, + 32430, + 33709, + 40231, + 31689, + 57165, + 33806, + 34864, + 39771, + 38150, + 43625, + 34549, + 32036, + 46646, + 42412, + 36969, + 50467, + 59065, + 39156, + 35169, + 33320, + 34439, + 33150, + 39778, + 49794, + 42267, + 41743, + 33770, + 31939, + 39100, + 34162, + 34513, + 43906, + 32077, + 57683, + 36109, + 59264, + 40015, + 60217, + 39292, + 47878, + 35610, + 52014, + 40685, + 46898, + 35351, + 59540, + 52003, + 46524, + 38467, + 37657, + 37780, + 52314, + 44594, + 70065, + 37547, + 42206, + 32601, + 40532, + 39724, + 52202, + 34893, + 57804, + 34119, + 74120, + 35760, + 26387, + 44684, + 29582, + 49173, + 49291, + 34063, + 46326, + 52799, + 118505, + 51134, + 40976, + 36426, + 36147, + 41033, + 44592, + 36416, + 46240, + 31612, + 32720, + 31075, + 40517, + 44272, + 40578, + 44085, + 43553, + 35136, + 30482, + 38338, + 28287, + 40431, + 44888, + 43987, + 43894, + 40470, + 42638, + 45768, + 49515, + 46058, + 34929, + 35067, + 38673, + 71858, + 48976, + 35600, + 35325, + 37712, + 39536, + 47107, + 54216, + 41845, + 40959, + 49870, + 35219, + 36015, + 50779, + 46291, + 54560, + 36361, + 41265, + 42510, + 43378, + 34097, + 35505, + 50883, + 65028, + 42850, + 43843, + 36176, + 40129, + 32632, + 53324, + 50554, + 39538, + 46676, + 35487, + 53855, + 31369, + 32746, + 49661, + 46775, + 42782, + 31705, + 38687, + 29672, + 40473, + 36941, + 47052, + 35717, + 42364, + 38182, + 36957, + 56538, + 36458, + 65810, + 35839, + 35001, + 41181, + 50403, + 51332, + 31040, + 40027, + 32972, + 36357, + 34268, + 30742, + 39581, + 31498, + 35542, + 59685, + 55501, + 41910, + 39076, + 52208, + 52772, + 42573, + 43868, + 35102, + 27287, + 55726, + 44677, + 37560, + 49256, + 42247, + 52544, + 34260, + 34267, + 37613, + 31988, + 38296, + 38286, + 35481, + 36463, + 33142, + 45183, + 41299, + 38663, + 36730, + 78043, + 28573, + 57951, + 46404, + 48756, + 39560, + 50140, + 49219, + 40230, + 45865, + 45817, + 34848, + 29475, + 38367, + 37151, + 50693, + 29173, + 32070, + 32726, + 44387, + 29886, + 37692, + 31506, + 65637, + 40903, + 53458, + 36963, + 36709, + 51512, + 37864, + 56886, + 32698, + 44554, + 35036, + 41275, + 33550, + 44351, + 37252, + 40838, + 38339, + 29551, + 35948, + 32119, + 36207, + 40076, + 33622, + 44358, + 217139, + 44363, + 44368, + 45570, + 41782, + 50918, + 35789, + 39712, + 29104, + 40320, + 39076, + 50290, + 36250, + 33335, + 54726, + 40510, + 59122, + 30627, + 42549, + 37246, + 66380, + 46339, + 39085, + 32221, + 51948, + 32912, + 31798, + 51924, + 33882, + 40249, + 31785, + 40384, + 40958, + 74405, + 38234, + 30579, + 34066, + 46252, + 36082, + 53698, + 75089, + 49061, + 32649, + 32916, + 55082, + 34215, + 50075, + 34490, + 40232, + 29599, + 58787, + 36244, + 53376, + 47932, + 46300, + 43690, + 35067, + 40579, + 39246, + 48758, + 36512, + 40471, + 48006, + 66128, + 71474, + 39355, + 33686, + 46112, + 36060, + 40489, + 31998, + 39995, + 45341, + 39420, + 38459, + 41649, + 35358, + 43562, + 36562, + 36812, + 34826, + 35887, + 43870, + 48510, + 44631, + 39356, + 36590, + 44418, + 37181, + 41530, + 38003, + 58479, + 35904, + 50158, + 43860, + 41054, + 47260, + 35208, + 41320, + 33356, + 123273, + 35194, + 42830, + 48883, + 34989, + 52477, + 29123, + 54693, + 40374, + 34846, + 42562, + 46983, + 35862, + 33209, + 41292, + 47413, + 33179, + 37648, + 50695, + 43541, + 51277, + 40824, + 30282, + 40264, + 36656, + 33573, + 45308, + 28857, + 38062, + 38195, + 48016, + 39365, + 43440, + 36918, + 44347, + 52472, + 34032, + 67291, + 39701, + 51820, + 35920, + 40931, + 29550, + 30095, + 37501, + 31135, + 40840, + 34669, + 48926, + 42583, + 49820, + 34079, + 37280, + 41395, + 37123, + 35011, + 36450, + 45548, + 47036, + 62751, + 37904, + 61503, + 45830, + 54799, + 45957, + 44215, + 39957, + 34811, + 34405, + 37334, + 31839, + 44489, + 40083, + 29917, + 55719, + 38479, + 37531, + 41361, + 40365, + 36429, + 41924, + 45123, + 45807, + 55467, + 49136, + 42630, + 58922, + 34950, + 38429, + 32276, + 39254, + 36216, + 48687, + 33956, + 41818, + 53674, + 43603, + 43082, + 39382, + 71356, + 53702, + 42828, + 29009, + 50733, + 44682, + 52142, + 37020, + 74332, + 40390, + 31516, + 32464, + 49240, + 28173, + 35483, + 42609, + 33066, + 41418, + 42834, + 37006, + 35993, + 42685, + 49231, + 33616, + 30431, + 35258, + 29076, + 50340, + 43412, + 35525, + 30252, + 34759, + 38922, + 38530, + 31523, + 59456, + 40777, + 38789, + 45532, + 45230, + 49153, + 32861, + 38656, + 42591, + 34210, + 38719, + 37963, + 41604, + 36646, + 44708, + 36696, + 33010, + 34058, + 45619, + 38370, + 38799, + 30882, + 33714, + 46989, + 31584, + 35206, + 56719, + 36450, + 27585, + 40705, + 43657, + 29360, + 43998, + 33018, + 54795, + 41823, + 40809, + 38690, + 33176, + 36147, + 39784, + 37719, + 39753, + 35404, + 39141, + 30853, + 37792, + 37740, + 40750, + 53023, + 47890, + 36500, + 41173, + 38233, + 37726, + 30339, + 36374, + 56215, + 38203, + 37225, + 35485, + 39544, + 39034, + 32883, + 37260, + 34467, + 50028, + 41390, + 39060, + 60431, + 36097, + 42023, + 47610, + 34411, + 32964, + 39805, + 37380, + 34768, + 43123, + 49615, + 35066, + 64411, + 56642, + 45156, + 56702, + 30909, + 54872, + 40092, + 38250, + 42395, + 65518, + 36274, + 43270, + 41691, + 42333, + 43092, + 34917, + 45991, + 52393, + 36290, + 51647, + 47699, + 39818, + 29870, + 31056, + 48450, + 38675, + 40601, + 43946, + 34047, + 61854, + 42127, + 40800, + 39296, + 32733, + 45971, + 41339, + 32543, + 41900, + 48511, + 49265, + 34619, + 31926, + 33173, + 34523, + 55252, + 41066, + 44290, + 35996, + 49510, + 32416, + 28635, + 37853, + 38735, + 52354, + 31226, + 42617, + 40956, + 40840, + 40092, + 34572, + 37013, + 42728, + 48091, + 43727, + 41849, + 42031, + 32584, + 29708, + 41069, + 34663, + 38087, + 29861, + 62255, + 53188, + 47867, + 37041, + 44726, + 32558, + 35259, + 44877, + 39653, + 36000, + 31265, + 38714, + 34485, + 43759, + 48937, + 44310, + 49398, + 60373, + 34371, + 40843, + 33280, + 43078, + 44493, + 35364, + 37956, + 32106, + 45363, + 49936, + 59067, + 45848, + 38074, + 43713, + 39168, + 36944, + 32004, + 40741, + 55777, + 44789, + 33855, + 34382, + 67571, + 35783, + 38330, + 32585, + 32048, + 36312, + 42475, + 36267, + 38072, + 46670, + 33171, + 40821, + 32757, + 42832, + 46979, + 29204, + 40043, + 37338, + 67033, + 43403, + 39369, + 42540, + 35933, + 55016, + 45302, + 35906, + 34810, + 54593, + 36379, + 36517, + 41690, + 46850, + 35258, + 34701, + 39733, + 54112, + 48405, + 44676, + 39504, + 29814, + 52143, + 37941, + 55154, + 36290, + 41941, + 65877, + 33675, + 38679, + 37996, + 31782, + 35226, + 34454, + 44729, + 41049, + 64114, + 39036, + 61752, + 59203, + 34134, + 51824, + 44674, + 40647, + 38537, + 42280, + 36715, + 32395, + 40700, + 36258, + 34112, + 39158, + 39390, + 48791, + 42371, + 34929, + 34816, + 32684, + 34289, + 36203, + 41205, + 40002, + 41918, + 35024, + 43541, + 32553, + 34750, + 40824, + 36923, + 48156, + 39787, + 42495, + 41518, + 42565, + 42045, + 37472, + 41143, + 48178, + 44051, + 40189, + 45988, + 47010, + 34877, + 45192, + 43636, + 35032, + 43159, + 35381, + 31280, + 46600, + 37977, + 34987, + 39245, + 37221, + 39589, + 42462, + 50951, + 39441, + 57434, + 35933, + 31375, + 38064, + 33594, + 42219, + 36827, + 30736, + 33117, + 31336, + 30181, + 40724, + 38683, + 39714, + 42728, + 40690, + 32336, + 40813, + 97601, + 36773, + 40220, + 42856, + 50964, + 40782, + 42749, + 45068, + 40849, + 42012, + 33250, + 40663, + 42858, + 34121, + 66924, + 39154, + 48782, + 33889, + 37034, + 42561, + 41884, + 41270, + 38834, + 49093, + 41833, + 37360, + 49316, + 34836, + 35148, + 33390, + 38613, + 33283, + 33269, + 36331, + 42956, + 57156, + 47358, + 33703, + 51589, + 34627, + 39539, + 38315, + 32226, + 44362, + 51005, + 45745, + 55344, + 36650, + 45622, + 39876, + 42349, + 32277, + 41065, + 33413, + 52789, + 1117114, + 39217, + 30957, + 35249, + 58893, + 36606, + 33299, + 45207, + 33594, + 33983, + 36197, + 39774, + 33475, + 35893, + 43841, + 32226, + 42343, + 40957, + 40071, + 32754, + 45617, + 45568, + 37867, + 33462, + 36859, + 40681, + 30868, + 29221, + 41233, + 35711, + 34350, + 47079, + 49964, + 44107, + 48653, + 43347, + 42868, + 35966, + 36861, + 50752, + 64452, + 34707, + 43847, + 45407, + 37584, + 34290, + 46458, + 41883, + 38719, + 46262, + 35864, + 43172, + 40387, + 36867, + 36075, + 45004, + 38093, + 35701, + 43719, + 36141, + 40275, + 41518, + 62107, + 36864, + 32403, + 48718, + 41915, + 45434, + 44949, + 36520, + 38423, + 49010, + 45281, + 40731, + 51993, + 41680, + 45195, + 60840, + 41181, + 50175, + 35548, + 37388, + 39399, + 38812, + 31172, + 48842, + 27194, + 35671, + 41363, + 27123, + 37539, + 45124, + 41746, + 34588, + 36285, + 41986, + 41125, + 49175, + 63027, + 30333, + 36576, + 72173, + 41839, + 39696, + 46271, + 57046, + 63519, + 28450, + 41900, + 43134, + 59843, + 45230, + 41274, + 41295, + 40057, + 38578, + 47204, + 36433, + 33217, + 53402, + 74347, + 37478, + 30675, + 42057, + 39862, + 49595, + 40057, + 54268, + 36941, + 48755, + 28526, + 32877, + 41288, + 28338, + 44419, + 47194, + 39670, + 42276, + 45062, + 54191, + 38791, + 35583, + 31870, + 31125, + 26635, + 47509, + 33155, + 37108, + 37363, + 49957, + 31552, + 43577, + 38410, + 33522, + 37060, + 43339, + 36470, + 35834, + 39610, + 34402, + 34258, + 39790, + 38652, + 47928, + 38452, + 35254, + 45724, + 44436, + 46281, + 40037, + 43218, + 39823, + 33705, + 39032, + 35079, + 38049, + 40573, + 40071, + 48990, + 45388, + 33554, + 34566, + 29970, + 35195, + 51125, + 40719, + 63484, + 37992, + 41611, + 48990, + 35618, + 48602, + 47049, + 32991, + 41951, + 37489, + 33495, + 38145, + 34951, + 40920, + 39410, + 34517, + 37722, + 39249, + 31050, + 45944, + 36814, + 46728, + 42134, + 36663, + 38723, + 30907, + 41188, + 41720, + 37393, + 42552, + 32413, + 28390, + 41139, + 39588, + 62576, + 38780, + 49317, + 45365, + 54262, + 32900, + 41715, + 32267, + 36197, + 40638, + 37088, + 38244, + 32402, + 38579, + 82640, + 38811, + 33861, + 30214, + 27664, + 46674, + 46583, + 32191, + 43706, + 31474, + 42519, + 59470, + 37539, + 52540, + 61731, + 42221, + 38825, + 35514, + 42472, + 46061, + 31455, + 35193, + 47153, + 38981, + 35718, + 69751, + 42643, + 37962, + 38837, + 40176, + 42114, + 40682, + 40669, + 43248, + 31956, + 37735, + 32968, + 40720, + 43947, + 54242, + 33315, + 36856, + 39200, + 44168, + 37644, + 39361, + 33050, + 31362, + 40177, + 30550, + 43269, + 38989, + 33358, + 38126, + 41475, + 36183, + 41653, + 36414, + 36751, + 45224, + 40395, + 40781, + 30758, + 35854, + 41578, + 38234, + 37461, + 33258, + 41051, + 52180, + 33164, + 36016, + 40993, + 34221, + 49728, + 36078, + 37831, + 35666, + 43849, + 41150, + 47446, + 40752, + 52153, + 51713, + 43433, + 48593, + 51528, + 48212, + 35510, + 35903, + 48909, + 56535, + 45776, + 31828, + 32432, + 53525, + 53756, + 35121, + 41908, + 47541, + 45087, + 39541, + 34265, + 38187, + 32471, + 41144, + 45622, + 30558, + 45264, + 56568, + 34754, + 34589, + 28984, + 32378, + 40714, + 39137, + 35143, + 36299, + 51001, + 33996, + 37936, + 35451, + 45456, + 37812, + 35329, + 39337, + 62846, + 35029, + 77776, + 36477, + 35321, + 36007, + 49089, + 38872, + 44828, + 37934, + 43279, + 39001, + 42601, + 36760, + 32945, + 46496, + 49528, + 35104, + 40268, + 47503, + 47672, + 41928, + 40426, + 33849, + 38053, + 40547, + 40461, + 34396, + 49017, + 40545, + 36453, + 50138, + 49357, + 34073, + 38488, + 36284, + 36142, + 44223, + 29750, + 47505, + 42861, + 45904, + 38466, + 44714, + 41234, + 42725, + 38036, + 65261, + 44034, + 36633, + 42636, + 59865, + 54934, + 47826, + 45242, + 47627, + 55830, + 46359, + 50094, + 43695, + 41027, + 56398, + 45889, + 30531, + 39925, + 35423, + 35309, + 39690, + 37446, + 46791, + 45699, + 56930, + 41790, + 40202, + 45173, + 42553, + 32143, + 36249, + 35982, + 35016, + 53653, + 44877, + 42705, + 49123, + 33523, + 37615, + 34448, + 37353, + 41435, + 37009, + 38008, + 46883, + 37832, + 41496, + 29569, + 39257, + 38728, + 44752, + 48860, + 35589, + 50040, + 36541, + 52436, + 45330, + 63756, + 38724, + 40272, + 40355, + 40951, + 37344, + 35927, + 41674, + 46630, + 33582, + 35447, + 36607, + 34990, + 53263, + 29577, + 54557, + 43001, + 49350, + 45064, + 33829, + 39217, + 31600, + 31438, + 38647, + 61864, + 35677, + 38250, + 38234, + 44043, + 36425, + 42169, + 33823, + 39487, + 37705, + 53418, + 29211, + 39986, + 44909, + 40031, + 34961, + 60016, + 26597, + 33312, + 93778, + 40025, + 43670, + 41845, + 32120, + 37669, + 36908, + 37273, + 37138, + 33056, + 31791, + 45544, + 43183, + 37900, + 38680, + 30802, + 41795, + 34846, + 45569, + 51832, + 35438, + 39585, + 36572, + 65003, + 39196, + 44945, + 35310, + 47020, + 40715, + 35445, + 40579, + 32006, + 43221, + 40248, + 35652, + 46726, + 39254, + 36924, + 44141, + 43050, + 35768, + 42272, + 41432 + ] + }, + { + "counters": [ + 47223, + 64461, + 34968, + 30931, + 43665, + 41584, + 33635, + 41302, + 52601, + 44858, + 37069, + 35288, + 36281, + 36977, + 33039, + 35917, + 33029, + 51360, + 40059, + 42601, + 60832, + 37382, + 28282, + 44804, + 33891, + 34358, + 45146, + 39130, + 36263, + 44804, + 34420, + 40677, + 49000, + 37898, + 35487, + 34774, + 36964, + 43370, + 30816, + 34500, + 42542, + 46490, + 61462, + 32169, + 35540, + 30945, + 34173, + 45265, + 34459, + 47760, + 29847, + 35923, + 33054, + 42474, + 44966, + 42411, + 38268, + 37389, + 40974, + 29308, + 44471, + 32234, + 32980, + 45820, + 35324, + 45821, + 48880, + 41166, + 34388, + 45648, + 43974, + 38949, + 32010, + 34423, + 38188, + 36697, + 41533, + 52841, + 44217, + 39052, + 44944, + 31792, + 45336, + 36389, + 36893, + 42620, + 42437, + 42220, + 48884, + 35448, + 38056, + 38251, + 29679, + 58252, + 28015, + 47451, + 40167, + 44182, + 66244, + 37843, + 28506, + 32650, + 48833, + 38766, + 53810, + 27353, + 37518, + 57010, + 33056, + 49154, + 28591, + 34485, + 40489, + 47946, + 40289, + 41896, + 37583, + 62082, + 26221, + 34882, + 34647, + 37121, + 29211, + 75400, + 35136, + 50549, + 49322, + 42745, + 34009, + 28306, + 36361, + 38678, + 33231, + 116443, + 32982, + 34197, + 36673, + 42543, + 37332, + 46555, + 39004, + 51493, + 52029, + 40119, + 34257, + 32290, + 31857, + 32888, + 32199, + 34967, + 33746, + 40709, + 51661, + 54644, + 35927, + 47733, + 42000, + 59257, + 30608, + 37513, + 43304, + 59866, + 41963, + 40298, + 44554, + 31898, + 33123, + 45559, + 38385, + 47680, + 38174, + 39557, + 51412, + 39146, + 38072, + 35265, + 37038, + 35842, + 31119, + 39868, + 46282, + 28485, + 31032, + 31780, + 44794, + 42581, + 52812, + 43929, + 42350, + 39476, + 44126, + 45182, + 30871, + 43538, + 38337, + 36881, + 33086, + 1113486, + 46204, + 49361, + 53852, + 45168, + 59172, + 40984, + 40702, + 51162, + 44550, + 53901, + 53936, + 56020, + 29606, + 41012, + 40728, + 33169, + 62477, + 44961, + 42528, + 34022, + 40693, + 39312, + 36739, + 36002, + 40123, + 41222, + 41032, + 48406, + 43443, + 33014, + 45170, + 35348, + 42077, + 46043, + 35825, + 39791, + 50087, + 45037, + 32252, + 52819, + 37235, + 33153, + 51862, + 39225, + 37948, + 40490, + 41579, + 42439, + 43604, + 39246, + 29371, + 48069, + 36514, + 40076, + 34084, + 35284, + 51796, + 41487, + 38751, + 37429, + 34190, + 48742, + 31368, + 36954, + 33065, + 43610, + 31623, + 46149, + 33416, + 47551, + 55776, + 35718, + 66407, + 45981, + 38475, + 39004, + 38524, + 56738, + 35482, + 35313, + 57497, + 45463, + 40691, + 54799, + 47126, + 39174, + 39273, + 46328, + 41077, + 33625, + 38043, + 51739, + 50666, + 38310, + 51645, + 39331, + 43964, + 34846, + 30376, + 36792, + 51936, + 38603, + 57194, + 43356, + 41374, + 45003, + 36140, + 29146, + 42300, + 33476, + 43444, + 43466, + 44167, + 40915, + 44916, + 36832, + 35908, + 30925, + 35404, + 40070, + 34396, + 40863, + 44455, + 41465, + 43984, + 47902, + 45891, + 37178, + 35244, + 69911, + 43752, + 47211, + 33824, + 35996, + 40521, + 40634, + 35522, + 56670, + 45555, + 52643, + 30294, + 36710, + 46783, + 41899, + 38228, + 36859, + 37369, + 41084, + 38453, + 44416, + 29293, + 42832, + 28124, + 82159, + 35091, + 36403, + 50863, + 29834, + 43424, + 38847, + 44274, + 65284, + 38430, + 38980, + 51383, + 53325, + 32583, + 30106, + 39145, + 37075, + 41427, + 38343, + 38412, + 32784, + 33566, + 49404, + 39821, + 49189, + 43011, + 34985, + 37508, + 66752, + 37083, + 43766, + 64107, + 36175, + 56287, + 50391, + 40717, + 34980, + 51641, + 41674, + 40015, + 36966, + 45045, + 37931, + 38041, + 59766, + 40342, + 32603, + 44020, + 38512, + 63518, + 38929, + 38939, + 36808, + 34811, + 30170, + 34059, + 44301, + 36110, + 32315, + 37337, + 47886, + 35552, + 31232, + 42736, + 32930, + 32185, + 29818, + 40243, + 55801, + 29418, + 39388, + 44029, + 40492, + 35314, + 44070, + 34594, + 33579, + 41241, + 37900, + 49578, + 42300, + 36282, + 35055, + 31478, + 45365, + 47498, + 46270, + 42959, + 39032, + 50159, + 43849, + 41198, + 41006, + 50432, + 55384, + 31827, + 51884, + 38982, + 34063, + 33785, + 49898, + 32680, + 48944, + 33241, + 49574, + 29922, + 36230, + 39617, + 35154, + 52580, + 36251, + 35288, + 33434, + 38540, + 50126, + 44070, + 39785, + 46545, + 40923, + 53338, + 44507, + 34275, + 43716, + 47413, + 33801, + 43167, + 47281, + 57322, + 64442, + 39025, + 35338, + 50552, + 33019, + 36768, + 36790, + 46030, + 48019, + 44625, + 37004, + 53033, + 36792, + 35236, + 50167, + 32134, + 36348, + 35149, + 34286, + 33193, + 33320, + 42670, + 34323, + 45978, + 46566, + 45805, + 33175, + 38227, + 43483, + 34667, + 36791, + 24275, + 42027, + 40156, + 38741, + 37414, + 34466, + 50507, + 49051, + 32113, + 44762, + 51759, + 36595, + 33982, + 59064, + 34755, + 51645, + 55247, + 53944, + 32811, + 38911, + 35579, + 36066, + 41128, + 36201, + 35630, + 38011, + 47529, + 41075, + 34317, + 80075, + 35072, + 35631, + 36730, + 46042, + 32840, + 34389, + 31804, + 47793, + 35965, + 39802, + 37257, + 36005, + 37661, + 47980, + 42498, + 35755, + 34113, + 44002, + 50581, + 32172, + 29679, + 42226, + 38051, + 48719, + 32210, + 46874, + 40331, + 32421, + 43645, + 39197, + 25902, + 34345, + 46643, + 35082, + 33600, + 47495, + 33084, + 35588, + 62390, + 52368, + 29478, + 37089, + 48241, + 36439, + 49432, + 35342, + 42576, + 41187, + 284942, + 45493, + 48455, + 38037, + 28465, + 35049, + 39993, + 42134, + 58787, + 49938, + 47004, + 48723, + 87963, + 50178, + 36869, + 33308, + 39304, + 51625, + 36963, + 41986, + 32596, + 49581, + 42984, + 38196, + 51368, + 33696, + 35795, + 40739, + 34511, + 47930, + 44964, + 63967, + 40889, + 41178, + 42315, + 25727, + 45581, + 105613, + 56906, + 31719, + 40300, + 56976, + 33461, + 198299, + 35401, + 42772, + 41926, + 34733, + 43456, + 37274, + 35096, + 35656, + 38667, + 32796, + 43940, + 46701, + 32239, + 49321, + 40785, + 51164, + 41961, + 45570, + 62144, + 34175, + 34012, + 39234, + 67645, + 39433, + 42523, + 35502, + 39877, + 38784, + 34942, + 40663, + 40809, + 42276, + 38389, + 40148, + 32760, + 36899, + 37258, + 32065, + 50429, + 39130, + 62744, + 54621, + 43607, + 42757, + 35956, + 36080, + 28547, + 40295, + 32401, + 52047, + 113063, + 42097, + 52931, + 30593, + 44106, + 63867, + 45825, + 46533, + 28218, + 30118, + 37517, + 35365, + 33449, + 47301, + 45451, + 43986, + 30431, + 42111, + 33677, + 31792, + 32954, + 49790, + 43054, + 37941, + 34733, + 29829, + 35553, + 45337, + 39628, + 52066, + 34050, + 48793, + 34064, + 27945, + 36119, + 34006, + 44177, + 27183, + 42366, + 32657, + 37816, + 39822, + 44353, + 33848, + 44580, + 52836, + 42951, + 36409, + 39512, + 90766, + 70730, + 33152, + 90939, + 40910, + 44073, + 26731, + 35113, + 40299, + 46468, + 35064, + 45636, + 47424, + 36773, + 36282, + 35920, + 33227, + 41499, + 47851, + 34573, + 33867, + 39586, + 46910, + 33046, + 43714, + 47015, + 32446, + 36765, + 39618, + 45819, + 41301, + 40515, + 46639, + 35402, + 38893, + 140723, + 34380, + 28934, + 34696, + 39829, + 38898, + 41684, + 34040, + 34920, + 35983, + 54975, + 33218, + 40743, + 34830, + 49113, + 59016, + 32602, + 33360, + 42220, + 41708, + 35999, + 29092, + 34336, + 61666, + 30170, + 38515, + 43694, + 31069, + 33378, + 34420, + 38264, + 38692, + 67077, + 38432, + 36287, + 38890, + 46368, + 41189, + 32346, + 38830, + 31498, + 45047, + 42150, + 29780, + 59132, + 47134, + 42760, + 45212, + 63369, + 44136, + 43539, + 47529, + 36063, + 40228, + 56220, + 34673, + 45148, + 47208, + 34243, + 36127, + 38695, + 39858, + 39241, + 47733, + 39746, + 46779, + 27629, + 44932, + 67986, + 36988, + 43270, + 46289, + 42150, + 45632, + 32068, + 32963, + 35773, + 37853, + 40923, + 47499, + 40861, + 32213, + 38712, + 29802, + 45485, + 31056, + 39294, + 38429, + 49545, + 45902, + 39084, + 58849, + 48074, + 30940, + 58236, + 36271, + 35859, + 46438, + 37321, + 51412, + 34152, + 44656, + 51141, + 48339, + 36569, + 41080, + 41830, + 36521, + 36199, + 33135, + 43619, + 63384, + 47829, + 38747, + 62590, + 50266, + 46180, + 55119, + 35155, + 37793, + 40980, + 35345, + 40933, + 33637, + 30346, + 35669, + 36122, + 27378, + 43573, + 31467, + 37068, + 42720, + 43716, + 33963, + 41273, + 37020, + 28231, + 30246, + 54448, + 56348, + 33554, + 34010, + 33536, + 36880, + 33260, + 42189, + 33338, + 41133, + 32157, + 69716, + 43542, + 55178, + 35072, + 42295, + 47455, + 37533, + 33243, + 37991, + 50898, + 47476, + 38421, + 42922, + 50951, + 45495, + 42952, + 40687, + 33759, + 35306, + 34384, + 46569, + 41543, + 36822, + 28549, + 41631, + 38177, + 31827, + 37221, + 32329, + 45573, + 45269, + 40027, + 42942, + 36034, + 45432, + 35550, + 31907, + 51545, + 39919, + 40647, + 33222, + 35866, + 45144, + 35676, + 29589, + 47399, + 41881, + 38779, + 59646, + 29385, + 35867, + 37166, + 36627, + 41338, + 45606, + 31593, + 47943, + 32130, + 36340, + 56257, + 42639, + 30802, + 38346, + 42752, + 37349, + 36050, + 39126, + 46966, + 44948, + 53011, + 37522, + 31086, + 51894, + 34232, + 57748, + 40029, + 35070, + 26966, + 37687, + 47588, + 46671, + 45869, + 38090, + 47377, + 52345, + 29132, + 43298, + 31211, + 48790, + 46206, + 43220, + 45885, + 39852, + 54909, + 35467, + 34213, + 38275, + 52789, + 50020, + 44642, + 41286, + 36259, + 55833, + 35214, + 44790, + 48082, + 54919, + 69212, + 46800, + 31836, + 38731, + 37014, + 28600, + 52305, + 35340, + 41800, + 50501, + 33556, + 39290, + 36695, + 64140, + 37685, + 48978, + 44658, + 53220, + 44791, + 59089, + 35486, + 37805, + 40225, + 70287, + 56912, + 43193, + 36223, + 50142, + 37572, + 51050, + 38565, + 42162, + 39760, + 40649, + 50668, + 45804, + 39833, + 36206, + 43287, + 55293, + 36794, + 37268, + 51134, + 44702, + 38259, + 41177, + 45056, + 45036, + 39994, + 48209, + 33046, + 34036, + 34476, + 37480, + 38591, + 48010, + 40098, + 40812, + 37801, + 39077, + 46063, + 51469, + 52435, + 50176, + 40000, + 67157, + 40108, + 33273, + 39904, + 37887, + 39134, + 34651, + 42742, + 38358, + 38307, + 44522, + 47088, + 42913, + 49754, + 44626, + 47078, + 35678, + 40959, + 42127, + 42693, + 38827, + 45595, + 38438, + 51759, + 33773, + 27373, + 44320, + 27863, + 33319, + 63548, + 36751, + 50506, + 38457, + 39019, + 39124, + 36500, + 37352, + 36013, + 33806, + 49703, + 43472, + 36568, + 41948, + 36187, + 45637, + 38257, + 39572, + 36829, + 35421, + 38857, + 33015, + 37578, + 34502, + 47857, + 35317, + 34912, + 41293, + 40100, + 32430, + 84123, + 42873, + 35124, + 37424, + 38493, + 36269, + 39528, + 52934, + 41468, + 43599, + 41088, + 38643, + 50087, + 40356, + 35714, + 33173, + 38242, + 39365, + 34970, + 45240, + 35514, + 33985, + 37156, + 44209, + 49857, + 32444, + 43142, + 33091, + 41978, + 37357, + 36518, + 35987, + 34411, + 42724, + 40340, + 31680, + 33827, + 61319, + 30428, + 42316, + 31852, + 53167, + 46073, + 47423, + 43646, + 35355, + 45147, + 40857, + 38715, + 35345, + 43433, + 51856, + 44183, + 30993, + 47814, + 41683, + 40697, + 35303, + 32718, + 46596, + 38094, + 40766, + 33412, + 39512, + 28190, + 51865, + 32202, + 42681, + 32220, + 36730, + 46585, + 41874, + 37534, + 56449, + 41937, + 43423, + 39335, + 40799, + 36704, + 44606, + 54355, + 46833, + 33980, + 36292, + 48796, + 43577, + 53663, + 37167, + 46071, + 33814, + 48730, + 55852, + 38385, + 41647, + 35863, + 41152, + 55194, + 27583, + 36315, + 32247, + 43431, + 42143, + 40583, + 40021, + 36890, + 61899, + 35053, + 56723, + 41570, + 36085, + 34344, + 37461, + 26812, + 54474, + 38200, + 45664, + 54455, + 46804, + 37647, + 45655, + 43477, + 29780, + 32252, + 32578, + 31090, + 55446, + 35887, + 67785, + 41545, + 33862, + 41600, + 47376, + 41898, + 51478, + 35037, + 38754, + 66987, + 46808, + 63117, + 46025, + 39269, + 31152, + 45510, + 45681, + 30265, + 34733, + 166863, + 39481, + 39428, + 60509, + 34794, + 69577, + 37325, + 45397, + 46327, + 28162, + 99598, + 44924, + 41740, + 64279, + 31512, + 45712, + 43065, + 44612, + 32358, + 38588, + 39705, + 41460, + 34769, + 49765, + 40273, + 48138, + 39799, + 40632, + 39774, + 44924, + 41097, + 36763, + 37215, + 62594, + 40436, + 53951, + 46932, + 35495, + 39164, + 51702, + 46039, + 41409, + 41196, + 42285, + 47785, + 34404, + 38288, + 40444, + 40718, + 40843, + 48814, + 39596, + 40118, + 35038, + 50779, + 56518, + 45987, + 32049, + 40857, + 45792, + 33313, + 41765, + 29314, + 38837, + 44294, + 40102, + 33736, + 45632, + 36099, + 37763, + 35847, + 38342, + 36849, + 47552, + 48859, + 136974, + 43903, + 47547, + 60668, + 39055, + 31563, + 38095, + 42434, + 40426, + 46391, + 35093, + 38671, + 35164, + 30893, + 51084, + 45097, + 50751, + 33243, + 47628, + 36594, + 36555, + 28566, + 46422, + 59067, + 37062, + 44228, + 53017, + 50871, + 38626, + 53458, + 45193, + 35243, + 34751, + 53298, + 42818, + 37160, + 48698, + 46128, + 40034, + 38765, + 39495, + 33403, + 49527, + 42562, + 39944, + 42910, + 37971, + 33709, + 37116, + 37788, + 45690, + 30230, + 59859, + 35381, + 49290, + 46111, + 51984, + 35525, + 38532, + 28197, + 32579, + 64428, + 44034, + 45656, + 33916, + 36926, + 35272, + 45593, + 38504, + 51113, + 42547, + 52832, + 42904, + 33639, + 34964, + 32316, + 30517, + 36920, + 36065, + 35138, + 40562, + 57415, + 36980, + 53362, + 30336, + 26854, + 40750, + 54914, + 32796, + 39948, + 43960, + 51669, + 30120, + 42337, + 38591, + 35873, + 50944, + 49281, + 44064, + 37749, + 50629, + 56820, + 53344, + 44702, + 44639, + 52067, + 60706, + 44179, + 36998, + 43363, + 52088, + 34982, + 39585, + 39523, + 58413, + 38641, + 54318, + 40415, + 33205, + 45216, + 43860, + 58282, + 50179, + 42413, + 41901, + 43633, + 46801, + 40416, + 31639, + 35924, + 47508, + 44785, + 68710, + 55956, + 38981, + 42881, + 45326, + 45038, + 40791, + 36316, + 36337, + 34945, + 61886, + 35787, + 47130, + 41492, + 35541, + 120111, + 44606, + 46516, + 39007, + 66923, + 116406, + 31878, + 43435, + 38725, + 38251, + 32125, + 37834, + 36154, + 42463, + 30189, + 48850, + 37472, + 44006, + 38299, + 48009, + 56423, + 38368, + 34578, + 43356, + 38920, + 33633, + 42819, + 43834, + 38773, + 41987, + 34325, + 37572, + 42249, + 42910, + 34978, + 31986, + 47986, + 32701, + 55433, + 42017, + 39746, + 37977, + 35340, + 43744, + 33042, + 39324, + 41325, + 43806, + 37327, + 34339, + 35918, + 41560, + 48655, + 78809, + 51020, + 40174, + 48877, + 33683, + 48316, + 38072, + 42891, + 39701, + 53544, + 38444, + 37988, + 50874, + 37701, + 39695, + 52555, + 32500, + 37070, + 51683, + 44620, + 38140, + 34787, + 38760, + 40238, + 39905, + 34943, + 42298, + 43494, + 43584, + 37517, + 41298, + 47331, + 34758, + 43211, + 36902, + 47448, + 76479, + 29849, + 54278, + 39915, + 43946, + 35111, + 40661, + 51684, + 32519, + 34993, + 47879, + 52079, + 38385, + 50132, + 51494, + 39881, + 32774, + 35031, + 33113, + 48681, + 39878, + 36231, + 42110, + 43606, + 39347, + 38728, + 36295, + 45061, + 45201, + 35819, + 74545, + 34719, + 33859, + 39296, + 41270, + 32153, + 38973, + 41547, + 43689, + 36276, + 39327, + 48172, + 38660, + 36513, + 31553, + 40845, + 57328, + 42114, + 48756, + 46412, + 37019, + 37419, + 35539, + 39197, + 31955, + 30057, + 36453, + 36427, + 36438, + 39625, + 47581, + 43993, + 40591, + 49764, + 29293, + 38476, + 39000, + 44209, + 50197, + 35810, + 46014, + 58174, + 42936, + 37408, + 38276, + 39709, + 53933, + 49285, + 30499, + 64231, + 34911, + 58448, + 44045, + 44550, + 43017, + 58969, + 41376, + 38311, + 53713, + 34795, + 43224, + 32555, + 37277, + 42757, + 36021, + 64433, + 34411, + 33913, + 40411, + 38390, + 33828, + 37483, + 45119, + 36411, + 36292, + 56800, + 36389, + 74054, + 44064, + 45328, + 74204, + 33765, + 38877, + 39933, + 32415, + 42990, + 42228, + 39241, + 46121, + 80298, + 45124, + 35245, + 37049, + 42699, + 41242, + 33012, + 52249, + 74663, + 32285, + 33067, + 52155, + 35536, + 47739, + 40425, + 36966, + 36446, + 55918, + 40563, + 33081, + 34753, + 31930, + 32868, + 40868, + 42866, + 35020, + 45570, + 47667, + 59681, + 45757, + 39873, + 33695, + 39127, + 39516, + 37260, + 44606, + 40554, + 55169, + 40171, + 45738, + 41264, + 39963, + 54424, + 43054, + 35574, + 36539, + 40681, + 49144, + 41859, + 32346, + 40988, + 40029, + 34911, + 35657, + 44423, + 37335, + 35614, + 31909, + 55742, + 58556, + 35427, + 36654, + 34031, + 38786, + 27487, + 35490, + 40053, + 44681, + 33566, + 31166, + 48803, + 43223, + 35613, + 43444, + 44608, + 33195, + 42024, + 38281, + 44161, + 48063, + 40587, + 46992, + 42603, + 34121, + 32272, + 40678, + 64906, + 50372, + 36780, + 38628, + 43638, + 41610, + 40487, + 37342, + 47038, + 69392, + 37010, + 36815, + 40857, + 47441, + 43490, + 48646, + 48633, + 36549, + 41629, + 35958, + 36244, + 41524, + 43413, + 35769, + 60900, + 30382, + 36134, + 52332, + 31984, + 32800, + 48558, + 39136, + 39588, + 31227, + 37264, + 50405, + 32656, + 34382, + 40579, + 30094, + 39447, + 49209, + 34242, + 34773, + 40364, + 40630, + 48990, + 38651, + 47015, + 38044, + 44648, + 36460, + 29660, + 40476, + 45764, + 39266, + 43758, + 48652, + 43532, + 48725, + 30227, + 34015, + 31856, + 29500, + 71944, + 36582, + 40386, + 32260, + 39813, + 30615, + 40704, + 34658, + 41774, + 50799, + 28331, + 30129, + 41577, + 28918, + 68788, + 45599, + 31989, + 53709, + 38090, + 44927, + 42119, + 38660, + 51072, + 30501, + 39986, + 37243, + 35910, + 41588, + 35054, + 29867, + 46832, + 30923, + 35613, + 51014, + 40181, + 35624, + 69638, + 39839, + 40773, + 43533, + 32582, + 34991, + 40018, + 42948, + 36909, + 37578, + 46241, + 43556, + 32890, + 41528, + 40592, + 53760, + 54666, + 36914, + 33626, + 40980, + 32859, + 44297, + 41468, + 37551, + 32405, + 43146, + 32347, + 36064, + 33413, + 36491, + 45095, + 33834, + 46383, + 38892, + 43898, + 36683, + 72312, + 56403, + 37836, + 39928, + 37640, + 38575, + 36415, + 58312, + 37799, + 41228, + 67748, + 51465, + 37082, + 40872, + 81534, + 38109, + 50169, + 34039, + 40918, + 45307, + 35117, + 42156, + 49670, + 53993, + 41283, + 44219, + 57682, + 31116, + 49443, + 45146, + 45565, + 37717, + 28226, + 44160, + 44037, + 32929, + 35459, + 38994, + 45453, + 33077, + 37823, + 48239, + 46141, + 36785, + 44752, + 36582, + 41254, + 49383, + 50317, + 78749, + 34486, + 32847, + 37831, + 41225, + 50473, + 36456, + 59979, + 35341, + 54540, + 78854, + 30269, + 41206, + 39889, + 35366, + 41990, + 35496, + 31390, + 40003, + 52209, + 37314, + 45743, + 36653, + 45412, + 30912, + 40702, + 60097, + 47055, + 34510, + 41782, + 37394, + 38008, + 48941, + 36961, + 35986, + 31518, + 41569, + 31640, + 36783, + 38563, + 49213, + 36490, + 45320, + 39491, + 34818, + 51275, + 40486, + 37853, + 47645, + 48154, + 40075, + 32769, + 36419, + 37767, + 38611 + ] + }, + { + "counters": [ + 37236, + 38775, + 39166, + 49316, + 37424, + 50367, + 44734, + 35998, + 117772, + 46323, + 47620, + 39815, + 35284, + 42455, + 38339, + 38410, + 50787, + 32112, + 43228, + 48177, + 37866, + 40913, + 39815, + 38504, + 38849, + 48149, + 47047, + 50879, + 43044, + 53688, + 47890, + 64438, + 45354, + 41741, + 41798, + 47988, + 44806, + 36068, + 41463, + 33465, + 43526, + 40077, + 49152, + 37069, + 35433, + 36253, + 36602, + 40931, + 56284, + 45732, + 41048, + 34089, + 39647, + 45159, + 36538, + 32894, + 39379, + 34645, + 38121, + 48560, + 31984, + 38340, + 39268, + 33941, + 53553, + 35335, + 34008, + 41918, + 55834, + 31225, + 29918, + 47186, + 37324, + 40671, + 40089, + 44303, + 45805, + 36169, + 39599, + 64602, + 41911, + 29871, + 36340, + 38053, + 29824, + 47227, + 52653, + 35450, + 35582, + 35800, + 55477, + 45487, + 24718, + 40300, + 42465, + 39597, + 41608, + 38935, + 43494, + 49597, + 37401, + 40015, + 44163, + 40196, + 35821, + 42138, + 35856, + 29470, + 48314, + 27856, + 36284, + 35272, + 39245, + 32351, + 38982, + 35306, + 35594, + 31758, + 34215, + 38981, + 33660, + 51332, + 44451, + 42426, + 43366, + 31214, + 40721, + 48010, + 35401, + 33183, + 53292, + 41222, + 41324, + 36098, + 36889, + 37005, + 35317, + 38692, + 44486, + 30262, + 40944, + 66067, + 56944, + 41267, + 39421, + 41442, + 57547, + 38879, + 35709, + 49373, + 38870, + 42222, + 34896, + 43598, + 36298, + 50087, + 38503, + 35269, + 43137, + 37565, + 49614, + 46206, + 35037, + 38367, + 37611, + 47229, + 51402, + 34182, + 53479, + 35333, + 31062, + 50581, + 42696, + 41812, + 42163, + 39752, + 34281, + 33031, + 52111, + 63942, + 35170, + 71954, + 37154, + 44368, + 55062, + 39179, + 51994, + 47737, + 29614, + 35440, + 30674, + 45497, + 36097, + 54116, + 37631, + 49454, + 36377, + 35925, + 32625, + 44755, + 41570, + 32284, + 39032, + 32799, + 54974, + 33392, + 35362, + 130664, + 45794, + 35817, + 43369, + 30928, + 39953, + 32216, + 31029, + 49325, + 37244, + 50980, + 48934, + 38955, + 36218, + 39436, + 31275, + 37358, + 35649, + 37463, + 38281, + 42544, + 38545, + 46238, + 41731, + 38479, + 37619, + 42684, + 40046, + 63797, + 41344, + 39628, + 35524, + 54546, + 41942, + 33868, + 38720, + 41028, + 33976, + 55952, + 30488, + 36408, + 36506, + 35127, + 31666, + 41863, + 58137, + 35207, + 53119, + 32323, + 41970, + 58310, + 46833, + 34407, + 31869, + 45352, + 49223, + 42521, + 37688, + 31982, + 61405, + 43579, + 51568, + 62075, + 49623, + 58438, + 70622, + 47303, + 32130, + 30190, + 36805, + 40240, + 51339, + 31214, + 32536, + 45529, + 36593, + 88267, + 44696, + 40639, + 39074, + 29637, + 43370, + 31406, + 38890, + 42239, + 32604, + 35660, + 38918, + 53352, + 34256, + 64446, + 36600, + 43252, + 42410, + 42275, + 31106, + 30918, + 36237, + 35863, + 41164, + 38012, + 49473, + 38654, + 49151, + 38857, + 37944, + 48660, + 36784, + 41117, + 35315, + 38926, + 43739, + 45597, + 47274, + 39939, + 31039, + 39356, + 47599, + 50967, + 35363, + 47210, + 39796, + 33212, + 35321, + 40649, + 47724, + 49632, + 36333, + 42316, + 35672, + 33193, + 47427, + 30793, + 40194, + 33722, + 36553, + 43090, + 39365, + 34025, + 43618, + 37393, + 39115, + 31200, + 52596, + 30582, + 43520, + 41613, + 26300, + 35046, + 43661, + 32382, + 40936, + 58281, + 41291, + 47257, + 32243, + 30003, + 47720, + 32313, + 28670, + 40000, + 37799, + 50616, + 34961, + 37817, + 80027, + 44190, + 29207, + 31618, + 39899, + 49469, + 35076, + 34896, + 197003, + 35193, + 41992, + 49049, + 39612, + 52883, + 39303, + 47560, + 52449, + 37446, + 46868, + 32460, + 31811, + 34917, + 34209, + 59930, + 34666, + 48764, + 34983, + 50753, + 36606, + 38710, + 44804, + 32935, + 31895, + 42924, + 56589, + 34714, + 35949, + 31515, + 38735, + 40737, + 41866, + 36346, + 34765, + 43783, + 30636, + 45397, + 34881, + 53014, + 33826, + 38387, + 56700, + 35852, + 38859, + 45696, + 47422, + 39112, + 34608, + 41891, + 40059, + 30484, + 34567, + 40857, + 37302, + 35656, + 56783, + 36952, + 55257, + 42785, + 48840, + 31584, + 51184, + 38920, + 42061, + 32567, + 45240, + 36985, + 57607, + 38185, + 30911, + 37047, + 32798, + 46410, + 34743, + 33225, + 40398, + 40654, + 49137, + 38680, + 58167, + 33474, + 34088, + 74020, + 38996, + 58941, + 35177, + 35558, + 35984, + 38004, + 46076, + 39847, + 34813, + 46773, + 32945, + 39733, + 43562, + 32593, + 54651, + 35194, + 31317, + 37896, + 61059, + 45385, + 36210, + 36165, + 41194, + 55509, + 46867, + 36385, + 41151, + 47599, + 42751, + 42822, + 43064, + 38364, + 31509, + 29625, + 29160, + 41290, + 38613, + 45363, + 41653, + 62580, + 45320, + 32232, + 49053, + 35801, + 38927, + 38675, + 34690, + 41454, + 42598, + 50496, + 40001, + 38930, + 41103, + 30632, + 35004, + 33619, + 35117, + 40510, + 54325, + 44502, + 34654, + 44583, + 41476, + 34726, + 47658, + 33979, + 39818, + 39669, + 35788, + 37086, + 29003, + 37135, + 41339, + 35077, + 33242, + 46273, + 34452, + 42605, + 39310, + 31748, + 30730, + 48521, + 63438, + 52464, + 35371, + 35702, + 35136, + 38648, + 39488, + 34966, + 37676, + 43667, + 44671, + 44458, + 34456, + 43127, + 38297, + 45706, + 37982, + 33903, + 35758, + 36786, + 34261, + 38243, + 33666, + 44254, + 33398, + 41453, + 36069, + 39769, + 35989, + 36540, + 39627, + 37556, + 46950, + 50388, + 44388, + 44934, + 49164, + 35807, + 45164, + 50880, + 36874, + 42864, + 51425, + 30271, + 38834, + 42960, + 32182, + 45458, + 54146, + 34100, + 33394, + 54938, + 52288, + 75211, + 42682, + 37878, + 30951, + 42414, + 33871, + 44369, + 46124, + 42273, + 40961, + 45015, + 30096, + 48689, + 46208, + 40206, + 36929, + 32815, + 32487, + 41194, + 35792, + 46395, + 49462, + 67077, + 34541, + 50026, + 66829, + 36170, + 39383, + 51613, + 34971, + 30982, + 40293, + 55799, + 46114, + 35018, + 33656, + 54289, + 37988, + 43393, + 40244, + 35168, + 56263, + 39735, + 48913, + 58668, + 37447, + 38539, + 35204, + 39507, + 35461, + 30202, + 32620, + 35368, + 56397, + 34636, + 45172, + 43085, + 42085, + 46507, + 29050, + 37379, + 29362, + 48351, + 39255, + 40993, + 36795, + 34983, + 38157, + 51365, + 34206, + 39336, + 40578, + 53323, + 36027, + 43708, + 36383, + 50910, + 54022, + 59408, + 28188, + 44278, + 40420, + 42403, + 34802, + 39825, + 42845, + 43759, + 38749, + 38678, + 42137, + 56075, + 26845, + 31926, + 32465, + 52670, + 38406, + 38418, + 45595, + 44173, + 45224, + 35154, + 40032, + 35352, + 34915, + 52086, + 46824, + 28129, + 55719, + 41550, + 35350, + 36358, + 38863, + 48704, + 29495, + 40770, + 33699, + 60950, + 55565, + 41826, + 39108, + 40276, + 31977, + 46537, + 47499, + 47269, + 33824, + 34807, + 35286, + 36265, + 38054, + 32641, + 36464, + 35179, + 42271, + 35059, + 40908, + 33975, + 48711, + 41986, + 45296, + 34820, + 39027, + 42359, + 42850, + 38339, + 61520, + 35153, + 44411, + 53258, + 35074, + 30778, + 41146, + 39756, + 32882, + 43156, + 31573, + 37171, + 29871, + 34662, + 38056, + 40171, + 45271, + 59581, + 52496, + 55409, + 37007, + 37638, + 64892, + 30611, + 36365, + 49777, + 48388, + 49415, + 43119, + 38643, + 42576, + 36924, + 39886, + 32292, + 67616, + 38925, + 38393, + 72619, + 49464, + 34291, + 141230, + 43177, + 33504, + 49794, + 41594, + 44042, + 47213, + 38563, + 35033, + 51443, + 41401, + 36202, + 36574, + 34050, + 37378, + 38969, + 34413, + 37043, + 40925, + 40656, + 41650, + 54028, + 53521, + 44505, + 55807, + 35718, + 54455, + 43567, + 45501, + 31337, + 44554, + 43221, + 36642, + 39986, + 36005, + 47641, + 38721, + 52004, + 30580, + 44307, + 39379, + 46178, + 39378, + 40090, + 58336, + 40662, + 36100, + 39041, + 32187, + 45896, + 41041, + 62715, + 44129, + 33186, + 44917, + 46718, + 38333, + 37143, + 45335, + 38404, + 53193, + 34570, + 55285, + 34885, + 48807, + 34106, + 31654, + 36569, + 47525, + 51223, + 42738, + 35842, + 46180, + 41446, + 34155, + 39746, + 29453, + 35878, + 32209, + 36212, + 31834, + 42284, + 57942, + 55132, + 34134, + 41318, + 38112, + 36661, + 38786, + 51711, + 33856, + 46273, + 41079, + 35645, + 36626, + 52778, + 38705, + 30884, + 89242, + 56123, + 33764, + 32544, + 39288, + 37125, + 36949, + 44004, + 37219, + 38165, + 54877, + 39424, + 32955, + 59101, + 52327, + 35161, + 43529, + 35123, + 34679, + 40811, + 37735, + 42525, + 36017, + 39174, + 43257, + 39783, + 38398, + 36314, + 39345, + 35610, + 39039, + 38188, + 38887, + 33749, + 34950, + 40869, + 41337, + 30186, + 50417, + 47225, + 49223, + 35586, + 46977, + 42575, + 59942, + 43362, + 45423, + 43153, + 40281, + 39867, + 33614, + 34513, + 37694, + 44860, + 44588, + 44973, + 31858, + 38791, + 36749, + 44102, + 41187, + 51396, + 1119301, + 36537, + 47913, + 35770, + 45225, + 32474, + 38850, + 71217, + 30356, + 46859, + 30175, + 43443, + 33668, + 64701, + 35615, + 34967, + 33051, + 32997, + 34524, + 54224, + 42340, + 34409, + 42023, + 37247, + 37467, + 38778, + 43176, + 46465, + 44705, + 31820, + 90354, + 58619, + 46499, + 45132, + 43566, + 42042, + 39969, + 32823, + 48002, + 44156, + 35543, + 31760, + 34673, + 44157, + 39119, + 42103, + 35294, + 47118, + 41197, + 31565, + 36700, + 39082, + 74526, + 43088, + 36361, + 36421, + 37125, + 40013, + 40312, + 100290, + 47185, + 30236, + 36963, + 42879, + 37989, + 39618, + 43156, + 54428, + 35854, + 32409, + 39802, + 32575, + 33613, + 36282, + 33712, + 45007, + 84952, + 34527, + 35647, + 38179, + 39407, + 44819, + 70348, + 66089, + 57820, + 37189, + 40619, + 48899, + 37630, + 37085, + 35742, + 46405, + 59376, + 29993, + 37441, + 32265, + 48908, + 37453, + 40582, + 45514, + 81005, + 38636, + 51099, + 31924, + 35589, + 36180, + 64645, + 41270, + 32805, + 37589, + 58297, + 33423, + 32746, + 39788, + 52017, + 35711, + 36818, + 51428, + 34140, + 33944, + 37570, + 48399, + 54559, + 40087, + 58972, + 34319, + 34205, + 60384, + 56509, + 46840, + 40232, + 50895, + 37427, + 37149, + 44518, + 34387, + 44911, + 68670, + 37065, + 39590, + 32838, + 47874, + 40447, + 38953, + 42717, + 41505, + 46616, + 36233, + 32223, + 33292, + 48162, + 37451, + 45379, + 48148, + 47521, + 48849, + 42820, + 60250, + 46473, + 37802, + 47668, + 38108, + 77524, + 41955, + 36100, + 42797, + 35042, + 41505, + 39595, + 38618, + 38646, + 35699, + 49941, + 38046, + 40877, + 33626, + 37142, + 65731, + 37514, + 47462, + 36074, + 35268, + 46833, + 74297, + 32413, + 34641, + 35440, + 51870, + 34164, + 35744, + 40275, + 41992, + 43873, + 56085, + 35674, + 38427, + 40020, + 39275, + 44454, + 32958, + 36206, + 33518, + 52462, + 47172, + 35721, + 32238, + 35288, + 43752, + 40002, + 35095, + 32769, + 42078, + 49702, + 39338, + 54416, + 45260, + 38681, + 332301, + 77786, + 42780, + 38100, + 35598, + 36876, + 43868, + 40820, + 30519, + 141155, + 39119, + 43804, + 34752, + 48700, + 32444, + 36234, + 34288, + 41421, + 57260, + 32823, + 42632, + 32207, + 47145, + 37111, + 42382, + 45495, + 43172, + 44858, + 47018, + 36751, + 25536, + 37362, + 32662, + 46448, + 48737, + 41400, + 35599, + 39939, + 32950, + 29661, + 32026, + 41394, + 35267, + 42568, + 31842, + 40352, + 45305, + 32664, + 46111, + 28723, + 69657, + 44457, + 33486, + 39715, + 38420, + 33984, + 42172, + 37323, + 47012, + 56295, + 31876, + 34054, + 30832, + 54511, + 47988, + 33278, + 33405, + 37722, + 39302, + 39677, + 37881, + 35395, + 33794, + 37344, + 55885, + 42182, + 33883, + 44076, + 35156, + 72011, + 29579, + 39880, + 39040, + 38523, + 37858, + 29716, + 38299, + 56604, + 39081, + 38957, + 37480, + 38193, + 41799, + 41601, + 53036, + 42512, + 30933, + 29033, + 32801, + 39292, + 54820, + 45752, + 40900, + 64982, + 37563, + 62656, + 38125, + 35951, + 45623, + 41413, + 39339, + 50527, + 57391, + 56819, + 45282, + 29185, + 31218, + 35451, + 33541, + 33745, + 57827, + 37064, + 40773, + 45429, + 39450, + 52954, + 49894, + 45732, + 40420, + 38443, + 38146, + 51194, + 45745, + 33902, + 35218, + 35192, + 39740, + 47623, + 36888, + 30494, + 30651, + 58891, + 35178, + 36382, + 50219, + 40067, + 35464, + 48123, + 41748, + 33651, + 78947, + 28544, + 27177, + 35807, + 35031, + 28546, + 37899, + 36454, + 38584, + 31903, + 33770, + 37129, + 42781, + 37990, + 28155, + 44264, + 41941, + 52221, + 41878, + 42383, + 39798, + 37517, + 37227, + 39819, + 41384, + 30211, + 46411, + 44381, + 52727, + 51065, + 40556, + 63785, + 47609, + 36577, + 65883, + 55820, + 32778, + 44869, + 42425, + 31569, + 40516, + 48709, + 56407, + 27143, + 35501, + 33780, + 48915, + 58652, + 34966, + 32963, + 32169, + 41351, + 47689, + 41051, + 35534, + 44277, + 38259, + 55473, + 54144, + 45651, + 56654, + 40763, + 63815, + 36618, + 68514, + 38929, + 45931, + 59837, + 34805, + 46747, + 33382, + 33519, + 49855, + 32397, + 28649, + 42975, + 32394, + 39148, + 69026, + 55751, + 55885, + 51002, + 42162, + 33885, + 42172, + 41351, + 36590, + 42195, + 36923, + 43133, + 50597, + 91140, + 43032, + 48072, + 39742, + 33495, + 94526, + 36923, + 39271, + 35798, + 41137, + 42801, + 39773, + 43313, + 43877, + 32841, + 45322, + 45370, + 40330, + 32109, + 36718, + 37757, + 31489, + 33953, + 57113, + 41754, + 38438, + 34372, + 34025, + 45884, + 35212, + 49252, + 33566, + 45135, + 46222, + 45543, + 41776, + 34540, + 42834, + 30838, + 51259, + 37533, + 42543, + 33190, + 37174, + 51003, + 38274, + 33275, + 39671, + 41755, + 38418, + 33830, + 31398, + 45777, + 50768, + 42816, + 39736, + 42292, + 36474, + 67988, + 43053, + 47611, + 27537, + 44064, + 32616, + 49389, + 68110, + 55138, + 42948, + 38733, + 35057, + 41344, + 34324, + 40764, + 37878, + 44187, + 29186, + 44658, + 37113, + 40737, + 45410, + 37636, + 42826, + 38739, + 35011, + 33683, + 49020, + 38183, + 40313, + 35867, + 35632, + 35914, + 39654, + 29263, + 44849, + 55034, + 39948, + 48361, + 32382, + 30901, + 48860, + 42149, + 45478, + 42960, + 45153, + 30502, + 45997, + 43477, + 38794, + 41811, + 45701, + 42535, + 39219, + 36930, + 32546, + 38906, + 45378, + 37638, + 30280, + 51770, + 45545, + 44169, + 30287, + 39051, + 36818, + 36471, + 47520, + 47883, + 40722, + 44071, + 30591, + 71385, + 33269, + 87271, + 42482, + 50937, + 33305, + 57993, + 39260, + 42665, + 32321, + 40316, + 41901, + 64140, + 57465, + 47143, + 51458, + 38520, + 36389, + 50584, + 32290, + 46338, + 42596, + 38011, + 39241, + 41369, + 33117, + 35638, + 38269, + 36155, + 45942, + 36616, + 39013, + 51179, + 40123, + 35437, + 40555, + 33196, + 34019, + 34955, + 57563, + 28686, + 50868, + 46592, + 45389, + 34491, + 40798, + 40101, + 43277, + 60312, + 40595, + 55299, + 36732, + 34104, + 41450, + 45086, + 38540, + 41381, + 36323, + 45744, + 40586, + 39273, + 45808, + 34755, + 54821, + 33807, + 30651, + 41563, + 34459, + 39952, + 40695, + 38926, + 40186, + 41425, + 28752, + 51962, + 42778, + 36715, + 35977, + 37120, + 40829, + 35629, + 41513, + 46843, + 34804, + 38278, + 28791, + 34096, + 40439, + 32527, + 47938, + 45300, + 32610, + 36870, + 39602, + 42729, + 37465, + 49696, + 44250, + 37349, + 41755, + 59806, + 35715, + 43974, + 44807, + 59438, + 48193, + 34164, + 41143, + 49795, + 73808, + 38758, + 40037, + 39274, + 41088, + 29380, + 52423, + 31970, + 45709, + 31664, + 33630, + 41091, + 40313, + 47955, + 36780, + 38824, + 43955, + 37567, + 42865, + 34982, + 30392, + 40613, + 50617, + 35278, + 38293, + 43332, + 38032, + 38396, + 45692, + 27389, + 42351, + 58354, + 34096, + 46748, + 73731, + 36841, + 40107, + 30866, + 31267, + 52338, + 29096, + 43542, + 38841, + 36875, + 45873, + 44531, + 35675, + 40979, + 39513, + 53302, + 43102, + 37553, + 31777, + 35853, + 39498, + 59729, + 31340, + 42870, + 67529, + 43930, + 32292, + 39179, + 29578, + 39429, + 39219, + 38178, + 37393, + 40222, + 63693, + 35257, + 30236, + 65043, + 35194, + 43636, + 37672, + 47067, + 39611, + 40396, + 44457, + 51100, + 46165, + 37127, + 40412, + 59697, + 55737, + 47472, + 35695, + 41876, + 33556, + 41848, + 32483, + 28853, + 39258, + 39838, + 40617, + 31794, + 37697, + 38291, + 42506, + 26339, + 36421, + 32653, + 35716, + 38653, + 39750, + 33825, + 37066, + 40889, + 41955, + 56029, + 49297, + 43863, + 39429, + 39343, + 39451, + 44544, + 75302, + 46703, + 41300, + 53531, + 32481, + 32830, + 34913, + 41722, + 37266, + 41361, + 40466, + 32886, + 44930, + 27042, + 69428, + 39019, + 34325, + 32370, + 31742, + 44485, + 31316, + 31755, + 42830, + 36736, + 34463, + 29327, + 30247, + 36437, + 39885, + 31979, + 40890, + 37174, + 34652, + 39816, + 54450, + 42599, + 46517, + 39559, + 32102, + 31920, + 34873, + 36763, + 35246, + 45644, + 36519, + 38049, + 36792, + 46089, + 31873, + 54057, + 38648, + 31920, + 33459, + 34853, + 41882, + 36730, + 45170, + 38635, + 51978, + 37003, + 47053, + 39999, + 58545, + 36987, + 38830, + 98057, + 47746, + 53867, + 38838, + 39439, + 39430, + 38190, + 34443, + 41376, + 43859, + 34127, + 51741, + 61198, + 46000, + 45120, + 45779, + 40855, + 66640, + 64378, + 42551, + 72497, + 40083, + 39861, + 30414, + 30961, + 44418, + 31534, + 39901, + 32127, + 39386, + 58290, + 45287, + 31932, + 61692, + 65170, + 42403, + 24875, + 33868, + 36045, + 40531, + 38222, + 35087, + 36553, + 44563, + 34599, + 38706, + 49502, + 58027, + 45143, + 35697, + 33141, + 33957, + 44387, + 37495, + 35436, + 35783, + 55985, + 34864, + 91756, + 31716, + 44702, + 40967, + 35534, + 36493, + 52320, + 32877, + 37272, + 60029, + 50350, + 60158, + 41630, + 39912, + 42335, + 42374, + 35822, + 33771, + 41044, + 47634, + 41915, + 36660, + 36089, + 62143, + 49191, + 38823, + 61516, + 41644, + 35587, + 32416, + 36018, + 37132, + 43347, + 40259, + 41675, + 50416, + 68631, + 40897, + 40331, + 34121, + 39103, + 48056, + 40790, + 50815, + 44482, + 52636, + 39371, + 26092, + 28501, + 46201, + 41656, + 44911, + 37806, + 55627, + 32306, + 48234, + 46267, + 33168, + 51618, + 36251, + 33471, + 38529, + 33441, + 31398, + 34048, + 45331, + 52242, + 63589, + 43293, + 43917, + 41545, + 31158, + 33946, + 51319, + 47578, + 37371, + 47680, + 37009, + 35013, + 61337, + 43058, + 63569, + 30764, + 35045, + 45342, + 35977, + 48976, + 42130, + 32288, + 42981, + 40687, + 48454, + 55301, + 63481, + 53876, + 43466, + 36711, + 34792, + 34922, + 32877, + 36772, + 41482, + 39863, + 41011, + 39025, + 38020, + 38021, + 163928, + 30210, + 50590, + 30493, + 37556, + 50486, + 43200, + 47784, + 39446, + 29431, + 41059, + 40243, + 35733, + 31123, + 45042, + 46566, + 53294, + 49474, + 38745, + 52327, + 44030, + 37383, + 38359, + 38628, + 34425, + 48214, + 34921, + 34807, + 38346, + 30102, + 30279, + 33599, + 46035, + 34726, + 38018, + 42456, + 40043, + 49106, + 40044, + 52920, + 51663, + 47901, + 40939, + 38693, + 54650, + 34513, + 49993, + 42765, + 50666, + 58262, + 37980, + 30952, + 39491, + 42532, + 46064, + 36651, + 42265, + 39539, + 55578, + 43422, + 54542 + ] + } + ], + "default_value": 0 + }, + "null_count": 0, + "tot_col_size": 0, + "last_update_version": 419282709561213022, + "correlation": 0 + } + }, + "count": 89870864, + "modify_count": 7549652, + "partitions": null +} diff --git a/planner/core/testdata/analyze_suite_in.json b/planner/core/testdata/analyze_suite_in.json index f9be9b483896b..1187de96f090e 100644 --- a/planner/core/testdata/analyze_suite_in.json +++ b/planner/core/testdata/analyze_suite_in.json @@ -116,6 +116,12 @@ "explain select (select concat(t1.a, \",\", t1.b) from t t1 where t1.a=t.a and t1.c=t.c) from t" ] }, + { + "name": "TestLowSelIndexGreedySearch", + "cases": [ + "explain select max(e) from t where a='T3382' and b='ECO' and c='TOPIC' and d='23660fa1ace9455cb7f3ee831e14a342'" + ] + }, { "name": "TestEmptyTable", "cases": [ diff --git a/planner/core/testdata/analyze_suite_out.json b/planner/core/testdata/analyze_suite_out.json index 001454fbce6b5..86fa54e7b92e7 100644 --- a/planner/core/testdata/analyze_suite_out.json +++ b/planner/core/testdata/analyze_suite_out.json @@ -290,6 +290,22 @@ ] ] }, + { + "Name": "TestLowSelIndexGreedySearch", + "Cases": [ + { + "SQL": "explain select max(e) from t where a='T3382' and b='ECO' and c='TOPIC' and d='23660fa1ace9455cb7f3ee831e14a342'", + "Plan": [ + "StreamAgg_14 1.00 root funcs:max(test.t.e)->Column#7", + "└─TopN_17 0.00 root test.t.e:desc, offset:0, count:1", + " └─IndexLookUp_49 0.00 root ", + " ├─IndexRangeScan_46(Build) 0.00 cop[tikv] table:t, index:idx2(a, c) range:[\"T3382\" \"TOPIC\",\"T3382\" \"TOPIC\"], keep order:false", + " └─Selection_48(Probe) 0.00 cop[tikv] eq(test.t.b, \"ECO\"), eq(test.t.d, \"23660fa1ace9455cb7f3ee831e14a342\"), not(isnull(test.t.e))", + " └─TableRowIDScan_47 0.00 cop[tikv] table:t keep order:false" + ] + } + ] + }, { "Name": "TestEmptyTable", "Cases": [ diff --git a/statistics/selectivity.go b/statistics/selectivity.go index f3d4d8edc3350..8f46ce1bb17d1 100644 --- a/statistics/selectivity.go +++ b/statistics/selectivity.go @@ -393,7 +393,7 @@ func GetUsableSetsByGreedy(nodes []*StatsNode) (newBlocks []*StatsNode) { mask := int64(math.MaxInt64) for { // Choose the index that covers most. - bestID, bestCount, bestTp, bestNumCols, bestMask := -1, 0, ColType, 0, int64(0) + bestID, bestCount, bestTp, bestNumCols, bestMask, bestSel := -1, 0, ColType, 0, int64(0), float64(0) for i, set := range nodes { if marked[i] { continue @@ -413,8 +413,16 @@ func GetUsableSetsByGreedy(nodes []*StatsNode) (newBlocks []*StatsNode) { // (1): The stats type, always prefer the primary key or index. // (2): The number of expression that it covers, the more the better. // (3): The number of columns that it contains, the less the better. - if (bestTp == ColType && set.Tp != ColType) || bestCount < bits || (bestCount == bits && bestNumCols > set.numCols) { - bestID, bestCount, bestTp, bestNumCols, bestMask = i, bits, set.Tp, set.numCols, curMask + // (4): The selectivity of the covered conditions, the less the better. + // The rationale behind is that lower selectivity tends to reflect more functional dependencies + // between columns. It's hard to decide the priority of this rule against rule 2 and 3, in order + // to avoid massive plan changes between tidb-server versions, I adopt this conservative strategy + // to impose this rule after rule 2 and 3. + if (bestTp == ColType && set.Tp != ColType) || + bestCount < bits || + (bestCount == bits && bestNumCols > set.numCols) || + (bestCount == bits && bestNumCols == set.numCols && bestSel > set.Selectivity) { + bestID, bestCount, bestTp, bestNumCols, bestMask, bestSel = i, bits, set.Tp, set.numCols, curMask, set.Selectivity } } if bestCount == 0 { From 462927bf31f456b23625fc2b43417cd99a660508 Mon Sep 17 00:00:00 2001 From: 9547 Date: Tue, 22 Sep 2020 19:30:08 +0800 Subject: [PATCH 08/60] types: fix datetime lower part overflow check (#19822) --- expression/builtin_time.go | 41 +++++++++------------------------- expression/integration_test.go | 18 ++++++++++++--- types/time.go | 4 ++-- types/time_test.go | 5 +++++ 4 files changed, 33 insertions(+), 35 deletions(-) diff --git a/expression/builtin_time.go b/expression/builtin_time.go index 8518e205b468c..29541004ee5a8 100644 --- a/expression/builtin_time.go +++ b/expression/builtin_time.go @@ -2852,7 +2852,10 @@ func (du *baseDateArithmitical) add(ctx sessionctx.Context, date types.Time, int if err := handleInvalidTimeError(ctx, err); err != nil { return types.ZeroTime, true, err } + return du.addDate(ctx, date, year, month, day, nano) +} +func (du *baseDateArithmitical) addDate(ctx sessionctx.Context, date types.Time, year, month, day, nano int64) (types.Time, bool, error) { goTime, err := date.GoTime(time.Local) if err := handleInvalidTimeError(ctx, err); err != nil { return types.ZeroTime, true, err @@ -2867,6 +2870,13 @@ func (du *baseDateArithmitical) add(ctx sessionctx.Context, date types.Time, int date.SetFsp(6) } + // fix https://github.com/pingcap/tidb/issues/11329 + if goTime.Year() == 0 { + hour, minute, second := goTime.Clock() + date.SetCoreTime(types.FromDate(0, 0, 0, hour, minute, second, goTime.Nanosecond()/1000)) + return date, false, nil + } + if goTime.Year() < 0 || goTime.Year() > 9999 { return types.ZeroTime, true, handleInvalidTimeError(ctx, types.ErrDatetimeFunctionOverflow.GenWithStackByArgs("datetime")) } @@ -2911,36 +2921,7 @@ func (du *baseDateArithmitical) sub(ctx sessionctx.Context, date types.Time, int if err := handleInvalidTimeError(ctx, err); err != nil { return types.ZeroTime, true, err } - year, month, day, nano = -year, -month, -day, -nano - - goTime, err := date.GoTime(time.Local) - if err := handleInvalidTimeError(ctx, err); err != nil { - return types.ZeroTime, true, err - } - - duration := time.Duration(nano) - goTime = goTime.Add(duration) - goTime = types.AddDate(year, month, day, goTime) - - if goTime.Nanosecond() == 0 { - date.SetFsp(0) - } else { - date.SetFsp(6) - } - - if goTime.Year() < 0 || goTime.Year() > 9999 { - return types.ZeroTime, true, handleInvalidTimeError(ctx, types.ErrDatetimeFunctionOverflow.GenWithStackByArgs("datetime")) - } - - date.SetCoreTime(types.FromGoTime(goTime)) - overflow, err := types.DateTimeIsOverflow(ctx.GetSessionVars().StmtCtx, date) - if err := handleInvalidTimeError(ctx, err); err != nil { - return types.ZeroTime, true, err - } - if overflow { - return types.ZeroTime, true, handleInvalidTimeError(ctx, types.ErrDatetimeFunctionOverflow.GenWithStackByArgs("datetime")) - } - return date, false, nil + return du.addDate(ctx, date, -year, -month, -day, -nano) } func (du *baseDateArithmitical) vecGetDateFromInt(b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { diff --git a/expression/integration_test.go b/expression/integration_test.go index d43190ed2e9c2..eb6742e5582ae 100755 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -2220,10 +2220,7 @@ func (s *testIntegrationSuite) TestDatetimeOverflow(c *C) { "insert into t1 (d) select date_add('2000-01-01',interval 8000 year)", "insert into t1 (d) select date_sub('2000-01-01', INTERVAL 2001 YEAR)", "insert into t1 (d) select date_add('9999-12-31',interval 1 year)", - "insert into t1 (d) select date_sub('1000-01-01', INTERVAL 1 YEAR)", "insert into t1 (d) select date_add('9999-12-31',interval 1 day)", - "insert into t1 (d) select date_sub('1000-01-01', INTERVAL 1 day)", - "insert into t1 (d) select date_sub('1000-01-01', INTERVAL 1 second)", } for _, sql := range overflowSQLs { @@ -7366,3 +7363,18 @@ func (s *testIntegrationSuite) TestIssue17476(c *C) { tk.MustQuery(`SELECT count(*) FROM (table_float JOIN table_int_float_varchar AS tmp3 ON (tmp3.col_varchar_6 AND NULL) IS NULL);`).Check(testkit.Rows("154")) tk.MustQuery(`SELECT * FROM (table_int_float_varchar AS tmp3) WHERE (col_varchar_6 AND NULL) IS NULL AND col_int_6=0;`).Check(testkit.Rows("13 0 -0.1 ")) } + +func (s *testIntegrationSuite) TestIssue11645(c *C) { + defer s.cleanEnv(c) + tk := testkit.NewTestKit(c, s.store) + tk.MustQuery(`SELECT DATE_ADD('1000-01-01 00:00:00', INTERVAL -2 HOUR);`).Check(testkit.Rows("0999-12-31 22:00:00")) + tk.MustQuery(`SELECT DATE_ADD('1000-01-01 00:00:00', INTERVAL -200 HOUR);`).Check(testkit.Rows("0999-12-23 16:00:00")) + tk.MustQuery(`SELECT DATE_ADD('0001-01-01 00:00:00', INTERVAL -2 HOUR);`).Check(testkit.Rows("0000-00-00 22:00:00")) + tk.MustQuery(`SELECT DATE_ADD('0001-01-01 00:00:00', INTERVAL -25 HOUR);`).Check(testkit.Rows("0000-00-00 23:00:00")) + tk.MustQuery(`SELECT DATE_ADD('0001-01-01 00:00:00', INTERVAL -8784 HOUR);`).Check(testkit.Rows("0000-00-00 00:00:00")) + tk.MustQuery(`SELECT DATE_ADD('0001-01-01 00:00:00', INTERVAL -8785 HOUR);`).Check(testkit.Rows("")) + tk.MustQuery(`SELECT DATE_ADD('0001-01-02 00:00:00', INTERVAL -2 HOUR);`).Check(testkit.Rows("0001-01-01 22:00:00")) + tk.MustQuery(`SELECT DATE_ADD('0001-01-02 00:00:00', INTERVAL -24 HOUR);`).Check(testkit.Rows("0001-01-01 00:00:00")) + tk.MustQuery(`SELECT DATE_ADD('0001-01-02 00:00:00', INTERVAL -25 HOUR);`).Check(testkit.Rows("0000-00-00 23:00:00")) + tk.MustQuery(`SELECT DATE_ADD('0001-01-02 00:00:00', INTERVAL -8785 HOUR);`).Check(testkit.Rows("0000-00-00 23:00:00")) +} diff --git a/types/time.go b/types/time.go index 1be95d49b5a73..14c6aaac82945 100644 --- a/types/time.go +++ b/types/time.go @@ -131,8 +131,8 @@ var ( ) var ( - // MinDatetime is the minimum for mysql datetime type. - MinDatetime = FromDate(1000, 1, 1, 0, 0, 0, 0) + // MinDatetime is the minimum for Golang Time type. + MinDatetime = FromDate(1, 1, 1, 0, 0, 0, 0) // MaxDatetime is the maximum for mysql datetime type. MaxDatetime = FromDate(9999, 12, 31, 23, 59, 59, 999999) diff --git a/types/time_test.go b/types/time_test.go index 063a7fdf05b18..7f74dc01ba0de 100644 --- a/types/time_test.go +++ b/types/time_test.go @@ -1686,6 +1686,11 @@ func (s *testTimeSuite) TestTimeOverflow(c *C) { {"2018.01.01", false}, {"2018.01.01 00:00:00", false}, {"2018/01/01-00:00:00", false}, + {"0999-12-31 22:00:00", false}, + {"9999-12-31 23:59:59", false}, + {"0001-01-01 00:00:00", false}, + {"0001-01-01 23:59:59", false}, + {"0000-01-01 00:00:00", true}, } for _, test := range table { From fd0299f58ecc174e5ed8f91660299ebac8fa2b9c Mon Sep 17 00:00:00 2001 From: wjHuang Date: Wed, 23 Sep 2020 12:17:53 +0800 Subject: [PATCH 09/60] *: remove simple rewriter (#19828) --- cmd/explaintest/r/explain_easy.result | 4 +- cmd/explaintest/r/explain_easy_stats.result | 2 +- ddl/db_test.go | 6 +- executor/analyze_test.go | 4 +- expression/integration_test.go | 4 +- expression/simple_rewriter.go | 517 +------------------- expression/simple_rewriter_test.go | 173 ------- planner/core/expression_rewriter.go | 1 + planner/core/integration_test.go | 18 +- planner/core/planbuilder.go | 2 + planner/core/point_get_plan_test.go | 6 +- planner/core/testdata/plan_suite_out.json | 96 ++-- 12 files changed, 81 insertions(+), 752 deletions(-) delete mode 100644 expression/simple_rewriter_test.go diff --git a/cmd/explaintest/r/explain_easy.result b/cmd/explaintest/r/explain_easy.result index 8113639151915..6f954211f94d0 100644 --- a/cmd/explaintest/r/explain_easy.result +++ b/cmd/explaintest/r/explain_easy.result @@ -53,7 +53,7 @@ HashJoin_23 4166.67 root left outer join, equal:[eq(test.t1.c2, test.t2.c1)] └─TableFullScan_34 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo explain update t1 set t1.c2 = 2 where t1.c1 = 1; id estRows task access object operator info -Update_2 N/A root N/A +Update_3 N/A root N/A └─Point_Get_1 1.00 root table:t1 handle:1 explain delete from t1 where t1.c2 = 1; id estRows task access object operator info @@ -687,7 +687,7 @@ begin; insert into t values (1, 1); explain update t set j = -j where i = 1 and j = 1; id estRows task access object operator info -Update_2 N/A root N/A +Update_3 N/A root N/A └─Point_Get_1 1.00 root table:t, index:i(i, j) rollback; drop table if exists t; diff --git a/cmd/explaintest/r/explain_easy_stats.result b/cmd/explaintest/r/explain_easy_stats.result index fd40354ca817e..eae0be5ab8b5d 100644 --- a/cmd/explaintest/r/explain_easy_stats.result +++ b/cmd/explaintest/r/explain_easy_stats.result @@ -54,7 +54,7 @@ HashJoin_22 2481.25 root left outer join, equal:[eq(test.t1.c2, test.t2.c1)] └─TableRangeScan_32 1998.00 cop[tikv] table:t1 range:(1,+inf], keep order:false explain update t1 set t1.c2 = 2 where t1.c1 = 1; id estRows task access object operator info -Update_2 N/A root N/A +Update_3 N/A root N/A └─Point_Get_1 1.00 root table:t1 handle:1 explain delete from t1 where t1.c2 = 1; id estRows task access object operator info diff --git a/ddl/db_test.go b/ddl/db_test.go index 135f8bd274d84..edfc21a957b0b 100644 --- a/ddl/db_test.go +++ b/ddl/db_test.go @@ -2235,7 +2235,8 @@ func (s *testDBSuite6) TestDropColumn(c *C) { tk.MustExec("create table t1 (a int,b int) partition by hash(a) partitions 4;") _, err := tk.Exec("alter table t1 drop column a") c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[expression:1054]Unknown column 'a' in 'expression'") + // TODO: refine the error message to compatible with MySQL + c.Assert(err.Error(), Equals, "[planner:1054]Unknown column 'a' in 'expression'") tk.MustExec("drop database drop_col_db") } @@ -5071,7 +5072,8 @@ func (s *testDBSuite2) TestDDLWithInvalidTableInfo(c *C) { // Test drop partition column. _, err = tk.Exec("alter table t drop column a;") c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[expression:1054]Unknown column 'a' in 'expression'") + // TODO: refine the error message to compatible with MySQL + c.Assert(err.Error(), Equals, "[planner:1054]Unknown column 'a' in 'expression'") // Test modify column with invalid expression. _, err = tk.Exec("alter table t modify column c int GENERATED ALWAYS AS ((case when (a = 0) then 0when (a > 0) then (b / a) end));") c.Assert(err, NotNil) diff --git a/executor/analyze_test.go b/executor/analyze_test.go index cbd2b2d50b324..7642122a03c48 100644 --- a/executor/analyze_test.go +++ b/executor/analyze_test.go @@ -391,8 +391,8 @@ func (s *testFastAnalyze) TestFastAnalyze(c *C) { tk.MustExec(`insert into t3 values(1, 1), (2, 2), (5, 1), (9, 3), (13, 3), (17, 5), (3, 0)`) tk.MustExec(`analyze table t3`) tk.MustQuery(`explain select v from t3 partition(p1) where v = 3`).Check(testkit.Rows( - "IndexReader_7 2.00 root index:IndexRangeScan_6", - "└─IndexRangeScan_6 2.00 cop[tikv] table:t3, partition:p1, index:k(v) range:[3,3], keep order:false", + "IndexReader_8 2.00 root index:IndexRangeScan_7", + "└─IndexRangeScan_7 2.00 cop[tikv] table:t3, partition:p1, index:k(v) range:[3,3], keep order:false", )) tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.DynamicOnly) + `'`) } diff --git a/expression/integration_test.go b/expression/integration_test.go index eb6742e5582ae..54fed7610f487 100755 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -7335,10 +7335,10 @@ func (s *testIntegrationSuite) TestIssue19596(c *C) { tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("create table t (a int) partition by range(a) (PARTITION p0 VALUES LESS THAN (10));") - tk.MustGetErrMsg("alter table t add partition (partition p1 values less than (a));", "[expression:1054]Unknown column 'a' in 'expression'") + tk.MustGetErrMsg("alter table t add partition (partition p1 values less than (a));", "[planner:1054]Unknown column 'a' in 'expression'") tk.MustQuery("select * from t;") tk.MustExec("drop table if exists t;") - tk.MustGetErrMsg("create table t (a int) partition by range(a) (PARTITION p0 VALUES LESS THAN (a));", "[expression:1054]Unknown column 'a' in 'expression'") + tk.MustGetErrMsg("create table t (a int) partition by range(a) (PARTITION p0 VALUES LESS THAN (a));", "[planner:1054]Unknown column 'a' in 'expression'") } func (s *testIntegrationSuite) TestIssue17476(c *C) { diff --git a/expression/simple_rewriter.go b/expression/simple_rewriter.go index ff72b02658b62..37a1a5c940f07 100644 --- a/expression/simple_rewriter.go +++ b/expression/simple_rewriter.go @@ -19,26 +19,12 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/parser" "github.com/pingcap/parser/ast" - "github.com/pingcap/parser/charset" "github.com/pingcap/parser/model" - "github.com/pingcap/parser/mysql" - "github.com/pingcap/parser/opcode" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" - driver "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/collate" ) -type simpleRewriter struct { - exprStack - - schema *Schema - err error - ctx sessionctx.Context - names []*types.FieldName -} - // ParseSimpleExprWithTableInfo parses simple expression string to Expression. // The expression string must only reference the column in table Info. func ParseSimpleExprWithTableInfo(ctx sessionctx.Context, exprStr string, tableInfo *model.TableInfo) (Expression, error) { @@ -82,36 +68,11 @@ func RewriteSimpleExprWithTableInfo(ctx sessionctx.Context, tbl *model.TableInfo if err != nil { return nil, err } - rewriter := &simpleRewriter{ctx: ctx, schema: NewSchema(columns...), names: names} - expr.Accept(rewriter) - if rewriter.err != nil { - return nil, rewriter.err - } - return rewriter.pop(), nil -} - -// ParseSimpleExprsWithSchema parses simple expression string to Expression. -// The expression string must only reference the column in the given schema. -func ParseSimpleExprsWithSchema(ctx sessionctx.Context, exprStr string, schema *Schema) ([]Expression, error) { - exprStr = "select " + exprStr - stmts, warns, err := parser.New().Parse(exprStr, "", "") + e, err := RewriteAstExpr(ctx, expr, NewSchema(columns...), names) if err != nil { - return nil, util.SyntaxWarn(err) - } - for _, warn := range warns { - ctx.GetSessionVars().StmtCtx.AppendWarning(util.SyntaxWarn(warn)) - } - - fields := stmts[0].(*ast.SelectStmt).Fields.Fields - exprs := make([]Expression, 0, len(fields)) - for _, field := range fields { - expr, err := RewriteSimpleExprWithSchema(ctx, field.Expr, schema) - if err != nil { - return nil, err - } - exprs = append(exprs, expr) + return nil, err } - return exprs, nil + return e, nil } // ParseSimpleExprsWithNames parses simple expression string to Expression. @@ -149,22 +110,11 @@ func ParseSimpleExprsWithNames(ctx sessionctx.Context, exprStr string, schema *S // RewriteSimpleExprWithNames rewrites simple ast.ExprNode to expression.Expression. func RewriteSimpleExprWithNames(ctx sessionctx.Context, expr ast.ExprNode, schema *Schema, names []*types.FieldName) (Expression, error) { - rewriter := &simpleRewriter{ctx: ctx, schema: schema, names: names} - expr.Accept(rewriter) - if rewriter.err != nil { - return nil, rewriter.err - } - return rewriter.pop(), nil -} - -// RewriteSimpleExprWithSchema rewrites simple ast.ExprNode to expression.Expression. -func RewriteSimpleExprWithSchema(ctx sessionctx.Context, expr ast.ExprNode, schema *Schema) (Expression, error) { - rewriter := &simpleRewriter{ctx: ctx, schema: schema} - expr.Accept(rewriter) - if rewriter.err != nil { - return nil, rewriter.err + e, err := RewriteAstExpr(ctx, expr, schema, names) + if err != nil { + return nil, err } - return rewriter.pop(), nil + return e, nil } // FindFieldName finds the column name from NameSlice. @@ -194,456 +144,3 @@ func FindFieldNameIdxByColName(names []*types.FieldName, colName string) int { } return -1 } - -func (sr *simpleRewriter) rewriteColumn(nodeColName *ast.ColumnNameExpr) (*Column, error) { - idx, err := FindFieldName(sr.names, nodeColName.Name) - if idx >= 0 && err == nil { - return sr.schema.Columns[idx], nil - } - return nil, errBadField.GenWithStackByArgs(nodeColName.Name.Name.O, "expression") -} - -func (sr *simpleRewriter) Enter(inNode ast.Node) (ast.Node, bool) { - return inNode, false -} - -func (sr *simpleRewriter) Leave(originInNode ast.Node) (retNode ast.Node, ok bool) { - switch v := originInNode.(type) { - case *ast.ColumnNameExpr: - column, err := sr.rewriteColumn(v) - if err != nil { - sr.err = err - return originInNode, false - } - sr.push(column) - case *driver.ValueExpr: - value := &Constant{Value: v.Datum, RetType: &v.Type} - sr.push(value) - case *ast.FuncCallExpr: - sr.funcCallToExpression(v) - case *ast.FuncCastExpr: - arg := sr.pop() - sr.err = CheckArgsNotMultiColumnRow(arg) - if sr.err != nil { - return retNode, false - } - sr.push(BuildCastFunction(sr.ctx, arg, v.Tp)) - case *ast.BinaryOperationExpr: - sr.binaryOpToExpression(v) - case *ast.UnaryOperationExpr: - sr.unaryOpToExpression(v) - case *ast.BetweenExpr: - sr.betweenToExpression(v) - case *ast.IsNullExpr: - sr.isNullToExpression(v) - case *ast.IsTruthExpr: - sr.isTrueToScalarFunc(v) - case *ast.PatternLikeExpr: - sr.likeToScalarFunc(v) - case *ast.PatternRegexpExpr: - sr.regexpToScalarFunc(v) - case *ast.PatternInExpr: - if v.Sel == nil { - sr.inToExpression(len(v.List), v.Not, &v.Type) - } - case *driver.ParamMarkerExpr: - var value Expression - value, sr.err = ParamMarkerExpression(sr.ctx, v) - if sr.err != nil { - return retNode, false - } - sr.push(value) - case *ast.RowExpr: - sr.rowToScalarFunc(v) - case *ast.ParenthesesExpr: - case *ast.ColumnName: - // TODO: Perhaps we don't need to transcode these back to generic integers/strings - case *ast.TrimDirectionExpr: - sr.push(&Constant{ - Value: types.NewIntDatum(int64(v.Direction)), - RetType: types.NewFieldType(mysql.TypeTiny), - }) - case *ast.TimeUnitExpr: - sr.push(&Constant{ - Value: types.NewStringDatum(v.Unit.String()), - RetType: types.NewFieldType(mysql.TypeVarchar), - }) - case *ast.GetFormatSelectorExpr: - sr.push(&Constant{ - Value: types.NewStringDatum(v.Selector.String()), - RetType: types.NewFieldType(mysql.TypeVarchar), - }) - case *ast.SetCollationExpr: - arg := sr.stack[len(sr.stack)-1] - if collate.NewCollationEnabled() { - var collInfo *charset.Collation - // TODO(bb7133): use charset.ValidCharsetAndCollation when its bug is fixed. - if collInfo, sr.err = collate.GetCollationByName(v.Collate); sr.err != nil { - break - } - chs := arg.GetType().Charset - if chs != "" && collInfo.CharsetName != chs { - sr.err = charset.ErrCollationCharsetMismatch.GenWithStackByArgs(collInfo.Name, chs) - break - } - } - // SetCollationExpr sets the collation explicitly, even when the evaluation type of the expression is non-string. - if _, ok := arg.(*Column); ok { - // Wrap a cast here to avoid changing the original FieldType of the column expression. - exprType := arg.GetType().Clone() - exprType.Collate = v.Collate - casted := BuildCastFunction(sr.ctx, arg, exprType) - sr.pop() - sr.push(casted) - } else { - // For constant and scalar function, we can set its collate directly. - arg.GetType().Collate = v.Collate - } - sr.stack[len(sr.stack)-1].SetCoercibility(CoercibilityExplicit) - sr.stack[len(sr.stack)-1].SetCharsetAndCollation(arg.GetType().Charset, arg.GetType().Collate) - default: - sr.err = errors.Errorf("UnknownType: %T", v) - return retNode, false - } - if sr.err != nil { - return retNode, false - } - return originInNode, true -} - -func (sr *simpleRewriter) useCache() bool { - return sr.ctx.GetSessionVars().StmtCtx.UseCache -} - -func (sr *simpleRewriter) binaryOpToExpression(v *ast.BinaryOperationExpr) { - right := sr.pop() - left := sr.pop() - var function Expression - switch v.Op { - case opcode.EQ, opcode.NE, opcode.NullEQ, opcode.GT, opcode.GE, opcode.LT, opcode.LE: - function, sr.err = sr.constructBinaryOpFunction(left, right, - v.Op.String()) - default: - lLen := GetRowLen(left) - rLen := GetRowLen(right) - if lLen != 1 || rLen != 1 { - sr.err = ErrOperandColumns.GenWithStackByArgs(1) - return - } - function, sr.err = NewFunction(sr.ctx, v.Op.String(), types.NewFieldType(mysql.TypeUnspecified), left, right) - } - if sr.err != nil { - return - } - sr.push(function) -} - -func (sr *simpleRewriter) funcCallToExpression(v *ast.FuncCallExpr) { - args := sr.popN(len(v.Args)) - sr.err = CheckArgsNotMultiColumnRow(args...) - if sr.err != nil { - return - } - if sr.rewriteFuncCall(v, args) { - return - } - var function Expression - function, sr.err = NewFunction(sr.ctx, v.FnName.L, &v.Type, args...) - sr.push(function) -} - -func (sr *simpleRewriter) rewriteFuncCall(v *ast.FuncCallExpr, args []Expression) bool { - switch v.FnName.L { - case ast.Nullif: - if len(args) != 2 { - sr.err = ErrIncorrectParameterCount.GenWithStackByArgs(v.FnName.O) - return true - } - param2 := args[1] - param1 := args[0] - // param1 = param2 - funcCompare, err := sr.constructBinaryOpFunction(param1, param2, ast.EQ) - if err != nil { - sr.err = err - return true - } - // NULL - nullTp := types.NewFieldType(mysql.TypeNull) - nullTp.Flen, nullTp.Decimal = mysql.GetDefaultFieldLengthAndDecimal(mysql.TypeNull) - paramNull := &Constant{ - Value: types.NewDatum(nil), - RetType: nullTp, - } - // if(param1 = param2, NULL, param1) - funcIf, err := NewFunction(sr.ctx, ast.If, &v.Type, funcCompare, paramNull, param1) - if err != nil { - sr.err = err - return true - } - sr.push(funcIf) - return true - default: - return false - } -} - -// constructBinaryOpFunction works as following: -// 1. If op are EQ or NE or NullEQ, constructBinaryOpFunctions converts (a0,a1,a2) op (b0,b1,b2) to (a0 op b0) and (a1 op b1) and (a2 op b2) -// 2. If op are LE or GE, constructBinaryOpFunctions converts (a0,a1,a2) op (b0,b1,b2) to -// `IF( (a0 op b0) EQ 0, 0, -// IF ( (a1 op b1) EQ 0, 0, a2 op b2))` -// 3. If op are LT or GT, constructBinaryOpFunctions converts (a0,a1,a2) op (b0,b1,b2) to -// `IF( a0 NE b0, a0 op b0, -// IF( a1 NE b1, -// a1 op b1, -// a2 op b2) -// )` -func (sr *simpleRewriter) constructBinaryOpFunction(l Expression, r Expression, op string) (Expression, error) { - lLen, rLen := GetRowLen(l), GetRowLen(r) - if lLen == 1 && rLen == 1 { - return NewFunction(sr.ctx, op, types.NewFieldType(mysql.TypeTiny), l, r) - } else if rLen != lLen { - return nil, ErrOperandColumns.GenWithStackByArgs(lLen) - } - switch op { - case ast.EQ, ast.NE, ast.NullEQ: - funcs := make([]Expression, lLen) - for i := 0; i < lLen; i++ { - var err error - funcs[i], err = sr.constructBinaryOpFunction(GetFuncArg(l, i), GetFuncArg(r, i), op) - if err != nil { - return nil, err - } - } - if op == ast.NE { - return ComposeDNFCondition(sr.ctx, funcs...), nil - } - return ComposeCNFCondition(sr.ctx, funcs...), nil - default: - larg0, rarg0 := GetFuncArg(l, 0), GetFuncArg(r, 0) - var expr1, expr2, expr3 Expression - if op == ast.LE || op == ast.GE { - expr1 = NewFunctionInternal(sr.ctx, op, types.NewFieldType(mysql.TypeTiny), larg0, rarg0) - expr1 = NewFunctionInternal(sr.ctx, ast.EQ, types.NewFieldType(mysql.TypeTiny), expr1, NewZero()) - expr2 = NewZero() - } else if op == ast.LT || op == ast.GT { - expr1 = NewFunctionInternal(sr.ctx, ast.NE, types.NewFieldType(mysql.TypeTiny), larg0, rarg0) - expr2 = NewFunctionInternal(sr.ctx, op, types.NewFieldType(mysql.TypeTiny), larg0, rarg0) - } - var err error - l, err = PopRowFirstArg(sr.ctx, l) - if err != nil { - return nil, err - } - r, err = PopRowFirstArg(sr.ctx, r) - if err != nil { - return nil, err - } - expr3, err = sr.constructBinaryOpFunction(l, r, op) - if err != nil { - return nil, err - } - return NewFunction(sr.ctx, ast.If, types.NewFieldType(mysql.TypeTiny), expr1, expr2, expr3) - } -} - -func (sr *simpleRewriter) unaryOpToExpression(v *ast.UnaryOperationExpr) { - var op string - switch v.Op { - case opcode.Plus: - // expression (+ a) is equal to a - return - case opcode.Minus: - op = ast.UnaryMinus - case opcode.BitNeg: - op = ast.BitNeg - case opcode.Not: - op = ast.UnaryNot - default: - sr.err = errors.Errorf("Unknown Unary Op %T", v.Op) - return - } - expr := sr.pop() - if GetRowLen(expr) != 1 { - sr.err = ErrOperandColumns.GenWithStackByArgs(1) - return - } - newExpr, err := NewFunction(sr.ctx, op, &v.Type, expr) - sr.err = err - sr.push(newExpr) -} - -func (sr *simpleRewriter) likeToScalarFunc(v *ast.PatternLikeExpr) { - pattern := sr.pop() - expr := sr.pop() - sr.err = CheckArgsNotMultiColumnRow(expr, pattern) - if sr.err != nil { - return - } - escapeTp := &types.FieldType{} - char, col := sr.ctx.GetSessionVars().GetCharsetInfo() - types.DefaultTypeForValue(int(v.Escape), escapeTp, char, col) - function := sr.notToExpression(v.Not, ast.Like, &v.Type, - expr, pattern, &Constant{Value: types.NewIntDatum(int64(v.Escape)), RetType: escapeTp}) - sr.push(function) -} - -func (sr *simpleRewriter) regexpToScalarFunc(v *ast.PatternRegexpExpr) { - parttern := sr.pop() - expr := sr.pop() - sr.err = CheckArgsNotMultiColumnRow(expr, parttern) - if sr.err != nil { - return - } - function := sr.notToExpression(v.Not, ast.Regexp, &v.Type, expr, parttern) - sr.push(function) -} - -func (sr *simpleRewriter) rowToScalarFunc(v *ast.RowExpr) { - elems := sr.popN(len(v.Values)) - function, err := NewFunction(sr.ctx, ast.RowFunc, elems[0].GetType(), elems...) - if err != nil { - sr.err = err - return - } - sr.push(function) -} - -func (sr *simpleRewriter) betweenToExpression(v *ast.BetweenExpr) { - right := sr.pop() - left := sr.pop() - expr := sr.pop() - sr.err = CheckArgsNotMultiColumnRow(expr) - if sr.err != nil { - return - } - var l, r Expression - l, sr.err = NewFunction(sr.ctx, ast.GE, &v.Type, expr, left) - if sr.err == nil { - r, sr.err = NewFunction(sr.ctx, ast.LE, &v.Type, expr, right) - } - if sr.err != nil { - return - } - function, err := NewFunction(sr.ctx, ast.LogicAnd, &v.Type, l, r) - if err != nil { - sr.err = err - return - } - if v.Not { - function, err = NewFunction(sr.ctx, ast.UnaryNot, &v.Type, function) - if err != nil { - sr.err = err - return - } - } - sr.push(function) -} - -func (sr *simpleRewriter) isNullToExpression(v *ast.IsNullExpr) { - arg := sr.pop() - if GetRowLen(arg) != 1 { - sr.err = ErrOperandColumns.GenWithStackByArgs(1) - return - } - function := sr.notToExpression(v.Not, ast.IsNull, &v.Type, arg) - sr.push(function) -} - -func (sr *simpleRewriter) notToExpression(hasNot bool, op string, tp *types.FieldType, - args ...Expression) Expression { - opFunc, err := NewFunction(sr.ctx, op, tp, args...) - if err != nil { - sr.err = err - return nil - } - if !hasNot { - return opFunc - } - - opFunc, err = NewFunction(sr.ctx, ast.UnaryNot, tp, opFunc) - if err != nil { - sr.err = err - return nil - } - return opFunc -} - -func (sr *simpleRewriter) isTrueToScalarFunc(v *ast.IsTruthExpr) { - arg := sr.pop() - op := ast.IsTruthWithoutNull - if v.True == 0 { - op = ast.IsFalsity - } - if GetRowLen(arg) != 1 { - sr.err = ErrOperandColumns.GenWithStackByArgs(1) - return - } - function := sr.notToExpression(v.Not, op, &v.Type, arg) - sr.push(function) -} - -// inToExpression converts in expression to a scalar function. The argument lLen means the length of in list. -// The argument not means if the expression is not in. The tp stands for the expression type, which is always bool. -// a in (b, c, d) will be rewritten as `(a = b) or (a = c) or (a = d)`. -func (sr *simpleRewriter) inToExpression(lLen int, not bool, tp *types.FieldType) { - exprs := sr.popN(lLen + 1) - leftExpr := exprs[0] - elems := exprs[1:] - l, leftFt := GetRowLen(leftExpr), leftExpr.GetType() - for i := 0; i < lLen; i++ { - if l != GetRowLen(elems[i]) { - sr.err = ErrOperandColumns.GenWithStackByArgs(l) - return - } - } - leftIsNull := leftFt.Tp == mysql.TypeNull - if leftIsNull { - sr.push(NewNull()) - return - } - leftEt := leftFt.EvalType() - - if leftEt == types.ETInt { - for i := 0; i < len(elems); i++ { - if c, ok := elems[i].(*Constant); ok { - var isExceptional bool - elems[i], isExceptional = RefineComparedConstant(sr.ctx, *leftFt, c, opcode.EQ) - if isExceptional { - elems[i] = c - } - } - } - } - allSameType := true - for _, elem := range elems { - if elem.GetType().Tp != mysql.TypeNull && GetAccurateCmpType(leftExpr, elem) != leftEt { - allSameType = false - break - } - } - var function Expression - if allSameType && l == 1 { - function = sr.notToExpression(not, ast.In, tp, exprs...) - } else { - eqFunctions := make([]Expression, 0, lLen) - for i := 0; i < len(elems); i++ { - expr, err := sr.constructBinaryOpFunction(leftExpr, elems[i], ast.EQ) - if err != nil { - sr.err = err - return - } - eqFunctions = append(eqFunctions, expr) - } - function = ComposeDNFCondition(sr.ctx, eqFunctions...) - if not { - var err error - function, err = NewFunction(sr.ctx, ast.UnaryNot, tp, function) - if err != nil { - sr.err = err - return - } - } - } - sr.push(function) -} diff --git a/expression/simple_rewriter_test.go b/expression/simple_rewriter_test.go deleted file mode 100644 index b08b139005831..0000000000000 --- a/expression/simple_rewriter_test.go +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright 2019 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package expression - -import ( - . "github.com/pingcap/check" - "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/mock" -) - -func (s *testEvaluatorSuite) TestSimpleRewriter(c *C) { - ctx := mock.NewContext() - sch := NewSchema() - _, err := ParseSimpleExprsWithSchema(ctx, "NULLIF(1, 2, 3)", sch) - c.Assert(err, NotNil) - - exprs, err := ParseSimpleExprsWithSchema(ctx, "NULLIF(1, 2)", sch) - c.Assert(err, IsNil) - num, _, _ := exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "NULLIF(1, 1)", sch) - c.Assert(err, IsNil) - _, isNull, _ := exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(isNull, IsTrue) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "+1", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "-1", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(-1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "'abc' like '%b%'", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "'abcdef' REGEXP '.*cd.*'", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "(1, 1) = (1, 1)", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "5 between 1 and 10", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "1 not between 5 and 10", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "1 is true", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "0 is not true", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "1 in (1, 2, 3)", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - _, err = ParseSimpleExprsWithSchema(ctx, "1 in ()", sch) - c.Assert(err, NotNil) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "1 in (1, 1, 1, 1)", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "(1, 2) in ((1, 2), (2, 2))", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "(1, 2) not in ((2, 2))", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "1 < 2", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "1 <= 2", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "2 >= 1", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "2 > 1", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "(1, 2) < (1, 3)", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "(1, 2) <= (1, 3)", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "(1, 3) > (1, 2)", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "(1, 3) >= (1, 2)", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - _, err = ParseSimpleExprsWithSchema(ctx, "abs(?)", sch) - c.Assert(err, IsNil) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "cast('1' as unsigned)", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "trim(leading 'z' from 'zxyz')", sch) - c.Assert(err, IsNil) - str, _, _ := exprs[0].EvalString(ctx, chunk.Row{}) - c.Assert(str, Equals, "xyz") - - exprs, err = ParseSimpleExprsWithSchema(ctx, "get_format(datetime, 'ISO')", sch) - c.Assert(err, IsNil) - str, _, _ = exprs[0].EvalString(ctx, chunk.Row{}) - c.Assert(str, Equals, "%Y-%m-%d %H:%i:%s") - - exprs, err = ParseSimpleExprsWithSchema(ctx, "extract(day_minute from '2184-07-03 18:42:18.895059')", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(31842)) - - exprs, err = ParseSimpleExprsWithSchema(ctx, "unix_timestamp('2008-05-01 00:00:00')", sch) - c.Assert(err, IsNil) - num, _, _ = exprs[0].EvalInt(ctx, chunk.Row{}) - c.Assert(num, Equals, int64(1209571200)) -} diff --git a/planner/core/expression_rewriter.go b/planner/core/expression_rewriter.go index 6d45450ce2bfb..90a8fb42b45fd 100644 --- a/planner/core/expression_rewriter.go +++ b/planner/core/expression_rewriter.go @@ -65,6 +65,7 @@ func rewriteAstExpr(sctx sessionctx.Context, expr ast.ExprNode, schema *expressi fakePlan.schema = schema fakePlan.names = names } + b.curClause = expressionClause newExpr, _, err := b.rewrite(context.TODO(), expr, fakePlan, nil, true) if err != nil { return nil, err diff --git a/planner/core/integration_test.go b/planner/core/integration_test.go index e65a42f0db72a..35b701e9a2a04 100644 --- a/planner/core/integration_test.go +++ b/planner/core/integration_test.go @@ -977,15 +977,15 @@ func (s *testIntegrationSuite) TestApproxCountDistinctInPartitionTable(c *C) { tk.MustExec("insert into t values(1, 1), (2, 1), (3, 1), (4, 2), (4, 2)") tk.MustExec("set session tidb_opt_agg_push_down=1") tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) - tk.MustQuery("explain select approx_count_distinct(a), b from t group by b order by b desc").Check(testkit.Rows("Sort_11 16000.00 root test.t.b:desc", - "└─HashAgg_16 16000.00 root group by:test.t.b, funcs:approx_count_distinct(Column#5)->Column#4, funcs:firstrow(Column#6)->test.t.b", - " └─PartitionUnion_17 16000.00 root ", - " ├─HashAgg_18 8000.00 root group by:test.t.b, funcs:approx_count_distinct(test.t.a)->Column#5, funcs:firstrow(test.t.b)->Column#6, funcs:firstrow(test.t.b)->test.t.b", - " │ └─TableReader_22 10000.00 root data:TableFullScan_21", - " │ └─TableFullScan_21 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", - " └─HashAgg_25 8000.00 root group by:test.t.b, funcs:approx_count_distinct(test.t.a)->Column#5, funcs:firstrow(test.t.b)->Column#6, funcs:firstrow(test.t.b)->test.t.b", - " └─TableReader_29 10000.00 root data:TableFullScan_28", - " └─TableFullScan_28 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo")) + tk.MustQuery("explain select approx_count_distinct(a), b from t group by b order by b desc").Check(testkit.Rows("Sort_12 16000.00 root test.t.b:desc", + "└─HashAgg_17 16000.00 root group by:test.t.b, funcs:approx_count_distinct(Column#5)->Column#4, funcs:firstrow(Column#6)->test.t.b", + " └─PartitionUnion_18 16000.00 root ", + " ├─HashAgg_19 8000.00 root group by:test.t.b, funcs:approx_count_distinct(test.t.a)->Column#5, funcs:firstrow(test.t.b)->Column#6, funcs:firstrow(test.t.b)->test.t.b", + " │ └─TableReader_23 10000.00 root data:TableFullScan_22", + " │ └─TableFullScan_22 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", + " └─HashAgg_26 8000.00 root group by:test.t.b, funcs:approx_count_distinct(test.t.a)->Column#5, funcs:firstrow(test.t.b)->Column#6, funcs:firstrow(test.t.b)->test.t.b", + " └─TableReader_30 10000.00 root data:TableFullScan_29", + " └─TableFullScan_29 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo")) tk.MustQuery("select approx_count_distinct(a), b from t group by b order by b desc").Check(testkit.Rows("1 2", "3 1")) } diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index 0b49cd9a3632c..bd1da15fa66e0 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -370,6 +370,7 @@ const ( groupByClause showStatement globalOrderByClause + expressionClause ) var clauseMsg = map[clauseCode]string{ @@ -382,6 +383,7 @@ var clauseMsg = map[clauseCode]string{ groupByClause: "group statement", showStatement: "show statement", globalOrderByClause: "global ORDER clause", + expressionClause: "expression", } type capFlagType = uint64 diff --git a/planner/core/point_get_plan_test.go b/planner/core/point_get_plan_test.go index a3ed71f471e18..fa89750f81ffc 100644 --- a/planner/core/point_get_plan_test.go +++ b/planner/core/point_get_plan_test.go @@ -83,7 +83,7 @@ func (s *testPointGetSuite) TestPointGetPlanCache(c *C) { "Point_Get_1 1.00 root table:t handle:1", )) tk.MustQuery("explain update t set b=b+1, c=c+1 where a = 1").Check(testkit.Rows( - "Update_2 N/A root N/A", + "Update_4 N/A root N/A", "└─Point_Get_1 1.00 root table:t handle:1", )) tk.MustQuery("explain delete from t where a = 1").Check(testkit.Rows( @@ -397,7 +397,7 @@ func (s *testPointGetSuite) TestBatchPointGetPartition(c *C) { tk.MustQuery("select * from t where a in (1, 2, 3, 4)").Check(testkit.Rows("1 1", "2 2", "3 3", "4 4")) tk.MustQuery("explain update t set b = b + 1 where a in (1, 2, 3, 4)").Check(testkit.Rows( - "Update_2 N/A root N/A]\n[└─Batch_Point_Get_1 4.00 root table:t handle:[1 2 3 4], keep order:false, desc:false", + "Update_3 N/A root N/A]\n[└─Batch_Point_Get_1 4.00 root table:t handle:[1 2 3 4], keep order:false, desc:false", )) tk.MustExec("update t set b = b + 1 where a in (1, 2, 3, 4)") tk.MustQuery("select * from t where a in (1, 2, 3, 4)").Check(testkit.Rows("1 2", "2 3", "3 4", "4 5")) @@ -418,7 +418,7 @@ func (s *testPointGetSuite) TestBatchPointGetPartition(c *C) { Check(testkit.Rows("1 1 1", "2 2 2", "3 3 3", "4 4 4")) tk.MustQuery("explain update t set c = c + 1 where (a,b) in ((1,1),(2,2),(3,3),(4,4))").Check(testkit.Rows( - "Update_2 N/A root N/A]\n[└─Batch_Point_Get_1 4.00 root table:t, clustered index:PRIMARY(a, b) keep order:false, desc:false", + "Update_3 N/A root N/A]\n[└─Batch_Point_Get_1 4.00 root table:t, clustered index:PRIMARY(a, b) keep order:false, desc:false", )) tk.MustExec("update t set c = c + 1 where (a,b) in ((1,1),(2,2),(3,3),(4,4))") tk.MustQuery("select * from t where (a, b) in ((1, 1), (2, 2), (3, 3), (4, 4))").Sort(). diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index aee89aceb05db..acf3a9c160267 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1366,21 +1366,21 @@ "explain select /*+ TIDB_INLJ(t2) */ * from tt t1, tt t2 where t1.a = t2.a" ], "Plan": [ - "HashJoin_19 25000.00 root inner join, equal:[eq(test.tt.a, test.tt.a)]", - "├─PartitionUnion_28(Build) 20000.00 root ", - "│ ├─UnionScan_29 10000.00 root ", - "│ │ └─TableReader_31 10000.00 root data:TableFullScan_30", - "│ │ └─TableFullScan_30 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", - "│ └─UnionScan_32 10000.00 root ", - "│ └─TableReader_34 10000.00 root data:TableFullScan_33", - "│ └─TableFullScan_33 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", - "└─PartitionUnion_21(Probe) 20000.00 root ", - " ├─UnionScan_22 10000.00 root ", - " │ └─TableReader_24 10000.00 root data:TableFullScan_23", - " │ └─TableFullScan_23 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", - " └─UnionScan_25 10000.00 root ", - " └─TableReader_27 10000.00 root data:TableFullScan_26", - " └─TableFullScan_26 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo" + "HashJoin_21 25000.00 root inner join, equal:[eq(test.tt.a, test.tt.a)]", + "├─PartitionUnion_30(Build) 20000.00 root ", + "│ ├─UnionScan_31 10000.00 root ", + "│ │ └─TableReader_33 10000.00 root data:TableFullScan_32", + "│ │ └─TableFullScan_32 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + "│ └─UnionScan_34 10000.00 root ", + "│ └─TableReader_36 10000.00 root data:TableFullScan_35", + "│ └─TableFullScan_35 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + "└─PartitionUnion_23(Probe) 20000.00 root ", + " ├─UnionScan_24 10000.00 root ", + " │ └─TableReader_26 10000.00 root data:TableFullScan_25", + " │ └─TableFullScan_25 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " └─UnionScan_27 10000.00 root ", + " └─TableReader_29 10000.00 root data:TableFullScan_28", + " └─TableFullScan_28 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo" ] } ] @@ -1600,17 +1600,17 @@ { "SQL": "select /*+ HASH_AGG(), AGG_TO_COP() */ sum(distinct b) from pt;", "Plan": [ - "HashAgg_11 1.00 root funcs:sum(distinct Column#9)->Column#4", - "└─Projection_23 16000.00 root cast(test.pt.b, decimal(65,0) BINARY)->Column#9", - " └─PartitionUnion_12 16000.00 root ", - " ├─HashAgg_16 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", - " │ └─TableReader_17 8000.00 root data:HashAgg_13", - " │ └─HashAgg_13 8000.00 cop[tikv] group by:test.pt.b, ", - " │ └─TableFullScan_15 10000.00 cop[tikv] table:pt, partition:p0 keep order:false, stats:pseudo", - " └─HashAgg_21 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", - " └─TableReader_22 8000.00 root data:HashAgg_18", - " └─HashAgg_18 8000.00 cop[tikv] group by:test.pt.b, ", - " └─TableFullScan_20 10000.00 cop[tikv] table:pt, partition:p1 keep order:false, stats:pseudo" + "HashAgg_12 1.00 root funcs:sum(distinct Column#9)->Column#4", + "└─Projection_24 16000.00 root cast(test.pt.b, decimal(65,0) BINARY)->Column#9", + " └─PartitionUnion_13 16000.00 root ", + " ├─HashAgg_17 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", + " │ └─TableReader_18 8000.00 root data:HashAgg_14", + " │ └─HashAgg_14 8000.00 cop[tikv] group by:test.pt.b, ", + " │ └─TableFullScan_16 10000.00 cop[tikv] table:pt, partition:p0 keep order:false, stats:pseudo", + " └─HashAgg_22 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", + " └─TableReader_23 8000.00 root data:HashAgg_19", + " └─HashAgg_19 8000.00 cop[tikv] group by:test.pt.b, ", + " └─TableFullScan_21 10000.00 cop[tikv] table:pt, partition:p1 keep order:false, stats:pseudo" ], "Result": [ "" @@ -1729,17 +1729,17 @@ { "SQL": "select /*+ HASH_AGG(), AGG_TO_COP() */ sum(distinct b) from pt;", "Plan": [ - "HashAgg_11 1.00 root funcs:sum(distinct Column#9)->Column#4", - "└─Projection_23 16000.00 root cast(test.pt.b, decimal(65,0) BINARY)->Column#9", - " └─PartitionUnion_12 16000.00 root ", - " ├─HashAgg_16 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", - " │ └─TableReader_17 8000.00 root data:HashAgg_13", - " │ └─HashAgg_13 8000.00 cop[tikv] group by:test.pt.b, ", - " │ └─TableFullScan_15 10000.00 cop[tikv] table:pt, partition:p0 keep order:false, stats:pseudo", - " └─HashAgg_21 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", - " └─TableReader_22 8000.00 root data:HashAgg_18", - " └─HashAgg_18 8000.00 cop[tikv] group by:test.pt.b, ", - " └─TableFullScan_20 10000.00 cop[tikv] table:pt, partition:p1 keep order:false, stats:pseudo" + "HashAgg_12 1.00 root funcs:sum(distinct Column#9)->Column#4", + "└─Projection_24 16000.00 root cast(test.pt.b, decimal(65,0) BINARY)->Column#9", + " └─PartitionUnion_13 16000.00 root ", + " ├─HashAgg_17 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", + " │ └─TableReader_18 8000.00 root data:HashAgg_14", + " │ └─HashAgg_14 8000.00 cop[tikv] group by:test.pt.b, ", + " │ └─TableFullScan_16 10000.00 cop[tikv] table:pt, partition:p0 keep order:false, stats:pseudo", + " └─HashAgg_22 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", + " └─TableReader_23 8000.00 root data:HashAgg_19", + " └─HashAgg_19 8000.00 cop[tikv] group by:test.pt.b, ", + " └─TableFullScan_21 10000.00 cop[tikv] table:pt, partition:p1 keep order:false, stats:pseudo" ], "Result": [ "" @@ -1771,17 +1771,17 @@ { "SQL": "select /*+ HASH_AGG(), AGG_TO_COP() */ sum(distinct b) from pt;", "Plan": [ - "HashAgg_11 1.00 root funcs:sum(distinct Column#9)->Column#4", - "└─Projection_23 16000.00 root cast(test.pt.b, decimal(65,0) BINARY)->Column#9", - " └─PartitionUnion_12 16000.00 root ", - " ├─HashAgg_16 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", - " │ └─TableReader_17 8000.00 root data:HashAgg_13", - " │ └─HashAgg_13 8000.00 cop[tikv] group by:test.pt.b, ", - " │ └─TableFullScan_15 10000.00 cop[tikv] table:pt, partition:p0 keep order:false, stats:pseudo", - " └─HashAgg_21 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", - " └─TableReader_22 8000.00 root data:HashAgg_18", - " └─HashAgg_18 8000.00 cop[tikv] group by:test.pt.b, ", - " └─TableFullScan_20 10000.00 cop[tikv] table:pt, partition:p1 keep order:false, stats:pseudo" + "HashAgg_12 1.00 root funcs:sum(distinct Column#9)->Column#4", + "└─Projection_24 16000.00 root cast(test.pt.b, decimal(65,0) BINARY)->Column#9", + " └─PartitionUnion_13 16000.00 root ", + " ├─HashAgg_17 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", + " │ └─TableReader_18 8000.00 root data:HashAgg_14", + " │ └─HashAgg_14 8000.00 cop[tikv] group by:test.pt.b, ", + " │ └─TableFullScan_16 10000.00 cop[tikv] table:pt, partition:p0 keep order:false, stats:pseudo", + " └─HashAgg_22 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", + " └─TableReader_23 8000.00 root data:HashAgg_19", + " └─HashAgg_19 8000.00 cop[tikv] group by:test.pt.b, ", + " └─TableFullScan_21 10000.00 cop[tikv] table:pt, partition:p1 keep order:false, stats:pseudo" ], "Result": [ "" From 934ecf2db16125f7b2b2071b4fca9fb2f59ecdbf Mon Sep 17 00:00:00 2001 From: xhe Date: Wed, 23 Sep 2020 14:40:58 +0800 Subject: [PATCH 10/60] ddl: add a framework for placement rules cache (#20086) --- ddl/placement/types.go | 8 ++++ ddl/placement/utils.go | 6 +++ domain/domain.go | 14 +++++- domain/domain_test.go | 10 +++++ domain/infosync/info.go | 80 +++++++++++++++++++++++++++++------ infoschema/builder.go | 43 ++++++++++++++++--- infoschema/infoschema.go | 11 +++++ infoschema/infoschema_test.go | 4 +- 8 files changed, 155 insertions(+), 21 deletions(-) diff --git a/ddl/placement/types.go b/ddl/placement/types.go index 895ab30b7d2f1..d6d6bfeb6dc74 100644 --- a/ddl/placement/types.go +++ b/ddl/placement/types.go @@ -76,6 +76,14 @@ type Rule struct { IsolationLevel string `json:"isolation_level,omitempty"` } +// Bundle is a group of all rules and configurations. It is used to support rule cache. +type Bundle struct { + ID string `json:"group_id"` + Index int `json:"group_index"` + Override bool `json:"group_override"` + Rules []*Rule `json:"rules"` +} + // RuleOpType indicates the operation type. type RuleOpType string diff --git a/ddl/placement/utils.go b/ddl/placement/utils.go index b251b9f01662b..87c4a37a4e4f9 100644 --- a/ddl/placement/utils.go +++ b/ddl/placement/utils.go @@ -14,6 +14,7 @@ package placement import ( + "fmt" "strings" "github.com/pingcap/errors" @@ -69,3 +70,8 @@ func CheckLabelConstraints(labels []string) ([]LabelConstraint, error) { } return constraints, nil } + +// GroupID accepts a tableID or whatever integer, and encode the integer into a valid GroupID for PD. +func GroupID(id int64) string { + return fmt.Sprintf("TIDB_DDL_%d", id) +} diff --git a/domain/domain.go b/domain/domain.go index 2d7c254f1640c..a2557f71d3f81 100644 --- a/domain/domain.go +++ b/domain/domain.go @@ -30,6 +30,7 @@ import ( "github.com/pingcap/tidb/bindinfo" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/infoschema" @@ -140,7 +141,18 @@ func (do *Domain) loadInfoSchema(handle *infoschema.Handle, usedSchemaVersion in return 0, nil, fullLoad, err } - newISBuilder, err := infoschema.NewBuilder(handle).InitWithDBInfos(schemas, neededSchemaVersion) + bundles, err := infosync.GetAllRuleBundles(nil) + failpoint.Inject("FailPlacement", func(val failpoint.Value) { + if val.(bool) { + bundles = []*placement.Bundle{} + err = nil + } + }) + if err != nil { + return 0, nil, fullLoad, err + } + + newISBuilder, err := infoschema.NewBuilder(handle).InitWithDBInfos(schemas, bundles, neededSchemaVersion) if err != nil { return 0, nil, fullLoad, err } diff --git a/domain/domain_test.go b/domain/domain_test.go index a54a572ad4065..099a045d339e5 100644 --- a/domain/domain_test.go +++ b/domain/domain_test.go @@ -89,6 +89,11 @@ func unixSocketAvailable() bool { } func TestInfo(t *testing.T) { + err := failpoint.Enable("github.com/pingcap/tidb/domain/FailPlacement", `return(true)`) + if err != nil { + t.Fatal(err) + } + if runtime.GOOS == "windows" { t.Skip("integration.NewClusterV3 will create file contains a colon which is not allowed on Windows") } @@ -214,6 +219,11 @@ func TestInfo(t *testing.T) { if err != nil || len(infos) != 0 { t.Fatalf("err %v, infos %v", err, infos) } + + err = failpoint.Disable("github.com/pingcap/tidb/domain/FailPlacement") + if err != nil { + t.Fatal(err) + } } type mockSessionManager struct { diff --git a/domain/infosync/info.go b/domain/infosync/info.go index b025c9cc3c5e6..fd427341ba3ff 100644 --- a/domain/infosync/info.go +++ b/domain/infosync/info.go @@ -81,6 +81,9 @@ const ( // ErrPrometheusAddrIsNotSet is the error that Prometheus address is not set in PD and etcd var ErrPrometheusAddrIsNotSet = terror.ClassDomain.New(errno.ErrPrometheusAddrIsNotSet, errno.MySQLErrName[errno.ErrPrometheusAddrIsNotSet]) +// errPlacementRulesDisabled is exported for internal usage, indicating PD rejected the request due to disabled placement feature. +var errPlacementRulesDisabled = errors.New("placement rules feature is disabled") + // InfoSyncer stores server info to etcd when the tidb-server starts and delete when tidb-server shuts down. type InfoSyncer struct { etcdCli *clientv3.Client @@ -295,12 +298,19 @@ func doRequest(ctx context.Context, addrs []string, route, method string, body i res, err = http.DefaultClient.Do(req) if err == nil { - defer terror.Call(res.Body.Close) - bodyBytes, err := ioutil.ReadAll(res.Body) + if err != nil { + return nil, err + } if res.StatusCode != http.StatusOK { - err = errors.Wrapf(err, "%s", bodyBytes) + err = errors.Errorf("%s", bodyBytes) + // ignore if placement rules feature is not enabled + if strings.HasPrefix(err.Error(), `"placement rules feature is disabled"`) { + err = nil + bodyBytes = nil + } } + terror.Log(res.Body.Close()) return bodyBytes, err } } @@ -324,17 +334,12 @@ func GetPlacementRules(ctx context.Context) ([]*placement.RuleOp, error) { return nil, errors.Errorf("pd unavailable") } + rules := []*placement.RuleOp{} res, err := doRequest(ctx, addrs, path.Join(pdapi.Config, "rules"), http.MethodGet, nil) - if err != nil { - return nil, err + if err == nil && res != nil { + err = json.Unmarshal(res, &rules) } - - var rules []*placement.RuleOp - err = json.Unmarshal(res, &rules) - if err != nil { - return nil, err - } - return rules, nil + return rules, err } // UpdatePlacementRules is used to notify PD changes of placement rules. @@ -367,6 +372,57 @@ func UpdatePlacementRules(ctx context.Context, rules []*placement.RuleOp) error return err } +// GetAllRuleBundles is used to get all rule bundles from PD. It is used to load full rules from PD while fullload infoschema. +func GetAllRuleBundles(ctx context.Context) ([]*placement.Bundle, error) { + is, err := getGlobalInfoSyncer() + if err != nil { + return nil, err + } + + bundles := []*placement.Bundle{} + if is.etcdCli == nil { + return bundles, nil + } + + addrs := is.etcdCli.Endpoints() + + if len(addrs) == 0 { + return nil, errors.Errorf("pd unavailable") + } + + res, err := doRequest(ctx, addrs, path.Join(pdapi.Config, "placement-rule"), "GET", nil) + if err == nil && res != nil { + err = json.Unmarshal(res, &bundles) + } + return bundles, err +} + +// GetRuleBundle is used to get one specific rule bundle from PD. +func GetRuleBundle(ctx context.Context, name string) (*placement.Bundle, error) { + is, err := getGlobalInfoSyncer() + if err != nil { + return nil, err + } + + bundle := &placement.Bundle{ID: name} + + if is.etcdCli == nil { + return bundle, nil + } + + addrs := is.etcdCli.Endpoints() + + if len(addrs) == 0 { + return nil, errors.Errorf("pd unavailable") + } + + res, err := doRequest(ctx, addrs, path.Join(pdapi.Config, "placement-rule", name), "GET", nil) + if err == nil && res != nil { + err = json.Unmarshal(res, bundle) + } + return bundle, err +} + func (is *InfoSyncer) getAllServerInfo(ctx context.Context) (map[string]*ServerInfo, error) { allInfo := make(map[string]*ServerInfo) if is.etcdCli == nil { diff --git a/infoschema/builder.go b/infoschema/builder.go index 6c38352528ff3..6416c6f226544 100644 --- a/infoschema/builder.go +++ b/infoschema/builder.go @@ -23,6 +23,8 @@ import ( "github.com/pingcap/parser/charset" "github.com/pingcap/parser/model" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/ddl/placement" + "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/table" @@ -40,13 +42,16 @@ type Builder struct { // Return the detail updated table IDs that are produced from SchemaDiff and an error. func (b *Builder) ApplyDiff(m *meta.Meta, diff *model.SchemaDiff) ([]int64, error) { b.is.schemaMetaVersion = diff.Version - if diff.Type == model.ActionCreateSchema { + switch diff.Type { + case model.ActionCreateSchema: return nil, b.applyCreateSchema(m, diff) - } else if diff.Type == model.ActionDropSchema { + case model.ActionDropSchema: tblIDs := b.applyDropSchema(diff.SchemaID) return tblIDs, nil - } else if diff.Type == model.ActionModifySchemaCharsetAndCollate { + case model.ActionModifySchemaCharsetAndCollate: return nil, b.applyModifySchemaCharsetAndCollate(m, diff) + case model.ActionAlterTableAlterPartition: + return nil, b.applyPartitionPlacementUpdate(m, diff) } roDBInfo, ok := b.is.SchemaByID(diff.SchemaID) if !ok { @@ -364,11 +369,24 @@ func (b *Builder) applyDropTable(dbInfo *model.DBInfo, tableID int64, affected [ return affected } +func (b *Builder) applyPartitionPlacementUpdate(m *meta.Meta, diff *model.SchemaDiff) error { + tID := placement.GroupID(diff.TableID) + + bundle, err := infosync.GetRuleBundle(nil, tID) + if err != nil { + return err + } + + b.is.ruleBundleMap[tID] = bundle + return nil +} + // InitWithOldInfoSchema initializes an empty new InfoSchema by copies all the data from old InfoSchema. func (b *Builder) InitWithOldInfoSchema() *Builder { oldIS := b.handle.Get().(*infoSchema) b.is.schemaMetaVersion = oldIS.schemaMetaVersion b.copySchemasMap(oldIS) + b.copyBundlesMap(oldIS) copy(b.is.sortedTablesBuckets, oldIS.sortedTablesBuckets) return b } @@ -379,6 +397,12 @@ func (b *Builder) copySchemasMap(oldIS *infoSchema) { } } +func (b *Builder) copyBundlesMap(oldIS *infoSchema) { + for k, v := range oldIS.ruleBundleMap { + b.is.ruleBundleMap[k] = v + } +} + // copySchemaTables creates a new schemaTables instance when a table in the database has changed. // It also does modifications on the new one because old schemaTables must be read-only. // Note: please make sure the dbName is in lowercase. @@ -395,10 +419,15 @@ func (b *Builder) copySchemaTables(dbName string) *model.DBInfo { return newSchemaTables.dbInfo } -// InitWithDBInfos initializes an empty new InfoSchema with a slice of DBInfo and schema version. -func (b *Builder) InitWithDBInfos(dbInfos []*model.DBInfo, schemaVersion int64) (*Builder, error) { +// InitWithDBInfos initializes an empty new InfoSchema with a slice of DBInfo, all placement rules, and schema version. +func (b *Builder) InitWithDBInfos(dbInfos []*model.DBInfo, bundles []*placement.Bundle, schemaVersion int64) (*Builder, error) { info := b.is info.schemaMetaVersion = schemaVersion + info.ruleBundleMap = make(map[string]*placement.Bundle, len(bundles)) + for _, bundle := range bundles { + info.ruleBundleMap[bundle.ID] = bundle + } + for _, di := range dbInfos { err := b.createSchemaTablesForDB(di, tables.TableFromMeta) if err != nil { @@ -429,6 +458,7 @@ func (b *Builder) createSchemaTablesForDB(di *model.DBInfo, tableFromMeta tableF tables: make(map[string]table.Table, len(di.Tables)), } b.is.schemaMap[di.Name.L] = schTbls + for _, t := range di.Tables { allocs := autoid.NewAllocatorsFromTblInfo(b.handle.store, di.ID, t) var tbl table.Table @@ -445,7 +475,7 @@ func (b *Builder) createSchemaTablesForDB(di *model.DBInfo, tableFromMeta tableF type virtualTableDriver struct { *model.DBInfo - TableFromMeta func(alloc autoid.Allocators, tblInfo *model.TableInfo) (table.Table, error) + TableFromMeta tableFromMetaFunc } var drivers []*virtualTableDriver @@ -466,6 +496,7 @@ func NewBuilder(handle *Handle) *Builder { b.handle = handle b.is = &infoSchema{ schemaMap: map[string]*schemaTables{}, + ruleBundleMap: map[string]*placement.Bundle{}, sortedTablesBuckets: make([]sortedTables, bucketCount), } return b diff --git a/infoschema/infoschema.go b/infoschema/infoschema.go index 72a2fe48d88db..f2e1033ad7464 100644 --- a/infoschema/infoschema.go +++ b/infoschema/infoschema.go @@ -20,6 +20,7 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/sessionctx" @@ -53,6 +54,8 @@ type InfoSchema interface { // TableIsSequence indicates whether the schema.table is a sequence. TableIsSequence(schema, table model.CIStr) bool FindTableByPartitionID(partitionID int64) (table.Table, *model.DBInfo) + // BundleByName is used to get a rule bundle. + BundleByName(name string) (*placement.Bundle, bool) } type sortedTables []table.Table @@ -87,6 +90,9 @@ type schemaTables struct { const bucketCount = 512 type infoSchema struct { + // ruleBundleMap stores all placement rules + ruleBundleMap map[string]*placement.Bundle + schemaMap map[string]*schemaTables // sortedTablesBuckets is a slice of sortedTables, a table's bucket index is (tableID % bucketCount). @@ -390,3 +396,8 @@ func GetInfoSchemaBySessionVars(sessVar *variable.SessionVars) InfoSchema { } return is } + +func (is *infoSchema) BundleByName(name string) (*placement.Bundle, bool) { + t, r := is.ruleBundleMap[name] + return t, r +} diff --git a/infoschema/infoschema_test.go b/infoschema/infoschema_test.go index ecf6db2ec7e3a..5c2e9241c066a 100644 --- a/infoschema/infoschema_test.go +++ b/infoschema/infoschema_test.go @@ -110,7 +110,7 @@ func (*testSuite) TestT(c *C) { }) c.Assert(err, IsNil) - builder, err := infoschema.NewBuilder(handle).InitWithDBInfos(dbInfos, 1) + builder, err := infoschema.NewBuilder(handle).InitWithDBInfos(dbInfos, nil, 1) c.Assert(err, IsNil) txn, err := store.Begin() @@ -282,7 +282,7 @@ func (*testSuite) TestInfoTables(c *C) { c.Assert(err, IsNil) defer store.Close() handle := infoschema.NewHandle(store) - builder, err := infoschema.NewBuilder(handle).InitWithDBInfos(nil, 0) + builder, err := infoschema.NewBuilder(handle).InitWithDBInfos(nil, nil, 0) c.Assert(err, IsNil) builder.Build() is := handle.Get() From d72adf893a138cbab83e464039f33b34ecfa03ea Mon Sep 17 00:00:00 2001 From: xiaodong-ji Date: Wed, 23 Sep 2020 14:56:38 +0800 Subject: [PATCH 11/60] DDL: Reduce the impact on DML when executing partition DDL (#19991) --- ddl/db_partition_test.go | 16 ++++++++++++++++ ddl/ddl_worker.go | 16 ++++++++++++++++ infoschema/builder.go | 11 ++++++++++- 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/ddl/db_partition_test.go b/ddl/db_partition_test.go index 701a0a3780c0e..098b64d131c08 100644 --- a/ddl/db_partition_test.go +++ b/ddl/db_partition_test.go @@ -2204,6 +2204,22 @@ func (s *testIntegrationSuite3) TestPartitionErrorCode(c *C) { tk.MustGetErrCode("alter table t_part rebuild partition p0,p1;", tmysql.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t_part remove partitioning;", tmysql.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t_part repair partition p1;", tmysql.ErrUnsupportedDDLOperation) + + // Reduce the impact on DML when executing partition DDL + tk1 := testkit.NewTestKit(c, s.store) + tk1.MustExec("use test") + tk1.MustExec("drop table if exists t;") + tk1.MustExec(`create table t(id int primary key) + partition by hash(id) partitions 4;`) + tk1.MustExec("begin") + tk1.MustExec("insert into t values(1);") + + tk2 := testkit.NewTestKit(c, s.store) + tk2.MustExec("use test") + tk2.MustExec("alter table t truncate partition p0;") + + _, err = tk1.Exec("commit") + c.Assert(err, IsNil) } func (s *testIntegrationSuite5) TestConstAndTimezoneDepent(c *C) { diff --git a/ddl/ddl_worker.go b/ddl/ddl_worker.go index 62bf3d9e59dd8..3e858d8a2dddd 100644 --- a/ddl/ddl_worker.go +++ b/ddl/ddl_worker.go @@ -865,6 +865,22 @@ func updateSchemaVersion(t *meta.Meta, job *model.Job) (int64, error) { OldTableID: ptTableID, } diff.AffectedOpts = affects + case model.ActionTruncateTablePartition: + var oldIDs []int64 + err = job.DecodeArgs(&oldIDs) + if err != nil { + return 0, errors.Trace(err) + } + diff.TableID = job.TableID + affects := make([]*model.AffectedOption, len(oldIDs)) + for i := 0; i < len(oldIDs); i++ { + affects[i] = &model.AffectedOption{ + SchemaID: job.SchemaID, + TableID: oldIDs[i], + OldTableID: oldIDs[i], + } + } + diff.AffectedOpts = affects default: diff.TableID = job.TableID } diff --git a/infoschema/builder.go b/infoschema/builder.go index 6416c6f226544..b40b696a04ed6 100644 --- a/infoschema/builder.go +++ b/infoschema/builder.go @@ -119,6 +119,13 @@ func (b *Builder) ApplyDiff(m *meta.Meta, diff *model.SchemaDiff) ([]int64, erro } if diff.AffectedOpts != nil { for _, opt := range diff.AffectedOpts { + // Reduce the impact on DML when executing partition DDL. eg. + // While session 1 performs the DML operation associated with partition 1, + // the TRUNCATE operation of session 2 on partition 2 does not cause the operation of session 1 to fail. + if diff.Type == model.ActionTruncateTablePartition { + tblIDs = append(tblIDs, opt.OldTableID) + continue + } var err error affectedDiff := &model.SchemaDiff{ Version: diff.Version, @@ -263,7 +270,9 @@ func (b *Builder) applyCreateTable(m *meta.Meta, dbInfo *model.DBInfo, tableID i fmt.Sprintf("(Table ID %d)", tableID), ) } - affected = appendAffectedIDs(affected, tblInfo) + if tp != model.ActionTruncateTablePartition { + affected = appendAffectedIDs(affected, tblInfo) + } // Failpoint check whether tableInfo should be added to repairInfo. // Typically used in repair table test to load mock `bad` tableInfo into repairInfo. From 6271bd472e8870f5088244f7fa61d153d0ab0430 Mon Sep 17 00:00:00 2001 From: xiaodong-ji Date: Wed, 23 Sep 2020 15:52:30 +0800 Subject: [PATCH 12/60] expression: fix inaccurate error info for year column out of range (#18871) --- executor/insert_test.go | 5 +++++ executor/write_test.go | 2 +- types/datum.go | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/executor/insert_test.go b/executor/insert_test.go index 46e22aba37d47..e5d2d573f36dd 100644 --- a/executor/insert_test.go +++ b/executor/insert_test.go @@ -313,6 +313,11 @@ func (s *testSuite3) TestInsertWrongValueForField(c *C) { tk.MustExec(`insert into t1 values('我');`) tk.MustExec(`alter table t1 add column b char(10) charset ascii as ((a));`) tk.MustQuery(`select * from t1;`).Check(testkit.Rows(`我 `)) + + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t (a year);`) + _, err = tk.Exec(`insert into t values(2156);`) + c.Assert(err.Error(), Equals, `[types:1264]Out of range value for column 'a' at row 1`) } func (s *testSuite3) TestInsertDateTimeWithTimeZone(c *C) { diff --git a/executor/write_test.go b/executor/write_test.go index bc73f77659888..1223e4118bf8b 100644 --- a/executor/write_test.go +++ b/executor/write_test.go @@ -1480,7 +1480,7 @@ func (s *testSuite8) TestUpdate(c *C) { tk.MustExec("drop table t") tk.MustExec("CREATE TABLE `t` ( `c1` year DEFAULT NULL, `c2` year DEFAULT NULL, `c3` date DEFAULT NULL, `c4` datetime DEFAULT NULL, KEY `idx` (`c1`,`c2`))") _, err = tk.Exec("UPDATE t SET c2=16777215 WHERE c1>= -8388608 AND c1 < -9 ORDER BY c1 LIMIT 2") - c.Assert(err.Error(), Equals, "cannot convert datum from bigint to type year.") + c.Assert(err.Error(), Equals, "[types:1690]DECIMAL value is out of range in '(4, 0)'") tk.MustExec("update (select * from t) t set c1 = 1111111") diff --git a/types/datum.go b/types/datum.go index 106568a9f8b7a..2d45642270f0b 100644 --- a/types/datum.go +++ b/types/datum.go @@ -1356,7 +1356,7 @@ func (d *Datum) convertToMysqlYear(sc *stmtctx.StatementContext, target *FieldTy } y, err = AdjustYear(y, adjust) if err != nil { - _, err = invalidConv(d, target.Tp) + err = ErrOverflow.GenWithStackByArgs("DECIMAL", fmt.Sprintf("(%d, %d)", target.Flen, target.Decimal)) } ret.SetInt64(y) return ret, err From 592b244e518f9d818bdd03da3c60ed4eac491225 Mon Sep 17 00:00:00 2001 From: Yilin Chen Date: Wed, 23 Sep 2020 18:06:08 +0800 Subject: [PATCH 13/60] tikv: set undetermined error when async commit prewrite rpc fails (#20150) Signed-off-by: Yilin Chen --- store/mockstore/unistore/rpc.go | 6 ++ store/tikv/2pc.go | 19 ++++++- store/tikv/async_commit_fail_test.go | 83 ++++++++++++++++++++++++++++ store/tikv/async_commit_test.go | 10 ++-- store/tikv/prewrite.go | 10 +++- store/tikv/region_request.go | 5 ++ 6 files changed, 125 insertions(+), 8 deletions(-) create mode 100644 store/tikv/async_commit_fail_test.go diff --git a/store/mockstore/unistore/rpc.go b/store/mockstore/unistore/rpc.go index 3d4b7b465b64b..8ef39ed5b6c5f 100644 --- a/store/mockstore/unistore/rpc.go +++ b/store/mockstore/unistore/rpc.go @@ -102,6 +102,12 @@ func (c *RPCClient) SendRequest(ctx context.Context, addr string, req *tikvrpc.R r := req.Prewrite() c.cluster.handleDelay(r.StartVersion, r.Context.RegionId) resp.Resp, err = c.usSvr.KvPrewrite(ctx, r) + + failpoint.Inject("rpcPrewriteTimeout", func(val failpoint.Value) { + if val.(bool) { + failpoint.Return(nil, undeterminedErr) + } + }) case tikvrpc.CmdPessimisticLock: r := req.PessimisticLock() c.cluster.handleDelay(r.StartVersion, r.Context.RegionId) diff --git a/store/tikv/2pc.go b/store/tikv/2pc.go index 892b6aa21645f..3eb0fb51b2743 100644 --- a/store/tikv/2pc.go +++ b/store/tikv/2pc.go @@ -756,9 +756,10 @@ func (c *twoPhaseCommitter) execute(ctx context.Context) (err error) { } } else { // The error means the async commit should not succeed. - // TODO: Handle undetermined case here. if err != nil { - c.cleanup(ctx) + if c.getUndeterminedErr() == nil { + c.cleanup(ctx) + } tikvAsyncCommitTxnCounterError.Inc() } else { tikvAsyncCommitTxnCounterOk.Inc() @@ -775,6 +776,20 @@ func (c *twoPhaseCommitter) execute(ctx context.Context) (err error) { prewriteBo := NewBackofferWithVars(ctx, PrewriteMaxBackoff, c.txn.vars) start := time.Now() err = c.prewriteMutations(prewriteBo, c.mutations) + + if err != nil { + // TODO: Now we return an undetermined error as long as one of the prewrite + // RPCs fails. However, if there are multiple errors and some of the errors + // are not RPC failures, we can return the actual error instead of undetermined. + if undeterminedErr := c.getUndeterminedErr(); undeterminedErr != nil { + logutil.Logger(ctx).Error("2PC commit result undetermined", + zap.Error(err), + zap.NamedError("rpcErr", undeterminedErr), + zap.Uint64("txnStartTS", c.startTS)) + return errors.Trace(terror.ErrResultUndetermined) + } + } + commitDetail := c.getDetail() commitDetail.PrewriteTime = time.Since(start) if prewriteBo.totalSleep > 0 { diff --git a/store/tikv/async_commit_fail_test.go b/store/tikv/async_commit_fail_test.go new file mode 100644 index 0000000000000..c896b2ee3e69d --- /dev/null +++ b/store/tikv/async_commit_fail_test.go @@ -0,0 +1,83 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package tikv + +import ( + "bytes" + "context" + + . "github.com/pingcap/check" + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/store/mockstore/cluster" + "github.com/pingcap/tidb/store/mockstore/unistore" +) + +type testAsyncCommitFailSuite struct { + OneByOneSuite + cluster cluster.Cluster + store *tikvStore +} + +var _ = SerialSuites(&testAsyncCommitFailSuite{}) + +func (s *testAsyncCommitFailSuite) SetUpTest(c *C) { + client, pdClient, cluster, err := unistore.New("") + c.Assert(err, IsNil) + unistore.BootstrapWithSingleStore(cluster) + s.cluster = cluster + store, err := NewTestTiKVStore(client, pdClient, nil, nil, 0) + c.Assert(err, IsNil) + + s.store = store.(*tikvStore) +} + +// TestFailCommitPrimaryRpcErrors tests rpc errors are handled properly when +// committing primary region task. +func (s *testAsyncCommitFailSuite) TestFailAsyncCommitPrewriteRpcErrors(c *C) { + defer config.RestoreFunc() + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.EnableAsyncCommit = true + }) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/noRetryOnRpcError", "return(true)"), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/rpcPrewriteTimeout", `return(true)`), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/rpcPrewriteTimeout"), IsNil) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/noRetryOnRpcError"), IsNil) + }() + // The rpc error will be wrapped to ErrResultUndetermined. + t1, err := s.store.Begin() + c.Assert(err, IsNil) + err = t1.Set([]byte("a"), []byte("a1")) + c.Assert(err, IsNil) + ctx := context.WithValue(context.Background(), sessionctx.ConnID, uint64(1)) + err = t1.Commit(ctx) + c.Assert(err, NotNil) + c.Assert(terror.ErrorEqual(err, terror.ErrResultUndetermined), IsTrue, Commentf("%s", errors.ErrorStack(err))) + + // We don't need to call "Rollback" after "Commit" fails. + err = t1.Rollback() + c.Assert(err, Equals, kv.ErrInvalidTxn) + + // Create a new transaction to check. The previous transaction should actually commit. + t2, err := s.store.Begin() + c.Assert(err, IsNil) + res, err := t2.Get(context.Background(), []byte("a")) + c.Assert(err, IsNil) + c.Assert(bytes.Equal(res, []byte("a1")), IsTrue) +} diff --git a/store/tikv/async_commit_test.go b/store/tikv/async_commit_test.go index d516e46215582..98202c5f9c320 100644 --- a/store/tikv/async_commit_test.go +++ b/store/tikv/async_commit_test.go @@ -25,7 +25,7 @@ import ( "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/store/mockstore/cluster" - "github.com/pingcap/tidb/store/mockstore/mocktikv" + "github.com/pingcap/tidb/store/mockstore/unistore" "github.com/pingcap/tidb/store/tikv/tikvrpc" ) @@ -39,10 +39,10 @@ type testAsyncCommitSuite struct { var _ = Suite(&testAsyncCommitSuite{}) func (s *testAsyncCommitSuite) SetUpTest(c *C) { - client, clstr, pdClient, err := mocktikv.NewTiKVAndPDClient("") + client, pdClient, cluster, err := unistore.New("") c.Assert(err, IsNil) - mocktikv.BootstrapWithSingleStore(clstr) - s.cluster = clstr + unistore.BootstrapWithSingleStore(cluster) + s.cluster = cluster store, err := NewTestTiKVStore(client, pdClient, nil, nil, 0) c.Assert(err, IsNil) @@ -120,10 +120,10 @@ func (s *testAsyncCommitSuite) mustGetLock(c *C, key []byte) *Lock { } func (s *testAsyncCommitSuite) TestCheckSecondaries(c *C) { + defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { conf.TiKVClient.EnableAsyncCommit = true }) - defer config.RestoreFunc()() s.putAlphabets(c) diff --git a/store/tikv/prewrite.go b/store/tikv/prewrite.go index 2db8c36eb2825..05250737a5559 100644 --- a/store/tikv/prewrite.go +++ b/store/tikv/prewrite.go @@ -100,7 +100,15 @@ func (action actionPrewrite) handleSingleBatch(c *twoPhaseCommitter, bo *Backoff req := c.buildPrewriteRequest(batch, txnSize) for { - resp, err := c.store.SendReq(bo, req, batch.region, readTimeoutShort) + sender := NewRegionRequestSender(c.store.regionCache, c.store.client) + resp, err := sender.SendReq(bo, req, batch.region, readTimeoutShort) + + // If we fail to receive response for async commit prewrite, it will be undetermined whether this + // transaction has been successfully committed. + if c.isAsyncCommit() && sender.rpcError != nil { + c.setUndeterminedErr(errors.Trace(sender.rpcError)) + } + if err != nil { return errors.Trace(err) } diff --git a/store/tikv/region_request.go b/store/tikv/region_request.go index 3a5cad8e4d960..447f6b1fad986 100644 --- a/store/tikv/region_request.go +++ b/store/tikv/region_request.go @@ -427,6 +427,11 @@ func (s *RegionRequestSender) sendReqToRegion(bo *Backoffer, rpcCtx *RPCContext, } s.rpcError = err + failpoint.Inject("noRetryOnRpcError", func(val failpoint.Value) { + if val.(bool) { + failpoint.Return(nil, false, err) + } + }) if e := s.onSendFail(bo, rpcCtx, err); e != nil { return nil, false, errors.Trace(e) } From 92a04ef0240e84d5db5a6e00a5b7fb8b10d4b2a1 Mon Sep 17 00:00:00 2001 From: Zejun Li Date: Wed, 23 Sep 2020 18:45:38 +0800 Subject: [PATCH 14/60] trace: tee logs to runtime/trace output (#19994) --- executor/adapter.go | 4 ++++ server/conn.go | 9 ++++++++- util/logutil/log.go | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/executor/adapter.go b/executor/adapter.go index be9da134f5f6c..823e196e7db44 100644 --- a/executor/adapter.go +++ b/executor/adapter.go @@ -17,6 +17,7 @@ import ( "context" "fmt" "math" + "runtime/trace" "strconv" "strings" "sync/atomic" @@ -913,6 +914,9 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { if _, ok := a.StmtNode.(*ast.CommitStmt); ok { slowItems.PrevStmt = sessVars.PrevStmt.String() } + if trace.IsEnabled() { + trace.Log(a.GoCtx, "details", sessVars.SlowLogFormat(slowItems)) + } if costTime < threshold { logutil.SlowQueryLogger.Debug(sessVars.SlowLogFormat(slowItems)) } else { diff --git a/server/conn.go b/server/conn.go index d47286dbe0981..fe6d8abaaa52f 100644 --- a/server/conn.go +++ b/server/conn.go @@ -50,6 +50,7 @@ import ( "sync" "sync/atomic" "time" + "unsafe" "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" @@ -928,8 +929,14 @@ func (cc *clientConn) dispatch(ctx context.Context, data []byte) error { if len(sqlType) > 0 { var task *trace.Task ctx, task = trace.NewTask(ctx, sqlType) - trace.Log(ctx, "sql", lc.String()) defer task.End() + + trace.Log(ctx, "sql", lc.String()) + ctx = logutil.WithTraceLogger(ctx, cc.connectionID) + + taskID := *(*uint64)(unsafe.Pointer(task)) + ctx = pprof.WithLabels(ctx, pprof.Labels("trace", strconv.FormatUint(taskID, 10))) + pprof.SetGoroutineLabels(ctx) } } token := cc.server.getToken() diff --git a/util/logutil/log.go b/util/logutil/log.go index 49429c70a965f..55bbc950c3ebd 100644 --- a/util/logutil/log.go +++ b/util/logutil/log.go @@ -20,6 +20,7 @@ import ( "os" "path/filepath" "runtime" + "runtime/trace" "sort" "strings" "time" @@ -355,6 +356,43 @@ func WithConnID(ctx context.Context, connID uint32) context.Context { return context.WithValue(ctx, ctxLogKey, logger.With(zap.Uint32("conn", connID))) } +// WithTraceLogger attaches trace identifier to context +func WithTraceLogger(ctx context.Context, connID uint32) context.Context { + var logger *zap.Logger + if ctxLogger, ok := ctx.Value(ctxLogKey).(*zap.Logger); ok { + logger = ctxLogger + } else { + logger = zaplog.L() + } + return context.WithValue(ctx, ctxLogKey, wrapTraceLogger(ctx, connID, logger)) +} + +func wrapTraceLogger(ctx context.Context, connID uint32, logger *zap.Logger) *zap.Logger { + return logger.WithOptions(zap.WrapCore(func(core zapcore.Core) zapcore.Core { + tl := &traceLog{ctx: ctx} + traceCore := zaplog.NewTextCore(zaplog.NewTextEncoder(&zaplog.Config{}), tl, tl). + With([]zapcore.Field{zap.Uint32("conn", connID)}) + return zapcore.NewTee(traceCore, core) + })) +} + +type traceLog struct { + ctx context.Context +} + +func (t *traceLog) Enabled(_ zapcore.Level) bool { + return true +} + +func (t *traceLog) Write(p []byte) (n int, err error) { + trace.Log(t.ctx, "log", string(p)) + return len(p), nil +} + +func (t *traceLog) Sync() error { + return nil +} + // WithKeyValue attaches key/value to context. func WithKeyValue(ctx context.Context, key, value string) context.Context { var logger *zap.Logger From bb354b0c3022f2647d37754dad6680fb76e407ee Mon Sep 17 00:00:00 2001 From: jyz0309 <38248129+jyz0309@users.noreply.github.com> Date: Wed, 23 Sep 2020 20:57:40 +0800 Subject: [PATCH 15/60] *:Record the time consuming of memory operation of Insert Executor in Runtime Information (#19574) --- executor/executor_test.go | 22 +++++++- executor/insert.go | 17 ++++-- executor/insert_common.go | 95 ++++++++++++++++++++++++++++++--- executor/replace.go | 7 ++- store/tikv/scan.go | 3 +- store/tikv/snapshot.go | 15 +++--- util/execdetails/execdetails.go | 7 +++ 7 files changed, 145 insertions(+), 21 deletions(-) diff --git a/executor/executor_test.go b/executor/executor_test.go index 248f65a1e0c2b..998602c4a4ce8 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -6374,7 +6374,27 @@ func (s *testSuite) TestCollectDMLRuntimeStats(c *C) { tk.MustExec("begin pessimistic") tk.MustExec("insert ignore into t1 values (9,9)") - c.Assert(getRootStats(), Matches, "time:.*, loops:.*, BatchGet:{num_rpc:.*, total_time:.*}, lock_keys: {time:.*, region:.*, keys:.*, lock_rpc:.*, rpc_count:.*}") + c.Assert(getRootStats(), Matches, "time:.*, loops:.*, prepare:.*, check_insert:{total_time:.*, mem_insert_time:.*, prefetch:.*, rpc:{BatchGet:{num_rpc:.*, total_time:.*}}}.*") + tk.MustExec("rollback") + + tk.MustExec("begin pessimistic") + tk.MustExec("insert into t1 values (10,10) on duplicate key update a=a+1") + c.Assert(getRootStats(), Matches, "time:.*, loops:.*, prepare:.*, check_insert:{total_time:.*, mem_insert_time:.*, prefetch:.*, rpc:{BatchGet:{num_rpc:.*, total_time:.*}.*") + tk.MustExec("rollback") + + tk.MustExec("begin pessimistic") + tk.MustExec("insert into t1 values (1,2)") + c.Assert(getRootStats(), Matches, "time:.*, loops:.*, prepare:.*, insert:.*") + tk.MustExec("rollback") + + tk.MustExec("begin pessimistic") + tk.MustExec("insert ignore into t1 values(11,11) on duplicate key update `a`=`a`+1") + c.Assert(getRootStats(), Matches, "time:.*, loops:.*, prepare:.*, check_insert:{total_time:.*, mem_insert_time:.*, prefetch:.*, rpc:.*}") + tk.MustExec("rollback") + + tk.MustExec("begin pessimistic") + tk.MustExec("replace into t1 values (1,4)") + c.Assert(getRootStats(), Matches, "time:.*, loops:.*, prefetch:.*, rpc:.*") tk.MustExec("rollback") } diff --git a/executor/insert.go b/executor/insert.go index 6401cb00bd53b..d1d78b6c98693 100644 --- a/executor/insert.go +++ b/executor/insert.go @@ -18,6 +18,7 @@ import ( "encoding/hex" "fmt" "runtime/trace" + "time" "github.com/opentracing/opentracing-go" "github.com/pingcap/parser/mysql" @@ -82,6 +83,8 @@ func (e *InsertExec) exec(ctx context.Context, rows [][]types.Datum) error { return err } } else { + e.collectRuntimeStatsEnabled() + start := time.Now() for i, row := range rows { var err error sizeHintStep := int(sessVars.ShardAllocateStep) @@ -99,6 +102,9 @@ func (e *InsertExec) exec(ctx context.Context, rows [][]types.Datum) error { return err } } + if e.stats != nil { + e.stats.checkInsertTime += time.Since(start) + } } e.memTracker.Consume(int64(txn.Size() - txnSize)) return nil @@ -184,6 +190,7 @@ func (e *InsertExec) updateDupRow(ctx context.Context, txn kv.Transaction, row t // batchUpdateDupRows updates multi-rows in batch if they are duplicate with rows in table. func (e *InsertExec) batchUpdateDupRows(ctx context.Context, newRows [][]types.Datum) error { // Get keys need to be checked. + start := time.Now() toBeCheckedRows, err := getKeysNeedCheck(ctx, e.ctx, e.Table, newRows) if err != nil { return err @@ -200,13 +207,15 @@ func (e *InsertExec) batchUpdateDupRows(ctx context.Context, newRows [][]types.D defer snapshot.DelOption(kv.CollectRuntimeStats) } } - + prefetchStart := time.Now() // Use BatchGet to fill cache. // It's an optimization and could be removed without affecting correctness. if err = prefetchDataCache(ctx, txn, toBeCheckedRows); err != nil { return err } - + if e.stats != nil { + e.stats.prefetch += time.Since(prefetchStart) + } for i, r := range toBeCheckedRows { if r.handleKey != nil { handle, err := tablecodec.DecodeRowKey(r.handleKey.newKey) @@ -264,6 +273,9 @@ func (e *InsertExec) batchUpdateDupRows(ctx context.Context, newRows [][]types.D } } } + if e.stats != nil { + e.stats.checkInsertTime += time.Since(start) + } return nil } @@ -333,7 +345,6 @@ func (e *InsertExec) doDupRowUpdate(ctx context.Context, handle kv.Handle, oldRo // See http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values e.curInsertVals.SetDatums(newRow...) e.ctx.GetSessionVars().CurrInsertValues = e.curInsertVals.ToRow() - // NOTE: In order to execute the expression inside the column assignment, // we have to put the value of "oldRow" before "newRow" in "row4Update" to // be consistent with "Schema4OnDuplicate" in the "Insert" PhysicalPlan. diff --git a/executor/insert_common.go b/executor/insert_common.go index 67246f6f51ae1..da768cd8c532d 100644 --- a/executor/insert_common.go +++ b/executor/insert_common.go @@ -14,9 +14,13 @@ package executor import ( + "bytes" "context" + "fmt" "math" + "time" + "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" @@ -31,6 +35,7 @@ import ( "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" "go.uber.org/zap" @@ -74,7 +79,7 @@ type InsertValues struct { lazyFillAutoID bool memTracker *memory.Tracker - stats *runtimeStatsWithSnapshot + stats *insertRuntimeStat } type defaultVal struct { @@ -901,7 +906,6 @@ func (e *InsertValues) allocAutoRandomID(fieldType *types.FieldType) (int64, err if err != nil { return 0, err } - layout := autoid.NewAutoRandomIDLayout(fieldType, tableInfo.AutoRandomBits) if tables.OverflowShardBits(autoRandomID, tableInfo.AutoRandomBits, layout.TypeBitsLength, layout.HasSignBit) { return 0, autoid.ErrAutoRandReadFailed @@ -933,8 +937,11 @@ func (e *InsertValues) collectRuntimeStatsEnabled() bool { if e.runtimeStats != nil { if e.stats == nil { snapshotStats := &tikv.SnapshotRuntimeStats{} - e.stats = &runtimeStatsWithSnapshot{ + e.stats = &insertRuntimeStat{ + BasicRuntimeStats: e.runtimeStats, SnapshotRuntimeStats: snapshotStats, + prefetch: 0, + checkInsertTime: 0, } e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } @@ -948,7 +955,12 @@ func (e *InsertValues) collectRuntimeStatsEnabled() bool { func (e *InsertValues) batchCheckAndInsert(ctx context.Context, rows [][]types.Datum, addRecord func(ctx context.Context, row []types.Datum) error) error { // all the rows will be checked, so it is safe to set BatchCheck = true e.ctx.GetSessionVars().StmtCtx.BatchCheck = true - + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span1 := span.Tracer().StartSpan("InsertValues.batchCheckAndInsert", opentracing.ChildOf(span.Context())) + defer span1.Finish() + opentracing.ContextWithSpan(ctx, span1) + } + start := time.Now() // Get keys need to be checked. toBeCheckedRows, err := getKeysNeedCheck(ctx, e.ctx, e.Table, rows) if err != nil { @@ -959,18 +971,20 @@ func (e *InsertValues) batchCheckAndInsert(ctx context.Context, rows [][]types.D if err != nil { return err } - if e.collectRuntimeStatsEnabled() { if snapshot := txn.GetSnapshot(); snapshot != nil { snapshot.SetOption(kv.CollectRuntimeStats, e.stats.SnapshotRuntimeStats) defer snapshot.DelOption(kv.CollectRuntimeStats) } } - + prefetchStart := time.Now() // Fill cache using BatchGet, the following Get requests don't need to visit TiKV. if _, err = prefetchUniqueIndices(ctx, txn, toBeCheckedRows); err != nil { return err } + if e.stats != nil { + e.stats.prefetch += time.Since(prefetchStart) + } // append warnings and get no duplicated error rows for i, r := range toBeCheckedRows { @@ -997,6 +1011,7 @@ func (e *InsertValues) batchCheckAndInsert(ctx context.Context, rows [][]types.D return err } } + // If row was checked with no duplicate keys, // it should be add to values map for the further row check. // There may be duplicate keys inside the insert statement. @@ -1008,6 +1023,9 @@ func (e *InsertValues) batchCheckAndInsert(ctx context.Context, rows [][]types.D } } } + if e.stats != nil { + e.stats.checkInsertTime += time.Since(start) + } return nil } @@ -1034,3 +1052,68 @@ func (e *InsertValues) addRecordWithAutoIDHint(ctx context.Context, row []types. } return nil } + +type insertRuntimeStat struct { + *execdetails.BasicRuntimeStats + *tikv.SnapshotRuntimeStats + checkInsertTime time.Duration + prefetch time.Duration +} + +func (e *insertRuntimeStat) String() string { + if e.checkInsertTime == 0 { + // For replace statement. + if e.prefetch > 0 && e.SnapshotRuntimeStats != nil { + return fmt.Sprintf("prefetch: %v, rpc:{%v}", e.prefetch, e.SnapshotRuntimeStats.String()) + } + return "" + } + buf := bytes.NewBuffer(make([]byte, 0, 32)) + buf.WriteString(fmt.Sprintf("prepare:%v, ", time.Duration(e.BasicRuntimeStats.GetTime())-e.checkInsertTime)) + if e.prefetch > 0 { + buf.WriteString(fmt.Sprintf("check_insert:{total_time:%v, mem_insert_time:%v, prefetch:%v", e.checkInsertTime, e.checkInsertTime-e.prefetch, e.prefetch)) + if e.SnapshotRuntimeStats != nil { + buf.WriteString(fmt.Sprintf(", rpc:{%s}", e.SnapshotRuntimeStats.String())) + } + buf.WriteString("}") + } else { + buf.WriteString(fmt.Sprintf("insert:%v", e.checkInsertTime)) + } + return buf.String() +} + +// Clone implements the RuntimeStats interface. +func (e *insertRuntimeStat) Clone() execdetails.RuntimeStats { + newRs := &insertRuntimeStat{ + checkInsertTime: e.checkInsertTime, + prefetch: e.prefetch, + } + if e.SnapshotRuntimeStats != nil { + snapshotStats := e.SnapshotRuntimeStats.Clone() + newRs.SnapshotRuntimeStats = snapshotStats.(*tikv.SnapshotRuntimeStats) + } + return newRs +} + +// Merge implements the RuntimeStats interface. +func (e *insertRuntimeStat) Merge(other execdetails.RuntimeStats) { + tmp, ok := other.(*insertRuntimeStat) + if !ok { + return + } + if tmp.SnapshotRuntimeStats != nil { + if e.SnapshotRuntimeStats == nil { + snapshotStats := tmp.SnapshotRuntimeStats.Clone() + e.SnapshotRuntimeStats = snapshotStats.(*tikv.SnapshotRuntimeStats) + } else { + e.SnapshotRuntimeStats.Merge(tmp.SnapshotRuntimeStats) + } + } + e.prefetch += tmp.prefetch + e.checkInsertTime += tmp.checkInsertTime +} + +// Tp implements the RuntimeStats interface. +func (e *insertRuntimeStat) Tp() int { + return execdetails.TpInsertRuntimeStat +} diff --git a/executor/replace.go b/executor/replace.go index cbe8b5aa9fb38..5a3e1d3ece800 100644 --- a/executor/replace.go +++ b/executor/replace.go @@ -17,6 +17,7 @@ import ( "context" "fmt" "runtime/trace" + "time" "github.com/pingcap/errors" "github.com/pingcap/parser/mysql" @@ -200,13 +201,15 @@ func (e *ReplaceExec) exec(ctx context.Context, newRows [][]types.Datum) error { defer snapshot.DelOption(kv.CollectRuntimeStats) } } - + prefetchStart := time.Now() // Use BatchGet to fill cache. // It's an optimization and could be removed without affecting correctness. if err = prefetchDataCache(ctx, txn, toBeCheckedRows); err != nil { return err } - + if e.stats != nil { + e.stats.prefetch = time.Since(prefetchStart) + } e.ctx.GetSessionVars().StmtCtx.AddRecordRows(uint64(len(newRows))) for _, r := range toBeCheckedRows { err = e.replaceRow(ctx, r) diff --git a/store/tikv/scan.go b/store/tikv/scan.go index a69d3aa402452..479e9a95b37c0 100644 --- a/store/tikv/scan.go +++ b/store/tikv/scan.go @@ -144,7 +144,8 @@ func (s *Scanner) startTS() uint64 { } func (s *Scanner) resolveCurrentLock(bo *Backoffer, current *pb.KvPair) error { - val, err := s.snapshot.get(bo, current.Key) + ctx := context.Background() + val, err := s.snapshot.get(ctx, bo, current.Key) if err != nil { return errors.Trace(err) } diff --git a/store/tikv/snapshot.go b/store/tikv/snapshot.go index 045c2fdbff9eb..c0ab5cb6ffaf9 100644 --- a/store/tikv/snapshot.go +++ b/store/tikv/snapshot.go @@ -317,11 +317,6 @@ func (s *tikvSnapshot) batchGetSingleRegion(bo *Backoffer, batch batchKeys, coll // Get gets the value for key k from snapshot. func (s *tikvSnapshot) Get(ctx context.Context, k kv.Key) ([]byte, error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("tikvSnapshot.get", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } defer func(start time.Time) { tikvTxnCmdHistogramWithGet.Observe(time.Since(start).Seconds()) @@ -329,7 +324,7 @@ func (s *tikvSnapshot) Get(ctx context.Context, k kv.Key) ([]byte, error) { ctx = context.WithValue(ctx, txnStartKey, s.version.Ver) bo := NewBackofferWithVars(ctx, getMaxBackoff, s.vars) - val, err := s.get(bo, k) + val, err := s.get(ctx, bo, k) s.recordBackoffInfo(bo) if err != nil { return nil, errors.Trace(err) @@ -345,7 +340,7 @@ func (s *tikvSnapshot) Get(ctx context.Context, k kv.Key) ([]byte, error) { return val, nil } -func (s *tikvSnapshot) get(bo *Backoffer, k kv.Key) ([]byte, error) { +func (s *tikvSnapshot) get(ctx context.Context, bo *Backoffer, k kv.Key) ([]byte, error) { // Check the cached values first. s.mu.RLock() if s.mu.cached != nil { @@ -356,7 +351,11 @@ func (s *tikvSnapshot) get(bo *Backoffer, k kv.Key) ([]byte, error) { } } s.mu.RUnlock() - + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span1 := span.Tracer().StartSpan("tikvSnapshot.get", opentracing.ChildOf(span.Context())) + defer span1.Finish() + opentracing.ContextWithSpan(ctx, span1) + } failpoint.Inject("snapshot-get-cache-fail", func(_ failpoint.Value) { if bo.ctx.Value("TestSnapshotCache") != nil { panic("cache miss") diff --git a/util/execdetails/execdetails.go b/util/execdetails/execdetails.go index 3da02d56185a2..5b7c28e2d8909 100644 --- a/util/execdetails/execdetails.go +++ b/util/execdetails/execdetails.go @@ -430,6 +430,8 @@ const ( TpJoinRuntimeStats // TpSelectResultRuntimeStats is the tp for SelectResultRuntimeStats. TpSelectResultRuntimeStats + // TpInsertRuntimeStat is the tp for InsertRuntimeStat + TpInsertRuntimeStat ) // RuntimeStats is used to express the executor runtime information. @@ -548,6 +550,11 @@ func (e *BasicRuntimeStats) String() string { return fmt.Sprintf("time:%v, loops:%d", time.Duration(e.consume), e.loop) } +// GetTime get the int64 total time +func (e *BasicRuntimeStats) GetTime() int64 { + return e.consume +} + // RuntimeStatsColl collects executors's execution info. type RuntimeStatsColl struct { mu sync.Mutex From a8b06778c4c5d5f99c51197cbe3cc49c7c21cfc2 Mon Sep 17 00:00:00 2001 From: xhe Date: Thu, 24 Sep 2020 10:44:37 +0800 Subject: [PATCH 16/60] ddl: add verification for placement rule request (#20191) Signed-off-by: xhe --- domain/infosync/info.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/domain/infosync/info.go b/domain/infosync/info.go index fd427341ba3ff..bb6e7864f6823 100644 --- a/domain/infosync/info.go +++ b/domain/infosync/info.go @@ -278,10 +278,10 @@ func doRequest(ctx context.Context, addrs []string, route, method string, body i var res *http.Response for _, addr := range addrs { var url string - if strings.HasPrefix(addr, "http://") { + if strings.HasPrefix(addr, "http") { url = fmt.Sprintf("%s%s", addr, route) } else { - url = fmt.Sprintf("http://%s%s", addr, route) + url = fmt.Sprintf("%s://%s%s", util2.InternalHTTPSchema(), addr, route) } if ctx != nil { @@ -296,7 +296,7 @@ func doRequest(ctx context.Context, addrs []string, route, method string, body i req.Header.Set("Content-Type", "application/json") } - res, err = http.DefaultClient.Do(req) + res, err = util2.InternalHTTPClient().Do(req) if err == nil { bodyBytes, err := ioutil.ReadAll(res.Body) if err != nil { From c3821173dbd6b5494f206b7a0accff06aa31a7d6 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 24 Sep 2020 14:04:09 +0800 Subject: [PATCH 17/60] store/mockstore/mocktikv: Add No Lock version of GetRegionByKey to avoid double-lock (#16826) --- store/mockstore/mocktikv/cluster.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/store/mockstore/mocktikv/cluster.go b/store/mockstore/mocktikv/cluster.go index d6064e6d2281f..d7131647a69b6 100644 --- a/store/mockstore/mocktikv/cluster.go +++ b/store/mockstore/mocktikv/cluster.go @@ -237,6 +237,11 @@ func (c *Cluster) GetRegionByKey(key []byte) (*metapb.Region, *metapb.Peer) { c.RLock() defer c.RUnlock() + return c.getRegionByKeyNoLock(key) +} + +// getRegionByKeyNoLock returns the Region and its leader whose range contains the key without Lock. +func (c *Cluster) getRegionByKeyNoLock(key []byte) (*metapb.Region, *metapb.Peer) { for _, r := range c.regions { if regionContains(r.Meta.StartKey, r.Meta.EndKey, key) { return proto.Clone(r.Meta).(*metapb.Region), proto.Clone(r.leaderPeer()).(*metapb.Peer) @@ -250,7 +255,7 @@ func (c *Cluster) GetPrevRegionByKey(key []byte) (*metapb.Region, *metapb.Peer) c.RLock() defer c.RUnlock() - currentRegion, _ := c.GetRegionByKey(key) + currentRegion, _ := c.getRegionByKeyNoLock(key) if len(currentRegion.StartKey) == 0 { return nil, nil } From 1b0763260ce0ae368af8ec69a375470bcc81d65a Mon Sep 17 00:00:00 2001 From: Jack Yu Date: Thu, 24 Sep 2020 15:12:15 +0800 Subject: [PATCH 18/60] go.mod: update br (#20162) Co-authored-by: ti-srebot <66930949+ti-srebot@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6f6d0656bf55b..96035958f5abf 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/opentracing/opentracing-go v1.1.0 github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 github.com/pingcap/badger v1.5.1-0.20200908111422-2e78ee155d19 - github.com/pingcap/br v0.0.0-20200918114808-5af97a1a579f + github.com/pingcap/br v0.0.0-20200923023944-7456456854e4 github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 github.com/pingcap/errors v0.11.5-0.20200917111840-a15ef68f753d github.com/pingcap/failpoint v0.0.0-20200702092429-9f69995143ce diff --git a/go.sum b/go.sum index f9db7823700d5..22bf0cdfafa9c 100644 --- a/go.sum +++ b/go.sum @@ -453,8 +453,8 @@ github.com/pingcap/br v0.0.0-20200803052654-e6f63fc1807a/go.mod h1:8j7vGUfHCETYb github.com/pingcap/br v0.0.0-20200805121136-181c081ba6ac/go.mod h1:9P24mNzNmXjggYBm4pnb08slSbua8FA6QIyg68GpuhQ= github.com/pingcap/br v0.0.0-20200820083933-d9d6207c0aa7 h1:7YWkuK/QY7/nz819lnxb0qDXqLrApDjZHjYPo+tduGA= github.com/pingcap/br v0.0.0-20200820083933-d9d6207c0aa7/go.mod h1:5ri8663t7CtJuG0kiOKKoBmwk9HOCX5MoKpmh1fW4CE= -github.com/pingcap/br v0.0.0-20200918114808-5af97a1a579f h1:zyeF39OhLcFH4Aeal9o11L4fIHgylTvKqfYK/dRoasQ= -github.com/pingcap/br v0.0.0-20200918114808-5af97a1a579f/go.mod h1:DGsMcZVYt2haeDF/xGerf77c2RpTymgYY5+bMg8uArA= +github.com/pingcap/br v0.0.0-20200923023944-7456456854e4 h1:f1e1xbBAMc6mOrnBtrPRke52Zxv8zVlyr5g0Tz/pySQ= +github.com/pingcap/br v0.0.0-20200923023944-7456456854e4/go.mod h1:DGsMcZVYt2haeDF/xGerf77c2RpTymgYY5+bMg8uArA= github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= github.com/pingcap/check v0.0.0-20191107115940-caf2b9e6ccf4/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= From aceecf07327600faa44db3ab29d400d22823fd05 Mon Sep 17 00:00:00 2001 From: lei yu Date: Thu, 24 Sep 2020 15:59:38 +0800 Subject: [PATCH 19/60] executor: support new aggregate funtion APPROX_PERCENTILE (#19799) Signed-off-by: leiysky --- executor/aggfuncs/aggfunc_test.go | 3 + executor/aggfuncs/aggfuncs.go | 5 + executor/aggfuncs/builder.go | 45 +- executor/aggfuncs/func_percentile.go | 389 ++++++++++++++++++ executor/aggfuncs/func_percentile_test.go | 37 ++ expression/aggregation/aggregation.go | 5 +- expression/aggregation/base_func.go | 59 ++- expression/aggregation/descriptor.go | 2 +- go.sum | 1 + .../testdata/integration_suite_in.json | 3 +- .../testdata/integration_suite_out.json | 13 + planner/core/integration_test.go | 26 ++ planner/core/rule_aggregation_push_down.go | 4 +- .../core/testdata/integration_suite_in.json | 15 +- .../core/testdata/integration_suite_out.json | 63 +++ util/selection/selection.go | 164 ++++++++ util/selection/selection_test.go | 232 +++++++++++ 17 files changed, 1048 insertions(+), 18 deletions(-) create mode 100644 executor/aggfuncs/func_percentile.go create mode 100644 executor/aggfuncs/func_percentile_test.go create mode 100644 util/selection/selection.go create mode 100644 util/selection/selection_test.go diff --git a/executor/aggfuncs/aggfunc_test.go b/executor/aggfuncs/aggfunc_test.go index e0d9abba13f64..d7dc3703dd4a9 100644 --- a/executor/aggfuncs/aggfunc_test.go +++ b/executor/aggfuncs/aggfunc_test.go @@ -591,6 +591,9 @@ func (s *testSuite) testAggFunc(c *C, p aggTest) { if p.funcName == ast.AggFuncGroupConcat { args = append(args, &expression.Constant{Value: types.NewStringDatum(" "), RetType: types.NewFieldType(mysql.TypeString)}) } + if p.funcName == ast.AggFuncApproxPercentile { + args = append(args, &expression.Constant{Value: types.NewIntDatum(50), RetType: types.NewFieldType(mysql.TypeLong)}) + } desc, err := aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, false) c.Assert(err, IsNil) if p.orderBy { diff --git a/executor/aggfuncs/aggfuncs.go b/executor/aggfuncs/aggfuncs.go index 87229c530671b..279c2e2ed7217 100644 --- a/executor/aggfuncs/aggfuncs.go +++ b/executor/aggfuncs/aggfuncs.go @@ -46,6 +46,11 @@ var ( _ AggFunc = (*approxCountDistinctPartial2)(nil) _ AggFunc = (*approxCountDistinctFinal)(nil) + // All the AggFunc implementations for "APPROX_PERCENTILE" are listed here. + _ AggFunc = (*percentileOriginal4Int)(nil) + _ AggFunc = (*percentileOriginal4Real)(nil) + _ AggFunc = (*percentileOriginal4Decimal)(nil) + // All the AggFunc implementations for "FIRSTROW" are listed here. _ AggFunc = (*firstRow4Decimal)(nil) _ AggFunc = (*firstRow4Int)(nil) diff --git a/executor/aggfuncs/builder.go b/executor/aggfuncs/builder.go index 3d8845b36454f..a8a9780289751 100644 --- a/executor/aggfuncs/builder.go +++ b/executor/aggfuncs/builder.go @@ -25,6 +25,8 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" ) // Build is used to build a specific AggFunc implementation according to the @@ -53,12 +55,14 @@ func Build(ctx sessionctx.Context, aggFuncDesc *aggregation.AggFuncDesc, ordinal return buildBitAnd(aggFuncDesc, ordinal) case ast.AggFuncVarPop: return buildVarPop(aggFuncDesc, ordinal) + case ast.AggFuncStddevPop: + return buildStdDevPop(aggFuncDesc, ordinal) case ast.AggFuncJsonObjectAgg: return buildJSONObjectAgg(aggFuncDesc, ordinal) case ast.AggFuncApproxCountDistinct: return buildApproxCountDistinct(aggFuncDesc, ordinal) - case ast.AggFuncStddevPop: - return buildStdDevPop(aggFuncDesc, ordinal) + case ast.AggFuncApproxPercentile: + return buildApproxPercentile(ctx, aggFuncDesc, ordinal) case ast.AggFuncVarSamp: return buildVarSamp(aggFuncDesc, ordinal) case ast.AggFuncStddevSamp: @@ -135,6 +139,43 @@ func buildApproxCountDistinct(aggFuncDesc *aggregation.AggFuncDesc, ordinal int) return nil } +func buildApproxPercentile(sctx sessionctx.Context, aggFuncDesc *aggregation.AggFuncDesc, ordinal int) AggFunc { + if aggFuncDesc.Mode == aggregation.DedupMode { + return nil + } + + // Checked while building descriptor + percent, _, err := aggFuncDesc.Args[1].EvalInt(sctx, chunk.Row{}) + if err != nil { + // Should not reach here + logutil.BgLogger().Error("Error happened when buildApproxPercentile", zap.Error(err)) + return nil + } + + base := basePercentile{percent: int(percent), baseAggFunc: baseAggFunc{args: aggFuncDesc.Args, ordinal: ordinal}} + + switch aggFuncDesc.Mode { + case aggregation.CompleteMode, aggregation.Partial1Mode, aggregation.FinalMode: + switch aggFuncDesc.Args[0].GetType().EvalType() { + case types.ETInt: + return &percentileOriginal4Int{base} + case types.ETReal: + return &percentileOriginal4Real{base} + case types.ETDecimal: + return &percentileOriginal4Decimal{base} + case types.ETDatetime, types.ETTimestamp: + return &percentileOriginal4Time{base} + case types.ETDuration: + return &percentileOriginal4Duration{base} + default: + // Return NULL in any case + return &base + } + } + + return nil +} + // buildCount builds the AggFunc implementation for function "COUNT". func buildCount(aggFuncDesc *aggregation.AggFuncDesc, ordinal int) AggFunc { // If mode is DedupMode, we return nil for not implemented. diff --git a/executor/aggfuncs/func_percentile.go b/executor/aggfuncs/func_percentile.go new file mode 100644 index 0000000000000..31855f791fb0f --- /dev/null +++ b/executor/aggfuncs/func_percentile.go @@ -0,0 +1,389 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package aggfuncs + +import ( + "math" + "sort" + "unsafe" + + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/selection" +) + +const ( + // DefSliceSize represents size of an empty Slice + DefSliceSize = int64(unsafe.Sizeof([]interface{}{})) +) + +var ( + _ partialResult4Percentile = partialResult4PercentileInt{} + _ partialResult4Percentile = partialResult4PercentileReal{} + _ partialResult4Percentile = partialResult4PercentileDecimal{} + _ partialResult4Percentile = partialResult4PercentileTime{} + _ partialResult4Percentile = partialResult4PercentileDuration{} +) + +func percentile(data sort.Interface, percent int) int { + // Ordinal rank k = Ceil(P / 100 * N) + k := int(math.Ceil(float64(data.Len()) / 100 * float64(percent))) + return selection.Select(data, k) +} + +type basePercentile struct { + percent int + + baseAggFunc +} + +func (e *basePercentile) AllocPartialResult() (pr PartialResult, memDelta int64) { + return +} + +func (e *basePercentile) ResetPartialResult(pr PartialResult) { + return +} + +func (e *basePercentile) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup []chunk.Row, pr PartialResult) (memDelta int64, err error) { + return +} + +func (e *basePercentile) AppendFinalResult2Chunk(sctx sessionctx.Context, pr PartialResult, chk *chunk.Chunk) error { + chk.AppendNull(e.ordinal) + return nil +} + +type partialResult4Percentile interface { + sort.Interface + + MemSize() int64 +} + +type partialResult4PercentileInt []int64 + +func (p partialResult4PercentileInt) Len() int { return len(p) } +func (p partialResult4PercentileInt) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p partialResult4PercentileInt) Less(i, j int) bool { return p[i] < p[j] } + +func (p partialResult4PercentileInt) MemSize() int64 { + return DefSliceSize + int64(len(p))*DefInt64Size +} + +type partialResult4PercentileReal []float64 + +func (p partialResult4PercentileReal) Len() int { return len(p) } +func (p partialResult4PercentileReal) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p partialResult4PercentileReal) Less(i, j int) bool { return p[i] < p[j] } + +func (p partialResult4PercentileReal) MemSize() int64 { + return DefSliceSize + int64(len(p))*DefFloat64Size +} + +// TODO: use []*types.MyDecimal to prevent massive value copy +type partialResult4PercentileDecimal []types.MyDecimal + +func (p partialResult4PercentileDecimal) Len() int { return len(p) } +func (p partialResult4PercentileDecimal) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p partialResult4PercentileDecimal) Less(i, j int) bool { return p[i].Compare(&p[j]) < 0 } + +func (p partialResult4PercentileDecimal) MemSize() int64 { + return DefSliceSize + int64(len(p))*int64(types.MyDecimalStructSize) +} + +type partialResult4PercentileTime []types.Time + +func (p partialResult4PercentileTime) Len() int { return len(p) } +func (p partialResult4PercentileTime) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p partialResult4PercentileTime) Less(i, j int) bool { return p[i].Compare(p[j]) < 0 } + +func (p partialResult4PercentileTime) MemSize() int64 { + return DefSliceSize + int64(len(p))*DefInt64Size +} + +type partialResult4PercentileDuration []types.Duration + +func (p partialResult4PercentileDuration) Len() int { return len(p) } +func (p partialResult4PercentileDuration) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p partialResult4PercentileDuration) Less(i, j int) bool { return p[i].Compare(p[j]) < 0 } + +func (p partialResult4PercentileDuration) MemSize() int64 { + return DefSliceSize + int64(len(p))*DefInt64Size +} + +type percentileOriginal4Int struct { + basePercentile +} + +func (e *percentileOriginal4Int) AllocPartialResult() (pr PartialResult, memDelta int64) { + // TODO: Preserve appropriate capacity for data + pr = PartialResult(&partialResult4PercentileInt{}) + return pr, DefSliceSize +} + +func (e *percentileOriginal4Int) ResetPartialResult(pr PartialResult) { + p := (*partialResult4PercentileInt)(pr) + *p = partialResult4PercentileInt{} +} + +func (e *percentileOriginal4Int) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup []chunk.Row, pr PartialResult) (memDelta int64, err error) { + p := (*partialResult4PercentileInt)(pr) + startMem := p.MemSize() + for _, row := range rowsInGroup { + v, isNull, err := e.args[0].EvalInt(sctx, row) + if err != nil { + return 0, err + } + if isNull { + continue + } + *p = append(*p, v) + } + endMem := p.MemSize() + return endMem - startMem, nil +} + +func (e *percentileOriginal4Int) MergePartialResult(sctx sessionctx.Context, src, dst PartialResult) (memDelta int64, err error) { + p1, p2 := (*partialResult4PercentileInt)(src), (*partialResult4PercentileInt)(dst) + mergeBuff := make([]int64, len(*p1)+len(*p2)) + copy(mergeBuff, *p2) + copy(mergeBuff[len(*p2):], *p1) + *p1 = nil + *p2 = mergeBuff + return 0, nil +} + +func (e *percentileOriginal4Int) AppendFinalResult2Chunk(sctx sessionctx.Context, pr PartialResult, chk *chunk.Chunk) error { + p := (*partialResult4PercentileInt)(pr) + if len(*p) == 0 { + chk.AppendNull(e.ordinal) + return nil + } + index := percentile(p, e.percent) + chk.AppendInt64(e.ordinal, (*p)[index]) + return nil +} + +type percentileOriginal4Real struct { + basePercentile +} + +func (e *percentileOriginal4Real) AllocPartialResult() (pr PartialResult, memDelta int64) { + // TODO: Preserve appropriate capacity for data + pr = PartialResult(&partialResult4PercentileReal{}) + return pr, DefSliceSize +} + +func (e *percentileOriginal4Real) ResetPartialResult(pr PartialResult) { + p := (*partialResult4PercentileReal)(pr) + *p = partialResult4PercentileReal{} +} + +func (e *percentileOriginal4Real) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup []chunk.Row, pr PartialResult) (memDelta int64, err error) { + p := (*partialResult4PercentileReal)(pr) + startMem := p.MemSize() + for _, row := range rowsInGroup { + v, isNull, err := e.args[0].EvalReal(sctx, row) + if err != nil { + return 0, err + } + if isNull { + continue + } + *p = append(*p, v) + } + endMem := p.MemSize() + return endMem - startMem, nil +} + +func (e *percentileOriginal4Real) MergePartialResult(sctx sessionctx.Context, src, dst PartialResult) (memDelta int64, err error) { + p1, p2 := (*partialResult4PercentileReal)(src), (*partialResult4PercentileReal)(dst) + mergeBuff := make([]float64, len(*p1)+len(*p2)) + copy(mergeBuff, *p2) + copy(mergeBuff[len(*p2):], *p1) + *p1 = nil + *p2 = mergeBuff + return 0, nil +} + +func (e *percentileOriginal4Real) AppendFinalResult2Chunk(sctx sessionctx.Context, pr PartialResult, chk *chunk.Chunk) error { + p := (*partialResult4PercentileReal)(pr) + if len(*p) == 0 { + chk.AppendNull(e.ordinal) + return nil + } + index := percentile(*p, e.percent) + chk.AppendFloat64(e.ordinal, (*p)[index]) + return nil +} + +type percentileOriginal4Decimal struct { + basePercentile +} + +func (e *percentileOriginal4Decimal) AllocPartialResult() (pr PartialResult, memDelta int64) { + // TODO: Preserve appropriate capacity for data + pr = PartialResult(&partialResult4PercentileDecimal{}) + return pr, DefSliceSize +} + +func (e *percentileOriginal4Decimal) ResetPartialResult(pr PartialResult) { + p := (*partialResult4PercentileDecimal)(pr) + *p = partialResult4PercentileDecimal{} +} + +func (e *percentileOriginal4Decimal) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup []chunk.Row, pr PartialResult) (memDelta int64, err error) { + p := (*partialResult4PercentileDecimal)(pr) + startMem := p.MemSize() + for _, row := range rowsInGroup { + v, isNull, err := e.args[0].EvalDecimal(sctx, row) + if err != nil { + return 0, err + } + if isNull { + continue + } + *p = append(*p, *v) + } + endMem := p.MemSize() + return endMem - startMem, nil +} + +func (e *percentileOriginal4Decimal) MergePartialResult(sctx sessionctx.Context, src, dst PartialResult) (memDelta int64, err error) { + p1, p2 := (*partialResult4PercentileDecimal)(src), (*partialResult4PercentileDecimal)(dst) + mergeBuff := make([]types.MyDecimal, len(*p1)+len(*p2)) + copy(mergeBuff, *p2) + copy(mergeBuff[len(*p2):], *p1) + *p1 = nil + *p2 = mergeBuff + return 0, nil +} + +func (e *percentileOriginal4Decimal) AppendFinalResult2Chunk(sctx sessionctx.Context, pr PartialResult, chk *chunk.Chunk) error { + p := (*partialResult4PercentileDecimal)(pr) + if len(*p) == 0 { + chk.AppendNull(e.ordinal) + return nil + } + index := percentile(*p, e.percent) + chk.AppendMyDecimal(e.ordinal, &(*p)[index]) + return nil +} + +type percentileOriginal4Time struct { + basePercentile +} + +func (e *percentileOriginal4Time) AllocPartialResult() (pr PartialResult, memDelta int64) { + // TODO: Preserve appropriate capacity for data + pr = PartialResult(&partialResult4PercentileTime{}) + return pr, DefSliceSize +} + +func (e *percentileOriginal4Time) ResetPartialResult(pr PartialResult) { + p := (*partialResult4PercentileTime)(pr) + *p = partialResult4PercentileTime{} +} + +func (e *percentileOriginal4Time) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup []chunk.Row, pr PartialResult) (memDelta int64, err error) { + p := (*partialResult4PercentileTime)(pr) + startMem := p.MemSize() + for _, row := range rowsInGroup { + v, isNull, err := e.args[0].EvalTime(sctx, row) + if err != nil { + return 0, err + } + if isNull { + continue + } + *p = append(*p, v) + } + endMem := p.MemSize() + return endMem - startMem, nil +} + +func (e *percentileOriginal4Time) MergePartialResult(sctx sessionctx.Context, src, dst PartialResult) (memDelta int64, err error) { + p1, p2 := (*partialResult4PercentileTime)(src), (*partialResult4PercentileTime)(dst) + mergeBuff := make(partialResult4PercentileTime, len(*p1)+len(*p2)) + copy(mergeBuff, *p2) + copy(mergeBuff[len(*p2):], *p1) + *p1 = nil + *p2 = mergeBuff + return 0, nil +} + +func (e *percentileOriginal4Time) AppendFinalResult2Chunk(sctx sessionctx.Context, pr PartialResult, chk *chunk.Chunk) error { + p := (*partialResult4PercentileTime)(pr) + if len(*p) == 0 { + chk.AppendNull(e.ordinal) + return nil + } + index := percentile(p, e.percent) + chk.AppendTime(e.ordinal, (*p)[index]) + return nil +} + +type percentileOriginal4Duration struct { + basePercentile +} + +func (e *percentileOriginal4Duration) AllocPartialResult() (pr PartialResult, memDelta int64) { + // TODO: Preserve appropriate capacity for data + pr = PartialResult(&partialResult4PercentileTime{}) + return pr, DefSliceSize +} + +func (e *percentileOriginal4Duration) ResetPartialResult(pr PartialResult) { + p := (*partialResult4PercentileDuration)(pr) + *p = partialResult4PercentileDuration{} +} + +func (e *percentileOriginal4Duration) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup []chunk.Row, pr PartialResult) (memDelta int64, err error) { + p := (*partialResult4PercentileDuration)(pr) + startMem := p.MemSize() + for _, row := range rowsInGroup { + v, isNull, err := e.args[0].EvalDuration(sctx, row) + if err != nil { + return 0, err + } + if isNull { + continue + } + *p = append(*p, v) + } + endMem := p.MemSize() + return endMem - startMem, nil +} + +func (e *percentileOriginal4Duration) MergePartialResult(sctx sessionctx.Context, src, dst PartialResult) (memDelta int64, err error) { + p1, p2 := (*partialResult4PercentileDuration)(src), (*partialResult4PercentileDuration)(dst) + mergeBuff := make(partialResult4PercentileDuration, len(*p1)+len(*p2)) + copy(mergeBuff, *p2) + copy(mergeBuff[len(*p2):], *p1) + *p1 = nil + *p2 = mergeBuff + return 0, nil +} +func (e *percentileOriginal4Duration) AppendFinalResult2Chunk(sctx sessionctx.Context, pr PartialResult, chk *chunk.Chunk) error { + p := (*partialResult4PercentileDuration)(pr) + if len(*p) == 0 { + chk.AppendNull(e.ordinal) + return nil + } + index := percentile(*p, e.percent) + + chk.AppendDuration(e.ordinal, (*p)[index]) + return nil +} diff --git a/executor/aggfuncs/func_percentile_test.go b/executor/aggfuncs/func_percentile_test.go new file mode 100644 index 0000000000000..d9c720685502f --- /dev/null +++ b/executor/aggfuncs/func_percentile_test.go @@ -0,0 +1,37 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package aggfuncs_test + +import ( + "time" + + . "github.com/pingcap/check" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/types" +) + +func (s *testSuite) TestPercentile(c *C) { + tests := []aggTest{ + buildAggTester(ast.AggFuncApproxPercentile, mysql.TypeLonglong, 5, nil, 2), + buildAggTester(ast.AggFuncApproxPercentile, mysql.TypeFloat, 5, nil, 2.0), + buildAggTester(ast.AggFuncApproxPercentile, mysql.TypeDouble, 5, nil, 2.0), + buildAggTester(ast.AggFuncApproxPercentile, mysql.TypeNewDecimal, 5, nil, types.NewDecFromFloatForTest(2.0)), + buildAggTester(ast.AggFuncApproxPercentile, mysql.TypeDate, 5, nil, types.TimeFromDays(367)), + buildAggTester(ast.AggFuncApproxPercentile, mysql.TypeDuration, 5, nil, types.Duration{Duration: time.Duration(2)}), + } + for _, test := range tests { + s.testAggFunc(c, test) + } +} diff --git a/expression/aggregation/aggregation.go b/expression/aggregation/aggregation.go index b76233af80e73..39ae1190dcb94 100644 --- a/expression/aggregation/aggregation.go +++ b/expression/aggregation/aggregation.go @@ -172,7 +172,7 @@ func NeedCount(name string) bool { func NeedValue(name string) bool { switch name { case ast.AggFuncSum, ast.AggFuncAvg, ast.AggFuncFirstRow, ast.AggFuncMax, ast.AggFuncMin, - ast.AggFuncGroupConcat, ast.AggFuncBitOr, ast.AggFuncBitAnd, ast.AggFuncBitXor: + ast.AggFuncGroupConcat, ast.AggFuncBitOr, ast.AggFuncBitAnd, ast.AggFuncBitXor, ast.AggFuncApproxPercentile: return true default: return false @@ -194,6 +194,9 @@ func CheckAggPushDown(aggFunc *AggFuncDesc, storeType kv.StoreType) bool { if len(aggFunc.OrderByItems) > 0 { return false } + if aggFunc.Name == ast.AggFuncApproxPercentile { + return false + } ret := true switch storeType { case kv.TiFlash: diff --git a/expression/aggregation/base_func.go b/expression/aggregation/base_func.go index bc46d1843aea3..9cac708aba9ab 100644 --- a/expression/aggregation/base_func.go +++ b/expression/aggregation/base_func.go @@ -15,6 +15,7 @@ package aggregation import ( "bytes" + "fmt" "math" "strings" @@ -26,6 +27,7 @@ import ( "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" ) // baseFuncDesc describes an function signature, only used in planner. @@ -88,6 +90,8 @@ func (a *baseFuncDesc) typeInfer(ctx sessionctx.Context) error { a.typeInfer4Count(ctx) case ast.AggFuncApproxCountDistinct: a.typeInfer4ApproxCountDistinct(ctx) + case ast.AggFuncApproxPercentile: + return a.typeInfer4ApproxPercentile(ctx) case ast.AggFuncSum: a.typeInfer4Sum(ctx) case ast.AggFuncAvg: @@ -132,6 +136,45 @@ func (a *baseFuncDesc) typeInfer4ApproxCountDistinct(ctx sessionctx.Context) { a.typeInfer4Count(ctx) } +func (a *baseFuncDesc) typeInfer4ApproxPercentile(ctx sessionctx.Context) error { + if len(a.Args) != 2 { + return errors.New("APPROX_PERCENTILE should take 2 arguments") + } + + if !a.Args[1].ConstItem(ctx.GetSessionVars().StmtCtx) { + return errors.New("APPROX_PERCENTILE should take a constant expression as percentage argument") + } + percent, isNull, err := a.Args[1].EvalInt(ctx, chunk.Row{}) + if err != nil { + return errors.New(fmt.Sprintf("APPROX_PERCENTILE: Invalid argument %s", a.Args[1].String())) + } + if percent <= 0 || percent > 100 || isNull { + if isNull { + return errors.New("APPROX_PERCENTILE: Percentage value cannot be NULL") + } + return errors.New(fmt.Sprintf("Percentage value %d is out of range [1, 100]", percent)) + } + + switch a.Args[0].GetType().Tp { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: + a.RetTp = types.NewFieldType(mysql.TypeLonglong) + case mysql.TypeDouble, mysql.TypeFloat: + a.RetTp = types.NewFieldType(mysql.TypeDouble) + case mysql.TypeNewDecimal: + a.RetTp = types.NewFieldType(mysql.TypeNewDecimal) + a.RetTp.Flen, a.RetTp.Decimal = mysql.MaxDecimalWidth, a.Args[0].GetType().Decimal + if a.RetTp.Decimal < 0 || a.RetTp.Decimal > mysql.MaxDecimalScale { + a.RetTp.Decimal = mysql.MaxDecimalScale + } + case mysql.TypeDate, mysql.TypeDatetime, mysql.TypeNewDate, mysql.TypeTimestamp: + a.RetTp = a.Args[0].GetType().Clone() + default: + a.RetTp = a.Args[0].GetType().Clone() + a.RetTp.Flag &= ^mysql.NotNullFlag + } + return nil +} + // typeInfer4Sum should returns a "decimal", otherwise it returns a "double". // Because child returns integer or decimal type. func (a *baseFuncDesc) typeInfer4Sum(ctx sessionctx.Context) { @@ -269,13 +312,12 @@ func (a *baseFuncDesc) typeInfer4PopOrSamp(ctx sessionctx.Context) { // | t | a | int(11) | // +-------+---------+---------+ // -// Query: `select avg(a), sum(a), count(a), bit_xor(a), bit_or(a), bit_and(a), max(a), min(a), group_concat(a), approx_count_distinct(a) from test.t;` -//+--------+--------+----------+------------+-----------+----------------------+--------+--------+-----------------+--------------------------+ -//| avg(a) | sum(a) | count(a) | bit_xor(a) | bit_or(a) | bit_and(a) | max(a) | min(a) | group_concat(a) | approx_count_distinct(a) | -//+--------+--------+----------+------------+-----------+----------------------+--------+--------+-----------------+--------------------------+ -//| NULL | NULL | 0 | 0 | 0 | 18446744073709551615 | NULL | NULL | NULL | 0 | -//+--------+--------+----------+------------+-----------+----------------------+--------+--------+-----------------+--------------------------+ - +// Query: `select avg(a), sum(a), count(a), bit_xor(a), bit_or(a), bit_and(a), max(a), min(a), group_concat(a), approx_count_distinct(a), approx_percentile(a, 50) from test.t;` +// +--------+--------+----------+------------+-----------+----------------------+--------+--------+-----------------+--------------------------+--------------------------+ +// | avg(a) | sum(a) | count(a) | bit_xor(a) | bit_or(a) | bit_and(a) | max(a) | min(a) | group_concat(a) | approx_count_distinct(a) | approx_percentile(a, 50) | +// +--------+--------+----------+------------+-----------+----------------------+--------+--------+-----------------+--------------------------+--------------------------+ +// | NULL | NULL | 0 | 0 | 0 | 18446744073709551615 | NULL | NULL | NULL | 0 | NULL | +// +--------+--------+----------+------------+-----------+----------------------+--------+--------+-----------------+--------------------------+--------------------------+ func (a *baseFuncDesc) GetDefaultValue() (v types.Datum) { switch a.Name { case ast.AggFuncCount, ast.AggFuncBitOr, ast.AggFuncBitXor: @@ -285,7 +327,7 @@ func (a *baseFuncDesc) GetDefaultValue() (v types.Datum) { v = types.NewIntDatum(0) } case ast.AggFuncFirstRow, ast.AggFuncAvg, ast.AggFuncSum, ast.AggFuncMax, - ast.AggFuncMin, ast.AggFuncGroupConcat: + ast.AggFuncMin, ast.AggFuncGroupConcat, ast.AggFuncApproxPercentile: v = types.Datum{} case ast.AggFuncBitAnd: v = types.NewUintDatum(uint64(math.MaxUint64)) @@ -298,6 +340,7 @@ func (a *baseFuncDesc) GetDefaultValue() (v types.Datum) { var noNeedCastAggFuncs = map[string]struct{}{ ast.AggFuncCount: {}, ast.AggFuncApproxCountDistinct: {}, + ast.AggFuncApproxPercentile: {}, ast.AggFuncMax: {}, ast.AggFuncMin: {}, ast.AggFuncFirstRow: {}, diff --git a/expression/aggregation/descriptor.go b/expression/aggregation/descriptor.go index 97471cdcb8774..0c08c48f03961 100644 --- a/expression/aggregation/descriptor.go +++ b/expression/aggregation/descriptor.go @@ -137,7 +137,7 @@ func (a *AggFuncDesc) Split(ordinal []int) (partialAggDesc, finalAggDesc *AggFun RetType: a.RetTp, }) finalAggDesc.Args = args - if finalAggDesc.Name == ast.AggFuncGroupConcat { + if finalAggDesc.Name == ast.AggFuncGroupConcat || finalAggDesc.Name == ast.AggFuncApproxPercentile { finalAggDesc.Args = append(finalAggDesc.Args, a.Args[len(a.Args)-1]) // separator } } diff --git a/go.sum b/go.sum index 22bf0cdfafa9c..c768dc7728ab3 100644 --- a/go.sum +++ b/go.sum @@ -503,6 +503,7 @@ github.com/pingcap/kvproto v0.0.0-20200828054126-d677e6fd224a h1:/FW9upn9/MJ8e6S github.com/pingcap/kvproto v0.0.0-20200828054126-d677e6fd224a/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= +github.com/pingcap/log v0.0.0-20200511115504-543df19646ad h1:SveG82rmu/GFxYanffxsSF503SiQV+2JLnWEiGiF+Tc= github.com/pingcap/log v0.0.0-20200511115504-543df19646ad/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= github.com/pingcap/log v0.0.0-20200828042413-fce0951f1463 h1:Jboj+s4jSCp5E1WDgmRUv5rIFKFHaaSWuSZ4wMwXIcc= github.com/pingcap/log v0.0.0-20200828042413-fce0951f1463/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= diff --git a/planner/cascades/testdata/integration_suite_in.json b/planner/cascades/testdata/integration_suite_in.json index abb8ac1964b15..2aabcbf039913 100644 --- a/planner/cascades/testdata/integration_suite_in.json +++ b/planner/cascades/testdata/integration_suite_in.json @@ -46,7 +46,8 @@ "select count(distinct case when a > 0 and a <= 1000 then b end) from t", "select approx_count_distinct(case when a > 0 and a <= 1000 then b end) from t", "select count(b), sum(b), avg(b), b, max(b), min(b), bit_and(b), bit_or(b), bit_xor(b) from t group by a having sum(b) >= 0 and count(b) >= 0 order by b", - "select group_concat(a, b), min(b), avg(a / b), a from t group by (a+b), a order by a" + "select group_concat(a, b), min(b), avg(a / b), a from t group by (a+b), a order by a", + "select approx_percentile(a, 50) from t order by b" ] }, { diff --git a/planner/cascades/testdata/integration_suite_out.json b/planner/cascades/testdata/integration_suite_out.json index a56e57900e798..827bf56ab129c 100644 --- a/planner/cascades/testdata/integration_suite_out.json +++ b/planner/cascades/testdata/integration_suite_out.json @@ -478,6 +478,19 @@ "333 33 0.09090909 3", "444 44 0.09090909 4" ] + }, + { + "SQL": "select approx_percentile(a, 50) from t order by b", + "Plan": [ + "Projection_8 1.00 root Column#3", + "└─Sort_14 1.00 root test.t.b", + " └─HashAgg_11 1.00 root funcs:approx_percentile(test.t.a, 50)->Column#3, funcs:firstrow(test.t.b)->test.t.b", + " └─TableReader_12 10000.00 root data:TableFullScan_13", + " └─TableFullScan_13 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Result": [ + "2" + ] } ] }, diff --git a/planner/core/integration_test.go b/planner/core/integration_test.go index 35b701e9a2a04..1a8590704770c 100644 --- a/planner/core/integration_test.go +++ b/planner/core/integration_test.go @@ -989,6 +989,32 @@ func (s *testIntegrationSuite) TestApproxCountDistinctInPartitionTable(c *C) { tk.MustQuery("select approx_count_distinct(a), b from t group by b order by b desc").Check(testkit.Rows("1 2", "3 1")) } +func (s *testIntegrationSuite) TestApproxPercentile(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("insert into t values(1, 1), (2, 1), (3, 2), (4, 2), (5, 2)") + + var input []string + var output []struct { + SQL string + Plan []string + Res []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + tt).Rows()) + output[i].Res = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + tk.MustQuery("explain " + tt).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Res...)) + } +} + func (s *testIntegrationSuite) TestIssue17813(c *C) { tk := testkit.NewTestKit(c, s.store) diff --git a/planner/core/rule_aggregation_push_down.go b/planner/core/rule_aggregation_push_down.go index 8ad7162e50879..0c796e4b0c3f4 100644 --- a/planner/core/rule_aggregation_push_down.go +++ b/planner/core/rule_aggregation_push_down.go @@ -38,7 +38,7 @@ func (a *aggregationPushDownSolver) isDecomposableWithJoin(fun *aggregation.AggF return false } switch fun.Name { - case ast.AggFuncAvg, ast.AggFuncGroupConcat, ast.AggFuncVarPop, ast.AggFuncJsonObjectAgg, ast.AggFuncStddevPop, ast.AggFuncVarSamp, ast.AggFuncStddevSamp: + case ast.AggFuncAvg, ast.AggFuncGroupConcat, ast.AggFuncVarPop, ast.AggFuncJsonObjectAgg, ast.AggFuncStddevPop, ast.AggFuncVarSamp, ast.AggFuncStddevSamp, ast.AggFuncApproxPercentile: // TODO: Support avg push down. return false case ast.AggFuncMax, ast.AggFuncMin, ast.AggFuncFirstRow: @@ -55,7 +55,7 @@ func (a *aggregationPushDownSolver) isDecomposableWithUnion(fun *aggregation.Agg return false } switch fun.Name { - case ast.AggFuncGroupConcat, ast.AggFuncVarPop, ast.AggFuncJsonObjectAgg: + case ast.AggFuncGroupConcat, ast.AggFuncVarPop, ast.AggFuncJsonObjectAgg, ast.AggFuncApproxPercentile: return false case ast.AggFuncMax, ast.AggFuncMin, ast.AggFuncFirstRow: return true diff --git a/planner/core/testdata/integration_suite_in.json b/planner/core/testdata/integration_suite_in.json index eb1f0bf381525..62930182da16d 100644 --- a/planner/core/testdata/integration_suite_in.json +++ b/planner/core/testdata/integration_suite_in.json @@ -42,9 +42,9 @@ // Row count of IndexScan should be 2. "explain select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c = t2.c", // Row count of IndexScan should be 2. - "explain select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c <= t2.b", + "explain select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c <= t2.b", // Row count of IndexScan should be 1. - "explain select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t2.b = 1" + "explain select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t2.b = 1" ] }, { @@ -203,10 +203,19 @@ "select * from pt partition (p0) where c > 8", "select c from pt partition (p0, p2) where c > 8", "select /*+ use_index(pt, i_id) */ * from pt partition (p1, p2) where c < 3 and id = 5", - // Index Merge "select * from pt where id = 4 or c < 7", "select * from pt where id > 4 or c = 7" ] + }, + { + "name": "TestApproxPercentile", + "cases": [ + "select approx_percentile(a, 50) from t", + "select approx_percentile(a, 10) from t", + "select approx_percentile(a, 10+70) from t", + "select approx_percentile(a, 10*10) from t", + "select approx_percentile(a, 50) from t group by b order by b" + ] } ] diff --git a/planner/core/testdata/integration_suite_out.json b/planner/core/testdata/integration_suite_out.json index ee9c01da96a62..ef5c8c7c0a16c 100644 --- a/planner/core/testdata/integration_suite_out.json +++ b/planner/core/testdata/integration_suite_out.json @@ -1179,5 +1179,68 @@ ] } ] + }, + { + "Name": "TestApproxPercentile", + "Cases": [ + { + "SQL": "select approx_percentile(a, 50) from t", + "Plan": [ + "HashAgg_5 1.00 root funcs:approx_percentile(test.t.a, 50)->Column#4", + "└─TableReader_11 10000.00 root data:TableFullScan_10", + " └─TableFullScan_10 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Res": [ + "3" + ] + }, + { + "SQL": "select approx_percentile(a, 10) from t", + "Plan": [ + "HashAgg_5 1.00 root funcs:approx_percentile(test.t.a, 10)->Column#4", + "└─TableReader_11 10000.00 root data:TableFullScan_10", + " └─TableFullScan_10 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Res": [ + "1" + ] + }, + { + "SQL": "select approx_percentile(a, 10+70) from t", + "Plan": [ + "HashAgg_5 1.00 root funcs:approx_percentile(test.t.a, 80)->Column#4", + "└─TableReader_11 10000.00 root data:TableFullScan_10", + " └─TableFullScan_10 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Res": [ + "4" + ] + }, + { + "SQL": "select approx_percentile(a, 10*10) from t", + "Plan": [ + "HashAgg_5 1.00 root funcs:approx_percentile(test.t.a, 100)->Column#4", + "└─TableReader_11 10000.00 root data:TableFullScan_10", + " └─TableFullScan_10 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Res": [ + "5" + ] + }, + { + "SQL": "select approx_percentile(a, 50) from t group by b order by b", + "Plan": [ + "Projection_6 8000.00 root Column#4", + "└─Sort_7 8000.00 root test.t.b", + " └─HashAgg_9 8000.00 root group by:test.t.b, funcs:approx_percentile(test.t.a, 50)->Column#4, funcs:firstrow(test.t.b)->test.t.b", + " └─TableReader_13 10000.00 root data:TableFullScan_12", + " └─TableFullScan_12 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Res": [ + "1", + "4" + ] + } + ] } ] diff --git a/util/selection/selection.go b/util/selection/selection.go new file mode 100644 index 0000000000000..4b95939e9d93f --- /dev/null +++ b/util/selection/selection.go @@ -0,0 +1,164 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package selection + +import ( + "math/rand" + "sort" +) + +// Interface is alias of sort.Interface +type Interface = sort.Interface + +// Select performs introselect algorithm on data and return index of the k-th smallest value. +func Select(data Interface, k int) int { + if data.Len() > 0 { + return introselect(data, 0, data.Len()-1, k-1, 6) + } + return -1 +} + +// introselect will perform quickselect at beginning, and switch to linear-time algorithm if it recurses too much times. +// Source paper: http://www.cs.rpi.edu/~musser/gp/introsort.ps +func introselect(data Interface, left, right, k int, depth int) int { + if left == right { + return left + } + if depth <= 0 { + // Use median of medians algorithm(linear-time selection) when recurses too much times. + return medianOfMedians(data, left, right, k) + } + // TODO: use a better pivot function + pivotIndex := randomPivot(data, left, right) + pivotIndex = partition(data, left, right, pivotIndex) + if k == pivotIndex { + return k + } else if k < pivotIndex { + return introselect(data, left, pivotIndex-1, k, depth-1) + } else { + return introselect(data, pivotIndex+1, right, k, depth-1) + } +} + +func quickselect(data Interface, left, right, k int) int { + if left == right { + return left + } + pivotIndex := randomPivot(data, left, right) + pivotIndex = partition(data, left, right, pivotIndex) + if k == pivotIndex { + return k + } else if k < pivotIndex { + return quickselect(data, left, pivotIndex-1, k) + } else { + return quickselect(data, pivotIndex+1, right, k) + } +} + +func medianOfMedians(data Interface, left, right, k int) int { + if left == right { + return left + } + pivotIndex := medianOfMediansPivot(data, left, right) + pivotIndex = partitionIntro(data, left, right, pivotIndex, k) + if k == pivotIndex { + return k + } else if k < pivotIndex { + return medianOfMedians(data, left, pivotIndex-1, k) + } else { + return medianOfMedians(data, pivotIndex+1, right, k) + } +} + +type pivotFunc func(Interface, int, int) int + +func medianOf3Pivot(data Interface, left, right int) int { + return (left + right) >> 1 +} + +func randomPivot(data Interface, left, right int) int { + return left + (rand.Int() % (right - left + 1)) +} + +func medianOfMediansPivot(data Interface, left, right int) int { + if right-left < 5 { + return partition5(data, left, right) + } + for i := left; i <= right; i += 5 { + subRight := i + 4 + if subRight > right { + subRight = right + } + median5 := partition5(data, i, subRight) + data.Swap(median5, left+(i-left)/5) + } + mid := (right-left)/10 + left + 1 + return medianOfMedians(data, left, left+(right-left)/5, mid) +} + +func partition(data Interface, left, right, pivotIndex int) int { + data.Swap(pivotIndex, right) + storeIndex := left + for i := left; i < right; i++ { + if data.Less(i, right) { + data.Swap(storeIndex, i) + storeIndex++ + } + } + data.Swap(right, storeIndex) + return storeIndex +} + +func partitionIntro(data Interface, left, right, pivotIndex int, k int) int { + data.Swap(pivotIndex, right) + storeIndex := left + // Move all elements smaller than pivot to left side + for i := left; i < right; i++ { + if data.Less(i, right) { + data.Swap(storeIndex, i) + storeIndex++ + } + } + storeIndexEq := storeIndex + // Move all elements equal to pivot right after + for i := storeIndex; i < right; i++ { + // data[i] == data[right] + if !data.Less(i, right) && !data.Less(right, i) { + data.Swap(storeIndexEq, i) + storeIndexEq++ + } + } + // Move pivot to final place + data.Swap(right, storeIndexEq) + if k < storeIndex { + return storeIndex + } + if k <= storeIndexEq { + return k + } + return storeIndexEq +} + +func partition5(data Interface, left, right int) int { + i := left + 1 + for i <= right { + j := i + for j > left && data.Less(j, j-1) { + data.Swap(j, j-1) + j = j - 1 + } + i++ + } + return (left + right) / 2 +} diff --git a/util/selection/selection_test.go b/util/selection/selection_test.go new file mode 100644 index 0000000000000..7715af1fb421f --- /dev/null +++ b/util/selection/selection_test.go @@ -0,0 +1,232 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package selection + +import ( + "math/rand" + "sort" + "testing" + "time" + + . "github.com/pingcap/check" +) + +type testSuite struct{} + +var _ = Suite(&testSuite{}) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + *CustomParallelSuiteFlag = true + TestingT(t) +} + +type testSlice []int + +func (a testSlice) Len() int { return len(a) } +func (a testSlice) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a testSlice) Less(i, j int) bool { return a[i] < a[j] } + +var ( + globalCase10000000 testSlice + globalCase1000000 testSlice + globalCase100000 testSlice + globalCase10000 testSlice + globalCase1000 testSlice + globalCase100 testSlice + globalCase50 testSlice +) + +func init() { + globalCase10000000 = randomTestCase(10000000) + globalCase1000000 = randomTestCase(1000000) + globalCase100000 = randomTestCase(100000) + globalCase10000 = randomTestCase(10000) + globalCase1000 = randomTestCase(1000) + globalCase100 = randomTestCase(100) + globalCase50 = randomTestCase(50) +} + +func (s *testSuite) TestSelection(c *C) { + data := testSlice{1, 2, 3, 4, 5} + index := Select(data, 3) + c.Assert(data[index], Equals, 3) +} + +func (s *testSuite) TestSelectionWithDuplicate(c *C) { + data := testSlice{1, 2, 3, 3, 5} + index := Select(data, 3) + c.Assert(data[index], Equals, 3) + index = Select(data, 5) + c.Assert(data[index], Equals, 5) +} + +func (s *testSuite) TestSelectionWithRandomCase(c *C) { + data := randomTestCase(1000000) + index := Select(data, 500000) + actual := data[index] + sort.Stable(data) + expected := data[499999] + c.Assert(actual, Equals, expected) +} + +func (s *testSuite) TestSelectionWithSerialCase(c *C) { + data := serialTestCase(1000000) + sort.Sort(sort.Reverse(data)) + index := Select(data, 500000) + actual := data[index] + sort.Stable(data) + expected := data[499999] + c.Assert(actual, Equals, expected) +} + +func randomTestCase(size int) testSlice { + data := make(testSlice, 0, size) + rand.Seed(time.Now().Unix()) + for i := 0; i < size; i++ { + data = append(data, rand.Int()%100) + } + return data +} + +func serialTestCase(size int) testSlice { + data := make(testSlice, 0, size) + for i := 0; i < size; i++ { + data = append(data, i) + } + return data +} + +func BenchmarkSelection(b *testing.B) { + runSelect := func(b *testing.B, testCase testSlice, benchFunc func(*testing.B, testSlice, int)) { + for i := 1; i <= b.N; i++ { + var k int + if b.N < len(testCase) { + k = len(testCase) / b.N * i + } else { + k = i%len(testCase) + 1 + } + benchFunc(b, testCase, k) + } + } + b.ReportAllocs() + // Ten Million + b.Run("BenchmarkIntroSelection10000000", func(b *testing.B) { + runSelect(b, globalCase10000000, benchmarkIntroSelection) + }) + b.Run("BenchmarkQuickSelection10000000", func(b *testing.B) { + runSelect(b, globalCase10000000, benchmarkQuickSelection) + }) + b.Run("BenchmarkSort10000000", func(b *testing.B) { + for i := 1; i <= b.N; i++ { + benchmarkSort(b, globalCase10000000) + } + }) + // Million + b.Run("BenchmarkIntroSelection1000000", func(b *testing.B) { + runSelect(b, globalCase1000000, benchmarkIntroSelection) + }) + b.Run("BenchmarkQuickSelection1000000", func(b *testing.B) { + runSelect(b, globalCase1000000, benchmarkQuickSelection) + }) + b.Run("BenchmarkSort1000000", func(b *testing.B) { + for i := 1; i <= b.N; i++ { + benchmarkSort(b, globalCase1000000) + } + }) + // Hundred thousands + b.Run("BenchmarkIntroSelection100000", func(b *testing.B) { + runSelect(b, globalCase100000, benchmarkIntroSelection) + }) + b.Run("BenchmarkQuickSelection100000", func(b *testing.B) { + runSelect(b, globalCase100000, benchmarkQuickSelection) + }) + b.Run("BenchmarkSort100000", func(b *testing.B) { + for i := 1; i <= b.N; i++ { + benchmarkSort(b, globalCase100000) + } + }) + // Ten thousands + b.Run("BenchmarkIntroSelection10000", func(b *testing.B) { + runSelect(b, globalCase10000, benchmarkIntroSelection) + }) + b.Run("BenchmarkQuickSelection10000", func(b *testing.B) { + runSelect(b, globalCase10000, benchmarkQuickSelection) + }) + b.Run("BenchmarkSort10000", func(b *testing.B) { + for i := 1; i <= b.N; i++ { + benchmarkSort(b, globalCase10000) + } + }) + // Thousand + b.Run("BenchmarkIntroSelection1000", func(b *testing.B) { + runSelect(b, globalCase1000, benchmarkIntroSelection) + }) + b.Run("BenchmarkQuickSelection1000", func(b *testing.B) { + runSelect(b, globalCase1000, benchmarkQuickSelection) + }) + b.Run("BenchmarkSort1000", func(b *testing.B) { + for i := 1; i <= b.N; i++ { + benchmarkSort(b, globalCase1000) + } + }) + // Hundred + b.Run("BenchmarkIntroSelection100", func(b *testing.B) { + runSelect(b, globalCase100, benchmarkIntroSelection) + }) + b.Run("BenchmarkQuickSelection100", func(b *testing.B) { + runSelect(b, globalCase100, benchmarkQuickSelection) + }) + b.Run("BenchmarkSort100", func(b *testing.B) { + for i := 1; i <= b.N; i++ { + benchmarkSort(b, globalCase100) + } + }) + // Tens + b.Run("BenchmarkIntroSelection50", func(b *testing.B) { + runSelect(b, globalCase50, benchmarkIntroSelection) + }) + b.Run("BenchmarkQuickSelection50", func(b *testing.B) { + runSelect(b, globalCase50, benchmarkQuickSelection) + }) + b.Run("BenchmarkSort50", func(b *testing.B) { + for i := 1; i <= b.N; i++ { + benchmarkSort(b, globalCase50) + } + }) +} + +func benchmarkIntroSelection(b *testing.B, testCase testSlice, k int) { + b.StopTimer() + data := make(testSlice, len(testCase)) + copy(data, testCase) + b.StartTimer() + Select(data, k) +} + +func benchmarkQuickSelection(b *testing.B, testCase testSlice, k int) { + b.StopTimer() + data := make(testSlice, len(testCase)) + copy(data, testCase) + b.StartTimer() + quickselect(data, 0, len(testCase)-1, k-1) +} + +func benchmarkSort(b *testing.B, testCase testSlice) { + b.StopTimer() + data := make(testSlice, len(testCase)) + copy(data, testCase) + b.StartTimer() + sort.Sort(data) +} From 877d871a0318146d910ee133961def05ed8250f7 Mon Sep 17 00:00:00 2001 From: crazycs Date: Thu, 24 Sep 2020 17:19:42 +0800 Subject: [PATCH 20/60] ddl: fix clean dead table lock panic (#20198) Signed-off-by: crazycs520 --- ddl/ddl.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ddl/ddl.go b/ddl/ddl.go index 79d639eeb46aa..3510c463f99ec 100644 --- a/ddl/ddl.go +++ b/ddl/ddl.go @@ -574,6 +574,9 @@ func (d *ddl) startCleanDeadTableLock() { if !d.ownerManager.IsOwner() { continue } + if d.infoHandle == nil || !d.infoHandle.IsValid() { + continue + } deadLockTables, err := d.tableLockCkr.GetDeadLockedTables(d.ctx, d.infoHandle.Get().AllSchemas()) if err != nil { logutil.BgLogger().Info("[ddl] get dead table lock failed.", zap.Error(err)) From 0b7c7167d1026ad78dca129e8df35e9035e2ed5c Mon Sep 17 00:00:00 2001 From: Long Deng <37360259+ldeng-ustc@users.noreply.github.com> Date: Thu, 24 Sep 2020 20:50:28 +0800 Subject: [PATCH 21/60] planner,executor: support global index for IndexScan and IndexLookUpReader (#19821) --- distsql/request_builder.go | 45 +++++++++++++++++++ executor/builder.go | 26 ++++++++++- executor/distsql.go | 16 ++++++- executor/executor_test.go | 9 ++++ executor/partition_table_test.go | 24 ++++++++++ go.sum | 12 ----- kv/key.go | 38 ++++++++++++++++ planner/core/find_best_task.go | 23 +++++++--- planner/core/plan_to_pb.go | 2 + .../unistore/cophandler/closure_exec.go | 5 ++- 10 files changed, 176 insertions(+), 24 deletions(-) diff --git a/distsql/request_builder.go b/distsql/request_builder.go index 98d58eb023217..dcae06ea677c0 100644 --- a/distsql/request_builder.go +++ b/distsql/request_builder.go @@ -82,6 +82,13 @@ func (builder *RequestBuilder) SetTableHandles(tid int64, handles []kv.Handle) * return builder } +// SetPartitionsAndHandles sets "KeyRanges" for "kv.Request" by converting ParitionHandles to KeyRanges. +// handles in slice must be kv.PartitionHandle. +func (builder *RequestBuilder) SetPartitionsAndHandles(handles []kv.Handle) *RequestBuilder { + builder.Request.KeyRanges = PartitionHandlesToKVRanges(handles) + return builder +} + const estimatedRegionRowCount = 100000 // SetDAGRequest sets the request type to "ReqTypeDAG" and construct request data. @@ -299,6 +306,44 @@ func TableHandlesToKVRanges(tid int64, handles []kv.Handle) []kv.KeyRange { return krs } +// PartitionHandlesToKVRanges convert ParitionHandles to kv ranges. +// Handle in slices must be kv.PartitionHandle +func PartitionHandlesToKVRanges(handles []kv.Handle) []kv.KeyRange { + krs := make([]kv.KeyRange, 0, len(handles)) + i := 0 + for i < len(handles) { + ph := handles[i].(kv.PartitionHandle) + h := ph.Handle + pid := ph.PartitionID + if commonHandle, ok := h.(*kv.CommonHandle); ok { + ran := kv.KeyRange{ + StartKey: tablecodec.EncodeRowKey(pid, commonHandle.Encoded()), + EndKey: tablecodec.EncodeRowKey(pid, append(commonHandle.Encoded(), 0)), + } + krs = append(krs, ran) + i++ + continue + } + j := i + 1 + for ; j < len(handles) && handles[j-1].IntValue() != math.MaxInt64; j++ { + if handles[j].IntValue() != handles[j-1].IntValue()+1 { + break + } + if handles[j].(kv.PartitionHandle).PartitionID != pid { + break + } + } + low := codec.EncodeInt(nil, handles[i].IntValue()) + high := codec.EncodeInt(nil, handles[j-1].IntValue()) + high = kv.Key(high).PrefixNext() + startKey := tablecodec.EncodeRowKey(pid, low) + endKey := tablecodec.EncodeRowKey(pid, high) + krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + i = j + } + return krs +} + // IndexRangesToKVRanges converts index ranges to "KeyRange". func IndexRangesToKVRanges(sc *stmtctx.StatementContext, tid, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) ([]kv.KeyRange, error) { if fb == nil || fb.Hist == nil { diff --git a/executor/builder.go b/executor/builder.go index 93f283c7b734e..5f6154c1ee6d3 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -2670,6 +2670,10 @@ func (b *executorBuilder) buildIndexReader(v *plannercore.PhysicalIndexReader) E return ret } + if is.Index.Global { + return ret + } + nextPartition := nextPartitionForIndexReader{exec: ret} exec, err := buildPartitionTable(b, is.Table, &v.PartitionInfo, ret, nextPartition) if err != nil { @@ -2713,7 +2717,17 @@ func buildIndexReq(b *executorBuilder, schemaLen, handleLen int, plans []planner func buildNoRangeIndexLookUpReader(b *executorBuilder, v *plannercore.PhysicalIndexLookUpReader) (*IndexLookUpExecutor, error) { is := v.IndexPlans[0].(*plannercore.PhysicalIndexScan) - indexReq, indexStreaming, err := buildIndexReq(b, len(is.Index.Columns), len(v.CommonHandleCols), v.IndexPlans) + var handleLen int + if len(v.CommonHandleCols) != 0 { + handleLen = len(v.CommonHandleCols) + } else { + handleLen = 1 + } + if is.Index.Global { + // Should output pid col. + handleLen++ + } + indexReq, indexStreaming, err := buildIndexReq(b, len(is.Index.Columns), handleLen, v.IndexPlans) if err != nil { return nil, err } @@ -2806,6 +2820,10 @@ func (b *executorBuilder) buildIndexLookUpReader(v *plannercore.PhysicalIndexLoo return ret } + if is.Index.Global { + return ret + } + nextPartition := nextPartitionForIndexLookUp{exec: ret} exec, err := buildPartitionTable(b, ts.Table, &v.PartitionInfo, ret, nextPartition) if err != nil { @@ -3100,7 +3118,11 @@ func (builder *dataReaderBuilder) buildTableReaderFromHandles(ctx context.Contex }) } var b distsql.RequestBuilder - b.SetTableHandles(getPhysicalTableID(e.table), handles) + if _, ok := handles[0].(kv.PartitionHandle); ok { + b.SetPartitionsAndHandles(handles) + } else { + b.SetTableHandles(getPhysicalTableID(e.table), handles) + } return builder.buildTableReaderBase(ctx, e, b) } diff --git a/executor/distsql.go b/executor/distsql.go index fe5810b8b92cd..347735c49594e 100644 --- a/executor/distsql.go +++ b/executor/distsql.go @@ -459,6 +459,9 @@ func (e *IndexLookUpExecutor) getRetTpsByHandle() []*types.FieldType { } else { tps = []*types.FieldType{types.NewFieldType(mysql.TypeLonglong)} } + if e.index.Global { + tps = append(tps, types.NewFieldType(mysql.TypeLonglong)) + } if e.checkIndexValue != nil { tps = e.idxColTps } @@ -714,11 +717,15 @@ func (w *indexWorker) fetchHandles(ctx context.Context, result distsql.SelectRes func (w *indexWorker) extractTaskHandles(ctx context.Context, chk *chunk.Chunk, idxResult distsql.SelectResult, count uint64) ( handles []kv.Handle, retChk *chunk.Chunk, scannedKeys uint64, err error) { var handleOffset []int + numColsWithoutPid := chk.NumCols() + if w.idxLookup.index.Global { + numColsWithoutPid = numColsWithoutPid - 1 + } for i := range w.idxLookup.handleCols { - handleOffset = append(handleOffset, chk.NumCols()-len(w.idxLookup.handleCols)+i) + handleOffset = append(handleOffset, numColsWithoutPid-len(w.idxLookup.handleCols)+i) } if len(handleOffset) == 0 { - handleOffset = []int{chk.NumCols() - 1} + handleOffset = []int{numColsWithoutPid - 1} } handles = make([]kv.Handle, 0, w.batchSize) // PushedLimit would always be nil for CheckIndex or CheckTable, we add this check just for insurance. @@ -895,6 +902,11 @@ func (e *IndexLookUpExecutor) getHandle(row chunk.Row, handleIdx []int, handle = kv.IntHandle(row.GetInt64(handleIdx[0])) } } + if e.index.Global { + pidOffset := row.Len() - 1 + pid := row.GetInt64(pidOffset) + handle = kv.NewPartitionHandle(pid, handle) + } return } diff --git a/executor/executor_test.go b/executor/executor_test.go index 998602c4a4ce8..1bb12cb2dbd10 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -130,6 +130,7 @@ var _ = SerialSuites(&testSerialSuite1{&baseTestSuite{}}) var _ = SerialSuites(&testSlowQuery{&baseTestSuite{}}) var _ = Suite(&partitionTableSuite{&baseTestSuite{}}) var _ = SerialSuites(&tiflashTestSuite{}) +var _ = SerialSuites(&globalIndexSuite{&baseTestSuite{}}) var _ = SerialSuites(&testSerialSuite{&baseTestSuite{}}) type testSuite struct{ *baseTestSuite } @@ -142,6 +143,7 @@ type testSuiteWithData struct { } type testSlowQuery struct{ *baseTestSuite } type partitionTableSuite struct{ *baseTestSuite } +type globalIndexSuite struct{ *baseTestSuite } type testSerialSuite struct{ *baseTestSuite } type baseTestSuite struct { @@ -196,6 +198,13 @@ func (s *baseTestSuite) TearDownSuite(c *C) { s.store.Close() } +func (s *globalIndexSuite) SetUpSuite(c *C) { + s.baseTestSuite.SetUpSuite(c) + config.UpdateGlobal(func(conf *config.Config) { + conf.EnableGlobalIndex = true + }) +} + func (s *testSuiteP1) TestPessimisticSelectForUpdate(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") diff --git a/executor/partition_table_test.go b/executor/partition_table_test.go index 4856ce290bdd3..920fa09a5acef 100644 --- a/executor/partition_table_test.go +++ b/executor/partition_table_test.go @@ -176,3 +176,27 @@ PRIMARY KEY (pk1,pk2)) partition by hash(pk2) partitions 4;`) tk.MustQuery("select /*+ INL_JOIN(dt, rr) */ * from coverage_dt dt join coverage_rr rr on (dt.pk1 = rr.pk1 and dt.pk2 = rr.pk2);").Sort().Check(testkit.Rows("ios 3 ios 3 2", "linux 5 linux 5 1")) tk.MustQuery("select /*+ INL_MERGE_JOIN(dt, rr) */ * from coverage_dt dt join coverage_rr rr on (dt.pk1 = rr.pk1 and dt.pk2 = rr.pk2);").Sort().Check(testkit.Rows("ios 3 ios 3 2", "linux 5 linux 5 1")) } + +func (s *globalIndexSuite) TestGlobalIndexScan(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists p") + tk.MustExec(`create table p (id int, c int) partition by range (c) ( +partition p0 values less than (4), +partition p1 values less than (7), +partition p2 values less than (10))`) + tk.MustExec("alter table p add unique idx(id)") + tk.MustExec("insert into p values (1,3), (3,4), (5,6), (7,9)") + tk.MustQuery("select id from p use index (idx)").Check(testkit.Rows("1", "3", "5", "7")) +} + +func (s *globalIndexSuite) TestGlobalIndexDoubleRead(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists p") + tk.MustExec(`create table p (id int, c int) partition by range (c) ( +partition p0 values less than (4), +partition p1 values less than (7), +partition p2 values less than (10))`) + tk.MustExec("alter table p add unique idx(id)") + tk.MustExec("insert into p values (1,3), (3,4), (5,6), (7,9)") + tk.MustQuery("select * from p use index (idx)").Check(testkit.Rows("1 3", "3 4", "5 6", "7 9")) +} diff --git a/go.sum b/go.sum index c768dc7728ab3..a1d1e6f0a3302 100644 --- a/go.sum +++ b/go.sum @@ -406,14 +406,11 @@ github.com/ngaut/unistore v0.0.0-20200918091209-68a2db6bb775/go.mod h1:ZR3NH+Hzq github.com/nicksnyder/go-i18n v1.10.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I= github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34= @@ -425,7 +422,6 @@ github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsq github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.3.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= @@ -439,7 +435,6 @@ github.com/pingcap-incubator/tidb-dashboard v0.0.0-20200710045508-523e95bc5ec9/g github.com/pingcap-incubator/tidb-dashboard v0.0.0-20200715070228-47f5de8a6992/go.mod h1:9yaAM77sPfa5/f6sdxr3jSkKfIz463KRHyiFHiGjdes= github.com/pingcap-incubator/tidb-dashboard v0.0.0-20200807020752-01f0abe88e93/go.mod h1:9yaAM77sPfa5/f6sdxr3jSkKfIz463KRHyiFHiGjdes= github.com/pingcap/badger v1.5.1-0.20200604041313-19c397305fcc/go.mod h1:LyrqUOHZrUDf9oGi1yoz1+qw9ckSIhQb5eMa1acOLNQ= -github.com/pingcap/badger v1.5.1-0.20200714132513-80ba2000f159 h1:cmZSuRbdfOJd3kJjRIClrLbt3nD0xi4oqYR1c/ZrPKg= github.com/pingcap/badger v1.5.1-0.20200714132513-80ba2000f159/go.mod h1:LyrqUOHZrUDf9oGi1yoz1+qw9ckSIhQb5eMa1acOLNQ= github.com/pingcap/badger v1.5.1-0.20200810065601-8c92a97807f9/go.mod h1:LyrqUOHZrUDf9oGi1yoz1+qw9ckSIhQb5eMa1acOLNQ= github.com/pingcap/badger v1.5.1-0.20200908111422-2e78ee155d19 h1:IXpGy7y9HyoShAFmzW2OPF0xCA5EOoSTyZHwsgYk9Ro= @@ -451,7 +446,6 @@ github.com/pingcap/br v0.0.0-20200617120402-56e151ad8b67/go.mod h1:/3QzpDG7YTPrD github.com/pingcap/br v0.0.0-20200727092753-a475692725db/go.mod h1:4iTqZAMbEPmjBggYixqIg2FwIHBQtyImTM/QYlpTBGk= github.com/pingcap/br v0.0.0-20200803052654-e6f63fc1807a/go.mod h1:8j7vGUfHCETYbeBfASLTDywC3NFSx90z9nuk0PV9rpo= github.com/pingcap/br v0.0.0-20200805121136-181c081ba6ac/go.mod h1:9P24mNzNmXjggYBm4pnb08slSbua8FA6QIyg68GpuhQ= -github.com/pingcap/br v0.0.0-20200820083933-d9d6207c0aa7 h1:7YWkuK/QY7/nz819lnxb0qDXqLrApDjZHjYPo+tduGA= github.com/pingcap/br v0.0.0-20200820083933-d9d6207c0aa7/go.mod h1:5ri8663t7CtJuG0kiOKKoBmwk9HOCX5MoKpmh1fW4CE= github.com/pingcap/br v0.0.0-20200923023944-7456456854e4 h1:f1e1xbBAMc6mOrnBtrPRke52Zxv8zVlyr5g0Tz/pySQ= github.com/pingcap/br v0.0.0-20200923023944-7456456854e4/go.mod h1:DGsMcZVYt2haeDF/xGerf77c2RpTymgYY5+bMg8uArA= @@ -460,15 +454,11 @@ github.com/pingcap/check v0.0.0-20191107115940-caf2b9e6ccf4/go.mod h1:PYMCGwN0JH github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 h1:R8gStypOBmpnHEx1qi//SaqxJVI4inOqljg/Aj5/390= github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= -github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9 h1:KH4f4Si9XK6/IW50HtoaiLIFHGkapOM6w83za47UYik= github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9/go.mod h1:4b2X8xSqxIroj/IZ9MX/VGZhAwc11wB9wRIzHvz6SeM= github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011 h1:58naV4XMEqm0hl9LcYo6cZoGBGiLtefMQMF/vo3XLgQ= github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pingcap/errors v0.11.5-0.20200729012136-4e113ddee29e h1:/EGWHNOyEgizEBuAujWsb9vXrPZtt1b7ooDPyjEkjDw= github.com/pingcap/errors v0.11.5-0.20200729012136-4e113ddee29e/go.mod h1:g4vx//d6VakjJ0mk7iLBlKA8LFavV/sAVINT/1PFxeQ= -github.com/pingcap/errors v0.11.5-0.20200902104258-eba4f1d8f6de h1:mW8hC2yXTpflfyTeJgcN4aJQfwcYODde8YgjBgAy6do= github.com/pingcap/errors v0.11.5-0.20200902104258-eba4f1d8f6de/go.mod h1:g4vx//d6VakjJ0mk7iLBlKA8LFavV/sAVINT/1PFxeQ= github.com/pingcap/errors v0.11.5-0.20200917111840-a15ef68f753d h1:TH18wFO5Nq/zUQuWu9ms2urgZnLP69XJYiI2JZAkUGc= github.com/pingcap/errors v0.11.5-0.20200917111840-a15ef68f753d/go.mod h1:g4vx//d6VakjJ0mk7iLBlKA8LFavV/sAVINT/1PFxeQ= @@ -548,7 +538,6 @@ github.com/pingcap/tidb-tools v4.0.0-rc.1.0.20200421113014-507d2bb3a15e+incompat github.com/pingcap/tidb-tools v4.0.0-rc.1.0.20200514040632-f76b3e428e19+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= github.com/pingcap/tidb-tools v4.0.0+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= github.com/pingcap/tidb-tools v4.0.1+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= -github.com/pingcap/tidb-tools v4.0.5-0.20200820082341-afeaaaaaa153+incompatible h1:OozchEPztWQsTdLxPSPs6P+Cowbr35J7uy5oRpjbV9E= github.com/pingcap/tidb-tools v4.0.5-0.20200820082341-afeaaaaaa153+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= github.com/pingcap/tidb-tools v4.0.5-0.20200820092506-34ea90c93237+incompatible h1:qPppnsXVh3KswqRZdSAShGLLPd7dB+5w4lXDnpYn0SQ= github.com/pingcap/tidb-tools v4.0.5-0.20200820092506-34ea90c93237+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= @@ -597,7 +586,6 @@ github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44 h1:tB9NOR21++IjLyVx3/PCPhWMwqGNCMQEH96A6dMZ/gc= github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v2.19.10+incompatible h1:lA4Pi29JEVIQIgATSeftHSY0rMGI9CLrl2ZvDLiahto= github.com/shirou/gopsutil v2.19.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= diff --git a/kv/key.go b/kv/key.go index c5397993a0566..53eacf05a8a3d 100644 --- a/kv/key.go +++ b/kv/key.go @@ -429,3 +429,41 @@ func BuildHandleFromDatumRow(sctx *stmtctx.StatementContext, row []types.Datum, } return handle, nil } + +// PartitionHandle combines a handle and a PartitionID, used to location a row in partioned table. +// Now only used in global index. +// TODO: support PartitionHandle in HandleMap. +type PartitionHandle struct { + Handle + PartitionID int64 +} + +// NewPartitionHandle creates a PartitionHandle from a normal handle and a pid. +func NewPartitionHandle(pid int64, h Handle) PartitionHandle { + return PartitionHandle{ + Handle: h, + PartitionID: pid, + } +} + +// Equal implements the Handle interface. +func (ph PartitionHandle) Equal(h Handle) bool { + if ph2, ok := h.(PartitionHandle); ok { + return ph.PartitionID == ph2.PartitionID && ph.Handle.Equal(ph2.Handle) + } + return false +} + +// Compare implements the Handle interface. +func (ph PartitionHandle) Compare(h Handle) int { + if ph2, ok := h.(PartitionHandle); ok { + if ph.PartitionID < ph2.PartitionID { + return -1 + } + if ph.PartitionID > ph2.PartitionID { + return 1 + } + return ph.Handle.Compare(ph2.Handle) + } + panic("PartitonHandle compares to non-parition Handle") +} diff --git a/planner/core/find_best_task.go b/planner/core/find_best_task.go index 8919acda79fb7..2cb6483328955 100644 --- a/planner/core/find_best_task.go +++ b/planner/core/find_best_task.go @@ -1073,8 +1073,6 @@ func (is *PhysicalIndexScan) initSchema(idxExprCols []*expression.Column, isDoub for i := len(is.Index.Columns); i < len(idxExprCols); i++ { indexCols = append(indexCols, idxExprCols[i]) } - is.SetSchema(expression.NewSchema(indexCols...)) - return } setHandle := len(indexCols) > len(is.Index.Columns) if !setHandle { @@ -1086,13 +1084,24 @@ func (is *PhysicalIndexScan) initSchema(idxExprCols []*expression.Column, isDoub } } } - // If it's double read case, the first index must return handle. So we should add extra handle column - // if there isn't a handle column. - if isDoubleRead && !setHandle { - if !is.Table.IsCommonHandle { + + if isDoubleRead { + // If it's double read case, the first index must return handle. So we should add extra handle column + // if there isn't a handle column. + if !setHandle { + if !is.Table.IsCommonHandle { + indexCols = append(indexCols, &expression.Column{ + RetType: types.NewFieldType(mysql.TypeLonglong), + ID: model.ExtraHandleID, + UniqueID: is.ctx.GetSessionVars().AllocPlanColumnID(), + }) + } + } + // If index is global, we should add extra column for pid. + if is.Index.Global { indexCols = append(indexCols, &expression.Column{ RetType: types.NewFieldType(mysql.TypeLonglong), - ID: model.ExtraHandleID, + ID: model.ExtraPidColID, UniqueID: is.ctx.GetSessionVars().AllocPlanColumnID(), }) } diff --git a/planner/core/plan_to_pb.go b/planner/core/plan_to_pb.go index bccaacce3aa22..5e6a2b948db1b 100644 --- a/planner/core/plan_to_pb.go +++ b/planner/core/plan_to_pb.go @@ -202,6 +202,8 @@ func (p *PhysicalIndexScan) ToPB(ctx sessionctx.Context, _ kv.StoreType) (*tipb. for _, col := range p.schema.Columns { if col.ID == model.ExtraHandleID { columns = append(columns, model.NewExtraHandleColInfo()) + } else if col.ID == model.ExtraPidColID { + columns = append(columns, model.NewExtraPartitionIDColInfo()) } else { columns = append(columns, findColumnInfoByID(tableColumns, col.ID)) } diff --git a/store/mockstore/unistore/cophandler/closure_exec.go b/store/mockstore/unistore/cophandler/closure_exec.go index e0d72ed421ef7..60b4f4e617f91 100644 --- a/store/mockstore/unistore/cophandler/closure_exec.go +++ b/store/mockstore/unistore/cophandler/closure_exec.go @@ -168,8 +168,11 @@ func (e *closureExecutor) initIdxScanCtx(idxScan *tipb.IndexScan) { e.idxScanCtx.pkStatus = pkColNotExists e.idxScanCtx.primaryColumnIds = idxScan.PrimaryColumnIds - lastColumn := e.columnInfos[len(e.columnInfos)-1] + if lastColumn.GetColumnId() == model.ExtraPidColID { + lastColumn = e.columnInfos[len(e.columnInfos)-2] + e.idxScanCtx.columnLen-- + } if len(e.idxScanCtx.primaryColumnIds) == 0 { if lastColumn.GetPkHandle() { From 10fd834463ea6f44b187993e2ea189e3d5c72097 Mon Sep 17 00:00:00 2001 From: lysu Date: Thu, 24 Sep 2020 22:00:08 +0800 Subject: [PATCH 22/60] executor: fix sort result for batch-point-get by unsigned pk (#20108) --- executor/batch_point_get.go | 30 ++++++++++++++++++++++++++++-- executor/batch_point_get_test.go | 12 ++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/executor/batch_point_get.go b/executor/batch_point_get.go index e41dadbb28cb0..c4fdca29b4bb3 100644 --- a/executor/batch_point_get.go +++ b/executor/batch_point_get.go @@ -15,11 +15,13 @@ package executor import ( "context" + "fmt" "sort" "sync/atomic" "github.com/pingcap/failpoint" "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" @@ -251,12 +253,36 @@ func (e *BatchPointGetExec) initialize(ctx context.Context) error { failpoint.InjectContext(ctx, "batchPointGetRepeatableReadTest-step2", nil) }) } else if e.keepOrder { - sort.Slice(e.handles, func(i int, j int) bool { + less := func(i int, j int) bool { if e.desc { return e.handles[i].Compare(e.handles[j]) > 0 } return e.handles[i].Compare(e.handles[j]) < 0 - }) + + } + if e.tblInfo.PKIsHandle && mysql.HasUnsignedFlag(e.tblInfo.GetPkColInfo().Flag) { + uintComparator := func(i, h kv.Handle) int { + if !i.IsInt() || !h.IsInt() { + panic(fmt.Sprintf("both handles need be IntHandle, but got %T and %T ", i, h)) + } + ihVal := uint64(i.IntValue()) + hVal := uint64(h.IntValue()) + if ihVal > hVal { + return 1 + } + if ihVal < hVal { + return -1 + } + return 0 + } + less = func(i int, j int) bool { + if e.desc { + return uintComparator(e.handles[i], e.handles[j]) > 0 + } + return uintComparator(e.handles[i], e.handles[j]) < 0 + } + } + sort.Slice(e.handles, less) } keys := make([]kv.Key, len(e.handles)) diff --git a/executor/batch_point_get_test.go b/executor/batch_point_get_test.go index fc2d30538db2f..468ba2e974cda 100644 --- a/executor/batch_point_get_test.go +++ b/executor/batch_point_get_test.go @@ -150,3 +150,15 @@ func (s *testBatchPointGetSuite) TestIssue18843(c *C) { tk.MustQuery("select * from t18843 where f in (null)").Check(testkit.Rows()) tk.MustQuery("select * from t18843 where f is null").Check(testkit.Rows("2 ")) } + +func (s *testBatchPointGetSuite) TestBatchPointGetUnsignedHandleWithSort(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t2") + tk.MustExec("create table t2 (id bigint(20) unsigned, primary key(id))") + tk.MustExec("insert into t2 values (8738875760185212610)") + tk.MustExec("insert into t2 values (9814441339970117597)") + tk.MustExec("insert into t2 values (1)") + tk.MustQuery("select id from t2 where id in (8738875760185212610, 1, 9814441339970117597) order by id").Check(testkit.Rows("1", "8738875760185212610", "9814441339970117597")) + tk.MustQuery("select id from t2 where id in (8738875760185212610, 1, 9814441339970117597) order by id desc").Check(testkit.Rows("9814441339970117597", "8738875760185212610", "1")) +} From 0673f3376f0ce0f397fa23b91619de3b3fc4bfd3 Mon Sep 17 00:00:00 2001 From: xhe Date: Fri, 25 Sep 2020 10:27:38 +0800 Subject: [PATCH 23/60] ddl: make use of the new rule cache api[1/3] (#20166) Signed-off-by: xhe --- ddl/ddl_api.go | 171 ++++++++++++++------------- ddl/partition.go | 22 ++-- ddl/placement/types.go | 28 ++++- ddl/placement/types_test.go | 51 +++++++++ ddl/placement_rule_test.go | 222 +++++++++++------------------------- domain/infosync/info.go | 26 +++++ 6 files changed, 270 insertions(+), 250 deletions(-) create mode 100644 ddl/placement/types_test.go diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index 7fa1c0bdedf41..671f798746d18 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -5321,16 +5321,15 @@ func (d *ddl) AlterIndexVisibility(ctx sessionctx.Context, ident ast.Ident, inde return errors.Trace(err) } -func buildPlacementSpecReplicasAndConstraint(rule *placement.RuleOp, replicas uint64, cnstr string) ([]*placement.RuleOp, error) { +func buildPlacementSpecReplicasAndConstraint(replicas uint64, cnstr string) ([]*placement.Rule, error) { var err error cnstr = strings.TrimSpace(cnstr) - rules := make([]*placement.RuleOp, 0, 1) + rules := make([]*placement.Rule, 0, 1) if len(cnstr) > 0 && cnstr[0] == '[' { // can not emit REPLICAS with an array label if replicas == 0 { return rules, errors.Errorf("array CONSTRAINTS should be with a positive REPLICAS") } - rule.Count = int(replicas) constraints := []string{} @@ -5339,12 +5338,15 @@ func buildPlacementSpecReplicasAndConstraint(rule *placement.RuleOp, replicas ui return rules, err } - rule.LabelConstraints, err = placement.CheckLabelConstraints(constraints) + labelConstraints, err := placement.CheckLabelConstraints(constraints) if err != nil { return rules, err } - rules = append(rules, rule) + rules = append(rules, &placement.Rule{ + Count: int(replicas), + LabelConstraints: labelConstraints, + }) } else if len(cnstr) > 0 && cnstr[0] == '{' { constraints := map[string]int{} err = json.Unmarshal([]byte(cnstr), &constraints) @@ -5354,7 +5356,6 @@ func buildPlacementSpecReplicasAndConstraint(rule *placement.RuleOp, replicas ui ruleCnt := int(replicas) for labels, cnt := range constraints { - newRule := rule.Clone() if cnt <= 0 { err = errors.Errorf("count should be positive, but got %d", cnt) break @@ -5367,18 +5368,20 @@ func buildPlacementSpecReplicasAndConstraint(rule *placement.RuleOp, replicas ui break } } - newRule.Count = cnt - newRule.LabelConstraints, err = placement.CheckLabelConstraints(strings.Split(strings.TrimSpace(labels), ",")) + labelConstraints, err := placement.CheckLabelConstraints(strings.Split(strings.TrimSpace(labels), ",")) if err != nil { break } - rules = append(rules, newRule) + rules = append(rules, &placement.Rule{ + Count: cnt, + LabelConstraints: labelConstraints, + }) } - rule.Count = ruleCnt - - if rule.Count > 0 { - rules = append(rules, rule) + if ruleCnt > 0 { + rules = append(rules, &placement.Rule{ + Count: ruleCnt, + }) } } else { err = errors.Errorf("constraint should be a JSON array or object, but got '%s'", cnstr) @@ -5386,89 +5389,70 @@ func buildPlacementSpecReplicasAndConstraint(rule *placement.RuleOp, replicas ui return rules, err } -func buildPlacementSpecs(specs []*ast.PlacementSpec) ([]*placement.RuleOp, error) { - rules := make([]*placement.RuleOp, 0, len(specs)) - +func buildPlacementSpecs(bundle *placement.Bundle, specs []*ast.PlacementSpec) (*placement.Bundle, error) { var err error - var sb strings.Builder - restoreFlags := format.RestoreStringSingleQuotes | format.RestoreKeyWordLowercase | format.RestoreNameBackQuotes - restoreCtx := format.NewRestoreCtx(restoreFlags, &sb) + var spec *ast.PlacementSpec - for _, spec := range specs { - rule := &placement.RuleOp{ - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Override: true, - }, - } + for _, rspec := range specs { + spec = rspec + var role placement.PeerRoleType switch spec.Role { case ast.PlacementRoleFollower: - rule.Role = placement.Follower + role = placement.Follower case ast.PlacementRoleLeader: - rule.Role = placement.Leader + role = placement.Leader case ast.PlacementRoleLearner: - rule.Role = placement.Learner + role = placement.Learner case ast.PlacementRoleVoter: - rule.Role = placement.Voter + role = placement.Voter default: err = errors.Errorf("unknown role: %d", spec.Role) } + if err != nil { + break + } - if err == nil { - switch spec.Tp { - case ast.PlacementAdd: - rule.Action = placement.RuleOpAdd - case ast.PlacementAlter, ast.PlacementDrop: - rule.Action = placement.RuleOpAdd - - // alter will overwrite all things - // drop all rules that will be overridden - newRules := rules[:0] - - for _, r := range rules { - if r.Role != rule.Role { - newRules = append(newRules, r) - } + if spec.Tp == ast.PlacementAlter || spec.Tp == ast.PlacementDrop { + newRules := bundle.Rules[:0] + for _, r := range bundle.Rules { + if r.Role != role { + newRules = append(newRules, r) } + } + bundle.Rules = newRules - rules = newRules - - // delete previous definitions - rules = append(rules, &placement.RuleOp{ - Action: placement.RuleOpDel, - DeleteByIDPrefix: true, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - // ROLE is useless for PD, prevent two alter statements from coexisting - Role: rule.Role, - }, - }) - - // alter == drop + add new rules - if spec.Tp == ast.PlacementDrop { - continue - } - default: - err = errors.Errorf("unknown action type: %d", spec.Tp) + // alter == drop + add new rules + if spec.Tp == ast.PlacementDrop { + continue } } - if err == nil { - var newRules []*placement.RuleOp - newRules, err = buildPlacementSpecReplicasAndConstraint(rule, spec.Replicas, spec.Constraints) - rules = append(rules, newRules...) + var newRules []*placement.Rule + newRules, err = buildPlacementSpecReplicasAndConstraint(spec.Replicas, spec.Constraints) + if err != nil { + break } + for _, r := range newRules { + r.Role = role + bundle.Rules = append(bundle.Rules, r) + } + } - if err != nil { - sb.Reset() - if e := spec.Restore(restoreCtx); e != nil { - return rules, ErrInvalidPlacementSpec.GenWithStackByArgs("", err) - } - return rules, ErrInvalidPlacementSpec.GenWithStackByArgs(sb.String(), err) + if err != nil { + var sb strings.Builder + sb.Reset() + + restoreCtx := format.NewRestoreCtx(format.RestoreStringSingleQuotes|format.RestoreKeyWordLowercase|format.RestoreNameBackQuotes, &sb) + + if e := spec.Restore(restoreCtx); e != nil { + return nil, ErrInvalidPlacementSpec.GenWithStackByArgs("", err) } + + return nil, ErrInvalidPlacementSpec.GenWithStackByArgs(sb.String(), err) } - return rules, nil + + return bundle, nil } func (d *ddl) AlterTablePartition(ctx sessionctx.Context, ident ast.Ident, spec *ast.AlterTableSpec) (err error) { @@ -5487,18 +5471,47 @@ func (d *ddl) AlterTablePartition(ctx sessionctx.Context, ident ast.Ident, spec return errors.Trace(err) } - rules, err := buildPlacementSpecs(spec.PlacementSpecs) + pid := placement.GroupID(partitionID) + + oldBundle, ok := d.infoHandle.Get().BundleByName(pid) + if !ok { + oldBundle = &placement.Bundle{ID: pid} + } else { + oldBundle = oldBundle.Clone() + } + + bundle, err := buildPlacementSpecs(oldBundle, spec.PlacementSpecs) if err != nil { return errors.Trace(err) } + var extraCnt int startKey := hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(partitionID))) endKey := hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(partitionID+1))) - for _, rule := range rules { - rule.Index = placement.RuleIndexPartition + newRules := bundle.Rules[:0] + for i, rule := range bundle.Rules { + // merge all empty constraints + if len(rule.LabelConstraints) == 0 { + extraCnt += rule.Count + continue + } + rule.GroupID = bundle.ID + rule.ID = strconv.Itoa(i) rule.StartKeyHex = startKey rule.EndKeyHex = endKey + newRules = append(newRules, rule) + } + if extraCnt > 0 { + bundle.Rules = append(newRules, &placement.Rule{ + GroupID: bundle.ID, + ID: "default", + Count: extraCnt, + StartKeyHex: startKey, + EndKeyHex: endKey, + }) } + bundle.Index = placement.RuleIndexPartition + bundle.Override = true job := &model.Job{ SchemaID: schema.ID, @@ -5506,7 +5519,7 @@ func (d *ddl) AlterTablePartition(ctx sessionctx.Context, ident ast.Ident, spec SchemaName: schema.Name.L, Type: model.ActionAlterTableAlterPartition, BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{partitionID, rules}, + Args: []interface{}{partitionID, bundle}, } err = d.doDDLJob(ctx, job) diff --git a/ddl/partition.go b/ddl/partition.go index f70fb0d7a6f86..a10d0ab6bd839 100644 --- a/ddl/partition.go +++ b/ddl/partition.go @@ -1518,8 +1518,8 @@ func truncateTableByReassignPartitionIDs(t *meta.Meta, tblInfo *model.TableInfo) func onAlterTablePartition(t *meta.Meta, job *model.Job) (int64, error) { var partitionID int64 - var rules []*placement.RuleOp - err := job.DecodeArgs(&partitionID, &rules) + bundle := &placement.Bundle{} + err := job.DecodeArgs(&partitionID, bundle) if err != nil { job.State = model.JobStateCancelled return 0, errors.Trace(err) @@ -1536,23 +1536,15 @@ func onAlterTablePartition(t *meta.Meta, job *model.Job) (int64, error) { return 0, errors.Trace(table.ErrUnknownPartition.GenWithStackByArgs("drop?", tblInfo.Name.O)) } - for i, rule := range rules { - if rule.Action == placement.RuleOpDel { - rule.ID = fmt.Sprintf("%d_t%d_p%d_%s", job.SchemaID, tblInfo.ID, partitionID, rule.Role) - } else { - rule.ID = fmt.Sprintf("%d_t%d_p%d_%s_%d_%d", job.SchemaID, tblInfo.ID, partitionID, rule.Role, job.ID, i) - } - } - - ver, err := t.GetSchemaVersion() + err = infosync.PutRuleBundle(nil, bundle) if err != nil { - return ver, errors.Trace(err) + job.State = model.JobStateCancelled + return 0, errors.Wrapf(err, "failed to notify PD the placement rules") } - err = infosync.UpdatePlacementRules(nil, rules) + ver, err := updateSchemaVersion(t, job) if err != nil { - job.State = model.JobStateCancelled - return ver, errors.Wrapf(err, "failed to notify PD the placement rules") + return ver, errors.Trace(err) } job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) diff --git a/ddl/placement/types.go b/ddl/placement/types.go index d6d6bfeb6dc74..c5dcda9b2e8e8 100644 --- a/ddl/placement/types.go +++ b/ddl/placement/types.go @@ -65,9 +65,7 @@ type Rule struct { ID string `json:"id"` Index int `json:"index,omitempty"` Override bool `json:"override,omitempty"` - StartKey []byte `json:"-"` StartKeyHex string `json:"start_key"` - EndKey []byte `json:"-"` EndKeyHex string `json:"end_key"` Role PeerRoleType `json:"role"` Count int `json:"count"` @@ -76,6 +74,13 @@ type Rule struct { IsolationLevel string `json:"isolation_level,omitempty"` } +// Clone is used to duplicate a RuleOp for safe modification. +func (r *Rule) Clone() *Rule { + n := &Rule{} + *n = *r + return n +} + // Bundle is a group of all rules and configurations. It is used to support rule cache. type Bundle struct { ID string `json:"group_id"` @@ -84,6 +89,25 @@ type Bundle struct { Rules []*Rule `json:"rules"` } +func (b *Bundle) String() string { + t, err := json.Marshal(b) + if err != nil { + return "" + } + return string(t) +} + +// Clone is used to duplicate a bundle. +func (b *Bundle) Clone() *Bundle { + newBundle := &Bundle{} + *newBundle = *b + newBundle.Rules = make([]*Rule, 0, len(b.Rules)) + for i := range b.Rules { + newBundle.Rules = append(newBundle.Rules, b.Rules[i].Clone()) + } + return newBundle +} + // RuleOpType indicates the operation type. type RuleOpType string diff --git a/ddl/placement/types_test.go b/ddl/placement/types_test.go new file mode 100644 index 0000000000000..1e7be83006300 --- /dev/null +++ b/ddl/placement/types_test.go @@ -0,0 +1,51 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package placement + +import ( + "testing" + + . "github.com/pingcap/check" +) + +func TestT(t *testing.T) { + TestingT(t) +} + +var _ = Suite(&testBundleSuite{}) +var _ = Suite(&testRuleSuite{}) + +type testBundleSuite struct{} + +func (t *testBundleSuite) TestClone(c *C) { + bundle := &Bundle{ID: GroupID(1), Rules: []*Rule{{ID: "434"}}} + + newBundle := bundle.Clone() + newBundle.ID = GroupID(2) + newBundle.Rules[0] = &Rule{ID: "121"} + + c.Assert(bundle, DeepEquals, &Bundle{ID: GroupID(1), Rules: []*Rule{{ID: "434"}}}) + c.Assert(newBundle, DeepEquals, &Bundle{ID: GroupID(2), Rules: []*Rule{{ID: "121"}}}) +} + +type testRuleSuite struct{} + +func (t *testRuleSuite) TestClone(c *C) { + rule := &Rule{ID: "434"} + newRule := rule.Clone() + newRule.ID = "121" + + c.Assert(rule, DeepEquals, &Rule{ID: "434"}) + c.Assert(newRule, DeepEquals, &Rule{ID: "121"}) +} diff --git a/ddl/placement_rule_test.go b/ddl/placement_rule_test.go index 26c5527e921ef..037682011e38e 100644 --- a/ddl/placement_rule_test.go +++ b/ddl/placement_rule_test.go @@ -14,6 +14,8 @@ package ddl import ( + "encoding/json" + . "github.com/pingcap/check" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" @@ -35,12 +37,13 @@ func (s *testPlacementSuite) compareRuleOp(n, o *placement.RuleOp) bool { func (s *testPlacementSuite) TestPlacementBuild(c *C) { tests := []struct { input []*ast.PlacementSpec - output []*placement.RuleOp + bundle *placement.Bundle + output []*placement.Rule err string }{ { input: []*ast.PlacementSpec{}, - output: []*placement.RuleOp{}, + output: []*placement.Rule{}, }, { @@ -50,20 +53,16 @@ func (s *testPlacementSuite) TestPlacementBuild(c *C) { Replicas: 3, Constraints: `["+ zone=sh", "-zone = bj"]`, }}, - output: []*placement.RuleOp{ + output: []*placement.Rule{ { - Action: placement.RuleOpAdd, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Role: placement.Voter, - Override: true, - Count: 3, - LabelConstraints: []placement.LabelConstraint{ - {Key: "zone", Op: "in", Values: []string{"sh"}}, - {Key: "zone", Op: "notIn", Values: []string{"bj"}}, - }, + Role: placement.Voter, + Count: 3, + LabelConstraints: []placement.LabelConstraint{ + {Key: "zone", Op: "in", Values: []string{"sh"}}, + {Key: "zone", Op: "notIn", Values: []string{"bj"}}, }, - }}, + }, + }, }, { @@ -81,31 +80,21 @@ func (s *testPlacementSuite) TestPlacementBuild(c *C) { Constraints: `["- zone=sh", "+zone = bj"]`, }, }, - output: []*placement.RuleOp{ + output: []*placement.Rule{ { - Action: placement.RuleOpAdd, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Role: placement.Voter, - Override: true, - Count: 3, - LabelConstraints: []placement.LabelConstraint{ - {Key: "zone", Op: "in", Values: []string{"sh"}}, - {Key: "zone", Op: "notIn", Values: []string{"bj"}}, - }, + Role: placement.Voter, + Count: 3, + LabelConstraints: []placement.LabelConstraint{ + {Key: "zone", Op: "in", Values: []string{"sh"}}, + {Key: "zone", Op: "notIn", Values: []string{"bj"}}, }, }, { - Action: placement.RuleOpAdd, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Role: placement.Follower, - Override: true, - Count: 2, - LabelConstraints: []placement.LabelConstraint{ - {Key: "zone", Op: "notIn", Values: []string{"sh"}}, - {Key: "zone", Op: "in", Values: []string{"bj"}}, - }, + Role: placement.Follower, + Count: 2, + LabelConstraints: []placement.LabelConstraint{ + {Key: "zone", Op: "notIn", Values: []string{"sh"}}, + {Key: "zone", Op: "in", Values: []string{"bj"}}, }, }, }, @@ -126,26 +115,13 @@ func (s *testPlacementSuite) TestPlacementBuild(c *C) { Constraints: `["- zone=sh", "+zone = bj"]`, }, }, - output: []*placement.RuleOp{ + output: []*placement.Rule{ { - Action: placement.RuleOpDel, - DeleteByIDPrefix: true, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Role: placement.Voter, - }, - }, - { - Action: placement.RuleOpAdd, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Role: placement.Voter, - Override: true, - Count: 2, - LabelConstraints: []placement.LabelConstraint{ - {Key: "zone", Op: "notIn", Values: []string{"sh"}}, - {Key: "zone", Op: "in", Values: []string{"bj"}}, - }, + Role: placement.Voter, + Count: 2, + LabelConstraints: []placement.LabelConstraint{ + {Key: "zone", Op: "notIn", Values: []string{"sh"}}, + {Key: "zone", Op: "in", Values: []string{"bj"}}, }, }, }, @@ -166,43 +142,20 @@ func (s *testPlacementSuite) TestPlacementBuild(c *C) { Constraints: `{"- zone=sh":1, "+zone = bj":1}`, }, }, - output: []*placement.RuleOp{ + output: []*placement.Rule{ { - Action: placement.RuleOpDel, - DeleteByIDPrefix: true, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Role: placement.Voter, - }, + Role: placement.Voter, + Count: 1, + LabelConstraints: []placement.LabelConstraint{{Key: "zone", Op: "notIn", Values: []string{"sh"}}}, }, { - Action: placement.RuleOpAdd, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Role: placement.Voter, - Override: true, - Count: 1, - LabelConstraints: []placement.LabelConstraint{{Key: "zone", Op: "in", Values: []string{"bj"}}}, - }, + Role: placement.Voter, + Count: 1, + LabelConstraints: []placement.LabelConstraint{{Key: "zone", Op: "in", Values: []string{"bj"}}}, }, { - Action: placement.RuleOpAdd, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Role: placement.Voter, - Override: true, - Count: 1, - LabelConstraints: []placement.LabelConstraint{{Key: "zone", Op: "notIn", Values: []string{"sh"}}}, - }, - }, - { - Action: placement.RuleOpAdd, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Role: placement.Voter, - Override: true, - Count: 1, - }, + Role: placement.Voter, + Count: 1, }, }, }, @@ -220,16 +173,7 @@ func (s *testPlacementSuite) TestPlacementBuild(c *C) { Tp: ast.PlacementDrop, }, }, - output: []*placement.RuleOp{ - { - Action: placement.RuleOpDel, - DeleteByIDPrefix: true, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Role: placement.Voter, - }, - }, - }, + output: []*placement.Rule{}, }, { @@ -243,24 +187,13 @@ func (s *testPlacementSuite) TestPlacementBuild(c *C) { Tp: ast.PlacementDrop, }, }, - output: []*placement.RuleOp{ - { - Action: placement.RuleOpDel, - DeleteByIDPrefix: true, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Role: placement.Voter, - }, - }, - { - Action: placement.RuleOpDel, - DeleteByIDPrefix: true, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Role: placement.Learner, - }, - }, - }, + bundle: &placement.Bundle{Rules: []*placement.Rule{ + {Role: placement.Learner}, + {Role: placement.Voter}, + {Role: placement.Learner}, + {Role: placement.Voter}, + }}, + output: []*placement.Rule{}, }, { @@ -276,51 +209,32 @@ func (s *testPlacementSuite) TestPlacementBuild(c *C) { Tp: ast.PlacementDrop, }, }, - output: []*placement.RuleOp{ + output: []*placement.Rule{ { - Action: placement.RuleOpDel, - DeleteByIDPrefix: true, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Role: placement.Voter, - }, - }, - { - Action: placement.RuleOpAdd, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - Role: placement.Learner, - Override: true, - Count: 3, - LabelConstraints: []placement.LabelConstraint{ - {Key: "zone", Op: "in", Values: []string{"sh"}}, - {Key: "zone", Op: "notIn", Values: []string{"bj"}}, - }, + Role: placement.Learner, + Count: 3, + LabelConstraints: []placement.LabelConstraint{ + {Key: "zone", Op: "in", Values: []string{"sh"}}, + {Key: "zone", Op: "notIn", Values: []string{"bj"}}, }, }, }, }, } - for k, t := range tests { - out, err := buildPlacementSpecs(t.input) + for i, t := range tests { + var bundle *placement.Bundle + if t.bundle == nil { + bundle = &placement.Bundle{Rules: []*placement.Rule{}} + } else { + bundle = t.bundle + } + out, err := buildPlacementSpecs(bundle, t.input) if err == nil { - for i := range t.output { - found := false - for j := range out { - if s.compareRuleOp(out[j], t.output[i]) { - found = true - break - } - } - if !found { - c.Logf("test %d, %d-th output", k, i) - c.Logf("\texcept %+v\n\tbut got", t.output[i]) - for j := range out { - c.Logf("\t%+v", out[j]) - } - c.Fail() - } - } + expected, err := json.Marshal(t.output) + c.Assert(err, IsNil) + got, err := json.Marshal(out.Rules) + c.Assert(err, IsNil) + c.Assert(out.Rules, DeepEquals, t.output, Commentf("%d test\nexpected %s\nbut got %s", i, expected, got)) } else { c.Assert(err.Error(), ErrorMatches, t.err) } @@ -371,7 +285,7 @@ func (s *testPlacementSuite) TestPlacementBuildDrop(c *C) { out := buildPlacementDropRules(0, 0, t.input) c.Assert(len(out), Equals, len(t.output)) for i := range t.output { - c.Assert(s.compareRuleOp(out[i], t.output[i]), IsTrue, Commentf("except: %+v, obtained: %+v", t.output[i], out[i])) + c.Assert(s.compareRuleOp(out[i], t.output[i]), IsTrue, Commentf("expect: %+v, obtained: %+v", t.output[i], out[i])) } } } @@ -419,7 +333,7 @@ func (s *testPlacementSuite) TestPlacementBuildTruncate(c *C) { c.Assert(len(out), Equals, len(t.output)) for i := range t.output { - c.Assert(s.compareRuleOp(out[i], t.output[i]), IsTrue, Commentf("except: %+v, obtained: %+v", t.output[i], out[i])) + c.Assert(s.compareRuleOp(out[i], t.output[i]), IsTrue, Commentf("expect: %+v, obtained: %+v", t.output[i], out[i])) } } } diff --git a/domain/infosync/info.go b/domain/infosync/info.go index bb6e7864f6823..3eb549e3d4534 100644 --- a/domain/infosync/info.go +++ b/domain/infosync/info.go @@ -423,6 +423,32 @@ func GetRuleBundle(ctx context.Context, name string) (*placement.Bundle, error) return bundle, err } +// PutRuleBundle is used to post one specific rule bundle to PD. +func PutRuleBundle(ctx context.Context, bundle *placement.Bundle) error { + is, err := getGlobalInfoSyncer() + if err != nil { + return err + } + + if is.etcdCli == nil { + return nil + } + + addrs := is.etcdCli.Endpoints() + + if len(addrs) == 0 { + return errors.Errorf("pd unavailable") + } + + b, err := json.Marshal(bundle) + if err != nil { + return err + } + + _, err = doRequest(ctx, addrs, path.Join(pdapi.Config, "placement-rule", bundle.ID), "POST", bytes.NewReader(b)) + return err +} + func (is *InfoSyncer) getAllServerInfo(ctx context.Context) (map[string]*ServerInfo, error) { allInfo := make(map[string]*ServerInfo) if is.etcdCli == nil { From 4d1fe2062a2cb1b4889b2405ce5d916d776ba83f Mon Sep 17 00:00:00 2001 From: tiancaiamao Date: Fri, 25 Sep 2020 11:55:21 +0800 Subject: [PATCH 24/60] planner,explaintest: partition pruning for YEAR function (#20064) --- cmd/explaintest/r/partition_pruning.result | 2 +- planner/core/partition_pruning_test.go | 6 +-- planner/core/rule_partition_processor.go | 47 ++++++++++++++++------ 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/cmd/explaintest/r/partition_pruning.result b/cmd/explaintest/r/partition_pruning.result index c545d8ddb7239..cf9b019d374c9 100644 --- a/cmd/explaintest/r/partition_pruning.result +++ b/cmd/explaintest/r/partition_pruning.result @@ -1950,7 +1950,7 @@ partition p2 values less than (2000) insert into t8 values ('1985-05-05'),('1995-05-05'); explain select * from t8 where a < '1980-02-02'; id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 +TableReader_7 3323.33 root partition:p0,p1 data:Selection_6 └─Selection_6 3323.33 cop[tikv] lt(test.t8.a, 1980-02-02 00:00:00.000000) └─TableFullScan_5 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo create table t9 (a date not null) partition by RANGE(TO_DAYS(a)) ( diff --git a/planner/core/partition_pruning_test.go b/planner/core/partition_pruning_test.go index 7b962cb6b68cf..19fce4c99e9ef 100644 --- a/planner/core/partition_pruning_test.go +++ b/planner/core/partition_pruning_test.go @@ -45,7 +45,7 @@ func (s *testPartitionPruningSuite) TestCanBePrune(c *C) { "to_days(d)", ) lessThan := lessThanDataInt{data: []int64{733108, 733132}, maxvalue: false} - prunner := &rangePruner{lessThan, tc.col, tc.fn, true} + prunner := &rangePruner{lessThan, tc.col, tc.fn, monotoneModeNonStrict} queryExpr := tc.expr("d < '2000-03-08 00:00:00'") result := partitionRangeForCNFExpr(tc.sctx, queryExpr, prunner, fullRange(len(lessThan.data))) @@ -71,7 +71,7 @@ func (s *testPartitionPruningSuite) TestCanBePrune(c *C) { "unix_timestamp(report_updated)", ) lessThan = lessThanDataInt{data: []int64{1199145600, 1207008000, 1262304000, 0}, maxvalue: true} - prunner = &rangePruner{lessThan, tc.col, tc.fn, true} + prunner = &rangePruner{lessThan, tc.col, tc.fn, monotoneModeStrict} queryExpr = tc.expr("report_updated > '2008-05-01 00:00:00'") result = partitionRangeForCNFExpr(tc.sctx, queryExpr, prunner, fullRange(len(lessThan.data))) @@ -171,7 +171,7 @@ func (s *testPartitionPruningSuite) TestPartitionRangeForExpr(c *C) { "a", ) lessThan := lessThanDataInt{data: []int64{4, 7, 11, 14, 17, 0}, maxvalue: true} - prunner := &rangePruner{lessThan, tc.columns[0], nil, false} + prunner := &rangePruner{lessThan, tc.columns[0], nil, monotoneModeInvalid} cases := []struct { input string result partitionRangeOR diff --git a/planner/core/rule_partition_processor.go b/planner/core/rule_partition_processor.go index 14daabb151dd5..6b329358290f9 100644 --- a/planner/core/rule_partition_processor.go +++ b/planner/core/rule_partition_processor.go @@ -450,16 +450,16 @@ func (s *partitionProcessor) processRangePartition(ds *DataSource, pi *model.Par } // makePartitionByFnCol extracts the column and function information in 'partition by ... fn(col)'. -func makePartitionByFnCol(sctx sessionctx.Context, columns []*expression.Column, names types.NameSlice, partitionExpr string) (*expression.Column, *expression.ScalarFunction, bool, error) { +func makePartitionByFnCol(sctx sessionctx.Context, columns []*expression.Column, names types.NameSlice, partitionExpr string) (*expression.Column, *expression.ScalarFunction, monotoneMode, error) { + monotonous := monotoneModeInvalid schema := expression.NewSchema(columns...) tmp, err := expression.ParseSimpleExprsWithNames(sctx, partitionExpr, schema, names) if err != nil { - return nil, nil, false, err + return nil, nil, monotonous, err } partExpr := tmp[0] var col *expression.Column var fn *expression.ScalarFunction - var monotonous bool switch raw := partExpr.(type) { case *expression.ScalarFunction: // Special handle for floor(unix_timestamp(ts)) as partition expression. @@ -469,7 +469,7 @@ func makePartitionByFnCol(sctx sessionctx.Context, columns []*expression.Column, args := ut.GetArgs() if len(args) == 1 { if c, ok1 := args[0].(*expression.Column); ok1 { - return c, raw, true, nil + return c, raw, monotoneModeNonStrict, nil } } } @@ -483,7 +483,7 @@ func makePartitionByFnCol(sctx sessionctx.Context, columns []*expression.Column, col = c } } - _, monotonous = monotoneIncFuncs[raw.FuncName.L] + monotonous = getMonotoneMode(raw.FuncName.L) case *expression.Column: col = raw } @@ -540,7 +540,7 @@ type rangePruner struct { col *expression.Column partFn *expression.ScalarFunction // If partFn is not nil, monotonous indicates partFn is monotonous or not. - monotonous bool + monotonous monotoneMode } func (p *rangePruner) partitionRangeForExpr(sctx sessionctx.Context, expr expression.Expression) (int, int, bool) { @@ -606,10 +606,29 @@ func partitionRangeForInExpr(sctx sessionctx.Context, args []expression.Expressi return result.simplify() } -// monotoneIncFuncs are those functions that for any x y, if x > y => f(x) > f(y) -var monotoneIncFuncs = map[string]struct{}{ - ast.ToDays: {}, - ast.UnixTimestamp: {}, +type monotoneMode int + +const ( + monotoneModeInvalid monotoneMode = iota + monotoneModeStrict + monotoneModeNonStrict +) + +// monotoneIncFuncs are those functions that are monotone increasing. +// For any x y, if x > y => f(x) > f(y), function f is strict monotone . +// For any x y, if x > y => f(x) >= f(y), function f is non-strict monotone. +var monotoneIncFuncs = map[string]monotoneMode{ + ast.Year: monotoneModeNonStrict, + ast.ToDays: monotoneModeNonStrict, + ast.UnixTimestamp: monotoneModeStrict, +} + +func getMonotoneMode(fnName string) monotoneMode { + mode, ok := monotoneIncFuncs[fnName] + if !ok { + return monotoneModeInvalid + } + return mode } // f(x) op const, op is > = < @@ -660,19 +679,21 @@ func (p *rangePruner) extractDataForPrune(sctx sessionctx.Context, expr expressi var constExpr expression.Expression if p.partFn != nil { // If the partition function is not monotone, only EQ condition can be pruning. - if !p.monotonous && ret.op != ast.EQ { + if p.monotonous == monotoneModeInvalid && ret.op != ast.EQ { return ret, false } // If the partition expression is fn(col), change constExpr to fn(constExpr). constExpr = replaceColumnWithConst(p.partFn, con) - // Sometimes we need to relax the condition, < to <=, > to >=. + // When the partFn is not strict monotonous, we need to relax the condition < to <=, > to >=. // For example, the following case doesn't hold: // col < '2020-02-11 17:34:11' => to_days(col) < to_days(2020-02-11 17:34:11) // The correct transform should be: // col < '2020-02-11 17:34:11' => to_days(col) <= to_days(2020-02-11 17:34:11) - ret.op = relaxOP(ret.op) + if p.monotonous == monotoneModeNonStrict { + ret.op = relaxOP(ret.op) + } } else { // If the partition expression is col, use constExpr. constExpr = con From e4f7bd7cd22f3965a415e748b84e3d330a10ec94 Mon Sep 17 00:00:00 2001 From: lysu Date: Fri, 25 Sep 2020 12:52:10 +0800 Subject: [PATCH 25/60] tikv: fix panic in RegionStore.accessStore (#20204) --- store/tikv/region_cache.go | 14 +++++++++++-- store/tikv/region_cache_test.go | 37 +++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/store/tikv/region_cache.go b/store/tikv/region_cache.go index 8caaa101c4d73..37582c919b40e 100644 --- a/store/tikv/region_cache.go +++ b/store/tikv/region_cache.go @@ -554,6 +554,16 @@ func (c *RegionCache) OnSendFail(bo *Backoffer, ctx *RPCContext, scheduleReload tikvRegionCacheCounterWithSendFail.Inc() r := c.getCachedRegionWithRLock(ctx.Region) if r != nil { + peersNum := len(r.meta.Peers) + if len(ctx.Meta.Peers) != peersNum { + logutil.Logger(bo.ctx).Info("retry and refresh current ctx after send request fail and up/down stores length changed", + zap.Stringer("current", ctx), + zap.Bool("needReload", scheduleReload), + zap.Reflect("oldPeers", ctx.Meta.Peers), + zap.Reflect("newPeers", r.meta.Peers), + zap.Error(err)) + return + } rs := r.getStore() if err != nil { storeIdx, s := rs.accessStore(ctx.AccessMode, ctx.AccessIdx) @@ -1211,7 +1221,7 @@ func (r *Region) GetMeta() *metapb.Region { // GetLeaderPeerID returns leader peer ID. func (r *Region) GetLeaderPeerID() uint64 { store := r.getStore() - if int(store.workTiKVIdx) >= len(r.meta.Peers) { + if int(store.workTiKVIdx) >= store.accessStoreNum(TiKvOnly) { return 0 } storeIdx, _ := store.accessStore(TiKvOnly, store.workTiKVIdx) @@ -1221,7 +1231,7 @@ func (r *Region) GetLeaderPeerID() uint64 { // GetLeaderStoreID returns the store ID of the leader region. func (r *Region) GetLeaderStoreID() uint64 { store := r.getStore() - if int(store.workTiKVIdx) >= len(r.meta.Peers) { + if int(store.workTiKVIdx) >= store.accessStoreNum(TiKvOnly) { return 0 } storeIdx, _ := store.accessStore(TiKvOnly, store.workTiKVIdx) diff --git a/store/tikv/region_cache_test.go b/store/tikv/region_cache_test.go index 236c30f8e3115..0b259ddf6b110 100644 --- a/store/tikv/region_cache_test.go +++ b/store/tikv/region_cache_test.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/mockstore/mocktikv" + pd "github.com/tikv/pd/client" ) type testRegionCacheSuite struct { @@ -1079,6 +1080,42 @@ func (s *testRegionCacheSuite) TestMixedMeetEpochNotMatch(c *C) { c.Assert(followReqSeed, Equals, uint32(1)) } +func (s *testRegionCacheSuite) TestPeersLenChange(c *C) { + // 2 peers [peer1, peer2] and let peer2 become leader + loc, err := s.cache.LocateKey(s.bo, []byte("a")) + c.Assert(err, IsNil) + s.cache.UpdateLeader(loc.Region, s.store2, 0) + + // current leader is peer2 in [peer1, peer2] + loc, err = s.cache.LocateKey(s.bo, []byte("a")) + c.Assert(err, IsNil) + ctx, err := s.cache.GetTiKVRPCContext(s.bo, loc.Region, kv.ReplicaReadLeader, 0) + c.Assert(err, IsNil) + c.Assert(ctx.Peer.StoreId, Equals, s.store2) + + // simulate peer1 became down in kv heartbeat and loaded before response back. + cpMeta := &metapb.Region{ + Id: ctx.Meta.Id, + StartKey: ctx.Meta.StartKey, + EndKey: ctx.Meta.EndKey, + RegionEpoch: ctx.Meta.RegionEpoch, + Peers: make([]*metapb.Peer, len(ctx.Meta.Peers)), + } + copy(cpMeta.Peers, ctx.Meta.Peers) + cpRegion := &pd.Region{ + Meta: cpMeta, + DownPeers: []*metapb.Peer{{Id: s.peer1, StoreId: s.store1}}, + } + filterUnavailablePeers(cpRegion) + region := &Region{meta: cpRegion.Meta} + err = region.init(s.cache) + c.Assert(err, IsNil) + s.cache.insertRegionToCache(region) + + // OnSendFail should not panic + s.cache.OnSendFail(NewNoopBackoff(context.Background()), ctx, false, errors.New("send fail")) +} + func (s *testRegionRequestSuite) TestGetRegionByIDFromCache(c *C) { region, err := s.cache.LocateRegionByID(s.bo, s.region) c.Assert(err, IsNil) From 09feccb529be2830944e11f5fed474020f50370f Mon Sep 17 00:00:00 2001 From: MyonKeminta <9948422+MyonKeminta@users.noreply.github.com> Date: Fri, 25 Sep 2020 13:27:38 +0800 Subject: [PATCH 26/60] store/tikv: Add a test that checks prewrites properly set secondaries for async commit transactions (#20178) Signed-off-by: MyonKeminta --- store/tikv/async_commit_fail_test.go | 86 ++++++++++++++++++++++++++++ store/tikv/async_commit_test.go | 13 +++-- store/tikv/txn.go | 1 + 3 files changed, 95 insertions(+), 5 deletions(-) diff --git a/store/tikv/async_commit_fail_test.go b/store/tikv/async_commit_fail_test.go index c896b2ee3e69d..c6225d54a1038 100644 --- a/store/tikv/async_commit_fail_test.go +++ b/store/tikv/async_commit_fail_test.go @@ -16,10 +16,12 @@ package tikv import ( "bytes" "context" + "sort" . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" @@ -30,6 +32,7 @@ import ( type testAsyncCommitFailSuite struct { OneByOneSuite + testAsyncCommitCommon cluster cluster.Cluster store *tikvStore } @@ -81,3 +84,86 @@ func (s *testAsyncCommitFailSuite) TestFailAsyncCommitPrewriteRpcErrors(c *C) { c.Assert(err, IsNil) c.Assert(bytes.Equal(res, []byte("a1")), IsTrue) } + +func (s *testAsyncCommitFailSuite) TestSecondaryListInPrimaryLock(c *C) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.EnableAsyncCommit = true + }) + + s.putAlphabets(c, s.store) + + // Split into several regions. + for _, splitKey := range []string{"h", "o", "u"} { + bo := NewBackofferWithVars(context.Background(), 5000, nil) + loc, err := s.store.GetRegionCache().LocateKey(bo, []byte(splitKey)) + c.Assert(err, IsNil) + newRegionID := s.cluster.AllocID() + newPeerID := s.cluster.AllocID() + s.cluster.Split(loc.Region.GetID(), newRegionID, []byte(splitKey), []uint64{newPeerID}, newPeerID) + s.store.GetRegionCache().InvalidateCachedRegion(loc.Region) + } + + // Ensure the region has been split + bo := NewBackofferWithVars(context.Background(), 5000, nil) + loc, err := s.store.GetRegionCache().LocateKey(bo, []byte("i")) + c.Assert(err, IsNil) + c.Assert([]byte(loc.StartKey), BytesEquals, []byte("h")) + c.Assert([]byte(loc.EndKey), BytesEquals, []byte("o")) + + loc, err = s.store.GetRegionCache().LocateKey(bo, []byte("p")) + c.Assert(err, IsNil) + c.Assert([]byte(loc.StartKey), BytesEquals, []byte("o")) + c.Assert([]byte(loc.EndKey), BytesEquals, []byte("u")) + + var connID uint64 = 0 + test := func(keys []string, values []string) { + connID++ + ctx := context.WithValue(context.Background(), sessionctx.ConnID, connID) + + txn, err := s.store.Begin() + c.Assert(err, IsNil) + for i := range keys { + txn.Set([]byte(keys[i]), []byte(values[i])) + } + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/asyncCommitDoNothing", "return"), IsNil) + + err = txn.Commit(ctx) + c.Assert(err, IsNil) + + tikvTxn := txn.(*tikvTxn) + primary := tikvTxn.committer.primary() + bo := NewBackofferWithVars(context.Background(), 5000, nil) + txnStatus, err := s.store.lockResolver.getTxnStatus(bo, txn.StartTS(), primary, 0, 0, false) + c.Assert(err, IsNil) + c.Assert(txnStatus.IsCommitted(), IsFalse) + c.Assert(txnStatus.action, Equals, kvrpcpb.Action_NoAction) + // Currently when the transaction has no secondary, the `secondaries` field of the txnStatus + // will be set nil. So here initialize the `expectedSecondaries` to nil too. + var expectedSecondaries [][]byte + for _, k := range keys { + if !bytes.Equal([]byte(k), primary) { + expectedSecondaries = append(expectedSecondaries, []byte(k)) + } + } + sort.Slice(expectedSecondaries, func(i, j int) bool { + return bytes.Compare(expectedSecondaries[i], expectedSecondaries[j]) < 0 + }) + + gotSecondaries := txnStatus.primaryLock.GetSecondaries() + sort.Slice(gotSecondaries, func(i, j int) bool { + return bytes.Compare(gotSecondaries[i], gotSecondaries[j]) < 0 + }) + + c.Assert(gotSecondaries, DeepEquals, expectedSecondaries) + + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/asyncCommitDoNothing"), IsNil) + } + + test([]string{"a"}, []string{"a1"}) + test([]string{"a", "b"}, []string{"a2", "b2"}) + test([]string{"a", "b", "d"}, []string{"a3", "b3", "d3"}) + test([]string{"a", "b", "h", "i", "u"}, []string{"a4", "b4", "h4", "i4", "u4"}) + test([]string{"i", "a", "z", "u", "b"}, []string{"i5", "a5", "z5", "u5", "b5"}) +} diff --git a/store/tikv/async_commit_test.go b/store/tikv/async_commit_test.go index 98202c5f9c320..272ee6cb5e98b 100644 --- a/store/tikv/async_commit_test.go +++ b/store/tikv/async_commit_test.go @@ -29,8 +29,11 @@ import ( "github.com/pingcap/tidb/store/tikv/tikvrpc" ) +type testAsyncCommitCommon struct{} + type testAsyncCommitSuite struct { OneByOneSuite + testAsyncCommitCommon cluster cluster.Cluster store *tikvStore bo *Backoffer @@ -50,14 +53,14 @@ func (s *testAsyncCommitSuite) SetUpTest(c *C) { s.bo = NewBackofferWithVars(context.Background(), 5000, nil) } -func (s *testAsyncCommitSuite) putAlphabets(c *C) { +func (s *testAsyncCommitCommon) putAlphabets(c *C, store *tikvStore) { for ch := byte('a'); ch <= byte('z'); ch++ { - s.putKV(c, []byte{ch}, []byte{ch}) + s.putKV(c, store, []byte{ch}, []byte{ch}) } } -func (s *testAsyncCommitSuite) putKV(c *C, key, value []byte) (uint64, uint64) { - txn, err := s.store.Begin() +func (s *testAsyncCommitCommon) putKV(c *C, store *tikvStore, key, value []byte) (uint64, uint64) { + txn, err := store.Begin() c.Assert(err, IsNil) err = txn.Set(key, value) c.Assert(err, IsNil) @@ -125,7 +128,7 @@ func (s *testAsyncCommitSuite) TestCheckSecondaries(c *C) { conf.TiKVClient.EnableAsyncCommit = true }) - s.putAlphabets(c) + s.putAlphabets(c, s.store) loc, err := s.store.GetRegionCache().LocateKey(s.bo, []byte("a")) c.Assert(err, IsNil) diff --git a/store/tikv/txn.go b/store/tikv/txn.go index fb7bfa46da5de..401900a74dc60 100644 --- a/store/tikv/txn.go +++ b/store/tikv/txn.go @@ -239,6 +239,7 @@ func (txn *tikvTxn) Commit(ctx context.Context) error { if err != nil { return errors.Trace(err) } + txn.committer = committer } defer func() { // For async commit transactions, the ttl manager will be closed in the asynchronous commit goroutine. From 0843f32c09063079427e580a5189c0200cf92c16 Mon Sep 17 00:00:00 2001 From: Arenatlx Date: Fri, 25 Sep 2020 14:35:40 +0800 Subject: [PATCH 27/60] DDL: check table-level check constraint when create table (#20202) Signed-off-by: AilinKid <314806019@qq.com> --- ddl/db_test.go | 15 ++++++++++++++- ddl/ddl_api.go | 11 +++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/ddl/db_test.go b/ddl/db_test.go index edfc21a957b0b..4d1556368457e 100644 --- a/ddl/db_test.go +++ b/ddl/db_test.go @@ -5091,7 +5091,7 @@ func (s *testDBSuite4) TestColumnCheck(c *C) { tk.MustExec("create table column_check (pk int primary key, a int check (a > 1))") defer tk.MustExec("drop table if exists column_check") c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(1)) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|8231|Column check is not supported")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|8231|CONSTRAINT CHECK is not supported")) } func (s *testDBSuite5) TestAlterCheck(c *C) { @@ -5127,6 +5127,19 @@ func (s *testDBSuite7) TestAddConstraintCheck(c *C) { tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|8231|ADD CONSTRAINT CHECK is not supported")) } +func (s *testDBSuite7) TestCreateTableIngoreCheckConstraint(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use " + s.schemaName) + tk.MustExec("drop table if exists table_constraint_check") + tk.MustExec("CREATE TABLE admin_user (enable bool, CHECK (enable IN (0, 1)));") + c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(1)) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|8231|CONSTRAINT CHECK is not supported")) + tk.MustQuery("show create table admin_user").Check(testutil.RowsWithSep("|", ""+ + "admin_user CREATE TABLE `admin_user` (\n"+ + " `enable` tinyint(1) DEFAULT NULL\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) +} + func (s *testDBSuite6) TestAlterOrderBy(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use " + s.schemaName) diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index 671f798746d18..e77c13bd856ba 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -624,9 +624,9 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, o col.FieldType.Collate = v.StrValue } case ast.ColumnOptionFulltext: - ctx.GetSessionVars().StmtCtx.AppendWarning(ErrTableCantHandleFt) + ctx.GetSessionVars().StmtCtx.AppendWarning(ErrTableCantHandleFt.GenWithStackByArgs()) case ast.ColumnOptionCheck: - ctx.GetSessionVars().StmtCtx.AppendWarning(ErrUnsupportedConstraintCheck.GenWithStackByArgs("Column check")) + ctx.GetSessionVars().StmtCtx.AppendWarning(ErrUnsupportedConstraintCheck.GenWithStackByArgs("CONSTRAINT CHECK")) } } } @@ -1361,8 +1361,11 @@ func buildTableInfo( } if constr.Tp == ast.ConstraintFulltext { - sc := ctx.GetSessionVars().StmtCtx - sc.AppendWarning(ErrTableCantHandleFt) + ctx.GetSessionVars().StmtCtx.AppendWarning(ErrTableCantHandleFt.GenWithStackByArgs()) + continue + } + if constr.Tp == ast.ConstraintCheck { + ctx.GetSessionVars().StmtCtx.AppendWarning(ErrUnsupportedConstraintCheck.GenWithStackByArgs("CONSTRAINT CHECK")) continue } // build index info. From 47a182f76a2185cf1778174fc22d00e0416154a3 Mon Sep 17 00:00:00 2001 From: wjHuang Date: Fri, 25 Sep 2020 15:57:36 +0800 Subject: [PATCH 28/60] executor: fix a bug that the generated column doesn't handle bad null value (#20193) Signed-off-by: wjhuang2016 --- executor/executor.go | 4 ++++ executor/union_scan.go | 5 +++++ expression/integration_test.go | 15 +++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/executor/executor.go b/executor/executor.go index 8215c723a2dab..4eb6c7f9f0413 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -1706,6 +1706,10 @@ func FillVirtualColumnValue(virtualRetTypes []*types.FieldType, virtualColumnInd if err != nil { return err } + // Handle the bad null error. + if (mysql.HasNotNullFlag(columns[idx].Flag) || mysql.HasPreventNullInsertFlag(columns[idx].Flag)) && castDatum.IsNull() { + castDatum = table.GetZeroValue(columns[idx]) + } virCols.AppendDatum(i, &castDatum) } req.SetCol(idx, virCols.Column(i)) diff --git a/executor/union_scan.go b/executor/union_scan.go index 43f316b785cdd..cdc13e19c8f8b 100644 --- a/executor/union_scan.go +++ b/executor/union_scan.go @@ -19,6 +19,7 @@ import ( "runtime/trace" "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" plannercore "github.com/pingcap/tidb/planner/core" @@ -134,6 +135,10 @@ func (us *UnionScanExec) Next(ctx context.Context, req *chunk.Chunk) error { if err != nil { return err } + // Handle the bad null error. + if (mysql.HasNotNullFlag(us.columns[idx].Flag) || mysql.HasPreventNullInsertFlag(us.columns[idx].Flag)) && castDatum.IsNull() { + castDatum = table.GetZeroValue(us.columns[idx]) + } mutableRow.SetDatum(idx, castDatum) } diff --git a/expression/integration_test.go b/expression/integration_test.go index 54fed7610f487..a54be29493365 100755 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -7330,6 +7330,21 @@ func (s *testIntegrationSerialSuite) TestIssue18949(c *C) { c.Assert(result, Matches, `(?s).*enum\('a','b ',' c'\).*set\('a','b ',' c'\).*`) } +func (s *testIntegrationSuite) TestIssue17767(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t0;") + tk.MustExec("CREATE TABLE t0(c0 INTEGER AS (NULL) NOT NULL, c1 INT);") + tk.MustExec("CREATE INDEX i0 ON t0(c0, c1);") + tk.MustExec("INSERT IGNORE INTO t0(c1) VALUES (0);") + tk.MustQuery("SELECT * FROM t0").Check(testkit.Rows("0 0")) + + tk.MustExec("begin") + tk.MustExec("INSERT IGNORE INTO t0(c1) VALUES (0);") + tk.MustQuery("SELECT * FROM t0").Check(testkit.Rows("0 0", "0 0")) + tk.MustExec("rollback") +} + func (s *testIntegrationSuite) TestIssue19596(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") From 32d86e26c2ef83d5e860912af1f812fc34939856 Mon Sep 17 00:00:00 2001 From: Zejun Li Date: Fri, 25 Sep 2020 16:10:56 +0800 Subject: [PATCH 29/60] *: fix message for duplicate entry error (#20203) Co-authored-by: ti-srebot <66930949+ti-srebot@users.noreply.github.com> --- executor/insert_test.go | 51 +++++++++++++++ kv/kv.go | 2 + kv/memdb.go | 18 ++++++ kv/memdb_arena.go | 16 ++++- kv/union_store.go | 30 ++++----- store/tikv/2pc.go | 136 +++++++++++++++++++++++++++++++++++----- table/tables/index.go | 2 +- table/tables/tables.go | 10 +-- 8 files changed, 223 insertions(+), 42 deletions(-) diff --git a/executor/insert_test.go b/executor/insert_test.go index e5d2d573f36dd..abaf5d2c9e18f 100644 --- a/executor/insert_test.go +++ b/executor/insert_test.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" ) @@ -1318,6 +1319,56 @@ func (s *testSuite10) TestClusterPrimaryKeyForIndexScan(c *C) { c.Assert(cnt, Equals, 15) } +func (s *testSerialSuite) TestDuplicateEntryMessage(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + for _, enable := range []int{0, 1} { + tk.MustExec(fmt.Sprintf("set session tidb_enable_clustered_index=%d;", enable)) + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, b char(10), unique key(b)) collate utf8mb4_general_ci;") + tk.MustExec("insert into t value (34, '12Ak');") + tk.MustGetErrMsg("insert into t value (34, '12Ak');", "[kv:1062]Duplicate entry '12Ak' for key 'b'") + + tk.MustExec("begin optimistic;") + tk.MustExec("insert into t value (34, '12ak');") + tk.MustExec("delete from t where b = '12ak';") + tk.MustGetErrMsg("commit;", "previous statement: delete from t where b = '12ak';: [kv:1062]Duplicate entry '12ak' for key 'b'") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a datetime primary key);") + tk.MustExec("insert into t values ('2020-01-01');") + tk.MustGetErrMsg("insert into t values ('2020-01-01');", "[kv:1062]Duplicate entry '2020-01-01 00:00:00' for key 'PRIMARY'") + + tk.MustExec("begin optimistic;") + tk.MustExec("insert into t values ('2020-01-01');") + tk.MustExec("delete from t where a = '2020-01-01';") + tk.MustGetErrMsg("commit;", "previous statement: delete from t where a = '2020-01-01';: [kv:1062]Duplicate entry '2020-01-01 00:00:00' for key 'PRIMARY'") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int primary key );") + tk.MustExec("insert into t value (1);") + tk.MustGetErrMsg("insert into t value (1);", "[kv:1062]Duplicate entry '1' for key 'PRIMARY'") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a datetime unique);") + tk.MustExec("insert into t values ('2020-01-01');") + tk.MustGetErrMsg("insert into t values ('2020-01-01');", "[kv:1062]Duplicate entry '2020-01-01 00:00:00' for key 'a'") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a datetime, b int, c varchar(10), primary key (a, b, c)) collate utf8mb4_general_ci;") + tk.MustExec("insert into t values ('2020-01-01', 1, 'aSDd');") + tk.MustGetErrMsg("insert into t values ('2020-01-01', 1, 'ASDD');", "[kv:1062]Duplicate entry '2020-01-01 00:00:00-1-ASDD' for key 'PRIMARY'") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a datetime, b int, c varchar(10), unique key (a, b, c)) collate utf8mb4_general_ci;") + tk.MustExec("insert into t values ('2020-01-01', 1, 'aSDd');") + tk.MustGetErrMsg("insert into t values ('2020-01-01', 1, 'ASDD');", "[kv:1062]Duplicate entry '2020-01-01 00:00:00-1-ASDD' for key 'a'") + } +} + func combination(items []string) func() []string { current := 1 buf := make([]string, len(items)) diff --git a/kv/kv.go b/kv/kv.go index 1d682b958e584..8edf038d4ace1 100644 --- a/kv/kv.go +++ b/kv/kv.go @@ -212,6 +212,8 @@ type MemBuffer interface { // InspectStage used to inspect the value updates in the given stage. InspectStage(StagingHandle, func(Key, KeyFlags, []byte)) + // SelectValueHistory select the latest value which makes `predicate` returns true from the modification history. + SelectValueHistory(key Key, predicate func(value []byte) bool) ([]byte, error) // SnapshotGetter returns a Getter for a snapshot of MemBuffer. SnapshotGetter() Getter // SnapshotIter returns a Iterator for a snapshot of MemBuffer. diff --git a/kv/memdb.go b/kv/memdb.go index 2f40d8c402cb5..fa281d048c360 100644 --- a/kv/memdb.go +++ b/kv/memdb.go @@ -234,6 +234,24 @@ func (db *memdb) Get(_ context.Context, key Key) ([]byte, error) { return db.vlog.getValue(x.vptr), nil } +func (db *memdb) SelectValueHistory(key Key, predicate func(value []byte) bool) ([]byte, error) { + x := db.traverse(key, false) + if x.isNull() { + return nil, ErrNotExist + } + if x.vptr.isNull() { + // A flag only key, act as value not exists + return nil, ErrNotExist + } + result := db.vlog.selectValueHistory(x.vptr, func(addr memdbArenaAddr) bool { + return predicate(db.vlog.getValue(addr)) + }) + if result.isNull() { + return nil, nil + } + return db.vlog.getValue(result), nil +} + func (db *memdb) GetFlags(key Key) (KeyFlags, error) { x := db.traverse(key, false) if x.isNull() { diff --git a/kv/memdb_arena.go b/kv/memdb_arena.go index 0e0d4ff66d9b5..68ed49a1e1afa 100644 --- a/kv/memdb_arena.go +++ b/kv/memdb_arena.go @@ -276,15 +276,25 @@ func (l *memdbVlog) getValue(addr memdbArenaAddr) []byte { } func (l *memdbVlog) getSnapshotValue(addr memdbArenaAddr, snap *memdbCheckpoint) ([]byte, bool) { + result := l.selectValueHistory(addr, func(addr memdbArenaAddr) bool { + return !l.canModify(snap, addr) + }) + if result.isNull() { + return nil, false + } + return l.getValue(addr), true +} + +func (l *memdbVlog) selectValueHistory(addr memdbArenaAddr, predicate func(memdbArenaAddr) bool) memdbArenaAddr { for !addr.isNull() { - if !l.canModify(snap, addr) { - return l.getValue(addr), true + if predicate(addr) { + return addr } var hdr memdbVlogHdr hdr.load(l.blocks[addr.idx].buf[addr.off-memdbVlogHdrSize:]) addr = hdr.oldValue } - return nil, false + return nullAddr } func (l *memdbVlog) revertToCheckpoint(db *memdb, cp *memdbCheckpoint) { diff --git a/kv/union_store.go b/kv/union_store.go index e494108c3b059..669048a9d0bf7 100644 --- a/kv/union_store.go +++ b/kv/union_store.go @@ -15,6 +15,8 @@ package kv import ( "context" + + "github.com/pingcap/parser/model" ) // UnionStore is a store that wraps a snapshot for read and a MemBuffer for buffered write. @@ -24,14 +26,14 @@ type UnionStore interface { // HasPresumeKeyNotExists returns whether the key presumed key not exists error for the lazy check. HasPresumeKeyNotExists(k Key) bool - // DeleteKeyExistErrInfo deletes the key presume key not exists error flag for the lazy check. + // UnmarkPresumeKeyNotExists deletes the key presume key not exists error flag for the lazy check. UnmarkPresumeKeyNotExists(k Key) // CacheIndexName caches the index name. // PresumeKeyNotExists will use this to help decode error message. - CacheIndexName(tableID, indexID int64, name string) + CacheTableInfo(id int64, info *model.TableInfo) // GetIndexName returns the cached index name. // If there is no such index already inserted through CacheIndexName, it will return UNKNOWN. - GetIndexName(tableID, indexID int64) string + GetTableInfo(id int64) *model.TableInfo // SetOption sets an option with a value, when val is nil, uses the default // value of this option. @@ -63,16 +65,12 @@ type Options interface { Get(opt Option) (v interface{}, ok bool) } -type idxNameKey struct { - tableID, indexID int64 -} - // unionStore is an in-memory Store which contains a buffer for write and a // snapshot for read. type unionStore struct { memBuffer *memdb snapshot Snapshot - idxNameCache map[idxNameKey]string + idxNameCache map[int64]*model.TableInfo opts options } @@ -81,7 +79,7 @@ func NewUnionStore(snapshot Snapshot) UnionStore { return &unionStore{ snapshot: snapshot, memBuffer: newMemDB(), - idxNameCache: make(map[idxNameKey]string), + idxNameCache: make(map[int64]*model.TableInfo), opts: make(map[Option]interface{}), } } @@ -146,18 +144,12 @@ func (us *unionStore) UnmarkPresumeKeyNotExists(k Key) { us.memBuffer.UpdateFlags(k, DelPresumeKeyNotExists) } -func (us *unionStore) GetIndexName(tableID, indexID int64) string { - key := idxNameKey{tableID: tableID, indexID: indexID} - name, ok := us.idxNameCache[key] - if !ok { - return "UNKNOWN" - } - return name +func (us *unionStore) GetTableInfo(id int64) *model.TableInfo { + return us.idxNameCache[id] } -func (us *unionStore) CacheIndexName(tableID, indexID int64, name string) { - key := idxNameKey{tableID: tableID, indexID: indexID} - us.idxNameCache[key] = name +func (us *unionStore) CacheTableInfo(id int64, info *model.TableInfo) { + us.idxNameCache[id] = info } // SetOption implements the unionStore SetOption interface. diff --git a/store/tikv/2pc.go b/store/tikv/2pc.go index 3eb0fb51b2743..f412e8fe45519 100644 --- a/store/tikv/2pc.go +++ b/store/tikv/2pc.go @@ -26,6 +26,8 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" pb "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" @@ -33,12 +35,15 @@ import ( "github.com/pingcap/tidb/sessionctx/binloginfo" "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/store/tikv/tikvrpc" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/rowcodec" "github.com/pingcap/tipb/go-binlog" "github.com/prometheus/client_golang/prometheus" - "go.uber.org/zap" + zap "go.uber.org/zap" ) type twoPhaseCommitAction interface { @@ -200,27 +205,128 @@ func (c *twoPhaseCommitter) extractKeyExistsErr(key kv.Key) error { return errors.Errorf("conn %d, existErr for key:%s should not be nil", c.connID, key) } - _, handle, err := tablecodec.DecodeRecordKey(key) - if err == nil { - if handle.IsInt() { - return kv.ErrKeyExists.FastGenByArgs(handle.String(), "PRIMARY") + tableID, indexID, isRecord, err := tablecodec.DecodeKeyHead(key) + if err != nil { + return c.genKeyExistsError("UNKNOWN", key.String(), err) + } + + tblInfo := c.txn.us.GetTableInfo(tableID) + if tblInfo == nil { + return c.genKeyExistsError("UNKNOWN", key.String(), errors.New("cannot find table info")) + } + + value, err := c.txn.us.GetMemBuffer().SelectValueHistory(key, func(value []byte) bool { return len(value) != 0 }) + if err != nil { + return c.genKeyExistsError("UNKNOWN", key.String(), err) + } + + if isRecord { + return c.extractKeyExistsErrFromHandle(key, value, tblInfo) + } + return c.extractKeyExistsErrFromIndex(key, value, tblInfo, indexID) +} + +func (c *twoPhaseCommitter) extractKeyExistsErrFromIndex(key kv.Key, value []byte, tblInfo *model.TableInfo, indexID int64) error { + var idxInfo *model.IndexInfo + for _, index := range tblInfo.Indices { + if index.ID == indexID { + idxInfo = index } - trimLen := 0 - for i := 0; i < handle.NumCols(); i++ { - trimLen += len(handle.EncodedCol(i)) + } + if idxInfo == nil { + return c.genKeyExistsError("UNKNOWN", key.String(), errors.New("cannot find index info")) + } + name := idxInfo.Name.String() + + if len(value) == 0 { + return c.genKeyExistsError(name, key.String(), errors.New("missing value")) + } + + colInfo := make([]rowcodec.ColInfo, 0, len(idxInfo.Columns)) + for _, idxCol := range idxInfo.Columns { + col := tblInfo.Columns[idxCol.Offset] + colInfo = append(colInfo, rowcodec.ColInfo{ + ID: col.ID, + IsPKHandle: tblInfo.PKIsHandle && mysql.HasPriKeyFlag(col.Flag), + Ft: rowcodec.FieldTypeFromModelColumn(col), + }) + } + + values, err := tablecodec.DecodeIndexKV(key, value, len(idxInfo.Columns), tablecodec.HandleNotNeeded, colInfo) + if err != nil { + return c.genKeyExistsError(name, key.String(), err) + } + valueStr := make([]string, 0, len(values)) + for i, val := range values { + d, err := tablecodec.DecodeColumnValue(val, colInfo[i].Ft, time.Local) + if err != nil { + return c.genKeyExistsError(name, key.String(), err) } - values, err := tablecodec.DecodeValuesBytesToStrings(handle.Encoded()[:trimLen]) - if err == nil { - return kv.ErrKeyExists.FastGenByArgs(strings.Join(values, "-"), "PRIMARY") + str, err := d.ToString() + if err != nil { + return c.genKeyExistsError(name, key.String(), err) } + valueStr = append(valueStr, str) } + return c.genKeyExistsError(name, strings.Join(valueStr, "-"), nil) +} - tableID, indexID, indexValues, err := tablecodec.DecodeIndexKey(key) - if err == nil { - return kv.ErrKeyExists.FastGenByArgs(strings.Join(indexValues, "-"), c.txn.us.GetIndexName(tableID, indexID)) +func (c *twoPhaseCommitter) extractKeyExistsErrFromHandle(key kv.Key, value []byte, tblInfo *model.TableInfo) error { + const name = "PRIMARY" + _, handle, err := tablecodec.DecodeRecordKey(key) + if err != nil { + return c.genKeyExistsError(name, key.String(), err) + } + + if handle.IsInt() { + return c.genKeyExistsError(name, handle.String(), nil) + } + + if len(value) == 0 { + return c.genKeyExistsError(name, handle.String(), errors.New("missing value")) + } + + idxInfo := tables.FindPrimaryIndex(tblInfo) + if idxInfo == nil { + return c.genKeyExistsError(name, handle.String(), errors.New("cannot find index info")) + } + + cols := make(map[int64]*types.FieldType, len(tblInfo.Columns)) + for _, col := range tblInfo.Columns { + cols[col.ID] = &col.FieldType + } + handleColIDs := make([]int64, 0, len(idxInfo.Columns)) + for _, col := range idxInfo.Columns { + handleColIDs = append(handleColIDs, tblInfo.Columns[col.Offset].ID) + } + + row, err := tablecodec.DecodeRowToDatumMap(value, cols, time.Local) + if err != nil { + return c.genKeyExistsError(name, handle.String(), err) + } + + data, err := tablecodec.DecodeHandleToDatumMap(handle, handleColIDs, cols, time.Local, row) + if err != nil { + return c.genKeyExistsError(name, handle.String(), err) + } + + valueStr := make([]string, 0, len(data)) + for _, col := range idxInfo.Columns { + d := data[tblInfo.Columns[col.Offset].ID] + str, err := d.ToString() + if err != nil { + return c.genKeyExistsError(name, key.String(), err) + } + valueStr = append(valueStr, str) } + return c.genKeyExistsError(name, strings.Join(valueStr, "-"), nil) +} - return kv.ErrKeyExists.FastGenByArgs(key.String(), "UNKNOWN") +func (c *twoPhaseCommitter) genKeyExistsError(name string, value string, err error) error { + if err != nil { + logutil.BgLogger().Info("extractKeyExistsErr meets error", zap.Error(err)) + } + return kv.ErrKeyExists.FastGenByArgs(value, name) } func (c *twoPhaseCommitter) initKeysAndMutations() error { diff --git a/table/tables/index.go b/table/tables/index.go index a6f9b65405c15..37abff8770f31 100644 --- a/table/tables/index.go +++ b/table/tables/index.go @@ -178,7 +178,7 @@ func (c *index) GenIndexKey(sc *stmtctx.StatementContext, indexedValues []types. // func (c *index) Create(sctx sessionctx.Context, us kv.UnionStore, indexedValues []types.Datum, h kv.Handle, opts ...table.CreateIdxOptFunc) (kv.Handle, error) { if c.Meta().Unique { - us.CacheIndexName(c.phyTblID, c.Meta().ID, c.Meta().Name.String()) + us.CacheTableInfo(c.phyTblID, c.tblInfo) } var opt table.CreateIdxOpt for _, fn := range opts { diff --git a/table/tables/tables.go b/table/tables/tables.go index 443771e4dce40..c75dedc0f2fab 100644 --- a/table/tables/tables.go +++ b/table/tables/tables.go @@ -581,6 +581,11 @@ func TryGetCommonPkColumns(tbl table.Table) []*table.Column { // AddRecord implements table.Table AddRecord interface. func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts ...table.AddRecordOption) (recordID kv.Handle, err error) { + txn, err := sctx.Txn(true) + if err != nil { + return nil, err + } + var opt table.AddRecordOpt for _, fn := range opts { fn.ApplyOn(&opt) @@ -596,6 +601,7 @@ func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts . hasRecordID = true } else { tblInfo := t.Meta() + txn.GetUnionStore().CacheTableInfo(t.physicalTableID, tblInfo) if tblInfo.PKIsHandle { recordID = kv.IntHandle(r[tblInfo.GetPkColInfo().Offset].GetInt64()) hasRecordID = true @@ -637,10 +643,6 @@ func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts . } } - txn, err := sctx.Txn(true) - if err != nil { - return nil, err - } var colIDs, binlogColIDs []int64 var row, binlogRow []types.Datum if recordCtx, ok := sctx.Value(addRecordCtxKey).(*CommonAddRecordCtx); ok { From e0c32b6f0e384e24d2161dbb2b3b75365b3d84b1 Mon Sep 17 00:00:00 2001 From: Zejun Li Date: Sat, 26 Sep 2020 19:33:37 +0800 Subject: [PATCH 30/60] 2pc: iterator and collector of new streaming committer (#20173) --- kv/kv.go | 1 + kv/memdb.go | 36 ++- kv/memdb_iterator.go | 6 + store/tikv/2pc.go | 7 +- store/tikv/2pc_utils.go | 621 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 659 insertions(+), 12 deletions(-) create mode 100644 store/tikv/2pc_utils.go diff --git a/kv/kv.go b/kv/kv.go index 8edf038d4ace1..eb8d9dfdf84b4 100644 --- a/kv/kv.go +++ b/kv/kv.go @@ -169,6 +169,7 @@ type MemBufferIterator interface { Iterator HasValue() bool Flags() KeyFlags + UpdateFlags(...FlagsOp) } // MemBuffer is an in-memory kv collection, can be used to buffer write operations. diff --git a/kv/memdb.go b/kv/memdb.go index fa281d048c360..c00822d8b7c51 100644 --- a/kv/memdb.go +++ b/kv/memdb.go @@ -27,7 +27,8 @@ const ( flagKeyLocked flagKeyLockedValExist flagNeedCheckExists - flagNoNeedCommit + flagPrewriteOnly + flagIgnoredIn2PC persistentFlags = flagKeyLocked | flagKeyLockedValExist // bit 1 => red, bit 0 => black @@ -58,9 +59,14 @@ func (f KeyFlags) HasNeedCheckExists() bool { return f&flagNeedCheckExists != 0 } -// HasNoNeedCommit returns whether the key should be used in 2pc commit phase. -func (f KeyFlags) HasNoNeedCommit() bool { - return f&flagNoNeedCommit != 0 +// HasPrewriteOnly returns whether the key should be used in 2pc commit phase. +func (f KeyFlags) HasPrewriteOnly() bool { + return f&flagPrewriteOnly != 0 +} + +// HasIgnoredIn2PC returns whether the key will be ignored in 2pc. +func (f KeyFlags) HasIgnoredIn2PC() bool { + return f&flagIgnoredIn2PC != 0 } // FlagsOp describes KeyFlags modify operation. @@ -82,8 +88,10 @@ const ( SetKeyLockedValueNotExists // DelNeedCheckExists marks the key no need to be checked in Transaction.LockKeys. DelNeedCheckExists - // SetNoNeedCommit marks the key shouldn't be used in 2pc commit phase. - SetNoNeedCommit + // SetPrewriteOnly marks the key shouldn't be used in 2pc commit phase. + SetPrewriteOnly + // SetIgnoredIn2PC marks the key will be ignored in 2pc. + SetIgnoredIn2PC ) func applyFlagsOps(origin KeyFlags, ops ...FlagsOp) KeyFlags { @@ -103,8 +111,10 @@ func applyFlagsOps(origin KeyFlags, ops ...FlagsOp) KeyFlags { origin &= ^flagNeedCheckExists case SetKeyLockedValueNotExists: origin &= ^flagKeyLockedValExist - case SetNoNeedCommit: - origin |= flagNoNeedCommit + case SetPrewriteOnly: + origin |= flagPrewriteOnly + case SetIgnoredIn2PC: + origin |= flagIgnoredIn2PC } } return origin @@ -112,6 +122,9 @@ func applyFlagsOps(origin KeyFlags, ops ...FlagsOp) KeyFlags { var tombstone = []byte{} +// IsTombstone returns whether the value is a tombstone. +func IsTombstone(val []byte) bool { return len(val) == 0 } + // memdb is rollbackable Red-Black Tree optimized for TiDB's transaction states buffer use scenario. // You can think memdb is a combination of two separate tree map, one for key => value and another for key => keyFlags. // @@ -188,8 +201,11 @@ func (db *memdb) Cleanup(h StagingHandle) { defer db.Unlock() cp := &db.stages[int(h)-1] if !db.vlogInvalid { - db.vlog.revertToCheckpoint(db, cp) - db.vlog.truncate(cp) + curr := db.vlog.checkpoint() + if !curr.isSamePosition(cp) { + db.vlog.revertToCheckpoint(db, cp) + db.vlog.truncate(cp) + } } db.stages = db.stages[:int(h)-1] } diff --git a/kv/memdb_iterator.go b/kv/memdb_iterator.go index 2a1f6d6b3541e..77d32d9276623 100644 --- a/kv/memdb_iterator.go +++ b/kv/memdb_iterator.go @@ -98,6 +98,12 @@ func (i *memdbIterator) Flags() KeyFlags { return i.curr.getKeyFlags() } +func (i *memdbIterator) UpdateFlags(ops ...FlagsOp) { + origin := i.curr.getKeyFlags() + n := applyFlagsOps(origin, ops...) + i.curr.setKeyFlags(n) +} + func (i *memdbIterator) HasValue() bool { return !i.isFlagsOnly() } diff --git a/store/tikv/2pc.go b/store/tikv/2pc.go index f412e8fe45519..6f5fc2fe06af9 100644 --- a/store/tikv/2pc.go +++ b/store/tikv/2pc.go @@ -85,6 +85,9 @@ type twoPhaseCommitter struct { txnSize int hasNoNeedCommitKeys bool + prewriteOnlyKeys int + ignoredKeys int + primaryKey []byte forUpdateTS uint64 @@ -369,7 +372,7 @@ func (c *twoPhaseCommitter) initKeysAndMutations() error { // due to `Op_CheckNotExists` doesn't prewrite lock, so mark those keys should not be used in commit-phase. op = pb.Op_CheckNotExists checkCnt++ - memBuf.UpdateFlags(key, kv.SetNoNeedCommit) + memBuf.UpdateFlags(key, kv.SetPrewriteOnly) } else { // normal delete keys in optimistic txn can be delete without not exists checking // delete-your-writes keys in pessimistic txn can ensure must be no exists so can directly delete them @@ -1051,7 +1054,7 @@ func (c *twoPhaseCommitter) stripNoNeedCommitKeys() { for oldIdx := range m.keys { key := m.keys[oldIdx] flags, err := c.txn.GetMemBuffer().GetFlags(key) - if err == nil && flags.HasNoNeedCommit() { + if err == nil && flags.HasPrewriteOnly() { continue } m.keys[newIdx] = key diff --git a/store/tikv/2pc_utils.go b/store/tikv/2pc_utils.go new file mode 100644 index 0000000000000..01e1832a75118 --- /dev/null +++ b/store/tikv/2pc_utils.go @@ -0,0 +1,621 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package tikv + +import ( + "bytes" + "context" + "math" + "sort" + "sync/atomic" + + "github.com/pingcap/errors" + pb "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" +) + +func (c *twoPhaseCommitter) initCommitterStates(ctx context.Context) error { + txn := c.txn + c.isPessimistic = txn.IsPessimistic() + bo := NewBackofferWithVars(ctx, PrewriteMaxBackoff, c.txn.vars) + + // Sanity check for startTS. + if txn.StartTS() == math.MaxUint64 { + err := errors.Errorf("try to commit with invalid txnStartTS: %d", txn.StartTS()) + logutil.BgLogger().Error("commit failed", + zap.Uint64("conn", c.connID), + zap.Error(err)) + return errors.Trace(err) + } + + var ( + firstKey []byte + regionSizeCal regionTxnSizeCalculator + txnDetailsCal txnDetailsCalculator + preSplitCal preSplitCalculator + it = c.mapWithRegion(bo, committerTxnMutations{c, true}.Iter(nil, nil)) + ) + for { + m, err := it.Next() + if err != nil { + return errors.Trace(err) + } + if m.key == nil { + break + } + if firstKey == nil { + firstKey = m.key + } + + if len(c.primaryKey) == 0 && m.op != pb.Op_CheckNotExists { + c.primaryKey = m.key + } + + regionSizeCal.Process(m) + txnDetailsCal.Process(m) + preSplitCal.Process(m) + } + if len(c.primaryKey) == 0 { + c.primaryKey = firstKey + } + + if err := txnDetailsCal.Finish(c); err != nil { + return errors.Trace(err) + } + regionSizeCal.Finish(c) + splitKeys, splitRegions := preSplitCal.Finish() + + if c.txnSize == 0 { + return nil + } + + if c.trySplitRegions(splitKeys, splitRegions) { + if err := c.reCalRegionTxnSize(bo); err != nil { + return err + } + } + + mutationsIt := it.src.(*txnMutationsIter) + c.prewriteOnlyKeys = mutationsIt.prewriteOnlyKeys + c.ignoredKeys = mutationsIt.ignoredKeys + + c.lockTTL = txnLockTTL(txn.startTime, txn.Size()) + c.priority = getTxnPriority(txn) + c.syncLog = getTxnSyncLog(txn) + return nil +} + +type mutation struct { + key []byte + value []byte + isPessimisticLock bool + op pb.Op +} + +type mutationWithRegion struct { + mutation + region RegionVerID +} + +type mutations interface { + Iter(start, end []byte) mutationsIter + Len() int +} + +type mutationsIter interface { + Next() mutation + WithFilter(func([]byte) bool) +} + +type regionTxnSizeCalculator struct { + result map[uint64]int + prevRegion RegionVerID + numKeys int +} + +func (c *regionTxnSizeCalculator) Process(m mutationWithRegion) { + if c.result == nil { + c.result = make(map[uint64]int) + } + if m.region.id != c.prevRegion.id { + if c.prevRegion.id != 0 { + c.result[c.prevRegion.id] = c.numKeys + } + c.prevRegion = m.region + c.numKeys = 0 + } + c.numKeys++ +} + +func (c *regionTxnSizeCalculator) Finish(committer *twoPhaseCommitter) { + if c.prevRegion.id != 0 { + c.result[c.prevRegion.id] = c.numKeys + } + committer.regionTxnSize = c.result + committer.getDetail().PrewriteRegionNum = int32(len(c.result)) +} + +type txnDetailsCalculator struct { + writeKeys int + writeSize int + putCnt int + delCnt int + lockCnt int + checkCnt int +} + +func (c *txnDetailsCalculator) Process(m mutationWithRegion) { + c.writeKeys++ + c.writeSize += len(m.key) + len(m.value) + switch m.op { + case pb.Op_CheckNotExists: + c.checkCnt++ + case pb.Op_Del: + c.delCnt++ + case pb.Op_Put, pb.Op_Insert: + c.putCnt++ + case pb.Op_Lock: + c.lockCnt++ + } +} + +func (c *txnDetailsCalculator) Finish(committer *twoPhaseCommitter) error { + if c.writeSize > int(kv.TxnTotalSizeLimit) { + return kv.ErrTxnTooLarge.GenWithStackByArgs(c.writeSize) + } + + const logEntryCount = 10000 + const logSize = 4 * 1024 * 1024 // 4MB + if c.writeKeys > logEntryCount || c.writeSize > logSize { + tableID := tablecodec.DecodeTableID(committer.primaryKey) + logutil.BgLogger().Info("[BIG_TXN]", + zap.Uint64("con", committer.connID), + zap.Int64("table ID", tableID), + zap.Int("size", c.writeSize), + zap.Int("keys", c.writeKeys), + zap.Int("puts", c.putCnt), + zap.Int("dels", c.delCnt), + zap.Int("locks", c.lockCnt), + zap.Int("checks", c.checkCnt), + zap.Uint64("txnStartTS", committer.txn.startTS)) + } + + committer.txnSize = c.writeSize + details := committer.getDetail() + details.WriteKeys = c.writeKeys + details.WriteSize = c.writeSize + + metrics.TiKVTxnWriteKVCountHistogram.Observe(float64(c.writeKeys)) + metrics.TiKVTxnWriteSizeHistogram.Observe(float64(c.writeSize)) + + return nil +} + +type preSplitCalculator struct { + limit uint32 + size int + splitKeys [][]byte + splitRegions []RegionVerID +} + +func (c *preSplitCalculator) Process(m mutationWithRegion) { + if c.limit == 0 { + c.limit = atomic.LoadUint32(&preSplitSizeThreshold) + } + c.size += len(m.key) + len(m.value) + if uint32(c.size) >= c.limit { + c.splitKeys = append(c.splitKeys, m.key) + if len(c.splitRegions) == 0 || c.splitRegions[len(c.splitRegions)-1] != m.region { + c.splitRegions = append(c.splitRegions, m.region) + } + c.size = 0 + } +} + +func (c *preSplitCalculator) Finish() ([][]byte, []RegionVerID) { + return c.splitKeys, c.splitRegions +} + +func (c *twoPhaseCommitter) trySplitRegions(splitKeys [][]byte, splitRegions []RegionVerID) bool { + if len(splitKeys) == 0 { + return false + } + ctx := context.Background() + regions := make([]uint64, len(splitRegions)) + for i := range regions { + regions[i] = splitRegions[i].id + } + logutil.BgLogger().Info("2PC detect large amount of mutations on some region", zap.Uint64s("regions", regions)) + newRegions, err := c.store.SplitRegions(ctx, splitKeys, true, nil) + if err != nil { + logutil.BgLogger().Warn("2PC split regions failed", zap.Uint64s("regions", regions), zap.Error(err)) + return false + } + + for _, regionID := range newRegions { + err := c.store.WaitScatterRegionFinish(ctx, regionID, 0) + if err != nil { + logutil.BgLogger().Warn("2PC wait scatter region failed", zap.Uint64("regionID", regionID), zap.Error(err)) + } + } + + for _, region := range splitRegions { + c.store.regionCache.InvalidateCachedRegion(region) + } + return true +} + +func (c *twoPhaseCommitter) reCalRegionTxnSize(bo *Backoffer) error { + it := c.mapWithRegion(bo, committerTxnMutations{c, true}.Iter(nil, nil)) + var regionSizeCal regionTxnSizeCalculator + for { + m, err := it.Next() + if err != nil { + return errors.Trace(err) + } + if m.key == nil { + break + } + regionSizeCal.Process(m) + } + regionSizeCal.Finish(c) + return nil +} + +type lockKeysMutations struct { + keys [][]byte +} + +func (m lockKeysMutations) Iter(start, end []byte) mutationsIter { + it := &lockKeysMutationsIter{ + keys: m.keys, + end: end, + } + if len(start) != 0 { + it.idx = sort.Search(len(m.keys), func(i int) bool { + return bytes.Compare(m.keys[i], start) >= 0 + }) + } + return it +} + +func (m lockKeysMutations) Len() int { + return len(m.keys) +} + +type lockKeysMutationsIter struct { + keys [][]byte + idx int + end []byte + keep func([]byte) bool +} + +func (it *lockKeysMutationsIter) Next() mutation { + for ; it.idx < len(it.keys); it.idx++ { + key := it.keys[it.idx] + if it.keep != nil && !it.keep(key) { + continue + } + + if len(it.end) > 0 && bytes.Compare(key, it.end) >= 0 { + return mutation{} + } + + it.idx++ + return mutation{key: key} + } + return mutation{} +} + +func (it *lockKeysMutationsIter) WithFilter(f func([]byte) bool) { + it.keep = f +} + +type staticMutations struct { + mutations CommitterMutations +} + +func (m staticMutations) Iter(start, end []byte) mutationsIter { + it := &staticMutationsIter{ + mutations: m.mutations, + end: end, + } + if len(start) != 0 { + it.idx = sort.Search(len(m.mutations.keys), func(i int) bool { + return bytes.Compare(m.mutations.keys[i], start) >= 0 + }) + } + return it +} + +func (m staticMutations) Len() int { + return m.mutations.len() +} + +type staticMutationsIter struct { + mutations CommitterMutations + idx int + end []byte + keep func([]byte) bool +} + +func (it *staticMutationsIter) Next() mutation { + for ; it.idx < len(it.mutations.keys); it.idx++ { + m := mutation{ + key: it.mutations.keys[it.idx], + } + if len(it.end) > 0 && bytes.Compare(m.key, it.end) >= 0 { + return mutation{} + } + if it.idx < len(it.mutations.values) { + m.value = it.mutations.values[it.idx] + m.op = it.mutations.ops[it.idx] + m.isPessimisticLock = it.mutations.isPessimisticLock[it.idx] + } + if it.keep != nil && !it.keep(m.key) { + continue + } + + it.idx++ + return m + } + return mutation{} +} + +func (it *staticMutationsIter) WithFilter(f func([]byte) bool) { + it.keep = f +} + +type committerTxnMutations struct { + *twoPhaseCommitter + isPrewrite bool +} + +func (m committerTxnMutations) Iter(start, end []byte) mutationsIter { + return m.newMutationsIter(m.txn.GetMemBuffer().IterWithFlags(start, end), m.isPrewrite) +} + +func (m committerTxnMutations) Len() int { + base := m.txn.Len() - m.ignoredKeys + if m.isPrewrite { + return base + } + return base - m.prewriteOnlyKeys +} + +type txnMutationsIter struct { + src kv.MemBufferIterator + isPrewrite bool + isPessimistic bool + keep func(key []byte) bool + + prewriteOnlyKeys int + ignoredKeys int +} + +func (c *twoPhaseCommitter) newMutationsIter(src kv.MemBufferIterator, isPrewrite bool) *txnMutationsIter { + return &txnMutationsIter{ + src: src, + isPrewrite: isPrewrite, + isPessimistic: c.txn.IsPessimistic(), + } +} + +func (it *txnMutationsIter) WithFilter(f func(key []byte) bool) { + it.keep = f +} + +func (it *txnMutationsIter) Next() (m mutation) { + var err error + for src := it.src; src.Valid(); err = src.Next() { + _ = err + m.key = src.Key() + m.value = nil + m.isPessimisticLock = false + flags := src.Flags() + + if it.keep != nil && !it.keep(m.key) { + continue + } + + if flags.HasIgnoredIn2PC() { + continue + } + + if it.isPrewrite { + if ignored := it.fillMutationForPrewrite(&m, src); ignored { + // Because we will have discarded values in Commit phase, + // we must record the `ignore` decision in MemBuffer at here. + src.UpdateFlags(kv.SetIgnoredIn2PC) + it.ignoredKeys++ + continue + } + } else { + // For commit and cleanup, we only need keys. + if flags.HasPrewriteOnly() { + continue + } + } + + err = src.Next() + _ = err + return + } + return mutation{} +} + +func (it *txnMutationsIter) fillMutationForPrewrite(m *mutation, src kv.MemBufferIterator) bool { + flags := src.Flags() + + if !src.HasValue() { + if flags.HasLocked() { + m.op = pb.Op_Lock + } else { + // 2PC don't care other flags. + return true + } + } else { + m.value = src.Value() + if kv.IsTombstone(m.value) { + if !it.isPessimistic && flags.HasPresumeKeyNotExists() { + // delete-your-writes keys in optimistic txn need check not exists in prewrite-phase + // due to `Op_CheckNotExists` doesn't prewrite lock, so mark those keys should not be used in commit-phase. + m.op = pb.Op_CheckNotExists + src.UpdateFlags(kv.SetPrewriteOnly) + it.prewriteOnlyKeys++ + } else { + // normal delete keys in optimistic txn can be delete without not exists checking + // delete-your-writes keys in pessimistic txn can ensure must be no exists so can directly delete them + m.op = pb.Op_Del + } + } else { + if tablecodec.IsUntouchedIndexKValue(m.key, m.value) { + return true + } + m.op = pb.Op_Put + if flags.HasPresumeKeyNotExists() { + m.op = pb.Op_Insert + } + } + } + if flags.HasLocked() { + m.isPessimisticLock = it.isPessimistic + } + + return false +} + +type mutationWithRegionIter struct { + src mutationsIter + + rc *RegionCache + loc *KeyLocation + bo *Backoffer +} + +func (c *twoPhaseCommitter) mapWithRegion(bo *Backoffer, src mutationsIter) *mutationWithRegionIter { + return &mutationWithRegionIter{ + src: src, + rc: c.store.regionCache, + bo: bo, + } +} + +func (it *mutationWithRegionIter) Next() (mutationWithRegion, error) { + m := it.src.Next() + if m.key == nil { + return mutationWithRegion{}, nil + } + + var err error + if it.loc == nil || !it.loc.Contains(m.key) { + it.loc, err = it.rc.LocateKey(it.bo, m.key) + if err != nil { + return mutationWithRegion{}, errors.Trace(err) + } + } + + return mutationWithRegion{m, it.loc.Region}, nil +} + +type mutationBatchCollector struct { + src *mutationWithRegionIter + primaryKey []byte + limit int + done bool + onlyCollectKey bool + + curr mutationWithRegion + lenHint int +} + +func (c *twoPhaseCommitter) newBatchCollector(bo *Backoffer, src mutationsIter, limit int, isPrewrite bool) (*mutationBatchCollector, error) { + mutations := c.mapWithRegion(bo, src) + m, err := mutations.Next() + if err != nil { + return nil, err + } + + return &mutationBatchCollector{ + src: mutations, + curr: m, + limit: txnCommitBatchSize, + primaryKey: c.primaryKey, + onlyCollectKey: !isPrewrite, + }, nil +} + +func (c *mutationBatchCollector) Collect() (*batchMutations, error) { + if c.done { + return nil, nil + } + + var ( + mutations = NewCommiterMutations(c.lenHint) + region = c.curr.region + m = c.curr + isPrimary bool + size int + err error + ) + + for { + if m.key == nil { + c.done = true + break + } + + if c.onlyCollectKey { + mutations.keys = append(mutations.keys, m.key) + size += len(m.key) + } else { + mutations.Push(m.op, m.key, m.value, m.isPessimisticLock) + size += len(m.key) + len(m.value) + } + + if !isPrimary { + isPrimary = bytes.Equal(m.key, c.primaryKey) + } + + m, err = c.src.Next() + if err != nil { + return nil, errors.Trace(err) + } + + if size >= c.limit || m.region.id != region.id { + c.curr = m + break + } + } + + var ret *batchMutations + if mutations.len() != 0 { + c.lenHint = mutations.len() + ret = &batchMutations{ + mutations: mutations, + region: region, + isPrimary: isPrimary, + } + } + + return ret, nil +} + +func (c *mutationBatchCollector) Finished() bool { + return c.curr.key == nil +} From 856c44eb88693e2907158147180019220e208917 Mon Sep 17 00:00:00 2001 From: xhe Date: Sun, 27 Sep 2020 07:30:07 +0800 Subject: [PATCH 31/60] ddl: fix placement test (#20230) Signed-off-by: xhe --- ddl/placement_rule_test.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ddl/placement_rule_test.go b/ddl/placement_rule_test.go index 037682011e38e..3fe3882275bdb 100644 --- a/ddl/placement_rule_test.go +++ b/ddl/placement_rule_test.go @@ -234,7 +234,17 @@ func (s *testPlacementSuite) TestPlacementBuild(c *C) { c.Assert(err, IsNil) got, err := json.Marshal(out.Rules) c.Assert(err, IsNil) - c.Assert(out.Rules, DeepEquals, t.output, Commentf("%d test\nexpected %s\nbut got %s", i, expected, got)) + c.Assert(len(t.output), Equals, len(out.Rules)) + for _, r1 := range t.output { + found := false + for _, r2 := range out.Rules { + if ok, _ := DeepEquals.Check([]interface{}{r1, r2}, nil); ok { + found = true + break + } + } + c.Assert(found, IsTrue, Commentf("%d test\nexpected %s\nbut got %s", i, expected, got)) + } } else { c.Assert(err.Error(), ErrorMatches, t.err) } From 0528a1f12f9489dc40929f5228a27ffe4f3bdfab Mon Sep 17 00:00:00 2001 From: Lynn Date: Sun, 27 Sep 2020 08:34:36 +0800 Subject: [PATCH 32/60] *: handle the to-do item of rebuilding `ReorgInfo` key when executing `modify/change column` (#19866) --- ddl/backfilling.go | 11 +-- ddl/column.go | 69 +++++++++++++-- ddl/db_test.go | 139 +++++++++++++++++++++++++++++++ ddl/index.go | 37 +++++++-- ddl/reorg.go | 90 +++++++++++++++----- ddl/reorg_test.go | 39 +++++---- errno/errcode.go | 1 + errno/errname.go | 3 +- meta/meta.go | 175 +++++++++++++++++++++++++++++++++------ meta/meta_test.go | 61 +++++++++++--- statistics/handle/ddl.go | 2 +- util/admin/admin.go | 6 +- 12 files changed, 542 insertions(+), 91 deletions(-) diff --git a/ddl/backfilling.go b/ddl/backfilling.go index a0565f27e8651..7d0f3bf1d71bf 100644 --- a/ddl/backfilling.go +++ b/ddl/backfilling.go @@ -130,7 +130,7 @@ func (r *reorgBackfillTask) String() string { if r.endIncluded { rightParenthesis = "]" } - return "physicalTableID" + strconv.FormatInt(r.physicalTableID, 10) + "_" + "[" + r.startHandle.String() + "," + r.endHandle.String() + rightParenthesis + return "physicalTableID_" + strconv.FormatInt(r.physicalTableID, 10) + "_" + "[" + r.startHandle.String() + "," + r.endHandle.String() + rightParenthesis } func logSlowOperations(elapsed time.Duration, slowMsg string, threshold uint32) { @@ -303,11 +303,10 @@ func (w *worker) handleReorgTasks(reorgInfo *reorgInfo, totalAddedCount *int64, if err != nil { // Update the reorg handle that has been processed. - err1 := kv.RunInNewTxn(reorgInfo.d.store, true, func(txn kv.Transaction) error { - return errors.Trace(reorgInfo.UpdateReorgMeta(txn, nextHandle, reorgInfo.EndHandle, reorgInfo.PhysicalTableID)) - }) + err1 := reorgInfo.UpdateReorgMeta(nextHandle) metrics.BatchAddIdxHistogram.WithLabelValues(metrics.LblError).Observe(elapsedTime.Seconds()) logutil.BgLogger().Warn("[ddl] backfill worker handle batch tasks failed", + zap.ByteString("elementType", reorgInfo.currElement.TypeKey), zap.Int64("elementID", reorgInfo.currElement.ID), zap.Int64("totalAddedCount", *totalAddedCount), zap.String("startHandle", toString(startHandle)), zap.String("nextHandle", toString(nextHandle)), zap.Int64("batchAddedCount", taskAddedCount), zap.String("taskFailedError", err.Error()), zap.String("takeTime", elapsedTime.String()), @@ -318,7 +317,9 @@ func (w *worker) handleReorgTasks(reorgInfo *reorgInfo, totalAddedCount *int64, // nextHandle will be updated periodically in runReorgJob, so no need to update it here. w.reorgCtx.setNextHandle(nextHandle) metrics.BatchAddIdxHistogram.WithLabelValues(metrics.LblOK).Observe(elapsedTime.Seconds()) - logutil.BgLogger().Info("[ddl] backfill worker handle batch tasks successful", zap.Int64("totalAddedCount", *totalAddedCount), zap.String("startHandle", toString(startHandle)), + logutil.BgLogger().Info("[ddl] backfill workers successfully processed batch", + zap.ByteString("elementType", reorgInfo.currElement.TypeKey), zap.Int64("elementID", reorgInfo.currElement.ID), + zap.Int64("totalAddedCount", *totalAddedCount), zap.String("startHandle", toString(startHandle)), zap.String("nextHandle", toString(nextHandle)), zap.Int64("batchAddedCount", taskAddedCount), zap.String("takeTime", elapsedTime.String())) return nil } diff --git a/ddl/column.go b/ddl/column.go index e39be312f19b3..e7e123952c486 100644 --- a/ddl/column.go +++ b/ddl/column.go @@ -14,6 +14,7 @@ package ddl import ( + "bytes" "fmt" "math" "math/bits" @@ -873,7 +874,8 @@ func (w *worker) doModifyColumnTypeWithData( if err != nil { return ver, errors.Trace(err) } - reorgInfo, err := getReorgInfo(d, t, job, tbl) + + reorgInfo, err := getReorgInfo(d, t, job, tbl, BuildElements(changingCol, changingIdxs)) if err != nil || reorgInfo.first { // If we run reorg firstly, we should update the job snapshot version // and then run the reorg next time. @@ -893,6 +895,11 @@ func (w *worker) doModifyColumnTypeWithData( return ver, nil } if kv.ErrKeyExists.Equal(err) || errCancelledDDLJob.Equal(err) || errCantDecodeRecord.Equal(err) || types.ErrOverflow.Equal(err) { + if err1 := t.RemoveDDLReorgHandle(job, reorgInfo.elements); err1 != nil { + logutil.BgLogger().Warn("[ddl] run modify column job failed, RemoveDDLReorgHandle failed, can't convert job to rollback", + zap.String("job", job.String()), zap.Error(err1)) + return ver, errors.Trace(err) + } logutil.BgLogger().Warn("[ddl] run modify column job failed, convert job to rollback", zap.String("job", job.String()), zap.Error(err)) // When encounter these error above, we change the job to rolling back job directly. job.State = model.JobStateRollingback @@ -938,8 +945,7 @@ func (w *worker) doModifyColumnTypeWithData( job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) // Refactor the job args to add the old index ids into delete range table. job.Args = []interface{}{oldIdxIDs, getPartitionIDs(tblInfo)} - // TODO: Change column ID. - // asyncNotifyEvent(d, &util.Event{Tp: model.ActionAddColumn, TableInfo: tblInfo, ColumnInfos: []*model.ColumnInfo{changingCol}}) + asyncNotifyEvent(d, &ddlutil.Event{Tp: model.ActionModifyColumn, TableInfo: tblInfo, ColumnInfos: []*model.ColumnInfo{changingCol}}) default: err = ErrInvalidDDLState.GenWithStackByArgs("column", changingCol.State) } @@ -947,6 +953,16 @@ func (w *worker) doModifyColumnTypeWithData( return ver, errors.Trace(err) } +// BuildElements is exported for testing. +func BuildElements(changingCol *model.ColumnInfo, changingIdxs []*model.IndexInfo) []*meta.Element { + elements := make([]*meta.Element, 0, len(changingIdxs)+1) + elements = append(elements, &meta.Element{ID: changingCol.ID, TypeKey: meta.ColumnElementKey}) + for _, idx := range changingIdxs { + elements = append(elements, &meta.Element{ID: idx.ID, TypeKey: meta.IndexElementKey}) + } + return elements +} + func (w *worker) updatePhysicalTableRow(t table.PhysicalTable, oldColInfo, colInfo *model.ColumnInfo, reorgInfo *reorgInfo) error { logutil.BgLogger().Info("[ddl] start to update table row", zap.String("job", reorgInfo.Job.String()), zap.String("reorgInfo", reorgInfo.String())) return w.writePhysicalTableRecord(t.(table.PhysicalTable), typeUpdateColumnWorker, nil, oldColInfo, colInfo, reorgInfo) @@ -954,15 +970,54 @@ func (w *worker) updatePhysicalTableRow(t table.PhysicalTable, oldColInfo, colIn // updateColumnAndIndexes handles the modify column reorganization state for a table. func (w *worker) updateColumnAndIndexes(t table.Table, oldCol, col *model.ColumnInfo, idxes []*model.IndexInfo, reorgInfo *reorgInfo) error { - // TODO: Consider rebuild ReorgInfo key to mDDLJobReorgKey_jobID_elementID(colID/idxID). // TODO: Support partition tables. - err := w.updatePhysicalTableRow(t.(table.PhysicalTable), oldCol, col, reorgInfo) + if bytes.Equal(reorgInfo.currElement.TypeKey, meta.ColumnElementKey) { + err := w.updatePhysicalTableRow(t.(table.PhysicalTable), oldCol, col, reorgInfo) + if err != nil { + return errors.Trace(err) + } + } + + // Get the original start handle and end handle. + currentVer, err := getValidCurrentVersion(reorgInfo.d.store) if err != nil { return errors.Trace(err) } + originalStartHandle, originalEndHandle, err := getTableRange(reorgInfo.d, t.(table.PhysicalTable), currentVer.Ver, reorgInfo.Job.Priority) + if err != nil { + return errors.Trace(err) + } + + startElementOffset := 0 + startElementOffsetToResetHandle := -1 + // This backfill job starts with backfilling index data, whose index ID is currElement.ID. + if bytes.Equal(reorgInfo.currElement.TypeKey, meta.IndexElementKey) { + for i, idx := range idxes { + if reorgInfo.currElement.ID == idx.ID { + startElementOffset = i + startElementOffsetToResetHandle = i + break + } + } + } - for _, idx := range idxes { - err = w.addTableIndex(t, idx, reorgInfo) + for i := startElementOffset; i < len(idxes); i++ { + // This backfill job has been exited during processing. At that time, the element is reorgInfo.elements[i+1] and handle range is [reorgInfo.StartHandle, reorgInfo.EndHandle]. + // Then the handle range of the rest elements' is [originalStartHandle, originalEndHandle]. + if i == startElementOffsetToResetHandle+1 { + reorgInfo.StartHandle, reorgInfo.EndHandle = originalStartHandle, originalEndHandle + } + + reorgInfo.currElement = reorgInfo.elements[i+1] + // Write the reorg info to store so the whole reorganize process can recover from panic. + err := reorgInfo.UpdateReorgMeta(reorgInfo.StartHandle) + logutil.BgLogger().Info("[ddl] update column and indexes", zap.Int64("jobID", reorgInfo.Job.ID), + zap.ByteString("elementType", reorgInfo.currElement.TypeKey), zap.Int64("elementID", reorgInfo.currElement.ID), + zap.String("startHandle", toString(reorgInfo.StartHandle)), zap.String("endHandle", toString(reorgInfo.EndHandle))) + if err != nil { + return errors.Trace(err) + } + err = w.addTableIndex(t, idxes[i], reorgInfo) if err != nil { return errors.Trace(err) } diff --git a/ddl/db_test.go b/ddl/db_test.go index 4d1556368457e..aa2dcc26192a0 100644 --- a/ddl/db_test.go +++ b/ddl/db_test.go @@ -323,6 +323,10 @@ func (s *testSerialDBSuite) TestAddExpressionIndexRollback(c *C) { d := s.dom.DDL() hook := &ddl.TestDDLCallback{} + var currJob *model.Job + ctx := mock.NewContext() + ctx.Store = s.store + times := 0 hook.OnJobUpdatedExported = func(job *model.Job) { if job.SchemaState == model.StateDeleteOnly { if checkErr != nil { @@ -330,12 +334,29 @@ func (s *testSerialDBSuite) TestAddExpressionIndexRollback(c *C) { } _, checkErr = tk1.Exec("delete from t1 where c1 = 40;") } + if checkErr == nil && job.SchemaState == model.StateWriteReorganization && times == 0 { + currJob = job + times++ + } } d.(ddl.DDLForTest).SetHook(hook) tk.MustGetErrMsg("alter table t1 add index expr_idx ((pow(c1, c2)));", "[ddl:8202]Cannot decode index value, because [types:1690]DOUBLE value is out of range in 'pow(160, 160)'") c.Assert(checkErr, IsNil) tk.MustQuery("select * from t1;").Check(testkit.Rows("20 20 20", "80 80 80", "160 160 160")) + + // Check whether the reorg information is cleaned up. + err := ctx.NewTxn(context.Background()) + c.Assert(err, IsNil) + txn, err := ctx.Txn(true) + c.Assert(err, IsNil) + m := meta.NewMeta(txn) + element, start, end, physicalID, err := m.GetDDLReorgHandle(currJob, false) + c.Assert(meta.ErrDDLReorgElementNotExist.Equal(err), IsTrue) + c.Assert(element, IsNil) + c.Assert(start, IsNil) + c.Assert(end, IsNil) + c.Assert(physicalID, Equals, int64(0)) } func batchInsert(tk *testkit.TestKit, tbl string, start, end int) { @@ -3706,6 +3727,123 @@ func (s *testDBSuite5) TestModifyColumnRollBack(c *C) { s.mustExec(tk, c, "drop table t1") } +func (s *testSerialDBSuite) TestModifyColumnnReorgInfo(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test_db") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (c1 int, c2 int, c3 int, index idx(c2), index idx1(c1, c2));") + + sql := "alter table t1 change c2 c2 mediumint;" + // defaultBatchSize is equal to ddl.defaultBatchSize + base := defaultBatchSize * 8 + // add some rows + batchInsert(tk, "t1", 0, base) + // Make sure the count of regions more than backfill workers. + tk.MustQuery("split table t1 between (0) and (8192) regions 8;").Check(testkit.Rows("8 1")) + + enableChangeColumnType := tk.Se.GetSessionVars().EnableChangeColumnType + tk.Se.GetSessionVars().EnableChangeColumnType = true + defer func() { + tk.Se.GetSessionVars().EnableChangeColumnType = enableChangeColumnType + }() + + tbl := s.testGetTable(c, "t1") + originalHook := s.dom.DDL().GetHook() + defer s.dom.DDL().(ddl.DDLForTest).SetHook(originalHook) + + // Check insert null before job first update. + hook := &ddl.TestDDLCallback{} + var checkErr error + var currJob *model.Job + var elements []*meta.Element + ctx := mock.NewContext() + ctx.Store = s.store + times := 0 + hook.OnJobRunBeforeExported = func(job *model.Job) { + if tbl.Meta().ID != job.TableID || checkErr != nil || job.SchemaState != model.StateWriteReorganization { + return + } + if job.Type == model.ActionModifyColumn { + if times == 0 { + times++ + return + } + currJob = job + var ( + newCol *model.ColumnInfo + oldColName *model.CIStr + modifyColumnTp byte + updatedAutoRandomBits uint64 + changingCol *model.ColumnInfo + changingIdxs []*model.IndexInfo + ) + pos := &ast.ColumnPosition{} + checkErr = job.DecodeArgs(&newCol, &oldColName, pos, &modifyColumnTp, &updatedAutoRandomBits, &changingCol, &changingIdxs) + elements = ddl.BuildElements(changingCol, changingIdxs) + } + if job.Type == model.ActionAddIndex { + if times == 1 { + times++ + return + } + tbl := s.testGetTable(c, "t1") + indexInfo := tbl.Meta().FindIndexByName("idx2") + elements = []*meta.Element{{ID: indexInfo.ID, TypeKey: meta.IndexElementKey}} + } + } + c.Assert(failpoint.Enable("github.com/pingcap/tidb/ddl/MockGetIndexRecordErr", `return("cantDecodeRecordErr")`), IsNil) + s.dom.DDL().(ddl.DDLForTest).SetHook(hook) + _, err := tk.Exec(sql) + c.Assert(err.Error(), Equals, "[ddl:8202]Cannot decode index value, because mock can't decode record error") + c.Assert(checkErr, IsNil) + // Check whether the reorg information is cleaned up when executing "modify column" failed. + checkReorgHandle := func(gotElements, expectedElements []*meta.Element) { + for i, e := range gotElements { + c.Assert(e, DeepEquals, expectedElements[i]) + } + err := ctx.NewTxn(context.Background()) + c.Assert(err, IsNil) + txn, err := ctx.Txn(true) + c.Assert(err, IsNil) + m := meta.NewMeta(txn) + e, start, end, physicalID, err := m.GetDDLReorgHandle(currJob, false) + c.Assert(meta.ErrDDLReorgElementNotExist.Equal(err), IsTrue) + c.Assert(e, IsNil) + c.Assert(start, IsNil) + c.Assert(end, IsNil) + c.Assert(physicalID, Equals, int64(0)) + } + expectedEles := []*meta.Element{ + {ID: 4, TypeKey: meta.ColumnElementKey}, + {ID: 3, TypeKey: meta.IndexElementKey}, + {ID: 4, TypeKey: meta.IndexElementKey}} + checkReorgHandle(elements, expectedEles) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/ddl/MockGetIndexRecordErr"), IsNil) + tk.MustExec("admin check table t1") + + // Check whether the reorg information is cleaned up when executing "modify column" successfully. + // Test encountering a "notOwnerErr" error which caused the processing backfill job to exit halfway. + c.Assert(failpoint.Enable("github.com/pingcap/tidb/ddl/MockGetIndexRecordErr", `return("modifyColumnNotOwnerErr")`), IsNil) + tk.MustExec(sql) + expectedEles = []*meta.Element{ + {ID: 5, TypeKey: meta.ColumnElementKey}, + {ID: 5, TypeKey: meta.IndexElementKey}, + {ID: 6, TypeKey: meta.IndexElementKey}} + checkReorgHandle(elements, expectedEles) + tk.MustExec("admin check table t1") + c.Assert(failpoint.Disable("github.com/pingcap/tidb/ddl/MockGetIndexRecordErr"), IsNil) + + // Test encountering a "notOwnerErr" error which caused the processing backfill job to exit halfway. + // During the period, the old TiDB version(do not exist the element information) is upgraded to the new TiDB version. + c.Assert(failpoint.Enable("github.com/pingcap/tidb/ddl/MockGetIndexRecordErr", `return("addIdxNotOwnerErr")`), IsNil) + tk.MustExec("alter table t1 add index idx2(c1)") + expectedEles = []*meta.Element{ + {ID: 7, TypeKey: meta.IndexElementKey}} + checkReorgHandle(elements, expectedEles) + tk.MustExec("admin check table t1") + c.Assert(failpoint.Disable("github.com/pingcap/tidb/ddl/MockGetIndexRecordErr"), IsNil) +} + func (s *testSerialDBSuite) TestModifyColumnNullToNotNullWithChangingVal2(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) @@ -3797,6 +3935,7 @@ func testModifyColumnNullToNotNull(c *C, s *testDBSuite, enableChangeColumnType c.Assert(err, NotNil) if enableChangeColumnType { c.Assert(err.Error(), Equals, "[ddl:1265]Data truncated for column 'c2' at row 1") + // Check whether the reorg information is cleaned up. } else { c.Assert(err.Error(), Equals, "[ddl:1138]Invalid use of NULL value") } diff --git a/ddl/index.go b/ddl/index.go index f85b04dc051de..4c8133968fd3f 100644 --- a/ddl/index.go +++ b/ddl/index.go @@ -17,6 +17,7 @@ import ( "context" "math" "strings" + "sync/atomic" "time" "github.com/pingcap/errors" @@ -540,7 +541,8 @@ func (w *worker) onCreateIndex(d *ddlCtx, t *meta.Meta, job *model.Job, isPK boo return ver, errors.Trace(err) } - reorgInfo, err := getReorgInfo(d, t, job, tbl) + elements := []*meta.Element{{ID: indexInfo.ID, TypeKey: meta.IndexElementKey}} + reorgInfo, err := getReorgInfo(d, t, job, tbl, elements) if err != nil || reorgInfo.first { // If we run reorg firstly, we should update the job snapshot version // and then run the reorg next time. @@ -562,6 +564,9 @@ func (w *worker) onCreateIndex(d *ddlCtx, t *meta.Meta, job *model.Job, isPK boo if kv.ErrKeyExists.Equal(err) || errCancelledDDLJob.Equal(err) || errCantDecodeRecord.Equal(err) { logutil.BgLogger().Warn("[ddl] run add index job failed, convert job to rollback", zap.String("job", job.String()), zap.Error(err)) ver, err = convertAddIdxJob2RollbackJob(t, job, tblInfo, indexInfo, err) + if err1 := t.RemoveDDLReorgHandle(job, reorgInfo.elements); err1 != nil { + logutil.BgLogger().Warn("[ddl] run add index job failed, convert job to rollback, RemoveDDLReorgHandle failed", zap.String("job", job.String()), zap.Error(err1)) + } } // Clean up the channel of notifyCancelReorgJob. Make sure it can't affect other jobs. w.reorgCtx.cleanNotifyReorgCancel() @@ -830,6 +835,9 @@ func (w *addIndexWorker) AddMetricInfo(cnt float64) { w.metricCounter.Add(cnt) } +// mockNotOwnerErrOnce uses to make sure `notOwnerErr` only mock error once. +var mockNotOwnerErrOnce uint32 + // getIndexRecord gets index columns values from raw binary value row. func (w *addIndexWorker) getIndexRecord(handle kv.Handle, recordKey []byte, rawRecord []byte) (*indexRecord, error) { t := w.table @@ -840,6 +848,25 @@ func (w *addIndexWorker) getIndexRecord(handle kv.Handle, recordKey []byte, rawR if err != nil { return nil, errors.Trace(errCantDecodeRecord.GenWithStackByArgs("index", err)) } + failpoint.Inject("MockGetIndexRecordErr", func(val failpoint.Value) { + if valStr, ok := val.(string); ok { + switch valStr { + case "cantDecodeRecordErr": + failpoint.Return(nil, errors.Trace(errCantDecodeRecord.GenWithStackByArgs("index", + errors.New("mock can't decode record error")))) + case "modifyColumnNotOwnerErr": + if idxInfo.Name.O == "_Idx$_idx" && handle.IntValue() == 7168 && atomic.CompareAndSwapUint32(&mockNotOwnerErrOnce, 0, 1) { + failpoint.Return(nil, errors.Trace(errNotOwner)) + } + case "addIdxNotOwnerErr": + // For the case of the old TiDB version(do not exist the element information) is upgraded to the new TiDB version. + // First step, we need to exit "addPhysicalTableIndex". + if idxInfo.Name.O == "idx2" && handle.IntValue() == 6144 && atomic.CompareAndSwapUint32(&mockNotOwnerErrOnce, 1, 2) { + failpoint.Return(nil, errors.Trace(errNotOwner)) + } + } + } + }) idxVal := make([]types.Datum, len(idxInfo.Columns)) for j, v := range idxInfo.Columns { col := cols[v.Offset] @@ -944,7 +971,8 @@ func (w *addIndexWorker) fetchRowColVals(txn kv.Transaction, taskRange reorgBack taskDone = true } - logutil.BgLogger().Debug("[ddl] txn fetches handle info", zap.Uint64("txnStartTS", txn.StartTS()), zap.String("taskRange", taskRange.String()), zap.Duration("takeTime", time.Since(startTime))) + logutil.BgLogger().Debug("[ddl] txn fetches handle info", zap.Uint64("txnStartTS", txn.StartTS()), + zap.String("taskRange", taskRange.String()), zap.Duration("takeTime", time.Since(startTime))) return w.idxRecords, w.getNextHandle(taskRange, taskDone), taskDone, errors.Trace(err) } @@ -1147,10 +1175,9 @@ func (w *worker) updateReorgInfo(t table.PartitionedTable, reorg *reorgInfo) (bo reorg.StartHandle, reorg.EndHandle, reorg.PhysicalTableID = start, end, pid // Write the reorg info to store so the whole reorganize process can recover from panic. - err = kv.RunInNewTxn(reorg.d.store, true, func(txn kv.Transaction) error { - return errors.Trace(reorg.UpdateReorgMeta(txn, reorg.StartHandle, reorg.EndHandle, reorg.PhysicalTableID)) - }) + err = reorg.UpdateReorgMeta(start) logutil.BgLogger().Info("[ddl] job update reorgInfo", zap.Int64("jobID", reorg.Job.ID), + zap.ByteString("elementType", reorg.currElement.TypeKey), zap.Int64("elementID", reorg.currElement.ID), zap.Int64("partitionTableID", pid), zap.String("startHandle", toString(start)), zap.String("endHandle", toString(end)), zap.Error(err)) return false, errors.Trace(err) diff --git a/ddl/reorg.go b/ddl/reorg.go index 9d4dde2c42cd0..c65035f98a665 100644 --- a/ddl/reorg.go +++ b/ddl/reorg.go @@ -159,11 +159,16 @@ func (w *worker) runReorgJob(t *meta.Meta, reorgInfo *reorgInfo, tblInfo *model. logutil.BgLogger().Info("[ddl] run reorg job done", zap.Int64("handled rows", rowCount)) // Update a job's RowCount. job.SetRowCount(rowCount) - if err == nil { - metrics.AddIndexProgress.Set(100) - } w.reorgCtx.clean() - return errors.Trace(err) + if err != nil { + return errors.Trace(err) + } + + metrics.AddIndexProgress.Set(100) + if err1 := t.RemoveDDLReorgHandle(job, reorgInfo.elements); err1 != nil { + logutil.BgLogger().Warn("[ddl] run reorg job done, removeDDLReorgHandle failed", zap.Error(err1)) + return errors.Trace(err1) + } case <-w.ctx.Done(): logutil.BgLogger().Info("[ddl] run reorg job quit") w.reorgCtx.setNextHandle(nil) @@ -176,12 +181,14 @@ func (w *worker) runReorgJob(t *meta.Meta, reorgInfo *reorgInfo, tblInfo *model. job.SetRowCount(rowCount) updateAddIndexProgress(w, tblInfo, rowCount) // Update a reorgInfo's handle. - err := t.UpdateDDLReorgStartHandle(job, doneHandle) + err := t.UpdateDDLReorgStartHandle(job, reorgInfo.currElement, doneHandle) logutil.BgLogger().Info("[ddl] run reorg job wait timeout", zap.Duration("waitTime", waitTimeout), + zap.ByteString("elementType", reorgInfo.currElement.TypeKey), zap.Int64("elementID", reorgInfo.currElement.ID), zap.Int64("totalAddedRowCount", rowCount), zap.String("doneHandle", toString(doneHandle)), zap.Error(err)) // If timeout, we will return, check the owner and retry to wait job done again. return errWaitReorgTimeout } + return nil } func updateAddIndexProgress(w *worker, tblInfo *model.TableInfo, addedRowCount int64) { @@ -258,12 +265,16 @@ type reorgInfo struct { // PhysicalTableID is used to trace the current partition we are handling. // If the table is not partitioned, PhysicalTableID would be TableID. PhysicalTableID int64 + elements []*meta.Element + currElement *meta.Element } func (r *reorgInfo) String() string { - return "StartHandle:" + toString(r.StartHandle) + "," + + return "CurrElementType:" + string(r.currElement.TypeKey) + "," + + "CurrElementID:" + strconv.FormatInt(r.currElement.ID, 10) + "," + + "StartHandle:" + toString(r.StartHandle) + "," + "EndHandle:" + toString(r.EndHandle) + "," + - "first:" + strconv.FormatBool(r.first) + "," + + "First:" + strconv.FormatBool(r.first) + "," + "PhysicalTableID:" + strconv.FormatInt(r.PhysicalTableID, 10) } @@ -444,15 +455,28 @@ func getValidCurrentVersion(store kv.Storage) (ver kv.Version, err error) { return ver, nil } -func getReorgInfo(d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table) (*reorgInfo, error) { +func getReorgInfo(d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table, elements []*meta.Element) (*reorgInfo, error) { var ( - start kv.Handle - end kv.Handle - pid int64 - info reorgInfo + element *meta.Element + start kv.Handle + end kv.Handle + pid int64 + info reorgInfo ) if job.SnapshotVer == 0 { + // For the case of the old TiDB version(do not exist the element information) is upgraded to the new TiDB version. + // Third step, we need to remove the element information to make sure we can save the reorganized information to storage. + failpoint.Inject("MockGetIndexRecordErr", func(val failpoint.Value) { + if val.(string) == "addIdxNotOwnerErr" && atomic.CompareAndSwapUint32(&mockNotOwnerErrOnce, 3, 4) { + if err := t.RemoveReorgElement(job); err != nil { + failpoint.Return(nil, errors.Trace(err)) + } + info.first = true + failpoint.Return(&info, nil) + } + }) + info.first = true // get the current version for reorganization if we don't have ver, err := getValidCurrentVersion(d.store) @@ -479,17 +503,36 @@ func getReorgInfo(d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table) (*re failpoint.Inject("errorUpdateReorgHandle", func() (*reorgInfo, error) { return &info, errors.New("occur an error when update reorg handle") }) - err = t.UpdateDDLReorgHandle(job, start, end, pid) + err = t.UpdateDDLReorgHandle(job, start, end, pid, elements[0]) if err != nil { return &info, errors.Trace(err) } // Update info should after data persistent. job.SnapshotVer = ver.Ver + element = elements[0] } else { + failpoint.Inject("MockGetIndexRecordErr", func(val failpoint.Value) { + // For the case of the old TiDB version(do not exist the element information) is upgraded to the new TiDB version. + // Second step, we need to remove the element information to make sure we can get the error of "ErrDDLReorgElementNotExist". + // However, since "txn.Reset()" will be called later, the reorganized information cannot be saved to storage. + if val.(string) == "addIdxNotOwnerErr" && atomic.CompareAndSwapUint32(&mockNotOwnerErrOnce, 2, 3) { + if err := t.RemoveReorgElement(job); err != nil { + failpoint.Return(nil, errors.Trace(err)) + } + } + }) + var err error - start, end, pid, err = t.GetDDLReorgHandle(job, tbl.Meta().IsCommonHandle) + element, start, end, pid, err = t.GetDDLReorgHandle(job, tbl.Meta().IsCommonHandle) if err != nil { - return nil, errors.Trace(err) + // If the reorg element doesn't exist, this reorg info should be saved by the older TiDB versions. + // It's compatible with the older TiDB versions. + // We'll try to remove it in the next major TiDB version. + if meta.ErrDDLReorgElementNotExist.Equal(err) { + job.SnapshotVer = 0 + logutil.BgLogger().Warn("[ddl] get reorg info, the element does not exist", zap.String("job", job.String())) + } + return &info, errors.Trace(err) } } info.Job = job @@ -497,14 +540,23 @@ func getReorgInfo(d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table) (*re info.StartHandle = start info.EndHandle = end info.PhysicalTableID = pid + info.currElement = element + info.elements = elements return &info, nil } -func (r *reorgInfo) UpdateReorgMeta(txn kv.Transaction, startHandle, endHandle kv.Handle, physicalTableID int64) error { - if startHandle == nil && endHandle == nil { +func (r *reorgInfo) UpdateReorgMeta(startHandle kv.Handle) error { + if startHandle == nil && r.EndHandle == nil { return nil } - t := meta.NewMeta(txn) - return errors.Trace(t.UpdateDDLReorgHandle(r.Job, startHandle, endHandle, physicalTableID)) + + err := kv.RunInNewTxn(r.d.store, true, func(txn kv.Transaction) error { + t := meta.NewMeta(txn) + return errors.Trace(t.UpdateDDLReorgHandle(r.Job, startHandle, r.EndHandle, r.PhysicalTableID, r.currElement)) + }) + if err != nil { + return errors.Trace(err) + } + return nil } diff --git a/ddl/reorg_test.go b/ddl/reorg_test.go index 2e0031bc94d5e..7c58e43e4b58b 100644 --- a/ddl/reorg_test.go +++ b/ddl/reorg_test.go @@ -89,8 +89,10 @@ func (s *testDDLSuite) TestReorg(c *C) { txn, err = ctx.Txn(true) c.Assert(err, IsNil) m := meta.NewMeta(txn) + e := &meta.Element{ID: 333, TypeKey: meta.IndexElementKey} rInfo := &reorgInfo{ - Job: job, + Job: job, + currElement: e, } mockTbl := tables.MockTableFromMeta(&model.TableInfo{IsCommonHandle: s.IsCommonHandle}) err = d.generalWorker().runReorgJob(m, rInfo, mockTbl.Meta(), d.lease, f) @@ -111,9 +113,10 @@ func (s *testDDLSuite) TestReorg(c *C) { c.Assert(err, IsNil) m = meta.NewMeta(txn) - info, err1 := getReorgInfo(d.ddlCtx, m, job, mockTbl) + info, err1 := getReorgInfo(d.ddlCtx, m, job, mockTbl, nil) c.Assert(err1, IsNil) c.Assert(info.StartHandle, HandleEquals, handle) + c.Assert(info.currElement, DeepEquals, e) _, doneHandle := d.generalWorker().reorgCtx.getRowCountAndHandle() c.Assert(doneHandle, IsNil) break @@ -129,27 +132,35 @@ func (s *testDDLSuite) TestReorg(c *C) { SnapshotVer: 1, // Make sure it is not zero. So the reorgInfo's first is false. } - var info *reorgInfo - startHandle := s.NewHandle().Int(1).Common(100, "string") - endHandle := s.NewHandle().Int(0).Common(101, "string") + element := &meta.Element{ID: 123, TypeKey: meta.ColumnElementKey} + info := &reorgInfo{ + Job: job, + d: d.ddlCtx, + currElement: element, + StartHandle: s.NewHandle().Int(1).Common(100, "string"), + EndHandle: s.NewHandle().Int(0).Common(101, "string"), + PhysicalTableID: 456, + } err = kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { t := meta.NewMeta(txn) var err1 error - info, err1 = getReorgInfo(d.ddlCtx, t, job, mockTbl) - c.Assert(err1, IsNil) - err1 = info.UpdateReorgMeta(txn, startHandle, endHandle, 1) - c.Assert(err1, IsNil) + _, err1 = getReorgInfo(d.ddlCtx, t, job, mockTbl, []*meta.Element{element}) + c.Assert(meta.ErrDDLReorgElementNotExist.Equal(err1), IsTrue) + c.Assert(job.SnapshotVer, Equals, uint64(0)) return nil }) c.Assert(err, IsNil) - + job.SnapshotVer = uint64(1) + err = info.UpdateReorgMeta(info.StartHandle) + c.Assert(err, IsNil) err = kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { t := meta.NewMeta(txn) - var err1 error - info, err1 = getReorgInfo(d.ddlCtx, t, job, mockTbl) + info1, err1 := getReorgInfo(d.ddlCtx, t, job, mockTbl, []*meta.Element{element}) c.Assert(err1, IsNil) - c.Assert(info.StartHandle, HandleEquals, startHandle) - c.Assert(info.EndHandle, HandleEquals, endHandle) + c.Assert(info1.currElement, DeepEquals, info.currElement) + c.Assert(info1.StartHandle, HandleEquals, info.StartHandle) + c.Assert(info1.EndHandle, HandleEquals, info.EndHandle) + c.Assert(info1.PhysicalTableID, Equals, info.PhysicalTableID) return nil }) c.Assert(err, IsNil) diff --git a/errno/errcode.go b/errno/errcode.go index 860457ecafc4b..8704cd8aa617a 100644 --- a/errno/errcode.go +++ b/errno/errcode.go @@ -1018,6 +1018,7 @@ const ( ErrTableOptionUnionUnsupported = 8232 ErrTableOptionInsertMethodUnsupported = 8233 ErrInvalidPlacementSpec = 8234 + ErrDDLReorgElementNotExist = 8235 // TiKV/PD errors. ErrPDServerTimeout = 9001 diff --git a/errno/errname.go b/errno/errname.go index 46d2f9241fa43..a3ad0ee26e86a 100644 --- a/errno/errname.go +++ b/errno/errname.go @@ -945,7 +945,7 @@ var MySQLErrName = map[uint16]string{ ErrInvalidDDLWorker: "Invalid DDL worker", ErrUnsupportedDDLOperation: "Unsupported %s", ErrNotOwner: "TiDB server is not a DDL owner", - ErrCantDecodeRecord: "Cannot decode %s value, because %s", + ErrCantDecodeRecord: "Cannot decode %s value, because %v", ErrInvalidDDLJob: "Invalid DDL job", ErrInvalidDDLJobFlag: "Invalid DDL job flag", ErrWaitReorgTimeout: "Timeout waiting for data reorganization", @@ -975,6 +975,7 @@ var MySQLErrName = map[uint16]string{ ErrInvalidKey: "invalid key", ErrInvalidIndexKey: "invalid index key", ErrDataInConsistent: "data isn't equal", + ErrDDLReorgElementNotExist: "DDL reorg element does not exist", ErrDDLJobNotFound: "DDL Job:%v not found", ErrCancelFinishedDDLJob: "This job:%v is finished, so can't be cancelled", ErrCannotCancelDDLJob: "This job:%v is almost finished, can't be cancelled now", diff --git a/meta/meta.go b/meta/meta.go index e8d01ff9bfc7c..539a39f1cb730 100644 --- a/meta/meta.go +++ b/meta/meta.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/structure" @@ -78,6 +79,8 @@ var ( ErrTableExists = terror.ClassMeta.New(mysql.ErrTableExists, mysql.MySQLErrName[mysql.ErrTableExists]) // ErrTableNotExists is the error for table not exists. ErrTableNotExists = terror.ClassMeta.New(mysql.ErrNoSuchTable, mysql.MySQLErrName[mysql.ErrNoSuchTable]) + // ErrDDLReorgElementNotExist is the error for reorg element not exists. + ErrDDLReorgElementNotExist = terror.ClassMeta.New(errno.ErrDDLReorgElementNotExist, errno.MySQLErrName[errno.ErrDDLReorgElementNotExist]) ) // Meta is for handling meta information in a transaction. @@ -707,21 +710,41 @@ func (m *Meta) jobIDKey(id int64) []byte { return b } -func (m *Meta) reorgJobStartHandle(id int64) []byte { - // There is no "_start", to make it compatible with the older TiDB versions. - return m.jobIDKey(id) +func (m *Meta) reorgJobCurrentElement(id int64) []byte { + b := make([]byte, 0, 12) + b = append(b, m.jobIDKey(id)...) + b = append(b, "_ele"...) + return b +} + +func (m *Meta) reorgJobStartHandle(id int64, element *Element) []byte { + b := make([]byte, 0, 16+len(element.TypeKey)) + b = append(b, m.jobIDKey(id)...) + b = append(b, element.TypeKey...) + eID := make([]byte, 8) + binary.BigEndian.PutUint64(eID, uint64(element.ID)) + b = append(b, eID...) + return b } -func (m *Meta) reorgJobEndHandle(id int64) []byte { - b := make([]byte, 8, 12) +func (m *Meta) reorgJobEndHandle(id int64, element *Element) []byte { + b := make([]byte, 8, 25) binary.BigEndian.PutUint64(b, uint64(id)) + b = append(b, element.TypeKey...) + eID := make([]byte, 8) + binary.BigEndian.PutUint64(eID, uint64(element.ID)) + b = append(b, eID...) b = append(b, "_end"...) return b } -func (m *Meta) reorgJobPhysicalTableID(id int64) []byte { - b := make([]byte, 8, 12) +func (m *Meta) reorgJobPhysicalTableID(id int64, element *Element) []byte { + b := make([]byte, 8, 25) binary.BigEndian.PutUint64(b, uint64(id)) + b = append(b, element.TypeKey...) + eID := make([]byte, 8) + binary.BigEndian.PutUint64(eID, uint64(element.ID)) + b = append(b, eID...) b = append(b, "_pid"...) return b } @@ -864,22 +887,86 @@ func (m *Meta) FinishBootstrap(version int64) error { return errors.Trace(err) } -// UpdateDDLReorgStartHandle saves the job reorganization latest processed start handle for later resuming. -func (m *Meta) UpdateDDLReorgStartHandle(job *model.Job, startHandle kv.Handle) error { - return setReorgJobFieldHandle(m.txn, m.reorgJobStartHandle(job.ID), startHandle) +// ElementKeyType is a key type of the element. +type ElementKeyType []byte + +var ( + // ColumnElementKey is the key for column element. + ColumnElementKey ElementKeyType = []byte("_col_") + // IndexElementKey is the key for index element. + IndexElementKey ElementKeyType = []byte("_idx_") +) + +const elementKeyLen = 5 + +// Element has the information of the backfill job's type and ID. +type Element struct { + ID int64 + TypeKey []byte +} + +// String defines a Stringer function for debugging and pretty printing. +func (e *Element) String() string { + return "ID:" + strconv.FormatInt(e.ID, 10) + "," + + "TypeKey:" + string(e.TypeKey) +} + +// EncodeElement encodes an Element into a byte slice. +// It's exported for testing. +func (e *Element) EncodeElement() []byte { + b := make([]byte, 13) + copy(b[:elementKeyLen], e.TypeKey) + binary.BigEndian.PutUint64(b[elementKeyLen:], uint64(e.ID)) + return b +} + +// DecodeElement decodes values from a byte slice generated with an element. +// It's exported for testing. +func DecodeElement(b []byte) (*Element, error) { + if len(b) < elementKeyLen+8 { + return nil, errors.Errorf("invalid encoded element %q length %d", b, len(b)) + } + + var tp []byte + prefix := b[:elementKeyLen] + b = b[elementKeyLen:] + switch string(prefix) { + case string(IndexElementKey): + tp = IndexElementKey + case string(ColumnElementKey): + tp = ColumnElementKey + default: + return nil, errors.Errorf("invalid encoded element key prefix %q", prefix) + } + + id := binary.BigEndian.Uint64(b) + return &Element{ID: int64(id), TypeKey: tp}, nil +} + +// UpdateDDLReorgStartHandle saves the job reorganization latest processed element and start handle for later resuming. +func (m *Meta) UpdateDDLReorgStartHandle(job *model.Job, element *Element, startHandle kv.Handle) error { + err := m.txn.HSet(mDDLJobReorgKey, m.reorgJobCurrentElement(job.ID), element.EncodeElement()) + if err != nil { + return errors.Trace(err) + } + return setReorgJobFieldHandle(m.txn, m.reorgJobStartHandle(job.ID, element), startHandle) } // UpdateDDLReorgHandle saves the job reorganization latest processed information for later resuming. -func (m *Meta) UpdateDDLReorgHandle(job *model.Job, startHandle, endHandle kv.Handle, physicalTableID int64) error { - err := setReorgJobFieldHandle(m.txn, m.reorgJobStartHandle(job.ID), startHandle) +func (m *Meta) UpdateDDLReorgHandle(job *model.Job, startHandle, endHandle kv.Handle, physicalTableID int64, element *Element) error { + err := m.txn.HSet(mDDLJobReorgKey, m.reorgJobCurrentElement(job.ID), element.EncodeElement()) if err != nil { return errors.Trace(err) } - err = setReorgJobFieldHandle(m.txn, m.reorgJobEndHandle(job.ID), endHandle) + err = setReorgJobFieldHandle(m.txn, m.reorgJobStartHandle(job.ID, element), startHandle) if err != nil { return errors.Trace(err) } - err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobPhysicalTableID(job.ID), []byte(strconv.FormatInt(physicalTableID, 10))) + err = setReorgJobFieldHandle(m.txn, m.reorgJobEndHandle(job.ID, element), endHandle) + if err != nil { + return errors.Trace(err) + } + err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobPhysicalTableID(job.ID, element), []byte(strconv.FormatInt(physicalTableID, 10))) return errors.Trace(err) } @@ -896,37 +983,71 @@ func setReorgJobFieldHandle(t *structure.TxStructure, reorgJobField []byte, hand return t.HSet(mDDLJobReorgKey, reorgJobField, handleEncodedBytes) } -// RemoveDDLReorgHandle removes the job reorganization related handles. -func (m *Meta) RemoveDDLReorgHandle(job *model.Job) error { - err := m.txn.HDel(mDDLJobReorgKey, m.reorgJobStartHandle(job.ID)) +// RemoveReorgElement removes the element of the reorganization information. +// It's used for testing. +func (m *Meta) RemoveReorgElement(job *model.Job) error { + err := m.txn.HDel(mDDLJobReorgKey, m.reorgJobCurrentElement(job.ID)) if err != nil { return errors.Trace(err) } - if err = m.txn.HDel(mDDLJobReorgKey, m.reorgJobEndHandle(job.ID)); err != nil { - logutil.BgLogger().Warn("remove DDL reorg end handle", zap.Error(err)) + return nil +} + +// RemoveDDLReorgHandle removes the job reorganization related handles. +func (m *Meta) RemoveDDLReorgHandle(job *model.Job, elements []*Element) error { + if len(elements) == 0 { + return nil } - if err = m.txn.HDel(mDDLJobReorgKey, m.reorgJobPhysicalTableID(job.ID)); err != nil { - logutil.BgLogger().Warn("remove DDL reorg physical ID", zap.Error(err)) + + err := m.txn.HDel(mDDLJobReorgKey, m.reorgJobCurrentElement(job.ID)) + if err != nil { + return errors.Trace(err) + } + + for _, element := range elements { + err = m.txn.HDel(mDDLJobReorgKey, m.reorgJobStartHandle(job.ID, element)) + if err != nil { + return errors.Trace(err) + } + if err = m.txn.HDel(mDDLJobReorgKey, m.reorgJobEndHandle(job.ID, element)); err != nil { + logutil.BgLogger().Warn("remove DDL reorg end handle", zap.Error(err)) + } + if err = m.txn.HDel(mDDLJobReorgKey, m.reorgJobPhysicalTableID(job.ID, element)); err != nil { + logutil.BgLogger().Warn("remove DDL reorg physical ID", zap.Error(err)) + } } return nil } // GetDDLReorgHandle gets the latest processed DDL reorganize position. -func (m *Meta) GetDDLReorgHandle(job *model.Job, isCommonHandle bool) (startHandle, endHandle kv.Handle, physicalTableID int64, err error) { - startHandle, err = getReorgJobFieldHandle(m.txn, m.reorgJobStartHandle(job.ID), isCommonHandle) +func (m *Meta) GetDDLReorgHandle(job *model.Job, isCommonHandle bool) (element *Element, startHandle, endHandle kv.Handle, physicalTableID int64, err error) { + elementBytes, err := m.txn.HGet(mDDLJobReorgKey, m.reorgJobCurrentElement(job.ID)) + if err != nil { + return nil, nil, nil, 0, errors.Trace(err) + } + if elementBytes == nil { + return nil, nil, nil, 0, ErrDDLReorgElementNotExist + } + element, err = DecodeElement(elementBytes) + if err != nil { + return nil, nil, nil, 0, errors.Trace(err) + } + + startHandle, err = getReorgJobFieldHandle(m.txn, m.reorgJobStartHandle(job.ID, element), isCommonHandle) if err != nil { - return nil, nil, 0, errors.Trace(err) + return nil, nil, nil, 0, errors.Trace(err) } - endHandle, err = getReorgJobFieldHandle(m.txn, m.reorgJobEndHandle(job.ID), isCommonHandle) + endHandle, err = getReorgJobFieldHandle(m.txn, m.reorgJobEndHandle(job.ID, element), isCommonHandle) if err != nil { - return nil, nil, 0, errors.Trace(err) + return nil, nil, nil, 0, errors.Trace(err) } - physicalTableID, err = m.txn.HGetInt64(mDDLJobReorgKey, m.reorgJobPhysicalTableID(job.ID)) + physicalTableID, err = m.txn.HGetInt64(mDDLJobReorgKey, m.reorgJobPhysicalTableID(job.ID, element)) if err != nil { err = errors.Trace(err) return } + // physicalTableID may be 0, because older version TiDB (without table partition) doesn't store them. // update them to table's in this case. if physicalTableID == 0 { diff --git a/meta/meta_test.go b/meta/meta_test.go index d7b7ec2db4701..17a6c8f735e8f 100644 --- a/meta/meta_test.go +++ b/meta/meta_test.go @@ -22,6 +22,7 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/errors" "github.com/pingcap/parser/model" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" @@ -303,6 +304,31 @@ func (s *testSuite) TestSnapshot(c *C) { c.Assert(err.Error(), Equals, "[structure:8220]write on snapshot") } +func (s *testSuite) TestElement(c *C) { + checkElement := func(key []byte, resErr error) { + e := &meta.Element{ID: 123, TypeKey: key} + eBytes := e.EncodeElement() + resE, err := meta.DecodeElement(eBytes) + if resErr == nil { + c.Assert(err, Equals, resErr) + c.Assert(e, DeepEquals, resE) + } else { + c.Assert(err.Error(), Equals, resErr.Error()) + } + } + key := []byte("_col") + checkElement(key, errors.Errorf(`invalid encoded element key prefix "_col\x00"`)) + checkElement(meta.IndexElementKey, nil) + checkElement(meta.ColumnElementKey, nil) + key = []byte("inexistent") + checkElement(key, errors.Errorf("invalid encoded element key prefix %q", key[:5])) + + _, err := meta.DecodeElement([]byte("_col")) + c.Assert(err.Error(), Equals, `invalid encoded element "_col" length 4`) + _, err = meta.DecodeElement(meta.ColumnElementKey) + c.Assert(err.Error(), Equals, `invalid encoded element "_col_" length 5`) +} + func (s *testSuite) TestDDL(c *C) { defer testleak.AfterTest(c)() store, err := mockstore.NewMockStore() @@ -333,45 +359,58 @@ func (s *testSuite) TestDDL(c *C) { err = t.UpdateDDLJob(0, job, true) c.Assert(err, IsNil) + element := &meta.Element{ID: 123, TypeKey: meta.IndexElementKey} // There are 3 meta key relate to index reorganization: // start_handle, end_handle and physical_table_id. // Only start_handle is initialized. - err = t.UpdateDDLReorgStartHandle(job, kv.IntHandle(1)) + err = t.UpdateDDLReorgStartHandle(job, element, kv.IntHandle(1)) c.Assert(err, IsNil) // Since physical_table_id is uninitialized, we simulate older TiDB version that doesn't store them. // In this case GetDDLReorgHandle always return maxInt64 as end_handle. - i, j, k, err := t.GetDDLReorgHandle(job, false) + e, i, j, k, err := t.GetDDLReorgHandle(job, false) c.Assert(err, IsNil) + c.Assert(e, DeepEquals, element) c.Assert(i, HandleEquals, kv.IntHandle(1)) c.Assert(j, HandleEquals, kv.IntHandle(math.MaxInt64)) c.Assert(k, Equals, int64(0)) startHandle := s.NewHandle().Int(1).Common("abc", 1222, "string") endHandle := s.NewHandle().Int(2).Common("dddd", 1222, "string") - err = t.UpdateDDLReorgHandle(job, startHandle, endHandle, 3) + element = &meta.Element{ID: 222, TypeKey: meta.ColumnElementKey} + err = t.UpdateDDLReorgHandle(job, startHandle, endHandle, 3, element) + c.Assert(err, IsNil) + element1 := &meta.Element{ID: 223, TypeKey: meta.IndexElementKey} + err = t.UpdateDDLReorgHandle(job, startHandle, endHandle, 3, element1) c.Assert(err, IsNil) - i, j, k, err = t.GetDDLReorgHandle(job, s.IsCommonHandle) + e, i, j, k, err = t.GetDDLReorgHandle(job, s.IsCommonHandle) c.Assert(err, IsNil) + c.Assert(e, DeepEquals, element1) c.Assert(i, HandleEquals, startHandle) c.Assert(j, HandleEquals, endHandle) c.Assert(k, Equals, int64(3)) - err = t.RemoveDDLReorgHandle(job) + err = t.RemoveDDLReorgHandle(job, []*meta.Element{element, element1}) c.Assert(err, IsNil) + e, i, j, k, err = t.GetDDLReorgHandle(job, false) + c.Assert(meta.ErrDDLReorgElementNotExist.Equal(err), IsTrue) + c.Assert(e, IsNil) + c.Assert(i, IsNil) + c.Assert(j, IsNil) + c.Assert(k, Equals, int64(0)) // new TiDB binary running on old TiDB DDL reorg data. - i, j, k, err = t.GetDDLReorgHandle(job, s.IsCommonHandle) - c.Assert(err, IsNil) + e, i, j, k, err = t.GetDDLReorgHandle(job, s.IsCommonHandle) + c.Assert(meta.ErrDDLReorgElementNotExist.Equal(err), IsTrue) + c.Assert(e, IsNil) c.Assert(i, IsNil) - // The default value for endHandle is MaxInt64, not 0. - c.Assert(j, HandleEquals, kv.IntHandle(math.MaxInt64)) + c.Assert(j, IsNil) c.Assert(k, Equals, int64(0)) // Test GetDDLReorgHandle failed. - _, _, _, err = t.GetDDLReorgHandle(job, s.IsCommonHandle) - c.Assert(err, IsNil) + _, _, _, _, err = t.GetDDLReorgHandle(job, s.IsCommonHandle) + c.Assert(meta.ErrDDLReorgElementNotExist.Equal(err), IsTrue) v, err = t.DeQueueDDLJob() c.Assert(err, IsNil) diff --git a/statistics/handle/ddl.go b/statistics/handle/ddl.go index 744291596015c..9881ee3b52d94 100644 --- a/statistics/handle/ddl.go +++ b/statistics/handle/ddl.go @@ -36,7 +36,7 @@ func (h *Handle) HandleDDLEvent(t *util.Event) error { return err } } - case model.ActionAddColumn, model.ActionAddColumns: + case model.ActionAddColumn, model.ActionAddColumns, model.ActionModifyColumn: ids := getPhysicalIDs(t.TableInfo) for _, id := range ids { if err := h.insertColStats2KV(id, t.ColumnInfos); err != nil { diff --git a/util/admin/admin.go b/util/admin/admin.go index ac5deff3deafa..902936722d79d 100644 --- a/util/admin/admin.go +++ b/util/admin/admin.go @@ -81,8 +81,12 @@ func GetDDLInfo(txn kv.Transaction) (*DDLInfo, error) { if err != nil { return info, nil } - info.ReorgHandle, _, _, err = t.GetDDLReorgHandle(addIdxJob, tbl.IsCommonHandle) + + _, info.ReorgHandle, _, _, err = t.GetDDLReorgHandle(addIdxJob, tbl.IsCommonHandle) if err != nil { + if meta.ErrDDLReorgElementNotExist.Equal(err) { + return info, nil + } return nil, errors.Trace(err) } From 4ff2f926e270f7c6b08ac5709da5c8e84ea4182a Mon Sep 17 00:00:00 2001 From: xiaodong-ji Date: Sun, 27 Sep 2020 11:31:16 +0800 Subject: [PATCH 33/60] executor, expression: set the evalType of hybrid type as ETInt in VecEvalBool (#20221) --- executor/aggregate.go | 4 ++-- executor/executor_test.go | 14 ++++++++++++++ expression/expression.go | 10 +++++++--- expression/expression_test.go | 4 ++-- expression/util_test.go | 2 +- 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/executor/aggregate.go b/executor/aggregate.go index c8f0ca6648d6b..768692ecbec6c 100644 --- a/executor/aggregate.go +++ b/executor/aggregate.go @@ -452,7 +452,7 @@ func getGroupKey(ctx sessionctx.Context, input *chunk.Chunk, groupKey [][]byte, return nil, err } - if err := expression.EvalExpr(ctx, item, input, buf); err != nil { + if err := expression.EvalExpr(ctx, item, tp.EvalType(), input, buf); err != nil { expression.PutColumn(buf) return nil, err } @@ -1296,7 +1296,7 @@ func (e *vecGroupChecker) evalGroupItemsAndResolveGroups(item expression.Express return err } defer e.releaseBuffer(col) - err = expression.EvalExpr(e.ctx, item, chk, col) + err = expression.EvalExpr(e.ctx, item, eType, chk, col) if err != nil { return err } diff --git a/executor/executor_test.go b/executor/executor_test.go index 1bb12cb2dbd10..4c5745473aaef 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -3348,6 +3348,12 @@ func (s *testSuite) TestBit(c *C) { tk.MustExec("insert into t values ('12345678')") _, err = tk.Exec("insert into t values ('123456789')") c.Assert(err, NotNil) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (c1 bit(64))") + tk.MustExec("insert into t values (0xffffffffffffffff)") + tk.MustExec("insert into t values ('12345678')") + tk.MustQuery("select * from t where c1").Check(testkit.Rows("\xff\xff\xff\xff\xff\xff\xff\xff", "12345678")) } func (s *testSuite) TestEnum(c *C) { @@ -3364,6 +3370,10 @@ func (s *testSuite) TestEnum(c *C) { tk.MustExec("insert into t values ()") tk.MustExec("insert into t values (null), ('1')") tk.MustQuery("select c + 1 from t where c = 1").Check(testkit.Rows("2")) + + tk.MustExec("delete from t") + tk.MustExec("insert into t values(1), (2), (3)") + tk.MustQuery("select * from t where c").Check(testkit.Rows("a", "b", "c")) } func (s *testSuite) TestSet(c *C) { @@ -3382,6 +3392,10 @@ func (s *testSuite) TestSet(c *C) { tk.MustExec("insert into t values ()") tk.MustExec("insert into t values (null), ('1')") tk.MustQuery("select c + 1 from t where c = 1").Check(testkit.Rows("2")) + + tk.MustExec("delete from t") + tk.MustExec("insert into t values(3)") + tk.MustQuery("select * from t where c").Check(testkit.Rows("a,b")) } func (s *testSuite) TestSubqueryInValues(c *C) { diff --git a/expression/expression.go b/expression/expression.go index f34f7c095a4a6..91e9a691d3789 100644 --- a/expression/expression.go +++ b/expression/expression.go @@ -322,12 +322,15 @@ func VecEvalBool(ctx sessionctx.Context, exprList CNFExprs, input *chunk.Chunk, defer deallocateZeroSlice(isZero) for _, expr := range exprList { eType := expr.GetType().EvalType() + if expr.GetType().Hybrid() { + eType = types.ETInt + } buf, err := globalColumnAllocator.get(eType, n) if err != nil { return nil, nil, err } - if err := EvalExpr(ctx, expr, input, buf); err != nil { + if err := EvalExpr(ctx, expr, eType, input, buf); err != nil { return nil, nil, err } @@ -473,8 +476,9 @@ func toBool(sc *stmtctx.StatementContext, eType types.EvalType, buf *chunk.Colum // EvalExpr evaluates this expr according to its type. // And it selects the method for evaluating expression based on // the environment variables and whether the expression can be vectorized. -func EvalExpr(ctx sessionctx.Context, expr Expression, input *chunk.Chunk, result *chunk.Column) (err error) { - evalType := expr.GetType().EvalType() +// Note: the input argument `evalType` is needed because of that when `expr` is +// of the hybrid type(ENUM/SET/BIT), we need the invoker decide the actual EvalType. +func EvalExpr(ctx sessionctx.Context, expr Expression, evalType types.EvalType, input *chunk.Chunk, result *chunk.Column) (err error) { if expr.Vectorized() && ctx.GetSessionVars().EnableVectorizedExpression { switch evalType { case types.ETInt: diff --git a/expression/expression_test.go b/expression/expression_test.go index b6b88506fabc5..2ecdc12f465eb 100644 --- a/expression/expression_test.go +++ b/expression/expression_test.go @@ -203,12 +203,12 @@ func (s *testEvaluatorSuite) TestEvalExpr(c *C) { var err error c.Assert(colExpr.Vectorized(), IsTrue) ctx.GetSessionVars().EnableVectorizedExpression = false - err = EvalExpr(ctx, colExpr, input, colBuf) + err = EvalExpr(ctx, colExpr, colExpr.GetType().EvalType(), input, colBuf) if err != nil { c.Fatal(err) } ctx.GetSessionVars().EnableVectorizedExpression = true - err = EvalExpr(ctx, colExpr, input, colBuf2) + err = EvalExpr(ctx, colExpr, colExpr.GetType().EvalType(), input, colBuf2) if err != nil { c.Fatal(err) } diff --git a/expression/util_test.go b/expression/util_test.go index a5e82fd64ef25..172a66e59d1e0 100644 --- a/expression/util_test.go +++ b/expression/util_test.go @@ -371,7 +371,7 @@ func (s *testUtilSuite) TestHashGroupKey(c *check.C) { bufs[j] = bufs[j][:0] } var err error - err = EvalExpr(ctx, colExpr, input, colBuf) + err = EvalExpr(ctx, colExpr, colExpr.GetType().EvalType(), input, colBuf) if err != nil { c.Fatal(err) } From 5eaaa5c64909bd9f3833209e6b0d974d31f9917a Mon Sep 17 00:00:00 2001 From: wjHuang Date: Sun, 27 Sep 2020 12:39:38 +0800 Subject: [PATCH 34/60] expression: fix a bug that `from_unixtime` + `union all` returns truncated result (#20225) Signed-off-by: wjhuang2016 --- expression/builtin_time.go | 1 - expression/integration_test.go | 17 +++++++++++++++++ expression/typeinfer_test.go | 2 +- go.sum | 1 + 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/expression/builtin_time.go b/expression/builtin_time.go index 29541004ee5a8..8a36c40668020 100644 --- a/expression/builtin_time.go +++ b/expression/builtin_time.go @@ -1684,7 +1684,6 @@ func (c *fromUnixTimeFunctionClass) getFunction(ctx sessionctx.Context, args []E } if len(args) > 1 { - bf.tp.Flen = args[1].GetType().Flen sig = &builtinFromUnixTime2ArgSig{bf} sig.setPbCode(tipb.ScalarFuncSig_FromUnixTime2Arg) return sig, nil diff --git a/expression/integration_test.go b/expression/integration_test.go index a54be29493365..2dc2d9c0817a4 100755 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -7079,6 +7079,23 @@ func (s *testIntegrationSuite) TestIssue18515(c *C) { tk.MustExec("select /*+ TIDB_INLJ(t2) */ t1.a, t1.c, t2.a from t t1, t t2 where t1.c=t2.c;") } +func (s *testIntegrationSuite) TestIssue20223(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE t (" + + "id int(10) unsigned NOT NULL AUTO_INCREMENT," + + "type tinyint(4) NOT NULL," + + "create_time int(11) NOT NULL," + + "PRIMARY KEY (id)" + + ")") + tk.MustExec("insert into t values (4, 2, 1598584933)") + tk.MustQuery("select from_unixtime(create_time,'%Y-%m-%d') as t_day,count(*) as cnt from t where `type` = 1 " + + "group by t_day union all " + + "select from_unixtime(create_time,'%Y-%m-%d') as t_day,count(*) as cnt from t where `type` = 2 " + + "group by t_day").Check(testkit.Rows("2020-08-28 1")) +} + func (s *testIntegrationSuite) TestIssue18525(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") diff --git a/expression/typeinfer_test.go b/expression/typeinfer_test.go index 69346addc7822..208eb9ca380ab 100644 --- a/expression/typeinfer_test.go +++ b/expression/typeinfer_test.go @@ -1864,7 +1864,7 @@ func (s *testInferTypeSuite) createTestCase4TimeFuncs() []typeInferTestCase { {"from_unixtime(20170101.999)", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDatetimeWidthWithFsp, 3}, {"from_unixtime(20170101.1234567)", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDatetimeWidthWithFsp, int(types.MaxFsp)}, {"from_unixtime('20170101.999')", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDatetimeWidthWithFsp, int(types.MaxFsp)}, - {"from_unixtime(20170101.123, '%H')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 2, types.UnspecifiedLength}, + {"from_unixtime(20170101.123, '%H')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, -1, types.UnspecifiedLength}, {"extract(day from c_char)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, {"extract(hour from c_char)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, diff --git a/go.sum b/go.sum index a1d1e6f0a3302..0c3847b196a5f 100644 --- a/go.sum +++ b/go.sum @@ -586,6 +586,7 @@ github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44 h1:tB9NOR21++IjLyVx3/PCPhWMwqGNCMQEH96A6dMZ/gc= github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v2.19.10+incompatible h1:lA4Pi29JEVIQIgATSeftHSY0rMGI9CLrl2ZvDLiahto= github.com/shirou/gopsutil v2.19.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= From 713c2378f69375c76f3e76fab99281df26b9fe0d Mon Sep 17 00:00:00 2001 From: rebelice Date: Sun, 27 Sep 2020 13:58:37 +0800 Subject: [PATCH 35/60] planner: let SQL BINDING support UNION ALL/INTERSECT/EXCEPT (#20010) --- bindinfo/bind_test.go | 408 ++++++++++++++++++++++-------------- executor/compiler.go | 8 +- go.mod | 2 +- go.sum | 4 +- planner/core/planbuilder.go | 16 +- planner/core/preprocess.go | 30 ++- planner/optimize.go | 21 +- 7 files changed, 299 insertions(+), 190 deletions(-) diff --git a/bindinfo/bind_test.go b/bindinfo/bind_test.go index 9ebe06a0e7aab..8663761f3bd44 100644 --- a/bindinfo/bind_test.go +++ b/bindinfo/bind_test.go @@ -147,185 +147,264 @@ func (s *testSuite) TestBindParse(c *C) { sql = `CREATE GLOBAL BINDING FOR select * from t where i BETWEEN "a" and "b" USING select * from t use index(index_t) where i BETWEEN "a\nb\rc\td\0e" and 'x'` tk.MustExec(sql) tk.MustExec(`DROP global binding for select * from t use index(idx) where i BETWEEN "a\nb\rc\td\0e" and "x"`) -} -func (s *testSuite) TestGlobalBinding(c *C) { - tk := testkit.NewTestKit(c, s.store) - s.cleanBindingEnv(tk) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t(i int, s varchar(20))") + // Test SetOprStmt. + tk.MustExec(`create binding for select * from t union all select * from t using select * from t use index(index_t) union all select * from t use index()`) + tk.MustExec(`drop binding for select * from t union all select * from t using select * from t use index(index_t) union all select * from t use index()`) + tk.MustExec(`create binding for select * from t INTERSECT select * from t using select * from t use index(index_t) INTERSECT select * from t use index()`) + tk.MustExec(`drop binding for select * from t INTERSECT select * from t using select * from t use index(index_t) INTERSECT select * from t use index()`) + tk.MustExec(`create binding for select * from t EXCEPT select * from t using select * from t use index(index_t) EXCEPT select * from t use index()`) + tk.MustExec(`drop binding for select * from t EXCEPT select * from t using select * from t use index(index_t) EXCEPT select * from t use index()`) + tk.MustExec(`create binding for (select * from t) union all (select * from t) using (select * from t use index(index_t)) union all (select * from t use index())`) + tk.MustExec(`drop binding for (select * from t) union all (select * from t) using (select * from t use index(index_t)) union all (select * from t use index())`) + + // Test errors. + tk.MustExec(`drop table if exists t1`) tk.MustExec("create table t1(i int, s varchar(20))") - tk.MustExec("create index index_t on t(i,s)") - - metrics.BindTotalGauge.Reset() - metrics.BindMemoryUsage.Reset() - - _, err := tk.Exec("create global binding for select * from t where i>100 using select * from t use index(index_t) where i>100") - c.Assert(err, IsNil, Commentf("err %v", err)) - - _, err = tk.Exec("create global binding for select * from t where i>99 using select * from t use index(index_t) where i>99") - c.Assert(err, IsNil) - - pb := &dto.Metric{} - metrics.BindTotalGauge.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) - c.Assert(pb.GetGauge().GetValue(), Equals, float64(1)) - metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) - c.Assert(pb.GetGauge().GetValue(), Equals, float64(97)) - - sql, hash := parser.NormalizeDigest("select * from t where i > 30.0") - - bindData := s.domain.BindHandle().GetBindRecord(hash, sql, "test") - c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where i > ?") - bind := bindData.Bindings[0] - c.Check(bind.BindSQL, Equals, "select * from t use index(index_t) where i>99") - c.Check(bindData.Db, Equals, "test") - c.Check(bind.Status, Equals, "using") - c.Check(bind.Charset, NotNil) - c.Check(bind.Collation, NotNil) - c.Check(bind.CreateTime, NotNil) - c.Check(bind.UpdateTime, NotNil) - - rs, err := tk.Exec("show global bindings") - c.Assert(err, IsNil) - chk := rs.NewChunk() - err = rs.Next(context.TODO(), chk) - c.Check(err, IsNil) - c.Check(chk.NumRows(), Equals, 1) - row := chk.GetRow(0) - c.Check(row.GetString(0), Equals, "select * from t where i > ?") - c.Check(row.GetString(1), Equals, "select * from t use index(index_t) where i>99") - c.Check(row.GetString(2), Equals, "test") - c.Check(row.GetString(3), Equals, "using") - c.Check(row.GetTime(4), NotNil) - c.Check(row.GetTime(5), NotNil) - c.Check(row.GetString(6), NotNil) - c.Check(row.GetString(7), NotNil) - - bindHandle := bindinfo.NewBindHandle(tk.Se) - err = bindHandle.Update(true) - c.Check(err, IsNil) - c.Check(bindHandle.Size(), Equals, 1) + _, err = tk.Exec("create global binding for select * from t using select * from t1 use index for join(index_t)") + c.Assert(err, NotNil, Commentf("err %v", err)) +} - bindData = bindHandle.GetBindRecord(hash, sql, "test") - c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where i > ?") - bind = bindData.Bindings[0] - c.Check(bind.BindSQL, Equals, "select * from t use index(index_t) where i>99") - c.Check(bindData.Db, Equals, "test") - c.Check(bind.Status, Equals, "using") - c.Check(bind.Charset, NotNil) - c.Check(bind.Collation, NotNil) - c.Check(bind.CreateTime, NotNil) - c.Check(bind.UpdateTime, NotNil) +var testSQLs = []struct { + createSQL string + overlaySQL string + querySQL string + originSQL string + bindSQL string + dropSQL string + memoryUsage float64 +}{ + { + createSQL: "binding for select * from t where i>100 using select * from t use index(index_t) where i>100", + overlaySQL: "binding for select * from t where i>99 using select * from t use index(index_t) where i>99", + querySQL: "select * from t where i > 30.0", + originSQL: "select * from t where i > ?", + bindSQL: "select * from t use index(index_t) where i>99", + dropSQL: "binding for select * from t where i>100", + memoryUsage: float64(97), + }, + { + createSQL: "binding for select * from t union all select * from t using select * from t use index(index_t) union all select * from t use index()", + overlaySQL: "", + querySQL: "select * from t union all select * from t", + originSQL: "select * from t union all select * from t", + bindSQL: "select * from t use index(index_t) union all select * from t use index()", + dropSQL: "binding for select * from t union all select * from t", + memoryUsage: float64(138), + }, + { + createSQL: "binding for (select * from t) union all (select * from t) using (select * from t use index(index_t)) union all (select * from t use index())", + overlaySQL: "", + querySQL: "(select * from t) union all (select * from t)", + originSQL: "( select * from t ) union all ( select * from t )", + bindSQL: "(select * from t use index(index_t)) union all (select * from t use index())", + dropSQL: "binding for (select * from t) union all (select * from t)", + memoryUsage: float64(150), + }, + { + createSQL: "binding for select * from t intersect select * from t using select * from t use index(index_t) intersect select * from t use index()", + overlaySQL: "", + querySQL: "select * from t intersect select * from t", + originSQL: "select * from t intersect select * from t", + bindSQL: "select * from t use index(index_t) intersect select * from t use index()", + dropSQL: "binding for select * from t intersect select * from t", + memoryUsage: float64(138), + }, + { + createSQL: "binding for select * from t except select * from t using select * from t use index(index_t) except select * from t use index()", + overlaySQL: "", + querySQL: "select * from t except select * from t", + originSQL: "select * from t except select * from t", + bindSQL: "select * from t use index(index_t) except select * from t use index()", + dropSQL: "binding for select * from t except select * from t", + memoryUsage: float64(132), + }, +} - _, err = tk.Exec("DROP global binding for select * from t where i>100") - c.Check(err, IsNil) - bindData = s.domain.BindHandle().GetBindRecord(hash, sql, "test") - c.Check(bindData, IsNil) +func (s *testSuite) TestGlobalBinding(c *C) { + tk := testkit.NewTestKit(c, s.store) - metrics.BindTotalGauge.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) - c.Assert(pb.GetGauge().GetValue(), Equals, float64(0)) - metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) - // From newly created global bind handle. - c.Assert(pb.GetGauge().GetValue(), Equals, float64(97)) + for _, testSQL := range testSQLs { + s.cleanBindingEnv(tk) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t(i int, s varchar(20))") + tk.MustExec("create table t1(i int, s varchar(20))") + tk.MustExec("create index index_t on t(i,s)") - bindHandle = bindinfo.NewBindHandle(tk.Se) - err = bindHandle.Update(true) - c.Check(err, IsNil) - c.Check(bindHandle.Size(), Equals, 0) + metrics.BindTotalGauge.Reset() + metrics.BindMemoryUsage.Reset() - bindData = bindHandle.GetBindRecord(hash, sql, "test") - c.Check(bindData, IsNil) + _, err := tk.Exec("create global " + testSQL.createSQL) + c.Assert(err, IsNil, Commentf("err %v", err)) - rs, err = tk.Exec("show global bindings") - c.Assert(err, IsNil) - chk = rs.NewChunk() - err = rs.Next(context.TODO(), chk) - c.Check(err, IsNil) - c.Check(chk.NumRows(), Equals, 0) + if testSQL.overlaySQL != "" { + _, err = tk.Exec("create global " + testSQL.overlaySQL) + c.Assert(err, IsNil) + } - _, err = tk.Exec("delete from mysql.bind_info") - c.Assert(err, IsNil) + pb := &dto.Metric{} + metrics.BindTotalGauge.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) + c.Assert(pb.GetGauge().GetValue(), Equals, float64(1)) + metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) + c.Assert(pb.GetGauge().GetValue(), Equals, testSQL.memoryUsage) + + sql, hash := parser.NormalizeDigest(testSQL.querySQL) + + bindData := s.domain.BindHandle().GetBindRecord(hash, sql, "test") + c.Check(bindData, NotNil) + c.Check(bindData.OriginalSQL, Equals, testSQL.originSQL) + bind := bindData.Bindings[0] + c.Check(bind.BindSQL, Equals, testSQL.bindSQL) + c.Check(bindData.Db, Equals, "test") + c.Check(bind.Status, Equals, "using") + c.Check(bind.Charset, NotNil) + c.Check(bind.Collation, NotNil) + c.Check(bind.CreateTime, NotNil) + c.Check(bind.UpdateTime, NotNil) + + rs, err := tk.Exec("show global bindings") + c.Assert(err, IsNil) + chk := rs.NewChunk() + err = rs.Next(context.TODO(), chk) + c.Check(err, IsNil) + c.Check(chk.NumRows(), Equals, 1) + row := chk.GetRow(0) + c.Check(row.GetString(0), Equals, testSQL.originSQL) + c.Check(row.GetString(1), Equals, testSQL.bindSQL) + c.Check(row.GetString(2), Equals, "test") + c.Check(row.GetString(3), Equals, "using") + c.Check(row.GetTime(4), NotNil) + c.Check(row.GetTime(5), NotNil) + c.Check(row.GetString(6), NotNil) + c.Check(row.GetString(7), NotNil) + + bindHandle := bindinfo.NewBindHandle(tk.Se) + err = bindHandle.Update(true) + c.Check(err, IsNil) + c.Check(bindHandle.Size(), Equals, 1) + + bindData = bindHandle.GetBindRecord(hash, sql, "test") + c.Check(bindData, NotNil) + c.Check(bindData.OriginalSQL, Equals, testSQL.originSQL) + bind = bindData.Bindings[0] + c.Check(bind.BindSQL, Equals, testSQL.bindSQL) + c.Check(bindData.Db, Equals, "test") + c.Check(bind.Status, Equals, "using") + c.Check(bind.Charset, NotNil) + c.Check(bind.Collation, NotNil) + c.Check(bind.CreateTime, NotNil) + c.Check(bind.UpdateTime, NotNil) + + _, err = tk.Exec("drop global " + testSQL.dropSQL) + c.Check(err, IsNil) + bindData = s.domain.BindHandle().GetBindRecord(hash, sql, "test") + c.Check(bindData, IsNil) + + metrics.BindTotalGauge.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) + c.Assert(pb.GetGauge().GetValue(), Equals, float64(0)) + metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) + // From newly created global bind handle. + c.Assert(pb.GetGauge().GetValue(), Equals, testSQL.memoryUsage) + + bindHandle = bindinfo.NewBindHandle(tk.Se) + err = bindHandle.Update(true) + c.Check(err, IsNil) + c.Check(bindHandle.Size(), Equals, 0) + + bindData = bindHandle.GetBindRecord(hash, sql, "test") + c.Check(bindData, IsNil) + + rs, err = tk.Exec("show global bindings") + c.Assert(err, IsNil) + chk = rs.NewChunk() + err = rs.Next(context.TODO(), chk) + c.Check(err, IsNil) + c.Check(chk.NumRows(), Equals, 0) - _, err = tk.Exec("create global binding for select * from t using select * from t1 use index for join(index_t)") - c.Assert(err, NotNil, Commentf("err %v", err)) + _, err = tk.Exec("delete from mysql.bind_info") + c.Assert(err, IsNil) + } } func (s *testSuite) TestSessionBinding(c *C) { tk := testkit.NewTestKit(c, s.store) - s.cleanBindingEnv(tk) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t(i int, s varchar(20))") - tk.MustExec("create table t1(i int, s varchar(20))") - tk.MustExec("create index index_t on t(i,s)") - metrics.BindTotalGauge.Reset() - metrics.BindMemoryUsage.Reset() + for _, testSQL := range testSQLs { + s.cleanBindingEnv(tk) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t(i int, s varchar(20))") + tk.MustExec("create table t1(i int, s varchar(20))") + tk.MustExec("create index index_t on t(i,s)") - _, err := tk.Exec("create session binding for select * from t where i>100 using select * from t use index(index_t) where i>100") - c.Assert(err, IsNil, Commentf("err %v", err)) - - _, err = tk.Exec("create session binding for select * from t where i>99 using select * from t use index(index_t) where i>99") - c.Assert(err, IsNil) + metrics.BindTotalGauge.Reset() + metrics.BindMemoryUsage.Reset() - pb := &dto.Metric{} - metrics.BindTotalGauge.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) - c.Assert(pb.GetGauge().GetValue(), Equals, float64(1)) - metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) - c.Assert(pb.GetGauge().GetValue(), Equals, float64(97)) - - handle := tk.Se.Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) - bindData := handle.GetBindRecord("select * from t where i > ?", "test") - c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where i > ?") - bind := bindData.Bindings[0] - c.Check(bind.BindSQL, Equals, "select * from t use index(index_t) where i>99") - c.Check(bindData.Db, Equals, "test") - c.Check(bind.Status, Equals, "using") - c.Check(bind.Charset, NotNil) - c.Check(bind.Collation, NotNil) - c.Check(bind.CreateTime, NotNil) - c.Check(bind.UpdateTime, NotNil) + _, err := tk.Exec("create session " + testSQL.createSQL) + c.Assert(err, IsNil, Commentf("err %v", err)) - rs, err := tk.Exec("show global bindings") - c.Assert(err, IsNil) - chk := rs.NewChunk() - err = rs.Next(context.TODO(), chk) - c.Check(err, IsNil) - c.Check(chk.NumRows(), Equals, 0) + if testSQL.overlaySQL != "" { + _, err = tk.Exec("create session " + testSQL.overlaySQL) + c.Assert(err, IsNil) + } - rs, err = tk.Exec("show session bindings") - c.Assert(err, IsNil) - chk = rs.NewChunk() - err = rs.Next(context.TODO(), chk) - c.Check(err, IsNil) - c.Check(chk.NumRows(), Equals, 1) - row := chk.GetRow(0) - c.Check(row.GetString(0), Equals, "select * from t where i > ?") - c.Check(row.GetString(1), Equals, "select * from t use index(index_t) where i>99") - c.Check(row.GetString(2), Equals, "test") - c.Check(row.GetString(3), Equals, "using") - c.Check(row.GetTime(4), NotNil) - c.Check(row.GetTime(5), NotNil) - c.Check(row.GetString(6), NotNil) - c.Check(row.GetString(7), NotNil) - - _, err = tk.Exec("drop session binding for select * from t where i>99") - c.Assert(err, IsNil) - bindData = handle.GetBindRecord("select * from t where i > ?", "test") - c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where i > ?") - c.Check(len(bindData.Bindings), Equals, 0) + pb := &dto.Metric{} + metrics.BindTotalGauge.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) + c.Assert(pb.GetGauge().GetValue(), Equals, float64(1)) + metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) + c.Assert(pb.GetGauge().GetValue(), Equals, testSQL.memoryUsage) + + handle := tk.Se.Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) + bindData := handle.GetBindRecord(testSQL.originSQL, "test") + c.Check(bindData, NotNil) + c.Check(bindData.OriginalSQL, Equals, testSQL.originSQL) + bind := bindData.Bindings[0] + c.Check(bind.BindSQL, Equals, testSQL.bindSQL) + c.Check(bindData.Db, Equals, "test") + c.Check(bind.Status, Equals, "using") + c.Check(bind.Charset, NotNil) + c.Check(bind.Collation, NotNil) + c.Check(bind.CreateTime, NotNil) + c.Check(bind.UpdateTime, NotNil) + + rs, err := tk.Exec("show global bindings") + c.Assert(err, IsNil) + chk := rs.NewChunk() + err = rs.Next(context.TODO(), chk) + c.Check(err, IsNil) + c.Check(chk.NumRows(), Equals, 0) - metrics.BindTotalGauge.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) - c.Assert(pb.GetGauge().GetValue(), Equals, float64(0)) - metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) - c.Assert(pb.GetGauge().GetValue(), Equals, float64(0)) + rs, err = tk.Exec("show session bindings") + c.Assert(err, IsNil) + chk = rs.NewChunk() + err = rs.Next(context.TODO(), chk) + c.Check(err, IsNil) + c.Check(chk.NumRows(), Equals, 1) + row := chk.GetRow(0) + c.Check(row.GetString(0), Equals, testSQL.originSQL) + c.Check(row.GetString(1), Equals, testSQL.bindSQL) + c.Check(row.GetString(2), Equals, "test") + c.Check(row.GetString(3), Equals, "using") + c.Check(row.GetTime(4), NotNil) + c.Check(row.GetTime(5), NotNil) + c.Check(row.GetString(6), NotNil) + c.Check(row.GetString(7), NotNil) + + _, err = tk.Exec("drop session " + testSQL.dropSQL) + c.Assert(err, IsNil) + bindData = handle.GetBindRecord(testSQL.originSQL, "test") + c.Check(bindData, NotNil) + c.Check(bindData.OriginalSQL, Equals, testSQL.originSQL) + c.Check(len(bindData.Bindings), Equals, 0) + + metrics.BindTotalGauge.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) + c.Assert(pb.GetGauge().GetValue(), Equals, float64(0)) + metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) + c.Assert(pb.GetGauge().GetValue(), Equals, float64(0)) + } } func (s *testSuite) TestGlobalAndSessionBindingBothExist(c *C) { @@ -393,6 +472,17 @@ func (s *testSuite) TestExplain(c *C) { c.Assert(tk.HasPlan("SELECT * from t1,t2 where t1.id = t2.id", "MergeJoin"), IsTrue) tk.MustExec("drop global binding for SELECT * from t1,t2 where t1.id = t2.id") + + // Add test for SetOprStmt + tk.MustExec("create index index_id on t1(id)") + c.Assert(tk.HasPlan("SELECT * from t1 union SELECT * from t1", "IndexReader"), IsFalse) + c.Assert(tk.HasPlan("SELECT * from t1 use index(index_id) union SELECT * from t1", "IndexReader"), IsTrue) + + tk.MustExec("create global binding for SELECT * from t1 union SELECT * from t1 using SELECT * from t1 use index(index_id) union SELECT * from t1") + + c.Assert(tk.HasPlan("SELECT * from t1 union SELECT * from t1", "IndexReader"), IsTrue) + + tk.MustExec("drop global binding for SELECT * from t1 union SELECT * from t1") } // TestBindingSymbolList tests sql with "?, ?, ?, ?", fixes #13871 diff --git a/executor/compiler.go b/executor/compiler.go index 3a1b2b85ed894..49ae9e3e844da 100644 --- a/executor/compiler.go +++ b/executor/compiler.go @@ -218,16 +218,16 @@ func getStmtDbLabel(stmtNode ast.StmtNode) map[string]struct{} { } } case *ast.CreateBindingStmt: - if x.OriginSel != nil { - originSelect := x.OriginSel.(*ast.SelectStmt) + if x.OriginNode != nil { + originSelect := x.OriginNode.(*ast.SelectStmt) dbLabels := getDbFromResultNode(originSelect.From.TableRefs) for _, db := range dbLabels { dbLabelSet[db] = struct{}{} } } - if len(dbLabelSet) == 0 && x.HintedSel != nil { - hintedSelect := x.HintedSel.(*ast.SelectStmt) + if len(dbLabelSet) == 0 && x.HintedNode != nil { + hintedSelect := x.HintedNode.(*ast.SelectStmt) dbLabels := getDbFromResultNode(hintedSelect.From.TableRefs) for _, db := range dbLabels { dbLabelSet[db] = struct{}{} diff --git a/go.mod b/go.mod index 96035958f5abf..d8baecbe2f4d2 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 github.com/pingcap/kvproto v0.0.0-20200828054126-d677e6fd224a github.com/pingcap/log v0.0.0-20200828042413-fce0951f1463 - github.com/pingcap/parser v0.0.0-20200921041333-cd2542b7a8a2 + github.com/pingcap/parser v0.0.0-20200924053142-5d7e8ebf605e github.com/pingcap/sysutil v0.0.0-20200715082929-4c47bcac246a github.com/pingcap/tidb-tools v4.0.5-0.20200820092506-34ea90c93237+incompatible github.com/pingcap/tipb v0.0.0-20200618092958-4fad48b4c8c3 diff --git a/go.sum b/go.sum index 0c3847b196a5f..1a13096c1705e 100644 --- a/go.sum +++ b/go.sum @@ -507,8 +507,8 @@ github.com/pingcap/parser v0.0.0-20200730092557-34a468e9b774/go.mod h1:vQdbJqobJ github.com/pingcap/parser v0.0.0-20200731033026-84f62115187c/go.mod h1:vQdbJqobJAgFyiRNNtXahpMoGWwPEuWciVEK5A20NS0= github.com/pingcap/parser v0.0.0-20200813083329-a4bff035d3e2/go.mod h1:vQdbJqobJAgFyiRNNtXahpMoGWwPEuWciVEK5A20NS0= github.com/pingcap/parser v0.0.0-20200821073936-cf85e80665c4/go.mod h1:vQdbJqobJAgFyiRNNtXahpMoGWwPEuWciVEK5A20NS0= -github.com/pingcap/parser v0.0.0-20200921041333-cd2542b7a8a2 h1:LsLCF+s7FNV009UqJfp/wEU6CYHLXluhoa2/3F5X5/M= -github.com/pingcap/parser v0.0.0-20200921041333-cd2542b7a8a2/go.mod h1:RlLfMRJwFBSiXd2lUaWdV5pSXtrpyvZM8k5bbZWsheU= +github.com/pingcap/parser v0.0.0-20200924053142-5d7e8ebf605e h1:IFD2pEbIcN+EzG/RGMLrv/Tt6U9KzJGT6hSbGkQ1v7c= +github.com/pingcap/parser v0.0.0-20200924053142-5d7e8ebf605e/go.mod h1:RlLfMRJwFBSiXd2lUaWdV5pSXtrpyvZM8k5bbZWsheU= github.com/pingcap/pd/v4 v4.0.0-rc.1.0.20200422143320-428acd53eba2/go.mod h1:s+utZtXDznOiL24VK0qGmtoHjjXNsscJx3m1n8cC56s= github.com/pingcap/pd/v4 v4.0.0-rc.2.0.20200520083007-2c251bd8f181/go.mod h1:q4HTx/bA8aKBa4S7L+SQKHvjRPXCRV0tA0yRw0qkZSA= github.com/pingcap/pd/v4 v4.0.0-rc.2.0.20200714122454-1a64f969cb3c/go.mod h1:v/dY4mVkt3dh/Liphhk0E4ScOkZpIk0m0GvWJ9FapDs= diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index bd1da15fa66e0..1c7ea131d2c8b 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -723,12 +723,12 @@ func (b *PlanBuilder) buildSet(ctx context.Context, v *ast.SetStmt) (Plan, error func (b *PlanBuilder) buildDropBindPlan(v *ast.DropBindingStmt) (Plan, error) { p := &SQLBindPlan{ SQLBindOp: OpSQLBindDrop, - NormdOrigSQL: parser.Normalize(v.OriginSel.Text()), + NormdOrigSQL: parser.Normalize(v.OriginNode.Text()), IsGlobal: v.GlobalScope, - Db: utilparser.GetDefaultDB(v.OriginSel, b.ctx.GetSessionVars().CurrentDB), + Db: utilparser.GetDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB), } - if v.HintedSel != nil { - p.BindSQL = v.HintedSel.Text() + if v.HintedNode != nil { + p.BindSQL = v.HintedNode.Text() } b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SuperPriv, "", "", "", nil) return p, nil @@ -738,11 +738,11 @@ func (b *PlanBuilder) buildCreateBindPlan(v *ast.CreateBindingStmt) (Plan, error charSet, collation := b.ctx.GetSessionVars().GetCharsetInfo() p := &SQLBindPlan{ SQLBindOp: OpSQLBindCreate, - NormdOrigSQL: parser.Normalize(v.OriginSel.Text()), - BindSQL: v.HintedSel.Text(), + NormdOrigSQL: parser.Normalize(v.OriginNode.Text()), + BindSQL: v.HintedNode.Text(), IsGlobal: v.GlobalScope, - BindStmt: v.HintedSel, - Db: utilparser.GetDefaultDB(v.OriginSel, b.ctx.GetSessionVars().CurrentDB), + BindStmt: v.HintedNode, + Db: utilparser.GetDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB), Charset: charSet, Collation: collation, } diff --git a/planner/core/preprocess.go b/planner/core/preprocess.go index 57bc27c4cc916..a8b4d1d47a5b1 100644 --- a/planner/core/preprocess.go +++ b/planner/core/preprocess.go @@ -154,15 +154,15 @@ func (p *preprocessor) Enter(in ast.Node) (out ast.Node, skipChildren bool) { case *ast.Join: p.checkNonUniqTableAlias(node) case *ast.CreateBindingStmt: - EraseLastSemicolon(node.OriginSel) - EraseLastSemicolon(node.HintedSel) - p.checkBindGrammar(node.OriginSel, node.HintedSel) + EraseLastSemicolon(node.OriginNode) + EraseLastSemicolon(node.HintedNode) + p.checkBindGrammar(node.OriginNode, node.HintedNode) return in, true case *ast.DropBindingStmt: - EraseLastSemicolon(node.OriginSel) - if node.HintedSel != nil { - EraseLastSemicolon(node.HintedSel) - p.checkBindGrammar(node.OriginSel, node.HintedSel) + EraseLastSemicolon(node.OriginNode) + if node.HintedNode != nil { + EraseLastSemicolon(node.HintedNode) + p.checkBindGrammar(node.OriginNode, node.HintedNode) } return in, true case *ast.RecoverTableStmt, *ast.FlashBackTableStmt: @@ -204,10 +204,18 @@ func EraseLastSemicolon(stmt ast.StmtNode) { } } -func (p *preprocessor) checkBindGrammar(originSel, hintedSel ast.StmtNode) { - originSQL := parser.Normalize(originSel.(*ast.SelectStmt).Text()) - hintedSQL := parser.Normalize(hintedSel.(*ast.SelectStmt).Text()) - +func (p *preprocessor) checkBindGrammar(originNode, hintedNode ast.StmtNode) { + var originSQL, hintedSQL string + switch node := originNode.(type) { + case *ast.SelectStmt: + originSQL = parser.Normalize(node.Text()) + hintedSQL = parser.Normalize(hintedNode.(*ast.SelectStmt).Text()) + case *ast.SetOprStmt: + originSQL = parser.Normalize(node.Text()) + hintedSQL = parser.Normalize(hintedNode.(*ast.SetOprStmt).Text()) + default: + p.err = errors.Errorf("create binding doesn't support this type of query") + } if originSQL != hintedSQL { p.err = errors.Errorf("hinted sql and origin sql don't match when hinted sql erase the hint info, after erase hint info, originSQL:%s, hintedSQL:%s", originSQL, hintedSQL) } diff --git a/planner/optimize.go b/planner/optimize.go index ea54de0927030..18f6dca5fb174 100644 --- a/planner/optimize.go +++ b/planner/optimize.go @@ -259,7 +259,7 @@ func optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in return finalPlan, names, cost, err } -func extractSelectAndNormalizeDigest(stmtNode ast.StmtNode) (*ast.SelectStmt, string, string) { +func extractSelectAndNormalizeDigest(stmtNode ast.StmtNode) (ast.StmtNode, string, string) { switch x := stmtNode.(type) { case *ast.ExplainStmt: switch x.Stmt.(type) { @@ -269,9 +269,20 @@ func extractSelectAndNormalizeDigest(stmtNode ast.StmtNode) (*ast.SelectStmt, st idx := strings.Index(normalizeExplainSQL, "select") normalizeSQL := normalizeExplainSQL[idx:] hash := parser.DigestNormalized(normalizeSQL) - return x.Stmt.(*ast.SelectStmt), normalizeSQL, hash + return x.Stmt, normalizeSQL, hash + case *ast.SetOprStmt: + plannercore.EraseLastSemicolon(x) + normalizeExplainSQL := parser.Normalize(x.Text()) + idx := strings.Index(normalizeExplainSQL, "select") + parenthesesIdx := strings.Index(normalizeExplainSQL, "(") + if parenthesesIdx != -1 && parenthesesIdx < idx { + idx = parenthesesIdx + } + normalizeSQL := normalizeExplainSQL[idx:] + hash := parser.DigestNormalized(normalizeSQL) + return x.Stmt, normalizeSQL, hash } - case *ast.SelectStmt: + case *ast.SelectStmt, *ast.SetOprStmt: plannercore.EraseLastSemicolon(x) normalizedSQL, hash := parser.NormalizeDigest(x.Text()) return x, normalizedSQL, hash @@ -284,8 +295,8 @@ func getBindRecord(ctx sessionctx.Context, stmt ast.StmtNode) (*bindinfo.BindRec if ctx.Value(bindinfo.SessionBindInfoKeyType) == nil { return nil, "" } - selectStmt, normalizedSQL, hash := extractSelectAndNormalizeDigest(stmt) - if selectStmt == nil { + stmtNode, normalizedSQL, hash := extractSelectAndNormalizeDigest(stmt) + if stmtNode == nil { return nil, "" } sessionHandle := ctx.Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) From 486e473a86e907c69bdc012351bb6e850489f91c Mon Sep 17 00:00:00 2001 From: Kenan Yao Date: Sun, 27 Sep 2020 14:56:02 +0800 Subject: [PATCH 36/60] session: fix panic when storing outdated plans from plan cache (#19296) --- executor/explainfor_test.go | 32 ++++++++++++++++++++++++++++++++ session/session.go | 1 + 2 files changed, 33 insertions(+) diff --git a/executor/explainfor_test.go b/executor/explainfor_test.go index c370f53a4066e..e903e11ee0bdb 100644 --- a/executor/explainfor_test.go +++ b/executor/explainfor_test.go @@ -233,6 +233,38 @@ func (s *testPrepareSerialSuite) TestExplainForConnPlanCache(c *C) { wg.Wait() } +func (s *testPrepareSerialSuite) TestSavedPlanPanicPlanCache(c *C) { + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + var err error + tk := testkit.NewTestKit(c, s.store) + tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, c int generated always as (a+b) stored)") + tk.MustExec("insert into t(a,b) values(1,1)") + tk.MustExec("begin") + tk.MustExec("update t set b = 2 where a = 1") + tk.MustExec("prepare stmt from 'select b from t where a > ?'") + tk.MustExec("set @p = 0") + tk.MustQuery("execute stmt using @p").Check(testkit.Rows( + "2", + )) + tk.MustExec("set @p = 1") + tk.MustQuery("execute stmt using @p").Check(testkit.Rows()) + err = tk.ExecToErr("insert into t(a,b,c) values(3,3,3)") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[planner:3105]The value specified for generated column 'c' in table 't' is not allowed.") +} + func (s *testPrepareSerialSuite) TestExplainDotForExplainPlan(c *C) { tk := testkit.NewTestKit(c, s.store) diff --git a/session/session.go b/session/session.go index 626ea0ea2cb8f..1f3bd88b57d78 100644 --- a/session/session.go +++ b/session/session.go @@ -1052,6 +1052,7 @@ func (s *session) SetProcessInfo(sql string, t time.Time, command byte, maxExecu MaxExecutionTime: maxExecutionTime, } _, pi.Digest = s.sessionVars.StmtCtx.SQLDigest() + s.currentPlan = nil if s.sessionVars.User != nil { pi.User = s.sessionVars.User.Username pi.Host = s.sessionVars.User.Hostname From f1f72d5001156693021872f267a745dcb2dc78a4 Mon Sep 17 00:00:00 2001 From: you06 Date: Sun, 27 Sep 2020 15:29:38 +0800 Subject: [PATCH 37/60] store/tikv: add sanity check for snapshot version and forUpdateTS (#20159) Signed-off-by: you06 --- store/tikv/commit.go | 8 ++++++++ store/tikv/snapshot.go | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/store/tikv/commit.go b/store/tikv/commit.go index 6337c42b8c4a7..9a4d28f30a8aa 100644 --- a/store/tikv/commit.go +++ b/store/tikv/commit.go @@ -91,6 +91,14 @@ func (actionCommit) handleSingleBatch(c *twoPhaseCommitter, bo *Backoffer, batch zap.Uint64("txnStartTS", c.startTS), zap.Stringer("info", logutil.Hex(rejected))) + // Do not retry for a txn which has a too large MinCommitTs + // 3600000 << 18 = 943718400000 + if rejected.MinCommitTs-rejected.AttemptedCommitTs > 943718400000 { + err := errors.Errorf("2PC MinCommitTS is too large, we got MinCommitTS: %d, and AttemptedCommitTS: %d", + rejected.MinCommitTs, rejected.AttemptedCommitTs) + return errors.Trace(err) + } + // Update commit ts and retry. commitTS, err := c.store.getTimestampWithRetry(bo) if err != nil { diff --git a/store/tikv/snapshot.go b/store/tikv/snapshot.go index c0ab5cb6ffaf9..4c895e1c6e9d2 100644 --- a/store/tikv/snapshot.go +++ b/store/tikv/snapshot.go @@ -18,6 +18,7 @@ import ( "context" "encoding/json" "fmt" + "math" "strings" "sync" "sync/atomic" @@ -83,6 +84,11 @@ type tikvSnapshot struct { // newTiKVSnapshot creates a snapshot of an TiKV store. func newTiKVSnapshot(store *tikvStore, ver kv.Version, replicaReadSeed uint32) *tikvSnapshot { + // Sanity check for snapshot version. + if ver.Ver >= math.MaxInt64 && ver.Ver != math.MaxUint64 { + err := errors.Errorf("try to get snapshot with a large ts %d", ver.Ver) + panic(err) + } return &tikvSnapshot{ store: store, version: ver, @@ -96,6 +102,11 @@ func newTiKVSnapshot(store *tikvStore, ver kv.Version, replicaReadSeed uint32) * } func (s *tikvSnapshot) setSnapshotTS(ts uint64) { + // Sanity check for snapshot version. + if ts >= math.MaxInt64 && ts != math.MaxUint64 { + err := errors.Errorf("try to get snapshot with a large ts %d", ts) + panic(err) + } // Invalidate cache if the snapshotTS change! s.version.Ver = ts s.mu.Lock() From 1047fd7671935a3c9e357f936e81441f050ed81a Mon Sep 17 00:00:00 2001 From: Zhou Kunqin <25057648+time-and-fate@users.noreply.github.com> Date: Sun, 27 Sep 2020 17:37:36 +0800 Subject: [PATCH 38/60] planner: fix wrong message when `group by` a window or agg func with an `as` (#17572) --- planner/core/logical_plan_builder.go | 12 ++++++------ planner/core/logical_plan_test.go | 4 +++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 30f4ec7d6fd28..0b2d79840e2f9 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -1967,12 +1967,12 @@ func (g *gbyResolver) Leave(inNode ast.Node) (ast.Node, bool) { } ret := g.fields[pos-1].Expr ret.Accept(extractor) - if len(extractor.AggFuncs) != 0 { - g.err = ErrWrongGroupField.GenWithStackByArgs(g.fields[pos-1].Text()) - return inNode, false - } - if _, ok := ret.(*ast.WindowFuncExpr); ok { - g.err = ErrWrongGroupField.GenWithStackByArgs(g.fields[pos-1].Text()) + if len(extractor.AggFuncs) != 0 || ast.HasWindowFlag(ret) { + fieldName := g.fields[pos-1].AsName.String() + if fieldName == "" { + fieldName = g.fields[pos-1].Text() + } + g.err = ErrWrongGroupField.GenWithStackByArgs(fieldName) return inNode, false } return ret, true diff --git a/planner/core/logical_plan_test.go b/planner/core/logical_plan_test.go index 45347cc7a40fc..ce26c680af33f 100644 --- a/planner/core/logical_plan_test.go +++ b/planner/core/logical_plan_test.go @@ -1238,8 +1238,10 @@ func (s *testPlanSuite) TestNameResolver(c *C) { {"delete a from (select * from t ) as a, t", "[planner:1288]The target table a of the DELETE is not updatable"}, {"delete b from (select * from t ) as a, t", "[planner:1109]Unknown table 'b' in MULTI DELETE"}, {"select '' as fakeCol from t group by values(fakeCol)", "[planner:1054]Unknown column '' in 'VALUES() function'"}, - {"update t, (select * from ht) as b set b.a = t.a", "[planner:1288]The target table b of the UPDATE is not updatable"}, + {"update t, (select * from t) as b set b.a = t.a", "[planner:1288]The target table b of the UPDATE is not updatable"}, {"select row_number() over () from t group by 1", "[planner:1056]Can't group on 'row_number() over ()'"}, + {"select row_number() over () as x from t group by 1", "[planner:1056]Can't group on 'x'"}, + {"select sum(a) as x from t group by 1", "[planner:1056]Can't group on 'x'"}, } ctx := context.Background() From 421e87c5f158b4ba3bb82aee68898853ea273684 Mon Sep 17 00:00:00 2001 From: Zhou Kunqin <25057648+time-and-fate@users.noreply.github.com> Date: Sun, 27 Sep 2020 18:06:36 +0800 Subject: [PATCH 39/60] planner: improve index merge row count estimation (#19040) --- cmd/explaintest/r/explain_indexmerge.result | 17 +++++++---- cmd/explaintest/t/explain_indexmerge.test | 1 + planner/core/find_best_task.go | 28 +++++++++---------- planner/core/stats.go | 8 ++++-- .../core/testdata/integration_suite_out.json | 16 +++++------ planner/util/path.go | 1 + 6 files changed, 42 insertions(+), 29 deletions(-) diff --git a/cmd/explaintest/r/explain_indexmerge.result b/cmd/explaintest/r/explain_indexmerge.result index a7728759f5d11..ef7f6cdf80088 100644 --- a/cmd/explaintest/r/explain_indexmerge.result +++ b/cmd/explaintest/r/explain_indexmerge.result @@ -97,19 +97,26 @@ label = "cop" } set session tidb_enable_index_merge = off; +explain select /*+ use_index_merge(t, primary, tb, tc) */ * from t where a <= 500000 or b <= 1000000 or c <= 3000000; +id estRows task access object operator info +IndexMerge_9 3560000.00 root +├─TableRangeScan_5(Build) 500000.00 cop[tikv] table:t range:[-inf,500000], keep order:false +├─IndexRangeScan_6(Build) 1000000.00 cop[tikv] table:t, index:tb(b) range:[-inf,1000000], keep order:false +├─IndexRangeScan_7(Build) 3000000.00 cop[tikv] table:t, index:tc(c) range:[-inf,3000000], keep order:false +└─TableRowIDScan_8(Probe) 3560000.00 cop[tikv] table:t keep order:false explain select /*+ use_index_merge(t, tb, tc) */ * from t where b < 50 or c < 5000000; id estRows task access object operator info -IndexMerge_8 5000000.00 root +IndexMerge_8 4999999.00 root ├─IndexRangeScan_5(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false ├─IndexRangeScan_6(Build) 4999999.00 cop[tikv] table:t, index:tc(c) range:[-inf,5000000), keep order:false -└─TableRowIDScan_7(Probe) 5000000.00 cop[tikv] table:t keep order:false +└─TableRowIDScan_7(Probe) 4999999.00 cop[tikv] table:t keep order:false explain select /*+ use_index_merge(t, tb, tc) */ * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) and f < 10; id estRows task access object operator info IndexMerge_9 0.00 root ├─IndexRangeScan_5(Build) 9999.00 cop[tikv] table:t, index:tb(b) range:[-inf,10000), keep order:false ├─IndexRangeScan_6(Build) 9999.00 cop[tikv] table:t, index:tc(c) range:[-inf,10000), keep order:false └─Selection_8(Probe) 0.00 cop[tikv] lt(test.t.f, 10), or(lt(test.t.a, 10), lt(test.t.d, 10)) - └─TableRowIDScan_7 19998.00 cop[tikv] table:t keep order:false + └─TableRowIDScan_7 19978.00 cop[tikv] table:t keep order:false explain select /*+ use_index_merge(t, tb) */ * from t where b < 50 or c < 5000000; id estRows task access object operator info TableReader_7 4999999.00 root data:Selection_6 @@ -122,7 +129,7 @@ TableReader_7 4999999.00 root data:Selection_6 └─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false explain select /*+ use_index_merge(t, primary, tb) */ * from t where a < 50 or b < 5000000; id estRows task access object operator info -IndexMerge_8 5000000.00 root +IndexMerge_8 4999999.00 root ├─TableRangeScan_5(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false ├─IndexRangeScan_6(Build) 4999999.00 cop[tikv] table:t, index:tb(b) range:[-inf,5000000), keep order:false -└─TableRowIDScan_7(Probe) 5000000.00 cop[tikv] table:t keep order:false +└─TableRowIDScan_7(Probe) 4999999.00 cop[tikv] table:t keep order:false diff --git a/cmd/explaintest/t/explain_indexmerge.test b/cmd/explaintest/t/explain_indexmerge.test index 8a7089936f0fe..372d23b5c1392 100644 --- a/cmd/explaintest/t/explain_indexmerge.test +++ b/cmd/explaintest/t/explain_indexmerge.test @@ -20,6 +20,7 @@ explain select * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) an explain format="dot" select * from t where (a < 50 or b < 50) and f > 100; set session tidb_enable_index_merge = off; # be forced to use IndexMerge +explain select /*+ use_index_merge(t, primary, tb, tc) */ * from t where a <= 500000 or b <= 1000000 or c <= 3000000; explain select /*+ use_index_merge(t, tb, tc) */ * from t where b < 50 or c < 5000000; explain select /*+ use_index_merge(t, tb, tc) */ * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) and f < 10; explain select /*+ use_index_merge(t, tb) */ * from t where b < 50 or c < 5000000; diff --git a/planner/core/find_best_task.go b/planner/core/find_best_task.go index 2cb6483328955..ec5e5192cfbfd 100644 --- a/planner/core/find_best_task.go +++ b/planner/core/find_best_task.go @@ -767,7 +767,7 @@ func (ds *DataSource) convertToIndexMergeScan(prop *property.PhysicalProperty, c return invalidTask, nil } path := candidate.path - var totalCost, totalRowCount float64 + var totalCost float64 scans := make([]PhysicalPlan, 0, len(path.PartialIndexPaths)) cop := &copTask{ indexPlanFinished: true, @@ -781,17 +781,19 @@ func (ds *DataSource) convertToIndexMergeScan(prop *property.PhysicalProperty, c } for _, partPath := range path.PartialIndexPaths { var scan PhysicalPlan - var partialCost, rowCount float64 + var partialCost float64 if partPath.IsTablePath() { - scan, partialCost, rowCount = ds.convertToPartialTableScan(prop, partPath) + scan, partialCost = ds.convertToPartialTableScan(prop, partPath) } else { - scan, partialCost, rowCount = ds.convertToPartialIndexScan(prop, partPath) + scan, partialCost = ds.convertToPartialIndexScan(prop, partPath) } scans = append(scans, scan) totalCost += partialCost - totalRowCount += rowCount } - + totalRowCount := path.CountAfterAccess + if prop.ExpectedCnt < ds.stats.RowCount { + totalRowCount *= prop.ExpectedCnt / ds.stats.RowCount + } ts, partialCost, err := ds.buildIndexMergeTableScan(prop, path.TableFilters, totalRowCount) if err != nil { return nil, err @@ -806,8 +808,7 @@ func (ds *DataSource) convertToIndexMergeScan(prop *property.PhysicalProperty, c func (ds *DataSource) convertToPartialIndexScan(prop *property.PhysicalProperty, path *util.AccessPath) ( indexPlan PhysicalPlan, - partialCost float64, - rowCount float64) { + partialCost float64) { idx := path.Index is, partialCost, rowCount := ds.getOriginalPhysicalIndexScan(prop, path, false, false) rowSize := is.indexScanRowSize(idx, ds, false) @@ -829,17 +830,16 @@ func (ds *DataSource) convertToPartialIndexScan(prop *property.PhysicalProperty, indexPlan := PhysicalSelection{Conditions: indexConds}.Init(is.ctx, stats, ds.blockOffset) indexPlan.SetChildren(is) partialCost += rowCount * rowSize * sessVars.NetworkFactor - return indexPlan, partialCost, rowCount + return indexPlan, partialCost } partialCost += rowCount * rowSize * sessVars.NetworkFactor indexPlan = is - return indexPlan, partialCost, rowCount + return indexPlan, partialCost } func (ds *DataSource) convertToPartialTableScan(prop *property.PhysicalProperty, path *util.AccessPath) ( tablePlan PhysicalPlan, - partialCost float64, - rowCount float64) { + partialCost float64) { ts, partialCost, rowCount := ds.getOriginalPhysicalTableScan(prop, path, false) rowSize := ds.TblColHists.GetAvgRowSize(ds.ctx, ds.TblCols, false, false) sessVars := ds.ctx.GetSessionVars() @@ -853,11 +853,11 @@ func (ds *DataSource) convertToPartialTableScan(prop *property.PhysicalProperty, tablePlan.SetChildren(ts) partialCost += rowCount * sessVars.CopCPUFactor partialCost += selectivity * rowCount * rowSize * sessVars.NetworkFactor - return tablePlan, partialCost, rowCount + return tablePlan, partialCost } partialCost += rowCount * rowSize * sessVars.NetworkFactor tablePlan = ts - return tablePlan, partialCost, rowCount + return tablePlan, partialCost } func (ds *DataSource) buildIndexMergeTableScan(prop *property.PhysicalProperty, tableFilters []expression.Expression, totalRowCount float64) (PhysicalPlan, float64, error) { diff --git a/planner/core/stats.go b/planner/core/stats.go index 02fdee518b2bb..e33a87bf41291 100644 --- a/planner/core/stats.go +++ b/planner/core/stats.go @@ -419,9 +419,13 @@ func (ds *DataSource) generateIndexMergeOrPaths() { } if len(partialPaths) > 1 { possiblePath := ds.buildIndexMergeOrPath(partialPaths, i) - if possiblePath != nil { - ds.possibleAccessPaths = append(ds.possibleAccessPaths, possiblePath) + sel, _, err := ds.tableStats.HistColl.Selectivity(ds.ctx, []expression.Expression{sf}, nil) + if err != nil { + logutil.BgLogger().Debug("something wrong happened, use the default selectivity", zap.Error(err)) + sel = SelectionFactor } + possiblePath.CountAfterAccess = sel * ds.tableStats.RowCount + ds.possibleAccessPaths = append(ds.possibleAccessPaths, possiblePath) } } } diff --git a/planner/core/testdata/integration_suite_out.json b/planner/core/testdata/integration_suite_out.json index ef5c8c7c0a16c..fcbd1959212e1 100644 --- a/planner/core/testdata/integration_suite_out.json +++ b/planner/core/testdata/integration_suite_out.json @@ -769,10 +769,10 @@ "SQL": "select /*+ use_index_merge(t partition(p0)) */ * from t where t.b = 1 or t.c = \"8\"", "Plan": [ "PartitionUnion_9 59.97 root ", - "├─IndexMerge_13 20.00 root ", + "├─IndexMerge_13 19.99 root ", "│ ├─IndexRangeScan_10(Build) 10.00 cop[tikv] table:t, partition:p0, index:b(b) range:[1,1], keep order:false, stats:pseudo", "│ ├─IndexRangeScan_11(Build) 10.00 cop[tikv] table:t, partition:p0, index:c(c) range:[\"8\",\"8\"], keep order:false, stats:pseudo", - "│ └─TableRowIDScan_12(Probe) 20.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", + "│ └─TableRowIDScan_12(Probe) 19.99 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", "├─TableReader_19 19.99 root data:Selection_18", "│ └─Selection_18 19.99 cop[tiflash] or(eq(test.t.b, 1), eq(test.t.c, \"8\"))", "│ └─TableFullScan_17 10000.00 cop[tiflash] table:t, partition:p1 keep order:false, stats:pseudo", @@ -949,10 +949,10 @@ { "SQL": "select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a = 1 and t1.b = '111' or t1.c = 3.3", "Plan": [ - "IndexMerge_8 2.00 root ", + "IndexMerge_8 1.67 root ", "├─TableRangeScan_5(Build) 1.00 cop[tikv] table:t1 range:[1 \"111\",1 \"111\"], keep order:false", "├─IndexRangeScan_6(Build) 1.00 cop[tikv] table:t1, index:c(c) range:[3.3000000000,3.3000000000], keep order:false", - "└─TableRowIDScan_7(Probe) 2.00 cop[tikv] table:t1 keep order:false" + "└─TableRowIDScan_7(Probe) 1.67 cop[tikv] table:t1 keep order:false" ], "Res": [ "1 111 1.1000000000 11", @@ -1162,20 +1162,20 @@ "SQL": "select * from pt where id = 4 or c < 7", "Plan": [ "Projection_4 3330.01 root test.pt.id, test.pt.c", - "└─IndexMerge_11 3333.33 root partition:all ", + "└─IndexMerge_11 3330.01 root partition:all ", " ├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:pt, index:i_id(id) range:[4,4], keep order:false, stats:pseudo", " ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:pt, index:i_c(c) range:[-inf,7), keep order:false, stats:pseudo", - " └─TableRowIDScan_10(Probe) 3333.33 cop[tikv] table:pt keep order:false, stats:pseudo" + " └─TableRowIDScan_10(Probe) 3330.01 cop[tikv] table:pt keep order:false, stats:pseudo" ] }, { "SQL": "select * from pt where id > 4 or c = 7", "Plan": [ "Projection_4 3340.00 root test.pt.id, test.pt.c", - "└─IndexMerge_11 3343.33 root partition:all ", + "└─IndexMerge_11 3340.00 root partition:all ", " ├─IndexRangeScan_8(Build) 3333.33 cop[tikv] table:pt, index:i_id(id) range:(4,+inf], keep order:false, stats:pseudo", " ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:pt, index:i_c(c) range:[7,7], keep order:false, stats:pseudo", - " └─TableRowIDScan_10(Probe) 3343.33 cop[tikv] table:pt keep order:false, stats:pseudo" + " └─TableRowIDScan_10(Probe) 3340.00 cop[tikv] table:pt keep order:false, stats:pseudo" ] } ] diff --git a/planner/util/path.go b/planner/util/path.go index eccf642677fc4..f6fa0b47e0f51 100644 --- a/planner/util/path.go +++ b/planner/util/path.go @@ -34,6 +34,7 @@ type AccessPath struct { IdxColLens []int Ranges []*ranger.Range // CountAfterAccess is the row count after we apply range seek and before we use other filter to filter data. + // For index merge path, CountAfterAccess is the row count after partial paths and before we apply table filters. CountAfterAccess float64 // CountAfterIndex is the row count after we apply filters on index and before we apply the table filters. CountAfterIndex float64 From 7e534d98ae13efc5de297c5a158285144d94cbb1 Mon Sep 17 00:00:00 2001 From: Song Gao Date: Sun, 27 Sep 2020 18:43:27 +0800 Subject: [PATCH 40/60] executor: fix unstable TestCoprocessorOOMAction (#20238) --- executor/executor_test.go | 11 +++++++---- store/tikv/coprocessor.go | 25 ++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/executor/executor_test.go b/executor/executor_test.go index 4c5745473aaef..a33b72ff75655 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -6461,21 +6461,24 @@ func (s *testSerialSuite) TestCoprocessorOOMAction(c *C) { }{ { name: "keep Order", - sql: "select * from t6 order by id", + sql: "select id from t6 order by id", }, { name: "non keep Order", - sql: "select * from t5", + sql: "select id from t5", }, } defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { conf.OOMAction = config.OOMActionCancel }) - quota := count * 15 + failpoint.Enable("github.com/pingcap/tidb/store/tikv/testRateLimitActionMockConsume", `return(true)`) + defer failpoint.Disable("github.com/pingcap/tidb/store/tikv/testRateLimitActionMockConsume") // assert oom action for _, testcase := range testcases { c.Log(testcase.name) + // larger than one copResponse, smaller than 2 copResponse + quota := 199 se, err := session.CreateSession4Test(s.store) c.Check(err, IsNil) tk.Se = se @@ -6517,7 +6520,7 @@ func (s *testSerialSuite) TestCoprocessorOOMAction(c *C) { tk.Se = se tk.MustExec("use test") tk.MustExec("set @@tidb_distsql_scan_concurrency = 30") - tk.MustExec(fmt.Sprintf("set @@tidb_mem_quota_query=%v;", quota)) + tk.MustExec("set @@tidb_mem_quota_query=1") err = tk.QueryToErr(testcase.sql) c.Assert(err, NotNil) c.Assert(err.Error(), Matches, "Out Of Memory Quota.*") diff --git a/store/tikv/coprocessor.go b/store/tikv/coprocessor.go index aca8a7b8c0c3e..c914d068fca2a 100644 --- a/store/tikv/coprocessor.go +++ b/store/tikv/coprocessor.go @@ -570,8 +570,8 @@ func (it *copIterator) open(ctx context.Context) { sendRate: it.sendRate, } taskSender.respChan = it.respChan - go taskSender.run() it.actionOnExceed.setEnabled(true) + go taskSender.run() } func (sender *copIteratorTaskSender) run() { @@ -608,7 +608,13 @@ func (it *copIterator) recvFromRespCh(ctx context.Context, respCh <-chan *copRes select { case resp, ok = <-respCh: if it.memTracker != nil && resp != nil { - it.memTracker.Consume(-resp.MemSize()) + consumed := resp.MemSize() + failpoint.Inject("testRateLimitActionMockConsume", func(val failpoint.Value) { + if val.(bool) { + consumed = 100 + } + }) + it.memTracker.Consume(-consumed) } return case <-it.finishCh: @@ -642,7 +648,13 @@ func (sender *copIteratorTaskSender) sendToTaskCh(t *copTask) (exit bool) { func (worker *copIteratorWorker) sendToRespCh(resp *copResponse, respCh chan<- *copResponse, checkOOM bool) (exit bool) { if worker.memTracker != nil && checkOOM { - worker.memTracker.Consume(resp.MemSize()) + consumed := resp.MemSize() + failpoint.Inject("testRateLimitActionMockConsume", func(val failpoint.Value) { + if val.(bool) { + consumed = 100 + } + }) + worker.memTracker.Consume(consumed) } select { case respCh <- resp: @@ -660,6 +672,13 @@ func (it *copIterator) Next(ctx context.Context) (kv.ResultSubset, error) { ok bool closed bool ) + // wait unit at least 2 copResponse received. + failpoint.Inject("testRateLimitActionMockConsume", func(val failpoint.Value) { + if val.(bool) { + for it.memTracker.MaxConsumed() < 200 { + } + } + }) // If data order matters, response should be returned in the same order as copTask slice. // Otherwise all responses are returned from a single channel. From 0017a1717e309175454ad28f54606f50181f1e25 Mon Sep 17 00:00:00 2001 From: jyz0309 <38248129+jyz0309@users.noreply.github.com> Date: Sun, 27 Sep 2020 18:48:43 +0800 Subject: [PATCH 41/60] *: fix the bug about the insertRuntimeStat.String() (#20190) Signed-off-by: jyz0309 <45495947@qq.com> --- executor/insert.go | 6 ++-- executor/insert_common.go | 65 +++++++++++++++++++++++---------------- executor/insert_test.go | 17 ++++++++++ executor/replace.go | 2 +- 4 files changed, 60 insertions(+), 30 deletions(-) diff --git a/executor/insert.go b/executor/insert.go index d1d78b6c98693..a409c03c457b8 100644 --- a/executor/insert.go +++ b/executor/insert.go @@ -103,7 +103,7 @@ func (e *InsertExec) exec(ctx context.Context, rows [][]types.Datum) error { } } if e.stats != nil { - e.stats.checkInsertTime += time.Since(start) + e.stats.CheckInsertTime += time.Since(start) } } e.memTracker.Consume(int64(txn.Size() - txnSize)) @@ -214,7 +214,7 @@ func (e *InsertExec) batchUpdateDupRows(ctx context.Context, newRows [][]types.D return err } if e.stats != nil { - e.stats.prefetch += time.Since(prefetchStart) + e.stats.Prefetch += time.Since(prefetchStart) } for i, r := range toBeCheckedRows { if r.handleKey != nil { @@ -274,7 +274,7 @@ func (e *InsertExec) batchUpdateDupRows(ctx context.Context, newRows [][]types.D } } if e.stats != nil { - e.stats.checkInsertTime += time.Since(start) + e.stats.CheckInsertTime += time.Since(start) } return nil } diff --git a/executor/insert_common.go b/executor/insert_common.go index da768cd8c532d..6e0c944172ec5 100644 --- a/executor/insert_common.go +++ b/executor/insert_common.go @@ -79,7 +79,7 @@ type InsertValues struct { lazyFillAutoID bool memTracker *memory.Tracker - stats *insertRuntimeStat + stats *InsertRuntimeStat } type defaultVal struct { @@ -937,11 +937,11 @@ func (e *InsertValues) collectRuntimeStatsEnabled() bool { if e.runtimeStats != nil { if e.stats == nil { snapshotStats := &tikv.SnapshotRuntimeStats{} - e.stats = &insertRuntimeStat{ + e.stats = &InsertRuntimeStat{ BasicRuntimeStats: e.runtimeStats, SnapshotRuntimeStats: snapshotStats, - prefetch: 0, - checkInsertTime: 0, + Prefetch: 0, + CheckInsertTime: 0, } e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } @@ -983,7 +983,7 @@ func (e *InsertValues) batchCheckAndInsert(ctx context.Context, rows [][]types.D return err } if e.stats != nil { - e.stats.prefetch += time.Since(prefetchStart) + e.stats.Prefetch += time.Since(prefetchStart) } // append warnings and get no duplicated error rows @@ -1024,7 +1024,7 @@ func (e *InsertValues) batchCheckAndInsert(ctx context.Context, rows [][]types.D } } if e.stats != nil { - e.stats.checkInsertTime += time.Since(start) + e.stats.CheckInsertTime += time.Since(start) } return nil } @@ -1053,51 +1053,56 @@ func (e *InsertValues) addRecordWithAutoIDHint(ctx context.Context, row []types. return nil } -type insertRuntimeStat struct { +// InsertRuntimeStat record the stat about insert and check +type InsertRuntimeStat struct { *execdetails.BasicRuntimeStats *tikv.SnapshotRuntimeStats - checkInsertTime time.Duration - prefetch time.Duration + CheckInsertTime time.Duration + Prefetch time.Duration } -func (e *insertRuntimeStat) String() string { - if e.checkInsertTime == 0 { +func (e *InsertRuntimeStat) String() string { + if e.CheckInsertTime == 0 { // For replace statement. - if e.prefetch > 0 && e.SnapshotRuntimeStats != nil { - return fmt.Sprintf("prefetch: %v, rpc:{%v}", e.prefetch, e.SnapshotRuntimeStats.String()) + if e.Prefetch > 0 && e.SnapshotRuntimeStats != nil { + return fmt.Sprintf("prefetch: %v, rpc:{%v}", e.Prefetch, e.SnapshotRuntimeStats.String()) } return "" } buf := bytes.NewBuffer(make([]byte, 0, 32)) - buf.WriteString(fmt.Sprintf("prepare:%v, ", time.Duration(e.BasicRuntimeStats.GetTime())-e.checkInsertTime)) - if e.prefetch > 0 { - buf.WriteString(fmt.Sprintf("check_insert:{total_time:%v, mem_insert_time:%v, prefetch:%v", e.checkInsertTime, e.checkInsertTime-e.prefetch, e.prefetch)) + buf.WriteString(fmt.Sprintf("prepare:%v, ", time.Duration(e.BasicRuntimeStats.GetTime())-e.CheckInsertTime)) + if e.Prefetch > 0 { + buf.WriteString(fmt.Sprintf("check_insert:{total_time:%v, mem_insert_time:%v, prefetch:%v", e.CheckInsertTime, e.CheckInsertTime-e.Prefetch, e.Prefetch)) if e.SnapshotRuntimeStats != nil { buf.WriteString(fmt.Sprintf(", rpc:{%s}", e.SnapshotRuntimeStats.String())) } buf.WriteString("}") } else { - buf.WriteString(fmt.Sprintf("insert:%v", e.checkInsertTime)) + buf.WriteString(fmt.Sprintf("insert:%v", e.CheckInsertTime)) } return buf.String() } // Clone implements the RuntimeStats interface. -func (e *insertRuntimeStat) Clone() execdetails.RuntimeStats { - newRs := &insertRuntimeStat{ - checkInsertTime: e.checkInsertTime, - prefetch: e.prefetch, +func (e *InsertRuntimeStat) Clone() execdetails.RuntimeStats { + newRs := &InsertRuntimeStat{ + CheckInsertTime: e.CheckInsertTime, + Prefetch: e.Prefetch, } if e.SnapshotRuntimeStats != nil { snapshotStats := e.SnapshotRuntimeStats.Clone() newRs.SnapshotRuntimeStats = snapshotStats.(*tikv.SnapshotRuntimeStats) } + if e.BasicRuntimeStats != nil { + basicStats := e.BasicRuntimeStats.Clone() + newRs.BasicRuntimeStats = basicStats.(*execdetails.BasicRuntimeStats) + } return newRs } // Merge implements the RuntimeStats interface. -func (e *insertRuntimeStat) Merge(other execdetails.RuntimeStats) { - tmp, ok := other.(*insertRuntimeStat) +func (e *InsertRuntimeStat) Merge(other execdetails.RuntimeStats) { + tmp, ok := other.(*InsertRuntimeStat) if !ok { return } @@ -1109,11 +1114,19 @@ func (e *insertRuntimeStat) Merge(other execdetails.RuntimeStats) { e.SnapshotRuntimeStats.Merge(tmp.SnapshotRuntimeStats) } } - e.prefetch += tmp.prefetch - e.checkInsertTime += tmp.checkInsertTime + if tmp.BasicRuntimeStats != nil { + if e.BasicRuntimeStats == nil { + basicStats := tmp.BasicRuntimeStats.Clone() + e.BasicRuntimeStats = basicStats.(*execdetails.BasicRuntimeStats) + } else { + e.BasicRuntimeStats.Merge(tmp.BasicRuntimeStats) + } + } + e.Prefetch += tmp.Prefetch + e.CheckInsertTime += tmp.CheckInsertTime } // Tp implements the RuntimeStats interface. -func (e *insertRuntimeStat) Tp() int { +func (e *InsertRuntimeStat) Tp() int { return execdetails.TpInsertRuntimeStat } diff --git a/executor/insert_test.go b/executor/insert_test.go index abaf5d2c9e18f..c907b5cf9ae6f 100644 --- a/executor/insert_test.go +++ b/executor/insert_test.go @@ -19,15 +19,18 @@ import ( "strconv" "strings" "sync" + "time" . "github.com/pingcap/check" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" ) @@ -1319,6 +1322,20 @@ func (s *testSuite10) TestClusterPrimaryKeyForIndexScan(c *C) { c.Assert(cnt, Equals, 15) } +func (s *testSuite10) TestInsertRuntimeStat(c *C) { + stats := &executor.InsertRuntimeStat{ + BasicRuntimeStats: &execdetails.BasicRuntimeStats{}, + SnapshotRuntimeStats: nil, + CheckInsertTime: 2 * time.Second, + Prefetch: 1 * time.Second, + } + stats.BasicRuntimeStats.Record(5*time.Second, 1) + c.Assert(stats.String(), Equals, "prepare:3s, check_insert:{total_time:2s, mem_insert_time:1s, prefetch:1s}") + c.Assert(stats.String(), Equals, stats.Clone().String()) + stats.Merge(stats.Clone()) + c.Assert(stats.String(), Equals, "prepare:6s, check_insert:{total_time:4s, mem_insert_time:2s, prefetch:2s}") +} + func (s *testSerialSuite) TestDuplicateEntryMessage(c *C) { collate.SetNewCollationEnabledForTest(true) defer collate.SetNewCollationEnabledForTest(false) diff --git a/executor/replace.go b/executor/replace.go index 5a3e1d3ece800..a3f54733c4885 100644 --- a/executor/replace.go +++ b/executor/replace.go @@ -208,7 +208,7 @@ func (e *ReplaceExec) exec(ctx context.Context, newRows [][]types.Datum) error { return err } if e.stats != nil { - e.stats.prefetch = time.Since(prefetchStart) + e.stats.Prefetch = time.Since(prefetchStart) } e.ctx.GetSessionVars().StmtCtx.AddRecordRows(uint64(len(newRows))) for _, r := range toBeCheckedRows { From fd0a18a90cbae7c0f4906306974a163cc75bd773 Mon Sep 17 00:00:00 2001 From: pengdaqian2020 <71140907+pengdaqian2020@users.noreply.github.com> Date: Sun, 27 Sep 2020 18:57:42 +0800 Subject: [PATCH 42/60] types: fix FLOAT data overflow check (#20067) (#20158) --- executor/insert_test.go | 11 +++++++++++ types/datum.go | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/executor/insert_test.go b/executor/insert_test.go index c907b5cf9ae6f..cf174760f5dd0 100644 --- a/executor/insert_test.go +++ b/executor/insert_test.go @@ -942,6 +942,17 @@ func (s *testSuite3) TestDMLCast(c *C) { tk.MustQuery(`select * from t`).Check(testkit.Rows()) } +func (s *testSuite3) TestInsertFloatOverflow(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec(`drop table if exists t;`) + tk.MustExec("create table t(col1 FLOAT, col2 FLOAT(10,2), col3 DOUBLE, col4 DOUBLE(10,2), col5 DECIMAL, col6 DECIMAL(10,2));") + _, err := tk.Exec("insert into t values (-3.402823466E+68, -34028234.6611, -1.7976931348623157E+308, -17976921.34, -9999999999, -99999999.99);") + c.Assert(err.Error(), Equals, "[types:1264]Out of range value for column 'col1' at row 1") + _, err = tk.Exec("insert into t values (-34028234.6611, -3.402823466E+68, -1.7976931348623157E+308, -17976921.34, -9999999999, -99999999.99);") + c.Assert(err.Error(), Equals, "[types:1264]Out of range value for column 'col2' at row 1") +} + // There is a potential issue in MySQL: when the value of auto_increment_offset is greater // than that of auto_increment_increment, the value of auto_increment_offset is ignored // (https://dev.mysql.com/doc/refman/8.0/en/replication-options-master.html#sysvar_auto_increment_increment), diff --git a/types/datum.go b/types/datum.go index 2d45642270f0b..5b4d2187bdd35 100644 --- a/types/datum.go +++ b/types/datum.go @@ -897,7 +897,7 @@ func ProduceFloatWithSpecifiedTp(f float64, target *FieldType, sc *stmtctx.State return f, errors.Trace(err) } } - if mysql.HasUnsignedFlag(target.Flag) && f < 0 { + if (mysql.HasUnsignedFlag(target.Flag) && f < 0) || (target.Tp == mysql.TypeFloat && (f > math.MaxFloat32 || f < -math.MaxFloat32)) { return 0, overflow(f, target.Tp) } return f, nil From 4b98dbaa0a0b2df68b4ee95cf077e7317c1d9a72 Mon Sep 17 00:00:00 2001 From: Zejun Li Date: Sun, 27 Sep 2020 19:54:12 +0800 Subject: [PATCH 43/60] http: add `/debug/gogc` to set GOGC on the fly (#20247) --- metrics/grafana/tidb_runtime.json | 4 +-- metrics/metrics.go | 1 + metrics/server.go | 8 ++++++ server/http_handler.go | 7 ++++- server/http_status.go | 25 +++++++++++++++++ util/gogc.go | 45 +++++++++++++++++++++++++++++++ 6 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 util/gogc.go diff --git a/metrics/grafana/tidb_runtime.json b/metrics/grafana/tidb_runtime.json index 12a18a89d1a53..d5bab22fd0cc3 100644 --- a/metrics/grafana/tidb_runtime.json +++ b/metrics/grafana/tidb_runtime.json @@ -142,7 +142,7 @@ "refId": "A" }, { - "expr": "go_memstats_next_gc_bytes{instance=~\"$instance\"} / 2", + "expr": "go_memstats_next_gc_bytes{instance=~\"$instance\"} / (1 + tidb_server_gogc{instance=~\"$instance\"} / 100)", "format": "time_series", "hide": false, "intervalFactor": 1, @@ -150,7 +150,7 @@ "refId": "H" }, { - "expr": "go_memstats_heap_alloc_bytes{instance=~\"$instance\"} - go_memstats_next_gc_bytes{instance=~\"$instance\"} / 2", + "expr": "go_memstats_heap_alloc_bytes{instance=~\"$instance\"} - go_memstats_next_gc_bytes{instance=~\"$instance\"} / (1 + tidb_server_gogc{instance=~\"$instance\"} / 100)", "format": "time_series", "hide": false, "intervalFactor": 1, diff --git a/metrics/metrics.go b/metrics/metrics.go index 4825bfeebd6c1..ab6c6d84ed1d9 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -167,4 +167,5 @@ func RegisterMetrics() { prometheus.MustRegister(TiKVNoAvailableConnectionCounter) prometheus.MustRegister(TiKVAsyncCommitTxnCounter) prometheus.MustRegister(MaxProcs) + prometheus.MustRegister(GOGC) } diff --git a/metrics/server.go b/metrics/server.go index b325fa67d25db..7091c0f997fc0 100644 --- a/metrics/server.go +++ b/metrics/server.go @@ -178,6 +178,14 @@ var ( Name: "maxprocs", Help: "The value of GOMAXPROCS.", }) + + GOGC = prometheus.NewGauge( + prometheus.GaugeOpts{ + Namespace: "tidb", + Subsystem: "server", + Name: "gogc", + Help: "The value of GOGC", + }) ) // ExecuteErrorToLabel converts an execute error to label. diff --git a/server/http_handler.go b/server/http_handler.go index 7c0ff374f031c..aab0456bd71bd 100755 --- a/server/http_handler.go +++ b/server/http_handler.go @@ -23,6 +23,7 @@ import ( "math" "net/http" "net/url" + "runtime" "strconv" "strings" "sync/atomic" @@ -1606,7 +1607,9 @@ func (h *mvccTxnHandler) handleMvccGetByTxn(params map[string]string) (interface // serverInfo is used to report the servers info when do http request. type serverInfo struct { - IsOwner bool `json:"is_owner"` + IsOwner bool `json:"is_owner"` + MaxProcs int `json:"max_procs"` + GOGC int `json:"gogc"` *infosync.ServerInfo } @@ -1626,6 +1629,8 @@ func (h serverInfoHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { return } info.IsOwner = do.DDL().OwnerManager().IsOwner() + info.MaxProcs = runtime.GOMAXPROCS(0) + info.GOGC = util.GetGOGC() writeData(w, info) } diff --git a/server/http_status.go b/server/http_status.go index c494bc3c6f2f2..38f79eec2c30a 100644 --- a/server/http_status.go +++ b/server/http_status.go @@ -21,6 +21,7 @@ import ( "crypto/x509" "encoding/json" "fmt" + "io/ioutil" "net" "net/http" "net/http/pprof" @@ -182,6 +183,30 @@ func (s *Server) startHTTPServer() { serverMux.HandleFunc("/debug/pprof/profile", pprof.Profile) serverMux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) serverMux.HandleFunc("/debug/pprof/trace", pprof.Trace) + serverMux.HandleFunc("/debug/gogc", func(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case http.MethodGet: + _, err := w.Write([]byte(strconv.Itoa(util.GetGOGC()))) + terror.Log(err) + case http.MethodPost: + body, err := ioutil.ReadAll(r.Body) + if err != nil { + terror.Log(err) + return + } + + val, err := strconv.Atoi(string(body)) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + if _, err := w.Write([]byte(err.Error())); err != nil { + terror.Log(err) + } + return + } + + util.SetGOGC(val) + } + }) serverMux.HandleFunc("/debug/zip", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="tidb_debug"`+time.Now().Format("20060102150405")+".zip")) diff --git a/util/gogc.go b/util/gogc.go new file mode 100644 index 0000000000000..3d49112825901 --- /dev/null +++ b/util/gogc.go @@ -0,0 +1,45 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "os" + "runtime/debug" + "strconv" + "sync/atomic" + + "github.com/pingcap/tidb/metrics" +) + +var gogcValue int64 + +func init() { + gogcValue = 100 + if val, err := strconv.Atoi(os.Getenv("GOGC")); err == nil { + gogcValue = int64(val) + } + metrics.GOGC.Set(float64(gogcValue)) +} + +// SetGOGC update GOGC and related metrics. +func SetGOGC(val int) { + debug.SetGCPercent(val) + metrics.GOGC.Set(float64(val)) + atomic.StoreInt64(&gogcValue, int64(val)) +} + +// GetGOGC returns the current value of GOGC. +func GetGOGC() int { + return int(atomic.LoadInt64(&gogcValue)) +} From 17b7b5e8158ed084619f62eb6be7c06ee46cf3d6 Mon Sep 17 00:00:00 2001 From: hesper-guo <39109312+hesper-guo@users.noreply.github.com> Date: Sun, 27 Sep 2020 20:44:11 +0800 Subject: [PATCH 44/60] *: add executor runtime info for `explain for connection` statement (#19183) --- executor/explainfor_test.go | 36 ++++++++++++++++++++-- executor/prepared_test.go | 6 ++-- planner/core/common_plans.go | 58 ++++++++++++++++++++++++------------ planner/core/encode.go | 2 +- planner/core/planbuilder.go | 22 +++++++------- session/session.go | 1 + util/processinfo.go | 26 ++++++++-------- 7 files changed, 105 insertions(+), 46 deletions(-) diff --git a/executor/explainfor_test.go b/executor/explainfor_test.go index e903e11ee0bdb..33d4bde97c74f 100644 --- a/executor/explainfor_test.go +++ b/executor/explainfor_test.go @@ -14,6 +14,7 @@ package executor_test import ( + "bytes" "crypto/tls" "fmt" "math" @@ -25,6 +26,7 @@ import ( "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/israce" "github.com/pingcap/tidb/util/kvcache" "github.com/pingcap/tidb/util/testkit" ) @@ -60,7 +62,7 @@ func (msm *mockSessionManager1) Kill(cid uint64, query bool) { func (msm *mockSessionManager1) UpdateTLSConfig(cfg *tls.Config) { } -func (s *testSuite) TestExplainFor(c *C) { +func (s *testSerialSuite) TestExplainFor(c *C) { tkRoot := testkit.NewTestKitWithInit(c, s.store) tkUser := testkit.NewTestKitWithInit(c, s.store) tkRoot.MustExec("create table t1(c1 int, c2 int)") @@ -69,6 +71,7 @@ func (s *testSuite) TestExplainFor(c *C) { tkRoot.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost", CurrentUser: true, AuthUsername: "root", AuthHostname: "%"}, nil, []byte("012345678901234567890")) tkUser.Se.Auth(&auth.UserIdentity{Username: "tu", Hostname: "localhost", CurrentUser: true, AuthUsername: "tu", AuthHostname: "%"}, nil, []byte("012345678901234567890")) + tkRoot.MustExec("set @@tidb_enable_collect_execution_info=0;") tkRoot.MustQuery("select * from t1;") tkRootProcess := tkRoot.Se.ShowProcess() ps := []*util.ProcessInfo{tkRootProcess} @@ -78,6 +81,30 @@ func (s *testSuite) TestExplainFor(c *C) { "TableReader_5 10000.00 root data:TableFullScan_4", "└─TableFullScan_4 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", )) + tkRoot.MustExec("set @@tidb_enable_collect_execution_info=1;") + tkRoot.MustQuery("select * from t1;") + tkRootProcess = tkRoot.Se.ShowProcess() + ps = []*util.ProcessInfo{tkRootProcess} + tkRoot.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + tkUser.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + rows := tkRoot.MustQuery(fmt.Sprintf("explain for connection %d", tkRootProcess.ID)).Rows() + c.Assert(len(rows), Equals, 2) + c.Assert(len(rows[0]), Equals, 9) + buf := bytes.NewBuffer(nil) + for i, row := range rows { + if i > 0 { + buf.WriteString("\n") + } + for j, v := range row { + if j > 0 { + buf.WriteString(" ") + } + buf.WriteString(fmt.Sprintf("%v", v)) + } + } + c.Assert(buf.String(), Matches, ""+ + "TableReader_5 10000.00 0 root time:.*, loops:1, cop_task:.*num: 1, max:.*, proc_keys: 0, rpc_num: 1, rpc_time: .* data:TableFullScan_4 N/A N/A\n"+ + "└─TableFullScan_4 10000.00 0 cop.* table:t1 time:.*, loops:0 keep order:false, stats:pseudo N/A N/A") err := tkUser.ExecToErr(fmt.Sprintf("explain for connection %d", tkRootProcess.ID)) c.Check(core.ErrAccessDenied.Equal(err), IsTrue) err = tkUser.ExecToErr("explain for connection 42") @@ -89,9 +116,10 @@ func (s *testSuite) TestExplainFor(c *C) { tkRoot.MustExec(fmt.Sprintf("explain for connection %d", tkRootProcess.ID)) } -func (s *testSuite) TestIssue11124(c *C) { +func (s *testSerialSuite) TestIssue11124(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) tk2 := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") tk.MustExec("drop table if exists kankan1") tk.MustExec("drop table if exists kankan2") tk.MustExec("create table kankan1(id int, name text);") @@ -169,6 +197,9 @@ type testPrepareSerialSuite struct { } func (s *testPrepareSerialSuite) TestExplainForConnPlanCache(c *C) { + if israce.RaceEnabled { + c.Skip("skip race test") + } orgEnable := core.PreparedPlanCacheEnabled() defer func() { core.SetPreparedPlanCache(orgEnable) @@ -184,6 +215,7 @@ func (s *testPrepareSerialSuite) TestExplainForConnPlanCache(c *C) { tk2 := testkit.NewTestKitWithInit(c, s.store) tk1.MustExec("use test") + tk1.MustExec("set @@tidb_enable_collect_execution_info=0;") tk1.MustExec("drop table if exists t") tk1.MustExec("create table t(a int)") tk1.MustExec("prepare stmt from 'select * from t where a = ?'") diff --git a/executor/prepared_test.go b/executor/prepared_test.go index a61429f82273c..8b8c7e7cba60c 100644 --- a/executor/prepared_test.go +++ b/executor/prepared_test.go @@ -65,7 +65,7 @@ func (s *testSuite1) TestIgnorePlanCache(c *C) { c.Assert(tk.Se.GetSessionVars().StmtCtx.UseCache, IsFalse) } -func (s *testSuite1) TestPrepareStmtAfterIsolationReadChange(c *C) { +func (s *testSerialSuite) TestPrepareStmtAfterIsolationReadChange(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost", CurrentUser: true, AuthUsername: "root", AuthHostname: "%"}, nil, []byte("012345678901234567890")) @@ -86,6 +86,7 @@ func (s *testSuite1) TestPrepareStmtAfterIsolationReadChange(c *C) { } tk.MustExec("set @@session.tidb_isolation_read_engines='tikv'") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") tk.MustExec("prepare stmt from \"select * from t\"") tk.MustQuery("execute stmt") tkProcess := tk.Se.ShowProcess() @@ -163,7 +164,7 @@ func (s *testSuite12) TestPreparedStmtWithHint(c *C) { c.Check(sm.killed, Equals, true) } -func (s *testSuite9) TestPlanCacheClusterIndex(c *C) { +func (s *testSerialSuite) TestPlanCacheClusterIndex(c *C) { store, dom, err := newStoreWithBootstrap() c.Assert(err, IsNil) tk := testkit.NewTestKit(c, store) @@ -179,6 +180,7 @@ func (s *testSuite9) TestPlanCacheClusterIndex(c *C) { tk.MustExec("use test") tk.MustExec("drop table if exists t1") tk.MustExec("set @@tidb_enable_clustered_index = 1") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") tk.MustExec("create table t1(a varchar(20), b varchar(20), c varchar(20), primary key(a, b))") tk.MustExec("insert into t1 values('1','1','111'),('2','2','222'),('3','3','333')") diff --git a/planner/core/common_plans.go b/planner/core/common_plans.go index 16cbad3751690..f7d5a9a990148 100644 --- a/planner/core/common_plans.go +++ b/planner/core/common_plans.go @@ -36,6 +36,7 @@ import ( "github.com/pingcap/tidb/types" driver "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/hint" "github.com/pingcap/tidb/util/kvcache" "github.com/pingcap/tidb/util/logutil" @@ -871,12 +872,14 @@ type SelectInto struct { type Explain struct { baseSchemaProducer - TargetPlan Plan - Format string - Analyze bool - ExecStmt ast.StmtNode + TargetPlan Plan + Format string + Analyze bool + ExecStmt ast.StmtNode + RuntimeStatsColl *execdetails.RuntimeStatsColl Rows [][]string + ExplainRows [][]string explainedPlans map[int]bool } @@ -899,9 +902,9 @@ func (e *Explain) prepareSchema() error { format := strings.ToLower(e.Format) switch { - case format == ast.ExplainFormatROW && !e.Analyze: + case format == ast.ExplainFormatROW && (!e.Analyze && e.RuntimeStatsColl == nil): fieldNames = []string{"id", "estRows", "task", "access object", "operator info"} - case format == ast.ExplainFormatROW && e.Analyze: + case format == ast.ExplainFormatROW && (e.Analyze || e.RuntimeStatsColl != nil): fieldNames = []string{"id", "estRows", "actRows", "task", "access object", "execution info", "operator info", "memory", "disk"} case format == ast.ExplainFormatDOT: fieldNames = []string{"dot contents"} @@ -1051,10 +1054,12 @@ func (e *Explain) explainPlanInRowFormat(p Plan, taskType, driverSide, indent st return } -func getRuntimeInfo(ctx sessionctx.Context, p Plan) (actRows, analyzeInfo, memoryInfo, diskInfo string) { - runtimeStatsColl := ctx.GetSessionVars().StmtCtx.RuntimeStatsColl +func getRuntimeInfo(ctx sessionctx.Context, p Plan, runtimeStatsColl *execdetails.RuntimeStatsColl) (actRows, analyzeInfo, memoryInfo, diskInfo string) { if runtimeStatsColl == nil { - return + runtimeStatsColl = ctx.GetSessionVars().StmtCtx.RuntimeStatsColl + if runtimeStatsColl == nil { + return + } } explainID := p.ID() @@ -1095,12 +1100,35 @@ func (e *Explain) prepareOperatorInfo(p Plan, taskType, driverSide, indent strin } id := texttree.PrettyIdentifier(p.ExplainID().String()+driverSide, indent, isLastChild) + estRows, accessObject, operatorInfo := e.getOperatorInfo(p, id) + + var row []string + if e.Analyze { + actRows, analyzeInfo, memoryInfo, diskInfo := getRuntimeInfo(e.ctx, p, nil) + row = []string{id, estRows, actRows, taskType, accessObject, analyzeInfo, operatorInfo, memoryInfo, diskInfo} + } else if e.RuntimeStatsColl != nil { + actRows, analyzeInfo, memoryInfo, diskInfo := getRuntimeInfo(e.ctx, p, e.RuntimeStatsColl) + row = []string{id, estRows, actRows, taskType, accessObject, analyzeInfo, operatorInfo, memoryInfo, diskInfo} + } else { + row = []string{id, estRows, taskType, accessObject, operatorInfo} + } + e.Rows = append(e.Rows, row) +} +func (e *Explain) getOperatorInfo(p Plan, id string) (string, string, string) { + // For `explain for connection` statement, `e.ExplainRows` will be set. + for _, row := range e.ExplainRows { + if len(row) < 5 { + panic("should never happen") + } + if row[0] == id { + return row[1], row[3], row[4] + } + } estRows := "N/A" if si := p.statsInfo(); si != nil { estRows = strconv.FormatFloat(si.RowCount, 'f', 2, 64) } - var accessObject, operatorInfo string if plan, ok := p.(dataAccesser); ok { accessObject = plan.AccessObject() @@ -1111,15 +1139,7 @@ func (e *Explain) prepareOperatorInfo(p Plan, taskType, driverSide, indent strin } operatorInfo = p.ExplainInfo() } - - var row []string - if e.Analyze { - actRows, analyzeInfo, memoryInfo, diskInfo := getRuntimeInfo(e.ctx, p) - row = []string{id, estRows, actRows, taskType, accessObject, analyzeInfo, operatorInfo, memoryInfo, diskInfo} - } else { - row = []string{id, estRows, taskType, accessObject, operatorInfo} - } - e.Rows = append(e.Rows, row) + return estRows, accessObject, operatorInfo } func (e *Explain) prepareDotInfo(p PhysicalPlan) { diff --git a/planner/core/encode.go b/planner/core/encode.go index 01b2fb14cf759..390857fdecd58 100644 --- a/planner/core/encode.go +++ b/planner/core/encode.go @@ -61,7 +61,7 @@ func (pn *planEncoder) encodePlanTree(p Plan) string { func (pn *planEncoder) encodePlan(p Plan, isRoot bool, store kv.StoreType, depth int) { taskTypeInfo := plancodec.EncodeTaskType(isRoot, store) - actRows, analyzeInfo, memoryInfo, diskInfo := getRuntimeInfo(p.SCtx(), p) + actRows, analyzeInfo, memoryInfo, diskInfo := getRuntimeInfo(p.SCtx(), p, nil) rowCount := 0.0 if statsInfo := p.statsInfo(); statsInfo != nil { rowCount = p.statsInfo().RowCount diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index 1c7ea131d2c8b..ab23f70f96de3 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -45,6 +45,7 @@ import ( driver "github.com/pingcap/tidb/types/parser_driver" util2 "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/hint" "github.com/pingcap/tidb/util/logutil" utilparser "github.com/pingcap/tidb/util/parser" @@ -3139,13 +3140,14 @@ func (b *PlanBuilder) buildTrace(trace *ast.TraceStmt) (Plan, error) { return p, nil } -func (b *PlanBuilder) buildExplainPlan(targetPlan Plan, format string, rows [][]string, analyze bool, execStmt ast.StmtNode) (Plan, error) { +func (b *PlanBuilder) buildExplainPlan(targetPlan Plan, format string, explainRows [][]string, analyze bool, execStmt ast.StmtNode, runtimeStats *execdetails.RuntimeStatsColl) (Plan, error) { p := &Explain{ - TargetPlan: targetPlan, - Format: format, - Analyze: analyze, - ExecStmt: execStmt, - Rows: rows, + TargetPlan: targetPlan, + Format: format, + Analyze: analyze, + ExecStmt: execStmt, + ExplainRows: explainRows, + RuntimeStatsColl: runtimeStats, } p.ctx = b.ctx return p, p.prepareSchema() @@ -3170,11 +3172,11 @@ func (b *PlanBuilder) buildExplainFor(explainFor *ast.ExplainForStmt) (Plan, err if !ok || targetPlan == nil { return &Explain{Format: explainFor.Format}, nil } - var rows [][]string + var explainRows [][]string if explainFor.Format == ast.ExplainFormatROW { - rows = processInfo.PlanExplainRows + explainRows = processInfo.PlanExplainRows } - return b.buildExplainPlan(targetPlan, explainFor.Format, rows, false, nil) + return b.buildExplainPlan(targetPlan, explainFor.Format, explainRows, false, nil, processInfo.RuntimeStatsColl) } func (b *PlanBuilder) buildExplain(ctx context.Context, explain *ast.ExplainStmt) (Plan, error) { @@ -3186,7 +3188,7 @@ func (b *PlanBuilder) buildExplain(ctx context.Context, explain *ast.ExplainStmt return nil, err } - return b.buildExplainPlan(targetPlan, explain.Format, nil, explain.Analyze, explain.Stmt) + return b.buildExplainPlan(targetPlan, explain.Format, nil, explain.Analyze, explain.Stmt, nil) } func (b *PlanBuilder) buildSelectInto(ctx context.Context, sel *ast.SelectStmt) (Plan, error) { diff --git a/session/session.go b/session/session.go index 1f3bd88b57d78..1ff66585d2723 100644 --- a/session/session.go +++ b/session/session.go @@ -1043,6 +1043,7 @@ func (s *session) SetProcessInfo(sql string, t time.Time, command byte, maxExecu Command: command, Plan: s.currentPlan, PlanExplainRows: plannercore.GetExplainRowsForPlan(s.currentPlan), + RuntimeStatsColl: s.sessionVars.StmtCtx.RuntimeStatsColl, Time: t, State: s.Status(), Info: sql, diff --git a/util/processinfo.go b/util/processinfo.go index 1a68f4b3f3faa..13f04bf16e655 100644 --- a/util/processinfo.go +++ b/util/processinfo.go @@ -22,22 +22,24 @@ import ( "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/store/tikv/oracle" + "github.com/pingcap/tidb/util/execdetails" ) // ProcessInfo is a struct used for show processlist statement. type ProcessInfo struct { - ID uint64 - User string - Host string - DB string - Digest string - Plan interface{} - PlanExplainRows [][]string - Time time.Time - Info string - CurTxnStartTS uint64 - StmtCtx *stmtctx.StatementContext - StatsInfo func(interface{}) map[string]uint64 + ID uint64 + User string + Host string + DB string + Digest string + Plan interface{} + PlanExplainRows [][]string + RuntimeStatsColl *execdetails.RuntimeStatsColl + Time time.Time + Info string + CurTxnStartTS uint64 + StmtCtx *stmtctx.StatementContext + StatsInfo func(interface{}) map[string]uint64 // MaxExecutionTime is the timeout for select statement, in milliseconds. // If the query takes too long, kill it. MaxExecutionTime uint64 From 353e87cf76eae5444d945320ee70e980f144aaff Mon Sep 17 00:00:00 2001 From: Zejun Li Date: Mon, 28 Sep 2020 11:12:12 +0800 Subject: [PATCH 45/60] grafana: update kv duration filter condition (#20023) --- metrics/grafana/tidb.json | 4 ++-- metrics/grafana/tidb_runtime.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/metrics/grafana/tidb.json b/metrics/grafana/tidb.json index 84a0b112b0748..abe270bfcf874 100644 --- a/metrics/grafana/tidb.json +++ b/metrics/grafana/tidb.json @@ -6927,7 +6927,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{type!=\"GC\"}[1m])) by (le, store))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{store!=\"0\"}[1m])) by (le, store))", "format": "time_series", "intervalFactor": 2, "legendFormat": "store-{{store}}", @@ -7022,7 +7022,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{type!=\"GC\"}[1m])) by (le,type))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{store!=\"0\"}[1m])) by (le,type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", diff --git a/metrics/grafana/tidb_runtime.json b/metrics/grafana/tidb_runtime.json index d5bab22fd0cc3..364a4f55ef898 100644 --- a/metrics/grafana/tidb_runtime.json +++ b/metrics/grafana/tidb_runtime.json @@ -1098,7 +1098,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{type!=\"GC\",instance=~\"$instance\"}[30s])) by (le, store))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{store!=\"0\",instance=~\"$instance\"}[30s])) by (le, store))", "format": "time_series", "intervalFactor": 1, "legendFormat": "tidb-to-store{{store}}", From 0cdd24d36b9e5f441d4cb7425969fae9fc1c0e7f Mon Sep 17 00:00:00 2001 From: Yilin Chen Date: Mon, 28 Sep 2020 12:03:12 +0800 Subject: [PATCH 46/60] tikv: support secondaries key size limit for async commit (#20167) Signed-off-by: Yilin Chen --- config/config.go | 25 +++++++++++++------ config/config.toml.example | 16 +++++++----- config/config_test.go | 11 ++++++--- session/pessimistic_test.go | 2 +- store/tikv/2pc.go | 12 +++++++-- store/tikv/2pc_test.go | 37 ++++++++++++++++++++++++++-- store/tikv/async_commit_fail_test.go | 6 ++--- store/tikv/async_commit_test.go | 2 +- 8 files changed, 85 insertions(+), 26 deletions(-) diff --git a/config/config.go b/config/config.go index 9f2d172db2316..c64576c9b07d5 100644 --- a/config/config.go +++ b/config/config.go @@ -494,11 +494,8 @@ type TiKVClient struct { // and if no activity is seen even after that the connection is closed. GrpcKeepAliveTimeout uint `toml:"grpc-keepalive-timeout" json:"grpc-keepalive-timeout"` // CommitTimeout is the max time which command 'commit' will wait. - CommitTimeout string `toml:"commit-timeout" json:"commit-timeout"` - // EnableAsyncCommit enables async commit for all transactions. - EnableAsyncCommit bool `toml:"enable-async-commit" json:"enable-async-commit"` - AsyncCommitKeysLimit uint `toml:"async-commit-keys-limit" json:"async-commit-keys-limit"` - + CommitTimeout string `toml:"commit-timeout" json:"commit-timeout"` + AsyncCommit AsyncCommit `toml:"async-commit" json:"async-commit"` // MaxBatchSize is the max batch size when calling batch commands API. MaxBatchSize uint `toml:"max-batch-size" json:"max-batch-size"` // If TiKV load is greater than this, TiDB will wait for a while to avoid little batch. @@ -522,6 +519,16 @@ type TiKVClient struct { TTLRefreshedTxnSize int64 `toml:"ttl-refreshed-txn-size" json:"ttl-refreshed-txn-size"` } +// AsyncCommit is the config for the async commit feature. +type AsyncCommit struct { + // Whether to enable the async commit feature. + Enable bool `toml:"enable" json:"enable"` + // Use async commit only if the number of keys does not exceed KeysLimit. + KeysLimit uint `toml:"keys-limit" json:"keys-limit"` + // Use async commit only if the total size of keys does not exceed TotalKeySizeLimit. + TotalKeySizeLimit uint64 `toml:"total-key-size-limit" json:"total-key-size-limit"` +} + // CoprocessorCache is the config for coprocessor cache. type CoprocessorCache struct { // Whether to enable the copr cache. The copr cache saves the result from TiKV Coprocessor in the memory and @@ -687,8 +694,12 @@ var defaultConf = Config{ GrpcKeepAliveTime: 10, GrpcKeepAliveTimeout: 3, CommitTimeout: "41s", - EnableAsyncCommit: false, - AsyncCommitKeysLimit: 256, + AsyncCommit: AsyncCommit{ + Enable: false, + // FIXME: Find an appropriate default limit. + KeysLimit: 256, + TotalKeySizeLimit: 4 * 1024, // 4 KiB + }, MaxBatchSize: 128, OverloadThreshold: 200, diff --git a/config/config.toml.example b/config/config.toml.example index cd44737e37cf4..3fdb3863d76bf 100644 --- a/config/config.toml.example +++ b/config/config.toml.example @@ -356,12 +356,6 @@ grpc-keepalive-timeout = 3 # Max time for commit command, must be twice bigger than raft election timeout. commit-timeout = "41s" -# Enable async commit for all transactions. -enable-async-commit = false -# The maximum allowed keys in a async commit transaction. Transactions with more keys than the limit -# will be committed with normal 2PC way. -async-commit-keys-limit = 256 - # Max batch size in gRPC. max-batch-size = 128 # Overload threshold of TiKV. @@ -390,6 +384,16 @@ store-liveness-timeout = "5s" # If the size(in byte) of a transaction is large than `ttl-refreshed-txn-size`, it update the lock TTL during the 2PC. ttl-refreshed-txn-size = 33554432 +[tikv-client.async-commit] +# Whether to enable the async commit feature. This feature reduces the latency of the two-phase commit. +enable = false +# The maximum allowed keys in an async commit transaction. Transactions with more keys than the limit +# will be committed with normal 2PC way. +keys-limit = 256 +# The maximum length total of keys in bytes. Transactions will be committed with the normal 2PC way +# if the limit is exceeded. +total-key-size-limit = 4096 + [tikv-client.copr-cache] # Whether to enable the copr cache. The copr cache saves the result from TiKV Coprocessor in the memory and # reuses the result when corresponding data in TiKV is unchanged, on a region basis. diff --git a/config/config_test.go b/config/config_test.go index 46732b84c5668..af1e9c64d81a2 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -196,12 +196,14 @@ deprecate-integer-display-length = true txn-total-size-limit=2000 [tikv-client] commit-timeout="41s" -enable-async-commit=true -async-commit-keys-limit=123 max-batch-size=128 region-cache-ttl=6000 store-limit=0 ttl-refreshed-txn-size=8192 +[tikv-client.async-commit] +enable=true +keys-limit=123 +total-key-size-limit=1024 [stmt-summary] enable=false enable-internal-query=true @@ -235,8 +237,9 @@ spilled-file-encryption-method = "plaintext" c.Assert(conf.AlterPrimaryKey, Equals, true) c.Assert(conf.TiKVClient.CommitTimeout, Equals, "41s") - c.Assert(conf.TiKVClient.EnableAsyncCommit, Equals, true) - c.Assert(conf.TiKVClient.AsyncCommitKeysLimit, Equals, uint(123)) + c.Assert(conf.TiKVClient.AsyncCommit.Enable, Equals, true) + c.Assert(conf.TiKVClient.AsyncCommit.KeysLimit, Equals, uint(123)) + c.Assert(conf.TiKVClient.AsyncCommit.TotalKeySizeLimit, Equals, uint64(1024)) c.Assert(conf.TiKVClient.MaxBatchSize, Equals, uint(128)) c.Assert(conf.TiKVClient.RegionCacheTTL, Equals, uint(6000)) c.Assert(conf.TiKVClient.StoreLimit, Equals, int64(0)) diff --git a/session/pessimistic_test.go b/session/pessimistic_test.go index abc6947345ce7..66a2b405fff64 100644 --- a/session/pessimistic_test.go +++ b/session/pessimistic_test.go @@ -1792,7 +1792,7 @@ func (s *testPessimisticSuite) TestSelectForUpdateWaitSeconds(c *C) { func (s *testPessimisticSuite) TestSelectForUpdateConflictRetry(c *C) { defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.EnableAsyncCommit = true + conf.TiKVClient.AsyncCommit.Enable = true }) tk := testkit.NewTestKitWithInit(c, s.store) diff --git a/store/tikv/2pc.go b/store/tikv/2pc.go index 6f5fc2fe06af9..9d2ebc089e7ca 100644 --- a/store/tikv/2pc.go +++ b/store/tikv/2pc.go @@ -800,11 +800,19 @@ func sendTxnHeartBeat(bo *Backoffer, store *tikvStore, primary []byte, startTS, // checkAsyncCommit checks if async commit protocol is available for current transaction commit, true is returned if possible. func (c *twoPhaseCommitter) checkAsyncCommit() bool { + asyncCommitCfg := config.GetGlobalConfig().TiKVClient.AsyncCommit // TODO the keys limit need more tests, this value makes the unit test pass by now. // Async commit is not compatible with Binlog because of the non unique timestamp issue. - if c.connID > 0 && config.GetGlobalConfig().TiKVClient.EnableAsyncCommit && - uint(len(c.mutations.keys)) <= config.GetGlobalConfig().TiKVClient.AsyncCommitKeysLimit && + if c.connID > 0 && asyncCommitCfg.Enable && + uint(len(c.mutations.keys)) <= asyncCommitCfg.KeysLimit && !c.shouldWriteBinlog() { + totalKeySize := uint64(0) + for _, key := range c.mutations.keys { + totalKeySize += uint64(len(key)) + if totalKeySize > asyncCommitCfg.TotalKeySizeLimit { + return false + } + } return true } return false diff --git a/store/tikv/2pc_test.go b/store/tikv/2pc_test.go index 261876e031da8..8bbb53225a0f2 100644 --- a/store/tikv/2pc_test.go +++ b/store/tikv/2pc_test.go @@ -1168,7 +1168,7 @@ func (s *testCommitterSuite) TestResolveMixed(c *C) { func (s *testCommitterSuite) TestPrewriteSecondaryKeys(c *C) { defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.EnableAsyncCommit = true + conf.TiKVClient.AsyncCommit.Enable = true }) // Prepare two regions first: (, 100) and [100, ) @@ -1207,7 +1207,7 @@ func (s *testCommitterSuite) TestPrewriteSecondaryKeys(c *C) { func (s *testCommitterSuite) TestAsyncCommit(c *C) { defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.EnableAsyncCommit = true + conf.TiKVClient.AsyncCommit.Enable = true }) ctx := context.Background() @@ -1236,6 +1236,39 @@ func (s *testCommitterSuite) TestAsyncCommit(c *C) { }) } +func (s *testCommitterSuite) TestAsyncCommitCheck(c *C) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.AsyncCommit.Enable = true + conf.TiKVClient.AsyncCommit.KeysLimit = 16 + conf.TiKVClient.AsyncCommit.TotalKeySizeLimit = 64 + }) + + txn := s.begin(c) + buf := []byte{0, 0, 0, 0} + // Set 16 keys, each key is 4 bytes long. So the total size of keys is 64 bytes. + for i := 0; i < 16; i++ { + buf[0] = byte(i) + err := txn.Set(buf, []byte("v")) + c.Assert(err, IsNil) + } + + committer, err := newTwoPhaseCommitterWithInit(txn, 1) + c.Assert(err, IsNil) + c.Assert(committer.checkAsyncCommit(), IsTrue) + + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.AsyncCommit.KeysLimit = 15 + }) + c.Assert(committer.checkAsyncCommit(), IsFalse) + + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.AsyncCommit.KeysLimit = 20 + conf.TiKVClient.AsyncCommit.TotalKeySizeLimit = 63 + }) + c.Assert(committer.checkAsyncCommit(), IsFalse) +} + type mockClient struct { inner Client seenPrimaryReq uint32 diff --git a/store/tikv/async_commit_fail_test.go b/store/tikv/async_commit_fail_test.go index c6225d54a1038..2ded260a50964 100644 --- a/store/tikv/async_commit_fail_test.go +++ b/store/tikv/async_commit_fail_test.go @@ -53,9 +53,9 @@ func (s *testAsyncCommitFailSuite) SetUpTest(c *C) { // TestFailCommitPrimaryRpcErrors tests rpc errors are handled properly when // committing primary region task. func (s *testAsyncCommitFailSuite) TestFailAsyncCommitPrewriteRpcErrors(c *C) { - defer config.RestoreFunc() + defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.EnableAsyncCommit = true + conf.TiKVClient.AsyncCommit.Enable = true }) c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/noRetryOnRpcError", "return(true)"), IsNil) c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/rpcPrewriteTimeout", `return(true)`), IsNil) @@ -88,7 +88,7 @@ func (s *testAsyncCommitFailSuite) TestFailAsyncCommitPrewriteRpcErrors(c *C) { func (s *testAsyncCommitFailSuite) TestSecondaryListInPrimaryLock(c *C) { defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.EnableAsyncCommit = true + conf.TiKVClient.AsyncCommit.Enable = true }) s.putAlphabets(c, s.store) diff --git a/store/tikv/async_commit_test.go b/store/tikv/async_commit_test.go index 272ee6cb5e98b..fcd452f9d2dde 100644 --- a/store/tikv/async_commit_test.go +++ b/store/tikv/async_commit_test.go @@ -125,7 +125,7 @@ func (s *testAsyncCommitSuite) mustGetLock(c *C, key []byte) *Lock { func (s *testAsyncCommitSuite) TestCheckSecondaries(c *C) { defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.EnableAsyncCommit = true + conf.TiKVClient.AsyncCommit.Enable = true }) s.putAlphabets(c, s.store) From a30be605cd9b86ea253e7ddc0763026d7635f618 Mon Sep 17 00:00:00 2001 From: xiongjiwei Date: Mon, 28 Sep 2020 15:11:42 +0800 Subject: [PATCH 47/60] ddl : table meta may hold wrong information if checkPartitionByRange panic (#19814) --- ddl/ddl_api.go | 10 +++++++--- ddl/failtest/fail_db_test.go | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index e77c13bd856ba..d3bc3e2e1fa01 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -30,6 +30,7 @@ import ( "github.com/cznic/mathutil" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/charset" "github.com/pingcap/parser/format" @@ -1896,6 +1897,9 @@ func checkPartitionByHash(ctx sessionctx.Context, tbInfo *model.TableInfo, s *as // checkPartitionByRange checks validity of a "BY RANGE" partition. func checkPartitionByRange(ctx sessionctx.Context, tbInfo *model.TableInfo, s *ast.CreateTableStmt) error { + failpoint.Inject("CheckPartitionByRangeErr", func() { + panic("Out Of Memory Quota!") + }) pi := tbInfo.Partition if err := checkPartitionNameUnique(pi); err != nil { return err @@ -2758,11 +2762,11 @@ func (d *ddl) AddTablePartitions(ctx sessionctx.Context, ident ast.Ident, spec * // partInfo contains only the new added partition, we have to combine it with the // old partitions to check all partitions is strictly increasing. + clonedMeta := meta.Clone() tmp := *partInfo tmp.Definitions = append(pi.Definitions, tmp.Definitions...) - meta.Partition = &tmp - err = checkPartitionByRange(ctx, meta, nil) - meta.Partition = pi + clonedMeta.Partition = &tmp + err = checkPartitionByRange(ctx, clonedMeta, nil) if err != nil { if ErrSameNamePartition.Equal(err) && spec.IfNotExists { ctx.GetSessionVars().StmtCtx.AppendNote(err) diff --git a/ddl/failtest/fail_db_test.go b/ddl/failtest/fail_db_test.go index e8898ccc19171..3681a528d325d 100644 --- a/ddl/failtest/fail_db_test.go +++ b/ddl/failtest/fail_db_test.go @@ -436,6 +436,7 @@ func (s *testFailDBSuite) TestPartitionAddIndexGC(c *C) { func (s *testFailDBSuite) TestModifyColumn(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") + tk.MustExec("drop table if exists t;") enableChangeColumnType := tk.Se.GetSessionVars().EnableChangeColumnType tk.Se.GetSessionVars().EnableChangeColumnType = true @@ -534,3 +535,20 @@ func (s *testFailDBSuite) TestModifyColumn(c *C) { tk.MustExec("drop table t, t1, t2, t3, t4, t5") } + +func (s *testFailDBSuite) TestPartitionAddPanic(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec(`use test;`) + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t (a int) partition by range(a) (partition p0 values less than (10));`) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/ddl/CheckPartitionByRangeErr", `return(true)`), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/ddl/CheckPartitionByRangeErr"), IsNil) + }() + + _, err := tk.Exec(`alter table t add partition (partition p1 values less than (20));`) + c.Assert(err, NotNil) + result := tk.MustQuery("show create table t").Rows()[0][1] + c.Assert(result, Matches, `(?s).*PARTITION .p0. VALUES LESS THAN \(10\).*`) + c.Assert(result, Not(Matches), `(?s).*PARTITION .p0. VALUES LESS THAN \(20\).*`) +} From b61f8bb9ed14a41dd04fbed389cba58d5271ab39 Mon Sep 17 00:00:00 2001 From: xhe Date: Mon, 28 Sep 2020 18:44:12 +0800 Subject: [PATCH 48/60] ddl: make use of the new rule cache api[2/3] (#20208) Signed-off-by: xhe --- ddl/ddl_api.go | 9 ++++++-- ddl/ddl_worker.go | 2 +- ddl/partition.go | 42 +++++++++++++++++----------------- ddl/placement/types.go | 5 +++++ ddl/placement/types_test.go | 17 ++++++++++++++ ddl/placement_rule_test.go | 45 +++++++------------------------------ domain/infosync/info.go | 12 ++++++---- 7 files changed, 67 insertions(+), 65 deletions(-) diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index d3bc3e2e1fa01..cf26fcd44dae4 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -5517,8 +5517,13 @@ func (d *ddl) AlterTablePartition(ctx sessionctx.Context, ident ast.Ident, spec EndKeyHex: endKey, }) } - bundle.Index = placement.RuleIndexPartition - bundle.Override = true + if len(bundle.Rules) == 0 { + bundle.Index = 0 + bundle.Override = false + } else { + bundle.Index = placement.RuleIndexPartition + bundle.Override = true + } job := &model.Job{ SchemaID: schema.ID, diff --git a/ddl/ddl_worker.go b/ddl/ddl_worker.go index 3e858d8a2dddd..1a7c60ba9ae75 100644 --- a/ddl/ddl_worker.go +++ b/ddl/ddl_worker.go @@ -622,7 +622,7 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, case model.ActionDropTable, model.ActionDropView, model.ActionDropSequence: ver, err = onDropTableOrView(t, job) case model.ActionDropTablePartition: - ver, err = onDropTablePartition(t, job) + ver, err = onDropTablePartition(d, t, job) case model.ActionTruncateTablePartition: ver, err = onTruncateTablePartition(d, t, job) case model.ActionExchangeTablePartition: diff --git a/ddl/partition.go b/ddl/partition.go index a10d0ab6bd839..a3ccf17066c22 100644 --- a/ddl/partition.go +++ b/ddl/partition.go @@ -73,7 +73,7 @@ func checkAddPartition(t *meta.Meta, job *model.Job) (*model.TableInfo, *model.P func onAddTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { // Handle the rolling back job if job.IsRollingback() { - ver, err := onDropTablePartition(t, job) + ver, err := onDropTablePartition(d, t, job) if err != nil { return ver, errors.Trace(err) } @@ -867,23 +867,14 @@ func getPartitionDef(tblInfo *model.TableInfo, partName string) (index int, def return index, nil, table.ErrUnknownPartition.GenWithStackByArgs(partName, tblInfo.Name.O) } -func buildPlacementDropRules(schemaID, tableID int64, partitionIDs []int64) []*placement.RuleOp { - rules := make([]*placement.RuleOp, 0, len(partitionIDs)) - for _, partitionID := range partitionIDs { - rules = append(rules, &placement.RuleOp{ - Action: placement.RuleOpDel, - DeleteByIDPrefix: true, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - ID: fmt.Sprintf("%d_t%d_p%d", schemaID, tableID, partitionID), - }, - }) - } - return rules +func buildPlacementDropBundle(partitionID int64) *placement.Bundle { + return &placement.Bundle{ + ID: placement.GroupID(partitionID), + } } // onDropTablePartition deletes old partition meta. -func onDropTablePartition(t *meta.Meta, job *model.Job) (ver int64, _ error) { +func onDropTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { var partNames []string if err := job.DecodeArgs(&partNames); err != nil { job.State = model.JobStateCancelled @@ -907,11 +898,20 @@ func onDropTablePartition(t *meta.Meta, job *model.Job) (ver int64, _ error) { physicalTableIDs = removePartitionInfo(tblInfo, partNames) } - rules := buildPlacementDropRules(job.SchemaID, tblInfo.ID, physicalTableIDs) - err = infosync.UpdatePlacementRules(nil, rules) - if err != nil { - job.State = model.JobStateCancelled - return ver, errors.Wrapf(err, "failed to notify PD the placement rules") + if d.infoHandle != nil { + bundles := make([]*placement.Bundle, 0, len(physicalTableIDs)) + for _, ID := range physicalTableIDs { + oldBundle, ok := d.infoHandle.Get().BundleByName(placement.GroupID(ID)) + if ok && !oldBundle.IsEmpty() { + bundles = append(bundles, buildPlacementDropBundle(ID)) + } + } + + err = infosync.PutRuleBundles(nil, bundles) + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Wrapf(err, "failed to notify PD the placement rules") + } } ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) @@ -1536,7 +1536,7 @@ func onAlterTablePartition(t *meta.Meta, job *model.Job) (int64, error) { return 0, errors.Trace(table.ErrUnknownPartition.GenWithStackByArgs("drop?", tblInfo.Name.O)) } - err = infosync.PutRuleBundle(nil, bundle) + err = infosync.PutRuleBundles(nil, []*placement.Bundle{bundle}) if err != nil { job.State = model.JobStateCancelled return 0, errors.Wrapf(err, "failed to notify PD the placement rules") diff --git a/ddl/placement/types.go b/ddl/placement/types.go index c5dcda9b2e8e8..5bb282342e7e9 100644 --- a/ddl/placement/types.go +++ b/ddl/placement/types.go @@ -108,6 +108,11 @@ func (b *Bundle) Clone() *Bundle { return newBundle } +// IsEmpty is used to check if a bundle is empty. +func (b *Bundle) IsEmpty() bool { + return len(b.Rules) == 0 && b.Index == 0 && !b.Override +} + // RuleOpType indicates the operation type. type RuleOpType string diff --git a/ddl/placement/types_test.go b/ddl/placement/types_test.go index 1e7be83006300..0b048692d9481 100644 --- a/ddl/placement/types_test.go +++ b/ddl/placement/types_test.go @@ -28,6 +28,23 @@ var _ = Suite(&testRuleSuite{}) type testBundleSuite struct{} +func (t *testBundleSuite) TestEmpty(c *C) { + bundle := &Bundle{ID: GroupID(1)} + c.Assert(bundle.IsEmpty(), IsTrue) + + bundle = &Bundle{ID: GroupID(1), Index: 1} + c.Assert(bundle.IsEmpty(), IsFalse) + + bundle = &Bundle{ID: GroupID(1), Override: true} + c.Assert(bundle.IsEmpty(), IsFalse) + + bundle = &Bundle{ID: GroupID(1), Rules: []*Rule{{ID: "434"}}} + c.Assert(bundle.IsEmpty(), IsFalse) + + bundle = &Bundle{ID: GroupID(1), Index: 1, Override: true} + c.Assert(bundle.IsEmpty(), IsFalse) +} + func (t *testBundleSuite) TestClone(c *C) { bundle := &Bundle{ID: GroupID(1), Rules: []*Rule{{ID: "434"}}} diff --git a/ddl/placement_rule_test.go b/ddl/placement_rule_test.go index 3fe3882275bdb..ec6d9b170abd2 100644 --- a/ddl/placement_rule_test.go +++ b/ddl/placement_rule_test.go @@ -253,50 +253,21 @@ func (s *testPlacementSuite) TestPlacementBuild(c *C) { func (s *testPlacementSuite) TestPlacementBuildDrop(c *C) { tests := []struct { - input []int64 - output []*placement.RuleOp + input int64 + output *placement.Bundle }{ { - input: []int64{2}, - output: []*placement.RuleOp{ - { - Action: placement.RuleOpDel, - DeleteByIDPrefix: true, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - ID: "0_t0_p2", - }, - }, - }, + input: 2, + output: &placement.Bundle{ID: placement.GroupID(2)}, }, { - input: []int64{1, 2}, - output: []*placement.RuleOp{ - { - Action: placement.RuleOpDel, - DeleteByIDPrefix: true, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - ID: "0_t0_p1", - }, - }, - { - Action: placement.RuleOpDel, - DeleteByIDPrefix: true, - Rule: &placement.Rule{ - GroupID: placement.RuleDefaultGroupID, - ID: "0_t0_p2", - }, - }, - }, + input: 1, + output: &placement.Bundle{ID: placement.GroupID(1)}, }, } for _, t := range tests { - out := buildPlacementDropRules(0, 0, t.input) - c.Assert(len(out), Equals, len(t.output)) - for i := range t.output { - c.Assert(s.compareRuleOp(out[i], t.output[i]), IsTrue, Commentf("expect: %+v, obtained: %+v", t.output[i], out[i])) - } + out := buildPlacementDropBundle(t.input) + c.Assert(t.output, DeepEquals, out) } } diff --git a/domain/infosync/info.go b/domain/infosync/info.go index 3eb549e3d4534..0660a3d583624 100644 --- a/domain/infosync/info.go +++ b/domain/infosync/info.go @@ -423,8 +423,12 @@ func GetRuleBundle(ctx context.Context, name string) (*placement.Bundle, error) return bundle, err } -// PutRuleBundle is used to post one specific rule bundle to PD. -func PutRuleBundle(ctx context.Context, bundle *placement.Bundle) error { +// PutRuleBundles is used to post specific rule bundles to PD. +func PutRuleBundles(ctx context.Context, bundles []*placement.Bundle) error { + if len(bundles) == 0 { + return nil + } + is, err := getGlobalInfoSyncer() if err != nil { return err @@ -440,12 +444,12 @@ func PutRuleBundle(ctx context.Context, bundle *placement.Bundle) error { return errors.Errorf("pd unavailable") } - b, err := json.Marshal(bundle) + b, err := json.Marshal(bundles) if err != nil { return err } - _, err = doRequest(ctx, addrs, path.Join(pdapi.Config, "placement-rule", bundle.ID), "POST", bytes.NewReader(b)) + _, err = doRequest(ctx, addrs, path.Join(pdapi.Config, "placement-rule")+"?partial=true", "POST", bytes.NewReader(b)) return err } From d355c6d965d219f271626b22b35df3f95ca70c7d Mon Sep 17 00:00:00 2001 From: Lynn Date: Tue, 29 Sep 2020 10:57:49 +0800 Subject: [PATCH 49/60] docs/design: add the proposal of changing column types (#18435) --- docs/design/2020-07-07-change-column-types.md | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 docs/design/2020-07-07-change-column-types.md diff --git a/docs/design/2020-07-07-change-column-types.md b/docs/design/2020-07-07-change-column-types.md new file mode 100644 index 0000000000000..3212ff93158d6 --- /dev/null +++ b/docs/design/2020-07-07-change-column-types.md @@ -0,0 +1,105 @@ +# Proposal: Changing column types + +- Author(s): [zimuxia](https://github.com/zimulala) (Xia Li) +- Last updated: 2020-07-07 +- Discussion at: https://tidbcommunity.slack.com/archives/CMAKWBNJU + +## Abstract + +This proposal proposes a new feature that supports column type modification more comprehensively. + +## Background + +This feature mainly uses the syntax of `alter table ... change/modify column` to support the modification of column type. The specific syntax is as follows: + +```sql +ALTER TABLE tbl_name + [alter_specification] + +alter_specification: +CHANGE [COLUMN] old_col_name new_col_name column_definition + [FIRST | AFTER col_name] +| MODIFY [COLUMN] col_name column_definition + [FIRST | AFTER col_name] +``` + +At present, column type modification only supports the lengthening of the same type, that is, there is no true change to the data type in the storage layer. The limitation of the new support is as follows: +* Lossy changes are not supported, such as changing from BIGINT to INTEGER, or from VARCHAR(255) to VARCHAR(10) +* Modification of the precision of DECIMAL type is not supported +* Does not support changing the UNSIGNED attribute +* Only support changing CHARACTER SET attribute from utf8 to utf8mb4 + +## Proposal + +The column type modifications supported by this proposal will involve rewriting column data and refactoring related indexes. This operation still needs to meet the basic requirements of online DDL operation, and to meet the compatibility between previous and subsequent versions of TiDB. + +To support this feature, TiDB needs to add additional related columns to the modified column. The type of the newly added column is the type you want to modify. In addition, it is necessary to add each additional related index to the index that contains this column, and update the type of the corresponding column in new indexes. + +## Rationale + +This proposal suggests adding additional related columns and indexes which involve the column to be modified, that is, making a copy of the columns and indexes that contain `the changed/modified column`. And if user data is written during the copying process, the corresponding data needs to be updated in real time. Assume that the type of `colA` is changed from `originalType` to `newType`, `idxA` (index with `colA`, here it is assumed that there is only one corresponding general index, the index has no relation to column generation). + +### Pre-preparation + +Add `ChangingCol` and `ChangingIdx` fields to the column and related index that need to be modified, which are used to associate the modified column and index information. + +When performing an insert or update operation (executed in the `AddRecord` or `UpdateRecord` function) on the column whose type is to be modified, the column and index to be backed up are written or updated according to the `newType` type. + +### Process + +1. Update the metadata information, including creating a corresponding column for `changingcolA` and `changingIdxA` for idxA, and add them to the end of the column array or index array in `TableInfo`. The state of `changingColA` and `changingIdxA` can be changed similar to add index operation, especially in `StateWriteReorganization` state, such as initializing reorganization information. +2. In the reorganization processing stage, row data and index data need to be processed in batches, which is similar to the `add index` operation during initial implementation. Get the batch processing range, and then use the `newType` to construct the `changingColA` and `changingIdxA` information for the insert operation (this operation requires the corresponding row and index column to be locked). If data-truncated are encountered and errors at this stage, it is necessary to report the errors and roll back to exit. +3. The next phase of change requires 3 status changes: + * Lock this table and cannot write to it. + * Drop `colA` and `idxA`, change the status of `changingColA` and `changingIdxA` to public, and change their names, offsets, etc. + * Unlock this table. + +### Note + +This operation itself is an `alter table tableName modify/change column …` statement, which includes changing the column type, changing the column attribute from null to not null, changing the column offset, etc. Considering the atomicity, some operations need to be changed together. + +In addition, due to the complexity of this feature, considering that the friendly review needs to be divided into multiple PRs, a switch can be added to deal with the problem of multiple PRs. + +### Rolling back + +This requires changing the state of `colA` and `idxA` to `StatePublic`, and then dropping `changingColA` and `changingIdxA`. Of course, if you modify the flag and other attributes, you need to roll back. + +## Compatibility + +### Compatibility issues with MySQL + +* Considering the complexity of supporting clustered-index and currently TiDB does not fully support clustered-index, so temporarily this feature does not support type modification for columns with the primary key. + +### Compatibility issues with TiDB + +The DDL statement itself already has a corresponding type (ActionModifyColumn). If you need to improve this operation, you will encounter compatibility issues when performing rolling upgrades. This problem is handled by adding a global variable `tidb_enable_change_column_type`. When this value is true, the `modify/change column` statement is allowed to perform more types of column type changes (features supported by this proposal). + +* For new clusters, set this variable to true during bootstrap. +* For clusters requiring rolling upgrade, the default value is false, and users need to explicitly set this variable to true. + +### Compatible issues with other components + +This feature needs to be synchronized with components such as Tools, TiFlash, and BR. + +## Implementation + +In addition to considering the update of the corresponding column type and data, and the update of the data in the index column involved, the implementation of column type modification also needs to consider the following characteristics. + +### Generate columns + +When the modified type relates to generated columns (either stored or virtual), the implementation has the following characteristics: + +* The generated column type related to this column is unchanged. +* When performing an insert operation, the column value of the modified type will be affected by the generated column expression with this column. +* The value of the relevant generated column changes with the value of the column of the modified type. + +### Expression index + +When columns of the modified type have a related expression index, the implementation has the following characteristics: + +* The Type, DBType and Max_length of the related expression index may be modified. +* When performing an insert operation, the value of the column of the modified type will be affected by the expression in the expression index of this column. + +## Open issues (if applicable) + +https://github.com/pingcap/tidb/issues/17526 From 132d9817d7da4a77294c3566e4947ea462679e40 Mon Sep 17 00:00:00 2001 From: Lingyu Song Date: Tue, 29 Sep 2020 11:08:53 +0800 Subject: [PATCH 50/60] executor: support partition pruning for `IndexJoin` inner table (#19990) --- executor/builder.go | 223 +++++++++++++++++++++++++++++++--- executor/index_lookup_join.go | 7 +- executor/partition_table.go | 38 +++++- table/tables/partition.go | 41 ++++++- 4 files changed, 282 insertions(+), 27 deletions(-) diff --git a/executor/builder.go b/executor/builder.go index 5f6154c1ee6d3..7e2b01ba4358f 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -2563,7 +2563,7 @@ func (b *executorBuilder) buildTableReader(v *plannercore.PhysicalTableReader) E } } - nextPartition := nextPartitionForTableReader{ret} + nextPartition := nextPartitionForTableReader{exec: ret} exec, err := buildPartitionTable(b, ts.Table, &v.PartitionInfo, ret, nextPartition) if err != nil { b.err = err @@ -2590,6 +2590,111 @@ func buildPartitionTable(b *executorBuilder, tblInfo *model.TableInfo, partition }, nil } +func buildIndexRangeForEachPartition(ctx sessionctx.Context, usedPartitions []table.PhysicalTable, contentPos []int64, + lookUpContent []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager) (map[int64][]*ranger.Range, error) { + contentBucket := make(map[int64][]*indexJoinLookUpContent) + for _, p := range usedPartitions { + contentBucket[p.GetPhysicalID()] = make([]*indexJoinLookUpContent, 0, 8) + } + for i, pos := range contentPos { + if _, ok := contentBucket[pos]; ok { + contentBucket[pos] = append(contentBucket[pos], lookUpContent[i]) + } + } + nextRange := make(map[int64][]*ranger.Range) + for _, p := range usedPartitions { + ranges, err := buildRangesForIndexJoin(ctx, contentBucket[p.GetPhysicalID()], indexRanges, keyOff2IdxOff, cwc) + if err != nil { + return nil, err + } + nextRange[p.GetPhysicalID()] = ranges + } + return nextRange, nil +} + +func buildKVRangeForEachPartition(ctx sessionctx.Context, usedPartitions []table.PhysicalTable, contentPos []int64, isCommonHandle bool, + lookUpContents []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager) (map[int64]kvRangeBuilder, error) { + rangeBuilders := make(map[int64]kvRangeBuilder) + contentBucket := make(map[int64][]*indexJoinLookUpContent) + for _, p := range usedPartitions { + contentBucket[p.GetPhysicalID()] = make([]*indexJoinLookUpContent, 0, 8) + } + for i, pos := range contentPos { + if _, ok := contentBucket[pos]; ok { + contentBucket[pos] = append(contentBucket[pos], lookUpContents[i]) + } + } + for _, p := range usedPartitions { + if isCommonHandle { + rangeBuilders[p.GetPhysicalID()] = kvRangeBuilderFromFunc(func(pid int64) ([]kv.KeyRange, error) { + return buildKvRangesForIndexJoin(ctx, pid, -1, contentBucket[pid], indexRanges, keyOff2IdxOff, cwc) + }) + } else { + handles := make([]kv.Handle, 0, len(contentBucket[p.GetPhysicalID()])) + for _, content := range contentBucket[p.GetPhysicalID()] { + handle := kv.IntHandle(content.keys[0].GetInt64()) + handles = append(handles, handle) + } + rangeBuilders[p.GetPhysicalID()] = kvRangeBuilderFromHandles(handles) + } + } + return rangeBuilders, nil +} + +func prunePartitionForInnerExecutor(ctx sessionctx.Context, tbl table.Table, schema *expression.Schema, partitionInfo *plannercore.PartitionInfo, + lookUpContent []*indexJoinLookUpContent) (usedPartition []table.PhysicalTable, canPrune bool, contentPos []int64, err error) { + partitionTbl := tbl.(table.PartitionedTable) + locateKey := make([]types.Datum, schema.Len()) + // TODO: condition based pruning can be do in advance. + condPruneResult, err := partitionPruning(ctx, partitionTbl, partitionInfo.PruningConds, partitionInfo.PartitionNames, partitionInfo.Columns, partitionInfo.ColumnNames) + if err != nil { + return nil, false, nil, err + } + + // check whether can runtime prune. + type partitionExpr interface { + PartitionExpr() (*tables.PartitionExpr, error) + } + pe, err := tbl.(partitionExpr).PartitionExpr() + if err != nil { + return nil, false, nil, err + } + offsetMap := make(map[int]bool) + for _, offset := range lookUpContent[0].keyCols { + offsetMap[offset] = true + } + for _, offset := range pe.ColumnOffset { + if _, ok := offsetMap[offset]; !ok { + logutil.BgLogger().Warn("can not runtime prune in index join") + return condPruneResult, false, nil, nil + } + } + + partitions := make(map[int64]table.PhysicalTable) + contentPos = make([]int64, len(lookUpContent)) + for idx, content := range lookUpContent { + for i, date := range content.keys { + locateKey[content.keyCols[i]] = date + } + p, err := partitionTbl.GetPartitionByRow(ctx, locateKey) + if err != nil { + return nil, false, nil, err + } + if _, ok := partitions[p.GetPhysicalID()]; !ok { + partitions[p.GetPhysicalID()] = p + } + contentPos[idx] = p.GetPhysicalID() + } + + usedPartition = make([]table.PhysicalTable, 0, len(partitions)) + for _, p := range condPruneResult { + if _, ok := partitions[p.GetPhysicalID()]; ok { + usedPartition = append(usedPartition, p) + } + } + return usedPartition, true, contentPos, nil +} + func buildNoRangeIndexReader(b *executorBuilder, v *plannercore.PhysicalIndexReader) (*IndexReaderExecutor, error) { dagReq, streaming, err := b.constructDAGReq(v.IndexPlans, kv.TiKV) if err != nil { @@ -3038,10 +3143,33 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte e.kvRangeBuilder = kvRangeBuilderFromFunc(func(pid int64) ([]kv.KeyRange, error) { return buildKvRangesForIndexJoin(e.ctx, pid, -1, lookUpContents, indexRanges, keyOff2IdxOff, cwc) }) - nextPartition := nextPartitionForTableReader{e} - return buildPartitionTable(builder.executorBuilder, tbInfo, &v.PartitionInfo, e, nextPartition) + nextPartition := nextPartitionForTableReader{exec: e, innerPartitionInfo: &innerPartitionInfo{isFullPartition: true}} + tbl, _ := builder.executorBuilder.is.TableByID(tbInfo.ID) + usedPartition, canPrune, contentPos, err := prunePartitionForInnerExecutor(builder.executorBuilder.ctx, tbl, e.Schema(), &v.PartitionInfo, lookUpContents) + if err != nil { + return nil, err + } + if len(usedPartition) != 0 { + if canPrune { + rangeBuilders, err := buildKVRangeForEachPartition(e.ctx, usedPartition, contentPos, v.IsCommonHandle, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + if err != nil { + return nil, err + } + nextPartition.rangeBuilders = rangeBuilders + nextPartition.isFullPartition = false + } + partitionExec := &PartitionTableExecutor{ + baseExecutor: *e.base(), + partitions: usedPartition, + nextPartition: nextPartition, + } + return partitionExec, nil + } + ret := &TableDualExec{baseExecutor: *e.base()} + return ret, err } handles := make([]kv.Handle, 0, len(lookUpContents)) + validLookUpContents := make([]*indexJoinLookUpContent, 0, len(lookUpContents)) for _, content := range lookUpContents { isValidHandle := true handle := kv.IntHandle(content.keys[0].GetInt64()) @@ -3053,6 +3181,7 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte } if isValidHandle { handles = append(handles, handle) + validLookUpContents = append(validLookUpContents, content) } } @@ -3062,10 +3191,31 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte if !builder.ctx.GetSessionVars().UseDynamicPartitionPrune() { return builder.buildTableReaderFromHandles(ctx, e, handles, canReorderHandles) } - e.kvRangeBuilder = kvRangeBuilderFromHandles(handles) - nextPartition := nextPartitionForTableReader{e} - return buildPartitionTable(builder.executorBuilder, tbInfo, &v.PartitionInfo, e, nextPartition) + nextPartition := nextPartitionForTableReader{exec: e, innerPartitionInfo: &innerPartitionInfo{isFullPartition: true}} + tbl, _ := builder.executorBuilder.is.TableByID(tbInfo.ID) + usedPartition, canPrune, contentPos, err := prunePartitionForInnerExecutor(builder.executorBuilder.ctx, tbl, e.Schema(), &v.PartitionInfo, validLookUpContents) + if err != nil { + return nil, err + } + if len(usedPartition) != 0 { + if canPrune { + rangeBuilders, err := buildKVRangeForEachPartition(e.ctx, usedPartition, contentPos, v.IsCommonHandle, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + if err != nil { + return nil, err + } + nextPartition.rangeBuilders = rangeBuilders + nextPartition.isFullPartition = false + } + partitionExec := &PartitionTableExecutor{ + baseExecutor: *e.base(), + partitions: usedPartition, + nextPartition: nextPartition, + } + return partitionExec, nil + } + ret := &TableDualExec{baseExecutor: *e.base()} + return ret, err } type kvRangeBuilderFromFunc func(pid int64) ([]kv.KeyRange, error) @@ -3148,15 +3298,35 @@ func (builder *dataReaderBuilder) buildIndexReaderForIndexJoin(ctx context.Conte return e, err } - e.ranges, err = buildRangesForIndexJoin(e.ctx, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + nextPartition := nextPartitionForIndexReader{exec: e, innerPartitionInfo: &innerPartitionInfo{isFullPartition: true}} + tbl, _ := builder.executorBuilder.is.TableByID(tbInfo.ID) + usedPartition, canPrune, contentPos, err := prunePartitionForInnerExecutor(builder.executorBuilder.ctx, tbl, e.Schema(), &v.PartitionInfo, lookUpContents) if err != nil { return nil, err } - nextPartition := nextPartitionForIndexReader{exec: e} - ret, err := buildPartitionTable(builder.executorBuilder, tbInfo, &v.PartitionInfo, e, nextPartition) - if err != nil { - return nil, err + if len(usedPartition) != 0 { + if canPrune { + rangeMap, err := buildIndexRangeForEachPartition(e.ctx, usedPartition, contentPos, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + if err != nil { + return nil, err + } + nextPartition.isFullPartition = false + nextPartition.nextRange = rangeMap + } else { + e.ranges, err = buildRangesForIndexJoin(e.ctx, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + if err != nil { + return nil, err + } + } + partitionExec := &PartitionTableExecutor{ + baseExecutor: *e.base(), + partitions: usedPartition, + nextPartition: nextPartition, + } + err = partitionExec.Open(ctx) + return partitionExec, err } + ret := &TableDualExec{baseExecutor: *e.base()} err = ret.Open(ctx) return ret, err } @@ -3177,16 +3347,35 @@ func (builder *dataReaderBuilder) buildIndexLookUpReaderForIndexJoin(ctx context err = e.open(ctx) return e, err } - - e.ranges, err = buildRangesForIndexJoin(e.ctx, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + nextPartition := nextPartitionForIndexLookUp{exec: e, innerPartitionInfo: &innerPartitionInfo{isFullPartition: true}} + tbl, _ := builder.executorBuilder.is.TableByID(tbInfo.ID) + usedPartition, canPrune, contentPos, err := prunePartitionForInnerExecutor(builder.executorBuilder.ctx, tbl, e.Schema(), &v.PartitionInfo, lookUpContents) if err != nil { return nil, err } - nextPartition := nextPartitionForIndexLookUp{exec: e} - ret, err := buildPartitionTable(builder.executorBuilder, tbInfo, &v.PartitionInfo, e, nextPartition) - if err != nil { - return nil, err + if len(usedPartition) != 0 { + if canPrune { + rangeMap, err := buildIndexRangeForEachPartition(e.ctx, usedPartition, contentPos, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + if err != nil { + return nil, err + } + nextPartition.isFullPartition = false + nextPartition.nextRange = rangeMap + } else { + e.ranges, err = buildRangesForIndexJoin(e.ctx, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + if err != nil { + return nil, err + } + } + partitionExec := &PartitionTableExecutor{ + baseExecutor: *e.base(), + partitions: usedPartition, + nextPartition: nextPartition, + } + err = partitionExec.Open(ctx) + return partitionExec, err } + ret := &TableDualExec{baseExecutor: *e.base()} err = ret.Open(ctx) return ret, err } diff --git a/executor/index_lookup_join.go b/executor/index_lookup_join.go index 8dde95a671c5b..be972aade587c 100644 --- a/executor/index_lookup_join.go +++ b/executor/index_lookup_join.go @@ -492,8 +492,9 @@ func (iw *innerWorker) run(ctx context.Context, wg *sync.WaitGroup) { } type indexJoinLookUpContent struct { - keys []types.Datum - row chunk.Row + keys []types.Datum + row chunk.Row + keyCols []int } func (iw *innerWorker) handleTask(ctx context.Context, task *lookUpJoinTask) error { @@ -558,7 +559,7 @@ func (iw *innerWorker) constructLookupContent(task *lookUpJoinTask) ([]*indexJoi // dLookUpKey is sorted and deduplicated at sortAndDedupLookUpContents. // So we don't need to do it here. } - lookUpContents = append(lookUpContents, &indexJoinLookUpContent{keys: dLookUpKey, row: chk.GetRow(rowIdx)}) + lookUpContents = append(lookUpContents, &indexJoinLookUpContent{keys: dLookUpKey, row: chk.GetRow(rowIdx), keyCols: iw.keyCols}) } } diff --git a/executor/partition_table.go b/executor/partition_table.go index 6989c0eef7a7f..88ac2ad769b4c 100644 --- a/executor/partition_table.go +++ b/executor/partition_table.go @@ -22,6 +22,7 @@ import ( plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tipb/go-tipb" ) @@ -40,13 +41,32 @@ type nextPartition interface { nextPartition(context.Context, table.PhysicalTable) (Executor, error) } +type innerPartitionInfo struct { + isFullPartition bool + nextRange map[int64][]*ranger.Range +} + +type innerNextPartition interface { + nextPartition + GetInnerPartitionInfo() *innerPartitionInfo +} + type nextPartitionForTableReader struct { - exec *TableReaderExecutor + *innerPartitionInfo + rangeBuilders map[int64]kvRangeBuilder + exec *TableReaderExecutor +} + +func (n nextPartitionForTableReader) GetInnerPartitionInfo() *innerPartitionInfo { + return n.innerPartitionInfo } func (n nextPartitionForTableReader) nextPartition(ctx context.Context, tbl table.PhysicalTable) (Executor, error) { n.exec.table = tbl n.exec.kvRanges = n.exec.kvRanges[:0] + if n.innerPartitionInfo != nil && !n.isFullPartition { + n.exec.kvRangeBuilder = n.rangeBuilders[tbl.GetPhysicalID()] + } if err := updateDAGRequestTableID(ctx, n.exec.dagPB, tbl.Meta().ID, tbl.GetPhysicalID()); err != nil { return nil, err } @@ -54,22 +74,38 @@ func (n nextPartitionForTableReader) nextPartition(ctx context.Context, tbl tabl } type nextPartitionForIndexLookUp struct { + *innerPartitionInfo exec *IndexLookUpExecutor } +func (n nextPartitionForIndexLookUp) GetInnerPartitionInfo() *innerPartitionInfo { + return n.innerPartitionInfo +} + func (n nextPartitionForIndexLookUp) nextPartition(ctx context.Context, tbl table.PhysicalTable) (Executor, error) { n.exec.table = tbl + if n.innerPartitionInfo != nil && !n.isFullPartition { + n.exec.ranges = n.nextRange[tbl.GetPhysicalID()] + } return n.exec, nil } type nextPartitionForIndexReader struct { + *innerPartitionInfo exec *IndexReaderExecutor } +func (n nextPartitionForIndexReader) GetInnerPartitionInfo() *innerPartitionInfo { + return n.innerPartitionInfo +} + func (n nextPartitionForIndexReader) nextPartition(ctx context.Context, tbl table.PhysicalTable) (Executor, error) { exec := n.exec exec.table = tbl exec.physicalTableID = tbl.GetPhysicalID() + if n.innerPartitionInfo != nil && !n.isFullPartition { + exec.ranges = n.nextRange[tbl.GetPhysicalID()] + } return exec, nil } diff --git a/table/tables/partition.go b/table/tables/partition.go index 4cfe8092d1315..bcb5e6a2b28c2 100644 --- a/table/tables/partition.go +++ b/table/tables/partition.go @@ -132,6 +132,8 @@ type PartitionExpr struct { *ForRangePruning // Used in the range column pruning process. *ForRangeColumnsPruning + // ColOffset is the offsets of partition columns. + ColumnOffset []int } func initEvalBufferType(t *partitionedTable) { @@ -292,12 +294,28 @@ func generateRangePartitionExpr(ctx sessionctx.Context, pi *model.PartitionInfo, UpperBounds: locateExprs, } + // build column offset. + partExp := pi.Expr + if len(pi.Columns) == 1 { + partExp = pi.Columns[0].L + } + exprs, err := parseSimpleExprWithNames(p, ctx, partExp, schema, names) + if err != nil { + return nil, err + } + partitionCols := expression.ExtractColumns(exprs) + offset := make([]int, len(partitionCols)) + for i, col := range columns { + for j, partitionCol := range partitionCols { + if partitionCol.UniqueID == col.UniqueID { + offset[j] = i + } + } + } + ret.ColumnOffset = offset + switch len(pi.Columns) { case 0: - exprs, err := parseSimpleExprWithNames(p, ctx, pi.Expr, schema, names) - if err != nil { - return nil, err - } tmp, err := dataForRangePruning(ctx, pi) if err != nil { return nil, errors.Trace(err) @@ -330,10 +348,21 @@ func generateHashPartitionExpr(ctx sessionctx.Context, pi *model.PartitionInfo, logutil.BgLogger().Error("wrong table partition expression", zap.String("expression", pi.Expr), zap.Error(err)) return nil, errors.Trace(err) } + // build column offset. + partitionCols := expression.ExtractColumns(exprs) + offset := make([]int, len(partitionCols)) + for i, col := range columns { + for j, partitionCol := range partitionCols { + if partitionCol.UniqueID == col.UniqueID { + offset[j] = i + } + } + } exprs.HashCode(ctx.GetSessionVars().StmtCtx) return &PartitionExpr{ - Expr: exprs, - OrigExpr: origExpr, + Expr: exprs, + OrigExpr: origExpr, + ColumnOffset: offset, }, nil } From 2809a57981e4a97be870ee16e8836d93ab70c5fb Mon Sep 17 00:00:00 2001 From: xhe Date: Tue, 29 Sep 2020 11:51:07 +0800 Subject: [PATCH 51/60] types: fix year conversion (#19781) --- types/convert_test.go | 16 ++++++++++++++++ types/datum.go | 7 +++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/types/convert_test.go b/types/convert_test.go index 4b898f82bf007..7d5147f0f7de0 100644 --- a/types/convert_test.go +++ b/types/convert_test.go @@ -687,10 +687,26 @@ func (s *testTypeConvertSuite) TestConvert(c *C) { signedAccept(c, mysql.TypeYear, 1901, "1901") signedAccept(c, mysql.TypeYear, 1900.567, "1901") signedDeny(c, mysql.TypeYear, 1900.456, "0") + signedAccept(c, mysql.TypeYear, 0, "0") + signedAccept(c, mysql.TypeYear, "0", "2000") + signedAccept(c, mysql.TypeYear, "00", "2000") + signedAccept(c, mysql.TypeYear, " 0", "2000") + signedAccept(c, mysql.TypeYear, " 00", "2000") + signedAccept(c, mysql.TypeYear, " 000", "0") + signedAccept(c, mysql.TypeYear, " 0000 ", "2000") + signedAccept(c, mysql.TypeYear, " 0ab", "0") + signedAccept(c, mysql.TypeYear, "00bc", "0") + signedAccept(c, mysql.TypeYear, "000a", "0") + signedAccept(c, mysql.TypeYear, " 000a ", "2000") signedAccept(c, mysql.TypeYear, 1, "2001") + signedAccept(c, mysql.TypeYear, "1", "2001") + signedAccept(c, mysql.TypeYear, "01", "2001") signedAccept(c, mysql.TypeYear, 69, "2069") + signedAccept(c, mysql.TypeYear, "69", "2069") signedAccept(c, mysql.TypeYear, 70, "1970") + signedAccept(c, mysql.TypeYear, "70", "1970") signedAccept(c, mysql.TypeYear, 99, "1999") + signedAccept(c, mysql.TypeYear, "99", "1999") signedDeny(c, mysql.TypeYear, 100, "0") signedDeny(c, mysql.TypeYear, "99999999999999999999999999999999999", "0") diff --git a/types/datum.go b/types/datum.go index 5b4d2187bdd35..fbccd3bdfedaa 100644 --- a/types/datum.go +++ b/types/datum.go @@ -1333,12 +1333,15 @@ func (d *Datum) convertToMysqlYear(sc *stmtctx.StatementContext, target *FieldTy switch d.k { case KindString, KindBytes: s := d.GetString() - y, err = StrToInt(sc, s, false) + trimS := strings.TrimSpace(s) + y, err = StrToInt(sc, trimS, false) if err != nil { ret.SetInt64(0) return ret, errors.Trace(err) } - if len(s) != 4 && len(s) > 0 && s[0:1] == "0" { + // condition: + // parsed to 0, not a string of length 4, the first valid char is a 0 digit + if len(s) != 4 && y == 0 && strings.HasPrefix(trimS, "0") { adjust = true } case KindMysqlTime: From fa81ec51b4181863553e70f0505710a6bf3f3c23 Mon Sep 17 00:00:00 2001 From: Null not nil <67764674+nullnotnil@users.noreply.github.com> Date: Tue, 29 Sep 2020 00:04:24 -0600 Subject: [PATCH 52/60] *: refactor sysvars to allow component registration (#20289) --- executor/infoschema_reader.go | 2 +- executor/show.go | 6 +- executor/simple.go | 6 +- planner/core/expression_rewriter.go | 2 +- .../conn_ip_example/conn_ip_example_test.go | 2 - plugin/plugin.go | 2 +- plugin/plugin_test.go | 1 - server/server.go | 16 +- session/bootstrap.go | 6 +- session/bootstrap_test.go | 2 +- session/session.go | 4 +- sessionctx/variable/mock_globalaccessor.go | 2 +- sessionctx/variable/sysvar.go | 1341 +++++++++-------- sessionctx/variable/varsutil.go | 11 +- tidb-server/main.go | 23 +- tidb-server/main_test.go | 8 +- 16 files changed, 743 insertions(+), 691 deletions(-) diff --git a/executor/infoschema_reader.go b/executor/infoschema_reader.go index e4b7e09039fe5..137a29b8cde60 100644 --- a/executor/infoschema_reader.go +++ b/executor/infoschema_reader.go @@ -1583,7 +1583,7 @@ func (e *memtableRetriever) setDataFromSessionVar(ctx sessionctx.Context) error var rows [][]types.Datum var err error sessionVars := ctx.GetSessionVars() - for _, v := range variable.SysVars { + for _, v := range variable.GetSysVars() { var value string value, err = variable.GetSessionSystemVar(sessionVars, v.Name) if err != nil { diff --git a/executor/show.go b/executor/show.go index 7bb9c4afeb256..521532988b71e 100644 --- a/executor/show.go +++ b/executor/show.go @@ -650,9 +650,9 @@ func (e *ShowExec) fetchShowVariables() (err error) { value string ok bool sessionVars = e.ctx.GetSessionVars() - unreachedVars = make([]string, 0, len(variable.SysVars)) + unreachedVars = make([]string, 0, len(variable.GetSysVars())) ) - for _, v := range variable.SysVars { + for _, v := range variable.GetSysVars() { if !e.GlobalScope { // For a session scope variable, // 1. try to fetch value from SessionVars.Systems; @@ -682,7 +682,7 @@ func (e *ShowExec) fetchShowVariables() (err error) { for _, varName := range unreachedVars { varValue, ok := systemVars[varName] if !ok { - varValue = variable.SysVars[varName].Value + varValue = variable.GetSysVar(varName).Value } e.appendRow([]interface{}{varName, varValue}) } diff --git a/executor/simple.go b/executor/simple.go index 79b8e36a73373..21b04b9c16532 100644 --- a/executor/simple.go +++ b/executor/simple.go @@ -1128,9 +1128,9 @@ func (e *SimpleExec) executeAlterInstance(s *ast.AlterInstanceStmt) error { logutil.BgLogger().Info("execute reload tls", zap.Bool("NoRollbackOnError", s.NoRollbackOnError)) sm := e.ctx.GetSessionManager() tlsCfg, err := util.LoadTLSCertificates( - variable.SysVars["ssl_ca"].Value, - variable.SysVars["ssl_key"].Value, - variable.SysVars["ssl_cert"].Value, + variable.GetSysVar("ssl_ca").Value, + variable.GetSysVar("ssl_key").Value, + variable.GetSysVar("ssl_cert").Value, ) if err != nil { if !s.NoRollbackOnError || config.GetGlobalConfig().Security.RequireSecureTransport { diff --git a/planner/core/expression_rewriter.go b/planner/core/expression_rewriter.go index 90a8fb42b45fd..1df958dfdbc5e 100644 --- a/planner/core/expression_rewriter.go +++ b/planner/core/expression_rewriter.go @@ -1136,7 +1136,7 @@ func (er *expressionRewriter) rewriteVariable(v *ast.VariableExpr) { return } } - sysVar := variable.SysVars[name] + sysVar := variable.GetSysVar(name) if sysVar == nil { er.err = variable.ErrUnknownSystemVar.GenWithStackByArgs(name) return diff --git a/plugin/conn_ip_example/conn_ip_example_test.go b/plugin/conn_ip_example/conn_ip_example_test.go index 096ef7e3a6003..fa2a776488f25 100644 --- a/plugin/conn_ip_example/conn_ip_example_test.go +++ b/plugin/conn_ip_example/conn_ip_example_test.go @@ -19,7 +19,6 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/tidb/plugin" - "github.com/pingcap/tidb/sessionctx/variable" ) func LoadRunShutdownPluginExample() { @@ -28,7 +27,6 @@ func LoadRunShutdownPluginExample() { cfg := plugin.Config{ Plugins: []string{"conn_ip_example-1"}, PluginDir: "/home/robi/Code/go/src/github.com/pingcap/tidb/plugin/conn_ip_example", - GlobalSysVar: &variable.SysVars, PluginVarNames: &pluginVarNames, } diff --git a/plugin/plugin.go b/plugin/plugin.go index 36a8fb287bf3d..4c6b7534c68a6 100644 --- a/plugin/plugin.go +++ b/plugin/plugin.go @@ -200,7 +200,7 @@ func Load(ctx context.Context, cfg Config) (err error) { } if cfg.GlobalSysVar != nil { for key, value := range tiPlugins.plugins[kind][i].SysVars { - (*cfg.GlobalSysVar)[key] = value + variable.RegisterSysVar(value) if value.Scope != variable.ScopeSession && cfg.PluginVarNames != nil { *cfg.PluginVarNames = append(*cfg.PluginVarNames, key) } diff --git a/plugin/plugin_test.go b/plugin/plugin_test.go index 851afd5420d19..224484075b435 100644 --- a/plugin/plugin_test.go +++ b/plugin/plugin_test.go @@ -37,7 +37,6 @@ func TestLoadPluginSuccess(t *testing.T) { cfg := Config{ Plugins: []string{pluginSign}, PluginDir: "", - GlobalSysVar: &variable.SysVars, PluginVarNames: &variable.PluginVarNames, EnvVersion: map[string]uint16{"go": 1112}, } diff --git a/server/server.go b/server/server.go index cfbd9bddb602b..8954eca113a77 100644 --- a/server/server.go +++ b/server/server.go @@ -220,7 +220,7 @@ func NewServer(cfg *config.Config, driver IDriver) (*Server, error) { if tlsConfig != nil { setSSLVariable(s.cfg.Security.SSLCA, s.cfg.Security.SSLKey, s.cfg.Security.SSLCert) atomic.StorePointer(&s.tlsConfig, unsafe.Pointer(tlsConfig)) - logutil.BgLogger().Info("mysql protocol server secure connection is enabled", zap.Bool("client verification enabled", len(variable.SysVars["ssl_ca"].Value) > 0)) + logutil.BgLogger().Info("mysql protocol server secure connection is enabled", zap.Bool("client verification enabled", len(variable.GetSysVar("ssl_ca").Value) > 0)) } else if cfg.Security.RequireSecureTransport { return nil, errSecureTransportRequired.FastGenByArgs() } @@ -278,11 +278,11 @@ func NewServer(cfg *config.Config, driver IDriver) (*Server, error) { } func setSSLVariable(ca, key, cert string) { - variable.SysVars["have_openssl"].Value = "YES" - variable.SysVars["have_ssl"].Value = "YES" - variable.SysVars["ssl_cert"].Value = cert - variable.SysVars["ssl_key"].Value = key - variable.SysVars["ssl_ca"].Value = ca + variable.SetSysVar("have_openssl", "YES") + variable.SetSysVar("have_ssl", "YES") + variable.SetSysVar("ssl_cert", cert) + variable.SetSysVar("ssl_key", key) + variable.SetSysVar("ssl_ca", ca) } // Run runs the server. @@ -631,10 +631,10 @@ func setSystemTimeZoneVariable() { logutil.BgLogger().Error( "Error getting SystemTZ, use default value instead", zap.Error(err), - zap.String("default system_time_zone", variable.SysVars["system_time_zone"].Value)) + zap.String("default system_time_zone", variable.GetSysVar("system_time_zone").Value)) return } - variable.SysVars["system_time_zone"].Value = tz + variable.SetSysVar("system_time_zone", tz) }) } diff --git a/session/bootstrap.go b/session/bootstrap.go index 10884c094c4cc..1551a84336cb0 100644 --- a/session/bootstrap.go +++ b/session/bootstrap.go @@ -584,7 +584,7 @@ func upgradeToVer2(s Session, ver int64) { distSQLVars := []string{variable.TiDBDistSQLScanConcurrency} values := make([]string, 0, len(distSQLVars)) for _, v := range distSQLVars { - value := fmt.Sprintf(`("%s", "%s")`, v, variable.SysVars[v].Value) + value := fmt.Sprintf(`("%s", "%s")`, v, variable.GetSysVar(v).Value) values = append(values, value) } sql := fmt.Sprintf("INSERT HIGH_PRIORITY IGNORE INTO %s.%s VALUES %s;", mysql.SystemDB, mysql.GlobalVariablesTable, @@ -1262,8 +1262,8 @@ func doDMLWorks(s Session) { ("%", "root", "", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y")`) // Init global system variables table. - values := make([]string, 0, len(variable.SysVars)) - for k, v := range variable.SysVars { + values := make([]string, 0, len(variable.GetSysVars())) + for k, v := range variable.GetSysVars() { // Session only variable should not be inserted. if v.Scope != variable.ScopeSession { vVal := v.Value diff --git a/session/bootstrap_test.go b/session/bootstrap_test.go index d4ce4bffb4608..a0c4c6d9127c5 100644 --- a/session/bootstrap_test.go +++ b/session/bootstrap_test.go @@ -104,7 +104,7 @@ func (s *testBootstrapSuite) TestBootstrap(c *C) { func globalVarsCount() int64 { var count int64 - for _, v := range variable.SysVars { + for _, v := range variable.GetSysVars() { if v.Scope != variable.ScopeSession { count++ } diff --git a/session/session.go b/session/session.go index 1ff66585d2723..38370ec38afc1 100644 --- a/session/session.go +++ b/session/session.go @@ -983,7 +983,8 @@ func (s *session) GetGlobalSysVar(name string) (string, error) { sysVar, err := s.getExecRet(s, sql) if err != nil { if executor.ErrResultIsEmpty.Equal(err) { - if sv, ok := variable.SysVars[name]; ok { + sv := variable.GetSysVar(name) + if sv != nil { return sv.Value, nil } return "", variable.ErrUnknownSystemVar.GenWithStackByArgs(name) @@ -1769,7 +1770,6 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { err := plugin.Load(context.Background(), plugin.Config{ Plugins: strings.Split(cfg.Plugin.Load, ","), PluginDir: cfg.Plugin.Dir, - GlobalSysVar: &variable.SysVars, PluginVarNames: &variable.PluginVarNames, }) if err != nil { diff --git a/sessionctx/variable/mock_globalaccessor.go b/sessionctx/variable/mock_globalaccessor.go index 24ab573eb2610..9230de81e75b2 100644 --- a/sessionctx/variable/mock_globalaccessor.go +++ b/sessionctx/variable/mock_globalaccessor.go @@ -24,7 +24,7 @@ func NewMockGlobalAccessor() *MockGlobalAccessor { // GetGlobalSysVar implements GlobalVarAccessor.GetGlobalSysVar interface. func (m *MockGlobalAccessor) GetGlobalSysVar(name string) (string, error) { - v, ok := SysVars[name] + v, ok := sysVars[name] if ok { return v.Value, nil } diff --git a/sessionctx/variable/sysvar.go b/sessionctx/variable/sysvar.go index 4063639923f0d..a613745326521 100644 --- a/sessionctx/variable/sysvar.go +++ b/sessionctx/variable/sysvar.go @@ -16,6 +16,7 @@ package variable import ( "strconv" "strings" + "sync" "sync/atomic" "github.com/pingcap/parser/mysql" @@ -28,6 +29,9 @@ import ( // ScopeFlag is for system variable whether can be changed in global/session dynamically or not. type ScopeFlag uint8 +// TypeFlag is the SysVar type, which doesn't exactly match MySQL types. +type TypeFlag byte + const ( // ScopeNone means the system variable can not be changed dynamically. ScopeNone ScopeFlag = 0 @@ -35,6 +39,25 @@ const ( ScopeGlobal ScopeFlag = 1 << 0 // ScopeSession means the system variable can only be changed in current session. ScopeSession ScopeFlag = 1 << 1 + + // TypeBool for boolean + TypeBool TypeFlag = 0 + // TypeInt for integer + TypeInt TypeFlag = 1 + // TypeLong for Long + TypeLong TypeFlag = 2 + // TypeLongLong for LongLong + TypeLongLong TypeFlag = 3 + // TypeStr for String + TypeStr TypeFlag = 4 + // TypeEnum for Enum + TypeEnum TypeFlag = 5 + // TypeSet for Set + TypeSet TypeFlag = 6 + // TypeDouble for Double + TypeDouble TypeFlag = 7 + // TypeUnsigned for Unsigned integer + TypeUnsigned TypeFlag = 8 ) // SysVar is for system variable. @@ -47,24 +70,58 @@ type SysVar struct { // Value is the variable value. Value string + + // Type is the MySQL type (optional) + Type TypeFlag + + // MinValue will automatically be validated when specified (optional) + MinValue int64 + + // MaxValue will automatically be validated when specified (optional) + MaxValue int64 } -// SysVars is global sys vars map. -var SysVars map[string]*SysVar +var sysVars map[string]*SysVar +var sysVarsLock sync.RWMutex + +// RegisterSysVar adds a sysvar to the SysVars list +func RegisterSysVar(sv *SysVar) { + name := strings.ToLower(sv.Name) + sysVarsLock.Lock() + sysVars[name] = sv + sysVarsLock.Unlock() +} // GetSysVar returns sys var info for name as key. func GetSysVar(name string) *SysVar { name = strings.ToLower(name) - return SysVars[name] + sysVarsLock.RLock() + defer sysVarsLock.RUnlock() + return sysVars[name] +} + +// SetSysVar sets a sysvar. This will not propagate to the cluster, so it should only be used for instance scoped AUTO variables such as system_time_zone. +func SetSysVar(name string, value string) { + name = strings.ToLower(name) + sysVarsLock.Lock() + defer sysVarsLock.Unlock() + sysVars[name].Value = value +} + +// GetSysVars returns the sysVars list under a RWLock +func GetSysVars() map[string]*SysVar { + sysVarsLock.RLock() + defer sysVarsLock.RUnlock() + return sysVars } // PluginVarNames is global plugin var names set. var PluginVarNames []string func init() { - SysVars = make(map[string]*SysVar) + sysVars = make(map[string]*SysVar) for _, v := range defaultSysVars { - SysVars[v.Name] = v + RegisterSysVar(v) } initSynonymsSysVariables() } @@ -94,652 +151,652 @@ func BoolToInt32(b bool) int32 { // we only support MySQL now var defaultSysVars = []*SysVar{ - {ScopeGlobal, "gtid_mode", "OFF"}, - {ScopeGlobal, FlushTime, "0"}, - {ScopeNone, "performance_schema_max_mutex_classes", "200"}, - {ScopeGlobal | ScopeSession, LowPriorityUpdates, "0"}, - {ScopeGlobal | ScopeSession, SessionTrackGtids, "OFF"}, - {ScopeGlobal | ScopeSession, "ndbinfo_max_rows", ""}, - {ScopeGlobal | ScopeSession, "ndb_index_stat_option", ""}, - {ScopeGlobal | ScopeSession, OldPasswords, "0"}, - {ScopeNone, "innodb_version", "5.6.25"}, - {ScopeGlobal, MaxConnections, "151"}, - {ScopeGlobal | ScopeSession, BigTables, "0"}, - {ScopeNone, "skip_external_locking", "1"}, - {ScopeNone, "innodb_sync_array_size", "1"}, - {ScopeSession, "rand_seed2", ""}, - {ScopeGlobal, ValidatePasswordCheckUserName, "0"}, - {ScopeGlobal, "validate_password_number_count", "1"}, - {ScopeSession, "gtid_next", ""}, - {ScopeGlobal | ScopeSession, SQLSelectLimit, "18446744073709551615"}, - {ScopeGlobal, "ndb_show_foreign_key_mock_tables", ""}, - {ScopeNone, "multi_range_count", "256"}, - {ScopeGlobal | ScopeSession, DefaultWeekFormat, "0"}, - {ScopeGlobal | ScopeSession, "binlog_error_action", "IGNORE_ERROR"}, - {ScopeGlobal | ScopeSession, "default_storage_engine", "InnoDB"}, - {ScopeNone, "ft_query_expansion_limit", "20"}, - {ScopeGlobal, MaxConnectErrors, "100"}, - {ScopeGlobal, SyncBinlog, "0"}, - {ScopeNone, "max_digest_length", "1024"}, - {ScopeNone, "innodb_force_load_corrupted", "0"}, - {ScopeNone, "performance_schema_max_table_handles", "4000"}, - {ScopeGlobal, InnodbFastShutdown, "1"}, - {ScopeNone, "ft_max_word_len", "84"}, - {ScopeGlobal, "log_backward_compatible_user_definitions", ""}, - {ScopeNone, "lc_messages_dir", "/usr/local/mysql-5.6.25-osx10.8-x86_64/share/"}, - {ScopeGlobal, "ft_boolean_syntax", "+ -><()~*:\"\"&|"}, - {ScopeGlobal, TableDefinitionCache, "-1"}, - {ScopeNone, SkipNameResolve, "0"}, - {ScopeNone, "performance_schema_max_file_handles", "32768"}, - {ScopeSession, "transaction_allow_batching", ""}, - {ScopeGlobal | ScopeSession, SQLModeVar, mysql.DefaultSQLMode}, - {ScopeNone, "performance_schema_max_statement_classes", "168"}, - {ScopeGlobal, "server_id", "0"}, - {ScopeGlobal, "innodb_flushing_avg_loops", "30"}, - {ScopeGlobal | ScopeSession, TmpTableSize, "16777216"}, - {ScopeGlobal, "innodb_max_purge_lag", "0"}, - {ScopeGlobal | ScopeSession, "preload_buffer_size", "32768"}, - {ScopeGlobal, CheckProxyUsers, "0"}, - {ScopeNone, "have_query_cache", "YES"}, - {ScopeGlobal, "innodb_flush_log_at_timeout", "1"}, - {ScopeGlobal, "innodb_max_undo_log_size", ""}, - {ScopeGlobal | ScopeSession, "range_alloc_block_size", "4096"}, - {ScopeGlobal, ConnectTimeout, "10"}, - {ScopeGlobal | ScopeSession, MaxExecutionTime, "0"}, - {ScopeGlobal | ScopeSession, CollationServer, mysql.DefaultCollationName}, - {ScopeNone, "have_rtree_keys", "YES"}, - {ScopeGlobal, "innodb_old_blocks_pct", "37"}, - {ScopeGlobal, "innodb_file_format", "Antelope"}, - {ScopeGlobal, "innodb_compression_failure_threshold_pct", "5"}, - {ScopeNone, "performance_schema_events_waits_history_long_size", "10000"}, - {ScopeGlobal, "innodb_checksum_algorithm", "innodb"}, - {ScopeNone, "innodb_ft_sort_pll_degree", "2"}, - {ScopeNone, "thread_stack", "262144"}, - {ScopeGlobal, "relay_log_info_repository", "FILE"}, - {ScopeGlobal | ScopeSession, SQLLogBin, "1"}, - {ScopeGlobal, SuperReadOnly, "0"}, - {ScopeGlobal | ScopeSession, "max_delayed_threads", "20"}, - {ScopeNone, "protocol_version", "10"}, - {ScopeGlobal | ScopeSession, "new", "OFF"}, - {ScopeGlobal | ScopeSession, "myisam_sort_buffer_size", "8388608"}, - {ScopeGlobal | ScopeSession, "optimizer_trace_offset", "-1"}, - {ScopeGlobal, InnodbBufferPoolDumpAtShutdown, "0"}, - {ScopeGlobal | ScopeSession, SQLNotes, "1"}, - {ScopeGlobal, InnodbCmpPerIndexEnabled, "0"}, - {ScopeGlobal, "innodb_ft_server_stopword_table", ""}, - {ScopeNone, "performance_schema_max_file_instances", "7693"}, - {ScopeNone, "log_output", "FILE"}, - {ScopeGlobal, "binlog_group_commit_sync_delay", ""}, - {ScopeGlobal, "binlog_group_commit_sync_no_delay_count", ""}, - {ScopeNone, "have_crypt", "YES"}, - {ScopeGlobal, "innodb_log_write_ahead_size", ""}, - {ScopeNone, "innodb_log_group_home_dir", "./"}, - {ScopeNone, "performance_schema_events_statements_history_size", "10"}, - {ScopeGlobal, GeneralLog, "0"}, - {ScopeGlobal, "validate_password_dictionary_file", ""}, - {ScopeGlobal, BinlogOrderCommits, "1"}, - {ScopeGlobal, "key_cache_division_limit", "100"}, - {ScopeGlobal | ScopeSession, "max_insert_delayed_threads", "20"}, - {ScopeNone, "performance_schema_session_connect_attrs_size", "512"}, - {ScopeGlobal | ScopeSession, "time_zone", "SYSTEM"}, - {ScopeGlobal, "innodb_max_dirty_pages_pct", "75"}, - {ScopeGlobal, InnodbFilePerTable, "1"}, - {ScopeGlobal, InnodbLogCompressedPages, "1"}, - {ScopeNone, "skip_networking", "0"}, - {ScopeGlobal, "innodb_monitor_reset", ""}, - {ScopeNone, "have_ssl", "DISABLED"}, - {ScopeNone, "have_openssl", "DISABLED"}, - {ScopeNone, "ssl_ca", ""}, - {ScopeNone, "ssl_cert", ""}, - {ScopeNone, "ssl_key", ""}, - {ScopeNone, "ssl_cipher", ""}, - {ScopeNone, "tls_version", "TLSv1,TLSv1.1,TLSv1.2"}, - {ScopeNone, "system_time_zone", "CST"}, - {ScopeGlobal, InnodbPrintAllDeadlocks, "0"}, - {ScopeNone, "innodb_autoinc_lock_mode", "1"}, - {ScopeGlobal, "key_buffer_size", "8388608"}, - {ScopeGlobal | ScopeSession, ForeignKeyChecks, "OFF"}, - {ScopeGlobal, "host_cache_size", "279"}, - {ScopeGlobal, DelayKeyWrite, "ON"}, - {ScopeNone, "metadata_locks_cache_size", "1024"}, - {ScopeNone, "innodb_force_recovery", "0"}, - {ScopeGlobal, "innodb_file_format_max", "Antelope"}, - {ScopeGlobal | ScopeSession, "debug", ""}, - {ScopeGlobal, "log_warnings", "1"}, - {ScopeGlobal, OfflineMode, "0"}, - {ScopeGlobal | ScopeSession, InnodbStrictMode, "1"}, - {ScopeGlobal, "innodb_rollback_segments", "128"}, - {ScopeGlobal | ScopeSession, "join_buffer_size", "262144"}, - {ScopeNone, "innodb_mirrored_log_groups", "1"}, - {ScopeGlobal, "max_binlog_size", "1073741824"}, - {ScopeGlobal, "concurrent_insert", "AUTO"}, - {ScopeGlobal, InnodbAdaptiveHashIndex, "1"}, - {ScopeGlobal, InnodbFtEnableStopword, "1"}, - {ScopeGlobal, "general_log_file", "/usr/local/mysql/data/localhost.log"}, - {ScopeGlobal | ScopeSession, InnodbSupportXA, "1"}, - {ScopeGlobal, "innodb_compression_level", "6"}, - {ScopeNone, "innodb_file_format_check", "1"}, - {ScopeNone, "myisam_mmap_size", "18446744073709551615"}, - {ScopeNone, "innodb_buffer_pool_instances", "8"}, - {ScopeGlobal | ScopeSession, BlockEncryptionMode, "aes-128-ecb"}, - {ScopeGlobal | ScopeSession, "max_length_for_sort_data", "1024"}, - {ScopeNone, "character_set_system", "utf8"}, - {ScopeGlobal | ScopeSession, InteractiveTimeout, "28800"}, - {ScopeGlobal, InnodbOptimizeFullTextOnly, "0"}, - {ScopeNone, "character_sets_dir", "/usr/local/mysql-5.6.25-osx10.8-x86_64/share/charsets/"}, - {ScopeGlobal | ScopeSession, QueryCacheType, "OFF"}, - {ScopeNone, "innodb_rollback_on_timeout", "0"}, - {ScopeGlobal | ScopeSession, "query_alloc_block_size", "8192"}, - {ScopeGlobal | ScopeSession, InitConnect, ""}, - {ScopeNone, "have_compress", "YES"}, - {ScopeNone, "thread_concurrency", "10"}, - {ScopeGlobal | ScopeSession, "query_prealloc_size", "8192"}, - {ScopeNone, "relay_log_space_limit", "0"}, - {ScopeGlobal | ScopeSession, MaxUserConnections, "0"}, - {ScopeNone, "performance_schema_max_thread_classes", "50"}, - {ScopeGlobal, "innodb_api_trx_level", "0"}, - {ScopeNone, "disconnect_on_expired_password", "1"}, - {ScopeNone, "performance_schema_max_file_classes", "50"}, - {ScopeGlobal, "expire_logs_days", "0"}, - {ScopeGlobal | ScopeSession, BinlogRowQueryLogEvents, "0"}, - {ScopeGlobal, "default_password_lifetime", ""}, - {ScopeNone, "pid_file", "/usr/local/mysql/data/localhost.pid"}, - {ScopeNone, "innodb_undo_tablespaces", "0"}, - {ScopeGlobal, InnodbStatusOutputLocks, "0"}, - {ScopeNone, "performance_schema_accounts_size", "100"}, - {ScopeGlobal | ScopeSession, "max_error_count", "64"}, - {ScopeGlobal, "max_write_lock_count", "18446744073709551615"}, - {ScopeNone, "performance_schema_max_socket_instances", "322"}, - {ScopeNone, "performance_schema_max_table_instances", "12500"}, - {ScopeGlobal, "innodb_stats_persistent_sample_pages", "20"}, - {ScopeGlobal, "show_compatibility_56", ""}, - {ScopeNone, "innodb_open_files", "2000"}, - {ScopeGlobal, "innodb_spin_wait_delay", "6"}, - {ScopeGlobal, "thread_cache_size", "9"}, - {ScopeGlobal, LogSlowAdminStatements, "0"}, - {ScopeNone, "innodb_checksums", "ON"}, - {ScopeNone, "hostname", ServerHostname}, - {ScopeGlobal | ScopeSession, "auto_increment_offset", "1"}, - {ScopeNone, "ft_stopword_file", "(built-in)"}, - {ScopeGlobal, "innodb_max_dirty_pages_pct_lwm", "0"}, - {ScopeGlobal, LogQueriesNotUsingIndexes, "0"}, - {ScopeSession, "timestamp", ""}, - {ScopeGlobal | ScopeSession, QueryCacheWlockInvalidate, "0"}, - {ScopeGlobal | ScopeSession, "sql_buffer_result", "OFF"}, - {ScopeGlobal | ScopeSession, "character_set_filesystem", "binary"}, - {ScopeGlobal | ScopeSession, "collation_database", mysql.DefaultCollationName}, - {ScopeGlobal | ScopeSession, AutoIncrementIncrement, strconv.FormatInt(DefAutoIncrementIncrement, 10)}, - {ScopeGlobal | ScopeSession, AutoIncrementOffset, strconv.FormatInt(DefAutoIncrementOffset, 10)}, - {ScopeGlobal | ScopeSession, "max_heap_table_size", "16777216"}, - {ScopeGlobal | ScopeSession, "div_precision_increment", "4"}, - {ScopeGlobal, "innodb_lru_scan_depth", "1024"}, - {ScopeGlobal, "innodb_purge_rseg_truncate_frequency", ""}, - {ScopeGlobal | ScopeSession, SQLAutoIsNull, "0"}, - {ScopeNone, "innodb_api_enable_binlog", "0"}, - {ScopeGlobal | ScopeSession, "innodb_ft_user_stopword_table", ""}, - {ScopeNone, "server_id_bits", "32"}, - {ScopeGlobal, "innodb_log_checksum_algorithm", ""}, - {ScopeNone, "innodb_buffer_pool_load_at_startup", "1"}, - {ScopeGlobal | ScopeSession, "sort_buffer_size", "262144"}, - {ScopeGlobal, "innodb_flush_neighbors", "1"}, - {ScopeNone, "innodb_use_sys_malloc", "1"}, - {ScopeSession, PluginLoad, ""}, - {ScopeSession, PluginDir, "/data/deploy/plugin"}, - {ScopeNone, "performance_schema_max_socket_classes", "10"}, - {ScopeNone, "performance_schema_max_stage_classes", "150"}, - {ScopeGlobal, "innodb_purge_batch_size", "300"}, - {ScopeNone, "have_profiling", "NO"}, - {ScopeGlobal | ScopeSession, "character_set_client", mysql.DefaultCharset}, - {ScopeGlobal, InnodbBufferPoolDumpNow, "0"}, - {ScopeGlobal, RelayLogPurge, "1"}, - {ScopeGlobal, "ndb_distribution", ""}, - {ScopeGlobal, "myisam_data_pointer_size", "6"}, - {ScopeGlobal, "ndb_optimization_delay", ""}, - {ScopeGlobal, "innodb_ft_num_word_optimize", "2000"}, - {ScopeGlobal | ScopeSession, "max_join_size", "18446744073709551615"}, - {ScopeNone, CoreFile, "0"}, - {ScopeGlobal | ScopeSession, "max_seeks_for_key", "18446744073709551615"}, - {ScopeNone, "innodb_log_buffer_size", "8388608"}, - {ScopeGlobal, "delayed_insert_timeout", "300"}, - {ScopeGlobal, "max_relay_log_size", "0"}, - {ScopeGlobal | ScopeSession, MaxSortLength, "1024"}, - {ScopeNone, "metadata_locks_hash_instances", "8"}, - {ScopeGlobal, "ndb_eventbuffer_free_percent", ""}, - {ScopeNone, "large_files_support", "1"}, - {ScopeGlobal, "binlog_max_flush_queue_time", "0"}, - {ScopeGlobal, "innodb_fill_factor", ""}, - {ScopeGlobal, "log_syslog_facility", ""}, - {ScopeNone, "innodb_ft_min_token_size", "3"}, - {ScopeGlobal | ScopeSession, "transaction_write_set_extraction", ""}, - {ScopeGlobal | ScopeSession, "ndb_blob_write_batch_bytes", ""}, - {ScopeGlobal, "automatic_sp_privileges", "1"}, - {ScopeGlobal, "innodb_flush_sync", ""}, - {ScopeNone, "performance_schema_events_statements_history_long_size", "10000"}, - {ScopeGlobal, "innodb_monitor_disable", ""}, - {ScopeNone, "innodb_doublewrite", "1"}, - {ScopeNone, "log_bin_use_v1_row_events", "0"}, - {ScopeSession, "innodb_optimize_point_storage", ""}, - {ScopeNone, "innodb_api_disable_rowlock", "0"}, - {ScopeGlobal, "innodb_adaptive_flushing_lwm", "10"}, - {ScopeNone, "innodb_log_files_in_group", "2"}, - {ScopeGlobal, InnodbBufferPoolLoadNow, "0"}, - {ScopeNone, "performance_schema_max_rwlock_classes", "40"}, - {ScopeNone, "binlog_gtid_simple_recovery", "1"}, - {ScopeNone, Port, "4000"}, - {ScopeNone, "performance_schema_digests_size", "10000"}, - {ScopeGlobal | ScopeSession, Profiling, "0"}, - {ScopeNone, "lower_case_table_names", "2"}, - {ScopeSession, "rand_seed1", ""}, - {ScopeGlobal, "sha256_password_proxy_users", ""}, - {ScopeGlobal | ScopeSession, SQLQuoteShowCreate, "1"}, - {ScopeGlobal | ScopeSession, "binlogging_impossible_mode", "IGNORE_ERROR"}, - {ScopeGlobal | ScopeSession, QueryCacheSize, "1048576"}, - {ScopeGlobal, "innodb_stats_transient_sample_pages", "8"}, - {ScopeGlobal, InnodbStatsOnMetadata, "0"}, - {ScopeNone, "server_uuid", "00000000-0000-0000-0000-000000000000"}, - {ScopeNone, "open_files_limit", "5000"}, - {ScopeGlobal | ScopeSession, "ndb_force_send", ""}, - {ScopeNone, "skip_show_database", "0"}, - {ScopeGlobal, "log_timestamps", ""}, - {ScopeNone, "version_compile_machine", "x86_64"}, - {ScopeGlobal, "event_scheduler", "OFF"}, - {ScopeGlobal | ScopeSession, "ndb_deferred_constraints", ""}, - {ScopeGlobal, "log_syslog_include_pid", ""}, - {ScopeSession, "last_insert_id", ""}, - {ScopeNone, "innodb_ft_cache_size", "8000000"}, - {ScopeNone, LogBin, "0"}, - {ScopeGlobal, InnodbDisableSortFileCache, "0"}, - {ScopeGlobal, "log_error_verbosity", ""}, - {ScopeNone, "performance_schema_hosts_size", "100"}, - {ScopeGlobal, "innodb_replication_delay", "0"}, - {ScopeGlobal, SlowQueryLog, "0"}, - {ScopeSession, "debug_sync", ""}, - {ScopeGlobal, InnodbStatsAutoRecalc, "1"}, - {ScopeGlobal | ScopeSession, "lc_messages", "en_US"}, - {ScopeGlobal | ScopeSession, "bulk_insert_buffer_size", "8388608"}, - {ScopeGlobal | ScopeSession, BinlogDirectNonTransactionalUpdates, "0"}, - {ScopeGlobal, "innodb_change_buffering", "all"}, - {ScopeGlobal | ScopeSession, SQLBigSelects, "1"}, - {ScopeGlobal | ScopeSession, CharacterSetResults, mysql.DefaultCharset}, - {ScopeGlobal, "innodb_max_purge_lag_delay", "0"}, - {ScopeGlobal | ScopeSession, "session_track_schema", ""}, - {ScopeGlobal, "innodb_io_capacity_max", "2000"}, - {ScopeGlobal, "innodb_autoextend_increment", "64"}, - {ScopeGlobal | ScopeSession, "binlog_format", "STATEMENT"}, - {ScopeGlobal | ScopeSession, "optimizer_trace", "enabled=off,one_line=off"}, - {ScopeGlobal | ScopeSession, "read_rnd_buffer_size", "262144"}, - {ScopeNone, "version_comment", "TiDB Server (Apache License 2.0) " + versioninfo.TiDBEdition + " Edition, MySQL 5.7 compatible"}, - {ScopeGlobal | ScopeSession, NetWriteTimeout, "60"}, - {ScopeGlobal, InnodbBufferPoolLoadAbort, "0"}, - {ScopeGlobal | ScopeSession, TxnIsolation, "REPEATABLE-READ"}, - {ScopeGlobal | ScopeSession, TransactionIsolation, "REPEATABLE-READ"}, - {ScopeGlobal | ScopeSession, "collation_connection", mysql.DefaultCollationName}, - {ScopeGlobal | ScopeSession, "transaction_prealloc_size", "4096"}, - {ScopeNone, "performance_schema_setup_objects_size", "100"}, - {ScopeGlobal, "sync_relay_log", "10000"}, - {ScopeGlobal, "innodb_ft_result_cache_limit", "2000000000"}, - {ScopeNone, "innodb_sort_buffer_size", "1048576"}, - {ScopeGlobal, "innodb_ft_enable_diag_print", "OFF"}, - {ScopeNone, "thread_handling", "one-thread-per-connection"}, - {ScopeGlobal, "stored_program_cache", "256"}, - {ScopeNone, "performance_schema_max_mutex_instances", "15906"}, - {ScopeGlobal, "innodb_adaptive_max_sleep_delay", "150000"}, - {ScopeNone, "large_pages", "OFF"}, - {ScopeGlobal | ScopeSession, "session_track_system_variables", ""}, - {ScopeGlobal, "innodb_change_buffer_max_size", "25"}, - {ScopeGlobal, LogBinTrustFunctionCreators, "0"}, - {ScopeNone, "innodb_write_io_threads", "4"}, - {ScopeGlobal, "mysql_native_password_proxy_users", ""}, - {ScopeGlobal, serverReadOnly, "0"}, - {ScopeNone, "large_page_size", "0"}, - {ScopeNone, "table_open_cache_instances", "1"}, - {ScopeGlobal, InnodbStatsPersistent, "1"}, - {ScopeGlobal | ScopeSession, "session_track_state_change", ""}, - {ScopeNone, "optimizer_switch", "index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,subquery_materialization_cost_based=on,use_index_extensions=on"}, - {ScopeGlobal, "delayed_queue_size", "1000"}, - {ScopeNone, "innodb_read_only", "0"}, - {ScopeNone, "datetime_format", "%Y-%m-%d %H:%i:%s"}, - {ScopeGlobal, "log_syslog", ""}, - {ScopeNone, "version", mysql.ServerVersion}, - {ScopeGlobal | ScopeSession, "transaction_alloc_block_size", "8192"}, - {ScopeGlobal, "innodb_large_prefix", "OFF"}, - {ScopeNone, "performance_schema_max_cond_classes", "80"}, - {ScopeGlobal, "innodb_io_capacity", "200"}, - {ScopeGlobal, "max_binlog_cache_size", "18446744073709547520"}, - {ScopeGlobal | ScopeSession, "ndb_index_stat_enable", ""}, - {ScopeGlobal, "executed_gtids_compression_period", ""}, - {ScopeNone, "time_format", "%H:%i:%s"}, - {ScopeGlobal | ScopeSession, OldAlterTable, "0"}, - {ScopeGlobal | ScopeSession, "long_query_time", "10.000000"}, - {ScopeNone, "innodb_use_native_aio", "0"}, - {ScopeGlobal, "log_throttle_queries_not_using_indexes", "0"}, - {ScopeNone, "locked_in_memory", "0"}, - {ScopeNone, "innodb_api_enable_mdl", "0"}, - {ScopeGlobal, "binlog_cache_size", "32768"}, - {ScopeGlobal, "innodb_compression_pad_pct_max", "50"}, - {ScopeGlobal, InnodbCommitConcurrency, "0"}, - {ScopeNone, "ft_min_word_len", "4"}, - {ScopeGlobal, EnforceGtidConsistency, "OFF"}, - {ScopeGlobal, SecureAuth, "1"}, - {ScopeNone, "max_tmp_tables", "32"}, - {ScopeGlobal, InnodbRandomReadAhead, "0"}, - {ScopeGlobal | ScopeSession, UniqueChecks, "1"}, - {ScopeGlobal, "internal_tmp_disk_storage_engine", ""}, - {ScopeGlobal | ScopeSession, "myisam_repair_threads", "1"}, - {ScopeGlobal, "ndb_eventbuffer_max_alloc", ""}, - {ScopeGlobal, "innodb_read_ahead_threshold", "56"}, - {ScopeGlobal, "key_cache_block_size", "1024"}, - {ScopeNone, "ndb_recv_thread_cpu_mask", ""}, - {ScopeGlobal, "gtid_purged", ""}, - {ScopeGlobal, "max_binlog_stmt_cache_size", "18446744073709547520"}, - {ScopeGlobal | ScopeSession, "lock_wait_timeout", "31536000"}, - {ScopeGlobal | ScopeSession, "read_buffer_size", "131072"}, - {ScopeNone, "innodb_read_io_threads", "4"}, - {ScopeGlobal | ScopeSession, MaxSpRecursionDepth, "0"}, - {ScopeNone, "ignore_builtin_innodb", "0"}, - {ScopeGlobal, "slow_query_log_file", "/usr/local/mysql/data/localhost-slow.log"}, - {ScopeGlobal, "innodb_thread_sleep_delay", "10000"}, - {ScopeNone, "license", "Apache License 2.0"}, - {ScopeGlobal, "innodb_ft_aux_table", ""}, - {ScopeGlobal | ScopeSession, SQLWarnings, "0"}, - {ScopeGlobal | ScopeSession, KeepFilesOnCreate, "0"}, - {ScopeNone, "innodb_data_file_path", "ibdata1:12M:autoextend"}, - {ScopeNone, "performance_schema_setup_actors_size", "100"}, - {ScopeNone, "innodb_additional_mem_pool_size", "8388608"}, - {ScopeNone, "log_error", "/usr/local/mysql/data/localhost.err"}, - {ScopeGlobal, "binlog_stmt_cache_size", "32768"}, - {ScopeNone, "relay_log_info_file", "relay-log.info"}, - {ScopeNone, "innodb_ft_total_cache_size", "640000000"}, - {ScopeNone, "performance_schema_max_rwlock_instances", "9102"}, - {ScopeGlobal, "table_open_cache", "2000"}, - {ScopeNone, "performance_schema_events_stages_history_long_size", "10000"}, - {ScopeGlobal | ScopeSession, AutoCommit, "1"}, - {ScopeSession, "insert_id", ""}, - {ScopeGlobal | ScopeSession, "default_tmp_storage_engine", "InnoDB"}, - {ScopeGlobal | ScopeSession, "optimizer_search_depth", "62"}, - {ScopeGlobal, "max_points_in_geometry", ""}, - {ScopeGlobal, "innodb_stats_sample_pages", "8"}, - {ScopeGlobal | ScopeSession, "profiling_history_size", "15"}, - {ScopeGlobal | ScopeSession, "character_set_database", mysql.DefaultCharset}, - {ScopeNone, "have_symlink", "YES"}, - {ScopeGlobal | ScopeSession, "storage_engine", "InnoDB"}, - {ScopeGlobal | ScopeSession, "sql_log_off", "0"}, + {Scope: ScopeGlobal, Name: "gtid_mode", Value: "OFF", Type: TypeBool}, + {Scope: ScopeGlobal, Name: FlushTime, Value: "0"}, + {Scope: ScopeNone, Name: "performance_schema_max_mutex_classes", Value: "200"}, + {Scope: ScopeGlobal | ScopeSession, Name: LowPriorityUpdates, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: SessionTrackGtids, Value: "OFF"}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndbinfo_max_rows", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndb_index_stat_option", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: OldPasswords, Value: "0"}, + {Scope: ScopeNone, Name: "innodb_version", Value: "5.6.25"}, + {Scope: ScopeGlobal, Name: MaxConnections, Value: "151"}, + {Scope: ScopeGlobal | ScopeSession, Name: BigTables, Value: "0"}, + {Scope: ScopeNone, Name: "skip_external_locking", Value: "1"}, + {Scope: ScopeNone, Name: "innodb_sync_array_size", Value: "1"}, + {Scope: ScopeSession, Name: "rand_seed2", Value: ""}, + {Scope: ScopeGlobal, Name: ValidatePasswordCheckUserName, Value: "0"}, + {Scope: ScopeGlobal, Name: "validate_password_number_count", Value: "1"}, + {Scope: ScopeSession, Name: "gtid_next", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLSelectLimit, Value: "18446744073709551615"}, + {Scope: ScopeGlobal, Name: "ndb_show_foreign_key_mock_tables", Value: ""}, + {Scope: ScopeNone, Name: "multi_range_count", Value: "256"}, + {Scope: ScopeGlobal | ScopeSession, Name: DefaultWeekFormat, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "binlog_error_action", Value: "IGNORE_ERROR"}, + {Scope: ScopeGlobal | ScopeSession, Name: "default_storage_engine", Value: "InnoDB"}, + {Scope: ScopeNone, Name: "ft_query_expansion_limit", Value: "20"}, + {Scope: ScopeGlobal, Name: MaxConnectErrors, Value: "100"}, + {Scope: ScopeGlobal, Name: SyncBinlog, Value: "0"}, + {Scope: ScopeNone, Name: "max_digest_length", Value: "1024"}, + {Scope: ScopeNone, Name: "innodb_force_load_corrupted", Value: "0"}, + {Scope: ScopeNone, Name: "performance_schema_max_table_handles", Value: "4000"}, + {Scope: ScopeGlobal, Name: InnodbFastShutdown, Value: "1"}, + {Scope: ScopeNone, Name: "ft_max_word_len", Value: "84"}, + {Scope: ScopeGlobal, Name: "log_backward_compatible_user_definitions", Value: ""}, + {Scope: ScopeNone, Name: "lc_messages_dir", Value: "/usr/local/mysql-5.6.25-osx10.8-x86_64/share/"}, + {Scope: ScopeGlobal, Name: "ft_boolean_syntax", Value: "+ -><()~*:\"\"&|"}, + {Scope: ScopeGlobal, Name: TableDefinitionCache, Value: "-1"}, + {Scope: ScopeNone, Name: SkipNameResolve, Value: "0"}, + {Scope: ScopeNone, Name: "performance_schema_max_file_handles", Value: "32768"}, + {Scope: ScopeSession, Name: "transaction_allow_batching", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLModeVar, Value: mysql.DefaultSQLMode}, + {Scope: ScopeNone, Name: "performance_schema_max_statement_classes", Value: "168"}, + {Scope: ScopeGlobal, Name: "server_id", Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_flushing_avg_loops", Value: "30"}, + {Scope: ScopeGlobal | ScopeSession, Name: TmpTableSize, Value: "16777216"}, + {Scope: ScopeGlobal, Name: "innodb_max_purge_lag", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "preload_buffer_size", Value: "32768"}, + {Scope: ScopeGlobal, Name: CheckProxyUsers, Value: "0"}, + {Scope: ScopeNone, Name: "have_query_cache", Value: "YES"}, + {Scope: ScopeGlobal, Name: "innodb_flush_log_at_timeout", Value: "1"}, + {Scope: ScopeGlobal, Name: "innodb_max_undo_log_size", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "range_alloc_block_size", Value: "4096"}, + {Scope: ScopeGlobal, Name: ConnectTimeout, Value: "10"}, + {Scope: ScopeGlobal | ScopeSession, Name: MaxExecutionTime, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: CollationServer, Value: mysql.DefaultCollationName}, + {Scope: ScopeNone, Name: "have_rtree_keys", Value: "YES"}, + {Scope: ScopeGlobal, Name: "innodb_old_blocks_pct", Value: "37"}, + {Scope: ScopeGlobal, Name: "innodb_file_format", Value: "Antelope"}, + {Scope: ScopeGlobal, Name: "innodb_compression_failure_threshold_pct", Value: "5"}, + {Scope: ScopeNone, Name: "performance_schema_events_waits_history_long_size", Value: "10000"}, + {Scope: ScopeGlobal, Name: "innodb_checksum_algorithm", Value: "innodb"}, + {Scope: ScopeNone, Name: "innodb_ft_sort_pll_degree", Value: "2"}, + {Scope: ScopeNone, Name: "thread_stack", Value: "262144"}, + {Scope: ScopeGlobal, Name: "relay_log_info_repository", Value: "FILE"}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLLogBin, Value: "1"}, + {Scope: ScopeGlobal, Name: SuperReadOnly, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_delayed_threads", Value: "20"}, + {Scope: ScopeNone, Name: "protocol_version", Value: "10"}, + {Scope: ScopeGlobal | ScopeSession, Name: "new", Value: "OFF"}, + {Scope: ScopeGlobal | ScopeSession, Name: "myisam_sort_buffer_size", Value: "8388608"}, + {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace_offset", Value: "-1"}, + {Scope: ScopeGlobal, Name: InnodbBufferPoolDumpAtShutdown, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLNotes, Value: "1"}, + {Scope: ScopeGlobal, Name: InnodbCmpPerIndexEnabled, Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_ft_server_stopword_table", Value: ""}, + {Scope: ScopeNone, Name: "performance_schema_max_file_instances", Value: "7693"}, + {Scope: ScopeNone, Name: "log_output", Value: "FILE"}, + {Scope: ScopeGlobal, Name: "binlog_group_commit_sync_delay", Value: ""}, + {Scope: ScopeGlobal, Name: "binlog_group_commit_sync_no_delay_count", Value: ""}, + {Scope: ScopeNone, Name: "have_crypt", Value: "YES"}, + {Scope: ScopeGlobal, Name: "innodb_log_write_ahead_size", Value: ""}, + {Scope: ScopeNone, Name: "innodb_log_group_home_dir", Value: "./"}, + {Scope: ScopeNone, Name: "performance_schema_events_statements_history_size", Value: "10"}, + {Scope: ScopeGlobal, Name: GeneralLog, Value: "0"}, + {Scope: ScopeGlobal, Name: "validate_password_dictionary_file", Value: ""}, + {Scope: ScopeGlobal, Name: BinlogOrderCommits, Value: "1"}, + {Scope: ScopeGlobal, Name: "key_cache_division_limit", Value: "100"}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_insert_delayed_threads", Value: "20"}, + {Scope: ScopeNone, Name: "performance_schema_session_connect_attrs_size", Value: "512"}, + {Scope: ScopeGlobal | ScopeSession, Name: "time_zone", Value: "SYSTEM"}, + {Scope: ScopeGlobal, Name: "innodb_max_dirty_pages_pct", Value: "75"}, + {Scope: ScopeGlobal, Name: InnodbFilePerTable, Value: "1"}, + {Scope: ScopeGlobal, Name: InnodbLogCompressedPages, Value: "1"}, + {Scope: ScopeNone, Name: "skip_networking", Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_monitor_reset", Value: ""}, + {Scope: ScopeNone, Name: "have_ssl", Value: "DISABLED"}, + {Scope: ScopeNone, Name: "have_openssl", Value: "DISABLED"}, + {Scope: ScopeNone, Name: "ssl_ca", Value: ""}, + {Scope: ScopeNone, Name: "ssl_cert", Value: ""}, + {Scope: ScopeNone, Name: "ssl_key", Value: ""}, + {Scope: ScopeNone, Name: "ssl_cipher", Value: ""}, + {Scope: ScopeNone, Name: "tls_version", Value: "TLSv1,TLSv1.1,TLSv1.2"}, + {Scope: ScopeNone, Name: "system_time_zone", Value: "CST"}, + {Scope: ScopeGlobal, Name: InnodbPrintAllDeadlocks, Value: "0"}, + {Scope: ScopeNone, Name: "innodb_autoinc_lock_mode", Value: "1"}, + {Scope: ScopeGlobal, Name: "key_buffer_size", Value: "8388608"}, + {Scope: ScopeGlobal | ScopeSession, Name: ForeignKeyChecks, Value: "OFF"}, + {Scope: ScopeGlobal, Name: "host_cache_size", Value: "279"}, + {Scope: ScopeGlobal, Name: DelayKeyWrite, Value: "ON"}, + {Scope: ScopeNone, Name: "metadata_locks_cache_size", Value: "1024"}, + {Scope: ScopeNone, Name: "innodb_force_recovery", Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_file_format_max", Value: "Antelope"}, + {Scope: ScopeGlobal | ScopeSession, Name: "debug", Value: ""}, + {Scope: ScopeGlobal, Name: "log_warnings", Value: "1"}, + {Scope: ScopeGlobal, Name: OfflineMode, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: InnodbStrictMode, Value: "1"}, + {Scope: ScopeGlobal, Name: "innodb_rollback_segments", Value: "128"}, + {Scope: ScopeGlobal | ScopeSession, Name: "join_buffer_size", Value: "262144"}, + {Scope: ScopeNone, Name: "innodb_mirrored_log_groups", Value: "1"}, + {Scope: ScopeGlobal, Name: "max_binlog_size", Value: "1073741824"}, + {Scope: ScopeGlobal, Name: "concurrent_insert", Value: "AUTO"}, + {Scope: ScopeGlobal, Name: InnodbAdaptiveHashIndex, Value: "1"}, + {Scope: ScopeGlobal, Name: InnodbFtEnableStopword, Value: "1"}, + {Scope: ScopeGlobal, Name: "general_log_file", Value: "/usr/local/mysql/data/localhost.log"}, + {Scope: ScopeGlobal | ScopeSession, Name: InnodbSupportXA, Value: "1"}, + {Scope: ScopeGlobal, Name: "innodb_compression_level", Value: "6"}, + {Scope: ScopeNone, Name: "innodb_file_format_check", Value: "1"}, + {Scope: ScopeNone, Name: "myisam_mmap_size", Value: "18446744073709551615"}, + {Scope: ScopeNone, Name: "innodb_buffer_pool_instances", Value: "8"}, + {Scope: ScopeGlobal | ScopeSession, Name: BlockEncryptionMode, Value: "aes-128-ecb"}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_length_for_sort_data", Value: "1024"}, + {Scope: ScopeNone, Name: "character_set_system", Value: "utf8"}, + {Scope: ScopeGlobal | ScopeSession, Name: InteractiveTimeout, Value: "28800"}, + {Scope: ScopeGlobal, Name: InnodbOptimizeFullTextOnly, Value: "0"}, + {Scope: ScopeNone, Name: "character_sets_dir", Value: "/usr/local/mysql-5.6.25-osx10.8-x86_64/share/charsets/"}, + {Scope: ScopeGlobal | ScopeSession, Name: QueryCacheType, Value: "OFF"}, + {Scope: ScopeNone, Name: "innodb_rollback_on_timeout", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "query_alloc_block_size", Value: "8192"}, + {Scope: ScopeGlobal | ScopeSession, Name: InitConnect, Value: ""}, + {Scope: ScopeNone, Name: "have_compress", Value: "YES"}, + {Scope: ScopeNone, Name: "thread_concurrency", Value: "10"}, + {Scope: ScopeGlobal | ScopeSession, Name: "query_prealloc_size", Value: "8192"}, + {Scope: ScopeNone, Name: "relay_log_space_limit", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: MaxUserConnections, Value: "0"}, + {Scope: ScopeNone, Name: "performance_schema_max_thread_classes", Value: "50"}, + {Scope: ScopeGlobal, Name: "innodb_api_trx_level", Value: "0"}, + {Scope: ScopeNone, Name: "disconnect_on_expired_password", Value: "1"}, + {Scope: ScopeNone, Name: "performance_schema_max_file_classes", Value: "50"}, + {Scope: ScopeGlobal, Name: "expire_logs_days", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: BinlogRowQueryLogEvents, Value: "0"}, + {Scope: ScopeGlobal, Name: "default_password_lifetime", Value: ""}, + {Scope: ScopeNone, Name: "pid_file", Value: "/usr/local/mysql/data/localhost.pid"}, + {Scope: ScopeNone, Name: "innodb_undo_tablespaces", Value: "0"}, + {Scope: ScopeGlobal, Name: InnodbStatusOutputLocks, Value: "0"}, + {Scope: ScopeNone, Name: "performance_schema_accounts_size", Value: "100"}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_error_count", Value: "64"}, + {Scope: ScopeGlobal, Name: "max_write_lock_count", Value: "18446744073709551615"}, + {Scope: ScopeNone, Name: "performance_schema_max_socket_instances", Value: "322"}, + {Scope: ScopeNone, Name: "performance_schema_max_table_instances", Value: "12500"}, + {Scope: ScopeGlobal, Name: "innodb_stats_persistent_sample_pages", Value: "20"}, + {Scope: ScopeGlobal, Name: "show_compatibility_56", Value: ""}, + {Scope: ScopeNone, Name: "innodb_open_files", Value: "2000"}, + {Scope: ScopeGlobal, Name: "innodb_spin_wait_delay", Value: "6"}, + {Scope: ScopeGlobal, Name: "thread_cache_size", Value: "9"}, + {Scope: ScopeGlobal, Name: LogSlowAdminStatements, Value: "0"}, + {Scope: ScopeNone, Name: "innodb_checksums", Value: "ON"}, + {Scope: ScopeNone, Name: "hostname", Value: ServerHostname}, + {Scope: ScopeGlobal | ScopeSession, Name: "auto_increment_offset", Value: "1"}, + {Scope: ScopeNone, Name: "ft_stopword_file", Value: "(built-in)"}, + {Scope: ScopeGlobal, Name: "innodb_max_dirty_pages_pct_lwm", Value: "0"}, + {Scope: ScopeGlobal, Name: LogQueriesNotUsingIndexes, Value: "0"}, + {Scope: ScopeSession, Name: "timestamp", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: QueryCacheWlockInvalidate, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "sql_buffer_result", Value: "OFF"}, + {Scope: ScopeGlobal | ScopeSession, Name: "character_set_filesystem", Value: "binary"}, + {Scope: ScopeGlobal | ScopeSession, Name: "collation_database", Value: mysql.DefaultCollationName}, + {Scope: ScopeGlobal | ScopeSession, Name: AutoIncrementIncrement, Value: strconv.FormatInt(DefAutoIncrementIncrement, 10)}, + {Scope: ScopeGlobal | ScopeSession, Name: AutoIncrementOffset, Value: strconv.FormatInt(DefAutoIncrementOffset, 10)}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_heap_table_size", Value: "16777216"}, + {Scope: ScopeGlobal | ScopeSession, Name: "div_precision_increment", Value: "4"}, + {Scope: ScopeGlobal, Name: "innodb_lru_scan_depth", Value: "1024"}, + {Scope: ScopeGlobal, Name: "innodb_purge_rseg_truncate_frequency", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLAutoIsNull, Value: "0"}, + {Scope: ScopeNone, Name: "innodb_api_enable_binlog", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "innodb_ft_user_stopword_table", Value: ""}, + {Scope: ScopeNone, Name: "server_id_bits", Value: "32"}, + {Scope: ScopeGlobal, Name: "innodb_log_checksum_algorithm", Value: ""}, + {Scope: ScopeNone, Name: "innodb_buffer_pool_load_at_startup", Value: "1"}, + {Scope: ScopeGlobal | ScopeSession, Name: "sort_buffer_size", Value: "262144"}, + {Scope: ScopeGlobal, Name: "innodb_flush_neighbors", Value: "1"}, + {Scope: ScopeNone, Name: "innodb_use_sys_malloc", Value: "1"}, + {Scope: ScopeSession, Name: PluginLoad, Value: ""}, + {Scope: ScopeSession, Name: PluginDir, Value: "/data/deploy/plugin"}, + {Scope: ScopeNone, Name: "performance_schema_max_socket_classes", Value: "10"}, + {Scope: ScopeNone, Name: "performance_schema_max_stage_classes", Value: "150"}, + {Scope: ScopeGlobal, Name: "innodb_purge_batch_size", Value: "300"}, + {Scope: ScopeNone, Name: "have_profiling", Value: "NO"}, + {Scope: ScopeGlobal | ScopeSession, Name: "character_set_client", Value: mysql.DefaultCharset}, + {Scope: ScopeGlobal, Name: InnodbBufferPoolDumpNow, Value: "0"}, + {Scope: ScopeGlobal, Name: RelayLogPurge, Value: "1"}, + {Scope: ScopeGlobal, Name: "ndb_distribution", Value: ""}, + {Scope: ScopeGlobal, Name: "myisam_data_pointer_size", Value: "6"}, + {Scope: ScopeGlobal, Name: "ndb_optimization_delay", Value: ""}, + {Scope: ScopeGlobal, Name: "innodb_ft_num_word_optimize", Value: "2000"}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_join_size", Value: "18446744073709551615"}, + {Scope: ScopeNone, Name: CoreFile, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_seeks_for_key", Value: "18446744073709551615"}, + {Scope: ScopeNone, Name: "innodb_log_buffer_size", Value: "8388608"}, + {Scope: ScopeGlobal, Name: "delayed_insert_timeout", Value: "300"}, + {Scope: ScopeGlobal, Name: "max_relay_log_size", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: MaxSortLength, Value: "1024"}, + {Scope: ScopeNone, Name: "metadata_locks_hash_instances", Value: "8"}, + {Scope: ScopeGlobal, Name: "ndb_eventbuffer_free_percent", Value: ""}, + {Scope: ScopeNone, Name: "large_files_support", Value: "1"}, + {Scope: ScopeGlobal, Name: "binlog_max_flush_queue_time", Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_fill_factor", Value: ""}, + {Scope: ScopeGlobal, Name: "log_syslog_facility", Value: ""}, + {Scope: ScopeNone, Name: "innodb_ft_min_token_size", Value: "3"}, + {Scope: ScopeGlobal | ScopeSession, Name: "transaction_write_set_extraction", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndb_blob_write_batch_bytes", Value: ""}, + {Scope: ScopeGlobal, Name: "automatic_sp_privileges", Value: "1"}, + {Scope: ScopeGlobal, Name: "innodb_flush_sync", Value: ""}, + {Scope: ScopeNone, Name: "performance_schema_events_statements_history_long_size", Value: "10000"}, + {Scope: ScopeGlobal, Name: "innodb_monitor_disable", Value: ""}, + {Scope: ScopeNone, Name: "innodb_doublewrite", Value: "1"}, + {Scope: ScopeNone, Name: "log_bin_use_v1_row_events", Value: "0"}, + {Scope: ScopeSession, Name: "innodb_optimize_point_storage", Value: ""}, + {Scope: ScopeNone, Name: "innodb_api_disable_rowlock", Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_adaptive_flushing_lwm", Value: "10"}, + {Scope: ScopeNone, Name: "innodb_log_files_in_group", Value: "2"}, + {Scope: ScopeGlobal, Name: InnodbBufferPoolLoadNow, Value: "0"}, + {Scope: ScopeNone, Name: "performance_schema_max_rwlock_classes", Value: "40"}, + {Scope: ScopeNone, Name: "binlog_gtid_simple_recovery", Value: "1"}, + {Scope: ScopeNone, Name: Port, Value: "4000"}, + {Scope: ScopeNone, Name: "performance_schema_digests_size", Value: "10000"}, + {Scope: ScopeGlobal | ScopeSession, Name: Profiling, Value: "0"}, + {Scope: ScopeNone, Name: "lower_case_table_names", Value: "2"}, + {Scope: ScopeSession, Name: "rand_seed1", Value: ""}, + {Scope: ScopeGlobal, Name: "sha256_password_proxy_users", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLQuoteShowCreate, Value: "1"}, + {Scope: ScopeGlobal | ScopeSession, Name: "binlogging_impossible_mode", Value: "IGNORE_ERROR"}, + {Scope: ScopeGlobal | ScopeSession, Name: QueryCacheSize, Value: "1048576"}, + {Scope: ScopeGlobal, Name: "innodb_stats_transient_sample_pages", Value: "8"}, + {Scope: ScopeGlobal, Name: InnodbStatsOnMetadata, Value: "0"}, + {Scope: ScopeNone, Name: "server_uuid", Value: "00000000-0000-0000-0000-000000000000"}, + {Scope: ScopeNone, Name: "open_files_limit", Value: "5000"}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndb_force_send", Value: ""}, + {Scope: ScopeNone, Name: "skip_show_database", Value: "0"}, + {Scope: ScopeGlobal, Name: "log_timestamps", Value: ""}, + {Scope: ScopeNone, Name: "version_compile_machine", Value: "x86_64"}, + {Scope: ScopeGlobal, Name: "event_scheduler", Value: "OFF"}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndb_deferred_constraints", Value: ""}, + {Scope: ScopeGlobal, Name: "log_syslog_include_pid", Value: ""}, + {Scope: ScopeSession, Name: "last_insert_id", Value: ""}, + {Scope: ScopeNone, Name: "innodb_ft_cache_size", Value: "8000000"}, + {Scope: ScopeNone, Name: LogBin, Value: "0"}, + {Scope: ScopeGlobal, Name: InnodbDisableSortFileCache, Value: "0"}, + {Scope: ScopeGlobal, Name: "log_error_verbosity", Value: ""}, + {Scope: ScopeNone, Name: "performance_schema_hosts_size", Value: "100"}, + {Scope: ScopeGlobal, Name: "innodb_replication_delay", Value: "0"}, + {Scope: ScopeGlobal, Name: SlowQueryLog, Value: "0"}, + {Scope: ScopeSession, Name: "debug_sync", Value: ""}, + {Scope: ScopeGlobal, Name: InnodbStatsAutoRecalc, Value: "1"}, + {Scope: ScopeGlobal | ScopeSession, Name: "lc_messages", Value: "en_US"}, + {Scope: ScopeGlobal | ScopeSession, Name: "bulk_insert_buffer_size", Value: "8388608"}, + {Scope: ScopeGlobal | ScopeSession, Name: BinlogDirectNonTransactionalUpdates, Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_change_buffering", Value: "all"}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLBigSelects, Value: "1"}, + {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetResults, Value: mysql.DefaultCharset}, + {Scope: ScopeGlobal, Name: "innodb_max_purge_lag_delay", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "session_track_schema", Value: ""}, + {Scope: ScopeGlobal, Name: "innodb_io_capacity_max", Value: "2000"}, + {Scope: ScopeGlobal, Name: "innodb_autoextend_increment", Value: "64"}, + {Scope: ScopeGlobal | ScopeSession, Name: "binlog_format", Value: "STATEMENT"}, + {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace", Value: "enabled=off,one_line=off"}, + {Scope: ScopeGlobal | ScopeSession, Name: "read_rnd_buffer_size", Value: "262144"}, + {Scope: ScopeNone, Name: "version_comment", Value: "TiDB Server (Apache License 2.0) " + versioninfo.TiDBEdition + " Edition, MySQL 5.7 compatible"}, + {Scope: ScopeGlobal | ScopeSession, Name: NetWriteTimeout, Value: "60"}, + {Scope: ScopeGlobal, Name: InnodbBufferPoolLoadAbort, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: TxnIsolation, Value: "REPEATABLE-READ"}, + {Scope: ScopeGlobal | ScopeSession, Name: TransactionIsolation, Value: "REPEATABLE-READ"}, + {Scope: ScopeGlobal | ScopeSession, Name: "collation_connection", Value: mysql.DefaultCollationName}, + {Scope: ScopeGlobal | ScopeSession, Name: "transaction_prealloc_size", Value: "4096"}, + {Scope: ScopeNone, Name: "performance_schema_setup_objects_size", Value: "100"}, + {Scope: ScopeGlobal, Name: "sync_relay_log", Value: "10000"}, + {Scope: ScopeGlobal, Name: "innodb_ft_result_cache_limit", Value: "2000000000"}, + {Scope: ScopeNone, Name: "innodb_sort_buffer_size", Value: "1048576"}, + {Scope: ScopeGlobal, Name: "innodb_ft_enable_diag_print", Value: "OFF"}, + {Scope: ScopeNone, Name: "thread_handling", Value: "one-thread-per-connection"}, + {Scope: ScopeGlobal, Name: "stored_program_cache", Value: "256"}, + {Scope: ScopeNone, Name: "performance_schema_max_mutex_instances", Value: "15906"}, + {Scope: ScopeGlobal, Name: "innodb_adaptive_max_sleep_delay", Value: "150000"}, + {Scope: ScopeNone, Name: "large_pages", Value: "OFF"}, + {Scope: ScopeGlobal | ScopeSession, Name: "session_track_system_variables", Value: ""}, + {Scope: ScopeGlobal, Name: "innodb_change_buffer_max_size", Value: "25"}, + {Scope: ScopeGlobal, Name: LogBinTrustFunctionCreators, Value: "0"}, + {Scope: ScopeNone, Name: "innodb_write_io_threads", Value: "4"}, + {Scope: ScopeGlobal, Name: "mysql_native_password_proxy_users", Value: ""}, + {Scope: ScopeGlobal, Name: serverReadOnly, Value: "0"}, + {Scope: ScopeNone, Name: "large_page_size", Value: "0"}, + {Scope: ScopeNone, Name: "table_open_cache_instances", Value: "1"}, + {Scope: ScopeGlobal, Name: InnodbStatsPersistent, Value: "1"}, + {Scope: ScopeGlobal | ScopeSession, Name: "session_track_state_change", Value: ""}, + {Scope: ScopeNone, Name: "optimizer_switch", Value: "index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,subquery_materialization_cost_based=on,use_index_extensions=on"}, + {Scope: ScopeGlobal, Name: "delayed_queue_size", Value: "1000"}, + {Scope: ScopeNone, Name: "innodb_read_only", Value: "0"}, + {Scope: ScopeNone, Name: "datetime_format", Value: "%Y-%m-%d %H:%i:%s"}, + {Scope: ScopeGlobal, Name: "log_syslog", Value: ""}, + {Scope: ScopeNone, Name: "version", Value: mysql.ServerVersion}, + {Scope: ScopeGlobal | ScopeSession, Name: "transaction_alloc_block_size", Value: "8192"}, + {Scope: ScopeGlobal, Name: "innodb_large_prefix", Value: "OFF"}, + {Scope: ScopeNone, Name: "performance_schema_max_cond_classes", Value: "80"}, + {Scope: ScopeGlobal, Name: "innodb_io_capacity", Value: "200"}, + {Scope: ScopeGlobal, Name: "max_binlog_cache_size", Value: "18446744073709547520"}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndb_index_stat_enable", Value: ""}, + {Scope: ScopeGlobal, Name: "executed_gtids_compression_period", Value: ""}, + {Scope: ScopeNone, Name: "time_format", Value: "%H:%i:%s"}, + {Scope: ScopeGlobal | ScopeSession, Name: OldAlterTable, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "long_query_time", Value: "10.000000"}, + {Scope: ScopeNone, Name: "innodb_use_native_aio", Value: "0"}, + {Scope: ScopeGlobal, Name: "log_throttle_queries_not_using_indexes", Value: "0"}, + {Scope: ScopeNone, Name: "locked_in_memory", Value: "0"}, + {Scope: ScopeNone, Name: "innodb_api_enable_mdl", Value: "0"}, + {Scope: ScopeGlobal, Name: "binlog_cache_size", Value: "32768"}, + {Scope: ScopeGlobal, Name: "innodb_compression_pad_pct_max", Value: "50"}, + {Scope: ScopeGlobal, Name: InnodbCommitConcurrency, Value: "0"}, + {Scope: ScopeNone, Name: "ft_min_word_len", Value: "4"}, + {Scope: ScopeGlobal, Name: EnforceGtidConsistency, Value: "OFF"}, + {Scope: ScopeGlobal, Name: SecureAuth, Value: "1"}, + {Scope: ScopeNone, Name: "max_tmp_tables", Value: "32"}, + {Scope: ScopeGlobal, Name: InnodbRandomReadAhead, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: UniqueChecks, Value: "1"}, + {Scope: ScopeGlobal, Name: "internal_tmp_disk_storage_engine", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "myisam_repair_threads", Value: "1"}, + {Scope: ScopeGlobal, Name: "ndb_eventbuffer_max_alloc", Value: ""}, + {Scope: ScopeGlobal, Name: "innodb_read_ahead_threshold", Value: "56"}, + {Scope: ScopeGlobal, Name: "key_cache_block_size", Value: "1024"}, + {Scope: ScopeNone, Name: "ndb_recv_thread_cpu_mask", Value: ""}, + {Scope: ScopeGlobal, Name: "gtid_purged", Value: ""}, + {Scope: ScopeGlobal, Name: "max_binlog_stmt_cache_size", Value: "18446744073709547520"}, + {Scope: ScopeGlobal | ScopeSession, Name: "lock_wait_timeout", Value: "31536000"}, + {Scope: ScopeGlobal | ScopeSession, Name: "read_buffer_size", Value: "131072"}, + {Scope: ScopeNone, Name: "innodb_read_io_threads", Value: "4"}, + {Scope: ScopeGlobal | ScopeSession, Name: MaxSpRecursionDepth, Value: "0"}, + {Scope: ScopeNone, Name: "ignore_builtin_innodb", Value: "0"}, + {Scope: ScopeGlobal, Name: "slow_query_log_file", Value: "/usr/local/mysql/data/localhost-slow.log"}, + {Scope: ScopeGlobal, Name: "innodb_thread_sleep_delay", Value: "10000"}, + {Scope: ScopeNone, Name: "license", Value: "Apache License 2.0"}, + {Scope: ScopeGlobal, Name: "innodb_ft_aux_table", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLWarnings, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: KeepFilesOnCreate, Value: "0"}, + {Scope: ScopeNone, Name: "innodb_data_file_path", Value: "ibdata1:12M:autoextend"}, + {Scope: ScopeNone, Name: "performance_schema_setup_actors_size", Value: "100"}, + {Scope: ScopeNone, Name: "innodb_additional_mem_pool_size", Value: "8388608"}, + {Scope: ScopeNone, Name: "log_error", Value: "/usr/local/mysql/data/localhost.err"}, + {Scope: ScopeGlobal, Name: "binlog_stmt_cache_size", Value: "32768"}, + {Scope: ScopeNone, Name: "relay_log_info_file", Value: "relay-log.info"}, + {Scope: ScopeNone, Name: "innodb_ft_total_cache_size", Value: "640000000"}, + {Scope: ScopeNone, Name: "performance_schema_max_rwlock_instances", Value: "9102"}, + {Scope: ScopeGlobal, Name: "table_open_cache", Value: "2000"}, + {Scope: ScopeNone, Name: "performance_schema_events_stages_history_long_size", Value: "10000"}, + {Scope: ScopeGlobal | ScopeSession, Name: AutoCommit, Value: "1"}, + {Scope: ScopeSession, Name: "insert_id", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "default_tmp_storage_engine", Value: "InnoDB"}, + {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_search_depth", Value: "62"}, + {Scope: ScopeGlobal, Name: "max_points_in_geometry", Value: ""}, + {Scope: ScopeGlobal, Name: "innodb_stats_sample_pages", Value: "8"}, + {Scope: ScopeGlobal | ScopeSession, Name: "profiling_history_size", Value: "15"}, + {Scope: ScopeGlobal | ScopeSession, Name: "character_set_database", Value: mysql.DefaultCharset}, + {Scope: ScopeNone, Name: "have_symlink", Value: "YES"}, + {Scope: ScopeGlobal | ScopeSession, Name: "storage_engine", Value: "InnoDB"}, + {Scope: ScopeGlobal | ScopeSession, Name: "sql_log_off", Value: "0"}, // In MySQL, the default value of `explicit_defaults_for_timestamp` is `0`. // But In TiDB, it's set to `1` to be consistent with TiDB timestamp behavior. // See: https://github.com/pingcap/tidb/pull/6068 for details - {ScopeNone, "explicit_defaults_for_timestamp", "1"}, - {ScopeNone, "performance_schema_events_waits_history_size", "10"}, - {ScopeGlobal, "log_syslog_tag", ""}, - {ScopeGlobal | ScopeSession, TxReadOnly, "0"}, - {ScopeGlobal | ScopeSession, TransactionReadOnly, "0"}, - {ScopeGlobal, "innodb_undo_log_truncate", ""}, - {ScopeSession, "innodb_create_intrinsic", ""}, - {ScopeGlobal, "gtid_executed_compression_period", ""}, - {ScopeGlobal, "ndb_log_empty_epochs", ""}, - {ScopeGlobal, MaxPreparedStmtCount, strconv.FormatInt(DefMaxPreparedStmtCount, 10)}, - {ScopeNone, "have_geometry", "YES"}, - {ScopeGlobal | ScopeSession, "optimizer_trace_max_mem_size", "16384"}, - {ScopeGlobal | ScopeSession, "net_retry_count", "10"}, - {ScopeSession, "ndb_table_no_logging", ""}, - {ScopeGlobal | ScopeSession, "optimizer_trace_features", "greedy_search=on,range_optimizer=on,dynamic_range=on,repeated_subselect=on"}, - {ScopeGlobal, "innodb_flush_log_at_trx_commit", "1"}, - {ScopeGlobal, "rewriter_enabled", ""}, - {ScopeGlobal, "query_cache_min_res_unit", "4096"}, - {ScopeGlobal | ScopeSession, "updatable_views_with_limit", "YES"}, - {ScopeGlobal | ScopeSession, "optimizer_prune_level", "1"}, - {ScopeGlobal | ScopeSession, "completion_type", "NO_CHAIN"}, - {ScopeGlobal, "binlog_checksum", "CRC32"}, - {ScopeNone, "report_port", "3306"}, - {ScopeGlobal | ScopeSession, ShowOldTemporals, "0"}, - {ScopeGlobal, "query_cache_limit", "1048576"}, - {ScopeGlobal, "innodb_buffer_pool_size", "134217728"}, - {ScopeGlobal, InnodbAdaptiveFlushing, "1"}, - {ScopeNone, "datadir", "/usr/local/mysql/data/"}, - {ScopeGlobal | ScopeSession, WaitTimeout, strconv.FormatInt(DefWaitTimeout, 10)}, - {ScopeGlobal, "innodb_monitor_enable", ""}, - {ScopeNone, "date_format", "%Y-%m-%d"}, - {ScopeGlobal, "innodb_buffer_pool_filename", "ib_buffer_pool"}, - {ScopeGlobal, "slow_launch_time", "2"}, - {ScopeGlobal | ScopeSession, "ndb_use_transactions", ""}, - {ScopeNone, "innodb_purge_threads", "1"}, - {ScopeGlobal, "innodb_concurrency_tickets", "5000"}, - {ScopeGlobal, "innodb_monitor_reset_all", ""}, - {ScopeNone, "performance_schema_users_size", "100"}, - {ScopeGlobal, "ndb_log_updated_only", ""}, - {ScopeNone, "basedir", "/usr/local/mysql"}, - {ScopeGlobal, "innodb_old_blocks_time", "1000"}, - {ScopeGlobal, "innodb_stats_method", "nulls_equal"}, - {ScopeGlobal | ScopeSession, InnodbLockWaitTimeout, strconv.FormatInt(DefInnodbLockWaitTimeout, 10)}, - {ScopeGlobal, LocalInFile, "1"}, - {ScopeGlobal | ScopeSession, "myisam_stats_method", "nulls_unequal"}, - {ScopeNone, "version_compile_os", "osx10.8"}, - {ScopeNone, "relay_log_recovery", "0"}, - {ScopeNone, "old", "0"}, - {ScopeGlobal | ScopeSession, InnodbTableLocks, "1"}, - {ScopeNone, PerformanceSchema, "0"}, - {ScopeNone, "myisam_recover_options", "OFF"}, - {ScopeGlobal | ScopeSession, NetBufferLength, "16384"}, - {ScopeGlobal | ScopeSession, "binlog_row_image", "FULL"}, - {ScopeNone, "innodb_locks_unsafe_for_binlog", "0"}, - {ScopeSession, "rbr_exec_mode", ""}, - {ScopeGlobal, "myisam_max_sort_file_size", "9223372036853727232"}, - {ScopeNone, "back_log", "80"}, - {ScopeNone, "lower_case_file_system", "1"}, - {ScopeGlobal | ScopeSession, GroupConcatMaxLen, "1024"}, - {ScopeSession, "pseudo_thread_id", ""}, - {ScopeNone, "socket", "/tmp/myssock"}, - {ScopeNone, "have_dynamic_loading", "YES"}, - {ScopeGlobal, "rewriter_verbose", ""}, - {ScopeGlobal, "innodb_undo_logs", "128"}, - {ScopeNone, "performance_schema_max_cond_instances", "3504"}, - {ScopeGlobal, "delayed_insert_limit", "100"}, - {ScopeGlobal, Flush, "0"}, - {ScopeGlobal | ScopeSession, "eq_range_index_dive_limit", "10"}, - {ScopeNone, "performance_schema_events_stages_history_size", "10"}, - {ScopeGlobal | ScopeSession, "character_set_connection", mysql.DefaultCharset}, - {ScopeGlobal, MyISAMUseMmap, "0"}, - {ScopeGlobal | ScopeSession, "ndb_join_pushdown", ""}, - {ScopeGlobal | ScopeSession, CharacterSetServer, mysql.DefaultCharset}, - {ScopeGlobal, "validate_password_special_char_count", "1"}, - {ScopeNone, "performance_schema_max_thread_instances", "402"}, - {ScopeGlobal | ScopeSession, "ndbinfo_show_hidden", ""}, - {ScopeGlobal | ScopeSession, "net_read_timeout", "30"}, - {ScopeNone, "innodb_page_size", "16384"}, - {ScopeGlobal | ScopeSession, MaxAllowedPacket, "67108864"}, - {ScopeNone, "innodb_log_file_size", "50331648"}, - {ScopeGlobal, "sync_relay_log_info", "10000"}, - {ScopeGlobal | ScopeSession, "optimizer_trace_limit", "1"}, - {ScopeNone, "innodb_ft_max_token_size", "84"}, - {ScopeGlobal, "validate_password_length", "8"}, - {ScopeGlobal, "ndb_log_binlog_index", ""}, - {ScopeGlobal, "innodb_api_bk_commit_interval", "5"}, - {ScopeNone, "innodb_undo_directory", "."}, - {ScopeNone, "bind_address", "*"}, - {ScopeGlobal, "innodb_sync_spin_loops", "30"}, - {ScopeGlobal | ScopeSession, SQLSafeUpdates, "0"}, - {ScopeNone, "tmpdir", "/var/tmp/"}, - {ScopeGlobal, "innodb_thread_concurrency", "0"}, - {ScopeGlobal, "innodb_buffer_pool_dump_pct", ""}, - {ScopeGlobal | ScopeSession, "lc_time_names", "en_US"}, - {ScopeGlobal | ScopeSession, "max_statement_time", ""}, - {ScopeGlobal | ScopeSession, EndMakersInJSON, "0"}, - {ScopeGlobal, AvoidTemporalUpgrade, "0"}, - {ScopeGlobal, "key_cache_age_threshold", "300"}, - {ScopeGlobal, InnodbStatusOutput, "0"}, - {ScopeSession, "identity", ""}, - {ScopeGlobal | ScopeSession, "min_examined_row_limit", "0"}, - {ScopeGlobal, "sync_frm", "ON"}, - {ScopeGlobal, "innodb_online_alter_log_max_size", "134217728"}, - {ScopeSession, WarningCount, "0"}, - {ScopeSession, ErrorCount, "0"}, - {ScopeGlobal | ScopeSession, "information_schema_stats_expiry", "86400"}, - {ScopeGlobal, "thread_pool_size", "16"}, - {ScopeGlobal | ScopeSession, WindowingUseHighPrecision, "ON"}, + {Scope: ScopeNone, Name: "explicit_defaults_for_timestamp", Value: "1"}, + {Scope: ScopeNone, Name: "performance_schema_events_waits_history_size", Value: "10"}, + {Scope: ScopeGlobal, Name: "log_syslog_tag", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: TxReadOnly, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: TransactionReadOnly, Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_undo_log_truncate", Value: ""}, + {Scope: ScopeSession, Name: "innodb_create_intrinsic", Value: ""}, + {Scope: ScopeGlobal, Name: "gtid_executed_compression_period", Value: ""}, + {Scope: ScopeGlobal, Name: "ndb_log_empty_epochs", Value: ""}, + {Scope: ScopeGlobal, Name: MaxPreparedStmtCount, Value: strconv.FormatInt(DefMaxPreparedStmtCount, 10)}, + {Scope: ScopeNone, Name: "have_geometry", Value: "YES"}, + {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace_max_mem_size", Value: "16384"}, + {Scope: ScopeGlobal | ScopeSession, Name: "net_retry_count", Value: "10"}, + {Scope: ScopeSession, Name: "ndb_table_no_logging", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace_features", Value: "greedy_search=on,range_optimizer=on,dynamic_range=on,repeated_subselect=on"}, + {Scope: ScopeGlobal, Name: "innodb_flush_log_at_trx_commit", Value: "1"}, + {Scope: ScopeGlobal, Name: "rewriter_enabled", Value: ""}, + {Scope: ScopeGlobal, Name: "query_cache_min_res_unit", Value: "4096"}, + {Scope: ScopeGlobal | ScopeSession, Name: "updatable_views_with_limit", Value: "YES"}, + {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_prune_level", Value: "1"}, + {Scope: ScopeGlobal | ScopeSession, Name: "completion_type", Value: "NO_CHAIN"}, + {Scope: ScopeGlobal, Name: "binlog_checksum", Value: "CRC32"}, + {Scope: ScopeNone, Name: "report_port", Value: "3306"}, + {Scope: ScopeGlobal | ScopeSession, Name: ShowOldTemporals, Value: "0"}, + {Scope: ScopeGlobal, Name: "query_cache_limit", Value: "1048576"}, + {Scope: ScopeGlobal, Name: "innodb_buffer_pool_size", Value: "134217728"}, + {Scope: ScopeGlobal, Name: InnodbAdaptiveFlushing, Value: "1"}, + {Scope: ScopeNone, Name: "datadir", Value: "/usr/local/mysql/data/"}, + {Scope: ScopeGlobal | ScopeSession, Name: WaitTimeout, Value: strconv.FormatInt(DefWaitTimeout, 10)}, + {Scope: ScopeGlobal, Name: "innodb_monitor_enable", Value: ""}, + {Scope: ScopeNone, Name: "date_format", Value: "%Y-%m-%d"}, + {Scope: ScopeGlobal, Name: "innodb_buffer_pool_filename", Value: "ib_buffer_pool"}, + {Scope: ScopeGlobal, Name: "slow_launch_time", Value: "2"}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndb_use_transactions", Value: ""}, + {Scope: ScopeNone, Name: "innodb_purge_threads", Value: "1"}, + {Scope: ScopeGlobal, Name: "innodb_concurrency_tickets", Value: "5000"}, + {Scope: ScopeGlobal, Name: "innodb_monitor_reset_all", Value: ""}, + {Scope: ScopeNone, Name: "performance_schema_users_size", Value: "100"}, + {Scope: ScopeGlobal, Name: "ndb_log_updated_only", Value: ""}, + {Scope: ScopeNone, Name: "basedir", Value: "/usr/local/mysql"}, + {Scope: ScopeGlobal, Name: "innodb_old_blocks_time", Value: "1000"}, + {Scope: ScopeGlobal, Name: "innodb_stats_method", Value: "nulls_equal"}, + {Scope: ScopeGlobal | ScopeSession, Name: InnodbLockWaitTimeout, Value: strconv.FormatInt(DefInnodbLockWaitTimeout, 10)}, + {Scope: ScopeGlobal, Name: LocalInFile, Value: "1"}, + {Scope: ScopeGlobal | ScopeSession, Name: "myisam_stats_method", Value: "nulls_unequal"}, + {Scope: ScopeNone, Name: "version_compile_os", Value: "osx10.8"}, + {Scope: ScopeNone, Name: "relay_log_recovery", Value: "0"}, + {Scope: ScopeNone, Name: "old", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: InnodbTableLocks, Value: "1"}, + {Scope: ScopeNone, Name: PerformanceSchema, Value: "0"}, + {Scope: ScopeNone, Name: "myisam_recover_options", Value: "OFF"}, + {Scope: ScopeGlobal | ScopeSession, Name: NetBufferLength, Value: "16384"}, + {Scope: ScopeGlobal | ScopeSession, Name: "binlog_row_image", Value: "FULL"}, + {Scope: ScopeNone, Name: "innodb_locks_unsafe_for_binlog", Value: "0"}, + {Scope: ScopeSession, Name: "rbr_exec_mode", Value: ""}, + {Scope: ScopeGlobal, Name: "myisam_max_sort_file_size", Value: "9223372036853727232"}, + {Scope: ScopeNone, Name: "back_log", Value: "80"}, + {Scope: ScopeNone, Name: "lower_case_file_system", Value: "1"}, + {Scope: ScopeGlobal | ScopeSession, Name: GroupConcatMaxLen, Value: "1024"}, + {Scope: ScopeSession, Name: "pseudo_thread_id", Value: ""}, + {Scope: ScopeNone, Name: "socket", Value: "/tmp/myssock"}, + {Scope: ScopeNone, Name: "have_dynamic_loading", Value: "YES"}, + {Scope: ScopeGlobal, Name: "rewriter_verbose", Value: ""}, + {Scope: ScopeGlobal, Name: "innodb_undo_logs", Value: "128"}, + {Scope: ScopeNone, Name: "performance_schema_max_cond_instances", Value: "3504"}, + {Scope: ScopeGlobal, Name: "delayed_insert_limit", Value: "100"}, + {Scope: ScopeGlobal, Name: Flush, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "eq_range_index_dive_limit", Value: "10"}, + {Scope: ScopeNone, Name: "performance_schema_events_stages_history_size", Value: "10"}, + {Scope: ScopeGlobal | ScopeSession, Name: "character_set_connection", Value: mysql.DefaultCharset}, + {Scope: ScopeGlobal, Name: MyISAMUseMmap, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndb_join_pushdown", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetServer, Value: mysql.DefaultCharset}, + {Scope: ScopeGlobal, Name: "validate_password_special_char_count", Value: "1"}, + {Scope: ScopeNone, Name: "performance_schema_max_thread_instances", Value: "402"}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndbinfo_show_hidden", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "net_read_timeout", Value: "30"}, + {Scope: ScopeNone, Name: "innodb_page_size", Value: "16384"}, + {Scope: ScopeGlobal | ScopeSession, Name: MaxAllowedPacket, Value: "67108864"}, + {Scope: ScopeNone, Name: "innodb_log_file_size", Value: "50331648"}, + {Scope: ScopeGlobal, Name: "sync_relay_log_info", Value: "10000"}, + {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace_limit", Value: "1"}, + {Scope: ScopeNone, Name: "innodb_ft_max_token_size", Value: "84"}, + {Scope: ScopeGlobal, Name: "validate_password_length", Value: "8"}, + {Scope: ScopeGlobal, Name: "ndb_log_binlog_index", Value: ""}, + {Scope: ScopeGlobal, Name: "innodb_api_bk_commit_interval", Value: "5"}, + {Scope: ScopeNone, Name: "innodb_undo_directory", Value: "."}, + {Scope: ScopeNone, Name: "bind_address", Value: "*"}, + {Scope: ScopeGlobal, Name: "innodb_sync_spin_loops", Value: "30"}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLSafeUpdates, Value: "0"}, + {Scope: ScopeNone, Name: "tmpdir", Value: "/var/tmp/"}, + {Scope: ScopeGlobal, Name: "innodb_thread_concurrency", Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_buffer_pool_dump_pct", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "lc_time_names", Value: "en_US"}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_statement_time", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: EndMakersInJSON, Value: "0"}, + {Scope: ScopeGlobal, Name: AvoidTemporalUpgrade, Value: "0"}, + {Scope: ScopeGlobal, Name: "key_cache_age_threshold", Value: "300"}, + {Scope: ScopeGlobal, Name: InnodbStatusOutput, Value: "0"}, + {Scope: ScopeSession, Name: "identity", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "min_examined_row_limit", Value: "0"}, + {Scope: ScopeGlobal, Name: "sync_frm", Value: "ON"}, + {Scope: ScopeGlobal, Name: "innodb_online_alter_log_max_size", Value: "134217728"}, + {Scope: ScopeSession, Name: WarningCount, Value: "0"}, + {Scope: ScopeSession, Name: ErrorCount, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "information_schema_stats_expiry", Value: "86400"}, + {Scope: ScopeGlobal, Name: "thread_pool_size", Value: "16"}, + {Scope: ScopeGlobal | ScopeSession, Name: WindowingUseHighPrecision, Value: "ON"}, /* TiDB specific variables */ - {ScopeSession, TiDBSnapshot, ""}, - {ScopeSession, TiDBOptAggPushDown, BoolToIntStr(DefOptAggPushDown)}, - {ScopeGlobal | ScopeSession, TiDBOptBCJ, BoolToIntStr(DefOptBCJ)}, - {ScopeSession, TiDBOptDistinctAggPushDown, BoolToIntStr(config.GetGlobalConfig().Performance.DistinctAggPushDown)}, - {ScopeSession, TiDBOptWriteRowID, BoolToIntStr(DefOptWriteRowID)}, - {ScopeGlobal | ScopeSession, TiDBBuildStatsConcurrency, strconv.Itoa(DefBuildStatsConcurrency)}, - {ScopeGlobal, TiDBAutoAnalyzeRatio, strconv.FormatFloat(DefAutoAnalyzeRatio, 'f', -1, 64)}, - {ScopeGlobal, TiDBAutoAnalyzeStartTime, DefAutoAnalyzeStartTime}, - {ScopeGlobal, TiDBAutoAnalyzeEndTime, DefAutoAnalyzeEndTime}, - {ScopeSession, TiDBChecksumTableConcurrency, strconv.Itoa(DefChecksumTableConcurrency)}, - {ScopeGlobal | ScopeSession, TiDBExecutorConcurrency, strconv.Itoa(DefExecutorConcurrency)}, - {ScopeGlobal | ScopeSession, TiDBDistSQLScanConcurrency, strconv.Itoa(DefDistSQLScanConcurrency)}, - {ScopeGlobal | ScopeSession, TiDBOptInSubqToJoinAndAgg, BoolToIntStr(DefOptInSubqToJoinAndAgg)}, - {ScopeGlobal | ScopeSession, TiDBOptCorrelationThreshold, strconv.FormatFloat(DefOptCorrelationThreshold, 'f', -1, 64)}, - {ScopeGlobal | ScopeSession, TiDBOptCorrelationExpFactor, strconv.Itoa(DefOptCorrelationExpFactor)}, - {ScopeGlobal | ScopeSession, TiDBOptCPUFactor, strconv.FormatFloat(DefOptCPUFactor, 'f', -1, 64)}, - {ScopeGlobal | ScopeSession, TiDBOptTiFlashConcurrencyFactor, strconv.FormatFloat(DefOptTiFlashConcurrencyFactor, 'f', -1, 64)}, - {ScopeGlobal | ScopeSession, TiDBOptCopCPUFactor, strconv.FormatFloat(DefOptCopCPUFactor, 'f', -1, 64)}, - {ScopeGlobal | ScopeSession, TiDBOptNetworkFactor, strconv.FormatFloat(DefOptNetworkFactor, 'f', -1, 64)}, - {ScopeGlobal | ScopeSession, TiDBOptScanFactor, strconv.FormatFloat(DefOptScanFactor, 'f', -1, 64)}, - {ScopeGlobal | ScopeSession, TiDBOptDescScanFactor, strconv.FormatFloat(DefOptDescScanFactor, 'f', -1, 64)}, - {ScopeGlobal | ScopeSession, TiDBOptSeekFactor, strconv.FormatFloat(DefOptSeekFactor, 'f', -1, 64)}, - {ScopeGlobal | ScopeSession, TiDBOptMemoryFactor, strconv.FormatFloat(DefOptMemoryFactor, 'f', -1, 64)}, - {ScopeGlobal | ScopeSession, TiDBOptDiskFactor, strconv.FormatFloat(DefOptDiskFactor, 'f', -1, 64)}, - {ScopeGlobal | ScopeSession, TiDBOptConcurrencyFactor, strconv.FormatFloat(DefOptConcurrencyFactor, 'f', -1, 64)}, - {ScopeGlobal | ScopeSession, TiDBIndexJoinBatchSize, strconv.Itoa(DefIndexJoinBatchSize)}, - {ScopeGlobal | ScopeSession, TiDBIndexLookupSize, strconv.Itoa(DefIndexLookupSize)}, - {ScopeGlobal | ScopeSession, TiDBIndexLookupConcurrency, strconv.Itoa(DefIndexLookupConcurrency)}, - {ScopeGlobal | ScopeSession, TiDBIndexLookupJoinConcurrency, strconv.Itoa(DefIndexLookupJoinConcurrency)}, - {ScopeGlobal | ScopeSession, TiDBIndexSerialScanConcurrency, strconv.Itoa(DefIndexSerialScanConcurrency)}, - {ScopeGlobal | ScopeSession, TiDBSkipUTF8Check, BoolToIntStr(DefSkipUTF8Check)}, - {ScopeGlobal | ScopeSession, TiDBSkipASCIICheck, BoolToIntStr(DefSkipASCIICheck)}, - {ScopeSession, TiDBBatchInsert, BoolToIntStr(DefBatchInsert)}, - {ScopeSession, TiDBBatchDelete, BoolToIntStr(DefBatchDelete)}, - {ScopeSession, TiDBBatchCommit, BoolToIntStr(DefBatchCommit)}, - {ScopeGlobal | ScopeSession, TiDBDMLBatchSize, strconv.Itoa(DefDMLBatchSize)}, - {ScopeSession, TiDBCurrentTS, strconv.Itoa(DefCurretTS)}, - {ScopeSession, TiDBLastTxnInfo, strconv.Itoa(DefCurretTS)}, - {ScopeGlobal | ScopeSession, TiDBMaxChunkSize, strconv.Itoa(DefMaxChunkSize)}, - {ScopeGlobal | ScopeSession, TiDBAllowBatchCop, strconv.Itoa(DefTiDBAllowBatchCop)}, - {ScopeGlobal | ScopeSession, TiDBInitChunkSize, strconv.Itoa(DefInitChunkSize)}, - {ScopeGlobal | ScopeSession, TiDBEnableCascadesPlanner, "0"}, - {ScopeGlobal | ScopeSession, TiDBEnableIndexMerge, "0"}, - {ScopeSession, TIDBMemQuotaQuery, strconv.FormatInt(config.GetGlobalConfig().MemQuotaQuery, 10)}, - {ScopeSession, TIDBMemQuotaHashJoin, strconv.FormatInt(DefTiDBMemQuotaHashJoin, 10)}, - {ScopeSession, TIDBMemQuotaMergeJoin, strconv.FormatInt(DefTiDBMemQuotaMergeJoin, 10)}, - {ScopeSession, TIDBMemQuotaSort, strconv.FormatInt(DefTiDBMemQuotaSort, 10)}, - {ScopeSession, TIDBMemQuotaTopn, strconv.FormatInt(DefTiDBMemQuotaTopn, 10)}, - {ScopeSession, TIDBMemQuotaIndexLookupReader, strconv.FormatInt(DefTiDBMemQuotaIndexLookupReader, 10)}, - {ScopeSession, TIDBMemQuotaIndexLookupJoin, strconv.FormatInt(DefTiDBMemQuotaIndexLookupJoin, 10)}, - {ScopeSession, TIDBMemQuotaNestedLoopApply, strconv.FormatInt(DefTiDBMemQuotaNestedLoopApply, 10)}, - {ScopeSession, TiDBEnableStreaming, "0"}, - {ScopeSession, TiDBEnableChunkRPC, "1"}, - {ScopeSession, TxnIsolationOneShot, ""}, - {ScopeGlobal | ScopeSession, TiDBEnableTablePartition, "on"}, - {ScopeGlobal | ScopeSession, TiDBHashJoinConcurrency, strconv.Itoa(DefTiDBHashJoinConcurrency)}, - {ScopeGlobal | ScopeSession, TiDBProjectionConcurrency, strconv.Itoa(DefTiDBProjectionConcurrency)}, - {ScopeGlobal | ScopeSession, TiDBHashAggPartialConcurrency, strconv.Itoa(DefTiDBHashAggPartialConcurrency)}, - {ScopeGlobal | ScopeSession, TiDBHashAggFinalConcurrency, strconv.Itoa(DefTiDBHashAggFinalConcurrency)}, - {ScopeGlobal | ScopeSession, TiDBWindowConcurrency, strconv.Itoa(DefTiDBWindowConcurrency)}, - {ScopeGlobal | ScopeSession, TiDBEnableParallelApply, BoolToIntStr(DefTiDBEnableParallelApply)}, - {ScopeGlobal | ScopeSession, TiDBBackoffLockFast, strconv.Itoa(kv.DefBackoffLockFast)}, - {ScopeGlobal | ScopeSession, TiDBBackOffWeight, strconv.Itoa(kv.DefBackOffWeight)}, - {ScopeGlobal | ScopeSession, TiDBRetryLimit, strconv.Itoa(DefTiDBRetryLimit)}, - {ScopeGlobal | ScopeSession, TiDBDisableTxnAutoRetry, BoolToIntStr(DefTiDBDisableTxnAutoRetry)}, - {ScopeGlobal | ScopeSession, TiDBConstraintCheckInPlace, BoolToIntStr(DefTiDBConstraintCheckInPlace)}, - {ScopeGlobal | ScopeSession, TiDBTxnMode, DefTiDBTxnMode}, - {ScopeGlobal, TiDBRowFormatVersion, strconv.Itoa(DefTiDBRowFormatV1)}, - {ScopeSession, TiDBOptimizerSelectivityLevel, strconv.Itoa(DefTiDBOptimizerSelectivityLevel)}, - {ScopeGlobal | ScopeSession, TiDBEnableWindowFunction, BoolToIntStr(DefEnableWindowFunction)}, - {ScopeGlobal | ScopeSession, TiDBEnableVectorizedExpression, BoolToIntStr(DefEnableVectorizedExpression)}, - {ScopeGlobal | ScopeSession, TiDBEnableFastAnalyze, BoolToIntStr(DefTiDBUseFastAnalyze)}, - {ScopeGlobal | ScopeSession, TiDBSkipIsolationLevelCheck, BoolToIntStr(DefTiDBSkipIsolationLevelCheck)}, + {Scope: ScopeSession, Name: TiDBSnapshot, Value: ""}, + {Scope: ScopeSession, Name: TiDBOptAggPushDown, Value: BoolToIntStr(DefOptAggPushDown)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptBCJ, Value: BoolToIntStr(DefOptBCJ)}, + {Scope: ScopeSession, Name: TiDBOptDistinctAggPushDown, Value: BoolToIntStr(config.GetGlobalConfig().Performance.DistinctAggPushDown)}, + {Scope: ScopeSession, Name: TiDBOptWriteRowID, Value: BoolToIntStr(DefOptWriteRowID)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBBuildStatsConcurrency, Value: strconv.Itoa(DefBuildStatsConcurrency)}, + {Scope: ScopeGlobal, Name: TiDBAutoAnalyzeRatio, Value: strconv.FormatFloat(DefAutoAnalyzeRatio, 'f', -1, 64)}, + {Scope: ScopeGlobal, Name: TiDBAutoAnalyzeStartTime, Value: DefAutoAnalyzeStartTime}, + {Scope: ScopeGlobal, Name: TiDBAutoAnalyzeEndTime, Value: DefAutoAnalyzeEndTime}, + {Scope: ScopeSession, Name: TiDBChecksumTableConcurrency, Value: strconv.Itoa(DefChecksumTableConcurrency)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBExecutorConcurrency, Value: strconv.Itoa(DefExecutorConcurrency)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBDistSQLScanConcurrency, Value: strconv.Itoa(DefDistSQLScanConcurrency)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptInSubqToJoinAndAgg, Value: BoolToIntStr(DefOptInSubqToJoinAndAgg)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptCorrelationThreshold, Value: strconv.FormatFloat(DefOptCorrelationThreshold, 'f', -1, 64)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptCorrelationExpFactor, Value: strconv.Itoa(DefOptCorrelationExpFactor)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptCPUFactor, Value: strconv.FormatFloat(DefOptCPUFactor, 'f', -1, 64)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptTiFlashConcurrencyFactor, Value: strconv.FormatFloat(DefOptTiFlashConcurrencyFactor, 'f', -1, 64)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptCopCPUFactor, Value: strconv.FormatFloat(DefOptCopCPUFactor, 'f', -1, 64)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptNetworkFactor, Value: strconv.FormatFloat(DefOptNetworkFactor, 'f', -1, 64)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptScanFactor, Value: strconv.FormatFloat(DefOptScanFactor, 'f', -1, 64)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptDescScanFactor, Value: strconv.FormatFloat(DefOptDescScanFactor, 'f', -1, 64)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptSeekFactor, Value: strconv.FormatFloat(DefOptSeekFactor, 'f', -1, 64)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptMemoryFactor, Value: strconv.FormatFloat(DefOptMemoryFactor, 'f', -1, 64)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptDiskFactor, Value: strconv.FormatFloat(DefOptDiskFactor, 'f', -1, 64)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptConcurrencyFactor, Value: strconv.FormatFloat(DefOptConcurrencyFactor, 'f', -1, 64)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBIndexJoinBatchSize, Value: strconv.Itoa(DefIndexJoinBatchSize)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBIndexLookupSize, Value: strconv.Itoa(DefIndexLookupSize)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBIndexLookupConcurrency, Value: strconv.Itoa(DefIndexLookupConcurrency)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBIndexLookupJoinConcurrency, Value: strconv.Itoa(DefIndexLookupJoinConcurrency)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBIndexSerialScanConcurrency, Value: strconv.Itoa(DefIndexSerialScanConcurrency)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBSkipUTF8Check, Value: BoolToIntStr(DefSkipUTF8Check)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBSkipASCIICheck, Value: BoolToIntStr(DefSkipASCIICheck)}, + {Scope: ScopeSession, Name: TiDBBatchInsert, Value: BoolToIntStr(DefBatchInsert)}, + {Scope: ScopeSession, Name: TiDBBatchDelete, Value: BoolToIntStr(DefBatchDelete)}, + {Scope: ScopeSession, Name: TiDBBatchCommit, Value: BoolToIntStr(DefBatchCommit)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBDMLBatchSize, Value: strconv.Itoa(DefDMLBatchSize)}, + {Scope: ScopeSession, Name: TiDBCurrentTS, Value: strconv.Itoa(DefCurretTS)}, + {Scope: ScopeSession, Name: TiDBLastTxnInfo, Value: strconv.Itoa(DefCurretTS)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBMaxChunkSize, Value: strconv.Itoa(DefMaxChunkSize)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBAllowBatchCop, Value: strconv.Itoa(DefTiDBAllowBatchCop)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBInitChunkSize, Value: strconv.Itoa(DefInitChunkSize)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableCascadesPlanner, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableIndexMerge, Value: "0"}, + {Scope: ScopeSession, Name: TIDBMemQuotaQuery, Value: strconv.FormatInt(config.GetGlobalConfig().MemQuotaQuery, 10)}, + {Scope: ScopeSession, Name: TIDBMemQuotaHashJoin, Value: strconv.FormatInt(DefTiDBMemQuotaHashJoin, 10)}, + {Scope: ScopeSession, Name: TIDBMemQuotaMergeJoin, Value: strconv.FormatInt(DefTiDBMemQuotaMergeJoin, 10)}, + {Scope: ScopeSession, Name: TIDBMemQuotaSort, Value: strconv.FormatInt(DefTiDBMemQuotaSort, 10)}, + {Scope: ScopeSession, Name: TIDBMemQuotaTopn, Value: strconv.FormatInt(DefTiDBMemQuotaTopn, 10)}, + {Scope: ScopeSession, Name: TIDBMemQuotaIndexLookupReader, Value: strconv.FormatInt(DefTiDBMemQuotaIndexLookupReader, 10)}, + {Scope: ScopeSession, Name: TIDBMemQuotaIndexLookupJoin, Value: strconv.FormatInt(DefTiDBMemQuotaIndexLookupJoin, 10)}, + {Scope: ScopeSession, Name: TIDBMemQuotaNestedLoopApply, Value: strconv.FormatInt(DefTiDBMemQuotaNestedLoopApply, 10)}, + {Scope: ScopeSession, Name: TiDBEnableStreaming, Value: "0"}, + {Scope: ScopeSession, Name: TiDBEnableChunkRPC, Value: "1"}, + {Scope: ScopeSession, Name: TxnIsolationOneShot, Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableTablePartition, Value: "on"}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBHashJoinConcurrency, Value: strconv.Itoa(DefTiDBHashJoinConcurrency)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBProjectionConcurrency, Value: strconv.Itoa(DefTiDBProjectionConcurrency)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBHashAggPartialConcurrency, Value: strconv.Itoa(DefTiDBHashAggPartialConcurrency)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBHashAggFinalConcurrency, Value: strconv.Itoa(DefTiDBHashAggFinalConcurrency)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBWindowConcurrency, Value: strconv.Itoa(DefTiDBWindowConcurrency)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableParallelApply, Value: BoolToIntStr(DefTiDBEnableParallelApply)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBBackoffLockFast, Value: strconv.Itoa(kv.DefBackoffLockFast)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBBackOffWeight, Value: strconv.Itoa(kv.DefBackOffWeight)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBRetryLimit, Value: strconv.Itoa(DefTiDBRetryLimit)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBDisableTxnAutoRetry, Value: BoolToIntStr(DefTiDBDisableTxnAutoRetry)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBConstraintCheckInPlace, Value: BoolToIntStr(DefTiDBConstraintCheckInPlace)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBTxnMode, Value: DefTiDBTxnMode}, + {Scope: ScopeGlobal, Name: TiDBRowFormatVersion, Value: strconv.Itoa(DefTiDBRowFormatV1)}, + {Scope: ScopeSession, Name: TiDBOptimizerSelectivityLevel, Value: strconv.Itoa(DefTiDBOptimizerSelectivityLevel)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableWindowFunction, Value: BoolToIntStr(DefEnableWindowFunction)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableVectorizedExpression, Value: BoolToIntStr(DefEnableVectorizedExpression)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableFastAnalyze, Value: BoolToIntStr(DefTiDBUseFastAnalyze)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBSkipIsolationLevelCheck, Value: BoolToIntStr(DefTiDBSkipIsolationLevelCheck)}, /* The following variable is defined as session scope but is actually server scope. */ - {ScopeSession, TiDBGeneralLog, strconv.Itoa(DefTiDBGeneralLog)}, - {ScopeSession, TiDBPProfSQLCPU, strconv.Itoa(DefTiDBPProfSQLCPU)}, - {ScopeSession, TiDBDDLSlowOprThreshold, strconv.Itoa(DefTiDBDDLSlowOprThreshold)}, - {ScopeSession, TiDBConfig, ""}, - {ScopeGlobal, TiDBDDLReorgWorkerCount, strconv.Itoa(DefTiDBDDLReorgWorkerCount)}, - {ScopeGlobal, TiDBDDLReorgBatchSize, strconv.Itoa(DefTiDBDDLReorgBatchSize)}, - {ScopeGlobal, TiDBDDLErrorCountLimit, strconv.Itoa(DefTiDBDDLErrorCountLimit)}, - {ScopeSession, TiDBDDLReorgPriority, "PRIORITY_LOW"}, - {ScopeGlobal, TiDBMaxDeltaSchemaCount, strconv.Itoa(DefTiDBMaxDeltaSchemaCount)}, - {ScopeGlobal, TiDBEnableChangeColumnType, BoolToIntStr(DefTiDBChangeColumnType)}, - {ScopeSession, TiDBForcePriority, mysql.Priority2Str[DefTiDBForcePriority]}, - {ScopeSession, TiDBEnableRadixJoin, BoolToIntStr(DefTiDBUseRadixJoin)}, - {ScopeGlobal | ScopeSession, TiDBOptJoinReorderThreshold, strconv.Itoa(DefTiDBOptJoinReorderThreshold)}, - {ScopeSession, TiDBSlowQueryFile, ""}, - {ScopeGlobal, TiDBScatterRegion, BoolToIntStr(DefTiDBScatterRegion)}, - {ScopeSession, TiDBWaitSplitRegionFinish, BoolToIntStr(DefTiDBWaitSplitRegionFinish)}, - {ScopeSession, TiDBWaitSplitRegionTimeout, strconv.Itoa(DefWaitSplitRegionTimeout)}, - {ScopeSession, TiDBLowResolutionTSO, "0"}, - {ScopeSession, TiDBExpensiveQueryTimeThreshold, strconv.Itoa(DefTiDBExpensiveQueryTimeThreshold)}, - {ScopeGlobal | ScopeSession, TiDBEnableNoopFuncs, BoolToIntStr(DefTiDBEnableNoopFuncs)}, - {ScopeSession, TiDBReplicaRead, "leader"}, - {ScopeSession, TiDBAllowRemoveAutoInc, BoolToIntStr(DefTiDBAllowRemoveAutoInc)}, - {ScopeGlobal | ScopeSession, TiDBEnableStmtSummary, BoolToIntStr(config.GetGlobalConfig().StmtSummary.Enable)}, - {ScopeGlobal | ScopeSession, TiDBStmtSummaryInternalQuery, BoolToIntStr(config.GetGlobalConfig().StmtSummary.EnableInternalQuery)}, - {ScopeGlobal | ScopeSession, TiDBStmtSummaryRefreshInterval, strconv.Itoa(config.GetGlobalConfig().StmtSummary.RefreshInterval)}, - {ScopeGlobal | ScopeSession, TiDBStmtSummaryHistorySize, strconv.Itoa(config.GetGlobalConfig().StmtSummary.HistorySize)}, - {ScopeGlobal | ScopeSession, TiDBStmtSummaryMaxStmtCount, strconv.FormatUint(uint64(config.GetGlobalConfig().StmtSummary.MaxStmtCount), 10)}, - {ScopeGlobal | ScopeSession, TiDBStmtSummaryMaxSQLLength, strconv.FormatUint(uint64(config.GetGlobalConfig().StmtSummary.MaxSQLLength), 10)}, - {ScopeGlobal | ScopeSession, TiDBCapturePlanBaseline, "off"}, - {ScopeGlobal | ScopeSession, TiDBUsePlanBaselines, boolToOnOff(DefTiDBUsePlanBaselines)}, - {ScopeGlobal | ScopeSession, TiDBEvolvePlanBaselines, boolToOnOff(DefTiDBEvolvePlanBaselines)}, - {ScopeGlobal, TiDBEvolvePlanTaskMaxTime, strconv.Itoa(DefTiDBEvolvePlanTaskMaxTime)}, - {ScopeGlobal, TiDBEvolvePlanTaskStartTime, DefTiDBEvolvePlanTaskStartTime}, - {ScopeGlobal, TiDBEvolvePlanTaskEndTime, DefTiDBEvolvePlanTaskEndTime}, - {ScopeSession, TiDBIsolationReadEngines, strings.Join(config.GetGlobalConfig().IsolationRead.Engines, ", ")}, - {ScopeGlobal | ScopeSession, TiDBStoreLimit, strconv.FormatInt(atomic.LoadInt64(&config.GetGlobalConfig().TiKVClient.StoreLimit), 10)}, - {ScopeSession, TiDBMetricSchemaStep, strconv.Itoa(DefTiDBMetricSchemaStep)}, - {ScopeSession, TiDBMetricSchemaRangeDuration, strconv.Itoa(DefTiDBMetricSchemaRangeDuration)}, - {ScopeSession, TiDBSlowLogThreshold, strconv.Itoa(logutil.DefaultSlowThreshold)}, - {ScopeSession, TiDBRecordPlanInSlowLog, strconv.Itoa(logutil.DefaultRecordPlanInSlowLog)}, - {ScopeSession, TiDBEnableSlowLog, BoolToIntStr(logutil.DefaultTiDBEnableSlowLog)}, - {ScopeSession, TiDBQueryLogMaxLen, strconv.Itoa(logutil.DefaultQueryLogMaxLen)}, - {ScopeSession, TiDBCheckMb4ValueInUTF8, BoolToIntStr(config.GetGlobalConfig().CheckMb4ValueInUTF8)}, - {ScopeSession, TiDBFoundInPlanCache, BoolToIntStr(DefTiDBFoundInPlanCache)}, - {ScopeSession, TiDBEnableCollectExecutionInfo, BoolToIntStr(DefTiDBEnableCollectExecutionInfo)}, - {ScopeGlobal | ScopeSession, TiDBAllowAutoRandExplicitInsert, boolToOnOff(DefTiDBAllowAutoRandExplicitInsert)}, - {ScopeGlobal | ScopeSession, TiDBEnableClusteredIndex, BoolToIntStr(DefTiDBEnableClusteredIndex)}, - {ScopeGlobal | ScopeSession, TiDBPartitionPruneMode, string(StaticOnly)}, - {ScopeGlobal, TiDBSlowLogMasking, BoolToIntStr(DefTiDBSlowLogMasking)}, - {ScopeGlobal, TiDBRedactLog, strconv.Itoa(config.DefTiDBRedactLog)}, - {ScopeGlobal | ScopeSession, TiDBShardAllocateStep, strconv.Itoa(DefTiDBShardAllocateStep)}, - {ScopeGlobal, TiDBEnableTelemetry, BoolToIntStr(DefTiDBEnableTelemetry)}, - {ScopeGlobal | ScopeSession, TiDBEnableAmendPessimisticTxn, boolToOnOff(DefTiDBEnableAmendPessimisticTxn)}, + {Scope: ScopeSession, Name: TiDBGeneralLog, Value: strconv.Itoa(DefTiDBGeneralLog)}, + {Scope: ScopeSession, Name: TiDBPProfSQLCPU, Value: strconv.Itoa(DefTiDBPProfSQLCPU)}, + {Scope: ScopeSession, Name: TiDBDDLSlowOprThreshold, Value: strconv.Itoa(DefTiDBDDLSlowOprThreshold)}, + {Scope: ScopeSession, Name: TiDBConfig, Value: ""}, + {Scope: ScopeGlobal, Name: TiDBDDLReorgWorkerCount, Value: strconv.Itoa(DefTiDBDDLReorgWorkerCount)}, + {Scope: ScopeGlobal, Name: TiDBDDLReorgBatchSize, Value: strconv.Itoa(DefTiDBDDLReorgBatchSize)}, + {Scope: ScopeGlobal, Name: TiDBDDLErrorCountLimit, Value: strconv.Itoa(DefTiDBDDLErrorCountLimit)}, + {Scope: ScopeSession, Name: TiDBDDLReorgPriority, Value: "PRIORITY_LOW"}, + {Scope: ScopeGlobal, Name: TiDBMaxDeltaSchemaCount, Value: strconv.Itoa(DefTiDBMaxDeltaSchemaCount)}, + {Scope: ScopeGlobal, Name: TiDBEnableChangeColumnType, Value: BoolToIntStr(DefTiDBChangeColumnType)}, + {Scope: ScopeSession, Name: TiDBForcePriority, Value: mysql.Priority2Str[DefTiDBForcePriority]}, + {Scope: ScopeSession, Name: TiDBEnableRadixJoin, Value: BoolToIntStr(DefTiDBUseRadixJoin)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptJoinReorderThreshold, Value: strconv.Itoa(DefTiDBOptJoinReorderThreshold)}, + {Scope: ScopeSession, Name: TiDBSlowQueryFile, Value: ""}, + {Scope: ScopeGlobal, Name: TiDBScatterRegion, Value: BoolToIntStr(DefTiDBScatterRegion)}, + {Scope: ScopeSession, Name: TiDBWaitSplitRegionFinish, Value: BoolToIntStr(DefTiDBWaitSplitRegionFinish)}, + {Scope: ScopeSession, Name: TiDBWaitSplitRegionTimeout, Value: strconv.Itoa(DefWaitSplitRegionTimeout)}, + {Scope: ScopeSession, Name: TiDBLowResolutionTSO, Value: "0"}, + {Scope: ScopeSession, Name: TiDBExpensiveQueryTimeThreshold, Value: strconv.Itoa(DefTiDBExpensiveQueryTimeThreshold)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableNoopFuncs, Value: BoolToIntStr(DefTiDBEnableNoopFuncs)}, + {Scope: ScopeSession, Name: TiDBReplicaRead, Value: "leader"}, + {Scope: ScopeSession, Name: TiDBAllowRemoveAutoInc, Value: BoolToIntStr(DefTiDBAllowRemoveAutoInc)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableStmtSummary, Value: BoolToIntStr(config.GetGlobalConfig().StmtSummary.Enable)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryInternalQuery, Value: BoolToIntStr(config.GetGlobalConfig().StmtSummary.EnableInternalQuery)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryRefreshInterval, Value: strconv.Itoa(config.GetGlobalConfig().StmtSummary.RefreshInterval)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryHistorySize, Value: strconv.Itoa(config.GetGlobalConfig().StmtSummary.HistorySize)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryMaxStmtCount, Value: strconv.FormatUint(uint64(config.GetGlobalConfig().StmtSummary.MaxStmtCount), 10)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryMaxSQLLength, Value: strconv.FormatUint(uint64(config.GetGlobalConfig().StmtSummary.MaxSQLLength), 10)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBCapturePlanBaseline, Value: "off"}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBUsePlanBaselines, Value: boolToOnOff(DefTiDBUsePlanBaselines)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEvolvePlanBaselines, Value: boolToOnOff(DefTiDBEvolvePlanBaselines)}, + {Scope: ScopeGlobal, Name: TiDBEvolvePlanTaskMaxTime, Value: strconv.Itoa(DefTiDBEvolvePlanTaskMaxTime)}, + {Scope: ScopeGlobal, Name: TiDBEvolvePlanTaskStartTime, Value: DefTiDBEvolvePlanTaskStartTime}, + {Scope: ScopeGlobal, Name: TiDBEvolvePlanTaskEndTime, Value: DefTiDBEvolvePlanTaskEndTime}, + {Scope: ScopeSession, Name: TiDBIsolationReadEngines, Value: strings.Join(config.GetGlobalConfig().IsolationRead.Engines, ", ")}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBStoreLimit, Value: strconv.FormatInt(atomic.LoadInt64(&config.GetGlobalConfig().TiKVClient.StoreLimit), 10)}, + {Scope: ScopeSession, Name: TiDBMetricSchemaStep, Value: strconv.Itoa(DefTiDBMetricSchemaStep)}, + {Scope: ScopeSession, Name: TiDBMetricSchemaRangeDuration, Value: strconv.Itoa(DefTiDBMetricSchemaRangeDuration)}, + {Scope: ScopeSession, Name: TiDBSlowLogThreshold, Value: strconv.Itoa(logutil.DefaultSlowThreshold)}, + {Scope: ScopeSession, Name: TiDBRecordPlanInSlowLog, Value: strconv.Itoa(logutil.DefaultRecordPlanInSlowLog)}, + {Scope: ScopeSession, Name: TiDBEnableSlowLog, Value: BoolToIntStr(logutil.DefaultTiDBEnableSlowLog)}, + {Scope: ScopeSession, Name: TiDBQueryLogMaxLen, Value: strconv.Itoa(logutil.DefaultQueryLogMaxLen)}, + {Scope: ScopeSession, Name: TiDBCheckMb4ValueInUTF8, Value: BoolToIntStr(config.GetGlobalConfig().CheckMb4ValueInUTF8)}, + {Scope: ScopeSession, Name: TiDBFoundInPlanCache, Value: BoolToIntStr(DefTiDBFoundInPlanCache)}, + {Scope: ScopeSession, Name: TiDBEnableCollectExecutionInfo, Value: BoolToIntStr(DefTiDBEnableCollectExecutionInfo)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBAllowAutoRandExplicitInsert, Value: boolToOnOff(DefTiDBAllowAutoRandExplicitInsert)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableClusteredIndex, Value: BoolToIntStr(DefTiDBEnableClusteredIndex)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBPartitionPruneMode, Value: string(StaticOnly)}, + {Scope: ScopeGlobal, Name: TiDBSlowLogMasking, Value: BoolToIntStr(DefTiDBSlowLogMasking)}, + {Scope: ScopeGlobal, Name: TiDBRedactLog, Value: strconv.Itoa(config.DefTiDBRedactLog)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBShardAllocateStep, Value: strconv.Itoa(DefTiDBShardAllocateStep)}, + {Scope: ScopeGlobal, Name: TiDBEnableTelemetry, Value: BoolToIntStr(DefTiDBEnableTelemetry)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableAmendPessimisticTxn, Value: boolToOnOff(DefTiDBEnableAmendPessimisticTxn)}, // for compatibility purpose, we should leave them alone. // TODO: Follow the Terminology Updates of MySQL after their changes arrived. // https://mysqlhighavailability.com/mysql-terminology-updates/ - {ScopeSession, PseudoSlaveMode, ""}, - {ScopeGlobal, "slave_pending_jobs_size_max", "16777216"}, - {ScopeGlobal, "slave_transaction_retries", "10"}, - {ScopeGlobal, "slave_checkpoint_period", "300"}, - {ScopeGlobal, MasterVerifyChecksum, "0"}, - {ScopeGlobal, "rpl_semi_sync_master_trace_level", ""}, - {ScopeGlobal, "master_info_repository", "FILE"}, - {ScopeGlobal, "rpl_stop_slave_timeout", "31536000"}, - {ScopeGlobal, "slave_net_timeout", "3600"}, - {ScopeGlobal, "sync_master_info", "10000"}, - {ScopeGlobal, "init_slave", ""}, - {ScopeGlobal, SlaveCompressedProtocol, "0"}, - {ScopeGlobal, "rpl_semi_sync_slave_trace_level", ""}, - {ScopeGlobal, LogSlowSlaveStatements, "0"}, - {ScopeGlobal, "slave_checkpoint_group", "512"}, - {ScopeNone, "slave_load_tmpdir", "/var/tmp/"}, - {ScopeGlobal, "slave_parallel_type", ""}, - {ScopeGlobal, "slave_parallel_workers", "0"}, - {ScopeGlobal, "rpl_semi_sync_master_timeout", ""}, - {ScopeNone, "slave_skip_errors", "OFF"}, - {ScopeGlobal, "sql_slave_skip_counter", "0"}, - {ScopeGlobal, "rpl_semi_sync_slave_enabled", ""}, - {ScopeGlobal, "rpl_semi_sync_master_enabled", ""}, - {ScopeGlobal, "slave_preserve_commit_order", ""}, - {ScopeGlobal, "slave_exec_mode", "STRICT"}, - {ScopeNone, "log_slave_updates", "0"}, - {ScopeGlobal, "rpl_semi_sync_master_wait_point", ""}, - {ScopeGlobal, "slave_sql_verify_checksum", "1"}, - {ScopeGlobal, "slave_max_allowed_packet", "1073741824"}, - {ScopeGlobal, "rpl_semi_sync_master_wait_for_slave_count", ""}, - {ScopeGlobal, "rpl_semi_sync_master_wait_no_slave", ""}, - {ScopeGlobal, "slave_rows_search_algorithms", "TABLE_SCAN,INDEX_SCAN"}, - {ScopeGlobal, SlaveAllowBatching, "0"}, + {Scope: ScopeSession, Name: PseudoSlaveMode, Value: ""}, + {Scope: ScopeGlobal, Name: "slave_pending_jobs_size_max", Value: "16777216"}, + {Scope: ScopeGlobal, Name: "slave_transaction_retries", Value: "10"}, + {Scope: ScopeGlobal, Name: "slave_checkpoint_period", Value: "300"}, + {Scope: ScopeGlobal, Name: MasterVerifyChecksum, Value: "0"}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_trace_level", Value: ""}, + {Scope: ScopeGlobal, Name: "master_info_repository", Value: "FILE"}, + {Scope: ScopeGlobal, Name: "rpl_stop_slave_timeout", Value: "31536000"}, + {Scope: ScopeGlobal, Name: "slave_net_timeout", Value: "3600"}, + {Scope: ScopeGlobal, Name: "sync_master_info", Value: "10000"}, + {Scope: ScopeGlobal, Name: "init_slave", Value: ""}, + {Scope: ScopeGlobal, Name: SlaveCompressedProtocol, Value: "0"}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_slave_trace_level", Value: ""}, + {Scope: ScopeGlobal, Name: LogSlowSlaveStatements, Value: "0"}, + {Scope: ScopeGlobal, Name: "slave_checkpoint_group", Value: "512"}, + {Scope: ScopeNone, Name: "slave_load_tmpdir", Value: "/var/tmp/"}, + {Scope: ScopeGlobal, Name: "slave_parallel_type", Value: ""}, + {Scope: ScopeGlobal, Name: "slave_parallel_workers", Value: "0"}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_timeout", Value: ""}, + {Scope: ScopeNone, Name: "slave_skip_errors", Value: "OFF"}, + {Scope: ScopeGlobal, Name: "sql_slave_skip_counter", Value: "0"}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_slave_enabled", Value: ""}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_enabled", Value: ""}, + {Scope: ScopeGlobal, Name: "slave_preserve_commit_order", Value: ""}, + {Scope: ScopeGlobal, Name: "slave_exec_mode", Value: "STRICT"}, + {Scope: ScopeNone, Name: "log_slave_updates", Value: "0"}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_wait_point", Value: ""}, + {Scope: ScopeGlobal, Name: "slave_sql_verify_checksum", Value: "1"}, + {Scope: ScopeGlobal, Name: "slave_max_allowed_packet", Value: "1073741824"}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_wait_for_slave_count", Value: ""}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_wait_no_slave", Value: ""}, + {Scope: ScopeGlobal, Name: "slave_rows_search_algorithms", Value: "TABLE_SCANINDEX_SCAN"}, + {Scope: ScopeGlobal, Name: SlaveAllowBatching, Value: "0"}, } // SynonymsSysVariables is synonyms of system variables. diff --git a/sessionctx/variable/varsutil.go b/sessionctx/variable/varsutil.go index 5239a7f89dcc1..cce4606b9c49e 100644 --- a/sessionctx/variable/varsutil.go +++ b/sessionctx/variable/varsutil.go @@ -108,7 +108,7 @@ func GetSessionSystemVar(s *SessionVars, key string) (string, error) { // GetSessionOnlySysVars get the default value defined in code for session only variable. // The return bool value indicates whether it's a session only variable. func GetSessionOnlySysVars(s *SessionVars, key string) (string, bool, error) { - sysVar := SysVars[key] + sysVar := GetSysVar(key) if sysVar == nil { return "", false, ErrUnknownSystemVar.GenWithStackByArgs(key) } @@ -192,7 +192,7 @@ func GetGlobalSystemVar(s *SessionVars, key string) (string, error) { // GetScopeNoneSystemVar checks the validation of `key`, // and return the default value if its scope is `ScopeNone`. func GetScopeNoneSystemVar(key string) (string, bool, error) { - sysVar := SysVars[key] + sysVar := GetSysVar(key) if sysVar == nil { return "", false, ErrUnknownSystemVar.GenWithStackByArgs(key) } @@ -207,8 +207,7 @@ const epochShiftBits = 18 // SetSessionSystemVar sets system variable and updates SessionVars states. func SetSessionSystemVar(vars *SessionVars, name string, value types.Datum) error { - name = strings.ToLower(name) - sysVar := SysVars[name] + sysVar := GetSysVar(name) if sysVar == nil { return ErrUnknownSystemVar } @@ -230,8 +229,8 @@ func SetSessionSystemVar(vars *SessionVars, name string, value types.Datum) erro // ValidateGetSystemVar checks if system variable exists and validates its scope when get system variable. func ValidateGetSystemVar(name string, isGlobal bool) error { - sysVar, exists := SysVars[name] - if !exists { + sysVar := GetSysVar(name) + if sysVar == nil { return ErrUnknownSystemVar.GenWithStackByArgs(name) } switch sysVar.Scope { diff --git a/tidb-server/main.go b/tidb-server/main.go index e43834c1b3418..b73988b1c0bf3 100644 --- a/tidb-server/main.go +++ b/tidb-server/main.go @@ -552,18 +552,17 @@ func setGlobalVars() { priority := mysql.Str2Priority(cfg.Performance.ForcePriority) variable.ForcePriority = int32(priority) - variable.SysVars[variable.TiDBForcePriority].Value = mysql.Priority2Str[priority] - variable.SysVars[variable.TiDBOptDistinctAggPushDown].Value = variable.BoolToIntStr(cfg.Performance.DistinctAggPushDown) - - variable.SysVars[variable.TIDBMemQuotaQuery].Value = strconv.FormatInt(cfg.MemQuotaQuery, 10) - variable.SysVars["lower_case_table_names"].Value = strconv.Itoa(cfg.LowerCaseTableNames) - variable.SysVars[variable.LogBin].Value = variable.BoolToIntStr(config.GetGlobalConfig().Binlog.Enable) - - variable.SysVars[variable.Port].Value = fmt.Sprintf("%d", cfg.Port) - variable.SysVars[variable.Socket].Value = cfg.Socket - variable.SysVars[variable.DataDir].Value = cfg.Path - variable.SysVars[variable.TiDBSlowQueryFile].Value = cfg.Log.SlowQueryFile - variable.SysVars[variable.TiDBIsolationReadEngines].Value = strings.Join(cfg.IsolationRead.Engines, ", ") + + variable.SetSysVar(variable.TiDBForcePriority, mysql.Priority2Str[priority]) + variable.SetSysVar(variable.TiDBOptDistinctAggPushDown, variable.BoolToIntStr(cfg.Performance.DistinctAggPushDown)) + variable.SetSysVar(variable.TIDBMemQuotaQuery, strconv.FormatInt(cfg.MemQuotaQuery, 10)) + variable.SetSysVar("lower_case_table_names", strconv.Itoa(cfg.LowerCaseTableNames)) + variable.SetSysVar(variable.LogBin, variable.BoolToIntStr(config.GetGlobalConfig().Binlog.Enable)) + variable.SetSysVar(variable.Port, fmt.Sprintf("%d", cfg.Port)) + variable.SetSysVar(variable.Socket, cfg.Socket) + variable.SetSysVar(variable.DataDir, cfg.Path) + variable.SetSysVar(variable.TiDBSlowQueryFile, cfg.Log.SlowQueryFile) + variable.SetSysVar(variable.TiDBIsolationReadEngines, strings.Join(cfg.IsolationRead.Engines, ", ")) // For CI environment we default enable prepare-plan-cache. plannercore.SetPreparedPlanCache(config.CheckTableBeforeDrop || cfg.PreparedPlanCache.Enabled) diff --git a/tidb-server/main_test.go b/tidb-server/main_test.go index 6cca1689c438d..b36166c6ed0a4 100644 --- a/tidb-server/main_test.go +++ b/tidb-server/main_test.go @@ -40,14 +40,14 @@ var _ = Suite(&testMainSuite{}) type testMainSuite struct{} func (t *testMainSuite) TestSetGlobalVars(c *C) { - c.Assert(variable.SysVars[variable.TiDBIsolationReadEngines].Value, Equals, "tikv, tiflash, tidb") - c.Assert(variable.SysVars[variable.TIDBMemQuotaQuery].Value, Equals, "1073741824") + c.Assert(variable.GetSysVar(variable.TiDBIsolationReadEngines).Value, Equals, "tikv, tiflash, tidb") + c.Assert(variable.GetSysVar(variable.TIDBMemQuotaQuery).Value, Equals, "1073741824") config.UpdateGlobal(func(conf *config.Config) { conf.IsolationRead.Engines = []string{"tikv", "tidb"} conf.MemQuotaQuery = 9999999 }) setGlobalVars() - c.Assert(variable.SysVars[variable.TiDBIsolationReadEngines].Value, Equals, "tikv, tidb") - c.Assert(variable.SysVars[variable.TIDBMemQuotaQuery].Value, Equals, "9999999") + c.Assert(variable.GetSysVar(variable.TiDBIsolationReadEngines).Value, Equals, "tikv, tidb") + c.Assert(variable.GetSysVar(variable.TIDBMemQuotaQuery).Value, Equals, "9999999") } From f2d4e4724778dee01e42ba5d7362fa5a048d7e81 Mon Sep 17 00:00:00 2001 From: "Zhuomin(Charming) Liu" Date: Tue, 29 Sep 2020 14:39:23 +0800 Subject: [PATCH 53/60] distsql: add metrics for coprocessor cache (#19979) --- distsql/select_result.go | 7 +++ executor/inspection_summary.go | 1 + infoschema/metric_table_def.go | 6 +++ metrics/distsql.go | 8 +++ metrics/grafana/tidb.json | 95 ++++++++++++++++++++++++++++++++++ metrics/metrics.go | 1 + store/tikv/coprocessor.go | 10 +++- 7 files changed, 126 insertions(+), 2 deletions(-) diff --git a/distsql/select_result.go b/distsql/select_result.go index 42cc246f4c536..f9840aed95f4c 100644 --- a/distsql/select_result.go +++ b/distsql/select_result.go @@ -43,6 +43,9 @@ import ( var ( errQueryInterrupted = terror.ClassExecutor.NewStd(errno.ErrQueryInterrupted) + + coprCacheHistogramHit = metrics.DistSQLCoprCacheHistogram.WithLabelValues("hit") + coprCacheHistogramMiss = metrics.DistSQLCoprCacheHistogram.WithLabelValues("miss") ) var ( @@ -155,6 +158,10 @@ func (r *selectResult) fetchResp(ctx context.Context) error { break } } + if r.stats != nil { + coprCacheHistogramHit.Observe(float64(r.stats.CoprCacheHitNum)) + coprCacheHistogramMiss.Observe(float64(len(r.stats.copRespTime) - int(r.stats.CoprCacheHitNum))) + } return nil } diff --git a/executor/inspection_summary.go b/executor/inspection_summary.go index 8ff8b7a4c64d2..37aef042a62f9 100644 --- a/executor/inspection_summary.go +++ b/executor/inspection_summary.go @@ -140,6 +140,7 @@ var inspectionSummaryRules = map[string][]string{ "tidb_distsql_partial_scan_key_num", "tidb_distsql_qps", "tidb_distsql_scan_key_num", + "tidb_distsql_copr_cache", "tidb_region_cache_ops", "tidb_batch_client_pending_req_count", "tidb_batch_client_unavailable_duration", diff --git a/infoschema/metric_table_def.go b/infoschema/metric_table_def.go index 8e2be18d3d0a8..f74820d6f1055 100644 --- a/infoschema/metric_table_def.go +++ b/infoschema/metric_table_def.go @@ -2495,6 +2495,12 @@ var MetricTableMap = map[string]MetricTableDef{ Labels: []string{"instance", "type"}, Comment: "The total time of distsql execution(second)", }, + "tidb_distsql_copr_cache": { + Comment: "The quantile of TiDB distsql coprocessor cache", + PromQL: "histogram_quantile($QUANTILE, sum(rate(tidb_distsql_copr_cache_buckets{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (type,instance))", + Labels: []string{"instance", "type"}, + Quantile: 0.95, + }, "tidb_execute_total_count": { PromQL: "sum(increase(tidb_session_execute_duration_seconds_count{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (instance,sql_type)", Labels: []string{"instance", "sql_type"}, diff --git a/metrics/distsql.go b/metrics/distsql.go index 6074b63c3e82f..9eef1c62f0310 100644 --- a/metrics/distsql.go +++ b/metrics/distsql.go @@ -52,4 +52,12 @@ var ( Help: "number of partial results for each query.", }, ) + DistSQLCoprCacheHistogram = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: "tidb", + Subsystem: "distsql", + Name: "copr_cache", + Help: "coprocessor cache hit, evict and miss number", + Buckets: prometheus.ExponentialBuckets(1, 2, 16), + }, []string{LblType}) ) diff --git a/metrics/grafana/tidb.json b/metrics/grafana/tidb.json index abe270bfcf874..acd1539761e5f 100644 --- a/metrics/grafana/tidb.json +++ b/metrics/grafana/tidb.json @@ -6161,6 +6161,101 @@ "alignLevel": null } }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "TiDB coprocessor cache hit, evict and miss number", + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 163 + }, + "id": 175, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "histogram_quantile(1, sum(rate(tidb_distsql_copr_cache_buckets[1m])) by (type))", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{type}}", + "refId": "A", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Coprocessor Cache", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, { "aliasColors": {}, "bars": false, diff --git a/metrics/metrics.go b/metrics/metrics.go index ab6c6d84ed1d9..be843ad6f02f0 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -77,6 +77,7 @@ func RegisterMetrics() { prometheus.MustRegister(DDLWorkerHistogram) prometheus.MustRegister(DeploySyncerHistogram) prometheus.MustRegister(DistSQLPartialCountHistogram) + prometheus.MustRegister(DistSQLCoprCacheHistogram) prometheus.MustRegister(DistSQLQueryHistogram) prometheus.MustRegister(DistSQLScanKeysHistogram) prometheus.MustRegister(DistSQLScanKeysPartialHistogram) diff --git a/store/tikv/coprocessor.go b/store/tikv/coprocessor.go index c914d068fca2a..e730cdf43cc85 100644 --- a/store/tikv/coprocessor.go +++ b/store/tikv/coprocessor.go @@ -45,8 +45,11 @@ import ( "go.uber.org/zap" ) -var tikvTxnRegionsNumHistogramWithCoprocessor = metrics.TiKVTxnRegionsNumHistogram.WithLabelValues("coprocessor") -var tikvTxnRegionsNumHistogramWithBatchCoprocessor = metrics.TiKVTxnRegionsNumHistogram.WithLabelValues("batch_coprocessor") +var ( + tikvTxnRegionsNumHistogramWithCoprocessor = metrics.TiKVTxnRegionsNumHistogram.WithLabelValues("coprocessor") + tikvTxnRegionsNumHistogramWithBatchCoprocessor = metrics.TiKVTxnRegionsNumHistogram.WithLabelValues("batch_coprocessor") + coprCacheHistogramEvict = metrics.DistSQLCoprCacheHistogram.WithLabelValues("evict") +) // CopClient is coprocessor client. type CopClient struct { @@ -777,6 +780,9 @@ func (worker *copIteratorWorker) handleTask(ctx context.Context, task *copTask, remainTasks = remainTasks[1:] } } + if worker.store.coprCache != nil && worker.store.coprCache.cache.Metrics != nil { + coprCacheHistogramEvict.Observe(float64(worker.store.coprCache.cache.Metrics.KeysEvicted())) + } } // handleTaskOnce handles single copTask, successful results are send to channel. From c8221fab813b62c72e137a5d5cce24b4b982b1c2 Mon Sep 17 00:00:00 2001 From: Arenatlx Date: Tue, 29 Sep 2020 15:56:35 +0800 Subject: [PATCH 54/60] ddl: support column type change between decimal && SQL mode warnings (#20012) --- ddl/backfilling.go | 45 +++++++++++++++--- ddl/column.go | 70 +++++++++++++++++++++++++--- ddl/column_test.go | 4 +- ddl/db_test.go | 101 +++++++++++++++++++++++++++++++++++++++++ ddl/ddl.go | 12 +++++ ddl/ddl_api.go | 46 ++++++++++++++----- ddl/index.go | 5 +- ddl/reorg.go | 58 +++++++++++++++++++++++ executor/admin_test.go | 2 +- 9 files changed, 315 insertions(+), 28 deletions(-) diff --git a/ddl/backfilling.go b/ddl/backfilling.go index 7d0f3bf1d71bf..5a8e4ece3e564 100644 --- a/ddl/backfilling.go +++ b/ddl/backfilling.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/parser/model" + "github.com/pingcap/parser/terror" ddlutil "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" @@ -71,10 +72,12 @@ type backfillResult struct { // backfillTaskContext is the context of the batch adding indices or updating column values. // After finishing the batch adding indices or updating column values, result in backfillTaskContext will be merged into backfillResult. type backfillTaskContext struct { - nextHandle kv.Handle - done bool - addedCount int - scanCount int + nextHandle kv.Handle + done bool + addedCount int + scanCount int + warnings map[errors.ErrorID]*terror.Error + warningsCount map[errors.ErrorID]int64 } type backfillWorker struct { @@ -150,10 +153,26 @@ func mergeBackfillCtxToResult(taskCtx *backfillTaskContext, result *backfillResu result.scanCount += taskCtx.scanCount } +func mergeWarningsAndWarningsCount(partWarnings, totalWarnings map[errors.ErrorID]*terror.Error, partWarningsCount, totalWarningsCount map[errors.ErrorID]int64) (map[errors.ErrorID]*terror.Error, map[errors.ErrorID]int64) { + for _, warn := range partWarnings { + if _, ok := totalWarningsCount[warn.ID()]; ok { + totalWarningsCount[warn.ID()] += partWarningsCount[warn.ID()] + } else { + totalWarningsCount[warn.ID()] = partWarningsCount[warn.ID()] + totalWarnings[warn.ID()] = warn + } + } + return totalWarnings, totalWarningsCount +} + // handleBackfillTask backfills range [task.startHandle, task.endHandle) handle's index to table. func (w *backfillWorker) handleBackfillTask(d *ddlCtx, task *reorgBackfillTask, bf backfiller) *backfillResult { handleRange := *task - result := &backfillResult{addedCount: 0, nextHandle: handleRange.startHandle, err: nil} + result := &backfillResult{ + err: nil, + addedCount: 0, + nextHandle: handleRange.startHandle, + } lastLogCount := 0 lastLogTime := time.Now() startTime := lastLogTime @@ -177,7 +196,17 @@ func (w *backfillWorker) handleBackfillTask(d *ddlCtx, task *reorgBackfillTask, bf.AddMetricInfo(float64(taskCtx.addedCount)) mergeBackfillCtxToResult(&taskCtx, result) + + // Although `handleRange` is for data in one region, but back fill worker still split it into many + // small reorg batch size slices and reorg them in many different kv txn. + // If a task failed, it may contained some committed small kv txn which has already finished the + // small range reorganization. + // In the next round of reorganization, the target handle range may overlap with last committed + // small ranges. This will cause the `redo` action in reorganization. + // So for added count and warnings collection, it is recommended to collect the statistics in every + // successfully committed small ranges rather than fetching it in the total result. w.ddlWorker.reorgCtx.increaseRowCount(int64(taskCtx.addedCount)) + w.ddlWorker.reorgCtx.mergeWarnings(taskCtx.warnings, taskCtx.warningsCount) if num := result.scanCount - lastLogCount; num >= 30000 { lastLogCount = result.scanCount @@ -386,6 +415,8 @@ var ( TestCheckWorkerNumCh = make(chan struct{}) // TestCheckWorkerNumber use for test adjust backfill worker. TestCheckWorkerNumber = int32(16) + // TestCheckReorgTimeout is used to mock timeout when reorg data. + TestCheckReorgTimeout = int32(0) ) func loadDDLReorgVars(w *worker) error { @@ -482,12 +513,12 @@ func (w *worker) writePhysicalTableRecord(t table.PhysicalTable, bfWorkerType ba sessCtx.GetSessionVars().StmtCtx.IsDDLJobInQueue = true if bfWorkerType == typeAddIndexWorker { - idxWorker := newAddIndexWorker(sessCtx, w, i, t, indexInfo, decodeColMap) + idxWorker := newAddIndexWorker(sessCtx, w, i, t, indexInfo, decodeColMap, reorgInfo.ReorgMeta.SQLMode) idxWorker.priority = job.Priority backfillWorkers = append(backfillWorkers, idxWorker.backfillWorker) go idxWorker.backfillWorker.run(reorgInfo.d, idxWorker) } else { - updateWorker := newUpdateColumnWorker(sessCtx, w, i, t, oldColInfo, colInfo, decodeColMap) + updateWorker := newUpdateColumnWorker(sessCtx, w, i, t, oldColInfo, colInfo, decodeColMap, reorgInfo.ReorgMeta.SQLMode) updateWorker.priority = job.Priority backfillWorkers = append(backfillWorkers, updateWorker.backfillWorker) go updateWorker.backfillWorker.run(reorgInfo.d, updateWorker) diff --git a/ddl/column.go b/ddl/column.go index e7e123952c486..07ece53470b23 100644 --- a/ddl/column.go +++ b/ddl/column.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" ddlutil "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" @@ -645,6 +646,11 @@ func onSetDefaultValue(t *meta.Meta, job *model.Job) (ver int64, _ error) { func needChangeColumnData(oldCol, newCol *model.ColumnInfo) bool { toUnsigned := mysql.HasUnsignedFlag(newCol.Flag) originUnsigned := mysql.HasUnsignedFlag(oldCol.Flag) + if oldCol.Tp == newCol.Tp && oldCol.Tp == mysql.TypeNewDecimal { + // Since type decimal will encode the precision, frac, negative(signed) and wordBuf into storage together, there is no short + // cut to eliminate data reorg change for column type change between decimal. + return oldCol.Flen != newCol.Flen || oldCol.Decimal != newCol.Decimal || toUnsigned != originUnsigned + } if newCol.Flen > 0 && newCol.Flen < oldCol.Flen || toUnsigned != originUnsigned { return true } @@ -1036,9 +1042,12 @@ type updateColumnWorker struct { rowDecoder *decoder.RowDecoder rowMap map[int64]types.Datum + + // For SQL Mode and warnings. + sqlMode mysql.SQLMode } -func newUpdateColumnWorker(sessCtx sessionctx.Context, worker *worker, id int, t table.PhysicalTable, oldCol, newCol *model.ColumnInfo, decodeColMap map[int64]decoder.Column) *updateColumnWorker { +func newUpdateColumnWorker(sessCtx sessionctx.Context, worker *worker, id int, t table.PhysicalTable, oldCol, newCol *model.ColumnInfo, decodeColMap map[int64]decoder.Column, sqlMode mysql.SQLMode) *updateColumnWorker { rowDecoder := decoder.NewRowDecoder(t, t.WritableCols(), decodeColMap) return &updateColumnWorker{ backfillWorker: newBackfillWorker(sessCtx, worker, id, t), @@ -1047,6 +1056,7 @@ func newUpdateColumnWorker(sessCtx sessionctx.Context, worker *worker, id int, t metricCounter: metrics.BackfillTotalCounter.WithLabelValues("update_col_speed"), rowDecoder: rowDecoder, rowMap: make(map[int64]types.Datum, len(decodeColMap)), + sqlMode: sqlMode, } } @@ -1055,8 +1065,9 @@ func (w *updateColumnWorker) AddMetricInfo(cnt float64) { } type rowRecord struct { - key []byte // It's used to lock a record. Record it to reduce the encoding time. - vals []byte // It's the record. + key []byte // It's used to lock a record. Record it to reduce the encoding time. + vals []byte // It's the record. + warning *terror.Error // It's used to record the cast warning of a record. } // getNextHandle gets next handle of entry that we are going to process. @@ -1133,11 +1144,25 @@ func (w *updateColumnWorker) getRowRecord(handle kv.Handle, recordKey []byte, ra return nil } + var recordWarning *terror.Error newColVal, err := table.CastValue(w.sessCtx, w.rowMap[w.oldColInfo.ID], w.newColInfo, false, false) - // TODO: Consider sql_mode and the error msg(encounter this error check whether to rollback). if err != nil { - return errors.Trace(err) + if IsNormalWarning(err) || (!w.sqlMode.HasStrictMode() && IsStrictWarning(err)) { + // Keep the warnings. + recordWarning = errors.Cause(err).(*terror.Error) + } else { + return errors.Trace(err) + } } + + failpoint.Inject("MockReorgTimeoutInOneRegion", func(val failpoint.Value) { + if val.(bool) { + if handle.IntValue() == 3000 && atomic.CompareAndSwapInt32(&TestCheckReorgTimeout, 0, 1) { + failpoint.Return(errors.Trace(errWaitReorgTimeout)) + } + } + }) + w.rowMap[w.newColInfo.ID] = newColVal newColumnIDs := make([]int64, 0, len(w.rowMap)) newRow := make([]types.Datum, 0, len(w.rowMap)) @@ -1151,11 +1176,31 @@ func (w *updateColumnWorker) getRowRecord(handle kv.Handle, recordKey []byte, ra return errors.Trace(err) } - w.rowRecords = append(w.rowRecords, &rowRecord{key: recordKey, vals: newRowVal}) + w.rowRecords = append(w.rowRecords, &rowRecord{key: recordKey, vals: newRowVal, warning: recordWarning}) w.cleanRowMap() return nil } +// IsNormalWarning is used to check the normal warnings, for example data-truncated warnings. +// This kind of warning will be always thrown out regard less of what kind of the sql mode is. +func IsNormalWarning(err error) bool { + // TODO: there are more errors here can be identified as normal warnings. + if types.ErrTruncatedWrongVal.Equal(err) { + return true + } + return false +} + +// IsStrictWarning is used to check whether the error can be transferred as a warning under a +// non-strict SQL Mode. +func IsStrictWarning(err error) bool { + // TODO: there are more errors here can be identified as warnings under non-strict SQL mode. + if types.ErrOverflow.Equal(err) { + return true + } + return false +} + func (w *updateColumnWorker) cleanRowMap() { for id := range w.rowMap { delete(w.rowMap, id) @@ -1177,6 +1222,8 @@ func (w *updateColumnWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (t taskCtx.nextHandle = nextHandle taskCtx.done = taskDone + warningsMap := make(map[errors.ErrorID]*terror.Error, len(rowRecords)) + warningsCountMap := make(map[errors.ErrorID]int64, len(rowRecords)) for _, rowRecord := range rowRecords { taskCtx.scanCount++ @@ -1185,8 +1232,19 @@ func (w *updateColumnWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (t return errors.Trace(err) } taskCtx.addedCount++ + if rowRecord.warning != nil { + if _, ok := warningsCountMap[rowRecord.warning.ID()]; ok { + warningsCountMap[rowRecord.warning.ID()]++ + } else { + warningsCountMap[rowRecord.warning.ID()] = 1 + warningsMap[rowRecord.warning.ID()] = rowRecord.warning + } + } } + // Collect the warnings. + taskCtx.warnings, taskCtx.warningsCount = warningsMap, warningsCountMap + return nil }) logSlowOperations(time.Since(oprStartTime), "BackfillDataInTxn", 3000) diff --git a/ddl/column_test.go b/ddl/column_test.go index bfd8f04990727..9c7679a12741b 100644 --- a/ddl/column_test.go +++ b/ddl/column_test.go @@ -1159,8 +1159,8 @@ func (s *testColumnSuite) TestModifyColumn(c *C) { {"varchar(10)", "varchar(8)", errUnsupportedModifyColumn.GenWithStackByArgs("length 8 is less than origin 10")}, {"varchar(10)", "varchar(11)", nil}, {"varchar(10) character set utf8 collate utf8_bin", "varchar(10) character set utf8", nil}, - {"decimal(2,1)", "decimal(3,2)", errUnsupportedModifyColumn.GenWithStackByArgs("can't change decimal column precision")}, - {"decimal(2,1)", "decimal(2,2)", errUnsupportedModifyColumn.GenWithStackByArgs("can't change decimal column precision")}, + {"decimal(2,1)", "decimal(3,2)", errUnsupportedModifyColumn.GenWithStackByArgs("decimal change from decimal(2, 1) to decimal(3, 2), and tidb_enable_change_column_type is false")}, + {"decimal(2,1)", "decimal(2,2)", errUnsupportedModifyColumn.GenWithStackByArgs("decimal change from decimal(2, 1) to decimal(2, 2), and tidb_enable_change_column_type is false")}, {"decimal(2,1)", "decimal(2,1)", nil}, {"decimal(2,1)", "int", errUnsupportedModifyColumn.GenWithStackByArgs("type int(11) not match origin decimal(2,1)")}, {"decimal", "int", errUnsupportedModifyColumn.GenWithStackByArgs("type int(11) not match origin decimal(11,0)")}, diff --git a/ddl/db_test.go b/ddl/db_test.go index aa2dcc26192a0..1e1848b44fcba 100644 --- a/ddl/db_test.go +++ b/ddl/db_test.go @@ -79,6 +79,7 @@ var _ = Suite(&testDBSuite7{&testDBSuite{}}) var _ = SerialSuites(&testSerialDBSuite{&testDBSuite{}}) const defaultBatchSize = 1024 +const defaultReorgBatchSize = 256 type testDBSuite struct { cluster cluster.Cluster @@ -5767,3 +5768,103 @@ func (s *testSerialDBSuite) TestColumnTypeChangeGenUniqueChangingName(c *C) { tk.MustExec("drop table if exists t") } + +func (s *testSerialDBSuite) TestModifyColumnTypeWithWarnings(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + // Enable column change variable. + tk.Se.GetSessionVars().EnableChangeColumnType = true + + // Test normal warnings. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a decimal(5,2))") + tk.MustExec("insert into t values(111.22),(111.22),(111.22),(111.22),(333.4)") + // 111.22 will be truncated the fraction .22 as .2 with truncated warning for each row. + tk.MustExec("alter table t modify column a decimal(4,1)") + // there should 4 rows of warnings corresponding to the origin rows. + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect DECIMAL value: '111.22'", + "Warning 1292 Truncated incorrect DECIMAL value: '111.22'", + "Warning 1292 Truncated incorrect DECIMAL value: '111.22'", + "Warning 1292 Truncated incorrect DECIMAL value: '111.22'")) + + // Test the strict warnings is treated as errors under the strict mode. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a decimal(5,2))") + tk.MustExec("insert into t values(111.22),(111.22),(111.22),(33.4)") + // Since modify column a from decimal(5,2) to decimal(3,1), the first three rows with 111.22 will overflows the target types. + _, err := tk.Exec("alter table t modify column a decimal(3,1)") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]DECIMAL value is out of range in '(3, 1)'") + + // Test the strict warnings is treated as warnings under the non-strict mode. + tk.MustExec("set @@sql_mode=\"\"") + tk.MustExec("alter table t modify column a decimal(3,1)") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1690 DECIMAL value is out of range in '(3, 1)'", + "Warning 1690 DECIMAL value is out of range in '(3, 1)'", + "Warning 1690 DECIMAL value is out of range in '(3, 1)'")) +} + +// TestModifyColumnTypeWhenInterception is to test modifying column type with warnings intercepted by +// reorg timeout, not owner error and so on. +func (s *testSerialDBSuite) TestModifyColumnTypeWhenInterception(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + // Enable column change variable. + tk.Se.GetSessionVars().EnableChangeColumnType = true + + // Test normal warnings. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int primary key, b decimal(4,2))") + + count := defaultBatchSize * 4 + // Add some rows. + dml := fmt.Sprintf("insert into t values") + for i := 1; i <= count; i++ { + dml += fmt.Sprintf("(%d, %f)", i, 11.22) + if i != count { + dml += "," + } + } + tk.MustExec(dml) + // Make the regions scale like: [1, 1024), [1024, 2048), [2048, 3072), [3072, 4096] + tk.MustQuery("split table t between(0) and (4096) regions 4") + + d := s.dom.DDL() + hook := &ddl.TestDDLCallback{} + var checkMiddleWarningCount bool + var checkMiddleAddedCount bool + // Since the `DefTiDBDDLReorgWorkerCount` is 4, every worker will be assigned with one region + // for the first time. Here we mock the insert failure/reorg timeout in region [2048, 3072) + // which will lead next handle be set to 2048 and partial warnings be stored into ddl job. + // Since the existence of reorg batch size, only the last reorg batch [2816, 3072) of kv + // range [2048, 3072) fail to commit, the rest of them all committed successfully. So the + // addedCount and warnings count in the job are all equal to `4096 - reorg batch size`. + // In the next round of this ddl job, the last reorg batch will be finished. + var middleWarningsCount = int64(defaultBatchSize*4 - defaultReorgBatchSize) + hook.OnJobUpdatedExported = func(job *model.Job) { + if job.SchemaState == model.StateWriteReorganization || job.SnapshotVer != 0 { + if len(job.ReorgMeta.WarningsCount) == len(job.ReorgMeta.Warnings) { + for _, v := range job.ReorgMeta.WarningsCount { + if v == middleWarningsCount { + checkMiddleWarningCount = true + } + } + } + if job.RowCount == middleWarningsCount { + checkMiddleAddedCount = true + } + } + } + originHook := d.GetHook() + d.(ddl.DDLForTest).SetHook(hook) + defer d.(ddl.DDLForTest).SetHook(originHook) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/ddl/MockReorgTimeoutInOneRegion", `return(true)`), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/ddl/MockReorgTimeoutInOneRegion"), IsNil) + }() + tk.MustExec("alter table t modify column b decimal(3,1)") + c.Assert(checkMiddleWarningCount, Equals, true) + c.Assert(checkMiddleAddedCount, Equals, true) + res := tk.MustQuery("show warnings") + c.Assert(len(res.Rows()), Equals, count) +} diff --git a/ddl/ddl.go b/ddl/ddl.go index 3510c463f99ec..a764d51e0b755 100644 --- a/ddl/ddl.go +++ b/ddl/ddl.go @@ -523,6 +523,18 @@ func (d *ddl) doDDLJob(ctx sessionctx.Context, job *model.Job) error { // If a job is a history job, the state must be JobStateSynced or JobStateRollbackDone or JobStateCancelled. if historyJob.IsSynced() { + // Judge whether there are some warnings when executing DDL under the certain SQL mode. + if historyJob.ReorgMeta != nil && len(historyJob.ReorgMeta.Warnings) != 0 { + if len(historyJob.ReorgMeta.Warnings) != len(historyJob.ReorgMeta.WarningsCount) { + logutil.BgLogger().Info("[ddl] DDL warnings doesn't match the warnings count", zap.Int64("jobID", jobID)) + } else { + for key, warning := range historyJob.ReorgMeta.Warnings { + for j := int64(0); j < historyJob.ReorgMeta.WarningsCount[key]; j++ { + ctx.GetSessionVars().StmtCtx.AppendWarning(warning) + } + } + } + } logutil.BgLogger().Info("[ddl] DDL job is finished", zap.Int64("jobID", jobID)) return nil } diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index cf26fcd44dae4..af6a4ebe6875d 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -36,6 +36,7 @@ import ( "github.com/pingcap/parser/format" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" field_types "github.com/pingcap/parser/types" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl/placement" @@ -3308,9 +3309,12 @@ func CheckModifyTypeCompatible(origin *types.FieldType, to *types.FieldType) (al if origin.Tp != to.Tp { return "", errUnsupportedModifyColumn.GenWithStackByArgs(unsupportedMsg) } - // The root cause is modifying decimal precision needs to rewrite binary representation of that decimal. - if to.Flen != origin.Flen || to.Decimal != origin.Decimal { - return "", errUnsupportedModifyColumn.GenWithStackByArgs("can't change decimal column precision") + // Floating-point and fixed-point types also can be UNSIGNED. As with integer types, this attribute prevents + // negative values from being stored in the column. Unlike the integer types, the upper range of column values + // remains the same. + if to.Flen != origin.Flen || to.Decimal != origin.Decimal || mysql.HasUnsignedFlag(to.Flag) != mysql.HasUnsignedFlag(origin.Flag) { + msg := fmt.Sprintf("decimal change from decimal(%d, %d) to decimal(%d, %d)", origin.Flen, origin.Decimal, to.Flen, to.Decimal) + return msg, errUnsupportedModifyColumn.GenWithStackByArgs(msg) } default: if origin.Tp != to.Tp { @@ -3342,9 +3346,9 @@ func CheckModifyTypeCompatible(origin *types.FieldType, to *types.FieldType) (al return "", nil } -// checkModifyTypes checks if the 'origin' type can be modified to 'to' type with out the need to +// checkModifyTypes checks if the 'origin' type can be modified to 'to' type without the need to // change or check existing data in the table. -// It returns error if the two types has incompatible Charset and Collation, different sign, different +// It returns error if the two types has incompatible charset and collation, different sign, different // digital/string types, or length of new Flen and Decimal is less than origin. func checkModifyTypes(ctx sessionctx.Context, origin *types.FieldType, to *types.FieldType, needRewriteCollationData bool) error { changeColumnValueMsg, err := CheckModifyTypeCompatible(origin, to) @@ -3645,7 +3649,12 @@ func (d *ddl) getModifiableColumnJob(ctx sessionctx.Context, ident ast.Ident, or SchemaName: schema.Name.L, Type: model.ActionModifyColumn, BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{&newCol, originalColName, spec.Position, modifyColumnTp, newAutoRandBits}, + ReorgMeta: &model.DDLReorgMeta{ + SQLMode: ctx.GetSessionVars().SQLMode, + Warnings: make(map[errors.ErrorID]*terror.Error), + WarningsCount: make(map[errors.ErrorID]int64), + }, + Args: []interface{}{&newCol, originalColName, spec.Position, modifyColumnTp, newAutoRandBits}, } return job, nil } @@ -3818,7 +3827,12 @@ func (d *ddl) RenameColumn(ctx sessionctx.Context, ident ast.Ident, spec *ast.Al SchemaName: schema.Name.L, Type: model.ActionModifyColumn, BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{&newCol, oldColName, spec.Position, 0}, + ReorgMeta: &model.DDLReorgMeta{ + SQLMode: ctx.GetSessionVars().SQLMode, + Warnings: make(map[errors.ErrorID]*terror.Error), + WarningsCount: make(map[errors.ErrorID]int64), + }, + Args: []interface{}{&newCol, oldColName, spec.Position, 0}, } err = d.doDDLJob(ctx, job) err = d.callHookOnChanged(err) @@ -4456,8 +4470,13 @@ func (d *ddl) CreatePrimaryKey(ctx sessionctx.Context, ti ast.Ident, indexName m SchemaName: schema.Name.L, Type: model.ActionAddPrimaryKey, BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{unique, indexName, indexPartSpecifications, indexOption, sqlMode, nil, global}, - Priority: ctx.GetSessionVars().DDLReorgPriority, + ReorgMeta: &model.DDLReorgMeta{ + SQLMode: ctx.GetSessionVars().SQLMode, + Warnings: make(map[errors.ErrorID]*terror.Error), + WarningsCount: make(map[errors.ErrorID]int64), + }, + Args: []interface{}{unique, indexName, indexPartSpecifications, indexOption, sqlMode, nil, global}, + Priority: ctx.GetSessionVars().DDLReorgPriority, } err = d.doDDLJob(ctx, job) @@ -4620,8 +4639,13 @@ func (d *ddl) CreateIndex(ctx sessionctx.Context, ti ast.Ident, keyType ast.Inde SchemaName: schema.Name.L, Type: model.ActionAddIndex, BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{unique, indexName, indexPartSpecifications, indexOption, hiddenCols, global}, - Priority: ctx.GetSessionVars().DDLReorgPriority, + ReorgMeta: &model.DDLReorgMeta{ + SQLMode: ctx.GetSessionVars().SQLMode, + Warnings: make(map[errors.ErrorID]*terror.Error), + WarningsCount: make(map[errors.ErrorID]int64), + }, + Args: []interface{}{unique, indexName, indexPartSpecifications, indexOption, hiddenCols, global}, + Priority: ctx.GetSessionVars().DDLReorgPriority, } err = d.doDDLJob(ctx, job) diff --git a/ddl/index.go b/ddl/index.go index 4c8133968fd3f..c94f90e53c679 100644 --- a/ddl/index.go +++ b/ddl/index.go @@ -816,9 +816,11 @@ type addIndexWorker struct { idxKeyBufs [][]byte batchCheckKeys []kv.Key distinctCheckFlags []bool + + sqlMode mysql.SQLMode } -func newAddIndexWorker(sessCtx sessionctx.Context, worker *worker, id int, t table.PhysicalTable, indexInfo *model.IndexInfo, decodeColMap map[int64]decoder.Column) *addIndexWorker { +func newAddIndexWorker(sessCtx sessionctx.Context, worker *worker, id int, t table.PhysicalTable, indexInfo *model.IndexInfo, decodeColMap map[int64]decoder.Column, sqlMode mysql.SQLMode) *addIndexWorker { index := tables.NewIndex(t.GetPhysicalID(), t.Meta(), indexInfo) rowDecoder := decoder.NewRowDecoder(t, t.WritableCols(), decodeColMap) return &addIndexWorker{ @@ -828,6 +830,7 @@ func newAddIndexWorker(sessCtx sessionctx.Context, worker *worker, id int, t tab rowDecoder: rowDecoder, defaultVals: make([]types.Datum, len(t.WritableCols())), rowMap: make(map[int64]types.Datum, len(decodeColMap)), + sqlMode: sqlMode, } } diff --git a/ddl/reorg.go b/ddl/reorg.go index c65035f98a665..12ed72604ff16 100644 --- a/ddl/reorg.go +++ b/ddl/reorg.go @@ -17,6 +17,7 @@ import ( "context" "fmt" "strconv" + "sync" "sync/atomic" "time" @@ -61,6 +62,14 @@ type reorgCtx struct { notifyCancelReorgJob int32 // doneHandle is used to simulate the handle that has been processed. doneHandle atomic.Value // nullableHandle + + // warnings is used to store the warnings when doing the reorg job under + // a certain SQL Mode. + mu struct { + sync.Mutex + warnings map[errors.ErrorID]*terror.Error + warningsCount map[errors.ErrorID]int64 + } } // nullableHandle can store handle. @@ -111,6 +120,22 @@ func (rc *reorgCtx) setNextHandle(doneHandle kv.Handle) { rc.doneHandle.Store(nullableHandle{handle: doneHandle}) } +func (rc *reorgCtx) mergeWarnings(warnings map[errors.ErrorID]*terror.Error, warningsCount map[errors.ErrorID]int64) { + if len(warnings) == 0 || len(warningsCount) == 0 { + return + } + rc.mu.Lock() + defer rc.mu.Unlock() + rc.mu.warnings, rc.mu.warningsCount = mergeWarningsAndWarningsCount(warnings, rc.mu.warnings, warningsCount, rc.mu.warningsCount) +} + +func (rc *reorgCtx) resetWarnings() { + rc.mu.Lock() + defer rc.mu.Unlock() + rc.mu.warnings = make(map[errors.ErrorID]*terror.Error) + rc.mu.warningsCount = make(map[errors.ErrorID]int64) +} + func (rc *reorgCtx) increaseRowCount(count int64) { atomic.AddInt64(&rc.rowCount, count) } @@ -124,11 +149,21 @@ func (rc *reorgCtx) getRowCountAndHandle() (int64, kv.Handle) { func (rc *reorgCtx) clean() { rc.setRowCount(0) rc.setNextHandle(nil) + rc.resetWarnings() rc.doneCh = nil } func (w *worker) runReorgJob(t *meta.Meta, reorgInfo *reorgInfo, tblInfo *model.TableInfo, lease time.Duration, f func() error) error { job := reorgInfo.Job + // This is for tests compatible, because most of the early tests try to build the reorg job manually + // without reorg meta info, which will cause nil pointer in here. + if job.ReorgMeta == nil { + job.ReorgMeta = &model.DDLReorgMeta{ + SQLMode: mysql.ModeNone, + Warnings: make(map[errors.ErrorID]*terror.Error), + WarningsCount: make(map[errors.ErrorID]int64), + } + } if w.reorgCtx.doneCh == nil { // start a reorganization job w.wg.Add(1) @@ -136,6 +171,8 @@ func (w *worker) runReorgJob(t *meta.Meta, reorgInfo *reorgInfo, tblInfo *model. // initial reorgCtx w.reorgCtx.setRowCount(job.GetRowCount()) w.reorgCtx.setNextHandle(reorgInfo.StartHandle) + w.reorgCtx.mu.warnings = make(map[errors.ErrorID]*terror.Error) + w.reorgCtx.mu.warningsCount = make(map[errors.ErrorID]int64) go func() { defer w.wg.Done() w.reorgCtx.doneCh <- f() @@ -159,6 +196,13 @@ func (w *worker) runReorgJob(t *meta.Meta, reorgInfo *reorgInfo, tblInfo *model. logutil.BgLogger().Info("[ddl] run reorg job done", zap.Int64("handled rows", rowCount)) // Update a job's RowCount. job.SetRowCount(rowCount) + + // Update a job's warnings. + w.mergeWarningsIntoJob(job) + + if err == nil { + metrics.AddIndexProgress.Set(100) + } w.reorgCtx.clean() if err != nil { return errors.Trace(err) @@ -173,6 +217,7 @@ func (w *worker) runReorgJob(t *meta.Meta, reorgInfo *reorgInfo, tblInfo *model. logutil.BgLogger().Info("[ddl] run reorg job quit") w.reorgCtx.setNextHandle(nil) w.reorgCtx.setRowCount(0) + w.reorgCtx.resetWarnings() // We return errWaitReorgTimeout here too, so that outer loop will break. return errWaitReorgTimeout case <-time.After(waitTimeout): @@ -180,6 +225,11 @@ func (w *worker) runReorgJob(t *meta.Meta, reorgInfo *reorgInfo, tblInfo *model. // Update a job's RowCount. job.SetRowCount(rowCount) updateAddIndexProgress(w, tblInfo, rowCount) + + // Update a job's warnings. + w.mergeWarningsIntoJob(job) + + w.reorgCtx.resetWarnings() // Update a reorgInfo's handle. err := t.UpdateDDLReorgStartHandle(job, reorgInfo.currElement, doneHandle) logutil.BgLogger().Info("[ddl] run reorg job wait timeout", zap.Duration("waitTime", waitTimeout), @@ -191,6 +241,14 @@ func (w *worker) runReorgJob(t *meta.Meta, reorgInfo *reorgInfo, tblInfo *model. return nil } +func (w *worker) mergeWarningsIntoJob(job *model.Job) { + w.reorgCtx.mu.Lock() + partWarnings := w.reorgCtx.mu.warnings + partWarningsCount := w.reorgCtx.mu.warningsCount + job.SetWarnings(mergeWarningsAndWarningsCount(partWarnings, job.ReorgMeta.Warnings, partWarningsCount, job.ReorgMeta.WarningsCount)) + w.reorgCtx.mu.Unlock() +} + func updateAddIndexProgress(w *worker, tblInfo *model.TableInfo, addedRowCount int64) { if tblInfo == nil || addedRowCount == 0 { return diff --git a/executor/admin_test.go b/executor/admin_test.go index c4d6bc7f00451..01a4556f46000 100644 --- a/executor/admin_test.go +++ b/executor/admin_test.go @@ -1021,7 +1021,7 @@ func (s *testSuite8) TestAdminCheckTable(c *C) { tk.MustExec(`insert into t1 set a='1.9'`) err = tk.ExecToErr(`alter table t1 modify column a decimal(3,2);`) c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: can't change decimal column precision") + c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: decimal change from decimal(2, 1) to decimal(3, 2), and tidb_enable_change_column_type is false") tk.MustExec(`delete from t1;`) tk.MustExec(`admin check table t1;`) } From 1d34c333f4e86f5993cace8ef5a640622bd9fe7b Mon Sep 17 00:00:00 2001 From: Shenghui Wu <793703860@qq.com> Date: Tue, 29 Sep 2020 16:11:32 +0800 Subject: [PATCH 55/60] expression: avoid constant propagate for the hybrid types (#20258) --- expression/constant_propagation.go | 7 ++++++- expression/integration_test.go | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/expression/constant_propagation.go b/expression/constant_propagation.go index 264bb0dd5494a..f236ad722b3d0 100644 --- a/expression/constant_propagation.go +++ b/expression/constant_propagation.go @@ -228,7 +228,8 @@ func (s *propConstSolver) propagateColumnEQ() { if fun, ok := s.conditions[i].(*ScalarFunction); ok && fun.FuncName.L == ast.EQ { lCol, lOk := fun.GetArgs()[0].(*Column) rCol, rOk := fun.GetArgs()[1].(*Column) - if lOk && rOk && lCol.GetType().Collate == rCol.GetType().Collate { + // TODO: Enable hybrid types in ConstantPropagate. + if lOk && rOk && lCol.GetType().Collate == rCol.GetType().Collate && !lCol.GetType().Hybrid() && !rCol.GetType().Hybrid() { lID := s.getColID(lCol) rID := s.getColID(rCol) s.unionSet.Union(lID, rID) @@ -301,6 +302,10 @@ func (s *propConstSolver) pickNewEQConds(visited []bool) (retMapper map[int]*Con } continue } + // TODO: Enable hybrid types in ConstantPropagate. + if col.GetType().Hybrid() { + continue + } visited[i] = true updated, foreverFalse := s.tryToUpdateEQList(col, con) if foreverFalse { diff --git a/expression/integration_test.go b/expression/integration_test.go index 2dc2d9c0817a4..bb97eb95a1f46 100755 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -7410,3 +7410,22 @@ func (s *testIntegrationSuite) TestIssue11645(c *C) { tk.MustQuery(`SELECT DATE_ADD('0001-01-02 00:00:00', INTERVAL -25 HOUR);`).Check(testkit.Rows("0000-00-00 23:00:00")) tk.MustQuery(`SELECT DATE_ADD('0001-01-02 00:00:00', INTERVAL -8785 HOUR);`).Check(testkit.Rows("0000-00-00 23:00:00")) } + +func (s *testIntegrationSuite) TestIssue20180(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t(a enum('a', 'b'), b tinyint);") + tk.MustExec("create table t1(c varchar(20));") + tk.MustExec("insert into t values('b', 0);") + tk.MustExec("insert into t1 values('b');") + tk.MustQuery("select * from t, t1 where t.a= t1.c;").Check(testkit.Rows("b 0 b")) + tk.MustQuery("select * from t, t1 where t.b= t1.c;").Check(testkit.Rows("b 0 b")) + tk.MustQuery("select * from t, t1 where t.a = t1.c and t.b= t1.c;").Check(testkit.Rows("b 0 b")) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a enum('a','b'));") + tk.MustExec("insert into t values('b');") + tk.MustQuery("select * from t where a > 1 and a = \"b\";").Check(testkit.Rows("b")) +} From 891f84b9e9d90b18d04b883bb7e608393b0e4b71 Mon Sep 17 00:00:00 2001 From: tiancaiamao Date: Tue, 29 Sep 2020 16:21:16 +0800 Subject: [PATCH 56/60] *: remove an unused file (#20294) --- profile | Bin 22772 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 profile diff --git a/profile b/profile deleted file mode 100644 index 101b4f78def78b59f0758138bde4f712d7d5ba08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22772 zcmV)jK%u`MiwFP!00004|E&FYd>zHrI1axvyL%ZV8PBfUk!hC=1Y1cY5DAckBw+dz z2m}b}ajvCnSs>{u(iO&}$-Uch@4ffldoQ^6-h1!8yq_~$X7)<x}Z}IDVr15qKobY|b>eJoF|u)A%VWnrZw|cr=`3S7tg4 zxxAp3tuvj!Dn98v8Ir>(c4cP3fD7W2!Cw@g3|FZJ;rN7P4Ve5IJr@Ls_bH}GJhN%598>SVg5lEJqsu&mgP0;=7=cHrxMXQ=TE>B;U{g*OqhO9d^7oZ=bOo&f~Ukc3+8NXitQ}E*FluUpN6Ny zVVkomF!_Y|R)x1?qR%S)8F(ffwkxx$(C2)Yu&uMI?tWI~HrV0s*ql{^?bls&l~PXZ z8mv03Z!c&@Ajx3Wcz*|v)%dgUtUy2wShQatpc2pF!~#w@(rHpb#w^oa+2JcrN^1o3m87GEaP~!P_|BYVhab`EV_pvzl|3C;_Vr3|5cyzVJowzVPLD~i0o8E zP8wsWJPp#q-?KRj!`>@`{%Z1B&Vp<5@5A>6PM?8RyIh=p!--XeQ(n4j>7z+WPluoJ z&{>(;(EoT>?EG>5q`<-B{0H!ZaJpTYeFu)65ucvmKM|jv;2Dq+PPaLG7N*@3<37nR zJL5jdUw{|HxX-~FZ`^-#Vpa7BHrf8pv(I@0bM{?Wepl(jvb;Ti^t%ew^Dwh@ciio# zcvnXPJjGvx7sHu$WmXINTy2L_f11B9=Jzyz30?~S(B`Z*%$z8;Hq3iD^9%DI!H>c( z+nlAr;6)v=%V+qZ$3(kl_$%;A_*J_G`yLFwF231(L}lAx-{Ds+0b=tX!;izSrZM&% z{uB5~_*I*;@59>CGVJJCezb~!dY1nbek#8G0M4`(-=5>Gs)=vU@z>xr@hu%rweOAX zzRTx3jPPClGx%Bf=a%W=ialSecG~y8{{zHz2AmkO5W%14?H%yv`7huX;n!`>UVzzq z1QILp7DPw~;xNvm881jwzX(&>i2-W~VoqbM7JmcY2>;yXEE7r(h>6zb6CDDm&Fes& z@T*p`+ZTJ0W!jv*1a~iW!D*!N2@Xor_?z%%_&atr_Cr`a_s(;+&c4V0ZtLv(JSvv_ zJ^mKF6@EL7vG4PD;GOWhHfKMAK_ixwlfjQV)5zezgkOd~usQoF>|cKDJGQ}I;GGElNPvwJ& zK)~y8?503KI{!H*Ry9w6r2PCBugkSpW^cgt-E)yke(0*5AM(%Ov+&zCXLVrc^_e(> zAMv%$&_Ck8f!~Bbw>f(gy3V@%oNcg|`3eU?FZ18RZ^OT{E3>y?@j`c{^*FJf@?>K* zTxpe;-l+5DTk29ddmAPU5VL=U4|Xv63jaO)UWl-F;9?)~?Nxrn8R%912lzwydv;~^ zE-Y>5O1@%FtQwvOd+hCZ-hKTQxk}F7gF^!Zll+(;b(ZpD{zv$uV3PM?bZ7DHC%l96 z?I-+C@F(%@f8g8R;@eO8Oy}EA`Jds>;@dA_`SjaJs;}|p&bQb2U*Ip{x^`vu0nDFp z8|m?9JWtTU&-h>Aui?7Z(;hOab5s;n-+TXme)+-6%3Le64`J1evA82Y=P!u1Kj#sM zgzMRy{R#&35vt@De6fR!U+^r*5_0t;802mE&p5Fj_vp)V2Kw+0Z(ijm9F^nBipoF#_}2k+)?lB&kye5>Q8fzMY=KQ`dK+MhF+T}X+NaR} zqRL%xKZdKT`ujgf(fmi~f4?iT;5)pjGsSm!9^?uA`zP3U zN#OHc{&%smcX>YKi%)-sv!2#|QAj`6auw3=kAM1eK-2yOZrv3#b(FPLL!Hi#KmCiM zZtKFb+hRKJ@lDR6-s1&OAawp;q2*rDO(ova(KW6?@o3$@$^}KB({2~46+)TbU@YPR zRcH0!$P~d@@AGdpTW7EFe~AUY&tnh^zivI@t*45hv&ZWt&_fmsyx9%0_CI`;GtK|u zg-{sIw5zjhSlX!#a@Q~UGq%A#;AuVki#BZO)>wd2ui7=RpdWdFO z+0ptr4RXJ*p5Tm^p6L8t7eVD1=1XXHLm=o=KHEXir~L2mcVRZ=!MH6g5J8{u$^z@3 z@qfTS!bLV``EY8DSo3dqTj$$v_&?#FV$B6Gd8zpJIiKg4O`r3B!N0_}7@Tb{zJ0)_ zKFWzQ<1h2_3u4jSFRbbw9aM5;x2v43>fTmY5_-#fZ*x`%+lP(A4friziEDV2{g(e5 z{v9qw_5U|$(`_6s;&;MqO=iF2jR`a+__aDKg5E=JqO0|Lj(YqL{3v2Onf;zOAB8$5H>tn-OS6gnIi5M&5Q+cpYIWyW%Ff`%Nof#xLKg4mpW4Fis}Mm+tQU(+~AOJ;xOEeW(F;a2#$5lq}AKL3TEb+GUk-kLyb z_wzTh&3&wu^9l>9yS3)^Ik3EV#?x{2~FT81&R)1FnouZp1MM|kO+ ziO*msjY$*ogLE5MQv#)%#9;OL0BRd7hxbhuebwh(33MglC)1Ky4(~>wo4};Wnh|KS zTr_FGZ==viW(|0E0^Qy3%?Y%bCcf9@tr#b^$yyNDKgGp<*UDl^t|CclN}7@8qy@?S zhi$T!1U4)cO&jnF4*$8fCu`|J0c%Cz&PD+hn6qVhmgA$XM5lkx{fAY>AIN#<4%C{! z(OWJlu0iMCWNirCo$AhU1kTaom3Zl@dp}Ehv^Dv<(Kl^K?msNfQ+esp-VKu;!TBI1 zn5->`?*%!Pgfu8OTbtJH< zOnm>6chLoXe#v_g=;eMdBd}?fKt&#(jgw7gdAv7)-tPBK1a`F*?eqC8=X*ZyL!giQ zy)%K~r-fRn!pAypN*4l?CkjjAP5ui`tY^G^ftI8L=}5{*ZYR>2RP91Mqs2B^R|5Au zfwA4u!LE70y5g4LYJqhlFxAwNrj(fvBq(9Qb-x+rs7`}14?@6GA=Q>}l%88ZYu9@{D z40*2?fk7Jt8e@DrI!-x!8uDH;i}8L0`k`P`=G4n0YTIPJ3ADT?^kN}z=7^s{-k(5! z6hAds9|DuNv_!4)H(tdyScFe-yRamqFH)do@#lDH;~5i)!?vO;ll3ET@3e~U zDjwF7`U!LkIAHw=40Pm6F<-2S{oL*BXE7g4U@-0{_eOlAzq19l$p#P@>h(We3&aox zi2jjWOg50fsuS)s+6Tb~Dqw>MvNUqcAA^(10@#)*Qk zAvi0`@)XRY4kmD>z=jg&;K=4U?_~(tJQ(RCiN*O40z*hRuE>d@K6wBeMqshmvbSuh z5YsRp+GN8Cv{)zhIEP?Pg%MR-o}|~ z2_H&eC=r(7C<6Nr3L#L57YIASjYTGpB%_FDRhw)yfySHN35`k)OlY(>AtemxNOqTc z#t=B-P{CLHB1(f?-T_5a68nk|BQVTCnyY;t9i!~hSOPm8q~-7-IBFH2CB}+T-4VtS znC!9bF3Glvsu?H2O*WpuovQ*Tf8ui-A?A+G#(P4{WD^K%xF#67As>mhQ4(v&hZ7i% z4E;2lNMQSzPKemAd0*s-M*Jdj<2QWkvqD>c%|{RzLBc;wOJx{lG)$+7y@I^%CSv0nLuaH#JYmkV>NGwQznp!WD=Q7zWICZ z7uI9EIxpRKxj~YVl^qqf$P@xA`-mO;2fyKHlz;HC1jf1=VJd;uo=sDR93Z`^DP*dr zm8TIn?xAWLqDqERry;7u2AFI*fd$SM=km_TbyCSs7yBvTIGaJBqi2QX3InJzFCDVv z-6S@H2rKFzivAQT)wK?05@;Kc_|kEi>8cMU$KueCJLW6`{SGK3Zh0jB=q!c6XA`(L zSJ<-uwp8d?JB~_}QxL(N}0TnM3AcfAa_|9WNAeDdE{de3ueFiNGWhe%ZFzd;$kLmWAyQ zYfN}I4D%-A(_{jZk#a1yfWVM00-y=u0~~-Rgij$bg@j*K#PK{bpDZBhw#60_n0l)e z`)o@1VkGGle40vNDhW@+SuG+k<*>-GG$Z^oF{@^TPbV;)glpI)TTGzzw)mdR?;<&X zM~;;jl0{@Ok$DJ{Eg{h4lJM8x=3^0962%hY$0#>0&Q=g8y&&Qruk&9D zvF8eac_S^>Raf=o8x}TTP(M3s$tlmR0>BR*}_y zTh6{EFvIiI-Uv+PTcUbuYY2?-!o#16z)w|P+H6AIq{r5fK=jvSYY9yE!uqWoQ+geN zU0(EW3CfWg-gF*YOV*Jwx0ZX1KCK>#dY0s8`vfSYn%zTB>YR;V9)c`4$rkDd=`OOB>cK?IaLNGT9CS z+ja^bufp$yL|oM+GiwJa2hZ6~0>du%Mj7%a{v0PZuw4Y&_7`FF)`b7cHdq_N|0M9= zn(#RU=8*8`X({-2E`hluJdfBG+fCr`w3)b)wnQX$(^BwhK7siz#2x~h2hKu>c7)${ z*4mEn1q2q5@aMM0_7eE^q5x=5_*h3TwI_TbfrSphJ_09q&Bh)&5Z=OZXgUzSh`=HQ zFxh?r7q5w#|A?X_E#5q9J_y=bP z3ACQ&LjFlWy4bCBFaTMT9U{=UV+)*ZN5Z#IJH*NeU+);r9Z?j*V#lj4BYX*gC5{Jp zn84n{?)HsFuQ`<+A#ibypaBtG46#mxcX1?9C&HH!SW3cmZO)DoII6_(6;e4w4wJ`^ zkfTJ6LR;(@fqT3A;S4(y-UNG0!KY;emXYvs+|}a*E}Rj&+J*4e2$76WD+sJWj9csk zfulDCKv%+dIRIS=UrAsk0&sScK>v0!!K6&;7&%T(kdr|_juwNvCYIYSat z7#2HAp!GSijvj<}cKYl=_!3|1 zwR;l25N)+8d=l<{3cgrNU@Zx+Q-#)fQZ6iKvI_*3FA(ai4xf)Uj+E#Z$mhO~%-KZ( zgO`aYXmydLPW5yozerMR29otAyF{SV4OgS03{-l(6ws!Z32bU9gkd#48iipMZ_!DY ziJ#Hu>TZ+WA~0Aj5Ks_tONF~lp!?W3>mh8D-6JsF%ka&{5vqGLu5_2&Q?$Ir?h`ocv(hpYCKfBDFsA21L|$(q z45YMVeA+-@gTp+HDNLItq>Za_WQgXz!#t(5PGg#&b(&B(eZUo4$8jW+HKlNVhMRF+ zjuaqwwF!N^DGj7lP1cOUtw6|HIvveuz*J~XVME7-sIh*+OE|Hf@K9W(Ijv}JEhwz% zFZAv!ybbb@B*hl=9ZVET9o>?`VsG`r_Nw89njUKzTr+2_C`?jCo9wm~4H!ojYfYhj zK)hg}k-`QqTfGi9QVNvTv<)qX;idFG8<58K1Tg z*h0cTR}9>?vreP_W*aP(_aVY^=uh}o0$WM=6D4s{ zM%A2mD(ggH#auyp0|KA+tlBnFmwWNzmbtdadq4^*;ebW}VOWJx}X+krT>xs#c82dQzC|8Hu;iNR&=XPpZ^vnXDIu76Io=Dxh9erjJe5o5F*1EY_Dovn?Hwo(2)#j0-{x?Ui#LB|nG-~vv{is8&{i#}lXR!ekTC5iYKbY_<7-USwr=0|L zIuWaZ6nZNqYYGhypaZEaKjUl=g|#PLP55#E3xlYV#IDH(Q@HIomO}_{hUQ^&;uOpz zV_)o$!wr$R9?B(-CwewM{mP!sVmx7B)dBDHump z#3rLDY`*TY2^Nx6Q%}2`85T7ru6#0Q`no|H0<$Re-R~0Ne6&d=5zeCJ zd?}O7rqFo5Ffurwi|i=jXH(Ov@(Gp}`TeJ|ITV)c5ei}i;Ts(HV6NjHj39g;fqm#6 z*wxuw3TKxD2n>b0R6cX)OLJ*Zy3eDqdWkSX32%x9kCfT-sH_A}W%DU)Lc=?RF3BQi z66m8Sv^JlXH^3KAxZg>5wq=ChL)w%Pxdrqvsaj1+ag!~i(AX3A3C_ksMckWg5ry^N zifHFZf>f85f)D!%>?h#^#5UPt3eC#gvW&xz3TtNxg&iBkR7Meg-?0@&p;rh8iKw7n zN}=sa*Dv~ls|m+NbTN(Q)?Y%GQgo1>^4uB42pB{YT#scGj&%{kl@Y!glYmmoE)y$P zRpN3A2TJ>3w0<<<&fbnD{1AadBz&0IHQ5RZOMD&BT+so_9G24+LBYS0!uSWc7%QnC zxir}-3hO*!g{cIk&sB7is*Fswn!3HVH@J)JCZ*k4ni#J!**XfdX1cz`3N#_4;kGX5SfsM`6uRvb zoHmf~MUE+U3A52A+d!d1pc^^rdis+M!JaI(k-}8pitiU>@{P0tlYJ9~acV`r!nT`e z&;wG8pb1iISyjATe^SX;zVzU1GljAyLO%bIrv%Gli&x|QZM$lXS_(;ajt-9=xQlGI|mDV$#C8E+R+ESPK$g*AhPG=7D5 zK?x}30KA6xK`=i73jeiz;q6SzFb| zYSlwhCs^z-g~Oda5!W0=oaC*;DB^rUX>)dj!XVYKkf29`qLZ_u6b7l9UV0oysiH49 zJ4T_YmkIbv*is(Sj?q6S$m8P_+W3=A&_u^^vP#b;J3*oO1A;gwq~xs0PEt7Li{+N8 zSgz)omMJF{p=^O~?r})1saBwx>=cCwcLfLjiH~v$mrql;>lrd%h!aI;D2&`EcFCzH zuEaYc3&>i+Q}i@F<4IWSN$%E}h*JD2<%20_DID?qyHXUV(i%Bi-h?*UISTiNy8Kd# z{318ma>HQ5CUy;iu^%0NT7xgOc)?&b1Y70p}7%@S=k~VwWk*Iw>5U352(F^z#J5PZBsu z!ly70a)m;(4FX~!;m0u}k%CXB37mEzu2Q&qR6tB3{9K5mfSpA683Jcqh-(xko$7&- zaWdg&sDPME_*nvHN%$O&a-Bkxrb2*CA$+LQ#}stI;JgcQgTm-RJ+Y6egb#5brV@UE zzy%lLCWUFc+9Jd>!nZl2Oe6dvfr})32}ij_q19C(!lx5H&Jp3$3BOF>GKz4M-KJ1> z$dy)mP+EP@!>@grUZGd%HF}-q-k>+>EqXiADpc$sWC5inT+ylAw0<0{P+{05?2CL+xHl^ip*XN7JJ<1VP_l|`1jguR-Uj89hxTp{64u)OL*i60}rf4JO@I{6=ZiH`e@B+7@e~!KqbkkQ8PTegG?*lkw>)fvY4O z$H1%xtvU#m{{f$d0$%on)y++`rkYdD(M*Gd=S4BfEW%$G{{Ae&uMxQB1O%FEaP-nZ z9BDS;%PR@eo=y050@q3S1{%06G?;mRI6}<90G=IUa|v%p1>_vUZxXmk!ncrV<`RCJ zz-M0D+T1#|++Gw!G_iW;vShmMnscp1?7ozwN7Hg})#S=HM_Fy65{T=6K zA>mCZG@+u(yPXDi9JNu2<9Q;P=aS03t=3NSEc2SIy#_OU)fVtLq&{x1DS;-=I%sgr zOA!BD#MnA&FgB39kl}$2+C9?I9}ifW2IHLQlbdw^DW8t1Z;J#NJuoO*r=}DDo zoiw#N-DI6Lxa#>bc&y1v^)`xk*6tAj?s2Qhx@d6GgPwtURGRf&JZJ^Hs|F)I@UG6} zx@oY~n;f27QpW45-6P#_dUCw(8tn5rnB;WOLxWykWLXs8OZn1WyGMFp2TBh;HMr{3 zCOBszG4QIvCNCc{3-KdWa!;)nws$9>Ag-q-sw(_1GI`Nc6Qv7Y6DeqXgm|AMu6)e; z-(<6K)Ln$vtcoWKlaf{EzqbY*I^M+d_0_mY14_8wnx~5unV($UduemlM}srUfnCK# z>Z3jDd%70ut3mhsEm2x5B76n%NeVtSrO=dO)xXL5Y0!O&s7tHMkE1;#3rG8E{WPqz zOlAEwI5$>k$i;-u!m_$0guf}o-eSU=QD{a*UELDGn^R~`!!KjCsRmcNxWaUw<17u- zU|LflfR_^91nr7sd}=|V1r5h-iw)A?)Pi0(-(`f)#QaJMKDDIKlHwT$iw)Lb-M-cc zv7GQ34#aZ8TTy7`LJZMhT3-RNg7DqWnpY6snnG(DZbNO04b|Ytf>zkaO2WIL!cW1c zwiMb5tXOQA2E8T-h*gBQ!HK5eQ#%UnT!`TsjGf&J`&do*0mlGZO?Z0>?Oliw8k{}j znK$dO?#E&yHJI05^!qJw?j%UTrw$Z4xUEKMux^IvcMS$agg#h9ct;8yU5L>dYzpkD zmFCIJXNJ-K+5l~!Hb@(+4bg^b!?fYr2yLV`N*gUU6Hi5q(O`vFyC+#0~S2o4%TtNvU7&}l-j<@wnEu{}LPD>1OD-4bJ!ZQ(4(hQe% zxE7nL!TlwI^wtr+I7zVgI>I|q=;Z9RYtu2LvZ-3`7j`O}rop`n9Wan5j?stMdcubx zHzeazX9}HZ_*L6t(=})_NA$e`E2RWkZy>x2g)TJQ6`68|2G`CBg4>8?UIJnx;oT^7 zb0KDGu)yhK6Z#?oViV!rDRg%sW@*r2X?JAG&4kZ(yn)Sx_n^>&hI`^Dvo+X1Pe5!T zd>>9U1)q9R=;cDp(O^i+GVEh3;Y+FtENmsbH-+A~6qC)>VD%k0wKfZn4M~&b`C7Hp zrfJi)8QM&3mNr|Pqs`UYQLOef**pyRvjrMVy6PIbuLZ&}^R)$vscW)@8XU#=HS*vz+*_mxTQ68MSc5Ir;CA_gor)@6tf_?%iiY~9I9uhQg|j6Z48qF>be1Nn zbEGa`q6Loj*JMjIxZ6SO%yz=NRds4{J3D#&?S%KE(2s^+RgMlU)e!ZZEz{tL=N>;B zh?^|a0;v?mV3W>u~Z1MtjcrS(myFv>%LMB_OLDS31%?(x!m&TGFTN%Wr$yRAF!ONnx zM5k7oFsrn39@}aSE_U@|U)xaFCgN;MS~5Nj zqA&;nI9sp5eYIjhI>c+Vwc0vuy`~)cOl2E1xQ1+QRC4Vjya&36 zz5I%S@>bTL8&O{X==pLVp}x0 za8U$c#t@EyH!RlG;Hnq96(<#Bzgx7eTF_D3romZ14A~3mMnZ2Bvye8i#kOlOvcEUy z=0WJ~3DBJF&|sg(*5BcHFNPZ(OWC0*i<3V5QTltO&V8o_eY^rUQMM>Ah1#k4Hnhoh zY0$$vDZd>Bw~WK=(v)(7-5MO~B+dlxC;UsHo%RzxoWgJ#9zikmuEFkGZa`-%b|meh z-P#`6mBsdIaBbF1)In_>Bha?kJ`Ju7nuYJ$5q`rlC--YG%rCt}Q&%ZT+pF!#0jwUj+$&P6- ze!xQHxF7R<*t49-F)gv`)nvytn5f<)Vm;w;dX?i^MWu8nG}zch^#2oHhW*RhyAu^Q zIH|!TKmYVmApd$&+e*FUtI$s#j!kw-gKpjw!RMPU?mYSzzaaAA=kz(a%|M|G8gPopV}b|KDc zFlxLY$HRm#Mn5bWpTdz^^2APZT05hi)y`>Ha$YXy zd0vCj=e?#qv8i0;d2EtM(k8p0!8I%zKteqbw0AD}lG#I}#V%^l**{%y24e_P`(4x$ zP7YY?k_K&BHb&mt>xe;xE-wWHud?lU0f;c2l!{)9UDn`~FA&`%lB+`=yNn{vkJnq0 z*PJn=q%_$T4SEH%w+u9035Z~mUDaT-cYO(#<|y*(s^-hXn(UeeOCJ;fb7z=xEf@g1 zuEE{oZsEv_LIS&ahm`A@QqpCz8yej4Wn+E-@`ft+wkz8bx-WPF-TVX_0zOow3$1;9xnY5~%c@o5T$DG0z>a~-;?wMkM^Hqo2v z&GhCv)+f2ls(4o@7DcifZ(2$SY_`y0foCO)w6;_nEp*jNwrX(qK9$F&&;(Pvr4EN4 zfT@-Vm{KM!vN|sXQyiSN(&40X8JB|eR(isvSte_(!^}bM7PZGMlC0m_9oR*O{UmFn zLz6jo@V>57gx9up_C5ZMe-m3WzMM*7DtZ-?hTG_hURMObC2295tgQ~myaP64kf~(- zd|O>L>o{wt!=_^{LkrSSNQ|z(!x^IGFG+l@D-p!B& zfg{ZwbT3TLSw|guA*1Tf6^Tl39rdtx*`f7}Hy>4(1`}+ltW1Z|7^ezh`O6Yn{-Ur_ znJ(j17@61MLclzcwq+-MwGv+HtV5ZX+8%=WD~Za^`f2Ltt8I&Q(V$o!RiN1x>#M`&YaUAQ`Vd8$^sN9Tob}UT&kc81u#i`J4*k?!u~>f{29|jq zl<@kbbnTDykx*MDF?&TTS7&ds0XmFZCc>nIx6=ca1p{ah2i@V|pq{R$Qa z24slI2I+A3ntRmhDhfTxOoJ4`V6wqF%u-K5D}4^u)ichV4bfr3W%tPDOI($@Lv$?X z4VYp>b-1!lIJbidzk~r;xn)CjwRqiR!*rOs*JYx!NRm=Q57UE!#bm>E7{6O!trEw> z>6W~`Vz@8LYO)bJv@H`^@Y95EK_7n{5j7@h$@pd(g=whRCA*H$6H2@|8>z#1m0cwc zM=D&H%0}rhqC#2sxF;#CQF>zN7%!U8;kXl5|EV}rWt(h_4ijdGvna1QflN8U(fSx& zjr!Rp8>>UNfCDHIH&ze0e@Z_C^&lhL78|ESx3g++RMGI`^aX14hO_ZHjPvZ$$GK`= zjn}>4lc!Ltvk5wMn;R%$hz6YE399n6Ih&|Md#^|dPpeB$a-v?CU{Iy9Nje;?kTWD> zPSVk$`DFle7MrZYp+lY+Jcs&NGV5f$oDT$SiVlmNRH>U$e%`4nmZs1YT?C@sr7Pra zCn)WyI&AX%ehhmlYn+PY9ssY&rs;6>v^aN|5Uo;%n5N%QJeX8AU56cQL{0MuFmV&QmP?+IH_-E))*0MF~hI53UMz=EspJq~+=|arZq4hkG zX*iGB0}+Qgk6BBYg%FCTkTqSOq0iKFzffrMJf5lyxGuAFDDw({MH!Biy}Pwpx*q`I zY_<-UJ*q=*NN(3`eM91r35(6qVei&XxReWokF70Meu41W6lPoD=W@Z)EGoG4; zIr?0Eo<3hcmv}#a+596 zVdFI~p8I?tCcj8`qOmTO+MF%cp>4&s^x_0tTA63ha%T~gokQX14`8t+It=cq9{p74 zeTiNtAwXfWr8-=}q=mtp8ou6R>c= zxgASM(tN99je*J5=&;1QDN0;UCBv+1bT50VaBo-QUO8u*Y^@I0F{6r^R7_GUY1*}V zbAp%FD0gW&7r}{KsvN_)*$Q9UoUPO0vKLv#gpt&$>-69IArq6W*P*L7=bmWV%Kp~- zbGDyh8+7QmPUJQ(6Mn0b9b#8dHi-+XZaRt9%Y@IPFpq}gY03C?K85)-{G`(31|9DK z6f-p0Mjd84c&*EaqHd_{?Nn%^?!s)+;pS}-N_m!#uEN#8&nDeD?$;5c5u0@w;YT7r z3`8O~>s!4@WTKI?MThl)l3^(qm(wk}7eEhW`Ees`i*40m!jyJM+gAx6=!od6csB+t zpy7oWLfNLnsLeu%Un6{%Bl@lpzKFsi7h<~(S0{=-t`l)EBP|7=7E@R(AWXJHhjAN4 zsI-JnO%~-@J9Sv*U2TJx*(*G?Ro|xPZr69{JN>EKz;@|yz`022D}Eu6*?0Zjq+Md4 z#llRsTZb85t-@h6C}p|8Zb^qOOSxo?O_el1mKC_KTsV>D$5%FIdvv%nx-}l~{ujps z-j!S+wnukz$a{6@GP5nB_6Ffo9K_uqdNOU9>_6jnNQJO_0+w^Z!k zI>I-iY_ZrO9c~X4jqVV>(4qP}gs-Bo%4u|1hfV8+K)Or#HJp1gKCPy(nufn?o9u`V zXXgu(;h+2*25p~mm!DK^uf9*;uOHA4>bZyX!}<~3z1Qie4yRQ6Rbl0$ipO4q9n)b4 zV%A{yh&U?zFJ35YhkJy7OW|7@K7cm@I(x#733Qw6xDHpAh&bfue9B{j#!l#PW3D?% zytzu@3k*#j*H1WetHDm{(9F5P=6&UEWJQ;pOf;rX>2SA;@Io^9K}3Kwy-(>seeGvT zkjJ*zX&nys6ZkA6{1B3(bZ$?hFPMu>hohyUX!}0a90{A`KH+O9tf67Nv+Ar4 zTds&B@}*Q56lux$w3fnJ1W0A)bXZc+l`IOYozc(g=k(wKb(5XfVbnGut)hHT@Ram< zT{%o|vI{!gaO~XYc?ZOTbSW0TF;ZjnKfjM~7nvMGT@D;U5dH&lT*I?&ymHpm%kcYzLCy(KU$0#|Y)WFhfA6k)v zla*8YCTncK{<|V};a(vxO`67rr_^neH8Eg`cdf}m+)O!C6C=@9XllStFCc=y)}xGm zL2qhQaxUS=t4<8)?Zr)pp+O}hGR+J%ZpvA60|t7b9<{nsafsyNdyhF9^-z-pOTs*F(gUos7;#Kle6|E=Ho~%~@9imV2ip zF+?ht+0_VybxhXHfNg=Bs-!IFW_VIm=>UUkN`%#9-3{2}W#tztpb{?j{$p!yT5TX5v>ae*~d_Rm&js$ z4VW@U#Qa-Pe&12Cttj6{VH*u^NA=jxfRoESA<-xhwd`y3D<>xU8_>0@=&&^v_bQ~N z;L{EYJKPQj7%(azb)+2WZwzod^hi;WpIfx8T0)+{w%9-eMvhmr+6r9{G@O*R-u!9ZXgRQ}a7;qo+>3ZN-AQZ|RViYU# zPeFt%4)NzMjb!wGorJTzbY0ouv-ENK+i;u>HQ=suvGJdEL4485@%z!}$Zagb~ zMli-PLEzH&qr-e{XtUu4Y;mlJHk9|!?GP4>Z&r?0r6uE+ofLM`a9mMZ!-cY!21!je z!hoZGaYsw+!o5>RLDF(M!U&vi8fn0IFVOu#z#<)KsMoTNGT>I{UZ~#o6Z|y?1xKR{ zB}8hn(FSY_+)OI<`)IL6UeM2EV+^=`P1G&@Nc?1#LT+P>auK<)26PA{C8SszYXk!8 zoQ*SJR>ilIjWZHlsPP80IOK(3MfCS6Z>Oq_7aAu)z$)bmNIh;9SAt%a6xLchT>j=! zi%l@#f^(LxjPUI!IAxOwM)@Yn)~|9^jE6{zO*CLnFu^QMhKY$%Kr-$UE#b$#6qGuL z|CKQ&8PIZ`P)Kd5IJ1U#oKn7v!Y;R7Y_b9C{ED(;C@N*y{3K(t;T3}gRHx0^6ayyW z4?^jzj!@q+6gS2A{I~AUH`ykeYQTE0%s||1C;_J$k`qie&44}X<+%#6PBWzTQcMeF zBZH^rryJ1J(~pC3N%CODbg3WZZG8iEMPOKLh5@a2h_aq`ly{>d+R%>j-4u4y@E(lB z%rxM_Desu02;WO9yO}Y=m}$rpj3%39z$UMt^$^DTrMjM_n(ng==&k+|m9nw3jld5| znQV>$Gj4T7)_%{aS(SaxF_hfLTmz;L6u;8*TmF0DrnmyF@?7I@;um#1f&@0tfW>_} zp&I@huVRPrrmRw|-!-{=cAxbo^NbNxTzNI$fYx4VjBp(!@y>U9_PSPxcZ+w&u=mY2 z*#ZOld0~T=xLXpJ3yeV6K>4zX)(c1vi!C&uyPqo3HQ;hfagRzW7P%>cda0q_O=z)Y28{QMkoVxcj*>p)7bGYYjS^O|G%dEmfNeLuTi3-^HIfci7-(Ed zX;G7{G@yf1PvNQHGUC)#$W|+bwyo|N#5QNE3^;bqy^jHXQ)v~hG890Qtu|n^_Y=A| z5p|L_Rx47=V&59D!1Edd#^EghI;(^~A*YkL@9uPOQ`12GsZ3T*L?AZ1PK45dgam9016 zyr1x1hf zQ*|NYx&*w~+<;-8sUh4-X((?pHYXSx3h6ni%>;fo*%kwOju0Wow?v`7vW8RiG~HtS z&WU#@!*Kio$zaqZm2EX(J!UIHxK%9!Tjk!Nm$X%G6=&NFXno6-Gp`GC%?%YLZ~oKw?l9oGfBY0P42nwFZtO7nX(IiU%61xX zqpb)TcBFhvviO0%4$cYEj+F1Guph(zCfjAe#dRWJUPdvgk(PoFc?(?JRc1%%1=7_fbV$TH^e>B+)H-fO^sg<>Hq3GebKS5L|AGzN+jvb&7k z#vWs@F)ZPf>^~GM53dVwt+>a1YhNkoaenv&PgRNhmED9}ZDCM8n^+O?D79ln4&ij+GCm!naLno9m;v8*7a5ul_(jCO3_2e+ju=OcV+w+T z9B8uR2FwfO^SHMIj~q9ei(QvitcvMiN5D=P(BJ8(m@mZBWDWRk#ER_igwvmGvXcf3 zUnYpT9MDM@2-qnDCOSXG6ZqvLg&Iy7m@XF7AV5XJ7d6PZ+2&bOE}}s&SYl|SnXw}ucG_%n1?sxtbyZO?3@AXMv3Z|?vzh> zR>Zx!Q+}MnaVp|o=MC7=w<9W^9+YGDDlHkGPEa`E09-Jj-x!f&>`D2=WFe}0Qht)c zNg8giDk%JEo^!@|EJVj)B7Ra%;qhz60}j$$H{j$^(WpJ)_w+!V_qwsK z+|NCj?1lk11KCSS7B`GJWG+#xPQM<%g3ITsvzrE7E`K|xROdGX>fB_v3~1V09H4S4 z4HZFo%Sfp9ziq&*rp?eRdC4gql|uEl5x7p&Vs{MKu+FRU6cj6c+&jh|`s;U9bJk>c z4QT8oHZ~(;NJH~kC05&qI)wZXfXO!|^pEOYpn;<9PND52!9DLBf<0KdDh_V1z!ai%&pU^v>WP7E zlXVF}YtQ<}^GpikbqNL8LfMQ1)Mxfo)-?ouka)#Ol4Xj^Bc0o>ppEI=L-M zvA)!;-t0^HISS|8Ql0K0m~=uYpeB@G!L`)(xHjA^)ID?~kTG{;lRqny^$5XQFZ&`= zv~o5*LXQXI8o+vnptn;g<5mwl_faWAu4hP`!1YJqtXBx;R$P7FE9Ao|tl_D&_7r~? zL6L|9^>V+zWU<~M*xTK!$`tqXN{Z?os*|uaQeNOe1L?z?tWOA9`QGNw$ zn^N%UJcaY_nZN-d=j&Y{Bj`HHZYW0vx;;n6r8j% z)E__rHYf!BE81x~SlhaHuLt<-`?7fm)Q1WmkaN6U$bHeASG_CWhd?UlKP3Cnkez6GMB5xM3n8X=AcUA(%5*#1Y&}rsZx<3W*vJABz^7 z9D*^^)E_NVCN()!{wK*yHYEgi&x?#d@OJ2f%I>Fxf_lwjQ$uhmP&8s&Y+4BR1xt8j zM0{#!TByPzp6Maj;a|Ogg=KP2r-#a&iLls=5cHcVJb<=%AuU&{31>V2brzc$f+IVH zQQe=4_+(lNK3$-2K^WB*n-zks`vt@RDgtn6Dfo1e!bJgLve_XRG)x2_HGUfRO!CLf z(5%qxkZy$VQcuk9grJwF?y%%mVTCzT-6KV>pC-}-gVbb8La?-jpyF!03sSN4gqBEi$Ye`H(DMPLwlqL$7F!mA z-Vch#E<-gVqp_SV55bE4ZjA;WX_8k=Eca9drjtU@$4|_xM081IvLfVXUX(ptPl5-` zR)%1mV~YLMxsz3Puu|G!w#in7V1w_*H3+zIs}wg*VM?^ZJ!IP!TOEQ6bA`z|kn+V? z#G8yymndAK;h)Q5J zBgK*Y!n|m4rjZpZDTrrkS%oE;$pw*uSaCEfR*+qs`D{*Zyg^C5^sHEZMoug*Qjn8T zTo5TNY?K}?$ckl0>*U3G+8HIqMHzXqtVmu)PE2f`3zhMefXXS??oDj>as^AyY7ou( zGQCz>aY=4G`bi0*wsv~`SkafbzV!Mf1z9g<)~k3y6>x_~2clPpJ6`xf<_noGypZ`~ z<_j;s`07iq{NP8?7c*aY@x|<{S6<9?0CB$mtGVH7+_~}Mcu{UaPH}opwBXaiyxe%^ zv*oel!gzmiyh`r7bf?jq6`-afMsmp6+4rK_>Geu-^RjXO1vS6+-*u8Ls3`Nr|FE?) zI1ZZmOi@WeJU1V?EWfxgQcyd+C|W-^FYk@Kyja$ok*o&Mim>4}%E+&m8_$mvA~v3K z-=){`Ix2{M9e<}N8hyVYJNk8IP33zQ_FLNr$ox)ue7n#Y`4OB54#3@4>CUU1tV~nB z`7&CZmzx!>kglBtW(WZ6=tut{mK>xamfkO@AIp5w?Fbi`6)lJtMe=H=iCD%o*UKjBc$$J=ziW?Qz&5jf`%q_tASza&2(fmlm z$d}QQ!p!eJ7{9R!+ZM#)(f@bbyja$kb#WLR_c4Fmc%&$vpZUy#$1E(02}Y^pHNl|@ zC1#7F#nE_iVQxV|Zb6P@r{b&z(d?4Es2r*=QuJlreA!RFP#F&)@JMmKZ@Hw_YZQ+b zr`JlWQ&PV^3b@}E<;J6R8pWd(&0PRz)Dxh%+!Sx_IkB8rW@Yccx}P>Gjz{w)`R5eH z8VZKae9ECAXT;pRY=6j4g;cLddbuq!gy@ZmabJB9okhPER!?rMApPyH3-cnm1#kOr zKFBSOXFk9Xdzd*S`@~1=6PNzZgQkGW+%s3wYo&eMpiyydRwVD^q8RdjZmgiTH#H%r z{tNp|9YLMa&;P?IVfzZ~Gr50Rv4XEYd-;bC6VJKzBUwVkJ~d)r# z@pq%bwy&N3Mpjm|xcDPSGk^TQM}XRSMj>`xHzyjei?0zCuRmxX5a5B6as`)=4poZd zMaYfm@1U;{e%iB}|;U9gP$@tDv<4`h)9H_;ITXf*vQmL1JZ_4ZB(Ys7av=8$A& zb^OmEOh-|;h<{pHW6<4p46^^Lr|tCO>#GM3=UB-P67UtcE`ixPuFH$=aJYH@sdbJM z^n7gv7oKDEANUlx1-XJA(WOAstRP-2RcBG8p}PZBz0L7o#q$djwydb6KyFzzXUl#S zZRjX>cgK7+ogc~mDz`W)Ulcbg{!MW-`(b8Qel%Y(vs5pkK@=sSu>XaHU6Ie~+V%n# zar}h)290#3z3b^!ulTDp?(!lq}`m;r~T(X~yK| zM+y~Ft5LDjd8*e*LA2o;MbU!Dhml6VDL}(d_FoWf_+g~z%R0I7;!MkBM|7+6BXRMr z0!z?^%E)z@)^uOE%>I5sJTt|6^?p1Sd9bcc;A$s2_5NFO;^=G$S@)tZbiFm@NAvSz zUqv%(msct-2yQxp_)O@xZ4fEQj@7SUk=5q6&B#yP_F_9-mbUJ}Tc(XXNfak=1v zXuL3%mzVjy2P4Y`sr%*MN}?q~lK8GLHpLlARz{z!sHC7EQZG-DzPLOjn)KXaTvRk$ zl6+24w2|vcN*^aHQjqu#J9hP&KfH_EU#ZJ}qqsP?I4;Qi#Z2Ee$x+`6Y`!QRlfXy$ z8u?dDx*oDX1$$js5`QOB9G9XEqqZ2#cu`K#dzD%1!3f4CbqiwkBVP*a`ZOS^Dqhs+ z-KaBIHJ1+M^f1mL*|so}BV_K^AJtdUB20@qk)op9s6q`Garvme+&#}l{W3Q%Ptu6v zt9~dKRag{_<`>34eAuF#Ms-UHa=%8w=e|@L}F!eomHv!D;!VB;Mep zd{Iy@N4%4)Q<5Mcb7I9=4Wila=NINl5^!JE&Ch&P#PjRLvKwW-P=4=o3*ynDf=Hh5 zKqGlM83NiDNPcYZO_3CM_rKG_Innrsk+0vuIK&6hf}D5*Nj++aV~^)~GQ0UmDyW6-J99@mP^CZh3K|f-H2AW3fEpAXenqAWTMKEGEKn0$ByohGN#y zBF8KGRIIGNN>oMBEcB@!W`h()3UY-GaIGZY`*6jb7^;?oPfT3+q#w!pTS;zFH2+~d z<8tbY$TL1|qG|WFH=Lv$A!;PSa_Gz29fNqFt7Kv6Trxg6`&O+8=)6~ zX%4h@GAkE1D#i(=yMHq)xeu;<&n(ZeE?S@oe zQKGGxUMuaLw`#k+q?MmY063$5w%-kpp{M^&ZeG+=Qx&)`vEmHGU4@ODi9b<(NVgHL zG6{8)kmU6<|I2J#BwOU--it=EqeYUy(S9z9#T2_eR@?~Hx}N_gE6a$4(6v>kpkB&D=dkB94~s9u0WZCjSwZi=th&i zo|vPrnekQqqDX!e-6_?^!w*gmPVzR;iTEIw;$g-Gm7Nzx3O=g;n}RG%4o9;ypO!0f zF@s7F{d%{hpS8doO(W?!U=rigtjJf`9mlKVD;zTxtS@Wy^ zV;nInmY*Lh5J5yIaqZ4AJ-aAYn3I|6Sd+-0b-Wm{8`<#%Sgo|&c%^^Kr8kA%=Z#$B9*7-0ETbRuZrOD(+h<%8UdP+FiVB0DFeC`?j*vK)kJ=AOF-d!d*Mr zg?c0_zfi2N0%=`teOa;m!bp)^-Ov6*Zv%J28Sk^0mlb;dt^X$O9t`(nN9FK|D_+6qQlAT>t{8{W%fyzdL8r3D>s$Gf|i+2E&I-Ep+ z&tgs;&hzC(rHeD%k({VsB;wOhJz=bW+90=nTu#qV6UOqg9e`pVj+&e$^4GT`?b=dUpr}}+UcJ*h!tU-+gs7B-26yhMMjF-EF=1LygufhaOSc&Nqas*@MLiT$CT*%{iQ3)2FxI$4HDVXlf7CVJ9r=n^3 zh^*&?=x|!E|A%6@Tvbe79!{+wp6Od3$mVE2BGDDg*M7_l6E>iZTW#mP--~=- zSQ3|{=!fDny->W5Ck$H@Wuq-7!E2?}&;43ZUTuc}ALd5od$5QQg+^UA6Wx4>t8zKf zAK7(Jv1ZUWjq1mW-i~B7_*lx^oGf&N-ij4?K@vrlcpfKTNNcCen?$1v$07Y+VI$^n_MkNFrR+v=~clh@| z)!9-{e-@Ma`{7Fyi;QNbJ#4lP%x5uozJ4C9u%upIZdN3o8!M<2DJsg17XAMN00960 LImXdKM#KOBC_wRW From 21549e46c6612dfb173bc9ee7395ae59b97a43d7 Mon Sep 17 00:00:00 2001 From: Calvin Weng Date: Tue, 29 Sep 2020 19:00:27 +0800 Subject: [PATCH 57/60] README: update contributing guide (#20262) --- CONTRIBUTING.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d3d19f9a12378..24ccc1707deab 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,3 @@ -# Contribution Guide +# Contributing Guide -See the [Contribution Guide](https://github.com/pingcap/community/blob/master/CONTRIBUTING.md) in the -[community](https://github.com/pingcap/community) repo. +See the [Contributing Guide](https://github.com/pingcap/community/blob/master/contributors/README.md) in the [community](https://github.com/pingcap/community) repository. \ No newline at end of file From 170e2fec92d245330ef5f789f38c8499d2ac9e20 Mon Sep 17 00:00:00 2001 From: lysu Date: Tue, 29 Sep 2020 21:25:56 +0800 Subject: [PATCH 58/60] *: collect multiple partitions and store in tidb (part II) (#19899) --- distsql/request_builder.go | 89 +++++-- domain/domainctx.go | 14 -- executor/analyze.go | 86 +++---- executor/analyze_test.go | 113 ++++----- executor/builder.go | 10 +- executor/distsql.go | 2 +- executor/index_merge_reader.go | 2 +- executor/show_stats_test.go | 51 ++-- planner/core/integration_test.go | 41 ++-- planner/core/planbuilder.go | 86 ++++++- planner/core/testdata/analyze_suite_out.json | 2 +- session/session.go | 13 + sessionctx/context.go | 4 + sessionctx/variable/session.go | 7 +- statistics/handle/ddl_test.go | 127 +++++----- statistics/handle/gc_test.go | 53 +++-- statistics/handle/handle.go | 35 ++- statistics/handle/update.go | 18 +- statistics/handle/update_test.go | 235 ++++++++++--------- util/mock/context.go | 5 + util/testkit/testkit.go | 8 + 21 files changed, 576 insertions(+), 425 deletions(-) diff --git a/distsql/request_builder.go b/distsql/request_builder.go index dcae06ea677c0..944c56bd5200d 100644 --- a/distsql/request_builder.go +++ b/distsql/request_builder.go @@ -48,6 +48,15 @@ func (builder *RequestBuilder) SetMemTracker(tracker *memory.Tracker) *RequestBu return builder } +// SetTableRangesForTables sets "KeyRanges" for "kv.Request" by converting multiples "tableRanges" +// to "KeyRanges" firstly. +func (builder *RequestBuilder) SetTableRangesForTables(tids []int64, tableRanges []*ranger.Range, fb *statistics.QueryFeedback) *RequestBuilder { + if builder.err == nil { + builder.Request.KeyRanges = TablesRangesToKVRanges(tids, tableRanges, fb) + } + return builder +} + // SetTableRanges sets "KeyRanges" for "kv.Request" by converting "tableRanges" // to "KeyRanges" firstly. func (builder *RequestBuilder) SetTableRanges(tid int64, tableRanges []*ranger.Range, fb *statistics.QueryFeedback) *RequestBuilder { @@ -66,9 +75,27 @@ func (builder *RequestBuilder) SetIndexRanges(sc *stmtctx.StatementContext, tid, return builder } +// SetIndexRangesForTables sets "KeyRanges" for "kv.Request" by converting multiple indexes range +// "ranges" to "KeyRanges" firstly. +func (builder *RequestBuilder) SetIndexRangesForTables(sc *stmtctx.StatementContext, tids []int64, idxID int64, ranges []*ranger.Range) *RequestBuilder { + if builder.err == nil { + builder.Request.KeyRanges, builder.err = IndexRangesToKVRangesForTables(sc, tids, idxID, ranges, nil) + } + return builder +} + // SetCommonHandleRanges sets "KeyRanges" for "kv.Request" by converting common handle range // "ranges" to "KeyRanges" firstly. func (builder *RequestBuilder) SetCommonHandleRanges(sc *stmtctx.StatementContext, tid int64, ranges []*ranger.Range) *RequestBuilder { + if builder.err == nil { + builder.Request.KeyRanges, builder.err = CommonHandleRangesToKVRanges(sc, []int64{tid}, ranges) + } + return builder +} + +// SetCommonHandleRangesForTables sets "KeyRanges" for "kv.Request" by converting common handle range +// "ranges" to "KeyRanges" firstly for multiple tables. +func (builder *RequestBuilder) SetCommonHandleRangesForTables(sc *stmtctx.StatementContext, tid []int64, ranges []*ranger.Range) *RequestBuilder { if builder.err == nil { builder.Request.KeyRanges, builder.err = CommonHandleRangesToKVRanges(sc, tid, ranges) } @@ -222,8 +249,13 @@ func (builder *RequestBuilder) SetConcurrency(concurrency int) *RequestBuilder { // TableRangesToKVRanges converts table ranges to "KeyRange". func TableRangesToKVRanges(tid int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) []kv.KeyRange { + return TablesRangesToKVRanges([]int64{tid}, ranges, fb) +} + +// TablesRangesToKVRanges converts table ranges to "KeyRange". +func TablesRangesToKVRanges(tids []int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) []kv.KeyRange { if fb == nil || fb.Hist == nil { - return tableRangesToKVRangesWithoutSplit(tid, ranges) + return tableRangesToKVRangesWithoutSplit(tids, ranges) } krs := make([]kv.KeyRange, 0, len(ranges)) feedbackRanges := make([]*ranger.Range, 0, len(ranges)) @@ -243,21 +275,25 @@ func TableRangesToKVRanges(tid int64, ranges []*ranger.Range, fb *statistics.Que if !ran.HighExclude { high = kv.Key(high).PrefixNext() } - startKey := tablecodec.EncodeRowKey(tid, low) - endKey := tablecodec.EncodeRowKey(tid, high) - krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + for _, tid := range tids { + startKey := tablecodec.EncodeRowKey(tid, low) + endKey := tablecodec.EncodeRowKey(tid, high) + krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + } } fb.StoreRanges(feedbackRanges) return krs } -func tableRangesToKVRangesWithoutSplit(tid int64, ranges []*ranger.Range) []kv.KeyRange { - krs := make([]kv.KeyRange, 0, len(ranges)) +func tableRangesToKVRangesWithoutSplit(tids []int64, ranges []*ranger.Range) []kv.KeyRange { + krs := make([]kv.KeyRange, 0, len(ranges)*len(tids)) for _, ran := range ranges { low, high := encodeHandleKey(ran) - startKey := tablecodec.EncodeRowKey(tid, low) - endKey := tablecodec.EncodeRowKey(tid, high) - krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + for _, tid := range tids { + startKey := tablecodec.EncodeRowKey(tid, low) + endKey := tablecodec.EncodeRowKey(tid, high) + krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + } } return krs } @@ -346,8 +382,13 @@ func PartitionHandlesToKVRanges(handles []kv.Handle) []kv.KeyRange { // IndexRangesToKVRanges converts index ranges to "KeyRange". func IndexRangesToKVRanges(sc *stmtctx.StatementContext, tid, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) ([]kv.KeyRange, error) { + return IndexRangesToKVRangesForTables(sc, []int64{tid}, idxID, ranges, fb) +} + +// IndexRangesToKVRangesForTables converts indexes ranges to "KeyRange". +func IndexRangesToKVRangesForTables(sc *stmtctx.StatementContext, tids []int64, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) ([]kv.KeyRange, error) { if fb == nil || fb.Hist == nil { - return indexRangesToKVWithoutSplit(sc, tid, idxID, ranges) + return indexRangesToKVWithoutSplit(sc, tids, idxID, ranges) } feedbackRanges := make([]*ranger.Range, 0, len(ranges)) for _, ran := range ranges { @@ -376,16 +417,18 @@ func IndexRangesToKVRanges(sc *stmtctx.StatementContext, tid, idxID int64, range if !ran.HighExclude { high = kv.Key(high).PrefixNext() } - startKey := tablecodec.EncodeIndexSeekKey(tid, idxID, low) - endKey := tablecodec.EncodeIndexSeekKey(tid, idxID, high) - krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + for _, tid := range tids { + startKey := tablecodec.EncodeIndexSeekKey(tid, idxID, low) + endKey := tablecodec.EncodeIndexSeekKey(tid, idxID, high) + krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + } } fb.StoreRanges(feedbackRanges) return krs, nil } // CommonHandleRangesToKVRanges converts common handle ranges to "KeyRange". -func CommonHandleRangesToKVRanges(sc *stmtctx.StatementContext, tid int64, ranges []*ranger.Range) ([]kv.KeyRange, error) { +func CommonHandleRangesToKVRanges(sc *stmtctx.StatementContext, tids []int64, ranges []*ranger.Range) ([]kv.KeyRange, error) { rans := make([]*ranger.Range, 0, len(ranges)) for _, ran := range ranges { low, high, err := encodeIndexKey(sc, ran) @@ -402,23 +445,27 @@ func CommonHandleRangesToKVRanges(sc *stmtctx.StatementContext, tid int64, range low = kv.Key(low).PrefixNext() } ran.LowVal[0].SetBytes(low) - startKey := tablecodec.EncodeRowKey(tid, low) - endKey := tablecodec.EncodeRowKey(tid, high) - krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + for _, tid := range tids { + startKey := tablecodec.EncodeRowKey(tid, low) + endKey := tablecodec.EncodeRowKey(tid, high) + krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + } } return krs, nil } -func indexRangesToKVWithoutSplit(sc *stmtctx.StatementContext, tid, idxID int64, ranges []*ranger.Range) ([]kv.KeyRange, error) { +func indexRangesToKVWithoutSplit(sc *stmtctx.StatementContext, tids []int64, idxID int64, ranges []*ranger.Range) ([]kv.KeyRange, error) { krs := make([]kv.KeyRange, 0, len(ranges)) for _, ran := range ranges { low, high, err := encodeIndexKey(sc, ran) if err != nil { return nil, err } - startKey := tablecodec.EncodeIndexSeekKey(tid, idxID, low) - endKey := tablecodec.EncodeIndexSeekKey(tid, idxID, high) - krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + for _, tid := range tids { + startKey := tablecodec.EncodeIndexSeekKey(tid, idxID, low) + endKey := tablecodec.EncodeIndexSeekKey(tid, idxID, high) + krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) + } } return krs, nil } diff --git a/domain/domainctx.go b/domain/domainctx.go index 325c7a00b0a1e..ba31bce418455 100644 --- a/domain/domainctx.go +++ b/domain/domainctx.go @@ -14,7 +14,6 @@ package domain import ( - "github.com/pingcap/parser/model" "github.com/pingcap/tidb/sessionctx" ) @@ -41,16 +40,3 @@ func GetDomain(ctx sessionctx.Context) *Domain { } return v } - -// CanRuntimePruneTbl indicates whether tbl support runtime prune. -func CanRuntimePruneTbl(ctx sessionctx.Context, tbl *model.TableInfo) bool { - if tbl.Partition == nil { - return false - } - return GetDomain(ctx).StatsHandle().CanRuntimePrune(tbl.ID, tbl.Partition.Definitions[0].ID) -} - -// CanRuntimePrune indicates whether tbl support runtime prune for table and first partition id. -func CanRuntimePrune(ctx sessionctx.Context, tid, p0Id int64) bool { - return GetDomain(ctx).StatsHandle().CanRuntimePrune(tid, p0Id) -} diff --git a/executor/analyze.go b/executor/analyze.go index 0561d81793b9d..a3aab93b09de3 100755 --- a/executor/analyze.go +++ b/executor/analyze.go @@ -269,9 +269,9 @@ func (e *AnalyzeIndexExec) fetchAnalyzeResult(ranges []*ranger.Range, isNullRang var builder distsql.RequestBuilder var kvReqBuilder *distsql.RequestBuilder if e.isCommonHandle && e.idxInfo.Primary { - kvReqBuilder = builder.SetCommonHandleRanges(e.ctx.GetSessionVars().StmtCtx, e.tableID.CollectIDs[0], ranges) + kvReqBuilder = builder.SetCommonHandleRangesForTables(e.ctx.GetSessionVars().StmtCtx, e.tableID.CollectIDs, ranges) } else { - kvReqBuilder = builder.SetIndexRanges(e.ctx.GetSessionVars().StmtCtx, e.tableID.CollectIDs[0], e.idxInfo.ID, ranges) + kvReqBuilder = builder.SetIndexRangesForTables(e.ctx.GetSessionVars().StmtCtx, e.tableID.CollectIDs, e.idxInfo.ID, ranges) } kvReq, err := kvReqBuilder. SetAnalyzeRequest(e.analyzePB). @@ -452,9 +452,9 @@ func (e *AnalyzeColumnsExec) buildResp(ranges []*ranger.Range) (distsql.SelectRe var builder distsql.RequestBuilder var reqBuilder *distsql.RequestBuilder if e.handleCols != nil && !e.handleCols.IsInt() { - reqBuilder = builder.SetCommonHandleRanges(e.ctx.GetSessionVars().StmtCtx, e.tableID.CollectIDs[0], ranges) + reqBuilder = builder.SetCommonHandleRangesForTables(e.ctx.GetSessionVars().StmtCtx, e.tableID.CollectIDs, ranges) } else { - reqBuilder = builder.SetTableRanges(e.tableID.CollectIDs[0], ranges, nil) + reqBuilder = builder.SetTableRangesForTables(e.tableID.CollectIDs, ranges, nil) } // Always set KeepOrder of the request to be true, in order to compute // correct `correlation` of columns. @@ -680,7 +680,7 @@ func (e *AnalyzeFastExec) calculateEstimateSampleStep() (err error) { } }() var partition string - if e.tblInfo.ID != e.tableID.PersistID { + if e.tableID.StoreAsCollectID() && e.tblInfo.ID != e.tableID.PersistID { for _, definition := range e.tblInfo.Partition.Definitions { if definition.ID == e.tableID.PersistID { partition = fmt.Sprintf(" partition(%s)", definition.Name.L) @@ -694,7 +694,7 @@ func (e *AnalyzeFastExec) calculateEstimateSampleStep() (err error) { } var recordSets []sqlexec.RecordSet recordSets, err = e.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), sql) - if err != nil || len(recordSets) == 0 { + if err != nil { return } if len(recordSets) == 0 { @@ -746,36 +746,38 @@ func (e *AnalyzeFastExec) buildSampTask() (err error) { bo := tikv.NewBackofferWithVars(context.Background(), 500, nil) store, _ := e.ctx.GetStore().(tikv.Storage) e.cache = store.GetRegionCache() - startKey, endKey := tablecodec.GetTableHandleKeyRange(e.tableID.CollectIDs[0]) - targetKey := startKey accessRegionsCounter := 0 - for { - // Search for the region which contains the targetKey. - loc, err := e.cache.LocateKey(bo, targetKey) - if err != nil { - return err - } - if bytes.Compare(endKey, loc.StartKey) < 0 { - break - } - accessRegionsCounter++ + for _, pid := range e.tableID.CollectIDs { + startKey, endKey := tablecodec.GetTableHandleKeyRange(pid) + targetKey := startKey + for { + // Search for the region which contains the targetKey. + loc, err := e.cache.LocateKey(bo, targetKey) + if err != nil { + return err + } + if bytes.Compare(endKey, loc.StartKey) < 0 { + break + } + accessRegionsCounter++ - // Set the next search key. - targetKey = loc.EndKey + // Set the next search key. + targetKey = loc.EndKey - // If the KV pairs in the region all belonging to the table, add it to the sample task. - if bytes.Compare(startKey, loc.StartKey) <= 0 && len(loc.EndKey) != 0 && bytes.Compare(loc.EndKey, endKey) <= 0 { - e.sampTasks = append(e.sampTasks, loc) - continue - } + // If the KV pairs in the region all belonging to the table, add it to the sample task. + if bytes.Compare(startKey, loc.StartKey) <= 0 && len(loc.EndKey) != 0 && bytes.Compare(loc.EndKey, endKey) <= 0 { + e.sampTasks = append(e.sampTasks, loc) + continue + } - e.scanTasks = append(e.scanTasks, loc) - if bytes.Compare(loc.StartKey, startKey) < 0 { - loc.StartKey = startKey - } - if bytes.Compare(endKey, loc.EndKey) < 0 || len(loc.EndKey) == 0 { - loc.EndKey = endKey - break + e.scanTasks = append(e.scanTasks, loc) + if bytes.Compare(loc.StartKey, startKey) < 0 { + loc.StartKey = startKey + } + if bytes.Compare(endKey, loc.EndKey) < 0 || len(loc.EndKey) == 0 { + loc.EndKey = endKey + break + } } } fastAnalyzeHistogramAccessRegions.Observe(float64(accessRegionsCounter)) @@ -1140,15 +1142,15 @@ func (e *AnalyzeFastExec) buildStats() (hists []*statistics.Histogram, cms []*st // AnalyzeTestFastExec is for fast sample in unit test. type AnalyzeTestFastExec struct { AnalyzeFastExec - Ctx sessionctx.Context - PhysicalTableID int64 - HandleCols core.HandleCols - ColsInfo []*model.ColumnInfo - IdxsInfo []*model.IndexInfo - Concurrency int - Collectors []*statistics.SampleCollector - TblInfo *model.TableInfo - Opts map[ast.AnalyzeOptionType]uint64 + Ctx sessionctx.Context + TableID core.AnalyzeTableID + HandleCols core.HandleCols + ColsInfo []*model.ColumnInfo + IdxsInfo []*model.IndexInfo + Concurrency int + Collectors []*statistics.SampleCollector + TblInfo *model.TableInfo + Opts map[ast.AnalyzeOptionType]uint64 } // TestFastSample only test the fast sample in unit test. @@ -1158,7 +1160,7 @@ func (e *AnalyzeTestFastExec) TestFastSample() error { e.colsInfo = e.ColsInfo e.idxsInfo = e.IdxsInfo e.concurrency = e.Concurrency - e.tableID = core.AnalyzeTableID{PersistID: e.PhysicalTableID, CollectIDs: []int64{e.PhysicalTableID}} + e.tableID = e.TableID e.wg = &sync.WaitGroup{} e.job = &statistics.AnalyzeJob{} e.tblInfo = e.TblInfo diff --git a/executor/analyze_test.go b/executor/analyze_test.go index 7642122a03c48..b3880ed9b434f 100644 --- a/executor/analyze_test.go +++ b/executor/analyze_test.go @@ -51,64 +51,66 @@ var _ = Suite(&testFastAnalyze{}) func (s *testSuite1) TestAnalyzePartition(c *C) { tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - createTable := `CREATE TABLE t (a int, b int, c varchar(10), primary key(a), index idx(b)) + testkit.WithPruneMode(tk, variable.StaticOnly, func() { + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + createTable := `CREATE TABLE t (a int, b int, c varchar(10), primary key(a), index idx(b)) PARTITION BY RANGE ( a ) ( PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11), PARTITION p2 VALUES LESS THAN (16), PARTITION p3 VALUES LESS THAN (21) )` - tk.MustExec(createTable) - for i := 1; i < 21; i++ { - tk.MustExec(fmt.Sprintf(`insert into t values (%d, %d, "hello")`, i, i)) - } - tk.MustExec("analyze table t") - - is := infoschema.GetInfoSchema(tk.Se.(sessionctx.Context)) - table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - pi := table.Meta().GetPartitionInfo() - c.Assert(pi, NotNil) - do, err := session.GetDomain(s.store) - c.Assert(err, IsNil) - handle := do.StatsHandle() - for _, def := range pi.Definitions { - statsTbl := handle.GetPartitionStats(table.Meta(), def.ID) - c.Assert(statsTbl.Pseudo, IsFalse) - c.Assert(len(statsTbl.Columns), Equals, 3) - c.Assert(len(statsTbl.Indices), Equals, 1) - for _, col := range statsTbl.Columns { - c.Assert(col.Len(), Greater, 0) - } - for _, idx := range statsTbl.Indices { - c.Assert(idx.Len(), Greater, 0) + tk.MustExec(createTable) + for i := 1; i < 21; i++ { + tk.MustExec(fmt.Sprintf(`insert into t values (%d, %d, "hello")`, i, i)) } - } + tk.MustExec("analyze table t") - tk.MustExec("drop table t") - tk.MustExec(createTable) - for i := 1; i < 21; i++ { - tk.MustExec(fmt.Sprintf(`insert into t values (%d, %d, "hello")`, i, i)) - } - tk.MustExec("alter table t analyze partition p0") - is = infoschema.GetInfoSchema(tk.Se.(sessionctx.Context)) - table, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - pi = table.Meta().GetPartitionInfo() - c.Assert(pi, NotNil) - - for i, def := range pi.Definitions { - statsTbl := handle.GetPartitionStats(table.Meta(), def.ID) - if i == 0 { + is := infoschema.GetInfoSchema(tk.Se.(sessionctx.Context)) + table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + pi := table.Meta().GetPartitionInfo() + c.Assert(pi, NotNil) + do, err := session.GetDomain(s.store) + c.Assert(err, IsNil) + handle := do.StatsHandle() + for _, def := range pi.Definitions { + statsTbl := handle.GetPartitionStats(table.Meta(), def.ID) c.Assert(statsTbl.Pseudo, IsFalse) c.Assert(len(statsTbl.Columns), Equals, 3) c.Assert(len(statsTbl.Indices), Equals, 1) - } else { - c.Assert(statsTbl.Pseudo, IsTrue) + for _, col := range statsTbl.Columns { + c.Assert(col.Len(), Greater, 0) + } + for _, idx := range statsTbl.Indices { + c.Assert(idx.Len(), Greater, 0) + } } - } + + tk.MustExec("drop table t") + tk.MustExec(createTable) + for i := 1; i < 21; i++ { + tk.MustExec(fmt.Sprintf(`insert into t values (%d, %d, "hello")`, i, i)) + } + tk.MustExec("alter table t analyze partition p0") + is = infoschema.GetInfoSchema(tk.Se.(sessionctx.Context)) + table, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + pi = table.Meta().GetPartitionInfo() + c.Assert(pi, NotNil) + + for i, def := range pi.Definitions { + statsTbl := handle.GetPartitionStats(table.Meta(), def.ID) + if i == 0 { + c.Assert(statsTbl.Pseudo, IsFalse) + c.Assert(len(statsTbl.Columns), Equals, 3) + c.Assert(len(statsTbl.Indices), Equals, 1) + } else { + c.Assert(statsTbl.Pseudo, IsTrue) + } + } + }) } func (s *testSuite1) TestAnalyzeReplicaReadFollower(c *C) { @@ -264,14 +266,17 @@ func (s *testFastAnalyze) TestAnalyzeFastSample(c *C) { opts := make(map[ast.AnalyzeOptionType]uint64) opts[ast.AnalyzeOptNumSamples] = 20 mockExec := &executor.AnalyzeTestFastExec{ - Ctx: tk.Se.(sessionctx.Context), - HandleCols: handleCols, - ColsInfo: colsInfo, - IdxsInfo: indicesInfo, - Concurrency: 1, - PhysicalTableID: tbl.(table.PhysicalTable).GetPhysicalID(), - TblInfo: tblInfo, - Opts: opts, + Ctx: tk.Se.(sessionctx.Context), + HandleCols: handleCols, + ColsInfo: colsInfo, + IdxsInfo: indicesInfo, + Concurrency: 1, + TableID: core.AnalyzeTableID{ + CollectIDs: []int64{tbl.(table.PhysicalTable).GetPhysicalID()}, + PersistID: tbl.(table.PhysicalTable).GetPhysicalID(), + }, + TblInfo: tblInfo, + Opts: opts, } err = mockExec.TestFastSample() c.Assert(err, IsNil) diff --git a/executor/builder.go b/executor/builder.go index 7e2b01ba4358f..cbedfc175399b 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -2141,7 +2141,11 @@ func (b *executorBuilder) buildAnalyze(v *plannercore.Analyze) Executor { if enableFastAnalyze { b.buildAnalyzeFastIndex(e, task, v.Opts) } else { - e.tasks = append(e.tasks, b.buildAnalyzeIndexPushdown(task, v.Opts, autoAnalyze)) + if task.TableID.StoreAsCollectID() && len(task.TableID.CollectIDs) > 1 && !task.IndexInfo.Global && !task.IndexInfo.Unique { + b.buildAnalyzeFastIndex(e, task, v.Opts) + } else { + e.tasks = append(e.tasks, b.buildAnalyzeIndexPushdown(task, v.Opts, autoAnalyze)) + } } } if b.err != nil { @@ -3470,7 +3474,7 @@ func buildKvRangesForIndexJoin(ctx sessionctx.Context, tableID, indexID int64, l var tmpKvRanges []kv.KeyRange var err error if indexID == -1 { - tmpKvRanges, err = distsql.CommonHandleRangesToKVRanges(sc, tableID, ranges) + tmpKvRanges, err = distsql.CommonHandleRangesToKVRanges(sc, []int64{tableID}, ranges) } else { tmpKvRanges, err = distsql.IndexRangesToKVRanges(sc, tableID, indexID, ranges, nil) } @@ -3508,7 +3512,7 @@ func buildKvRangesForIndexJoin(ctx sessionctx.Context, tableID, indexID int64, l } // Index id is -1 means it's a common handle. if indexID == -1 { - return distsql.CommonHandleRangesToKVRanges(ctx.GetSessionVars().StmtCtx, tableID, tmpDatumRanges) + return distsql.CommonHandleRangesToKVRanges(ctx.GetSessionVars().StmtCtx, []int64{tableID}, tmpDatumRanges) } return distsql.IndexRangesToKVRanges(ctx.GetSessionVars().StmtCtx, tableID, indexID, tmpDatumRanges, nil) } diff --git a/executor/distsql.go b/executor/distsql.go index 347735c49594e..85184cc9f2c01 100644 --- a/executor/distsql.go +++ b/executor/distsql.go @@ -391,7 +391,7 @@ func (e *IndexLookUpExecutor) Open(ctx context.Context) error { sc := e.ctx.GetSessionVars().StmtCtx physicalID := getPhysicalTableID(e.table) if e.index.ID == -1 { - e.kvRanges, err = distsql.CommonHandleRangesToKVRanges(sc, physicalID, e.ranges) + e.kvRanges, err = distsql.CommonHandleRangesToKVRanges(sc, []int64{physicalID}, e.ranges) } else { e.kvRanges, err = distsql.IndexRangesToKVRanges(sc, physicalID, e.index.ID, e.ranges, e.feedback) } diff --git a/executor/index_merge_reader.go b/executor/index_merge_reader.go index db2eeb54536f3..689e466e3659c 100644 --- a/executor/index_merge_reader.go +++ b/executor/index_merge_reader.go @@ -111,7 +111,7 @@ func (e *IndexMergeReaderExecutor) Open(ctx context.Context) error { _, ok := plan[0].(*plannercore.PhysicalIndexScan) if !ok { if e.table.Meta().IsCommonHandle { - keyRanges, err := distsql.CommonHandleRangesToKVRanges(e.ctx.GetSessionVars().StmtCtx, getPhysicalTableID(e.table), e.ranges[i]) + keyRanges, err := distsql.CommonHandleRangesToKVRanges(e.ctx.GetSessionVars().StmtCtx, []int64{getPhysicalTableID(e.table)}, e.ranges[i]) if err != nil { return err } diff --git a/executor/show_stats_test.go b/executor/show_stats_test.go index 87d667a886a37..270c35f5abf2d 100644 --- a/executor/show_stats_test.go +++ b/executor/show_stats_test.go @@ -18,6 +18,7 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/util/testkit" ) @@ -174,35 +175,37 @@ func (s *testShowStatsSuite) TestShowStatsHasNullValue(c *C) { func (s *testShowStatsSuite) TestShowPartitionStats(c *C) { tk := testkit.NewTestKit(c, s.store) - tk.MustExec("set @@session.tidb_enable_table_partition=1") - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - createTable := `CREATE TABLE t (a int, b int, primary key(a), index idx(b)) + testkit.WithPruneMode(tk, variable.StaticOnly, func() { + tk.MustExec("set @@session.tidb_enable_table_partition=1") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + createTable := `CREATE TABLE t (a int, b int, primary key(a), index idx(b)) PARTITION BY RANGE ( a ) (PARTITION p0 VALUES LESS THAN (6))` - tk.MustExec(createTable) - tk.MustExec(`insert into t values (1, 1)`) - tk.MustExec("analyze table t") + tk.MustExec(createTable) + tk.MustExec(`insert into t values (1, 1)`) + tk.MustExec("analyze table t") - result := tk.MustQuery("show stats_meta") - c.Assert(len(result.Rows()), Equals, 1) - c.Assert(result.Rows()[0][0], Equals, "test") - c.Assert(result.Rows()[0][1], Equals, "t") - c.Assert(result.Rows()[0][2], Equals, "p0") + result := tk.MustQuery("show stats_meta") + c.Assert(len(result.Rows()), Equals, 1) + c.Assert(result.Rows()[0][0], Equals, "test") + c.Assert(result.Rows()[0][1], Equals, "t") + c.Assert(result.Rows()[0][2], Equals, "p0") - result = tk.MustQuery("show stats_histograms").Sort() - c.Assert(len(result.Rows()), Equals, 3) - c.Assert(result.Rows()[0][2], Equals, "p0") - c.Assert(result.Rows()[0][3], Equals, "a") - c.Assert(result.Rows()[1][2], Equals, "p0") - c.Assert(result.Rows()[1][3], Equals, "b") - c.Assert(result.Rows()[2][2], Equals, "p0") - c.Assert(result.Rows()[2][3], Equals, "idx") + result = tk.MustQuery("show stats_histograms").Sort() + c.Assert(len(result.Rows()), Equals, 3) + c.Assert(result.Rows()[0][2], Equals, "p0") + c.Assert(result.Rows()[0][3], Equals, "a") + c.Assert(result.Rows()[1][2], Equals, "p0") + c.Assert(result.Rows()[1][3], Equals, "b") + c.Assert(result.Rows()[2][2], Equals, "p0") + c.Assert(result.Rows()[2][3], Equals, "idx") - result = tk.MustQuery("show stats_buckets").Sort() - result.Check(testkit.Rows("test t p0 a 0 0 1 1 1 1", "test t p0 b 0 0 1 1 1 1", "test t p0 idx 1 0 1 1 1 1")) + result = tk.MustQuery("show stats_buckets").Sort() + result.Check(testkit.Rows("test t p0 a 0 0 1 1 1 1", "test t p0 b 0 0 1 1 1 1", "test t p0 idx 1 0 1 1 1 1")) - result = tk.MustQuery("show stats_healthy") - result.Check(testkit.Rows("test t p0 100")) + result = tk.MustQuery("show stats_healthy") + result.Check(testkit.Rows("test t p0 100")) + }) } func (s *testShowStatsSuite) TestShowAnalyzeStatus(c *C) { diff --git a/planner/core/integration_test.go b/planner/core/integration_test.go index 1a8590704770c..36b23dc105dd3 100644 --- a/planner/core/integration_test.go +++ b/planner/core/integration_test.go @@ -671,26 +671,27 @@ func (s *testIntegrationSerialSuite) TestIsolationReadDoNotFilterSystemDB(c *C) func (s *testIntegrationSuite) TestPartitionTableStats(c *C) { tk := testkit.NewTestKit(c, s.store) - - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, b int)partition by range columns(a)(partition p0 values less than (10), partition p1 values less than(20), partition p2 values less than(30));") - tk.MustExec("insert into t values(21, 1), (22, 2), (23, 3), (24, 4), (15, 5)") - tk.MustExec("analyze table t") - tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) - - var input []string - var output []struct { - SQL string - Result []string - } - s.testData.GetTestCases(c, &input, &output) - for i, tt := range input { - s.testData.OnRecord(func() { - output[i].SQL = tt - output[i].Result = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - }) - tk.MustQuery(tt).Check(testkit.Rows(output[i].Result...)) + { + tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int)partition by range columns(a)(partition p0 values less than (10), partition p1 values less than(20), partition p2 values less than(30));") + tk.MustExec("insert into t values(21, 1), (22, 2), (23, 3), (24, 4), (15, 5)") + tk.MustExec("analyze table t") + + var input []string + var output []struct { + SQL string + Result []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Result = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Result...)) + } } } diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index ab23f70f96de3..3b77a3daaa02f 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -1533,6 +1533,11 @@ func getPhysicalIDsAndPartitionNames(tblInfo *model.TableInfo, partitionNames [] func (b *PlanBuilder) buildAnalyzeTable(as *ast.AnalyzeTableStmt, opts map[ast.AnalyzeOptionType]uint64) (Plan, error) { p := &Analyze{Opts: opts} + pruneMode := variable.PartitionPruneMode(b.ctx.GetSessionVars().PartitionPruneMode.Load()) + if len(as.PartitionNames) > 0 && pruneMode == variable.DynamicOnly { + logutil.BgLogger().Info("analyze partition didn't affect in dynamic-prune-mode", zap.String("partitions", as.PartitionNames[0].L)) + return p, nil + } for _, tbl := range as.TableNames { if tbl.TableInfo.IsView() { return nil, errors.Errorf("analyze view %s is not supported now.", tbl.Name.O) @@ -1546,8 +1551,20 @@ func (b *PlanBuilder) buildAnalyzeTable(as *ast.AnalyzeTableStmt, opts map[ast.A return nil, err } for _, idx := range idxInfo { - for i, id := range physicalIDs { - info := analyzeInfo{DBName: tbl.Schema.O, TableName: tbl.Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} + if pruneMode == variable.StaticOnly || (pruneMode == variable.StaticButPrepareDynamic && !b.ctx.GetSessionVars().InRestrictedSQL) { + // static mode or static-but-prepare-dynamic mode not belong auto analyze need analyze each partition + // for static-but-prepare-dynamic mode with auto analyze, echo partition will be check before analyze partition. + for i, id := range physicalIDs { + info := analyzeInfo{DBName: tbl.Schema.O, TableName: tbl.Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} + p.IdxTasks = append(p.IdxTasks, AnalyzeIndexTask{ + IndexInfo: idx, + analyzeInfo: info, + TblInfo: tbl.TableInfo, + }) + } + } + if pruneMode == variable.DynamicOnly || pruneMode == variable.StaticButPrepareDynamic { + info := analyzeInfo{DBName: tbl.Schema.O, TableName: tbl.Name.O, TableID: AnalyzeTableID{PersistID: tbl.TableInfo.ID, CollectIDs: physicalIDs}, Incremental: as.Incremental} p.IdxTasks = append(p.IdxTasks, AnalyzeIndexTask{ IndexInfo: idx, analyzeInfo: info, @@ -1557,8 +1574,19 @@ func (b *PlanBuilder) buildAnalyzeTable(as *ast.AnalyzeTableStmt, opts map[ast.A } handleCols := BuildHandleColsForAnalyze(b.ctx, tbl.TableInfo) if len(colInfo) > 0 || handleCols != nil { - for i, id := range physicalIDs { - info := analyzeInfo{DBName: tbl.Schema.O, TableName: tbl.Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} + if pruneMode == variable.StaticOnly || pruneMode == variable.StaticButPrepareDynamic { + for i, id := range physicalIDs { + info := analyzeInfo{DBName: tbl.Schema.O, TableName: tbl.Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} + p.ColTasks = append(p.ColTasks, AnalyzeColumnsTask{ + HandleCols: handleCols, + ColsInfo: colInfo, + analyzeInfo: info, + TblInfo: tbl.TableInfo, + }) + } + } + if pruneMode == variable.DynamicOnly || pruneMode == variable.StaticButPrepareDynamic { + info := analyzeInfo{DBName: tbl.Schema.O, TableName: tbl.Name.O, TableID: AnalyzeTableID{PersistID: tbl.TableInfo.ID, CollectIDs: physicalIDs}, Incremental: as.Incremental} p.ColTasks = append(p.ColTasks, AnalyzeColumnsTask{ HandleCols: handleCols, ColsInfo: colInfo, @@ -1574,6 +1602,11 @@ func (b *PlanBuilder) buildAnalyzeTable(as *ast.AnalyzeTableStmt, opts map[ast.A func (b *PlanBuilder) buildAnalyzeIndex(as *ast.AnalyzeTableStmt, opts map[ast.AnalyzeOptionType]uint64) (Plan, error) { p := &Analyze{Opts: opts} tblInfo := as.TableNames[0].TableInfo + pruneMode := variable.PartitionPruneMode(b.ctx.GetSessionVars().PartitionPruneMode.Load()) + if len(as.PartitionNames) > 0 && pruneMode == variable.DynamicOnly { + logutil.BgLogger().Info("analyze partition didn't affect in dynamic-prune-mode", zap.String("table", tblInfo.Name.L), zap.String("partitions", as.PartitionNames[0].L)) + return p, nil + } physicalIDs, names, err := getPhysicalIDsAndPartitionNames(tblInfo, as.PartitionNames) if err != nil { return nil, err @@ -1582,8 +1615,14 @@ func (b *PlanBuilder) buildAnalyzeIndex(as *ast.AnalyzeTableStmt, opts map[ast.A if isPrimaryIndex(idxName) { handleCols := BuildHandleColsForAnalyze(b.ctx, tblInfo) if handleCols != nil { - for i, id := range physicalIDs { - info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} + if pruneMode == variable.StaticOnly || pruneMode == variable.StaticButPrepareDynamic { + for i, id := range physicalIDs { + info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} + p.ColTasks = append(p.ColTasks, AnalyzeColumnsTask{HandleCols: handleCols, analyzeInfo: info, TblInfo: tblInfo}) + } + } + if pruneMode == variable.DynamicOnly || pruneMode == variable.StaticButPrepareDynamic { + info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, TableID: AnalyzeTableID{PersistID: tblInfo.ID, CollectIDs: physicalIDs}, Incremental: as.Incremental} p.ColTasks = append(p.ColTasks, AnalyzeColumnsTask{HandleCols: handleCols, analyzeInfo: info, TblInfo: tblInfo}) } continue @@ -1593,8 +1632,14 @@ func (b *PlanBuilder) buildAnalyzeIndex(as *ast.AnalyzeTableStmt, opts map[ast.A if idx == nil || idx.State != model.StatePublic { return nil, ErrAnalyzeMissIndex.GenWithStackByArgs(idxName.O, tblInfo.Name.O) } - for i, id := range physicalIDs { - info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} + if pruneMode == variable.StaticOnly || pruneMode == variable.StaticButPrepareDynamic { + for i, id := range physicalIDs { + info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} + p.IdxTasks = append(p.IdxTasks, AnalyzeIndexTask{IndexInfo: idx, analyzeInfo: info, TblInfo: tblInfo}) + } + } + if pruneMode == variable.DynamicOnly || pruneMode == variable.StaticButPrepareDynamic { + info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, TableID: AnalyzeTableID{PersistID: tblInfo.ID, CollectIDs: physicalIDs}, Incremental: as.Incremental} p.IdxTasks = append(p.IdxTasks, AnalyzeIndexTask{IndexInfo: idx, analyzeInfo: info, TblInfo: tblInfo}) } } @@ -1604,22 +1649,39 @@ func (b *PlanBuilder) buildAnalyzeIndex(as *ast.AnalyzeTableStmt, opts map[ast.A func (b *PlanBuilder) buildAnalyzeAllIndex(as *ast.AnalyzeTableStmt, opts map[ast.AnalyzeOptionType]uint64) (Plan, error) { p := &Analyze{Opts: opts} tblInfo := as.TableNames[0].TableInfo + pruneMode := variable.PartitionPruneMode(b.ctx.GetSessionVars().PartitionPruneMode.Load()) + if len(as.PartitionNames) > 0 && pruneMode == variable.DynamicOnly { + logutil.BgLogger().Info("analyze partition didn't affect in dynamic-prune-mode", zap.String("table", tblInfo.Name.L), zap.String("partitions", as.PartitionNames[0].L)) + return p, nil + } physicalIDs, names, err := getPhysicalIDsAndPartitionNames(tblInfo, as.PartitionNames) if err != nil { return nil, err } for _, idx := range tblInfo.Indices { if idx.State == model.StatePublic { - for i, id := range physicalIDs { - info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} + if pruneMode == variable.StaticOnly || pruneMode == variable.StaticButPrepareDynamic { + for i, id := range physicalIDs { + info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} + p.IdxTasks = append(p.IdxTasks, AnalyzeIndexTask{IndexInfo: idx, analyzeInfo: info, TblInfo: tblInfo}) + } + } + if pruneMode == variable.DynamicOnly || pruneMode == variable.StaticButPrepareDynamic { + info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, TableID: AnalyzeTableID{PersistID: tblInfo.ID, CollectIDs: physicalIDs}, Incremental: as.Incremental} p.IdxTasks = append(p.IdxTasks, AnalyzeIndexTask{IndexInfo: idx, analyzeInfo: info, TblInfo: tblInfo}) } } } handleCols := BuildHandleColsForAnalyze(b.ctx, tblInfo) if handleCols != nil { - for i, id := range physicalIDs { - info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} + if pruneMode == variable.StaticOnly || pruneMode == variable.StaticButPrepareDynamic { + for i, id := range physicalIDs { + info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} + p.ColTasks = append(p.ColTasks, AnalyzeColumnsTask{HandleCols: handleCols, analyzeInfo: info, TblInfo: tblInfo}) + } + } + if pruneMode == variable.DynamicOnly || pruneMode == variable.StaticButPrepareDynamic { + info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, TableID: AnalyzeTableID{PersistID: tblInfo.ID, CollectIDs: physicalIDs}, Incremental: as.Incremental} p.ColTasks = append(p.ColTasks, AnalyzeColumnsTask{HandleCols: handleCols, analyzeInfo: info, TblInfo: tblInfo}) } } diff --git a/planner/core/testdata/analyze_suite_out.json b/planner/core/testdata/analyze_suite_out.json index 86fa54e7b92e7..8d42349bb20fc 100644 --- a/planner/core/testdata/analyze_suite_out.json +++ b/planner/core/testdata/analyze_suite_out.json @@ -354,7 +354,7 @@ "Analyze{Index(a),Index(b)}", "TableReader(Table(t4)->Sel([le(test.t4.a, 2)]))", "IndexReader(Index(t4.b)[[-inf,2)])", - "IndexLookUp(Index(t4.a)[[1,1]], Table(t4)->Sel([le(test.t4.b, 2)]))" + "TableReader(Table(t4)->Sel([eq(test.t4.a, 1) le(test.t4.b, 2)]))" ] }, { diff --git a/session/session.go b/session/session.go index 38370ec38afc1..677e19a540704 100644 --- a/session/session.go +++ b/session/session.go @@ -777,13 +777,16 @@ func (s *session) ExecRestrictedSQLWithContext(ctx context.Context, sql string) se.sessionVars.OptimizerUseInvisibleIndexes = true defer func() { se.sessionVars.OptimizerUseInvisibleIndexes = false }() } + prePruneMode := se.sessionVars.PartitionPruneMode.Load() defer func() { if se != nil && se.GetSessionVars().StmtCtx.WarningCount() > 0 { warnings := se.GetSessionVars().StmtCtx.GetWarnings() s.GetSessionVars().StmtCtx.AppendWarnings(warnings) } + se.sessionVars.PartitionPruneMode.Store(prePruneMode) s.sysSessionPool().Put(tmp) }() + se.sessionVars.PartitionPruneMode.Store(s.sessionVars.PartitionPruneMode.Load()) metrics.SessionRestrictedSQLCounter.Inc() return execRestrictedSQL(ctx, se, sql) @@ -1666,6 +1669,16 @@ func getHostByIP(ip string) []string { return addrs } +// RefreshVars implements the sessionctx.Context interface. +func (s *session) RefreshVars(ctx context.Context) error { + pruneMode, err := s.GetSessionVars().GlobalVarsAccessor.GetGlobalSysVar(variable.TiDBPartitionPruneMode) + if err != nil { + return err + } + s.sessionVars.PartitionPruneMode.Store(pruneMode) + return nil +} + // CreateSession4Test creates a new session environment for test. func CreateSession4Test(store kv.Storage) (Session, error) { return CreateSession4TestWithOpt(store, nil) diff --git a/sessionctx/context.go b/sessionctx/context.go index 86a0f9b662296..c7804b53a3bb3 100644 --- a/sessionctx/context.go +++ b/sessionctx/context.go @@ -60,6 +60,10 @@ type Context interface { // now just for load data and batch insert. RefreshTxnCtx(context.Context) error + // RefreshVars refreshes modified global variable to current session. + // only used to daemon session like `statsHandle` to detect global variable change. + RefreshVars(context.Context) error + // InitTxnWithStartTS initializes a transaction with startTS. // It should be called right before we builds an executor. InitTxnWithStartTS(startTS uint64) error diff --git a/sessionctx/variable/session.go b/sessionctx/variable/session.go index bbd8c023c331d..3bb947b2a9bfa 100644 --- a/sessionctx/variable/session.go +++ b/sessionctx/variable/session.go @@ -51,6 +51,7 @@ import ( "github.com/pingcap/tidb/util/stringutil" "github.com/pingcap/tidb/util/timeutil" "github.com/twmb/murmur3" + atomic2 "go.uber.org/atomic" ) var preparedStmtCount int64 @@ -712,12 +713,12 @@ type SessionVars struct { LastTxnInfo kv.TxnInfo // PartitionPruneMode indicates how and when to prune partitions. - PartitionPruneMode PartitionPruneMode + PartitionPruneMode atomic2.String } // UseDynamicPartitionPrune indicates whether use new dynamic partition prune. func (s *SessionVars) UseDynamicPartitionPrune() bool { - return s.PartitionPruneMode == DynamicOnly + return PartitionPruneMode(s.PartitionPruneMode.Load()) == DynamicOnly } // PartitionPruneMode presents the prune mode used. @@ -1452,7 +1453,7 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { case TiDBEnableClusteredIndex: s.EnableClusteredIndex = TiDBOptOn(val) case TiDBPartitionPruneMode: - s.PartitionPruneMode = PartitionPruneMode(strings.ToLower(strings.TrimSpace(val))) + s.PartitionPruneMode.Store(strings.ToLower(strings.TrimSpace(val))) case TiDBEnableParallelApply: s.EnableParallelApply = TiDBOptOn(val) case TiDBSlowLogMasking, TiDBRedactLog: diff --git a/statistics/handle/ddl_test.go b/statistics/handle/ddl_test.go index c385e850e3df7..348f65f160ca1 100644 --- a/statistics/handle/ddl_test.go +++ b/statistics/handle/ddl_test.go @@ -17,6 +17,7 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/parser/model" "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/testkit" ) @@ -184,75 +185,77 @@ func (s *testStatsSuite) TestDDLHistogram(c *C) { func (s *testStatsSuite) TestDDLPartition(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.MustExec("drop table if exists t") - createTable := `CREATE TABLE t (a int, b int, primary key(a), index idx(b)) + testkit.WithPruneMode(testKit, variable.StaticOnly, func() { + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + createTable := `CREATE TABLE t (a int, b int, primary key(a), index idx(b)) PARTITION BY RANGE ( a ) ( PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11), PARTITION p2 VALUES LESS THAN (16), PARTITION p3 VALUES LESS THAN (21) )` - testKit.MustExec(createTable) - do := s.do - is := do.InfoSchema() - tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - tableInfo := tbl.Meta() - h := do.StatsHandle() - err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) - c.Assert(h.Update(is), IsNil) - pi := tableInfo.GetPartitionInfo() - for _, def := range pi.Definitions { - statsTbl := h.GetPartitionStats(tableInfo, def.ID) - c.Assert(statsTbl.Pseudo, IsFalse) - } + testKit.MustExec(createTable) + do := s.do + is := do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo := tbl.Meta() + h := do.StatsHandle() + err = h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(err, IsNil) + c.Assert(h.Update(is), IsNil) + pi := tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + c.Assert(statsTbl.Pseudo, IsFalse) + } - testKit.MustExec("insert into t values (1,2),(6,2),(11,2),(16,2)") - testKit.MustExec("analyze table t") - testKit.MustExec("alter table t add column c varchar(15) DEFAULT '123'") - err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) - is = do.InfoSchema() - c.Assert(h.Update(is), IsNil) - tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - tableInfo = tbl.Meta() - pi = tableInfo.GetPartitionInfo() - for _, def := range pi.Definitions { - statsTbl := h.GetPartitionStats(tableInfo, def.ID) - c.Assert(statsTbl.Pseudo, IsFalse) - c.Check(statsTbl.Columns[tableInfo.Columns[2].ID].AvgColSize(statsTbl.Count, false), Equals, 3.0) - } + testKit.MustExec("insert into t values (1,2),(6,2),(11,2),(16,2)") + testKit.MustExec("analyze table t") + testKit.MustExec("alter table t add column c varchar(15) DEFAULT '123'") + err = h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(err, IsNil) + is = do.InfoSchema() + c.Assert(h.Update(is), IsNil) + tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo = tbl.Meta() + pi = tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + c.Assert(statsTbl.Pseudo, IsFalse) + c.Check(statsTbl.Columns[tableInfo.Columns[2].ID].AvgColSize(statsTbl.Count, false), Equals, 3.0) + } - addPartition := "alter table t add partition (partition p4 values less than (26))" - testKit.MustExec(addPartition) - is = s.do.InfoSchema() - tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - tableInfo = tbl.Meta() - err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) - c.Assert(h.Update(is), IsNil) - pi = tableInfo.GetPartitionInfo() - for _, def := range pi.Definitions { - statsTbl := h.GetPartitionStats(tableInfo, def.ID) - c.Assert(statsTbl.Pseudo, IsFalse) - } + addPartition := "alter table t add partition (partition p4 values less than (26))" + testKit.MustExec(addPartition) + is = s.do.InfoSchema() + tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo = tbl.Meta() + err = h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(err, IsNil) + c.Assert(h.Update(is), IsNil) + pi = tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + c.Assert(statsTbl.Pseudo, IsFalse) + } - truncatePartition := "alter table t truncate partition p4" - testKit.MustExec(truncatePartition) - is = s.do.InfoSchema() - tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - tableInfo = tbl.Meta() - err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) - c.Assert(h.Update(is), IsNil) - pi = tableInfo.GetPartitionInfo() - for _, def := range pi.Definitions { - statsTbl := h.GetPartitionStats(tableInfo, def.ID) - c.Assert(statsTbl.Pseudo, IsFalse) - } + truncatePartition := "alter table t truncate partition p4" + testKit.MustExec(truncatePartition) + is = s.do.InfoSchema() + tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo = tbl.Meta() + err = h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(err, IsNil) + c.Assert(h.Update(is), IsNil) + pi = tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + c.Assert(statsTbl.Pseudo, IsFalse) + } + }) } diff --git a/statistics/handle/gc_test.go b/statistics/handle/gc_test.go index 733fbfebe31ca..63b9013561b69 100644 --- a/statistics/handle/gc_test.go +++ b/statistics/handle/gc_test.go @@ -18,6 +18,7 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util/testkit" ) @@ -57,37 +58,39 @@ func (s *testStatsSuite) TestGCStats(c *C) { func (s *testStatsSuite) TestGCPartition(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.MustExec("set @@session.tidb_enable_table_partition=1") - testKit.MustExec(`create table t (a bigint(64), b bigint(64), index idx(a, b)) + testkit.WithPruneMode(testKit, variable.StaticOnly, func() { + testKit.MustExec("use test") + testKit.MustExec("set @@session.tidb_enable_table_partition=1") + testKit.MustExec(`create table t (a bigint(64), b bigint(64), index idx(a, b)) partition by range (a) ( partition p0 values less than (3), partition p1 values less than (6))`) - testKit.MustExec("insert into t values (1,2),(2,3),(3,4),(4,5),(5,6)") - testKit.MustExec("analyze table t") + testKit.MustExec("insert into t values (1,2),(2,3),(3,4),(4,5),(5,6)") + testKit.MustExec("analyze table t") - testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("6")) - testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("15")) - h := s.do.StatsHandle() - h.SetLastUpdateVersion(math.MaxUint64) - ddlLease := time.Duration(0) - testKit.MustExec("alter table t drop index idx") - c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) - testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("4")) - testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("10")) + testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("6")) + testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("15")) + h := s.do.StatsHandle() + h.SetLastUpdateVersion(math.MaxUint64) + ddlLease := time.Duration(0) + testKit.MustExec("alter table t drop index idx") + c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("4")) + testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("10")) - testKit.MustExec("alter table t drop column b") - c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) - testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("2")) - testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("5")) + testKit.MustExec("alter table t drop column b") + c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("2")) + testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("5")) - testKit.MustExec("drop table t") - c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) - testKit.MustQuery("select count(*) from mysql.stats_meta").Check(testkit.Rows("2")) - testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("0")) - testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("0")) - c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) - testKit.MustQuery("select count(*) from mysql.stats_meta").Check(testkit.Rows("0")) + testKit.MustExec("drop table t") + c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + testKit.MustQuery("select count(*) from mysql.stats_meta").Check(testkit.Rows("2")) + testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("0")) + testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("0")) + c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + testKit.MustQuery("select count(*) from mysql.stats_meta").Check(testkit.Rows("0")) + }) } func (s *testStatsSuite) TestGCExtendedStats(c *C) { diff --git a/statistics/handle/handle.go b/statistics/handle/handle.go index 451392b2421ec..2eaa839037e17 100644 --- a/statistics/handle/handle.go +++ b/statistics/handle/handle.go @@ -33,6 +33,7 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/table" @@ -275,26 +276,6 @@ func (h *Handle) GetPartitionStats(tblInfo *model.TableInfo, pid int64) *statist return tbl } -// CanRuntimePrune indicates whether tbl support runtime prune for table and first partition id. -func (h *Handle) CanRuntimePrune(tid, p0Id int64) bool { - if h == nil { - return false - } - if tid == p0Id { - return false - } - statsCache := h.statsCache.Load().(statsCache) - _, tblExists := statsCache.tables[tid] - if tblExists { - return true - } - _, partExists := statsCache.tables[p0Id] - if !partExists { - return true - } - return false -} - func (h *Handle) updateStatsCache(newCache statsCache) { h.statsCache.Lock() oldCache := h.statsCache.Load().(statsCache) @@ -1124,3 +1105,17 @@ func (h *Handle) SaveExtendedStatsToStorage(tableID int64, extStats *statistics. } return execSQLs(ctx, exec, sqls) } + +// CurrentPruneMode indicates whether tbl support runtime prune for table and first partition id. +func (h *Handle) CurrentPruneMode() variable.PartitionPruneMode { + h.mu.Lock() + defer h.mu.Unlock() + return variable.PartitionPruneMode(h.mu.ctx.GetSessionVars().PartitionPruneMode.Load()) +} + +// RefreshVars uses to pull PartitionPruneMethod vars from kv storage. +func (h *Handle) RefreshVars() error { + h.mu.Lock() + defer h.mu.Unlock() + return h.mu.ctx.RefreshVars(context.Background()) +} diff --git a/statistics/handle/update.go b/statistics/handle/update.go index d786f670291d5..28f331761f9fa 100644 --- a/statistics/handle/update.go +++ b/statistics/handle/update.go @@ -741,7 +741,8 @@ func (h *Handle) HandleAutoAnalyze(is infoschema.InfoSchema) { for _, tbl := range tbls { tblInfo := tbl.Meta() pi := tblInfo.GetPartitionInfo() - if pi == nil { + pruneMode := h.CurrentPruneMode() + if pi == nil || pruneMode == variable.DynamicOnly || pruneMode == variable.StaticButPrepareDynamic { statsTbl := h.GetTableStats(tblInfo) sql := "analyze table `" + db + "`.`" + tblInfo.Name.O + "`" analyzed := h.autoAnalyzeTable(tblInfo, statsTbl, start, end, autoAnalyzeRatio, sql) @@ -750,12 +751,15 @@ func (h *Handle) HandleAutoAnalyze(is infoschema.InfoSchema) { } continue } - for _, def := range pi.Definitions { - sql := "analyze table `" + db + "`.`" + tblInfo.Name.O + "`" + " partition `" + def.Name.O + "`" - statsTbl := h.GetPartitionStats(tblInfo, def.ID) - analyzed := h.autoAnalyzeTable(tblInfo, statsTbl, start, end, autoAnalyzeRatio, sql) - if analyzed { - return + if h.CurrentPruneMode() == variable.StaticOnly || pruneMode == variable.StaticButPrepareDynamic { + for _, def := range pi.Definitions { + sql := "analyze table `" + db + "`.`" + tblInfo.Name.O + "`" + " partition `" + def.Name.O + "`" + statsTbl := h.GetPartitionStats(tblInfo, def.ID) + analyzed := h.autoAnalyzeTable(tblInfo, statsTbl, start, end, autoAnalyzeRatio, sql) + if analyzed { + return + } + continue } continue } diff --git a/statistics/handle/update_test.go b/statistics/handle/update_test.go index 5c9777c03e40d..25c9b933c7854 100644 --- a/statistics/handle/update_test.go +++ b/statistics/handle/update_test.go @@ -371,134 +371,139 @@ func (s *testStatsSuite) TestUpdatePartition(c *C) { func (s *testStatsSuite) TestAutoUpdate(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.MustExec("create table t (a varchar(20))") - - handle.AutoAnalyzeMinCnt = 0 - testKit.MustExec("set global tidb_auto_analyze_ratio = 0.2") - defer func() { - handle.AutoAnalyzeMinCnt = 1000 - testKit.MustExec("set global tidb_auto_analyze_ratio = 0.0") - }() - - do := s.do - is := do.InfoSchema() - tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - tableInfo := tbl.Meta() - h := do.StatsHandle() + testkit.WithPruneMode(testKit, variable.StaticOnly, func() { + testKit.MustExec("use test") + testKit.MustExec("create table t (a varchar(20))") + + handle.AutoAnalyzeMinCnt = 0 + testKit.MustExec("set global tidb_auto_analyze_ratio = 0.2") + defer func() { + handle.AutoAnalyzeMinCnt = 1000 + testKit.MustExec("set global tidb_auto_analyze_ratio = 0.0") + }() + + do := s.do + is := do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo := tbl.Meta() + h := do.StatsHandle() - h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(h.Update(is), IsNil) - stats := h.GetTableStats(tableInfo) - c.Assert(stats.Count, Equals, int64(0)) + h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(h.Update(is), IsNil) + stats := h.GetTableStats(tableInfo) + c.Assert(stats.Count, Equals, int64(0)) - _, err = testKit.Exec("insert into t values ('ss'), ('ss'), ('ss'), ('ss'), ('ss')") - c.Assert(err, IsNil) - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - c.Assert(h.Update(is), IsNil) - h.HandleAutoAnalyze(is) - c.Assert(h.Update(is), IsNil) - stats = h.GetTableStats(tableInfo) - c.Assert(stats.Count, Equals, int64(5)) - c.Assert(stats.ModifyCount, Equals, int64(0)) - for _, item := range stats.Columns { - // TotColSize = 5*(2(length of 'ss') + 1(size of len byte)). - c.Assert(item.TotColSize, Equals, int64(15)) - break - } + _, err = testKit.Exec("insert into t values ('ss'), ('ss'), ('ss'), ('ss'), ('ss')") + c.Assert(err, IsNil) + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(h.Update(is), IsNil) + h.HandleAutoAnalyze(is) + c.Assert(h.Update(is), IsNil) + stats = h.GetTableStats(tableInfo) + c.Assert(stats.Count, Equals, int64(5)) + c.Assert(stats.ModifyCount, Equals, int64(0)) + for _, item := range stats.Columns { + // TotColSize = 5*(2(length of 'ss') + 1(size of len byte)). + c.Assert(item.TotColSize, Equals, int64(15)) + break + } - // Test that even if the table is recently modified, we can still analyze the table. - h.SetLease(time.Second) - defer func() { h.SetLease(0) }() - _, err = testKit.Exec("insert into t values ('fff')") - c.Assert(err, IsNil) - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - c.Assert(h.Update(is), IsNil) - h.HandleAutoAnalyze(is) - c.Assert(h.Update(is), IsNil) - stats = h.GetTableStats(tableInfo) - c.Assert(stats.Count, Equals, int64(6)) - c.Assert(stats.ModifyCount, Equals, int64(1)) + // Test that even if the table is recently modified, we can still analyze the table. + h.SetLease(time.Second) + defer func() { h.SetLease(0) }() + _, err = testKit.Exec("insert into t values ('fff')") + c.Assert(err, IsNil) + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(h.Update(is), IsNil) + h.HandleAutoAnalyze(is) + c.Assert(h.Update(is), IsNil) + stats = h.GetTableStats(tableInfo) + c.Assert(stats.Count, Equals, int64(6)) + c.Assert(stats.ModifyCount, Equals, int64(1)) - _, err = testKit.Exec("insert into t values ('fff')") - c.Assert(err, IsNil) - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - c.Assert(h.Update(is), IsNil) - h.HandleAutoAnalyze(is) - c.Assert(h.Update(is), IsNil) - stats = h.GetTableStats(tableInfo) - c.Assert(stats.Count, Equals, int64(7)) - c.Assert(stats.ModifyCount, Equals, int64(0)) + _, err = testKit.Exec("insert into t values ('fff')") + c.Assert(err, IsNil) + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(h.Update(is), IsNil) + h.HandleAutoAnalyze(is) + c.Assert(h.Update(is), IsNil) + stats = h.GetTableStats(tableInfo) + c.Assert(stats.Count, Equals, int64(7)) + c.Assert(stats.ModifyCount, Equals, int64(0)) - _, err = testKit.Exec("insert into t values ('eee')") - c.Assert(err, IsNil) - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - c.Assert(h.Update(is), IsNil) - h.HandleAutoAnalyze(is) - c.Assert(h.Update(is), IsNil) - stats = h.GetTableStats(tableInfo) - c.Assert(stats.Count, Equals, int64(8)) - // Modify count is non-zero means that we do not analyze the table. - c.Assert(stats.ModifyCount, Equals, int64(1)) - for _, item := range stats.Columns { - // TotColSize = 27, because the table has not been analyzed, and insert statement will add 3(length of 'eee') to TotColSize. - c.Assert(item.TotColSize, Equals, int64(27)) - break - } + _, err = testKit.Exec("insert into t values ('eee')") + c.Assert(err, IsNil) + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(h.Update(is), IsNil) + h.HandleAutoAnalyze(is) + c.Assert(h.Update(is), IsNil) + stats = h.GetTableStats(tableInfo) + c.Assert(stats.Count, Equals, int64(8)) + // Modify count is non-zero means that we do not analyze the table. + c.Assert(stats.ModifyCount, Equals, int64(1)) + for _, item := range stats.Columns { + // TotColSize = 27, because the table has not been analyzed, and insert statement will add 3(length of 'eee') to TotColSize. + c.Assert(item.TotColSize, Equals, int64(27)) + break + } - testKit.MustExec("analyze table t") - _, err = testKit.Exec("create index idx on t(a)") - c.Assert(err, IsNil) - is = do.InfoSchema() - tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - tableInfo = tbl.Meta() - h.HandleAutoAnalyze(is) - c.Assert(h.Update(is), IsNil) - stats = h.GetTableStats(tableInfo) - c.Assert(stats.Count, Equals, int64(8)) - c.Assert(stats.ModifyCount, Equals, int64(0)) - hg, ok := stats.Indices[tableInfo.Indices[0].ID] - c.Assert(ok, IsTrue) - c.Assert(hg.NDV, Equals, int64(3)) - c.Assert(hg.Len(), Equals, 3) + testKit.MustExec("analyze table t") + _, err = testKit.Exec("create index idx on t(a)") + c.Assert(err, IsNil) + is = do.InfoSchema() + tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo = tbl.Meta() + h.HandleAutoAnalyze(is) + c.Assert(h.Update(is), IsNil) + stats = h.GetTableStats(tableInfo) + c.Assert(stats.Count, Equals, int64(8)) + c.Assert(stats.ModifyCount, Equals, int64(0)) + hg, ok := stats.Indices[tableInfo.Indices[0].ID] + c.Assert(ok, IsTrue) + c.Assert(hg.NDV, Equals, int64(3)) + c.Assert(hg.Len(), Equals, 3) + }) } func (s *testStatsSuite) TestAutoUpdatePartition(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.MustExec("drop table if exists t") - testKit.MustExec("create table t (a int) PARTITION BY RANGE (a) (PARTITION p0 VALUES LESS THAN (6))") - testKit.MustExec("analyze table t") - - handle.AutoAnalyzeMinCnt = 0 - testKit.MustExec("set global tidb_auto_analyze_ratio = 0.6") - defer func() { - handle.AutoAnalyzeMinCnt = 1000 - testKit.MustExec("set global tidb_auto_analyze_ratio = 0.0") - }() - - do := s.do - is := do.InfoSchema() - tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - tableInfo := tbl.Meta() - pi := tableInfo.GetPartitionInfo() - h := do.StatsHandle() + testkit.WithPruneMode(testKit, variable.StaticOnly, func() { + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t (a int) PARTITION BY RANGE (a) (PARTITION p0 VALUES LESS THAN (6))") + testKit.MustExec("analyze table t") + + handle.AutoAnalyzeMinCnt = 0 + testKit.MustExec("set global tidb_auto_analyze_ratio = 0.6") + defer func() { + handle.AutoAnalyzeMinCnt = 1000 + testKit.MustExec("set global tidb_auto_analyze_ratio = 0.0") + }() + + do := s.do + is := do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo := tbl.Meta() + pi := tableInfo.GetPartitionInfo() + h := do.StatsHandle() + c.Assert(h.RefreshVars(), IsNil) - c.Assert(h.Update(is), IsNil) - stats := h.GetPartitionStats(tableInfo, pi.Definitions[0].ID) - c.Assert(stats.Count, Equals, int64(0)) + c.Assert(h.Update(is), IsNil) + stats := h.GetPartitionStats(tableInfo, pi.Definitions[0].ID) + c.Assert(stats.Count, Equals, int64(0)) - testKit.MustExec("insert into t values (1)") - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - c.Assert(h.Update(is), IsNil) - h.HandleAutoAnalyze(is) - stats = h.GetPartitionStats(tableInfo, pi.Definitions[0].ID) - c.Assert(stats.Count, Equals, int64(1)) - c.Assert(stats.ModifyCount, Equals, int64(0)) + testKit.MustExec("insert into t values (1)") + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(h.Update(is), IsNil) + h.HandleAutoAnalyze(is) + stats = h.GetPartitionStats(tableInfo, pi.Definitions[0].ID) + c.Assert(stats.Count, Equals, int64(1)) + c.Assert(stats.ModifyCount, Equals, int64(0)) + }) } func (s *testStatsSuite) TestTableAnalyzed(c *C) { diff --git a/util/mock/context.go b/util/mock/context.go index 79d307156b055..d0ec81c7e4d6c 100644 --- a/util/mock/context.go +++ b/util/mock/context.go @@ -163,6 +163,11 @@ func (c *Context) RefreshTxnCtx(ctx context.Context) error { return errors.Trace(c.NewTxn(ctx)) } +// RefreshVars implements the sessionctx.Context interface. +func (c *Context) RefreshVars(ctx context.Context) error { + return nil +} + // InitTxnWithStartTS implements the sessionctx.Context interface with startTS. func (c *Context) InitTxnWithStartTS(startTS uint64) error { if c.txn.Valid() { diff --git a/util/testkit/testkit.go b/util/testkit/testkit.go index e5f76ec4d64dd..f586e2a18d1d3 100644 --- a/util/testkit/testkit.go +++ b/util/testkit/testkit.go @@ -30,6 +30,7 @@ import ( "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/testutil" @@ -326,3 +327,10 @@ func (tk *TestKit) GetTableID(tableName string) int64 { tk.c.Assert(err, check.IsNil) return tbl.Meta().ID } + +// WithPruneMode run test case under prune mode. +func WithPruneMode(tk *TestKit, mode variable.PartitionPruneMode, f func()) { + tk.MustExec("set @@tidb_partition_prune_mode=`" + string(mode) + "`") + tk.MustExec("set global tidb_partition_prune_mode=`" + string(mode) + "`") + f() +} From eb81a67b33e763b8ba94f8176b77ce70d931f7a5 Mon Sep 17 00:00:00 2001 From: "Zhuomin(Charming) Liu" Date: Wed, 30 Sep 2020 13:00:09 +0800 Subject: [PATCH 59/60] expression: fix overflow error when convert bit to int64 (#20266) --- planner/core/expression_rewriter_test.go | 9 +++++++++ types/datum.go | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/planner/core/expression_rewriter_test.go b/planner/core/expression_rewriter_test.go index 6179d912cf0a2..54497936cb7df 100644 --- a/planner/core/expression_rewriter_test.go +++ b/planner/core/expression_rewriter_test.go @@ -239,6 +239,15 @@ func (s *testExpressionRewriterSuite) TestCompareSubquery(c *C) { " 2", )) tk.MustQuery("select * from t t1 where b = all (select a from t t2)").Check(testkit.Rows()) + + // for issue 20059 + tk.MustExec("DROP TABLE IF EXISTS `t`") + tk.MustExec("CREATE TABLE `t` ( `a` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") + tk.MustExec("INSERT INTO `t` VALUES (1);") + tk.MustExec("DROP TABLE IF EXISTS `table_40_utf8_4`;") + tk.MustExec("CREATE TABLE `table_40_utf8_4` (`col_tinyint_key_unsigned` tinyint(4) DEFAULT NULL, `col_bit64_key_signed` bit(64) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;") + tk.MustExec("INSERT INTO `table_40_utf8_4` VALUES (31, -18);") + tk.MustQuery("select count(1) from table_40_utf8_4 where ( select count(1) from t where table_40_utf8_4.col_bit64_key_signed!=table_40_utf8_4.col_tinyint_key_unsigned)").Check(testkit.Rows("1")) } func (s *testExpressionRewriterSuite) TestCheckFullGroupBy(c *C) { diff --git a/types/datum.go b/types/datum.go index fbccd3bdfedaa..03982a0b171e3 100644 --- a/types/datum.go +++ b/types/datum.go @@ -1577,6 +1577,11 @@ func (d *Datum) ToDecimal(sc *stmtctx.StatementContext) (*MyDecimal, error) { // ToInt64 converts to a int64. func (d *Datum) ToInt64(sc *stmtctx.StatementContext) (int64, error) { + switch d.Kind() { + case KindMysqlBit: + uintVal, err := d.GetBinaryLiteral().ToInt(sc) + return int64(uintVal), err + } return d.toSignedInteger(sc, mysql.TypeLonglong) } From 03c6b5ab9efcf9abe3621d4ce9244ac56d90755b Mon Sep 17 00:00:00 2001 From: YangKian <45479280+YangKian@users.noreply.github.com> Date: Wed, 30 Sep 2020 14:14:20 +0800 Subject: [PATCH 60/60] go.mod: update parser to support TABLES and VALUES statement (#20314) --- go.mod | 5 +++-- go.sum | 8 ++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index d8baecbe2f4d2..74c870fed9007 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 github.com/pingcap/kvproto v0.0.0-20200828054126-d677e6fd224a github.com/pingcap/log v0.0.0-20200828042413-fce0951f1463 - github.com/pingcap/parser v0.0.0-20200924053142-5d7e8ebf605e + github.com/pingcap/parser v0.0.0-20200929032957-9678b2b7cefb github.com/pingcap/sysutil v0.0.0-20200715082929-4c47bcac246a github.com/pingcap/tidb-tools v4.0.5-0.20200820092506-34ea90c93237+incompatible github.com/pingcap/tipb v0.0.0-20200618092958-4fad48b4c8c3 @@ -52,8 +52,9 @@ require ( github.com/uber-go/atomic v1.3.2 github.com/uber/jaeger-client-go v2.22.1+incompatible go.etcd.io/etcd v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738 - go.uber.org/atomic v1.6.0 + go.uber.org/atomic v1.7.0 go.uber.org/automaxprocs v1.2.0 + go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.16.0 golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 diff --git a/go.sum b/go.sum index 1a13096c1705e..64d2e1dcd7886 100644 --- a/go.sum +++ b/go.sum @@ -507,8 +507,8 @@ github.com/pingcap/parser v0.0.0-20200730092557-34a468e9b774/go.mod h1:vQdbJqobJ github.com/pingcap/parser v0.0.0-20200731033026-84f62115187c/go.mod h1:vQdbJqobJAgFyiRNNtXahpMoGWwPEuWciVEK5A20NS0= github.com/pingcap/parser v0.0.0-20200813083329-a4bff035d3e2/go.mod h1:vQdbJqobJAgFyiRNNtXahpMoGWwPEuWciVEK5A20NS0= github.com/pingcap/parser v0.0.0-20200821073936-cf85e80665c4/go.mod h1:vQdbJqobJAgFyiRNNtXahpMoGWwPEuWciVEK5A20NS0= -github.com/pingcap/parser v0.0.0-20200924053142-5d7e8ebf605e h1:IFD2pEbIcN+EzG/RGMLrv/Tt6U9KzJGT6hSbGkQ1v7c= -github.com/pingcap/parser v0.0.0-20200924053142-5d7e8ebf605e/go.mod h1:RlLfMRJwFBSiXd2lUaWdV5pSXtrpyvZM8k5bbZWsheU= +github.com/pingcap/parser v0.0.0-20200929032957-9678b2b7cefb h1:Nlswd41UZDaedHNysE/lb8dc3EpmWAApf480qU2N3nU= +github.com/pingcap/parser v0.0.0-20200929032957-9678b2b7cefb/go.mod h1:RlLfMRJwFBSiXd2lUaWdV5pSXtrpyvZM8k5bbZWsheU= github.com/pingcap/pd/v4 v4.0.0-rc.1.0.20200422143320-428acd53eba2/go.mod h1:s+utZtXDznOiL24VK0qGmtoHjjXNsscJx3m1n8cC56s= github.com/pingcap/pd/v4 v4.0.0-rc.2.0.20200520083007-2c251bd8f181/go.mod h1:q4HTx/bA8aKBa4S7L+SQKHvjRPXCRV0tA0yRw0qkZSA= github.com/pingcap/pd/v4 v4.0.0-rc.2.0.20200714122454-1a64f969cb3c/go.mod h1:v/dY4mVkt3dh/Liphhk0E4ScOkZpIk0m0GvWJ9FapDs= @@ -700,6 +700,8 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.2.0 h1:+RUihKM+nmYUoB9w0D0Ov5TJ2PpFO2FgenTxMJiZBZA= go.uber.org/automaxprocs v1.2.0/go.mod h1:YfO3fm683kQpzETxlTGZhGIVmXAhaw3gxeBADbpZtnU= go.uber.org/dig v1.8.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= @@ -711,6 +713,8 @@ go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+ go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=