From c9312439c916a04ecf82528efeed286bf2928a4e Mon Sep 17 00:00:00 2001 From: Fourier <437981373@qq.com> Date: Wed, 11 May 2022 17:38:28 +0800 Subject: [PATCH 01/42] add a hint for CTE I want to insert a hint for CTE-inline, but the Optimizer doesn't find the hint which I code. --- planner/core/logical_plan_builder.go | 50 ++++++++++++++++++++++++++++ planner/core/logical_plans.go | 2 ++ planner/core/planbuilder.go | 7 ++++ 3 files changed, 59 insertions(+) diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 0360a46e7382e..be38d92052518 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -111,6 +111,9 @@ const ( HintIgnorePlanCache = "ignore_plan_cache" // HintLimitToCop is a hint enforce pushing limit or topn to coprocessor. HintLimitToCop = "limit_to_cop" + //HintCTEInline is a hint which can switch turning inline or materializing for the CTE. + //code by dyp + HintCTEInline = "cte_inline" ) const ( @@ -3507,6 +3510,7 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev aggHints aggHintInfo timeRangeHint ast.HintTimeRange limitHints limitHintInfo + CTEHints CTEHintInfo ) for _, hint := range hints { // Set warning for the hint that requires the table name. @@ -3609,6 +3613,10 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev timeRangeHint = hint.HintData.(ast.HintTimeRange) case HintLimitToCop: limitHints.preferLimitToCop = true + //make CTEHints struct + //code by dyp + case HintCTEInline: + CTEHints.preferInlineToCTE = true default: // ignore hints that not implemented } @@ -3625,6 +3633,7 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev indexMergeHintList: indexMergeHintList, timeRangeHint: timeRangeHint, limitHints: limitHints, + CTEHints: CTEHints, }) } @@ -4126,6 +4135,22 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName lp := LogicalCTE{cteAsName: tn.Name, cte: cte.cteClass, seedStat: cte.seedStat, isOuterMostCTE: !b.buildingCTE}.Init(b.ctx, b.getSelectOffset()) prevSchema := cte.seedLP.Schema().Clone() lp.SetSchema(getResultCTESchema(cte.seedLP.Schema(), b.ctx.GetSessionVars())) + // 这里设置logical cte ,有设置的ctehints参数,判断是否是递归cte来通过hint选择 + //make cteinline is ture, that will use merge way to run + //by dyp + // if hint is inline + if hint := b.TableHints(); hint != nil { + lp.CTEHints = hint.CTEHints + } + if lp.CTEHints.preferInlineToCTE == true { + saveCte := b.outerCTEs[i:] + b.outerCTEs = b.outerCTEs[:i] + defer func() { + b.outerCTEs = append(b.outerCTEs, saveCte...) + }() + return b.buildDataSourceFromCTEInline(ctx, cte.def) + } + for i, col := range lp.schema.Columns { lp.cte.ColumnMap[string(col.HashCode(nil))] = prevSchema.Columns[i] } @@ -4148,6 +4173,31 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName return nil, nil } +// build CTE_inline +//code by dyp +func (b *PlanBuilder) buildDataSourceFromCTEInline(ctx context.Context, cte *ast.CommonTableExpression) (LogicalPlan, error) { + p, err := b.buildResultSetNode(ctx, cte.Query.Query) + if err != nil { + return nil, err + } + outPutNames := p.OutputNames() + for _, name := range outPutNames { + name.TblName = cte.Name + name.DBName = model.NewCIStr(b.ctx.GetSessionVars().CurrentDB) + } + + if len(cte.ColNameList) > 0 { + if len(cte.ColNameList) != len(p.OutputNames()) { + return nil, errors.New("CTE columns length is not consistent.") + } + for i, n := range cte.ColNameList { + outPutNames[i].ColName = n + } + } + p.SetOutputNames(outPutNames) + return p, nil +} + func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, asName *model.CIStr) (LogicalPlan, error) { dbName := tn.Schema sessionVars := b.ctx.GetSessionVars() diff --git a/planner/core/logical_plans.go b/planner/core/logical_plans.go index 2f22dd3c9a3bd..0c5bf23d0e112 100644 --- a/planner/core/logical_plans.go +++ b/planner/core/logical_plans.go @@ -1865,6 +1865,8 @@ type LogicalCTE struct { cteAsName model.CIStr seedStat *property.StatsInfo isOuterMostCTE bool + //code by dyp + CTEHints CTEHintInfo } // LogicalCTETable is for CTE table diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index 11436eaa0945d..daaba10a5a14c 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -97,12 +97,19 @@ type tableHintInfo struct { indexMergeHintList []indexHintInfo timeRangeHint ast.HintTimeRange limitHints limitHintInfo + //code by dyp + CTEHints CTEHintInfo } type limitHintInfo struct { preferLimitToCop bool } +//code by dyp +type CTEHintInfo struct { + preferInlineToCTE bool +} + type hintTableInfo struct { dbName model.CIStr tblName model.CIStr From cd8bb914c5431087b910e1c5f367f6ac74de8012 Mon Sep 17 00:00:00 2001 From: Fourier <437981373@qq.com> Date: Thu, 12 May 2022 00:41:36 +0800 Subject: [PATCH 02/42] add parser 's change for hint only insert some var --- parser/ast/misc.go | 2 +- parser/ast/misc_test.go | 1 + parser/hintparser.go | 3 +++ parser/hintparser.y | 3 +++ parser/misc.go | 1 + parser/parser_test.go | 10 ++++++++++ 6 files changed, 19 insertions(+), 1 deletion(-) diff --git a/parser/ast/misc.go b/parser/ast/misc.go index ab42cfbc13192..97b2261cf7228 100644 --- a/parser/ast/misc.go +++ b/parser/ast/misc.go @@ -3417,7 +3417,7 @@ func (n *TableOptimizerHint) Restore(ctx *format.RestoreCtx) error { } // Hints without args except query block. switch n.HintName.L { - case "hash_agg", "stream_agg", "agg_to_cop", "read_consistent_replica", "no_index_merge", "qb_name", "ignore_plan_cache", "limit_to_cop": + case "hash_agg", "stream_agg", "agg_to_cop", "read_consistent_replica", "no_index_merge", "qb_name", "ignore_plan_cache", "limit_to_cop", "cte_inline": ctx.WritePlain(")") return nil } diff --git a/parser/ast/misc_test.go b/parser/ast/misc_test.go index 7b7df348f86fa..348c3304c7ff9 100644 --- a/parser/ast/misc_test.go +++ b/parser/ast/misc_test.go @@ -265,6 +265,7 @@ func TestTableOptimizerHintRestore(t *testing.T) { {"AGG_TO_COP()", "AGG_TO_COP()"}, {"AGG_TO_COP(@sel_1)", "AGG_TO_COP(@`sel_1`)"}, {"LIMIT_TO_COP()", "LIMIT_TO_COP()"}, + {"CTE_INLINE()", "CTE_INLINE()"}, {"NO_INDEX_MERGE()", "NO_INDEX_MERGE()"}, {"NO_INDEX_MERGE(@sel1)", "NO_INDEX_MERGE(@`sel1`)"}, {"READ_CONSISTENT_REPLICA()", "READ_CONSISTENT_REPLICA()"}, diff --git a/parser/hintparser.go b/parser/hintparser.go index 4020f5832970d..2ce7d22ef2316 100644 --- a/parser/hintparser.go +++ b/parser/hintparser.go @@ -69,6 +69,7 @@ const ( hintJoinPrefix = 57353 hintJoinSuffix = 57354 hintLimitToCop = 57400 + hintCTEInline = 57449 hintLooseScan = 57413 hintMB = 57409 hintMRR = 57365 @@ -232,6 +233,7 @@ var ( 57415: 109, // $default (0x) 57345: 110, // error (0x) 57348: 111, // hintInvalid (0x) + 57449: 112, // hintCTEInline (121x) } yyhintSymNames = []string{ @@ -347,6 +349,7 @@ var ( "$default", "error", "hintInvalid", + "HintCTEInline", } yyhintReductions = []struct{ xsym, components int }{ diff --git a/parser/hintparser.y b/parser/hintparser.y index 332d53eb7379e..9fb91f8d8ee1b 100644 --- a/parser/hintparser.y +++ b/parser/hintparser.y @@ -104,6 +104,7 @@ import ( hintUseCascades "USE_CASCADES" hintNthPlan "NTH_PLAN" hintLimitToCop "LIMIT_TO_COP" + hintCTEInline "CTE_INLINE" hintForceIndex "FORCE_INDEX" /* Other keywords */ @@ -576,6 +577,7 @@ NullaryHintName: | "STREAM_AGG" | "AGG_TO_COP" | "LIMIT_TO_COP" +| "CTE_INLINE" | "NO_INDEX_MERGE" | "READ_CONSISTENT_REPLICA" | "IGNORE_PLAN_CACHE" @@ -620,6 +622,7 @@ Identifier: /* TiDB hint names */ | "AGG_TO_COP" | "LIMIT_TO_COP" +| "CTE_INLINE" | "IGNORE_PLAN_CACHE" | "HASH_AGG" | "IGNORE_INDEX" diff --git a/parser/misc.go b/parser/misc.go index d52563142c84e..ed3f08fa66c11 100644 --- a/parser/misc.go +++ b/parser/misc.go @@ -910,6 +910,7 @@ var hintTokenMap = map[string]int{ // TiDB hint names "AGG_TO_COP": hintAggToCop, "LIMIT_TO_COP": hintLimitToCop, + "CTE_INLINE": hintCTEInline, "IGNORE_PLAN_CACHE": hintIgnorePlanCache, "HASH_AGG": hintHashAgg, "IGNORE_INDEX": hintIgnoreIndex, diff --git a/parser/parser_test.go b/parser/parser_test.go index 689f90ad3b155..c914f88b904eb 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -4192,6 +4192,16 @@ func TestOptimizerHints(t *testing.T) { require.Len(t, hints, 2) require.Equal(t, "limit_to_cop", hints[0].HintName.L) require.Equal(t, "limit_to_cop", hints[1].HintName.L) + + // Test CTE_INLINE + stmt, _, err = p.Parse("with cte(x) as (select /*+ CTE_INLINE(), cte_inline() */ * from t1) select * from cte;", "", "") + require.NoError(t, err) + selectStmt = stmt[0].(*ast.SelectStmt) + + hints = selectStmt.TableHints + require.Len(t, hints, 2) + require.Equal(t, "cte_inline", hints[0].HintName.L) + require.Equal(t, "cte_inline", hints[1].HintName.L) } func TestType(t *testing.T) { From f935e531f43faae86f625774b3e34524e0aedcfa Mon Sep 17 00:00:00 2001 From: Fourier <437981373@qq.com> Date: Thu, 12 May 2022 10:14:46 +0800 Subject: [PATCH 03/42] fix parser mistake for cteinline I fix my mistake , and remake the hintparser.y --- parser/hintparser.go | 1068 +++++++++++++++++++++--------------------- parser/hintparser.y | 4 +- 2 files changed, 538 insertions(+), 534 deletions(-) diff --git a/parser/hintparser.go b/parser/hintparser.go index 2ce7d22ef2316..61d56539dffa0 100644 --- a/parser/hintparser.go +++ b/parser/hintparser.go @@ -41,18 +41,19 @@ type yyhintXError struct { } const ( - yyhintDefault = 57415 + yyhintDefault = 57416 yyhintEOFCode = 57344 yyhintErrCode = 57345 hintAggToCop = 57377 hintBCJoin = 57390 hintBKA = 57355 hintBNL = 57357 - hintDupsWeedOut = 57411 - hintFalse = 57407 - hintFirstMatch = 57412 - hintForceIndex = 57401 - hintGB = 57410 + hintCTEInline = 57401 + hintDupsWeedOut = 57412 + hintFalse = 57408 + hintFirstMatch = 57413 + hintForceIndex = 57402 + hintGB = 57411 hintHashAgg = 57379 hintHashJoin = 57359 hintIdentifier = 57347 @@ -69,11 +70,10 @@ const ( hintJoinPrefix = 57353 hintJoinSuffix = 57354 hintLimitToCop = 57400 - hintCTEInline = 57449 - hintLooseScan = 57413 - hintMB = 57409 + hintLooseScan = 57414 + hintMB = 57410 hintMRR = 57365 - hintMaterialization = 57414 + hintMaterialization = 57415 hintMaxExecutionTime = 57373 hintMemoryQuota = 57384 hintMerge = 57361 @@ -89,9 +89,9 @@ const ( hintNoSkipScan = 57370 hintNoSwapJoinInputs = 57385 hintNthPlan = 57399 - hintOLAP = 57402 - hintOLTP = 57403 - hintPartition = 57404 + hintOLAP = 57403 + hintOLTP = 57404 + hintPartition = 57405 hintQBName = 57376 hintQueryType = 57386 hintReadConsistentReplica = 57387 @@ -105,10 +105,10 @@ const ( hintStreamAgg = 57391 hintStringLit = 57350 hintSwapJoinInputs = 57392 - hintTiFlash = 57406 - hintTiKV = 57405 + hintTiFlash = 57407 + hintTiKV = 57406 hintTimeRange = 57397 - hintTrue = 57408 + hintTrue = 57409 hintUseCascades = 57398 hintUseIndex = 57394 hintUseIndexMerge = 57393 @@ -116,124 +116,124 @@ const ( hintUseToja = 57396 yyhintMaxDepth = 200 - yyhintTabOfs = -170 + yyhintTabOfs = -172 ) var ( yyhintXLAT = map[int]int{ - 41: 0, // ')' (129x) - 57377: 1, // hintAggToCop (121x) - 57390: 2, // hintBCJoin (121x) - 57355: 3, // hintBKA (121x) - 57357: 4, // hintBNL (121x) - 57401: 5, // hintForceIndex (121x) - 57379: 6, // hintHashAgg (121x) - 57359: 7, // hintHashJoin (121x) - 57380: 8, // hintIgnoreIndex (121x) - 57378: 9, // hintIgnorePlanCache (121x) - 57363: 10, // hintIndexMerge (121x) - 57381: 11, // hintInlHashJoin (121x) - 57382: 12, // hintInlJoin (121x) - 57383: 13, // hintInlMergeJoin (121x) - 57351: 14, // hintJoinFixedOrder (121x) - 57352: 15, // hintJoinOrder (121x) - 57353: 16, // hintJoinPrefix (121x) - 57354: 17, // hintJoinSuffix (121x) - 57400: 18, // hintLimitToCop (121x) - 57373: 19, // hintMaxExecutionTime (121x) - 57384: 20, // hintMemoryQuota (121x) - 57361: 21, // hintMerge (121x) - 57365: 22, // hintMRR (121x) - 57356: 23, // hintNoBKA (121x) - 57358: 24, // hintNoBNL (121x) - 57360: 25, // hintNoHashJoin (121x) - 57367: 26, // hintNoICP (121x) - 57364: 27, // hintNoIndexMerge (121x) - 57362: 28, // hintNoMerge (121x) - 57366: 29, // hintNoMRR (121x) - 57368: 30, // hintNoRangeOptimization (121x) - 57372: 31, // hintNoSemijoin (121x) - 57370: 32, // hintNoSkipScan (121x) - 57385: 33, // hintNoSwapJoinInputs (121x) - 57399: 34, // hintNthPlan (121x) - 57376: 35, // hintQBName (121x) - 57386: 36, // hintQueryType (121x) - 57387: 37, // hintReadConsistentReplica (121x) - 57388: 38, // hintReadFromStorage (121x) - 57375: 39, // hintResourceGroup (121x) - 57371: 40, // hintSemijoin (121x) - 57374: 41, // hintSetVar (121x) - 57369: 42, // hintSkipScan (121x) - 57389: 43, // hintSMJoin (121x) - 57391: 44, // hintStreamAgg (121x) - 57392: 45, // hintSwapJoinInputs (121x) - 57397: 46, // hintTimeRange (121x) - 57398: 47, // hintUseCascades (121x) - 57394: 48, // hintUseIndex (121x) - 57393: 49, // hintUseIndexMerge (121x) - 57395: 50, // hintUsePlanCache (121x) - 57396: 51, // hintUseToja (121x) - 44: 52, // ',' (119x) - 57411: 53, // hintDupsWeedOut (99x) - 57412: 54, // hintFirstMatch (99x) - 57413: 55, // hintLooseScan (99x) - 57414: 56, // hintMaterialization (99x) - 57406: 57, // hintTiFlash (99x) - 57405: 58, // hintTiKV (99x) - 57407: 59, // hintFalse (98x) - 57402: 60, // hintOLAP (98x) - 57403: 61, // hintOLTP (98x) - 57408: 62, // hintTrue (98x) - 57410: 63, // hintGB (97x) - 57409: 64, // hintMB (97x) - 57347: 65, // hintIdentifier (96x) - 57349: 66, // hintSingleAtIdentifier (81x) - 93: 67, // ']' (75x) - 57404: 68, // hintPartition (69x) - 46: 69, // '.' (65x) - 61: 70, // '=' (65x) - 40: 71, // '(' (60x) - 57344: 72, // $end (24x) - 57435: 73, // QueryBlockOpt (17x) - 57427: 74, // Identifier (13x) - 57346: 75, // hintIntLit (8x) - 57350: 76, // hintStringLit (5x) - 57417: 77, // CommaOpt (4x) - 57423: 78, // HintTable (4x) - 57424: 79, // HintTableList (4x) - 91: 80, // '[' (3x) - 57416: 81, // BooleanHintName (2x) - 57418: 82, // HintIndexList (2x) - 57420: 83, // HintStorageType (2x) - 57421: 84, // HintStorageTypeAndTable (2x) - 57425: 85, // HintTableListOpt (2x) - 57430: 86, // JoinOrderOptimizerHintName (2x) - 57431: 87, // NullaryHintName (2x) - 57434: 88, // PartitionListOpt (2x) - 57437: 89, // StorageOptimizerHintOpt (2x) - 57438: 90, // SubqueryOptimizerHintName (2x) - 57441: 91, // SubqueryStrategy (2x) - 57442: 92, // SupportedIndexLevelOptimizerHintName (2x) - 57443: 93, // SupportedTableLevelOptimizerHintName (2x) - 57444: 94, // TableOptimizerHintOpt (2x) - 57446: 95, // UnsupportedIndexLevelOptimizerHintName (2x) - 57447: 96, // UnsupportedTableLevelOptimizerHintName (2x) - 57419: 97, // HintQueryType (1x) - 57422: 98, // HintStorageTypeAndTableList (1x) - 57426: 99, // HintTrueOrFalse (1x) - 57428: 100, // IndexNameList (1x) - 57429: 101, // IndexNameListOpt (1x) - 57432: 102, // OptimizerHintList (1x) - 57433: 103, // PartitionList (1x) - 57436: 104, // Start (1x) - 57439: 105, // SubqueryStrategies (1x) - 57440: 106, // SubqueryStrategiesOpt (1x) - 57445: 107, // UnitOfBytes (1x) - 57448: 108, // Value (1x) - 57415: 109, // $default (0x) - 57345: 110, // error (0x) - 57348: 111, // hintInvalid (0x) - 57449: 112, // hintCTEInline (121x) + 41: 0, // ')' (130x) + 57377: 1, // hintAggToCop (122x) + 57390: 2, // hintBCJoin (122x) + 57355: 3, // hintBKA (122x) + 57357: 4, // hintBNL (122x) + 57401: 5, // hintCTEInline (122x) + 57402: 6, // hintForceIndex (122x) + 57379: 7, // hintHashAgg (122x) + 57359: 8, // hintHashJoin (122x) + 57380: 9, // hintIgnoreIndex (122x) + 57378: 10, // hintIgnorePlanCache (122x) + 57363: 11, // hintIndexMerge (122x) + 57381: 12, // hintInlHashJoin (122x) + 57382: 13, // hintInlJoin (122x) + 57383: 14, // hintInlMergeJoin (122x) + 57351: 15, // hintJoinFixedOrder (122x) + 57352: 16, // hintJoinOrder (122x) + 57353: 17, // hintJoinPrefix (122x) + 57354: 18, // hintJoinSuffix (122x) + 57400: 19, // hintLimitToCop (122x) + 57373: 20, // hintMaxExecutionTime (122x) + 57384: 21, // hintMemoryQuota (122x) + 57361: 22, // hintMerge (122x) + 57365: 23, // hintMRR (122x) + 57356: 24, // hintNoBKA (122x) + 57358: 25, // hintNoBNL (122x) + 57360: 26, // hintNoHashJoin (122x) + 57367: 27, // hintNoICP (122x) + 57364: 28, // hintNoIndexMerge (122x) + 57362: 29, // hintNoMerge (122x) + 57366: 30, // hintNoMRR (122x) + 57368: 31, // hintNoRangeOptimization (122x) + 57372: 32, // hintNoSemijoin (122x) + 57370: 33, // hintNoSkipScan (122x) + 57385: 34, // hintNoSwapJoinInputs (122x) + 57399: 35, // hintNthPlan (122x) + 57376: 36, // hintQBName (122x) + 57386: 37, // hintQueryType (122x) + 57387: 38, // hintReadConsistentReplica (122x) + 57388: 39, // hintReadFromStorage (122x) + 57375: 40, // hintResourceGroup (122x) + 57371: 41, // hintSemijoin (122x) + 57374: 42, // hintSetVar (122x) + 57369: 43, // hintSkipScan (122x) + 57389: 44, // hintSMJoin (122x) + 57391: 45, // hintStreamAgg (122x) + 57392: 46, // hintSwapJoinInputs (122x) + 57397: 47, // hintTimeRange (122x) + 57398: 48, // hintUseCascades (122x) + 57394: 49, // hintUseIndex (122x) + 57393: 50, // hintUseIndexMerge (122x) + 57395: 51, // hintUsePlanCache (122x) + 57396: 52, // hintUseToja (122x) + 44: 53, // ',' (120x) + 57412: 54, // hintDupsWeedOut (100x) + 57413: 55, // hintFirstMatch (100x) + 57414: 56, // hintLooseScan (100x) + 57415: 57, // hintMaterialization (100x) + 57407: 58, // hintTiFlash (100x) + 57406: 59, // hintTiKV (100x) + 57408: 60, // hintFalse (99x) + 57403: 61, // hintOLAP (99x) + 57404: 62, // hintOLTP (99x) + 57409: 63, // hintTrue (99x) + 57411: 64, // hintGB (98x) + 57410: 65, // hintMB (98x) + 57347: 66, // hintIdentifier (97x) + 57349: 67, // hintSingleAtIdentifier (82x) + 93: 68, // ']' (76x) + 57405: 69, // hintPartition (70x) + 46: 70, // '.' (66x) + 61: 71, // '=' (66x) + 40: 72, // '(' (61x) + 57344: 73, // $end (24x) + 57436: 74, // QueryBlockOpt (17x) + 57428: 75, // Identifier (13x) + 57346: 76, // hintIntLit (8x) + 57350: 77, // hintStringLit (5x) + 57418: 78, // CommaOpt (4x) + 57424: 79, // HintTable (4x) + 57425: 80, // HintTableList (4x) + 91: 81, // '[' (3x) + 57417: 82, // BooleanHintName (2x) + 57419: 83, // HintIndexList (2x) + 57421: 84, // HintStorageType (2x) + 57422: 85, // HintStorageTypeAndTable (2x) + 57426: 86, // HintTableListOpt (2x) + 57431: 87, // JoinOrderOptimizerHintName (2x) + 57432: 88, // NullaryHintName (2x) + 57435: 89, // PartitionListOpt (2x) + 57438: 90, // StorageOptimizerHintOpt (2x) + 57439: 91, // SubqueryOptimizerHintName (2x) + 57442: 92, // SubqueryStrategy (2x) + 57443: 93, // SupportedIndexLevelOptimizerHintName (2x) + 57444: 94, // SupportedTableLevelOptimizerHintName (2x) + 57445: 95, // TableOptimizerHintOpt (2x) + 57447: 96, // UnsupportedIndexLevelOptimizerHintName (2x) + 57448: 97, // UnsupportedTableLevelOptimizerHintName (2x) + 57420: 98, // HintQueryType (1x) + 57423: 99, // HintStorageTypeAndTableList (1x) + 57427: 100, // HintTrueOrFalse (1x) + 57429: 101, // IndexNameList (1x) + 57430: 102, // IndexNameListOpt (1x) + 57433: 103, // OptimizerHintList (1x) + 57434: 104, // PartitionList (1x) + 57437: 105, // Start (1x) + 57440: 106, // SubqueryStrategies (1x) + 57441: 107, // SubqueryStrategiesOpt (1x) + 57446: 108, // UnitOfBytes (1x) + 57449: 109, // Value (1x) + 57416: 110, // $default (0x) + 57345: 111, // error (0x) + 57348: 112, // hintInvalid (0x) } yyhintSymNames = []string{ @@ -242,6 +242,7 @@ var ( "hintBCJoin", "hintBKA", "hintBNL", + "hintCTEInline", "hintForceIndex", "hintHashAgg", "hintHashJoin", @@ -349,70 +350,84 @@ var ( "$default", "error", "hintInvalid", - "HintCTEInline", } yyhintReductions = []struct{ xsym, components int }{ {0, 1}, - {104, 1}, - {102, 1}, - {102, 3}, - {102, 1}, - {102, 3}, - {94, 4}, - {94, 4}, - {94, 4}, - {94, 4}, - {94, 4}, - {94, 4}, - {94, 5}, - {94, 5}, - {94, 5}, - {94, 6}, - {94, 4}, - {94, 4}, - {94, 6}, - {94, 6}, - {94, 5}, - {94, 4}, - {94, 5}, - {89, 5}, - {98, 1}, - {98, 3}, - {84, 4}, - {73, 0}, - {73, 1}, - {77, 0}, - {77, 1}, - {88, 0}, - {88, 4}, + {105, 1}, {103, 1}, {103, 3}, - {85, 1}, - {85, 1}, - {79, 2}, + {103, 1}, + {103, 3}, + {95, 4}, + {95, 4}, + {95, 4}, + {95, 4}, + {95, 4}, + {95, 4}, + {95, 5}, + {95, 5}, + {95, 5}, + {95, 6}, + {95, 4}, + {95, 4}, + {95, 6}, + {95, 6}, + {95, 5}, + {95, 4}, + {95, 5}, + {90, 5}, + {99, 1}, + {99, 3}, + {85, 4}, + {74, 0}, + {74, 1}, + {78, 0}, + {78, 1}, + {89, 0}, + {89, 4}, + {104, 1}, + {104, 3}, + {86, 1}, + {86, 1}, + {80, 2}, + {80, 3}, {79, 3}, - {78, 3}, - {78, 5}, - {82, 4}, - {101, 0}, + {79, 5}, + {83, 4}, + {102, 0}, + {102, 1}, {101, 1}, - {100, 1}, - {100, 3}, - {106, 0}, + {101, 3}, + {107, 0}, + {107, 1}, {106, 1}, - {105, 1}, - {105, 3}, + {106, 3}, + {109, 1}, + {109, 1}, + {109, 1}, {108, 1}, {108, 1}, - {108, 1}, - {107, 1}, - {107, 1}, - {99, 1}, - {99, 1}, - {86, 1}, - {86, 1}, - {86, 1}, + {100, 1}, + {100, 1}, + {87, 1}, + {87, 1}, + {87, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {94, 1}, + {94, 1}, + {94, 1}, + {94, 1}, + {94, 1}, + {94, 1}, + {94, 1}, + {94, 1}, {96, 1}, {96, 1}, {96, 1}, @@ -424,414 +439,403 @@ var ( {93, 1}, {93, 1}, {93, 1}, - {93, 1}, - {93, 1}, - {93, 1}, - {93, 1}, - {95, 1}, - {95, 1}, - {95, 1}, - {95, 1}, - {95, 1}, - {95, 1}, - {95, 1}, + {91, 1}, + {91, 1}, {92, 1}, {92, 1}, {92, 1}, {92, 1}, - {90, 1}, - {90, 1}, - {91, 1}, - {91, 1}, - {91, 1}, - {91, 1}, - {81, 1}, - {81, 1}, - {87, 1}, - {87, 1}, - {87, 1}, - {87, 1}, - {87, 1}, - {87, 1}, - {87, 1}, - {87, 1}, - {97, 1}, - {97, 1}, - {83, 1}, - {83, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, - {74, 1}, + {82, 1}, + {82, 1}, + {88, 1}, + {88, 1}, + {88, 1}, + {88, 1}, + {88, 1}, + {88, 1}, + {88, 1}, + {88, 1}, + {88, 1}, + {98, 1}, + {98, 1}, + {84, 1}, + {84, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, + {75, 1}, } yyhintXErrors = map[yyhintXError]string{} - yyhintParseTab = [253][]uint16{ + yyhintParseTab = [255][]uint16{ // 0 - {1: 229, 204, 196, 198, 221, 227, 210, 219, 233, 211, 206, 205, 209, 175, 193, 194, 195, 230, 182, 187, 201, 212, 197, 199, 200, 214, 231, 202, 213, 215, 223, 217, 208, 183, 186, 191, 232, 192, 185, 222, 184, 216, 203, 228, 207, 188, 225, 218, 220, 226, 224, 81: 189, 86: 176, 190, 89: 174, 181, 92: 180, 178, 173, 179, 177, 102: 172, 104: 171}, - {72: 170}, - {1: 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 320, 72: 169, 77: 420}, - {1: 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 72: 168}, - {1: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 72: 166}, + {1: 231, 206, 198, 200, 233, 223, 229, 212, 221, 236, 213, 208, 207, 211, 177, 195, 196, 197, 232, 184, 189, 203, 214, 199, 201, 202, 216, 234, 204, 215, 217, 225, 219, 210, 185, 188, 193, 235, 194, 187, 224, 186, 218, 205, 230, 209, 190, 227, 220, 222, 228, 226, 82: 191, 87: 178, 192, 90: 176, 183, 93: 182, 180, 175, 181, 179, 103: 174, 105: 173}, + {73: 172}, + {1: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 324, 73: 171, 78: 424}, + {1: 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 73: 170}, + {1: 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 73: 168}, // 5 - {71: 417}, - {71: 414}, - {71: 411}, - {71: 406}, - {71: 403}, + {72: 421}, + {72: 418}, + {72: 415}, + {72: 410}, + {72: 407}, // 10 - {71: 392}, - {71: 380}, - {71: 376}, - {71: 372}, - {71: 364}, + {72: 396}, + {72: 384}, + {72: 380}, + {72: 376}, + {72: 368}, // 15 - {71: 361}, - {71: 358}, - {71: 351}, - {71: 346}, - {71: 340}, + {72: 365}, + {72: 362}, + {72: 355}, + {72: 350}, + {72: 344}, // 20 - {71: 337}, - {71: 331}, - {71: 234}, - {71: 113}, - {71: 112}, + {72: 341}, + {72: 335}, + {72: 237}, + {72: 115}, + {72: 114}, // 25 - {71: 111}, - {71: 110}, - {71: 109}, - {71: 108}, - {71: 107}, + {72: 113}, + {72: 112}, + {72: 111}, + {72: 110}, + {72: 109}, // 30 - {71: 106}, - {71: 105}, - {71: 104}, - {71: 103}, - {71: 102}, + {72: 108}, + {72: 107}, + {72: 106}, + {72: 105}, + {72: 104}, // 35 - {71: 101}, - {71: 100}, - {71: 99}, - {71: 98}, - {71: 97}, + {72: 103}, + {72: 102}, + {72: 101}, + {72: 100}, + {72: 99}, // 40 - {71: 96}, - {71: 95}, - {71: 94}, - {71: 93}, - {71: 92}, + {72: 98}, + {72: 97}, + {72: 96}, + {72: 95}, + {72: 94}, // 45 - {71: 91}, - {71: 90}, - {71: 89}, - {71: 88}, - {71: 87}, + {72: 93}, + {72: 92}, + {72: 91}, + {72: 90}, + {72: 89}, // 50 - {71: 86}, - {71: 85}, - {71: 84}, - {71: 83}, - {71: 78}, + {72: 88}, + {72: 87}, + {72: 86}, + {72: 85}, + {72: 80}, // 55 - {71: 77}, - {71: 76}, - {71: 75}, - {71: 74}, - {71: 73}, + {72: 79}, + {72: 78}, + {72: 77}, + {72: 76}, + {72: 75}, // 60 - {71: 72}, - {71: 71}, - {71: 70}, - {71: 69}, - {57: 143, 143, 66: 236, 73: 235}, + {72: 74}, + {72: 73}, + {72: 72}, + {72: 71}, + {72: 70}, // 65 - {57: 241, 240, 83: 239, 238, 98: 237}, - {142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 67: 142, 142, 75: 142}, - {328, 52: 329}, - {146, 52: 146}, - {80: 242}, + {58: 145, 145, 67: 239, 74: 238}, + {58: 244, 243, 84: 242, 241, 99: 240}, + {144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 68: 144, 144, 76: 144}, + {332, 53: 333}, + {148, 53: 148}, // 70 - {80: 66}, - {80: 65}, - {1: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 53: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 73: 244, 79: 243}, - {52: 326, 67: 325}, - {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 246, 78: 245}, + {81: 245}, + {81: 67}, + {81: 66}, + {1: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 247, 80: 246}, + {53: 330, 68: 329}, // 75 - {133, 52: 133, 67: 133}, - {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 143, 143, 312, 73: 311}, - {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, - {63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, - {62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62}, + {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 249, 79: 248}, + {135, 53: 135, 68: 135}, + {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 145, 145, 316, 74: 315}, + {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}, + {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, // 80 - {61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61}, - {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60}, - {59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59}, - {58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58}, - {57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}, + {63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, + {62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62}, + {61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61}, + {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60}, + {59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59}, // 85 - {56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}, - {55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, - {54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54}, - {53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53}, - {52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, + {58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58}, + {57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}, + {56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}, + {55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, + {54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54}, // 90 - {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, - {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, - {49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49}, - {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, - {47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, + {53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53}, + {52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, + {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, + {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, + {49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49}, // 95 - {46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, - {45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45}, - {44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, - {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43}, - {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, + {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, + {47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, + {46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, + {45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45}, + {44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, // 100 - {41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41}, - {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, - {39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, - {38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, - {37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37}, + {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43}, + {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, + {41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41}, + {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, + {39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, // 105 - {36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, - {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, - {34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, - {33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33}, - {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}, + {38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, + {37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37}, + {36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, + {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, + {34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, // 110 - {31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, - {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, - {29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29}, - {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, - {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}, + {33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33}, + {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}, + {31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, + {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, + {29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29}, // 115 - {26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26}, - {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}, - {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24}, - {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}, - {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}, + {26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26}, + {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}, + {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24}, // 120 - {21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21}, - {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, - {19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}, - {18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, - {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17}, + {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}, + {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, + {21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21}, + {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, + {19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}, // 125 - {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, - {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, - {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, - {13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, - {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, + {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17}, + {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, + {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, // 130 - {11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, - {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, - {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, - {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}, + {13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, + {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, // 135 - {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}, - {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, - {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, + {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}, + {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}, + {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, + {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, // 140 - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 67: 139, 315, 88: 324}, - {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 313}, - {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 143, 143, 73: 314}, - {139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 67: 139, 315, 88: 316}, + {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 68: 141, 319, 89: 328}, + {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 317}, // 145 - {71: 317}, - {130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 67: 130}, - {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 319, 103: 318}, - {321, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 320, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 77: 322}, - {137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137}, + {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 145, 145, 74: 318}, + {141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 68: 141, 319, 89: 320}, + {72: 321}, + {132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 68: 132}, + {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 323, 104: 322}, // 150 - {140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 53: 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 76: 140}, - {138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 67: 138}, - {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 323}, - {136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136}, - {131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 67: 131}, + {325, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 324, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 78: 326}, + {139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139}, + {142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 54: 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 77: 142}, + {140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 68: 140}, + {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 327}, // 155 - {144, 52: 144}, - {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 246, 78: 327}, - {132, 52: 132, 67: 132}, - {1: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 72: 147}, - {57: 241, 240, 83: 239, 330}, + {138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138}, + {133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 68: 133}, + {146, 53: 146}, + {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 249, 79: 331}, + {134, 53: 134, 68: 134}, // 160 - {145, 52: 145}, - {60: 143, 143, 66: 236, 73: 332}, - {60: 334, 335, 97: 333}, - {336}, - {68}, + {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 73: 149}, + {58: 244, 243, 84: 242, 334}, + {147, 53: 147}, + {61: 145, 145, 67: 239, 74: 336}, + {61: 338, 339, 98: 337}, // 165 - {67}, - {1: 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 72: 148}, - {143, 66: 236, 73: 338}, - {339}, - {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 72: 149}, + {340}, + {69}, + {68}, + {1: 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 73: 150}, + {145, 67: 239, 74: 342}, // 170 - {59: 143, 62: 143, 66: 236, 73: 341}, - {59: 344, 62: 343, 99: 342}, - {345}, - {115}, - {114}, + {343}, + {1: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 73: 151}, + {60: 145, 63: 145, 67: 239, 74: 345}, + {60: 348, 63: 347, 100: 346}, + {349}, // 175 - {1: 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 72: 150}, - {76: 347}, - {52: 320, 76: 141, 348}, - {76: 349}, - {350}, - // 180 - {1: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 72: 151}, - {66: 236, 73: 352, 75: 143}, - {75: 353}, - {63: 356, 355, 107: 354}, - {357}, - // 185 {117}, {116}, - {1: 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 72: 152}, - {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 359}, - {360}, - // 190 - {1: 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 72: 153}, - {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 362}, - {363}, - {1: 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 72: 154}, - {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 365}, - // 195 - {70: 366}, - {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 369, 370, 368, 108: 367}, - {371}, - {120}, + {1: 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 73: 152}, + {77: 351}, + {53: 324, 77: 143, 352}, + // 180 + {77: 353}, + {354}, + {1: 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 73: 153}, + {67: 239, 74: 356, 76: 145}, + {76: 357}, + // 185 + {64: 360, 359, 108: 358}, + {361}, {119}, - // 200 {118}, - {1: 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 72: 155}, - {66: 236, 73: 373, 75: 143}, - {75: 374}, + {1: 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 73: 154}, + // 190 + {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 363}, + {364}, + {1: 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 73: 155}, + {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 366}, + {367}, + // 195 + {1: 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 73: 156}, + {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 369}, + {71: 370}, + {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 373, 374, 372, 109: 371}, {375}, + // 200 + {122}, + {121}, + {120}, + {1: 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 73: 157}, + {67: 239, 74: 377, 76: 145}, // 205 - {1: 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 72: 156}, - {66: 236, 73: 377, 75: 143}, - {75: 378}, + {76: 378}, {379}, - {1: 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 72: 157}, + {1: 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 73: 158}, + {67: 239, 74: 381, 76: 145}, + {76: 382}, // 210 - {143, 53: 143, 143, 143, 143, 66: 236, 73: 381}, - {124, 53: 385, 386, 387, 388, 91: 384, 105: 383, 382}, - {391}, - {123, 52: 389}, - {122, 52: 122}, + {383}, + {1: 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 73: 159}, + {145, 54: 145, 145, 145, 145, 67: 239, 74: 385}, + {126, 54: 389, 390, 391, 392, 92: 388, 106: 387, 386}, + {395}, // 215 - {82, 52: 82}, - {81, 52: 81}, - {80, 52: 80}, - {79, 52: 79}, - {53: 385, 386, 387, 388, 91: 390}, + {125, 53: 393}, + {124, 53: 124}, + {84, 53: 84}, + {83, 53: 83}, + {82, 53: 82}, // 220 - {121, 52: 121}, - {1: 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 72: 158}, - {1: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 53: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 73: 394, 82: 393}, - {402}, - {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 246, 78: 395}, + {81, 53: 81}, + {54: 389, 390, 391, 392, 92: 394}, + {123, 53: 123}, + {1: 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 73: 160}, + {1: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 398, 83: 397}, // 225 - {141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 320, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 77: 396}, - {128, 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 399, 100: 398, 397}, - {129}, - {127, 52: 400}, - {126, 52: 126}, + {406}, + {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 249, 79: 399}, + {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 324, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 78: 400}, + {130, 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 403, 101: 402, 401}, + {131}, // 230 - {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 401}, - {125, 52: 125}, - {1: 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 72: 159}, - {1: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 53: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 73: 394, 82: 404}, - {405}, + {129, 53: 404}, + {128, 53: 128}, + {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 405}, + {127, 53: 127}, + {1: 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 73: 161}, // 235 - {1: 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 72: 160}, - {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 53: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 73: 409, 79: 408, 85: 407}, - {410}, - {135, 52: 326}, - {134, 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 246, 78: 245}, + {1: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 398, 83: 408}, + {409}, + {1: 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 73: 162}, + {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 413, 80: 412, 86: 411}, + {414}, // 240 - {1: 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 72: 161}, - {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 53: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 73: 409, 79: 408, 85: 412}, - {413}, - {1: 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 72: 162}, - {1: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 53: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 73: 244, 79: 415}, + {137, 53: 330}, + {136, 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 249, 79: 248}, + {1: 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 73: 163}, + {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 413, 80: 412, 86: 416}, + {417}, // 245 - {416, 52: 326}, - {1: 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 72: 163}, - {143, 66: 236, 73: 418}, - {419}, - {1: 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 72: 164}, + {1: 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 73: 164}, + {1: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 247, 80: 419}, + {420, 53: 330}, + {1: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 73: 165}, + {145, 67: 239, 74: 422}, // 250 - {1: 229, 204, 196, 198, 221, 227, 210, 219, 233, 211, 206, 205, 209, 175, 193, 194, 195, 230, 182, 187, 201, 212, 197, 199, 200, 214, 231, 202, 213, 215, 223, 217, 208, 183, 186, 191, 232, 192, 185, 222, 184, 216, 203, 228, 207, 188, 225, 218, 220, 226, 224, 81: 189, 86: 176, 190, 89: 422, 181, 92: 180, 178, 421, 179, 177}, - {1: 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 72: 167}, - {1: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 72: 165}, + {423}, + {1: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 73: 166}, + {1: 231, 206, 198, 200, 233, 223, 229, 212, 221, 236, 213, 208, 207, 211, 177, 195, 196, 197, 232, 184, 189, 203, 214, 199, 201, 202, 216, 234, 204, 215, 217, 225, 219, 210, 185, 188, 193, 235, 194, 187, 224, 186, 218, 205, 230, 209, 190, 227, 220, 222, 228, 226, 82: 191, 87: 178, 192, 90: 426, 183, 93: 182, 180, 425, 181, 179}, + {1: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 73: 169}, + {1: 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 73: 167}, } ) @@ -871,7 +875,7 @@ func yyhintlex1(yylex yyhintLexer, lval *yyhintSymType) (n int) { } func yyhintParse(yylex yyhintLexer, parser *hintParser) int { - const yyError = 110 + const yyError = 111 yyEx, _ := yylex.(yyhintLexerEx) var yyn int diff --git a/parser/hintparser.y b/parser/hintparser.y index 9fb91f8d8ee1b..fe4433b03b049 100644 --- a/parser/hintparser.y +++ b/parser/hintparser.y @@ -577,7 +577,7 @@ NullaryHintName: | "STREAM_AGG" | "AGG_TO_COP" | "LIMIT_TO_COP" -| "CTE_INLINE" +| "CTE_INLINE" | "NO_INDEX_MERGE" | "READ_CONSISTENT_REPLICA" | "IGNORE_PLAN_CACHE" @@ -622,7 +622,7 @@ Identifier: /* TiDB hint names */ | "AGG_TO_COP" | "LIMIT_TO_COP" -| "CTE_INLINE" +| "CTE_INLINE" | "IGNORE_PLAN_CACHE" | "HASH_AGG" | "IGNORE_INDEX" From a4536727829a9cbd2d266c73aec12dc1fb7b6485 Mon Sep 17 00:00:00 2001 From: Fourier <437981373@qq.com> Date: Thu, 12 May 2022 10:41:32 +0800 Subject: [PATCH 04/42] fix comment mistake comment on exported type CTEHintInfo should be of the form "CTEHintInfo ..." (with optional leading --- planner/core/logical_plan_builder.go | 7 ------- planner/core/logical_plans.go | 3 +-- planner/core/planbuilder.go | 4 +--- 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index be38d92052518..21f3eacfc9a81 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -112,7 +112,6 @@ const ( // HintLimitToCop is a hint enforce pushing limit or topn to coprocessor. HintLimitToCop = "limit_to_cop" //HintCTEInline is a hint which can switch turning inline or materializing for the CTE. - //code by dyp HintCTEInline = "cte_inline" ) @@ -3614,7 +3613,6 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev case HintLimitToCop: limitHints.preferLimitToCop = true //make CTEHints struct - //code by dyp case HintCTEInline: CTEHints.preferInlineToCTE = true default: @@ -4135,10 +4133,7 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName lp := LogicalCTE{cteAsName: tn.Name, cte: cte.cteClass, seedStat: cte.seedStat, isOuterMostCTE: !b.buildingCTE}.Init(b.ctx, b.getSelectOffset()) prevSchema := cte.seedLP.Schema().Clone() lp.SetSchema(getResultCTESchema(cte.seedLP.Schema(), b.ctx.GetSessionVars())) - // 这里设置logical cte ,有设置的ctehints参数,判断是否是递归cte来通过hint选择 //make cteinline is ture, that will use merge way to run - //by dyp - // if hint is inline if hint := b.TableHints(); hint != nil { lp.CTEHints = hint.CTEHints } @@ -4173,8 +4168,6 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName return nil, nil } -// build CTE_inline -//code by dyp func (b *PlanBuilder) buildDataSourceFromCTEInline(ctx context.Context, cte *ast.CommonTableExpression) (LogicalPlan, error) { p, err := b.buildResultSetNode(ctx, cte.Query.Query) if err != nil { diff --git a/planner/core/logical_plans.go b/planner/core/logical_plans.go index 0c5bf23d0e112..b7baacf7afb4d 100644 --- a/planner/core/logical_plans.go +++ b/planner/core/logical_plans.go @@ -1865,8 +1865,7 @@ type LogicalCTE struct { cteAsName model.CIStr seedStat *property.StatsInfo isOuterMostCTE bool - //code by dyp - CTEHints CTEHintInfo + CTEHints CTEHintInfo } // LogicalCTETable is for CTE table diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index daaba10a5a14c..78e2e3fa00de2 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -97,15 +97,13 @@ type tableHintInfo struct { indexMergeHintList []indexHintInfo timeRangeHint ast.HintTimeRange limitHints limitHintInfo - //code by dyp - CTEHints CTEHintInfo + CTEHints CTEHintInfo } type limitHintInfo struct { preferLimitToCop bool } -//code by dyp type CTEHintInfo struct { preferInlineToCTE bool } From d4cc365bef9901335111e98f5850707e1729a095 Mon Sep 17 00:00:00 2001 From: Fourier <437981373@qq.com> Date: Thu, 12 May 2022 14:12:07 +0800 Subject: [PATCH 05/42] Update planbuilder.go --- planner/core/planbuilder.go | 1 + 1 file changed, 1 insertion(+) diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index 78e2e3fa00de2..b1875966e15d4 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -105,6 +105,7 @@ type limitHintInfo struct { } type CTEHintInfo struct { + //one bool flag for cte preferInlineToCTE bool } From e38b66faf8e87d90b3f1b7daf3fdf46b26e391c4 Mon Sep 17 00:00:00 2001 From: Fourier <437981373@qq.com> Date: Thu, 12 May 2022 14:23:53 +0800 Subject: [PATCH 06/42] fix error --- planner/core/logical_plan_builder.go | 2 +- planner/core/planbuilder.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 21f3eacfc9a81..7adc6a4a8151a 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -4181,7 +4181,7 @@ func (b *PlanBuilder) buildDataSourceFromCTEInline(ctx context.Context, cte *ast if len(cte.ColNameList) > 0 { if len(cte.ColNameList) != len(p.OutputNames()) { - return nil, errors.New("CTE columns length is not consistent.") + return nil, errors.New("CTE columns length is not consistent") } for i, n := range cte.ColNameList { outPutNames[i].ColName = n diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index b1875966e15d4..2b15919f7d049 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -104,8 +104,8 @@ type limitHintInfo struct { preferLimitToCop bool } +//one bool flag for cte type CTEHintInfo struct { - //one bool flag for cte preferInlineToCTE bool } From e2e88af5ccecc75ecd66ca817ae0ca3d1e4def15 Mon Sep 17 00:00:00 2001 From: Fourier <437981373@qq.com> Date: Thu, 12 May 2022 14:32:18 +0800 Subject: [PATCH 07/42] Update planbuilder.go --- planner/core/planbuilder.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index 2b15919f7d049..ab6c9562030a9 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -104,7 +104,7 @@ type limitHintInfo struct { preferLimitToCop bool } -//one bool flag for cte +//CTEHintInfo ...one bool flag for cte type CTEHintInfo struct { preferInlineToCTE bool } From 03e81659e9c809576016b72650ebcf0a853573a8 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Thu, 12 May 2022 15:23:49 +0800 Subject: [PATCH 08/42] Update logical_plan_builder.go --- planner/core/logical_plan_builder.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 7adc6a4a8151a..f4d1e6f015ecf 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -4137,7 +4137,7 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName if hint := b.TableHints(); hint != nil { lp.CTEHints = hint.CTEHints } - if lp.CTEHints.preferInlineToCTE == true { + if lp.CTEHints.preferInlineToCTE { saveCte := b.outerCTEs[i:] b.outerCTEs = b.outerCTEs[:i] defer func() { From a10a8dbef586aaab7a782e6e9a48c8781b91ea53 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Thu, 12 May 2022 16:45:52 +0800 Subject: [PATCH 09/42] renew the code version fix merge conflict. --- parser/ast/misc.go | 2 +- parser/ast/misc_test.go | 1 + parser/parser_test.go | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/parser/ast/misc.go b/parser/ast/misc.go index 97b2261cf7228..894c49e6f902e 100644 --- a/parser/ast/misc.go +++ b/parser/ast/misc.go @@ -3417,7 +3417,7 @@ func (n *TableOptimizerHint) Restore(ctx *format.RestoreCtx) error { } // Hints without args except query block. switch n.HintName.L { - case "hash_agg", "stream_agg", "agg_to_cop", "read_consistent_replica", "no_index_merge", "qb_name", "ignore_plan_cache", "limit_to_cop", "cte_inline": + case "hash_agg", "stream_agg", "agg_to_cop", "read_consistent_replica", "no_index_merge", "qb_name", "ignore_plan_cache", "limit_to_cop", "straight_join", "cte_inline": ctx.WritePlain(")") return nil } diff --git a/parser/ast/misc_test.go b/parser/ast/misc_test.go index 348c3304c7ff9..20d3e3e32f3c9 100644 --- a/parser/ast/misc_test.go +++ b/parser/ast/misc_test.go @@ -266,6 +266,7 @@ func TestTableOptimizerHintRestore(t *testing.T) { {"AGG_TO_COP(@sel_1)", "AGG_TO_COP(@`sel_1`)"}, {"LIMIT_TO_COP()", "LIMIT_TO_COP()"}, {"CTE_INLINE()", "CTE_INLINE()"}, + {"STRAIGHT_JOIN()", "STRAIGHT_JOIN()"}, {"NO_INDEX_MERGE()", "NO_INDEX_MERGE()"}, {"NO_INDEX_MERGE(@sel1)", "NO_INDEX_MERGE(@`sel1`)"}, {"READ_CONSISTENT_REPLICA()", "READ_CONSISTENT_REPLICA()"}, diff --git a/parser/parser_test.go b/parser/parser_test.go index c914f88b904eb..0f352350c77f8 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -4202,6 +4202,38 @@ func TestOptimizerHints(t *testing.T) { require.Len(t, hints, 2) require.Equal(t, "cte_inline", hints[0].HintName.L) require.Equal(t, "cte_inline", hints[1].HintName.L) + + // Test STRAIGHT_JOIN + stmt, _, err = p.Parse("select /*+ STRAIGHT_JOIN(), straight_join() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) + selectStmt = stmt[0].(*ast.SelectStmt) + + hints = selectStmt.TableHints + require.Len(t, hints, 2) + require.Equal(t, "straight_join", hints[0].HintName.L) + require.Equal(t, "straight_join", hints[1].HintName.L) + + // Test LEADING + stmt, _, err = p.Parse("select /*+ LEADING(T1), LEADING(t2, t3), LEADING(T4, t5, t6) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) + selectStmt = stmt[0].(*ast.SelectStmt) + + hints = selectStmt.TableHints + require.Len(t, hints, 3) + require.Equal(t, "leading", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 1) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + + require.Equal(t, "leading", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 2) + require.Equal(t, "t2", hints[1].Tables[0].TableName.L) + require.Equal(t, "t3", hints[1].Tables[1].TableName.L) + + require.Equal(t, "leading", hints[2].HintName.L) + require.Len(t, hints[2].Tables, 3) + require.Equal(t, "t4", hints[2].Tables[0].TableName.L) + require.Equal(t, "t5", hints[2].Tables[1].TableName.L) + require.Equal(t, "t6", hints[2].Tables[2].TableName.L) } func TestType(t *testing.T) { From 1f2064f5445d49e3aa71d14179c4c9384533c46f Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Thu, 12 May 2022 19:32:03 +0800 Subject: [PATCH 10/42] Update parser_test.go --- parser/parser_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parser/parser_test.go b/parser/parser_test.go index ad02a2ec93f5a..ce81c72c6e9ca 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -4194,7 +4194,7 @@ func TestOptimizerHints(t *testing.T) { require.Equal(t, "limit_to_cop", hints[1].HintName.L) // Test CTE_INLINE - stmt, _, err = p.Parse("with cte(x) as (select /*+ CTE_INLINE(), cte_inline() */ * from t1) select * from cte;", "", "") + stmt, _, err = p.Parse("with cte(x) as (select * from t1) select /*+ CTE_INLINE(), cte_inline() */ * from cte;", "", "") require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) From afdf3a81e8f2854104cc326b218ea7f0627758b1 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Mon, 16 May 2022 16:15:30 +0800 Subject: [PATCH 11/42] Update physical_plan_test.go try to add a unit test --- planner/core/physical_plan_test.go | 51 ++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/planner/core/physical_plan_test.go b/planner/core/physical_plan_test.go index fe5c5cba7da00..ba19624cc3436 100644 --- a/planner/core/physical_plan_test.go +++ b/planner/core/physical_plan_test.go @@ -1034,6 +1034,57 @@ func TestLimitToCopHint(t *testing.T) { } } +func TestCTEInlineHint(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists tc") + tk.MustExec("create table tc(a int)") + tk.MustExec("insert into tc values (1), (5), (10), (15), (20), (30), (50);") + tk.MustExec("with cte(x) as (select /*+ CTE_INLINE()*/ * from tc where a < 60) select * from cte where cte.a <18;") + + var ( + input []string + output []struct { + SQL string + Plan []string + Warning []string + } + ) + + planSuiteData := core.GetPlanSuiteData() + planSuiteData.GetTestCases(t, &input, &output) + + for i, ts := range input { + testdata.OnRecord(func() { + output[i].SQL = ts + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + ts).Rows()) + }) + tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) + + comment := fmt.Sprintf("case:%v sql:%s", i, ts) + warnings := tk.Session().GetSessionVars().StmtCtx.GetWarnings() + testdata.OnRecord(func() { + if len(warnings) > 0 { + output[i].Warning = make([]string, len(warnings)) + for j, warning := range warnings { + output[i].Warning[j] = warning.Err.Error() + } + } + }) + if len(output[i].Warning) == 0 { + require.Len(t, warnings, 0) + } else { + require.Len(t, warnings, len(output[i].Warning), comment) + for j, warning := range warnings { + require.Equal(t, stmtctx.WarnLevelWarning, warning.Level, comment) + require.Equal(t, output[i].Warning[j], warning.Err.Error(), comment) + } + } + } +} + func TestPushdownDistinctEnable(t *testing.T) { var ( input []string From 1888699bde9df03e162ad4c10e2712c982358e34 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Mon, 16 May 2022 17:37:19 +0800 Subject: [PATCH 12/42] Update physical_plan_test.go --- planner/core/physical_plan_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planner/core/physical_plan_test.go b/planner/core/physical_plan_test.go index ba19624cc3436..a94f7a75a45d9 100644 --- a/planner/core/physical_plan_test.go +++ b/planner/core/physical_plan_test.go @@ -1042,7 +1042,7 @@ func TestCTEInlineHint(t *testing.T) { tk.MustExec("drop table if exists tc") tk.MustExec("create table tc(a int)") tk.MustExec("insert into tc values (1), (5), (10), (15), (20), (30), (50);") - tk.MustExec("with cte(x) as (select /*+ CTE_INLINE()*/ * from tc where a < 60) select * from cte where cte.a <18;") + tk.MustExec("with cte(x) as (select /*+ CTE_INLINE()*/ * from tc where a < 60) select * from cte where a <18;") var ( input []string From bf91604d9f93a8ec8fca48fb3c6194bfb4d2b30c Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Mon, 16 May 2022 18:15:40 +0800 Subject: [PATCH 13/42] Update physical_plan_test.go --- planner/core/physical_plan_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planner/core/physical_plan_test.go b/planner/core/physical_plan_test.go index a94f7a75a45d9..b0d578824c0f4 100644 --- a/planner/core/physical_plan_test.go +++ b/planner/core/physical_plan_test.go @@ -1042,7 +1042,7 @@ func TestCTEInlineHint(t *testing.T) { tk.MustExec("drop table if exists tc") tk.MustExec("create table tc(a int)") tk.MustExec("insert into tc values (1), (5), (10), (15), (20), (30), (50);") - tk.MustExec("with cte(x) as (select /*+ CTE_INLINE()*/ * from tc where a < 60) select * from cte where a <18;") + tk.MustExec("with cte as (select /*+ CTE_INLINE()*/ * from tc where tc.a < 60) select * from cte where cte.a <18;") var ( input []string From 4854880e194df986f7eee69eb36789871a3b80ae Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Wed, 18 May 2022 16:25:42 +0800 Subject: [PATCH 14/42] add unit test add cte-hint test(part of them), the cteinlinehint in different cte is coding. --- planner/core/physical_plan_test.go | 3 +- planner/core/testdata/plan_suite_in.json | 9 ++++ planner/core/testdata/plan_suite_out.json | 52 +++++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/planner/core/physical_plan_test.go b/planner/core/physical_plan_test.go index b0d578824c0f4..4f7493de0ab82 100644 --- a/planner/core/physical_plan_test.go +++ b/planner/core/physical_plan_test.go @@ -1041,8 +1041,9 @@ func TestCTEInlineHint(t *testing.T) { tk.MustExec("use test") tk.MustExec("drop table if exists tc") tk.MustExec("create table tc(a int)") + tk.MustExec("create table te(c int)") tk.MustExec("insert into tc values (1), (5), (10), (15), (20), (30), (50);") - tk.MustExec("with cte as (select /*+ CTE_INLINE()*/ * from tc where tc.a < 60) select * from cte where cte.a <18;") + tk.MustExec("insert into te values (1), (5), (10), (25), (40), (60), (100);") var ( input []string diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index ce4c38cbc695d..d2b3403611676 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -572,6 +572,15 @@ "select /*+ LIMIT_TO_COP() */ a from tn where a > 10 limit 1" ] }, + { + "name": "TestCTEInlineHint", + "cases": [ + "with cte as (select /*+ CTE_INLINE()*/ * from tc where tc.a < 60) select * from cte where cte.a <18", + "with cte as (select * from tc where tc.a < 60) select * from cte where cte.a <18", + "WITH cte1 AS (SELECT /*+ CTE_INLINE()*/ a FROM tc), cte2 AS (SELECT /*+ CTE_INLINE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", + // "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ CTE_INLINE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;" + ] + }, { "name": "TestPushdownDistinctEnable", "cases": [ diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 43c97667fd49d..4e7cba70abc3a 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1594,6 +1594,58 @@ } ] }, + { + "Name": "TestCTEInlineHint", + "Cases": [ + { + "SQL": "with cte as (select /*+ CTE_INLINE()*/ * from tc where tc.a < 60) select * from cte where cte.a <18", + "Plan": [ + "TableReader 2.33 root data:Selection", + "└─Selection_12 2.33 cop[tikv] lt(test.tc.a, 18), lt(test.tc.a, 60)", + " └─TableFullScan_11 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "with cte as (select * from tc where tc.a < 60) select * from cte where cte.a <18", + "Plan": [ + "Selection 1.86 root lt(test.tc.a, 18)", + "└─CTEFullScan 2.33 root CTE:cte data:CTE", + "CTE 2.33 root Non-Recursive CTE", + "└─TableReader(Seed Part) 2.33 root data:Selection_10", + " └─Selection 2.33 cop[tikv] lt(test.tc.a, 18), lt(test.tc.a, 60)", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "WITH cte1 AS (SELECT /*+ CTE_INLINE()*/ a FROM tc), cte2 AS (SELECT /*+ CTE_INLINE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", + "Plan": [ + "HashJoin 8.74 root inner join, equal:[eq(test.tc.a, test.te.c)]", + "├─TableReader(Build) 6.99 root data:Selection", + "│ └─Selection 6.99 cop[tikv] not(isnull(test.tc.a))", + "│ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.te.c))", + " └─TableFullScan 10000.00 cop[tikv] table:te keep order:false, stats:pseudo" + ], + "Warning": null + } +// { +// "SQL": "WITH cte1 AS (SELECT /*+ CTE_INLINE()*/ a FROM tc), cte2 AS (SELECT /*+ CTE_INLINE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", +// "Plan": [ +// "HashJoin 8.74 root inner join, equal:[eq(test.tc.a, test.te.c)]", +// "├─TableReader(Build) 6.99 root data:Selection", +// "│ └─Selection 6.99 cop[tikv] not(isnull(test.tc.a))", +// "│ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo", +// "└─TableReader(Probe) 9990.00 root data:Selection", +// " └─Selection 9990.00 cop[tikv] not(isnull(test.te.c))", +// " └─TableFullScan 10000.00 cop[tikv] table:te keep order:false, stats:pseudo", +// ], +// "Warning": null +// } + ] + }, { "Name": "TestPushdownDistinctEnable", "Cases": [ From cf03f739d3ca42b668efcf18f07e0974cec824ea Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Wed, 18 May 2022 16:26:30 +0800 Subject: [PATCH 15/42] save hint tag when meet cteinlinehint, open the inline function --- planner/core/logical_plan_builder.go | 14 ++++++++------ planner/core/planbuilder.go | 2 ++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index e3c754496fead..259480ea36a1e 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -1759,7 +1759,6 @@ func (b *PlanBuilder) buildUnion(ctx context.Context, selects []LogicalPlan, aft if err != nil { return nil, err } - unionDistinctPlan, err := b.buildUnionAll(ctx, distinctSelectPlans) if err != nil { return nil, err @@ -3996,6 +3995,12 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L } } + if b.buildingCTE { + if hints := b.TableHints(); hints != nil { + b.outerCTEs[len(b.outerCTEs)-1].isInline = hints.CTEHints.preferInlineToCTE + } + } + sel.Fields.Fields = originalFields if oldLen != p.Schema().Len() { proj := LogicalProjection{Exprs: expression.Column2Exprs(p.Schema().Columns[:oldLen])}.Init(b.ctx, b.getSelectOffset()) @@ -4158,11 +4163,8 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName lp := LogicalCTE{cteAsName: tn.Name, cte: cte.cteClass, seedStat: cte.seedStat, isOuterMostCTE: !b.buildingCTE}.Init(b.ctx, b.getSelectOffset()) prevSchema := cte.seedLP.Schema().Clone() lp.SetSchema(getResultCTESchema(cte.seedLP.Schema(), b.ctx.GetSessionVars())) - //make cteinline is ture, that will use merge way to run - if hint := b.TableHints(); hint != nil { - lp.CTEHints = hint.CTEHints - } - if lp.CTEHints.preferInlineToCTE { + if b.outerCTEs[len(b.outerCTEs)-1].isInline { + lp.CTEHints.preferInlineToCTE = b.outerCTEs[len(b.outerCTEs)-1].isInline saveCte := b.outerCTEs[i:] b.outerCTEs = b.outerCTEs[:i] defer func() { diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index 0d6f4af55f6f9..1d34060199928 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -433,6 +433,8 @@ type cteInfo struct { seedStat *property.StatsInfo // The LogicalCTEs that reference the same table should share the same CteClass. cteClass *CTEClass + + isInline bool } // PlanBuilder builds Plan from an ast.Node. From 71c4804e8e3b84fe2f09aad37e157c5fa0c33955 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Wed, 18 May 2022 17:00:40 +0800 Subject: [PATCH 16/42] add diff cte inline hint support CTEInlineHint in different cte query. --- planner/core/logical_plan_builder.go | 4 +-- planner/core/testdata/plan_suite_in.json | 2 +- planner/core/testdata/plan_suite_out.json | 30 +++++++++++++---------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 259480ea36a1e..3084756b4e71c 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -4163,8 +4163,8 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName lp := LogicalCTE{cteAsName: tn.Name, cte: cte.cteClass, seedStat: cte.seedStat, isOuterMostCTE: !b.buildingCTE}.Init(b.ctx, b.getSelectOffset()) prevSchema := cte.seedLP.Schema().Clone() lp.SetSchema(getResultCTESchema(cte.seedLP.Schema(), b.ctx.GetSessionVars())) - if b.outerCTEs[len(b.outerCTEs)-1].isInline { - lp.CTEHints.preferInlineToCTE = b.outerCTEs[len(b.outerCTEs)-1].isInline + if cte.isInline { + lp.CTEHints.preferInlineToCTE = cte.isInline saveCte := b.outerCTEs[i:] b.outerCTEs = b.outerCTEs[:i] defer func() { diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index d2b3403611676..b4479d9f5e755 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -578,7 +578,7 @@ "with cte as (select /*+ CTE_INLINE()*/ * from tc where tc.a < 60) select * from cte where cte.a <18", "with cte as (select * from tc where tc.a < 60) select * from cte where cte.a <18", "WITH cte1 AS (SELECT /*+ CTE_INLINE()*/ a FROM tc), cte2 AS (SELECT /*+ CTE_INLINE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", - // "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ CTE_INLINE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;" + "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ CTE_INLINE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;" ] }, { diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 4e7cba70abc3a..5844f3863f5dc 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1631,19 +1631,23 @@ ], "Warning": null } -// { -// "SQL": "WITH cte1 AS (SELECT /*+ CTE_INLINE()*/ a FROM tc), cte2 AS (SELECT /*+ CTE_INLINE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", -// "Plan": [ -// "HashJoin 8.74 root inner join, equal:[eq(test.tc.a, test.te.c)]", -// "├─TableReader(Build) 6.99 root data:Selection", -// "│ └─Selection 6.99 cop[tikv] not(isnull(test.tc.a))", -// "│ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo", -// "└─TableReader(Probe) 9990.00 root data:Selection", -// " └─Selection 9990.00 cop[tikv] not(isnull(test.te.c))", -// " └─TableFullScan 10000.00 cop[tikv] table:te keep order:false, stats:pseudo", -// ], -// "Warning": null -// } + { + "SQL": "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ CTE_INLINE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", + "Plan": [ + "Projection 5.60 root test.tc.a, test.te.c", + "└─HashJoin 5.60 root inner join, equal:[eq(test.te.c, test.tc.a)]", + " ├─Selection(Build) 4.48 root not(isnull(test.tc.a))", + " │ └─CTEFullScan 5.60 root CTE:cte1 data:CTE", + " └─TableReader(Probe) 6.99 root data:Selection", + " └─Selection 6.99 cop[tikv] not(isnull(test.te.c))", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo", + "CTE 5.60 root Non-Recursive CTE", + "└─Selection(Seed Part) 5.60 root not(isnull(test.tc.a))", + " └─TableReader 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" + ], + "Warning": null + } ] }, { From 83156d4895b770be9e4343ae02aa15bf66f7cc21 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Wed, 18 May 2022 17:26:46 +0800 Subject: [PATCH 17/42] Update logical_plan_builder.go --- planner/core/logical_plan_builder.go | 1 + 1 file changed, 1 insertion(+) diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 3084756b4e71c..8a69b6811f783 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -4163,6 +4163,7 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName lp := LogicalCTE{cteAsName: tn.Name, cte: cte.cteClass, seedStat: cte.seedStat, isOuterMostCTE: !b.buildingCTE}.Init(b.ctx, b.getSelectOffset()) prevSchema := cte.seedLP.Schema().Clone() lp.SetSchema(getResultCTESchema(cte.seedLP.Schema(), b.ctx.GetSessionVars())) + if cte.isInline { lp.CTEHints.preferInlineToCTE = cte.isInline saveCte := b.outerCTEs[i:] From f2af0c1007059527b206c2041f89f662f841b47c Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Wed, 18 May 2022 18:08:44 +0800 Subject: [PATCH 18/42] Update logical_plan_builder.go --- planner/core/logical_plan_builder.go | 1 - 1 file changed, 1 deletion(-) diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 8a69b6811f783..3084756b4e71c 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -4163,7 +4163,6 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName lp := LogicalCTE{cteAsName: tn.Name, cte: cte.cteClass, seedStat: cte.seedStat, isOuterMostCTE: !b.buildingCTE}.Init(b.ctx, b.getSelectOffset()) prevSchema := cte.seedLP.Schema().Clone() lp.SetSchema(getResultCTESchema(cte.seedLP.Schema(), b.ctx.GetSessionVars())) - if cte.isInline { lp.CTEHints.preferInlineToCTE = cte.isInline saveCte := b.outerCTEs[i:] From 5b4c0df59bde38af8d222d4f57602c02e5812901 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Wed, 18 May 2022 18:15:07 +0800 Subject: [PATCH 19/42] Update logical_plan_builder.go --- planner/core/logical_plan_builder.go | 1 + 1 file changed, 1 insertion(+) diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 3084756b4e71c..8a69b6811f783 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -4163,6 +4163,7 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName lp := LogicalCTE{cteAsName: tn.Name, cte: cte.cteClass, seedStat: cte.seedStat, isOuterMostCTE: !b.buildingCTE}.Init(b.ctx, b.getSelectOffset()) prevSchema := cte.seedLP.Schema().Clone() lp.SetSchema(getResultCTESchema(cte.seedLP.Schema(), b.ctx.GetSessionVars())) + if cte.isInline { lp.CTEHints.preferInlineToCTE = cte.isInline saveCte := b.outerCTEs[i:] From 05351c223fe69aa3e9833efd29d7bf2844a251da Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Thu, 19 May 2022 14:32:23 +0800 Subject: [PATCH 20/42] parser_test add some parer unit test, ref: TestCTE --- parser/parser_test.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/parser/parser_test.go b/parser/parser_test.go index ce81c72c6e9ca..82f13b45b251d 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -6443,6 +6443,30 @@ func TestCTE(t *testing.T) { RunTest(t, table, false) } +// For CTE Merge +func TestCTEMerge(t *testing.T) { + table := []testCase{ + {"WITH `cte` AS (SELECT 1,2) SELECT `col1`,`col2` FROM `cte`", true, "WITH `cte` AS (SELECT 1,2) SELECT `col1`,`col2` FROM `cte`"}, + {"WITH `cte` (col1, col2) AS (SELECT 1,2 UNION ALL SELECT 3,4) SELECT col1, col2 FROM cte;", true, "WITH `cte` (`col1`, `col2`) AS (SELECT 1,2 UNION ALL SELECT 3,4) SELECT `col1`,`col2` FROM `cte`"}, + {"WITH `cte` AS (SELECT 1,2), cte2 as (select 3) SELECT `col1`,`col2` FROM `cte`", true, "WITH `cte` AS (SELECT 1,2), `cte2` AS (SELECT 3) SELECT `col1`,`col2` FROM `cte`"}, + {"with cte(a) as (select 1) update t, cte set t.a=1 where t.a=cte.a;", true, "WITH `cte` (`a`) AS (SELECT 1) UPDATE (`t`) JOIN `cte` SET `t`.`a`=1 WHERE `t`.`a`=`cte`.`a`"}, + {"with cte(a) as (select 1) delete t from t, cte where t.a=cte.a;", true, "WITH `cte` (`a`) AS (SELECT 1) DELETE `t` FROM (`t`) JOIN `cte` WHERE `t`.`a`=`cte`.`a`"}, + {"WITH cte1 AS (SELECT 1) SELECT * FROM (WITH cte2 AS (SELECT 2) SELECT * FROM cte2 JOIN cte1) AS dt;", true, "WITH `cte1` AS (SELECT 1) SELECT * FROM (WITH `cte2` AS (SELECT 2) SELECT * FROM `cte2` JOIN `cte1`) AS `dt`"}, + {"WITH cte AS (SELECT 1) SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM cte;", true, "WITH `cte` AS (SELECT 1) SELECT /*+ MAX_EXECUTION_TIME(1000)*/ * FROM `cte`"}, + {"with cte as (table t) table cte;", true, "WITH `cte` AS (TABLE `t`) TABLE `cte`"}, + {"with cte as (select 1) select 1 union with cte as (select 1) select * from cte;", false, ""}, + {"with cte as (select 1) (select 1);", true, "WITH `cte` AS (SELECT 1) (SELECT 1)"}, + {"with cte as (select 1) (select 1 union select 1)", true, "WITH `cte` AS (SELECT 1) (SELECT 1 UNION SELECT 1)"}, + {"select * from (with cte as (select 1) select 1 union select 2) qn", true, "SELECT * FROM (WITH `cte` AS (SELECT 1) SELECT 1 UNION SELECT 2) AS `qn`"}, + {"select * from t where 1 > (with cte as (select 2) select * from cte)", true, "SELECT * FROM `t` WHERE 1>(WITH `cte` AS (SELECT 2) SELECT * FROM `cte`)"}, + {"( with cte(n) as ( select 1 ) select n+1 from cte union select n+2 from cte) union select 1", true, "(WITH `cte` (`n`) AS (SELECT 1) SELECT `n`+1 FROM `cte` UNION SELECT `n`+2 FROM `cte`) UNION SELECT 1"}, + {"( with cte(n) as ( select 1 ) select n+1 from cte) union select 1", true, "(WITH `cte` (`n`) AS (SELECT 1) SELECT `n`+1 FROM `cte`) UNION SELECT 1"}, + {"( with cte(n) as ( select 1 ) (select n+1 from cte)) union select 1", true, "(WITH `cte` (`n`) AS (SELECT 1) (SELECT `n`+1 FROM `cte`)) UNION SELECT 1"}, + } + + RunTest(t, table, false) +} + func TestAsOfClause(t *testing.T) { table := []testCase{ {"SELECT * FROM `t` AS /* comment */ a;", true, "SELECT * FROM `t` AS `a`"}, From e626cd14ddc28e3efc2b46f79126c198d1b88f9b Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Thu, 19 May 2022 14:32:36 +0800 Subject: [PATCH 21/42] Update hintparser.go make parser --- parser/hintparser.go | 1087 +++++++++++++++++++++--------------------- 1 file changed, 549 insertions(+), 538 deletions(-) diff --git a/parser/hintparser.go b/parser/hintparser.go index 133bdc04fc77e..7816fe6cde7b7 100644 --- a/parser/hintparser.go +++ b/parser/hintparser.go @@ -41,7 +41,7 @@ type yyhintXError struct { } const ( - yyhintDefault = 57416 + yyhintDefault = 57418 yyhintEOFCode = 57344 yyhintErrCode = 57345 hintAggToCop = 57377 @@ -49,11 +49,11 @@ const ( hintBKA = 57355 hintBNL = 57357 hintCTEInline = 57401 - hintDupsWeedOut = 57412 - hintFalse = 57408 - hintFirstMatch = 57413 + hintDupsWeedOut = 57414 + hintFalse = 57410 + hintFirstMatch = 57415 hintForceIndex = 57402 - hintGB = 57411 + hintGB = 57413 hintHashAgg = 57379 hintHashJoin = 57359 hintIdentifier = 57347 @@ -69,12 +69,12 @@ const ( hintJoinOrder = 57352 hintJoinPrefix = 57353 hintJoinSuffix = 57354 - hintLeading = 57403 + hintLeading = 57404 hintLimitToCop = 57400 - hintLooseScan = 57414 - hintMB = 57410 + hintLooseScan = 57416 + hintMB = 57412 hintMRR = 57365 - hintMaterialization = 57415 + hintMaterialization = 57417 hintMaxExecutionTime = 57373 hintMemoryQuota = 57384 hintMerge = 57361 @@ -90,9 +90,9 @@ const ( hintNoSkipScan = 57370 hintNoSwapJoinInputs = 57385 hintNthPlan = 57399 - hintOLAP = 57403 - hintOLTP = 57404 - hintPartition = 57405 + hintOLAP = 57405 + hintOLTP = 57406 + hintPartition = 57407 hintQBName = 57376 hintQueryType = 57386 hintReadConsistentReplica = 57387 @@ -103,14 +103,14 @@ const ( hintSetVar = 57374 hintSingleAtIdentifier = 57349 hintSkipScan = 57369 - hintStraightJoin = 57402 + hintStraightJoin = 57403 hintStreamAgg = 57391 hintStringLit = 57350 hintSwapJoinInputs = 57392 - hintTiFlash = 57407 - hintTiKV = 57406 + hintTiFlash = 57409 + hintTiKV = 57408 hintTimeRange = 57397 - hintTrue = 57409 + hintTrue = 57411 hintUseCascades = 57398 hintUseIndex = 57394 hintUseIndexMerge = 57393 @@ -118,124 +118,126 @@ const ( hintUseToja = 57396 yyhintMaxDepth = 200 - yyhintTabOfs = -172 + yyhintTabOfs = -176 ) var ( yyhintXLAT = map[int]int{ - 41: 0, // ')' (130x) - 57377: 1, // hintAggToCop (122x) - 57390: 2, // hintBCJoin (122x) - 57355: 3, // hintBKA (122x) - 57357: 4, // hintBNL (122x) - 57401: 5, // hintCTEInline (122x) - 57402: 6, // hintForceIndex (122x) - 57379: 7, // hintHashAgg (122x) - 57359: 8, // hintHashJoin (122x) - 57380: 9, // hintIgnoreIndex (122x) - 57378: 10, // hintIgnorePlanCache (122x) - 57363: 11, // hintIndexMerge (122x) - 57381: 12, // hintInlHashJoin (122x) - 57382: 13, // hintInlJoin (122x) - 57383: 14, // hintInlMergeJoin (122x) - 57351: 15, // hintJoinFixedOrder (122x) - 57352: 16, // hintJoinOrder (122x) - 57353: 17, // hintJoinPrefix (122x) - 57354: 18, // hintJoinSuffix (122x) - 57400: 19, // hintLimitToCop (122x) - 57373: 20, // hintMaxExecutionTime (122x) - 57384: 21, // hintMemoryQuota (122x) - 57361: 22, // hintMerge (122x) - 57365: 23, // hintMRR (122x) - 57356: 24, // hintNoBKA (122x) - 57358: 25, // hintNoBNL (122x) - 57360: 26, // hintNoHashJoin (122x) - 57367: 27, // hintNoICP (122x) - 57364: 28, // hintNoIndexMerge (122x) - 57362: 29, // hintNoMerge (122x) - 57366: 30, // hintNoMRR (122x) - 57368: 31, // hintNoRangeOptimization (122x) - 57372: 32, // hintNoSemijoin (122x) - 57370: 33, // hintNoSkipScan (122x) - 57385: 34, // hintNoSwapJoinInputs (122x) - 57399: 35, // hintNthPlan (122x) - 57376: 36, // hintQBName (122x) - 57386: 37, // hintQueryType (122x) - 57387: 38, // hintReadConsistentReplica (122x) - 57388: 39, // hintReadFromStorage (122x) - 57375: 40, // hintResourceGroup (122x) - 57371: 41, // hintSemijoin (122x) - 57374: 42, // hintSetVar (122x) - 57369: 43, // hintSkipScan (122x) - 57389: 44, // hintSMJoin (122x) - 57391: 45, // hintStreamAgg (122x) - 57392: 46, // hintSwapJoinInputs (122x) - 57397: 47, // hintTimeRange (122x) - 57398: 48, // hintUseCascades (122x) - 57394: 49, // hintUseIndex (122x) - 57393: 50, // hintUseIndexMerge (122x) - 57395: 51, // hintUsePlanCache (122x) - 57396: 52, // hintUseToja (122x) - 44: 53, // ',' (120x) - 57412: 54, // hintDupsWeedOut (100x) - 57413: 55, // hintFirstMatch (100x) - 57414: 56, // hintLooseScan (100x) - 57415: 57, // hintMaterialization (100x) - 57407: 58, // hintTiFlash (100x) - 57406: 59, // hintTiKV (100x) - 57408: 60, // hintFalse (99x) - 57403: 61, // hintOLAP (99x) - 57404: 62, // hintOLTP (99x) - 57409: 63, // hintTrue (99x) - 57411: 64, // hintGB (98x) - 57410: 65, // hintMB (98x) - 57347: 66, // hintIdentifier (97x) - 57349: 67, // hintSingleAtIdentifier (82x) - 93: 68, // ']' (76x) - 57405: 69, // hintPartition (70x) - 46: 70, // '.' (66x) - 61: 71, // '=' (66x) - 40: 72, // '(' (61x) - 57344: 73, // $end (24x) - 57436: 74, // QueryBlockOpt (17x) - 57428: 75, // Identifier (13x) - 57346: 76, // hintIntLit (8x) - 57350: 77, // hintStringLit (5x) - 57418: 78, // CommaOpt (4x) - 57424: 79, // HintTable (4x) - 57425: 80, // HintTableList (4x) - 91: 81, // '[' (3x) - 57417: 82, // BooleanHintName (2x) - 57419: 83, // HintIndexList (2x) - 57421: 84, // HintStorageType (2x) - 57422: 85, // HintStorageTypeAndTable (2x) - 57426: 86, // HintTableListOpt (2x) - 57431: 87, // JoinOrderOptimizerHintName (2x) - 57432: 88, // NullaryHintName (2x) - 57435: 89, // PartitionListOpt (2x) - 57438: 90, // StorageOptimizerHintOpt (2x) - 57439: 91, // SubqueryOptimizerHintName (2x) - 57442: 92, // SubqueryStrategy (2x) - 57443: 93, // SupportedIndexLevelOptimizerHintName (2x) - 57444: 94, // SupportedTableLevelOptimizerHintName (2x) - 57445: 95, // TableOptimizerHintOpt (2x) - 57447: 96, // UnsupportedIndexLevelOptimizerHintName (2x) - 57448: 97, // UnsupportedTableLevelOptimizerHintName (2x) - 57420: 98, // HintQueryType (1x) - 57423: 99, // HintStorageTypeAndTableList (1x) - 57427: 100, // HintTrueOrFalse (1x) - 57429: 101, // IndexNameList (1x) - 57430: 102, // IndexNameListOpt (1x) - 57433: 103, // OptimizerHintList (1x) - 57434: 104, // PartitionList (1x) - 57437: 105, // Start (1x) - 57440: 106, // SubqueryStrategies (1x) - 57441: 107, // SubqueryStrategiesOpt (1x) - 57446: 108, // UnitOfBytes (1x) - 57449: 109, // Value (1x) - 57416: 110, // $default (0x) - 57345: 111, // error (0x) - 57348: 112, // hintInvalid (0x) + 41: 0, // ')' (132x) + 57377: 1, // hintAggToCop (124x) + 57390: 2, // hintBCJoin (124x) + 57355: 3, // hintBKA (124x) + 57357: 4, // hintBNL (124x) + 57401: 5, // hintCTEInline (124x) + 57402: 6, // hintForceIndex (124x) + 57379: 7, // hintHashAgg (124x) + 57359: 8, // hintHashJoin (124x) + 57380: 9, // hintIgnoreIndex (124x) + 57378: 10, // hintIgnorePlanCache (124x) + 57363: 11, // hintIndexMerge (124x) + 57381: 12, // hintInlHashJoin (124x) + 57382: 13, // hintInlJoin (124x) + 57383: 14, // hintInlMergeJoin (124x) + 57351: 15, // hintJoinFixedOrder (124x) + 57352: 16, // hintJoinOrder (124x) + 57353: 17, // hintJoinPrefix (124x) + 57354: 18, // hintJoinSuffix (124x) + 57404: 19, // hintLeading (124x) + 57400: 20, // hintLimitToCop (124x) + 57373: 21, // hintMaxExecutionTime (124x) + 57384: 22, // hintMemoryQuota (124x) + 57361: 23, // hintMerge (124x) + 57365: 24, // hintMRR (124x) + 57356: 25, // hintNoBKA (124x) + 57358: 26, // hintNoBNL (124x) + 57360: 27, // hintNoHashJoin (124x) + 57367: 28, // hintNoICP (124x) + 57364: 29, // hintNoIndexMerge (124x) + 57362: 30, // hintNoMerge (124x) + 57366: 31, // hintNoMRR (124x) + 57368: 32, // hintNoRangeOptimization (124x) + 57372: 33, // hintNoSemijoin (124x) + 57370: 34, // hintNoSkipScan (124x) + 57385: 35, // hintNoSwapJoinInputs (124x) + 57399: 36, // hintNthPlan (124x) + 57376: 37, // hintQBName (124x) + 57386: 38, // hintQueryType (124x) + 57387: 39, // hintReadConsistentReplica (124x) + 57388: 40, // hintReadFromStorage (124x) + 57375: 41, // hintResourceGroup (124x) + 57371: 42, // hintSemijoin (124x) + 57374: 43, // hintSetVar (124x) + 57369: 44, // hintSkipScan (124x) + 57389: 45, // hintSMJoin (124x) + 57403: 46, // hintStraightJoin (124x) + 57391: 47, // hintStreamAgg (124x) + 57392: 48, // hintSwapJoinInputs (124x) + 57397: 49, // hintTimeRange (124x) + 57398: 50, // hintUseCascades (124x) + 57394: 51, // hintUseIndex (124x) + 57393: 52, // hintUseIndexMerge (124x) + 57395: 53, // hintUsePlanCache (124x) + 57396: 54, // hintUseToja (124x) + 44: 55, // ',' (122x) + 57414: 56, // hintDupsWeedOut (102x) + 57415: 57, // hintFirstMatch (102x) + 57416: 58, // hintLooseScan (102x) + 57417: 59, // hintMaterialization (102x) + 57409: 60, // hintTiFlash (102x) + 57408: 61, // hintTiKV (102x) + 57410: 62, // hintFalse (101x) + 57405: 63, // hintOLAP (101x) + 57406: 64, // hintOLTP (101x) + 57411: 65, // hintTrue (101x) + 57413: 66, // hintGB (100x) + 57412: 67, // hintMB (100x) + 57347: 68, // hintIdentifier (99x) + 57349: 69, // hintSingleAtIdentifier (84x) + 93: 70, // ']' (78x) + 57407: 71, // hintPartition (72x) + 46: 72, // '.' (68x) + 61: 73, // '=' (68x) + 40: 74, // '(' (63x) + 57344: 75, // $end (24x) + 57438: 76, // QueryBlockOpt (17x) + 57430: 77, // Identifier (13x) + 57346: 78, // hintIntLit (8x) + 57350: 79, // hintStringLit (5x) + 57420: 80, // CommaOpt (4x) + 57426: 81, // HintTable (4x) + 57427: 82, // HintTableList (4x) + 91: 83, // '[' (3x) + 57419: 84, // BooleanHintName (2x) + 57421: 85, // HintIndexList (2x) + 57423: 86, // HintStorageType (2x) + 57424: 87, // HintStorageTypeAndTable (2x) + 57428: 88, // HintTableListOpt (2x) + 57433: 89, // JoinOrderOptimizerHintName (2x) + 57434: 90, // NullaryHintName (2x) + 57437: 91, // PartitionListOpt (2x) + 57440: 92, // StorageOptimizerHintOpt (2x) + 57441: 93, // SubqueryOptimizerHintName (2x) + 57444: 94, // SubqueryStrategy (2x) + 57445: 95, // SupportedIndexLevelOptimizerHintName (2x) + 57446: 96, // SupportedTableLevelOptimizerHintName (2x) + 57447: 97, // TableOptimizerHintOpt (2x) + 57449: 98, // UnsupportedIndexLevelOptimizerHintName (2x) + 57450: 99, // UnsupportedTableLevelOptimizerHintName (2x) + 57422: 100, // HintQueryType (1x) + 57425: 101, // HintStorageTypeAndTableList (1x) + 57429: 102, // HintTrueOrFalse (1x) + 57431: 103, // IndexNameList (1x) + 57432: 104, // IndexNameListOpt (1x) + 57435: 105, // OptimizerHintList (1x) + 57436: 106, // PartitionList (1x) + 57439: 107, // Start (1x) + 57442: 108, // SubqueryStrategies (1x) + 57443: 109, // SubqueryStrategiesOpt (1x) + 57448: 110, // UnitOfBytes (1x) + 57451: 111, // Value (1x) + 57418: 112, // $default (0x) + 57345: 113, // error (0x) + 57348: 114, // hintInvalid (0x) } yyhintSymNames = []string{ @@ -358,80 +360,72 @@ var ( yyhintReductions = []struct{ xsym, components int }{ {0, 1}, + {107, 1}, {105, 1}, - {103, 1}, - {103, 3}, - {103, 1}, - {103, 3}, - {95, 4}, - {95, 4}, - {95, 4}, - {95, 4}, - {95, 4}, - {95, 4}, - {95, 5}, - {95, 5}, - {95, 5}, - {95, 6}, - {95, 4}, - {95, 4}, - {95, 6}, - {95, 6}, - {95, 5}, - {95, 4}, - {95, 5}, - {90, 5}, - {99, 1}, - {99, 3}, - {85, 4}, - {74, 0}, - {74, 1}, - {78, 0}, - {78, 1}, - {89, 0}, - {89, 4}, - {104, 1}, - {104, 3}, - {86, 1}, - {86, 1}, - {80, 2}, - {80, 3}, - {79, 3}, - {79, 5}, - {83, 4}, - {102, 0}, - {102, 1}, + {105, 3}, + {105, 1}, + {105, 3}, + {97, 4}, + {97, 4}, + {97, 4}, + {97, 4}, + {97, 4}, + {97, 4}, + {97, 5}, + {97, 5}, + {97, 5}, + {97, 6}, + {97, 4}, + {97, 4}, + {97, 6}, + {97, 6}, + {97, 5}, + {97, 4}, + {97, 5}, + {92, 5}, {101, 1}, {101, 3}, - {107, 0}, - {107, 1}, + {87, 4}, + {76, 0}, + {76, 1}, + {80, 0}, + {80, 1}, + {91, 0}, + {91, 4}, {106, 1}, {106, 3}, - {109, 1}, - {109, 1}, + {88, 1}, + {88, 1}, + {82, 2}, + {82, 3}, + {81, 3}, + {81, 5}, + {85, 4}, + {104, 0}, + {104, 1}, + {103, 1}, + {103, 3}, + {109, 0}, {109, 1}, {108, 1}, - {108, 1}, - {100, 1}, - {100, 1}, - {87, 1}, - {87, 1}, - {87, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {94, 1}, - {94, 1}, - {94, 1}, - {94, 1}, - {94, 1}, - {94, 1}, - {94, 1}, - {94, 1}, + {108, 3}, + {111, 1}, + {111, 1}, + {111, 1}, + {110, 1}, + {110, 1}, + {102, 1}, + {102, 1}, + {89, 1}, + {89, 1}, + {89, 1}, + {99, 1}, + {99, 1}, + {99, 1}, + {99, 1}, + {99, 1}, + {99, 1}, + {99, 1}, {96, 1}, {96, 1}, {96, 1}, @@ -439,407 +433,424 @@ var ( {96, 1}, {96, 1}, {96, 1}, - {93, 1}, - {93, 1}, - {93, 1}, - {93, 1}, - {91, 1}, - {91, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {82, 1}, - {82, 1}, - {88, 1}, - {88, 1}, - {88, 1}, - {88, 1}, - {88, 1}, - {88, 1}, - {88, 1}, - {88, 1}, - {88, 1}, + {96, 1}, + {96, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, + {98, 1}, {98, 1}, {98, 1}, + {95, 1}, + {95, 1}, + {95, 1}, + {95, 1}, + {93, 1}, + {93, 1}, + {94, 1}, + {94, 1}, + {94, 1}, + {94, 1}, {84, 1}, {84, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, + {90, 1}, + {90, 1}, + {90, 1}, + {90, 1}, + {90, 1}, + {90, 1}, + {90, 1}, + {90, 1}, + {90, 1}, + {90, 1}, + {100, 1}, + {100, 1}, + {86, 1}, + {86, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, + {77, 1}, } yyhintXErrors = map[yyhintXError]string{} - yyhintParseTab = [255][]uint16{ + yyhintParseTab = [259][]uint16{ // 0 - {1: 231, 206, 198, 200, 233, 223, 229, 212, 221, 236, 213, 208, 207, 211, 177, 195, 196, 197, 232, 184, 189, 203, 214, 199, 201, 202, 216, 234, 204, 215, 217, 225, 219, 210, 185, 188, 193, 235, 194, 187, 224, 186, 218, 205, 230, 209, 190, 227, 220, 222, 228, 226, 82: 191, 87: 178, 192, 90: 176, 183, 93: 182, 180, 175, 181, 179, 103: 174, 105: 173}, - {73: 172}, - {1: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 324, 73: 171, 78: 424}, - {1: 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 73: 170}, - {1: 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 73: 168}, + {1: 236, 210, 202, 204, 238, 228, 234, 216, 226, 241, 218, 212, 211, 215, 181, 199, 200, 201, 217, 237, 188, 193, 207, 219, 203, 205, 206, 221, 239, 208, 220, 222, 230, 224, 214, 189, 192, 197, 240, 198, 191, 229, 190, 223, 209, 242, 235, 213, 194, 232, 225, 227, 233, 231, 84: 195, 89: 182, 196, 92: 180, 187, 95: 186, 184, 179, 185, 183, 105: 178, 107: 177}, + {75: 176}, + {1: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 332, 75: 175, 80: 432}, + {1: 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 75: 174}, + {1: 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 75: 172}, // 5 - {72: 421}, - {72: 418}, - {72: 415}, - {72: 410}, - {72: 407}, + {74: 429}, + {74: 426}, + {74: 423}, + {74: 418}, + {74: 415}, // 10 - {72: 396}, - {72: 384}, - {72: 380}, - {72: 376}, - {72: 368}, + {74: 404}, + {74: 392}, + {74: 388}, + {74: 384}, + {74: 376}, // 15 - {72: 365}, - {72: 362}, - {72: 355}, - {72: 350}, - {72: 344}, + {74: 373}, + {74: 370}, + {74: 363}, + {74: 358}, + {74: 352}, // 20 - {72: 341}, - {72: 335}, - {72: 237}, - {72: 115}, - {72: 114}, + {74: 349}, + {74: 343}, + {74: 243}, + {74: 119}, + {74: 118}, // 25 - {72: 113}, - {72: 112}, - {72: 111}, - {72: 110}, - {72: 109}, + {74: 117}, + {74: 116}, + {74: 115}, + {74: 114}, + {74: 113}, // 30 - {72: 108}, - {72: 107}, - {72: 106}, - {72: 105}, - {72: 104}, + {74: 112}, + {74: 111}, + {74: 110}, + {74: 109}, + {74: 108}, // 35 - {72: 103}, - {72: 102}, - {72: 101}, - {72: 100}, - {72: 99}, + {74: 107}, + {74: 106}, + {74: 105}, + {74: 104}, + {74: 103}, // 40 - {72: 98}, - {72: 97}, - {72: 96}, - {72: 95}, - {72: 94}, + {74: 102}, + {74: 101}, + {74: 100}, + {74: 99}, + {74: 98}, // 45 - {72: 93}, - {72: 92}, - {72: 91}, - {72: 90}, - {72: 89}, + {74: 97}, + {74: 96}, + {74: 95}, + {74: 94}, + {74: 93}, // 50 - {72: 88}, - {72: 87}, - {72: 86}, - {72: 85}, - {72: 80}, + {74: 92}, + {74: 91}, + {74: 90}, + {74: 89}, + {74: 88}, // 55 - {72: 79}, - {72: 78}, - {72: 77}, - {72: 76}, - {72: 75}, + {74: 83}, + {74: 82}, + {74: 81}, + {74: 80}, + {74: 79}, // 60 - {72: 74}, - {72: 73}, - {72: 72}, - {72: 71}, - {72: 70}, + {74: 78}, + {74: 77}, + {74: 76}, + {74: 75}, + {74: 74}, // 65 - {58: 145, 145, 67: 239, 74: 238}, - {58: 244, 243, 84: 242, 241, 99: 240}, - {144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 68: 144, 144, 76: 144}, - {332, 53: 333}, - {148, 53: 148}, + {74: 73}, + {74: 72}, + {60: 149, 149, 69: 245, 76: 244}, + {60: 250, 249, 86: 248, 247, 101: 246}, + {148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 70: 148, 148, 78: 148}, // 70 - {81: 245}, - {81: 67}, - {81: 66}, - {1: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 247, 80: 246}, - {53: 330, 68: 329}, + {340, 55: 341}, + {152, 55: 152}, + {83: 251}, + {83: 69}, + {83: 68}, // 75 - {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 249, 79: 248}, - {135, 53: 135, 68: 135}, - {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 145, 145, 316, 74: 315}, - {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}, - {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, + {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 253, 82: 252}, + {55: 338, 70: 337}, + {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 255, 81: 254}, + {139, 55: 139, 70: 139}, + {149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 149, 149, 324, 76: 323}, // 80 - {63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, - {62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62}, - {61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61}, - {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60}, - {59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59}, + {67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67}, + {66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66}, + {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}, + {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, + {63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, // 85 - {58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58}, - {57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}, - {56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}, - {55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, - {54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54}, + {62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62}, + {61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61}, + {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60}, + {59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59}, + {58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58}, // 90 - {53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53}, - {52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, - {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, - {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, - {49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49}, + {57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}, + {56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}, + {55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, + {54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54}, + {53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53}, // 95 - {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, - {47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, - {46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, - {45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45}, - {44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, + {52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, + {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, + {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, + {49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49}, + {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, // 100 - {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43}, - {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, - {41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41}, - {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, - {39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, + {47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, + {46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, + {45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45}, + {44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, + {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43}, // 105 - {38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, - {37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37}, - {36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, - {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, - {34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, + {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, + {41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41}, + {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, + {39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, + {38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, // 110 - {33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33}, - {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}, - {31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, - {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, - {29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29}, + {37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37}, + {36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, + {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, + {34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, + {33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33}, // 115 - {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, - {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}, - {26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26}, - {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}, - {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24}, + {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}, + {31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, + {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, + {29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, // 120 - {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}, - {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, - {21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21}, - {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, - {19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}, + {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}, + {26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26}, + {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}, + {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24}, + {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}, // 125 - {18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, - {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17}, - {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, - {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, - {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, + {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, + {21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21}, + {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, + {19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}, + {18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, // 130 - {13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, - {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - {11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, - {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, + {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17}, + {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, + {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, + {13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, // 135 - {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, - {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}, - {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}, - {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, - {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, + {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, + {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, // 140 - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 68: 141, 319, 89: 328}, - {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 317}, + {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}, + {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}, + {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, + {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, + {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, // 145 - {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 145, 145, 74: 318}, - {141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 68: 141, 319, 89: 320}, - {72: 321}, - {132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 68: 132}, - {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 323, 104: 322}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 70: 145, 327, 91: 336}, + {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 325}, + {149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 149, 149, 76: 326}, // 150 - {325, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 324, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 78: 326}, - {139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139}, - {142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 54: 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 77: 142}, - {140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 68: 140}, - {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 327}, + {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 70: 145, 327, 91: 328}, + {74: 329}, + {136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 70: 136}, + {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 331, 106: 330}, + {333, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 332, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 80: 334}, // 155 - {138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138}, - {133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 68: 133}, - {146, 53: 146}, - {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 249, 79: 331}, - {134, 53: 134, 68: 134}, + {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143}, + {146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 56: 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 79: 146}, + {144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 70: 144}, + {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 335}, + {142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142}, // 160 - {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 73: 149}, - {58: 244, 243, 84: 242, 334}, - {147, 53: 147}, - {61: 145, 145, 67: 239, 74: 336}, - {61: 338, 339, 98: 337}, + {137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 70: 137}, + {150, 55: 150}, + {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 255, 81: 339}, + {138, 55: 138, 70: 138}, + {1: 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 75: 153}, // 165 - {340}, - {69}, - {68}, - {1: 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 73: 150}, - {145, 67: 239, 74: 342}, + {60: 250, 249, 86: 248, 342}, + {151, 55: 151}, + {63: 149, 149, 69: 245, 76: 344}, + {63: 346, 347, 100: 345}, + {348}, // 170 - {343}, - {1: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 73: 151}, - {60: 145, 63: 145, 67: 239, 74: 345}, - {60: 348, 63: 347, 100: 346}, - {349}, + {71}, + {70}, + {1: 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 75: 154}, + {149, 69: 245, 76: 350}, + {351}, // 175 - {117}, - {116}, - {1: 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 73: 152}, - {77: 351}, - {53: 324, 77: 143, 352}, + {1: 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 75: 155}, + {62: 149, 65: 149, 69: 245, 76: 353}, + {62: 356, 65: 355, 102: 354}, + {357}, + {121}, // 180 - {77: 353}, - {354}, - {1: 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 73: 153}, - {67: 239, 74: 356, 76: 145}, - {76: 357}, + {120}, + {1: 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 75: 156}, + {79: 359}, + {55: 332, 79: 147, 360}, + {79: 361}, // 185 - {64: 360, 359, 108: 358}, - {361}, - {119}, - {118}, - {1: 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 73: 154}, + {362}, + {1: 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 75: 157}, + {69: 245, 76: 364, 78: 149}, + {78: 365}, + {66: 368, 367, 110: 366}, // 190 - {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 363}, - {364}, - {1: 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 73: 155}, - {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 366}, - {367}, + {369}, + {123}, + {122}, + {1: 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 75: 158}, + {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 371}, // 195 - {1: 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 73: 156}, - {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 369}, - {71: 370}, - {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 373, 374, 372, 109: 371}, + {372}, + {1: 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 75: 159}, + {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 374}, {375}, + {1: 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 75: 160}, // 200 - {122}, - {121}, - {120}, - {1: 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 73: 157}, - {67: 239, 74: 377, 76: 145}, + {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 377}, + {73: 378}, + {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 381, 382, 380, 111: 379}, + {383}, + {126}, // 205 - {76: 378}, - {379}, - {1: 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 73: 158}, - {67: 239, 74: 381, 76: 145}, - {76: 382}, + {125}, + {124}, + {1: 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 75: 161}, + {69: 245, 76: 385, 78: 149}, + {78: 386}, // 210 - {383}, - {1: 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 73: 159}, - {145, 54: 145, 145, 145, 145, 67: 239, 74: 385}, - {126, 54: 389, 390, 391, 392, 92: 388, 106: 387, 386}, - {395}, + {387}, + {1: 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 75: 162}, + {69: 245, 76: 389, 78: 149}, + {78: 390}, + {391}, // 215 - {125, 53: 393}, - {124, 53: 124}, - {84, 53: 84}, - {83, 53: 83}, - {82, 53: 82}, + {1: 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 75: 163}, + {149, 56: 149, 149, 149, 149, 69: 245, 76: 393}, + {130, 56: 397, 398, 399, 400, 94: 396, 108: 395, 394}, + {403}, + {129, 55: 401}, // 220 - {81, 53: 81}, - {54: 389, 390, 391, 392, 92: 394}, - {123, 53: 123}, - {1: 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 73: 160}, - {1: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 398, 83: 397}, + {128, 55: 128}, + {87, 55: 87}, + {86, 55: 86}, + {85, 55: 85}, + {84, 55: 84}, // 225 - {406}, - {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 249, 79: 399}, - {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 324, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 78: 400}, - {130, 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 403, 101: 402, 401}, - {131}, + {56: 397, 398, 399, 400, 94: 402}, + {127, 55: 127}, + {1: 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 75: 164}, + {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 406, 85: 405}, + {414}, // 230 - {129, 53: 404}, - {128, 53: 128}, - {1: 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 405}, - {127, 53: 127}, - {1: 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 73: 161}, + {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 255, 81: 407}, + {147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 332, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 80: 408}, + {134, 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 411, 103: 410, 409}, + {135}, + {133, 55: 412}, // 235 - {1: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 398, 83: 408}, - {409}, - {1: 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 73: 162}, - {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 413, 80: 412, 86: 411}, - {414}, + {132, 55: 132}, + {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 413}, + {131, 55: 131}, + {1: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 75: 165}, + {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 406, 85: 416}, // 240 - {137, 53: 330}, - {136, 277, 292, 255, 257, 279, 302, 281, 259, 282, 280, 263, 283, 284, 285, 251, 252, 253, 254, 278, 273, 286, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 287, 301, 276, 288, 289, 290, 275, 271, 274, 269, 291, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 249, 79: 248}, - {1: 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 73: 163}, - {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 413, 80: 412, 86: 416}, {417}, + {1: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 75: 166}, + {149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 421, 82: 420, 88: 419}, + {422}, + {141, 55: 338}, // 245 - {1: 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 73: 164}, - {1: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 247, 80: 419}, - {420, 53: 330}, - {1: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 73: 165}, - {145, 67: 239, 74: 422}, + {140, 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 255, 81: 254}, + {1: 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 75: 167}, + {149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 421, 82: 420, 88: 424}, + {425}, + {1: 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 75: 168}, // 250 - {423}, - {1: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 73: 166}, - {1: 231, 206, 198, 200, 233, 223, 229, 212, 221, 236, 213, 208, 207, 211, 177, 195, 196, 197, 232, 184, 189, 203, 214, 199, 201, 202, 216, 234, 204, 215, 217, 225, 219, 210, 185, 188, 193, 235, 194, 187, 224, 186, 218, 205, 230, 209, 190, 227, 220, 222, 228, 226, 82: 191, 87: 178, 192, 90: 426, 183, 93: 182, 180, 425, 181, 179}, - {1: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 73: 169}, - {1: 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 73: 167}, + {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 253, 82: 427}, + {428, 55: 338}, + {1: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 75: 169}, + {149, 69: 245, 76: 430}, + {431}, + // 255 + {1: 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 75: 170}, + {1: 236, 210, 202, 204, 238, 228, 234, 216, 226, 241, 218, 212, 211, 215, 181, 199, 200, 201, 217, 237, 188, 193, 207, 219, 203, 205, 206, 221, 239, 208, 220, 222, 230, 224, 214, 189, 192, 197, 240, 198, 191, 229, 190, 223, 209, 242, 235, 213, 194, 232, 225, 227, 233, 231, 84: 195, 89: 182, 196, 92: 434, 187, 95: 186, 184, 433, 185, 183}, + {1: 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 75: 173}, + {1: 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 75: 171}, } ) @@ -879,7 +890,7 @@ func yyhintlex1(yylex yyhintLexer, lval *yyhintSymType) (n int) { } func yyhintParse(yylex yyhintLexer, parser *hintParser) int { - const yyError = 111 + const yyError = 113 yyEx, _ := yylex.(yyhintLexerEx) var yyn int From 8141d5c03381328f33ba36dd17b766805d8359f0 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Thu, 19 May 2022 18:58:42 +0800 Subject: [PATCH 22/42] rename hint change the hint for CTE name. Old name: CTEInline , New name: Merge. Because we need align with MySQL --- parser/ast/misc.go | 2 +- parser/ast/misc_test.go | 2 +- parser/hintparser.go | 1091 ++++++++++----------- parser/hintparser.y | 5 +- parser/misc.go | 1 - parser/parser_test.go | 8 +- planner/core/logical_plan_builder.go | 20 +- planner/core/logical_plans.go | 2 +- planner/core/physical_plan_test.go | 2 +- planner/core/planbuilder.go | 8 +- planner/core/testdata/plan_suite_in.json | 8 +- planner/core/testdata/plan_suite_out.json | 8 +- 12 files changed, 573 insertions(+), 584 deletions(-) diff --git a/parser/ast/misc.go b/parser/ast/misc.go index c150c2cfb6e4b..6e5b610b8ff92 100644 --- a/parser/ast/misc.go +++ b/parser/ast/misc.go @@ -3418,7 +3418,7 @@ func (n *TableOptimizerHint) Restore(ctx *format.RestoreCtx) error { } // Hints without args except query block. switch n.HintName.L { - case "hash_agg", "stream_agg", "agg_to_cop", "read_consistent_replica", "no_index_merge", "qb_name", "ignore_plan_cache", "limit_to_cop", "straight_join", "cte_inline": + case "hash_agg", "stream_agg", "agg_to_cop", "read_consistent_replica", "no_index_merge", "qb_name", "ignore_plan_cache", "limit_to_cop", "straight_join", "merge": ctx.WritePlain(")") return nil } diff --git a/parser/ast/misc_test.go b/parser/ast/misc_test.go index 1b50a909006e2..3b034a6afed4c 100644 --- a/parser/ast/misc_test.go +++ b/parser/ast/misc_test.go @@ -274,7 +274,7 @@ func TestTableOptimizerHintRestore(t *testing.T) { {"AGG_TO_COP()", "AGG_TO_COP()"}, {"AGG_TO_COP(@sel_1)", "AGG_TO_COP(@`sel_1`)"}, {"LIMIT_TO_COP()", "LIMIT_TO_COP()"}, - {"CTE_INLINE()", "CTE_INLINE()"}, + {"MERGE()", "MERGE()"}, {"STRAIGHT_JOIN()", "STRAIGHT_JOIN()"}, {"NO_INDEX_MERGE()", "NO_INDEX_MERGE()"}, {"NO_INDEX_MERGE(@sel1)", "NO_INDEX_MERGE(@`sel1`)"}, diff --git a/parser/hintparser.go b/parser/hintparser.go index 7816fe6cde7b7..f5e10e6cdcd54 100644 --- a/parser/hintparser.go +++ b/parser/hintparser.go @@ -41,19 +41,18 @@ type yyhintXError struct { } const ( - yyhintDefault = 57418 + yyhintDefault = 57417 yyhintEOFCode = 57344 yyhintErrCode = 57345 hintAggToCop = 57377 hintBCJoin = 57390 hintBKA = 57355 hintBNL = 57357 - hintCTEInline = 57401 - hintDupsWeedOut = 57414 - hintFalse = 57410 - hintFirstMatch = 57415 - hintForceIndex = 57402 - hintGB = 57413 + hintDupsWeedOut = 57413 + hintFalse = 57409 + hintFirstMatch = 57414 + hintForceIndex = 57401 + hintGB = 57412 hintHashAgg = 57379 hintHashJoin = 57359 hintIdentifier = 57347 @@ -69,12 +68,12 @@ const ( hintJoinOrder = 57352 hintJoinPrefix = 57353 hintJoinSuffix = 57354 - hintLeading = 57404 + hintLeading = 57403 hintLimitToCop = 57400 - hintLooseScan = 57416 - hintMB = 57412 + hintLooseScan = 57415 + hintMB = 57411 hintMRR = 57365 - hintMaterialization = 57417 + hintMaterialization = 57416 hintMaxExecutionTime = 57373 hintMemoryQuota = 57384 hintMerge = 57361 @@ -90,9 +89,9 @@ const ( hintNoSkipScan = 57370 hintNoSwapJoinInputs = 57385 hintNthPlan = 57399 - hintOLAP = 57405 - hintOLTP = 57406 - hintPartition = 57407 + hintOLAP = 57404 + hintOLTP = 57405 + hintPartition = 57406 hintQBName = 57376 hintQueryType = 57386 hintReadConsistentReplica = 57387 @@ -103,14 +102,14 @@ const ( hintSetVar = 57374 hintSingleAtIdentifier = 57349 hintSkipScan = 57369 - hintStraightJoin = 57403 + hintStraightJoin = 57402 hintStreamAgg = 57391 hintStringLit = 57350 hintSwapJoinInputs = 57392 - hintTiFlash = 57409 - hintTiKV = 57408 + hintTiFlash = 57408 + hintTiKV = 57407 hintTimeRange = 57397 - hintTrue = 57411 + hintTrue = 57410 hintUseCascades = 57398 hintUseIndex = 57394 hintUseIndexMerge = 57393 @@ -118,126 +117,125 @@ const ( hintUseToja = 57396 yyhintMaxDepth = 200 - yyhintTabOfs = -176 + yyhintTabOfs = -174 ) var ( yyhintXLAT = map[int]int{ - 41: 0, // ')' (132x) - 57377: 1, // hintAggToCop (124x) - 57390: 2, // hintBCJoin (124x) - 57355: 3, // hintBKA (124x) - 57357: 4, // hintBNL (124x) - 57401: 5, // hintCTEInline (124x) - 57402: 6, // hintForceIndex (124x) - 57379: 7, // hintHashAgg (124x) - 57359: 8, // hintHashJoin (124x) - 57380: 9, // hintIgnoreIndex (124x) - 57378: 10, // hintIgnorePlanCache (124x) - 57363: 11, // hintIndexMerge (124x) - 57381: 12, // hintInlHashJoin (124x) - 57382: 13, // hintInlJoin (124x) - 57383: 14, // hintInlMergeJoin (124x) - 57351: 15, // hintJoinFixedOrder (124x) - 57352: 16, // hintJoinOrder (124x) - 57353: 17, // hintJoinPrefix (124x) - 57354: 18, // hintJoinSuffix (124x) - 57404: 19, // hintLeading (124x) - 57400: 20, // hintLimitToCop (124x) - 57373: 21, // hintMaxExecutionTime (124x) - 57384: 22, // hintMemoryQuota (124x) - 57361: 23, // hintMerge (124x) - 57365: 24, // hintMRR (124x) - 57356: 25, // hintNoBKA (124x) - 57358: 26, // hintNoBNL (124x) - 57360: 27, // hintNoHashJoin (124x) - 57367: 28, // hintNoICP (124x) - 57364: 29, // hintNoIndexMerge (124x) - 57362: 30, // hintNoMerge (124x) - 57366: 31, // hintNoMRR (124x) - 57368: 32, // hintNoRangeOptimization (124x) - 57372: 33, // hintNoSemijoin (124x) - 57370: 34, // hintNoSkipScan (124x) - 57385: 35, // hintNoSwapJoinInputs (124x) - 57399: 36, // hintNthPlan (124x) - 57376: 37, // hintQBName (124x) - 57386: 38, // hintQueryType (124x) - 57387: 39, // hintReadConsistentReplica (124x) - 57388: 40, // hintReadFromStorage (124x) - 57375: 41, // hintResourceGroup (124x) - 57371: 42, // hintSemijoin (124x) - 57374: 43, // hintSetVar (124x) - 57369: 44, // hintSkipScan (124x) - 57389: 45, // hintSMJoin (124x) - 57403: 46, // hintStraightJoin (124x) - 57391: 47, // hintStreamAgg (124x) - 57392: 48, // hintSwapJoinInputs (124x) - 57397: 49, // hintTimeRange (124x) - 57398: 50, // hintUseCascades (124x) - 57394: 51, // hintUseIndex (124x) - 57393: 52, // hintUseIndexMerge (124x) - 57395: 53, // hintUsePlanCache (124x) - 57396: 54, // hintUseToja (124x) - 44: 55, // ',' (122x) - 57414: 56, // hintDupsWeedOut (102x) - 57415: 57, // hintFirstMatch (102x) - 57416: 58, // hintLooseScan (102x) - 57417: 59, // hintMaterialization (102x) - 57409: 60, // hintTiFlash (102x) - 57408: 61, // hintTiKV (102x) - 57410: 62, // hintFalse (101x) - 57405: 63, // hintOLAP (101x) - 57406: 64, // hintOLTP (101x) - 57411: 65, // hintTrue (101x) - 57413: 66, // hintGB (100x) - 57412: 67, // hintMB (100x) - 57347: 68, // hintIdentifier (99x) - 57349: 69, // hintSingleAtIdentifier (84x) - 93: 70, // ']' (78x) - 57407: 71, // hintPartition (72x) - 46: 72, // '.' (68x) - 61: 73, // '=' (68x) - 40: 74, // '(' (63x) - 57344: 75, // $end (24x) - 57438: 76, // QueryBlockOpt (17x) - 57430: 77, // Identifier (13x) - 57346: 78, // hintIntLit (8x) - 57350: 79, // hintStringLit (5x) - 57420: 80, // CommaOpt (4x) - 57426: 81, // HintTable (4x) - 57427: 82, // HintTableList (4x) - 91: 83, // '[' (3x) - 57419: 84, // BooleanHintName (2x) - 57421: 85, // HintIndexList (2x) - 57423: 86, // HintStorageType (2x) - 57424: 87, // HintStorageTypeAndTable (2x) - 57428: 88, // HintTableListOpt (2x) - 57433: 89, // JoinOrderOptimizerHintName (2x) - 57434: 90, // NullaryHintName (2x) - 57437: 91, // PartitionListOpt (2x) - 57440: 92, // StorageOptimizerHintOpt (2x) - 57441: 93, // SubqueryOptimizerHintName (2x) - 57444: 94, // SubqueryStrategy (2x) - 57445: 95, // SupportedIndexLevelOptimizerHintName (2x) - 57446: 96, // SupportedTableLevelOptimizerHintName (2x) - 57447: 97, // TableOptimizerHintOpt (2x) - 57449: 98, // UnsupportedIndexLevelOptimizerHintName (2x) - 57450: 99, // UnsupportedTableLevelOptimizerHintName (2x) - 57422: 100, // HintQueryType (1x) - 57425: 101, // HintStorageTypeAndTableList (1x) - 57429: 102, // HintTrueOrFalse (1x) - 57431: 103, // IndexNameList (1x) - 57432: 104, // IndexNameListOpt (1x) - 57435: 105, // OptimizerHintList (1x) - 57436: 106, // PartitionList (1x) - 57439: 107, // Start (1x) - 57442: 108, // SubqueryStrategies (1x) - 57443: 109, // SubqueryStrategiesOpt (1x) - 57448: 110, // UnitOfBytes (1x) - 57451: 111, // Value (1x) - 57418: 112, // $default (0x) - 57345: 113, // error (0x) - 57348: 114, // hintInvalid (0x) + 41: 0, // ')' (131x) + 57377: 1, // hintAggToCop (123x) + 57390: 2, // hintBCJoin (123x) + 57355: 3, // hintBKA (123x) + 57357: 4, // hintBNL (123x) + 57401: 5, // hintForceIndex (123x) + 57379: 6, // hintHashAgg (123x) + 57359: 7, // hintHashJoin (123x) + 57380: 8, // hintIgnoreIndex (123x) + 57378: 9, // hintIgnorePlanCache (123x) + 57363: 10, // hintIndexMerge (123x) + 57381: 11, // hintInlHashJoin (123x) + 57382: 12, // hintInlJoin (123x) + 57383: 13, // hintInlMergeJoin (123x) + 57351: 14, // hintJoinFixedOrder (123x) + 57352: 15, // hintJoinOrder (123x) + 57353: 16, // hintJoinPrefix (123x) + 57354: 17, // hintJoinSuffix (123x) + 57403: 18, // hintLeading (123x) + 57400: 19, // hintLimitToCop (123x) + 57373: 20, // hintMaxExecutionTime (123x) + 57384: 21, // hintMemoryQuota (123x) + 57361: 22, // hintMerge (123x) + 57365: 23, // hintMRR (123x) + 57356: 24, // hintNoBKA (123x) + 57358: 25, // hintNoBNL (123x) + 57360: 26, // hintNoHashJoin (123x) + 57367: 27, // hintNoICP (123x) + 57364: 28, // hintNoIndexMerge (123x) + 57362: 29, // hintNoMerge (123x) + 57366: 30, // hintNoMRR (123x) + 57368: 31, // hintNoRangeOptimization (123x) + 57372: 32, // hintNoSemijoin (123x) + 57370: 33, // hintNoSkipScan (123x) + 57385: 34, // hintNoSwapJoinInputs (123x) + 57399: 35, // hintNthPlan (123x) + 57376: 36, // hintQBName (123x) + 57386: 37, // hintQueryType (123x) + 57387: 38, // hintReadConsistentReplica (123x) + 57388: 39, // hintReadFromStorage (123x) + 57375: 40, // hintResourceGroup (123x) + 57371: 41, // hintSemijoin (123x) + 57374: 42, // hintSetVar (123x) + 57369: 43, // hintSkipScan (123x) + 57389: 44, // hintSMJoin (123x) + 57402: 45, // hintStraightJoin (123x) + 57391: 46, // hintStreamAgg (123x) + 57392: 47, // hintSwapJoinInputs (123x) + 57397: 48, // hintTimeRange (123x) + 57398: 49, // hintUseCascades (123x) + 57394: 50, // hintUseIndex (123x) + 57393: 51, // hintUseIndexMerge (123x) + 57395: 52, // hintUsePlanCache (123x) + 57396: 53, // hintUseToja (123x) + 44: 54, // ',' (121x) + 57413: 55, // hintDupsWeedOut (101x) + 57414: 56, // hintFirstMatch (101x) + 57415: 57, // hintLooseScan (101x) + 57416: 58, // hintMaterialization (101x) + 57408: 59, // hintTiFlash (101x) + 57407: 60, // hintTiKV (101x) + 57409: 61, // hintFalse (100x) + 57404: 62, // hintOLAP (100x) + 57405: 63, // hintOLTP (100x) + 57410: 64, // hintTrue (100x) + 57412: 65, // hintGB (99x) + 57411: 66, // hintMB (99x) + 57347: 67, // hintIdentifier (98x) + 57349: 68, // hintSingleAtIdentifier (83x) + 93: 69, // ']' (77x) + 57406: 70, // hintPartition (71x) + 46: 71, // '.' (67x) + 61: 72, // '=' (67x) + 40: 73, // '(' (62x) + 57344: 74, // $end (24x) + 57437: 75, // QueryBlockOpt (17x) + 57429: 76, // Identifier (13x) + 57346: 77, // hintIntLit (8x) + 57350: 78, // hintStringLit (5x) + 57419: 79, // CommaOpt (4x) + 57425: 80, // HintTable (4x) + 57426: 81, // HintTableList (4x) + 91: 82, // '[' (3x) + 57418: 83, // BooleanHintName (2x) + 57420: 84, // HintIndexList (2x) + 57422: 85, // HintStorageType (2x) + 57423: 86, // HintStorageTypeAndTable (2x) + 57427: 87, // HintTableListOpt (2x) + 57432: 88, // JoinOrderOptimizerHintName (2x) + 57433: 89, // NullaryHintName (2x) + 57436: 90, // PartitionListOpt (2x) + 57439: 91, // StorageOptimizerHintOpt (2x) + 57440: 92, // SubqueryOptimizerHintName (2x) + 57443: 93, // SubqueryStrategy (2x) + 57444: 94, // SupportedIndexLevelOptimizerHintName (2x) + 57445: 95, // SupportedTableLevelOptimizerHintName (2x) + 57446: 96, // TableOptimizerHintOpt (2x) + 57448: 97, // UnsupportedIndexLevelOptimizerHintName (2x) + 57449: 98, // UnsupportedTableLevelOptimizerHintName (2x) + 57421: 99, // HintQueryType (1x) + 57424: 100, // HintStorageTypeAndTableList (1x) + 57428: 101, // HintTrueOrFalse (1x) + 57430: 102, // IndexNameList (1x) + 57431: 103, // IndexNameListOpt (1x) + 57434: 104, // OptimizerHintList (1x) + 57435: 105, // PartitionList (1x) + 57438: 106, // Start (1x) + 57441: 107, // SubqueryStrategies (1x) + 57442: 108, // SubqueryStrategiesOpt (1x) + 57447: 109, // UnitOfBytes (1x) + 57450: 110, // Value (1x) + 57417: 111, // $default (0x) + 57345: 112, // error (0x) + 57348: 113, // hintInvalid (0x) } yyhintSymNames = []string{ @@ -246,7 +244,6 @@ var ( "hintBCJoin", "hintBKA", "hintBNL", - "hintCTEInline", "hintForceIndex", "hintHashAgg", "hintHashJoin", @@ -360,82 +357,65 @@ var ( yyhintReductions = []struct{ xsym, components int }{ {0, 1}, - {107, 1}, - {105, 1}, - {105, 3}, + {106, 1}, + {104, 1}, + {104, 3}, + {104, 1}, + {104, 3}, + {96, 4}, + {96, 4}, + {96, 4}, + {96, 4}, + {96, 4}, + {96, 4}, + {96, 5}, + {96, 5}, + {96, 5}, + {96, 6}, + {96, 4}, + {96, 4}, + {96, 6}, + {96, 6}, + {96, 5}, + {96, 4}, + {96, 5}, + {91, 5}, + {100, 1}, + {100, 3}, + {86, 4}, + {75, 0}, + {75, 1}, + {79, 0}, + {79, 1}, + {90, 0}, + {90, 4}, {105, 1}, {105, 3}, - {97, 4}, - {97, 4}, - {97, 4}, - {97, 4}, - {97, 4}, - {97, 4}, - {97, 5}, - {97, 5}, - {97, 5}, - {97, 6}, - {97, 4}, - {97, 4}, - {97, 6}, - {97, 6}, - {97, 5}, - {97, 4}, - {97, 5}, - {92, 5}, - {101, 1}, - {101, 3}, - {87, 4}, - {76, 0}, - {76, 1}, - {80, 0}, - {80, 1}, - {91, 0}, - {91, 4}, - {106, 1}, - {106, 3}, - {88, 1}, - {88, 1}, - {82, 2}, - {82, 3}, + {87, 1}, + {87, 1}, + {81, 2}, {81, 3}, - {81, 5}, - {85, 4}, - {104, 0}, - {104, 1}, + {80, 3}, + {80, 5}, + {84, 4}, + {103, 0}, {103, 1}, - {103, 3}, - {109, 0}, - {109, 1}, + {102, 1}, + {102, 3}, + {108, 0}, {108, 1}, - {108, 3}, - {111, 1}, - {111, 1}, - {111, 1}, + {107, 1}, + {107, 3}, {110, 1}, {110, 1}, - {102, 1}, - {102, 1}, - {89, 1}, - {89, 1}, - {89, 1}, - {99, 1}, - {99, 1}, - {99, 1}, - {99, 1}, - {99, 1}, - {99, 1}, - {99, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {98, 1}, + {110, 1}, + {109, 1}, + {109, 1}, + {101, 1}, + {101, 1}, + {88, 1}, + {88, 1}, + {88, 1}, {98, 1}, {98, 1}, {98, 1}, @@ -446,411 +426,424 @@ var ( {95, 1}, {95, 1}, {95, 1}, - {93, 1}, - {93, 1}, + {95, 1}, + {95, 1}, + {95, 1}, + {95, 1}, + {95, 1}, + {95, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, {94, 1}, {94, 1}, {94, 1}, {94, 1}, - {84, 1}, - {84, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {100, 1}, - {100, 1}, - {86, 1}, - {86, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, + {92, 1}, + {92, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {83, 1}, + {83, 1}, + {89, 1}, + {89, 1}, + {89, 1}, + {89, 1}, + {89, 1}, + {89, 1}, + {89, 1}, + {89, 1}, + {89, 1}, + {99, 1}, + {99, 1}, + {85, 1}, + {85, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, + {76, 1}, } yyhintXErrors = map[yyhintXError]string{} - yyhintParseTab = [259][]uint16{ + yyhintParseTab = [257][]uint16{ // 0 - {1: 236, 210, 202, 204, 238, 228, 234, 216, 226, 241, 218, 212, 211, 215, 181, 199, 200, 201, 217, 237, 188, 193, 207, 219, 203, 205, 206, 221, 239, 208, 220, 222, 230, 224, 214, 189, 192, 197, 240, 198, 191, 229, 190, 223, 209, 242, 235, 213, 194, 232, 225, 227, 233, 231, 84: 195, 89: 182, 196, 92: 180, 187, 95: 186, 184, 179, 185, 183, 105: 178, 107: 177}, - {75: 176}, - {1: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 332, 75: 175, 80: 432}, - {1: 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 75: 174}, - {1: 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 75: 172}, + {1: 234, 207, 200, 202, 226, 232, 214, 224, 238, 216, 210, 208, 213, 179, 197, 198, 199, 215, 235, 186, 191, 209, 217, 201, 203, 204, 219, 236, 205, 218, 220, 228, 222, 212, 187, 190, 195, 237, 196, 189, 227, 188, 221, 206, 239, 233, 211, 192, 230, 223, 225, 231, 229, 83: 193, 88: 180, 194, 91: 178, 185, 94: 184, 182, 177, 183, 181, 104: 176, 106: 175}, + {74: 174}, + {1: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 328, 74: 173, 79: 428}, + {1: 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 74: 172}, + {1: 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 74: 170}, // 5 - {74: 429}, - {74: 426}, - {74: 423}, - {74: 418}, - {74: 415}, + {73: 425}, + {73: 422}, + {73: 419}, + {73: 414}, + {73: 411}, // 10 - {74: 404}, - {74: 392}, - {74: 388}, - {74: 384}, - {74: 376}, + {73: 400}, + {73: 388}, + {73: 384}, + {73: 380}, + {73: 372}, // 15 - {74: 373}, - {74: 370}, - {74: 363}, - {74: 358}, - {74: 352}, + {73: 369}, + {73: 366}, + {73: 359}, + {73: 354}, + {73: 348}, // 20 - {74: 349}, - {74: 343}, - {74: 243}, - {74: 119}, - {74: 118}, + {73: 345}, + {73: 339}, + {73: 240}, + {73: 117}, + {73: 116}, // 25 - {74: 117}, - {74: 116}, - {74: 115}, - {74: 114}, - {74: 113}, + {73: 115}, + {73: 114}, + {73: 113}, + {73: 112}, + {73: 111}, // 30 - {74: 112}, - {74: 111}, - {74: 110}, - {74: 109}, - {74: 108}, + {73: 110}, + {73: 109}, + {73: 108}, + {73: 107}, + {73: 106}, // 35 - {74: 107}, - {74: 106}, - {74: 105}, - {74: 104}, - {74: 103}, + {73: 105}, + {73: 104}, + {73: 103}, + {73: 102}, + {73: 101}, // 40 - {74: 102}, - {74: 101}, - {74: 100}, - {74: 99}, - {74: 98}, + {73: 100}, + {73: 99}, + {73: 98}, + {73: 97}, + {73: 96}, // 45 - {74: 97}, - {74: 96}, - {74: 95}, - {74: 94}, - {74: 93}, + {73: 95}, + {73: 94}, + {73: 93}, + {73: 92}, + {73: 91}, // 50 - {74: 92}, - {74: 91}, - {74: 90}, - {74: 89}, - {74: 88}, + {73: 90}, + {73: 89}, + {73: 88}, + {73: 87}, + {73: 86}, // 55 - {74: 83}, - {74: 82}, - {74: 81}, - {74: 80}, - {74: 79}, + {73: 81}, + {73: 80}, + {73: 79}, + {73: 78}, + {73: 77}, // 60 - {74: 78}, - {74: 77}, - {74: 76}, - {74: 75}, - {74: 74}, + {73: 76}, + {73: 75}, + {73: 74}, + {73: 73}, + {73: 72}, // 65 - {74: 73}, - {74: 72}, - {60: 149, 149, 69: 245, 76: 244}, - {60: 250, 249, 86: 248, 247, 101: 246}, - {148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 70: 148, 148, 78: 148}, + {73: 71}, + {59: 147, 147, 68: 242, 75: 241}, + {59: 247, 246, 85: 245, 244, 100: 243}, + {146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 69: 146, 146, 77: 146}, + {336, 54: 337}, // 70 - {340, 55: 341}, - {152, 55: 152}, - {83: 251}, - {83: 69}, - {83: 68}, + {150, 54: 150}, + {82: 248}, + {82: 68}, + {82: 67}, + {1: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 55: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 242, 75: 250, 81: 249}, // 75 - {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 253, 82: 252}, - {55: 338, 70: 337}, - {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 255, 81: 254}, - {139, 55: 139, 70: 139}, - {149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 149, 149, 324, 76: 323}, + {54: 334, 69: 333}, + {1: 280, 294, 258, 260, 304, 283, 262, 284, 282, 266, 285, 286, 287, 254, 255, 256, 257, 306, 281, 276, 288, 264, 268, 259, 261, 263, 270, 267, 265, 269, 271, 275, 273, 289, 303, 279, 290, 291, 292, 278, 274, 277, 272, 293, 305, 295, 296, 301, 302, 298, 297, 299, 300, 55: 315, 316, 317, 318, 310, 309, 311, 307, 308, 312, 314, 313, 253, 76: 252, 80: 251}, + {137, 54: 137, 69: 137}, + {147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 242, 147, 147, 320, 75: 319}, + {66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66}, // 80 - {67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67}, - {66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66}, - {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}, - {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, - {63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, + {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}, + {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, + {63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, + {62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62}, + {61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61}, // 85 - {62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62}, - {61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61}, - {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60}, - {59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59}, - {58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58}, + {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60}, + {59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59}, + {58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58}, + {57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}, + {56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}, // 90 - {57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}, - {56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}, - {55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, - {54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54}, - {53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53}, + {55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, + {54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54}, + {53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53}, + {52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, + {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, // 95 - {52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, - {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, - {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, - {49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49}, - {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, + {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, + {49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49}, + {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, + {47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, + {46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, // 100 - {47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, - {46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, - {45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45}, - {44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, - {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43}, + {45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45}, + {44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, + {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43}, + {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, + {41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41}, // 105 - {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, - {41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41}, - {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, - {39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, - {38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, + {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, + {39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, + {38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, + {37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37}, + {36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, // 110 - {37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37}, - {36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, - {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, - {34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, - {33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33}, + {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, + {34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, + {33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33}, + {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}, + {31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, // 115 - {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}, - {31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, - {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, - {29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29}, - {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, + {29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}, + {26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26}, // 120 - {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}, - {26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26}, - {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}, - {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24}, - {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}, + {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}, + {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24}, + {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}, + {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, + {21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21}, // 125 - {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, - {21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21}, - {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, - {19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}, - {18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, + {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, + {19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}, + {18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, + {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17}, + {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, // 130 - {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17}, - {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, - {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, - {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, - {13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, + {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, + {13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, + {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, // 135 - {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - {11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, - {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, - {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, + {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, + {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, + {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}, + {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}, // 140 - {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}, - {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}, - {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, - {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, + {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, + {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // 145 - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 70: 145, 327, 91: 336}, - {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 325}, - {149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 149, 149, 76: 326}, + {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 69: 143, 323, 90: 332}, + {1: 280, 294, 258, 260, 304, 283, 262, 284, 282, 266, 285, 286, 287, 254, 255, 256, 257, 306, 281, 276, 288, 264, 268, 259, 261, 263, 270, 267, 265, 269, 271, 275, 273, 289, 303, 279, 290, 291, 292, 278, 274, 277, 272, 293, 305, 295, 296, 301, 302, 298, 297, 299, 300, 55: 315, 316, 317, 318, 310, 309, 311, 307, 308, 312, 314, 313, 253, 76: 321}, + {147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 242, 147, 147, 75: 322}, + {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 69: 143, 323, 90: 324}, + {73: 325}, // 150 - {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 70: 145, 327, 91: 328}, - {74: 329}, - {136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 70: 136}, - {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 331, 106: 330}, - {333, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 332, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 80: 334}, + {134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 69: 134}, + {1: 280, 294, 258, 260, 304, 283, 262, 284, 282, 266, 285, 286, 287, 254, 255, 256, 257, 306, 281, 276, 288, 264, 268, 259, 261, 263, 270, 267, 265, 269, 271, 275, 273, 289, 303, 279, 290, 291, 292, 278, 274, 277, 272, 293, 305, 295, 296, 301, 302, 298, 297, 299, 300, 55: 315, 316, 317, 318, 310, 309, 311, 307, 308, 312, 314, 313, 253, 76: 327, 105: 326}, + {329, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 328, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 79: 330}, + {141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141}, + {144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 55: 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 78: 144}, // 155 - {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143}, - {146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 56: 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 79: 146}, - {144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 70: 144}, - {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 335}, - {142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142}, + {142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 69: 142}, + {1: 280, 294, 258, 260, 304, 283, 262, 284, 282, 266, 285, 286, 287, 254, 255, 256, 257, 306, 281, 276, 288, 264, 268, 259, 261, 263, 270, 267, 265, 269, 271, 275, 273, 289, 303, 279, 290, 291, 292, 278, 274, 277, 272, 293, 305, 295, 296, 301, 302, 298, 297, 299, 300, 55: 315, 316, 317, 318, 310, 309, 311, 307, 308, 312, 314, 313, 253, 76: 331}, + {140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140}, + {135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 69: 135}, + {148, 54: 148}, // 160 - {137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 70: 137}, - {150, 55: 150}, - {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 255, 81: 339}, - {138, 55: 138, 70: 138}, - {1: 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 75: 153}, + {1: 280, 294, 258, 260, 304, 283, 262, 284, 282, 266, 285, 286, 287, 254, 255, 256, 257, 306, 281, 276, 288, 264, 268, 259, 261, 263, 270, 267, 265, 269, 271, 275, 273, 289, 303, 279, 290, 291, 292, 278, 274, 277, 272, 293, 305, 295, 296, 301, 302, 298, 297, 299, 300, 55: 315, 316, 317, 318, 310, 309, 311, 307, 308, 312, 314, 313, 253, 76: 252, 80: 335}, + {136, 54: 136, 69: 136}, + {1: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 74: 151}, + {59: 247, 246, 85: 245, 338}, + {149, 54: 149}, // 165 - {60: 250, 249, 86: 248, 342}, - {151, 55: 151}, - {63: 149, 149, 69: 245, 76: 344}, - {63: 346, 347, 100: 345}, - {348}, - // 170 - {71}, + {62: 147, 147, 68: 242, 75: 340}, + {62: 342, 343, 99: 341}, + {344}, {70}, - {1: 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 75: 154}, - {149, 69: 245, 76: 350}, - {351}, + {69}, + // 170 + {1: 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 74: 152}, + {147, 68: 242, 75: 346}, + {347}, + {1: 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 74: 153}, + {61: 147, 64: 147, 68: 242, 75: 349}, // 175 - {1: 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 75: 155}, - {62: 149, 65: 149, 69: 245, 76: 353}, - {62: 356, 65: 355, 102: 354}, - {357}, - {121}, + {61: 352, 64: 351, 101: 350}, + {353}, + {119}, + {118}, + {1: 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 74: 154}, // 180 - {120}, - {1: 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 75: 156}, - {79: 359}, - {55: 332, 79: 147, 360}, - {79: 361}, + {78: 355}, + {54: 328, 78: 145, 356}, + {78: 357}, + {358}, + {1: 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 74: 155}, // 185 - {362}, - {1: 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 75: 157}, - {69: 245, 76: 364, 78: 149}, - {78: 365}, - {66: 368, 367, 110: 366}, + {68: 242, 75: 360, 77: 147}, + {77: 361}, + {65: 364, 363, 109: 362}, + {365}, + {121}, // 190 - {369}, - {123}, - {122}, - {1: 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 75: 158}, - {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 371}, + {120}, + {1: 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 74: 156}, + {1: 280, 294, 258, 260, 304, 283, 262, 284, 282, 266, 285, 286, 287, 254, 255, 256, 257, 306, 281, 276, 288, 264, 268, 259, 261, 263, 270, 267, 265, 269, 271, 275, 273, 289, 303, 279, 290, 291, 292, 278, 274, 277, 272, 293, 305, 295, 296, 301, 302, 298, 297, 299, 300, 55: 315, 316, 317, 318, 310, 309, 311, 307, 308, 312, 314, 313, 253, 76: 367}, + {368}, + {1: 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 74: 157}, // 195 - {372}, - {1: 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 75: 159}, - {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 374}, - {375}, - {1: 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 75: 160}, + {1: 280, 294, 258, 260, 304, 283, 262, 284, 282, 266, 285, 286, 287, 254, 255, 256, 257, 306, 281, 276, 288, 264, 268, 259, 261, 263, 270, 267, 265, 269, 271, 275, 273, 289, 303, 279, 290, 291, 292, 278, 274, 277, 272, 293, 305, 295, 296, 301, 302, 298, 297, 299, 300, 55: 315, 316, 317, 318, 310, 309, 311, 307, 308, 312, 314, 313, 253, 76: 370}, + {371}, + {1: 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 74: 158}, + {1: 280, 294, 258, 260, 304, 283, 262, 284, 282, 266, 285, 286, 287, 254, 255, 256, 257, 306, 281, 276, 288, 264, 268, 259, 261, 263, 270, 267, 265, 269, 271, 275, 273, 289, 303, 279, 290, 291, 292, 278, 274, 277, 272, 293, 305, 295, 296, 301, 302, 298, 297, 299, 300, 55: 315, 316, 317, 318, 310, 309, 311, 307, 308, 312, 314, 313, 253, 76: 373}, + {72: 374}, // 200 - {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 377}, - {73: 378}, - {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 381, 382, 380, 111: 379}, - {383}, - {126}, - // 205 - {125}, + {1: 280, 294, 258, 260, 304, 283, 262, 284, 282, 266, 285, 286, 287, 254, 255, 256, 257, 306, 281, 276, 288, 264, 268, 259, 261, 263, 270, 267, 265, 269, 271, 275, 273, 289, 303, 279, 290, 291, 292, 278, 274, 277, 272, 293, 305, 295, 296, 301, 302, 298, 297, 299, 300, 55: 315, 316, 317, 318, 310, 309, 311, 307, 308, 312, 314, 313, 253, 76: 377, 378, 376, 110: 375}, + {379}, {124}, - {1: 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 75: 161}, - {69: 245, 76: 385, 78: 149}, - {78: 386}, + {123}, + {122}, + // 205 + {1: 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 74: 159}, + {68: 242, 75: 381, 77: 147}, + {77: 382}, + {383}, + {1: 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 74: 160}, // 210 + {68: 242, 75: 385, 77: 147}, + {77: 386}, {387}, - {1: 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 75: 162}, - {69: 245, 76: 389, 78: 149}, - {78: 390}, - {391}, + {1: 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 74: 161}, + {147, 55: 147, 147, 147, 147, 68: 242, 75: 389}, // 215 - {1: 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 75: 163}, - {149, 56: 149, 149, 149, 149, 69: 245, 76: 393}, - {130, 56: 397, 398, 399, 400, 94: 396, 108: 395, 394}, - {403}, - {129, 55: 401}, + {128, 55: 393, 394, 395, 396, 93: 392, 107: 391, 390}, + {399}, + {127, 54: 397}, + {126, 54: 126}, + {85, 54: 85}, // 220 - {128, 55: 128}, - {87, 55: 87}, - {86, 55: 86}, - {85, 55: 85}, - {84, 55: 84}, + {84, 54: 84}, + {83, 54: 83}, + {82, 54: 82}, + {55: 393, 394, 395, 396, 93: 398}, + {125, 54: 125}, // 225 - {56: 397, 398, 399, 400, 94: 402}, - {127, 55: 127}, - {1: 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 75: 164}, - {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 406, 85: 405}, - {414}, + {1: 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 74: 162}, + {1: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 55: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 242, 75: 402, 84: 401}, + {410}, + {1: 280, 294, 258, 260, 304, 283, 262, 284, 282, 266, 285, 286, 287, 254, 255, 256, 257, 306, 281, 276, 288, 264, 268, 259, 261, 263, 270, 267, 265, 269, 271, 275, 273, 289, 303, 279, 290, 291, 292, 278, 274, 277, 272, 293, 305, 295, 296, 301, 302, 298, 297, 299, 300, 55: 315, 316, 317, 318, 310, 309, 311, 307, 308, 312, 314, 313, 253, 76: 252, 80: 403}, + {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 328, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 79: 404}, // 230 - {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 255, 81: 407}, - {147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 332, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 80: 408}, - {134, 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 411, 103: 410, 409}, - {135}, - {133, 55: 412}, + {132, 280, 294, 258, 260, 304, 283, 262, 284, 282, 266, 285, 286, 287, 254, 255, 256, 257, 306, 281, 276, 288, 264, 268, 259, 261, 263, 270, 267, 265, 269, 271, 275, 273, 289, 303, 279, 290, 291, 292, 278, 274, 277, 272, 293, 305, 295, 296, 301, 302, 298, 297, 299, 300, 55: 315, 316, 317, 318, 310, 309, 311, 307, 308, 312, 314, 313, 253, 76: 407, 102: 406, 405}, + {133}, + {131, 54: 408}, + {130, 54: 130}, + {1: 280, 294, 258, 260, 304, 283, 262, 284, 282, 266, 285, 286, 287, 254, 255, 256, 257, 306, 281, 276, 288, 264, 268, 259, 261, 263, 270, 267, 265, 269, 271, 275, 273, 289, 303, 279, 290, 291, 292, 278, 274, 277, 272, 293, 305, 295, 296, 301, 302, 298, 297, 299, 300, 55: 315, 316, 317, 318, 310, 309, 311, 307, 308, 312, 314, 313, 253, 76: 409}, // 235 - {132, 55: 132}, - {1: 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 413}, - {131, 55: 131}, - {1: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 75: 165}, - {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 406, 85: 416}, + {129, 54: 129}, + {1: 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 74: 163}, + {1: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 55: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 242, 75: 402, 84: 412}, + {413}, + {1: 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 74: 164}, // 240 - {417}, - {1: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 75: 166}, - {149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 421, 82: 420, 88: 419}, - {422}, - {141, 55: 338}, + {147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 55: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 242, 75: 417, 81: 416, 87: 415}, + {418}, + {139, 54: 334}, + {138, 280, 294, 258, 260, 304, 283, 262, 284, 282, 266, 285, 286, 287, 254, 255, 256, 257, 306, 281, 276, 288, 264, 268, 259, 261, 263, 270, 267, 265, 269, 271, 275, 273, 289, 303, 279, 290, 291, 292, 278, 274, 277, 272, 293, 305, 295, 296, 301, 302, 298, 297, 299, 300, 55: 315, 316, 317, 318, 310, 309, 311, 307, 308, 312, 314, 313, 253, 76: 252, 80: 251}, + {1: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 74: 165}, // 245 - {140, 283, 298, 261, 263, 285, 308, 287, 265, 288, 286, 269, 289, 290, 291, 257, 258, 259, 260, 310, 284, 279, 292, 267, 271, 262, 264, 266, 273, 270, 268, 272, 274, 278, 276, 293, 307, 282, 294, 295, 296, 281, 277, 280, 275, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 255, 81: 254}, - {1: 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 75: 167}, - {149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 421, 82: 420, 88: 424}, - {425}, - {1: 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 75: 168}, + {147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 55: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 242, 75: 417, 81: 416, 87: 420}, + {421}, + {1: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 74: 166}, + {1: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 55: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 242, 75: 250, 81: 423}, + {424, 54: 334}, // 250 - {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 253, 82: 427}, - {428, 55: 338}, - {1: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 75: 169}, - {149, 69: 245, 76: 430}, - {431}, + {1: 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 74: 167}, + {147, 68: 242, 75: 426}, + {427}, + {1: 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 74: 168}, + {1: 234, 207, 200, 202, 226, 232, 214, 224, 238, 216, 210, 208, 213, 179, 197, 198, 199, 215, 235, 186, 191, 209, 217, 201, 203, 204, 219, 236, 205, 218, 220, 228, 222, 212, 187, 190, 195, 237, 196, 189, 227, 188, 221, 206, 239, 233, 211, 192, 230, 223, 225, 231, 229, 83: 193, 88: 180, 194, 91: 430, 185, 94: 184, 182, 429, 183, 181}, // 255 - {1: 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 75: 170}, - {1: 236, 210, 202, 204, 238, 228, 234, 216, 226, 241, 218, 212, 211, 215, 181, 199, 200, 201, 217, 237, 188, 193, 207, 219, 203, 205, 206, 221, 239, 208, 220, 222, 230, 224, 214, 189, 192, 197, 240, 198, 191, 229, 190, 223, 209, 242, 235, 213, 194, 232, 225, 227, 233, 231, 84: 195, 89: 182, 196, 92: 434, 187, 95: 186, 184, 433, 185, 183}, - {1: 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 75: 173}, - {1: 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 75: 171}, + {1: 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 74: 171}, + {1: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 74: 169}, } ) @@ -890,7 +883,7 @@ func yyhintlex1(yylex yyhintLexer, lval *yyhintSymType) (n int) { } func yyhintParse(yylex yyhintLexer, parser *hintParser) int { - const yyError = 113 + const yyError = 112 yyEx, _ := yylex.(yyhintLexerEx) var yyn int diff --git a/parser/hintparser.y b/parser/hintparser.y index fd4a08886e362..b65a4713b42b7 100644 --- a/parser/hintparser.y +++ b/parser/hintparser.y @@ -104,7 +104,6 @@ import ( hintUseCascades "USE_CASCADES" hintNthPlan "NTH_PLAN" hintLimitToCop "LIMIT_TO_COP" - hintCTEInline "CTE_INLINE" hintForceIndex "FORCE_INDEX" hintStraightJoin "STRAIGHT_JOIN" hintLeading "LEADING" @@ -530,13 +529,13 @@ UnsupportedTableLevelOptimizerHintName: | "NO_BNL" /* HASH_JOIN is supported by TiDB */ | "NO_HASH_JOIN" -| "MERGE" | "NO_MERGE" SupportedTableLevelOptimizerHintName: "MERGE_JOIN" | "BROADCAST_JOIN" | "INL_JOIN" +| "MERGE" | "INL_HASH_JOIN" | "SWAP_JOIN_INPUTS" | "NO_SWAP_JOIN_INPUTS" @@ -580,7 +579,6 @@ NullaryHintName: | "STREAM_AGG" | "AGG_TO_COP" | "LIMIT_TO_COP" -| "CTE_INLINE" | "NO_INDEX_MERGE" | "READ_CONSISTENT_REPLICA" | "IGNORE_PLAN_CACHE" @@ -626,7 +624,6 @@ Identifier: /* TiDB hint names */ | "AGG_TO_COP" | "LIMIT_TO_COP" -| "CTE_INLINE" | "IGNORE_PLAN_CACHE" | "HASH_AGG" | "IGNORE_INDEX" diff --git a/parser/misc.go b/parser/misc.go index e475232af65c1..1a4539ec4506a 100644 --- a/parser/misc.go +++ b/parser/misc.go @@ -912,7 +912,6 @@ var hintTokenMap = map[string]int{ // TiDB hint names "AGG_TO_COP": hintAggToCop, "LIMIT_TO_COP": hintLimitToCop, - "CTE_INLINE": hintCTEInline, "IGNORE_PLAN_CACHE": hintIgnorePlanCache, "HASH_AGG": hintHashAgg, "IGNORE_INDEX": hintIgnoreIndex, diff --git a/parser/parser_test.go b/parser/parser_test.go index 82f13b45b251d..425d054ca8ea7 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -4193,15 +4193,15 @@ func TestOptimizerHints(t *testing.T) { require.Equal(t, "limit_to_cop", hints[0].HintName.L) require.Equal(t, "limit_to_cop", hints[1].HintName.L) - // Test CTE_INLINE - stmt, _, err = p.Parse("with cte(x) as (select * from t1) select /*+ CTE_INLINE(), cte_inline() */ * from cte;", "", "") + // Test CTE MERGE + stmt, _, err = p.Parse("with cte(x) as (select * from t1) select /*+ MERGE(), merge() */ * from cte;", "", "") require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints require.Len(t, hints, 2) - require.Equal(t, "cte_inline", hints[0].HintName.L) - require.Equal(t, "cte_inline", hints[1].HintName.L) + require.Equal(t, "merge", hints[0].HintName.L) + require.Equal(t, "merge", hints[1].HintName.L) // Test STRAIGHT_JOIN stmt, _, err = p.Parse("select /*+ STRAIGHT_JOIN(), straight_join() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 8a69b6811f783..9d12de099b690 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -117,8 +117,8 @@ const ( HintIgnorePlanCache = "ignore_plan_cache" // HintLimitToCop is a hint enforce pushing limit or topn to coprocessor. HintLimitToCop = "limit_to_cop" - //HintCTEInline is a hint which can switch turning inline or materializing for the CTE. - HintCTEInline = "cte_inline" + //HintMerge is a hint which can switch turning inline for the CTE. + HintMerge = "merge" ) const ( @@ -3518,7 +3518,7 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev aggHints aggHintInfo timeRangeHint ast.HintTimeRange limitHints limitHintInfo - CTEHints CTEHintInfo + MergeHints MergeHintInfo leadingJoinOrder []hintTableInfo leadingHintCnt int ) @@ -3623,8 +3623,8 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev timeRangeHint = hint.HintData.(ast.HintTimeRange) case HintLimitToCop: limitHints.preferLimitToCop = true - case HintCTEInline: - CTEHints.preferInlineToCTE = true + case HintMerge: + MergeHints.preferMerge = true case HintLeading: if leadingHintCnt == 0 { leadingJoinOrder = append(leadingJoinOrder, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) @@ -3653,7 +3653,7 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev indexMergeHintList: indexMergeHintList, timeRangeHint: timeRangeHint, limitHints: limitHints, - CTEHints: CTEHints, + MergeHints: MergeHints, leadingJoinOrder: leadingJoinOrder, }) } @@ -3997,7 +3997,7 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L if b.buildingCTE { if hints := b.TableHints(); hints != nil { - b.outerCTEs[len(b.outerCTEs)-1].isInline = hints.CTEHints.preferInlineToCTE + b.outerCTEs[len(b.outerCTEs)-1].isInline = hints.MergeHints.preferMerge } } @@ -4165,13 +4165,13 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName lp.SetSchema(getResultCTESchema(cte.seedLP.Schema(), b.ctx.GetSessionVars())) if cte.isInline { - lp.CTEHints.preferInlineToCTE = cte.isInline + lp.MergeHints.preferMerge = cte.isInline saveCte := b.outerCTEs[i:] b.outerCTEs = b.outerCTEs[:i] defer func() { b.outerCTEs = append(b.outerCTEs, saveCte...) }() - return b.buildDataSourceFromCTEInline(ctx, cte.def) + return b.buildDataSourceFromCTEMerge(ctx, cte.def) } for i, col := range lp.schema.Columns { @@ -4196,7 +4196,7 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName return nil, nil } -func (b *PlanBuilder) buildDataSourceFromCTEInline(ctx context.Context, cte *ast.CommonTableExpression) (LogicalPlan, error) { +func (b *PlanBuilder) buildDataSourceFromCTEMerge(ctx context.Context, cte *ast.CommonTableExpression) (LogicalPlan, error) { p, err := b.buildResultSetNode(ctx, cte.Query.Query) if err != nil { return nil, err diff --git a/planner/core/logical_plans.go b/planner/core/logical_plans.go index 0b3be34dfa382..abc4431abd6b0 100644 --- a/planner/core/logical_plans.go +++ b/planner/core/logical_plans.go @@ -1878,7 +1878,7 @@ type LogicalCTE struct { cteAsName model.CIStr seedStat *property.StatsInfo isOuterMostCTE bool - CTEHints CTEHintInfo + MergeHints MergeHintInfo } // LogicalCTETable is for CTE table diff --git a/planner/core/physical_plan_test.go b/planner/core/physical_plan_test.go index 4f7493de0ab82..e6d9366ff7b7a 100644 --- a/planner/core/physical_plan_test.go +++ b/planner/core/physical_plan_test.go @@ -1034,7 +1034,7 @@ func TestLimitToCopHint(t *testing.T) { } } -func TestCTEInlineHint(t *testing.T) { +func TestCTEMergeHint(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index 1d34060199928..642a94ef2d60f 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -97,7 +97,7 @@ type tableHintInfo struct { indexMergeHintList []indexHintInfo timeRangeHint ast.HintTimeRange limitHints limitHintInfo - CTEHints CTEHintInfo + MergeHints MergeHintInfo leadingJoinOrder []hintTableInfo } @@ -105,9 +105,9 @@ type limitHintInfo struct { preferLimitToCop bool } -//CTEHintInfo ...one bool flag for cte -type CTEHintInfo struct { - preferInlineToCTE bool +//MergeHintInfo ...one bool flag for cte +type MergeHintInfo struct { + preferMerge bool } type hintTableInfo struct { diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index b4479d9f5e755..3628cc29e226e 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -573,12 +573,12 @@ ] }, { - "name": "TestCTEInlineHint", + "name": "TestCTEMergeHint", "cases": [ - "with cte as (select /*+ CTE_INLINE()*/ * from tc where tc.a < 60) select * from cte where cte.a <18", + "with cte as (select /*+ MERGE()*/ * from tc where tc.a < 60) select * from cte where cte.a <18", "with cte as (select * from tc where tc.a < 60) select * from cte where cte.a <18", - "WITH cte1 AS (SELECT /*+ CTE_INLINE()*/ a FROM tc), cte2 AS (SELECT /*+ CTE_INLINE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", - "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ CTE_INLINE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;" + "WITH cte1 AS (SELECT /*+ MERGE()*/ a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", + "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;" ] }, { diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 5844f3863f5dc..18b0068400e23 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1595,10 +1595,10 @@ ] }, { - "Name": "TestCTEInlineHint", + "Name": "TestCTEMergeHint", "Cases": [ { - "SQL": "with cte as (select /*+ CTE_INLINE()*/ * from tc where tc.a < 60) select * from cte where cte.a <18", + "SQL": "with cte as (select /*+ MERGE()*/ * from tc where tc.a < 60) select * from cte where cte.a <18", "Plan": [ "TableReader 2.33 root data:Selection", "└─Selection_12 2.33 cop[tikv] lt(test.tc.a, 18), lt(test.tc.a, 60)", @@ -1619,7 +1619,7 @@ "Warning": null }, { - "SQL": "WITH cte1 AS (SELECT /*+ CTE_INLINE()*/ a FROM tc), cte2 AS (SELECT /*+ CTE_INLINE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", + "SQL": "WITH cte1 AS (SELECT /*+ MERGE()*/ a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", "Plan": [ "HashJoin 8.74 root inner join, equal:[eq(test.tc.a, test.te.c)]", "├─TableReader(Build) 6.99 root data:Selection", @@ -1632,7 +1632,7 @@ "Warning": null } { - "SQL": "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ CTE_INLINE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", + "SQL": "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", "Plan": [ "Projection 5.60 root test.tc.a, test.te.c", "└─HashJoin 5.60 root inner join, equal:[eq(test.te.c, test.tc.a)]", From 2c0811899020f514fe84f9e7ae971098059b8873 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Thu, 2 Jun 2022 09:14:42 +0800 Subject: [PATCH 23/42] add recursive test test when with recursive,the hint merge is not start --- planner/core/testdata/plan_suite_in.json | 3 ++- planner/core/testdata/plan_suite_out.json | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index 3628cc29e226e..9c458cc8c3ce9 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -578,7 +578,8 @@ "with cte as (select /*+ MERGE()*/ * from tc where tc.a < 60) select * from cte where cte.a <18", "with cte as (select * from tc where tc.a < 60) select * from cte where cte.a <18", "WITH cte1 AS (SELECT /*+ MERGE()*/ a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", - "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;" + "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", + "with cte(a) as (with recursive cte1(a) as (select 1 union select a + 1 /*+ merge() */ from cte1 where a < 10) select * from cte1) select * from cte t1, cte t2;" ] }, { diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 18b0068400e23..99bad2ac33940 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1647,6 +1647,24 @@ " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" ], "Warning": null + }, + { + "SQL": "with cte(a) as (with recursive cte1(a) as (select 1 union select a + 1 /*+ merge() */ from cte1 where a < 10) select * from cte1) select * from cte t1, cte t2;", + "Plan": [ + "HashJoin 2.56 root CARTESIAN inner join", + "├─CTEFullScan(Build) 1.60 root CTE:t2 data:CTE", + "└─CTEFullScan(Probe) 1.60 root CTE:t1 data:CTE", + "CTE 1.60 root Non-Recursive CTE", + "└─Selection(Seed Part) 1.60 root 1", + " └─CTEFullScan 2.00 root CTE:cte1 data:CTE", + "CTE 2.00 root Recursive CTE", + "├─Projection(Seed Part) 1.00 root 1->Column#2", + "│ └─TableDual 1.00 root rows:1", + "└─Projection(Recursive Part) 0.80 root cast(plus(Column#3, 1), bigint(1) BINARY)->Column#5", + " └─Selection 0.80 root lt(Column#3, 10)", + " └─CTETable 1.00 root Scan on CTE" + ], + "Warning": null } ] }, From d9394be067b790254a11b3a0af6fe73e027f6c63 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Thu, 2 Jun 2022 09:45:46 +0800 Subject: [PATCH 24/42] Update plan_suite_out.json --- planner/core/testdata/plan_suite_out.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 99bad2ac33940..f86657a332744 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1660,10 +1660,10 @@ "CTE 2.00 root Recursive CTE", "├─Projection(Seed Part) 1.00 root 1->Column#2", "│ └─TableDual 1.00 root rows:1", - "└─Projection(Recursive Part) 0.80 root cast(plus(Column#3, 1), bigint(1) BINARY)->Column#5", + "└─Projection(Recursive Part) 0.80 root cast(plus(Column#3, 1), bigint(1) BINARY)->Column#5", " └─Selection 0.80 root lt(Column#3, 10)", " └─CTETable 1.00 root Scan on CTE" - ], + ], "Warning": null } ] From 86c6fe484db9b60f220336c8dc1b9a0e1e6b90a5 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Thu, 2 Jun 2022 10:10:21 +0800 Subject: [PATCH 25/42] fix recursive test fix --- planner/core/testdata/plan_suite_in.json | 2 +- planner/core/testdata/plan_suite_out.json | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index 9c458cc8c3ce9..4223a15b65e09 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -579,7 +579,7 @@ "with cte as (select * from tc where tc.a < 60) select * from cte where cte.a <18", "WITH cte1 AS (SELECT /*+ MERGE()*/ a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", - "with cte(a) as (with recursive cte1(a) as (select 1 union select a + 1 /*+ merge() */ from cte1 where a < 10) select * from cte1) select * from cte t1, cte t2;" + "with recursive cte1(c1) as (select 1 union select /*+ merge */ c1 + 1 c1 from cte1 where c1 < 100) select * from cte1;" ] }, { diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index f86657a332744..57202efa3c5f5 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1649,19 +1649,14 @@ "Warning": null }, { - "SQL": "with cte(a) as (with recursive cte1(a) as (select 1 union select a + 1 /*+ merge() */ from cte1 where a < 10) select * from cte1) select * from cte t1, cte t2;", + "SQL": "with recursive cte1(c1) as (select 1 union select /*+ merge */ c1 + 1 c1 from cte1 where c1 < 100) select * from cte1;", "Plan": [ - "HashJoin 2.56 root CARTESIAN inner join", - "├─CTEFullScan(Build) 1.60 root CTE:t2 data:CTE", - "└─CTEFullScan(Probe) 1.60 root CTE:t1 data:CTE", - "CTE 1.60 root Non-Recursive CTE", - "└─Selection(Seed Part) 1.60 root 1", - " └─CTEFullScan 2.00 root CTE:cte1 data:CTE", + "CTEFullScan 2.00 root CTE:cte1 data:CTE", "CTE 2.00 root Recursive CTE", "├─Projection(Seed Part) 1.00 root 1->Column#2", "│ └─TableDual 1.00 root rows:1", "└─Projection(Recursive Part) 0.80 root cast(plus(Column#3, 1), bigint(1) BINARY)->Column#5", - " └─Selection 0.80 root lt(Column#3, 10)", + " └─Selection 0.80 root lt(Column#3, 100)", " └─CTETable 1.00 root Scan on CTE" ], "Warning": null From 2a7a3dc429e88389442aa2e2e8137a2a6a31cfb9 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Fri, 10 Jun 2022 14:47:26 +0800 Subject: [PATCH 26/42] nested CTEs We support nested CTEs and add corresponding tests --- planner/core/logical_plan_builder.go | 3 +++ planner/core/testdata/plan_suite_in.json | 4 ++- planner/core/testdata/plan_suite_out.json | 30 ++++++++++++++++++++++- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index e5f92ed44adc8..5730e281cc162 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -4170,8 +4170,11 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName lp.MergeHints.preferMerge = cte.isInline saveCte := b.outerCTEs[i:] b.outerCTEs = b.outerCTEs[:i] + o := b.buildingCTE + b.buildingCTE = false defer func() { b.outerCTEs = append(b.outerCTEs, saveCte...) + b.buildingCTE = o }() return b.buildDataSourceFromCTEMerge(ctx, cte.def) } diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index 4223a15b65e09..27521dc380376 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -579,7 +579,9 @@ "with cte as (select * from tc where tc.a < 60) select * from cte where cte.a <18", "WITH cte1 AS (SELECT /*+ MERGE()*/ a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", - "with recursive cte1(c1) as (select 1 union select /*+ merge */ c1 + 1 c1 from cte1 where c1 < 100) select * from cte1;" + "with recursive cte1(c1) as (select 1 union select /*+ merge */ c1 + 1 c1 from cte1 where c1 < 100) select * from cte1;", + "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", + "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;" ] }, { diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 57202efa3c5f5..c37c7accc2099 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1659,7 +1659,35 @@ " └─Selection 0.80 root lt(Column#3, 100)", " └─CTETable 1.00 root Scan on CTE" ], - "Warning": null + "Warning": null + }, + { + "SQL": "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", + "Plan": [ + "CTEFullScan 49.00 root CTE:cte2 data:CTE", + "CTE 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE", + " └─TableReader(Probe) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo", + "CTE 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", + "Plan": [ + "CTEFullScan 49.00 root CTE:cte2 data:CTE", + "CTE 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─TableReader(Build) 7.00 root data:TableFullScan", + " │ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo", + " └─TableReader(Probe) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo" + ], + "Warning": null } ] }, From 38eeecee2bc2ab432f2f59cb09c1b9eebdfaa79f Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Fri, 10 Jun 2022 15:29:04 +0800 Subject: [PATCH 27/42] Update plan_suite_out.json --- planner/core/testdata/plan_suite_out.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index c37c7accc2099..74818fc4230aa 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1682,10 +1682,12 @@ "CTEFullScan 49.00 root CTE:cte2 data:CTE", "CTE 49.00 root Non-Recursive CTE", "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", - " ├─TableReader(Build) 7.00 root data:TableFullScan", - " │ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo", + " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE", " └─TableReader(Probe) 7.00 root data:TableFullScan", - " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo" + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo", + "CTE 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" ], "Warning": null } From b47c2092195f4d512ef8814309f3e428d8dd11bc Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Fri, 10 Jun 2022 15:34:25 +0800 Subject: [PATCH 28/42] fix some test for nested cte --- planner/core/testdata/plan_suite_in.json | 3 ++- planner/core/testdata/plan_suite_out.json | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index 27521dc380376..34b27a943db56 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -581,7 +581,8 @@ "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", "with recursive cte1(c1) as (select 1 union select /*+ merge */ c1 + 1 c1 from cte1 where c1 < 100) select * from cte1;", "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", - "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;" + "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", + "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;" ] }, { diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 74818fc4230aa..c88922cff8898 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1690,6 +1690,19 @@ " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" ], "Warning": null + }, + { + "SQL": "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;", + "Plan": [ + "CTEFullScan 49.00 root CTE:cte2 data:CTE", + "CTE 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─TableReader(Build) 7.00 root data:TableFullScan", + " │ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo", + " └─TableReader(Probe) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo" + ], + "Warning": null } ] }, From 8dd385d32f1cf0743ea636a2c3fca67c4c1c4dec Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Fri, 10 Jun 2022 15:48:35 +0800 Subject: [PATCH 29/42] Update plan_suite_out.json --- planner/core/testdata/plan_suite_out.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index c88922cff8898..3658b0e00d839 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1630,7 +1630,7 @@ " └─TableFullScan 10000.00 cop[tikv] table:te keep order:false, stats:pseudo" ], "Warning": null - } + }, { "SQL": "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", "Plan": [ From b1b5faf843beaf74cb2073eebb862fa31ac87ea9 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Fri, 10 Jun 2022 16:49:56 +0800 Subject: [PATCH 30/42] fix --- planner/core/testdata/plan_suite_in.json | 8 +-- planner/core/testdata/plan_suite_out.json | 86 +++++++++++------------ 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index 34b27a943db56..fdc49cc383c01 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -579,10 +579,10 @@ "with cte as (select * from tc where tc.a < 60) select * from cte where cte.a <18", "WITH cte1 AS (SELECT /*+ MERGE()*/ a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", - "with recursive cte1(c1) as (select 1 union select /*+ merge */ c1 + 1 c1 from cte1 where c1 < 100) select * from cte1;", - "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", - "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", - "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;" + "with recursive cte1(c1) as (select 1 union select /*+ merge */ c1 + 1 c1 from cte1 where c1 < 100) select * from cte1;" +// "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", +// "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", +// "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;" ] }, { diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 3658b0e00d839..3f6c56f31b288 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1658,52 +1658,52 @@ "└─Projection(Recursive Part) 0.80 root cast(plus(Column#3, 1), bigint(1) BINARY)->Column#5", " └─Selection 0.80 root lt(Column#3, 100)", " └─CTETable 1.00 root Scan on CTE" - ], - "Warning": null - }, - { - "SQL": "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", - "Plan": [ - "CTEFullScan 49.00 root CTE:cte2 data:CTE", - "CTE 49.00 root Non-Recursive CTE", - "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", - " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE", - " └─TableReader(Probe) 7.00 root data:TableFullScan", - " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo", - "CTE 7.00 root Non-Recursive CTE", - "└─TableReader(Seed Part) 7.00 root data:TableFullScan", - " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" - ], - "Warning": null - }, - { - "SQL": "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", - "Plan": [ - "CTEFullScan 49.00 root CTE:cte2 data:CTE", - "CTE 49.00 root Non-Recursive CTE", - "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", - " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE", - " └─TableReader(Probe) 7.00 root data:TableFullScan", - " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo", - "CTE 7.00 root Non-Recursive CTE", - "└─TableReader(Seed Part) 7.00 root data:TableFullScan", - " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" - ], - "Warning": null - }, - { - "SQL": "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;", - "Plan": [ - "CTEFullScan 49.00 root CTE:cte2 data:CTE", - "CTE 49.00 root Non-Recursive CTE", - "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", - " ├─TableReader(Build) 7.00 root data:TableFullScan", - " │ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo", - " └─TableReader(Probe) 7.00 root data:TableFullScan", - " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo" ], "Warning": null } +// { +// "SQL": "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", +// "Plan": [ +// "CTEFullScan 49.00 root CTE:cte2 data:CTE", +// "CTE 49.00 root Non-Recursive CTE", +// "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", +// " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE", +// " └─TableReader(Probe) 7.00 root data:TableFullScan", +// " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo", +// "CTE 7.00 root Non-Recursive CTE", +// "└─TableReader(Seed Part) 7.00 root data:TableFullScan", +// " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" +// ], +// "Warning": null +// }, +// { +// "SQL": "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", +// "Plan": [ +// "CTEFullScan 49.00 root CTE:cte2 data:CTE", +// "CTE 49.00 root Non-Recursive CTE", +// "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", +// " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE", +// " └─TableReader(Probe) 7.00 root data:TableFullScan", +// " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo", +// "CTE 7.00 root Non-Recursive CTE", +// "└─TableReader(Seed Part) 7.00 root data:TableFullScan", +// " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" +// ], +// "Warning": null +// }, +// { +// "SQL": "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;", +// "Plan": [ +// "CTEFullScan 49.00 root CTE:cte2 data:CTE", +// "CTE 49.00 root Non-Recursive CTE", +// "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", +// " ├─TableReader(Build) 7.00 root data:TableFullScan", +// " │ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo", +// " └─TableReader(Probe) 7.00 root data:TableFullScan", +// " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo" +// ], +// "Warning": null +// } ] }, { From 67bb5fe2d1e38a6dbedbe140306117431287c9ce Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Fri, 10 Jun 2022 17:07:39 +0800 Subject: [PATCH 31/42] fix2.0 --- planner/core/testdata/plan_suite_in.json | 8 +-- planner/core/testdata/plan_suite_out.json | 86 +++++++++++------------ 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index fdc49cc383c01..34b27a943db56 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -579,10 +579,10 @@ "with cte as (select * from tc where tc.a < 60) select * from cte where cte.a <18", "WITH cte1 AS (SELECT /*+ MERGE()*/ a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", - "with recursive cte1(c1) as (select 1 union select /*+ merge */ c1 + 1 c1 from cte1 where c1 < 100) select * from cte1;" -// "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", -// "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", -// "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;" + "with recursive cte1(c1) as (select 1 union select /*+ merge */ c1 + 1 c1 from cte1 where c1 < 100) select * from cte1;", + "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", + "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", + "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;" ] }, { diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 3f6c56f31b288..4f2ef893bcc31 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1660,50 +1660,50 @@ " └─CTETable 1.00 root Scan on CTE" ], "Warning": null + }, + { + "SQL": "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", + "Plan": [ + "CTEFullScan 49.00 root CTE:cte2 data:CTE", + "CTE 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE", + " └─TableReader(Probe) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo", + "CTE 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", + "Plan": [ + "CTEFullScan 49.00 root CTE:cte2 data:CTE", + "CTE 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE", + " └─TableReader(Probe) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo", + "CTE 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;", + "Plan": [ + "CTEFullScan 49.00 root CTE:cte2 data:CTE", + "CTE 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─TableReader(Build) 7.00 root data:TableFullScan", + " │ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo", + " └─TableReader(Probe) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo" + ], + "Warning": null } -// { -// "SQL": "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", -// "Plan": [ -// "CTEFullScan 49.00 root CTE:cte2 data:CTE", -// "CTE 49.00 root Non-Recursive CTE", -// "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", -// " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE", -// " └─TableReader(Probe) 7.00 root data:TableFullScan", -// " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo", -// "CTE 7.00 root Non-Recursive CTE", -// "└─TableReader(Seed Part) 7.00 root data:TableFullScan", -// " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" -// ], -// "Warning": null -// }, -// { -// "SQL": "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", -// "Plan": [ -// "CTEFullScan 49.00 root CTE:cte2 data:CTE", -// "CTE 49.00 root Non-Recursive CTE", -// "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", -// " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE", -// " └─TableReader(Probe) 7.00 root data:TableFullScan", -// " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo", -// "CTE 7.00 root Non-Recursive CTE", -// "└─TableReader(Seed Part) 7.00 root data:TableFullScan", -// " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" -// ], -// "Warning": null -// }, -// { -// "SQL": "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;", -// "Plan": [ -// "CTEFullScan 49.00 root CTE:cte2 data:CTE", -// "CTE 49.00 root Non-Recursive CTE", -// "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", -// " ├─TableReader(Build) 7.00 root data:TableFullScan", -// " │ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo", -// " └─TableReader(Probe) 7.00 root data:TableFullScan", -// " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo" -// ], -// "Warning": null -// } ] }, { From 5017720ad394eaf33c0bdecdb04a95829708b596 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Wed, 15 Jun 2022 17:15:28 +0800 Subject: [PATCH 32/42] add test warning --- planner/core/testdata/plan_suite_out.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 4f2ef893bcc31..480a093d6a367 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1659,7 +1659,7 @@ " └─Selection 0.80 root lt(Column#3, 100)", " └─CTETable 1.00 root Scan on CTE" ], - "Warning": null + "Warning": "[parser:1064]Optimizer hint syntax error at line 1 column 70 near \"\" " }, { "SQL": "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", From 43ef949b61d351bdff5bc4e12d3d0760d5bfd362 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Wed, 15 Jun 2022 17:15:34 +0800 Subject: [PATCH 33/42] Update physical_plan_test.go --- planner/core/physical_plan_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/planner/core/physical_plan_test.go b/planner/core/physical_plan_test.go index e6d9366ff7b7a..f3a7ef0560ff4 100644 --- a/planner/core/physical_plan_test.go +++ b/planner/core/physical_plan_test.go @@ -1040,6 +1040,7 @@ func TestCTEMergeHint(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists tc") + tk.MustExec("drop table if exists te") tk.MustExec("create table tc(a int)") tk.MustExec("create table te(c int)") tk.MustExec("insert into tc values (1), (5), (10), (15), (20), (30), (50);") From 0348d593260347a9ed15bc0cd5cc0880f5f2e47e Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Wed, 15 Jun 2022 18:03:33 +0800 Subject: [PATCH 34/42] Update plan_suite_out.json --- planner/core/testdata/plan_suite_out.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 480a093d6a367..895c5676ec58d 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1659,7 +1659,7 @@ " └─Selection 0.80 root lt(Column#3, 100)", " └─CTETable 1.00 root Scan on CTE" ], - "Warning": "[parser:1064]Optimizer hint syntax error at line 1 column 70 near \"\" " + "Warning": "[planner:1064]Optimizer hint syntax error at line 1 column 70 near \"\" " }, { "SQL": "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", From 4b071a790e8571f5b82441f7c6ce837dfd17cf48 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Wed, 15 Jun 2022 19:23:05 +0800 Subject: [PATCH 35/42] Update plan_suite_out.json --- planner/core/testdata/plan_suite_out.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 895c5676ec58d..8037e695ab6df 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1659,7 +1659,9 @@ " └─Selection 0.80 root lt(Column#3, 100)", " └─CTETable 1.00 root Scan on CTE" ], - "Warning": "[planner:1064]Optimizer hint syntax error at line 1 column 70 near \"\" " + "Warning": [ + "[parser:1064]Optimizer hint syntax error at line 1 column 62 near \"\"" + ] }, { "SQL": "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", From 16db59aadad3965649d49c5600b54fdec118bd81 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Wed, 15 Jun 2022 20:00:09 +0800 Subject: [PATCH 36/42] Update physical_plan_test.go --- planner/core/physical_plan_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/planner/core/physical_plan_test.go b/planner/core/physical_plan_test.go index f3a7ef0560ff4..bfbf4772b82a0 100644 --- a/planner/core/physical_plan_test.go +++ b/planner/core/physical_plan_test.go @@ -1045,6 +1045,8 @@ func TestCTEMergeHint(t *testing.T) { tk.MustExec("create table te(c int)") tk.MustExec("insert into tc values (1), (5), (10), (15), (20), (30), (50);") tk.MustExec("insert into te values (1), (5), (10), (25), (40), (60), (100);") + tk.MustExec("analyze table tc;") + tk.MustExec("analyze table te;") var ( input []string From 712821723112ebc5fa7c2c0acf648cdccf68affb Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Wed, 15 Jun 2022 20:31:08 +0800 Subject: [PATCH 37/42] Update plan_suite_out.json --- planner/core/testdata/plan_suite_out.json | 38 +++++++++++------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 8037e695ab6df..8efa95a8b0825 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1600,21 +1600,21 @@ { "SQL": "with cte as (select /*+ MERGE()*/ * from tc where tc.a < 60) select * from cte where cte.a <18", "Plan": [ - "TableReader 2.33 root data:Selection", - "└─Selection_12 2.33 cop[tikv] lt(test.tc.a, 18), lt(test.tc.a, 60)", - " └─TableFullScan_11 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" + "TableReader 4.00 root data:Selection", + "└─Selection 4.00 cop[tikv] lt(test.tc.a, 18), lt(test.tc.a, 60)", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" ], "Warning": null }, { "SQL": "with cte as (select * from tc where tc.a < 60) select * from cte where cte.a <18", "Plan": [ - "Selection 1.86 root lt(test.tc.a, 18)", - "└─CTEFullScan 2.33 root CTE:cte data:CTE", - "CTE 2.33 root Non-Recursive CTE", - "└─TableReader(Seed Part) 2.33 root data:Selection_10", - " └─Selection 2.33 cop[tikv] lt(test.tc.a, 18), lt(test.tc.a, 60)", - " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" + "Selection 3.20 root lt(test.tc.a, 18)", + "└─CTEFullScan 4.00 root CTE:cte data:CTE", + "CTE 4.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 4.00 root data:Selection", + " └─Selection 4.00 cop[tikv] lt(test.tc.a, 18), lt(test.tc.a, 60)", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" ], "Warning": null }, @@ -1624,10 +1624,10 @@ "HashJoin 8.74 root inner join, equal:[eq(test.tc.a, test.te.c)]", "├─TableReader(Build) 6.99 root data:Selection", "│ └─Selection 6.99 cop[tikv] not(isnull(test.tc.a))", - "│ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo", + "│ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false", "└─TableReader(Probe) 9990.00 root data:Selection", " └─Selection 9990.00 cop[tikv] not(isnull(test.te.c))", - " └─TableFullScan 10000.00 cop[tikv] table:te keep order:false, stats:pseudo" + " └─TableFullScan 10000.00 cop[tikv] table:te keep order:false" ], "Warning": null }, @@ -1640,11 +1640,11 @@ " │ └─CTEFullScan 5.60 root CTE:cte1 data:CTE", " └─TableReader(Probe) 6.99 root data:Selection", " └─Selection 6.99 cop[tikv] not(isnull(test.te.c))", - " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false", "CTE 5.60 root Non-Recursive CTE", "└─Selection(Seed Part) 5.60 root not(isnull(test.tc.a))", " └─TableReader 7.00 root data:TableFullScan", - " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" ], "Warning": null }, @@ -1671,10 +1671,10 @@ "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE", " └─TableReader(Probe) 7.00 root data:TableFullScan", - " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false", "CTE 7.00 root Non-Recursive CTE", "└─TableReader(Seed Part) 7.00 root data:TableFullScan", - " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" ], "Warning": null }, @@ -1686,10 +1686,10 @@ "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE", " └─TableReader(Probe) 7.00 root data:TableFullScan", - " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false", "CTE 7.00 root Non-Recursive CTE", "└─TableReader(Seed Part) 7.00 root data:TableFullScan", - " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo" + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" ], "Warning": null }, @@ -1700,9 +1700,9 @@ "CTE 49.00 root Non-Recursive CTE", "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", " ├─TableReader(Build) 7.00 root data:TableFullScan", - " │ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false, stats:pseudo", + " │ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false", " └─TableReader(Probe) 7.00 root data:TableFullScan", - " └─TableFullScan 7.00 cop[tikv] table:te keep order:false, stats:pseudo" + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false" ], "Warning": null } From ae3cc1de075ef09ef2d43ab7aefc472ce1adb5ac Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Thu, 16 Jun 2022 14:28:49 +0800 Subject: [PATCH 38/42] renew the test output --- planner/core/testdata/plan_suite_out.json | 58 +++++++++++------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 8efa95a8b0825..9f28ed40b83d2 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1610,8 +1610,8 @@ "SQL": "with cte as (select * from tc where tc.a < 60) select * from cte where cte.a <18", "Plan": [ "Selection 3.20 root lt(test.tc.a, 18)", - "└─CTEFullScan 4.00 root CTE:cte data:CTE", - "CTE 4.00 root Non-Recursive CTE", + "└─CTEFullScan 4.00 root CTE:cte data:CTE_0", + "CTE_0 4.00 root Non-Recursive CTE", "└─TableReader(Seed Part) 4.00 root data:Selection", " └─Selection 4.00 cop[tikv] lt(test.tc.a, 18), lt(test.tc.a, 60)", " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" @@ -1621,27 +1621,27 @@ { "SQL": "WITH cte1 AS (SELECT /*+ MERGE()*/ a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", "Plan": [ - "HashJoin 8.74 root inner join, equal:[eq(test.tc.a, test.te.c)]", - "├─TableReader(Build) 6.99 root data:Selection", - "│ └─Selection 6.99 cop[tikv] not(isnull(test.tc.a))", - "│ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false", - "└─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.te.c))", - " └─TableFullScan 10000.00 cop[tikv] table:te keep order:false" + "HashJoin 7.00 root inner join, equal:[eq(test.tc.a, test.te.c)]", + "├─TableReader(Build) 7.00 root data:Selection", + "│ └─Selection 7.00 cop[tikv] not(isnull(test.te.c))", + "│ └─TableFullScan 7.00 cop[tikv] table:te keep order:false", + "└─TableReader(Probe) 7.00 root data:Selection", + " └─Selection 7.00 cop[tikv] not(isnull(test.tc.a))", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" ], "Warning": null }, { "SQL": "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", "Plan": [ - "Projection 5.60 root test.tc.a, test.te.c", - "└─HashJoin 5.60 root inner join, equal:[eq(test.te.c, test.tc.a)]", + "Projection 4.48 root test.tc.a, test.te.c", + "└─HashJoin 4.48 root inner join, equal:[eq(test.te.c, test.tc.a)]", " ├─Selection(Build) 4.48 root not(isnull(test.tc.a))", - " │ └─CTEFullScan 5.60 root CTE:cte1 data:CTE", - " └─TableReader(Probe) 6.99 root data:Selection", - " └─Selection 6.99 cop[tikv] not(isnull(test.te.c))", + " │ └─CTEFullScan 5.60 root CTE:cte1 data:CTE_0", + " └─TableReader(Probe) 7.00 root data:Selection", + " └─Selection 7.00 cop[tikv] not(isnull(test.te.c))", " └─TableFullScan 7.00 cop[tikv] table:te keep order:false", - "CTE 5.60 root Non-Recursive CTE", + "CTE_0 5.60 root Non-Recursive CTE", "└─Selection(Seed Part) 5.60 root not(isnull(test.tc.a))", " └─TableReader 7.00 root data:TableFullScan", " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" @@ -1651,28 +1651,28 @@ { "SQL": "with recursive cte1(c1) as (select 1 union select /*+ merge */ c1 + 1 c1 from cte1 where c1 < 100) select * from cte1;", "Plan": [ - "CTEFullScan 2.00 root CTE:cte1 data:CTE", - "CTE 2.00 root Recursive CTE", + "CTEFullScan 2.00 root CTE:cte1 data:CTE_0", + "CTE_0 2.00 root Recursive CTE", "├─Projection(Seed Part) 1.00 root 1->Column#2", "│ └─TableDual 1.00 root rows:1", "└─Projection(Recursive Part) 0.80 root cast(plus(Column#3, 1), bigint(1) BINARY)->Column#5", " └─Selection 0.80 root lt(Column#3, 100)", - " └─CTETable 1.00 root Scan on CTE" + " └─CTETable 1.00 root Scan on CTE_0" ], "Warning": [ - "[parser:1064]Optimizer hint syntax error at line 1 column 62 near \"\"" + "[parser:1064]Optimizer hint syntax error at line 1 column 87 near \"\" " ] }, { "SQL": "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", "Plan": [ - "CTEFullScan 49.00 root CTE:cte2 data:CTE", - "CTE 49.00 root Non-Recursive CTE", + "CTEFullScan 49.00 root CTE:cte2 data:CTE_1", + "CTE_1 49.00 root Non-Recursive CTE", "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", - " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE", + " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE_3", " └─TableReader(Probe) 7.00 root data:TableFullScan", " └─TableFullScan 7.00 cop[tikv] table:te keep order:false", - "CTE 7.00 root Non-Recursive CTE", + "CTE_3 7.00 root Non-Recursive CTE", "└─TableReader(Seed Part) 7.00 root data:TableFullScan", " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" ], @@ -1681,13 +1681,13 @@ { "SQL": "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", "Plan": [ - "CTEFullScan 49.00 root CTE:cte2 data:CTE", - "CTE 49.00 root Non-Recursive CTE", + "CTEFullScan 49.00 root CTE:cte2 data:CTE_0", + "CTE_0 49.00 root Non-Recursive CTE", "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", - " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE", + " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE_1", " └─TableReader(Probe) 7.00 root data:TableFullScan", " └─TableFullScan 7.00 cop[tikv] table:te keep order:false", - "CTE 7.00 root Non-Recursive CTE", + "CTE_1 7.00 root Non-Recursive CTE", "└─TableReader(Seed Part) 7.00 root data:TableFullScan", " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" ], @@ -1696,8 +1696,8 @@ { "SQL": "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;", "Plan": [ - "CTEFullScan 49.00 root CTE:cte2 data:CTE", - "CTE 49.00 root Non-Recursive CTE", + "CTEFullScan 49.00 root CTE:cte2 data:CTE_0", + "CTE_0 49.00 root Non-Recursive CTE", "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", " ├─TableReader(Build) 7.00 root data:TableFullScan", " │ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false", From 1a6f5eb453fb61a1e5d5b4453d14f60e30a9870d Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Fri, 17 Jun 2022 11:17:23 +0800 Subject: [PATCH 39/42] merge master --- parser/hintparser.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/parser/hintparser.go b/parser/hintparser.go index 906f1a0259978..ccf7ea700ad4e 100644 --- a/parser/hintparser.go +++ b/parser/hintparser.go @@ -425,7 +425,7 @@ var ( {99, 1}, {99, 1}, {99, 1}, - {99, 1}, + {96, 1}, {96, 1}, {96, 1}, {96, 1}, @@ -541,7 +541,7 @@ var ( yyhintParseTab = [259][]uint16{ // 0 - {1: 237, 210, 202, 204, 229, 235, 216, 227, 241, 219, 212, 211, 215, 181, 199, 200, 201, 218, 238, 188, 193, 207, 220, 203, 205, 206, 222, 239, 208, 221, 223, 231, 225, 214, 189, 217, 192, 197, 240, 198, 191, 230, 190, 224, 209, 242, 236, 213, 194, 233, 226, 228, 234, 232, 84: 195, 89: 182, 196, 92: 180, 187, 95: 186, 184, 179, 185, 183, 105: 178, 107: 177}, + {1: 237, 209, 202, 204, 229, 235, 216, 227, 241, 219, 212, 210, 215, 181, 199, 200, 201, 218, 238, 188, 193, 211, 220, 203, 205, 206, 222, 239, 207, 221, 223, 231, 225, 214, 189, 217, 192, 197, 240, 198, 191, 230, 190, 224, 208, 242, 236, 213, 194, 233, 226, 228, 234, 232, 84: 195, 89: 182, 196, 92: 180, 187, 95: 186, 184, 179, 185, 183, 105: 178, 107: 177}, {75: 176}, {1: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 332, 75: 175, 80: 432}, {1: 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 75: 174}, @@ -848,7 +848,7 @@ var ( {431}, // 255 {1: 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 75: 170}, - {1: 237, 210, 202, 204, 229, 235, 216, 227, 241, 219, 212, 211, 215, 181, 199, 200, 201, 218, 238, 188, 193, 207, 220, 203, 205, 206, 222, 239, 208, 221, 223, 231, 225, 214, 189, 217, 192, 197, 240, 198, 191, 230, 190, 224, 209, 242, 236, 213, 194, 233, 226, 228, 234, 232, 84: 195, 89: 182, 196, 92: 434, 187, 95: 186, 184, 433, 185, 183}, + {1: 237, 209, 202, 204, 229, 235, 216, 227, 241, 219, 212, 210, 215, 181, 199, 200, 201, 218, 238, 188, 193, 211, 220, 203, 205, 206, 222, 239, 207, 221, 223, 231, 225, 214, 189, 217, 192, 197, 240, 198, 191, 230, 190, 224, 208, 242, 236, 213, 194, 233, 226, 228, 234, 232, 84: 195, 89: 182, 196, 92: 434, 187, 95: 186, 184, 433, 185, 183}, {1: 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 75: 173}, {1: 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 75: 171}, } From 71cc222f4075ab0ff4195c5e2dd5a54b155f0d84 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Fri, 17 Jun 2022 15:29:15 +0800 Subject: [PATCH 40/42] Update plan_suite_in.json --- planner/core/testdata/plan_suite_in.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index 34b27a943db56..fcd76679823c4 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -582,7 +582,7 @@ "with recursive cte1(c1) as (select 1 union select /*+ merge */ c1 + 1 c1 from cte1 where c1 < 100) select * from cte1;", "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", - "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;" + "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;" ] }, { From 1b0d66b353af03c1ce61f188bf49a671e6bdc5f3 Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Fri, 1 Jul 2022 15:06:55 +0800 Subject: [PATCH 41/42] add nested cte test three floor cte, we use hint in every floor cte. --- planner/core/physical_plan_test.go | 17 +++- planner/core/testdata/plan_suite_in.json | 4 + planner/core/testdata/plan_suite_out.json | 117 ++++++++++++++++++++++ 3 files changed, 137 insertions(+), 1 deletion(-) diff --git a/planner/core/physical_plan_test.go b/planner/core/physical_plan_test.go index 65d7e2c19927e..7431b29b686a4 100644 --- a/planner/core/physical_plan_test.go +++ b/planner/core/physical_plan_test.go @@ -1045,13 +1045,28 @@ func TestCTEMergeHint(t *testing.T) { tk.MustExec("use test") tk.MustExec("drop table if exists tc") tk.MustExec("drop table if exists te") + tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t2") + tk.MustExec("drop table if exists t3") + tk.MustExec("drop table if exists t4") tk.MustExec("create table tc(a int)") tk.MustExec("create table te(c int)") + tk.MustExec("create table t1(a int)") + tk.MustExec("create table t2(b int)") + tk.MustExec("create table t3(c int)") + tk.MustExec("create table t4(d int)") tk.MustExec("insert into tc values (1), (5), (10), (15), (20), (30), (50);") tk.MustExec("insert into te values (1), (5), (10), (25), (40), (60), (100);") + tk.MustExec("insert into t1 values (1), (5), (10), (25), (40), (60), (100);") + tk.MustExec("insert into t2 values (1), (5), (10), (25), (40), (60), (100);") + tk.MustExec("insert into t3 values (1), (5), (10), (25), (40), (60), (100);") + tk.MustExec("insert into t4 values (1), (5), (10), (25), (40), (60), (100);") tk.MustExec("analyze table tc;") tk.MustExec("analyze table te;") - + tk.MustExec("analyze table t1;") + tk.MustExec("analyze table t2;") + tk.MustExec("analyze table t3;") + tk.MustExec("analyze table t4;") var ( input []string output []struct { diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index fcd76679823c4..bb6bbbb95892d 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -581,6 +581,10 @@ "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", "with recursive cte1(c1) as (select 1 union select /*+ merge */ c1 + 1 c1 from cte1 where c1 < 100) select * from cte1;", "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", + "with cte1 as (select * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select * from t3) select * from cte5,cte6) ,cte4 as (select * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "with cte1 as (select /*+ MERGE() */ * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select * from t3) select * from cte5,cte6) ,cte4 as (select * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "with cte1 as (select * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select * from t3) select * from cte5,cte6) ,cte4 as (select /*+ MERGE() */ * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "with cte1 as (select * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select /*+ MERGE() */ * from t3) select * from cte5,cte6) ,cte4 as (select * from t4) select * from cte3,cte4) select * from cte1,cte2;", "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;" ] diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 9f28ed40b83d2..2e4f278e09d04 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1678,6 +1678,123 @@ ], "Warning": null }, + { + "SQL": "with cte1 as (select * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select * from t3) select * from cte5,cte6) ,cte4 as (select * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "Plan": [ + "HashJoin 1920.80 root CARTESIAN inner join", + "├─CTEFullScan(Build) 5.60 root CTE:cte1 data:CTE_0", + "└─CTEFullScan(Probe) 343.00 root CTE:cte2 data:CTE_1", + "CTE_0 5.60 root Non-Recursive CTE", + "└─Selection(Seed Part) 5.60 root 1", + " └─TableReader 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t1 keep order:false", + "CTE_1 343.00 root Non-Recursive CTE", + "└─Projection(Seed Part) 343.00 root test.t2.b, test.t3.c, test.t4.d", + " └─HashJoin 343.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE_5", + " └─CTEFullScan(Probe) 49.00 root CTE:cte3 data:CTE_2", + "CTE_5 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t4 keep order:false", + "CTE_2 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte6 data:CTE_4", + " └─CTEFullScan(Probe) 7.00 root CTE:cte5 data:CTE_3", + "CTE_4 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t3 keep order:false", + "CTE_3 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t2 keep order:false" + ], + "Warning": null + }, + { + "SQL": "with cte1 as (select /*+ MERGE() */ * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select * from t3) select * from cte5,cte6) ,cte4 as (select * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "Plan": [ + "HashJoin 2401.00 root CARTESIAN inner join", + "├─TableReader(Build) 7.00 root data:TableFullScan", + "│ └─TableFullScan 7.00 cop[tikv] table:t1 keep order:false", + "└─CTEFullScan(Probe) 343.00 root CTE:cte2 data:CTE_1", + "CTE_1 343.00 root Non-Recursive CTE", + "└─Projection(Seed Part) 343.00 root test.t2.b, test.t3.c, test.t4.d", + " └─HashJoin 343.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE_5", + " └─CTEFullScan(Probe) 49.00 root CTE:cte3 data:CTE_2", + "CTE_5 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t4 keep order:false", + "CTE_2 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte6 data:CTE_4", + " └─CTEFullScan(Probe) 7.00 root CTE:cte5 data:CTE_3", + "CTE_4 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t3 keep order:false", + "CTE_3 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t2 keep order:false" + ], + "Warning": null + }, + { + "SQL": "with cte1 as (select * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select * from t3) select * from cte5,cte6) ,cte4 as (select /*+ MERGE() */ * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "Plan": [ + "HashJoin 1920.80 root CARTESIAN inner join", + "├─CTEFullScan(Build) 5.60 root CTE:cte1 data:CTE_0", + "└─CTEFullScan(Probe) 343.00 root CTE:cte2 data:CTE_1", + "CTE_0 5.60 root Non-Recursive CTE", + "└─Selection(Seed Part) 5.60 root 1", + " └─TableReader 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t1 keep order:false", + "CTE_1 343.00 root Non-Recursive CTE", + "└─Projection(Seed Part) 343.00 root test.t2.b, test.t3.c, test.t4.d", + " └─HashJoin 343.00 root CARTESIAN inner join", + " ├─TableReader(Build) 7.00 root data:TableFullScan", + " │ └─TableFullScan 7.00 cop[tikv] table:t4 keep order:false", + " └─CTEFullScan(Probe) 49.00 root CTE:cte3 data:CTE_2", + "CTE_2 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte6 data:CTE_4", + " └─CTEFullScan(Probe) 7.00 root CTE:cte5 data:CTE_3", + "CTE_4 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t3 keep order:false", + "CTE_3 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t2 keep order:false" + ], + "Warning": null + }, + { + "SQL": "with cte1 as (select * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select /*+ MERGE() */ * from t3) select * from cte5,cte6) ,cte4 as (select * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "Plan": [ + "HashJoin 1920.80 root CARTESIAN inner join", + "├─CTEFullScan(Build) 5.60 root CTE:cte1 data:CTE_0", + "└─CTEFullScan(Probe) 343.00 root CTE:cte2 data:CTE_1", + "CTE_0 5.60 root Non-Recursive CTE", + "└─Selection(Seed Part) 5.60 root 1", + " └─TableReader 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t1 keep order:false", + "CTE_1 343.00 root Non-Recursive CTE", + "└─Projection(Seed Part) 343.00 root test.t2.b, test.t3.c, test.t4.d", + " └─HashJoin 343.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE_5", + " └─CTEFullScan(Probe) 49.00 root CTE:cte3 data:CTE_2", + "CTE_5 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t4 keep order:false", + "CTE_2 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─TableReader(Build) 7.00 root data:TableFullScan", + " │ └─TableFullScan 7.00 cop[tikv] table:t3 keep order:false", + " └─CTEFullScan(Probe) 7.00 root CTE:cte5 data:CTE_3", + "CTE_3 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t2 keep order:false" + ], + "Warning": null + }, { "SQL": "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", "Plan": [ From 22bc4f2508e959596df7c803dd76d83e488aeedc Mon Sep 17 00:00:00 2001 From: dayicklp <437981373@qq.com> Date: Fri, 15 Jul 2022 11:55:29 +0800 Subject: [PATCH 42/42] Update hintparser.go --- parser/hintparser.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/parser/hintparser.go b/parser/hintparser.go index 9f6ad59193c14..548860fbec0bf 100644 --- a/parser/hintparser.go +++ b/parser/hintparser.go @@ -428,7 +428,7 @@ var ( {100, 1}, {100, 1}, {100, 1}, - {100, 1}, + {97, 1}, {97, 1}, {97, 1}, {97, 1}, @@ -445,7 +445,7 @@ var ( {99, 1}, {99, 1}, {99, 1}, - {96, 1}, + {99, 1}, {96, 1}, {96, 1}, {96, 1}, @@ -546,7 +546,7 @@ var ( yyhintParseTab = [261][]uint16{ // 0 - {1: 239, 212, 204, 206, 231, 237, 218, 229, 243, 221, 214, 213, 217, 183, 201, 202, 203, 220, 240, 190, 195, 209, 222, 205, 207, 208, 224, 241, 210, 223, 225, 233, 227, 216, 191, 219, 194, 199, 242, 200, 193, 232, 245, 192, 226, 211, 244, 238, 215, 196, 235, 228, 230, 236, 234, 85: 197, 90: 184, 198, 93: 182, 189, 96: 188, 186, 181, 187, 185, 106: 180, 108: 179}, + {1: 239, 211, 204, 206, 231, 237, 218, 229, 243, 221, 214, 212, 217, 183, 201, 202, 203, 220, 240, 190, 195, 213, 222, 205, 207, 208, 224, 241, 209, 223, 225, 233, 227, 216, 191, 219, 194, 199, 242, 200, 193, 232, 245, 192, 226, 210, 244, 238, 215, 196, 235, 228, 230, 236, 234, 85: 197, 90: 184, 198, 93: 182, 189, 96: 188, 186, 181, 187, 185, 106: 180, 108: 179}, {76: 178}, {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 336, 76: 177, 81: 436}, {1: 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 76: 176}, @@ -855,7 +855,7 @@ var ( {151, 70: 248, 77: 434}, {435}, {1: 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 76: 172}, - {1: 239, 212, 204, 206, 231, 237, 218, 229, 243, 221, 214, 213, 217, 183, 201, 202, 203, 220, 240, 190, 195, 209, 222, 205, 207, 208, 224, 241, 210, 223, 225, 233, 227, 216, 191, 219, 194, 199, 242, 200, 193, 232, 245, 192, 226, 211, 244, 238, 215, 196, 235, 228, 230, 236, 234, 85: 197, 90: 184, 198, 93: 438, 189, 96: 188, 186, 437, 187, 185}, + {1: 239, 211, 204, 206, 231, 237, 218, 229, 243, 221, 214, 212, 217, 183, 201, 202, 203, 220, 240, 190, 195, 213, 222, 205, 207, 208, 224, 241, 209, 223, 225, 233, 227, 216, 191, 219, 194, 199, 242, 200, 193, 232, 245, 192, 226, 210, 244, 238, 215, 196, 235, 228, 230, 236, 234, 85: 197, 90: 184, 198, 93: 438, 189, 96: 188, 186, 437, 187, 185}, {1: 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 76: 175}, // 260 {1: 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 76: 173},