diff --git a/pkg/bootstrap/versions/v4_0_6/tenant_upgrade_list.go b/pkg/bootstrap/versions/v4_0_6/tenant_upgrade_list.go index c7c983bf32756..064edceed7039 100644 --- a/pkg/bootstrap/versions/v4_0_6/tenant_upgrade_list.go +++ b/pkg/bootstrap/versions/v4_0_6/tenant_upgrade_list.go @@ -26,6 +26,11 @@ import ( var tenantUpgEntries = []versions.UpgradeEntry{ newMongoDBCatalogTable(mongodb.TableConnections, mongodb.ConnectionsDDL), newMongoDBCatalogTable(mongodb.TableMappings, mongodb.MappingsDDL), + addForeignKeyMetadataColumn("referenced_index_name", "varchar(5000) not null default ''", "on_update"), + addForeignKeyMetadataColumn("on_delete_origin", "varchar(64) not null default 'ACTION_ORIGIN_LEGACY_AMBIGUOUS'", "referenced_index_name"), + addForeignKeyMetadataColumn("on_update_origin", "varchar(64) not null default 'ACTION_ORIGIN_LEGACY_AMBIGUOUS'", "on_delete_origin"), + upgradeInformationSchemaKeyColumnUsage(), + upgradeInformationSchemaReferentialConstraints(), populateInformationSchemaCharacterSets(), upgradeInformationSchemaColumns(), } @@ -49,6 +54,19 @@ func upgradeInformationSchemaColumns() versions.UpgradeEntry { } } +func addForeignKeyMetadataColumn(column, definition, after string) versions.UpgradeEntry { + return versions.UpgradeEntry{ + Schema: catalog.MO_CATALOG, + TableName: catalog.MOForeignKeys, + UpgType: versions.ADD_COLUMN, + UpgSql: fmt.Sprintf("alter table %s.%s add column %s %s after %s", catalog.MO_CATALOG, catalog.MOForeignKeys, column, definition, after), + CheckFunc: func(txn executor.TxnExecutor, accountID uint32) (bool, error) { + columnInfo, err := versions.CheckTableColumn(txn, accountID, catalog.MO_CATALOG, catalog.MOForeignKeys, column) + return columnInfo.IsExits, err + }, + } +} + func populateInformationSchemaCharacterSets() versions.UpgradeEntry { return versions.UpgradeEntry{ Schema: sysview.InformationDBConst, @@ -81,3 +99,35 @@ func newMongoDBCatalogTable(name, ddl string) versions.UpgradeEntry { }, } } + +func upgradeInformationSchemaKeyColumnUsage() versions.UpgradeEntry { + return versions.UpgradeEntry{ + Schema: sysview.InformationDBConst, + TableName: "KEY_COLUMN_USAGE", + UpgType: versions.CREATE_VIEW, + UpgSql: sysview.InformationSchemaKeyColumnUsageDDL, + CheckFunc: checkViewDefinition("KEY_COLUMN_USAGE", sysview.InformationSchemaKeyColumnUsageDDL), + PreSql: fmt.Sprintf("DROP TABLE IF EXISTS %s.%s;", sysview.InformationDBConst, "KEY_COLUMN_USAGE"), + } +} + +func upgradeInformationSchemaReferentialConstraints() versions.UpgradeEntry { + return versions.UpgradeEntry{ + Schema: sysview.InformationDBConst, + TableName: "REFERENTIAL_CONSTRAINTS", + UpgType: versions.MODIFY_VIEW, + UpgSql: sysview.InformationSchemaReferentialConstraintsDDL, + CheckFunc: checkViewDefinition("REFERENTIAL_CONSTRAINTS", sysview.InformationSchemaReferentialConstraintsDDL), + PreSql: fmt.Sprintf("DROP VIEW IF EXISTS %s.%s;", sysview.InformationDBConst, "REFERENTIAL_CONSTRAINTS"), + } +} + +func checkViewDefinition(viewName, definition string) func(executor.TxnExecutor, uint32) (bool, error) { + return func(txn executor.TxnExecutor, accountID uint32) (bool, error) { + exists, viewDef, err := versions.CheckViewDefinition(txn, accountID, sysview.InformationDBConst, viewName) + if err != nil { + return false, err + } + return exists && viewDef == definition, nil + } +} diff --git a/pkg/bootstrap/versions/v4_0_6/upgrade.go b/pkg/bootstrap/versions/v4_0_6/upgrade.go index 9bb1c7c3e52cc..aab494fb6170d 100644 --- a/pkg/bootstrap/versions/v4_0_6/upgrade.go +++ b/pkg/bootstrap/versions/v4_0_6/upgrade.go @@ -15,6 +15,9 @@ package v4_0_6 import ( "context" + "fmt" + "sort" + "strings" "time" "go.uber.org/zap" @@ -22,6 +25,10 @@ import ( "github.com/matrixorigin/matrixone/pkg/bootstrap/versions" "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/common/sqlquote" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect/mysql" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" "github.com/matrixorigin/matrixone/pkg/util/executor" ) @@ -46,24 +53,773 @@ func (v *versionHandle) Prepare(_ context.Context, txn executor.TxnExecutor, _ b return nil } -func (v *versionHandle) HandleTenantUpgrade(_ context.Context, tenantID int32, txn executor.TxnExecutor) error { +func (v *versionHandle) HandleTenantUpgrade(ctx context.Context, tenantID int32, txn executor.TxnExecutor) error { for _, entry := range tenantUpgEntries { start := time.Now() if err := entry.Upgrade(txn, uint32(tenantID)); err != nil { - getLogger(txn.Txn().TxnOptions().CN).Error("tenant upgrade entry execute error", zap.Error(err), zap.Int32("tenantId", tenantID), zap.String("version", v.metadata.Version), zap.String("upgrade entry", entry.String())) + getLogger(txn.Txn().TxnOptions().CN).Error("tenant upgrade entry execute error", + zap.Error(err), zap.Int32("tenantId", tenantID), zap.String("version", v.metadata.Version), zap.String("upgrade entry", entry.String())) return err } - getLogger(txn.Txn().TxnOptions().CN).Info("tenant upgrade entry complete", zap.String("upgrade entry", entry.String()), zap.Int64("time cost(ms)", time.Since(start).Milliseconds()), zap.String("toVersion", v.metadata.Version)) + getLogger(txn.Txn().TxnOptions().CN).Info("tenant upgrade entry complete", + zap.String("upgrade entry", entry.String()), zap.Int64("time cost(ms)", time.Since(start).Milliseconds()), zap.String("toVersion", v.metadata.Version)) + } + if err := upgradeLegacyForeignKeyMetadata(ctx, tenantID, txn); err != nil { + return err + } + getLogger(txn.Txn().TxnOptions().CN).Info("tenant upgrade success", zap.Int32("tenantId", tenantID), zap.String("toVersion", v.metadata.Version)) + return nil +} + +const legacyForeignKeyTableDefinitionsSQL = "SELECT fk.db_name, fk.table_name, " + + "fk.constraint_name, fk.column_name, fk.refer_db_name, fk.refer_table_name, fk.refer_column_name, fk.on_delete, fk.on_update " + + "FROM mo_catalog.mo_foreign_keys fk " + + "WHERE fk.constraint_id = 0 " + + "ORDER BY fk.db_name, fk.table_name, fk.constraint_name, fk.column_name" + +// legacyForeignKeyReferencedIndexDefinitionsSQL intentionally has a broader +// predicate than legacyForeignKeyTableDefinitionsSQL. Older upgrades may have +// assigned constraint_id while leaving the referenced key absent, so every FK +// whose new metadata column is empty must be reconciled with current catalog +// state. +const legacyForeignKeyReferencedIndexDefinitionsSQL = "SELECT fk.db_name, fk.table_name, " + + "fk.constraint_name, fk.column_name, fk.refer_db_name, fk.refer_table_name, fk.refer_column_name, fk.on_delete, fk.on_update " + + "FROM mo_catalog.mo_foreign_keys fk " + + "WHERE fk.referenced_index_name = '' " + + "ORDER BY fk.db_name, fk.table_name, fk.constraint_name, fk.column_name" + +type legacyForeignKeyTableDefinition struct { + database string + table string + foreignKeys []legacyForeignKeyCatalogRow +} + +// legacyForeignKeyCatalogRow is the authoritative catalog source for the +// legacy foreign keys whose constraint_id has not yet been populated. +type legacyForeignKeyCatalogRow struct { + constraintName string + columnName string + referDBName string + referTableName string + referColumnName string + onDelete string + onUpdate string +} + +type legacyForeignKeyCatalogConstraint struct { + name string + rows []legacyForeignKeyCatalogRow +} + +type legacyReferenceAction struct { + name string + origin string +} + +type legacyForeignKeyActions struct { + onDelete legacyReferenceAction + onUpdate legacyReferenceAction +} + +// upgradeLegacyForeignKeyMetadata restores zero-valued legacy FK ordinals. The +// catalog identifies the current constraints and SHOW CREATE TABLE supplies +// their current names and column order. rel_createsql is consulted only as a +// historical syntax record for a named CREATE-time FK that still reconciles +// with the catalog; it is never treated as the current table definition. +func upgradeLegacyForeignKeyMetadata(ctx context.Context, tenantID int32, txn executor.TxnExecutor) error { + ordinalDefinitions, err := getLegacyForeignKeyTableDefinitions(legacyForeignKeyTableDefinitionsSQL, tenantID, txn) + if err != nil { + return err + } + referencedIndexDefinitions, err := getLegacyForeignKeyTableDefinitions(legacyForeignKeyReferencedIndexDefinitionsSQL, tenantID, txn) + if err != nil { + return err + } + + showCreateByTable := make(map[string]string) + getShowCreate := func(definition legacyForeignKeyTableDefinition) (string, error) { + key := definition.database + "\x00" + definition.table + if createSQL, ok := showCreateByTable[key]; ok { + return createSQL, nil + } + createSQL, err := getLegacyForeignKeyShowCreateSQL(tenantID, txn, definition) + if err != nil { + return "", err + } + showCreateByTable[key] = createSQL + return createSQL, nil + } + historicalCreateByTable := make(map[string]string) + getHistoricalCreate := func(definition legacyForeignKeyTableDefinition) (string, error) { + key := definition.database + "\x00" + definition.table + if createSQL, ok := historicalCreateByTable[key]; ok { + return createSQL, nil + } + createSQL, err := getLegacyForeignKeyHistoricalCreateSQL(tenantID, txn, definition) + if err != nil { + return "", err + } + historicalCreateByTable[key] = createSQL + return createSQL, nil + } + + // constraint_id and action origins have a legacy zero-value sentinel, so + // only those rows need the ordinal/action migration. + for _, definition := range ordinalDefinitions { + createSQL, err := getShowCreate(definition) + if err != nil { + return err + } + historicalCreateSQL, err := getHistoricalCreate(definition) + if err != nil { + return err + } + updates, err := legacyForeignKeyMetadataUpdatesWithHistoricalDefinition(definition, createSQL, historicalCreateSQL) + if err != nil { + return err + } + for _, sql := range updates { + res, err := txn.Exec(sql, executor.StatementOption{}.WithAccountID(uint32(tenantID))) + if err != nil { + return err + } + res.Close() + } + } + + // referenced_index_name is independent of the legacy ordinal sentinel. + // Backfill it for both zero-ordinal rows and already-numbered historical + // rows, without reinterpreting their action metadata. + for _, definition := range referencedIndexDefinitions { + createSQL, err := getShowCreate(definition) + if err != nil { + return err + } + referencedKeys, err := legacyForeignKeyReferencedKeys(definition, createSQL) + if err != nil { + return err + } + for constraintName, key := range referencedKeys { + indexName, err := getLegacyForeignKeyReferencedIndexName(tenantID, txn, key) + if err != nil { + return err + } + if indexName == "" { + continue + } + res, err := txn.Exec(legacyForeignKeyReferencedIndexUpdateSQL(definition, constraintName, indexName), executor.StatementOption{}.WithAccountID(uint32(tenantID))) + if err != nil { + return err + } + res.Close() + } } return nil } +type legacyForeignKeyReferencedKey struct { + database string + table string + columns []string +} + +// legacyForeignKeyReferencedKeys reconciles the current SHOW CREATE output +// with catalog constraints. It never reads rel_createsql: ALTER-added FKs are +// deliberately matched by their current child/reference column pairs. +func legacyForeignKeyReferencedKeys(definition legacyForeignKeyTableDefinition, createSQL string) (map[string]legacyForeignKeyReferencedKey, error) { + statements, err := mysql.Parse(context.Background(), createSQL, 1) + if err != nil { + return nil, moerr.NewInternalErrorNoCtxf("parse legacy foreign-key table %s.%s: %v", definition.database, definition.table, err) + } + defer func() { + for _, statement := range statements { + statement.Free() + } + }() + if len(statements) != 1 { + return nil, moerr.NewInternalErrorNoCtxf("legacy foreign-key table %s.%s has %d statements", definition.database, definition.table, len(statements)) + } + createTable, ok := statements[0].(*tree.CreateTable) + if !ok { + return nil, moerr.NewInternalErrorNoCtxf("legacy foreign-key table %s.%s does not have a CREATE TABLE definition", definition.database, definition.table) + } + + constraints := legacyForeignKeyCatalogConstraints(definition.foreignKeys) + matched := make(map[string]bool) + keys := make(map[string]legacyForeignKeyReferencedKey) + for _, tableDef := range createTable.Defs { + foreignKey, ok := tableDef.(*tree.ForeignKey) + if !ok || foreignKey.Refer == nil { + continue + } + matchedIndex := -1 + for i, constraint := range constraints { + if matched[constraint.name] || !sameLegacyForeignKeyColumns(definition.database, foreignKey, constraint.rows) { + continue + } + if foreignKey.ConstraintSymbol != "" && foreignKey.ConstraintSymbol != constraint.name { + continue + } + if matchedIndex >= 0 { + matchedIndex = -1 + break + } + matchedIndex = i + } + if matchedIndex < 0 { + continue + } + constraint := constraints[matchedIndex] + matched[constraint.name] = true + database := definition.database + if foreignKey.Refer.TableName.SchemaName != "" { + database = string(foreignKey.Refer.TableName.SchemaName) + } + columns := make([]string, len(foreignKey.Refer.KeyParts)) + for i, keyPart := range foreignKey.Refer.KeyParts { + columns[i] = keyPart.ColName.ColName() + } + keys[constraint.name] = legacyForeignKeyReferencedKey{ + database: database, + table: string(foreignKey.Refer.TableName.ObjectName), + columns: columns, + } + } + for _, constraint := range constraints { + if matched[constraint.name] || len(constraint.rows) != 1 { + continue + } + row := constraint.rows[0] + database := row.referDBName + if database == "" { + database = definition.database + } + keys[constraint.name] = legacyForeignKeyReferencedKey{database: database, table: row.referTableName, columns: []string{row.referColumnName}} + } + return keys, nil +} + +func getLegacyForeignKeyReferencedIndexName(tenantID int32, txn executor.TxnExecutor, key legacyForeignKeyReferencedKey) (string, error) { + query := fmt.Sprintf( + "SELECT idx.name, idx.type, idx.ordinal_position, idx.column_name FROM mo_catalog.mo_indexes idx "+ + "JOIN mo_catalog.mo_tables tbl ON idx.table_id = tbl.rel_id "+ + "WHERE tbl.account_id = %d AND tbl.reldatabase = %s AND tbl.relname = %s AND (idx.type = 'PRIMARY' OR idx.type = 'UNIQUE') "+ + "ORDER BY CASE WHEN idx.type = 'PRIMARY' THEN 0 ELSE 1 END, idx.name, idx.ordinal_position", + tenantID, sqlquote.String(key.database), sqlquote.String(key.table), + ) + res, err := txn.Exec(query, executor.StatementOption{}.WithAccountID(uint32(tenantID))) + if err != nil { + return "", err + } + defer res.Close() + type candidate struct { + name string + primary bool + columns []string + } + candidates := make(map[string]*candidate) + res.ReadRows(func(rows int, cols []*vector.Vector) bool { + for i := 0; i < rows; i++ { + name := cols[0].GetStringAt(i) + candidateKey := cols[1].GetStringAt(i) + "\x00" + name + entry := candidates[candidateKey] + if entry == nil { + entry = &candidate{name: name, primary: strings.EqualFold(cols[1].GetStringAt(i), "PRIMARY")} + candidates[candidateKey] = entry + } + entry.columns = append(entry.columns, cols[3].GetStringAt(i)) + } + return true + }) + ordered := make([]*candidate, 0, len(candidates)) + for _, candidate := range candidates { + ordered = append(ordered, candidate) + } + sort.Slice(ordered, func(i, j int) bool { + if ordered[i].primary != ordered[j].primary { + return ordered[i].primary + } + return ordered[i].name < ordered[j].name + }) + for _, candidate := range ordered { + if len(candidate.columns) < len(key.columns) { + continue + } + matched := true + for i, column := range key.columns { + if candidate.columns[i] != column { + matched = false + break + } + } + if matched { + return candidate.name, nil + } + } + // Legacy MatrixOne accepted some FK shapes that do not name an ordered + // leading prefix of a PRIMARY/UNIQUE key. Leave the value empty rather than + // inventing a wrong UNIQUE_CONSTRAINT_NAME; new FK creation rejects them. + return "", nil +} + +func legacyForeignKeyReferencedIndexUpdateSQL(definition legacyForeignKeyTableDefinition, constraintName, indexName string) string { + return fmt.Sprintf( + "UPDATE mo_catalog.mo_foreign_keys SET referenced_index_name = %s WHERE db_name = %s AND table_name = %s AND constraint_name = %s", + sqlquote.String(indexName), sqlquote.String(definition.database), sqlquote.String(definition.table), sqlquote.String(constraintName), + ) +} + +func getLegacyForeignKeyTableDefinitions(query string, tenantID int32, txn executor.TxnExecutor) ([]legacyForeignKeyTableDefinition, error) { + res, err := txn.Exec(query, executor.StatementOption{}.WithAccountID(uint32(tenantID))) + if err != nil { + return nil, err + } + defer res.Close() + + definitions := make([]legacyForeignKeyTableDefinition, 0) + definitionByTable := make(map[string]int) + res.ReadRows(func(rows int, cols []*vector.Vector) bool { + for i := 0; i < rows; i++ { + database := cols[0].GetStringAt(i) + table := cols[1].GetStringAt(i) + key := database + "\x00" + table + definitionIndex, ok := definitionByTable[key] + if !ok { + definitionIndex = len(definitions) + definitionByTable[key] = definitionIndex + definitions = append(definitions, legacyForeignKeyTableDefinition{ + database: database, + table: table, + }) + } + definitions[definitionIndex].foreignKeys = append(definitions[definitionIndex].foreignKeys, legacyForeignKeyCatalogRow{ + constraintName: cols[2].GetStringAt(i), + columnName: cols[3].GetStringAt(i), + referDBName: cols[4].GetStringAt(i), + referTableName: cols[5].GetStringAt(i), + referColumnName: cols[6].GetStringAt(i), + onDelete: cols[7].GetStringAt(i), + onUpdate: cols[8].GetStringAt(i), + }) + } + return true + }) + return definitions, nil +} + +func getLegacyForeignKeyShowCreateSQL(tenantID int32, txn executor.TxnExecutor, definition legacyForeignKeyTableDefinition) (string, error) { + res, err := txn.Exec( + fmt.Sprintf("SHOW CREATE TABLE %s", sqlquote.QualifiedIdent(definition.database, definition.table)), + executor.StatementOption{}.WithAccountID(uint32(tenantID)), + ) + if err != nil { + return "", err + } + defer res.Close() + + var createSQL string + rowCount := 0 + validResult := true + res.ReadRows(func(rows int, cols []*vector.Vector) bool { + if len(cols) < 2 { + validResult = false + return false + } + for i := 0; i < rows; i++ { + rowCount++ + if rowCount != 1 { + validResult = false + return false + } + createSQL = cols[1].GetStringAt(i) + } + return true + }) + if !validResult || rowCount != 1 || createSQL == "" { + return "", moerr.NewInternalErrorNoCtxf("SHOW CREATE TABLE for legacy foreign-key table %s.%s returned an invalid result", definition.database, definition.table) + } + return createSQL, nil +} + +func getLegacyForeignKeyHistoricalCreateSQL(tenantID int32, txn executor.TxnExecutor, definition legacyForeignKeyTableDefinition) (string, error) { + query := fmt.Sprintf( + "SELECT rel_createsql FROM mo_catalog.mo_tables WHERE account_id = %d AND reldatabase = %s AND relname = %s", + tenantID, sqlquote.String(definition.database), sqlquote.String(definition.table), + ) + res, err := txn.Exec(query, executor.StatementOption{}.WithAccountID(uint32(tenantID))) + if err != nil { + return "", err + } + defer res.Close() + + var createSQL string + rowCount := 0 + validResult := true + res.ReadRows(func(rows int, cols []*vector.Vector) bool { + if len(cols) < 1 { + validResult = false + return false + } + for i := 0; i < rows; i++ { + rowCount++ + if rowCount != 1 { + validResult = false + return false + } + createSQL = cols[0].GetStringAt(i) + } + return true + }) + if !validResult || rowCount > 1 { + return "", moerr.NewInternalErrorNoCtxf("historical CREATE definition for legacy foreign-key table %s.%s returned an invalid result", definition.database, definition.table) + } + return createSQL, nil +} + +func legacyForeignKeyMetadataUpdates(definition legacyForeignKeyTableDefinition, createSQL string) ([]string, error) { + return legacyForeignKeyMetadataUpdatesWithHistoricalDefinition(definition, createSQL, "") +} + +func legacyForeignKeyMetadataUpdatesWithHistoricalDefinition( + definition legacyForeignKeyTableDefinition, + createSQL string, + historicalCreateSQL string, +) ([]string, error) { + statements, err := mysql.Parse(context.Background(), createSQL, 1) + if err != nil { + return nil, moerr.NewInternalErrorNoCtxf("parse legacy foreign-key table %s.%s: %v", definition.database, definition.table, err) + } + defer func() { + for _, statement := range statements { + statement.Free() + } + }() + + if len(statements) != 1 { + return nil, moerr.NewInternalErrorNoCtxf("legacy foreign-key table %s.%s has %d statements", definition.database, definition.table, len(statements)) + } + createTable, ok := statements[0].(*tree.CreateTable) + if !ok { + return nil, moerr.NewInternalErrorNoCtxf("legacy foreign-key table %s.%s does not have a CREATE TABLE definition", definition.database, definition.table) + } + + constraints := legacyForeignKeyCatalogConstraints(definition.foreignKeys) + historicalActions := legacyForeignKeyHistoricalActions(definition, constraints, historicalCreateSQL) + matchedConstraints := make(map[string]bool) + updates := make([]string, 0) + for _, tableDef := range createTable.Defs { + foreignKey, ok := tableDef.(*tree.ForeignKey) + if !ok { + continue + } + if foreignKey.Refer == nil { + return nil, moerr.NewInternalErrorNoCtxf("legacy foreign key in %s.%s has incomplete persisted definition", definition.database, definition.table) + } + + // Match the current SHOW CREATE TABLE declaration to the catalog by both + // name and complete child/reference column set. The latter prevents a + // dropped and re-added constraint that reused its name from being matched + // to the old definition. + if foreignKey.ConstraintSymbol != "" { + for _, constraint := range constraints { + if constraint.name == foreignKey.ConstraintSymbol && + sameLegacyForeignKeyColumns(definition.database, foreignKey, constraint.rows) { + actions, err := legacyForeignKeyCatalogConstraintActions(constraint) + if err != nil { + return nil, err + } + if historical, ok := historicalActions[constraint.name]; ok { + actions = historical + } + matchedConstraints[constraint.name] = true + updates = appendLegacyForeignKeyASTUpdates(updates, definition, constraint.name, foreignKey, actions) + break + } + } + continue + } + + // An unnamed FK is assigned a generated name in the catalog. Match it to + // the catalog rows by its complete child/reference column set. + // If that signature is ambiguous, leave every candidate to the catalog + // fallback below rather than assigning one AST action to another FK. + matchedIndex := -1 + for i, constraint := range constraints { + if matchedConstraints[constraint.name] || !sameLegacyForeignKeyColumns(definition.database, foreignKey, constraint.rows) { + continue + } + if matchedIndex >= 0 { + matchedIndex = -1 + break + } + matchedIndex = i + } + if matchedIndex >= 0 { + constraint := constraints[matchedIndex] + actions, err := legacyForeignKeyCatalogConstraintActions(constraint) + if err != nil { + return nil, err + } + if historical, ok := historicalActions[constraint.name]; ok { + actions = historical + } + matchedConstraints[constraint.name] = true + updates = appendLegacyForeignKeyASTUpdates(updates, definition, constraint.name, foreignKey, actions) + } + } + + // A one-column FK needs no declaration-order recovery. For a composite FK, + // constraint_id is the only stored order and legacy rows have it zero; never + // fabricate an ordinal by sorting catalog column names when SHOW CREATE TABLE + // cannot be reconciled. + for _, constraint := range constraints { + if matchedConstraints[constraint.name] { + continue + } + if len(constraint.rows) != 1 { + return nil, moerr.NewInternalErrorNoCtxf( + "cannot reconcile column order for legacy composite foreign key %s in %s.%s", + constraint.name, definition.database, definition.table, + ) + } + actions, err := legacyForeignKeyCatalogConstraintActions(constraint) + if err != nil { + return nil, err + } + if historical, ok := historicalActions[constraint.name]; ok { + actions = historical + } + row := constraint.rows[0] + updates = append(updates, legacyForeignKeyUpdateSQL( + definition, + constraint.name, + row.columnName, + 1, + actions, + )) + } + return updates, nil +} + +// legacyForeignKeyHistoricalActions extracts action syntax only for named +// CREATE-time constraints that still match the authoritative catalog by name, +// child columns, referenced table, and referenced columns. Invalid, stale, or +// unnamed historical definitions are ignored so ALTER-added and generated-name +// constraints continue through the catalog/SHOW CREATE fallback. +func legacyForeignKeyHistoricalActions( + definition legacyForeignKeyTableDefinition, + constraints []legacyForeignKeyCatalogConstraint, + createSQL string, +) map[string]legacyForeignKeyActions { + if strings.TrimSpace(createSQL) == "" { + return nil + } + statements, err := mysql.Parse(context.Background(), createSQL, 1) + if err != nil { + return nil + } + defer func() { + for _, statement := range statements { + statement.Free() + } + }() + if len(statements) != 1 { + return nil + } + createTable, ok := statements[0].(*tree.CreateTable) + if !ok { + return nil + } + + actionsByConstraint := make(map[string]legacyForeignKeyActions) + for _, tableDef := range createTable.Defs { + foreignKey, ok := tableDef.(*tree.ForeignKey) + if !ok || foreignKey.Refer == nil || foreignKey.ConstraintSymbol == "" { + continue + } + for _, constraint := range constraints { + if constraint.name != foreignKey.ConstraintSymbol || + !sameLegacyForeignKeyColumns(definition.database, foreignKey, constraint.rows) { + continue + } + catalogActions, err := legacyForeignKeyCatalogConstraintActions(constraint) + if err != nil { + continue + } + historicalActions := legacyForeignKeyASTActions(foreignKey) + if legacyHistoricalActionMatchesCatalog(historicalActions.onDelete, catalogActions.onDelete) && + legacyHistoricalActionMatchesCatalog(historicalActions.onUpdate, catalogActions.onUpdate) { + actionsByConstraint[constraint.name] = historicalActions + } + break + } + } + return actionsByConstraint +} + +func legacyForeignKeyASTActions(foreignKey *tree.ForeignKey) legacyForeignKeyActions { + return legacyForeignKeyActions{ + onDelete: legacyASTReferenceAction(foreignKey.Refer.OnDelete), + onUpdate: legacyASTReferenceAction(foreignKey.Refer.OnUpdate), + } +} + +func legacyASTReferenceAction(action tree.ReferenceOptionType) legacyReferenceAction { + if action == tree.REFERENCE_OPTION_INVALID { + return legacyReferenceAction{name: "NO_ACTION", origin: "ACTION_ORIGIN_DEFAULT"} + } + return legacyReferenceAction{ + name: strings.ToUpper(strings.ReplaceAll(action.ToString(), " ", "_")), + origin: "ACTION_ORIGIN_EXPLICIT", + } +} + +func legacyHistoricalActionMatchesCatalog(historical, catalog legacyReferenceAction) bool { + if historical.origin == "ACTION_ORIGIN_DEFAULT" { + // Legacy execution stored an omitted action as RESTRICT. Some partially + // migrated catalogs may already contain the metadata spelling NO_ACTION. + return catalog.name == "RESTRICT" || catalog.name == "NO_ACTION" + } + return historical.name == catalog.name +} + +func legacyForeignKeyCatalogConstraints(rows []legacyForeignKeyCatalogRow) []legacyForeignKeyCatalogConstraint { + byName := make(map[string][]legacyForeignKeyCatalogRow) + for _, row := range rows { + byName[row.constraintName] = append(byName[row.constraintName], row) + } + names := make([]string, 0, len(byName)) + for name := range byName { + names = append(names, name) + } + sort.Strings(names) + + constraints := make([]legacyForeignKeyCatalogConstraint, 0, len(names)) + for _, name := range names { + constraintRows := byName[name] + sort.Slice(constraintRows, func(i, j int) bool { + return constraintRows[i].columnName < constraintRows[j].columnName + }) + constraints = append(constraints, legacyForeignKeyCatalogConstraint{name: name, rows: constraintRows}) + } + return constraints +} + +func sameLegacyForeignKeyColumns(database string, foreignKey *tree.ForeignKey, rows []legacyForeignKeyCatalogRow) bool { + if len(foreignKey.KeyParts) != len(rows) || foreignKey.Refer == nil || len(foreignKey.Refer.KeyParts) != len(rows) { + return false + } + referDatabase := database + if foreignKey.Refer.TableName != nil && foreignKey.Refer.TableName.SchemaName != "" { + referDatabase = string(foreignKey.Refer.TableName.SchemaName) + } + referTable := "" + if foreignKey.Refer.TableName != nil { + referTable = string(foreignKey.Refer.TableName.ObjectName) + } + columns := make([]string, len(foreignKey.KeyParts)) + for i, keyPart := range foreignKey.KeyParts { + columns[i] = keyPart.ColName.ColName() + "\x00" + foreignKey.Refer.KeyParts[i].ColName.ColName() + } + sort.Strings(columns) + catalogColumns := make([]string, len(rows)) + for i, row := range rows { + catalogReferDatabase := row.referDBName + if catalogReferDatabase == "" { + catalogReferDatabase = database + } + if catalogReferDatabase != referDatabase || row.referTableName != referTable { + return false + } + catalogColumns[i] = row.columnName + "\x00" + row.referColumnName + } + sort.Strings(catalogColumns) + return strings.Join(columns, "\x00") == strings.Join(catalogColumns, "\x00") +} + +func appendLegacyForeignKeyASTUpdates( + updates []string, + definition legacyForeignKeyTableDefinition, + constraintName string, + foreignKey *tree.ForeignKey, + actions legacyForeignKeyActions, +) []string { + for ordinal, keyPart := range foreignKey.KeyParts { + updates = append(updates, legacyForeignKeyUpdateSQL( + definition, + constraintName, + keyPart.ColName.ColName(), + ordinal+1, + actions, + )) + } + return updates +} + +func legacyForeignKeyCatalogConstraintActions(constraint legacyForeignKeyCatalogConstraint) (legacyForeignKeyActions, error) { + if len(constraint.rows) == 0 { + return legacyForeignKeyActions{}, moerr.NewInternalErrorNoCtxf("legacy foreign key %s has no catalog rows", constraint.name) + } + onDelete := legacyCatalogReferenceAction(constraint.rows[0].onDelete) + onUpdate := legacyCatalogReferenceAction(constraint.rows[0].onUpdate) + for _, row := range constraint.rows[1:] { + if legacyCatalogReferenceAction(row.onDelete).name != onDelete.name || legacyCatalogReferenceAction(row.onUpdate).name != onUpdate.name { + return legacyForeignKeyActions{}, moerr.NewInternalErrorNoCtxf("legacy foreign key %s has inconsistent catalog actions", constraint.name) + } + } + return legacyForeignKeyActions{onDelete: onDelete, onUpdate: onUpdate}, nil +} + +func legacyForeignKeyUpdateSQL( + definition legacyForeignKeyTableDefinition, + constraintName, columnName string, + ordinal int, + actions legacyForeignKeyActions, +) string { + return fmt.Sprintf( + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = %d, on_delete = %s, on_update = %s, on_delete_origin = %s, on_update_origin = %s "+ + "WHERE constraint_id = 0 AND db_name = %s AND table_name = %s AND constraint_name = %s AND column_name = %s", + ordinal, + sqlquote.String(actions.onDelete.name), + sqlquote.String(actions.onUpdate.name), + sqlquote.String(actions.onDelete.origin), + sqlquote.String(actions.onUpdate.origin), + sqlquote.String(definition.database), + sqlquote.String(definition.table), + sqlquote.String(constraintName), + sqlquote.String(columnName), + ) +} + +// The catalog is the authoritative fallback for ALTER-added, unnamed, stale, +// or otherwise unreconciled historical definitions. Preserve its action. Only +// RESTRICT and NO_ACTION can be confused with an omitted action, so mark those +// origins as ambiguous; all other actions necessarily came from explicit SQL. +func legacyCatalogReferenceAction(action string) legacyReferenceAction { + action = strings.TrimSpace(action) + if action == "" { + action = "NO_ACTION" + } + action = strings.ToUpper(strings.ReplaceAll(action, " ", "_")) + origin := "ACTION_ORIGIN_EXPLICIT" + if action == "RESTRICT" || action == "NO_ACTION" { + origin = "ACTION_ORIGIN_LEGACY_AMBIGUOUS" + } + return legacyReferenceAction{name: action, origin: origin} +} + func (v *versionHandle) HandleClusterUpgrade(_ context.Context, txn executor.TxnExecutor) error { for _, entry := range clusterUpgEntries { + start := time.Now() if err := entry.Upgrade(txn, uint32(txn.Txn().TxnOptions().AccountID)); err != nil { + getLogger(txn.Txn().TxnOptions().CN).Error("cluster upgrade entry execute error", + zap.Error(err), zap.String("version", v.metadata.Version), zap.String("upgrade entry", entry.String())) return err } + getLogger(txn.Txn().TxnOptions().CN).Info("cluster upgrade entry complete", + zap.String("upgrade entry", entry.String()), zap.Int64("time cost(ms)", time.Since(start).Milliseconds()), zap.String("toVersion", v.metadata.Version)) } + getLogger(txn.Txn().TxnOptions().CN).Info("cluster upgrade success", zap.String("toVersion", v.metadata.Version)) return nil } diff --git a/pkg/bootstrap/versions/v4_0_6/upgrade_test.go b/pkg/bootstrap/versions/v4_0_6/upgrade_test.go index 8168ac8539b2a..3468d06ad4e27 100644 --- a/pkg/bootstrap/versions/v4_0_6/upgrade_test.go +++ b/pkg/bootstrap/versions/v4_0_6/upgrade_test.go @@ -4,23 +4,31 @@ // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. - package v4_0_6 import ( + "context" "errors" "strings" "testing" + "github.com/golang/mock/gomock" + "github.com/prashantv/gostub" + "github.com/matrixorigin/matrixone/pkg/bootstrap/versions" "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/mpool" + "github.com/matrixorigin/matrixone/pkg/common/runtime" + "github.com/matrixorigin/matrixone/pkg/container/types" + mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" + "github.com/matrixorigin/matrixone/pkg/pb/txn" "github.com/matrixorigin/matrixone/pkg/sql/mongodb" "github.com/matrixorigin/matrixone/pkg/util/executor" "github.com/matrixorigin/matrixone/pkg/util/sysview" @@ -28,7 +36,7 @@ import ( ) func TestUpgradeEntries(t *testing.T) { - require.Len(t, tenantUpgEntries, 4) + require.Len(t, tenantUpgEntries, 9) require.Len(t, clusterUpgEntries, 1) require.Equal(t, retireKafkaSinkDaemonTasks.UpgSql, clusterUpgEntries[0].UpgSql) require.Equal(t, mongodb.TableConnections, tenantUpgEntries[0].TableName) @@ -37,24 +45,41 @@ func TestUpgradeEntries(t *testing.T) { require.Equal(t, versions.CREATE_NEW_TABLE, entry.UpgType) require.Contains(t, strings.ToLower(entry.UpgSql), "create table mo_catalog.") } - characterSets := tenantUpgEntries[2] + characterSets := tenantUpgEntries[7] require.Equal(t, sysview.InformationDBConst, characterSets.Schema) require.Equal(t, "CHARACTER_SETS", characterSets.TableName) require.Equal(t, versions.MODIFY_METADATA, characterSets.UpgType) require.Equal(t, sysview.InformationSchemaCharacterSetsData, characterSets.UpgSql) require.Contains(t, strings.ToLower(characterSets.PreSql), "delete from information_schema.character_sets") - columns := tenantUpgEntries[3] + columns := tenantUpgEntries[8] require.Equal(t, sysview.InformationDBConst, columns.Schema) require.Equal(t, "COLUMNS", columns.TableName) require.Equal(t, versions.MODIFY_VIEW, columns.UpgType) require.Equal(t, sysview.InformationSchemaColumnsDDL, columns.UpgSql) require.Contains(t, strings.ToLower(columns.PreSql), "drop view if exists information_schema.columns") +} - meta := Handler.Metadata() - require.Equal(t, "4.0.6", meta.Version) - require.Equal(t, "4.0.5", meta.MinUpgradeVersion) - require.Equal(t, versions.Yes, meta.UpgradeTenant) - require.Equal(t, uint32(len(tenantUpgEntries)+len(clusterUpgEntries)), meta.VersionOffset) +func TestForeignKeyMetadataTenantUpgradeEntries(t *testing.T) { + require.Len(t, tenantUpgEntries, 9) + + for i, column := range []string{"referenced_index_name", "on_delete_origin", "on_update_origin"} { + entry := tenantUpgEntries[2+i] + require.Equal(t, versions.ADD_COLUMN, entry.UpgType) + require.Equal(t, catalog.MOForeignKeys, entry.TableName) + require.Contains(t, entry.UpgSql, "add column "+column) + } + + keyColumnUsage := tenantUpgEntries[5] + require.Equal(t, versions.CREATE_VIEW, keyColumnUsage.UpgType) + require.Equal(t, "KEY_COLUMN_USAGE", keyColumnUsage.TableName) + require.Equal(t, sysview.InformationSchemaKeyColumnUsageDDL, keyColumnUsage.UpgSql) + require.Contains(t, strings.ToLower(keyColumnUsage.PreSql), "drop table if exists information_schema.key_column_usage") + + referentialConstraints := tenantUpgEntries[6] + require.Equal(t, versions.MODIFY_VIEW, referentialConstraints.UpgType) + require.Equal(t, "REFERENTIAL_CONSTRAINTS", referentialConstraints.TableName) + require.Equal(t, sysview.InformationSchemaReferentialConstraintsDDL, referentialConstraints.UpgSql) + require.Contains(t, strings.ToLower(referentialConstraints.PreSql), "drop view if exists information_schema.referential_constraints") } func TestUpgradeInformationSchemaColumnsCheck(t *testing.T) { @@ -95,6 +120,758 @@ func TestUpgradeInformationSchemaColumnsCheck(t *testing.T) { } } +func TestLegacyForeignKeyMetadataCatalogQueriesUseForeignKeyCatalogOnly(t *testing.T) { + for _, query := range []string{legacyForeignKeyTableDefinitionsSQL, legacyForeignKeyReferencedIndexDefinitionsSQL} { + require.NotContains(t, strings.ToLower(query), "rel_createsql") + require.NotContains(t, strings.ToLower(query), "mo_tables") + } + require.Contains(t, legacyForeignKeyReferencedIndexDefinitionsSQL, "referenced_index_name = ''") +} + +func TestLegacyForeignKeyMetadataUpdatesPreserveOrderAndActions(t *testing.T) { + updates, err := legacyForeignKeyMetadataUpdatesWithHistoricalDefinition(legacyForeignKeyTableDefinition{ + database: "db'one", + table: "child", + foreignKeys: []legacyForeignKeyCatalogRow{ + {constraintName: "fk_default", columnName: "a", referDBName: "db'one", referTableName: "parent", referColumnName: "a", onDelete: "RESTRICT", onUpdate: "RESTRICT"}, + {constraintName: "fk_default", columnName: "b", referDBName: "db'one", referTableName: "parent", referColumnName: "b", onDelete: "RESTRICT", onUpdate: "RESTRICT"}, + {constraintName: "fk_restrict", columnName: "a", referDBName: "db'one", referTableName: "parent", referColumnName: "a", onDelete: "RESTRICT", onUpdate: "RESTRICT"}, + }, + }, "create table child (a int, b int, constraint fk_default foreign key (b, a) references parent (b, a), "+ + "constraint fk_restrict foreign key (a) references parent (a) on delete restrict on update restrict)", + "create table child (a int, b int, constraint fk_default foreign key (b, a) references parent (b, a), "+ + "constraint fk_restrict foreign key (a) references parent (a) on delete restrict on update restrict)") + require.NoError(t, err) + require.Len(t, updates, 3) + + for _, expected := range []string{ + "constraint_id = 1, on_delete = 'NO_ACTION', on_update = 'NO_ACTION', on_delete_origin = 'ACTION_ORIGIN_DEFAULT', on_update_origin = 'ACTION_ORIGIN_DEFAULT'", + "constraint_name = 'fk_default' AND column_name = 'b'", + "constraint_id = 2, on_delete = 'NO_ACTION', on_update = 'NO_ACTION', on_delete_origin = 'ACTION_ORIGIN_DEFAULT', on_update_origin = 'ACTION_ORIGIN_DEFAULT'", + "constraint_name = 'fk_default' AND column_name = 'a'", + "constraint_id = 1, on_delete = 'RESTRICT', on_update = 'RESTRICT', on_delete_origin = 'ACTION_ORIGIN_EXPLICIT', on_update_origin = 'ACTION_ORIGIN_EXPLICIT'", + "constraint_name = 'fk_restrict' AND column_name = 'a'", + "db_name = 'db''one'", + } { + require.Contains(t, strings.Join(updates, "\n"), expected) + } +} + +func TestLegacyForeignKeyMetadataUpdatesIgnoreStaleHistoricalActions(t *testing.T) { + updates, err := legacyForeignKeyMetadataUpdatesWithHistoricalDefinition(legacyForeignKeyTableDefinition{ + database: "db", + table: "child", + foreignKeys: []legacyForeignKeyCatalogRow{{ + constraintName: "fk_recreated", columnName: "parent_id", referDBName: "db", referTableName: "parent", referColumnName: "id", onDelete: "CASCADE", onUpdate: "SET_NULL", + }}, + }, + "create table child (parent_id int, constraint fk_recreated foreign key (parent_id) references parent (id) on delete cascade on update set null)", + "create table child (parent_id int, constraint fk_recreated foreign key (parent_id) references parent (id) on delete restrict on update restrict)", + ) + require.NoError(t, err) + require.Equal(t, []string{ + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = 1, on_delete = 'CASCADE', on_update = 'SET_NULL', " + + "on_delete_origin = 'ACTION_ORIGIN_EXPLICIT', on_update_origin = 'ACTION_ORIGIN_EXPLICIT' " + + "WHERE constraint_id = 0 AND db_name = 'db' AND table_name = 'child' AND constraint_name = 'fk_recreated' AND column_name = 'parent_id'", + }, updates) +} + +func TestLegacyForeignKeyMetadataUpdatesKeepAlterRestrictAmbiguous(t *testing.T) { + updates, err := legacyForeignKeyMetadataUpdatesWithHistoricalDefinition(legacyForeignKeyTableDefinition{ + database: "db", + table: "child", + foreignKeys: []legacyForeignKeyCatalogRow{{ + constraintName: "fk_added_by_alter", columnName: "parent_id", referDBName: "db", referTableName: "parent", referColumnName: "id", onDelete: "RESTRICT", onUpdate: "RESTRICT", + }}, + }, + "create table child (parent_id int, constraint fk_added_by_alter foreign key (parent_id) references parent (id) on delete restrict on update restrict)", + "create table child (parent_id int)", + ) + require.NoError(t, err) + require.Equal(t, []string{ + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = 1, on_delete = 'RESTRICT', on_update = 'RESTRICT', " + + "on_delete_origin = 'ACTION_ORIGIN_LEGACY_AMBIGUOUS', on_update_origin = 'ACTION_ORIGIN_LEGACY_AMBIGUOUS' " + + "WHERE constraint_id = 0 AND db_name = 'db' AND table_name = 'child' AND constraint_name = 'fk_added_by_alter' AND column_name = 'parent_id'", + }, updates) +} + +func TestLegacyForeignKeyReferencedIndexNameSelectsExactPrimaryKey(t *testing.T) { + var queries []string + txnExecutor := newVersionTxnExecutor(t, func(sql string) (executor.Result, error) { + queries = append(queries, sql) + return newLegacyForeignKeyIndexResult(t, [][]string{ + {"PRIMARY", "PRIMARY", "1", "id"}, + {"uq_parent_id", "UNIQUE", "1", "id"}, + {"uq_parent_compound", "UNIQUE", "1", "id"}, + {"uq_parent_compound", "UNIQUE", "2", "code"}, + }), nil + }) + name, err := getLegacyForeignKeyReferencedIndexName(9, txnExecutor, legacyForeignKeyReferencedKey{ + database: "db", + table: "parent", + columns: []string{"id"}, + }) + require.NoError(t, err) + require.Equal(t, "PRIMARY", name) + require.Len(t, queries, 1) + require.Contains(t, queries[0], "tbl.reldatabase = 'db'") + require.Contains(t, queries[0], "ORDER BY CASE WHEN idx.type = 'PRIMARY' THEN 0 ELSE 1 END") +} + +func TestLegacyForeignKeyReferencedIndexNameUsesOrderedLeadingPrefix(t *testing.T) { + tests := []struct { + name string + indexRows [][]string + foreignCols []string + want string + }{ + { + name: "composite primary prefix", + indexRows: [][]string{ + {"PRIMARY", "PRIMARY", "1", "id"}, + {"PRIMARY", "PRIMARY", "2", "code"}, + }, + foreignCols: []string{"id"}, + want: "PRIMARY", + }, + { + name: "primary wins over exact unique", + indexRows: [][]string{ + {"PRIMARY", "PRIMARY", "1", "id"}, + {"PRIMARY", "PRIMARY", "2", "code"}, + {"uq_id", "UNIQUE", "1", "id"}, + }, + foreignCols: []string{"id"}, + want: "PRIMARY", + }, + { + name: "non prefix is rejected", + indexRows: [][]string{ + {"uq_code_id", "UNIQUE", "1", "code"}, + {"uq_code_id", "UNIQUE", "2", "id"}, + }, + foreignCols: []string{"id"}, + want: "", + }, + { + name: "unique tie is lexical", + indexRows: [][]string{ + {"uq_z", "UNIQUE", "1", "id"}, + {"uq_a", "UNIQUE", "1", "id"}, + }, + foreignCols: []string{"id"}, + want: "uq_a", + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + txnExecutor := newVersionTxnExecutor(t, func(string) (executor.Result, error) { + return newLegacyForeignKeyIndexResult(t, test.indexRows), nil + }) + name, err := getLegacyForeignKeyReferencedIndexName(9, txnExecutor, legacyForeignKeyReferencedKey{ + database: "db", + table: "parent", + columns: test.foreignCols, + }) + require.NoError(t, err) + require.Equal(t, test.want, name) + }) + } +} + +func TestVersionHandleMetadata(t *testing.T) { + meta := Handler.Metadata() + require.Equal(t, "4.0.6", meta.Version) + require.Equal(t, "4.0.5", meta.MinUpgradeVersion) + require.Equal(t, versions.Yes, meta.UpgradeTenant) + require.Equal(t, versions.Yes, meta.UpgradeCluster) + require.Equal(t, uint32(len(tenantUpgEntries)+len(clusterUpgEntries)), meta.VersionOffset) +} + +func TestTenantViewDefinitionChecks(t *testing.T) { + entries := []versions.UpgradeEntry{ + upgradeInformationSchemaKeyColumnUsage(), + upgradeInformationSchemaReferentialConstraints(), + } + + for _, entry := range entries { + t.Run(entry.TableName+"/match", func(t *testing.T) { + stub := gostub.Stub(&versions.CheckViewDefinition, func(_ executor.TxnExecutor, accountID uint32, schema, viewName string) (bool, string, error) { + if accountID != 42 || schema != sysview.InformationDBConst || viewName != entry.TableName { + t.Fatalf("unexpected view check arguments: account=%d schema=%s view=%s", accountID, schema, viewName) + } + return true, entry.UpgSql, nil + }) + defer stub.Reset() + + matched, err := entry.CheckFunc(nil, 42) + if err != nil || !matched { + t.Fatalf("expected matching view definition, matched=%v err=%v", matched, err) + } + }) + + t.Run(entry.TableName+"/mismatch", func(t *testing.T) { + stub := gostub.Stub(&versions.CheckViewDefinition, func(executor.TxnExecutor, uint32, string, string) (bool, string, error) { + return true, "old definition", nil + }) + defer stub.Reset() + + matched, err := entry.CheckFunc(nil, 42) + if err != nil || matched { + t.Fatalf("expected mismatching view definition, matched=%v err=%v", matched, err) + } + }) + } + + stub := gostub.Stub(&versions.CheckViewDefinition, func(executor.TxnExecutor, uint32, string, string) (bool, string, error) { + return false, "", errors.New("check failed") + }) + defer stub.Reset() + matched, err := entries[0].CheckFunc(nil, 42) + if err == nil || matched { + t.Fatalf("expected check error, matched=%v err=%v", matched, err) + } +} + +func TestVersionHandleLifecycleWithNoLegacyDefinitions(t *testing.T) { + runtime.RunTest("", func(runtime.Runtime) { + tableStub := gostub.Stub(&versions.CheckTableDefinition, func(executor.TxnExecutor, uint32, string, string) (bool, error) { + return true, nil + }) + defer tableStub.Reset() + + stub := gostub.Stub(&versions.CheckViewDefinition, func(_ executor.TxnExecutor, _ uint32, _ string, viewName string) (bool, string, error) { + switch viewName { + case "KEY_COLUMN_USAGE": + return true, sysview.InformationSchemaKeyColumnUsageDDL, nil + case "REFERENTIAL_CONSTRAINTS": + return true, sysview.InformationSchemaReferentialConstraintsDDL, nil + case "COLUMNS": + return true, sysview.InformationSchemaColumnsDDL, nil + default: + return false, "", errors.New("unexpected view") + } + }) + defer stub.Reset() + + var executed []string + txnExecutor := newVersionTxnExecutor(t, func(sql string) (executor.Result, error) { + executed = append(executed, sql) + return executor.Result{}, nil + }) + + if err := Handler.Prepare(context.Background(), txnExecutor, true); err != nil { + t.Fatalf("prepare: %v", err) + } + if err := Handler.HandleTenantUpgrade(context.Background(), 9, txnExecutor); err != nil { + t.Fatalf("tenant upgrade: %v", err) + } + if len(executed) == 0 || executed[len(executed)-1] != legacyForeignKeyReferencedIndexDefinitionsSQL { + t.Fatalf("unexpected SQL: %v", executed) + } + if err := Handler.HandleClusterUpgrade(context.Background(), txnExecutor); err != nil { + t.Fatalf("cluster upgrade: %v", err) + } + if err := Handler.HandleCreateFrameworkDeps(txnExecutor); err == nil || !strings.Contains(err.Error(), "Only v1.2.0") { + t.Fatalf("unexpected framework-dependency result: %v", err) + } + }) +} + +func TestVersionHandleTenantUpgradeReturnsLegacyQueryError(t *testing.T) { + want := errors.New("legacy query failed") + txnExecutor := newVersionTxnExecutor(t, func(string) (executor.Result, error) { + return executor.Result{}, want + }) + if err := Handler.HandleTenantUpgrade(context.Background(), 9, txnExecutor); !errors.Is(err, want) { + t.Fatalf("expected legacy query error, got %v", err) + } +} + +func TestLegacyForeignKeyMetadataUpgradeReadsAndUpdatesDefinitions(t *testing.T) { + definitionResult := newLegacyForeignKeyDefinitionResult(t) + var updates []string + txnExecutor := newVersionTxnExecutor(t, func(sql string) (executor.Result, error) { + if sql == legacyForeignKeyTableDefinitionsSQL { + return definitionResult, nil + } + if sql == "SHOW CREATE TABLE `db`.`child`" { + return newShowCreateTableResult(t, "child", "create table child (parent_id int, child_id int, constraint fk_child_parent foreign key (child_id, parent_id) references parent (child_id, parent_id) on delete cascade on update set null)"), nil + } + updates = append(updates, sql) + return executor.Result{}, nil + }) + + if err := upgradeLegacyForeignKeyMetadata(context.Background(), 9, txnExecutor); err != nil { + t.Fatalf("upgrade legacy foreign-key metadata: %v", err) + } + updates = legacyForeignKeyMigrationUpdatesForAssertion(updates) + if len(updates) != 2 { + t.Fatalf("expected two metadata updates, got %d: %v", len(updates), updates) + } + for _, update := range updates { + if !strings.Contains(update, "constraint_id =") || !strings.Contains(update, "constraint_name = 'fk_child_parent'") { + t.Fatalf("unexpected update: %s", update) + } + } +} + +func TestLegacyForeignKeyMetadataUpgradeUsesHistoricalCreateActions(t *testing.T) { + definition := legacyForeignKeyTableDefinition{ + database: "db", + table: "child", + foreignKeys: []legacyForeignKeyCatalogRow{ + {constraintName: "fk_default", columnName: "default_parent_id", referDBName: "db", referTableName: "parent", referColumnName: "id", onDelete: "RESTRICT", onUpdate: "RESTRICT"}, + {constraintName: "fk_restrict", columnName: "restrict_parent_id", referDBName: "db", referTableName: "parent", referColumnName: "id", onDelete: "RESTRICT", onUpdate: "RESTRICT"}, + }, + } + showCreateSQL := "create table child (default_parent_id int, restrict_parent_id int, " + + "constraint fk_default foreign key (default_parent_id) references parent (id) on delete restrict on update restrict, " + + "constraint fk_restrict foreign key (restrict_parent_id) references parent (id) on delete restrict on update restrict)" + historicalCreateSQL := "create table child (default_parent_id int, restrict_parent_id int, " + + "constraint fk_default foreign key (default_parent_id) references parent (id), " + + "constraint fk_restrict foreign key (restrict_parent_id) references parent (id) on delete restrict on update restrict)" + var updates []string + txnExecutor := newVersionTxnExecutor(t, func(sql string) (executor.Result, error) { + switch { + case sql == legacyForeignKeyTableDefinitionsSQL: + return newLegacyForeignKeyDefinitionResultForDefinitions(t, []legacyForeignKeyTableDefinition{definition}), nil + case sql == legacyForeignKeyReferencedIndexDefinitionsSQL: + return executor.Result{}, nil + case sql == "SHOW CREATE TABLE `db`.`child`": + return newShowCreateTableResult(t, "child", showCreateSQL), nil + case strings.HasPrefix(sql, "SELECT rel_createsql FROM mo_catalog.mo_tables"): + return newHistoricalCreateSQLResult(t, historicalCreateSQL), nil + default: + updates = append(updates, sql) + return executor.Result{}, nil + } + }) + + require.NoError(t, upgradeLegacyForeignKeyMetadata(context.Background(), 9, txnExecutor)) + require.Len(t, updates, 2) + require.Contains(t, strings.Join(updates, "\n"), + "constraint_name = 'fk_default' AND column_name = 'default_parent_id'") + require.Contains(t, strings.Join(updates, "\n"), + "on_delete = 'NO_ACTION', on_update = 'NO_ACTION', on_delete_origin = 'ACTION_ORIGIN_DEFAULT', on_update_origin = 'ACTION_ORIGIN_DEFAULT'") + require.Contains(t, strings.Join(updates, "\n"), + "constraint_name = 'fk_restrict' AND column_name = 'restrict_parent_id'") + require.Contains(t, strings.Join(updates, "\n"), + "on_delete = 'RESTRICT', on_update = 'RESTRICT', on_delete_origin = 'ACTION_ORIGIN_EXPLICIT', on_update_origin = 'ACTION_ORIGIN_EXPLICIT'") +} + +func TestLegacyForeignKeyMetadataUpgradeBackfillsReferencedIndexForNumberedLegacyForeignKey(t *testing.T) { + definition := legacyForeignKeyTableDefinition{ + database: "db", + table: "child", + foreignKeys: []legacyForeignKeyCatalogRow{{ + constraintName: "fk_child_parent", columnName: "parent_id", referDBName: "db", referTableName: "parent", referColumnName: "id", onDelete: "RESTRICT", onUpdate: "RESTRICT", + }}, + } + var updates []string + txnExecutor := newVersionTxnExecutor(t, func(sql string) (executor.Result, error) { + switch sql { + case legacyForeignKeyTableDefinitionsSQL: + // constraint_id was assigned by an earlier upgrade; it must not be + // required to backfill the referenced key. + return executor.Result{}, nil + case legacyForeignKeyReferencedIndexDefinitionsSQL: + return newLegacyForeignKeyDefinitionResultForDefinitions(t, []legacyForeignKeyTableDefinition{definition}), nil + case "SHOW CREATE TABLE `db`.`child`": + return newShowCreateTableResult(t, "child", "create table child (parent_id int, constraint fk_child_parent foreign key (parent_id) references parent (id))"), nil + } + if strings.HasPrefix(sql, "SELECT idx.name, idx.type") { + return newLegacyForeignKeyIndexResult(t, [][]string{{"PRIMARY", "PRIMARY", "1", "id"}}), nil + } + updates = append(updates, sql) + return executor.Result{}, nil + }) + + require.NoError(t, upgradeLegacyForeignKeyMetadata(context.Background(), 9, txnExecutor)) + require.Equal(t, []string{ + "UPDATE mo_catalog.mo_foreign_keys SET referenced_index_name = 'PRIMARY' WHERE db_name = 'db' AND table_name = 'child' AND constraint_name = 'fk_child_parent'", + }, updates) +} + +func TestLegacyForeignKeyMetadataUpgradeBackfillsAlterAndUnnamedForeignKeys(t *testing.T) { + definitionResult := newLegacyForeignKeyDefinitionResultForDefinitions(t, []legacyForeignKeyTableDefinition{ + { + database: "db", + table: "alter_child", + foreignKeys: []legacyForeignKeyCatalogRow{ + {constraintName: "fk_added_by_alter", columnName: "a", referDBName: "db", referTableName: "parent", referColumnName: "a", onDelete: "CASCADE", onUpdate: "SET_NULL"}, + {constraintName: "fk_added_by_alter", columnName: "b", referDBName: "db", referTableName: "parent", referColumnName: "b", onDelete: "CASCADE", onUpdate: "SET_NULL"}, + }, + }, + { + database: "db", + table: "unnamed_child", + foreignKeys: []legacyForeignKeyCatalogRow{ + {constraintName: "catalog_generated_name", columnName: "parent_id", referDBName: "db", referTableName: "parent", referColumnName: "id", onDelete: "RESTRICT", onUpdate: "RESTRICT"}, + }, + }, + }) + var updates []string + txnExecutor := newVersionTxnExecutor(t, func(sql string) (executor.Result, error) { + if sql == legacyForeignKeyTableDefinitionsSQL { + return definitionResult, nil + } + switch sql { + case "SHOW CREATE TABLE `db`.`alter_child`": + return newShowCreateTableResult(t, "alter_child", "create table alter_child (a int, b int, constraint fk_added_by_alter foreign key (b, a) references parent (b, a) on delete cascade on update set null)"), nil + case "SHOW CREATE TABLE `db`.`unnamed_child`": + return newShowCreateTableResult(t, "unnamed_child", "create table unnamed_child (parent_id int, constraint catalog_generated_name foreign key (parent_id) references parent (id) on delete restrict on update restrict)"), nil + } + updates = append(updates, sql) + return executor.Result{}, nil + }) + + require.NoError(t, upgradeLegacyForeignKeyMetadata(context.Background(), 9, txnExecutor)) + require.Equal(t, []string{ + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = 1, on_delete = 'CASCADE', on_update = 'SET_NULL' WHERE constraint_id = 0 AND db_name = 'db' AND table_name = 'alter_child' AND constraint_name = 'fk_added_by_alter' AND column_name = 'b'", + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = 2, on_delete = 'CASCADE', on_update = 'SET_NULL' WHERE constraint_id = 0 AND db_name = 'db' AND table_name = 'alter_child' AND constraint_name = 'fk_added_by_alter' AND column_name = 'a'", + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = 1, on_delete = 'RESTRICT', on_update = 'RESTRICT' WHERE constraint_id = 0 AND db_name = 'db' AND table_name = 'unnamed_child' AND constraint_name = 'catalog_generated_name' AND column_name = 'parent_id'", + }, legacyForeignKeyMigrationUpdatesForAssertion(updates)) +} + +func TestLegacyForeignKeyMetadataUpdatesRejectInvalidDefinitions(t *testing.T) { + for _, createSQL := range []string{ + "select 1", + "create table child (a int); create table another_child (a int)", + } { + t.Run(createSQL, func(t *testing.T) { + _, err := legacyForeignKeyMetadataUpdates(legacyForeignKeyTableDefinition{ + database: "db", + table: "child", + }, createSQL) + if err == nil { + t.Fatalf("expected invalid persisted definition to fail: %s", createSQL) + } + }) + } +} + +func TestLegacyForeignKeyMetadataUpdatesBackfillAlterTableForeignKey(t *testing.T) { + updates, err := legacyForeignKeyMetadataUpdates(legacyForeignKeyTableDefinition{ + database: "db", + table: "child", + foreignKeys: []legacyForeignKeyCatalogRow{ + {constraintName: "fk_added_by_alter", columnName: "a", referDBName: "db", referTableName: "parent", referColumnName: "a", onDelete: "CASCADE", onUpdate: "SET_NULL"}, + {constraintName: "fk_added_by_alter", columnName: "b", referDBName: "db", referTableName: "parent", referColumnName: "b", onDelete: "CASCADE", onUpdate: "SET_NULL"}, + }, + }, "create table child (b int, a int, constraint fk_added_by_alter foreign key (b, a) references parent (b, a) on delete cascade on update set null)") + require.NoError(t, err) + require.Equal(t, []string{ + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = 1, on_delete = 'CASCADE', on_update = 'SET_NULL' WHERE constraint_id = 0 AND db_name = 'db' AND table_name = 'child' AND constraint_name = 'fk_added_by_alter' AND column_name = 'b'", + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = 2, on_delete = 'CASCADE', on_update = 'SET_NULL' WHERE constraint_id = 0 AND db_name = 'db' AND table_name = 'child' AND constraint_name = 'fk_added_by_alter' AND column_name = 'a'", + }, legacyForeignKeyMigrationUpdatesForAssertion(updates)) +} + +func TestLegacyForeignKeyMetadataUpdatesPreservesRestrictForAlterFallback(t *testing.T) { + updates, err := legacyForeignKeyMetadataUpdates(legacyForeignKeyTableDefinition{ + database: "db", + table: "child", + foreignKeys: []legacyForeignKeyCatalogRow{ + {constraintName: "fk_added_by_alter", columnName: "parent_id", referDBName: "db", referTableName: "parent", referColumnName: "id", onDelete: "RESTRICT", onUpdate: "RESTRICT"}, + }, + }, "create table child (parent_id int)") + require.NoError(t, err) + require.Equal(t, []string{ + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = 1, on_delete = 'RESTRICT', on_update = 'RESTRICT' WHERE constraint_id = 0 AND db_name = 'db' AND table_name = 'child' AND constraint_name = 'fk_added_by_alter' AND column_name = 'parent_id'", + }, legacyForeignKeyMigrationUpdatesForAssertion(updates)) +} + +func TestLegacyForeignKeyMetadataUpdatesRejectInconsistentCatalogActions(t *testing.T) { + _, err := legacyForeignKeyMetadataUpdates(legacyForeignKeyTableDefinition{ + database: "db", + table: "child", + foreignKeys: []legacyForeignKeyCatalogRow{ + {constraintName: "fk_child_parent", columnName: "a", referDBName: "db", referTableName: "parent", referColumnName: "a", onDelete: "CASCADE", onUpdate: "CASCADE"}, + {constraintName: "fk_child_parent", columnName: "b", referDBName: "db", referTableName: "parent", referColumnName: "b", onDelete: "SET_NULL", onUpdate: "CASCADE"}, + }, + }, "create table child (a int, b int, constraint fk_child_parent foreign key (a, b) references parent (a, b))") + require.ErrorContains(t, err, "inconsistent catalog actions") +} + +func TestLegacyForeignKeyMetadataUpdatesDoNotMatchReusedConstraintName(t *testing.T) { + updates, err := legacyForeignKeyMetadataUpdates(legacyForeignKeyTableDefinition{ + database: "db", + table: "child", + foreignKeys: []legacyForeignKeyCatalogRow{ + {constraintName: "fk_reused", columnName: "b", referDBName: "db", referTableName: "parent", referColumnName: "b", onDelete: "CASCADE", onUpdate: "SET_NULL"}, + }, + }, "create table child (a int, b int, constraint fk_reused foreign key (a) references parent (a))") + require.NoError(t, err) + require.Equal(t, []string{ + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = 1, on_delete = 'CASCADE', on_update = 'SET_NULL' WHERE constraint_id = 0 AND db_name = 'db' AND table_name = 'child' AND constraint_name = 'fk_reused' AND column_name = 'b'", + }, legacyForeignKeyMigrationUpdatesForAssertion(updates)) +} + +func TestLegacyForeignKeyMetadataUpdatesEscapeCatalogIdentifiers(t *testing.T) { + updates, err := legacyForeignKeyMetadataUpdates(legacyForeignKeyTableDefinition{ + database: `db\name`, + table: `child\name`, + foreignKeys: []legacyForeignKeyCatalogRow{ + { + constraintName: `fk\' OR 1=1 -- `, + columnName: `child\column`, + referDBName: `db\name`, + referTableName: `parent\name`, + referColumnName: `id\column`, + onDelete: "CASCADE", + onUpdate: "SET_NULL", + }, + }, + }, "create table `child\\name` (`child\\column` int, constraint `fk\\' OR 1=1 -- ` foreign key (`child\\column`) references `parent\\name` (`id\\column`))") + require.NoError(t, err) + require.Equal(t, []string{ + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = 1, on_delete = 'CASCADE', on_update = 'SET_NULL' " + + "WHERE constraint_id = 0 AND db_name = 'db\\\\name' AND table_name = 'child\\\\name' " + + "AND constraint_name = 'fk\\\\'' OR 1=1 -- ' AND column_name = 'child\\\\column'", + }, legacyForeignKeyMigrationUpdatesForAssertion(updates)) +} + +func TestLegacyForeignKeyMetadataUpdatesEscapeTrailingBackslashIdentifiers(t *testing.T) { + updates, err := legacyForeignKeyMetadataUpdates(legacyForeignKeyTableDefinition{ + database: "db\\", + table: "child\\", + foreignKeys: []legacyForeignKeyCatalogRow{ + { + constraintName: "fk\\", + columnName: "child\\", + referDBName: "db\\", + referTableName: "parent\\", + referColumnName: "id\\", + onDelete: "CASCADE", + onUpdate: "SET_NULL", + }, + }, + }, "create table `child\\` (`child\\` int, constraint `fk\\` foreign key (`child\\`) references `parent\\` (`id\\`))") + require.NoError(t, err) + require.Equal(t, []string{ + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = 1, on_delete = 'CASCADE', on_update = 'SET_NULL' " + + "WHERE constraint_id = 0 AND db_name = 'db\\\\' AND table_name = 'child\\\\' " + + "AND constraint_name = 'fk\\\\' AND column_name = 'child\\\\'", + }, legacyForeignKeyMigrationUpdatesForAssertion(updates)) +} + +func TestLegacyForeignKeyMetadataUpdatesRejectUnmatchedCompositeForeignKey(t *testing.T) { + _, err := legacyForeignKeyMetadataUpdates(legacyForeignKeyTableDefinition{ + database: "db", + table: "child", + foreignKeys: []legacyForeignKeyCatalogRow{ + {constraintName: "fk_legacy", columnName: "a", referDBName: "db", referTableName: "parent", referColumnName: "a", onDelete: "CASCADE", onUpdate: "SET_NULL"}, + {constraintName: "fk_legacy", columnName: "z", referDBName: "db", referTableName: "parent", referColumnName: "z", onDelete: "CASCADE", onUpdate: "SET_NULL"}, + }, + }, "create table child (a int, z int, constraint fk_legacy foreign key (a, z) references parent (z, a))") + require.ErrorContains(t, err, "cannot reconcile column order") +} + +func TestLegacyForeignKeyMetadataUpdatesBackfillUnnamedForeignKey(t *testing.T) { + updates, err := legacyForeignKeyMetadataUpdates(legacyForeignKeyTableDefinition{ + database: "db", + table: "child", + foreignKeys: []legacyForeignKeyCatalogRow{ + {constraintName: "catalog-generated-name", columnName: "parent_id", referDBName: "", referTableName: "parent", referColumnName: "id", onDelete: "RESTRICT", onUpdate: "RESTRICT"}, + }, + }, "create table child (parent_id int, foreign key (parent_id) references parent (id))") + require.NoError(t, err) + require.Equal(t, []string{ + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = 1, on_delete = 'RESTRICT', on_update = 'RESTRICT' WHERE constraint_id = 0 AND db_name = 'db' AND table_name = 'child' AND constraint_name = 'catalog-generated-name' AND column_name = 'parent_id'", + }, legacyForeignKeyMigrationUpdatesForAssertion(updates)) +} + +func TestLegacyForeignKeyMetadataUpdatesLeaveAmbiguousUnnamedForeignKeysToCatalog(t *testing.T) { + updates, err := legacyForeignKeyMetadataUpdates(legacyForeignKeyTableDefinition{ + database: "db", + table: "child", + foreignKeys: []legacyForeignKeyCatalogRow{ + {constraintName: "catalog-fk-a", columnName: "parent_id", referDBName: "db", referTableName: "parent", referColumnName: "id", onDelete: "CASCADE", onUpdate: "CASCADE"}, + {constraintName: "catalog-fk-b", columnName: "parent_id", referDBName: "db", referTableName: "parent", referColumnName: "id", onDelete: "RESTRICT", onUpdate: "RESTRICT"}, + }, + }, "create table child (parent_id int, foreign key (parent_id) references parent (id))") + require.NoError(t, err) + require.Equal(t, []string{ + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = 1, on_delete = 'CASCADE', on_update = 'CASCADE' WHERE constraint_id = 0 AND db_name = 'db' AND table_name = 'child' AND constraint_name = 'catalog-fk-a' AND column_name = 'parent_id'", + "UPDATE mo_catalog.mo_foreign_keys SET constraint_id = 1, on_delete = 'RESTRICT', on_update = 'RESTRICT' WHERE constraint_id = 0 AND db_name = 'db' AND table_name = 'child' AND constraint_name = 'catalog-fk-b' AND column_name = 'parent_id'", + }, legacyForeignKeyMigrationUpdatesForAssertion(updates)) +} + +func TestLegacyForeignKeyMetadataUpdatesRejectAmbiguousUnnamedCompositeForeignKeys(t *testing.T) { + _, err := legacyForeignKeyMetadataUpdates(legacyForeignKeyTableDefinition{ + database: "db", + table: "child", + foreignKeys: []legacyForeignKeyCatalogRow{ + {constraintName: "catalog-fk-a", columnName: "a", referDBName: "db", referTableName: "parent", referColumnName: "a", onDelete: "CASCADE", onUpdate: "CASCADE"}, + {constraintName: "catalog-fk-a", columnName: "z", referDBName: "db", referTableName: "parent", referColumnName: "z", onDelete: "CASCADE", onUpdate: "CASCADE"}, + {constraintName: "catalog-fk-b", columnName: "a", referDBName: "db", referTableName: "parent", referColumnName: "a", onDelete: "CASCADE", onUpdate: "CASCADE"}, + {constraintName: "catalog-fk-b", columnName: "z", referDBName: "db", referTableName: "parent", referColumnName: "z", onDelete: "CASCADE", onUpdate: "CASCADE"}, + }, + }, "create table child (a int, z int, foreign key (z, a) references parent (z, a))") + require.ErrorContains(t, err, "cannot reconcile column order") +} + +func TestLegacyForeignKeyShowCreateSQLQuotesIdentifiers(t *testing.T) { + definition := legacyForeignKeyTableDefinition{database: "db`name", table: "child`name"} + txnExecutor := newVersionTxnExecutor(t, func(sql string) (executor.Result, error) { + require.Equal(t, "SHOW CREATE TABLE `db``name`.`child``name`", sql) + return newShowCreateTableResult(t, "child`name", "create table `child``name` (id int)"), nil + }) + createSQL, err := getLegacyForeignKeyShowCreateSQL(9, txnExecutor, definition) + require.NoError(t, err) + require.Equal(t, "create table `child``name` (id int)", createSQL) +} + +func TestLegacyForeignKeyHistoricalCreateSQLQuotesCatalogValues(t *testing.T) { + definition := legacyForeignKeyTableDefinition{database: "db'name", table: `child\name`} + txnExecutor := newVersionTxnExecutor(t, func(sql string) (executor.Result, error) { + require.Equal(t, + "SELECT rel_createsql FROM mo_catalog.mo_tables WHERE account_id = 9 AND reldatabase = 'db''name' AND relname = 'child\\\\name'", + sql, + ) + return newHistoricalCreateSQLResult(t, "create table `child\\name` (id int)"), nil + }) + createSQL, err := getLegacyForeignKeyHistoricalCreateSQL(9, txnExecutor, definition) + require.NoError(t, err) + require.Equal(t, "create table `child\\name` (id int)", createSQL) +} + +func newVersionTxnExecutor(t *testing.T, mocker func(string) (executor.Result, error)) executor.TxnExecutor { + t.Helper() + txnOperator := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + txnOperator.EXPECT().TxnOptions().Return(txn.TxnOptions{}).AnyTimes() + return executor.NewMemTxnExecutor(mocker, txnOperator) +} + +func newLegacyForeignKeyDefinitionResult(t *testing.T) executor.Result { + return newLegacyForeignKeyDefinitionResultForDefinitions(t, []legacyForeignKeyTableDefinition{ + { + database: "db", + table: "child", + foreignKeys: []legacyForeignKeyCatalogRow{ + {constraintName: "fk_child_parent", columnName: "child_id", referDBName: "db", referTableName: "parent", referColumnName: "child_id", onDelete: "CASCADE", onUpdate: "SET_NULL"}, + {constraintName: "fk_child_parent", columnName: "parent_id", referDBName: "db", referTableName: "parent", referColumnName: "parent_id", onDelete: "CASCADE", onUpdate: "SET_NULL"}, + }, + }, + }) +} + +func newLegacyForeignKeyDefinitionResultForDefinitions(t *testing.T, definitions []legacyForeignKeyTableDefinition) executor.Result { + t.Helper() + rows := make([]legacyForeignKeyTableDefinition, 0) + for _, definition := range definitions { + for _, foreignKey := range definition.foreignKeys { + rows = append(rows, legacyForeignKeyTableDefinition{ + database: definition.database, + table: definition.table, + foreignKeys: []legacyForeignKeyCatalogRow{foreignKey}, + }) + } + } + mp := mpool.MustNewZeroNoFixed() + t.Cleanup(func() { mpool.DeleteMPool(mp) }) + result := executor.NewMemResult([]types.Type{ + types.T_varchar.ToType(), + types.T_varchar.ToType(), + types.T_varchar.ToType(), + types.T_varchar.ToType(), + types.T_varchar.ToType(), + types.T_varchar.ToType(), + types.T_varchar.ToType(), + types.T_varchar.ToType(), + types.T_varchar.ToType(), + }, mp) + result.NewBatchWithRowCount(len(rows)) + values := make([][]string, 9) + for _, row := range rows { + foreignKey := row.foreignKeys[0] + values[0] = append(values[0], row.database) + values[1] = append(values[1], row.table) + values[2] = append(values[2], foreignKey.constraintName) + values[3] = append(values[3], foreignKey.columnName) + values[4] = append(values[4], foreignKey.referDBName) + values[5] = append(values[5], foreignKey.referTableName) + values[6] = append(values[6], foreignKey.referColumnName) + values[7] = append(values[7], foreignKey.onDelete) + values[8] = append(values[8], foreignKey.onUpdate) + } + for column, values := range values { + if err := executor.AppendStringRows(result, column, values); err != nil { + t.Fatalf("append legacy definition column %d: %v", column, err) + } + } + return result.GetResult() +} + +func newShowCreateTableResult(t *testing.T, tableName, createSQL string) executor.Result { + t.Helper() + mp := mpool.MustNewZeroNoFixed() + t.Cleanup(func() { mpool.DeleteMPool(mp) }) + result := executor.NewMemResult([]types.Type{ + types.T_varchar.ToType(), + types.T_varchar.ToType(), + }, mp) + result.NewBatchWithRowCount(1) + for column, value := range []string{tableName, createSQL} { + if err := executor.AppendStringRows(result, column, []string{value}); err != nil { + t.Fatalf("append SHOW CREATE TABLE column %d: %v", column, err) + } + } + return result.GetResult() +} + +func newHistoricalCreateSQLResult(t *testing.T, createSQL string) executor.Result { + t.Helper() + mp := mpool.MustNewZeroNoFixed() + t.Cleanup(func() { mpool.DeleteMPool(mp) }) + result := executor.NewMemResult([]types.Type{types.T_varchar.ToType()}, mp) + result.NewBatchWithRowCount(1) + if err := executor.AppendStringRows(result, 0, []string{createSQL}); err != nil { + t.Fatalf("append historical CREATE definition: %v", err) + } + return result.GetResult() +} + +func newLegacyForeignKeyIndexResult(t *testing.T, rows [][]string) executor.Result { + t.Helper() + mp := mpool.MustNewZeroNoFixed() + t.Cleanup(func() { mpool.DeleteMPool(mp) }) + result := executor.NewMemResult([]types.Type{ + types.T_varchar.ToType(), + types.T_varchar.ToType(), + types.T_varchar.ToType(), + types.T_varchar.ToType(), + }, mp) + result.NewBatchWithRowCount(len(rows)) + for column := 0; column < 4; column++ { + values := make([]string, len(rows)) + for row := range rows { + values[row] = rows[row][column] + } + if err := executor.AppendStringRows(result, column, values); err != nil { + t.Fatalf("append legacy index column %d: %v", column, err) + } + } + return result.GetResult() +} + +func legacyForeignKeyMigrationUpdatesForAssertion(updates []string) []string { + ret := make([]string, 0, len(updates)) + for _, update := range updates { + if strings.HasPrefix(update, "SELECT ") { + continue + } + if originStart := strings.Index(update, ", on_delete_origin = '"); originStart >= 0 { + if whereStart := strings.Index(update[originStart:], " WHERE constraint_id"); whereStart >= 0 { + update = update[:originStart] + update[originStart+whereStart:] + } + } + ret = append(ret, update) + } + return ret +} + func TestPopulateInformationSchemaCharacterSetsIsIdempotent(t *testing.T) { entry := populateInformationSchemaCharacterSets() populated := false diff --git a/pkg/frontend/predefined.go b/pkg/frontend/predefined.go index 31a91c616ce82..1cf25e7c8552f 100644 --- a/pkg/frontend/predefined.go +++ b/pkg/frontend/predefined.go @@ -478,6 +478,9 @@ var ( refer_column_id BIGINT UNSIGNED not null default 0, on_delete varchar(128) not null, on_update varchar(128) not null, + referenced_index_name varchar(5000) not null default '', + on_delete_origin varchar(64) not null default 'ACTION_ORIGIN_EXPLICIT', + on_update_origin varchar(64) not null default 'ACTION_ORIGIN_EXPLICIT', primary key( constraint_name, diff --git a/pkg/pb/plan/plan.pb.go b/pkg/pb/plan/plan.pb.go index 35693ef0c162e..98888114b6bc5 100644 --- a/pkg/pb/plan/plan.pb.go +++ b/pkg/pb/plan/plan.pb.go @@ -542,6 +542,38 @@ func (ForeignKeyDef_RefAction) EnumDescriptor() ([]byte, []int) { return fileDescriptor_2d655ab2f7683c23, []int{30, 0} } +// Whether a reference action was written in the FK declaration. This is +// persisted separately from RefAction because an omitted action and an +// explicit RESTRICT have the same execution behavior but distinct MySQL +// metadata/SHOW CREATE representations. +type ForeignKeyDef_RefActionOrigin int32 + +const ( + ForeignKeyDef_ACTION_ORIGIN_EXPLICIT ForeignKeyDef_RefActionOrigin = 0 + ForeignKeyDef_ACTION_ORIGIN_DEFAULT ForeignKeyDef_RefActionOrigin = 1 + ForeignKeyDef_ACTION_ORIGIN_LEGACY_AMBIGUOUS ForeignKeyDef_RefActionOrigin = 2 +) + +var ForeignKeyDef_RefActionOrigin_name = map[int32]string{ + 0: "ACTION_ORIGIN_EXPLICIT", + 1: "ACTION_ORIGIN_DEFAULT", + 2: "ACTION_ORIGIN_LEGACY_AMBIGUOUS", +} + +var ForeignKeyDef_RefActionOrigin_value = map[string]int32{ + "ACTION_ORIGIN_EXPLICIT": 0, + "ACTION_ORIGIN_DEFAULT": 1, + "ACTION_ORIGIN_LEGACY_AMBIGUOUS": 2, +} + +func (x ForeignKeyDef_RefActionOrigin) String() string { + return proto.EnumName(ForeignKeyDef_RefActionOrigin_name, int32(x)) +} + +func (ForeignKeyDef_RefActionOrigin) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_2d655ab2f7683c23, []int{30, 1} +} + type OrderBySpec_OrderByFlag int32 const ( @@ -4155,12 +4187,16 @@ type ForeignKeyDef struct { // Foreign key parent table Id ForeignTbl uint64 `protobuf:"varint,3,opt,name=foreign_tbl,json=foreignTbl,proto3" json:"foreign_tbl,omitempty"` // Foreign key parent table dependent column colids - ForeignCols []uint64 `protobuf:"varint,4,rep,packed,name=foreign_cols,json=foreignCols,proto3" json:"foreign_cols,omitempty"` - OnDelete ForeignKeyDef_RefAction `protobuf:"varint,5,opt,name=on_delete,json=onDelete,proto3,enum=plan.ForeignKeyDef_RefAction" json:"on_delete,omitempty"` - OnUpdate ForeignKeyDef_RefAction `protobuf:"varint,6,opt,name=on_update,json=onUpdate,proto3,enum=plan.ForeignKeyDef_RefAction" json:"on_update,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + ForeignCols []uint64 `protobuf:"varint,4,rep,packed,name=foreign_cols,json=foreignCols,proto3" json:"foreign_cols,omitempty"` + OnDelete ForeignKeyDef_RefAction `protobuf:"varint,5,opt,name=on_delete,json=onDelete,proto3,enum=plan.ForeignKeyDef_RefAction" json:"on_delete,omitempty"` + OnUpdate ForeignKeyDef_RefAction `protobuf:"varint,6,opt,name=on_update,json=onUpdate,proto3,enum=plan.ForeignKeyDef_RefAction" json:"on_update,omitempty"` + // Exact PRIMARY/UNIQUE parent key selected when this FK was bound. + ReferencedIndexName string `protobuf:"bytes,7,opt,name=referenced_index_name,json=referencedIndexName,proto3" json:"referenced_index_name,omitempty"` + OnDeleteOrigin ForeignKeyDef_RefActionOrigin `protobuf:"varint,8,opt,name=on_delete_origin,json=onDeleteOrigin,proto3,enum=plan.ForeignKeyDef_RefActionOrigin" json:"on_delete_origin,omitempty"` + OnUpdateOrigin ForeignKeyDef_RefActionOrigin `protobuf:"varint,9,opt,name=on_update_origin,json=onUpdateOrigin,proto3,enum=plan.ForeignKeyDef_RefActionOrigin" json:"on_update_origin,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ForeignKeyDef) Reset() { *m = ForeignKeyDef{} } @@ -4238,6 +4274,27 @@ func (m *ForeignKeyDef) GetOnUpdate() ForeignKeyDef_RefAction { return ForeignKeyDef_RESTRICT } +func (m *ForeignKeyDef) GetReferencedIndexName() string { + if m != nil { + return m.ReferencedIndexName + } + return "" +} + +func (m *ForeignKeyDef) GetOnDeleteOrigin() ForeignKeyDef_RefActionOrigin { + if m != nil { + return m.OnDeleteOrigin + } + return ForeignKeyDef_ACTION_ORIGIN_EXPLICIT +} + +func (m *ForeignKeyDef) GetOnUpdateOrigin() ForeignKeyDef_RefActionOrigin { + if m != nil { + return m.OnUpdateOrigin + } + return ForeignKeyDef_ACTION_ORIGIN_EXPLICIT +} + type CheckDef struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Name for anonymous constraints, __mo_chk_[INDEX_ID] @@ -14525,6 +14582,7 @@ func init() { proto.RegisterEnum("plan.SubqueryRef_Type", SubqueryRef_Type_name, SubqueryRef_Type_value) proto.RegisterEnum("plan.Function_FuncFlag", Function_FuncFlag_name, Function_FuncFlag_value) proto.RegisterEnum("plan.ForeignKeyDef_RefAction", ForeignKeyDef_RefAction_name, ForeignKeyDef_RefAction_value) + proto.RegisterEnum("plan.ForeignKeyDef_RefActionOrigin", ForeignKeyDef_RefActionOrigin_name, ForeignKeyDef_RefActionOrigin_value) proto.RegisterEnum("plan.OrderBySpec_OrderByFlag", OrderBySpec_OrderByFlag_name, OrderBySpec_OrderByFlag_value) proto.RegisterEnum("plan.FrameClause_FrameType", FrameClause_FrameType_name, FrameClause_FrameType_value) proto.RegisterEnum("plan.FrameBound_BoundType", FrameBound_BoundType_name, FrameBound_BoundType_value) @@ -14700,925 +14758,932 @@ func init() { func init() { proto.RegisterFile("plan.proto", fileDescriptor_2d655ab2f7683c23) } var fileDescriptor_2d655ab2f7683c23 = []byte{ - // 14678 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x6d, 0x8c, 0x1b, 0xd9, - 0xb6, 0x28, 0xd4, 0x6e, 0xdb, 0x6d, 0x7b, 0xf9, 0xa3, 0xab, 0x77, 0x3a, 0x89, 0x93, 0xc9, 0x24, - 0x9d, 0x4a, 0x26, 0x93, 0xc9, 0xcc, 0x64, 0x66, 0x92, 0xf9, 0xc8, 0x9c, 0x7b, 0xee, 0x9b, 0xe3, - 0xb6, 0xdd, 0xdd, 0x9e, 0xb8, 0xed, 0x3e, 0x65, 0x77, 0x32, 0x73, 0x1e, 0x57, 0xa5, 0x6a, 0x57, - 0xd9, 0x5d, 0xd3, 0xe5, 0x2a, 0x4f, 0x55, 0x39, 0xdd, 0x7d, 0xa4, 0x27, 0x8e, 0xf8, 0x71, 0x1f, - 0x0f, 0xf8, 0x81, 0x84, 0x80, 0x5f, 0x48, 0x17, 0x24, 0x84, 0x84, 0x40, 0x08, 0x74, 0xc5, 0x05, - 0x21, 0x01, 0x57, 0xfc, 0x79, 0xe8, 0x01, 0x02, 0x9e, 0x00, 0x01, 0xd2, 0x03, 0x2e, 0xfc, 0xe4, - 0x09, 0x24, 0x90, 0x90, 0xf8, 0x03, 0x5a, 0x6b, 0xef, 0x5d, 0x1f, 0xb6, 0x33, 0x99, 0x99, 0x73, - 0xae, 0xf4, 0xfe, 0x74, 0x7b, 0xaf, 0xb5, 0xf6, 0xf7, 0xda, 0x6b, 0xaf, 0xbd, 0xf6, 0xda, 0xab, - 0x00, 0x66, 0x8e, 0xe1, 0x3e, 0x9e, 0xf9, 0x5e, 0xe8, 0xb1, 0x1c, 0xfe, 0xbe, 0xf9, 0xe1, 0xc4, - 0x0e, 0x4f, 0xe7, 0x27, 0x8f, 0x47, 0xde, 0xf4, 0xa3, 0x89, 0x37, 0xf1, 0x3e, 0x22, 0xe4, 0xc9, - 0x7c, 0x4c, 0x29, 0x4a, 0xd0, 0x2f, 0x9e, 0xe9, 0x26, 0x38, 0xde, 0xe8, 0x4c, 0xfc, 0xde, 0x0c, - 0xed, 0xa9, 0x15, 0x84, 0xc6, 0x74, 0xc6, 0x01, 0xea, 0x5f, 0x64, 0x20, 0x37, 0xbc, 0x9c, 0x59, - 0xac, 0x06, 0xeb, 0xb6, 0x59, 0xcf, 0xec, 0x64, 0x1e, 0xe6, 0xb5, 0x75, 0xdb, 0x64, 0x3b, 0x50, - 0x76, 0xbd, 0xb0, 0x37, 0x77, 0x1c, 0xe3, 0xc4, 0xb1, 0xea, 0xeb, 0x3b, 0x99, 0x87, 0x45, 0x2d, - 0x09, 0x62, 0x6f, 0x41, 0xc9, 0x98, 0x87, 0x9e, 0x6e, 0xbb, 0x23, 0xbf, 0x9e, 0x25, 0x7c, 0x11, - 0x01, 0x1d, 0x77, 0xe4, 0xb3, 0x6d, 0xc8, 0x9f, 0xdb, 0x66, 0x78, 0x5a, 0xcf, 0x51, 0x89, 0x3c, - 0x81, 0xd0, 0x60, 0x64, 0x38, 0x56, 0x3d, 0xcf, 0xa1, 0x94, 0x40, 0x68, 0x48, 0x95, 0x6c, 0xec, - 0x64, 0x1e, 0x96, 0x34, 0x9e, 0x60, 0xb7, 0x01, 0x2c, 0x77, 0x3e, 0x7d, 0x65, 0x38, 0x73, 0x2b, - 0xa8, 0x17, 0x08, 0x95, 0x80, 0xa8, 0x5f, 0x41, 0x69, 0x1a, 0x4c, 0x0e, 0x2c, 0xc3, 0xb4, 0x7c, - 0x76, 0x1d, 0x0a, 0xd3, 0x60, 0xa2, 0x87, 0xc6, 0x44, 0x74, 0x61, 0x63, 0x1a, 0x4c, 0x86, 0xc6, - 0x84, 0xdd, 0x80, 0x22, 0x21, 0x2e, 0x67, 0xbc, 0x0f, 0x79, 0x0d, 0x09, 0xb1, 0xc7, 0xea, 0xdf, - 0xd9, 0x80, 0x42, 0xd7, 0x0e, 0x2d, 0xdf, 0x70, 0xd8, 0x35, 0xd8, 0xb0, 0x03, 0x77, 0xee, 0x38, - 0x94, 0xbd, 0xa8, 0x89, 0x14, 0xbb, 0x06, 0x79, 0xfb, 0xd9, 0x2b, 0xc3, 0xe1, 0x79, 0x0f, 0xd6, - 0x34, 0x9e, 0x64, 0x75, 0xd8, 0xb0, 0x3f, 0xf9, 0x1c, 0x11, 0x59, 0x81, 0x10, 0x69, 0xc2, 0x3c, - 0x7d, 0x82, 0x98, 0x5c, 0x84, 0xa1, 0x34, 0x61, 0x3e, 0xff, 0x14, 0x31, 0xd8, 0xfb, 0x2c, 0x61, - 0x28, 0x8d, 0xb5, 0xcc, 0xa9, 0x16, 0x1c, 0x80, 0x2a, 0xd6, 0x32, 0x97, 0xb5, 0xcc, 0x79, 0x2d, - 0x05, 0x81, 0x10, 0x69, 0xc2, 0xf0, 0x5a, 0x8a, 0x11, 0x26, 0xaa, 0x65, 0xce, 0x6b, 0x29, 0xed, - 0x64, 0x1e, 0xe6, 0x08, 0xc3, 0x6b, 0xd9, 0x86, 0x9c, 0x89, 0x70, 0xd8, 0xc9, 0x3c, 0xcc, 0x1c, - 0xac, 0x69, 0x94, 0x42, 0x68, 0x80, 0xd0, 0x32, 0x0e, 0x30, 0x42, 0x03, 0x01, 0x3d, 0x41, 0x68, - 0x05, 0x47, 0x03, 0xa1, 0x27, 0x02, 0x3a, 0x46, 0x68, 0x75, 0x27, 0xf3, 0x70, 0x1d, 0xa1, 0x98, - 0x62, 0x37, 0xa1, 0x60, 0x1a, 0xa1, 0x85, 0x88, 0x9a, 0xe8, 0xb2, 0x04, 0x20, 0x0e, 0x39, 0x0e, - 0x71, 0x9b, 0xa2, 0xd3, 0x12, 0xc0, 0x54, 0x28, 0x23, 0x99, 0xc4, 0x2b, 0x02, 0x9f, 0x04, 0xb2, - 0xcf, 0xa0, 0x62, 0x5a, 0x23, 0x7b, 0x6a, 0x38, 0xbc, 0x4f, 0x5b, 0x3b, 0x99, 0x87, 0xe5, 0x27, - 0x9b, 0x8f, 0x69, 0x4d, 0x44, 0x98, 0x83, 0x35, 0x2d, 0x45, 0xc6, 0x9e, 0x41, 0x55, 0xa4, 0x3f, - 0x79, 0x42, 0x03, 0xcb, 0x28, 0x9f, 0x92, 0xca, 0xf7, 0xc9, 0x93, 0x67, 0x07, 0x6b, 0x5a, 0x9a, - 0x90, 0xdd, 0x87, 0x4a, 0xb4, 0x44, 0x30, 0xe3, 0x15, 0xd1, 0xaa, 0x14, 0x14, 0xbb, 0xf5, 0x5d, - 0xe0, 0xb9, 0x48, 0xb0, 0x2d, 0xc6, 0x4d, 0x02, 0xd8, 0x0e, 0x80, 0x69, 0x8d, 0x8d, 0xb9, 0x13, - 0x22, 0xfa, 0xaa, 0x18, 0xc0, 0x04, 0x8c, 0xdd, 0x86, 0xd2, 0x7c, 0x86, 0xbd, 0x7c, 0x61, 0x38, - 0xf5, 0x6b, 0x82, 0x20, 0x06, 0x61, 0xe9, 0xc8, 0xe7, 0x88, 0xbd, 0x2e, 0x66, 0x57, 0x02, 0x70, - 0x7a, 0x5f, 0x59, 0x23, 0x44, 0xd5, 0x45, 0xc5, 0x22, 0x8d, 0xab, 0xc8, 0x0e, 0x76, 0x6d, 0xb7, - 0x7e, 0x83, 0x38, 0x98, 0x27, 0xd8, 0x2d, 0xc8, 0x06, 0xfe, 0xa8, 0x7e, 0x93, 0xfa, 0x0f, 0xbc, - 0xff, 0xed, 0x8b, 0x99, 0xaf, 0x21, 0x78, 0xb7, 0x00, 0x79, 0x5a, 0x4d, 0xea, 0x2d, 0x28, 0x1e, - 0x19, 0xbe, 0x31, 0xd5, 0xac, 0x31, 0x53, 0x20, 0x3b, 0xf3, 0x02, 0xb1, 0x8e, 0xf0, 0xa7, 0xda, - 0x85, 0x8d, 0x17, 0x86, 0x8f, 0x38, 0x06, 0x39, 0xd7, 0x98, 0x5a, 0x84, 0x2c, 0x69, 0xf4, 0x1b, - 0xd7, 0x4e, 0x70, 0x19, 0x84, 0xd6, 0x54, 0x08, 0x09, 0x91, 0x42, 0xf8, 0xc4, 0xf1, 0x4e, 0xc4, - 0x1a, 0x29, 0x6a, 0x22, 0xa5, 0xfe, 0x13, 0x19, 0xd8, 0x68, 0x7a, 0x0e, 0x16, 0x77, 0x1d, 0x0a, - 0xbe, 0xe5, 0xe8, 0x71, 0x75, 0x1b, 0xbe, 0xe5, 0x1c, 0x79, 0x01, 0x22, 0x46, 0x1e, 0x47, 0xf0, - 0x55, 0xbb, 0x31, 0xf2, 0x08, 0x21, 0x1b, 0x90, 0x4d, 0x34, 0xe0, 0x06, 0x14, 0xc3, 0x13, 0x47, - 0x27, 0x78, 0x8e, 0xe0, 0x85, 0xf0, 0xc4, 0xe9, 0x21, 0xea, 0x3a, 0x14, 0xcc, 0x13, 0x8e, 0xc9, - 0x13, 0x66, 0xc3, 0x3c, 0x41, 0x84, 0xfa, 0x25, 0x94, 0x34, 0xe3, 0x5c, 0x34, 0xe3, 0x2a, 0x6c, - 0x60, 0x01, 0x42, 0xfe, 0xe5, 0xb4, 0x7c, 0x78, 0xe2, 0x74, 0x4c, 0x04, 0x63, 0x23, 0x6c, 0x93, - 0xda, 0x90, 0xd3, 0xf2, 0x23, 0xcf, 0xe9, 0x98, 0xea, 0x10, 0xa0, 0xe9, 0xf9, 0xfe, 0xcf, 0xee, - 0xc2, 0x36, 0xe4, 0x4d, 0x6b, 0x16, 0x9e, 0x72, 0xd1, 0xa1, 0xf1, 0x84, 0xfa, 0x08, 0x8a, 0x38, - 0x2f, 0x5d, 0x3b, 0x08, 0xd9, 0x6d, 0xc8, 0x39, 0x76, 0x10, 0xd6, 0x33, 0x3b, 0xd9, 0x85, 0x59, - 0x23, 0xb8, 0xba, 0x03, 0xc5, 0x43, 0xe3, 0xe2, 0x05, 0xce, 0x1c, 0x96, 0x46, 0x53, 0x28, 0xa6, - 0x44, 0xcc, 0x67, 0x05, 0x60, 0x68, 0xf8, 0x13, 0x2b, 0x24, 0x49, 0xf7, 0x7f, 0x65, 0xa0, 0x3c, - 0x98, 0x9f, 0x7c, 0x3f, 0xb7, 0xfc, 0x4b, 0x6c, 0xf3, 0x43, 0xc8, 0x86, 0x97, 0x33, 0xca, 0x51, - 0x7b, 0x72, 0x8d, 0x17, 0x9f, 0xc0, 0x3f, 0xc6, 0x4c, 0x1a, 0x92, 0x60, 0x27, 0x5c, 0xcf, 0xb4, - 0xe4, 0x18, 0xe4, 0xb5, 0x0d, 0x4c, 0x76, 0x4c, 0xdc, 0x2e, 0xbc, 0x99, 0x98, 0x85, 0x75, 0x6f, - 0xc6, 0x76, 0x20, 0x3f, 0x3a, 0xb5, 0x1d, 0x93, 0x26, 0x20, 0xdd, 0x66, 0x8e, 0xc0, 0x59, 0xf2, - 0xbd, 0x73, 0x3d, 0xb0, 0x7f, 0x2b, 0xc5, 0x7f, 0xc1, 0xf7, 0xce, 0x07, 0xf6, 0x6f, 0x2d, 0x75, - 0x28, 0xf6, 0x20, 0x80, 0x8d, 0x41, 0xb3, 0xd1, 0x6d, 0x68, 0xca, 0x1a, 0xfe, 0x6e, 0x7f, 0xd3, - 0x19, 0x0c, 0x07, 0x4a, 0x86, 0xd5, 0x00, 0x7a, 0xfd, 0xa1, 0x2e, 0xd2, 0xeb, 0x6c, 0x03, 0xd6, - 0x3b, 0x3d, 0x25, 0x8b, 0x34, 0x08, 0xef, 0xf4, 0x94, 0x1c, 0x2b, 0x40, 0xb6, 0xd1, 0xfb, 0x56, - 0xc9, 0xd3, 0x8f, 0x6e, 0x57, 0xd9, 0x50, 0xff, 0xdf, 0x75, 0x28, 0xf5, 0x4f, 0xbe, 0xb3, 0x46, - 0x21, 0xf6, 0x19, 0xb9, 0xd4, 0xf2, 0x5f, 0x59, 0x3e, 0x75, 0x3b, 0xab, 0x89, 0x14, 0x76, 0xc4, - 0x3c, 0xa1, 0xce, 0x65, 0xb5, 0x75, 0xf3, 0x84, 0xe8, 0x46, 0xa7, 0xd6, 0xd4, 0xa0, 0xce, 0x21, - 0x1d, 0xa5, 0x70, 0x55, 0x78, 0x27, 0xdf, 0x51, 0xf7, 0xb2, 0x1a, 0xfe, 0x64, 0x77, 0xa0, 0xcc, - 0xcb, 0x48, 0xf2, 0x17, 0x70, 0xd0, 0x22, 0xf3, 0x6d, 0x24, 0x99, 0x8f, 0x72, 0x52, 0xa9, 0x1c, - 0x29, 0xf6, 0x36, 0x0e, 0xea, 0x09, 0x8e, 0xf6, 0x4e, 0xbe, 0xe3, 0xd8, 0x22, 0xe7, 0x68, 0xef, - 0xe4, 0x3b, 0x42, 0xbd, 0x0f, 0x5b, 0xc1, 0xfc, 0x24, 0x18, 0xf9, 0xf6, 0x2c, 0xb4, 0x3d, 0x97, - 0xd3, 0x94, 0x88, 0x46, 0x49, 0x22, 0x88, 0xf8, 0x21, 0x14, 0x67, 0xf3, 0x13, 0xdd, 0x76, 0xc7, - 0x1e, 0x89, 0xfd, 0xf2, 0x93, 0x2a, 0x9f, 0x98, 0xa3, 0xf9, 0x49, 0xc7, 0x1d, 0x7b, 0x5a, 0x61, - 0xc6, 0x7f, 0x30, 0x15, 0xaa, 0xae, 0x17, 0xea, 0xa8, 0x2a, 0xe8, 0x53, 0x2b, 0x34, 0x68, 0x3f, - 0xe0, 0x1b, 0x7e, 0xd7, 0x1b, 0x9d, 0x1d, 0x5a, 0xa1, 0xc1, 0x1e, 0x41, 0x31, 0x70, 0x8d, 0x59, - 0x70, 0xea, 0x85, 0xb4, 0x31, 0x94, 0x9f, 0xd4, 0x04, 0xef, 0x08, 0xa8, 0x16, 0xe1, 0xd5, 0x07, - 0x50, 0x10, 0x75, 0xa0, 0x9e, 0x10, 0x5a, 0xae, 0xe1, 0x86, 0x7a, 0xa4, 0x60, 0x14, 0x39, 0xa0, - 0x63, 0xaa, 0x7f, 0x9e, 0x01, 0x65, 0x90, 0x68, 0x36, 0x55, 0xb4, 0x4a, 0xca, 0xbc, 0x0d, 0x60, - 0x8c, 0x46, 0xde, 0x9c, 0x17, 0xc3, 0x99, 0xb1, 0x24, 0x20, 0x1d, 0x33, 0x39, 0xd6, 0xd9, 0xd4, - 0x58, 0xdf, 0x85, 0x8a, 0xcc, 0x97, 0x10, 0x10, 0x65, 0x01, 0x93, 0xa3, 0x1d, 0xcc, 0x53, 0x52, - 0xa2, 0x10, 0xcc, 0x79, 0xee, 0x6b, 0xb0, 0x41, 0xda, 0x48, 0x20, 0x67, 0x90, 0xa7, 0xd4, 0xff, - 0x2e, 0x03, 0xd5, 0x8e, 0x6b, 0x5a, 0x17, 0x83, 0x91, 0xe1, 0xca, 0x01, 0xb4, 0x03, 0xdd, 0x46, - 0x98, 0x1e, 0x8c, 0x0c, 0x57, 0x28, 0x12, 0x65, 0x3b, 0x88, 0xe8, 0xb0, 0x0f, 0x9c, 0x80, 0xaa, - 0x5a, 0xa7, 0x12, 0x4b, 0x04, 0xa1, 0xca, 0x1e, 0xc0, 0xe6, 0x89, 0xe5, 0x78, 0xee, 0x44, 0x0f, - 0x3d, 0x9d, 0x6b, 0x44, 0xbc, 0x2f, 0x55, 0x0e, 0x1e, 0x7a, 0x43, 0xd2, 0x8c, 0xb6, 0x21, 0x3f, - 0x33, 0xfc, 0x30, 0xa8, 0xe7, 0x76, 0xb2, 0xb8, 0xe4, 0x29, 0x81, 0xc3, 0x6c, 0x07, 0xfa, 0xdc, - 0xb5, 0xbf, 0x9f, 0xf3, 0x6e, 0x14, 0xb5, 0xa2, 0x1d, 0x1c, 0x53, 0x9a, 0x3d, 0x04, 0x85, 0xd7, - 0x4c, 0xc5, 0x26, 0x79, 0xb2, 0x46, 0x70, 0x2a, 0x98, 0x04, 0xe3, 0xff, 0xbe, 0x0e, 0xc5, 0xbd, - 0xb9, 0x3b, 0xc2, 0xc9, 0x60, 0xf7, 0x20, 0x37, 0x9e, 0xbb, 0x23, 0xea, 0x4b, 0xb4, 0xed, 0x46, - 0x6b, 0x4a, 0x23, 0x24, 0x4a, 0x2b, 0xc3, 0x9f, 0xa0, 0x94, 0x5b, 0x92, 0x56, 0x08, 0xa7, 0x99, - 0x9b, 0x4c, 0xf4, 0x91, 0xe7, 0x8e, 0xed, 0x09, 0xf5, 0xa8, 0xa2, 0x95, 0x8c, 0xc9, 0xa4, 0x49, - 0x00, 0xd6, 0x80, 0xcd, 0x18, 0xcd, 0x15, 0xb5, 0x1c, 0x09, 0xa6, 0x1b, 0xbc, 0xa4, 0xc6, 0x64, - 0xe2, 0x5b, 0x13, 0x23, 0xb4, 0x38, 0x3d, 0xc9, 0xa6, 0x6a, 0x94, 0x9d, 0xe4, 0xdb, 0xbf, 0x97, - 0xe1, 0x6d, 0xde, 0x73, 0x8c, 0x09, 0x2b, 0x42, 0xae, 0xd7, 0xef, 0xb5, 0x95, 0x35, 0x56, 0x81, - 0x62, 0xa7, 0x37, 0x6c, 0x6b, 0xbd, 0x46, 0x57, 0xc9, 0x90, 0x70, 0x19, 0x36, 0x76, 0xbb, 0x6d, - 0x65, 0x1d, 0x31, 0x2f, 0xfa, 0xdd, 0xc6, 0xb0, 0xd3, 0x6d, 0x2b, 0x39, 0x8e, 0xd1, 0x3a, 0xcd, - 0xa1, 0x52, 0x64, 0x0a, 0x54, 0x8e, 0xb4, 0x7e, 0xeb, 0xb8, 0xd9, 0xd6, 0x7b, 0xc7, 0xdd, 0xae, - 0xa2, 0xb0, 0x2b, 0xb0, 0x19, 0x41, 0xfa, 0x1c, 0xb8, 0x83, 0x59, 0x5e, 0x34, 0xb4, 0x86, 0xb6, - 0xaf, 0xfc, 0x8a, 0x15, 0x21, 0xdb, 0xd8, 0xdf, 0x57, 0x7e, 0x87, 0x72, 0xaa, 0xf4, 0xb2, 0xd3, - 0xd3, 0x5f, 0x34, 0xba, 0xc7, 0x6d, 0xe5, 0x77, 0xeb, 0x32, 0xdd, 0xd7, 0x5a, 0x6d, 0x4d, 0xf9, - 0x5d, 0x8e, 0x6d, 0x41, 0xe5, 0x37, 0xfd, 0x5e, 0xfb, 0xb0, 0x71, 0x74, 0x44, 0x0d, 0xf9, 0x5d, - 0x51, 0xfd, 0x87, 0x39, 0xc8, 0xe1, 0x58, 0x31, 0x35, 0x96, 0xc9, 0xd1, 0x20, 0x62, 0xe7, 0x76, - 0x73, 0x7f, 0xf7, 0x1f, 0xdc, 0x59, 0xe3, 0xd2, 0xf8, 0x2e, 0x64, 0x1d, 0x3b, 0x24, 0xc6, 0x89, - 0x56, 0xb2, 0xd0, 0x60, 0x0f, 0xd6, 0x34, 0xc4, 0xb1, 0xdb, 0x90, 0xe1, 0x62, 0x39, 0x5a, 0x9c, - 0x72, 0x5f, 0x3f, 0x58, 0xd3, 0x32, 0x33, 0x76, 0x0b, 0x32, 0xaf, 0x84, 0x8c, 0xae, 0x70, 0x3c, - 0xdf, 0xd9, 0x11, 0xfb, 0x8a, 0xed, 0x40, 0x76, 0xe4, 0x71, 0xfd, 0x34, 0xc2, 0xf3, 0x7d, 0x0e, - 0xcb, 0x1f, 0x79, 0x0e, 0xbb, 0x07, 0x59, 0xdf, 0x38, 0x27, 0xde, 0x89, 0x18, 0x22, 0xda, 0x48, - 0x91, 0xc8, 0x37, 0xce, 0xb1, 0x11, 0x63, 0x92, 0x6a, 0x51, 0x23, 0x24, 0x47, 0x61, 0x35, 0x63, - 0xb6, 0x03, 0x99, 0x73, 0x92, 0x6b, 0x91, 0x4a, 0xf6, 0xd2, 0x76, 0x4d, 0xef, 0x7c, 0x30, 0xb3, - 0x46, 0x48, 0x71, 0xce, 0xde, 0x81, 0x6c, 0x30, 0x3f, 0x21, 0xb9, 0x56, 0x7e, 0xb2, 0xb5, 0xb4, - 0x43, 0x61, 0x45, 0xc1, 0xfc, 0x84, 0x3d, 0x80, 0xdc, 0xc8, 0xf3, 0x7d, 0x21, 0xdb, 0x14, 0xd9, - 0x60, 0xb9, 0x39, 0xa3, 0x8a, 0x8a, 0x78, 0xac, 0x30, 0x24, 0x89, 0x16, 0x11, 0xc5, 0xbb, 0x23, - 0x56, 0x18, 0xb2, 0xfb, 0x62, 0xcb, 0x4d, 0xc9, 0x35, 0xb9, 0x21, 0x63, 0x39, 0x88, 0xc5, 0x49, - 0x9a, 0x1a, 0x17, 0xa4, 0xff, 0x46, 0x44, 0x72, 0x27, 0xc6, 0x36, 0x4d, 0x8d, 0x0b, 0x76, 0x1f, - 0xb2, 0xaf, 0xac, 0x11, 0xa9, 0xc2, 0x51, 0x6d, 0x62, 0x92, 0x5e, 0x50, 0xf7, 0x10, 0x4d, 0x2b, - 0xcb, 0x73, 0x4c, 0xd2, 0x8a, 0xa3, 0xb9, 0xdc, 0xf3, 0x1c, 0xf3, 0x05, 0xcd, 0x25, 0x21, 0x51, - 0x01, 0x31, 0xe6, 0x17, 0x28, 0xef, 0x14, 0xae, 0x2a, 0x18, 0xf3, 0x8b, 0x8e, 0x89, 0x5b, 0x91, - 0x6b, 0xbe, 0x22, 0x5d, 0x38, 0xa3, 0xe1, 0x4f, 0x3c, 0xac, 0x05, 0x96, 0x63, 0x8d, 0x42, 0xfb, - 0x95, 0x1d, 0x5e, 0x92, 0xb6, 0x9b, 0xd1, 0x92, 0xa0, 0xdd, 0x0d, 0xc8, 0x59, 0x17, 0x33, 0x5f, - 0x3d, 0x80, 0x82, 0xa8, 0x65, 0xe9, 0xc4, 0x77, 0x03, 0x8a, 0x76, 0x80, 0xeb, 0x30, 0x08, 0x85, - 0x26, 0x57, 0xb0, 0x83, 0x26, 0x26, 0x51, 0x20, 0x9b, 0x46, 0x68, 0x88, 0xc5, 0x4b, 0xbf, 0xd5, - 0x27, 0x00, 0x71, 0xb7, 0xb0, 0x4d, 0x8e, 0xe5, 0x4a, 0xa5, 0xd1, 0xb1, 0xdc, 0x28, 0xcf, 0x7a, - 0x22, 0xcf, 0x0d, 0x28, 0x45, 0x7a, 0x3a, 0xab, 0x40, 0xc6, 0x10, 0x9b, 0x71, 0xc6, 0x50, 0x1f, - 0xa2, 0xda, 0x2c, 0x35, 0xf1, 0x34, 0x0e, 0x53, 0x72, 0x8b, 0xce, 0x9c, 0xa8, 0xbf, 0x84, 0x8a, - 0x66, 0x05, 0x73, 0x27, 0x6c, 0x7a, 0x4e, 0xcb, 0x1a, 0xb3, 0x0f, 0x00, 0xa2, 0x74, 0x20, 0x74, - 0xa6, 0x98, 0x77, 0x5b, 0xd6, 0x58, 0x4b, 0xe0, 0xd5, 0xff, 0x25, 0x47, 0xda, 0x67, 0x8b, 0xab, - 0x7d, 0x42, 0xbf, 0xcb, 0x24, 0xf4, 0xbb, 0x68, 0xf7, 0x59, 0x4f, 0xeb, 0xb8, 0xa7, 0xb6, 0x69, - 0x5a, 0xae, 0xd4, 0x65, 0x79, 0x0a, 0x27, 0xdb, 0x70, 0x26, 0x42, 0x60, 0x31, 0x59, 0xe9, 0x74, - 0xe6, 0x5b, 0x41, 0xc0, 0xb5, 0x28, 0xc3, 0x99, 0xc8, 0xb5, 0x9d, 0xff, 0xa1, 0xb5, 0x7d, 0x03, - 0x8a, 0xb8, 0x01, 0xd3, 0x19, 0x74, 0x83, 0x8f, 0xbe, 0x38, 0x6c, 0xb3, 0x77, 0xa1, 0x20, 0x4e, - 0x0f, 0x62, 0x51, 0x09, 0x76, 0x69, 0x71, 0xa0, 0x26, 0xb1, 0xac, 0x8e, 0x2a, 0xe7, 0x74, 0x6a, - 0xb9, 0xa1, 0xd4, 0x1a, 0x44, 0x92, 0xbd, 0x0f, 0x25, 0xcf, 0xd5, 0xf9, 0x11, 0x43, 0xac, 0x2a, - 0xc1, 0xbe, 0x7d, 0xf7, 0x98, 0xa0, 0x5a, 0xd1, 0x13, 0xbf, 0xb0, 0x29, 0x8e, 0x77, 0xae, 0x8f, - 0x0c, 0xdf, 0xa4, 0x95, 0x55, 0xd4, 0x0a, 0x8e, 0x77, 0xde, 0x34, 0x7c, 0x93, 0x6b, 0x51, 0xdf, - 0xbb, 0xf3, 0x29, 0xad, 0xa6, 0xaa, 0x26, 0x52, 0xec, 0x16, 0x94, 0x46, 0xce, 0x3c, 0x08, 0x2d, - 0x7f, 0xf7, 0x92, 0x1f, 0x1a, 0xb5, 0x18, 0x80, 0xed, 0x9a, 0xf9, 0xf6, 0xd4, 0xf0, 0x2f, 0x69, - 0xe9, 0x14, 0x35, 0x99, 0xa4, 0xad, 0xec, 0xcc, 0x36, 0x2f, 0xf8, 0xc9, 0x51, 0xe3, 0x09, 0xa4, - 0x3f, 0xa5, 0x73, 0x7d, 0x40, 0xeb, 0xa3, 0xa8, 0xc9, 0x24, 0xcd, 0x03, 0xfd, 0xa4, 0x15, 0x51, - 0xd2, 0x44, 0x2a, 0x75, 0x04, 0xd8, 0x7a, 0xed, 0x11, 0x80, 0x2d, 0x6a, 0x61, 0x9e, 0x6f, 0x4f, - 0x6c, 0xa1, 0x43, 0x5d, 0xe1, 0x5a, 0x18, 0x07, 0x11, 0xc1, 0x17, 0x50, 0x9d, 0x58, 0xae, 0xe5, - 0x1b, 0xa1, 0x65, 0xea, 0x28, 0x17, 0xb7, 0x69, 0xe0, 0xc4, 0x34, 0xef, 0x4b, 0x14, 0xca, 0x9a, - 0xca, 0x24, 0x91, 0x52, 0xbf, 0x87, 0x82, 0x98, 0x1b, 0xdc, 0x1c, 0x71, 0xdd, 0xa5, 0xe5, 0x3a, - 0xdf, 0x1c, 0x11, 0xce, 0xee, 0x41, 0x55, 0x34, 0x22, 0x08, 0x7d, 0xdb, 0x9d, 0x08, 0xae, 0xab, - 0x70, 0xe0, 0x80, 0x60, 0xa8, 0xc3, 0x20, 0x5f, 0xe8, 0xc6, 0x89, 0xed, 0xe0, 0xfa, 0xce, 0x0a, - 0xdd, 0x6c, 0xee, 0x38, 0x0d, 0x0e, 0x52, 0xfb, 0x50, 0x94, 0x33, 0xf9, 0x07, 0xa9, 0x53, 0x9d, - 0x41, 0x25, 0xd9, 0xc3, 0x3f, 0x4c, 0x47, 0xb8, 0x8e, 0x12, 0x84, 0x9e, 0x6f, 0x99, 0xd2, 0x64, - 0x64, 0x07, 0x03, 0x4a, 0xab, 0x7f, 0x9a, 0x81, 0x32, 0xe9, 0x4a, 0x7d, 0xd2, 0x04, 0xd9, 0x07, - 0xc0, 0x46, 0xbe, 0x65, 0x84, 0x96, 0x6e, 0x5d, 0x84, 0xbe, 0x21, 0x34, 0x22, 0xae, 0x56, 0x29, - 0x1c, 0xd3, 0x46, 0x04, 0x57, 0x8a, 0xee, 0x40, 0x79, 0x66, 0xf8, 0x81, 0xd4, 0xc6, 0x79, 0xed, - 0xc0, 0x41, 0x42, 0x17, 0x56, 0xdc, 0x89, 0x6f, 0x4c, 0xf5, 0xd0, 0x3b, 0xb3, 0x5c, 0x7e, 0x0e, - 0xe1, 0x27, 0xb0, 0x1a, 0xc1, 0x87, 0x08, 0xa6, 0xe3, 0xc8, 0xff, 0x90, 0x81, 0xea, 0x11, 0x67, - 0xd0, 0xe7, 0xd6, 0x65, 0x8b, 0x1f, 0x7b, 0x47, 0x52, 0xb8, 0xe4, 0x34, 0xfa, 0xcd, 0x6e, 0x43, - 0x79, 0x76, 0x66, 0x5d, 0xea, 0xa9, 0x23, 0x62, 0x09, 0x41, 0x4d, 0x12, 0x23, 0xef, 0xc1, 0x86, - 0x47, 0x1d, 0x11, 0xdb, 0xb1, 0xd8, 0xc5, 0x12, 0x3d, 0xd4, 0x04, 0x01, 0xea, 0x8e, 0x51, 0x51, - 0x49, 0x25, 0x55, 0x14, 0x46, 0xcd, 0xdf, 0x86, 0x3c, 0xa2, 0x82, 0x7a, 0x9e, 0x2b, 0x7d, 0x94, - 0x60, 0x1f, 0x43, 0x75, 0xe4, 0x4d, 0x67, 0xba, 0xcc, 0x2e, 0x36, 0xe6, 0xb4, 0xf8, 0x2b, 0x23, - 0xc9, 0x11, 0x2f, 0x4b, 0xfd, 0xcb, 0x2c, 0x14, 0xa9, 0x0d, 0x42, 0x02, 0xda, 0xe6, 0x85, 0x94, - 0x80, 0x25, 0x2d, 0x6f, 0x9b, 0xb8, 0xc1, 0xbc, 0x41, 0x4f, 0x8d, 0xf4, 0xcf, 0x6c, 0x52, 0xff, - 0xbc, 0x06, 0x1b, 0x42, 0xf9, 0xcc, 0x71, 0x11, 0x39, 0x7f, 0xbd, 0xea, 0x99, 0x5f, 0xa5, 0x7a, - 0xe2, 0x14, 0x72, 0x1a, 0xeb, 0x02, 0xb7, 0x62, 0x2e, 0x05, 0x81, 0x40, 0x6d, 0x84, 0x24, 0xe5, - 0x5b, 0x21, 0x2d, 0xdf, 0xea, 0x50, 0x78, 0x65, 0x07, 0x36, 0x32, 0x48, 0x91, 0x4b, 0x0c, 0x91, - 0x4c, 0x4c, 0x43, 0xe9, 0x4d, 0xd3, 0x10, 0x75, 0xdb, 0x70, 0x26, 0xfc, 0xbc, 0x24, 0xbb, 0xdd, - 0x70, 0x26, 0x1e, 0xfb, 0x04, 0xae, 0xc6, 0x68, 0xd1, 0x1b, 0x52, 0x57, 0xc9, 0x74, 0xa6, 0xb1, - 0x88, 0x92, 0x7a, 0x44, 0x07, 0xda, 0x47, 0xb0, 0x95, 0xc8, 0x32, 0x43, 0x4d, 0x2c, 0x20, 0xf1, - 0x58, 0xd2, 0x36, 0x23, 0x72, 0x52, 0xd0, 0x02, 0xf6, 0x1e, 0x8e, 0xd3, 0xc8, 0x99, 0x9b, 0x5c, - 0xd8, 0xcc, 0xa7, 0x6e, 0x50, 0xaf, 0xd2, 0x00, 0x6f, 0x4a, 0x78, 0x93, 0x83, 0xd5, 0xff, 0x74, - 0x1d, 0xaa, 0x7b, 0x9e, 0x6f, 0xd9, 0x13, 0x37, 0x66, 0xd0, 0xa5, 0x13, 0x93, 0x64, 0xda, 0xf5, - 0x04, 0xd3, 0xde, 0x81, 0xf2, 0x98, 0x67, 0xd4, 0xc3, 0x13, 0x6e, 0x98, 0xc9, 0x69, 0x20, 0x40, - 0xc3, 0x13, 0x07, 0x45, 0x8d, 0x24, 0xa0, 0xcc, 0x39, 0xca, 0x2c, 0x33, 0xe1, 0x0e, 0xca, 0x7e, - 0x41, 0x7b, 0x89, 0x69, 0x39, 0x56, 0xc8, 0x67, 0xb2, 0xf6, 0xe4, 0x6d, 0xa9, 0xbf, 0x24, 0xda, - 0xf4, 0x58, 0xb3, 0xc6, 0x0d, 0x52, 0xfa, 0x70, 0x6b, 0x69, 0x11, 0xb9, 0xc8, 0x2b, 0xf6, 0xa1, - 0x8d, 0x1f, 0x99, 0x97, 0x8b, 0x35, 0x75, 0x08, 0xa5, 0x08, 0x8c, 0x1a, 0xbc, 0xd6, 0x16, 0x5a, - 0xfb, 0x1a, 0x2b, 0x43, 0xa1, 0xd9, 0x18, 0x34, 0x1b, 0xad, 0xb6, 0x92, 0x41, 0xd4, 0xa0, 0x3d, - 0xe4, 0x9a, 0xfa, 0x3a, 0xdb, 0x84, 0x32, 0xa6, 0x5a, 0xed, 0xbd, 0xc6, 0x71, 0x77, 0xa8, 0x64, - 0x59, 0x15, 0x4a, 0xbd, 0xbe, 0xde, 0x68, 0x0e, 0x3b, 0xfd, 0x9e, 0x92, 0x53, 0x75, 0x28, 0x36, - 0x4f, 0xad, 0xd1, 0xd9, 0xeb, 0x46, 0x91, 0x0c, 0x1b, 0xd6, 0xe8, 0x4c, 0x68, 0xdd, 0x0b, 0x86, - 0x0d, 0x6b, 0x74, 0x86, 0x6c, 0x23, 0x25, 0xdf, 0xf7, 0x8e, 0x38, 0xb1, 0x95, 0x84, 0xd8, 0xfb, - 0xde, 0x51, 0xdb, 0x50, 0x3a, 0x32, 0xfc, 0xd0, 0xa6, 0x66, 0x3f, 0x83, 0x6a, 0x94, 0x68, 0x59, - 0x63, 0xa9, 0xae, 0xb0, 0x48, 0x55, 0x8f, 0x50, 0x5a, 0x9a, 0x50, 0xfd, 0x00, 0x2a, 0x49, 0x00, - 0xbb, 0x05, 0x59, 0xd3, 0x1a, 0xaf, 0x10, 0xc7, 0x08, 0x56, 0x5f, 0x40, 0xa5, 0x29, 0xb7, 0xdf, - 0xd7, 0xf5, 0xec, 0x09, 0xd4, 0x48, 0x76, 0x8c, 0x4e, 0xa4, 0xf0, 0x58, 0x5f, 0x21, 0x3c, 0x2a, - 0x48, 0xd3, 0x3c, 0x11, 0xd2, 0xe3, 0x33, 0x28, 0x1f, 0xf9, 0xde, 0xcc, 0xf2, 0x43, 0x2a, 0x56, - 0x81, 0xec, 0x99, 0x75, 0x29, 0x4a, 0xc5, 0x9f, 0xb1, 0x39, 0x6a, 0x3d, 0x69, 0x8e, 0x7a, 0x02, - 0x45, 0x99, 0xed, 0x47, 0xe7, 0xf9, 0x0a, 0x85, 0x30, 0xe5, 0xb1, 0xad, 0x00, 0x2b, 0x7b, 0x0c, - 0x30, 0x8b, 0x00, 0x62, 0xe0, 0xe4, 0x19, 0x47, 0x14, 0xae, 0x25, 0x28, 0xd4, 0xb7, 0xa1, 0xf0, - 0xc2, 0xb6, 0xce, 0x45, 0xf7, 0x5f, 0xd9, 0xd6, 0xb9, 0xec, 0x3e, 0xfe, 0x56, 0xff, 0x9f, 0x12, - 0x14, 0x69, 0xa5, 0xb6, 0x5e, 0x6f, 0x01, 0xfc, 0x29, 0xaa, 0xe0, 0x8e, 0x58, 0x6e, 0xb9, 0x15, - 0x0a, 0x28, 0x5f, 0x7c, 0x6f, 0x03, 0x24, 0xa4, 0x06, 0x97, 0x81, 0xa5, 0x30, 0x12, 0x16, 0xa8, - 0x43, 0xd1, 0xae, 0x86, 0x6c, 0xc4, 0x0f, 0xe7, 0x31, 0x80, 0x3d, 0xe6, 0x1a, 0x0e, 0x1d, 0xc7, - 0xb9, 0x16, 0x78, 0x45, 0x9e, 0x64, 0x4e, 0x1c, 0x4b, 0x9e, 0xaf, 0x48, 0xed, 0xc1, 0x04, 0x49, - 0x44, 0xcb, 0x0f, 0x50, 0xf0, 0xd1, 0x15, 0x81, 0x26, 0x93, 0xec, 0x5d, 0xc8, 0xe1, 0x76, 0x21, - 0xce, 0x43, 0x57, 0xe4, 0x08, 0x26, 0xf6, 0x3b, 0x8d, 0x08, 0xd8, 0x43, 0x28, 0x90, 0x90, 0xb2, - 0x50, 0x66, 0x25, 0x46, 0x5b, 0x6e, 0x1f, 0x9a, 0x44, 0xb3, 0xf7, 0x20, 0x3f, 0x3e, 0xb3, 0x2e, - 0xb9, 0xc0, 0x8a, 0xca, 0x4c, 0x2d, 0x69, 0x8d, 0x53, 0xb0, 0xfb, 0x50, 0xf3, 0xad, 0xb1, 0x4e, - 0x36, 0x41, 0x94, 0x41, 0x41, 0xbd, 0x46, 0x22, 0xa6, 0xe2, 0x5b, 0xe3, 0x26, 0x02, 0x87, 0x27, - 0x4e, 0xc0, 0x1e, 0xc0, 0x06, 0x2d, 0x2e, 0x54, 0x00, 0x13, 0x35, 0xcb, 0x95, 0xaa, 0x09, 0x2c, - 0xfb, 0x04, 0x40, 0xa8, 0x99, 0xfa, 0xc9, 0x25, 0xd9, 0xd2, 0xa3, 0xc5, 0x94, 0xe4, 0xff, 0xa4, - 0x32, 0xfa, 0x2e, 0xe4, 0x91, 0x49, 0x82, 0xfa, 0x75, 0x2a, 0x79, 0x2b, 0xcd, 0x41, 0xd4, 0x52, - 0xc2, 0xb3, 0x87, 0x50, 0x44, 0x46, 0xa1, 0x55, 0x5d, 0x4f, 0xea, 0xdd, 0x82, 0xab, 0x70, 0x8f, - 0xb1, 0xce, 0x07, 0xdf, 0x3b, 0xec, 0x11, 0xe4, 0x4c, 0x5c, 0xcc, 0x37, 0xa8, 0xc4, 0x6b, 0x89, - 0x79, 0x41, 0x59, 0xd6, 0xb2, 0xc6, 0x74, 0x14, 0x20, 0x1a, 0x76, 0x00, 0x35, 0x64, 0xa3, 0x27, - 0xa4, 0x36, 0xe0, 0xf0, 0xd5, 0x6f, 0x52, 0xae, 0xbb, 0x0b, 0xb9, 0x7a, 0x82, 0x88, 0x06, 0xbb, - 0xed, 0x86, 0xfe, 0xa5, 0x56, 0x75, 0x93, 0x30, 0x76, 0x13, 0xcf, 0x6b, 0x5d, 0x6f, 0x74, 0x66, - 0x99, 0xf5, 0xb7, 0xa4, 0x2e, 0xc5, 0xd3, 0xec, 0x4b, 0xa8, 0x12, 0x63, 0x61, 0x12, 0x2b, 0xaf, - 0xdf, 0x22, 0x59, 0x9b, 0x64, 0x19, 0x89, 0xd2, 0xd2, 0x94, 0xb8, 0x03, 0xd8, 0x81, 0x1e, 0x5a, - 0xd3, 0x99, 0xe7, 0xa3, 0xc6, 0xfe, 0xb6, 0xb4, 0x63, 0x0d, 0x25, 0x08, 0xb7, 0xf4, 0xe8, 0xe6, - 0x4f, 0xf7, 0xc6, 0xe3, 0xc0, 0x0a, 0xeb, 0xb7, 0x69, 0xdd, 0xd4, 0xe4, 0x05, 0x60, 0x9f, 0xa0, - 0xb4, 0xa5, 0x06, 0xba, 0x79, 0xe9, 0x1a, 0x53, 0x7b, 0x54, 0xbf, 0xc3, 0x0f, 0x06, 0x76, 0xd0, - 0xe2, 0x80, 0xa4, 0x6e, 0xbe, 0x93, 0xd2, 0xcd, 0xaf, 0x40, 0xde, 0x3c, 0xc1, 0xe5, 0x78, 0x97, - 0x8a, 0xcd, 0x99, 0x27, 0x1d, 0x93, 0x7d, 0x08, 0xa5, 0x99, 0x14, 0x81, 0x75, 0x35, 0x69, 0x81, - 0x88, 0x24, 0xa3, 0x16, 0x53, 0xe0, 0xa1, 0x78, 0xcf, 0x32, 0xc2, 0xb9, 0x6f, 0xed, 0x39, 0xc6, - 0xa4, 0x7e, 0x8f, 0x4a, 0x4a, 0x82, 0xb0, 0x75, 0x8e, 0x37, 0xb1, 0x47, 0x06, 0xad, 0xfc, 0xfb, - 0x5c, 0x83, 0x13, 0x90, 0x8e, 0x19, 0xab, 0xb4, 0x86, 0x50, 0xcb, 0xde, 0x49, 0xaa, 0xb4, 0x86, - 0x23, 0x8d, 0x76, 0xf1, 0x58, 0x58, 0x33, 0x6f, 0x74, 0x5a, 0x7f, 0x40, 0xeb, 0xad, 0x2a, 0x87, - 0xa2, 0x8d, 0xc0, 0x9b, 0xfb, 0x74, 0x26, 0xa0, 0x11, 0xfe, 0x6c, 0x41, 0x90, 0xa5, 0x96, 0x61, - 0x42, 0xe2, 0x1d, 0xac, 0x25, 0xe5, 0xd9, 0x6e, 0x9e, 0x24, 0xfe, 0xcd, 0x5f, 0x01, 0x5b, 0xe6, - 0x8d, 0x37, 0x49, 0xd5, 0xbc, 0x90, 0xaa, 0xbf, 0x58, 0x7f, 0x96, 0x51, 0xff, 0xdb, 0x0c, 0x54, - 0x53, 0x52, 0x63, 0xe5, 0xf6, 0xc0, 0xb5, 0x3c, 0x63, 0x2a, 0x0e, 0xf0, 0x3c, 0x21, 0x35, 0x78, - 0xdb, 0x9d, 0x08, 0xeb, 0x24, 0xd7, 0xe0, 0x29, 0xcd, 0xbe, 0x82, 0x2b, 0xe3, 0xb9, 0xe3, 0x84, - 0xd6, 0x45, 0xa8, 0x07, 0xde, 0xdc, 0x1f, 0x59, 0xba, 0x6f, 0x8d, 0x85, 0xb9, 0x69, 0xc9, 0x7a, - 0xb8, 0x25, 0x69, 0x07, 0x44, 0xaa, 0x59, 0x63, 0xf6, 0xc7, 0xc0, 0xa2, 0x02, 0xb8, 0xe2, 0x84, - 0xf9, 0xf3, 0xab, 0xf3, 0x2b, 0x92, 0x94, 0x86, 0x41, 0xb3, 0xc6, 0xea, 0x7f, 0x91, 0x85, 0xca, - 0x81, 0x11, 0x9c, 0x1e, 0x1a, 0xb3, 0x41, 0x68, 0x84, 0x01, 0xf2, 0xf2, 0xa9, 0x11, 0x9c, 0x4e, - 0x8d, 0x19, 0xd7, 0xf7, 0x33, 0xdc, 0x30, 0x22, 0x60, 0xa8, 0xec, 0xe3, 0x2a, 0xc2, 0x64, 0xdf, - 0x3d, 0x7a, 0x2e, 0xac, 0x1e, 0x51, 0x1a, 0x65, 0x68, 0x70, 0x3a, 0x1f, 0x8f, 0xa3, 0xae, 0xca, - 0x24, 0xbb, 0x0f, 0x55, 0xf1, 0x93, 0x94, 0xfd, 0x0b, 0x71, 0xcd, 0x9d, 0x06, 0xb2, 0xa7, 0x50, - 0x16, 0x80, 0xa1, 0x94, 0xf8, 0xb5, 0xc8, 0x9a, 0x15, 0x23, 0xb4, 0x24, 0x15, 0xfb, 0x35, 0x5c, - 0x4d, 0x24, 0xf7, 0x3c, 0xff, 0x70, 0xee, 0x84, 0x76, 0xb3, 0x27, 0xd4, 0xa5, 0xb7, 0x96, 0xb2, - 0xc7, 0x24, 0xda, 0xea, 0x9c, 0xe9, 0xd6, 0x1e, 0xda, 0x2e, 0x6d, 0x20, 0x59, 0x2d, 0x0d, 0x5c, - 0xa0, 0x32, 0x2e, 0x68, 0xdf, 0x48, 0x53, 0x19, 0x17, 0x28, 0x59, 0x04, 0xe0, 0xd0, 0x0a, 0x4f, - 0x3d, 0x93, 0xd4, 0xea, 0x48, 0xb2, 0x0c, 0x92, 0x28, 0x2d, 0x4d, 0x89, 0xc3, 0x89, 0x47, 0xd6, - 0x91, 0x1b, 0x92, 0x72, 0x9d, 0xd5, 0x64, 0x12, 0xf7, 0x54, 0xdf, 0x70, 0x27, 0x56, 0x50, 0x2f, - 0xef, 0x64, 0x1f, 0x66, 0x34, 0x91, 0x52, 0xff, 0xd5, 0x75, 0xc8, 0xf3, 0x99, 0x7c, 0x0b, 0x4a, - 0x27, 0x74, 0x39, 0xe1, 0xce, 0xa7, 0xf2, 0x12, 0x81, 0x00, 0xbd, 0xf9, 0x94, 0x6b, 0xba, 0xc2, - 0x6a, 0x95, 0xd1, 0xe8, 0x37, 0x16, 0xe9, 0xcd, 0x43, 0xac, 0x2b, 0x4b, 0x50, 0x91, 0xc2, 0x46, - 0xf8, 0xde, 0x39, 0x71, 0x43, 0x8e, 0x10, 0x32, 0x49, 0xf7, 0x14, 0xb4, 0x3d, 0x63, 0xa6, 0x3c, - 0xe1, 0x8a, 0x04, 0x68, 0xba, 0xe1, 0xa2, 0x85, 0x6d, 0x63, 0xc9, 0xc2, 0xc6, 0x6e, 0x03, 0xea, - 0xd1, 0x23, 0xab, 0xef, 0x5a, 0xcd, 0x1e, 0x8d, 0x70, 0x51, 0x4b, 0x40, 0x70, 0x85, 0x9a, 0xde, - 0x8c, 0x06, 0x35, 0xaf, 0xe1, 0x4f, 0xf6, 0x79, 0xc4, 0x9d, 0xd4, 0x47, 0x71, 0x40, 0x11, 0xdb, - 0x57, 0x92, 0x8f, 0xb5, 0x14, 0x1d, 0x96, 0x84, 0x7b, 0x12, 0x3f, 0xa0, 0xe0, 0x4f, 0xb5, 0x0d, - 0xa0, 0x79, 0xe7, 0x81, 0x15, 0x92, 0x29, 0xf9, 0x3a, 0x75, 0x31, 0x75, 0x25, 0xe9, 0x9d, 0x1f, - 0x79, 0x41, 0x74, 0x86, 0x5f, 0x5f, 0x7d, 0x86, 0x57, 0x3f, 0x82, 0x02, 0x2a, 0x2c, 0x46, 0x68, - 0xb0, 0xfb, 0xc2, 0x7a, 0xc7, 0xd5, 0x2c, 0x61, 0xc6, 0x8c, 0xeb, 0x10, 0xf6, 0xbc, 0xae, 0xac, - 0x97, 0xf2, 0xdc, 0x4d, 0x9c, 0x92, 0xa3, 0xcd, 0x52, 0x14, 0x28, 0x54, 0xa0, 0xb7, 0xa0, 0x84, - 0x4d, 0xa3, 0xbb, 0x17, 0x21, 0x98, 0x8a, 0xbe, 0x77, 0xde, 0xc4, 0xb4, 0xfa, 0x3f, 0x66, 0xa0, - 0xdc, 0xf7, 0x4d, 0xdc, 0xa5, 0x07, 0x33, 0x6b, 0xf4, 0x46, 0x93, 0x03, 0x2a, 0x4c, 0x9e, 0xe3, - 0x18, 0xb4, 0x1f, 0x88, 0x53, 0x6a, 0x04, 0x60, 0x9f, 0x40, 0x6e, 0x8c, 0x72, 0x3f, 0x9b, 0x3c, - 0x65, 0x24, 0x8a, 0x97, 0xbf, 0x71, 0x27, 0xd0, 0x88, 0x54, 0xfd, 0x9b, 0x51, 0xfd, 0xb4, 0x3d, - 0x24, 0xef, 0x0f, 0xd6, 0xe8, 0x5e, 0x71, 0xd0, 0x54, 0x32, 0xac, 0x08, 0xb9, 0x56, 0x7b, 0xd0, - 0xe4, 0x67, 0x0b, 0x3c, 0x65, 0x0c, 0xf4, 0xbd, 0x8e, 0x36, 0x18, 0x2a, 0x39, 0xba, 0xa8, 0x24, - 0x40, 0xb7, 0x31, 0x18, 0x2a, 0x45, 0x06, 0xb0, 0x71, 0xdc, 0xeb, 0xfc, 0xfa, 0xb8, 0xad, 0x28, - 0xea, 0xdf, 0xcf, 0x00, 0xc4, 0x66, 0x6e, 0xf6, 0x3e, 0x94, 0xcf, 0x29, 0xa5, 0x27, 0x6e, 0x58, - 0x92, 0x7d, 0x04, 0x8e, 0x26, 0x65, 0xee, 0x43, 0xa8, 0x44, 0xfb, 0x1a, 0x2a, 0x3a, 0xcb, 0x57, - 0x2d, 0xe5, 0x08, 0xbf, 0x7b, 0xc9, 0x3e, 0x80, 0xa2, 0x87, 0xfd, 0x40, 0xd2, 0x6c, 0x52, 0xcb, - 0x49, 0x74, 0x5f, 0x2b, 0x78, 0x3c, 0x81, 0x0a, 0xd1, 0xd8, 0x97, 0x56, 0x87, 0x88, 0x74, 0x0f, - 0x41, 0x4d, 0xc7, 0x98, 0x07, 0x96, 0xc6, 0xf1, 0xd1, 0x2e, 0x91, 0x8f, 0x77, 0x09, 0xf5, 0x37, - 0x50, 0x1b, 0x18, 0xd3, 0x19, 0xdf, 0x4b, 0xa8, 0x63, 0x0c, 0x72, 0xc8, 0x13, 0x82, 0xf5, 0xe8, - 0x37, 0x2e, 0xba, 0x23, 0xcb, 0x1f, 0x59, 0xae, 0x5c, 0xa3, 0x32, 0x89, 0xe2, 0xf7, 0x18, 0x77, - 0x13, 0xcd, 0x3b, 0x97, 0xdb, 0x89, 0x4c, 0xab, 0xff, 0x46, 0x06, 0xca, 0x89, 0x66, 0xb0, 0x8f, - 0x20, 0x47, 0x9a, 0x73, 0x26, 0x29, 0x08, 0x13, 0x04, 0xfc, 0x37, 0xd7, 0xb5, 0x90, 0x90, 0x3d, - 0x80, 0x7c, 0x10, 0x1a, 0xbe, 0xbc, 0x31, 0x51, 0x12, 0x39, 0x76, 0xbd, 0xb9, 0x6b, 0x6a, 0x1c, - 0xcd, 0x54, 0xc8, 0x5a, 0xae, 0x29, 0xec, 0x34, 0xcb, 0x54, 0x88, 0x54, 0x77, 0xa0, 0x14, 0x15, - 0x8f, 0x2c, 0xa0, 0xf5, 0x5f, 0x0e, 0x94, 0x35, 0x56, 0x82, 0xbc, 0xd6, 0xe8, 0xed, 0xb7, 0x95, - 0x8c, 0xfa, 0xe7, 0x19, 0x80, 0x38, 0x17, 0x7b, 0x9c, 0x6a, 0xed, 0xcd, 0xc5, 0x52, 0x1f, 0xd3, - 0xdf, 0x44, 0x63, 0x6f, 0x41, 0x69, 0xee, 0x12, 0xd0, 0x32, 0xc5, 0x4e, 0x14, 0x03, 0xf0, 0xb8, - 0x27, 0xbd, 0x8d, 0x16, 0x8e, 0x7b, 0xaf, 0x0c, 0x47, 0xfd, 0x05, 0x94, 0xa2, 0xe2, 0xf0, 0x80, - 0xbb, 0xd7, 0xef, 0x76, 0xfb, 0x2f, 0x3b, 0xbd, 0x7d, 0x65, 0x0d, 0x93, 0x47, 0x5a, 0xbb, 0xd9, - 0x6e, 0x61, 0x32, 0x83, 0x3c, 0xdb, 0x3c, 0xd6, 0xb4, 0x76, 0x6f, 0xa8, 0x6b, 0xfd, 0x97, 0xca, - 0xba, 0xfa, 0xb7, 0x33, 0x50, 0xed, 0x3b, 0x66, 0xd3, 0x73, 0x9a, 0xc6, 0x0c, 0x55, 0x23, 0xf6, - 0x15, 0x6c, 0x9d, 0xcc, 0x51, 0x3d, 0x9f, 0x39, 0xc6, 0xc8, 0x3a, 0xf5, 0x1c, 0xd3, 0x92, 0x8b, - 0x30, 0x75, 0x27, 0x24, 0xcc, 0xd7, 0x0a, 0x11, 0x1f, 0xc5, 0xb4, 0xec, 0x33, 0xa8, 0xcc, 0x7c, - 0xef, 0xc4, 0x12, 0x4a, 0xc0, 0xd2, 0xb9, 0x32, 0xce, 0x5b, 0x26, 0x3a, 0xae, 0x00, 0xa8, 0xff, - 0xd6, 0x3a, 0x54, 0x5a, 0x96, 0x39, 0x9f, 0x7d, 0xed, 0xd9, 0x6e, 0x33, 0xbc, 0x60, 0x9f, 0x42, - 0xc5, 0x73, 0xc8, 0x1a, 0xa2, 0x27, 0xfc, 0x21, 0x56, 0x95, 0x03, 0x1e, 0xf5, 0x80, 0xbc, 0x27, - 0x3e, 0x84, 0x2b, 0xdc, 0xc0, 0x20, 0x4c, 0x73, 0x17, 0x3c, 0x33, 0xae, 0x99, 0xbc, 0xa6, 0x70, - 0x14, 0xdf, 0xa0, 0x89, 0xfc, 0x8f, 0x60, 0x3b, 0x41, 0x8e, 0x82, 0x85, 0xd3, 0x67, 0x97, 0xd6, - 0xd8, 0x56, 0x94, 0x37, 0xf2, 0xd4, 0xf8, 0x1a, 0xb6, 0x65, 0x0b, 0x47, 0x7c, 0xf4, 0x78, 0xe6, - 0x5c, 0xf2, 0x1c, 0x94, 0x1a, 0x5d, 0xd1, 0xe0, 0x2d, 0x2f, 0x09, 0xa4, 0xb2, 0x3e, 0x81, 0xab, - 0x26, 0xf6, 0x5e, 0xe7, 0x83, 0x7f, 0x66, 0x59, 0x33, 0xdd, 0x31, 0x82, 0x50, 0x5c, 0xe6, 0x32, - 0x42, 0xee, 0x22, 0xee, 0xb9, 0x65, 0xcd, 0xba, 0x46, 0x10, 0xaa, 0xff, 0x55, 0x16, 0x4a, 0xdc, - 0x3a, 0x82, 0xc3, 0xf5, 0x10, 0x0a, 0xde, 0xc9, 0x77, 0xa4, 0x32, 0xbd, 0xe6, 0xc2, 0x76, 0xc3, - 0x3b, 0xf9, 0x0e, 0xf5, 0xac, 0xf7, 0xe5, 0x56, 0x67, 0x5a, 0x63, 0x31, 0x3b, 0xb5, 0xf4, 0xf9, - 0x43, 0x6c, 0x7d, 0x78, 0x36, 0x7e, 0x0a, 0x65, 0xdb, 0x0d, 0x2c, 0x3f, 0xe4, 0x16, 0xa1, 0xc2, - 0xeb, 0x27, 0x81, 0x93, 0x91, 0x91, 0xe8, 0x29, 0x94, 0xb9, 0x85, 0x88, 0x67, 0x2a, 0xbe, 0x3e, - 0x13, 0x27, 0xa3, 0x4c, 0x5f, 0x42, 0x2d, 0x16, 0x73, 0x94, 0xaf, 0xf4, 0xda, 0x7c, 0xd5, 0x88, - 0x92, 0xb2, 0x3e, 0x81, 0x6b, 0xc1, 0x99, 0x3d, 0xd3, 0x45, 0x4b, 0x3d, 0x97, 0x6e, 0x52, 0xf4, - 0xd9, 0x99, 0xb8, 0xc1, 0x60, 0x88, 0xed, 0x10, 0xb2, 0xef, 0xf6, 0xe6, 0x8e, 0x73, 0x74, 0xc6, - 0xde, 0x83, 0x2d, 0x41, 0x3e, 0x3b, 0x93, 0xbc, 0x42, 0xa7, 0xe2, 0xbc, 0x56, 0xe3, 0x88, 0xa3, - 0x33, 0xa1, 0xc9, 0x7d, 0x01, 0x75, 0xee, 0x43, 0x20, 0x3a, 0x65, 0x8c, 0xc7, 0xd6, 0x28, 0xd4, - 0x51, 0x75, 0x10, 0xd7, 0x1d, 0x57, 0x09, 0xcf, 0xcd, 0x5c, 0x0d, 0xc2, 0x92, 0xe4, 0xfb, 0x18, - 0xb6, 0xed, 0x89, 0xeb, 0xf9, 0x32, 0x8b, 0x65, 0xf2, 0x4c, 0xfc, 0x1e, 0x84, 0x71, 0x5c, 0x43, - 0xa0, 0x30, 0x87, 0xfa, 0x6f, 0x67, 0xa0, 0xc4, 0x1b, 0x8a, 0x73, 0x7a, 0x17, 0xb2, 0x3f, 0x30, - 0x9f, 0x88, 0x63, 0x8f, 0x60, 0xcb, 0x30, 0xcd, 0x85, 0xf2, 0xb9, 0x00, 0xd9, 0x34, 0x4c, 0x33, - 0x59, 0x38, 0x19, 0x63, 0x03, 0x5d, 0x1e, 0x99, 0x63, 0x1f, 0x83, 0xa2, 0x56, 0xb3, 0x03, 0x71, - 0x62, 0xe6, 0xf6, 0xf4, 0x14, 0x8b, 0xe4, 0x7e, 0x98, 0x45, 0x54, 0x06, 0xa0, 0x59, 0x24, 0x2d, - 0x9a, 0xe1, 0xc5, 0xd7, 0xb9, 0x62, 0x46, 0x01, 0xf5, 0xef, 0x95, 0xa1, 0xdc, 0x70, 0x0d, 0xe7, - 0xf2, 0xb7, 0x16, 0x39, 0x48, 0x90, 0x75, 0x75, 0x36, 0x17, 0x83, 0xc6, 0xef, 0xf6, 0x4a, 0x04, - 0xa1, 0x96, 0xdd, 0x81, 0xb2, 0x37, 0x0f, 0x23, 0x3c, 0xbf, 0xed, 0x03, 0x0e, 0x22, 0x82, 0x28, - 0x7f, 0x64, 0xb9, 0x97, 0xf9, 0x49, 0x8f, 0x8f, 0xf3, 0x47, 0xba, 0x5d, 0x94, 0x9f, 0x08, 0xee, - 0x41, 0x35, 0xb4, 0xa7, 0x16, 0x5d, 0x70, 0xce, 0xa7, 0x96, 0xc9, 0xbd, 0x30, 0xb9, 0x63, 0x5f, - 0x53, 0xc0, 0xb0, 0x94, 0xa9, 0x35, 0xf5, 0xfc, 0x4b, 0x5e, 0xca, 0x06, 0x2f, 0x85, 0x83, 0xa8, - 0x94, 0x0f, 0x80, 0x9d, 0x1b, 0x76, 0xa8, 0xa7, 0x8b, 0xe2, 0xfa, 0xb4, 0x82, 0x98, 0x61, 0xb2, - 0xb8, 0x6b, 0xb0, 0x61, 0xda, 0xc1, 0x59, 0xa7, 0x2f, 0x74, 0x69, 0x91, 0xc2, 0xbe, 0x04, 0x23, - 0x03, 0xb7, 0xf2, 0xd0, 0xe2, 0x7a, 0x5f, 0x56, 0x2b, 0x21, 0x64, 0x17, 0x01, 0xb8, 0x15, 0xb8, - 0x56, 0x78, 0xee, 0xf9, 0x98, 0x93, 0xab, 0xca, 0x31, 0x00, 0xb7, 0x4c, 0x24, 0xc5, 0x8a, 0x88, - 0x5b, 0xb3, 0x5a, 0x94, 0x46, 0x25, 0x94, 0x73, 0x2e, 0x61, 0x2b, 0xbc, 0xf9, 0x31, 0x84, 0xdd, - 0x87, 0x1a, 0x35, 0x9f, 0x54, 0x69, 0xec, 0x03, 0x31, 0x62, 0x56, 0xab, 0x20, 0x94, 0x4c, 0x00, - 0x48, 0xf5, 0x25, 0xdc, 0x48, 0xf5, 0x4f, 0x37, 0x7c, 0xdf, 0xb8, 0xd4, 0xa7, 0xc6, 0x77, 0x9e, - 0x4f, 0xe6, 0x9a, 0xac, 0x76, 0x2d, 0x39, 0x6c, 0x0d, 0x44, 0x1f, 0x22, 0xf6, 0xb5, 0x59, 0x6d, - 0xd7, 0xf3, 0xc9, 0x96, 0xb3, 0x32, 0x2b, 0x62, 0xc9, 0xf0, 0x40, 0x13, 0x4c, 0x7a, 0x7d, 0xc0, - 0x1d, 0x42, 0xb5, 0x32, 0xc1, 0x76, 0x09, 0x84, 0x9a, 0x6d, 0xf0, 0x94, 0x4b, 0xd8, 0x2d, 0xe1, - 0x9d, 0xf5, 0x94, 0x64, 0x27, 0x47, 0x9c, 0x5a, 0x86, 0x49, 0x97, 0x7c, 0x84, 0x38, 0xb0, 0x0c, - 0xba, 0x42, 0x0f, 0x9e, 0xea, 0xb3, 0x79, 0xc8, 0x3d, 0x39, 0xb5, 0x7c, 0xf0, 0xf4, 0x68, 0x1e, - 0x0a, 0xf0, 0xc4, 0x0a, 0xe9, 0x4e, 0x8f, 0xc0, 0xfb, 0x56, 0x88, 0xea, 0x69, 0xf0, 0x54, 0x9a, - 0xb6, 0xaf, 0x8a, 0xb1, 0x7d, 0x2a, 0x6c, 0xd7, 0x2a, 0x54, 0x23, 0xa4, 0x3e, 0x9d, 0x73, 0xd7, - 0xcd, 0xac, 0x56, 0x96, 0x04, 0x87, 0x73, 0x07, 0x27, 0x76, 0x64, 0x8c, 0x4e, 0xf1, 0xdc, 0x6b, - 0x98, 0xe4, 0xbd, 0x99, 0xd5, 0x4a, 0x04, 0xd1, 0xb0, 0x35, 0x6f, 0x01, 0x4f, 0xe8, 0xa7, 0x76, - 0x48, 0x36, 0xa5, 0xac, 0x56, 0x24, 0xc0, 0x81, 0x1d, 0xe2, 0x3a, 0xe6, 0x48, 0xc1, 0x81, 0x54, - 0xc4, 0x0d, 0x22, 0xda, 0x24, 0xc4, 0x21, 0xc1, 0xa9, 0xa0, 0x87, 0xa0, 0xa4, 0x68, 0xb1, 0xbc, - 0x9b, 0x44, 0x5a, 0x4b, 0x90, 0x62, 0xa9, 0x0f, 0x80, 0x67, 0xd6, 0x91, 0xf5, 0x78, 0x99, 0x6f, - 0xf1, 0x73, 0x1d, 0x81, 0x5b, 0x76, 0x70, 0x46, 0x25, 0xde, 0x87, 0x5a, 0x82, 0x0e, 0xcb, 0xbb, - 0xc5, 0x39, 0x23, 0x22, 0x4b, 0xb5, 0xd1, 0xb7, 0xa6, 0x5e, 0x28, 0xba, 0xf9, 0x76, 0xa2, 0x8d, - 0x1a, 0xc1, 0xd3, 0x6d, 0x14, 0xb4, 0x58, 0xe6, 0xed, 0x44, 0x1b, 0x39, 0x29, 0x96, 0x7a, 0x17, - 0x2a, 0xe7, 0xbe, 0x1d, 0x86, 0x96, 0xcb, 0x17, 0xff, 0x1d, 0x3e, 0xb0, 0x02, 0x46, 0xab, 0xff, - 0x2e, 0x54, 0xf8, 0xc8, 0x0b, 0xf9, 0xb6, 0xc3, 0x49, 0x04, 0x4c, 0x0a, 0x08, 0x31, 0x1a, 0x53, - 0xdb, 0x25, 0xc3, 0x51, 0x56, 0x2b, 0x71, 0x08, 0x1e, 0x6f, 0x13, 0x68, 0xe3, 0x82, 0xcc, 0x47, - 0x31, 0xda, 0xb8, 0xa0, 0x25, 0x39, 0xb3, 0x1d, 0x87, 0x2f, 0xfc, 0x7b, 0x62, 0x49, 0x22, 0x84, - 0xd6, 0x7d, 0x84, 0xa6, 0xda, 0xef, 0x27, 0xd0, 0x54, 0x37, 0x32, 0x0e, 0xa1, 0xb1, 0xea, 0x77, - 0x04, 0xe3, 0x20, 0x00, 0x6b, 0x8e, 0x91, 0xc6, 0x05, 0x19, 0x87, 0x22, 0xa4, 0x71, 0x21, 0xe4, - 0x16, 0x96, 0x4a, 0x79, 0xdf, 0x8d, 0xe4, 0x16, 0x82, 0x30, 0x77, 0x92, 0xc0, 0xb8, 0xa8, 0x3f, - 0x4c, 0x13, 0x18, 0x17, 0x74, 0xa6, 0xb2, 0x0c, 0x93, 0x37, 0xfc, 0x3d, 0x5e, 0x3c, 0x02, 0xa8, - 0xdd, 0x3b, 0x50, 0x09, 0x9e, 0xea, 0x31, 0xfe, 0x11, 0xcf, 0x1e, 0x3c, 0xd5, 0x24, 0xc5, 0x7d, - 0xa8, 0x45, 0xac, 0xc1, 0x69, 0xde, 0xe7, 0x13, 0x6f, 0x0a, 0xd6, 0xa0, 0x3b, 0xd1, 0xdf, 0x65, - 0xe0, 0x66, 0x9f, 0xec, 0x5e, 0x24, 0xfe, 0x0f, 0xad, 0x20, 0x30, 0x26, 0xd6, 0x9e, 0xe7, 0xef, - 0xcd, 0x7f, 0xfb, 0xdb, 0x4b, 0xf6, 0x10, 0x36, 0x8f, 0x0c, 0xdf, 0x72, 0xc3, 0xe8, 0x36, 0x4f, - 0xd8, 0x92, 0x16, 0xc1, 0xec, 0x19, 0x28, 0x1c, 0xc4, 0x3d, 0xd3, 0x9a, 0xf2, 0x86, 0x6a, 0xd1, - 0x64, 0xbe, 0x44, 0x85, 0xc7, 0xc3, 0x52, 0xcb, 0x0e, 0x42, 0xcd, 0x70, 0x27, 0x28, 0xa3, 0x14, - 0xc7, 0x3b, 0xc7, 0x33, 0x0e, 0x2a, 0xbe, 0x7a, 0x42, 0xd5, 0x16, 0xbb, 0x64, 0xac, 0x5f, 0xd7, - 0x88, 0x30, 0x56, 0x90, 0xbf, 0x04, 0x65, 0x3e, 0x9b, 0xa5, 0xb3, 0xae, 0xbf, 0x26, 0x2b, 0x11, - 0xc6, 0x59, 0xdf, 0x87, 0x72, 0xa2, 0xd6, 0x15, 0xea, 0x38, 0xc4, 0x75, 0x21, 0x71, 0xa2, 0x9e, - 0x15, 0x9e, 0xb1, 0x10, 0x97, 0xae, 0xfe, 0x33, 0xeb, 0xa0, 0x08, 0x43, 0x96, 0x61, 0x5a, 0x3e, - 0x5d, 0x0a, 0xa6, 0x0e, 0x72, 0x99, 0x37, 0x1e, 0xe4, 0x76, 0x20, 0xef, 0xd8, 0xd3, 0xc8, 0x41, - 0x2c, 0x75, 0x55, 0x45, 0x08, 0x9c, 0x6b, 0xcf, 0xb7, 0x27, 0x74, 0xe4, 0x4c, 0x3a, 0x4b, 0x92, - 0x49, 0x13, 0x4f, 0x70, 0x34, 0x45, 0x8f, 0x01, 0x4c, 0x3b, 0x08, 0x75, 0x32, 0xc2, 0xa4, 0xad, - 0x77, 0xd1, 0xf8, 0x6b, 0x25, 0x33, 0x9a, 0x8a, 0x87, 0xa0, 0x24, 0xd4, 0x36, 0x37, 0xb2, 0x9f, - 0xe4, 0xb5, 0x58, 0x9d, 0x6b, 0xba, 0x4d, 0x37, 0x5c, 0xa2, 0x44, 0x85, 0x6b, 0x63, 0x89, 0xb2, - 0x63, 0x5e, 0xa8, 0xff, 0xdb, 0x3b, 0x90, 0xeb, 0x79, 0xa6, 0xc5, 0x3e, 0x86, 0x12, 0x79, 0x20, - 0x27, 0x26, 0x58, 0xa8, 0xd5, 0x88, 0xa6, 0x3f, 0x34, 0x53, 0x45, 0x57, 0xfc, 0x7a, 0xbd, 0xcf, - 0xf2, 0x5d, 0x3a, 0x0e, 0xd2, 0xbd, 0x35, 0x76, 0xa9, 0x2c, 0x4c, 0x56, 0x64, 0x61, 0xe1, 0x18, - 0xdc, 0x5b, 0xe9, 0x66, 0xc2, 0xb7, 0x5c, 0xd2, 0xe1, 0xf3, 0x5a, 0x94, 0xa6, 0x43, 0xb8, 0xef, - 0xa1, 0xea, 0xc5, 0x77, 0xa0, 0xfc, 0x8a, 0x43, 0x38, 0xc7, 0xd3, 0x96, 0xf4, 0x31, 0x94, 0xbe, - 0xf3, 0x6c, 0x97, 0x37, 0x7c, 0x63, 0xa9, 0xe1, 0x78, 0xc6, 0xe1, 0x0d, 0xff, 0x4e, 0xfc, 0x62, - 0xf7, 0xa0, 0xe0, 0xb9, 0xbc, 0xec, 0xc2, 0x52, 0xd9, 0x1b, 0x9e, 0xdb, 0xe5, 0x2e, 0x68, 0x55, - 0x3b, 0xd0, 0x7d, 0x7b, 0x72, 0x1a, 0xea, 0x98, 0x53, 0xdc, 0x77, 0x97, 0xed, 0x40, 0x43, 0x18, - 0x16, 0x8b, 0x8c, 0x37, 0xb6, 0x1d, 0xd4, 0xf0, 0xa8, 0xb0, 0xd2, 0x52, 0x61, 0xc0, 0xd1, 0x54, - 0xe0, 0x3b, 0x50, 0x9c, 0xf8, 0x1e, 0x1e, 0x3b, 0x2e, 0xeb, 0xb0, 0x44, 0x59, 0x20, 0xdc, 0xee, - 0x25, 0xaa, 0x4f, 0xf4, 0xd3, 0x76, 0x27, 0x3a, 0xd9, 0x55, 0xca, 0x3b, 0xd9, 0x87, 0x45, 0xad, - 0x22, 0x81, 0x64, 0x31, 0x79, 0x07, 0x8a, 0xc6, 0x64, 0xa2, 0x0b, 0x4f, 0xba, 0xa5, 0xb2, 0x8c, - 0xc9, 0x84, 0xaa, 0x7c, 0x0c, 0xd5, 0x73, 0xdb, 0xd5, 0x83, 0x99, 0x35, 0xe2, 0xb4, 0xd5, 0xe5, - 0xa1, 0x3c, 0xb7, 0x5d, 0xe4, 0x6e, 0xa2, 0x4f, 0x2e, 0x83, 0xda, 0x8f, 0x5f, 0x06, 0x9b, 0xaf, - 0x5b, 0x06, 0x2a, 0x6c, 0x88, 0x5b, 0x0b, 0x65, 0x89, 0x44, 0x60, 0xd8, 0x27, 0x50, 0xf6, 0x0d, - 0xf7, 0x4c, 0x17, 0xce, 0x03, 0xdf, 0x26, 0x6d, 0x03, 0x9a, 0xe1, 0x9e, 0x09, 0xdf, 0x01, 0xf0, - 0xa3, 0xdf, 0x69, 0x95, 0x79, 0xeb, 0x0d, 0xa7, 0xaa, 0xc4, 0x61, 0x8d, 0xfd, 0xf0, 0x61, 0xed, - 0x33, 0x3a, 0x15, 0x59, 0x6e, 0xa8, 0xcb, 0x0c, 0x57, 0x56, 0x67, 0xa8, 0x70, 0xb2, 0x3e, 0xcf, - 0x86, 0x1d, 0x20, 0xdb, 0x9c, 0x4e, 0x86, 0xbc, 0xed, 0x54, 0x07, 0x22, 0xa3, 0x9d, 0x06, 0x7e, - 0x6c, 0xc0, 0x6b, 0xc0, 0x66, 0xec, 0xc0, 0xcc, 0xbd, 0xc6, 0xaf, 0x26, 0x6f, 0x27, 0x52, 0x1e, - 0xcf, 0xf2, 0x1c, 0x66, 0xa7, 0xdc, 0xa0, 0xef, 0x41, 0x95, 0x7b, 0xeb, 0xf0, 0x71, 0x0b, 0x48, - 0x49, 0x2a, 0x69, 0x15, 0x02, 0xf2, 0x71, 0x0a, 0x48, 0xc0, 0x88, 0xc3, 0x61, 0x78, 0x41, 0x5a, - 0x52, 0x2c, 0x60, 0xf8, 0x69, 0x30, 0xbc, 0xd0, 0x4a, 0xa6, 0xfc, 0x89, 0x9b, 0xff, 0x89, 0xed, - 0x9a, 0xc8, 0x7a, 0xa1, 0x31, 0x09, 0xea, 0x75, 0x5a, 0x99, 0x65, 0x01, 0x1b, 0x1a, 0x93, 0x80, - 0x7d, 0x0a, 0x15, 0x83, 0x1f, 0x36, 0x78, 0xbb, 0x6f, 0x24, 0x6d, 0x59, 0x89, 0x63, 0x88, 0x56, - 0x36, 0x12, 0x67, 0x92, 0x2f, 0x80, 0xc9, 0x4b, 0xd5, 0xc4, 0xc9, 0xff, 0xe6, 0x12, 0x37, 0x6e, - 0x8a, 0x5b, 0xd5, 0xe8, 0xdc, 0x7f, 0x07, 0xca, 0xe2, 0x82, 0x23, 0x08, 0xad, 0x59, 0xfd, 0x2d, - 0x6a, 0x10, 0x70, 0xd0, 0x20, 0xb4, 0x66, 0xec, 0x0b, 0xa8, 0xa6, 0x4f, 0x59, 0xb7, 0x56, 0xdc, - 0x4d, 0x12, 0x5b, 0x68, 0x95, 0x51, 0xf2, 0xdc, 0x75, 0x8f, 0x3b, 0xe2, 0x93, 0x86, 0x44, 0x19, - 0xf9, 0xfd, 0x5b, 0xc5, 0xf5, 0xc2, 0xa6, 0x84, 0xe1, 0x00, 0xca, 0x23, 0x79, 0x78, 0x41, 0x4a, - 0x55, 0x34, 0x80, 0xd1, 0xd1, 0x11, 0x0f, 0x47, 0xf2, 0x14, 0xd9, 0x02, 0x26, 0xaf, 0x53, 0x70, - 0x73, 0xe1, 0x9e, 0x28, 0xa4, 0x43, 0x45, 0xd7, 0x95, 0x8b, 0x7b, 0x8f, 0xc6, 0xbd, 0x76, 0x92, - 0xbb, 0xd1, 0x33, 0xa8, 0xcd, 0x7c, 0x4b, 0x4f, 0xd4, 0xac, 0x26, 0x3b, 0x75, 0xe4, 0x5b, 0x71, - 0xe5, 0x95, 0x59, 0x22, 0xc5, 0xbe, 0x82, 0xad, 0x44, 0xce, 0xf9, 0x19, 0x65, 0xbe, 0x47, 0x99, - 0xb7, 0x17, 0x32, 0x1f, 0x9f, 0x61, 0xf6, 0xda, 0x2c, 0x95, 0x66, 0xdb, 0x90, 0xef, 0x04, 0x6d, - 0xd7, 0x24, 0xdd, 0xaa, 0xa8, 0xf1, 0x04, 0x7b, 0x0a, 0x15, 0x7e, 0x90, 0x21, 0x67, 0xde, 0xa0, - 0xfe, 0x20, 0x69, 0xac, 0xa6, 0xd3, 0x0c, 0x21, 0xb4, 0xb2, 0x13, 0xfd, 0x0e, 0xd8, 0xe7, 0xb0, - 0xc5, 0x6f, 0x12, 0x92, 0x22, 0xf2, 0xdd, 0xe5, 0x29, 0x27, 0xa2, 0xbd, 0x58, 0x4e, 0x6a, 0x70, - 0xc3, 0x9f, 0xbb, 0x74, 0xb8, 0x11, 0x39, 0xb9, 0x8d, 0x8b, 0xf2, 0x3f, 0xa4, 0xfc, 0xd7, 0xc5, - 0xea, 0xe2, 0x64, 0x3c, 0x2f, 0xc9, 0xa6, 0x6b, 0x7e, 0x12, 0x74, 0x84, 0xf9, 0x5e, 0x53, 0x26, - 0xb7, 0xfd, 0x50, 0x99, 0xef, 0xfd, 0x94, 0x32, 0xc9, 0x2e, 0x44, 0x65, 0x32, 0xc8, 0xcd, 0xe7, - 0xb6, 0x49, 0x9a, 0x5e, 0x45, 0xa3, 0xdf, 0xec, 0x1d, 0xa8, 0xf9, 0xd6, 0x68, 0xee, 0x07, 0xf6, - 0x2b, 0x4b, 0x0f, 0x6c, 0xf7, 0x8c, 0x74, 0xbc, 0xa2, 0x56, 0x8d, 0xa0, 0x03, 0xdb, 0x3d, 0x43, - 0x91, 0x61, 0x5d, 0x84, 0x96, 0xef, 0xf2, 0x17, 0x0c, 0x1f, 0x24, 0x45, 0x46, 0x9b, 0x10, 0xb8, - 0xce, 0x35, 0xb0, 0xa2, 0xdf, 0x0b, 0x33, 0x1b, 0xf0, 0x99, 0x7d, 0xfc, 0xa3, 0x66, 0x76, 0x40, - 0x33, 0xfb, 0x00, 0x8a, 0xb6, 0x1b, 0x5a, 0xfe, 0x2b, 0xc3, 0xa9, 0x7f, 0xb4, 0x24, 0x8d, 0x23, - 0x1c, 0xbb, 0x0f, 0x85, 0xc0, 0xb1, 0x71, 0xbd, 0xd7, 0x3f, 0x5e, 0x22, 0x93, 0x28, 0xf6, 0x10, - 0x4a, 0xd1, 0x43, 0xbd, 0xfa, 0x27, 0x4b, 0x74, 0x31, 0x92, 0xdd, 0x86, 0xdc, 0x39, 0x32, 0xd4, - 0x93, 0xe5, 0xcb, 0x05, 0x84, 0xe3, 0xf6, 0x3d, 0x46, 0x9d, 0x9d, 0xb6, 0xef, 0xa7, 0x4b, 0xdb, - 0xf7, 0x9e, 0xed, 0x38, 0x7c, 0xfb, 0x1e, 0x8b, 0x5f, 0xb8, 0xf9, 0x51, 0x0e, 0xec, 0xc9, 0xa7, - 0xcb, 0x9b, 0x1f, 0xe2, 0x5e, 0xd0, 0x93, 0xc6, 0x72, 0x40, 0x16, 0x73, 0x6e, 0xf8, 0xff, 0x2c, - 0x39, 0x56, 0x69, 0x53, 0xba, 0x06, 0x41, 0x94, 0xc6, 0x03, 0x88, 0xb8, 0x2f, 0x40, 0xa5, 0xe9, - 0x73, 0xfe, 0xfe, 0x85, 0x43, 0x3a, 0xe6, 0x05, 0xfb, 0x18, 0xaa, 0xd2, 0x51, 0x0a, 0xab, 0x0b, - 0xea, 0x5f, 0x2c, 0xb5, 0x20, 0x4d, 0xc0, 0x5a, 0x50, 0x19, 0xa3, 0xee, 0x3e, 0xe5, 0xaa, 0x7c, - 0xfd, 0x19, 0x35, 0x64, 0x47, 0x6e, 0xac, 0xaf, 0x53, 0xf5, 0xb5, 0x54, 0x2e, 0xf6, 0x18, 0x98, - 0x3d, 0xe6, 0xf3, 0xb9, 0xe7, 0x7b, 0x53, 0xae, 0xae, 0xd7, 0xbf, 0x14, 0xd6, 0xad, 0x25, 0x0c, - 0x5d, 0x1f, 0x5a, 0xae, 0xa9, 0x4f, 0x03, 0xa1, 0x26, 0xfc, 0x82, 0xda, 0x29, 0x84, 0x57, 0xf4, - 0xa0, 0x57, 0x9a, 0x87, 0x91, 0xf6, 0x30, 0xe0, 0x5a, 0xc3, 0x97, 0x80, 0xec, 0xfa, 0x2a, 0xce, - 0xfa, 0x47, 0x3f, 0x98, 0x15, 0x69, 0x65, 0xd6, 0x67, 0x50, 0xe3, 0xa6, 0x55, 0xd2, 0xc8, 0x90, - 0x45, 0x7f, 0x99, 0x94, 0x5c, 0x49, 0xa3, 0xb3, 0x56, 0x31, 0x93, 0x26, 0xe8, 0x2f, 0x60, 0x53, - 0x5a, 0x87, 0x43, 0x61, 0x48, 0xfe, 0xe3, 0x64, 0xb5, 0x91, 0xf5, 0x55, 0xab, 0xce, 0xe5, 0x4f, - 0xaa, 0xf2, 0x29, 0x54, 0x69, 0x17, 0x8d, 0x5e, 0x4c, 0xfd, 0x8d, 0x95, 0x2f, 0xa6, 0x2a, 0x48, - 0x24, 0x53, 0x28, 0xfc, 0xe3, 0x75, 0x3a, 0x0a, 0xad, 0xfa, 0x57, 0x5c, 0xf8, 0x47, 0xc0, 0x66, - 0x68, 0xb1, 0xa7, 0x00, 0xc6, 0x6c, 0xe6, 0x5c, 0x72, 0xd6, 0xfc, 0x15, 0xb1, 0xe6, 0x76, 0x82, - 0x35, 0x1b, 0x88, 0x24, 0xde, 0x2c, 0x19, 0xf2, 0x27, 0x7b, 0x02, 0x95, 0x99, 0x17, 0x84, 0xba, - 0x39, 0x75, 0xa8, 0xff, 0x8d, 0xe4, 0xda, 0x3e, 0xf2, 0x82, 0xb0, 0x35, 0x75, 0xb0, 0x17, 0x30, - 0x8b, 0x7e, 0xb3, 0x2e, 0x5c, 0xf1, 0x5c, 0xdd, 0x9c, 0xcf, 0x1c, 0x7b, 0x84, 0x23, 0x60, 0x90, - 0xb3, 0x40, 0x7d, 0x97, 0x6a, 0xbc, 0x95, 0xa8, 0xb1, 0xef, 0xb6, 0x24, 0x91, 0xf0, 0xda, 0xdb, - 0xf2, 0x16, 0x41, 0x74, 0xce, 0xa4, 0x39, 0x88, 0xbc, 0x5c, 0x9b, 0x5c, 0x35, 0x20, 0xa8, 0x74, - 0x73, 0x7d, 0x06, 0x9b, 0x31, 0x15, 0x76, 0x30, 0xa8, 0xb7, 0x92, 0x9c, 0x9c, 0x70, 0x9b, 0xaf, - 0xca, 0x8c, 0x08, 0x0b, 0x68, 0xec, 0x3c, 0xc7, 0x99, 0xcf, 0x84, 0x28, 0xad, 0xb7, 0xc5, 0xd8, - 0x11, 0x90, 0x4b, 0xc9, 0xc4, 0x51, 0xdc, 0x9a, 0xd6, 0xf7, 0x92, 0x47, 0x71, 0x6b, 0x8a, 0x6a, - 0x86, 0x70, 0xe4, 0x7b, 0x65, 0x5b, 0xe7, 0x41, 0x7d, 0x9f, 0xbc, 0x2f, 0x85, 0x93, 0xf8, 0x0b, - 0x04, 0xe1, 0xbe, 0x6f, 0xda, 0x3e, 0x1e, 0x01, 0xc8, 0x9f, 0xec, 0x80, 0x7b, 0x19, 0x73, 0x10, - 0x52, 0xb0, 0x26, 0xd4, 0x49, 0x9c, 0x8b, 0xb5, 0x9a, 0xba, 0xb5, 0xeb, 0x2c, 0x2d, 0xc9, 0xab, - 0x48, 0xcb, 0x2f, 0x05, 0x8f, 0x12, 0xf7, 0x77, 0xbf, 0x82, 0xb7, 0x57, 0x17, 0x22, 0x1f, 0x94, - 0x7e, 0x4d, 0xfa, 0xc6, 0x8d, 0x15, 0xb9, 0x9b, 0xfc, 0x8d, 0xe9, 0x2f, 0xa0, 0x3a, 0x31, 0x68, - 0x24, 0x1c, 0x7d, 0xea, 0x99, 0x56, 0xfd, 0x79, 0xf2, 0xad, 0x27, 0x4d, 0xda, 0xbe, 0x81, 0x83, - 0xe2, 0x1c, 0x7a, 0xa6, 0xa5, 0x95, 0x27, 0x71, 0x82, 0x3d, 0x83, 0x7a, 0xcc, 0x84, 0x73, 0x17, - 0xeb, 0xc5, 0xb3, 0x9e, 0xed, 0x8e, 0xc2, 0x7a, 0x97, 0xc6, 0xf4, 0x5a, 0x84, 0x3f, 0x46, 0x74, - 0x4b, 0x60, 0x59, 0x13, 0x14, 0x12, 0x0e, 0x62, 0x17, 0x0b, 0x6c, 0xd3, 0xaa, 0x1f, 0x26, 0xdf, - 0x72, 0x71, 0xd1, 0x89, 0x24, 0xb4, 0x5f, 0x0d, 0x6c, 0xd3, 0xd2, 0x6a, 0xe3, 0x54, 0x9a, 0xbd, - 0x07, 0x5b, 0xf2, 0x3c, 0xa2, 0x9f, 0x1a, 0xc1, 0xa9, 0x7e, 0x66, 0x5d, 0xd6, 0x7b, 0xd4, 0xe1, - 0x9a, 0x38, 0x8c, 0x1c, 0x18, 0xc1, 0xe9, 0x73, 0xeb, 0x52, 0xfd, 0x77, 0xf3, 0x50, 0x94, 0x07, - 0x40, 0x56, 0x86, 0xc2, 0x71, 0xef, 0x79, 0xaf, 0xff, 0xb2, 0xc7, 0x5f, 0x8f, 0x36, 0x06, 0x83, - 0xb6, 0x36, 0x54, 0x4c, 0x56, 0x03, 0xa0, 0x17, 0x59, 0xfa, 0xa0, 0xd9, 0xe8, 0xf1, 0xd7, 0xa4, - 0xf4, 0x0e, 0x8c, 0xa7, 0xd7, 0xd9, 0x16, 0x54, 0xf7, 0x8e, 0x7b, 0xe4, 0x0f, 0xca, 0x41, 0x59, - 0x04, 0xb5, 0xbf, 0xe1, 0x37, 0xbf, 0x1c, 0x94, 0x43, 0xd0, 0x61, 0x63, 0xd8, 0xd6, 0x3a, 0x12, - 0x94, 0x67, 0x57, 0x61, 0x2b, 0xa2, 0x92, 0x25, 0x28, 0x05, 0x6c, 0xc8, 0x91, 0xd6, 0xff, 0xba, - 0xdd, 0x1c, 0x2a, 0x40, 0xb7, 0xc6, 0xfb, 0xfb, 0x4a, 0x99, 0x55, 0xa0, 0xd8, 0xea, 0x0c, 0x86, - 0x9d, 0x5e, 0x73, 0xa8, 0x54, 0xb0, 0x7d, 0x7b, 0x9d, 0xee, 0xb0, 0xad, 0x29, 0x55, 0x56, 0x84, - 0xdc, 0xd7, 0xfd, 0x4e, 0x4f, 0xa9, 0xd1, 0x43, 0xb4, 0xc6, 0xe1, 0x51, 0xb7, 0xad, 0x6c, 0x22, - 0x74, 0xd0, 0xd7, 0x86, 0x8a, 0x82, 0xd0, 0x97, 0x9d, 0x5e, 0xab, 0xff, 0x52, 0xd9, 0x62, 0x25, - 0xc8, 0x1f, 0xf7, 0xb0, 0x1a, 0xc6, 0xaa, 0x50, 0xa2, 0x9f, 0x7a, 0xa3, 0xdb, 0x55, 0xae, 0x24, - 0xae, 0x9a, 0xb7, 0x11, 0x45, 0x17, 0xd7, 0x03, 0x6c, 0xc3, 0x55, 0x6c, 0x7a, 0x94, 0x24, 0xea, - 0x6b, 0x58, 0xce, 0x61, 0xa7, 0x77, 0x3c, 0x50, 0xae, 0x23, 0x31, 0xfd, 0x24, 0x4c, 0x1d, 0xcb, - 0xe9, 0xf4, 0x68, 0xe4, 0x6e, 0xe3, 0xef, 0x56, 0xbb, 0xdb, 0x1e, 0xb6, 0x95, 0x3b, 0xd8, 0xab, - 0x6e, 0xbf, 0xf9, 0x5c, 0xef, 0x1f, 0x29, 0x77, 0x71, 0x08, 0x8f, 0xb4, 0xb6, 0x2e, 0x08, 0xef, - 0x31, 0x05, 0x2a, 0x7b, 0xc7, 0xbf, 0xf9, 0xcd, 0xb7, 0xba, 0xe8, 0xd4, 0x3b, 0x58, 0x67, 0x4c, - 0xa1, 0x1f, 0x3f, 0x57, 0x1e, 0x2c, 0x80, 0x06, 0xcf, 0x95, 0x77, 0x71, 0x50, 0xe4, 0xa0, 0x2a, - 0x0f, 0x91, 0x40, 0x6b, 0x37, 0x8f, 0xb5, 0x41, 0xe7, 0x45, 0x5b, 0x6f, 0x0e, 0xdb, 0xca, 0x7b, - 0x34, 0x0a, 0x9d, 0xde, 0x73, 0xe5, 0x11, 0x36, 0x13, 0x7f, 0xf1, 0xb1, 0x7f, 0x9f, 0x31, 0xa8, - 0xc5, 0xb4, 0x04, 0xfb, 0x00, 0x49, 0x76, 0xb5, 0x7e, 0xa3, 0xd5, 0x6c, 0x0c, 0x86, 0xca, 0x87, - 0xd8, 0xc7, 0xc1, 0x51, 0xb7, 0x33, 0x54, 0x1e, 0x63, 0x47, 0xf6, 0x1b, 0xc3, 0x83, 0xb6, 0xa6, - 0x7c, 0xc4, 0x36, 0xa1, 0x3c, 0xec, 0x1c, 0xb6, 0x75, 0x31, 0xa6, 0x4f, 0xb0, 0x8e, 0xbd, 0x4e, - 0xb7, 0xab, 0x3c, 0xa5, 0xab, 0xd2, 0x86, 0x36, 0xec, 0xd0, 0x44, 0x7e, 0x8a, 0x05, 0x34, 0x8e, - 0x8e, 0xba, 0xdf, 0x2a, 0x9f, 0x61, 0x07, 0x0f, 0x8f, 0xbb, 0xc3, 0x8e, 0x7e, 0x7c, 0xd4, 0x6a, - 0x0c, 0xdb, 0xca, 0xe7, 0x34, 0xcb, 0xfd, 0xc1, 0xb0, 0x75, 0xd8, 0x55, 0xbe, 0xa0, 0x32, 0x89, - 0xa5, 0x9a, 0xdd, 0x7e, 0xaf, 0xad, 0x3c, 0x53, 0x73, 0xc5, 0x0d, 0x65, 0x43, 0xcd, 0x15, 0x77, - 0x94, 0x1d, 0x35, 0x57, 0x54, 0x15, 0xf5, 0x51, 0x79, 0xd0, 0x3f, 0xd6, 0x9a, 0xbc, 0xad, 0xea, - 0xdf, 0x82, 0xa2, 0x3c, 0xff, 0x63, 0x2d, 0x9d, 0x5e, 0xaf, 0xad, 0x29, 0x6b, 0xd8, 0x92, 0x6e, - 0x7b, 0x6f, 0xa8, 0x64, 0xe8, 0x5a, 0xb9, 0xb3, 0x7f, 0x30, 0x54, 0xd6, 0xf1, 0x67, 0xff, 0x18, - 0x07, 0x35, 0x4b, 0xa3, 0xd1, 0x3e, 0xec, 0x28, 0x39, 0xfc, 0xd5, 0xe8, 0x0d, 0x3b, 0x4a, 0x9e, - 0x78, 0xa6, 0xd3, 0xdb, 0xef, 0xb6, 0x95, 0x0d, 0x84, 0x1e, 0x36, 0xb4, 0xe7, 0x4a, 0x81, 0x17, - 0xda, 0x6a, 0x7f, 0xa3, 0x14, 0xd9, 0x06, 0xac, 0x77, 0x9f, 0x28, 0x25, 0x04, 0xb5, 0xda, 0xad, - 0xe3, 0x23, 0x05, 0xd4, 0x87, 0x50, 0x68, 0x4c, 0x26, 0xb4, 0xd8, 0xb1, 0xf3, 0xc7, 0xdd, 0x2e, - 0x5f, 0x32, 0xbb, 0xfd, 0xe1, 0xb0, 0x7f, 0xa8, 0x64, 0x90, 0x6b, 0x87, 0xfd, 0x23, 0x65, 0x5d, - 0xed, 0x40, 0x51, 0x6a, 0x3a, 0x89, 0x87, 0x95, 0x45, 0xc8, 0x1d, 0x69, 0xed, 0x17, 0xdc, 0x17, - 0xa2, 0xd7, 0xfe, 0x06, 0x9b, 0x89, 0xbf, 0xb0, 0xa0, 0x2c, 0x56, 0xc4, 0x5f, 0x40, 0xd2, 0xcb, - 0xca, 0x6e, 0xa7, 0xd7, 0x6e, 0x68, 0x4a, 0x5e, 0x7d, 0x06, 0xe5, 0x84, 0xc8, 0xc1, 0xc9, 0xde, - 0x6f, 0x1c, 0x21, 0xc3, 0x74, 0x75, 0x51, 0xec, 0x35, 0x60, 0x11, 0x28, 0x9e, 0x87, 0x8c, 0xfa, - 0x19, 0x6c, 0x2d, 0xed, 0x30, 0xd4, 0xf0, 0x46, 0x47, 0x34, 0xbc, 0xb3, 0xdf, 0xeb, 0x6b, 0x6d, - 0xfe, 0xc8, 0x53, 0xcc, 0xd0, 0xba, 0xfa, 0x3e, 0x94, 0xa2, 0xad, 0x10, 0x39, 0xb6, 0xa9, 0xf5, - 0x07, 0x03, 0x3e, 0xa1, 0x6b, 0x98, 0xa6, 0x51, 0xe5, 0xe9, 0x8c, 0x6a, 0x43, 0x2d, 0x2d, 0x97, - 0xd8, 0x0e, 0xdc, 0xe2, 0x3c, 0xbd, 0x7b, 0xdc, 0xe9, 0xb6, 0xf4, 0x41, 0xa7, 0xd5, 0xd6, 0x8f, - 0x7b, 0x83, 0xa3, 0x76, 0xb3, 0xb3, 0xd7, 0x69, 0xb7, 0x94, 0x35, 0x76, 0x13, 0xae, 0x2d, 0x51, - 0xf0, 0x17, 0xa6, 0x19, 0x76, 0x03, 0xae, 0x2e, 0xe1, 0x88, 0x93, 0xd7, 0xbf, 0xce, 0x15, 0xef, - 0x28, 0x3b, 0x5f, 0xe7, 0x8a, 0xf7, 0x95, 0x77, 0xd4, 0x01, 0x6c, 0xc9, 0xcd, 0x9f, 0xde, 0xb2, - 0xd0, 0xa9, 0x74, 0x1b, 0xf2, 0x5d, 0xeb, 0x95, 0xe5, 0xc8, 0x47, 0x19, 0x94, 0x40, 0x68, 0xff, - 0xe4, 0xbb, 0x4e, 0x14, 0x8c, 0x80, 0x12, 0xa8, 0xed, 0xf7, 0x12, 0xf1, 0x10, 0xe8, 0x09, 0xef, - 0x3f, 0x9f, 0x81, 0x62, 0xa4, 0x52, 0xdc, 0x87, 0xf5, 0xe1, 0x40, 0xdc, 0x1f, 0x6e, 0x3f, 0x8e, - 0xc3, 0xbf, 0x0c, 0xe5, 0x2f, 0x6d, 0x7d, 0x38, 0x60, 0x1f, 0xc0, 0x06, 0x7f, 0x92, 0x2d, 0x6c, - 0x87, 0xdb, 0x69, 0x35, 0x65, 0x48, 0x38, 0x4d, 0xd0, 0xb0, 0xcf, 0xa0, 0x14, 0xb5, 0x56, 0x18, - 0xd3, 0xae, 0xa7, 0x33, 0x44, 0x68, 0x2d, 0xa6, 0x54, 0xbb, 0x50, 0x4b, 0x17, 0xc8, 0x6e, 0x03, - 0xf0, 0x22, 0x13, 0x16, 0xe3, 0x04, 0x84, 0xdd, 0x04, 0xf9, 0x52, 0xbc, 0x45, 0x0d, 0xab, 0x46, - 0x2f, 0xc7, 0x5b, 0xea, 0x9f, 0xe6, 0x00, 0xe2, 0x43, 0x09, 0x0e, 0x44, 0x64, 0x22, 0xcc, 0x0b, - 0x97, 0x8a, 0xb7, 0xa0, 0xe4, 0x78, 0x86, 0x99, 0x8c, 0xfe, 0x52, 0x44, 0x00, 0x71, 0x44, 0xf2, - 0x4d, 0x63, 0x89, 0xfb, 0x33, 0xb1, 0x6b, 0xb0, 0x31, 0xf6, 0xfc, 0xa9, 0x11, 0x8a, 0x17, 0x38, - 0x22, 0x85, 0xba, 0x05, 0xbf, 0xa9, 0xc5, 0xa3, 0x99, 0x4b, 0x8f, 0x70, 0x70, 0x0e, 0x2a, 0x02, - 0xd8, 0x45, 0x18, 0xea, 0x06, 0x96, 0x3b, 0x72, 0xbc, 0xc0, 0x32, 0x71, 0xb7, 0xdf, 0xa0, 0xf3, - 0x17, 0x48, 0xd0, 0xee, 0x25, 0xef, 0xad, 0x3f, 0xb5, 0x5d, 0x23, 0x14, 0x77, 0x86, 0xd4, 0x5b, - 0x09, 0xc1, 0xe6, 0x7e, 0x17, 0x78, 0xc2, 0x62, 0xc8, 0x1f, 0xf0, 0x15, 0x11, 0x40, 0xcd, 0x7d, - 0x1b, 0xc0, 0x0a, 0x46, 0xc6, 0x8c, 0x17, 0x5e, 0xe2, 0xaf, 0xa8, 0x05, 0x64, 0xf7, 0x92, 0x75, - 0xa1, 0x36, 0x3c, 0x41, 0x5d, 0xc8, 0x6b, 0x19, 0xa1, 0xd1, 0xf4, 0x1c, 0x61, 0xcb, 0xbb, 0xbf, - 0x78, 0x7a, 0x7b, 0x9c, 0x26, 0xe3, 0x9e, 0xc5, 0x0b, 0x79, 0xd9, 0xa7, 0x50, 0xb1, 0x47, 0xd6, - 0x89, 0xe5, 0x4f, 0xf8, 0x49, 0xb0, 0x9c, 0x7a, 0x3a, 0xc3, 0x31, 0x74, 0x14, 0x2c, 0xdb, 0x71, - 0x02, 0x75, 0xcc, 0xa9, 0xe7, 0x4e, 0x3c, 0xf3, 0x84, 0xe7, 0xaa, 0x24, 0xed, 0x12, 0x87, 0x88, - 0xe1, 0x79, 0x04, 0x11, 0x26, 0x6e, 0x36, 0xe0, 0xca, 0x8a, 0x06, 0xfd, 0x24, 0x77, 0xd6, 0xff, - 0x6c, 0x1d, 0xca, 0x89, 0x36, 0xd1, 0x45, 0x8f, 0x31, 0x23, 0x43, 0x65, 0xe4, 0xcf, 0x5f, 0x12, - 0x10, 0xfe, 0xb8, 0x69, 0x64, 0x84, 0x86, 0xe3, 0x4d, 0x12, 0xcf, 0xb6, 0x04, 0xa4, 0x63, 0xd2, - 0xdd, 0xab, 0x31, 0xb5, 0x82, 0x99, 0x31, 0x92, 0xab, 0x2a, 0x06, 0xc4, 0xa1, 0x8a, 0x72, 0xc9, - 0x50, 0x45, 0x0a, 0xbf, 0xa4, 0xe7, 0x7e, 0x51, 0x74, 0x27, 0x7f, 0x07, 0xca, 0x52, 0xf1, 0xc7, - 0x5a, 0xc4, 0x3d, 0xb2, 0x04, 0x75, 0x4c, 0xf6, 0x00, 0xe2, 0x50, 0x4c, 0xba, 0x11, 0xe8, 0xde, - 0x58, 0x3a, 0x65, 0x46, 0xe0, 0x46, 0xd0, 0x1f, 0x47, 0x97, 0x3b, 0xa4, 0xc4, 0x09, 0x9e, 0x40, - 0x00, 0xc9, 0xd0, 0xc7, 0x70, 0x45, 0x58, 0x9c, 0x2d, 0x53, 0x1f, 0xdb, 0x96, 0x63, 0xea, 0xb6, - 0xc9, 0x9d, 0x26, 0xf2, 0xda, 0x56, 0x84, 0xda, 0x43, 0x4c, 0xc7, 0x24, 0x15, 0x59, 0x98, 0x19, - 0x4c, 0x7b, 0x62, 0x05, 0xa1, 0x70, 0x21, 0xac, 0x70, 0x60, 0x8b, 0x60, 0xea, 0x3f, 0xcc, 0x41, - 0x29, 0x9a, 0xac, 0x37, 0x0d, 0xe6, 0x3d, 0xa8, 0x8e, 0x3c, 0xd7, 0xb5, 0x48, 0x26, 0xc7, 0xe3, - 0x59, 0x89, 0x81, 0xe4, 0xb7, 0xcd, 0x12, 0x44, 0xf2, 0x55, 0x02, 0x7f, 0x7b, 0xb4, 0x15, 0x63, - 0x5e, 0x88, 0xf7, 0x09, 0x37, 0xa1, 0x88, 0x8b, 0xf1, 0xc4, 0x08, 0xe4, 0x30, 0x47, 0x69, 0x5c, - 0x42, 0x23, 0xcf, 0x71, 0x78, 0x06, 0x19, 0x72, 0x23, 0x86, 0xb0, 0x27, 0x14, 0x74, 0x85, 0xde, - 0x4e, 0x6d, 0x10, 0xff, 0xd7, 0x13, 0xdc, 0xc7, 0x9f, 0x4f, 0x1d, 0xf2, 0xc6, 0x6b, 0x92, 0x90, - 0x7d, 0x05, 0xca, 0x6c, 0x1e, 0x9c, 0x5a, 0xa6, 0x3e, 0xf3, 0x2d, 0x93, 0xf6, 0x18, 0xf1, 0xc2, - 0x62, 0x3b, 0x91, 0xf9, 0x48, 0xe2, 0xb4, 0x4d, 0x4e, 0x1d, 0x01, 0xd8, 0xbb, 0xb0, 0x19, 0x4f, - 0xc3, 0xcc, 0x08, 0x4f, 0xb9, 0xbf, 0x4b, 0x49, 0xab, 0x45, 0xe0, 0x23, 0x84, 0xb2, 0x4f, 0xe1, - 0x9a, 0x6f, 0x05, 0xb6, 0x39, 0x37, 0x1c, 0x3d, 0x3d, 0x11, 0x3c, 0x80, 0xc7, 0xb6, 0xc4, 0xee, - 0x25, 0x26, 0x04, 0x8b, 0x9f, 0x1a, 0x17, 0x64, 0xb3, 0x73, 0x1c, 0xcb, 0xb1, 0x83, 0x29, 0xcd, - 0x5b, 0x5e, 0xab, 0x4d, 0x8d, 0x8b, 0xa3, 0x18, 0x4a, 0xee, 0x6e, 0x33, 0xc7, 0x5e, 0x78, 0xe9, - 0xce, 0xe7, 0x12, 0xe1, 0x1a, 0x47, 0x33, 0x15, 0xaa, 0x58, 0x20, 0x1d, 0x4f, 0x23, 0x0f, 0x96, - 0xac, 0x56, 0x9e, 0x1a, 0x64, 0xc7, 0xa5, 0x0b, 0xcd, 0xfb, 0x50, 0x8b, 0x68, 0xb8, 0x97, 0x82, - 0x70, 0x14, 0x10, 0x44, 0xdc, 0x51, 0x81, 0x9a, 0xc6, 0xb9, 0x43, 0x4e, 0x6b, 0x8d, 0xbf, 0x03, - 0x10, 0x60, 0x39, 0xa7, 0x37, 0x80, 0x5b, 0xbe, 0x91, 0x45, 0x36, 0x89, 0xa2, 0x40, 0xe9, 0x8e, - 0xa9, 0xfe, 0xb3, 0x19, 0x60, 0xcb, 0xd3, 0xf3, 0xba, 0x17, 0x6d, 0x38, 0xbc, 0xf2, 0x39, 0x0e, - 0xfe, 0x66, 0xef, 0x41, 0x61, 0xea, 0x71, 0x91, 0x99, 0x7d, 0xcd, 0xfb, 0xea, 0x8d, 0xa9, 0x47, - 0x22, 0xf4, 0x5d, 0xd8, 0x1c, 0x79, 0xae, 0x68, 0x28, 0x5f, 0x51, 0x9c, 0xbf, 0x6a, 0x31, 0x18, - 0xd7, 0x95, 0xfa, 0x1f, 0x66, 0xa0, 0x96, 0x9e, 0x74, 0xf6, 0x80, 0xe2, 0xdd, 0xa4, 0x22, 0xe6, - 0xa4, 0x29, 0xfa, 0x33, 0x8a, 0x83, 0xb3, 0xaa, 0x89, 0x6f, 0x03, 0x90, 0xb4, 0xd2, 0x4f, 0x02, - 0xc1, 0xf7, 0x15, 0xad, 0x44, 0x90, 0xdd, 0xc0, 0xa3, 0x0b, 0x5e, 0x1e, 0xd2, 0x8c, 0xe3, 0x73, - 0x3b, 0x59, 0xdc, 0x37, 0x38, 0x88, 0x08, 0x3e, 0x4e, 0x5c, 0x4a, 0xf1, 0x4b, 0xa7, 0xd5, 0x8c, - 0x19, 0x51, 0xa9, 0x7f, 0x91, 0x01, 0x88, 0xe7, 0x1d, 0x47, 0xff, 0xcc, 0xba, 0x24, 0xd6, 0x14, - 0xe3, 0x59, 0x38, 0xb3, 0x2e, 0x8f, 0x44, 0xdb, 0xc4, 0x85, 0x66, 0x20, 0x9c, 0x68, 0x2b, 0x5a, - 0x89, 0xdf, 0x61, 0x06, 0xfc, 0x49, 0xa4, 0xb8, 0xc2, 0x4c, 0x34, 0x9d, 0xdf, 0x5a, 0x06, 0xf4, - 0x94, 0x68, 0x93, 0xe7, 0xa6, 0x17, 0x8a, 0x78, 0x20, 0x14, 0x8f, 0x3f, 0xf9, 0x95, 0x6b, 0x47, - 0x42, 0x91, 0x90, 0x97, 0x13, 0x13, 0x72, 0xaf, 0x36, 0x7e, 0xc1, 0x1a, 0x11, 0xaa, 0x8e, 0xdc, - 0xd4, 0x1b, 0x61, 0x48, 0xcf, 0xba, 0x23, 0x6b, 0x41, 0x46, 0xbe, 0xf8, 0xe4, 0x86, 0x82, 0xb7, - 0xc8, 0xf9, 0x57, 0x3c, 0xa1, 0x11, 0x7b, 0x7b, 0xf4, 0x34, 0xe6, 0x01, 0xce, 0xb4, 0x23, 0x45, - 0x22, 0x91, 0xf0, 0xa7, 0xbe, 0xd5, 0x91, 0xe7, 0x70, 0x71, 0x88, 0x40, 0xf5, 0x5f, 0xcc, 0x03, - 0xc4, 0x76, 0xe2, 0x14, 0x97, 0x66, 0x52, 0x5c, 0xca, 0x9e, 0xc0, 0x35, 0xf1, 0x66, 0x3d, 0xf2, - 0x2a, 0xb4, 0x5d, 0xfd, 0xc4, 0x90, 0x5e, 0xcc, 0x4c, 0x60, 0xb9, 0xbf, 0x58, 0xc7, 0xdd, 0x35, - 0x42, 0xf6, 0x0c, 0xe5, 0x42, 0x9c, 0x27, 0xbc, 0x9c, 0xbd, 0x96, 0x45, 0xab, 0x71, 0xf6, 0xe1, - 0xe5, 0x8c, 0x7d, 0x0c, 0x57, 0x7d, 0x6b, 0xec, 0x5b, 0xc1, 0xa9, 0x1e, 0x06, 0xc9, 0xca, 0xf8, - 0x33, 0x83, 0x2d, 0x81, 0x1c, 0x06, 0x51, 0x5d, 0x1f, 0xc3, 0x55, 0x21, 0x51, 0x16, 0x9a, 0xc7, - 0x2f, 0x62, 0xb7, 0x38, 0x32, 0xd9, 0x3a, 0x9a, 0x79, 0x32, 0x9e, 0xcb, 0xd0, 0x7b, 0x45, 0x9c, - 0x79, 0x1c, 0x0c, 0x11, 0x64, 0x86, 0x2c, 0xe0, 0x24, 0x9a, 0x8a, 0x1a, 0x4f, 0x30, 0x15, 0x72, - 0xb8, 0x42, 0x48, 0x00, 0xd5, 0x9e, 0xd4, 0x1e, 0x53, 0x68, 0x41, 0x0a, 0x10, 0xe4, 0x99, 0x96, - 0x46, 0x38, 0xf6, 0x21, 0xee, 0x4a, 0x71, 0xb7, 0x65, 0x74, 0x2c, 0xee, 0x58, 0xa7, 0xc4, 0x1d, - 0xd5, 0x78, 0x9c, 0xac, 0xf7, 0x81, 0x25, 0x5a, 0x2e, 0xa9, 0x2b, 0x44, 0xbd, 0x19, 0x35, 0x5b, - 0x10, 0xbf, 0x0b, 0xd4, 0xc4, 0xd8, 0x87, 0x6e, 0xc1, 0x5c, 0x8c, 0x48, 0xe1, 0x77, 0x77, 0x35, - 0xee, 0x9d, 0x6e, 0x84, 0x7a, 0x78, 0x6a, 0xe9, 0x96, 0x6b, 0x92, 0x7c, 0x2a, 0x6a, 0x5b, 0x51, - 0x47, 0x1b, 0xe1, 0xf0, 0xd4, 0x6a, 0xbb, 0x66, 0xf2, 0x42, 0x6e, 0xf3, 0x87, 0x2f, 0xe4, 0x3e, - 0x87, 0x7a, 0xda, 0x24, 0x93, 0x18, 0x6e, 0x1e, 0xa8, 0x63, 0x3b, 0xe9, 0x9c, 0x18, 0x8d, 0xf8, - 0x23, 0xd8, 0x3a, 0x35, 0x82, 0xb4, 0x39, 0x87, 0xee, 0x09, 0x8b, 0xda, 0xe6, 0xa9, 0x11, 0x24, - 0x6d, 0x38, 0xea, 0xdf, 0x5b, 0x87, 0x5a, 0xda, 0x72, 0xce, 0x5f, 0x3f, 0xf3, 0xbd, 0x2d, 0x43, - 0x3b, 0x7c, 0xb4, 0x83, 0xbd, 0x05, 0x25, 0xee, 0xc1, 0x38, 0x9f, 0xba, 0x72, 0x2d, 0xcc, 0xce, - 0xb8, 0x3c, 0x45, 0x01, 0x39, 0x3b, 0x7b, 0x83, 0x80, 0x9c, 0xf1, 0xa7, 0x5f, 0xef, 0x41, 0x61, - 0x7e, 0x16, 0x87, 0xe0, 0x59, 0x49, 0x3a, 0x3f, 0x13, 0x3e, 0x14, 0x37, 0x84, 0xcd, 0x5f, 0xb8, - 0x37, 0x4e, 0xe7, 0x4e, 0x68, 0xeb, 0x64, 0x92, 0x13, 0x4b, 0xfb, 0x1a, 0x27, 0xe8, 0x10, 0x9e, - 0x9e, 0xa2, 0x90, 0x9d, 0x15, 0xe5, 0x9d, 0x78, 0x70, 0x1a, 0xed, 0xd3, 0x79, 0x0d, 0xf8, 0x03, - 0x53, 0xea, 0xce, 0x7b, 0xa0, 0x8c, 0x3c, 0x77, 0xec, 0xd8, 0xa3, 0x30, 0xa2, 0x2a, 0x10, 0xd5, - 0xa6, 0x84, 0x4b, 0xd2, 0x77, 0xa0, 0x26, 0xbc, 0xfe, 0x24, 0x21, 0x7f, 0x5f, 0x51, 0xe5, 0x50, - 0xf9, 0x60, 0xfa, 0x3f, 0x5f, 0x87, 0x4a, 0xf2, 0x7a, 0xea, 0xc7, 0xb8, 0x55, 0xfe, 0x24, 0x1f, - 0xd9, 0x1d, 0x7a, 0xca, 0xa1, 0xd3, 0x4b, 0x30, 0x9c, 0x55, 0xee, 0x53, 0x09, 0xa7, 0x46, 0xd0, - 0x98, 0x87, 0xb8, 0xb3, 0x91, 0xda, 0xe9, 0x39, 0xf2, 0xb5, 0x1c, 0x5f, 0xc7, 0x28, 0xc1, 0xc4, - 0x43, 0xb9, 0x8f, 0xc5, 0x63, 0x5c, 0x7a, 0xc8, 0x4f, 0xaf, 0x1e, 0xf2, 0x4b, 0xdc, 0x5d, 0x91, - 0xef, 0xf8, 0xe9, 0x95, 0xc7, 0x13, 0xd8, 0x8c, 0x9f, 0x3e, 0xf2, 0x2c, 0x1b, 0x4b, 0x59, 0xaa, - 0xd1, 0xbb, 0x47, 0x11, 0x64, 0xa8, 0x6a, 0x07, 0xba, 0xe7, 0x98, 0xf2, 0x09, 0x76, 0x41, 0x3a, - 0x0f, 0xf4, 0x1d, 0x53, 0x44, 0x8f, 0xe0, 0x34, 0xae, 0x75, 0x2e, 0x69, 0x22, 0x07, 0x83, 0x9e, - 0x75, 0x2e, 0x9e, 0x62, 0xff, 0x47, 0x59, 0xd8, 0x5a, 0xba, 0x91, 0x42, 0x35, 0x38, 0x0e, 0xc0, - 0x89, 0x3f, 0xd9, 0x5d, 0xa8, 0x4c, 0x8d, 0x70, 0x74, 0x8a, 0x9a, 0xd5, 0xd8, 0xbe, 0x90, 0x51, - 0x44, 0x09, 0x76, 0x44, 0x20, 0xe4, 0x06, 0xbe, 0x33, 0xf0, 0x3b, 0x7b, 0x2e, 0xa6, 0xf9, 0xa6, - 0xd3, 0xa5, 0xcb, 0x7a, 0xf9, 0x0a, 0x24, 0xf7, 0x9a, 0x57, 0x20, 0x37, 0xa1, 0xe4, 0x7a, 0xe4, - 0xf1, 0x3b, 0x3b, 0x13, 0x9c, 0x57, 0x70, 0xbd, 0xb0, 0xef, 0x1e, 0x9d, 0xb1, 0x27, 0x70, 0x75, - 0x1e, 0x90, 0x93, 0xdc, 0x89, 0xe5, 0x07, 0xa7, 0x76, 0x64, 0x1b, 0xe6, 0xe2, 0xee, 0xca, 0x3c, - 0xb0, 0x0e, 0x23, 0x9c, 0x30, 0x11, 0x37, 0xa0, 0x42, 0x73, 0xe0, 0x8e, 0x3c, 0xba, 0x6d, 0x2a, - 0x90, 0xa8, 0xbb, 0xbd, 0xe2, 0x1a, 0xee, 0xb9, 0x75, 0xd9, 0x16, 0x54, 0x1a, 0xb2, 0xb4, 0x4c, - 0xb0, 0xf7, 0xe8, 0x81, 0xdf, 0x89, 0x15, 0x9f, 0xe4, 0x52, 0x4b, 0x49, 0x2b, 0x11, 0x96, 0xd6, - 0xd1, 0x73, 0xb8, 0xc1, 0x17, 0xc3, 0x74, 0xe6, 0xb9, 0x96, 0x1b, 0xea, 0x71, 0xc6, 0x20, 0xed, - 0xb8, 0x91, 0x58, 0x84, 0xd7, 0x68, 0xb1, 0x88, 0x1c, 0x47, 0xb2, 0x2c, 0x5c, 0x38, 0xc0, 0x2d, - 0xaf, 0x34, 0x60, 0xb0, 0x7c, 0xfd, 0x45, 0x58, 0xfc, 0xa9, 0xde, 0x82, 0x8d, 0x4e, 0x74, 0x5f, - 0x18, 0x39, 0xd7, 0x67, 0x45, 0x80, 0x41, 0x0f, 0x4a, 0xdc, 0x90, 0x7c, 0x68, 0xcc, 0xd8, 0x23, - 0xc8, 0x4e, 0x8d, 0x99, 0xf0, 0x3f, 0xaa, 0x47, 0x4e, 0x5a, 0x1c, 0xfb, 0xf8, 0xd0, 0x98, 0xf1, - 0x33, 0x24, 0x12, 0xdd, 0xfc, 0x1c, 0x8a, 0x12, 0xf0, 0xd3, 0x9e, 0x24, 0xae, 0x43, 0xa9, 0x95, - 0xbc, 0xef, 0x47, 0xbd, 0x33, 0xf4, 0xe7, 0x2e, 0x69, 0xe3, 0x22, 0x94, 0xda, 0xc8, 0x70, 0x87, - 0x02, 0x24, 0x17, 0xf0, 0xfa, 0x0f, 0x2c, 0xe0, 0x5b, 0x00, 0x3e, 0x5d, 0x97, 0xd1, 0x8d, 0x59, - 0x36, 0x7a, 0x6c, 0xd4, 0x31, 0x3b, 0xe6, 0xc5, 0x6a, 0xaf, 0xe9, 0xdc, 0x8f, 0xf7, 0x9a, 0xce, - 0xaf, 0xf4, 0x9a, 0x7e, 0x10, 0x6f, 0xf9, 0x38, 0xad, 0x58, 0x71, 0x89, 0x0b, 0xa4, 0x59, 0xf4, - 0xc0, 0x1a, 0x6b, 0xff, 0x05, 0xd4, 0x64, 0xef, 0x44, 0x79, 0x90, 0x7a, 0xd3, 0x2d, 0x70, 0xdc, - 0x41, 0xa0, 0x1a, 0x26, 0x93, 0x69, 0xc1, 0x54, 0x7e, 0x83, 0x67, 0xf6, 0xbf, 0x9c, 0x01, 0x26, - 0xae, 0x77, 0xf6, 0xe6, 0x8e, 0x33, 0xb4, 0x2e, 0x48, 0xfe, 0x3d, 0x82, 0x2d, 0xe1, 0xbf, 0x90, - 0x88, 0xca, 0x21, 0x3c, 0xf6, 0x38, 0x22, 0xf6, 0xd8, 0x5b, 0x15, 0xc0, 0x63, 0x7d, 0x65, 0x00, - 0x8f, 0xd5, 0x81, 0x41, 0xee, 0x40, 0x39, 0x19, 0xfe, 0x82, 0xab, 0xdc, 0x60, 0x44, 0x91, 0x2f, - 0xd4, 0xff, 0x7e, 0x1d, 0x20, 0xbe, 0x82, 0xfa, 0x43, 0xbb, 0xbc, 0xaf, 0x98, 0x92, 0xec, 0xaa, - 0x29, 0x79, 0x08, 0x4a, 0x92, 0x2e, 0x11, 0x87, 0xa5, 0x16, 0x13, 0x4a, 0xd5, 0xd3, 0x0e, 0x92, - 0x01, 0x30, 0xe8, 0x0d, 0xac, 0xf0, 0x12, 0xe6, 0x48, 0xbe, 0xf5, 0x09, 0x31, 0x53, 0xb4, 0x03, - 0xbe, 0xf3, 0xd0, 0xae, 0x29, 0x73, 0xea, 0xe7, 0x76, 0x78, 0xea, 0xcd, 0x43, 0x21, 0x92, 0x02, - 0x21, 0x8b, 0xaf, 0xc9, 0x92, 0x5e, 0x72, 0x34, 0x17, 0x35, 0x01, 0xfb, 0x0c, 0x4a, 0xe3, 0xb9, - 0xe3, 0xe8, 0xa1, 0x75, 0x11, 0x0a, 0x91, 0x52, 0x4f, 0xdd, 0xde, 0x25, 0xa6, 0x57, 0x2b, 0x8e, - 0x45, 0x42, 0xfd, 0xa7, 0xf3, 0x90, 0xff, 0xf5, 0xdc, 0xf2, 0x2f, 0xd9, 0xe7, 0x50, 0x0a, 0xc2, - 0x69, 0x98, 0x74, 0xa4, 0x13, 0xb7, 0x32, 0x84, 0x27, 0x3f, 0x38, 0x6b, 0x6a, 0xb9, 0x21, 0xbf, - 0xd6, 0x46, 0x5a, 0x92, 0x50, 0xdb, 0x90, 0x0f, 0x42, 0x6b, 0x16, 0x88, 0x07, 0x34, 0x3c, 0xc1, - 0x76, 0x20, 0xef, 0x7a, 0xa6, 0x15, 0xa4, 0x9f, 0xc9, 0xf4, 0x50, 0x0b, 0xe4, 0x08, 0xa6, 0xc2, - 0x46, 0x34, 0xe3, 0x4b, 0xce, 0x6c, 0x1c, 0x43, 0x8f, 0x6f, 0x2d, 0x03, 0x65, 0xa6, 0x8c, 0x6b, - 0x13, 0xa5, 0x51, 0xdd, 0x21, 0x5b, 0x9d, 0x31, 0x91, 0xf1, 0xb0, 0x44, 0x92, 0xed, 0x40, 0x19, - 0x7f, 0xbe, 0xf4, 0xed, 0xd0, 0x1a, 0x3c, 0x95, 0x7b, 0x58, 0x02, 0xc4, 0x6e, 0x03, 0x98, 0x56, - 0x68, 0x8d, 0xc2, 0xc1, 0xf7, 0x8e, 0x3c, 0x8c, 0x27, 0x20, 0xec, 0x17, 0xc0, 0x4e, 0x8c, 0xd1, - 0xd9, 0xc4, 0x27, 0x07, 0xd0, 0xef, 0xe7, 0x96, 0x6f, 0x47, 0xe2, 0xb6, 0x9c, 0x18, 0x14, 0x6d, - 0x2b, 0x26, 0xfb, 0x35, 0xa7, 0x62, 0xd7, 0x60, 0x63, 0x6a, 0x5c, 0xb4, 0xbc, 0x99, 0xf0, 0xcc, - 0x17, 0x29, 0xf6, 0x14, 0xae, 0xa1, 0x0a, 0x20, 0xa3, 0xa7, 0x20, 0x0f, 0x89, 0x0b, 0x53, 0x1e, - 0x4a, 0xf3, 0xca, 0xa9, 0x11, 0xc4, 0x11, 0x11, 0x84, 0x15, 0x7b, 0x17, 0xb6, 0xa5, 0x31, 0xca, - 0xb4, 0x66, 0x96, 0x6b, 0x5a, 0xee, 0xc8, 0x8e, 0xe2, 0x2d, 0x2c, 0x31, 0xff, 0x15, 0x41, 0xdc, - 0x4a, 0xd0, 0xb2, 0x7b, 0x50, 0xc5, 0x8a, 0x7d, 0x2b, 0x9c, 0xfb, 0x2e, 0xee, 0x58, 0xfc, 0x6d, - 0x09, 0x2a, 0x24, 0x9a, 0x84, 0x71, 0x0f, 0x10, 0x91, 0xe0, 0x3e, 0x4b, 0x3c, 0xe2, 0x56, 0x35, - 0x82, 0x0e, 0x42, 0x6b, 0xa6, 0xfe, 0x09, 0x54, 0x53, 0x7c, 0xb0, 0x74, 0xab, 0x36, 0x68, 0x77, - 0xdb, 0xcd, 0x21, 0xb7, 0xb4, 0x8b, 0xeb, 0x9f, 0xf5, 0xc4, 0x3d, 0x51, 0x2e, 0x61, 0x81, 0xcf, - 0xd3, 0x2d, 0x53, 0x5b, 0xdb, 0x6f, 0xd3, 0x55, 0x48, 0x56, 0xc9, 0xaa, 0xff, 0xca, 0x3a, 0x6c, - 0x0d, 0x7d, 0xc3, 0x0d, 0x0c, 0xae, 0xe7, 0xba, 0xa1, 0xef, 0x39, 0xec, 0x17, 0x50, 0x0c, 0x47, - 0x4e, 0x92, 0x31, 0xef, 0x48, 0x31, 0xb8, 0x40, 0xfa, 0x78, 0x38, 0xe2, 0x5e, 0x17, 0x85, 0x90, - 0xff, 0x60, 0x1f, 0x42, 0xfe, 0xc4, 0x9a, 0xd8, 0xae, 0xd8, 0x09, 0xae, 0x2e, 0x66, 0xdc, 0x45, - 0xe4, 0xc1, 0x9a, 0xc6, 0xa9, 0xd8, 0xc7, 0xb0, 0x31, 0xf2, 0xa6, 0x52, 0xd1, 0x88, 0x63, 0x35, - 0x24, 0x2a, 0x42, 0xec, 0xc1, 0x9a, 0x26, 0xe8, 0xd8, 0xe7, 0x50, 0xf4, 0x3d, 0xc7, 0x41, 0x3e, - 0x10, 0x2a, 0x48, 0x7d, 0x31, 0x8f, 0x26, 0xf0, 0x07, 0x6b, 0x5a, 0x44, 0xab, 0x3e, 0x86, 0x82, - 0x68, 0x2c, 0x0e, 0xc3, 0x6e, 0x7b, 0xbf, 0x23, 0x46, 0xb0, 0xd9, 0x3f, 0x3c, 0xec, 0x0c, 0x79, - 0x9c, 0x1a, 0xad, 0xdf, 0xed, 0xee, 0x36, 0x9a, 0xcf, 0x95, 0xf5, 0xdd, 0x22, 0x6c, 0x70, 0x76, - 0x51, 0xff, 0x34, 0x03, 0x9b, 0x0b, 0x1d, 0x60, 0xcf, 0x20, 0x47, 0xf6, 0x0a, 0x3e, 0x3c, 0xf7, - 0x57, 0xf6, 0x32, 0x91, 0xe6, 0xa7, 0x31, 0xcc, 0xa1, 0x7e, 0x09, 0xb5, 0x34, 0x3c, 0x71, 0x8f, - 0x53, 0x85, 0x92, 0xd6, 0x6e, 0xb4, 0xf4, 0x7e, 0xaf, 0xfb, 0x2d, 0xbf, 0x18, 0xa5, 0xe4, 0x4b, - 0xad, 0x43, 0x17, 0x28, 0x7f, 0x13, 0x94, 0xc5, 0x81, 0x61, 0xfb, 0x78, 0xb2, 0x9e, 0xce, 0x1c, - 0x8b, 0x0e, 0x30, 0x89, 0x29, 0xbb, 0xbd, 0x62, 0x24, 0x05, 0x19, 0xf7, 0xa4, 0x1e, 0xa5, 0xd2, - 0xea, 0x9f, 0x00, 0x5b, 0x1e, 0xc1, 0x3f, 0x5c, 0xf1, 0xff, 0x77, 0x06, 0x72, 0x47, 0x8e, 0xe1, - 0xb2, 0x7b, 0x90, 0xa7, 0xa8, 0x91, 0x62, 0x3f, 0x49, 0xae, 0x6e, 0x64, 0x0b, 0xc2, 0xb1, 0xf7, - 0x21, 0x1b, 0x8e, 0x64, 0xfc, 0x9b, 0xeb, 0xaf, 0x61, 0xbe, 0x83, 0x35, 0x0d, 0xa9, 0xd8, 0x43, - 0xc8, 0x9a, 0xa6, 0x7c, 0x8a, 0x29, 0x2c, 0x31, 0x2d, 0x23, 0x34, 0x5a, 0xd6, 0xd8, 0x76, 0x6d, - 0x11, 0xe5, 0x12, 0x49, 0xd8, 0x3b, 0x90, 0x35, 0x47, 0x4e, 0xfa, 0x5d, 0x2d, 0x37, 0x73, 0x47, - 0x05, 0x9a, 0x23, 0x07, 0x35, 0xee, 0xd0, 0xbf, 0xd4, 0xfd, 0xb9, 0x4b, 0x4f, 0x72, 0x02, 0x71, - 0x66, 0x2f, 0xa3, 0x56, 0x35, 0xa7, 0x77, 0x3d, 0x81, 0x08, 0xa4, 0x31, 0xf3, 0xad, 0x99, 0xe1, - 0x47, 0xa7, 0x75, 0x3b, 0x38, 0xe2, 0x80, 0xdd, 0x0d, 0xa0, 0x4f, 0x03, 0xa8, 0x1f, 0x50, 0x48, - 0x43, 0x3c, 0xf6, 0xa9, 0xf2, 0xd7, 0x8a, 0x28, 0xd2, 0x02, 0xa3, 0xfe, 0x83, 0x2c, 0x94, 0x13, - 0xed, 0x61, 0x9f, 0x42, 0xd1, 0x4c, 0x2f, 0xc4, 0x1b, 0x4b, 0x8d, 0x7e, 0xdc, 0x92, 0x4b, 0xd0, - 0x14, 0xec, 0x4d, 0x2e, 0x3d, 0xa1, 0xfe, 0xca, 0xf0, 0x6d, 0x1e, 0x2a, 0x77, 0x3d, 0xe9, 0x5b, - 0x33, 0xb0, 0xc2, 0x17, 0x12, 0x73, 0xb0, 0xa6, 0x55, 0x82, 0x44, 0x9a, 0xce, 0xa6, 0xa2, 0x4b, - 0xd9, 0x54, 0x78, 0x62, 0x0e, 0x3c, 0x58, 0xd3, 0x24, 0x1e, 0x49, 0xad, 0x0b, 0x6b, 0x34, 0x0f, - 0xe5, 0xd9, 0xb4, 0x2a, 0x3b, 0x44, 0x40, 0x8a, 0x91, 0xce, 0x7f, 0xb2, 0x27, 0x28, 0xfd, 0x0d, - 0xc7, 0xf1, 0x48, 0x79, 0xcc, 0x27, 0x8d, 0xa1, 0xad, 0x08, 0xce, 0x63, 0xb2, 0xcb, 0x14, 0x7b, - 0x00, 0x79, 0x2f, 0x3c, 0xb5, 0xe4, 0x19, 0x4a, 0x06, 0x47, 0x44, 0x50, 0xab, 0xd9, 0x45, 0x4e, - 0x21, 0xb4, 0xfa, 0x67, 0x19, 0x28, 0x88, 0x11, 0x60, 0x5b, 0x50, 0x1d, 0xb4, 0x87, 0xfa, 0x8b, - 0x86, 0xd6, 0x69, 0xec, 0x76, 0xdb, 0xe2, 0x39, 0xf0, 0xbe, 0xd6, 0xe8, 0x09, 0x01, 0xa9, 0xb5, - 0x5f, 0xf4, 0x9f, 0xb7, 0xf9, 0xe5, 0x68, 0xab, 0xdd, 0xfb, 0x56, 0xc9, 0x72, 0xe7, 0x80, 0xf6, - 0x51, 0x43, 0x43, 0x59, 0x59, 0x86, 0x42, 0xfb, 0x9b, 0x76, 0xf3, 0x98, 0x84, 0x65, 0x0d, 0xa0, - 0xd5, 0x6e, 0x74, 0xbb, 0xfd, 0x26, 0x0a, 0xcf, 0x0d, 0xc6, 0xa0, 0xd6, 0xd4, 0xda, 0x8d, 0x61, - 0x5b, 0x6f, 0x34, 0x9b, 0xfd, 0xe3, 0xde, 0x50, 0x29, 0x60, 0x8d, 0x8d, 0xee, 0xb0, 0xad, 0x45, - 0x20, 0x0a, 0x58, 0xdb, 0xd2, 0xfa, 0x47, 0x11, 0xa4, 0xb4, 0x5b, 0x82, 0xc2, 0x88, 0xcf, 0x95, - 0xfa, 0x1f, 0x6c, 0x41, 0x2d, 0xcd, 0x9a, 0xec, 0x0b, 0x28, 0x9a, 0x66, 0x6a, 0x8e, 0x6f, 0xad, - 0x62, 0xe1, 0xc7, 0x2d, 0x53, 0x4e, 0x33, 0xff, 0xc1, 0xee, 0xca, 0x85, 0xb4, 0xbe, 0xb4, 0x90, - 0xe4, 0x32, 0xfa, 0x0a, 0x36, 0x45, 0xc4, 0xbe, 0xc8, 0x80, 0x9f, 0x5a, 0x25, 0x4d, 0x42, 0xb6, - 0x04, 0xee, 0x60, 0x4d, 0xab, 0x8d, 0x52, 0x10, 0xf6, 0x4b, 0xa8, 0x19, 0xdc, 0x2c, 0x9e, 0xbc, - 0x00, 0x88, 0xd4, 0xe2, 0x06, 0x59, 0xc5, 0xe3, 0xec, 0x55, 0x23, 0x09, 0x40, 0x46, 0x34, 0x7d, - 0x6f, 0x16, 0x67, 0xce, 0xa7, 0x9c, 0xbc, 0x7c, 0x6f, 0x96, 0xc8, 0x5b, 0x31, 0x13, 0x69, 0xf6, - 0x39, 0x54, 0x44, 0xcb, 0x63, 0x73, 0x58, 0xb4, 0x64, 0x79, 0xb3, 0x49, 0xcd, 0x3d, 0x58, 0xd3, - 0xca, 0xa3, 0x38, 0xc9, 0x9e, 0xa2, 0x6e, 0x1b, 0x1f, 0x0a, 0x0a, 0x49, 0x5e, 0xa3, 0xd6, 0xca, - 0x5c, 0x60, 0x44, 0x29, 0xf6, 0x31, 0x00, 0xb5, 0x93, 0xe7, 0x29, 0xa6, 0xdc, 0x9f, 0x7d, 0x6f, - 0x26, 0xb3, 0x94, 0x4c, 0x99, 0x48, 0x34, 0x8f, 0x1b, 0x33, 0x4b, 0xcb, 0xcd, 0x23, 0x83, 0x66, - 0xdc, 0x3c, 0x6e, 0x07, 0x8d, 0x9a, 0xc7, 0xb3, 0xc1, 0x52, 0xf3, 0x64, 0x2e, 0xde, 0x3c, 0x9e, - 0x49, 0x36, 0x8f, 0xe7, 0x29, 0x2f, 0x36, 0x4f, 0x66, 0xa1, 0xe6, 0xf1, 0x1c, 0xbf, 0x5c, 0x3a, - 0xcd, 0x54, 0x5e, 0x7b, 0x9a, 0xc1, 0x69, 0x4b, 0x9f, 0x67, 0x7e, 0x09, 0xb5, 0xe0, 0xd4, 0x3b, - 0x4f, 0x08, 0x90, 0x6a, 0x32, 0xf7, 0xe0, 0xd4, 0x3b, 0x4f, 0x4a, 0x90, 0x6a, 0x90, 0x04, 0x60, - 0x6b, 0x79, 0x17, 0xc9, 0x21, 0xab, 0x96, 0x6c, 0x2d, 0xf5, 0xf0, 0x85, 0x6d, 0x9d, 0x63, 0x6b, - 0x0d, 0x99, 0xc0, 0x41, 0x89, 0x4d, 0x83, 0x81, 0x30, 0xf6, 0xa5, 0x9c, 0x86, 0x45, 0x4d, 0x10, - 0x19, 0x09, 0x03, 0xe4, 0xad, 0xb9, 0x9b, 0xcc, 0xa6, 0x24, 0x79, 0xeb, 0xd8, 0x4d, 0x65, 0xac, - 0x70, 0x52, 0x91, 0x35, 0x5e, 0x15, 0x81, 0xf5, 0xfd, 0xdc, 0x72, 0x47, 0x96, 0x78, 0x1c, 0x90, - 0x5a, 0x15, 0x03, 0x81, 0x8b, 0x57, 0x85, 0x84, 0x44, 0x7c, 0x1d, 0x65, 0x67, 0x8b, 0x7c, 0x9d, - 0xc8, 0x4c, 0x7c, 0x1d, 0x65, 0x8d, 0x16, 0x54, 0x94, 0xf7, 0xca, 0xd2, 0x82, 0x4a, 0x64, 0xe6, - 0x0b, 0x2a, 0xca, 0xfd, 0x14, 0x04, 0x37, 0xf1, 0xc1, 0x4d, 0x3d, 0x21, 0xe0, 0xad, 0x16, 0xa3, - 0x0b, 0xa3, 0x28, 0x85, 0xbc, 0xea, 0x5b, 0x78, 0x7a, 0x12, 0xac, 0x70, 0x35, 0xc9, 0xab, 0x1a, - 0x61, 0xa2, 0xa5, 0xe4, 0xc7, 0xc9, 0x44, 0x65, 0x33, 0x3b, 0xf4, 0xeb, 0xe6, 0x72, 0x65, 0x47, - 0x76, 0xe8, 0xc7, 0x95, 0x61, 0x8a, 0x7d, 0x08, 0xc4, 0x86, 0x3c, 0x8b, 0x95, 0x14, 0xdd, 0x38, - 0x2c, 0x22, 0x43, 0xd1, 0x14, 0xbf, 0x91, 0x59, 0x44, 0x1d, 0x23, 0x73, 0x54, 0x1f, 0x27, 0x99, - 0x85, 0x57, 0xd1, 0x6c, 0x35, 0x91, 0x59, 0x38, 0x51, 0xd3, 0x1c, 0xb1, 0x47, 0x40, 0xb9, 0x89, - 0x7e, 0x92, 0x0a, 0xbe, 0xeb, 0x7b, 0x33, 0x4e, 0x5d, 0x40, 0x02, 0xa4, 0xc5, 0x1e, 0x38, 0x9e, - 0x2b, 0x3b, 0x7e, 0x9a, 0xea, 0x01, 0x22, 0x22, 0x61, 0x30, 0x8a, 0x52, 0xea, 0x3f, 0xb5, 0x01, - 0x05, 0x21, 0x6b, 0xd9, 0x15, 0xd8, 0x14, 0x22, 0xbf, 0xd5, 0x18, 0x36, 0x76, 0x1b, 0x03, 0x54, - 0xd2, 0x18, 0xd4, 0xb8, 0xcc, 0x8f, 0x60, 0x19, 0xdc, 0x07, 0x48, 0xe8, 0x47, 0xa0, 0x75, 0xdc, - 0x07, 0x44, 0x5e, 0xee, 0x82, 0x92, 0x65, 0x9b, 0x50, 0xe6, 0x19, 0x39, 0x80, 0xa2, 0x93, 0x50, - 0x2e, 0x9e, 0xce, 0x27, 0xb2, 0x70, 0x5f, 0xa1, 0x8d, 0x38, 0x0b, 0x07, 0x14, 0xa2, 0x2c, 0xd2, - 0x99, 0x88, 0x41, 0x6d, 0xa8, 0x1d, 0xf7, 0x9a, 0x71, 0x3d, 0x25, 0x8a, 0x28, 0xc1, 0x8b, 0x79, - 0xd1, 0x69, 0xbf, 0x54, 0x00, 0x33, 0xf1, 0x52, 0x28, 0x5d, 0x46, 0x35, 0x93, 0x0a, 0xa1, 0x64, - 0x85, 0x5d, 0x87, 0x2b, 0x83, 0x83, 0xfe, 0x4b, 0x9d, 0x67, 0x8a, 0xba, 0x50, 0x65, 0xdb, 0xa0, - 0x24, 0x10, 0xbc, 0xf8, 0x1a, 0x56, 0x49, 0x50, 0x49, 0x38, 0x50, 0x36, 0x29, 0xa8, 0x23, 0xc2, - 0x86, 0x7c, 0xdf, 0x55, 0xb0, 0x2b, 0x3c, 0x6b, 0xbf, 0x7b, 0x7c, 0xd8, 0x1b, 0x28, 0x5b, 0xd8, - 0x08, 0x82, 0xf0, 0x96, 0xb3, 0xa8, 0x98, 0x78, 0xb7, 0xbe, 0x42, 0x1b, 0x38, 0xc2, 0x5e, 0x36, - 0xb4, 0x5e, 0xa7, 0xb7, 0x3f, 0x50, 0xb6, 0xa3, 0x92, 0xdb, 0x9a, 0xd6, 0xd7, 0x06, 0xca, 0xd5, - 0x08, 0x30, 0x18, 0x36, 0x86, 0xc7, 0x03, 0xe5, 0x5a, 0xd4, 0xca, 0x23, 0xad, 0xdf, 0x6c, 0x0f, - 0x06, 0xdd, 0xce, 0x60, 0xa8, 0x5c, 0x67, 0x57, 0x61, 0x2b, 0x6e, 0x91, 0x24, 0xae, 0x27, 0x1a, - 0xaa, 0xed, 0xb7, 0x87, 0xca, 0x8d, 0xa8, 0x19, 0xcd, 0x7e, 0xb7, 0xdb, 0x20, 0xff, 0xa6, 0x9b, - 0x48, 0x44, 0xae, 0x75, 0xa2, 0x37, 0x6f, 0x61, 0xbb, 0x8e, 0x7b, 0x49, 0xd0, 0xad, 0x04, 0x6b, - 0x0c, 0xda, 0xbf, 0x3e, 0x6e, 0xf7, 0x9a, 0x6d, 0xe5, 0xed, 0x98, 0x35, 0x22, 0xd8, 0xed, 0x88, - 0x35, 0x22, 0xd0, 0x9d, 0xa8, 0x4e, 0x09, 0x1a, 0x28, 0x3b, 0xd1, 0x80, 0x1d, 0x1f, 0xed, 0x6b, - 0x8d, 0x56, 0x5b, 0x51, 0x11, 0xa2, 0xb5, 0x7b, 0x8d, 0x43, 0x39, 0xb1, 0xf7, 0x12, 0x13, 0x7b, - 0xd4, 0x19, 0x6a, 0xca, 0xfd, 0x68, 0x22, 0x29, 0xf9, 0x0e, 0x7b, 0x0b, 0xae, 0x27, 0x59, 0x4e, - 0x7f, 0xd9, 0x19, 0x1e, 0x08, 0x0f, 0xb8, 0x07, 0xdc, 0xe1, 0x8a, 0x90, 0xcd, 0x56, 0x93, 0xbb, - 0xfa, 0x51, 0x5e, 0x4c, 0x3d, 0x54, 0x73, 0xc5, 0xbb, 0xca, 0xdd, 0x47, 0x9b, 0x62, 0x28, 0x7a, - 0xbd, 0x76, 0x73, 0xd8, 0xd7, 0x06, 0xbb, 0x15, 0xfa, 0x76, 0x8e, 0x50, 0x41, 0xd4, 0xaf, 0x81, - 0x25, 0x3f, 0x0d, 0x21, 0x5e, 0x59, 0x31, 0xc8, 0x8d, 0x7d, 0x6f, 0x2a, 0x2f, 0x86, 0xf1, 0x37, - 0xdb, 0x81, 0xf2, 0x6c, 0x7e, 0x42, 0xfe, 0x61, 0x71, 0x2c, 0xa0, 0x24, 0x48, 0xfd, 0x37, 0x33, - 0x50, 0x4b, 0xab, 0x1f, 0x64, 0xe8, 0x1e, 0xeb, 0xae, 0x17, 0xf2, 0x78, 0xb3, 0x41, 0xf4, 0xc5, - 0x86, 0x71, 0xcf, 0x0b, 0x29, 0xe0, 0x6c, 0x90, 0xf2, 0x45, 0x58, 0x5f, 0xf0, 0x45, 0xe8, 0xc0, - 0x95, 0xd4, 0x97, 0x38, 0x52, 0xd1, 0x7e, 0xeb, 0x51, 0xcc, 0xfa, 0x85, 0xf6, 0x6b, 0x2c, 0x58, - 0xee, 0x93, 0x88, 0xe8, 0x94, 0x8b, 0x23, 0x3a, 0x1d, 0x40, 0x35, 0xa5, 0xed, 0x90, 0x5d, 0x69, - 0x9c, 0x6e, 0x69, 0xd1, 0x1e, 0xbf, 0xb9, 0x99, 0xea, 0xbf, 0x9e, 0x81, 0x4a, 0x52, 0xf7, 0xf9, - 0xd9, 0x25, 0x91, 0xf3, 0xb3, 0xf8, 0xad, 0xdb, 0xa6, 0x0c, 0x1e, 0x2b, 0x41, 0x1d, 0xfa, 0x66, - 0x18, 0xbf, 0x33, 0xd8, 0x3b, 0x1b, 0x44, 0xdd, 0x49, 0x82, 0xc8, 0x7f, 0xe3, 0xd4, 0x1a, 0x9d, - 0xed, 0x3d, 0x47, 0x02, 0xe9, 0xbf, 0x11, 0x41, 0xd4, 0x3b, 0x50, 0xda, 0x3b, 0x93, 0xbe, 0xe0, - 0xc9, 0xa8, 0xcb, 0x25, 0x1e, 0x40, 0x4a, 0xfd, 0x8b, 0x0c, 0xd4, 0x62, 0x2b, 0x0a, 0xb9, 0xcb, - 0xf1, 0x2f, 0xb8, 0x70, 0x76, 0x58, 0x37, 0x4f, 0x62, 0x1f, 0x9d, 0xf5, 0xa4, 0x8f, 0xce, 0x3d, - 0x51, 0x58, 0x36, 0x29, 0xf4, 0xa3, 0xba, 0x44, 0x78, 0xaa, 0xa7, 0x50, 0xc1, 0xff, 0x9a, 0x35, - 0xb6, 0x7c, 0xdf, 0x32, 0xd3, 0x6f, 0x5f, 0x63, 0xe2, 0x14, 0x11, 0x9d, 0xf2, 0xa2, 0x28, 0x75, - 0x2b, 0x43, 0x5f, 0x52, 0x48, 0xd6, 0xff, 0x33, 0x0b, 0xe5, 0x84, 0x26, 0xf9, 0xa3, 0xd8, 0xef, - 0x16, 0x94, 0xe2, 0x40, 0x8c, 0x22, 0x26, 0x50, 0x04, 0x48, 0xcd, 0x55, 0x76, 0x61, 0xae, 0xea, - 0x50, 0xf0, 0x79, 0x44, 0x0e, 0x61, 0xd4, 0x96, 0xc9, 0xb4, 0xf9, 0x38, 0xff, 0x86, 0x7b, 0xad, - 0x4f, 0xa0, 0x92, 0xb0, 0xfd, 0x4a, 0xa7, 0x9a, 0x45, 0xfa, 0x72, 0x6c, 0x07, 0x0e, 0xd8, 0x55, - 0xd8, 0x18, 0x9f, 0xe9, 0xe6, 0x09, 0xbf, 0xb3, 0x2b, 0x69, 0xf9, 0xf1, 0x59, 0xeb, 0x84, 0xee, - 0x28, 0xc7, 0x91, 0xf2, 0xc4, 0x2d, 0x72, 0xc5, 0xb1, 0x54, 0x91, 0x1e, 0x42, 0x61, 0x7c, 0x96, - 0x8c, 0xf8, 0xb2, 0x34, 0xe4, 0x1b, 0xe3, 0x33, 0x8a, 0xf3, 0xf2, 0x11, 0x6c, 0x8b, 0x1d, 0xdc, - 0x08, 0x74, 0x1e, 0x7e, 0x8d, 0x02, 0x74, 0xf2, 0x18, 0xcc, 0x5b, 0x1c, 0xd7, 0x08, 0x06, 0x84, - 0x41, 0x8e, 0x53, 0xa1, 0x92, 0x60, 0x40, 0x6e, 0x59, 0x2b, 0x69, 0x29, 0x18, 0x7b, 0x06, 0x95, - 0xf1, 0x19, 0x9f, 0xd0, 0xa1, 0x77, 0x68, 0x89, 0xe7, 0xa8, 0xdb, 0x8b, 0x53, 0x49, 0xfe, 0x8c, - 0x29, 0x4a, 0x76, 0x0d, 0x36, 0x34, 0xe3, 0x7c, 0xf0, 0xeb, 0x2e, 0xa9, 0x91, 0x25, 0x4d, 0xa4, - 0xbe, 0xce, 0x15, 0x6b, 0xca, 0xa6, 0xfa, 0x9f, 0x64, 0xa0, 0x16, 0x9f, 0x02, 0x70, 0x11, 0xb2, - 0x47, 0xc9, 0x4f, 0x2f, 0xd5, 0x17, 0x0f, 0x0a, 0x48, 0xf2, 0x78, 0x78, 0x39, 0xe3, 0x9f, 0x04, - 0x58, 0x15, 0x7d, 0x76, 0x95, 0x31, 0x3e, 0xbb, 0xf2, 0x43, 0x2e, 0xfb, 0x90, 0x1d, 0x5e, 0xce, - 0xb8, 0xc5, 0x09, 0x37, 0x45, 0x7e, 0x3a, 0xe5, 0xdb, 0x21, 0x79, 0xf8, 0x3e, 0x6f, 0x7f, 0xcb, - 0x63, 0x98, 0x1d, 0x69, 0x9d, 0xc3, 0x86, 0xf6, 0xad, 0x8e, 0x00, 0x52, 0x1b, 0xf6, 0xfa, 0x5a, - 0xbb, 0xb3, 0xdf, 0x23, 0x40, 0x8e, 0xec, 0x51, 0x71, 0x13, 0x1b, 0xa6, 0xb9, 0x77, 0x96, 0x0c, - 0xdc, 0x99, 0x49, 0x05, 0xee, 0x8c, 0x62, 0xdc, 0x26, 0x43, 0x87, 0x87, 0xd1, 0x0d, 0x01, 0x8b, - 0x56, 0x61, 0xb4, 0xa4, 0xd9, 0xbb, 0x90, 0x1b, 0x9f, 0x59, 0x97, 0xe9, 0xa3, 0x5e, 0x7a, 0x01, - 0x11, 0x81, 0xfa, 0x57, 0x19, 0x60, 0xa9, 0x86, 0xf0, 0xd3, 0xc7, 0xcf, 0x6d, 0xcb, 0x17, 0x50, - 0x17, 0xcf, 0x3d, 0x38, 0x55, 0xc2, 0xfa, 0x2f, 0x86, 0xf4, 0xaa, 0x17, 0x3f, 0x83, 0x8a, 0x03, - 0xe4, 0xb2, 0x8f, 0x80, 0x47, 0x05, 0x27, 0xf7, 0xd7, 0xdc, 0x6b, 0x4e, 0x8a, 0x5a, 0x4c, 0x13, - 0x87, 0x01, 0x4f, 0x86, 0x37, 0xe7, 0x17, 0x07, 0x9b, 0xf1, 0xac, 0xd1, 0x9a, 0x57, 0xff, 0x85, - 0x0c, 0x5c, 0x49, 0x33, 0xc4, 0xef, 0xd7, 0xcb, 0x74, 0x2c, 0xf7, 0xec, 0x62, 0x2c, 0xf7, 0x55, - 0xfc, 0x94, 0x5b, 0xc9, 0x4f, 0x7f, 0x3b, 0x03, 0xdb, 0x89, 0xd1, 0x8f, 0xcf, 0x8b, 0x7f, 0x4d, - 0x2d, 0x4b, 0x84, 0x74, 0xcf, 0xa5, 0x42, 0xba, 0xab, 0x7f, 0x99, 0x81, 0x6b, 0x0b, 0x2d, 0xd1, - 0xac, 0xbf, 0xd6, 0xb6, 0xa4, 0x43, 0xbf, 0xd3, 0xe5, 0x85, 0x8c, 0xf3, 0x95, 0x79, 0x98, 0x4d, - 0x84, 0x7e, 0xa7, 0x1b, 0x2d, 0xba, 0x56, 0x7d, 0x5b, 0x84, 0x83, 0xd4, 0x83, 0x4b, 0x77, 0x24, - 0x26, 0xbb, 0x44, 0x90, 0xc1, 0xa5, 0x3b, 0x52, 0xff, 0xfd, 0x0c, 0xdc, 0x58, 0xe8, 0x43, 0x63, - 0x1e, 0x7a, 0xe2, 0x0e, 0xfe, 0xaf, 0xa9, 0x1b, 0x77, 0xa0, 0x4c, 0x1e, 0x0a, 0xe2, 0x62, 0x9f, - 0x0f, 0x2b, 0x18, 0x71, 0xbd, 0x0a, 0x64, 0x4d, 0xe3, 0x52, 0x44, 0x46, 0xc2, 0x9f, 0xb8, 0x60, - 0x4f, 0xbd, 0xb9, 0x2f, 0x3c, 0x58, 0xe9, 0xb7, 0xfa, 0x29, 0x6c, 0xc5, 0x4d, 0x6f, 0x8a, 0x08, - 0xfc, 0x77, 0xa0, 0xec, 0x5a, 0xe7, 0xba, 0x8c, 0xcf, 0x2f, 0x7c, 0xb9, 0x5d, 0xeb, 0x5c, 0x10, - 0xa8, 0x7b, 0x49, 0x59, 0x18, 0x7d, 0xe5, 0xcc, 0x31, 0x53, 0xde, 0x5d, 0x9e, 0x63, 0x4a, 0x14, - 0x96, 0x96, 0xe8, 0x65, 0xc1, 0xb5, 0xce, 0x89, 0x0f, 0xcf, 0x45, 0x39, 0x0d, 0x53, 0xc4, 0xc3, - 0x5f, 0xe9, 0x2a, 0x78, 0x03, 0x8a, 0x33, 0x3f, 0x35, 0x4c, 0x85, 0x99, 0xcf, 0xab, 0xbd, 0x2f, - 0x3c, 0xc5, 0x5f, 0xe7, 0x0d, 0xc3, 0x7d, 0xc7, 0xc5, 0x57, 0x10, 0x73, 0xf1, 0x57, 0x10, 0x3f, - 0x13, 0x62, 0x90, 0x4e, 0x7e, 0xbc, 0x66, 0x05, 0xb2, 0xb6, 0x79, 0x41, 0x15, 0x57, 0x35, 0xfc, - 0x49, 0x9a, 0x9c, 0xf5, 0xbd, 0x70, 0x56, 0xc7, 0x9f, 0xea, 0x2e, 0x94, 0xb5, 0xd4, 0x31, 0xb7, - 0x92, 0xb0, 0x18, 0x05, 0xe9, 0x00, 0x9b, 0xf1, 0x00, 0x69, 0xe5, 0xd8, 0x60, 0x14, 0xa8, 0x81, - 0x10, 0x7c, 0x2f, 0x0c, 0x7f, 0x74, 0x6a, 0xf8, 0x5d, 0xcb, 0x9d, 0x84, 0xa7, 0x38, 0xe4, 0xdc, - 0x90, 0x9b, 0x1c, 0x42, 0xe0, 0x20, 0xc9, 0x0e, 0x38, 0x8a, 0x0e, 0x91, 0xcb, 0x6f, 0xa6, 0xb9, - 0xd6, 0xb9, 0xc8, 0xff, 0x36, 0x00, 0x8e, 0xbf, 0x40, 0xf3, 0x4b, 0xd1, 0x92, 0xe7, 0x98, 0x1c, - 0xad, 0x6e, 0x89, 0xfe, 0x8a, 0xc8, 0x5e, 0x2d, 0x6b, 0xac, 0x3a, 0x62, 0xe6, 0x79, 0x87, 0xc4, - 0x20, 0xfc, 0xac, 0x69, 0x64, 0x77, 0xa1, 0x22, 0x6d, 0x12, 0x14, 0xd3, 0x95, 0x57, 0x5f, 0x96, - 0xb0, 0xde, 0x7c, 0xaa, 0xfe, 0x4b, 0x59, 0xa8, 0x34, 0xb8, 0xff, 0xd7, 0xec, 0xb2, 0x3f, 0x0b, - 0xd9, 0x9f, 0xc0, 0x55, 0x0a, 0xf2, 0xc6, 0xbf, 0x2c, 0x41, 0x6e, 0x57, 0xdc, 0xe1, 0x88, 0x0f, - 0xe2, 0xa3, 0xc4, 0x20, 0x8a, 0x2c, 0x8f, 0x07, 0x67, 0xf6, 0x8c, 0x3f, 0x3d, 0xed, 0x98, 0x17, - 0xe4, 0x7f, 0xc4, 0xbd, 0x15, 0x28, 0x1e, 0x5c, 0x1a, 0x41, 0x01, 0x9e, 0xb0, 0xf8, 0xd9, 0x99, - 0x28, 0x56, 0xb8, 0xab, 0x20, 0xf0, 0xe8, 0x8c, 0xd3, 0x3c, 0x82, 0x2d, 0xfe, 0xda, 0x7c, 0x79, - 0x03, 0xde, 0xe4, 0x88, 0x98, 0xbf, 0x07, 0xb0, 0x25, 0x62, 0xd2, 0x51, 0x94, 0x74, 0x7d, 0xe4, - 0xcd, 0x2e, 0xc5, 0x65, 0xe8, 0xbb, 0xaf, 0x69, 0x6a, 0x87, 0x93, 0x22, 0x88, 0xb7, 0x73, 0x33, - 0x48, 0x43, 0x6f, 0xb6, 0xe1, 0xfa, 0x6b, 0xfa, 0xf4, 0x26, 0x87, 0x8b, 0x62, 0xc2, 0xe1, 0xe2, - 0xe6, 0x2e, 0x6c, 0xaf, 0xaa, 0xef, 0xa7, 0x94, 0xa1, 0xfe, 0x79, 0x15, 0x20, 0xe6, 0xd8, 0x94, - 0x3a, 0x9a, 0x59, 0x50, 0x47, 0x7f, 0x92, 0x33, 0xd5, 0xa7, 0x50, 0xc3, 0xa1, 0xd2, 0xe3, 0x1c, - 0xd9, 0x95, 0x39, 0x2a, 0x48, 0x35, 0x8c, 0x03, 0x6a, 0x2c, 0x3b, 0x69, 0xe4, 0x56, 0x3a, 0x69, - 0x7c, 0x02, 0x05, 0x7e, 0xd5, 0x16, 0x08, 0x77, 0xda, 0xeb, 0x8b, 0xab, 0xef, 0xb1, 0x78, 0xc6, - 0x2a, 0xe9, 0x58, 0x1b, 0x6a, 0x28, 0xfa, 0x7d, 0x3b, 0x3c, 0x9d, 0x26, 0x23, 0xba, 0xdc, 0x5e, - 0xce, 0x29, 0xc9, 0xc4, 0x87, 0xea, 0x92, 0xc9, 0x84, 0xf6, 0x1a, 0x4e, 0x85, 0xfd, 0x97, 0xb4, - 0xd7, 0x42, 0x52, 0x7b, 0x1d, 0x4e, 0xb9, 0xd5, 0x17, 0xb5, 0xd7, 0x0f, 0xe1, 0x8a, 0x70, 0xb3, - 0xc3, 0x0c, 0x38, 0x9c, 0x44, 0xcf, 0x1f, 0x02, 0x28, 0x22, 0xb0, 0xdb, 0x94, 0xce, 0x76, 0x48, - 0xfe, 0x0d, 0x6c, 0x8f, 0x4e, 0x0d, 0x77, 0x62, 0xe9, 0xe1, 0x89, 0xa3, 0xd3, 0xe7, 0xac, 0xf4, - 0xa9, 0x31, 0x13, 0x4a, 0xf5, 0xbb, 0x4b, 0x8d, 0x6d, 0x12, 0xf1, 0xf0, 0xc4, 0x21, 0x37, 0xc5, - 0xc8, 0x95, 0x67, 0x6b, 0xb4, 0x08, 0x5f, 0xb8, 0x51, 0x87, 0xa5, 0x1b, 0xf5, 0x45, 0x35, 0xbb, - 0xbc, 0x42, 0xcd, 0x8e, 0x95, 0xe5, 0x4a, 0x52, 0x59, 0x66, 0x1f, 0x40, 0x41, 0x44, 0x06, 0x11, - 0x96, 0x5f, 0xb6, 0xbc, 0x3a, 0x34, 0x49, 0x82, 0x35, 0x49, 0xff, 0x0e, 0x0a, 0x1e, 0x55, 0xe3, - 0x35, 0x25, 0x61, 0x6c, 0x57, 0x98, 0x3d, 0x23, 0x97, 0x4a, 0x61, 0xe5, 0xbd, 0x99, 0x28, 0x38, - 0xc2, 0x89, 0x73, 0xf9, 0x42, 0x8e, 0x9b, 0xff, 0xf1, 0x06, 0x6c, 0x88, 0x5b, 0xfa, 0x47, 0x90, - 0x33, 0x7d, 0x6f, 0x16, 0xbd, 0xa2, 0x5a, 0xa1, 0xb5, 0xd3, 0xf7, 0x94, 0x51, 0xc1, 0x7f, 0x0c, - 0x1b, 0x86, 0x69, 0xea, 0xe3, 0xb3, 0xf4, 0x8d, 0xf4, 0x82, 0x02, 0x7d, 0xb0, 0xa6, 0xe5, 0x0d, - 0xd2, 0xa4, 0xbf, 0x80, 0x12, 0xd2, 0xc7, 0x4e, 0xca, 0xe5, 0xe5, 0x63, 0x81, 0x54, 0x75, 0x0f, - 0xd6, 0xb4, 0xa2, 0x21, 0xd5, 0xde, 0x3f, 0x4e, 0xdb, 0xf6, 0x73, 0x4b, 0x1d, 0x5c, 0xd0, 0xd3, - 0x16, 0xac, 0xfc, 0x7f, 0x03, 0xb8, 0xb1, 0x37, 0xda, 0xb1, 0xf3, 0xc9, 0xcb, 0xcf, 0xa5, 0xfd, - 0xfd, 0x60, 0x4d, 0xe3, 0xfb, 0x96, 0xdc, 0xef, 0x3f, 0x93, 0x76, 0xf7, 0xe8, 0x5b, 0x92, 0x2b, - 0x46, 0x06, 0xc5, 0x60, 0x64, 0x7c, 0x27, 0x99, 0x88, 0xd9, 0x4c, 0xf9, 0x81, 0x9b, 0xf4, 0x33, - 0x8b, 0xf4, 0xae, 0x4e, 0xd9, 0xa2, 0x2d, 0xfe, 0x19, 0x94, 0xb9, 0x19, 0x96, 0xe7, 0x2b, 0x2e, - 0x0d, 0x6d, 0xbc, 0x29, 0xd3, 0xc5, 0x5e, 0xbc, 0x45, 0x37, 0x65, 0x3f, 0x7d, 0x2b, 0x79, 0x77, - 0x72, 0x6b, 0xe5, 0x40, 0x69, 0xd1, 0x35, 0x0a, 0xef, 0xac, 0xc6, 0xf3, 0xb0, 0x2e, 0x6c, 0x8b, - 0x4b, 0x06, 0xbe, 0x01, 0xcb, 0x3d, 0x13, 0x96, 0xe6, 0x2b, 0xb5, 0x43, 0x1f, 0xac, 0x69, 0xcc, - 0x58, 0xde, 0xb7, 0x9b, 0xb0, 0x25, 0x9b, 0x44, 0x3b, 0x6b, 0xc2, 0x91, 0x2b, 0xd9, 0xa5, 0x78, - 0xdf, 0x3d, 0x58, 0xd3, 0x36, 0x8d, 0x34, 0x88, 0x75, 0xe0, 0x8a, 0x2c, 0x84, 0x8c, 0xed, 0x62, - 0x64, 0x2a, 0x4b, 0xb3, 0x98, 0xdc, 0xab, 0x0f, 0xd6, 0xb4, 0x2d, 0x63, 0x69, 0x03, 0x3f, 0x94, - 0xed, 0x49, 0x2a, 0x87, 0x7c, 0x25, 0xde, 0x59, 0x39, 0x4c, 0xb1, 0xa6, 0x1a, 0xb5, 0x2c, 0x06, - 0xc5, 0x9e, 0x0c, 0x37, 0x35, 0xb8, 0xb6, 0x5a, 0xc2, 0x24, 0xb7, 0x99, 0x1c, 0xdf, 0x66, 0xd4, - 0xe4, 0x36, 0xb3, 0x18, 0x0c, 0x2e, 0xb1, 0xe9, 0xfc, 0x0a, 0xaa, 0x29, 0x11, 0xcb, 0xca, 0x50, - 0x90, 0x1f, 0xf7, 0xa1, 0x97, 0xa9, 0xcd, 0xfe, 0xd1, 0xb7, 0x4a, 0x06, 0xc1, 0x9d, 0xde, 0x60, - 0xd8, 0xe8, 0x0d, 0x95, 0x75, 0x9e, 0x38, 0xea, 0x36, 0x9a, 0x6d, 0x25, 0xab, 0xfe, 0x65, 0x16, - 0x4a, 0xd1, 0x3d, 0xdb, 0xcf, 0xb7, 0x86, 0x45, 0x66, 0xa6, 0x6c, 0xd2, 0xcc, 0xb4, 0x70, 0xd4, - 0xe3, 0x9f, 0xec, 0xca, 0xc9, 0xcf, 0x38, 0x25, 0x0f, 0x54, 0xc1, 0x72, 0x8c, 0xa0, 0xfc, 0x8f, - 0x8c, 0x11, 0x94, 0x7c, 0xa7, 0xb0, 0x91, 0x7e, 0xa7, 0xb0, 0xf0, 0x81, 0xa7, 0x02, 0x7d, 0x5b, - 0x25, 0xf9, 0x81, 0x27, 0xfa, 0xd2, 0xfd, 0x0b, 0xdb, 0x3a, 0x17, 0x8e, 0xfd, 0x22, 0x95, 0xde, - 0xa1, 0xe1, 0x0d, 0x3b, 0xf4, 0x8f, 0x91, 0xf6, 0x4f, 0x60, 0x7b, 0x7c, 0x16, 0x7d, 0xd1, 0x25, - 0x36, 0xae, 0x54, 0xa8, 0x49, 0x2b, 0x71, 0xec, 0xdd, 0xe8, 0x73, 0xbb, 0xd5, 0xa4, 0x19, 0x28, - 0x9a, 0xad, 0xe8, 0xfb, 0xbb, 0xff, 0x5c, 0x06, 0x20, 0xbe, 0x81, 0xfa, 0xbd, 0x4d, 0xb9, 0x09, - 0x6b, 0x59, 0xf6, 0x07, 0xac, 0x65, 0x6f, 0x0a, 0x83, 0xfb, 0x3d, 0x94, 0xa2, 0x3b, 0xc7, 0x9f, - 0xcf, 0x58, 0x3f, 0xa9, 0xca, 0xbf, 0x25, 0xcd, 0xda, 0xd1, 0xa5, 0xdd, 0xef, 0x3b, 0x16, 0xa9, - 0xea, 0xb3, 0x6f, 0xa8, 0xfe, 0x82, 0xdb, 0x96, 0xa3, 0xca, 0xff, 0xc0, 0xab, 0x29, 0xc9, 0xe8, - 0xb9, 0xf4, 0xb3, 0xb1, 0xb9, 0x30, 0x90, 0xff, 0xfe, 0x55, 0xff, 0xa4, 0x0e, 0xff, 0x1f, 0x19, - 0x69, 0xc5, 0x8d, 0x3e, 0xc2, 0xf3, 0x5a, 0xa5, 0x77, 0xb5, 0x21, 0xfa, 0xa7, 0x54, 0xf7, 0x83, - 0x36, 0xaa, 0xdc, 0x0f, 0xd9, 0xa8, 0xde, 0x85, 0x3c, 0xdf, 0xee, 0xf2, 0xaf, 0xb3, 0x4f, 0x71, - 0xfc, 0x1b, 0x3f, 0xba, 0xa7, 0xaa, 0x42, 0xc9, 0xe7, 0xfd, 0xdd, 0x96, 0xe5, 0xca, 0x0f, 0x06, - 0xd2, 0x3b, 0xaa, 0x7f, 0x8c, 0x4b, 0xd4, 0x9f, 0x3b, 0x24, 0x3f, 0x6c, 0xb6, 0x50, 0xff, 0xbf, - 0x0c, 0x54, 0x53, 0x3e, 0x04, 0x3f, 0xa3, 0x8a, 0x95, 0x72, 0x39, 0xfb, 0x8f, 0x90, 0x5c, 0x4e, - 0x39, 0x15, 0x17, 0xd3, 0x4e, 0xc5, 0x28, 0xee, 0x2a, 0xa9, 0x23, 0xcc, 0xaa, 0xc3, 0x4e, 0x66, - 0xe5, 0x61, 0xe7, 0x76, 0xf4, 0xdd, 0xf4, 0x4e, 0x8b, 0xfb, 0xf0, 0x56, 0xb5, 0x04, 0x84, 0x7d, - 0x09, 0x37, 0x84, 0x11, 0x81, 0x8f, 0x8f, 0x37, 0xd6, 0xa3, 0xaf, 0xaa, 0x8b, 0x43, 0xf9, 0x35, - 0x4e, 0xc0, 0x3f, 0x99, 0x38, 0x6e, 0x48, 0xac, 0xda, 0x81, 0x6a, 0xca, 0x39, 0x03, 0xf7, 0x96, - 0x89, 0xe3, 0x9d, 0x18, 0x8e, 0x68, 0x8b, 0x48, 0xb1, 0x1d, 0xc8, 0x9f, 0x9f, 0x5a, 0xbe, 0xb5, - 0xe2, 0xbb, 0x15, 0x1c, 0xa1, 0xfe, 0x12, 0x2a, 0x49, 0x47, 0x31, 0xf6, 0x01, 0xe4, 0xed, 0xd0, - 0x9a, 0x4a, 0xf3, 0xc8, 0xb5, 0x65, 0x5f, 0xb2, 0x4e, 0x68, 0x4d, 0x35, 0x4e, 0xa4, 0xfe, 0x59, - 0x06, 0x94, 0x45, 0x1c, 0x7d, 0xaa, 0xf6, 0x32, 0x08, 0xad, 0xa9, 0x6c, 0x0c, 0x4f, 0x25, 0x1a, - 0xb9, 0x9e, 0x6a, 0xa4, 0xb4, 0x22, 0x65, 0xd3, 0x1f, 0xff, 0xe3, 0x4a, 0xc9, 0xf2, 0xe3, 0x13, - 0x8e, 0x60, 0x0f, 0xa0, 0xe8, 0x5b, 0xf4, 0xcd, 0x7f, 0x73, 0xc5, 0x8b, 0x9d, 0x08, 0xa7, 0xfe, - 0x9d, 0x0c, 0x14, 0x84, 0x57, 0xdb, 0x4a, 0x7b, 0xd5, 0x7b, 0x50, 0xe0, 0xdf, 0xff, 0x97, 0xd1, - 0x70, 0x97, 0x7c, 0x7f, 0x25, 0x9e, 0xdd, 0xe6, 0xbe, 0x7e, 0x69, 0xfb, 0xd5, 0x91, 0x63, 0xb8, - 0x1a, 0xc1, 0xc5, 0x97, 0x50, 0x8d, 0xa9, 0x78, 0x44, 0xc2, 0xc3, 0x98, 0x02, 0x81, 0xe8, 0x99, - 0x88, 0xfa, 0xc7, 0x50, 0x10, 0x5e, 0x73, 0x2b, 0x9b, 0xf2, 0x86, 0xef, 0xb9, 0xab, 0x3b, 0x00, - 0xb1, 0x1b, 0xdd, 0xaa, 0x12, 0xd4, 0x47, 0x50, 0x94, 0x9e, 0x73, 0xc8, 0x7f, 0x71, 0xd5, 0xe2, - 0xe1, 0x5a, 0xb2, 0x31, 0x8e, 0xf8, 0x16, 0x55, 0xd7, 0x1b, 0x9d, 0x91, 0xb1, 0xfc, 0x23, 0xa0, - 0x57, 0x7c, 0xc3, 0xa5, 0x78, 0xaf, 0xe9, 0xaf, 0x96, 0x45, 0x44, 0xec, 0x11, 0x44, 0xf2, 0xf2, - 0x4d, 0xa6, 0x05, 0xb5, 0x21, 0xdf, 0x7b, 0x12, 0x97, 0x3d, 0x15, 0xd6, 0xd4, 0x2e, 0xc5, 0x1b, - 0xcf, 0x24, 0xbf, 0xd9, 0x90, 0x6a, 0x93, 0x96, 0x20, 0x53, 0x6b, 0x50, 0x49, 0xba, 0xfb, 0xa8, - 0x0d, 0xd8, 0x3a, 0xb4, 0x42, 0x03, 0xe5, 0x8f, 0x8c, 0x82, 0xc9, 0xf9, 0x17, 0x7f, 0xa4, 0xf9, - 0x77, 0x91, 0x4e, 0xe3, 0x44, 0xea, 0x5f, 0xe6, 0x40, 0x59, 0xc4, 0xfd, 0xd0, 0xdb, 0xd7, 0x3b, - 0x50, 0xf6, 0x88, 0x2f, 0x52, 0xdf, 0xba, 0xe5, 0xa0, 0xc4, 0x0b, 0x85, 0xd4, 0x67, 0x0a, 0x8b, - 0x76, 0x70, 0xc0, 0x3f, 0x54, 0x78, 0x9d, 0x3f, 0x74, 0x74, 0xbc, 0x11, 0xb1, 0x75, 0x85, 0xde, - 0x35, 0x76, 0xbd, 0x11, 0x3d, 0xa9, 0x15, 0xd6, 0x09, 0xee, 0x83, 0x5a, 0xd1, 0x8a, 0xc2, 0x24, - 0x41, 0xf7, 0x77, 0xe2, 0xdd, 0x42, 0x18, 0x88, 0xd8, 0x16, 0x45, 0x0e, 0x18, 0x06, 0xf2, 0x8b, - 0x43, 0x23, 0xf1, 0x61, 0xd6, 0x2c, 0x7d, 0x71, 0xa8, 0xe9, 0xd2, 0x8b, 0x5a, 0xfa, 0x0e, 0xc3, - 0x48, 0x7c, 0x92, 0x5a, 0x7c, 0xf3, 0x09, 0x51, 0xf7, 0xf8, 0xa7, 0x6b, 0x7d, 0x2b, 0x08, 0x78, - 0xd8, 0xe9, 0x92, 0x88, 0x37, 0x2e, 0x80, 0x51, 0x54, 0x7f, 0xf1, 0x6d, 0x4d, 0x24, 0x01, 0x11, - 0xfc, 0x9a, 0x7f, 0x5c, 0x13, 0x09, 0x6e, 0x40, 0xf1, 0xb7, 0x9e, 0x6b, 0x91, 0x95, 0xa3, 0x4c, - 0xad, 0x2a, 0x60, 0xfa, 0xd0, 0x98, 0xe1, 0x46, 0xe0, 0x50, 0x18, 0x15, 0xfe, 0x96, 0x94, 0x27, - 0xd4, 0xff, 0x26, 0x03, 0xdb, 0x8b, 0x63, 0x4d, 0x6c, 0x54, 0x81, 0x62, 0xb3, 0xdf, 0xd5, 0x7b, - 0x8d, 0xc3, 0xb6, 0xb2, 0xc6, 0x36, 0xa1, 0xdc, 0xdf, 0xfd, 0xba, 0xdd, 0x1c, 0x72, 0x40, 0x86, - 0x62, 0x2a, 0x0d, 0xf4, 0x83, 0x4e, 0xab, 0xd5, 0xee, 0xf1, 0x13, 0x45, 0x7f, 0xf7, 0x6b, 0xbd, - 0xdb, 0x6f, 0xf2, 0x4f, 0x8a, 0x4a, 0x47, 0x88, 0x81, 0x92, 0x23, 0x37, 0x09, 0x72, 0x87, 0xc7, - 0x64, 0x9e, 0xfb, 0x79, 0xbf, 0x1c, 0xe8, 0xcd, 0xde, 0x50, 0xd9, 0xc0, 0x54, 0xef, 0xb8, 0xdb, - 0xa5, 0x14, 0x39, 0x74, 0x36, 0xfb, 0x87, 0x47, 0x5a, 0x7b, 0x30, 0xd0, 0x07, 0x9d, 0xdf, 0xb4, - 0x95, 0x22, 0xd5, 0xac, 0x75, 0xf6, 0x3b, 0x3d, 0x0e, 0x28, 0xb1, 0x02, 0x64, 0x0f, 0x3b, 0x3d, - 0x1e, 0x4b, 0xea, 0xb0, 0xf1, 0x8d, 0x52, 0xc6, 0x1f, 0x83, 0xe3, 0x43, 0xa5, 0xc2, 0x4a, 0x90, - 0xef, 0xb6, 0x5f, 0xb4, 0xbb, 0x4a, 0x55, 0xfd, 0x9f, 0xb2, 0x52, 0x23, 0x26, 0x4f, 0xa7, 0x1f, - 0xa3, 0x05, 0xae, 0xba, 0x5f, 0x8c, 0x06, 0x2d, 0x9b, 0x18, 0x34, 0x76, 0x17, 0x2a, 0x62, 0x53, - 0x48, 0x7d, 0x9f, 0x58, 0xc0, 0x88, 0xe5, 0xee, 0x41, 0x35, 0x72, 0x0e, 0x48, 0x7c, 0x25, 0xa8, - 0x22, 0x81, 0x2b, 0xae, 0x2f, 0x36, 0x56, 0x5c, 0x5f, 0xcc, 0xec, 0x10, 0x4f, 0xd9, 0x28, 0x73, - 0x39, 0x27, 0x95, 0x10, 0x42, 0x1f, 0xd8, 0xa7, 0x67, 0xae, 0x88, 0x9e, 0xbb, 0xb6, 0xfc, 0xc0, - 0x79, 0x11, 0x01, 0xc7, 0xae, 0x1d, 0x2e, 0x3a, 0x27, 0x94, 0x96, 0x9c, 0x13, 0x92, 0x9b, 0x33, - 0xa4, 0x37, 0xe7, 0xb7, 0xa3, 0x3d, 0x12, 0x91, 0xfc, 0xcb, 0xe6, 0xa5, 0x68, 0x17, 0xa4, 0x0f, - 0x51, 0xcf, 0x7d, 0x8a, 0xc0, 0x9b, 0x20, 0xab, 0x10, 0x99, 0x22, 0x30, 0xd1, 0xae, 0x48, 0x51, - 0x06, 0xd2, 0xd4, 0x74, 0x96, 0x2e, 0x69, 0xb5, 0x34, 0x29, 0x7b, 0x0c, 0x57, 0x04, 0x6f, 0xa7, - 0xc6, 0x56, 0x3c, 0x50, 0xe6, 0xa8, 0x46, 0x3c, 0xc2, 0xea, 0x1f, 0x41, 0x51, 0x3a, 0xb5, 0xfd, - 0xb0, 0xb2, 0xbb, 0x62, 0x5e, 0xd5, 0x7f, 0x67, 0x1d, 0x4a, 0x91, 0x8b, 0xdb, 0x8f, 0xe2, 0x0e, - 0xfa, 0x1c, 0x5a, 0x70, 0x96, 0x14, 0x31, 0x45, 0x04, 0xc8, 0x99, 0x12, 0xef, 0xc7, 0xe6, 0xbe, - 0x2d, 0x35, 0x36, 0x0e, 0x39, 0xf6, 0x6d, 0x0a, 0xb3, 0x67, 0xbb, 0x89, 0xa7, 0xc4, 0x25, 0xad, - 0x88, 0x00, 0x5a, 0x68, 0x37, 0x80, 0x7e, 0x53, 0x4e, 0xce, 0x24, 0x05, 0x4c, 0x63, 0xbe, 0x6b, - 0xd1, 0xf9, 0x8f, 0xf3, 0x86, 0x48, 0xd1, 0xc7, 0xdc, 0xb8, 0x77, 0x0d, 0xf7, 0x29, 0x90, 0x5f, - 0x6c, 0x7e, 0x0b, 0x4a, 0xf3, 0xe8, 0x93, 0xdf, 0x82, 0x23, 0xe6, 0xf2, 0x83, 0xdf, 0xe9, 0x59, - 0x2d, 0x2d, 0xce, 0xea, 0x22, 0x4f, 0xc3, 0x12, 0x4f, 0xab, 0x21, 0x14, 0x84, 0x9b, 0xdf, 0x0f, - 0x0f, 0xf8, 0x0f, 0x0e, 0x95, 0x02, 0x59, 0xc3, 0x91, 0x2f, 0x82, 0xf1, 0xe7, 0x42, 0xc3, 0x72, - 0x0b, 0x0d, 0x53, 0xff, 0xb5, 0x75, 0x80, 0xd8, 0x5d, 0x90, 0x7d, 0xb8, 0xe0, 0x9a, 0x9c, 0x59, - 0xda, 0xf6, 0x17, 0x3c, 0x92, 0x17, 0xe2, 0x4e, 0xae, 0xff, 0x88, 0xb8, 0x93, 0x4f, 0xa0, 0x1a, - 0xf8, 0xa3, 0x37, 0x1a, 0xdc, 0xcb, 0x81, 0x3f, 0x8a, 0xec, 0xed, 0x1f, 0x01, 0x26, 0x29, 0x26, - 0xb5, 0xf9, 0xfa, 0x8f, 0x3c, 0x96, 0x02, 0x7f, 0xd4, 0x3f, 0xf9, 0xae, 0xc5, 0x1f, 0xed, 0x99, - 0x41, 0xa8, 0xaf, 0x92, 0x12, 0x9b, 0x66, 0x10, 0xb6, 0x92, 0x82, 0xe2, 0x3e, 0xd4, 0x90, 0x76, - 0x49, 0x58, 0x54, 0xcc, 0x20, 0xbe, 0x60, 0x51, 0xff, 0x49, 0x79, 0x25, 0xbd, 0x60, 0xcb, 0x65, - 0x9f, 0x8b, 0x83, 0x78, 0x42, 0x89, 0xa8, 0xaf, 0x32, 0xfd, 0xf2, 0xd7, 0xb8, 0x11, 0xe9, 0xf2, - 0xe7, 0x99, 0xd7, 0x7f, 0xec, 0xe7, 0x99, 0x77, 0x00, 0xe2, 0xa8, 0xe0, 0xb8, 0x02, 0xa3, 0xe7, - 0x3a, 0x25, 0xfe, 0x10, 0xe7, 0xd1, 0x21, 0x5c, 0x69, 0x4c, 0x26, 0xbe, 0x35, 0xa1, 0x4f, 0x48, - 0xb9, 0x63, 0x7b, 0x22, 0x7d, 0x3e, 0x1b, 0xfb, 0xfb, 0x7a, 0xb3, 0xdf, 0xdb, 0xeb, 0xec, 0xcb, - 0x48, 0x68, 0x77, 0xe1, 0xed, 0x04, 0x70, 0x5f, 0xeb, 0x1f, 0x1f, 0x61, 0xa2, 0xd9, 0x18, 0xea, - 0x7d, 0xad, 0xd5, 0xd6, 0x94, 0xcc, 0xa3, 0xbb, 0x50, 0x69, 0x8a, 0x9d, 0x32, 0x8a, 0xce, 0xe6, - 0xb9, 0x16, 0xff, 0x50, 0x5d, 0xf7, 0xb7, 0x9f, 0x2a, 0x99, 0x47, 0x2a, 0x94, 0x13, 0x9f, 0x89, - 0x44, 0x8a, 0x03, 0x23, 0x38, 0x15, 0x1f, 0x2d, 0x33, 0xdc, 0x89, 0xa5, 0x64, 0x1e, 0x3d, 0x40, - 0x1d, 0x3e, 0xf9, 0x91, 0x46, 0x80, 0x8d, 0x9e, 0xe7, 0x4f, 0x0d, 0x47, 0xd0, 0x59, 0xf3, 0x00, - 0xe9, 0x3e, 0x82, 0xab, 0x2b, 0x3f, 0x39, 0x49, 0x6f, 0xc2, 0xec, 0xe9, 0xcc, 0xb1, 0xf8, 0xeb, - 0xa6, 0x83, 0xcb, 0x13, 0xdf, 0x36, 0x95, 0xcc, 0xa3, 0x67, 0x0b, 0x9f, 0x24, 0x3b, 0xee, 0xed, - 0xf6, 0x8f, 0x7b, 0x2d, 0x0a, 0x9c, 0x46, 0xf1, 0x09, 0x9b, 0xdd, 0xe3, 0x41, 0xe7, 0x85, 0xd8, - 0x5a, 0xdb, 0xdf, 0xc8, 0xe4, 0xfa, 0xa3, 0x6f, 0x64, 0x08, 0x10, 0xd9, 0xea, 0x6e, 0xbf, 0xd1, - 0xe2, 0x5b, 0x72, 0x14, 0x6e, 0x71, 0xb8, 0xcb, 0x3f, 0x65, 0xa6, 0xb5, 0x07, 0xc7, 0xdd, 0xa1, - 0x8c, 0xe4, 0x58, 0x03, 0xe8, 0x34, 0xdb, 0xbb, 0x6d, 0x6d, 0x1f, 0x09, 0xb2, 0x98, 0x3e, 0xec, - 0xf7, 0xf6, 0xfb, 0xad, 0x5d, 0x4c, 0xe7, 0x1e, 0xfd, 0xd7, 0xeb, 0xa0, 0x2c, 0x46, 0x6d, 0x61, - 0x6f, 0xc1, 0x75, 0x22, 0xd2, 0x8f, 0xb4, 0x76, 0xab, 0xd3, 0xe4, 0xee, 0xb0, 0x2f, 0x1a, 0xdd, - 0x0e, 0xd6, 0x79, 0x1d, 0xae, 0x2c, 0x22, 0x1b, 0xbd, 0x16, 0x8f, 0xef, 0xb6, 0x88, 0x68, 0xff, - 0xfa, 0xb8, 0xd1, 0x55, 0xd6, 0xd9, 0xdb, 0x70, 0x63, 0x11, 0xd5, 0xeb, 0x0f, 0x05, 0x3a, 0xcb, - 0xea, 0xb0, 0xbd, 0x88, 0xee, 0xb6, 0x07, 0xa8, 0x37, 0xdc, 0x86, 0x9b, 0xab, 0x30, 0x22, 0x67, - 0x7e, 0x55, 0x4b, 0xf7, 0x49, 0xed, 0xd0, 0x94, 0x0d, 0x64, 0x99, 0xd7, 0x20, 0x45, 0xfe, 0x02, - 0xbb, 0x06, 0x6c, 0xb9, 0xa7, 0x4a, 0x71, 0xe5, 0x08, 0x0c, 0xf8, 0xf7, 0xd3, 0x4b, 0xec, 0x0e, - 0xbc, 0xb5, 0x0a, 0xd9, 0x17, 0x1f, 0x58, 0x87, 0x47, 0x7f, 0x3f, 0x03, 0xf5, 0xd7, 0x3d, 0x8b, - 0x67, 0x2a, 0xdc, 0xd6, 0x8e, 0x7b, 0x14, 0x6f, 0x91, 0x87, 0x86, 0xd4, 0x9f, 0xb7, 0xbf, 0x5d, - 0x08, 0xa3, 0xf7, 0x36, 0xdc, 0x58, 0x41, 0xa3, 0x35, 0x5e, 0xea, 0x2f, 0x3e, 0x51, 0x32, 0xec, - 0x7d, 0x78, 0x77, 0x05, 0x7a, 0xaf, 0xdb, 0x6f, 0x0c, 0xf5, 0xdf, 0xb4, 0xb5, 0xbe, 0xde, 0xec, - 0xf6, 0x07, 0xed, 0x16, 0x12, 0xaf, 0xb3, 0x1d, 0xb8, 0xb5, 0x82, 0x78, 0xc0, 0xc3, 0x76, 0xbe, - 0xf8, 0x44, 0xc9, 0xb2, 0x77, 0xe0, 0xee, 0xeb, 0x29, 0xf6, 0x50, 0x33, 0x7b, 0xf1, 0x89, 0x92, - 0x7b, 0xf4, 0x2b, 0xa8, 0xbf, 0xee, 0xad, 0x19, 0x2e, 0x8b, 0xe6, 0x41, 0x83, 0xde, 0xf3, 0xa1, - 0x36, 0xd7, 0xd7, 0x79, 0x8a, 0x6c, 0xce, 0x5a, 0xbb, 0xdb, 0x26, 0x87, 0xec, 0x47, 0xbf, 0xcb, - 0x24, 0x4e, 0x36, 0xf2, 0xbd, 0x50, 0x04, 0x10, 0x6b, 0x35, 0x09, 0xd2, 0x2c, 0xc3, 0x54, 0x32, - 0x38, 0x4b, 0x29, 0x50, 0xd7, 0x1b, 0x19, 0x8e, 0xb2, 0x4e, 0xae, 0xd7, 0x12, 0x4e, 0xef, 0x5c, - 0x95, 0x2c, 0x0e, 0x5d, 0x04, 0xeb, 0x7a, 0xe7, 0x47, 0xbe, 0xed, 0xf9, 0x76, 0x78, 0xc9, 0xd1, - 0xb9, 0x47, 0xff, 0xb8, 0x70, 0x1b, 0x48, 0xc9, 0x3b, 0xac, 0xa0, 0x61, 0x9a, 0x31, 0x8c, 0xb6, - 0x58, 0xce, 0xeb, 0xa4, 0x5f, 0x2c, 0x20, 0x32, 0xc8, 0x1f, 0xd2, 0xfc, 0xb2, 0x88, 0x5c, 0x47, - 0xa4, 0x66, 0x91, 0xd3, 0xee, 0x12, 0x32, 0xbb, 0xfb, 0xd5, 0xdf, 0xfd, 0xab, 0xdb, 0x99, 0xff, - 0xf2, 0xaf, 0x6e, 0x67, 0xfe, 0xe7, 0xbf, 0xba, 0xbd, 0xf6, 0x67, 0xff, 0xeb, 0xed, 0xcc, 0x6f, - 0x3e, 0x9c, 0xd8, 0xe1, 0xe9, 0xfc, 0xe4, 0xf1, 0xc8, 0x9b, 0x7e, 0x34, 0x35, 0x42, 0xdf, 0xbe, - 0xe0, 0x8a, 0x8e, 0x4c, 0xb8, 0xd6, 0x47, 0xb3, 0xb3, 0xc9, 0x47, 0xb3, 0x93, 0x8f, 0x50, 0xe4, - 0x9e, 0x6c, 0xcc, 0x7c, 0x2f, 0xf4, 0x9e, 0xfe, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf5, 0xe1, - 0x44, 0x3a, 0x05, 0x97, 0x00, 0x00, + // 14795 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x6d, 0x8c, 0x23, 0xd9, + 0x92, 0x28, 0xd4, 0x2e, 0xdb, 0x65, 0x3b, 0xfc, 0x51, 0x59, 0xa7, 0xab, 0xab, 0xdd, 0x1f, 0xd3, + 0x5d, 0x9d, 0xdd, 0xd3, 0xd3, 0xd3, 0x33, 0xd3, 0x33, 0xd3, 0x3d, 0x1f, 0x3d, 0x77, 0xef, 0xbe, + 0xb9, 0x2e, 0xdb, 0x55, 0xe5, 0x69, 0x97, 0x5d, 0x37, 0xed, 0xea, 0x9e, 0xb9, 0x8f, 0x55, 0x2a, + 0xcb, 0x99, 0x76, 0xe5, 0x54, 0x3a, 0xd3, 0x93, 0x99, 0xee, 0xaa, 0xba, 0xd2, 0x13, 0x57, 0xfc, + 0xd8, 0xc7, 0x02, 0x3f, 0x90, 0x10, 0xf0, 0x0b, 0x69, 0x41, 0x42, 0x48, 0x08, 0x84, 0x40, 0x2b, + 0x16, 0x84, 0x04, 0xac, 0xf8, 0xf3, 0xa4, 0x07, 0x08, 0x78, 0x02, 0x04, 0x48, 0x0f, 0x58, 0xf8, + 0xc9, 0x13, 0x48, 0x20, 0x21, 0xf1, 0x07, 0x14, 0x71, 0xce, 0xc9, 0x0f, 0xdb, 0x3d, 0x3d, 0x73, + 0x77, 0x57, 0xe2, 0x4f, 0x95, 0x4f, 0x44, 0x9c, 0xef, 0x38, 0x71, 0x22, 0xe2, 0xc4, 0x39, 0x09, + 0x30, 0x73, 0x0c, 0xf7, 0xc9, 0xcc, 0xf7, 0x42, 0x8f, 0xe5, 0xf0, 0xf7, 0xcd, 0x8f, 0x26, 0x76, + 0x78, 0x3a, 0x3f, 0x79, 0x32, 0xf2, 0xa6, 0x1f, 0x4f, 0xbc, 0x89, 0xf7, 0x31, 0x21, 0x4f, 0xe6, + 0x63, 0x4a, 0x51, 0x82, 0x7e, 0xf1, 0x4c, 0x37, 0xc1, 0xf1, 0x46, 0x67, 0xe2, 0xf7, 0x46, 0x68, + 0x4f, 0xad, 0x20, 0x34, 0xa6, 0x33, 0x0e, 0x50, 0xff, 0x3c, 0x03, 0xb9, 0xe1, 0xe5, 0xcc, 0x62, + 0x35, 0x58, 0xb3, 0xcd, 0x7a, 0x66, 0x27, 0xf3, 0x28, 0xaf, 0xad, 0xd9, 0x26, 0xdb, 0x81, 0xb2, + 0xeb, 0x85, 0xbd, 0xb9, 0xe3, 0x18, 0x27, 0x8e, 0x55, 0x5f, 0xdb, 0xc9, 0x3c, 0x2a, 0x6a, 0x49, + 0x10, 0xbb, 0x05, 0x25, 0x63, 0x1e, 0x7a, 0xba, 0xed, 0x8e, 0xfc, 0x7a, 0x96, 0xf0, 0x45, 0x04, + 0x74, 0xdc, 0x91, 0xcf, 0xb6, 0x20, 0x7f, 0x6e, 0x9b, 0xe1, 0x69, 0x3d, 0x47, 0x25, 0xf2, 0x04, + 0x42, 0x83, 0x91, 0xe1, 0x58, 0xf5, 0x3c, 0x87, 0x52, 0x02, 0xa1, 0x21, 0x55, 0xb2, 0xbe, 0x93, + 0x79, 0x54, 0xd2, 0x78, 0x82, 0xdd, 0x01, 0xb0, 0xdc, 0xf9, 0xf4, 0xb5, 0xe1, 0xcc, 0xad, 0xa0, + 0x5e, 0x20, 0x54, 0x02, 0xa2, 0x7e, 0x0d, 0xa5, 0x69, 0x30, 0x39, 0xb0, 0x0c, 0xd3, 0xf2, 0xd9, + 0x75, 0x28, 0x4c, 0x83, 0x89, 0x1e, 0x1a, 0x13, 0xd1, 0x85, 0xf5, 0x69, 0x30, 0x19, 0x1a, 0x13, + 0x76, 0x03, 0x8a, 0x84, 0xb8, 0x9c, 0xf1, 0x3e, 0xe4, 0x35, 0x24, 0xc4, 0x1e, 0xab, 0x7f, 0xb2, + 0x0e, 0x85, 0xae, 0x1d, 0x5a, 0xbe, 0xe1, 0xb0, 0x6d, 0x58, 0xb7, 0x03, 0x77, 0xee, 0x38, 0x94, + 0xbd, 0xa8, 0x89, 0x14, 0xdb, 0x86, 0xbc, 0xfd, 0xfc, 0xb5, 0xe1, 0xf0, 0xbc, 0x07, 0x57, 0x34, + 0x9e, 0x64, 0x75, 0x58, 0xb7, 0x3f, 0xfd, 0x02, 0x11, 0x59, 0x81, 0x10, 0x69, 0xc2, 0x3c, 0x7b, + 0x8a, 0x98, 0x5c, 0x84, 0xa1, 0x34, 0x61, 0xbe, 0xf8, 0x0c, 0x31, 0xd8, 0xfb, 0x2c, 0x61, 0x28, + 0x8d, 0xb5, 0xcc, 0xa9, 0x16, 0x1c, 0x80, 0x2a, 0xd6, 0x32, 0x97, 0xb5, 0xcc, 0x79, 0x2d, 0x05, + 0x81, 0x10, 0x69, 0xc2, 0xf0, 0x5a, 0x8a, 0x11, 0x26, 0xaa, 0x65, 0xce, 0x6b, 0x29, 0xed, 0x64, + 0x1e, 0xe5, 0x08, 0xc3, 0x6b, 0xd9, 0x82, 0x9c, 0x89, 0x70, 0xd8, 0xc9, 0x3c, 0xca, 0x1c, 0x5c, + 0xd1, 0x28, 0x85, 0xd0, 0x00, 0xa1, 0x65, 0x1c, 0x60, 0x84, 0x06, 0x02, 0x7a, 0x82, 0xd0, 0x0a, + 0x8e, 0x06, 0x42, 0x4f, 0x04, 0x74, 0x8c, 0xd0, 0xea, 0x4e, 0xe6, 0xd1, 0x1a, 0x42, 0x31, 0xc5, + 0x6e, 0x42, 0xc1, 0x34, 0x42, 0x0b, 0x11, 0x35, 0xd1, 0x65, 0x09, 0x40, 0x1c, 0x72, 0x1c, 0xe2, + 0x36, 0x44, 0xa7, 0x25, 0x80, 0xa9, 0x50, 0x46, 0x32, 0x89, 0x57, 0x04, 0x3e, 0x09, 0x64, 0x9f, + 0x43, 0xc5, 0xb4, 0x46, 0xf6, 0xd4, 0x70, 0x78, 0x9f, 0x36, 0x77, 0x32, 0x8f, 0xca, 0x4f, 0x37, + 0x9e, 0xd0, 0x9a, 0x88, 0x30, 0x07, 0x57, 0xb4, 0x14, 0x19, 0x7b, 0x0e, 0x55, 0x91, 0xfe, 0xf4, + 0x29, 0x0d, 0x2c, 0xa3, 0x7c, 0x4a, 0x2a, 0xdf, 0xa7, 0x4f, 0x9f, 0x1f, 0x5c, 0xd1, 0xd2, 0x84, + 0xec, 0x01, 0x54, 0xa2, 0x25, 0x82, 0x19, 0xaf, 0x8a, 0x56, 0xa5, 0xa0, 0xd8, 0xad, 0xef, 0x03, + 0xcf, 0x45, 0x82, 0x2d, 0x31, 0x6e, 0x12, 0xc0, 0x76, 0x00, 0x4c, 0x6b, 0x6c, 0xcc, 0x9d, 0x10, + 0xd1, 0xd7, 0xc4, 0x00, 0x26, 0x60, 0xec, 0x0e, 0x94, 0xe6, 0x33, 0xec, 0xe5, 0x4b, 0xc3, 0xa9, + 0x6f, 0x0b, 0x82, 0x18, 0x84, 0xa5, 0x23, 0x9f, 0x23, 0xf6, 0xba, 0x98, 0x5d, 0x09, 0xc0, 0xe9, + 0x7d, 0x6d, 0x8d, 0x10, 0x55, 0x17, 0x15, 0x8b, 0x34, 0xae, 0x22, 0x3b, 0xd8, 0xb5, 0xdd, 0xfa, + 0x0d, 0xe2, 0x60, 0x9e, 0x60, 0xb7, 0x21, 0x1b, 0xf8, 0xa3, 0xfa, 0x4d, 0xea, 0x3f, 0xf0, 0xfe, + 0xb7, 0x2f, 0x66, 0xbe, 0x86, 0xe0, 0xdd, 0x02, 0xe4, 0x69, 0x35, 0xa9, 0xb7, 0xa1, 0x78, 0x64, + 0xf8, 0xc6, 0x54, 0xb3, 0xc6, 0x4c, 0x81, 0xec, 0xcc, 0x0b, 0xc4, 0x3a, 0xc2, 0x9f, 0x6a, 0x17, + 0xd6, 0x5f, 0x1a, 0x3e, 0xe2, 0x18, 0xe4, 0x5c, 0x63, 0x6a, 0x11, 0xb2, 0xa4, 0xd1, 0x6f, 0x5c, + 0x3b, 0xc1, 0x65, 0x10, 0x5a, 0x53, 0x21, 0x24, 0x44, 0x0a, 0xe1, 0x13, 0xc7, 0x3b, 0x11, 0x6b, + 0xa4, 0xa8, 0x89, 0x94, 0xfa, 0x4f, 0x64, 0x60, 0xbd, 0xe9, 0x39, 0x58, 0xdc, 0x75, 0x28, 0xf8, + 0x96, 0xa3, 0xc7, 0xd5, 0xad, 0xfb, 0x96, 0x73, 0xe4, 0x05, 0x88, 0x18, 0x79, 0x1c, 0xc1, 0x57, + 0xed, 0xfa, 0xc8, 0x23, 0x84, 0x6c, 0x40, 0x36, 0xd1, 0x80, 0x1b, 0x50, 0x0c, 0x4f, 0x1c, 0x9d, + 0xe0, 0x39, 0x82, 0x17, 0xc2, 0x13, 0xa7, 0x87, 0xa8, 0xeb, 0x50, 0x30, 0x4f, 0x38, 0x26, 0x4f, + 0x98, 0x75, 0xf3, 0x04, 0x11, 0xea, 0x57, 0x50, 0xd2, 0x8c, 0x73, 0xd1, 0x8c, 0x6b, 0xb0, 0x8e, + 0x05, 0x08, 0xf9, 0x97, 0xd3, 0xf2, 0xe1, 0x89, 0xd3, 0x31, 0x11, 0x8c, 0x8d, 0xb0, 0x4d, 0x6a, + 0x43, 0x4e, 0xcb, 0x8f, 0x3c, 0xa7, 0x63, 0xaa, 0x43, 0x80, 0xa6, 0xe7, 0xfb, 0xbf, 0x77, 0x17, + 0xb6, 0x20, 0x6f, 0x5a, 0xb3, 0xf0, 0x94, 0x8b, 0x0e, 0x8d, 0x27, 0xd4, 0xc7, 0x50, 0xc4, 0x79, + 0xe9, 0xda, 0x41, 0xc8, 0xee, 0x40, 0xce, 0xb1, 0x83, 0xb0, 0x9e, 0xd9, 0xc9, 0x2e, 0xcc, 0x1a, + 0xc1, 0xd5, 0x1d, 0x28, 0x1e, 0x1a, 0x17, 0x2f, 0x71, 0xe6, 0xb0, 0x34, 0x9a, 0x42, 0x31, 0x25, + 0x62, 0x3e, 0x2b, 0x00, 0x43, 0xc3, 0x9f, 0x58, 0x21, 0x49, 0xba, 0xff, 0x33, 0x03, 0xe5, 0xc1, + 0xfc, 0xe4, 0x87, 0xb9, 0xe5, 0x5f, 0x62, 0x9b, 0x1f, 0x41, 0x36, 0xbc, 0x9c, 0x51, 0x8e, 0xda, + 0xd3, 0x6d, 0x5e, 0x7c, 0x02, 0xff, 0x04, 0x33, 0x69, 0x48, 0x82, 0x9d, 0x70, 0x3d, 0xd3, 0x92, + 0x63, 0x90, 0xd7, 0xd6, 0x31, 0xd9, 0x31, 0x71, 0xbb, 0xf0, 0x66, 0x62, 0x16, 0xd6, 0xbc, 0x19, + 0xdb, 0x81, 0xfc, 0xe8, 0xd4, 0x76, 0x4c, 0x9a, 0x80, 0x74, 0x9b, 0x39, 0x02, 0x67, 0xc9, 0xf7, + 0xce, 0xf5, 0xc0, 0xfe, 0xad, 0x14, 0xff, 0x05, 0xdf, 0x3b, 0x1f, 0xd8, 0xbf, 0xb5, 0xd4, 0xa1, + 0xd8, 0x83, 0x00, 0xd6, 0x07, 0xcd, 0x46, 0xb7, 0xa1, 0x29, 0x57, 0xf0, 0x77, 0xfb, 0xdb, 0xce, + 0x60, 0x38, 0x50, 0x32, 0xac, 0x06, 0xd0, 0xeb, 0x0f, 0x75, 0x91, 0x5e, 0x63, 0xeb, 0xb0, 0xd6, + 0xe9, 0x29, 0x59, 0xa4, 0x41, 0x78, 0xa7, 0xa7, 0xe4, 0x58, 0x01, 0xb2, 0x8d, 0xde, 0x77, 0x4a, + 0x9e, 0x7e, 0x74, 0xbb, 0xca, 0xba, 0xfa, 0xff, 0xac, 0x41, 0xa9, 0x7f, 0xf2, 0xbd, 0x35, 0x0a, + 0xb1, 0xcf, 0xc8, 0xa5, 0x96, 0xff, 0xda, 0xf2, 0xa9, 0xdb, 0x59, 0x4d, 0xa4, 0xb0, 0x23, 0xe6, + 0x09, 0x75, 0x2e, 0xab, 0xad, 0x99, 0x27, 0x44, 0x37, 0x3a, 0xb5, 0xa6, 0x06, 0x75, 0x0e, 0xe9, + 0x28, 0x85, 0xab, 0xc2, 0x3b, 0xf9, 0x9e, 0xba, 0x97, 0xd5, 0xf0, 0x27, 0xbb, 0x0b, 0x65, 0x5e, + 0x46, 0x92, 0xbf, 0x80, 0x83, 0x16, 0x99, 0x6f, 0x3d, 0xc9, 0x7c, 0x94, 0x93, 0x4a, 0xe5, 0x48, + 0xb1, 0xb7, 0x71, 0x50, 0x4f, 0x70, 0xb4, 0x77, 0xf2, 0x3d, 0xc7, 0x16, 0x39, 0x47, 0x7b, 0x27, + 0xdf, 0x13, 0xea, 0x03, 0xd8, 0x0c, 0xe6, 0x27, 0xc1, 0xc8, 0xb7, 0x67, 0xa1, 0xed, 0xb9, 0x9c, + 0xa6, 0x44, 0x34, 0x4a, 0x12, 0x41, 0xc4, 0x8f, 0xa0, 0x38, 0x9b, 0x9f, 0xe8, 0xb6, 0x3b, 0xf6, + 0x48, 0xec, 0x97, 0x9f, 0x56, 0xf9, 0xc4, 0x1c, 0xcd, 0x4f, 0x3a, 0xee, 0xd8, 0xd3, 0x0a, 0x33, + 0xfe, 0x83, 0xa9, 0x50, 0x75, 0xbd, 0x50, 0x47, 0x55, 0x41, 0x9f, 0x5a, 0xa1, 0x41, 0xfb, 0x01, + 0xdf, 0xf0, 0xbb, 0xde, 0xe8, 0xec, 0xd0, 0x0a, 0x0d, 0xf6, 0x18, 0x8a, 0x81, 0x6b, 0xcc, 0x82, + 0x53, 0x2f, 0xa4, 0x8d, 0xa1, 0xfc, 0xb4, 0x26, 0x78, 0x47, 0x40, 0xb5, 0x08, 0xaf, 0x3e, 0x84, + 0x82, 0xa8, 0x03, 0xf5, 0x84, 0xd0, 0x72, 0x0d, 0x37, 0xd4, 0x23, 0x05, 0xa3, 0xc8, 0x01, 0x1d, + 0x53, 0xfd, 0xb3, 0x0c, 0x28, 0x83, 0x44, 0xb3, 0xa9, 0xa2, 0x55, 0x52, 0xe6, 0x1d, 0x00, 0x63, + 0x34, 0xf2, 0xe6, 0xbc, 0x18, 0xce, 0x8c, 0x25, 0x01, 0xe9, 0x98, 0xc9, 0xb1, 0xce, 0xa6, 0xc6, + 0xfa, 0x1e, 0x54, 0x64, 0xbe, 0x84, 0x80, 0x28, 0x0b, 0x98, 0x1c, 0xed, 0x60, 0x9e, 0x92, 0x12, + 0x85, 0x60, 0xce, 0x73, 0x6f, 0xc3, 0x3a, 0x69, 0x23, 0x81, 0x9c, 0x41, 0x9e, 0x52, 0xff, 0xdb, + 0x0c, 0x54, 0x3b, 0xae, 0x69, 0x5d, 0x0c, 0x46, 0x86, 0x2b, 0x07, 0xd0, 0x0e, 0x74, 0x1b, 0x61, + 0x7a, 0x30, 0x32, 0x5c, 0xa1, 0x48, 0x94, 0xed, 0x20, 0xa2, 0xc3, 0x3e, 0x70, 0x02, 0xaa, 0x6a, + 0x8d, 0x4a, 0x2c, 0x11, 0x84, 0x2a, 0x7b, 0x08, 0x1b, 0x27, 0x96, 0xe3, 0xb9, 0x13, 0x3d, 0xf4, + 0x74, 0xae, 0x11, 0xf1, 0xbe, 0x54, 0x39, 0x78, 0xe8, 0x0d, 0x49, 0x33, 0xda, 0x82, 0xfc, 0xcc, + 0xf0, 0xc3, 0xa0, 0x9e, 0xdb, 0xc9, 0xe2, 0x92, 0xa7, 0x04, 0x0e, 0xb3, 0x1d, 0xe8, 0x73, 0xd7, + 0xfe, 0x61, 0xce, 0xbb, 0x51, 0xd4, 0x8a, 0x76, 0x70, 0x4c, 0x69, 0xf6, 0x08, 0x14, 0x5e, 0x33, + 0x15, 0x9b, 0xe4, 0xc9, 0x1a, 0xc1, 0xa9, 0x60, 0x12, 0x8c, 0xff, 0xdb, 0x1a, 0x14, 0xf7, 0xe6, + 0xee, 0x08, 0x27, 0x83, 0xdd, 0x87, 0xdc, 0x78, 0xee, 0x8e, 0xa8, 0x2f, 0xd1, 0xb6, 0x1b, 0xad, + 0x29, 0x8d, 0x90, 0x28, 0xad, 0x0c, 0x7f, 0x82, 0x52, 0x6e, 0x49, 0x5a, 0x21, 0x9c, 0x66, 0x6e, + 0x32, 0xd1, 0x47, 0x9e, 0x3b, 0xb6, 0x27, 0xd4, 0xa3, 0x8a, 0x56, 0x32, 0x26, 0x93, 0x26, 0x01, + 0x58, 0x03, 0x36, 0x62, 0x34, 0x57, 0xd4, 0x72, 0x24, 0x98, 0x6e, 0xf0, 0x92, 0x1a, 0x93, 0x89, + 0x6f, 0x4d, 0x8c, 0xd0, 0xe2, 0xf4, 0x24, 0x9b, 0xaa, 0x51, 0x76, 0x92, 0x6f, 0xff, 0x5e, 0x86, + 0xb7, 0x79, 0xcf, 0x31, 0x26, 0xac, 0x08, 0xb9, 0x5e, 0xbf, 0xd7, 0x56, 0xae, 0xb0, 0x0a, 0x14, + 0x3b, 0xbd, 0x61, 0x5b, 0xeb, 0x35, 0xba, 0x4a, 0x86, 0x84, 0xcb, 0xb0, 0xb1, 0xdb, 0x6d, 0x2b, + 0x6b, 0x88, 0x79, 0xd9, 0xef, 0x36, 0x86, 0x9d, 0x6e, 0x5b, 0xc9, 0x71, 0x8c, 0xd6, 0x69, 0x0e, + 0x95, 0x22, 0x53, 0xa0, 0x72, 0xa4, 0xf5, 0x5b, 0xc7, 0xcd, 0xb6, 0xde, 0x3b, 0xee, 0x76, 0x15, + 0x85, 0x5d, 0x85, 0x8d, 0x08, 0xd2, 0xe7, 0xc0, 0x1d, 0xcc, 0xf2, 0xb2, 0xa1, 0x35, 0xb4, 0x7d, + 0xe5, 0x57, 0xac, 0x08, 0xd9, 0xc6, 0xfe, 0xbe, 0xf2, 0x3b, 0x94, 0x53, 0xa5, 0x57, 0x9d, 0x9e, + 0xfe, 0xb2, 0xd1, 0x3d, 0x6e, 0x2b, 0xbf, 0x5b, 0x93, 0xe9, 0xbe, 0xd6, 0x6a, 0x6b, 0xca, 0xef, + 0x72, 0x6c, 0x13, 0x2a, 0xbf, 0xe9, 0xf7, 0xda, 0x87, 0x8d, 0xa3, 0x23, 0x6a, 0xc8, 0xef, 0x8a, + 0xea, 0x3f, 0xca, 0x41, 0x0e, 0xc7, 0x8a, 0xa9, 0xb1, 0x4c, 0x8e, 0x06, 0x11, 0x3b, 0xb7, 0x9b, + 0xfb, 0x7b, 0xff, 0xf0, 0xee, 0x15, 0x2e, 0x8d, 0xef, 0x41, 0xd6, 0xb1, 0x43, 0x62, 0x9c, 0x68, + 0x25, 0x0b, 0x0d, 0xf6, 0xe0, 0x8a, 0x86, 0x38, 0x76, 0x07, 0x32, 0x5c, 0x2c, 0x47, 0x8b, 0x53, + 0xee, 0xeb, 0x07, 0x57, 0xb4, 0xcc, 0x8c, 0xdd, 0x86, 0xcc, 0x6b, 0x21, 0xa3, 0x2b, 0x1c, 0xcf, + 0x77, 0x76, 0xc4, 0xbe, 0x66, 0x3b, 0x90, 0x1d, 0x79, 0x5c, 0x3f, 0x8d, 0xf0, 0x7c, 0x9f, 0xc3, + 0xf2, 0x47, 0x9e, 0xc3, 0xee, 0x43, 0xd6, 0x37, 0xce, 0x89, 0x77, 0x22, 0x86, 0x88, 0x36, 0x52, + 0x24, 0xf2, 0x8d, 0x73, 0x6c, 0xc4, 0x98, 0xa4, 0x5a, 0xd4, 0x08, 0xc9, 0x51, 0x58, 0xcd, 0x98, + 0xed, 0x40, 0xe6, 0x9c, 0xe4, 0x5a, 0xa4, 0x92, 0xbd, 0xb2, 0x5d, 0xd3, 0x3b, 0x1f, 0xcc, 0xac, + 0x11, 0x52, 0x9c, 0xb3, 0x77, 0x21, 0x1b, 0xcc, 0x4f, 0x48, 0xae, 0x95, 0x9f, 0x6e, 0x2e, 0xed, + 0x50, 0x58, 0x51, 0x30, 0x3f, 0x61, 0x0f, 0x21, 0x37, 0xf2, 0x7c, 0x5f, 0xc8, 0x36, 0x45, 0x36, + 0x58, 0x6e, 0xce, 0xa8, 0xa2, 0x22, 0x1e, 0x2b, 0x0c, 0x49, 0xa2, 0x45, 0x44, 0xf1, 0xee, 0x88, + 0x15, 0x86, 0xec, 0x81, 0xd8, 0x72, 0x53, 0x72, 0x4d, 0x6e, 0xc8, 0x58, 0x0e, 0x62, 0x71, 0x92, + 0xa6, 0xc6, 0x05, 0xe9, 0xbf, 0x11, 0x91, 0xdc, 0x89, 0xb1, 0x4d, 0x53, 0xe3, 0x82, 0x3d, 0x80, + 0xec, 0x6b, 0x6b, 0x44, 0xaa, 0x70, 0x54, 0x9b, 0x98, 0xa4, 0x97, 0xd4, 0x3d, 0x44, 0xd3, 0xca, + 0xf2, 0x1c, 0x93, 0xb4, 0xe2, 0x68, 0x2e, 0xf7, 0x3c, 0xc7, 0x7c, 0x49, 0x73, 0x49, 0x48, 0x54, + 0x40, 0x8c, 0xf9, 0x05, 0xca, 0x3b, 0x85, 0xab, 0x0a, 0xc6, 0xfc, 0xa2, 0x63, 0xe2, 0x56, 0xe4, + 0x9a, 0xaf, 0x49, 0x17, 0xce, 0x68, 0xf8, 0x13, 0x8d, 0xb5, 0xc0, 0x72, 0xac, 0x51, 0x68, 0xbf, + 0xb6, 0xc3, 0x4b, 0xd2, 0x76, 0x33, 0x5a, 0x12, 0xb4, 0xbb, 0x0e, 0x39, 0xeb, 0x62, 0xe6, 0xab, + 0x07, 0x50, 0x10, 0xb5, 0x2c, 0x59, 0x7c, 0x37, 0xa0, 0x68, 0x07, 0xb8, 0x0e, 0x83, 0x50, 0x68, + 0x72, 0x05, 0x3b, 0x68, 0x62, 0x12, 0x05, 0xb2, 0x69, 0x84, 0x86, 0x58, 0xbc, 0xf4, 0x5b, 0x7d, + 0x0a, 0x10, 0x77, 0x0b, 0xdb, 0xe4, 0x58, 0xae, 0x54, 0x1a, 0x1d, 0xcb, 0x8d, 0xf2, 0xac, 0x25, + 0xf2, 0xdc, 0x80, 0x52, 0xa4, 0xa7, 0xb3, 0x0a, 0x64, 0x0c, 0xb1, 0x19, 0x67, 0x0c, 0xf5, 0x11, + 0xaa, 0xcd, 0x52, 0x13, 0x4f, 0xe3, 0x30, 0x25, 0xb7, 0xe8, 0xcc, 0x89, 0xfa, 0x4b, 0xa8, 0x68, + 0x56, 0x30, 0x77, 0xc2, 0xa6, 0xe7, 0xb4, 0xac, 0x31, 0xfb, 0x10, 0x20, 0x4a, 0x07, 0x42, 0x67, + 0x8a, 0x79, 0xb7, 0x65, 0x8d, 0xb5, 0x04, 0x5e, 0xfd, 0x9f, 0x73, 0xa4, 0x7d, 0xb6, 0xb8, 0xda, + 0x27, 0xf4, 0xbb, 0x4c, 0x42, 0xbf, 0x8b, 0x76, 0x9f, 0xb5, 0xb4, 0x8e, 0x7b, 0x6a, 0x9b, 0xa6, + 0xe5, 0x4a, 0x5d, 0x96, 0xa7, 0x70, 0xb2, 0x0d, 0x67, 0x22, 0x04, 0x16, 0x93, 0x95, 0x4e, 0x67, + 0xbe, 0x15, 0x04, 0x5c, 0x8b, 0x32, 0x9c, 0x89, 0x5c, 0xdb, 0xf9, 0x1f, 0x5b, 0xdb, 0x37, 0xa0, + 0x88, 0x1b, 0x30, 0xd9, 0xa0, 0xeb, 0x7c, 0xf4, 0x85, 0xb1, 0xcd, 0xde, 0x83, 0x82, 0xb0, 0x1e, + 0xc4, 0xa2, 0x12, 0xec, 0xd2, 0xe2, 0x40, 0x4d, 0x62, 0x59, 0x1d, 0x55, 0xce, 0xe9, 0xd4, 0x72, + 0x43, 0xa9, 0x35, 0x88, 0x24, 0xfb, 0x00, 0x4a, 0x9e, 0xab, 0x73, 0x13, 0x43, 0xac, 0x2a, 0xc1, + 0xbe, 0x7d, 0xf7, 0x98, 0xa0, 0x5a, 0xd1, 0x13, 0xbf, 0xb0, 0x29, 0x8e, 0x77, 0xae, 0x8f, 0x0c, + 0xdf, 0xa4, 0x95, 0x55, 0xd4, 0x0a, 0x8e, 0x77, 0xde, 0x34, 0x7c, 0x93, 0x6b, 0x51, 0x3f, 0xb8, + 0xf3, 0x29, 0xad, 0xa6, 0xaa, 0x26, 0x52, 0xec, 0x36, 0x94, 0x46, 0xce, 0x3c, 0x08, 0x2d, 0x7f, + 0xf7, 0x92, 0x1b, 0x8d, 0x5a, 0x0c, 0xc0, 0x76, 0xcd, 0x7c, 0x7b, 0x6a, 0xf8, 0x97, 0xb4, 0x74, + 0x8a, 0x9a, 0x4c, 0xd2, 0x56, 0x76, 0x66, 0x9b, 0x17, 0xdc, 0x72, 0xd4, 0x78, 0x02, 0xe9, 0x4f, + 0xc9, 0xae, 0x0f, 0x68, 0x7d, 0x14, 0x35, 0x99, 0xa4, 0x79, 0xa0, 0x9f, 0xb4, 0x22, 0x4a, 0x9a, + 0x48, 0xa5, 0x4c, 0x80, 0xcd, 0x37, 0x9a, 0x00, 0x6c, 0x51, 0x0b, 0xf3, 0x7c, 0x7b, 0x62, 0x0b, + 0x1d, 0xea, 0x2a, 0xd7, 0xc2, 0x38, 0x88, 0x08, 0xbe, 0x84, 0xea, 0xc4, 0x72, 0x2d, 0xdf, 0x08, + 0x2d, 0x53, 0x47, 0xb9, 0xb8, 0x45, 0x03, 0x27, 0xa6, 0x79, 0x5f, 0xa2, 0x50, 0xd6, 0x54, 0x26, + 0x89, 0x94, 0xfa, 0x03, 0x14, 0xc4, 0xdc, 0xe0, 0xe6, 0x88, 0xeb, 0x2e, 0x2d, 0xd7, 0xf9, 0xe6, + 0x88, 0x70, 0x76, 0x1f, 0xaa, 0xa2, 0x11, 0x41, 0xe8, 0xdb, 0xee, 0x44, 0x70, 0x5d, 0x85, 0x03, + 0x07, 0x04, 0x43, 0x1d, 0x06, 0xf9, 0x42, 0x37, 0x4e, 0x6c, 0x07, 0xd7, 0x77, 0x56, 0xe8, 0x66, + 0x73, 0xc7, 0x69, 0x70, 0x90, 0xda, 0x87, 0xa2, 0x9c, 0xc9, 0xbf, 0x96, 0x3a, 0xd5, 0x19, 0x54, + 0x92, 0x3d, 0xfc, 0xeb, 0xe9, 0x08, 0xd7, 0x51, 0x82, 0xd0, 0xf3, 0x2d, 0x53, 0xba, 0x8c, 0xec, + 0x60, 0x40, 0x69, 0xf5, 0x8f, 0x33, 0x50, 0x26, 0x5d, 0xa9, 0x4f, 0x9a, 0x20, 0xfb, 0x10, 0xd8, + 0xc8, 0xb7, 0x8c, 0xd0, 0xd2, 0xad, 0x8b, 0xd0, 0x37, 0x84, 0x46, 0xc4, 0xd5, 0x2a, 0x85, 0x63, + 0xda, 0x88, 0xe0, 0x4a, 0xd1, 0x5d, 0x28, 0xcf, 0x0c, 0x3f, 0x90, 0xda, 0x38, 0xaf, 0x1d, 0x38, + 0x48, 0xe8, 0xc2, 0x8a, 0x3b, 0xf1, 0x8d, 0xa9, 0x1e, 0x7a, 0x67, 0x96, 0xcb, 0xed, 0x10, 0x6e, + 0x81, 0xd5, 0x08, 0x3e, 0x44, 0x30, 0x99, 0x23, 0xff, 0x7d, 0x06, 0xaa, 0x47, 0x9c, 0x41, 0x5f, + 0x58, 0x97, 0x2d, 0x6e, 0xf6, 0x8e, 0xa4, 0x70, 0xc9, 0x69, 0xf4, 0x9b, 0xdd, 0x81, 0xf2, 0xec, + 0xcc, 0xba, 0xd4, 0x53, 0x26, 0x62, 0x09, 0x41, 0x4d, 0x12, 0x23, 0xef, 0xc3, 0xba, 0x47, 0x1d, + 0x11, 0xdb, 0xb1, 0xd8, 0xc5, 0x12, 0x3d, 0xd4, 0x04, 0x01, 0xea, 0x8e, 0x51, 0x51, 0x49, 0x25, + 0x55, 0x14, 0x46, 0xcd, 0xdf, 0x82, 0x3c, 0xa2, 0x82, 0x7a, 0x9e, 0x2b, 0x7d, 0x94, 0x60, 0x9f, + 0x40, 0x75, 0xe4, 0x4d, 0x67, 0xba, 0xcc, 0x2e, 0x36, 0xe6, 0xb4, 0xf8, 0x2b, 0x23, 0xc9, 0x11, + 0x2f, 0x4b, 0xfd, 0x8b, 0x2c, 0x14, 0xa9, 0x0d, 0x42, 0x02, 0xda, 0xe6, 0x85, 0x94, 0x80, 0x25, + 0x2d, 0x6f, 0x9b, 0xb8, 0xc1, 0xbc, 0x45, 0x4f, 0x8d, 0xf4, 0xcf, 0x6c, 0x52, 0xff, 0xdc, 0x86, + 0x75, 0xa1, 0x7c, 0xe6, 0xb8, 0x88, 0x9c, 0xbf, 0x59, 0xf5, 0xcc, 0xaf, 0x52, 0x3d, 0x71, 0x0a, + 0x39, 0x8d, 0x75, 0x81, 0x5b, 0x31, 0x97, 0x82, 0x40, 0xa0, 0x36, 0x42, 0x92, 0xf2, 0xad, 0x90, + 0x96, 0x6f, 0x75, 0x28, 0xbc, 0xb6, 0x03, 0x1b, 0x19, 0xa4, 0xc8, 0x25, 0x86, 0x48, 0x26, 0xa6, + 0xa1, 0xf4, 0xb6, 0x69, 0x88, 0xba, 0x6d, 0x38, 0x13, 0x6e, 0x2f, 0xc9, 0x6e, 0x37, 0x9c, 0x89, + 0xc7, 0x3e, 0x85, 0x6b, 0x31, 0x5a, 0xf4, 0x86, 0xd4, 0x55, 0x72, 0x9d, 0x69, 0x2c, 0xa2, 0xa4, + 0x1e, 0x91, 0x41, 0xfb, 0x18, 0x36, 0x13, 0x59, 0x66, 0xa8, 0x89, 0x05, 0x24, 0x1e, 0x4b, 0xda, + 0x46, 0x44, 0x4e, 0x0a, 0x5a, 0xc0, 0xde, 0xc7, 0x71, 0x1a, 0x39, 0x73, 0x93, 0x0b, 0x9b, 0xf9, + 0xd4, 0x0d, 0xea, 0x55, 0x1a, 0xe0, 0x0d, 0x09, 0x6f, 0x72, 0xb0, 0xfa, 0x27, 0x79, 0xa8, 0xee, + 0x79, 0xbe, 0x65, 0x4f, 0xdc, 0x98, 0x41, 0x97, 0x2c, 0x26, 0xc9, 0xb4, 0x6b, 0x09, 0xa6, 0xbd, + 0x0b, 0xe5, 0x31, 0xcf, 0xa8, 0x87, 0x27, 0xdc, 0x31, 0x93, 0xd3, 0x40, 0x80, 0x86, 0x27, 0x0e, + 0x8a, 0x1a, 0x49, 0x40, 0x99, 0x73, 0x94, 0x59, 0x66, 0xc2, 0x1d, 0x94, 0xfd, 0x82, 0xf6, 0x12, + 0xd3, 0x72, 0xac, 0x90, 0xcf, 0x64, 0xed, 0xe9, 0x3b, 0x52, 0x7f, 0x49, 0xb4, 0xe9, 0x89, 0x66, + 0x8d, 0x1b, 0xa4, 0xf4, 0xe1, 0xd6, 0xd2, 0x22, 0x72, 0x91, 0x57, 0xec, 0x43, 0xeb, 0x3f, 0x31, + 0xaf, 0x10, 0x6b, 0x4f, 0xe1, 0x9a, 0x6f, 0x8d, 0x2d, 0xdf, 0x72, 0x47, 0x96, 0xa9, 0x27, 0x18, + 0x94, 0xf3, 0xc2, 0xd5, 0x18, 0xd9, 0x89, 0x58, 0xf5, 0x10, 0x94, 0xa8, 0xad, 0x3a, 0x17, 0x45, + 0xc4, 0x20, 0xb5, 0xa7, 0xf7, 0x7f, 0xb4, 0xda, 0x3e, 0x91, 0x6a, 0x35, 0xd9, 0x70, 0x9e, 0x16, + 0xc5, 0xf1, 0xe6, 0xcb, 0xe2, 0x4a, 0x3f, 0xab, 0x38, 0xde, 0x17, 0x9e, 0x56, 0x87, 0x50, 0x8a, + 0x48, 0xd0, 0x26, 0xd1, 0xda, 0xc2, 0x0e, 0xb9, 0xc2, 0xca, 0x50, 0x68, 0x36, 0x06, 0xcd, 0x46, + 0xab, 0xad, 0x64, 0x10, 0x35, 0x68, 0x0f, 0xb9, 0xed, 0xb1, 0xc6, 0x36, 0xa0, 0x8c, 0xa9, 0x56, + 0x7b, 0xaf, 0x71, 0xdc, 0x1d, 0x2a, 0x59, 0x56, 0x85, 0x52, 0xaf, 0xaf, 0x37, 0x9a, 0xc3, 0x4e, + 0xbf, 0xa7, 0xe4, 0x54, 0x07, 0x36, 0x16, 0x2a, 0x66, 0x37, 0x61, 0x9b, 0xa3, 0xf5, 0xbe, 0xd6, + 0xd9, 0xef, 0xf4, 0xf4, 0xf6, 0xb7, 0x47, 0xdd, 0x4e, 0xb3, 0x83, 0x35, 0xdd, 0x80, 0x6b, 0x69, + 0x9c, 0x2c, 0x38, 0xc3, 0x54, 0xb8, 0x93, 0x46, 0x75, 0xdb, 0xfb, 0x8d, 0xe6, 0x77, 0x7a, 0xe3, + 0x70, 0xb7, 0xb3, 0x7f, 0xdc, 0x3f, 0x1e, 0x28, 0x6b, 0xaa, 0x0e, 0xc5, 0xe6, 0xa9, 0x35, 0x3a, + 0x7b, 0x13, 0x17, 0x92, 0x63, 0xc8, 0x1a, 0x9d, 0x09, 0xab, 0x65, 0xc1, 0x31, 0x64, 0x8d, 0xce, + 0x70, 0xd9, 0xc9, 0x9d, 0xe3, 0x07, 0x47, 0x58, 0xbc, 0x25, 0xb1, 0x6d, 0xfc, 0xe0, 0xa8, 0x6d, + 0x28, 0x1d, 0x19, 0x7e, 0x68, 0xd3, 0x20, 0x3d, 0x87, 0x6a, 0x94, 0x68, 0x59, 0x63, 0xa9, 0xee, + 0xb1, 0xc8, 0xd4, 0x89, 0x50, 0x5a, 0x9a, 0x50, 0xfd, 0x10, 0x2a, 0x49, 0x00, 0xbb, 0x0d, 0x59, + 0xd3, 0x1a, 0xaf, 0xd8, 0xce, 0x10, 0xac, 0xbe, 0x84, 0x4a, 0x53, 0xaa, 0x2f, 0x6f, 0xea, 0xd9, + 0x53, 0xa8, 0x91, 0xec, 0x1d, 0x9d, 0x48, 0xe1, 0xbb, 0xb6, 0x42, 0xf8, 0x56, 0x90, 0xa6, 0x79, + 0x22, 0xa4, 0xef, 0xe7, 0x50, 0x3e, 0xf2, 0xbd, 0x99, 0xe5, 0x87, 0x54, 0xac, 0x02, 0xd9, 0x33, + 0xeb, 0x52, 0x94, 0x8a, 0x3f, 0x63, 0x77, 0xde, 0x5a, 0xd2, 0x9d, 0xf7, 0x14, 0x8a, 0x32, 0xdb, + 0x4f, 0xce, 0xf3, 0x35, 0x6e, 0x62, 0x94, 0xc7, 0xb6, 0x02, 0xac, 0xec, 0x09, 0xc0, 0x2c, 0x02, + 0x88, 0x81, 0x93, 0x36, 0xa2, 0x28, 0x5c, 0x4b, 0x50, 0xa8, 0xef, 0x40, 0xe1, 0xa5, 0x6d, 0x9d, + 0x8b, 0xee, 0xbf, 0xb6, 0xad, 0x73, 0xd9, 0x7d, 0xfc, 0xad, 0xfe, 0xdf, 0x25, 0x28, 0x92, 0xa4, + 0x6b, 0xbd, 0xd9, 0x83, 0xfa, 0x73, 0x54, 0xe9, 0x1d, 0x21, 0xae, 0x72, 0x2b, 0x14, 0x78, 0x2e, + 0xbc, 0xde, 0x01, 0x48, 0x48, 0x5d, 0xbe, 0x87, 0x94, 0xc2, 0x48, 0xd8, 0xa2, 0x0e, 0x4a, 0x5a, + 0x01, 0xb2, 0x11, 0x77, 0x6e, 0xc4, 0x00, 0xf6, 0x84, 0x6b, 0x88, 0xe4, 0xce, 0xe0, 0x5a, 0xf4, + 0x55, 0x69, 0x09, 0x9e, 0x38, 0x96, 0xb4, 0x4f, 0x49, 0x6d, 0xc4, 0x04, 0xed, 0x28, 0x96, 0x1f, + 0xe0, 0xc6, 0x41, 0x47, 0x2c, 0x9a, 0x4c, 0xb2, 0xf7, 0x20, 0x87, 0xdb, 0xad, 0xb0, 0x27, 0xaf, + 0xca, 0x11, 0x4c, 0xe8, 0x0b, 0x1a, 0x11, 0xb0, 0x47, 0x50, 0x20, 0x29, 0x65, 0xa1, 0xcc, 0x4f, + 0x8c, 0xb6, 0xdc, 0x7e, 0x35, 0x89, 0x66, 0xef, 0x43, 0x7e, 0x7c, 0x66, 0x5d, 0x72, 0x81, 0x1f, + 0x95, 0x99, 0x12, 0x26, 0x1a, 0xa7, 0x60, 0x0f, 0xa0, 0xe6, 0x5b, 0x63, 0x9d, 0x7c, 0xaa, 0x28, + 0xc3, 0x83, 0x7a, 0x8d, 0x44, 0x74, 0xc5, 0xb7, 0xc6, 0x4d, 0x04, 0x0e, 0x4f, 0x9c, 0x80, 0x3d, + 0x84, 0x75, 0x5a, 0x5c, 0xa8, 0x40, 0x27, 0x6a, 0x96, 0x2b, 0x55, 0x13, 0x58, 0xf6, 0x29, 0x80, + 0x50, 0xd3, 0xf5, 0x93, 0x4b, 0x3a, 0x8b, 0x88, 0x16, 0x53, 0x92, 0xff, 0x93, 0xca, 0xfc, 0x7b, + 0x90, 0x47, 0x26, 0x09, 0xea, 0xd7, 0xa9, 0xe4, 0xcd, 0x34, 0x07, 0x51, 0x4b, 0x09, 0xcf, 0x1e, + 0x41, 0x11, 0x19, 0x85, 0x56, 0x75, 0x3d, 0x69, 0xb7, 0x08, 0xae, 0xc2, 0x3d, 0xda, 0x3a, 0x1f, + 0xfc, 0xe0, 0xb0, 0xc7, 0x90, 0x33, 0x71, 0x31, 0xdf, 0xa0, 0x12, 0xb7, 0x13, 0xf3, 0x82, 0x52, + 0xb4, 0x65, 0x8d, 0xc9, 0x94, 0x22, 0x1a, 0x76, 0x00, 0x35, 0x64, 0xa3, 0xa7, 0xa4, 0x76, 0xe1, + 0xf0, 0xd5, 0x6f, 0x52, 0xae, 0x7b, 0x0b, 0xb9, 0x7a, 0x82, 0x88, 0x06, 0xbb, 0xed, 0x86, 0xfe, + 0xa5, 0x56, 0x75, 0x93, 0x30, 0x76, 0x13, 0xed, 0xdd, 0xae, 0x37, 0x3a, 0xb3, 0xcc, 0xfa, 0x2d, + 0xa9, 0x8b, 0xf2, 0x34, 0xfb, 0x0a, 0xaa, 0xc4, 0x58, 0x98, 0xc4, 0xca, 0xeb, 0xb7, 0x49, 0xca, + 0x27, 0x59, 0x46, 0xa2, 0xb4, 0x34, 0x25, 0xee, 0xa0, 0x76, 0xa0, 0x87, 0xd6, 0x74, 0xe6, 0xf9, + 0x68, 0xf1, 0xbc, 0x23, 0xfd, 0x80, 0x43, 0x09, 0x42, 0x95, 0x28, 0x3a, 0x39, 0xd5, 0xbd, 0xf1, + 0x38, 0xb0, 0xc2, 0xfa, 0x1d, 0x5a, 0x37, 0x35, 0x79, 0x80, 0xda, 0x27, 0x28, 0xa9, 0x24, 0x81, + 0x6e, 0x5e, 0xba, 0xc6, 0xd4, 0x1e, 0xd5, 0xef, 0x72, 0xc3, 0xca, 0x0e, 0x5a, 0x1c, 0x90, 0xb4, + 0x6d, 0x76, 0x52, 0xb6, 0xcd, 0x55, 0xc8, 0x9b, 0x27, 0xb8, 0x1c, 0xef, 0x51, 0xb1, 0x39, 0xf3, + 0xa4, 0x63, 0xb2, 0x8f, 0xa0, 0x34, 0x93, 0x22, 0xb0, 0xae, 0x26, 0x3d, 0x38, 0x91, 0x64, 0xd4, + 0x62, 0x0a, 0xb6, 0x03, 0xe5, 0x3d, 0xcb, 0x08, 0xe7, 0xbe, 0xb5, 0xe7, 0x18, 0x93, 0xfa, 0x7d, + 0x2a, 0x29, 0x09, 0xc2, 0xd6, 0x39, 0xde, 0xc4, 0x1e, 0x19, 0xb4, 0xf2, 0x1f, 0x70, 0x0d, 0x58, + 0x40, 0x3a, 0x66, 0x6c, 0x12, 0x18, 0x42, 0xad, 0x7d, 0x37, 0x69, 0x12, 0x18, 0x8e, 0x74, 0x7a, + 0xc6, 0x63, 0x61, 0xcd, 0xbc, 0xd1, 0x69, 0xfd, 0x21, 0xad, 0xb7, 0xaa, 0x1c, 0x8a, 0x36, 0x02, + 0x6f, 0xee, 0x93, 0x4d, 0x45, 0x23, 0xfc, 0xf9, 0x82, 0x20, 0x4b, 0x2d, 0xc3, 0x84, 0xc4, 0x3b, + 0xb8, 0x92, 0x94, 0x67, 0xbb, 0x79, 0x92, 0xf8, 0x37, 0x7f, 0x05, 0x6c, 0x99, 0x37, 0xde, 0x26, + 0x55, 0xf3, 0x42, 0xaa, 0xfe, 0x62, 0xed, 0x79, 0x46, 0xfd, 0x6f, 0x32, 0x50, 0x4d, 0x49, 0x8d, + 0x95, 0xdb, 0x03, 0xd7, 0x92, 0x8d, 0xa9, 0x70, 0x80, 0xf0, 0x84, 0xb4, 0x80, 0x6c, 0x77, 0x22, + 0xbc, 0xbb, 0xdc, 0x02, 0xa2, 0x34, 0xfb, 0x1a, 0xae, 0x8e, 0xe7, 0x8e, 0x13, 0x5a, 0x17, 0xa1, + 0x1e, 0x78, 0x73, 0x7f, 0x64, 0xe9, 0xbe, 0x35, 0x16, 0xee, 0xba, 0x25, 0xef, 0xeb, 0xa6, 0xa4, + 0x1d, 0x10, 0xa9, 0x66, 0x8d, 0xd9, 0x1f, 0x02, 0x8b, 0x0a, 0xe0, 0x0a, 0x12, 0xe6, 0xcf, 0xaf, + 0xce, 0xaf, 0x48, 0x52, 0x1a, 0x06, 0xcd, 0x1a, 0xab, 0xff, 0x79, 0x16, 0x2a, 0x07, 0x46, 0x70, + 0x7a, 0x68, 0xcc, 0x06, 0xa1, 0x11, 0x06, 0xc8, 0xcb, 0xa7, 0x46, 0x70, 0x3a, 0x35, 0x66, 0xdc, + 0x5e, 0xca, 0x70, 0xc7, 0x92, 0x80, 0xa1, 0xb1, 0x84, 0xab, 0x08, 0x93, 0x7d, 0xf7, 0xe8, 0x85, + 0xf0, 0x1a, 0x45, 0x69, 0x94, 0xa1, 0xc1, 0xe9, 0x7c, 0x3c, 0x8e, 0xba, 0x2a, 0x93, 0xec, 0x01, + 0x54, 0xc5, 0x4f, 0x32, 0x96, 0x2e, 0x44, 0x98, 0x40, 0x1a, 0xc8, 0x9e, 0x41, 0x59, 0x00, 0x86, + 0x52, 0xe2, 0xd7, 0x22, 0x6f, 0x60, 0x8c, 0xd0, 0x92, 0x54, 0xec, 0xd7, 0x70, 0x2d, 0x91, 0xdc, + 0xf3, 0xfc, 0xc3, 0xb9, 0x13, 0xda, 0xcd, 0x9e, 0x50, 0x37, 0x6f, 0x2d, 0x65, 0x8f, 0x49, 0xb4, + 0xd5, 0x39, 0xd3, 0xad, 0x3d, 0xb4, 0x5d, 0xda, 0x40, 0xb2, 0x5a, 0x1a, 0xb8, 0x40, 0x65, 0x5c, + 0xd0, 0xbe, 0x91, 0xa6, 0x32, 0x2e, 0x50, 0xb2, 0x08, 0xc0, 0xa1, 0x15, 0x9e, 0x7a, 0xa6, 0xd0, + 0x1f, 0xaf, 0xa6, 0x9a, 0xc5, 0x51, 0x5a, 0x9a, 0x12, 0x87, 0x13, 0x4d, 0xfe, 0x91, 0x1b, 0x92, + 0x71, 0x92, 0xd5, 0x64, 0x12, 0xf7, 0x54, 0xdf, 0x70, 0x27, 0x56, 0x50, 0x2f, 0xef, 0x64, 0x1f, + 0x65, 0x34, 0x91, 0x52, 0xff, 0xd5, 0x35, 0xc8, 0xf3, 0x99, 0xbc, 0x05, 0xa5, 0x13, 0x3a, 0xdc, + 0x71, 0xe7, 0x53, 0x79, 0x08, 0x43, 0x80, 0xde, 0x7c, 0xca, 0x2d, 0x05, 0xe1, 0xf5, 0xcb, 0x68, + 0xf4, 0x1b, 0x8b, 0xf4, 0xe6, 0x21, 0xd6, 0x95, 0x25, 0xa8, 0x48, 0x61, 0x23, 0x7c, 0xef, 0x9c, + 0xb8, 0x21, 0x47, 0x08, 0x99, 0xa4, 0x73, 0x1e, 0xda, 0x9e, 0x31, 0x53, 0x9e, 0x70, 0x45, 0x02, + 0x34, 0xdd, 0x70, 0xd1, 0x43, 0xb9, 0xbe, 0xe4, 0xa1, 0x64, 0x77, 0x00, 0xed, 0x90, 0x91, 0xd5, + 0x77, 0xad, 0x66, 0x8f, 0x46, 0xb8, 0xa8, 0x25, 0x20, 0xb8, 0x42, 0x4d, 0x6f, 0x46, 0x83, 0x9a, + 0xd7, 0xf0, 0x27, 0xfb, 0x22, 0xe2, 0x4e, 0xea, 0xa3, 0x30, 0xf0, 0xc4, 0xf6, 0x95, 0xe4, 0x63, + 0x2d, 0x45, 0x87, 0x25, 0xe1, 0x9e, 0xc4, 0x0d, 0x3c, 0xfc, 0xa9, 0xb6, 0x01, 0x34, 0xef, 0x3c, + 0xb0, 0x42, 0x72, 0xc5, 0x5f, 0xa7, 0x2e, 0xa6, 0x8e, 0x74, 0xbd, 0xf3, 0x23, 0x2f, 0x88, 0x7c, + 0x20, 0x6b, 0xab, 0x7d, 0x20, 0xea, 0xc7, 0x50, 0x40, 0x85, 0xc5, 0x08, 0x0d, 0xf6, 0x40, 0x78, + 0x3f, 0xb9, 0x9a, 0x25, 0xdc, 0xc0, 0x71, 0x1d, 0xc2, 0x1f, 0xda, 0x95, 0xf5, 0x52, 0x9e, 0x7b, + 0x09, 0x2f, 0x43, 0xb4, 0x59, 0x8a, 0x02, 0x85, 0x0a, 0x74, 0x0b, 0x4a, 0xd8, 0x34, 0x3a, 0xbb, + 0x12, 0x82, 0xa9, 0xe8, 0x7b, 0xe7, 0x4d, 0x4c, 0xab, 0xff, 0x43, 0x06, 0xca, 0x7d, 0xdf, 0xc4, + 0x5d, 0x7a, 0x30, 0xb3, 0x46, 0x6f, 0x75, 0xd9, 0xa0, 0xc2, 0xe4, 0x39, 0x8e, 0x41, 0xfb, 0x81, + 0xb0, 0xf2, 0x23, 0x00, 0xfb, 0x14, 0x72, 0x63, 0x94, 0xfb, 0xd9, 0xa4, 0x95, 0x96, 0x28, 0x5e, + 0xfe, 0xc6, 0x9d, 0x40, 0x23, 0x52, 0xf5, 0x6f, 0x47, 0xf5, 0xd3, 0xf6, 0x90, 0x3c, 0x7f, 0xb9, + 0x42, 0xe7, 0xb2, 0x83, 0xa6, 0x92, 0x61, 0x45, 0xc8, 0xb5, 0xda, 0x83, 0x26, 0xb7, 0x64, 0xd0, + 0xa6, 0x19, 0xe8, 0x7b, 0x1d, 0x6d, 0x30, 0x54, 0x72, 0x74, 0xd0, 0x4b, 0x80, 0x6e, 0x63, 0x30, + 0x54, 0x8a, 0x0c, 0x60, 0xfd, 0xb8, 0xd7, 0xf9, 0xf5, 0x71, 0x5b, 0x51, 0xd4, 0x7f, 0x90, 0x01, + 0x88, 0x8f, 0x09, 0xd8, 0x07, 0x50, 0x3e, 0xa7, 0x94, 0x9e, 0x38, 0xa1, 0x4a, 0xf6, 0x11, 0x38, + 0x9a, 0x94, 0xb9, 0x8f, 0xa0, 0x12, 0xed, 0x6b, 0xa8, 0xe8, 0x2c, 0x1f, 0x55, 0x95, 0x23, 0xfc, + 0xee, 0x25, 0xfb, 0x10, 0x8a, 0x1e, 0xf6, 0x03, 0x49, 0xb3, 0x49, 0x2d, 0x27, 0xd1, 0x7d, 0xad, + 0xe0, 0xf1, 0x04, 0x2a, 0x44, 0x63, 0x5f, 0x7a, 0x6d, 0x22, 0xd2, 0x3d, 0x04, 0x35, 0x1d, 0x63, + 0x1e, 0x58, 0x1a, 0xc7, 0x47, 0xbb, 0x44, 0x3e, 0xde, 0x25, 0xd4, 0xdf, 0x40, 0x6d, 0x60, 0x4c, + 0x67, 0x7c, 0x2f, 0xa1, 0x8e, 0x31, 0xc8, 0x21, 0x4f, 0x08, 0xd6, 0xa3, 0xdf, 0xb8, 0xe8, 0x8e, + 0x2c, 0x7f, 0x64, 0xb9, 0x72, 0x8d, 0xca, 0x24, 0x8a, 0xdf, 0x63, 0xdc, 0x4d, 0x34, 0xef, 0x5c, + 0x6e, 0x27, 0x32, 0xad, 0xfe, 0x1b, 0x19, 0x28, 0x27, 0x9a, 0xc1, 0x3e, 0x86, 0x1c, 0x69, 0xce, + 0x99, 0xa4, 0x20, 0x4c, 0x10, 0xf0, 0xdf, 0x5c, 0xd7, 0x42, 0x42, 0xf6, 0x10, 0xf2, 0x41, 0x68, + 0xf8, 0xf2, 0xc4, 0x49, 0x49, 0xe4, 0xd8, 0xf5, 0xe6, 0xae, 0xa9, 0x71, 0x34, 0x53, 0x21, 0x6b, + 0xb9, 0xa6, 0xf0, 0x73, 0x2d, 0x53, 0x21, 0x52, 0xdd, 0x81, 0x52, 0x54, 0x3c, 0xb2, 0x80, 0xd6, + 0x7f, 0x35, 0x50, 0xae, 0xb0, 0x12, 0xe4, 0xb5, 0x46, 0x6f, 0xbf, 0xad, 0x64, 0xd4, 0x3f, 0xcb, + 0x00, 0xc4, 0xb9, 0xd8, 0x93, 0x54, 0x6b, 0x6f, 0x2e, 0x96, 0xfa, 0x84, 0xfe, 0x26, 0x1a, 0x7b, + 0x1b, 0x4a, 0x73, 0x97, 0x80, 0x96, 0x29, 0x76, 0xa2, 0x18, 0x80, 0xe6, 0x9e, 0x8c, 0xd6, 0x5a, + 0x30, 0xf7, 0x5e, 0x1b, 0x8e, 0xfa, 0x0b, 0x28, 0x45, 0xc5, 0xa1, 0x39, 0xbd, 0xd7, 0xef, 0x76, + 0xfb, 0xaf, 0x3a, 0xbd, 0x7d, 0xe5, 0x0a, 0x26, 0x8f, 0xb4, 0x76, 0xb3, 0xdd, 0xc2, 0x64, 0x06, + 0x79, 0xb6, 0x79, 0xac, 0x69, 0xed, 0xde, 0x50, 0xd7, 0xfa, 0xaf, 0x94, 0x35, 0xf5, 0xef, 0x66, + 0xa0, 0xda, 0x77, 0xcc, 0xa6, 0xe7, 0x34, 0x8d, 0x19, 0xaa, 0x46, 0xec, 0x6b, 0xd8, 0x3c, 0x99, + 0xa3, 0x7a, 0x3e, 0x73, 0x8c, 0x91, 0x75, 0xea, 0x39, 0xa6, 0x25, 0x17, 0x61, 0xea, 0x4c, 0x4d, + 0xb8, 0xff, 0x15, 0x22, 0x3e, 0x8a, 0x69, 0xd9, 0xe7, 0x50, 0x99, 0xf9, 0xde, 0x89, 0x25, 0x94, + 0x80, 0x25, 0xbb, 0x32, 0xce, 0x5b, 0x26, 0x3a, 0xae, 0x00, 0xa8, 0xff, 0xd6, 0x1a, 0x54, 0x5a, + 0x96, 0x39, 0x9f, 0x7d, 0xe3, 0xd9, 0x6e, 0x33, 0xbc, 0x60, 0x9f, 0x41, 0xc5, 0x73, 0xc8, 0x9b, + 0xa4, 0x27, 0xe2, 0x49, 0x56, 0x95, 0x03, 0x1e, 0xf5, 0x80, 0xa2, 0x4f, 0x3e, 0x82, 0xab, 0xc2, + 0xc3, 0xc1, 0x5d, 0x9b, 0x17, 0x3c, 0x33, 0xae, 0x99, 0xbc, 0xa6, 0x70, 0x14, 0xdf, 0xa0, 0x89, + 0xfc, 0x0f, 0x60, 0x2b, 0x41, 0x8e, 0x82, 0x85, 0xd3, 0x67, 0x97, 0xd6, 0xd8, 0x66, 0x94, 0x37, + 0x8a, 0x74, 0xf9, 0x06, 0xb6, 0x64, 0x0b, 0x47, 0x7c, 0xf4, 0x78, 0xe6, 0x5c, 0xd2, 0x0e, 0x4a, + 0x8d, 0xae, 0x68, 0xf0, 0xa6, 0x97, 0x04, 0x52, 0x59, 0x9f, 0xc2, 0x35, 0x13, 0x7b, 0xaf, 0xf3, + 0xc1, 0x3f, 0xb3, 0xac, 0x99, 0xee, 0x18, 0x41, 0x28, 0x0e, 0xc3, 0x19, 0x21, 0x77, 0x11, 0xf7, + 0xc2, 0xb2, 0x66, 0x5d, 0x23, 0x08, 0xd5, 0xff, 0x32, 0x0b, 0x25, 0xee, 0x91, 0xc1, 0xe1, 0x7a, + 0x04, 0x05, 0xef, 0xe4, 0x7b, 0x52, 0x99, 0xde, 0x70, 0xe0, 0xbd, 0xee, 0x9d, 0x7c, 0x8f, 0x7a, + 0xd6, 0x07, 0x72, 0xab, 0x33, 0xad, 0xb1, 0x98, 0x9d, 0x5a, 0xda, 0xfe, 0x10, 0x5b, 0x1f, 0xda, + 0xc6, 0xcf, 0xa0, 0x6c, 0xbb, 0x81, 0xe5, 0x87, 0xdc, 0xa3, 0x56, 0x78, 0xf3, 0x24, 0x70, 0x32, + 0x72, 0xb2, 0x3d, 0x83, 0xb2, 0xf0, 0x5a, 0x51, 0xa6, 0xe2, 0x9b, 0x33, 0x71, 0x32, 0xca, 0xf4, + 0x15, 0xd4, 0x62, 0x31, 0x47, 0xf9, 0x4a, 0x6f, 0xcc, 0x57, 0x8d, 0x28, 0x29, 0xeb, 0x53, 0xd8, + 0x0e, 0xce, 0xec, 0x99, 0x2e, 0x5a, 0xea, 0xb9, 0x74, 0x12, 0xa5, 0xcf, 0xce, 0xc4, 0x09, 0x10, + 0x43, 0x6c, 0x87, 0x90, 0x7d, 0xb7, 0x37, 0x77, 0x9c, 0xa3, 0x33, 0xf6, 0x3e, 0x6c, 0x0a, 0xf2, + 0xd9, 0x99, 0xe4, 0x15, 0xb2, 0x8a, 0xf3, 0x5a, 0x8d, 0x23, 0x8e, 0xce, 0x84, 0x26, 0xf7, 0x25, + 0xd4, 0x79, 0x0c, 0x86, 0xe8, 0x94, 0x31, 0x1e, 0x5b, 0xa3, 0x50, 0x47, 0xd5, 0x41, 0x1c, 0x17, + 0x5d, 0x23, 0x3c, 0xf7, 0xb6, 0x35, 0x08, 0x4b, 0x92, 0xef, 0x13, 0xd8, 0xb2, 0x27, 0xae, 0xe7, + 0xcb, 0x2c, 0x96, 0xc9, 0x33, 0xf1, 0x73, 0x24, 0xc6, 0x71, 0x0d, 0x81, 0xc2, 0x1c, 0xea, 0xbf, + 0x9d, 0x81, 0x12, 0x6f, 0x28, 0xce, 0xe9, 0x3d, 0xc8, 0xfe, 0xc8, 0x7c, 0x22, 0x8e, 0x3d, 0x86, + 0x4d, 0xc3, 0x34, 0x17, 0xca, 0xe7, 0x02, 0x64, 0xc3, 0x30, 0xcd, 0x64, 0xe1, 0xe4, 0xcc, 0x0e, + 0x74, 0x69, 0x32, 0xc7, 0x31, 0x1a, 0x45, 0xad, 0x66, 0x07, 0xc2, 0x62, 0xe6, 0xe7, 0x11, 0x29, + 0x16, 0xc9, 0xfd, 0x38, 0x8b, 0xa8, 0x0c, 0x40, 0xb3, 0x48, 0x5a, 0x34, 0xc3, 0x8b, 0x6f, 0x72, + 0xc5, 0x8c, 0x02, 0xea, 0xdf, 0x2f, 0x43, 0xb9, 0xe1, 0x1a, 0xce, 0xe5, 0x6f, 0x2d, 0x0a, 0x30, + 0x21, 0xef, 0xf4, 0x6c, 0x2e, 0x06, 0x8d, 0x9f, 0x8d, 0x96, 0x08, 0x42, 0x2d, 0xbb, 0x0b, 0x65, + 0x6f, 0x1e, 0x46, 0x78, 0x7e, 0x5a, 0x0a, 0x1c, 0x44, 0x04, 0x51, 0xfe, 0xe8, 0xe4, 0x43, 0xe6, + 0x27, 0x3d, 0x3e, 0xce, 0x1f, 0xe9, 0x76, 0x51, 0x7e, 0x22, 0xb8, 0x0f, 0xd5, 0xd0, 0x9e, 0x5a, + 0x74, 0x40, 0x3c, 0x9f, 0x5a, 0x26, 0x8f, 0x62, 0xe5, 0x81, 0x91, 0x4d, 0x01, 0xc3, 0x52, 0xa6, + 0xd6, 0xd4, 0xf3, 0x2f, 0x79, 0x29, 0xeb, 0xbc, 0x14, 0x0e, 0xa2, 0x52, 0x3e, 0x04, 0x76, 0x6e, + 0xd8, 0xa1, 0x9e, 0x2e, 0x8a, 0xeb, 0xd3, 0x0a, 0x62, 0x86, 0xc9, 0xe2, 0xb6, 0x61, 0xdd, 0xb4, + 0x83, 0xb3, 0x4e, 0x5f, 0xe8, 0xd2, 0x22, 0x85, 0x7d, 0x09, 0x46, 0x06, 0x6e, 0xe5, 0xa1, 0xc5, + 0xf5, 0xbe, 0xac, 0x56, 0x42, 0xc8, 0x2e, 0x02, 0x70, 0x2b, 0x70, 0xad, 0xf0, 0xdc, 0xf3, 0x31, + 0x27, 0x57, 0x95, 0x63, 0x00, 0x6e, 0x99, 0x48, 0x8a, 0x15, 0x11, 0xb7, 0x66, 0xb5, 0x28, 0x8d, + 0x4a, 0x28, 0xe7, 0x5c, 0xc2, 0x56, 0x78, 0xf3, 0x63, 0x08, 0x7b, 0x00, 0x35, 0x6a, 0x3e, 0xa9, + 0xd2, 0xd8, 0x07, 0x62, 0xc4, 0xac, 0x56, 0x41, 0x28, 0xb9, 0x00, 0x90, 0xea, 0x2b, 0xb8, 0x91, + 0xea, 0x9f, 0x6e, 0xf8, 0xbe, 0x71, 0xa9, 0x4f, 0x8d, 0xef, 0x3d, 0x9f, 0xdc, 0x35, 0x59, 0x6d, + 0x3b, 0x39, 0x6c, 0x0d, 0x44, 0x1f, 0x22, 0xf6, 0x8d, 0x59, 0x6d, 0xd7, 0xf3, 0xc9, 0x97, 0xb3, + 0x32, 0x2b, 0x62, 0xc9, 0xf1, 0x40, 0x13, 0x4c, 0x7a, 0x7d, 0xc0, 0x03, 0x6a, 0xb5, 0x32, 0xc1, + 0x76, 0x09, 0x84, 0x9a, 0x6d, 0xf0, 0x8c, 0x4b, 0xd8, 0x4d, 0x11, 0xdd, 0xf6, 0x8c, 0x64, 0x27, + 0x47, 0x9c, 0x5a, 0x86, 0x49, 0x87, 0xa4, 0x84, 0x38, 0xb0, 0x0c, 0x0a, 0x41, 0x08, 0x9e, 0xe9, + 0xb3, 0x79, 0xc8, 0x23, 0x61, 0xb5, 0x7c, 0xf0, 0xec, 0x68, 0x1e, 0x0a, 0xf0, 0xc4, 0x0a, 0xe9, + 0x4c, 0x94, 0xc0, 0xfb, 0x56, 0x88, 0xea, 0x69, 0xf0, 0x4c, 0x1e, 0x0d, 0x5c, 0x13, 0x63, 0xfb, + 0x4c, 0xf8, 0xfe, 0x55, 0xa8, 0x46, 0x48, 0x7d, 0x3a, 0xe7, 0xa1, 0xaf, 0x59, 0xad, 0x2c, 0x09, + 0x0e, 0xe7, 0x0e, 0x4e, 0xec, 0xc8, 0x18, 0x9d, 0xa2, 0xdd, 0x6b, 0x98, 0x14, 0xfd, 0x9a, 0xd5, + 0x4a, 0x04, 0xd1, 0xb0, 0x35, 0xb7, 0x80, 0x27, 0xf4, 0x53, 0x3b, 0x24, 0x9f, 0x52, 0x56, 0x2b, + 0x12, 0xe0, 0xc0, 0x0e, 0x71, 0x1d, 0x73, 0xa4, 0xe0, 0x40, 0x2a, 0xe2, 0x06, 0x11, 0x6d, 0x10, + 0xe2, 0x90, 0xe0, 0x54, 0xd0, 0x23, 0x50, 0x52, 0xb4, 0x58, 0xde, 0x4d, 0x22, 0xad, 0x25, 0x48, + 0xb1, 0xd4, 0x87, 0xc0, 0x33, 0xeb, 0xc8, 0x7a, 0xbc, 0xcc, 0x5b, 0xdc, 0xae, 0x23, 0x70, 0xcb, + 0x0e, 0xce, 0xa8, 0xc4, 0x07, 0x50, 0x4b, 0xd0, 0x61, 0x79, 0xb7, 0x39, 0x67, 0x44, 0x64, 0xa9, + 0x36, 0xfa, 0xd6, 0xd4, 0x0b, 0x45, 0x37, 0xdf, 0x49, 0xb4, 0x51, 0x23, 0x78, 0xba, 0x8d, 0x82, + 0x16, 0xcb, 0xbc, 0x93, 0x68, 0x23, 0x27, 0xc5, 0x52, 0xef, 0x41, 0xe5, 0xdc, 0xb7, 0xc3, 0xd0, + 0x72, 0xf9, 0xe2, 0xbf, 0xcb, 0x07, 0x56, 0xc0, 0x68, 0xf5, 0xdf, 0x83, 0x0a, 0x1f, 0x79, 0x21, + 0xdf, 0x76, 0x38, 0x89, 0x80, 0x49, 0x01, 0x21, 0x46, 0x63, 0x6a, 0xbb, 0xe4, 0x38, 0xca, 0x6a, + 0x25, 0x0e, 0x41, 0xf3, 0x36, 0x81, 0x36, 0x2e, 0xc8, 0x7d, 0x14, 0xa3, 0x8d, 0x0b, 0x5a, 0x92, + 0x33, 0xdb, 0x71, 0xf8, 0xc2, 0xbf, 0x2f, 0x96, 0x24, 0x42, 0x68, 0xdd, 0x47, 0x68, 0xaa, 0xfd, + 0x41, 0x02, 0x4d, 0x75, 0x23, 0xe3, 0x10, 0x1a, 0xab, 0x7e, 0x57, 0x30, 0x0e, 0x02, 0xb0, 0xe6, + 0x18, 0x69, 0x5c, 0x90, 0x73, 0x28, 0x42, 0x1a, 0x17, 0x42, 0x6e, 0x61, 0xa9, 0x94, 0xf7, 0xbd, + 0x48, 0x6e, 0x21, 0x08, 0x73, 0x27, 0x09, 0x8c, 0x8b, 0xfa, 0xa3, 0x34, 0x81, 0x71, 0x41, 0x36, + 0x95, 0x65, 0x98, 0xbc, 0xe1, 0xef, 0xf3, 0xe2, 0x11, 0x40, 0xed, 0xde, 0x81, 0x4a, 0xf0, 0x4c, + 0x8f, 0xf1, 0x8f, 0x79, 0xf6, 0xe0, 0x99, 0x26, 0x29, 0x1e, 0x40, 0x2d, 0x62, 0x0d, 0x4e, 0xf3, + 0x01, 0x9f, 0x78, 0x53, 0xb0, 0x06, 0x9d, 0x29, 0xff, 0x2e, 0x03, 0x37, 0xf9, 0x61, 0x0c, 0x89, + 0xff, 0x43, 0x2b, 0x08, 0x8c, 0x89, 0xb5, 0xe7, 0xf9, 0x7b, 0xf3, 0xdf, 0xfe, 0xf6, 0x92, 0x3d, + 0x82, 0x8d, 0x23, 0xc3, 0xb7, 0xdc, 0x30, 0x3a, 0x0d, 0x15, 0xbe, 0xa4, 0x45, 0x30, 0x7b, 0x0e, + 0x0a, 0x07, 0xf1, 0xc8, 0xbe, 0xa6, 0x3c, 0xe1, 0x5b, 0x74, 0x99, 0x2f, 0x51, 0xa1, 0x79, 0x58, + 0x6a, 0xd9, 0x41, 0xa8, 0x19, 0xee, 0x04, 0x65, 0x94, 0xe2, 0x78, 0xe7, 0x68, 0xe3, 0xa0, 0xe2, + 0xab, 0x27, 0x54, 0x6d, 0xb1, 0x4b, 0xc6, 0xfa, 0x75, 0x8d, 0x08, 0x63, 0x05, 0xf9, 0x2b, 0x50, + 0xe6, 0xb3, 0x59, 0x3a, 0xeb, 0xda, 0x1b, 0xb2, 0x12, 0x61, 0x9c, 0xf5, 0x03, 0x28, 0x27, 0x6a, + 0x5d, 0xa1, 0x8e, 0x43, 0x5c, 0x17, 0x12, 0x27, 0xea, 0x59, 0x11, 0x59, 0x0c, 0x71, 0xe9, 0xea, + 0x3f, 0xb3, 0x06, 0x8a, 0x70, 0x64, 0x19, 0xa6, 0xe5, 0xd3, 0xa1, 0x6a, 0xca, 0x90, 0xcb, 0xbc, + 0xd5, 0x90, 0xdb, 0x81, 0xbc, 0x63, 0x4f, 0xa3, 0x00, 0xbb, 0xd4, 0x51, 0x15, 0x21, 0x70, 0xae, + 0x3d, 0xdf, 0x9e, 0x90, 0xc9, 0x99, 0x0c, 0x36, 0x25, 0x97, 0x26, 0x5a, 0x70, 0x34, 0x45, 0x4f, + 0x00, 0x4c, 0x3b, 0x08, 0x75, 0x72, 0xc2, 0xa4, 0xbd, 0x77, 0xd1, 0xf8, 0x6b, 0x25, 0x33, 0x9a, + 0x8a, 0x47, 0xa0, 0x24, 0xd4, 0x36, 0x37, 0xf2, 0x9f, 0xe4, 0xb5, 0x58, 0x9d, 0x6b, 0xba, 0x4d, + 0x37, 0x5c, 0xa2, 0x44, 0x85, 0x6b, 0x7d, 0x89, 0xb2, 0x63, 0x5e, 0xa8, 0xff, 0xeb, 0xbb, 0x90, + 0xeb, 0x79, 0xa6, 0xc5, 0x3e, 0x81, 0x12, 0x45, 0x70, 0x27, 0x26, 0x58, 0xa8, 0xd5, 0x88, 0xa6, + 0x3f, 0x34, 0x53, 0x45, 0x57, 0xfc, 0x7a, 0x73, 0xcc, 0xf7, 0x3d, 0x32, 0x07, 0xe9, 0xdc, 0x1f, + 0xbb, 0x54, 0x16, 0x2e, 0x2b, 0xf2, 0xb0, 0x70, 0x0c, 0xee, 0xad, 0x74, 0x32, 0xe1, 0x5b, 0x2e, + 0xe9, 0xf0, 0x79, 0x2d, 0x4a, 0x93, 0x11, 0xee, 0x7b, 0xa8, 0x7a, 0xf1, 0x1d, 0x28, 0xbf, 0xc2, + 0x08, 0xe7, 0x78, 0xda, 0x92, 0x3e, 0x81, 0xd2, 0xf7, 0x9e, 0xed, 0xf2, 0x86, 0xaf, 0x2f, 0x35, + 0x1c, 0x6d, 0x1c, 0xde, 0xf0, 0xef, 0xc5, 0x2f, 0x76, 0x1f, 0x0a, 0x9e, 0xcb, 0xcb, 0x2e, 0x2c, + 0x95, 0xbd, 0xee, 0xb9, 0x5d, 0x1e, 0xc2, 0x57, 0xb5, 0x03, 0xdd, 0xb7, 0x27, 0xa7, 0xa1, 0x8e, + 0x39, 0x45, 0xbc, 0x40, 0xd9, 0x0e, 0x34, 0x84, 0x61, 0xb1, 0xc8, 0x78, 0x63, 0xdb, 0x41, 0x0d, + 0x8f, 0x0a, 0x2b, 0x2d, 0x15, 0x06, 0x1c, 0x4d, 0x05, 0xbe, 0x0b, 0xc5, 0x89, 0xef, 0xa1, 0xd9, + 0x71, 0x59, 0x87, 0x25, 0xca, 0x02, 0xe1, 0x76, 0x2f, 0x51, 0x7d, 0xa2, 0x9f, 0xb6, 0x3b, 0xd1, + 0xc9, 0xaf, 0x52, 0xde, 0xc9, 0x3e, 0x2a, 0x6a, 0x15, 0x09, 0x24, 0x8f, 0xc9, 0xbb, 0x50, 0x34, + 0x26, 0x13, 0x5d, 0x44, 0x22, 0x2e, 0x95, 0x65, 0x4c, 0x26, 0x54, 0xe5, 0x13, 0xa8, 0x9e, 0xdb, + 0xae, 0x1e, 0xcc, 0xac, 0x11, 0xa7, 0xad, 0x2e, 0x0f, 0xe5, 0xb9, 0xed, 0x22, 0x77, 0x13, 0x7d, + 0x72, 0x19, 0xd4, 0x7e, 0xfa, 0x32, 0xd8, 0x78, 0xd3, 0x32, 0x50, 0x61, 0x5d, 0x9c, 0x5a, 0x28, + 0x4b, 0x24, 0x02, 0xc3, 0x3e, 0x85, 0xb2, 0x6f, 0xb8, 0x67, 0xba, 0x08, 0xbe, 0xf8, 0x2e, 0xe9, + 0x1b, 0xd0, 0x0c, 0xf7, 0x4c, 0xc4, 0x5e, 0x80, 0x1f, 0xfd, 0x4e, 0xab, 0xcc, 0x9b, 0x6f, 0xb1, + 0xaa, 0x12, 0xc6, 0x1a, 0xfb, 0x71, 0x63, 0xed, 0x73, 0xb2, 0x8a, 0x2c, 0x37, 0xd4, 0x65, 0x86, + 0xab, 0xab, 0x33, 0x54, 0x38, 0x59, 0x9f, 0x67, 0xc3, 0x0e, 0x90, 0x6f, 0x4e, 0x27, 0x47, 0xde, + 0x56, 0xaa, 0x03, 0x91, 0xd3, 0x4e, 0x03, 0x3f, 0x76, 0xe0, 0x35, 0x60, 0x23, 0x0e, 0x00, 0xe7, + 0x51, 0xf7, 0xd7, 0x92, 0xa7, 0x13, 0xa9, 0x88, 0x71, 0x69, 0x87, 0xd9, 0xa9, 0x30, 0xf2, 0xfb, + 0x50, 0xe5, 0xd1, 0x4e, 0x7c, 0xdc, 0x02, 0x52, 0x92, 0x4a, 0x5a, 0x85, 0x80, 0x7c, 0x9c, 0x02, + 0x12, 0x30, 0xc2, 0x38, 0x0c, 0x2f, 0x48, 0x4b, 0x8a, 0x05, 0x0c, 0xb7, 0x06, 0xc3, 0x0b, 0xad, + 0x64, 0xca, 0x9f, 0xb8, 0xf9, 0x9f, 0xd8, 0xae, 0x89, 0xac, 0x17, 0x1a, 0x93, 0xa0, 0x5e, 0xa7, + 0x95, 0x59, 0x16, 0xb0, 0xa1, 0x31, 0x09, 0xd8, 0x67, 0x50, 0x31, 0xb8, 0xb1, 0xc1, 0xdb, 0x7d, + 0x23, 0xe9, 0xcb, 0x4a, 0x98, 0x21, 0x5a, 0xd9, 0x48, 0xd8, 0x24, 0x5f, 0x02, 0x93, 0x87, 0xaa, + 0x09, 0xcb, 0xff, 0xe6, 0x12, 0x37, 0x6e, 0x88, 0x53, 0xd5, 0xc8, 0xee, 0xbf, 0x0b, 0x65, 0x71, + 0xc0, 0x11, 0x84, 0xd6, 0xac, 0x7e, 0x8b, 0x1a, 0x04, 0x1c, 0x34, 0x08, 0xad, 0x19, 0xfb, 0x12, + 0xaa, 0x69, 0x2b, 0xeb, 0xf6, 0x8a, 0xb3, 0x49, 0x62, 0x0b, 0xad, 0x32, 0x4a, 0xda, 0x5d, 0xf7, + 0xf9, 0x45, 0x06, 0xd2, 0x90, 0x28, 0x23, 0x3f, 0x7f, 0xab, 0xb8, 0x5e, 0xd8, 0x94, 0x30, 0x1c, + 0x40, 0x69, 0x92, 0x87, 0x17, 0xa4, 0x54, 0x45, 0x03, 0x18, 0x99, 0x8e, 0x68, 0x1c, 0x49, 0x2b, + 0xb2, 0x05, 0x4c, 0x1e, 0xa7, 0xe0, 0xe6, 0xc2, 0x23, 0x79, 0x48, 0x87, 0x8a, 0x8e, 0x2b, 0x17, + 0xf7, 0x1e, 0x8d, 0x47, 0x3d, 0x25, 0x77, 0xa3, 0xe7, 0x50, 0x9b, 0xf9, 0x96, 0x9e, 0xa8, 0x59, + 0x4d, 0x76, 0xea, 0xc8, 0xb7, 0xe2, 0xca, 0x2b, 0xb3, 0x44, 0x8a, 0x7d, 0x0d, 0x9b, 0x89, 0x9c, + 0xf3, 0x33, 0xca, 0x7c, 0x9f, 0x32, 0x6f, 0x2d, 0x64, 0x3e, 0x3e, 0xc3, 0xec, 0xb5, 0x59, 0x2a, + 0xcd, 0xb6, 0x20, 0xdf, 0x09, 0xda, 0xae, 0x49, 0xba, 0x55, 0x51, 0xe3, 0x09, 0xf6, 0x0c, 0x2a, + 0xdc, 0x90, 0xa1, 0x60, 0xe8, 0xa0, 0xfe, 0x30, 0xe9, 0xac, 0x26, 0x6b, 0x86, 0x10, 0x5a, 0xd9, + 0x89, 0x7e, 0x07, 0xec, 0x0b, 0xd8, 0xe4, 0x27, 0x09, 0x49, 0x11, 0xf9, 0xde, 0xf2, 0x94, 0x13, + 0xd1, 0x5e, 0x2c, 0x27, 0x35, 0xb8, 0xe1, 0xcf, 0x5d, 0x32, 0x6e, 0x44, 0x4e, 0xee, 0xe3, 0xa2, + 0xfc, 0x8f, 0x28, 0xff, 0x75, 0xb1, 0xba, 0x38, 0x19, 0xcf, 0x4b, 0xb2, 0x69, 0xdb, 0x4f, 0x82, + 0x8e, 0x30, 0xdf, 0x1b, 0xca, 0xe4, 0xbe, 0x1f, 0x2a, 0xf3, 0xfd, 0x9f, 0x53, 0x26, 0xf9, 0x85, + 0xa8, 0x4c, 0x06, 0xb9, 0xf9, 0xdc, 0x36, 0x49, 0xd3, 0xab, 0x68, 0xf4, 0x9b, 0xbd, 0x0b, 0x35, + 0xdf, 0x1a, 0xcd, 0xfd, 0xc0, 0x7e, 0x6d, 0xe9, 0x81, 0xed, 0x9e, 0x91, 0x8e, 0x57, 0xd4, 0xaa, + 0x11, 0x74, 0x60, 0xbb, 0x67, 0x28, 0x32, 0xac, 0x8b, 0xd0, 0xf2, 0x5d, 0x7e, 0x03, 0xe4, 0xc3, + 0xa4, 0xc8, 0x68, 0x13, 0x02, 0xd7, 0xb9, 0x06, 0x56, 0xf4, 0x7b, 0x61, 0x66, 0x03, 0x3e, 0xb3, + 0x4f, 0x7e, 0xd2, 0xcc, 0x0e, 0x68, 0x66, 0x1f, 0x42, 0xd1, 0x76, 0x43, 0xcb, 0x7f, 0x6d, 0x38, + 0xf5, 0x8f, 0x97, 0xa4, 0x71, 0x84, 0x63, 0x0f, 0xa0, 0x10, 0x38, 0x36, 0xae, 0xf7, 0xfa, 0x27, + 0x4b, 0x64, 0x12, 0xc5, 0x1e, 0x41, 0x29, 0xba, 0xe8, 0x58, 0xff, 0x74, 0x89, 0x2e, 0x46, 0xb2, + 0x3b, 0x90, 0x3b, 0x47, 0x86, 0x7a, 0xba, 0x7c, 0xb8, 0x80, 0x70, 0xdc, 0xbe, 0xc7, 0xa8, 0xb3, + 0xd3, 0xf6, 0xfd, 0x6c, 0x69, 0xfb, 0xde, 0xb3, 0x1d, 0x87, 0x6f, 0xdf, 0x63, 0xf1, 0x0b, 0x37, + 0x3f, 0xca, 0x81, 0x3d, 0xf9, 0x6c, 0x79, 0xf3, 0x43, 0xdc, 0x4b, 0xba, 0x12, 0x5a, 0x0e, 0xc8, + 0x63, 0xce, 0x1d, 0xff, 0x9f, 0x27, 0xc7, 0x2a, 0xed, 0x4a, 0xd7, 0x20, 0x88, 0xd2, 0x68, 0x80, + 0x88, 0xf3, 0x02, 0x54, 0x9a, 0xbe, 0xe0, 0xf7, 0x87, 0x38, 0xa4, 0x63, 0x5e, 0xb0, 0x4f, 0xa0, + 0x2a, 0x83, 0xb3, 0xb0, 0xba, 0xa0, 0xfe, 0xe5, 0x52, 0x0b, 0xd2, 0x04, 0xac, 0x05, 0x95, 0x31, + 0xea, 0xee, 0x53, 0xae, 0xca, 0xd7, 0x9f, 0x53, 0x43, 0x76, 0xe4, 0xc6, 0xfa, 0x26, 0x55, 0x5f, + 0x4b, 0xe5, 0x62, 0x4f, 0x80, 0xd9, 0x63, 0x3e, 0x9f, 0x7b, 0xbe, 0x37, 0xe5, 0xea, 0x7a, 0xfd, + 0x2b, 0xe1, 0xdd, 0x5a, 0xc2, 0xd0, 0xf1, 0xa1, 0xe5, 0x9a, 0xfa, 0x34, 0x10, 0x6a, 0xc2, 0x2f, + 0xa8, 0x9d, 0x42, 0x78, 0x45, 0x17, 0xa2, 0xa5, 0x7b, 0x18, 0x69, 0x0f, 0x03, 0xae, 0x35, 0x7c, + 0x05, 0xc8, 0xae, 0xaf, 0xe3, 0xac, 0x7f, 0xf0, 0xa3, 0x59, 0x91, 0x56, 0x66, 0x7d, 0x0e, 0x35, + 0xee, 0x5a, 0x25, 0x8d, 0x0c, 0x59, 0xf4, 0x97, 0x49, 0xc9, 0x95, 0x74, 0x3a, 0x6b, 0x15, 0x33, + 0xe9, 0x82, 0xfe, 0x12, 0x36, 0xa4, 0x77, 0x38, 0x14, 0x8e, 0xe4, 0x3f, 0x4c, 0x56, 0x1b, 0x79, + 0x5f, 0xb5, 0xea, 0x5c, 0xfe, 0xa4, 0x2a, 0x9f, 0x41, 0x95, 0x76, 0xd1, 0xe8, 0xc6, 0xd9, 0xdf, + 0x5a, 0x79, 0xe3, 0xac, 0x82, 0x44, 0x32, 0x85, 0xc2, 0x3f, 0x5e, 0xa7, 0xa3, 0xd0, 0xaa, 0x7f, + 0xcd, 0x85, 0x7f, 0x04, 0x6c, 0x86, 0x16, 0x7b, 0x06, 0x60, 0xcc, 0x66, 0xce, 0x25, 0x67, 0xcd, + 0x5f, 0x11, 0x6b, 0x6e, 0x25, 0x58, 0xb3, 0x81, 0x48, 0xe2, 0xcd, 0x92, 0x21, 0x7f, 0xb2, 0xa7, + 0x50, 0x99, 0x79, 0x41, 0xa8, 0x9b, 0x53, 0x87, 0xfa, 0xdf, 0x48, 0xae, 0xed, 0x23, 0x2f, 0x08, + 0x5b, 0x53, 0x07, 0x7b, 0x01, 0xb3, 0xe8, 0x37, 0xeb, 0xc2, 0x55, 0xcf, 0xd5, 0xcd, 0xf9, 0xcc, + 0xb1, 0x47, 0x38, 0x02, 0x06, 0x05, 0x0b, 0xd4, 0x77, 0xa9, 0xc6, 0xdb, 0x89, 0x1a, 0xfb, 0x6e, + 0x4b, 0x12, 0x89, 0xa8, 0xc7, 0x4d, 0x6f, 0x11, 0x44, 0x76, 0x26, 0xcd, 0x41, 0x14, 0x25, 0xdc, + 0xe4, 0xaa, 0x01, 0x41, 0x65, 0x98, 0xf0, 0x73, 0xd8, 0x88, 0xa9, 0xb0, 0x83, 0x41, 0xbd, 0x95, + 0xe4, 0xe4, 0xc4, 0xb5, 0x83, 0xaa, 0xcc, 0x88, 0xb0, 0x80, 0xc6, 0xce, 0x73, 0x9c, 0xf9, 0x4c, + 0x88, 0xd2, 0x7a, 0x5b, 0x8c, 0x1d, 0x01, 0xb9, 0x94, 0x4c, 0x98, 0xe2, 0xd6, 0xb4, 0xbe, 0x97, + 0x34, 0xc5, 0xad, 0x29, 0xaa, 0x19, 0x22, 0x90, 0xef, 0xb5, 0x6d, 0x9d, 0x07, 0xf5, 0x7d, 0x8a, + 0x5e, 0x15, 0x41, 0xf6, 0x2f, 0x11, 0x84, 0xfb, 0xbe, 0x69, 0xfb, 0x68, 0x02, 0x50, 0x3c, 0xd9, + 0x01, 0x8f, 0xd2, 0xe6, 0x20, 0xa4, 0x60, 0x4d, 0xa8, 0x93, 0x38, 0x17, 0x6b, 0x35, 0x75, 0x6a, + 0xd7, 0x59, 0x5a, 0x92, 0xd7, 0x90, 0x96, 0x1f, 0x0a, 0x1e, 0x25, 0xce, 0xef, 0x7e, 0x05, 0xef, + 0xac, 0x2e, 0x44, 0x5e, 0xc8, 0xfd, 0x86, 0xf4, 0x8d, 0x1b, 0x2b, 0x72, 0x37, 0xf9, 0x1d, 0xdd, + 0x5f, 0x40, 0x75, 0x62, 0xd0, 0x48, 0x38, 0xfa, 0xd4, 0x33, 0xad, 0xfa, 0x8b, 0xe4, 0x5d, 0x59, + 0x9a, 0xb4, 0x7d, 0x03, 0x07, 0xc5, 0x39, 0xf4, 0x4c, 0x4b, 0x2b, 0x4f, 0xe2, 0x04, 0x7b, 0x0e, + 0xf5, 0x98, 0x09, 0xe7, 0x2e, 0xd6, 0x8b, 0xb6, 0x9e, 0xed, 0x8e, 0xc2, 0x7a, 0x97, 0xc6, 0x74, + 0x3b, 0xc2, 0x1f, 0x23, 0xba, 0x25, 0xb0, 0xac, 0x09, 0x0a, 0x09, 0x07, 0xb1, 0x8b, 0x05, 0xb6, + 0x69, 0xd5, 0x0f, 0x93, 0x77, 0xe1, 0xb8, 0xe8, 0x44, 0x12, 0xda, 0xaf, 0x06, 0xb6, 0x69, 0x69, + 0xb5, 0x71, 0x2a, 0xcd, 0xde, 0x87, 0x4d, 0x69, 0x8f, 0xe8, 0xa7, 0x46, 0x70, 0xaa, 0x9f, 0x59, + 0x97, 0xf5, 0x1e, 0x75, 0xb8, 0x26, 0x8c, 0x91, 0x03, 0x23, 0x38, 0x7d, 0x61, 0x5d, 0xaa, 0xff, + 0x6e, 0x1e, 0x8a, 0xd2, 0x00, 0x64, 0x65, 0x28, 0x1c, 0xf7, 0x5e, 0xf4, 0xfa, 0xaf, 0x7a, 0xfc, + 0xf6, 0x6d, 0x63, 0x30, 0x68, 0x6b, 0x43, 0xc5, 0x64, 0x35, 0x00, 0xba, 0xd1, 0xa6, 0x0f, 0x9a, + 0x8d, 0x1e, 0xbf, 0x8d, 0x4b, 0xf7, 0xe8, 0x78, 0x7a, 0x8d, 0x6d, 0x42, 0x75, 0xef, 0xb8, 0xc7, + 0xe3, 0x44, 0x09, 0x94, 0x45, 0x50, 0xfb, 0x5b, 0x7e, 0xf2, 0xcb, 0x41, 0x39, 0x04, 0x1d, 0x36, + 0x86, 0x6d, 0xad, 0x23, 0x41, 0x79, 0x76, 0x0d, 0x36, 0x23, 0x2a, 0x59, 0x82, 0x52, 0xc0, 0x86, + 0x1c, 0x69, 0xfd, 0x6f, 0xda, 0xcd, 0xa1, 0x02, 0x74, 0x6a, 0xbc, 0xbf, 0xaf, 0x94, 0x59, 0x05, + 0x8a, 0xad, 0xce, 0x60, 0xd8, 0xe9, 0x35, 0x87, 0x4a, 0x05, 0xdb, 0xb7, 0xd7, 0xe9, 0x0e, 0xdb, + 0x9a, 0x52, 0x65, 0x45, 0xc8, 0x7d, 0xd3, 0xef, 0xf4, 0x94, 0x1a, 0x5d, 0xe4, 0x6b, 0x1c, 0x1e, + 0x75, 0xdb, 0xca, 0x06, 0x42, 0x07, 0x7d, 0x6d, 0xa8, 0x28, 0x08, 0x7d, 0xd5, 0xe9, 0xb5, 0xfa, + 0xaf, 0x94, 0x4d, 0x56, 0x82, 0xfc, 0x71, 0x0f, 0xab, 0x61, 0xac, 0x0a, 0x25, 0xfa, 0xa9, 0x37, + 0xba, 0x5d, 0xe5, 0x6a, 0xe2, 0xa8, 0x79, 0x0b, 0x51, 0x74, 0x70, 0x3d, 0xc0, 0x36, 0x5c, 0xc3, + 0xa6, 0x47, 0x49, 0xa2, 0xde, 0xc6, 0x72, 0x0e, 0x3b, 0xbd, 0xe3, 0x81, 0x72, 0x1d, 0x89, 0xe9, + 0x27, 0x61, 0xea, 0x58, 0x4e, 0xa7, 0x47, 0x23, 0x77, 0x07, 0x7f, 0xb7, 0xda, 0xdd, 0xf6, 0xb0, + 0xad, 0xdc, 0xc5, 0x5e, 0x75, 0xfb, 0xcd, 0x17, 0x7a, 0xff, 0x48, 0xb9, 0x87, 0x43, 0x78, 0xa4, + 0xb5, 0x75, 0x41, 0x78, 0x9f, 0x29, 0x50, 0xd9, 0x3b, 0xfe, 0xcd, 0x6f, 0xbe, 0xd3, 0x45, 0xa7, + 0xde, 0xc5, 0x3a, 0x63, 0x0a, 0xfd, 0xf8, 0x85, 0xf2, 0x70, 0x01, 0x34, 0x78, 0xa1, 0xbc, 0x87, + 0x83, 0x22, 0x07, 0x55, 0x79, 0x84, 0x04, 0x5a, 0xbb, 0x79, 0xac, 0x0d, 0x3a, 0x2f, 0xdb, 0x7a, + 0x73, 0xd8, 0x56, 0xde, 0xa7, 0x51, 0xe8, 0xf4, 0x5e, 0x28, 0x8f, 0xb1, 0x99, 0xf8, 0x8b, 0x8f, + 0xfd, 0x07, 0x8c, 0x41, 0x2d, 0xa6, 0x25, 0xd8, 0x87, 0x48, 0xb2, 0xab, 0xf5, 0x1b, 0xad, 0x66, + 0x63, 0x30, 0x54, 0x3e, 0xc2, 0x3e, 0x0e, 0x8e, 0xba, 0x9d, 0xa1, 0xf2, 0x04, 0x3b, 0xb2, 0xdf, + 0x18, 0x1e, 0xb4, 0x35, 0xe5, 0x63, 0xb6, 0x01, 0xe5, 0x61, 0xe7, 0xb0, 0xad, 0x8b, 0x31, 0x7d, + 0x8a, 0x75, 0xec, 0x75, 0xba, 0x5d, 0xe5, 0x19, 0x1d, 0x95, 0x36, 0xb4, 0x61, 0x87, 0x26, 0xf2, + 0x33, 0x2c, 0xa0, 0x71, 0x74, 0xd4, 0xfd, 0x4e, 0xf9, 0x1c, 0x3b, 0x78, 0x78, 0xdc, 0x1d, 0x76, + 0xf4, 0xe3, 0xa3, 0x56, 0x63, 0xd8, 0x56, 0xbe, 0xa0, 0x59, 0xee, 0x0f, 0x86, 0xad, 0xc3, 0xae, + 0xf2, 0x25, 0x95, 0x49, 0x2c, 0xd5, 0xec, 0xf6, 0x7b, 0x6d, 0xe5, 0xb9, 0x9a, 0x2b, 0xae, 0x2b, + 0xeb, 0x6a, 0xae, 0xb8, 0xa3, 0xec, 0xa8, 0xb9, 0xa2, 0xaa, 0xa8, 0x8f, 0xcb, 0x83, 0xfe, 0xb1, + 0xd6, 0xe4, 0x6d, 0x55, 0xff, 0x0e, 0x14, 0xa5, 0xfd, 0x8f, 0xb5, 0x74, 0x7a, 0xbd, 0xb6, 0xa6, + 0x5c, 0xc1, 0x96, 0x74, 0xdb, 0x7b, 0x43, 0x25, 0x43, 0xc7, 0xca, 0x9d, 0xfd, 0x83, 0xa1, 0xb2, + 0x86, 0x3f, 0xfb, 0xc7, 0x38, 0xa8, 0x59, 0x1a, 0x8d, 0xf6, 0x61, 0x47, 0xc9, 0xe1, 0xaf, 0x46, + 0x6f, 0xd8, 0x51, 0xf2, 0xc4, 0x33, 0x9d, 0xde, 0x7e, 0xb7, 0xad, 0xac, 0x23, 0xf4, 0xb0, 0xa1, + 0xbd, 0x50, 0x0a, 0xbc, 0xd0, 0x56, 0xfb, 0x5b, 0xa5, 0xc8, 0xd6, 0x61, 0xad, 0xfb, 0x54, 0x29, + 0x21, 0xa8, 0xd5, 0x6e, 0x1d, 0x1f, 0x29, 0xa0, 0x3e, 0x82, 0x42, 0x63, 0x32, 0xa1, 0xc5, 0x8e, + 0x9d, 0x3f, 0xee, 0x76, 0xf9, 0x92, 0xd9, 0xed, 0x0f, 0x87, 0xfd, 0x43, 0x25, 0x83, 0x5c, 0x3b, + 0xec, 0x1f, 0x29, 0x6b, 0x6a, 0x07, 0x8a, 0x52, 0xd3, 0x49, 0x5c, 0x4c, 0x2d, 0x42, 0xee, 0x48, + 0x6b, 0xbf, 0xe4, 0xb1, 0x10, 0xbd, 0xf6, 0xb7, 0xd8, 0x4c, 0xfc, 0x85, 0x05, 0x65, 0xb1, 0x22, + 0x7e, 0x83, 0x94, 0x6e, 0xa6, 0x76, 0x3b, 0xbd, 0x76, 0x43, 0x53, 0xf2, 0xea, 0x73, 0x28, 0x27, + 0x44, 0x0e, 0x4e, 0xf6, 0x7e, 0xe3, 0x08, 0x19, 0xa6, 0xab, 0x8b, 0x62, 0xb7, 0x81, 0x45, 0xa0, + 0x78, 0x1e, 0x32, 0xea, 0xe7, 0xb0, 0xb9, 0xb4, 0xc3, 0x50, 0xc3, 0x1b, 0x1d, 0xd1, 0xf0, 0xce, + 0x7e, 0xaf, 0xaf, 0xb5, 0xf9, 0x25, 0x59, 0x31, 0x43, 0x6b, 0xea, 0x07, 0x50, 0x8a, 0xb6, 0x42, + 0xe4, 0xd8, 0xa6, 0xd6, 0x1f, 0x0c, 0xf8, 0x84, 0x5e, 0xc1, 0x34, 0x8d, 0x2a, 0x4f, 0x67, 0x54, + 0x1b, 0x6a, 0x69, 0xb9, 0xc4, 0x76, 0xe0, 0x36, 0xe7, 0xe9, 0xdd, 0xe3, 0x4e, 0xb7, 0xa5, 0x0f, + 0x3a, 0xad, 0xb6, 0x7e, 0xdc, 0x1b, 0x1c, 0xb5, 0x9b, 0x9d, 0xbd, 0x4e, 0xbb, 0xa5, 0x5c, 0x61, + 0x37, 0x61, 0x7b, 0x89, 0x82, 0xdf, 0xd0, 0xcd, 0xb0, 0x1b, 0x70, 0x6d, 0x09, 0x47, 0x9c, 0xbc, + 0xf6, 0x4d, 0xae, 0x78, 0x57, 0xd9, 0xf9, 0x26, 0x57, 0x7c, 0xa0, 0xbc, 0xab, 0x0e, 0x60, 0x53, + 0x6e, 0xfe, 0x74, 0x17, 0x88, 0xac, 0xd2, 0x2d, 0xc8, 0x77, 0xad, 0xd7, 0x96, 0x23, 0x2f, 0xb5, + 0x50, 0x02, 0xa1, 0xfd, 0x93, 0xef, 0x3b, 0xd1, 0x63, 0x0e, 0x94, 0x40, 0x6d, 0xbf, 0x97, 0x78, + 0x4f, 0x82, 0xae, 0x40, 0xff, 0xf3, 0x19, 0x28, 0x46, 0x2a, 0xc5, 0x03, 0x58, 0x1b, 0x0e, 0xc4, + 0xf9, 0xe1, 0xd6, 0x93, 0xf8, 0xf9, 0x9c, 0xa1, 0xfc, 0xa5, 0xad, 0x0d, 0x07, 0xec, 0x43, 0x58, + 0xe7, 0x57, 0xda, 0x85, 0xef, 0x70, 0x2b, 0xad, 0xa6, 0x0c, 0x09, 0xa7, 0x09, 0x1a, 0xf6, 0x39, + 0x94, 0xa2, 0xd6, 0x0a, 0x67, 0xda, 0xf5, 0x74, 0x86, 0x08, 0xad, 0xc5, 0x94, 0x6a, 0x17, 0x6a, + 0xe9, 0x02, 0xd9, 0x1d, 0x00, 0x5e, 0x64, 0xc2, 0x63, 0x9c, 0x80, 0xb0, 0x9b, 0x20, 0x6f, 0xda, + 0xb7, 0xa8, 0x61, 0xd5, 0xe8, 0xe6, 0x7d, 0x4b, 0xfd, 0xe3, 0x1c, 0x40, 0x6c, 0x94, 0xe0, 0x40, + 0x44, 0x2e, 0xc2, 0xbc, 0x08, 0xa9, 0xb8, 0x05, 0x25, 0xc7, 0x33, 0xcc, 0xe4, 0xeb, 0x39, 0x45, + 0x04, 0x10, 0x47, 0x24, 0xef, 0x84, 0x96, 0x78, 0x3c, 0x13, 0xdb, 0x86, 0xf5, 0xb1, 0xe7, 0x4f, + 0x8d, 0x50, 0xdc, 0x60, 0x12, 0x29, 0xd4, 0x2d, 0xf8, 0x49, 0x2d, 0x9a, 0x66, 0x2e, 0x5d, 0x62, + 0xc2, 0x39, 0xa8, 0x08, 0x60, 0x17, 0x61, 0xa8, 0x1b, 0x58, 0xee, 0xc8, 0xf1, 0x02, 0xcb, 0xc4, + 0xdd, 0x7e, 0x9d, 0xec, 0x2f, 0x90, 0xa0, 0xdd, 0x4b, 0xde, 0x5b, 0x7f, 0x6a, 0xbb, 0x46, 0x28, + 0xce, 0x0c, 0xa9, 0xb7, 0x12, 0x82, 0xcd, 0xfd, 0x3e, 0xf0, 0x84, 0xc7, 0x90, 0x5f, 0x80, 0x2c, + 0x22, 0x80, 0x9a, 0xfb, 0x0e, 0x80, 0x15, 0x8c, 0x8c, 0x19, 0x2f, 0xbc, 0xc4, 0x6f, 0xa1, 0x0b, + 0xc8, 0xee, 0x25, 0xeb, 0x42, 0x6d, 0x78, 0x82, 0xba, 0x90, 0xd7, 0x32, 0x42, 0xa3, 0xe9, 0x39, + 0xc2, 0x97, 0xf7, 0x60, 0xd1, 0x7a, 0x7b, 0x92, 0x26, 0xe3, 0x91, 0xc5, 0x0b, 0x79, 0xd9, 0x67, + 0x50, 0xb1, 0x47, 0xd6, 0x89, 0xe5, 0x4f, 0xb8, 0x25, 0x58, 0x4e, 0x5d, 0x3d, 0xe2, 0x18, 0x32, + 0x05, 0xcb, 0x76, 0x9c, 0x40, 0x1d, 0x73, 0xea, 0xb9, 0x13, 0xcf, 0x3c, 0xe1, 0xb9, 0x2a, 0x49, + 0xbf, 0xc4, 0x21, 0x62, 0x78, 0x1e, 0x41, 0x84, 0x89, 0x9b, 0x0d, 0xb8, 0xba, 0xa2, 0x41, 0x3f, + 0x2b, 0x9c, 0xf5, 0x3f, 0x5d, 0x83, 0x72, 0xa2, 0x4d, 0x74, 0xd0, 0x63, 0xcc, 0xc8, 0x51, 0x19, + 0xc5, 0xf3, 0x97, 0x04, 0x84, 0x5f, 0x0e, 0x1b, 0x19, 0xa1, 0xe1, 0x78, 0x93, 0xc4, 0xb5, 0x37, + 0x01, 0xe9, 0x98, 0x74, 0xf6, 0x6a, 0x4c, 0xad, 0x60, 0x66, 0x8c, 0xe4, 0xaa, 0x8a, 0x01, 0xf1, + 0x53, 0x4f, 0xb9, 0xe4, 0x53, 0x4f, 0x0a, 0x3f, 0xa4, 0xe7, 0x71, 0x51, 0x74, 0x26, 0x7f, 0x17, + 0xca, 0x52, 0xf1, 0xc7, 0x5a, 0xc4, 0x39, 0xb2, 0x04, 0x75, 0x4c, 0xf6, 0x10, 0xe2, 0xa7, 0xac, + 0x74, 0x23, 0xd0, 0xbd, 0xb1, 0x0c, 0xca, 0x8c, 0xc0, 0x8d, 0xa0, 0x3f, 0x8e, 0x0e, 0x77, 0x48, + 0x89, 0x13, 0x3c, 0x81, 0x00, 0x92, 0xa1, 0x4f, 0xe0, 0xaa, 0xf0, 0x38, 0x5b, 0xa6, 0x3e, 0xb6, + 0x2d, 0xc7, 0xd4, 0x6d, 0x93, 0x07, 0x4d, 0xe4, 0xb5, 0xcd, 0x08, 0xb5, 0x87, 0x98, 0x8e, 0x49, + 0x2a, 0xb2, 0x70, 0x33, 0x98, 0xf6, 0xc4, 0x0a, 0x42, 0x11, 0x42, 0x58, 0xe1, 0xc0, 0x16, 0xc1, + 0xd4, 0x7f, 0x94, 0x83, 0x52, 0x34, 0x59, 0x6f, 0x1b, 0xcc, 0xfb, 0x50, 0x1d, 0x79, 0xae, 0x6b, + 0x91, 0x4c, 0x8e, 0xc7, 0xb3, 0x12, 0x03, 0x29, 0x6e, 0x9b, 0x25, 0x88, 0xe4, 0xad, 0x04, 0x7e, + 0x77, 0x6b, 0x33, 0xc6, 0xbc, 0x14, 0xf7, 0x13, 0x6e, 0x42, 0x11, 0x17, 0xe3, 0x89, 0x11, 0xc8, + 0x61, 0x8e, 0xd2, 0xb8, 0x84, 0x46, 0x9e, 0xe3, 0xf0, 0x0c, 0xf2, 0xc9, 0x92, 0x18, 0xc2, 0x9e, + 0xd2, 0xa3, 0x35, 0x74, 0xf7, 0x6c, 0x9d, 0xf8, 0xbf, 0x9e, 0xe0, 0x3e, 0x7e, 0xfd, 0xec, 0x90, + 0x37, 0x5e, 0x93, 0x84, 0xec, 0x6b, 0x50, 0x66, 0xf3, 0xe0, 0xd4, 0x32, 0xf5, 0x99, 0x6f, 0x99, + 0xb4, 0xc7, 0x88, 0x1b, 0x16, 0x5b, 0x89, 0xcc, 0x47, 0x12, 0xa7, 0x6d, 0x70, 0xea, 0x08, 0xc0, + 0xde, 0x83, 0x8d, 0x78, 0x1a, 0x66, 0x46, 0x78, 0xca, 0xe3, 0x5d, 0x4a, 0x5a, 0x2d, 0x02, 0x1f, + 0x21, 0x94, 0x7d, 0x06, 0xdb, 0xbe, 0x15, 0xd8, 0xe6, 0xdc, 0x70, 0xf4, 0xf4, 0x44, 0xf0, 0x07, + 0x50, 0xb6, 0x24, 0x76, 0x2f, 0x31, 0x21, 0x58, 0xfc, 0xd4, 0xb8, 0x20, 0x9f, 0x9d, 0xe3, 0x58, + 0x8e, 0x1d, 0x4c, 0x69, 0xde, 0xf2, 0x5a, 0x6d, 0x6a, 0x5c, 0x1c, 0xc5, 0x50, 0x0a, 0x77, 0x9b, + 0x39, 0xf6, 0xc2, 0x4b, 0x01, 0x7c, 0x2e, 0x11, 0xae, 0x71, 0x34, 0x53, 0xa1, 0x8a, 0x05, 0x92, + 0x79, 0x1a, 0x45, 0xb0, 0x64, 0xb5, 0xf2, 0xd4, 0x20, 0x3f, 0x2e, 0x1d, 0x68, 0x3e, 0x80, 0x5a, + 0x44, 0xc3, 0xa3, 0x14, 0x44, 0xa0, 0x80, 0x20, 0xe2, 0x81, 0x0a, 0xd4, 0x34, 0xce, 0x1d, 0x72, + 0x5a, 0x6b, 0xfc, 0x1e, 0x80, 0x00, 0xcb, 0x39, 0xbd, 0x01, 0xdc, 0xf3, 0x8d, 0x2c, 0xb2, 0x41, + 0x14, 0x05, 0x4a, 0x77, 0x4c, 0xf5, 0x9f, 0xcd, 0x00, 0x5b, 0x9e, 0x9e, 0x37, 0xdd, 0x08, 0xc4, + 0xe1, 0x95, 0xd7, 0x71, 0xf0, 0x37, 0x7b, 0x1f, 0x0a, 0x53, 0x8f, 0x8b, 0xcc, 0xec, 0x1b, 0xee, + 0xa7, 0xaf, 0x4f, 0x3d, 0x12, 0xa1, 0xef, 0xc1, 0xc6, 0xc8, 0x73, 0x45, 0x43, 0xf9, 0x8a, 0xe2, + 0xfc, 0x55, 0x8b, 0xc1, 0xb8, 0xae, 0xd4, 0xff, 0x30, 0x03, 0xb5, 0xf4, 0xa4, 0xb3, 0x87, 0xf4, + 0x5e, 0x50, 0xea, 0xc5, 0xa1, 0x34, 0x45, 0x7f, 0x46, 0xef, 0x08, 0xad, 0x6a, 0xe2, 0x3b, 0x00, + 0x24, 0xad, 0xf4, 0x93, 0x40, 0xf0, 0x7d, 0x45, 0x2b, 0x11, 0x64, 0x37, 0xf0, 0xe8, 0x80, 0x97, + 0x3f, 0x09, 0xc7, 0xf1, 0xb9, 0x9d, 0x2c, 0xee, 0x1b, 0x1c, 0x44, 0x04, 0x9f, 0x24, 0x0e, 0xa5, + 0xf8, 0xa1, 0xd3, 0x6a, 0xc6, 0x8c, 0xa8, 0xd4, 0x3f, 0xcf, 0x00, 0xc4, 0xf3, 0x8e, 0xa3, 0x7f, + 0x66, 0x5d, 0x12, 0x6b, 0x8a, 0xf1, 0x2c, 0x9c, 0x59, 0x97, 0x47, 0xa2, 0x6d, 0xe2, 0x40, 0x33, + 0x10, 0x41, 0xb4, 0x15, 0xad, 0xc4, 0xcf, 0x30, 0x03, 0x7e, 0xa5, 0x54, 0x1c, 0x61, 0x26, 0x9a, + 0xce, 0x4f, 0x2d, 0x03, 0xba, 0x4a, 0xb4, 0xc1, 0x73, 0xd3, 0x0d, 0x4f, 0x34, 0x08, 0xc5, 0xe5, + 0x59, 0x7e, 0xe4, 0xda, 0x91, 0x50, 0x24, 0xe4, 0xe5, 0xc4, 0x84, 0x3c, 0xaa, 0x8d, 0x1f, 0xb0, + 0x46, 0x84, 0xaa, 0x23, 0x37, 0xf5, 0x46, 0x18, 0xd2, 0xb5, 0xf8, 0xc8, 0x5b, 0x90, 0x91, 0x37, + 0x66, 0xb9, 0xa3, 0xe0, 0x16, 0x05, 0xff, 0x8a, 0x2b, 0x34, 0x62, 0x6f, 0x8f, 0xae, 0xc6, 0x3c, + 0xc4, 0x99, 0x76, 0xa4, 0x48, 0x24, 0x12, 0x7e, 0x55, 0xba, 0x3a, 0xf2, 0x1c, 0x2e, 0x0e, 0x11, + 0xa8, 0xfe, 0x8b, 0x79, 0x80, 0xd8, 0x4f, 0x9c, 0xe2, 0xd2, 0x4c, 0x8a, 0x4b, 0xd9, 0x53, 0xd8, + 0x16, 0x77, 0xfe, 0xa3, 0xa8, 0x42, 0xdb, 0xd5, 0x4f, 0x0c, 0x19, 0xc5, 0xcc, 0x04, 0x96, 0xc7, + 0x8b, 0x75, 0xdc, 0x5d, 0x23, 0x64, 0xcf, 0x51, 0x2e, 0xc4, 0x79, 0xc2, 0xcb, 0xd9, 0x1b, 0x59, + 0xb4, 0x1a, 0x67, 0x1f, 0x5e, 0xce, 0xd8, 0x27, 0x74, 0x55, 0xd4, 0xb7, 0x82, 0x53, 0x3d, 0x0c, + 0x92, 0x95, 0xf1, 0x6b, 0x06, 0x9b, 0x02, 0x39, 0x0c, 0xa2, 0xba, 0x3e, 0x81, 0x6b, 0x42, 0xa2, + 0x2c, 0x34, 0x8f, 0x1f, 0xc4, 0x6e, 0x72, 0x64, 0xb2, 0x75, 0x34, 0xf3, 0xe4, 0x3c, 0x97, 0x4f, + 0x17, 0x16, 0x71, 0xe6, 0x71, 0x30, 0xc4, 0x23, 0x3d, 0xe4, 0x01, 0x27, 0xd1, 0x54, 0xd4, 0x78, + 0x82, 0xa9, 0x90, 0xc3, 0x15, 0x42, 0x02, 0xa8, 0xf6, 0xb4, 0xf6, 0x84, 0x9e, 0x66, 0xa4, 0x07, + 0x96, 0x3c, 0xd3, 0xd2, 0x08, 0xc7, 0x3e, 0xc2, 0x5d, 0x29, 0xee, 0xb6, 0x7c, 0x5d, 0x8c, 0x07, + 0xd6, 0x29, 0x71, 0x47, 0x35, 0xfe, 0xce, 0xd8, 0x07, 0xc0, 0x12, 0x2d, 0x97, 0xd4, 0x15, 0xa2, + 0xde, 0x88, 0x9a, 0x2d, 0x88, 0xdf, 0x03, 0x6a, 0x62, 0x1c, 0x43, 0xb7, 0xe0, 0x2e, 0x46, 0xa4, + 0x88, 0xbb, 0xbb, 0x16, 0xf7, 0x4e, 0x37, 0x42, 0x3d, 0x3c, 0xb5, 0x74, 0xcb, 0x35, 0x49, 0x3e, + 0x15, 0xb5, 0xcd, 0xa8, 0xa3, 0x8d, 0x70, 0x78, 0x6a, 0xb5, 0x5d, 0x33, 0x79, 0x20, 0xb7, 0xf1, + 0xe3, 0x07, 0x72, 0x5f, 0x40, 0x3d, 0xed, 0x92, 0x49, 0x0c, 0x37, 0x7f, 0xe8, 0x64, 0x2b, 0x19, + 0x9c, 0x18, 0x8d, 0xf8, 0x63, 0xd8, 0x3c, 0x35, 0x82, 0xb4, 0x3b, 0x87, 0xce, 0x09, 0x8b, 0xda, + 0xc6, 0xa9, 0x11, 0x24, 0x7d, 0x38, 0xea, 0xdf, 0x5f, 0x83, 0x5a, 0xda, 0x73, 0xce, 0x6f, 0x8f, + 0xf3, 0xbd, 0x2d, 0x43, 0x3b, 0x7c, 0xb4, 0x83, 0xdd, 0x82, 0x12, 0x8f, 0x60, 0x9c, 0x4f, 0x5d, + 0xb9, 0x16, 0x66, 0x67, 0x5c, 0x9e, 0xa2, 0x80, 0x9c, 0x9d, 0xbd, 0x45, 0x40, 0xce, 0xf8, 0xd5, + 0xaf, 0xf7, 0xa1, 0x30, 0x3f, 0x8b, 0x9f, 0x30, 0x5a, 0x49, 0x3a, 0x3f, 0x13, 0x31, 0x14, 0x37, + 0x84, 0xcf, 0x5f, 0x84, 0x37, 0x4e, 0xe7, 0x4e, 0x68, 0xeb, 0xe4, 0x92, 0x13, 0x4b, 0x7b, 0x9b, + 0x13, 0x74, 0x08, 0x4f, 0x57, 0x51, 0xc8, 0xcf, 0x8a, 0xf2, 0x4e, 0x5c, 0x38, 0x8d, 0xf6, 0xe9, + 0xbc, 0x06, 0xfc, 0x82, 0x29, 0x75, 0xe7, 0x7d, 0x50, 0x46, 0x9e, 0x3b, 0x76, 0xec, 0x51, 0x18, + 0x51, 0x15, 0x88, 0x6a, 0x43, 0xc2, 0x25, 0xe9, 0xbb, 0x50, 0x13, 0x51, 0x7f, 0x92, 0x90, 0xdf, + 0xaf, 0xa8, 0x72, 0xa8, 0xbc, 0x70, 0xfe, 0x9f, 0xad, 0x41, 0x25, 0x79, 0x3c, 0xf5, 0x53, 0xc2, + 0x2a, 0x7f, 0x56, 0x8c, 0xec, 0x0e, 0x5d, 0xe5, 0xd0, 0xe9, 0x26, 0x18, 0xce, 0x2a, 0x8f, 0xa9, + 0x84, 0x53, 0x23, 0x68, 0xcc, 0x43, 0xdc, 0xd9, 0x48, 0xed, 0xf4, 0x1c, 0x79, 0x5b, 0x8e, 0xaf, + 0x63, 0x94, 0x60, 0xe2, 0xa2, 0xdc, 0x27, 0xe2, 0x32, 0x2e, 0x3d, 0x84, 0x40, 0xb7, 0x1e, 0xf2, + 0x4b, 0xdc, 0x5d, 0x91, 0xef, 0x20, 0xd0, 0x2d, 0x8f, 0xa7, 0xb0, 0x11, 0x5f, 0x7d, 0xe4, 0x59, + 0xd6, 0x97, 0xb2, 0x54, 0xa3, 0x7b, 0x8f, 0xe2, 0x91, 0xa6, 0xaa, 0x1d, 0xe8, 0x9e, 0x63, 0xca, + 0x2b, 0xec, 0x05, 0x19, 0x3c, 0xd0, 0x77, 0x4c, 0x71, 0x4d, 0x9d, 0xd3, 0xb8, 0xd6, 0xb9, 0xa4, + 0x89, 0x02, 0x0c, 0x7a, 0xd6, 0x39, 0xa7, 0x51, 0xff, 0xa3, 0x2c, 0x6c, 0x2e, 0x9d, 0x48, 0xa1, + 0x1a, 0x1c, 0x3f, 0x60, 0x8a, 0x3f, 0xd9, 0x3d, 0xa8, 0x4c, 0x8d, 0x70, 0x74, 0x8a, 0x9a, 0xd5, + 0xd8, 0xbe, 0x90, 0xaf, 0xb0, 0x12, 0xec, 0x88, 0x40, 0xc8, 0x0d, 0x7c, 0x67, 0xe0, 0x67, 0xf6, + 0x5c, 0x4c, 0xf3, 0x4d, 0xa7, 0x4b, 0x87, 0xf5, 0xf2, 0x16, 0x48, 0xee, 0x0d, 0xb7, 0x40, 0x6e, + 0x42, 0xc9, 0xf5, 0x28, 0xe2, 0x77, 0x76, 0x26, 0x38, 0xaf, 0xe0, 0x7a, 0x61, 0xdf, 0x3d, 0x3a, + 0x63, 0x4f, 0xe1, 0xda, 0x3c, 0xa0, 0x20, 0xb9, 0x13, 0xcb, 0x0f, 0x4e, 0xed, 0xc8, 0x37, 0xcc, + 0xc5, 0xdd, 0xd5, 0x79, 0x60, 0x1d, 0x46, 0x38, 0xe1, 0x22, 0x6e, 0x40, 0x85, 0xe6, 0xc0, 0x1d, + 0x79, 0x74, 0xda, 0x54, 0x20, 0x51, 0x77, 0x67, 0xc5, 0x31, 0xdc, 0x0b, 0xeb, 0xb2, 0x2d, 0xa8, + 0x34, 0x64, 0x69, 0x99, 0x60, 0xef, 0xd3, 0x05, 0xbf, 0x13, 0x2b, 0xb6, 0xe4, 0x52, 0x4b, 0x49, + 0x2b, 0x11, 0x96, 0xd6, 0xd1, 0x0b, 0xb8, 0xc1, 0x17, 0xc3, 0x74, 0xe6, 0xb9, 0x96, 0x1b, 0xea, + 0x71, 0xc6, 0x20, 0x1d, 0xb8, 0x91, 0x58, 0x84, 0xdb, 0xb4, 0x58, 0x44, 0x8e, 0x23, 0x59, 0x16, + 0x2e, 0x1c, 0xe0, 0x9e, 0x57, 0x1a, 0x30, 0x58, 0x3e, 0xfe, 0x22, 0x2c, 0xfe, 0x54, 0x6f, 0xc3, + 0x7a, 0x27, 0x3a, 0x2f, 0x8c, 0x82, 0xeb, 0xb3, 0xe2, 0x81, 0x46, 0x0f, 0x4a, 0xdc, 0x91, 0x7c, + 0x68, 0xcc, 0xd8, 0x63, 0xc8, 0x4e, 0x8d, 0x99, 0x88, 0x3f, 0xaa, 0x47, 0x41, 0x5a, 0x1c, 0xfb, + 0xe4, 0xd0, 0x98, 0x71, 0x1b, 0x12, 0x89, 0x6e, 0x7e, 0x01, 0x45, 0x09, 0xf8, 0x79, 0x57, 0x12, + 0xd7, 0xa0, 0xd4, 0x4a, 0x9e, 0xf7, 0xa3, 0xde, 0x19, 0xfa, 0x73, 0x97, 0xb4, 0x71, 0xf1, 0x14, + 0xdd, 0xc8, 0x70, 0x87, 0x02, 0x24, 0x17, 0xf0, 0xda, 0x8f, 0x2c, 0xe0, 0xdb, 0x00, 0x3e, 0x1d, + 0x97, 0xd1, 0x89, 0x59, 0x36, 0xba, 0x6c, 0xd4, 0x31, 0x3b, 0xe6, 0xc5, 0xea, 0xa8, 0xe9, 0xdc, + 0x4f, 0x8f, 0x9a, 0xce, 0xaf, 0x8c, 0x9a, 0x7e, 0x18, 0x6f, 0xf9, 0x38, 0xad, 0x58, 0x71, 0x89, + 0x0b, 0xa4, 0x59, 0x74, 0xc1, 0x1a, 0x6b, 0xff, 0x05, 0xd4, 0x64, 0xef, 0x44, 0x79, 0x90, 0xba, + 0xd3, 0x2d, 0x70, 0x3c, 0x40, 0xa0, 0x1a, 0x26, 0x93, 0x69, 0xc1, 0x54, 0x7e, 0x4b, 0x64, 0xf6, + 0xbf, 0x9c, 0x01, 0x26, 0x8e, 0x77, 0xf6, 0xe6, 0x8e, 0x33, 0xb4, 0x2e, 0x48, 0xfe, 0x3d, 0x86, + 0x4d, 0x11, 0xbf, 0x90, 0x78, 0xd5, 0x44, 0x44, 0xec, 0x71, 0x44, 0x1c, 0xb1, 0xb7, 0xea, 0x01, + 0x94, 0xb5, 0x95, 0x0f, 0xa0, 0xac, 0x7e, 0x58, 0xe5, 0x2e, 0x94, 0x93, 0xcf, 0x87, 0x70, 0x95, + 0x1b, 0x8c, 0xe8, 0xe5, 0x10, 0xf5, 0xbf, 0x5b, 0x03, 0x88, 0x8f, 0xa0, 0xfe, 0xba, 0x43, 0xde, + 0x57, 0x4c, 0x49, 0x76, 0xd5, 0x94, 0x3c, 0x02, 0x25, 0x49, 0x97, 0x78, 0xc7, 0xa6, 0x16, 0x13, + 0x4a, 0xd5, 0xd3, 0x0e, 0x92, 0x0f, 0x88, 0xd0, 0x1d, 0x58, 0x11, 0x25, 0xcc, 0x91, 0x7c, 0xeb, + 0x13, 0x62, 0xa6, 0x68, 0x07, 0x7c, 0xe7, 0xa1, 0x5d, 0x53, 0xe6, 0xd4, 0xcf, 0xed, 0xf0, 0xd4, + 0x9b, 0x87, 0x42, 0x24, 0x05, 0x42, 0x16, 0x6f, 0xcb, 0x92, 0x5e, 0x71, 0x34, 0x17, 0x35, 0x01, + 0xfb, 0x1c, 0x4a, 0xe3, 0xb9, 0xe3, 0xe8, 0xa1, 0x75, 0x11, 0x0a, 0x91, 0x52, 0x4f, 0x9d, 0xde, + 0x25, 0xa6, 0x57, 0x2b, 0x8e, 0x45, 0x42, 0xfd, 0xa7, 0xf3, 0x90, 0xff, 0xf5, 0xdc, 0xf2, 0x2f, + 0xd9, 0x17, 0x50, 0x0a, 0xc2, 0x69, 0x98, 0x0c, 0xa4, 0x13, 0xa7, 0x32, 0x84, 0xa7, 0x38, 0x38, + 0x6b, 0x6a, 0xb9, 0x21, 0x3f, 0xd6, 0x46, 0x5a, 0x92, 0x50, 0x5b, 0x90, 0x0f, 0x42, 0x6b, 0x16, + 0x88, 0x0b, 0x34, 0x3c, 0xc1, 0x76, 0x20, 0xef, 0x7a, 0xa6, 0x15, 0xa4, 0xaf, 0xc9, 0xf4, 0x50, + 0x0b, 0xe4, 0x08, 0xa6, 0xc2, 0x7a, 0x34, 0xe3, 0x4b, 0xc1, 0x6c, 0x1c, 0x43, 0x97, 0x6f, 0x2d, + 0x03, 0x65, 0xa6, 0x7c, 0x17, 0x28, 0x4a, 0xa3, 0xba, 0x43, 0xbe, 0x3a, 0x63, 0x22, 0xdf, 0x13, + 0x13, 0x49, 0xb6, 0x03, 0x65, 0xfc, 0xf9, 0xca, 0xb7, 0x43, 0x6b, 0xf0, 0x4c, 0xee, 0x61, 0x09, + 0x10, 0xbb, 0x03, 0x60, 0x5a, 0xa1, 0x35, 0x0a, 0x07, 0x3f, 0x38, 0xd2, 0x18, 0x4f, 0x40, 0xd8, + 0x2f, 0x80, 0x9d, 0x18, 0xa3, 0xb3, 0x89, 0x4f, 0x01, 0xa0, 0x3f, 0xcc, 0x2d, 0xdf, 0x8e, 0xc4, + 0x6d, 0x39, 0x31, 0x28, 0xda, 0x66, 0x4c, 0xf6, 0x6b, 0x4e, 0xc5, 0xb6, 0x61, 0x7d, 0x6a, 0x5c, + 0xb4, 0xbc, 0x99, 0x88, 0xcc, 0x17, 0x29, 0xf6, 0x0c, 0xb6, 0x51, 0x05, 0x90, 0xaf, 0xcf, 0x20, + 0x0f, 0x89, 0x03, 0x53, 0xfe, 0x14, 0xe9, 0xd5, 0x53, 0x23, 0x88, 0x5f, 0x44, 0x10, 0x5e, 0xec, + 0x5d, 0xd8, 0x92, 0xce, 0x28, 0xd3, 0x9a, 0x59, 0xae, 0x69, 0xb9, 0x23, 0x3b, 0x7a, 0x6f, 0x61, + 0x89, 0xf9, 0xaf, 0x0a, 0xe2, 0x56, 0x82, 0x96, 0xdd, 0x87, 0x2a, 0x56, 0xec, 0x5b, 0xe1, 0xdc, + 0x77, 0x71, 0xc7, 0xe2, 0x77, 0x4b, 0x50, 0x21, 0xd1, 0x24, 0x8c, 0x47, 0x80, 0x88, 0x04, 0x8f, + 0x59, 0xe2, 0x2f, 0x96, 0x55, 0x23, 0xe8, 0x20, 0xb4, 0x66, 0xea, 0x1f, 0x41, 0x35, 0xc5, 0x07, + 0x4b, 0xa7, 0x6a, 0x83, 0x76, 0xb7, 0xdd, 0x1c, 0x72, 0x4f, 0xbb, 0x38, 0xfe, 0x59, 0x4b, 0x9c, + 0x13, 0xe5, 0x12, 0x1e, 0xf8, 0x3c, 0x9d, 0x32, 0xb5, 0xb5, 0xfd, 0x36, 0x1d, 0x85, 0x64, 0x95, + 0xac, 0xfa, 0xaf, 0xac, 0xc1, 0xe6, 0xd0, 0x37, 0xdc, 0xc0, 0xe0, 0x7a, 0xae, 0x1b, 0xfa, 0x9e, + 0xc3, 0x7e, 0x01, 0xc5, 0x70, 0xe4, 0x24, 0x19, 0xf3, 0xae, 0x14, 0x83, 0x0b, 0xa4, 0x4f, 0x86, + 0x23, 0x1e, 0x75, 0x51, 0x08, 0xf9, 0x0f, 0xf6, 0x11, 0xe4, 0x4f, 0xac, 0x89, 0xed, 0x8a, 0x9d, + 0xe0, 0xda, 0x62, 0xc6, 0x5d, 0x44, 0x1e, 0x5c, 0xd1, 0x38, 0x15, 0xfb, 0x04, 0xd6, 0x47, 0xde, + 0x54, 0x2a, 0x1a, 0xf1, 0x5b, 0x0d, 0x89, 0x8a, 0x10, 0x7b, 0x70, 0x45, 0x13, 0x74, 0xec, 0x0b, + 0x28, 0xfa, 0x9e, 0xe3, 0x20, 0x1f, 0x08, 0x15, 0xa4, 0xbe, 0x98, 0x47, 0x13, 0xf8, 0x83, 0x2b, + 0x5a, 0x44, 0xab, 0x3e, 0x81, 0x82, 0x68, 0x2c, 0x0e, 0xc3, 0x6e, 0x7b, 0xbf, 0x23, 0x46, 0xb0, + 0xd9, 0x3f, 0x3c, 0xec, 0x0c, 0xf9, 0xab, 0x38, 0x5a, 0xbf, 0xdb, 0xdd, 0x6d, 0x34, 0x5f, 0x28, + 0x6b, 0xbb, 0x45, 0x58, 0xe7, 0xec, 0xa2, 0xfe, 0x71, 0x06, 0x36, 0x16, 0x3a, 0xc0, 0x9e, 0x43, + 0x8e, 0xfc, 0x15, 0x7c, 0x78, 0x1e, 0xac, 0xec, 0x65, 0x22, 0xcd, 0xad, 0x31, 0xcc, 0xa1, 0x7e, + 0x05, 0xb5, 0x34, 0x3c, 0x71, 0x8e, 0x53, 0x85, 0x92, 0xd6, 0x6e, 0xb4, 0xf4, 0x7e, 0xaf, 0xfb, + 0x1d, 0x3f, 0x18, 0xa5, 0xe4, 0x2b, 0xad, 0x43, 0x07, 0x28, 0x7f, 0x1b, 0x94, 0xc5, 0x81, 0x61, + 0xfb, 0x68, 0x59, 0x4f, 0x67, 0x8e, 0x45, 0x06, 0x4c, 0x62, 0xca, 0xee, 0xac, 0x18, 0x49, 0x41, + 0xc6, 0x23, 0xa9, 0x47, 0xa9, 0xb4, 0xfa, 0x47, 0xc0, 0x96, 0x47, 0xf0, 0xaf, 0xaf, 0xf8, 0xff, + 0x2b, 0x03, 0xb9, 0x23, 0xc7, 0x70, 0xd9, 0x7d, 0xc8, 0xd3, 0xab, 0x9b, 0x62, 0x3f, 0x49, 0xae, + 0x6e, 0x64, 0x0b, 0xc2, 0xb1, 0x0f, 0x20, 0x1b, 0x8e, 0xe4, 0xfb, 0x37, 0xd7, 0xdf, 0xc0, 0x7c, + 0x07, 0x57, 0x34, 0xa4, 0x62, 0x8f, 0x20, 0x6b, 0x9a, 0xf2, 0x2a, 0xa6, 0xf0, 0xc4, 0xb4, 0x8c, + 0xd0, 0x68, 0x59, 0x63, 0xdb, 0xb5, 0xc5, 0x2b, 0xa1, 0x48, 0xc2, 0xde, 0x85, 0xac, 0x39, 0x72, + 0xd2, 0xf7, 0x6a, 0xb9, 0x9b, 0x3b, 0x2a, 0xd0, 0x1c, 0x39, 0xa8, 0x71, 0x87, 0xfe, 0xa5, 0xee, + 0xcf, 0x5d, 0xba, 0x92, 0x13, 0x08, 0x9b, 0xbd, 0x8c, 0x5a, 0xd5, 0x9c, 0xee, 0xf5, 0x04, 0xe2, + 0x21, 0x8d, 0x99, 0x6f, 0xcd, 0x0c, 0x3f, 0xb2, 0xd6, 0xed, 0xe0, 0x88, 0x03, 0x76, 0xd7, 0x81, + 0x3e, 0xad, 0xa0, 0x7e, 0x48, 0x4f, 0x42, 0xa2, 0xd9, 0xa7, 0xca, 0x5f, 0x2b, 0x5e, 0xe1, 0x16, + 0x18, 0xf5, 0x1f, 0x66, 0xa1, 0x9c, 0x68, 0x0f, 0xfb, 0x0c, 0x8a, 0x66, 0x7a, 0x21, 0xde, 0x58, + 0x6a, 0xf4, 0x93, 0x96, 0x5c, 0x82, 0xa6, 0x60, 0x6f, 0x0a, 0xe9, 0x09, 0xf5, 0xd7, 0x86, 0x6f, + 0xf3, 0xa7, 0x86, 0xd7, 0x92, 0xb1, 0x35, 0x03, 0x2b, 0x7c, 0x29, 0x31, 0x07, 0x57, 0xb4, 0x4a, + 0x90, 0x48, 0x93, 0x6d, 0x2a, 0xba, 0x94, 0x4d, 0x3d, 0xef, 0xcc, 0x81, 0x07, 0x57, 0x34, 0x89, + 0x47, 0x52, 0xeb, 0xc2, 0x1a, 0xcd, 0x43, 0x69, 0x9b, 0x56, 0x65, 0x87, 0x08, 0x48, 0x6f, 0xcc, + 0xf3, 0x9f, 0xec, 0x29, 0x4a, 0x7f, 0xc3, 0x71, 0x3c, 0x52, 0x1e, 0xf3, 0x49, 0x67, 0x68, 0x2b, + 0x82, 0xf3, 0x37, 0xed, 0x65, 0x8a, 0x3d, 0x84, 0xbc, 0x17, 0x9e, 0x5a, 0xd2, 0x86, 0x92, 0x8f, + 0x4b, 0x22, 0xa8, 0xd5, 0xec, 0x22, 0xa7, 0x10, 0x5a, 0xfd, 0xd3, 0x0c, 0x14, 0xc4, 0x08, 0xb0, + 0x4d, 0xa8, 0x0e, 0xda, 0x43, 0xfd, 0x65, 0x43, 0xeb, 0x34, 0x76, 0xbb, 0x6d, 0x71, 0x1d, 0x78, + 0x5f, 0x6b, 0xf4, 0x84, 0x80, 0xd4, 0xda, 0x2f, 0xfb, 0x2f, 0xda, 0xfc, 0x70, 0xb4, 0xd5, 0xee, + 0x7d, 0xa7, 0x64, 0x79, 0x70, 0x40, 0xfb, 0xa8, 0xa1, 0xa1, 0xac, 0x2c, 0x43, 0xa1, 0xfd, 0x6d, + 0xbb, 0x79, 0x4c, 0xc2, 0xb2, 0x06, 0xd0, 0x6a, 0x37, 0xba, 0xdd, 0x7e, 0x13, 0x85, 0xe7, 0x3a, + 0x63, 0x50, 0x6b, 0x6a, 0xed, 0xc6, 0xb0, 0xad, 0x37, 0x9a, 0xcd, 0xfe, 0x71, 0x6f, 0xa8, 0x14, + 0xb0, 0xc6, 0x46, 0x77, 0xd8, 0xd6, 0x22, 0x10, 0x3d, 0xf8, 0xdb, 0xd2, 0xfa, 0x47, 0x11, 0xa4, + 0xb4, 0x5b, 0x82, 0xc2, 0x88, 0xcf, 0x95, 0xfa, 0x1f, 0x6c, 0x42, 0x2d, 0xcd, 0x9a, 0xec, 0x4b, + 0x28, 0x9a, 0x66, 0x6a, 0x8e, 0x6f, 0xaf, 0x62, 0xe1, 0x27, 0x2d, 0x53, 0x4e, 0x33, 0xff, 0xc1, + 0xee, 0xc9, 0x85, 0xb4, 0xb6, 0xb4, 0x90, 0xe4, 0x32, 0xfa, 0x1a, 0x36, 0xc4, 0x8b, 0x87, 0x91, + 0x03, 0x3f, 0xb5, 0x4a, 0x9a, 0x84, 0x6c, 0x09, 0xdc, 0xc1, 0x15, 0xad, 0x36, 0x4a, 0x41, 0xd8, + 0x2f, 0xa1, 0x66, 0x70, 0xb7, 0x78, 0xf2, 0x00, 0x20, 0x52, 0x8b, 0x1b, 0xe4, 0x15, 0x8f, 0xb3, + 0x57, 0x8d, 0x24, 0x00, 0x19, 0xd1, 0xf4, 0xbd, 0x59, 0x9c, 0x39, 0x9f, 0x0a, 0xf2, 0xf2, 0xbd, + 0x59, 0x22, 0x6f, 0xc5, 0x4c, 0xa4, 0xd9, 0x17, 0x50, 0x11, 0x2d, 0x8f, 0xdd, 0x61, 0xd1, 0x92, + 0xe5, 0xcd, 0x26, 0x35, 0xf7, 0xe0, 0x8a, 0x56, 0x1e, 0xc5, 0x49, 0xf6, 0x0c, 0x75, 0xdb, 0xd8, + 0x28, 0x28, 0x24, 0x79, 0x8d, 0x5a, 0x2b, 0x73, 0x81, 0x11, 0xa5, 0xd8, 0x27, 0x00, 0xd4, 0x4e, + 0x9e, 0xa7, 0x98, 0x0a, 0x7f, 0xf6, 0xbd, 0x99, 0xcc, 0x52, 0x32, 0x65, 0x22, 0xd1, 0x3c, 0xee, + 0xcc, 0x2c, 0x2d, 0x37, 0x8f, 0x1c, 0x9a, 0x71, 0xf3, 0xb8, 0x1f, 0x34, 0x6a, 0x1e, 0xcf, 0x06, + 0x4b, 0xcd, 0x93, 0xb9, 0x78, 0xf3, 0x78, 0x26, 0xd9, 0x3c, 0x9e, 0xa7, 0xbc, 0xd8, 0x3c, 0x99, + 0x85, 0x9a, 0xc7, 0x73, 0xfc, 0x72, 0xc9, 0x9a, 0xa9, 0xbc, 0xd1, 0x9a, 0xc1, 0x69, 0x4b, 0xdb, + 0x33, 0xbf, 0x84, 0x5a, 0x70, 0xea, 0x9d, 0x27, 0x04, 0x48, 0x35, 0x99, 0x7b, 0x70, 0xea, 0x9d, + 0x27, 0x25, 0x48, 0x35, 0x48, 0x02, 0xb0, 0xb5, 0xbc, 0x8b, 0x14, 0x90, 0x55, 0x4b, 0xb6, 0x96, + 0x7a, 0xf8, 0xd2, 0xb6, 0xce, 0xb1, 0xb5, 0x86, 0x4c, 0xe0, 0xa0, 0xc4, 0xae, 0xc1, 0x40, 0x38, + 0xfb, 0x52, 0x41, 0xc3, 0xa2, 0x26, 0x88, 0x9c, 0x84, 0x01, 0xf2, 0xd6, 0xdc, 0x4d, 0x66, 0x53, + 0x92, 0xbc, 0x75, 0xec, 0xa6, 0x32, 0x56, 0x38, 0xa9, 0xc8, 0x1a, 0xaf, 0x8a, 0xc0, 0xfa, 0x61, + 0x6e, 0xb9, 0x23, 0x4b, 0x5c, 0x0e, 0x48, 0xad, 0x8a, 0x81, 0xc0, 0xc5, 0xab, 0x42, 0x42, 0x22, + 0xbe, 0x8e, 0xb2, 0xb3, 0x45, 0xbe, 0x4e, 0x64, 0x26, 0xbe, 0x8e, 0xb2, 0x46, 0x0b, 0x2a, 0xca, + 0x7b, 0x75, 0x69, 0x41, 0x25, 0x32, 0xf3, 0x05, 0x15, 0xe5, 0x7e, 0x06, 0x82, 0x9b, 0xf8, 0xe0, + 0xa6, 0xae, 0x10, 0xf0, 0x56, 0x8b, 0xd1, 0x85, 0x51, 0x94, 0x42, 0x5e, 0xf5, 0x2d, 0xb4, 0x9e, + 0x04, 0x2b, 0x5c, 0x4b, 0xf2, 0xaa, 0x46, 0x98, 0x68, 0x29, 0xf9, 0x71, 0x32, 0x51, 0xd9, 0xcc, + 0x0e, 0xfd, 0xba, 0xb9, 0x5c, 0xd9, 0x91, 0x1d, 0xfa, 0x71, 0x65, 0x98, 0x62, 0x1f, 0x01, 0xb1, + 0x21, 0xcf, 0x62, 0x25, 0x45, 0x37, 0x0e, 0x8b, 0xc8, 0x50, 0x34, 0xc5, 0x6f, 0x64, 0x16, 0x51, + 0xc7, 0xc8, 0x1c, 0xd5, 0xc7, 0x49, 0x66, 0xe1, 0x55, 0x34, 0x5b, 0x4d, 0x64, 0x16, 0x4e, 0xd4, + 0x34, 0x47, 0xec, 0x31, 0x50, 0x6e, 0xa2, 0x9f, 0xa4, 0x1e, 0x2f, 0xf6, 0xbd, 0x19, 0xa7, 0x2e, + 0x20, 0x01, 0xd2, 0x62, 0x0f, 0x1c, 0xcf, 0x95, 0x1d, 0x3f, 0x4d, 0xf5, 0x00, 0x11, 0x91, 0x30, + 0x18, 0x45, 0x29, 0xf5, 0x9f, 0x5a, 0x87, 0x82, 0x90, 0xb5, 0xec, 0x2a, 0x6c, 0x08, 0x91, 0xdf, + 0x6a, 0x0c, 0x1b, 0xbb, 0x8d, 0x01, 0x2a, 0x69, 0x0c, 0x6a, 0x5c, 0xe6, 0x47, 0xb0, 0x0c, 0xee, + 0x03, 0x24, 0xf4, 0x23, 0xd0, 0x1a, 0xee, 0x03, 0x22, 0x2f, 0x0f, 0x41, 0xc9, 0xb2, 0x0d, 0x28, + 0xf3, 0x8c, 0x1c, 0x40, 0xaf, 0x93, 0x50, 0x2e, 0x9e, 0xce, 0x27, 0xb2, 0xf0, 0x58, 0xa1, 0xf5, + 0x38, 0x0b, 0x07, 0x14, 0xa2, 0x2c, 0x32, 0x98, 0x88, 0x41, 0x6d, 0xa8, 0x1d, 0xf7, 0x9a, 0x71, + 0x3d, 0x25, 0x7a, 0x51, 0x82, 0x17, 0xf3, 0xb2, 0xd3, 0x7e, 0xa5, 0x00, 0x66, 0xe2, 0xa5, 0x50, + 0xba, 0x8c, 0x6a, 0x26, 0x15, 0x42, 0xc9, 0x0a, 0xbb, 0x0e, 0x57, 0x07, 0x07, 0xfd, 0x57, 0x3a, + 0xcf, 0x14, 0x75, 0xa1, 0xca, 0xb6, 0x40, 0x49, 0x20, 0x78, 0xf1, 0x35, 0xac, 0x92, 0xa0, 0x92, + 0x70, 0xa0, 0x6c, 0xd0, 0x13, 0x92, 0x08, 0x1b, 0xf2, 0x7d, 0x57, 0xc1, 0xae, 0xf0, 0xac, 0xfd, + 0xee, 0xf1, 0x61, 0x6f, 0xa0, 0x6c, 0x62, 0x23, 0x08, 0xc2, 0x5b, 0xce, 0xa2, 0x62, 0xe2, 0xdd, + 0xfa, 0x2a, 0x6d, 0xe0, 0x08, 0x7b, 0xd5, 0xd0, 0x7a, 0x9d, 0xde, 0xfe, 0x40, 0xd9, 0x8a, 0x4a, + 0x6e, 0x6b, 0x5a, 0x5f, 0x1b, 0x28, 0xd7, 0x22, 0xc0, 0x60, 0xd8, 0x18, 0x1e, 0x0f, 0x94, 0xed, + 0xa8, 0x95, 0x47, 0x5a, 0xbf, 0xd9, 0x1e, 0x0c, 0xba, 0x9d, 0xc1, 0x50, 0xb9, 0xce, 0xae, 0xc1, + 0x66, 0xdc, 0x22, 0x49, 0x5c, 0x4f, 0x34, 0x54, 0xdb, 0x6f, 0x0f, 0x95, 0x1b, 0x51, 0x33, 0x9a, + 0xfd, 0x6e, 0xb7, 0x41, 0xf1, 0x4d, 0x37, 0x91, 0x88, 0x42, 0xeb, 0x44, 0x6f, 0x6e, 0x61, 0xbb, + 0x8e, 0x7b, 0x49, 0xd0, 0xed, 0x04, 0x6b, 0x0c, 0xda, 0xbf, 0x3e, 0x6e, 0xf7, 0x9a, 0x6d, 0xe5, + 0x9d, 0x98, 0x35, 0x22, 0xd8, 0x9d, 0x88, 0x35, 0x22, 0xd0, 0xdd, 0xa8, 0x4e, 0x09, 0x1a, 0x28, + 0x3b, 0xd1, 0x80, 0x1d, 0x1f, 0xed, 0x6b, 0x8d, 0x56, 0x5b, 0x51, 0x11, 0xa2, 0xb5, 0x7b, 0x8d, + 0x43, 0x39, 0xb1, 0xf7, 0x13, 0x13, 0x7b, 0xd4, 0x19, 0x6a, 0xca, 0x83, 0x68, 0x22, 0x29, 0xf9, + 0x2e, 0xbb, 0x05, 0xd7, 0x93, 0x2c, 0xa7, 0xbf, 0xea, 0x0c, 0x0f, 0x44, 0x04, 0xdc, 0x43, 0x1e, + 0x70, 0x45, 0xc8, 0x66, 0xab, 0xc9, 0x43, 0xfd, 0x28, 0x2f, 0xa6, 0x1e, 0xa9, 0xb9, 0xe2, 0x3d, + 0xe5, 0xde, 0xe3, 0x0d, 0x31, 0x14, 0xbd, 0x5e, 0xbb, 0x39, 0xec, 0x6b, 0x83, 0xdd, 0x0a, 0x7d, + 0x7b, 0x48, 0xa8, 0x20, 0xea, 0x37, 0xc0, 0x92, 0x9f, 0xd6, 0x10, 0xb7, 0xac, 0x18, 0xe4, 0xc6, + 0xbe, 0x37, 0x95, 0x07, 0xc3, 0xf8, 0x9b, 0xed, 0x40, 0x79, 0x36, 0x3f, 0xa1, 0xf8, 0xb0, 0xf8, + 0x2d, 0xa0, 0x24, 0x48, 0xfd, 0x37, 0x33, 0x50, 0x4b, 0xab, 0x1f, 0xe4, 0xe8, 0x1e, 0xeb, 0xae, + 0x17, 0xf2, 0xf7, 0x7a, 0x83, 0xe8, 0x8b, 0x17, 0xe3, 0x9e, 0x17, 0xd2, 0x83, 0xbd, 0x41, 0x2a, + 0x16, 0x61, 0x6d, 0x21, 0x16, 0xa1, 0x03, 0x57, 0x53, 0x5f, 0x32, 0x49, 0xbd, 0x96, 0x5c, 0x8f, + 0xde, 0xfc, 0x5f, 0x68, 0xbf, 0xc6, 0x82, 0xe5, 0x3e, 0x89, 0x17, 0x9d, 0x72, 0xf1, 0x8b, 0x4e, + 0x07, 0x50, 0x4d, 0x69, 0x3b, 0xe4, 0x57, 0x1a, 0xa7, 0x5b, 0x5a, 0xb4, 0xc7, 0x6f, 0x6f, 0xa6, + 0xfa, 0xaf, 0x67, 0xa0, 0x92, 0xd4, 0x7d, 0x7e, 0xef, 0x92, 0x28, 0xf8, 0x59, 0xfc, 0xd6, 0x6d, + 0x53, 0x3e, 0xbe, 0x2b, 0x41, 0x1d, 0xfa, 0xe6, 0x1a, 0x3f, 0x33, 0xd8, 0x3b, 0x1b, 0x44, 0xdd, + 0x49, 0x82, 0x28, 0x7e, 0xe3, 0xd4, 0x1a, 0x9d, 0xed, 0xbd, 0x40, 0x02, 0x19, 0xbf, 0x11, 0x41, + 0xd4, 0xbb, 0x50, 0xda, 0x3b, 0x93, 0xb1, 0xe0, 0xc9, 0x57, 0xab, 0x4b, 0xfc, 0x01, 0x29, 0xf5, + 0xcf, 0x33, 0x50, 0x8b, 0xbd, 0x28, 0x14, 0x2e, 0xc7, 0xbf, 0x80, 0xc3, 0xd9, 0x61, 0xcd, 0x3c, + 0x89, 0x63, 0x74, 0xd6, 0x92, 0x31, 0x3a, 0xf7, 0x45, 0x61, 0xd9, 0xa4, 0xd0, 0x8f, 0xea, 0x12, + 0xcf, 0x53, 0x3d, 0x83, 0x0a, 0xfe, 0xd7, 0xac, 0xb1, 0xe5, 0xfb, 0x96, 0x99, 0xbe, 0xfb, 0x1a, + 0x13, 0xa7, 0x88, 0xc8, 0xca, 0x8b, 0x5e, 0xa9, 0x5b, 0xf9, 0xf4, 0x25, 0x3d, 0xc9, 0xfa, 0x7f, + 0x64, 0xa1, 0x9c, 0xd0, 0x24, 0x7f, 0x12, 0xfb, 0xdd, 0x86, 0x52, 0xfc, 0x10, 0xa3, 0x78, 0x13, + 0x28, 0x02, 0xa4, 0xe6, 0x2a, 0xbb, 0x30, 0x57, 0x75, 0x28, 0xf8, 0xfc, 0x45, 0x0e, 0xe1, 0xd4, + 0x96, 0xc9, 0xb4, 0xfb, 0x38, 0xff, 0x96, 0x73, 0xad, 0x4f, 0xa1, 0x92, 0xf0, 0xfd, 0xca, 0xa0, + 0x9a, 0x45, 0xfa, 0x72, 0xec, 0x07, 0x0e, 0xd8, 0x35, 0x58, 0x1f, 0x9f, 0xe9, 0xe6, 0x09, 0x3f, + 0xb3, 0x2b, 0x69, 0xf9, 0xf1, 0x59, 0xeb, 0x84, 0xce, 0x28, 0xc7, 0x91, 0xf2, 0xc4, 0x3d, 0x72, + 0xc5, 0xb1, 0x54, 0x91, 0x1e, 0x41, 0x61, 0x7c, 0x96, 0x7c, 0xf1, 0x65, 0x69, 0xc8, 0xd7, 0xc7, + 0x67, 0xf4, 0xce, 0xcb, 0xc7, 0xb0, 0x25, 0x76, 0x70, 0x23, 0xd0, 0xf9, 0xf3, 0x6b, 0xf4, 0x40, + 0x27, 0x7f, 0xc3, 0x7a, 0x93, 0xe3, 0x1a, 0xc1, 0x80, 0x30, 0xc8, 0x71, 0x2a, 0x54, 0x12, 0x0c, + 0xc8, 0x3d, 0x6b, 0x25, 0x2d, 0x05, 0x63, 0xcf, 0xa1, 0x32, 0x3e, 0xe3, 0x13, 0x3a, 0xf4, 0x0e, + 0x2d, 0x71, 0x1d, 0x75, 0x6b, 0x71, 0x2a, 0x29, 0x9e, 0x31, 0x45, 0xc9, 0xb6, 0x61, 0x5d, 0x33, + 0xce, 0x07, 0xbf, 0xee, 0x92, 0x1a, 0x59, 0xd2, 0x44, 0xea, 0x9b, 0x5c, 0xb1, 0xa6, 0x6c, 0xa8, + 0xff, 0x49, 0x06, 0x6a, 0xb1, 0x15, 0x80, 0x8b, 0x90, 0x3d, 0x4e, 0x7e, 0xba, 0xaa, 0xbe, 0x68, + 0x28, 0x20, 0xc9, 0x93, 0xe1, 0xe5, 0x8c, 0x7f, 0x52, 0x61, 0xd5, 0xeb, 0xb3, 0xab, 0x9c, 0xf1, + 0xd9, 0x95, 0x1f, 0xc2, 0xd9, 0x87, 0xec, 0xf0, 0x72, 0xc6, 0x3d, 0x4e, 0xb8, 0x29, 0x72, 0xeb, + 0x94, 0x6f, 0x87, 0x14, 0xe1, 0xfb, 0xa2, 0xfd, 0x1d, 0x7f, 0xc3, 0xec, 0x48, 0xeb, 0x1c, 0x36, + 0xb4, 0xef, 0x74, 0x04, 0x90, 0xda, 0xb0, 0xd7, 0xd7, 0xda, 0x9d, 0xfd, 0x1e, 0x01, 0x72, 0xe4, + 0x8f, 0x8a, 0x9b, 0xd8, 0x30, 0xcd, 0xbd, 0xb3, 0xe4, 0xc3, 0x9d, 0x99, 0xd4, 0xc3, 0x9d, 0xd1, + 0x1b, 0xb7, 0xc9, 0xa7, 0xd7, 0xc3, 0xe8, 0x84, 0x80, 0x45, 0xab, 0x30, 0x5a, 0xd2, 0xec, 0x3d, + 0xc8, 0x8d, 0xcf, 0xac, 0xcb, 0xb4, 0xa9, 0x97, 0x5e, 0x40, 0x44, 0xa0, 0xfe, 0x65, 0x06, 0x58, + 0xaa, 0x21, 0xdc, 0xfa, 0xf8, 0x7d, 0xdb, 0xf2, 0x25, 0xd4, 0xc5, 0x75, 0x0f, 0x4e, 0x95, 0xf0, + 0xfe, 0x8b, 0x21, 0xbd, 0xe6, 0xc5, 0xd7, 0xa0, 0xe2, 0x07, 0x72, 0xd9, 0xc7, 0xc0, 0x5f, 0x55, + 0xa7, 0xf0, 0xd7, 0xdc, 0x1b, 0x2c, 0x45, 0x2d, 0xa6, 0x89, 0x9f, 0x51, 0x4f, 0x3e, 0x0f, 0xcf, + 0x0f, 0x0e, 0x36, 0xe2, 0x59, 0xa3, 0x35, 0xaf, 0xfe, 0x0b, 0x19, 0xb8, 0x9a, 0x66, 0x88, 0xbf, + 0x5a, 0x2f, 0xd3, 0x6f, 0xe1, 0x67, 0x17, 0xdf, 0xc2, 0x5f, 0xc5, 0x4f, 0xb9, 0x95, 0xfc, 0xf4, + 0x77, 0x33, 0xb0, 0x95, 0x18, 0xfd, 0xd8, 0x5e, 0xfc, 0x1b, 0x6a, 0x59, 0xe2, 0x49, 0xfc, 0x5c, + 0xea, 0x49, 0x7c, 0xf5, 0x2f, 0x32, 0xb0, 0xbd, 0xd0, 0x12, 0xcd, 0xfa, 0x1b, 0x6d, 0x4b, 0xfa, + 0xe9, 0x7c, 0x3a, 0xbc, 0x90, 0xef, 0x7c, 0x65, 0x1e, 0x65, 0x13, 0x4f, 0xe7, 0xd3, 0x89, 0x16, + 0x1d, 0xab, 0xbe, 0x23, 0x9e, 0x83, 0xd4, 0x83, 0x4b, 0x77, 0x24, 0x26, 0xbb, 0x44, 0x90, 0xc1, + 0xa5, 0x3b, 0x52, 0xff, 0xfd, 0x0c, 0xdc, 0x58, 0xe8, 0x43, 0x63, 0x1e, 0x7a, 0xe2, 0x0c, 0xfe, + 0x6f, 0xa8, 0x1b, 0x77, 0xa1, 0x4c, 0x11, 0x0a, 0xe2, 0x60, 0x9f, 0x0f, 0x2b, 0x18, 0x71, 0xbd, + 0x0a, 0x64, 0x4d, 0xe3, 0x52, 0xbc, 0x8c, 0x84, 0x3f, 0x71, 0xc1, 0x9e, 0x7a, 0x73, 0x5f, 0x44, + 0xb0, 0xd2, 0x6f, 0xf5, 0x33, 0xd8, 0x8c, 0x9b, 0xde, 0x14, 0x5f, 0x30, 0xb8, 0x0b, 0x65, 0xd7, + 0x3a, 0xd7, 0xe5, 0xf7, 0x0d, 0x44, 0x2c, 0xb7, 0x6b, 0x9d, 0x0b, 0x02, 0x75, 0x2f, 0x29, 0x0b, + 0xa3, 0xaf, 0xc4, 0x39, 0x66, 0x2a, 0xba, 0xcb, 0x73, 0x4c, 0x89, 0xc2, 0xd2, 0x12, 0xbd, 0x2c, + 0xb8, 0xd6, 0x39, 0xf1, 0xe1, 0xb9, 0x28, 0xa7, 0x61, 0x8a, 0xef, 0x09, 0xac, 0x0c, 0x15, 0xbc, + 0x01, 0xc5, 0x99, 0x9f, 0x1a, 0xa6, 0xc2, 0xcc, 0xe7, 0xd5, 0x3e, 0x10, 0x91, 0xe2, 0x6f, 0x8a, + 0x86, 0xe1, 0xb1, 0xe3, 0xe2, 0x2b, 0x92, 0xb9, 0xf8, 0x2b, 0x92, 0x9f, 0x0b, 0x31, 0x48, 0x96, + 0x1f, 0xaf, 0x59, 0x81, 0xac, 0x6d, 0x5e, 0x50, 0xc5, 0x55, 0x0d, 0x7f, 0x92, 0x26, 0x67, 0xfd, + 0x20, 0x82, 0xd5, 0xf1, 0xa7, 0xba, 0x0b, 0x65, 0x2d, 0x65, 0xe6, 0x56, 0x12, 0x1e, 0xa3, 0x20, + 0xfd, 0xc0, 0x66, 0x3c, 0x40, 0x5a, 0x39, 0x76, 0x18, 0x05, 0x6a, 0x20, 0x04, 0xdf, 0x4b, 0xc3, + 0x1f, 0x9d, 0x1a, 0x7e, 0xd7, 0x72, 0x27, 0xe1, 0x29, 0x0e, 0x39, 0x77, 0xe4, 0x26, 0x87, 0x10, + 0x38, 0x48, 0xb2, 0x03, 0x8e, 0xa2, 0x43, 0xe4, 0xf2, 0x9b, 0x73, 0xae, 0x75, 0x2e, 0xf2, 0xbf, + 0x03, 0x80, 0xe3, 0x2f, 0xd0, 0xfc, 0x50, 0xb4, 0xe4, 0x39, 0x26, 0x47, 0xab, 0x9b, 0xa2, 0xbf, + 0xe2, 0x65, 0xaf, 0x96, 0x35, 0x56, 0x1d, 0x31, 0xf3, 0xbc, 0x43, 0x62, 0x10, 0x7e, 0xaf, 0x69, + 0x64, 0xf7, 0xa0, 0x22, 0x7d, 0x12, 0xf4, 0xa6, 0x2b, 0xaf, 0xbe, 0x2c, 0x61, 0xbd, 0xf9, 0x54, + 0xfd, 0x97, 0xb2, 0x50, 0x69, 0xf0, 0xf8, 0xaf, 0xd9, 0x65, 0x7f, 0x16, 0xb2, 0x3f, 0x82, 0x6b, + 0xf4, 0xc8, 0x1b, 0xff, 0x32, 0x07, 0x85, 0x5d, 0xf1, 0x80, 0x23, 0x3e, 0x88, 0x8f, 0x13, 0x83, + 0x28, 0xb2, 0x3c, 0x19, 0x9c, 0xd9, 0x33, 0x7e, 0xf5, 0xb4, 0x63, 0x5e, 0x50, 0xfc, 0x11, 0x8f, + 0x56, 0xa0, 0xf7, 0xe0, 0xd2, 0x08, 0x7a, 0xe0, 0x09, 0x8b, 0x9f, 0x9d, 0x89, 0x62, 0x45, 0xb8, + 0x0a, 0x02, 0x8f, 0xce, 0x38, 0xcd, 0x63, 0xd8, 0xe4, 0xb7, 0xcd, 0x97, 0x37, 0xe0, 0x0d, 0x8e, + 0x88, 0xf9, 0x7b, 0x00, 0x9b, 0xe2, 0x4d, 0x3a, 0x7a, 0x25, 0x5d, 0x1f, 0x79, 0xb3, 0x4b, 0x71, + 0x18, 0xfa, 0xde, 0x1b, 0x9a, 0xda, 0xe1, 0xa4, 0x08, 0xe2, 0xed, 0xdc, 0x08, 0xd2, 0xd0, 0x9b, + 0x6d, 0xb8, 0xfe, 0x86, 0x3e, 0xbd, 0x2d, 0xe0, 0xa2, 0x98, 0x08, 0xb8, 0xb8, 0xb9, 0x0b, 0x5b, + 0xab, 0xea, 0xfb, 0x39, 0x65, 0xa8, 0x7f, 0x56, 0x05, 0x88, 0x39, 0x36, 0xa5, 0x8e, 0x66, 0x16, + 0xd4, 0xd1, 0x9f, 0x15, 0x4c, 0xf5, 0x19, 0xd4, 0x70, 0xa8, 0xf4, 0x38, 0x47, 0x76, 0x65, 0x8e, + 0x0a, 0x52, 0x0d, 0xe3, 0x07, 0x35, 0x96, 0x83, 0x34, 0x72, 0x2b, 0x83, 0x34, 0x3e, 0x85, 0x02, + 0x3f, 0x6a, 0x0b, 0x44, 0x38, 0xed, 0xf5, 0xc5, 0xd5, 0xf7, 0x44, 0x5c, 0x63, 0x95, 0x74, 0xac, + 0x0d, 0x35, 0x14, 0xfd, 0xbe, 0x1d, 0x9e, 0x4e, 0x93, 0x2f, 0xba, 0xdc, 0x59, 0xce, 0x29, 0xc9, + 0xc4, 0x87, 0xfe, 0x92, 0xc9, 0x84, 0xf6, 0x1a, 0x4e, 0x85, 0xff, 0x97, 0xb4, 0xd7, 0x42, 0x52, + 0x7b, 0x1d, 0x4e, 0xb9, 0xd7, 0x17, 0xb5, 0xd7, 0x8f, 0xe0, 0xaa, 0x08, 0xb3, 0xc3, 0x0c, 0x38, + 0x9c, 0x44, 0xcf, 0x2f, 0x02, 0x28, 0xe2, 0x61, 0xb7, 0x29, 0xd9, 0x76, 0x48, 0xfe, 0x2d, 0x6c, + 0x8d, 0x4e, 0x0d, 0x77, 0x62, 0xe9, 0xe1, 0x89, 0xa3, 0xd3, 0xe7, 0xc0, 0xf4, 0xa9, 0x31, 0x13, + 0x4a, 0xf5, 0x7b, 0x4b, 0x8d, 0x6d, 0x12, 0xf1, 0xf0, 0xc4, 0xa1, 0x30, 0xc5, 0x28, 0x94, 0x67, + 0x73, 0xb4, 0x08, 0x5f, 0x38, 0x51, 0x87, 0xa5, 0x13, 0xf5, 0x45, 0x35, 0xbb, 0xbc, 0x42, 0xcd, + 0x8e, 0x95, 0xe5, 0x4a, 0x52, 0x59, 0x66, 0x1f, 0x42, 0x41, 0xbc, 0x0c, 0x22, 0x3c, 0xbf, 0x6c, + 0x79, 0x75, 0x68, 0x92, 0x04, 0x6b, 0x92, 0xf1, 0x1d, 0xf4, 0x78, 0x54, 0x8d, 0xd7, 0x94, 0x84, + 0xb1, 0x5d, 0xe1, 0xf6, 0x8c, 0x42, 0x2a, 0x85, 0x97, 0xf7, 0x66, 0xa2, 0xe0, 0x08, 0x27, 0xec, + 0xf2, 0x85, 0x1c, 0x37, 0xff, 0xe3, 0x75, 0x58, 0x17, 0xa7, 0xf4, 0x8f, 0x21, 0x67, 0xfa, 0xde, + 0x2c, 0xba, 0x45, 0xb5, 0x42, 0x6b, 0xa7, 0xef, 0x51, 0xa3, 0x82, 0xff, 0x04, 0xd6, 0x0d, 0xd3, + 0xd4, 0xc7, 0x67, 0xe9, 0x13, 0xe9, 0x05, 0x05, 0xfa, 0xe0, 0x8a, 0x96, 0x37, 0x48, 0x93, 0xfe, + 0x12, 0x4a, 0x48, 0x1f, 0x07, 0x29, 0x97, 0x97, 0xcd, 0x02, 0xa9, 0xea, 0x1e, 0x5c, 0xd1, 0x8a, + 0x86, 0x54, 0x7b, 0xff, 0x30, 0xed, 0xdb, 0xcf, 0x2d, 0x75, 0x70, 0x41, 0x4f, 0x5b, 0xf0, 0xf2, + 0xff, 0x2d, 0xe0, 0xce, 0xde, 0x68, 0xc7, 0xce, 0x27, 0x0f, 0x3f, 0x97, 0xf6, 0xf7, 0x83, 0x2b, + 0x1a, 0xdf, 0xb7, 0xe4, 0x7e, 0xff, 0xb9, 0xf4, 0xbb, 0x47, 0xdf, 0xe2, 0x5c, 0x31, 0x32, 0x28, + 0x06, 0x23, 0xe7, 0x3b, 0xc9, 0x44, 0xcc, 0x66, 0xca, 0x0f, 0x04, 0xa5, 0xaf, 0x59, 0xa4, 0x77, + 0x75, 0xca, 0x16, 0x6d, 0xf1, 0xcf, 0xa1, 0xcc, 0xdd, 0xb0, 0x3c, 0x5f, 0x71, 0x69, 0x68, 0xe3, + 0x4d, 0x99, 0x0e, 0xf6, 0xe2, 0x2d, 0xba, 0x29, 0xfb, 0xe9, 0x5b, 0xc9, 0xb3, 0x93, 0xdb, 0x2b, + 0x07, 0x4a, 0x8b, 0x8e, 0x51, 0x78, 0x67, 0x35, 0x9e, 0x87, 0x75, 0x61, 0x4b, 0x1c, 0x32, 0xf0, + 0x0d, 0x58, 0xee, 0x99, 0xb0, 0x34, 0x5f, 0xa9, 0x1d, 0xfa, 0xe0, 0x8a, 0xc6, 0x8c, 0xe5, 0x7d, + 0xbb, 0x09, 0x9b, 0xb2, 0x49, 0xb4, 0xb3, 0x26, 0x02, 0xb9, 0x92, 0x5d, 0x8a, 0xf7, 0xdd, 0x83, + 0x2b, 0xda, 0x86, 0x91, 0x06, 0xb1, 0x0e, 0x5c, 0x95, 0x85, 0x90, 0xb3, 0x5d, 0x8c, 0x4c, 0x65, + 0x69, 0x16, 0x93, 0x7b, 0xf5, 0xc1, 0x15, 0x6d, 0xd3, 0x58, 0xda, 0xc0, 0x0f, 0x65, 0x7b, 0x92, + 0xca, 0x21, 0x5f, 0x89, 0x77, 0x57, 0x0e, 0x53, 0xac, 0xa9, 0x46, 0x2d, 0x8b, 0x41, 0x71, 0x24, + 0xc3, 0x4d, 0x0d, 0xb6, 0x57, 0x4b, 0x98, 0xe4, 0x36, 0x93, 0xe3, 0xdb, 0x8c, 0x9a, 0xdc, 0x66, + 0x16, 0x1f, 0x83, 0x4b, 0x6c, 0x3a, 0xbf, 0x82, 0x6a, 0x4a, 0xc4, 0xb2, 0x32, 0x14, 0xe4, 0x17, + 0x7f, 0xe8, 0x66, 0x6a, 0xb3, 0x7f, 0xf4, 0x9d, 0x92, 0x41, 0x70, 0xa7, 0x37, 0x18, 0x36, 0x7a, + 0x43, 0x65, 0x8d, 0x27, 0x8e, 0xba, 0x8d, 0x66, 0x5b, 0xc9, 0xaa, 0x7f, 0x91, 0x85, 0x52, 0x74, + 0xce, 0xf6, 0xfb, 0x7b, 0xc3, 0x22, 0x37, 0x53, 0x36, 0xe9, 0x66, 0x5a, 0x30, 0xf5, 0xf8, 0x27, + 0xcf, 0x72, 0xf2, 0x33, 0x58, 0x49, 0x83, 0x2a, 0x58, 0x7e, 0x23, 0x28, 0xff, 0x13, 0xdf, 0x08, + 0x4a, 0xde, 0x53, 0x58, 0x4f, 0xdf, 0x53, 0x58, 0xf8, 0x40, 0x56, 0x81, 0xbe, 0xad, 0x92, 0xfc, + 0x40, 0xd6, 0x36, 0xac, 0xdb, 0xc1, 0x4b, 0xdb, 0x3a, 0x17, 0x81, 0xfd, 0x22, 0x95, 0xde, 0xa1, + 0xe1, 0x2d, 0x3b, 0xf4, 0x4f, 0x91, 0xf6, 0x4f, 0x61, 0x6b, 0x7c, 0x16, 0x7d, 0xd1, 0x25, 0x76, + 0xae, 0x54, 0xa8, 0x49, 0x2b, 0x71, 0xec, 0xbd, 0xe8, 0x73, 0xc5, 0xd5, 0xa4, 0x1b, 0x28, 0x9a, + 0xad, 0xe8, 0xfb, 0xc5, 0xff, 0x5c, 0x06, 0x20, 0x3e, 0x81, 0xfa, 0x2b, 0xbb, 0x72, 0x13, 0xde, + 0xb2, 0xec, 0x8f, 0x78, 0xcb, 0xde, 0xf6, 0x0c, 0xee, 0x0f, 0x50, 0x8a, 0xce, 0x1c, 0x7f, 0x7f, + 0xc6, 0xfa, 0x59, 0x55, 0xfe, 0x1d, 0xe9, 0xd6, 0x8e, 0x0e, 0xed, 0xfe, 0xaa, 0x63, 0x91, 0xaa, + 0x3e, 0xfb, 0x96, 0xea, 0x2f, 0xb8, 0x6f, 0x39, 0xaa, 0xfc, 0xaf, 0x79, 0x35, 0x25, 0x19, 0x3d, + 0x97, 0xbe, 0x36, 0x36, 0x17, 0x0e, 0xf2, 0xbf, 0x7a, 0xd5, 0x3f, 0xab, 0xc3, 0xff, 0x7b, 0x46, + 0x7a, 0x71, 0xa3, 0x8f, 0xf0, 0xbc, 0x51, 0xe9, 0x5d, 0xed, 0x88, 0xfe, 0x39, 0xd5, 0xfd, 0xa8, + 0x8f, 0x2a, 0xf7, 0x63, 0x3e, 0xaa, 0xf7, 0x20, 0xcf, 0xb7, 0xbb, 0xfc, 0x9b, 0xfc, 0x53, 0x1c, + 0xff, 0xd6, 0x8f, 0x16, 0xaa, 0xaa, 0x50, 0xf2, 0x79, 0x7f, 0xb7, 0x64, 0xb9, 0xf2, 0x83, 0x8b, + 0x74, 0x8f, 0xea, 0x1f, 0xe3, 0x12, 0xf5, 0xf7, 0x1d, 0x92, 0x1f, 0x77, 0x5b, 0xa8, 0xff, 0x6f, + 0x06, 0xaa, 0xa9, 0x18, 0x82, 0xdf, 0xa3, 0x8a, 0x95, 0x72, 0x39, 0xfb, 0xff, 0x23, 0xb9, 0x9c, + 0x0a, 0x2a, 0x2e, 0xa6, 0x83, 0x8a, 0x51, 0xdc, 0x55, 0x52, 0x26, 0xcc, 0x2a, 0x63, 0x27, 0xb3, + 0xd2, 0xd8, 0xb9, 0x13, 0x7d, 0x77, 0xbe, 0xd3, 0xe2, 0x31, 0xbc, 0x55, 0x2d, 0x01, 0x61, 0x5f, + 0xc1, 0x0d, 0xe1, 0x44, 0xe0, 0xe3, 0xe3, 0x8d, 0xf5, 0xe8, 0xab, 0xf4, 0xc2, 0x28, 0xdf, 0xe6, + 0x04, 0xfc, 0x93, 0x93, 0xe3, 0x86, 0xc4, 0xaa, 0x1d, 0xa8, 0xa6, 0x82, 0x33, 0x70, 0x6f, 0x99, + 0x38, 0xde, 0x89, 0xe1, 0x88, 0xb6, 0x88, 0x14, 0xdb, 0x81, 0xfc, 0xf9, 0xa9, 0xe5, 0x5b, 0x2b, + 0xbe, 0x5b, 0xc1, 0x11, 0xea, 0x2f, 0xa1, 0x92, 0x0c, 0x14, 0x63, 0x1f, 0x42, 0xde, 0x0e, 0xad, + 0xa9, 0x74, 0x8f, 0x6c, 0x2f, 0xc7, 0x92, 0x75, 0x42, 0x6b, 0xaa, 0x71, 0x22, 0xf5, 0x4f, 0x33, + 0xa0, 0x2c, 0xe2, 0xe8, 0x53, 0xbf, 0x97, 0x41, 0x68, 0x4d, 0x65, 0x63, 0x78, 0x2a, 0xd1, 0xc8, + 0xb5, 0x54, 0x23, 0xa5, 0x17, 0x29, 0x9b, 0xfe, 0xf8, 0x1f, 0x57, 0x4a, 0x96, 0x2f, 0x9f, 0x70, + 0x04, 0x7b, 0x08, 0x45, 0xdf, 0x0a, 0x2c, 0xff, 0xb5, 0x78, 0x50, 0x7c, 0xe1, 0x3e, 0x9a, 0xc4, + 0xa9, 0x7f, 0x92, 0x81, 0x82, 0x88, 0x6a, 0x5b, 0xe9, 0xaf, 0x7a, 0x1f, 0x0a, 0xc1, 0xe8, 0xd4, + 0x9a, 0x1a, 0xf2, 0x35, 0xdc, 0xa5, 0xd8, 0x5f, 0x89, 0x67, 0x77, 0x78, 0xac, 0x5f, 0xda, 0x7f, + 0x75, 0xe4, 0x18, 0xae, 0x46, 0x70, 0xf1, 0x25, 0x59, 0x63, 0x2a, 0x2e, 0x91, 0xf0, 0x67, 0x4c, + 0x81, 0x40, 0x74, 0x4d, 0x44, 0xfd, 0x43, 0x28, 0x88, 0xa8, 0xb9, 0x95, 0x4d, 0x79, 0xcb, 0xf7, + 0xf0, 0xd5, 0x1d, 0x80, 0x38, 0x8c, 0x6e, 0x55, 0x09, 0xea, 0x63, 0x28, 0xca, 0xc8, 0x39, 0xe4, + 0xbf, 0xb8, 0x6a, 0x71, 0x71, 0x2d, 0xd9, 0x18, 0x47, 0x7c, 0x8b, 0xaa, 0xeb, 0x8d, 0xce, 0xc8, + 0x59, 0xfe, 0x31, 0xd0, 0x2d, 0xbe, 0xe1, 0xd2, 0x7b, 0xaf, 0xe9, 0xaf, 0x96, 0x45, 0x44, 0xec, + 0x31, 0x44, 0xf2, 0xf2, 0x6d, 0xae, 0x05, 0xb5, 0x21, 0xef, 0x7b, 0x12, 0x97, 0x3d, 0x13, 0xde, + 0xd4, 0x2e, 0xbd, 0x37, 0x9e, 0x49, 0x7e, 0xb3, 0x21, 0xd5, 0x26, 0x2d, 0x41, 0xa6, 0xd6, 0xa0, + 0x92, 0x0c, 0xf7, 0x51, 0x1b, 0xb0, 0x79, 0x68, 0x85, 0x06, 0xca, 0x1f, 0xf9, 0x0a, 0x26, 0xe7, + 0x5f, 0xfc, 0x91, 0xe6, 0xdf, 0x45, 0x3a, 0x8d, 0x13, 0xa9, 0x7f, 0x91, 0x03, 0x65, 0x11, 0xf7, + 0x63, 0x77, 0x5f, 0xef, 0x42, 0xd9, 0x23, 0xbe, 0x48, 0x7d, 0x2b, 0x98, 0x83, 0x12, 0x37, 0x14, + 0x52, 0x9f, 0x29, 0x2c, 0xda, 0xc1, 0x01, 0xff, 0x50, 0xe1, 0x75, 0x7e, 0xd1, 0xd1, 0xf1, 0x46, + 0xc4, 0xd6, 0x15, 0xba, 0xd7, 0xd8, 0xf5, 0x46, 0x74, 0xa5, 0x56, 0x78, 0x27, 0x78, 0x0c, 0x6a, + 0x45, 0x2b, 0x0a, 0x97, 0x04, 0x9d, 0xdf, 0x89, 0x7b, 0x0b, 0x61, 0x20, 0xde, 0xb6, 0x28, 0x72, + 0xc0, 0x30, 0x90, 0x5f, 0x1c, 0x1a, 0x89, 0x0f, 0xdb, 0x66, 0xe9, 0x8b, 0x43, 0x4d, 0x97, 0x6e, + 0xd4, 0xd2, 0x77, 0x18, 0x46, 0xe2, 0x93, 0xde, 0xe2, 0x9b, 0x4f, 0x88, 0xba, 0xcf, 0x3f, 0xfd, + 0xeb, 0x5b, 0x41, 0xc0, 0x9f, 0x9d, 0x2e, 0x89, 0xf7, 0xc6, 0x05, 0x30, 0x7a, 0xd5, 0x5f, 0x7c, + 0x5b, 0x13, 0x49, 0x40, 0x3c, 0x7e, 0xcd, 0x3f, 0xae, 0x89, 0x04, 0x37, 0xa0, 0xf8, 0x5b, 0xcf, + 0xb5, 0xc8, 0xcb, 0x51, 0xa6, 0x56, 0x15, 0x30, 0x7d, 0x68, 0xcc, 0x70, 0x23, 0x70, 0xe8, 0x19, + 0x15, 0x7e, 0x97, 0x94, 0x27, 0xd4, 0xff, 0x3a, 0x03, 0x5b, 0x8b, 0x63, 0x4d, 0x6c, 0x54, 0x81, + 0x62, 0xb3, 0xdf, 0xd5, 0x7b, 0x8d, 0xc3, 0xb6, 0x72, 0x85, 0x6d, 0x40, 0xb9, 0xbf, 0xfb, 0x4d, + 0xbb, 0x39, 0xe4, 0x80, 0x0c, 0xbd, 0xa9, 0x34, 0xd0, 0x0f, 0x3a, 0xad, 0x56, 0xbb, 0xc7, 0x2d, + 0x8a, 0xfe, 0xee, 0x37, 0x7a, 0xb7, 0xdf, 0xe4, 0x1f, 0x30, 0x95, 0x81, 0x10, 0x03, 0x25, 0x47, + 0x61, 0x12, 0x14, 0x0e, 0x8f, 0xc9, 0x3c, 0x8f, 0xf3, 0x7e, 0x35, 0xd0, 0x9b, 0xbd, 0xa1, 0xb2, + 0x8e, 0xa9, 0xde, 0x71, 0xb7, 0x4b, 0x29, 0x0a, 0xe8, 0x6c, 0xf6, 0x0f, 0x8f, 0xb4, 0xf6, 0x60, + 0xa0, 0x0f, 0x3a, 0xbf, 0x69, 0x2b, 0x45, 0xaa, 0x99, 0x7f, 0xad, 0x94, 0x00, 0x25, 0x56, 0x80, + 0xec, 0x61, 0xa7, 0xc7, 0xdf, 0x92, 0x3a, 0x6c, 0x7c, 0xab, 0x94, 0xf1, 0xc7, 0xe0, 0xf8, 0x50, + 0xa9, 0xb0, 0x12, 0xe4, 0xbb, 0xed, 0x97, 0xed, 0xae, 0x52, 0x55, 0xff, 0xc7, 0xac, 0xd4, 0x88, + 0x29, 0xd2, 0xe9, 0xa7, 0x68, 0x81, 0xab, 0xce, 0x17, 0xa3, 0x41, 0xcb, 0x26, 0x06, 0x8d, 0xdd, + 0x83, 0x8a, 0xd8, 0x14, 0x52, 0xdf, 0x77, 0x16, 0x30, 0x62, 0xb9, 0xfb, 0x50, 0x8d, 0x82, 0x03, + 0x12, 0x5f, 0x09, 0xaa, 0x48, 0xe0, 0x8a, 0xe3, 0x8b, 0xf5, 0x15, 0xc7, 0x17, 0x33, 0x3b, 0x44, + 0x2b, 0x1b, 0x65, 0x2e, 0xe7, 0xa4, 0x12, 0x42, 0x5e, 0x92, 0xac, 0xbd, 0x05, 0x94, 0xd0, 0xe7, + 0xae, 0x2d, 0x3f, 0x10, 0x5f, 0x44, 0xc0, 0xb1, 0x6b, 0x87, 0x8b, 0xc1, 0x09, 0xa5, 0xa5, 0xe0, + 0x84, 0xe4, 0xe6, 0x0c, 0xe9, 0xcd, 0xf9, 0x9d, 0x68, 0x8f, 0x44, 0x24, 0xff, 0x32, 0x7c, 0x29, + 0xda, 0x05, 0xe9, 0x43, 0xde, 0x73, 0x9f, 0x5e, 0xe0, 0x4d, 0x90, 0x55, 0x88, 0x4c, 0x11, 0x98, + 0x68, 0x57, 0xa4, 0x57, 0x06, 0xd2, 0xd4, 0x64, 0x4b, 0x97, 0xb4, 0x5a, 0x9a, 0x94, 0x3d, 0x81, + 0xab, 0x82, 0xb7, 0x53, 0x63, 0x2b, 0x2e, 0x28, 0x73, 0x54, 0x23, 0x1e, 0x61, 0xf5, 0x0f, 0xa0, + 0x28, 0x83, 0xda, 0x7e, 0x5c, 0xd9, 0x5d, 0x31, 0xaf, 0xea, 0xbf, 0xb3, 0x06, 0xa5, 0x28, 0xc4, + 0xed, 0x27, 0x71, 0x07, 0x7d, 0x0e, 0x2d, 0x38, 0x4b, 0x8a, 0x98, 0x22, 0x02, 0xe4, 0x4c, 0x89, + 0xfb, 0x63, 0x73, 0xdf, 0x96, 0x1a, 0x1b, 0x87, 0x1c, 0xfb, 0x36, 0x3d, 0xb3, 0x67, 0xbb, 0x89, + 0xab, 0xc4, 0x25, 0xad, 0x88, 0x00, 0x5a, 0x68, 0x37, 0x80, 0x7e, 0x53, 0x4e, 0xce, 0x24, 0x05, + 0x4c, 0x63, 0xbe, 0xed, 0xc8, 0xfe, 0xe3, 0xbc, 0x21, 0x52, 0xf4, 0x31, 0x37, 0x1e, 0x5d, 0xc3, + 0x63, 0x0a, 0xe4, 0x17, 0xaf, 0x6f, 0x41, 0x69, 0x1e, 0x7d, 0x32, 0x5d, 0x70, 0xc4, 0x5c, 0x7e, + 0x30, 0x3d, 0x3d, 0xab, 0xa5, 0xc5, 0x59, 0x5d, 0xe4, 0x69, 0x58, 0xe2, 0x69, 0x35, 0x84, 0x82, + 0x08, 0xf3, 0xfb, 0xf1, 0x01, 0xff, 0xd1, 0xa1, 0x52, 0x20, 0x6b, 0x38, 0xf2, 0x46, 0x30, 0xfe, + 0x5c, 0x68, 0x58, 0x6e, 0xa1, 0x61, 0xea, 0xbf, 0xb6, 0x06, 0x10, 0x87, 0x0b, 0xb2, 0x8f, 0x16, + 0x42, 0x93, 0x33, 0x4b, 0xdb, 0xfe, 0x42, 0x44, 0xf2, 0xc2, 0xbb, 0x93, 0x6b, 0x3f, 0xe1, 0xdd, + 0xc9, 0xa7, 0x50, 0x0d, 0xfc, 0xd1, 0x5b, 0x1d, 0xee, 0xe5, 0xc0, 0x1f, 0x45, 0xfe, 0xf6, 0x8f, + 0x01, 0x93, 0xf4, 0x26, 0xb5, 0xf9, 0xe6, 0x8f, 0x3c, 0x96, 0x02, 0x7f, 0xd4, 0x3f, 0xf9, 0xbe, + 0xc5, 0x2f, 0xed, 0x99, 0x41, 0xa8, 0xaf, 0x92, 0x12, 0x1b, 0x66, 0x10, 0xb6, 0x92, 0x82, 0xe2, + 0x01, 0xd4, 0x90, 0x76, 0x49, 0x58, 0x54, 0xcc, 0x20, 0x3e, 0x60, 0x51, 0xff, 0x49, 0x79, 0x24, + 0xbd, 0xe0, 0xcb, 0x65, 0x5f, 0x08, 0x43, 0x3c, 0xa1, 0x44, 0xd4, 0x57, 0xb9, 0x7e, 0xf9, 0x6d, + 0xdc, 0x88, 0x74, 0xf9, 0xf3, 0xcc, 0x6b, 0x3f, 0xf5, 0xf3, 0xcc, 0x3b, 0x00, 0xf1, 0xab, 0xe0, + 0xb8, 0x02, 0xa3, 0xeb, 0x3a, 0x25, 0x7e, 0x11, 0xe7, 0xf1, 0x21, 0x5c, 0x6d, 0x4c, 0x26, 0xbe, + 0x35, 0xa1, 0x4f, 0x48, 0xb9, 0x63, 0x7b, 0x22, 0x63, 0x3e, 0x1b, 0xfb, 0xfb, 0x7a, 0xb3, 0xdf, + 0xdb, 0xeb, 0xec, 0xcb, 0x97, 0xd0, 0xee, 0xc1, 0x3b, 0x09, 0xe0, 0xbe, 0xd6, 0x3f, 0x3e, 0xc2, + 0x44, 0xb3, 0x31, 0xd4, 0xfb, 0x5a, 0xab, 0xad, 0x29, 0x99, 0xc7, 0xf7, 0xa0, 0xd2, 0x14, 0x3b, + 0x65, 0xf4, 0x3a, 0x9b, 0xe7, 0x5a, 0xfc, 0x43, 0x75, 0xdd, 0xdf, 0x7e, 0xa6, 0x64, 0x1e, 0xab, + 0x50, 0x4e, 0x7c, 0x26, 0x12, 0x29, 0x0e, 0x8c, 0xe0, 0x54, 0x7c, 0xb4, 0xcc, 0x70, 0x27, 0x96, + 0x92, 0x79, 0xfc, 0x10, 0x75, 0xf8, 0xe4, 0x47, 0x1a, 0x01, 0xd6, 0x7b, 0x9e, 0x3f, 0x35, 0x1c, + 0x41, 0x67, 0xcd, 0x03, 0xa4, 0xfb, 0x18, 0xae, 0xad, 0xfc, 0xe4, 0x24, 0xdd, 0x09, 0xb3, 0xa7, + 0x33, 0xc7, 0xe2, 0xb7, 0x9b, 0x0e, 0x2e, 0x4f, 0x7c, 0xdb, 0x54, 0x32, 0x8f, 0x9f, 0x2f, 0x7c, + 0x92, 0xec, 0xb8, 0xb7, 0xdb, 0x3f, 0xee, 0xb5, 0xe8, 0xe1, 0x34, 0x7a, 0x9f, 0xb0, 0xd9, 0x3d, + 0x1e, 0x74, 0x5e, 0x8a, 0xad, 0xb5, 0xfd, 0xad, 0x4c, 0xae, 0x3d, 0xfe, 0x56, 0x3e, 0x01, 0x22, + 0x5b, 0xdd, 0xed, 0x37, 0x5a, 0x7c, 0x4b, 0x8e, 0x9e, 0x5b, 0x1c, 0xee, 0xf2, 0x4f, 0x99, 0x69, + 0xed, 0xc1, 0x71, 0x77, 0x28, 0x5f, 0x72, 0xac, 0x01, 0x74, 0x9a, 0xed, 0xdd, 0xb6, 0xb6, 0x8f, + 0x04, 0x59, 0x4c, 0x1f, 0xf6, 0x7b, 0xfb, 0xfd, 0xd6, 0x2e, 0xa6, 0x73, 0x8f, 0xff, 0xab, 0x35, + 0x50, 0x16, 0x5f, 0x6d, 0x61, 0xb7, 0xe0, 0x3a, 0x11, 0xe9, 0x47, 0x5a, 0xbb, 0xd5, 0x69, 0xf2, + 0x70, 0xd8, 0x97, 0x8d, 0x6e, 0x07, 0xeb, 0xbc, 0x0e, 0x57, 0x17, 0x91, 0x8d, 0x5e, 0x8b, 0xbf, + 0xef, 0xb6, 0x88, 0x68, 0xff, 0xfa, 0xb8, 0xd1, 0x55, 0xd6, 0xd8, 0x3b, 0x70, 0x63, 0x11, 0xd5, + 0xeb, 0x0f, 0x05, 0x3a, 0xcb, 0xea, 0xb0, 0xb5, 0x88, 0xee, 0xb6, 0x07, 0xa8, 0x37, 0xdc, 0x81, + 0x9b, 0xab, 0x30, 0x22, 0x67, 0x7e, 0x55, 0x4b, 0xf7, 0x49, 0xed, 0xd0, 0x94, 0x75, 0x64, 0x99, + 0x37, 0x20, 0x45, 0xfe, 0x02, 0xdb, 0x06, 0xb6, 0xdc, 0x53, 0xa5, 0xb8, 0x72, 0x04, 0x06, 0xfc, + 0x6b, 0xed, 0x25, 0x76, 0x17, 0x6e, 0xad, 0x42, 0xf6, 0xc5, 0xe7, 0xdc, 0xe1, 0xf1, 0x3f, 0xc8, + 0x40, 0xfd, 0x4d, 0xd7, 0xe2, 0x99, 0x0a, 0x77, 0xb4, 0xe3, 0x1e, 0xbd, 0xb7, 0xc8, 0x9f, 0x86, + 0xd4, 0x5f, 0xb4, 0xbf, 0x5b, 0x78, 0x46, 0xef, 0x1d, 0xb8, 0xb1, 0x82, 0x46, 0x6b, 0xbc, 0xd2, + 0x5f, 0x7e, 0xaa, 0x64, 0xd8, 0x07, 0xf0, 0xde, 0x0a, 0xf4, 0x5e, 0xb7, 0xdf, 0x18, 0xea, 0xbf, + 0x69, 0x6b, 0x7d, 0xbd, 0xd9, 0xed, 0x0f, 0xda, 0x2d, 0x24, 0x5e, 0x63, 0x3b, 0x70, 0x7b, 0x05, + 0xf1, 0x80, 0x3f, 0xdb, 0xf9, 0xf2, 0x53, 0x25, 0xcb, 0xde, 0x85, 0x7b, 0x6f, 0xa6, 0xd8, 0x43, + 0xcd, 0xec, 0xe5, 0xa7, 0x4a, 0xee, 0xf1, 0xaf, 0xa0, 0xfe, 0xa6, 0xbb, 0x66, 0xb8, 0x2c, 0x9a, + 0x07, 0x0d, 0xba, 0xcf, 0x87, 0xda, 0x5c, 0x5f, 0xe7, 0x29, 0xf2, 0x39, 0x6b, 0xed, 0x6e, 0x9b, + 0x02, 0xb2, 0x1f, 0xff, 0x2e, 0x93, 0xb0, 0x6c, 0xe4, 0x7d, 0xa1, 0x08, 0x20, 0xd6, 0x6a, 0x12, + 0xa4, 0x59, 0x86, 0xa9, 0x64, 0x70, 0x96, 0x52, 0xa0, 0xae, 0x37, 0x32, 0x1c, 0x65, 0x8d, 0x42, + 0xaf, 0x25, 0x9c, 0xee, 0xb9, 0x2a, 0x59, 0x1c, 0xba, 0x08, 0xd6, 0xf5, 0xce, 0x8f, 0x7c, 0xdb, + 0xf3, 0xed, 0xf0, 0x92, 0xa3, 0x73, 0x8f, 0xff, 0x71, 0x11, 0x36, 0x90, 0x92, 0x77, 0x58, 0x41, + 0xc3, 0x34, 0x63, 0x18, 0x6d, 0xb1, 0x9c, 0xd7, 0x49, 0xbf, 0x58, 0x40, 0x64, 0x90, 0x3f, 0xa4, + 0xfb, 0x65, 0x11, 0xb9, 0x86, 0x48, 0xcd, 0xa2, 0xa0, 0xdd, 0x25, 0x64, 0x76, 0xf7, 0xeb, 0xbf, + 0xf7, 0x97, 0x77, 0x32, 0xff, 0xc5, 0x5f, 0xde, 0xc9, 0xfc, 0x4f, 0x7f, 0x79, 0xe7, 0xca, 0x9f, + 0xfe, 0x2f, 0x77, 0x32, 0xbf, 0xf9, 0x68, 0x62, 0x87, 0xa7, 0xf3, 0x93, 0x27, 0x23, 0x6f, 0xfa, + 0xf1, 0xd4, 0x08, 0x7d, 0xfb, 0x82, 0x2b, 0x3a, 0x32, 0xe1, 0x5a, 0x1f, 0xcf, 0xce, 0x26, 0x1f, + 0xcf, 0x4e, 0x3e, 0x46, 0x91, 0x7b, 0xb2, 0x3e, 0xf3, 0xbd, 0xd0, 0x7b, 0xf6, 0xff, 0x05, 0x00, + 0x00, 0xff, 0xff, 0xf8, 0x1e, 0x68, 0xc6, 0x45, 0x98, 0x00, 0x00, } func (m *Type) Marshal() (dAtA []byte, err error) { @@ -18107,6 +18172,23 @@ func (m *ForeignKeyDef) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.OnUpdateOrigin != 0 { + i = encodeVarintPlan(dAtA, i, uint64(m.OnUpdateOrigin)) + i-- + dAtA[i] = 0x48 + } + if m.OnDeleteOrigin != 0 { + i = encodeVarintPlan(dAtA, i, uint64(m.OnDeleteOrigin)) + i-- + dAtA[i] = 0x40 + } + if len(m.ReferencedIndexName) > 0 { + i -= len(m.ReferencedIndexName) + copy(dAtA[i:], m.ReferencedIndexName) + i = encodeVarintPlan(dAtA, i, uint64(len(m.ReferencedIndexName))) + i-- + dAtA[i] = 0x3a + } if m.OnUpdate != 0 { i = encodeVarintPlan(dAtA, i, uint64(m.OnUpdate)) i-- @@ -29338,6 +29420,16 @@ func (m *ForeignKeyDef) ProtoSize() (n int) { if m.OnUpdate != 0 { n += 1 + sovPlan(uint64(m.OnUpdate)) } + l = len(m.ReferencedIndexName) + if l > 0 { + n += 1 + l + sovPlan(uint64(l)) + } + if m.OnDeleteOrigin != 0 { + n += 1 + sovPlan(uint64(m.OnDeleteOrigin)) + } + if m.OnUpdateOrigin != 0 { + n += 1 + sovPlan(uint64(m.OnUpdateOrigin)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -39906,6 +39998,76 @@ func (m *ForeignKeyDef) Unmarshal(dAtA []byte) error { break } } + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReferencedIndexName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlan + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPlan + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPlan + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ReferencedIndexName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OnDeleteOrigin", wireType) + } + m.OnDeleteOrigin = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlan + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.OnDeleteOrigin |= ForeignKeyDef_RefActionOrigin(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OnUpdateOrigin", wireType) + } + m.OnUpdateOrigin = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlan + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.OnUpdateOrigin |= ForeignKeyDef_RefActionOrigin(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipPlan(dAtA[iNdEx:]) diff --git a/pkg/sql/compile/ddl.go b/pkg/sql/compile/ddl.go index f7dc15ca85726..55b16cb92436c 100644 --- a/pkg/sql/compile/ddl.go +++ b/pkg/sql/compile/ddl.go @@ -1547,12 +1547,15 @@ func (s *Scope) CreateTable(c *Compile) error { } dedupFkName.Insert(fkey.Name) newDef := &plan.ForeignKeyDef{ - Name: fkey.Name, - Cols: make([]uint64, len(fkey.Cols)), - ForeignTbl: fkey.ForeignTbl, - ForeignCols: make([]uint64, len(fkey.ForeignCols)), - OnDelete: fkey.OnDelete, - OnUpdate: fkey.OnUpdate, + Name: fkey.Name, + Cols: make([]uint64, len(fkey.Cols)), + ForeignTbl: fkey.ForeignTbl, + ForeignCols: make([]uint64, len(fkey.ForeignCols)), + OnDelete: fkey.OnDelete, + OnUpdate: fkey.OnUpdate, + ReferencedIndexName: fkey.ReferencedIndexName, + OnDeleteOrigin: fkey.OnDeleteOrigin, + OnUpdateOrigin: fkey.OnUpdateOrigin, } copy(newDef.ForeignCols, fkey.ForeignCols) @@ -1687,12 +1690,15 @@ func (s *Scope) CreateTable(c *Compile) error { for _, info := range fkRefersToMe { //update foreignCols in fk newDef := &plan.ForeignKeyDef{ - Name: info.Def.Name, - Cols: make([]uint64, len(info.Def.Cols)), - ForeignTbl: tblId, - ForeignCols: make([]uint64, len(info.Def.ForeignCols)), - OnDelete: info.Def.OnDelete, - OnUpdate: info.Def.OnUpdate, + Name: info.Def.Name, + Cols: make([]uint64, len(info.Def.Cols)), + ForeignTbl: tblId, + ForeignCols: make([]uint64, len(info.Def.ForeignCols)), + OnDelete: info.Def.OnDelete, + OnUpdate: info.Def.OnUpdate, + ReferencedIndexName: info.Def.ReferencedIndexName, + OnDeleteOrigin: info.Def.OnDeleteOrigin, + OnUpdateOrigin: info.Def.OnUpdateOrigin, } //child table column ids of the child table copy(newDef.Cols, info.Def.Cols) diff --git a/pkg/sql/plan/build_alter_add_primarykey.go b/pkg/sql/plan/build_alter_add_primarykey.go index e23ca40eb2110..5bba602d82175 100644 --- a/pkg/sql/plan/build_alter_add_primarykey.go +++ b/pkg/sql/plan/build_alter_add_primarykey.go @@ -99,6 +99,9 @@ func AddPrimaryKey(ctx CompilerContext, alterPlan *plan.AlterTable, spec *tree.P func DropPrimaryKey(ctx CompilerContext, alterPlan *plan.AlterTable, alterCtx *AlterTableContext) error { tableDef := alterPlan.CopyTableDef + if err := checkDropReferencedKeyForeignKeyDependency(ctx, tableDef, "PRIMARY", nil); err != nil { + return err + } if tableDef.Pkey.PkeyColName == catalog.FakePrimaryKeyColName { return moerr.NewErrCantDropFieldOrKey(ctx.GetContext(), "PRIMARY") } diff --git a/pkg/sql/plan/build_ddl.go b/pkg/sql/plan/build_ddl.go index d78ce66e299a0..aaf4d10ab499d 100644 --- a/pkg/sql/plan/build_ddl.go +++ b/pkg/sql/plan/build_ddl.go @@ -21,6 +21,7 @@ import ( "iter" "path" "slices" + "sort" "strconv" "strings" "time" @@ -1619,11 +1620,11 @@ func buildTableDefs(stmt *tree.CreateTable, ctx CompilerContext, createTable *pl createTable.TableDef.Fkeys = append(createTable.TableDef.Fkeys, fkData.Def) } - createTable.UpdateFkSqls = append(createTable.UpdateFkSqls, fkData.UpdateSql) - // save self reference foreign keys if fkData.IsSelfRefer { fkDatasOfFKSelfRefer = append(fkDatasOfFKSelfRefer, fkData) + } else { + createTable.UpdateFkSqls = append(createTable.UpdateFkSqls, fkData.UpdateSql) } case *tree.CheckIndex: if err := rejectWindowFunction(ctx, def.Expr); err != nil { @@ -1938,12 +1939,15 @@ func buildTableDefs(stmt *tree.CreateTable, ctx CompilerContext, createTable *pl if err := checkFkColsAreValid(ctx, selfRefer, createTable.TableDef); err != nil { return err } + selfRefer.UpdateSql = getSqlForAddFkWithCatalogLayout( + createTable.Database, createTable.TableDef.Name, selfRefer, selfRefer.catalogLayout) + createTable.UpdateFkSqls = append(createTable.UpdateFkSqls, selfRefer.UpdateSql) } } skip := IsFkBannedDatabase(createTable.Database) if !skip { - fks, err := GetFkReferredTo(ctx, createTable.Database, createTable.TableDef.Name) + fks, catalogLayout, err := getFkReferredToWithCatalogLayout(ctx, createTable.Database, createTable.TableDef.Name) if err != nil { return err } @@ -1958,6 +1962,14 @@ func buildTableDefs(stmt *tree.CreateTable, ctx CompilerContext, createTable *pl if err != nil { return err } + // The child was created while foreign_key_checks was disabled, so + // its catalog row has no parent key name. Persist the selected key + // when the metadata column exists; an old-layout row is reconciled + // by the tenant migration after the columns are committed. + if catalogLayout == foreignKeyCatalogExtended { + createTable.UpdateFkSqls = append(createTable.UpdateFkSqls, + getSqlForUpdateFkReferencedIndex(rkey.Db, rkey.Tbl, constraintName, data.Def.ReferencedIndexName)) + } info := &plan.ForeignKeyInfo{ Db: rkey.Db, Table: rkey.Tbl, @@ -3582,6 +3594,83 @@ func rejectExternalTableInlineIndexes(ctx context.Context, stmt *tree.CreateTabl return nil } +// checkDropReferencedKeyForeignKeyDependency rejects removal of the exact +// PRIMARY/UNIQUE key selected by a live child FK. ForeignKeyDef instances +// written before ReferencedIndexName existed cannot prove which of several +// compatible keys was historically selected, so every compatible key is +// protected rather than guessing from today's index set and risking a stale +// catalog binding. +func checkDropReferencedKeyForeignKeyDependency( + ctx CompilerContext, + parentTableDef *TableDef, + indexName string, + ignoredSelfForeignKeys map[string]struct{}, +) error { + var targetColumns []string + if indexName == "PRIMARY" && parentTableDef.Pkey != nil { + targetColumns = parentTableDef.Pkey.Names + } else { + for _, index := range parentTableDef.Indexes { + if index.IndexName == indexName && index.Unique { + targetColumns = index.Parts + break + } + } + } + if len(targetColumns) == 0 || len(parentTableDef.RefChildTbls) == 0 { + return nil + } + + for _, childTableID := range parentTableDef.RefChildTbls { + selfReference := childTableID == 0 || childTableID == parentTableDef.TblId + childTableDef := parentTableDef + if !selfReference { + _, resolved, err := ctx.ResolveById(childTableID, nil) + if err != nil { + return err + } + if resolved == nil { + return moerr.NewInternalErrorf(ctx.GetContext(), + "The reference foreign key table %d does not exist", childTableID) + } + childTableDef = resolved + } + + for _, fk := range childTableDef.Fkeys { + if fk.ForeignTbl != parentTableDef.TblId && !(selfReference && fk.ForeignTbl == 0) { + continue + } + if selfReference { + if _, ignored := ignoredSelfForeignKeys[fk.Name]; ignored { + continue + } + } + + referencedIndexName := fk.ReferencedIndexName + if referencedIndexName == "" { + referredColumns := make([]string, len(fk.ForeignCols)) + for i, columnID := range fk.ForeignCols { + column := FindColumnByColId(parentTableDef.Cols, columnID) + if column == nil { + return moerr.NewInternalErrorf(ctx.GetContext(), + "foreign key %s references missing column id %d", fk.Name, columnID) + } + referredColumns[i] = column.Name + } + if foreignKeyReferencedColumnsMatch(targetColumns, referredColumns) { + return moerr.NewErrDropIndexNeededInForeignKey(ctx.GetContext(), indexName) + } + continue + } + + if referencedIndexName == indexName { + return moerr.NewErrDropIndexNeededInForeignKey(ctx.GetContext(), indexName) + } + } + } + return nil +} + func buildDropIndex(stmt *tree.DropIndex, ctx CompilerContext) (*Plan, error) { dropIndex := &plan.DropIndex{} if len(stmt.TableName.SchemaName) == 0 { @@ -3627,6 +3716,8 @@ func buildDropIndex(stmt *tree.DropIndex, ctx CompilerContext) (*Plan, error) { } else { return nil, moerr.NewInternalErrorf(ctx.GetContext(), "not found index: %s", dropIndex.IndexName) } + } else if err := checkDropReferencedKeyForeignKeyDependency(ctx, tableDef, dropIndex.IndexName, nil); err != nil { + return nil, err } return &Plan{ @@ -3888,6 +3979,12 @@ func buildAlterTableInplace(stmt *tree.AlterTable, ctx CompilerContext) (*Plan, var updateSqls []string uniqueIndexInfos := make([]*tree.UniqueIndex, 0) secondaryIndexInfos := make([]*tree.Index, 0) + droppedForeignKeys := make(map[string]struct{}) + for _, option := range stmt.Options { + if drop, ok := option.(*tree.AlterOptionDrop); ok && drop.Typ == tree.AlterTableDropForeignKey { + droppedForeignKeys[string(drop.Name)] = struct{}{} + } + } for i, option := range stmt.Options { switch opt := option.(type) { case *tree.AlterOptionDrop: @@ -3909,6 +4006,9 @@ func buildAlterTableInplace(stmt *tree.AlterTable, ctx CompilerContext) (*Plan, // check index for _, indexdef := range tableDef.Indexes { if constraintName == indexdef.IndexName { + if err := checkDropReferencedKeyForeignKeyDependency(ctx, tableDef, constraintName, droppedForeignKeys); err != nil { + return nil, err + } name_not_found = false break } @@ -4612,6 +4712,10 @@ type FkData struct { UpdateSql string // forward reference ForwardRefer bool + // catalogLayout records whether the tenant has committed all FK metadata + // columns. During an asynchronous same-version offset upgrade, legacy SQL + // remains valid against both the old and partially upgraded table layouts. + catalogLayout foreignKeyCatalogLayout } // getForeignKeyData prepares the foreign key data. @@ -4620,14 +4724,21 @@ type FkData struct { // because it is not ready. It should be checked after the pk,uk has been ready. func getForeignKeyData(ctx CompilerContext, dbName string, tableDef *TableDef, def *tree.ForeignKey) (*FkData, error) { refer := def.Refer + catalogLayout, err := resolveForeignKeyCatalogLayout(ctx) + if err != nil { + return nil, err + } fkData := FkData{ Def: &plan.ForeignKeyDef{ - Name: def.ConstraintSymbol, - Cols: make([]uint64, len(def.KeyParts)), - OnDelete: getRefAction(refer.OnDelete), - OnUpdate: getRefAction(refer.OnUpdate), - ForeignCols: make([]uint64, len(refer.KeyParts)), + Name: def.ConstraintSymbol, + Cols: make([]uint64, len(def.KeyParts)), + OnDelete: getRefAction(refer.OnDelete), + OnUpdate: getRefAction(refer.OnUpdate), + ForeignCols: make([]uint64, len(refer.KeyParts)), + OnDeleteOrigin: foreignKeyActionOrigin(refer.OnDelete), + OnUpdateOrigin: foreignKeyActionOrigin(refer.OnUpdate), }, + catalogLayout: catalogLayout, } // get fk columns of create table @@ -4692,16 +4803,12 @@ func getForeignKeyData(ctx CompilerContext, dbName string, tableDef *TableDef, d fkData.ParentDbName = parentDbName fkData.ParentTableName = parentTableName fkData.Def.ForeignTbl = 0 - fkData.UpdateSql = getSqlForAddFk(dbName, tableDef.Name, &fkData) return &fkData, nil } fkData.ParentDbName = parentDbName fkData.ParentTableName = parentTableName - // make insert mo_foreign_keys - fkData.UpdateSql = getSqlForAddFk(dbName, tableDef.Name, &fkData) - _, parentTableDef, err := ctx.Resolve(parentDbName, parentTableName, nil) if err != nil { return nil, err @@ -4713,6 +4820,10 @@ func getForeignKeyData(ctx CompilerContext, dbName string, tableDef *TableDef, d } if !enabled { fkData.ForwardRefer = true + // There is no parent key to bind yet, but the catalog row is the + // durable record that lets the later parent CREATE reconcile this + // forward reference. Its referenced_index_name is backfilled then. + fkData.UpdateSql = getSqlForAddFkWithCatalogLayout(dbName, tableDef.Name, &fkData, fkData.catalogLayout) return &fkData, nil } return nil, moerr.NewNoSuchTable(ctx.GetContext(), ctx.DefaultDatabase(), parentTableName) @@ -4731,10 +4842,64 @@ func getForeignKeyData(ctx CompilerContext, dbName string, tableDef *TableDef, d if err := checkFkColsAreValid(ctx, &fkData, parentTableDef); err != nil { return nil, err } + fkData.UpdateSql = getSqlForAddFkWithCatalogLayout(dbName, tableDef.Name, &fkData, fkData.catalogLayout) return &fkData, nil } +func foreignKeyActionOrigin(option tree.ReferenceOptionType) plan.ForeignKeyDef_RefActionOrigin { + if option == tree.REFERENCE_OPTION_INVALID { + return plan.ForeignKeyDef_ACTION_ORIGIN_DEFAULT + } + return plan.ForeignKeyDef_ACTION_ORIGIN_EXPLICIT +} + +type foreignKeyReferencedKey struct { + name string + columns []string +} + +// selectForeignKeyReferencedIndex applies the one binding contract shared by +// FK creation and by DDL lifecycle checks. A reference may use an ordered +// leading prefix of a PRIMARY/UNIQUE key. PRIMARY wins ties; otherwise the +// lexicographically first named UNIQUE key wins. +func selectForeignKeyReferencedIndex(parentTableDef *TableDef, referredColumns []string) (string, bool) { + keys := make([]foreignKeyReferencedKey, 0, len(parentTableDef.Indexes)+1) + if parentTableDef.Pkey != nil { + keys = append(keys, foreignKeyReferencedKey{name: "PRIMARY", columns: parentTableDef.Pkey.Names}) + } + for _, index := range parentTableDef.Indexes { + if index.Unique { + keys = append(keys, foreignKeyReferencedKey{name: index.IndexName, columns: index.Parts}) + } + } + sort.SliceStable(keys, func(i, j int) bool { + if keys[i].name == "PRIMARY" || keys[j].name == "PRIMARY" { + return keys[i].name == "PRIMARY" + } + return keys[i].name < keys[j].name + }) + + for _, key := range keys { + if foreignKeyReferencedColumnsMatch(key.columns, referredColumns) { + return key.name, true + } + } + return "", false +} + +func foreignKeyReferencedColumnsMatch(keyColumns, referredColumns []string) bool { + if len(keyColumns) < len(referredColumns) { + return false + } + for i, column := range referredColumns { + if keyColumns[i] != column { + return false + } + } + return true +} + /* checkFkColsAreValid check foreign key columns is valid or not, then it saves them. the columns referred by the foreign key in the children table must appear in the unique keys or primary key @@ -4745,31 +4910,19 @@ create table f1 (a int ,b int, c int ,d int ,e int, primary key(a,b), unique key(c,d), unique key (e)) -Case 1: +The referenced columns must be a leading prefix of one PRIMARY or UNIQUE key, +in the same order. With PRIMARY KEY(a, b), both (a) and (a, b) are valid, but +(b) and (b, a) are not. - single column like "a" ,"b", "c", "d", "e" can be used as the column in foreign key of the child table - due to they are the member of the primary key or some Unique key. - -Case 2: - - "a, b" can be used as the columns in the foreign key of the child table - due to they are the member of the primary key. - - "c, d" can be used as the columns in the foreign key of the child table - due to they are the member of some unique key. - -Case 3: - - "a, c" can not be used due to they belong to the different primary key / unique key +When more than one key has the same prefix, PRIMARY is selected first; +otherwise the lexicographically first named UNIQUE key is selected. Persisting +this selected name makes information_schema.REFERENTIAL_CONSTRAINTS deterministic. */ func checkFkColsAreValid(ctx CompilerContext, fkData *FkData, parentTableDef *TableDef) error { // colId in parent table-> position in parent table columnIdPos := make(map[uint64]int) // columnName in parent table -> position in parent table columnNamePos := make(map[string]int) - // columnName of index and pk of parent table -> colId in parent table - uniqueColumns := make([]map[string]uint64, 0, len(parentTableDef.Cols)) - // 1. collect parent column info for i, col := range parentTableDef.Cols { columnIdPos[col.ColId] = i @@ -4786,63 +4939,21 @@ func checkFkColsAreValid(ctx CompilerContext, fkData *FkData, parentTableDef *Ta return err } - // columnName in uk or pk -> its colId in the parent table - collectIndexColumn := func(names []string) { - ret := make(map[string]uint64) - // columnName -> its colId in the parent table - for _, colName := range names { - ret[colName] = parentTableDef.Cols[columnNamePos[colName]].ColId - } - uniqueColumns = append(uniqueColumns, ret) - } - - // 3. collect pk column info of the parent table - if parentTableDef.Pkey != nil { - collectIndexColumn(parentTableDef.Pkey.Names) + indexName, matched := selectForeignKeyReferencedIndex(parentTableDef, fkData.ColsReferred.Cols) + if !matched { + return moerr.NewInternalError(ctx.GetContext(), "failed to add the foreign key constraint") } - // 4. collect index column info of the parent table - // secondary key? - // now tableRef.Indices are empty, you can not test it - for _, index := range parentTableDef.Indexes { - if index.Unique { - collectIndexColumn(index.Parts) - } - } - - // 5. check if there is at least one unique key or primary key should have - // the columns referenced by the foreign keys in the children tables. - matchCol := make([]uint64, 0, len(fkData.ColsReferred.Cols)) - // iterate on every pk or uk - for _, uniqueColumn := range uniqueColumns { - // iterate on the referred column of fk - for i, colName := range fkData.ColsReferred.Cols { - // check if the referred column exists in this pk or uk - if colId, ok := uniqueColumn[colName]; ok { - // check column type - // left part of expr: column type in parent table - // right part of expr: column type in child table - if parentTableDef.Cols[columnIdPos[colId]].Typ.Id != fkData.ColTyps[i].Id { - return moerr.NewInternalErrorf(ctx.GetContext(), "type of reference column '%v' is not match for column '%v'", colName, fkData.Cols.Cols[i]) - } - matchCol = append(matchCol, colId) - } else { - // column in fk does not exist in this pk or uk - matchCol = matchCol[:0] - break - } - } - - if len(matchCol) > 0 { - break + matchCols := make([]uint64, len(fkData.ColsReferred.Cols)) + for i, referredColName := range fkData.ColsReferred.Cols { + colID := parentTableDef.Cols[columnNamePos[referredColName]].ColId + if parentTableDef.Cols[columnIdPos[colID]].Typ.Id != fkData.ColTyps[i].Id { + return moerr.NewInternalErrorf(ctx.GetContext(), "type of reference column '%v' is not match for column '%v'", referredColName, fkData.Cols.Cols[i]) } + matchCols[i] = colID } - - if len(matchCol) == 0 { - return moerr.NewInternalError(ctx.GetContext(), "failed to add the foreign key constraint") - } else { - fkData.Def.ForeignCols = matchCol - } + fkData.Def.ForeignCols = matchCols + fkData.Def.ReferencedIndexName = indexName return nil } @@ -4867,11 +4978,14 @@ func buildFkDataOfForwardRefer(ctx CompilerContext, createTable *plan.CreateTable) (*FkData, error) { fkData := FkData{ Def: &plan.ForeignKeyDef{ - Name: constraintName, - Cols: make([]uint64, len(fkDefs)), - OnDelete: convertIntoReferAction(fkDefs[0].OnDelete), - OnUpdate: convertIntoReferAction(fkDefs[0].OnUpdate), - ForeignCols: make([]uint64, len(fkDefs)), + Name: constraintName, + Cols: make([]uint64, len(fkDefs)), + OnDelete: convertIntoReferAction(fkDefs[0].OnDelete), + OnUpdate: convertIntoReferAction(fkDefs[0].OnUpdate), + ForeignCols: make([]uint64, len(fkDefs)), + ReferencedIndexName: fkDefs[0].ReferencedIndexName, + OnDeleteOrigin: convertIntoReferActionOrigin(fkDefs[0].OnDeleteOrigin), + OnUpdateOrigin: convertIntoReferActionOrigin(fkDefs[0].OnUpdateOrigin), }, } // 1. get tableDef of the child table diff --git a/pkg/sql/plan/build_ddl_test.go b/pkg/sql/plan/build_ddl_test.go index 636bc6da006f3..9fd5fc7dab8fa 100644 --- a/pkg/sql/plan/build_ddl_test.go +++ b/pkg/sql/plan/build_ddl_test.go @@ -37,7 +37,9 @@ import ( "github.com/matrixorigin/matrixone/pkg/sql/parsers" "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect" "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/matrixorigin/matrixone/pkg/testutil" "github.com/matrixorigin/matrixone/pkg/util/executor" + "github.com/matrixorigin/matrixone/pkg/vm/process" ) type rootSQLCompilerContext struct { @@ -2371,3 +2373,250 @@ func TestPartitionCreateSQLIsModeIndependentForAddPartition(t *testing.T) { require.NoError(t, err) require.Len(t, defs, 1) } + +func TestCheckFkColsAreValidRecordsReferencedKey(t *testing.T) { + ctx := NewMockCompilerContext(true) + ctx.SetContext(context.Background()) + intType := plan.Type{Id: int32(types.T_int32)} + parent := &TableDef{ + Name: "parent", + Cols: []*plan.ColDef{ + {ColId: 1, Name: "id", Typ: intType}, + {ColId: 2, Name: "code", Typ: intType}, + }, + Pkey: &plan.PrimaryKeyDef{Names: []string{"id", "code"}}, + Indexes: []*plan.IndexDef{ + {IndexName: "uq_parent_id", Unique: true, Parts: []string{"id"}}, + {IndexName: "uq_parent_code", Unique: true, Parts: []string{"code"}}, + }, + } + newFK := func(columns ...string) *FkData { + return &FkData{ + ParentTableName: "parent", + Cols: &plan.FkColName{Cols: columns}, + ColsReferred: &plan.FkColName{Cols: columns}, + Def: &plan.ForeignKeyDef{}, + ColTyps: map[int]*plan.Type{ + 0: &intType, + }, + } + } + + fk := newFK("id") + require.NoError(t, checkFkColsAreValid(ctx, fk, parent)) + require.Equal(t, "PRIMARY", fk.Def.ReferencedIndexName) + require.Equal(t, []uint64{1}, fk.Def.ForeignCols) + + composite := newFK("id", "code") + composite.ColTyps[1] = &intType + require.NoError(t, checkFkColsAreValid(ctx, composite, parent)) + require.Equal(t, "PRIMARY", composite.Def.ReferencedIndexName) + require.Equal(t, []uint64{1, 2}, composite.Def.ForeignCols) + + nonPrefix := newFK("code", "id") + nonPrefix.ColTyps[1] = &intType + require.Error(t, checkFkColsAreValid(ctx, nonPrefix, parent), "a non-prefix key must not be accepted") + + unique := newFK("code") + require.NoError(t, checkFkColsAreValid(ctx, unique, parent)) + require.Equal(t, "uq_parent_code", unique.Def.ReferencedIndexName) +} + +func TestDropSelectedForeignKeyIndexIsRejected(t *testing.T) { + for _, referencedIndexName := range []string{"idx1", ""} { + mode := "persisted name" + if referencedIndexName == "" { + mode = "legacy inferred name" + } + t.Run(mode, func(t *testing.T) { + for _, sql := range []string{ + "drop index idx1 on test_idx", + "alter table test_idx drop index idx1", + } { + t.Run(sql, func(t *testing.T) { + mock := NewMockOptimizer(true) + parent := mock.ctxt.tables["test_idx"] + parent.TblId = 100 + parent.Pkey = nil + parent.RefChildTbls = []uint64{200} + parent.Indexes = []*plan.IndexDef{ + {IndexName: "idx1", Unique: true, Parts: []string{"n_nationkey"}}, + {IndexName: "idx_alternative", Unique: true, Parts: []string{"n_nationkey"}}, + {IndexName: "idx_unrelated", Unique: true, Parts: []string{"n_name"}}, + } + child := &TableDef{ + Name: "fk_child", + TblId: 200, + Fkeys: []*plan.ForeignKeyDef{{ + Name: "fk_child_parent", + ForeignTbl: parent.TblId, + ForeignCols: []uint64{parent.Cols[0].ColId}, + ReferencedIndexName: referencedIndexName, + }}, + } + mock.ctxt.tables[child.Name] = child + mock.ctxt.objects[child.Name] = &ObjectRef{SchemaName: "tpch", ObjName: child.Name} + mock.ctxt.id2name[child.TblId] = child.Name + + _, err := runOneStmt(mock, t, sql) + require.Error(t, err) + require.True(t, moerr.IsMoErrCode(err, moerr.ErrDropIndexNeededInForeignKey), err.Error()) + + plan, err := runOneStmt(mock, t, "drop index idx_unrelated on test_idx") + require.NoError(t, err) + require.Equal(t, "idx_unrelated", plan.GetDdl().GetDropIndex().GetIndexName()) + + _, err = runOneStmt(mock, t, "drop index idx_alternative on test_idx") + if referencedIndexName == "" { + require.Error(t, err, "legacy metadata must not guess which compatible key was bound") + require.True(t, moerr.IsMoErrCode(err, moerr.ErrDropIndexNeededInForeignKey), err.Error()) + } else { + require.NoError(t, err, "a persisted binding makes an alternative key independently droppable") + } + }) + } + }) + } +} + +func TestAlterCanDropSelfForeignKeyAndItsSelectedIndexTogether(t *testing.T) { + mock := NewMockOptimizer(true) + tableDef := mock.ctxt.tables["test_idx"] + tableDef.TblId = 100 + tableDef.Pkey = nil + tableDef.RefChildTbls = []uint64{0} + tableDef.Indexes = []*plan.IndexDef{{ + IndexName: "idx1", Unique: true, Parts: []string{"n_nationkey"}, + }} + tableDef.Fkeys = []*plan.ForeignKeyDef{{ + Name: "fk_self", + ForeignTbl: 0, + ForeignCols: []uint64{tableDef.Cols[0].ColId}, + ReferencedIndexName: "idx1", + }} + + logicPlan, err := runOneStmt(mock, t, + "alter table test_idx drop foreign key fk_self, drop index idx1") + require.NoError(t, err) + require.Len(t, logicPlan.GetDdl().GetAlterTable().GetActions(), 2) +} + +func TestDropReferencedPrimaryKeyIsRejected(t *testing.T) { + for _, referencedIndexName := range []string{"PRIMARY", ""} { + mock := NewMockOptimizer(true) + parent := mock.ctxt.tables["test_idx"] + parent.TblId = 100 + parent.RefChildTbls = []uint64{200} + child := &TableDef{ + Name: "fk_child_primary", + TblId: 200, + Fkeys: []*plan.ForeignKeyDef{{ + Name: "fk_child_primary", + ForeignTbl: parent.TblId, + ForeignCols: []uint64{parent.Cols[0].ColId}, + ReferencedIndexName: referencedIndexName, + }}, + } + mock.ctxt.tables[child.Name] = child + mock.ctxt.objects[child.Name] = &ObjectRef{SchemaName: "tpch", ObjName: child.Name} + mock.ctxt.id2name[child.TblId] = child.Name + + _, err := runOneStmt(mock, t, "alter table test_idx drop primary key") + require.Error(t, err) + require.True(t, moerr.IsMoErrCode(err, moerr.ErrDropIndexNeededInForeignKey), err.Error()) + } +} + +func TestCreateForeignKeyUsesLegacyCatalogBeforeTenantUpgrade(t *testing.T) { + mock := NewMockOptimizer(false) + legacyColumnNames := []string{ + "constraint_name", "constraint_id", "db_name", "db_id", "table_name", "table_id", + "column_name", "column_id", "refer_db_name", "refer_db_id", "refer_table_name", + "refer_table_id", "refer_column_name", "refer_column_id", "on_delete", "on_update", + } + legacyCatalog := &TableDef{Name: catalog.MOForeignKeys} + for _, name := range legacyColumnNames { + legacyCatalog.Cols = append(legacyCatalog.Cols, &ColDef{Name: name}) + } + mock.ctxt.tables[catalog.MOForeignKeys] = legacyCatalog + + proc := testutil.NewProcess(t) + proc.ReplaceTopCtx(defines.AttachAccountId(context.Background(), catalog.System_Account)) + mock.ctxt.GetProcessFunc = func() *process.Process { return proc } + var internalQueries []string + moruntime.ServiceRuntime(proc.GetService()).SetGlobalVariables( + moruntime.InternalSQLExecutor, + executor.NewMemExecutor(func(sql string) (executor.Result, error) { + internalQueries = append(internalQueries, sql) + return executor.Result{}, nil + }), + ) + + logicPlan, err := runOneStmt(mock, t, + "create table fk_before_upgrade (parent_id int, constraint fk_before_upgrade_parent foreign key (parent_id) references nation(n_nationkey))") + require.NoError(t, err) + createTable := logicPlan.GetDdl().GetCreateTable() + require.Len(t, createTable.UpdateFkSqls, 1) + require.NotContains(t, createTable.UpdateFkSqls[0], "referenced_index_name") + require.NotContains(t, createTable.UpdateFkSqls[0], "on_delete_origin") + require.Len(t, internalQueries, 1) + require.NotContains(t, internalQueries[0], "referenced_index_name") + require.NotContains(t, internalQueries[0], "on_delete_origin") +} + +func TestForwardForeignKeyCatalogLifecycle(t *testing.T) { + ctx := NewMockCompilerContext(true) + ctx.SetContext(context.Background()) + ctx.tables[catalog.MOForeignKeys] = &TableDef{ + Name: catalog.MOForeignKeys, + Cols: []*ColDef{ + {Name: "referenced_index_name"}, + {Name: "on_delete_origin"}, + {Name: "on_update_origin"}, + }, + } + ctx.ResolveVariableFunc = func(name string, _, _ bool) (interface{}, error) { + if name == "foreign_key_checks" { + return int64(0), nil + } + return nil, moerr.NewInternalError(context.Background(), "unexpected variable") + } + intType := plan.Type{Id: int32(types.T_int32)} + child := &TableDef{ + Name: "child", + Cols: []*plan.ColDef{{ColId: 1, Name: "parent_id", Typ: intType}}, + } + stmt, err := parsers.ParseOne(context.Background(), dialect.MYSQL, + "create table child (parent_id int, constraint fk_child_parent foreign key (parent_id) references parent (id))", 1) + require.NoError(t, err) + defer stmt.Free() + var foreignKey *tree.ForeignKey + for _, def := range stmt.(*tree.CreateTable).Defs { + if foreignKey, _ = def.(*tree.ForeignKey); foreignKey != nil { + break + } + } + require.NotNil(t, foreignKey) + + data, err := getForeignKeyData(ctx, "db", child, foreignKey) + require.NoError(t, err) + require.True(t, data.ForwardRefer) + require.NotEmpty(t, data.UpdateSql, "the child must persist its deferred FK catalog row") + require.Contains(t, data.UpdateSql, "'fk_child_parent'") + require.Contains(t, data.UpdateSql, "''", "the parent key is intentionally unresolved at child creation") + + ctx.tables["child"] = child + parent := &TableDef{ + Name: "parent", + Cols: []*plan.ColDef{{ColId: 2, Name: "id", Typ: intType}}, + Pkey: &plan.PrimaryKeyDef{Names: []string{"id"}}, + } + resolved, err := buildFkDataOfForwardRefer(ctx, "fk_child_parent", []*FkReferDef{{ + Db: "db", Tbl: "child", Col: "parent_id", ReferCol: "id", OnDelete: "NO_ACTION", OnUpdate: "NO_ACTION", + }}, &plan.CreateTable{Database: "db", TableDef: parent}) + require.NoError(t, err) + require.Equal(t, "PRIMARY", resolved.Def.ReferencedIndexName) + require.Equal(t, + "update `mo_catalog`.`mo_foreign_keys` set referenced_index_name = 'PRIMARY' where db_name = 'db' and table_name = 'child' and constraint_name = 'fk_child_parent'", + getSqlForUpdateFkReferencedIndex("db", "child", "fk_child_parent", resolved.Def.ReferencedIndexName)) +} diff --git a/pkg/sql/plan/build_dml_util.go b/pkg/sql/plan/build_dml_util.go index e6f6f07c88475..b9f9abfed0700 100644 --- a/pkg/sql/plan/build_dml_util.go +++ b/pkg/sql/plan/build_dml_util.go @@ -17,6 +17,7 @@ package plan import ( "context" "fmt" + "strconv" "strings" "sync" @@ -4607,13 +4608,16 @@ type FkReferKey struct { // FkReferDef holds the definition & details of the foreign key type FkReferDef struct { - Db string //fk database name - Tbl string //fk table name - Name string //fk constraint name - Col string //fk column name, letter case: lower - ReferCol string //referenced column name, letter case: lower - OnDelete string //on delete action - OnUpdate string //on update action + Db string //fk database name + Tbl string //fk table name + Name string //fk constraint name + Col string //fk column name, letter case: lower + ReferCol string //referenced column name, letter case: lower + OnDelete string //on delete action + OnUpdate string //on update action + ReferencedIndexName string + OnDeleteOrigin string + OnUpdateOrigin string } func (fk FkReferDef) String() string { @@ -4621,6 +4625,34 @@ func (fk FkReferDef) String() string { fk.Db, fk.Tbl, fk.Name, fk.Col, fk.ReferCol) } +type foreignKeyCatalogLayout uint8 + +const ( + foreignKeyCatalogLegacy foreignKeyCatalogLayout = iota + foreignKeyCatalogExtended +) + +// resolveForeignKeyCatalogLayout negotiates the tenant-local catalog shape. +// Tenant upgrades are asynchronous and add the metadata columns one at a time, +// so the extended layout is usable only after all three columns are visible. +// Legacy reads and explicit 16-column inserts remain valid during every earlier +// state, including a partially applied migration. +func resolveForeignKeyCatalogLayout(ctx CompilerContext) (foreignKeyCatalogLayout, error) { + _, tableDef, err := ctx.Resolve(catalog.MO_CATALOG, catalog.MOForeignKeys, nil) + if err != nil { + return foreignKeyCatalogLegacy, err + } + if tableDef == nil { + return foreignKeyCatalogLegacy, nil + } + for _, column := range []string{"referenced_index_name", "on_delete_origin", "on_update_origin"} { + if FindColumn(tableDef.Cols, column) == nil { + return foreignKeyCatalogLegacy, nil + } + } + return foreignKeyCatalogExtended, nil +} + // quoteSQLStringLiteral emits a literal that MatrixOne's MySQL scanner reads // byte-for-byte. Backslash is the scanner's escape introducer, including for a // single quote; doubling a quote would persist both quote bytes in INSERTs. @@ -4635,6 +4667,17 @@ func quoteSQLStringLiteral(s string) string { // GetSqlForFkReferredTo returns the query that retrieves the fk relationships // that refer to the table func GetSqlForFkReferredTo(db, table string) string { + return getSqlForFkReferredToWithCatalogLayout(db, table, foreignKeyCatalogExtended) +} + +func getSqlForFkReferredToWithCatalogLayout(db, table string, layout foreignKeyCatalogLayout) string { + metadataColumns := "" + if layout == foreignKeyCatalogExtended { + metadataColumns = + ", referenced_index_name, " + + "on_delete_origin, " + + "on_update_origin" + } return fmt.Sprintf( "select "+ "db_name, "+ @@ -4643,25 +4686,35 @@ func GetSqlForFkReferredTo(db, table string) string { "column_name, "+ "refer_column_name, "+ "on_delete, "+ - "on_update "+ - "from "+ + "on_update"+ + metadataColumns+ + " from "+ "`mo_catalog`.`mo_foreign_keys` "+ "where "+ "refer_db_name = %s and refer_table_name = %s "+ " and "+ "(db_name != %s or db_name = %s and table_name != %s) "+ - "order by db_name, table_name, constraint_name;", + "order by db_name, table_name, constraint_name, constraint_id;", quoteSQLStringLiteral(db), quoteSQLStringLiteral(table), quoteSQLStringLiteral(db), quoteSQLStringLiteral(db), quoteSQLStringLiteral(table)) } // GetFkReferredTo returns the foreign key relationships that refer to the table func GetFkReferredTo(ctx CompilerContext, db, table string) (map[FkReferKey]map[string][]*FkReferDef, error) { + ret, _, err := getFkReferredToWithCatalogLayout(ctx, db, table) + return ret, err +} + +func getFkReferredToWithCatalogLayout(ctx CompilerContext, db, table string) (map[FkReferKey]map[string][]*FkReferDef, foreignKeyCatalogLayout, error) { //exclude fk self reference - sql := GetSqlForFkReferredTo(db, table) + layout, err := resolveForeignKeyCatalogLayout(ctx) + if err != nil { + return nil, foreignKeyCatalogLegacy, err + } + sql := getSqlForFkReferredToWithCatalogLayout(db, table, layout) res, err := runSql(ctx, sql) if err != nil { - return nil, err + return nil, layout, err } defer res.Close() ret := make(map[FkReferKey]map[string][]*FkReferDef) @@ -4672,6 +4725,9 @@ func GetFkReferredTo(ctx CompilerContext, db, table string) (map[FkReferKey]map[ const referColIdx = 4 const deleteIdx = 5 const updateIdx = 6 + const referencedIndexIdx = 7 + const deleteOriginIdx = 8 + const updateOriginIdx = 9 if res.Batches != nil { for _, batch := range res.Batches { if batch != nil && @@ -4687,6 +4743,14 @@ func GetFkReferredTo(ctx CompilerContext, db, table string) (map[FkReferKey]map[ OnDelete: string(batch.Vecs[deleteIdx].GetBytesAt(i)), OnUpdate: string(batch.Vecs[updateIdx].GetBytesAt(i)), } + if layout == foreignKeyCatalogExtended { + fk.ReferencedIndexName = string(batch.Vecs[referencedIndexIdx].GetBytesAt(i)) + fk.OnDeleteOrigin = string(batch.Vecs[deleteOriginIdx].GetBytesAt(i)) + fk.OnUpdateOrigin = string(batch.Vecs[updateOriginIdx].GetBytesAt(i)) + } else { + fk.OnDeleteOrigin = legacyForeignKeyActionOrigin(fk.OnDelete) + fk.OnUpdateOrigin = legacyForeignKeyActionOrigin(fk.OnUpdate) + } key := FkReferKey{Db: fk.Db, Tbl: fk.Tbl} var constraint map[string][]*FkReferDef var ok bool @@ -4699,7 +4763,16 @@ func GetFkReferredTo(ctx CompilerContext, db, table string) (map[FkReferKey]map[ } } } - return ret, nil + return ret, layout, nil +} + +func legacyForeignKeyActionOrigin(action string) string { + switch strings.ToUpper(strings.ReplaceAll(strings.TrimSpace(action), " ", "_")) { + case plan.ForeignKeyDef_RESTRICT.String(), plan.ForeignKeyDef_NO_ACTION.String(): + return plan.ForeignKeyDef_ACTION_ORIGIN_LEGACY_AMBIGUOUS.String() + default: + return plan.ForeignKeyDef_ACTION_ORIGIN_EXPLICIT.String() + } } func convertIntoReferAction(s string) plan.ForeignKeyDef_RefAction { @@ -4725,17 +4798,41 @@ func convertIntoReferAction(s string) plan.ForeignKeyDef_RefAction { } } +func convertIntoReferActionOrigin(s string) plan.ForeignKeyDef_RefActionOrigin { + switch strings.ToUpper(strings.TrimSpace(s)) { + case plan.ForeignKeyDef_ACTION_ORIGIN_DEFAULT.String(): + return plan.ForeignKeyDef_ACTION_ORIGIN_DEFAULT + case plan.ForeignKeyDef_ACTION_ORIGIN_LEGACY_AMBIGUOUS.String(): + return plan.ForeignKeyDef_ACTION_ORIGIN_LEGACY_AMBIGUOUS + default: + return plan.ForeignKeyDef_ACTION_ORIGIN_EXPLICIT + } +} + // getSqlForAddFk returns the insert sql that adds a fk relationship // into the mo_foreign_keys table func getSqlForAddFk(db, table string, data *FkData) string { - row := make([]string, 16) + return getSqlForAddFkWithCatalogLayout(db, table, data, foreignKeyCatalogExtended) +} + +func getSqlForAddFkWithCatalogLayout(db, table string, data *FkData, layout foreignKeyCatalogLayout) string { + columnCount := 16 + columns := "constraint_name, constraint_id, db_name, db_id, table_name, table_id, column_name, column_id, refer_db_name, refer_db_id, refer_table_name, refer_table_id, refer_column_name, refer_column_id, on_delete, on_update" + if layout == foreignKeyCatalogExtended { + columnCount = 19 + columns += ", referenced_index_name, on_delete_origin, on_update_origin" + } + row := make([]string, columnCount) rows := 0 sb := strings.Builder{} - sb.WriteString("insert into `mo_catalog`.`mo_foreign_keys` ") + sb.WriteString("insert into `mo_catalog`.`mo_foreign_keys` (") + sb.WriteString(columns) + sb.WriteByte(')') sb.WriteString(" values ") for childIdx, childCol := range data.Cols.Cols { row[0] = data.Def.Name - row[1] = "0" + // constraint_id preserves the declaration order of composite foreign-key columns. + row[1] = strconv.Itoa(childIdx + 1) row[2] = db row[3] = "0" row[4] = table @@ -4750,6 +4847,17 @@ func getSqlForAddFk(db, table string, data *FkData) string { row[13] = "0" row[14] = data.Def.OnDelete.String() row[15] = data.Def.OnUpdate.String() + if layout == foreignKeyCatalogExtended { + row[16] = data.Def.ReferencedIndexName + row[17] = data.Def.OnDeleteOrigin.String() + row[18] = data.Def.OnUpdateOrigin.String() + } + if data.Def.OnDeleteOrigin == plan.ForeignKeyDef_ACTION_ORIGIN_DEFAULT { + row[14] = plan.ForeignKeyDef_NO_ACTION.String() + } + if data.Def.OnUpdateOrigin == plan.ForeignKeyDef_ACTION_ORIGIN_DEFAULT { + row[15] = plan.ForeignKeyDef_NO_ACTION.String() + } { if rows > 0 { sb.WriteByte(',') @@ -4768,6 +4876,16 @@ func getSqlForAddFk(db, table string, data *FkData) string { return sb.String() } +func getSqlForUpdateFkReferencedIndex(db, table, constraintName, referencedIndexName string) string { + return fmt.Sprintf( + "update `mo_catalog`.`mo_foreign_keys` set referenced_index_name = %s where db_name = %s and table_name = %s and constraint_name = %s", + quoteSQLStringLiteral(referencedIndexName), + quoteSQLStringLiteral(db), + quoteSQLStringLiteral(table), + quoteSQLStringLiteral(constraintName), + ) +} + // getSqlForDeleteTable returns the delete sql that deletes all the fk relationships from mo_foreign_keys // on the table func getSqlForDeleteTable(db, tbl string) string { diff --git a/pkg/sql/plan/build_dml_util_test.go b/pkg/sql/plan/build_dml_util_test.go index e259abb87a236..bd68deb66784e 100644 --- a/pkg/sql/plan/build_dml_util_test.go +++ b/pkg/sql/plan/build_dml_util_test.go @@ -65,6 +65,57 @@ func TestGetSqlForFkReferredToEscapesStringLiterals(t *testing.T) { require.Contains(t, sql, "table_name != 'quote\\'src'") } +func TestForeignKeyCatalogLayoutIsExtendedOnlyAfterAllColumnsExist(t *testing.T) { + ctx := NewEmptyCompilerContext() + ctx.tables[catalog.MOForeignKeys] = &TableDef{ + Name: catalog.MOForeignKeys, + Cols: []*ColDef{{Name: "referenced_index_name"}, {Name: "on_delete_origin"}}, + } + layout, err := resolveForeignKeyCatalogLayout(ctx) + require.NoError(t, err) + require.Equal(t, foreignKeyCatalogLegacy, layout) + + ctx.tables[catalog.MOForeignKeys].Cols = append(ctx.tables[catalog.MOForeignKeys].Cols, + &ColDef{Name: "on_update_origin"}) + layout, err = resolveForeignKeyCatalogLayout(ctx) + require.NoError(t, err) + require.Equal(t, foreignKeyCatalogExtended, layout) +} + +func TestLegacyForeignKeyCatalogSQLAvoidsNewColumns(t *testing.T) { + readSQL := getSqlForFkReferredToWithCatalogLayout("parent_db", "parent", foreignKeyCatalogLegacy) + require.NotContains(t, readSQL, "referenced_index_name") + require.NotContains(t, readSQL, "on_delete_origin") + require.Contains(t, readSQL, "on_update from `mo_catalog`.`mo_foreign_keys`") + + fkData := &FkData{ + Def: &plan.ForeignKeyDef{ + Name: "fk_child_parent", + OnDelete: plan.ForeignKeyDef_RESTRICT, + OnUpdate: plan.ForeignKeyDef_RESTRICT, + OnDeleteOrigin: plan.ForeignKeyDef_ACTION_ORIGIN_EXPLICIT, + OnUpdateOrigin: plan.ForeignKeyDef_ACTION_ORIGIN_EXPLICIT, + }, + Cols: &plan.FkColName{Cols: []string{"parent_id"}}, + ColsReferred: &plan.FkColName{Cols: []string{"id"}}, + ParentDbName: "parent_db", + ParentTableName: "parent", + } + insertSQL := getSqlForAddFkWithCatalogLayout("child_db", "child", fkData, foreignKeyCatalogLegacy) + require.NotContains(t, insertSQL, "referenced_index_name") + require.NotContains(t, insertSQL, "on_delete_origin") + require.Contains(t, insertSQL, "on_delete, on_update) values") +} + +func TestLegacyForeignKeyActionOriginIsConservative(t *testing.T) { + require.Equal(t, plan.ForeignKeyDef_ACTION_ORIGIN_LEGACY_AMBIGUOUS.String(), + legacyForeignKeyActionOrigin("RESTRICT")) + require.Equal(t, plan.ForeignKeyDef_ACTION_ORIGIN_LEGACY_AMBIGUOUS.String(), + legacyForeignKeyActionOrigin("NO ACTION")) + require.Equal(t, plan.ForeignKeyDef_ACTION_ORIGIN_EXPLICIT.String(), + legacyForeignKeyActionOrigin("CASCADE")) +} + func TestGetSqlForAddFkEscapesStringLiterals(t *testing.T) { fkData := &FkData{ Def: &plan.ForeignKeyDef{ @@ -88,6 +139,51 @@ func TestGetSqlForAddFkEscapesStringLiterals(t *testing.T) { require.Contains(t, sql, "'parent\\'col'") } +func TestGetSqlForAddFkRecordsCompositeColumnOrder(t *testing.T) { + fkData := &FkData{ + Def: &plan.ForeignKeyDef{Name: "fk_child_parent"}, + Cols: &plan.FkColName{Cols: []string{"child_first", "child_second"}}, + ColsReferred: &plan.FkColName{Cols: []string{ + "parent_first", "parent_second", + }}, + ParentDbName: "parent_db", + ParentTableName: "parent", + } + + sql := getSqlForAddFk("child_db", "child", fkData) + require.Contains(t, sql, "('fk_child_parent','1','child_db','0','child','0','child_first'") + require.Contains(t, sql, "('fk_child_parent','2','child_db','0','child','0','child_second'") + require.Contains(t, GetSqlForFkReferredTo("parent_db", "parent"), + "order by db_name, table_name, constraint_name, constraint_id") +} + +func TestGetSqlForAddFkStoresDefaultActionsAsNoAction(t *testing.T) { + fkData := &FkData{ + Def: &plan.ForeignKeyDef{ + Name: "fk_default_action", + OnDelete: plan.ForeignKeyDef_RESTRICT, + OnUpdate: plan.ForeignKeyDef_RESTRICT, + OnDeleteOrigin: plan.ForeignKeyDef_ACTION_ORIGIN_DEFAULT, + OnUpdateOrigin: plan.ForeignKeyDef_ACTION_ORIGIN_DEFAULT, + }, + Cols: &plan.FkColName{Cols: []string{"child_id"}}, + ColsReferred: &plan.FkColName{Cols: []string{"parent_id"}}, + ParentDbName: "parent_db", + ParentTableName: "parent", + } + + sql := getSqlForAddFk("child_db", "child", fkData) + require.Contains(t, sql, "'NO_ACTION','NO_ACTION'") + require.Contains(t, sql, "'ACTION_ORIGIN_DEFAULT','ACTION_ORIGIN_DEFAULT'") +} + +func TestGetSqlForUpdateFkReferencedIndexEscapesCatalogValues(t *testing.T) { + require.Equal(t, + "update `mo_catalog`.`mo_foreign_keys` set referenced_index_name = 'uk\\'parent' where db_name = 'child\\'db' and table_name = 'child\\\\table' and constraint_name = 'fk\\'child'", + getSqlForUpdateFkReferencedIndex("child'db", `child\table`, "fk'child", "uk'parent"), + ) +} + func TestGetSqlForCheckHasDBRefersToEscapesStringLiterals(t *testing.T) { sql := getSqlForCheckHasDBRefersTo("db'name") require.Contains(t, sql, "refer_db_name = 'db\\'name'") @@ -130,9 +226,9 @@ func TestGetSqlForAddFkEscapesCatalogValues(t *testing.T) { } require.Equal(t, - "insert into `mo_catalog`.`mo_foreign_keys` values "+ - "('fk\\\\name\\'one','0','child\\'db\\\\part','0','child\\\\table\\'name','0','child\\\\col\\'name','0','parent\\\\db\\'name','0','parent\\\\table\\'name','0','parent\\\\col\\'name','0','CASCADE','RESTRICT'),"+ - "('fk\\\\name\\'one','0','child\\'db\\\\part','0','child\\\\table\\'name','0','child_col_two','0','parent\\\\db\\'name','0','parent\\\\table\\'name','0','parent_col_two','0','CASCADE','RESTRICT')", + "insert into `mo_catalog`.`mo_foreign_keys` (constraint_name, constraint_id, db_name, db_id, table_name, table_id, column_name, column_id, refer_db_name, refer_db_id, refer_table_name, refer_table_id, refer_column_name, refer_column_id, on_delete, on_update, referenced_index_name, on_delete_origin, on_update_origin) values "+ + "('fk\\\\name\\'one','1','child\\'db\\\\part','0','child\\\\table\\'name','0','child\\\\col\\'name','0','parent\\\\db\\'name','0','parent\\\\table\\'name','0','parent\\\\col\\'name','0','CASCADE','RESTRICT','','ACTION_ORIGIN_EXPLICIT','ACTION_ORIGIN_EXPLICIT'),"+ + "('fk\\\\name\\'one','2','child\\'db\\\\part','0','child\\\\table\\'name','0','child_col_two','0','parent\\\\db\\'name','0','parent\\\\table\\'name','0','parent_col_two','0','CASCADE','RESTRICT','','ACTION_ORIGIN_EXPLICIT','ACTION_ORIGIN_EXPLICIT')", getSqlForAddFk(`child'db\part`, `child\table'name`, fk), ) } diff --git a/pkg/sql/plan/deepcopy.go b/pkg/sql/plan/deepcopy.go index 4d9b059937cd2..b5cc3b1210f0e 100644 --- a/pkg/sql/plan/deepcopy.go +++ b/pkg/sql/plan/deepcopy.go @@ -909,12 +909,15 @@ func DeepCopyDataDefinition(old *plan.DataDefinition) *plan.DataDefinition { func DeepCopyFkey(fkey *ForeignKeyDef) *ForeignKeyDef { def := &ForeignKeyDef{ - Name: fkey.Name, - Cols: slices.Clone(fkey.Cols), - ForeignTbl: fkey.ForeignTbl, - ForeignCols: slices.Clone(fkey.ForeignCols), - OnDelete: fkey.OnDelete, - OnUpdate: fkey.OnUpdate, + Name: fkey.Name, + Cols: slices.Clone(fkey.Cols), + ForeignTbl: fkey.ForeignTbl, + ForeignCols: slices.Clone(fkey.ForeignCols), + OnDelete: fkey.OnDelete, + OnUpdate: fkey.OnUpdate, + ReferencedIndexName: fkey.ReferencedIndexName, + OnDeleteOrigin: fkey.OnDeleteOrigin, + OnUpdateOrigin: fkey.OnUpdateOrigin, } return def } diff --git a/pkg/util/sysview/predefined.go b/pkg/util/sysview/predefined.go index b3f4afcc77fd9..60f2678f399b2 100644 --- a/pkg/util/sysview/predefined.go +++ b/pkg/util/sysview/predefined.go @@ -155,20 +155,21 @@ var ( // `information_schema` database // They are all Tenant level system tables/system views var ( - InformationSchemaKeyColumnUsageDDL = "CREATE TABLE information_schema.KEY_COLUMN_USAGE (" + - "CONSTRAINT_CATALOG varchar(64)," + - "CONSTRAINT_SCHEMA varchar(64)," + - "CONSTRAINT_NAME varchar(64)," + - "TABLE_CATALOG varchar(64)," + - "TABLE_SCHEMA varchar(64)," + - "TABLE_NAME varchar(64)," + - "COLUMN_NAME varchar(64)," + - "ORDINAL_POSITION int unsigned," + - "POSITION_IN_UNIQUE_CONSTRAINT int unsigned," + - "REFERENCED_TABLE_SCHEMA varchar(64)," + - "REFERENCED_TABLE_NAME varchar(64)," + - "REFERENCED_COLUMN_NAME varchar(64)" + - ")" + InformationSchemaKeyColumnUsageDDL = "CREATE VIEW information_schema.KEY_COLUMN_USAGE AS " + + "SELECT " + + "CAST('def' AS varchar(64)) AS CONSTRAINT_CATALOG, " + + "CAST(fk.db_name AS varchar(64)) AS CONSTRAINT_SCHEMA, " + + "CAST(fk.constraint_name AS varchar(64)) AS CONSTRAINT_NAME, " + + "CAST('def' AS varchar(64)) AS TABLE_CATALOG, " + + "CAST(fk.db_name AS varchar(64)) AS TABLE_SCHEMA, " + + "CAST(fk.table_name AS varchar(64)) AS TABLE_NAME, " + + "CAST(fk.column_name AS varchar(64)) AS COLUMN_NAME, " + + "CAST(fk.constraint_id AS int unsigned) AS ORDINAL_POSITION, " + + "CAST(fk.constraint_id AS int unsigned) AS POSITION_IN_UNIQUE_CONSTRAINT, " + + "CAST(fk.refer_db_name AS varchar(64)) AS REFERENCED_TABLE_SCHEMA, " + + "CAST(fk.refer_table_name AS varchar(64)) AS REFERENCED_TABLE_NAME, " + + "CAST(fk.refer_column_name AS varchar(64)) AS REFERENCED_COLUMN_NAME " + + "FROM mo_catalog.mo_foreign_keys fk" InformationSchemaColumnsDDL = fmt.Sprintf("CREATE VIEW information_schema.COLUMNS AS select "+ "'def' as TABLE_CATALOG,"+ @@ -409,20 +410,23 @@ var ( "where `tbl`.`account_id` = current_account_id() and %s", catalog.NonTemporaryTableSQLPredicate("tbl")) InformationSchemaReferentialConstraintsDDL = "CREATE VIEW information_schema.REFERENTIAL_CONSTRAINTS AS " + - "SELECT DISTINCT " + + "SELECT " + "'def' AS CONSTRAINT_CATALOG, " + "fk.db_name AS CONSTRAINT_SCHEMA, " + "fk.constraint_name AS CONSTRAINT_NAME, " + "'def' AS UNIQUE_CONSTRAINT_CATALOG, " + "fk.refer_db_name AS UNIQUE_CONSTRAINT_SCHEMA, " + - "idx.type AS UNIQUE_CONSTRAINT_NAME," + + "fk.referenced_index_name AS UNIQUE_CONSTRAINT_NAME," + "'NONE' AS MATCH_OPTION, " + - "fk.on_update AS UPDATE_RULE, " + - "fk.on_delete AS DELETE_RULE, " + + "replace(fk.on_update, '_', ' ') AS UPDATE_RULE, " + + "replace(fk.on_delete, '_', ' ') AS DELETE_RULE, " + "fk.table_name AS TABLE_NAME, " + "fk.refer_table_name AS REFERENCED_TABLE_NAME " + - "FROM mo_catalog.mo_foreign_keys fk " + - "JOIN mo_catalog.mo_indexes idx ON (fk.refer_column_name = idx.column_name)" + "FROM (" + + "SELECT db_name, table_name, constraint_name, refer_db_name, refer_table_name, on_update, on_delete, referenced_index_name " + + "FROM mo_catalog.mo_foreign_keys " + + "GROUP BY db_name, table_name, constraint_name, refer_db_name, refer_table_name, on_update, on_delete, referenced_index_name" + + ") fk" InformationSchemaEnginesDDL = "CREATE TABLE information_schema.ENGINES (" + "ENGINE varchar(64)," + diff --git a/pkg/util/sysview/predefined_test.go b/pkg/util/sysview/predefined_test.go index c4a041014f7d7..6b4a201541a00 100644 --- a/pkg/util/sysview/predefined_test.go +++ b/pkg/util/sysview/predefined_test.go @@ -15,12 +15,14 @@ package sysview import ( + "context" "strings" "testing" "github.com/stretchr/testify/assert" "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect/mysql" ) func TestInformationSchemaMetadataViewsHideTemporaryTables(t *testing.T) { @@ -64,6 +66,42 @@ func TestInformationSchemaColumnsDDL_UsesConnectorCompatibleDataType(t *testing. assert.Contains(t, InformationSchemaColumnsDDL, "else split_part(mo_show_visible_bin(mc.atttyp,2), ' ', 1) end) end) as DATA_TYPE") } +func TestInformationSchemaKeyColumnUsageDDL_ProjectsForeignKeyMappings(t *testing.T) { + assert.True(t, strings.HasPrefix(InformationSchemaKeyColumnUsageDDL, "CREATE VIEW information_schema.KEY_COLUMN_USAGE AS")) + for _, column := range []string{ + "CAST(fk.column_name AS varchar(64)) AS COLUMN_NAME", + "CAST(fk.refer_db_name AS varchar(64)) AS REFERENCED_TABLE_SCHEMA", + "CAST(fk.refer_table_name AS varchar(64)) AS REFERENCED_TABLE_NAME", + "CAST(fk.refer_column_name AS varchar(64)) AS REFERENCED_COLUMN_NAME", + "CAST(fk.constraint_id AS int unsigned) AS ORDINAL_POSITION", + } { + assert.Contains(t, InformationSchemaKeyColumnUsageDDL, column) + } +} + +func TestInformationSchemaReferentialConstraintsDDL_UsesMySQLDefaultAction(t *testing.T) { + assert.Contains(t, InformationSchemaReferentialConstraintsDDL, + "replace(fk.on_update, '_', ' ') AS UPDATE_RULE") + assert.Contains(t, InformationSchemaReferentialConstraintsDDL, + "replace(fk.on_delete, '_', ' ') AS DELETE_RULE") + assert.NotContains(t, InformationSchemaReferentialConstraintsDDL, "upper(fk.on_update)") + assert.Contains(t, InformationSchemaReferentialConstraintsDDL, + "fk.referenced_index_name AS UNIQUE_CONSTRAINT_NAME") + assert.Contains(t, InformationSchemaReferentialConstraintsDDL, + "referenced_index_name") + assert.NotContains(t, InformationSchemaReferentialConstraintsDDL, "mo_catalog.mo_indexes") + assert.NotContains(t, InformationSchemaReferentialConstraintsDDL, "group_concat") + assert.NotContains(t, InformationSchemaReferentialConstraintsDDL, "min(idx.type)") +} + +func TestInformationSchemaReferentialConstraintsDDL_Parses(t *testing.T) { + statements, err := mysql.Parse(context.Background(), InformationSchemaReferentialConstraintsDDL, 1) + assert.NoError(t, err) + for _, statement := range statements { + statement.Free() + } +} + func TestInformationSchemaCharacterSetsData(t *testing.T) { for _, expected := range []string{ "('binary','binary','Binary pseudo charset',1)", diff --git a/pkg/vm/engine/test/cdc_testutil.go b/pkg/vm/engine/test/cdc_testutil.go index 2c89cfaa0895e..86291e24f57b7 100644 --- a/pkg/vm/engine/test/cdc_testutil.go +++ b/pkg/vm/engine/test/cdc_testutil.go @@ -248,6 +248,9 @@ func mock_mo_foreign_keys( "`refer_column_id` bigint unsigned NOT NULL DEFAULT 0," + "`on_delete` varchar(128) NOT NULL," + "`on_update` varchar(128) NOT NULL," + + "`referenced_index_name` varchar(5000) NOT NULL DEFAULT ''," + + "`on_delete_origin` varchar(64) NOT NULL DEFAULT 'ACTION_ORIGIN_LEGACY_AMBIGUOUS'," + + "`on_update_origin` varchar(64) NOT NULL DEFAULT 'ACTION_ORIGIN_LEGACY_AMBIGUOUS'," + "PRIMARY KEY (`constraint_name`,`constraint_id`,`db_name`,`db_id`,`table_name`,`table_id`,`column_name`,`column_id`,`refer_db_name`,`refer_db_id`,`refer_table_name`,`refer_table_id`,`refer_column_name`,`refer_column_id`)" + ")" diff --git a/pkg/vm/engine/test/change_handle_test.go b/pkg/vm/engine/test/change_handle_test.go index 16840847ccc1f..d49c6b7149e4b 100644 --- a/pkg/vm/engine/test/change_handle_test.go +++ b/pkg/vm/engine/test/change_handle_test.go @@ -1835,6 +1835,10 @@ func TestISCPExecutor1(t *testing.T) { require.NoError(t, err) err = mock_mo_foreign_keys(disttaeEngine, ctxWithTimeout) require.NoError(t, err) + result, err := execSql(disttaeEngine, ctxWithTimeout, + "SELECT referenced_index_name, on_delete_origin, on_update_origin FROM mo_catalog.mo_foreign_keys") + require.NoError(t, err) + result.Close() err = mock_mo_intra_system_change_propagation_log(disttaeEngine, ctxWithTimeout) require.NoError(t, err) t.Log(taeHandler.GetDB().Catalog.SimplePPString(3)) diff --git a/proto/plan.proto b/proto/plan.proto index 9b12cefd5866f..96a496f8cc65f 100644 --- a/proto/plan.proto +++ b/proto/plan.proto @@ -370,6 +370,16 @@ message ForeignKeyDef { NO_ACTION = 4; } + // Whether a reference action was written in the FK declaration. This is + // persisted separately from RefAction because an omitted action and an + // explicit RESTRICT have the same execution behavior but distinct MySQL + // metadata/SHOW CREATE representations. + enum RefActionOrigin { + ACTION_ORIGIN_EXPLICIT = 0; + ACTION_ORIGIN_DEFAULT = 1; + ACTION_ORIGIN_LEGACY_AMBIGUOUS = 2; + } + // letter case: lower string name = 1; repeated uint64 cols = 2; @@ -379,6 +389,10 @@ message ForeignKeyDef { repeated uint64 foreign_cols = 4; RefAction on_delete = 5; RefAction on_update = 6; + // Exact PRIMARY/UNIQUE parent key selected when this FK was bound. + string referenced_index_name = 7; + RefActionOrigin on_delete_origin = 8; + RefActionOrigin on_update_origin = 9; } message CheckDef { diff --git a/test/distributed/cases/database/system_table.result b/test/distributed/cases/database/system_table.result index 0780d1cc4c182..756045f53b13d 100644 --- a/test/distributed/cases/database/system_table.result +++ b/test/distributed/cases/database/system_table.result @@ -1,296 +1,271 @@ SELECT table_catalog,table_schema,table_name,table_type from `information_schema`.`tables` where table_name = 'mo_tables'; -table_catalog table_schema table_name table_type -def mo_catalog mo_tables BASE TABLE +➤ table_catalog[12,3,0] ¦ table_schema[12,5000,0] ¦ table_name[12,5000,0] ¦ table_type[12,14,0] 𝄀 +def ¦ mo_catalog ¦ mo_tables ¦ BASE TABLE SELECT * FROM `information_schema`.`character_sets` LIMIT 0,1000; -character_set_name default_collate_name description maxlen -binary binary Binary pseudo charset 1 -utf8 utf8_bin UTF-8 Unicode 4 -utf8mb4 utf8mb4_bin UTF-8 Unicode 4 +➤ character_set_name[12,64,0] ¦ default_collate_name[12,64,0] ¦ description[12,2048,0] ¦ maxlen[4,32,0] 𝄀 +binary ¦ binary ¦ Binary pseudo charset ¦ 1 𝄀 +utf8 ¦ utf8_bin ¦ UTF-8 Unicode ¦ 4 𝄀 +utf8mb4 ¦ utf8mb4_bin ¦ UTF-8 Unicode ¦ 4 SELECT * FROM `information_schema`.`columns` where TABLE_NAME = 'mo_tables' order by ORDINAL_POSITION LIMIT 2; -table_catalog table_schema table_name column_name ordinal_position column_default is_nullable data_type character_maximum_length character_octet_length numeric_precision numeric_scale datetime_precision character_set_name collation_name column_type column_key extra privileges column_comment generation_expression srs_id -def mo_catalog mo_tables rel_id 1 null YES bigint null null null null null null null BIGINT UNSIGNED(0) select,insert,update,references null -def mo_catalog mo_tables relname 2 null YES varchar 5000 20000 null null null utf8 utf8_bin VARCHAR(5000) select,insert,update,references null +➤ TABLE_CATALOG[12,3,0] ¦ TABLE_SCHEMA[12,256,0] ¦ TABLE_NAME[12,256,0] ¦ COLUMN_NAME[12,256,0] ¦ ORDINAL_POSITION[4,32,0] ¦ COLUMN_DEFAULT[12,65535,0] ¦ IS_NULLABLE[12,3,0] ¦ DATA_TYPE[12,65535,0] ¦ CHARACTER_MAXIMUM_LENGTH[-5,64,0] ¦ CHARACTER_OCTET_LENGTH[-5,64,0] ¦ NUMERIC_PRECISION[-5,64,0] ¦ NUMERIC_SCALE[-5,64,0] ¦ DATETIME_PRECISION[-5,64,0] ¦ CHARACTER_SET_NAME[12,4,0] ¦ COLLATION_NAME[12,8,0] ¦ COLUMN_TYPE[12,65535,0] ¦ COLUMN_KEY[12,3,0] ¦ EXTRA[12,24,0] ¦ PRIVILEGES[12,31,0] ¦ COLUMN_COMMENT[12,2048,0] ¦ GENERATION_EXPRESSION[12,500,0] ¦ SRS_ID[-5,64,0] 𝄀 +def ¦ mo_catalog ¦ mo_tables ¦ rel_id ¦ 1 ¦ null ¦ YES ¦ bigint ¦ null ¦ null ¦ null ¦ null ¦ null ¦ null ¦ null ¦ BIGINT UNSIGNED(0) ¦ ¦ ¦ select,insert,update,references ¦ ¦ ¦ null 𝄀 +def ¦ mo_catalog ¦ mo_tables ¦ relname ¦ 2 ¦ null ¦ YES ¦ varchar ¦ 5000 ¦ 20000 ¦ null ¦ null ¦ null ¦ utf8 ¦ utf8_bin ¦ VARCHAR(5000) ¦ ¦ ¦ select,insert,update,references ¦ ¦ ¦ null SELECT * FROM `information_schema`.`key_column_usage` LIMIT 0,1000; -constraint_catalog constraint_schema constraint_name table_catalog table_schema table_name column_name ordinal_position position_in_unique_constraint referenced_table_schema referenced_table_name referenced_column_name +➤ CONSTRAINT_CATALOG[12,64,0] ¦ CONSTRAINT_SCHEMA[12,64,0] ¦ CONSTRAINT_NAME[12,64,0] ¦ TABLE_CATALOG[12,64,0] ¦ TABLE_SCHEMA[12,64,0] ¦ TABLE_NAME[12,64,0] ¦ COLUMN_NAME[12,64,0] ¦ ORDINAL_POSITION[4,32,0] ¦ POSITION_IN_UNIQUE_CONSTRAINT[4,32,0] ¦ REFERENCED_TABLE_SCHEMA[12,64,0] ¦ REFERENCED_TABLE_NAME[12,64,0] ¦ REFERENCED_COLUMN_NAME[12,64,0] SELECT * FROM `information_schema`.`profiling` LIMIT 0,1000; -query_id seq state duration cpu_user cpu_system context_voluntary context_involuntary block_ops_in block_ops_out messages_sent messages_received page_faults_major page_faults_minor swaps source_function source_file source_line +➤ query_id[4,32,0] ¦ seq[4,32,0] ¦ state[12,30,0] ¦ duration[3,9,6] ¦ cpu_user[3,9,6] ¦ cpu_system[3,9,6] ¦ context_voluntary[4,32,0] ¦ context_involuntary[4,32,0] ¦ block_ops_in[4,32,0] ¦ block_ops_out[4,32,0] ¦ messages_sent[4,32,0] ¦ messages_received[4,32,0] ¦ page_faults_major[4,32,0] ¦ page_faults_minor[4,32,0] ¦ swaps[4,32,0] ¦ source_function[12,30,0] ¦ source_file[12,20,0] ¦ source_line[4,32,0] SELECT * FROM `information_schema`.`schemata` where schema_name = 'information_schema'; -catalog_name schema_name default_character_set_name default_collation_name sql_path default_encryption -def information_schema utf8mb4 utf8mb4_0900_ai_ci null NO +➤ CATALOG_NAME[12,3,0] ¦ SCHEMA_NAME[12,5000,0] ¦ DEFAULT_CHARACTER_SET_NAME[12,7,0] ¦ DEFAULT_COLLATION_NAME[12,18,0] ¦ SQL_PATH[1,0,0] ¦ DEFAULT_ENCRYPTION[12,3,0] 𝄀 +def ¦ information_schema ¦ utf8mb4 ¦ utf8mb4_0900_ai_ci ¦ null ¦ NO SELECT * FROM `information_schema`.`triggers` LIMIT 0,1000; -trigger_catalog trigger_schema trigger_name event_manipulation event_object_catalog event_object_schema event_object_table action_order action_condition action_statement action_orientation action_timing action_reference_old_table action_reference_new_table action_reference_old_row action_reference_new_row created sql_mode definer character_set_client collation_connection database_collation +➤ trigger_catalog[12,64,0] ¦ trigger_schema[12,64,0] ¦ trigger_name[12,64,0] ¦ event_manipulation[12,10,0] ¦ event_object_catalog[12,64,0] ¦ event_object_schema[12,64,0] ¦ event_object_table[12,64,0] ¦ action_order[4,32,0] ¦ action_condition[12,0,0] ¦ action_statement[12,0,0] ¦ action_orientation[12,3,0] ¦ action_timing[12,10,0] ¦ action_reference_old_table[12,0,0] ¦ action_reference_new_table[12,0,0] ¦ action_reference_old_row[12,3,0] ¦ action_reference_new_row[12,3,0] ¦ created[93,64,0] ¦ sql_mode[12,10,0] ¦ definer[12,288,0] ¦ character_set_client[12,64,0] ¦ collation_connection[12,64,0] ¦ database_collation[12,64,0] SELECT * FROM `information_schema`.`user_privileges` LIMIT 0,1000; -grantee table_catalog privilege_type is_grantable +➤ grantee[12,292,0] ¦ table_catalog[12,512,0] ¦ privilege_type[12,64,0] ¦ is_grantable[12,3,0] SELECT TABLE_SCHEMA AS TABLE_CAT, NULL AS TABLE_SCHEM, TABLE_NAME, NON_UNIQUE, NULL AS INDEX_QUALIFIER, INDEX_NAME,3 AS TYPE, SEQ_IN_INDEX AS ORDINAL_POSITION, COLUMN_NAME,COLLATION AS ASC_OR_DESC, CARDINALITY, 0 AS PAGES, NULL AS FILTER_CONDITION FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'procs_priv' ORDER BY NON_UNIQUE, INDEX_NAME, SEQ_IN_INDEX limit 1; -TABLE_CAT TABLE_SCHEM TABLE_NAME NON_UNIQUE INDEX_QUALIFIER INDEX_NAME TYPE ORDINAL_POSITION COLUMN_NAME ASC_OR_DESC CARDINALITY PAGES FILTER_CONDITION -mysql null procs_priv 0 null PRIMARY 3 1 Host A 0 0 null +➤ TABLE_CAT[12,5000,0] ¦ TABLE_SCHEM[12,4,0] ¦ TABLE_NAME[12,5000,0] ¦ NON_UNIQUE[-5,64,0] ¦ INDEX_QUALIFIER[12,4,0] ¦ INDEX_NAME[12,64,0] ¦ TYPE[-5,64,0] ¦ ORDINAL_POSITION[4,32,0] ¦ COLUMN_NAME[12,256,0] ¦ ASC_OR_DESC[12,1,0] ¦ CARDINALITY[-5,64,0] ¦ PAGES[-5,64,0] ¦ FILTER_CONDITION[12,4,0] 𝄀 +mysql ¦ null ¦ procs_priv ¦ 0 ¦ null ¦ PRIMARY ¦ 3 ¦ 1 ¦ Host ¦ A ¦ 0 ¦ 0 ¦ null SELECT * FROM `mysql`.`columns_priv` LIMIT 0,1000; -host db user table_name column_name timestamp column_priv +➤ host[1,255,0] ¦ db[1,64,0] ¦ user[1,32,0] ¦ table_name[1,64,0] ¦ column_name[1,64,0] ¦ timestamp[93,64,0] ¦ column_priv[12,10,0] SELECT * FROM `mysql`.`db` LIMIT 0,1000; -host db user select_priv insert_priv update_priv delete_priv create_priv drop_priv grant_priv references_priv index_priv alter_priv create_tmp_table_priv lock_tables_priv create_view_priv show_view_priv create_routine_priv alter_routine_priv execute_priv event_priv trigger_priv +➤ host[1,255,0] ¦ db[1,64,0] ¦ user[1,32,0] ¦ select_priv[12,10,0] ¦ insert_priv[12,10,0] ¦ update_priv[12,10,0] ¦ delete_priv[12,10,0] ¦ create_priv[12,10,0] ¦ drop_priv[12,10,0] ¦ grant_priv[12,10,0] ¦ references_priv[12,10,0] ¦ index_priv[12,10,0] ¦ alter_priv[12,10,0] ¦ create_tmp_table_priv[12,10,0] ¦ lock_tables_priv[12,10,0] ¦ create_view_priv[12,10,0] ¦ show_view_priv[12,10,0] ¦ create_routine_priv[12,10,0] ¦ alter_routine_priv[12,10,0] ¦ execute_priv[12,10,0] ¦ event_priv[12,10,0] ¦ trigger_priv[12,10,0] SELECT * FROM `mysql`.`procs_priv` LIMIT 0,1000; -host db user routine_name routine_type grantor proc_priv timestamp +➤ host[1,255,0] ¦ db[1,64,0] ¦ user[1,32,0] ¦ routine_name[1,64,0] ¦ routine_type[12,10,0] ¦ grantor[12,288,0] ¦ proc_priv[12,10,0] ¦ timestamp[93,64,0] SELECT * FROM `mysql`.`tables_priv` LIMIT 0,1000; -host db user table_name grantor timestamp table_priv column_priv +➤ host[1,255,0] ¦ db[1,64,0] ¦ user[1,32,0] ¦ table_name[1,64,0] ¦ grantor[12,288,0] ¦ timestamp[93,64,0] ¦ table_priv[12,10,0] ¦ column_priv[12,10,0] SELECT * FROM `mysql`.`user` LIMIT 0,1000; -host user select_priv insert_priv update_priv delete_priv create_priv drop_priv reload_priv shutdown_priv process_priv file_priv grant_priv references_priv index_priv alter_priv show_db_priv super_priv create_tmp_table_priv lock_tables_priv execute_priv repl_slave_priv repl_client_priv create_view_priv show_view_priv create_routine_priv alter_routine_priv create_user_priv event_priv trigger_priv create_tablespace_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connections max_user_connections plugin authentication_string password_expired password_last_changed password_lifetime account_locked create_role_priv drop_role_priv password_reuse_history password_reuse_time password_require_current user_attributes +➤ host[1,255,0] ¦ user[1,32,0] ¦ select_priv[12,10,0] ¦ insert_priv[12,10,0] ¦ update_priv[12,10,0] ¦ delete_priv[12,10,0] ¦ create_priv[12,10,0] ¦ drop_priv[12,10,0] ¦ reload_priv[12,10,0] ¦ shutdown_priv[12,10,0] ¦ process_priv[12,10,0] ¦ file_priv[12,10,0] ¦ grant_priv[12,10,0] ¦ references_priv[12,10,0] ¦ index_priv[12,10,0] ¦ alter_priv[12,10,0] ¦ show_db_priv[12,10,0] ¦ super_priv[12,10,0] ¦ create_tmp_table_priv[12,10,0] ¦ lock_tables_priv[12,10,0] ¦ execute_priv[12,10,0] ¦ repl_slave_priv[12,10,0] ¦ repl_client_priv[12,10,0] ¦ create_view_priv[12,10,0] ¦ show_view_priv[12,10,0] ¦ create_routine_priv[12,10,0] ¦ alter_routine_priv[12,10,0] ¦ create_user_priv[12,10,0] ¦ event_priv[12,10,0] ¦ trigger_priv[12,10,0] ¦ create_tablespace_priv[12,10,0] ¦ ssl_type[12,10,0] ¦ ssl_cipher[12,0,0] ¦ x509_issuer[12,0,0] ¦ x509_subject[12,0,0] ¦ max_questions[4,32,0] ¦ max_updates[4,32,0] ¦ max_connections[4,32,0] ¦ max_user_connections[4,32,0] ¦ plugin[1,64,0] ¦ authentication_string[12,0,0] ¦ password_expired[12,10,0] ¦ password_last_changed[93,64,0] ¦ password_lifetime[5,16,0] ¦ account_locked[12,10,0] ¦ create_role_priv[12,10,0] ¦ drop_role_priv[12,10,0] ¦ password_reuse_history[5,16,0] ¦ password_reuse_time[5,16,0] ¦ password_require_current[12,10,0] ¦ user_attributes[-1,2147483647,0] use mysql; show tables; -Tables_in_mysql -columns_priv -db -procs_priv -role_edges -tables_priv +➤ Tables_in_mysql[12,5000,0] 𝄀 +columns_priv 𝄀 +db 𝄀 +procs_priv 𝄀 +role_edges 𝄀 +tables_priv 𝄀 user show columns from `db`; -Field Type Null Key Default Extra Comment -Host CHAR(255) NO PRI -Db CHAR(64) NO PRI -User CHAR(32) NO PRI -Select_priv VARCHAR(10) NO N -Insert_priv VARCHAR(10) NO N -Update_priv VARCHAR(10) NO N -Delete_priv VARCHAR(10) NO N -Create_priv VARCHAR(10) NO N -Drop_priv VARCHAR(10) NO N -Grant_priv VARCHAR(10) NO N -References_priv VARCHAR(10) NO N -Index_priv VARCHAR(10) NO N -Alter_priv VARCHAR(10) NO N -Create_tmp_table_priv VARCHAR(10) NO N -Lock_tables_priv VARCHAR(10) NO N -Create_view_priv VARCHAR(10) NO N -Show_view_priv VARCHAR(10) NO N -Create_routine_priv VARCHAR(10) NO N -Alter_routine_priv VARCHAR(10) NO N -Execute_priv VARCHAR(10) NO N -Event_priv VARCHAR(10) NO N -Trigger_priv VARCHAR(10) NO N +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +Host ¦ CHAR(255) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Db ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +User ¦ CHAR(32) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Select_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Insert_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Update_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Delete_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Create_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Drop_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Grant_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +References_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Index_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Alter_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Create_tmp_table_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Lock_tables_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Create_view_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Show_view_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Create_routine_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Alter_routine_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Execute_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Event_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Trigger_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ show columns from `procs_priv`; -Field Type Null Key Default Extra Comment -Host CHAR(255) NO PRI -Db CHAR(64) NO PRI -User CHAR(32) NO PRI -Routine_name CHAR(64) NO PRI -Routine_type VARCHAR(10) NO PRI null -Grantor VARCHAR(288) NO MUL -Proc_priv VARCHAR(10) NO -Timestamp TIMESTAMP(0) NO CURRENT_TIMESTAMP() +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +Host ¦ CHAR(255) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Db ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +User ¦ CHAR(32) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Routine_name ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Routine_type ¦ VARCHAR(10) ¦ NO ¦ PRI ¦ null ¦ ¦ 𝄀 +Grantor ¦ VARCHAR(288) ¦ NO ¦ MUL ¦ ¦ ¦ 𝄀 +Proc_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +Timestamp ¦ TIMESTAMP(0) ¦ NO ¦ ¦ CURRENT_TIMESTAMP() ¦ ¦ show columns from `columns_priv`; -Field Type Null Key Default Extra Comment -Host CHAR(255) NO PRI -Db CHAR(64) NO PRI -User CHAR(32) NO PRI -Table_name CHAR(64) NO PRI -Column_name CHAR(64) NO PRI -Timestamp TIMESTAMP(0) NO CURRENT_TIMESTAMP() -Column_priv VARCHAR(10) NO +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +Host ¦ CHAR(255) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Db ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +User ¦ CHAR(32) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Table_name ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Column_name ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Timestamp ¦ TIMESTAMP(0) ¦ NO ¦ ¦ CURRENT_TIMESTAMP() ¦ ¦ 𝄀 +Column_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ ¦ ¦ show columns from `tables_priv`; -Field Type Null Key Default Extra Comment -Host CHAR(255) NO PRI -Db CHAR(64) NO PRI -User CHAR(32) NO PRI -Table_name CHAR(64) NO PRI -Grantor VARCHAR(288) NO MUL -Timestamp TIMESTAMP(0) NO CURRENT_TIMESTAMP() -Table_priv VARCHAR(10) NO -Column_priv VARCHAR(10) NO +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +Host ¦ CHAR(255) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Db ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +User ¦ CHAR(32) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Table_name ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Grantor ¦ VARCHAR(288) ¦ NO ¦ MUL ¦ ¦ ¦ 𝄀 +Timestamp ¦ TIMESTAMP(0) ¦ NO ¦ ¦ CURRENT_TIMESTAMP() ¦ ¦ 𝄀 +Table_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +Column_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ ¦ ¦ use information_schema; show tables; -Tables_in_information_schema -character_sets -collations -column_privileges -columns -engines -events -files -key_column_usage -keywords -parameters -partitions -processlist -profiling -referential_constraints -routines -schema_privileges -schemata -statistics -table_constraints -table_privileges -tables -triggers -user_privileges +➤ Tables_in_information_schema[12,5000,0] 𝄀 +character_sets 𝄀 +collations 𝄀 +column_privileges 𝄀 +columns 𝄀 +engines 𝄀 +events 𝄀 +files 𝄀 +key_column_usage 𝄀 +keywords 𝄀 +parameters 𝄀 +partitions 𝄀 +processlist 𝄀 +profiling 𝄀 +referential_constraints 𝄀 +routines 𝄀 +schema_privileges 𝄀 +schemata 𝄀 +statistics 𝄀 +table_constraints 𝄀 +table_privileges 𝄀 +tables 𝄀 +triggers 𝄀 +user_privileges 𝄀 views show columns from `KEY_COLUMN_USAGE`; -Field Type Null Key Default Extra Comment -CONSTRAINT_CATALOG VARCHAR(64) YES null -CONSTRAINT_SCHEMA VARCHAR(64) YES null -CONSTRAINT_NAME VARCHAR(64) YES null -TABLE_CATALOG VARCHAR(64) YES null -TABLE_SCHEMA VARCHAR(64) YES null -TABLE_NAME VARCHAR(64) YES null -COLUMN_NAME VARCHAR(64) YES null -ORDINAL_POSITION INT UNSIGNED(32) YES null -POSITION_IN_UNIQUE_CONSTRAINT INT UNSIGNED(32) YES null -REFERENCED_TABLE_SCHEMA VARCHAR(64) YES null -REFERENCED_TABLE_NAME VARCHAR(64) YES null -REFERENCED_COLUMN_NAME VARCHAR(64) YES null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +constraint_catalog ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +constraint_schema ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +constraint_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_catalog ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_schema ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +column_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +ordinal_position ¦ INT UNSIGNED(32) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +position_in_unique_constraint ¦ INT UNSIGNED(32) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_table_schema ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_table_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_column_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ show columns from `COLUMNS`; -Field Type Null Key Default Extra Comment -table_catalog VARCHAR(3) NO null -table_schema VARCHAR(256) YES null -table_name VARCHAR(256) YES null -column_name VARCHAR(256) YES null -ordinal_position INT(0) YES null -column_default VARCHAR(65535) YES null -is_nullable VARCHAR(3) YES null -data_type VARCHAR(65535) YES null -character_maximum_length BIGINT(0) YES null -character_octet_length BIGINT(0) YES null -numeric_precision BIGINT(0) YES null -numeric_scale BIGINT(0) YES null -datetime_precision BIGINT(0) YES null -character_set_name VARCHAR(4) YES null -collation_name VARCHAR(8) YES null -column_type VARCHAR(65535) YES null -column_key VARCHAR(3) YES null -extra VARCHAR(24) YES null -privileges VARCHAR(31) NO null -column_comment VARCHAR(2048) YES null -generation_expression VARCHAR(500) YES null -srs_id BIGINT(0) YES null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +table_catalog ¦ VARCHAR(3) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_schema ¦ VARCHAR(256) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +table_name ¦ VARCHAR(256) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +column_name ¦ VARCHAR(256) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ordinal_position ¦ INT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +column_default ¦ VARCHAR(65535) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +is_nullable ¦ VARCHAR(3) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +data_type ¦ VARCHAR(65535) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +character_maximum_length ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +character_octet_length ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +numeric_precision ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +numeric_scale ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +datetime_precision ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +character_set_name ¦ VARCHAR(4) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +collation_name ¦ VARCHAR(8) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +column_type ¦ VARCHAR(65535) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +column_key ¦ VARCHAR(3) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +extra ¦ VARCHAR(24) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +privileges ¦ VARCHAR(31) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +column_comment ¦ VARCHAR(2048) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +generation_expression ¦ VARCHAR(500) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +srs_id ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ show columns from `PROFILING`; -Field Type Null Key Default Extra Comment -QUERY_ID INT(32) NO 0 -SEQ INT(32) NO 0 -STATE VARCHAR(30) NO -DURATION DECIMAL(9,6) NO 0.000000 -CPU_USER DECIMAL(9,6) YES null -CPU_SYSTEM DECIMAL(9,6) YES null -CONTEXT_VOLUNTARY INT(32) YES null -CONTEXT_INVOLUNTARY INT(32) YES null -BLOCK_OPS_IN INT(32) YES null -BLOCK_OPS_OUT INT(32) YES null -MESSAGES_SENT INT(32) YES null -MESSAGES_RECEIVED INT(32) YES null -PAGE_FAULTS_MAJOR INT(32) YES null -PAGE_FAULTS_MINOR INT(32) YES null -SWAPS INT(32) YES null -SOURCE_FUNCTION VARCHAR(30) YES null -SOURCE_FILE VARCHAR(20) YES null -SOURCE_LINE INT(32) YES null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +QUERY_ID ¦ INT(32) ¦ NO ¦ ¦ 0 ¦ ¦ 𝄀 +SEQ ¦ INT(32) ¦ NO ¦ ¦ 0 ¦ ¦ 𝄀 +STATE ¦ VARCHAR(30) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +DURATION ¦ DECIMAL(9,6) ¦ NO ¦ ¦ 0.000000 ¦ ¦ 𝄀 +CPU_USER ¦ DECIMAL(9,6) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +CPU_SYSTEM ¦ DECIMAL(9,6) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +CONTEXT_VOLUNTARY ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +CONTEXT_INVOLUNTARY ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +BLOCK_OPS_IN ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +BLOCK_OPS_OUT ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +MESSAGES_SENT ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +MESSAGES_RECEIVED ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +PAGE_FAULTS_MAJOR ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +PAGE_FAULTS_MINOR ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +SWAPS ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +SOURCE_FUNCTION ¦ VARCHAR(30) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +SOURCE_FILE ¦ VARCHAR(20) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +SOURCE_LINE ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ show columns from `USER_PRIVILEGES`; -Field Type Null Key Default Extra Comment -GRANTEE VARCHAR(292) NO -TABLE_CATALOG VARCHAR(512) NO -PRIVILEGE_TYPE VARCHAR(64) NO -IS_GRANTABLE VARCHAR(3) NO +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +GRANTEE ¦ VARCHAR(292) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +TABLE_CATALOG ¦ VARCHAR(512) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +PRIVILEGE_TYPE ¦ VARCHAR(64) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +IS_GRANTABLE ¦ VARCHAR(3) ¦ NO ¦ ¦ ¦ ¦ show columns from `SCHEMATA`; -Field Type Null Key Default Extra Comment -catalog_name VARCHAR(3) NO null -schema_name VARCHAR(5000) YES null -default_character_set_name VARCHAR(7) NO null -default_collation_name VARCHAR(18) NO null -sql_path CHAR(0) YES null -default_encryption VARCHAR(3) NO null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +catalog_name ¦ VARCHAR(3) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +schema_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +default_character_set_name ¦ VARCHAR(7) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +default_collation_name ¦ VARCHAR(18) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +sql_path ¦ CHAR(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +default_encryption ¦ VARCHAR(3) ¦ NO ¦ ¦ null ¦ ¦ show columns from `CHARACTER_SETS`; -Field Type Null Key Default Extra Comment -CHARACTER_SET_NAME VARCHAR(64) YES null -DEFAULT_COLLATE_NAME VARCHAR(64) YES null -DESCRIPTION VARCHAR(2048) YES null -MAXLEN INT UNSIGNED(32) YES null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +CHARACTER_SET_NAME ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +DEFAULT_COLLATE_NAME ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +DESCRIPTION ¦ VARCHAR(2048) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +MAXLEN ¦ INT UNSIGNED(32) ¦ YES ¦ ¦ null ¦ ¦ show columns from `TRIGGERS`; -Field Type Null Key Default Extra Comment -TRIGGER_CATALOG VARCHAR(64) YES null -TRIGGER_SCHEMA VARCHAR(64) YES null -TRIGGER_NAME VARCHAR(64) YES null -EVENT_MANIPULATION VARCHAR(10) YES null -EVENT_OBJECT_CATALOG VARCHAR(64) YES null -EVENT_OBJECT_SCHEMA VARCHAR(64) YES null -EVENT_OBJECT_TABLE VARCHAR(64) YES null -ACTION_ORDER INT UNSIGNED(32) YES null -ACTION_CONDITION BINARY(0) YES null -ACTION_STATEMENT TEXT(0) YES null -ACTION_ORIENTATION VARCHAR(3) YES null -ACTION_TIMING VARCHAR(10) YES null -ACTION_REFERENCE_OLD_TABLE BINARY(0) YES null -ACTION_REFERENCE_NEW_TABLE BINARY(0) YES null -ACTION_REFERENCE_OLD_ROW VARCHAR(3) YES null -ACTION_REFERENCE_NEW_ROW VARCHAR(3) YES null -CREATED TIMESTAMP(2) YES null -SQL_MODE VARCHAR(10) YES null -DEFINER VARCHAR(288) YES null -CHARACTER_SET_CLIENT VARCHAR(64) YES null -COLLATION_CONNECTION VARCHAR(64) YES null -DATABASE_COLLATION VARCHAR(64) YES null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +TRIGGER_CATALOG ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +TRIGGER_SCHEMA ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +TRIGGER_NAME ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +EVENT_MANIPULATION ¦ VARCHAR(10) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +EVENT_OBJECT_CATALOG ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +EVENT_OBJECT_SCHEMA ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +EVENT_OBJECT_TABLE ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_ORDER ¦ INT UNSIGNED(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_CONDITION ¦ BINARY(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_STATEMENT ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_ORIENTATION ¦ VARCHAR(3) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_TIMING ¦ VARCHAR(10) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_REFERENCE_OLD_TABLE ¦ BINARY(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_REFERENCE_NEW_TABLE ¦ BINARY(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_REFERENCE_OLD_ROW ¦ VARCHAR(3) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_REFERENCE_NEW_ROW ¦ VARCHAR(3) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +CREATED ¦ TIMESTAMP(2) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +SQL_MODE ¦ VARCHAR(10) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +DEFINER ¦ VARCHAR(288) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +CHARACTER_SET_CLIENT ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +COLLATION_CONNECTION ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +DATABASE_COLLATION ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ show columns from `TABLES`; -Field Type Null Key Default Extra Comment -table_catalog VARCHAR(3) NO null -table_schema VARCHAR(5000) YES null -table_name VARCHAR(5000) YES null -table_type VARCHAR(14) YES null -engine VARCHAR(3) YES null -version BIGINT(0) YES null -row_format VARCHAR(10) NO null -table_rows BIGINT(0) YES null -avg_row_length BIGINT(0) YES null -data_length BIGINT(0) YES null -max_data_length BIGINT(0) YES null -index_length BIGINT(0) YES null -data_free BIGINT(0) YES null -auto_increment BIGINT UNSIGNED(0) YES null -create_time TIMESTAMP(0) YES null -update_time TIMESTAMP(0) YES null -check_time TIMESTAMP(0) YES null -table_collation VARCHAR(18) NO null -checksum BIGINT(0) YES null -create_options VARCHAR(256) YES null -table_comment TEXT(0) YES null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +table_catalog ¦ VARCHAR(3) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_schema ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +table_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +table_type ¦ VARCHAR(14) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +engine ¦ VARCHAR(3) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +version ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +row_format ¦ VARCHAR(10) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_rows ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +avg_row_length ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +data_length ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +max_data_length ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +index_length ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +data_free ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +auto_increment ¦ BIGINT UNSIGNED(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +create_time ¦ TIMESTAMP(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +update_time ¦ TIMESTAMP(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +check_time ¦ TIMESTAMP(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +table_collation ¦ VARCHAR(18) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +checksum ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +create_options ¦ VARCHAR(256) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +table_comment ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ show columns from `PARTITIONS`; -Field Type Null Key Default Extra Comment -table_catalog VARCHAR(3) NO null -table_schema VARCHAR(5000) YES null -table_name VARCHAR(5000) YES null -partition_name VARCHAR(64) YES null -subpartition_name TEXT(4) YES null -partition_ordinal_position SMALLINT UNSIGNED(16) YES null -subpartition_ordinal_position TEXT(4) YES null -partition_method VARCHAR(13) YES null -subpartition_method TEXT(4) YES null -partition_expression VARCHAR(2048) YES null -subpartition_expression TEXT(4) YES null -partition_description TEXT(0) YES null -table_rows BIGINT(0) YES null -avg_row_length BIGINT(0) NO null -data_length BIGINT(0) YES null -max_data_length BIGINT(0) NO null -index_length BIGINT(0) NO null -data_free BIGINT(0) NO null -create_time TIMESTAMP(0) YES null -update_time TEXT(4) YES null -check_time TEXT(4) YES null -checksum TEXT(4) YES null -partition_comment VARCHAR(2048) NO null -nodegroup VARCHAR(7) NO null -tablespace_name TEXT(4) YES null +[unknown result because it is related to issue#16438] use mo_catalog; show columns from `mo_data_key`; -Field Type Null Key Default Extra Comment -account_id BIGINT UNSIGNED(64) NO PRI null -key_id UUID(0) NO PRI null -encrypted_key VARCHAR(128) YES null -create_time TIMESTAMP(0) NO current_timestamp() -update_time TIMESTAMP(0) NO current_timestamp() +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +account_id ¦ BIGINT UNSIGNED(64) ¦ NO ¦ PRI ¦ null ¦ ¦ 𝄀 +key_id ¦ UUID(0) ¦ NO ¦ PRI ¦ null ¦ ¦ 𝄀 +encrypted_key ¦ VARCHAR(128) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +create_time ¦ TIMESTAMP(0) ¦ NO ¦ ¦ current_timestamp() ¦ ¦ 𝄀 +update_time ¦ TIMESTAMP(0) ¦ NO ¦ ¦ current_timestamp() ¦ ¦ drop database if exists test; create database test; use test; drop table if exists t2; create table t2(b int, a int); desc t2; -Field Type Null Key Default Extra Comment -b INT(32) YES null -a INT(32) YES null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +b ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +a ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ drop table t2; drop database test; diff --git a/test/distributed/cases/foreign_key/fk_base.result b/test/distributed/cases/foreign_key/fk_base.result index c7c4b0b2b6b88..4233c0a4650a5 100644 --- a/test/distributed/cases/foreign_key/fk_base.result +++ b/test/distributed/cases/foreign_key/fk_base.result @@ -8,9 +8,9 @@ create table c1 (a int, b int, foreign key f_a(a) references f2(aa)); internal error: type of reference column 'aa' is not match for column 'a' create table c1 (a int, b int, foreign key f_a(a) references f1(a)); select * from f1; -a b +➤ b[4,32,0] ¦ a[4,32,0] select * from c1; -a b +➤ a[4,32,0] ¦ b[4,32,0] drop table f1; internal error: can not drop table 'f1' referenced by some foreign key constraint truncate f1; @@ -32,18 +32,18 @@ create table c1 (a int, b int, foreign key f_a(a) references f1(a) on delete set insert into c1 values (1,1), (2,2), (3,3); delete from f1 where a > 1; select * from c1; -a b -1 1 -NULL 2 -NULL 3 +➤ a[4,32,0] ¦ b[4,32,0] 𝄀 +1 ¦ 1 𝄀 +null ¦ 2 𝄀 +null ¦ 3 drop table c1; insert into f1 values (2,2), (3,3); create table c1 (a int, b int, foreign key f_a(a) references f1(a) on delete cascade); insert into c1 values (1,1), (2,2), (3,3); delete from f1 where a > 1; select * from c1; -a b -1 1 +➤ a[4,32,0] ¦ b[4,32,0] 𝄀 +1 ¦ 1 drop table c1; drop table f1; create table f1(a int primary key, b int unique key); @@ -56,25 +56,25 @@ update c1 set a = 11 where b = 1; Cannot add or update a child row: a foreign key constraint fails update c1 set a = null where b = 1; select * from c1 order by b; -a b -NULL 1 -2 2 -3 3 +➤ a[4,32,0] ¦ b[4,32,0] 𝄀 +null ¦ 1 𝄀 +2 ¦ 2 𝄀 +3 ¦ 3 update c1 set a = 3 where b = 2; select * from c1 order by b; -a b -NULL 1 -3 2 -3 3 +➤ a[4,32,0] ¦ b[4,32,0] 𝄀 +null ¦ 1 𝄀 +3 ¦ 2 𝄀 +3 ¦ 3 drop table c1; create table c1 (a int, b int, foreign key f_a(a) references f1(a) on update set null); insert into c1 values (1,1), (2,2), (3,3); update f1 set a=11 where a=1; select * from c1 order by b; -a b -NULL 1 -2 2 -3 3 +➤ a[4,32,0] ¦ b[4,32,0] 𝄀 +null ¦ 1 𝄀 +2 ¦ 2 𝄀 +3 ¦ 3 drop table c1; drop table f1; create table f1(a int primary key, b int unique key); @@ -85,10 +85,10 @@ update f1 set a=0 where b>1; Duplicate entry '0' for key 'a' update f1 set a=0 where b=1; select * from c1 order by b; -a b -0 1 -2 2 -3 3 +➤ a[4,32,0] ¦ b[4,32,0] 𝄀 +0 ¦ 1 𝄀 +2 ¦ 2 𝄀 +3 ¦ 3 drop table c1; drop table f1; drop table if exists t_dept; @@ -127,21 +127,21 @@ update t_emp set deptId = 50 where salary < 1500; Cannot add or update a child row: a foreign key constraint fails update t_emp set deptId = null where salary < 1500; select * from t_emp order by salary; -id name deptid salary -7521 WARD null 1250.0 -1234 MEIXI null 1250.0 -7369 SMITH null 1300.0 -7499 ALLEN 30 1600.0 -7698 BLAKE 30 2850.0 -7782 CLARK 10 2950.0 -7566 JONES 20 3475.0 -7788 SCOTT 20 3500.0 +➤ id[4,32,0] ¦ name[12,-1,0] ¦ deptid[4,32,0] ¦ salary[7,24,0] 𝄀 +7521 ¦ WARD ¦ null ¦ 1250.0 𝄀 +1234 ¦ MEIXI ¦ null ¦ 1250.0 𝄀 +7369 ¦ SMITH ¦ null ¦ 1300.0 𝄀 +7499 ¦ ALLEN ¦ 30 ¦ 1600.0 𝄀 +7698 ¦ BLAKE ¦ 30 ¦ 2850.0 𝄀 +7782 ¦ CLARK ¦ 10 ¦ 2950.0 𝄀 +7566 ¦ JONES ¦ 20 ¦ 3475.0 𝄀 +7788 ¦ SCOTT ¦ 20 ¦ 3500.0 select * from t_dept; -id name location -10 ACCOUNTING NEW YORK -20 RESEARCH DALLAS -30 SALES CHICAGO -40 OPERATIONS BOSTON +➤ id[4,32,0] ¦ name[12,-1,0] ¦ location[12,-1,0] 𝄀 +10 ¦ ACCOUNTING ¦ NEW YORK 𝄀 +20 ¦ RESEARCH ¦ DALLAS 𝄀 +30 ¦ SALES ¦ CHICAGO 𝄀 +40 ¦ OPERATIONS ¦ BOSTON drop table t_emp; drop table t_dept; drop table if exists t_dept1; @@ -174,36 +174,36 @@ INSERT INTO t_emp1 VALUES (7782,'CLARK',10,2950.00); INSERT INTO t_emp1 VALUES (7788,'SCOTT',20,3500.00); update t_dept1 set id = 50 where name = 'ACCOUNTING'; select * from t_dept1; -id name location -20 RESEARCH DALLAS -30 SALES CHICAGO -40 OPERATIONS BOSTON -50 ACCOUNTING NEW YORK +➤ id[4,32,0] ¦ name[12,-1,0] ¦ location[12,-1,0] 𝄀 +20 ¦ RESEARCH ¦ DALLAS 𝄀 +30 ¦ SALES ¦ CHICAGO 𝄀 +40 ¦ OPERATIONS ¦ BOSTON 𝄀 +50 ¦ ACCOUNTING ¦ NEW YORK select * from t_emp1; -id name deptid salary -7369 SMITH 20 1300.0 -7499 ALLEN 30 1600.0 -7521 WARD 30 1250.0 -7566 JONES 20 3475.0 -1234 MEIXI 30 1250.0 -7698 BLAKE 30 2850.0 -7788 SCOTT 20 3500.0 -7782 CLARK 50 2950.0 +➤ id[4,32,0] ¦ name[12,-1,0] ¦ deptid[4,32,0] ¦ salary[7,24,0] 𝄀 +7369 ¦ SMITH ¦ 20 ¦ 1300.0 𝄀 +7499 ¦ ALLEN ¦ 30 ¦ 1600.0 𝄀 +7521 ¦ WARD ¦ 30 ¦ 1250.0 𝄀 +7566 ¦ JONES ¦ 20 ¦ 3475.0 𝄀 +1234 ¦ MEIXI ¦ 30 ¦ 1250.0 𝄀 +7698 ¦ BLAKE ¦ 30 ¦ 2850.0 𝄀 +7788 ¦ SCOTT ¦ 20 ¦ 3500.0 𝄀 +7782 ¦ CLARK ¦ 50 ¦ 2950.0 delete from t_dept1 where name = 'ACCOUNTING'; select * from t_dept1; -id name location -20 RESEARCH DALLAS -30 SALES CHICAGO -40 OPERATIONS BOSTON +➤ id[4,32,0] ¦ name[12,-1,0] ¦ location[12,-1,0] 𝄀 +20 ¦ RESEARCH ¦ DALLAS 𝄀 +30 ¦ SALES ¦ CHICAGO 𝄀 +40 ¦ OPERATIONS ¦ BOSTON select * from t_emp1; -id name deptid salary -7369 SMITH 20 1300.0 -7499 ALLEN 30 1600.0 -7521 WARD 30 1250.0 -7566 JONES 20 3475.0 -1234 MEIXI 30 1250.0 -7698 BLAKE 30 2850.0 -7788 SCOTT 20 3500.0 +➤ id[4,32,0] ¦ name[12,-1,0] ¦ deptid[4,32,0] ¦ salary[7,24,0] 𝄀 +7369 ¦ SMITH ¦ 20 ¦ 1300.0 𝄀 +7499 ¦ ALLEN ¦ 30 ¦ 1600.0 𝄀 +7521 ¦ WARD ¦ 30 ¦ 1250.0 𝄀 +7566 ¦ JONES ¦ 20 ¦ 3475.0 𝄀 +1234 ¦ MEIXI ¦ 30 ¦ 1250.0 𝄀 +7698 ¦ BLAKE ¦ 30 ¦ 2850.0 𝄀 +7788 ¦ SCOTT ¦ 20 ¦ 3500.0 update t_emp1 set deptId = 50 where salary < 1500; Cannot add or update a child row: a foreign key constraint fails update t_emp1 set deptId = null where salary < 1500; @@ -239,37 +239,37 @@ INSERT INTO t_emp2 VALUES (7782,'CLARK',10,2950.00); INSERT INTO t_emp2 VALUES (7788,'SCOTT',20,3500.00); update t_dept2 set id = 50 where name = 'ACCOUNTING'; select * from t_dept2; -id name location -20 RESEARCH DALLAS -30 SALES CHICAGO -40 OPERATIONS BOSTON -50 ACCOUNTING NEW YORK +➤ id[4,32,0] ¦ name[12,-1,0] ¦ location[12,-1,0] 𝄀 +20 ¦ RESEARCH ¦ DALLAS 𝄀 +30 ¦ SALES ¦ CHICAGO 𝄀 +40 ¦ OPERATIONS ¦ BOSTON 𝄀 +50 ¦ ACCOUNTING ¦ NEW YORK select * from t_emp2; -id name deptid salary -7369 SMITH 20 1300.0 -7499 ALLEN 30 1600.0 -7521 WARD 30 1250.0 -7566 JONES 20 3475.0 -1234 MEIXI 30 1250.0 -7698 BLAKE 30 2850.0 -7788 SCOTT 20 3500.0 -7782 CLARK null 2950.0 +➤ id[4,32,0] ¦ name[12,-1,0] ¦ deptid[4,32,0] ¦ salary[7,24,0] 𝄀 +7369 ¦ SMITH ¦ 20 ¦ 1300.0 𝄀 +7499 ¦ ALLEN ¦ 30 ¦ 1600.0 𝄀 +7521 ¦ WARD ¦ 30 ¦ 1250.0 𝄀 +7566 ¦ JONES ¦ 20 ¦ 3475.0 𝄀 +1234 ¦ MEIXI ¦ 30 ¦ 1250.0 𝄀 +7698 ¦ BLAKE ¦ 30 ¦ 2850.0 𝄀 +7788 ¦ SCOTT ¦ 20 ¦ 3500.0 𝄀 +7782 ¦ CLARK ¦ null ¦ 2950.0 delete from t_dept2 where name = 'ACCOUNTING'; select * from t_dept2; -id name location -20 RESEARCH DALLAS -30 SALES CHICAGO -40 OPERATIONS BOSTON +➤ id[4,32,0] ¦ name[12,-1,0] ¦ location[12,-1,0] 𝄀 +20 ¦ RESEARCH ¦ DALLAS 𝄀 +30 ¦ SALES ¦ CHICAGO 𝄀 +40 ¦ OPERATIONS ¦ BOSTON select * from t_emp2; -id name deptid salary -7369 SMITH 20 1300.0 -7499 ALLEN 30 1600.0 -7521 WARD 30 1250.0 -7566 JONES 20 3475.0 -1234 MEIXI 30 1250.0 -7698 BLAKE 30 2850.0 -7788 SCOTT 20 3500.0 -7782 CLARK null 2950.0 +➤ id[4,32,0] ¦ name[12,-1,0] ¦ deptid[4,32,0] ¦ salary[7,24,0] 𝄀 +7369 ¦ SMITH ¦ 20 ¦ 1300.0 𝄀 +7499 ¦ ALLEN ¦ 30 ¦ 1600.0 𝄀 +7521 ¦ WARD ¦ 30 ¦ 1250.0 𝄀 +7566 ¦ JONES ¦ 20 ¦ 3475.0 𝄀 +1234 ¦ MEIXI ¦ 30 ¦ 1250.0 𝄀 +7698 ¦ BLAKE ¦ 30 ¦ 2850.0 𝄀 +7788 ¦ SCOTT ¦ 20 ¦ 3500.0 𝄀 +7782 ¦ CLARK ¦ null ¦ 2950.0 update t_emp2 set deptId = 50 where salary < 1500; Cannot add or update a child row: a foreign key constraint fails update t_emp2 set deptId = null where salary < 1500; @@ -287,10 +287,10 @@ update c1 set aaa=4, bbb=22 where bbb=11; Cannot add or update a child row: a foreign key constraint fails update c1 set aaa=2, bbb=33 where bbb=11; select * from c1 order by bbb; -aaa bbbb -2 22 -3 33 -2 33 +➤ aaa[4,32,0] ¦ bbb[4,32,0] 𝄀 +2 ¦ 22 𝄀 +3 ¦ 33 𝄀 +2 ¦ 33 drop table c1; drop table f2; drop table f1; @@ -317,7 +317,9 @@ create table fk_01(a int,b varchar(20),c tinyint,primary key(a,b)); create table fk_02(col1 int,col2 varchar(25),col3 tinyint,constraint ck foreign key(col1,col2) REFERENCES fk_01(a,b) on delete RESTRICT on update RESTRICT); create table fk_03(col1 int,col2 varchar(25),col3 tinyint,constraint ck foreign key(col1) REFERENCES fk_01(a) on delete RESTRICT on update RESTRICT); create table fk_04(col1 int,col2 varchar(25),col3 tinyint,constraint ck foreign key(col2) REFERENCES fk_01(b) on delete RESTRICT on update RESTRICT); +internal error: failed to add the foreign key constraint drop table fk_04; +no such table fk_base.fk_04 drop table fk_03; drop table fk_02; drop table fk_01; @@ -354,7 +356,7 @@ drop database db1; create database db1; use db1; show tables; -Tables_in_db1 +➤ Tables_in_db1[12,-1,0] drop database db1; create account acc1 ADMIN_NAME 'root' IDENTIFIED BY '123456'; create database db2; @@ -367,7 +369,7 @@ drop database db2; create database db2; use db2; show tables; -Tables_in_db2 +➤ Tables_in_db2[12,-1,0] drop database db2; drop account if exists acc1; drop database if exists db1; diff --git a/test/distributed/cases/foreign_key/fk_information_schema_key_column_usage.result b/test/distributed/cases/foreign_key/fk_information_schema_key_column_usage.result new file mode 100644 index 0000000000000..33bb07467a0f4 --- /dev/null +++ b/test/distributed/cases/foreign_key/fk_information_schema_key_column_usage.result @@ -0,0 +1,65 @@ +drop database if exists fk_information_schema_key_column_usage; +create database fk_information_schema_key_column_usage; +use fk_information_schema_key_column_usage; +create table parent (id int, code int, primary key (id, code)); +create table child ( +id int primary key, +parent_id int, +parent_code int, +constraint fk_metadata_compound foreign key (parent_id, parent_code) +references parent(id, code) +); +select CONSTRAINT_SCHEMA as constraint_schema, CONSTRAINT_NAME as constraint_name, TABLE_NAME as table_name, COLUMN_NAME as column_name, REFERENCED_TABLE_NAME as referenced_table_name, REFERENCED_COLUMN_NAME as referenced_column_name, ORDINAL_POSITION as ordinal_position +from information_schema.KEY_COLUMN_USAGE +where TABLE_SCHEMA = database() and REFERENCED_TABLE_NAME is not null +order by CONSTRAINT_NAME, ORDINAL_POSITION; +➤ constraint_schema[12,-1,0] ¦ constraint_name[12,-1,0] ¦ table_name[12,-1,0] ¦ column_name[12,-1,0] ¦ referenced_table_name[12,-1,0] ¦ referenced_column_name[12,-1,0] ¦ ordinal_position[4,32,0] 𝄀 +fk_information_schema_key_column_usage ¦ fk_metadata_compound ¦ child ¦ parent_id ¦ parent ¦ id ¦ 1 𝄀 +fk_information_schema_key_column_usage ¦ fk_metadata_compound ¦ child ¦ parent_code ¦ parent ¦ code ¦ 2 +create table alter_child (id int primary key, parent_id int, parent_code int); +alter table alter_child add constraint fk_metadata_alter foreign key (parent_id, parent_code) references parent(id, code); +create table unnamed_child ( +id int primary key, +parent_id int, +parent_code int, +foreign key (parent_id, parent_code) references parent(id, code) +); +create table restrict_alter_child (id int primary key, parent_id int, parent_code int); +alter table restrict_alter_child add constraint fk_metadata_alter_restrict foreign key (parent_id, parent_code) references parent(id, code) on delete restrict on update restrict; +select TABLE_NAME as table_name, COLUMN_NAME as column_name, REFERENCED_TABLE_NAME as referenced_table_name, REFERENCED_COLUMN_NAME as referenced_column_name, ORDINAL_POSITION as ordinal_position +from information_schema.KEY_COLUMN_USAGE +where TABLE_SCHEMA = database() and TABLE_NAME in ('alter_child', 'restrict_alter_child', 'unnamed_child') +order by TABLE_NAME, ORDINAL_POSITION; +➤ table_name[12,-1,0] ¦ column_name[12,-1,0] ¦ referenced_table_name[12,-1,0] ¦ referenced_column_name[12,-1,0] ¦ ordinal_position[4,32,0] 𝄀 +alter_child ¦ parent_id ¦ parent ¦ id ¦ 1 𝄀 +alter_child ¦ parent_code ¦ parent ¦ code ¦ 2 𝄀 +restrict_alter_child ¦ parent_id ¦ parent ¦ id ¦ 1 𝄀 +restrict_alter_child ¦ parent_code ¦ parent ¦ code ¦ 2 𝄀 +unnamed_child ¦ parent_id ¦ parent ¦ id ¦ 1 𝄀 +unnamed_child ¦ parent_code ¦ parent ¦ code ¦ 2 +select TABLE_NAME as table_name, UPDATE_RULE as update_rule, DELETE_RULE as delete_rule +from information_schema.REFERENTIAL_CONSTRAINTS +where CONSTRAINT_SCHEMA = database() and TABLE_NAME in ('alter_child', 'restrict_alter_child', 'unnamed_child') +order by TABLE_NAME; +➤ table_name[12,-1,0] ¦ update_rule[12,-1,0] ¦ delete_rule[12,-1,0] 𝄀 +alter_child ¦ NO ACTION ¦ NO ACTION 𝄀 +restrict_alter_child ¦ RESTRICT ¦ RESTRICT 𝄀 +unnamed_child ¦ NO ACTION ¦ NO ACTION +desc information_schema.KEY_COLUMN_USAGE; +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +constraint_catalog ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +constraint_schema ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +constraint_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_catalog ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_schema ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +column_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +ordinal_position ¦ INT UNSIGNED(32) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +position_in_unique_constraint ¦ INT UNSIGNED(32) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_table_schema ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_table_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_column_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ +show create table information_schema.KEY_COLUMN_USAGE; +➤ View[12,-1,0] ¦ Create View[12,-1,0] ¦ character_set_client[12,-1,0] ¦ collation_connection[12,-1,0] 𝄀 +key_column_usage ¦ CREATE VIEW information_schema.KEY_COLUMN_USAGE AS SELECT CAST('def' AS varchar(64)) AS CONSTRAINT_CATALOG, CAST(fk.db_name AS varchar(64)) AS CONSTRAINT_SCHEMA, CAST(fk.constraint_name AS varchar(64)) AS CONSTRAINT_NAME, CAST('def' AS varchar(64)) AS TABLE_CATALOG, CAST(fk.db_name AS varchar(64)) AS TABLE_SCHEMA, CAST(fk.table_name AS varchar(64)) AS TABLE_NAME, CAST(fk.column_name AS varchar(64)) AS COLUMN_NAME, CAST(fk.constraint_id AS int unsigned) AS ORDINAL_POSITION, CAST(fk.constraint_id AS int unsigned) AS POSITION_IN_UNIQUE_CONSTRAINT, CAST(fk.refer_db_name AS varchar(64)) AS REFERENCED_TABLE_SCHEMA, CAST(fk.refer_table_name AS varchar(64)) AS REFERENCED_TABLE_NAME, CAST(fk.refer_column_name AS varchar(64)) AS REFERENCED_COLUMN_NAME FROM mo_catalog.mo_foreign_keys fk ¦ utf8mb4 ¦ utf8mb4_general_ci +drop database fk_information_schema_key_column_usage; diff --git a/test/distributed/cases/foreign_key/fk_information_schema_key_column_usage.sql b/test/distributed/cases/foreign_key/fk_information_schema_key_column_usage.sql new file mode 100644 index 0000000000000..0fcdd49939585 --- /dev/null +++ b/test/distributed/cases/foreign_key/fk_information_schema_key_column_usage.sql @@ -0,0 +1,41 @@ +-- @suite +-- @case +-- @desc: verify KEY_COLUMN_USAGE view metadata and foreign-key mappings +-- @label:bvt + +drop database if exists fk_information_schema_key_column_usage; +create database fk_information_schema_key_column_usage; +use fk_information_schema_key_column_usage; +create table parent (id int, code int, primary key (id, code)); +create table child ( + id int primary key, + parent_id int, + parent_code int, + constraint fk_metadata_compound foreign key (parent_id, parent_code) + references parent(id, code) +); +select CONSTRAINT_SCHEMA as constraint_schema, CONSTRAINT_NAME as constraint_name, TABLE_NAME as table_name, COLUMN_NAME as column_name, REFERENCED_TABLE_NAME as referenced_table_name, REFERENCED_COLUMN_NAME as referenced_column_name, ORDINAL_POSITION as ordinal_position +from information_schema.KEY_COLUMN_USAGE +where TABLE_SCHEMA = database() and REFERENCED_TABLE_NAME is not null +order by CONSTRAINT_NAME, ORDINAL_POSITION; +create table alter_child (id int primary key, parent_id int, parent_code int); +alter table alter_child add constraint fk_metadata_alter foreign key (parent_id, parent_code) references parent(id, code); +create table unnamed_child ( + id int primary key, + parent_id int, + parent_code int, + foreign key (parent_id, parent_code) references parent(id, code) +); +create table restrict_alter_child (id int primary key, parent_id int, parent_code int); +alter table restrict_alter_child add constraint fk_metadata_alter_restrict foreign key (parent_id, parent_code) references parent(id, code) on delete restrict on update restrict; +select TABLE_NAME as table_name, COLUMN_NAME as column_name, REFERENCED_TABLE_NAME as referenced_table_name, REFERENCED_COLUMN_NAME as referenced_column_name, ORDINAL_POSITION as ordinal_position +from information_schema.KEY_COLUMN_USAGE +where TABLE_SCHEMA = database() and TABLE_NAME in ('alter_child', 'restrict_alter_child', 'unnamed_child') +order by TABLE_NAME, ORDINAL_POSITION; +select TABLE_NAME as table_name, UPDATE_RULE as update_rule, DELETE_RULE as delete_rule +from information_schema.REFERENTIAL_CONSTRAINTS +where CONSTRAINT_SCHEMA = database() and TABLE_NAME in ('alter_child', 'restrict_alter_child', 'unnamed_child') +order by TABLE_NAME; +desc information_schema.KEY_COLUMN_USAGE; +show create table information_schema.KEY_COLUMN_USAGE; +drop database fk_information_schema_key_column_usage; diff --git a/test/distributed/cases/foreign_key/fk_information_schema_metadata.result b/test/distributed/cases/foreign_key/fk_information_schema_metadata.result new file mode 100644 index 0000000000000..763b9bb634e18 --- /dev/null +++ b/test/distributed/cases/foreign_key/fk_information_schema_metadata.result @@ -0,0 +1,60 @@ +drop database if exists mysql_compat_model11_min2; +create database mysql_compat_model11_min2; +use mysql_compat_model11_min2; +create table p (id int primary key, key p_secondary (id)); +create table p_compound (id int, code int, unique key uq_p_compound (id, code), unique key zz_p_compound (id, code), key p_compound_secondary (id, code)); +create table unrelated (id int, unique key unrelated_id (id)); +create table c ( +id int primary key, +parent_id int, +compound_parent_id int, +parent_code int, +restrict_parent_id int, +constraint fk_c_p foreign key (parent_id) references p(id), +constraint fk_c_p_compound foreign key (compound_parent_id, parent_code) references p_compound(id, code), +constraint fk_c_p_restrict foreign key (restrict_parent_id) references p(id) on delete restrict on update restrict +); +select constraint_name, unique_constraint_name, delete_rule, update_rule +from information_schema.referential_constraints +where constraint_schema = database() +order by constraint_name; +➤ constraint_name[12,-1,0] ¦ unique_constraint_name[12,-1,0] ¦ delete_rule[12,-1,0] ¦ update_rule[12,-1,0] 𝄀 +fk_c_p ¦ PRIMARY ¦ NO ACTION ¦ NO ACTION 𝄀 +fk_c_p_compound ¦ uq_p_compound ¦ NO ACTION ¦ NO ACTION 𝄀 +fk_c_p_restrict ¦ PRIMARY ¦ RESTRICT ¦ RESTRICT +select constraint_name, referenced_index_name, on_delete_origin, on_update_origin +from mo_catalog.mo_foreign_keys +where db_name = database() +group by constraint_name, referenced_index_name, on_delete_origin, on_update_origin +order by constraint_name; +➤ constraint_name[12,-1,0] ¦ referenced_index_name[12,-1,0] ¦ on_delete_origin[12,-1,0] ¦ on_update_origin[12,-1,0] 𝄀 +fk_c_p ¦ PRIMARY ¦ ACTION_ORIGIN_DEFAULT ¦ ACTION_ORIGIN_DEFAULT 𝄀 +fk_c_p_compound ¦ uq_p_compound ¦ ACTION_ORIGIN_DEFAULT ¦ ACTION_ORIGIN_DEFAULT 𝄀 +fk_c_p_restrict ¦ PRIMARY ¦ ACTION_ORIGIN_EXPLICIT ¦ ACTION_ORIGIN_EXPLICIT +select count(*) as referential_constraint_count +from information_schema.referential_constraints +where constraint_schema = database(); +➤ referential_constraint_count[-5,64,0] 𝄀 +3 +select table_name, column_name, referenced_table_name, referenced_column_name, ordinal_position +from information_schema.key_column_usage +where table_schema = database() and referenced_table_name is not null +order by table_name, constraint_name, ordinal_position; +➤ table_name[12,-1,0] ¦ column_name[12,-1,0] ¦ referenced_table_name[12,-1,0] ¦ referenced_column_name[12,-1,0] ¦ ordinal_position[4,32,0] 𝄀 +c ¦ parent_id ¦ p ¦ id ¦ 1 𝄀 +c ¦ compound_parent_id ¦ p_compound ¦ id ¦ 1 𝄀 +c ¦ parent_code ¦ p_compound ¦ code ¦ 2 𝄀 +c ¦ restrict_parent_id ¦ p ¦ id ¦ 1 +drop index zz_p_compound on p_compound; +drop index uq_p_compound on p_compound; +Cannot drop index 'uq_p_compound': needed in a foreign key constraint +alter table p_compound drop index uq_p_compound; +Cannot drop index 'uq_p_compound': needed in a foreign key constraint +alter table p drop primary key; +Cannot drop index 'PRIMARY': needed in a foreign key constraint +select constraint_name, unique_constraint_name +from information_schema.referential_constraints +where constraint_schema = database() and constraint_name = 'fk_c_p_compound'; +➤ constraint_name[12,-1,0] ¦ unique_constraint_name[12,-1,0] 𝄀 +fk_c_p_compound ¦ uq_p_compound +drop database mysql_compat_model11_min2; diff --git a/test/distributed/cases/foreign_key/fk_information_schema_metadata.sql b/test/distributed/cases/foreign_key/fk_information_schema_metadata.sql new file mode 100644 index 0000000000000..a2987ad1f68ab --- /dev/null +++ b/test/distributed/cases/foreign_key/fk_information_schema_metadata.sql @@ -0,0 +1,51 @@ +-- @bvt:issue +drop database if exists mysql_compat_model11_min2; +create database mysql_compat_model11_min2; +use mysql_compat_model11_min2; + +create table p (id int primary key, key p_secondary (id)); +create table p_compound (id int, code int, unique key uq_p_compound (id, code), unique key zz_p_compound (id, code), key p_compound_secondary (id, code)); +create table unrelated (id int, unique key unrelated_id (id)); +create table c ( + id int primary key, + parent_id int, + compound_parent_id int, + parent_code int, + restrict_parent_id int, + constraint fk_c_p foreign key (parent_id) references p(id), + constraint fk_c_p_compound foreign key (compound_parent_id, parent_code) references p_compound(id, code), + constraint fk_c_p_restrict foreign key (restrict_parent_id) references p(id) on delete restrict on update restrict +); + +select constraint_name, unique_constraint_name, delete_rule, update_rule +from information_schema.referential_constraints +where constraint_schema = database() +order by constraint_name; + +select constraint_name, referenced_index_name, on_delete_origin, on_update_origin +from mo_catalog.mo_foreign_keys +where db_name = database() +group by constraint_name, referenced_index_name, on_delete_origin, on_update_origin +order by constraint_name; + +select count(*) as referential_constraint_count +from information_schema.referential_constraints +where constraint_schema = database(); + +select table_name, column_name, referenced_table_name, referenced_column_name, ordinal_position +from information_schema.key_column_usage +where table_schema = database() and referenced_table_name is not null +order by table_name, constraint_name, ordinal_position; + +-- A compatible but unselected UNIQUE remains independently droppable, but the +-- exact key selected by the live FK is protected through both public DDL paths. +drop index zz_p_compound on p_compound; +drop index uq_p_compound on p_compound; +alter table p_compound drop index uq_p_compound; +alter table p drop primary key; + +select constraint_name, unique_constraint_name +from information_schema.referential_constraints +where constraint_schema = database() and constraint_name = 'fk_c_p_compound'; + +drop database mysql_compat_model11_min2; diff --git a/test/distributed/cases/foreign_key/fk_show_columns.result b/test/distributed/cases/foreign_key/fk_show_columns.result index 9bfed542838be..c216c73add9c9 100644 --- a/test/distributed/cases/foreign_key/fk_show_columns.result +++ b/test/distributed/cases/foreign_key/fk_show_columns.result @@ -310,7 +310,10 @@ refer_table_id ¦ BIGINT UNSIGNED(64) ¦ NO ¦ PRI ¦ 0 ¦ ¦ refer_column_name ¦ VARCHAR(256) ¦ NO ¦ PRI ¦ null ¦ ¦ 𝄀 refer_column_id ¦ BIGINT UNSIGNED(64) ¦ NO ¦ PRI ¦ 0 ¦ ¦ 𝄀 on_delete ¦ VARCHAR(128) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 -on_update ¦ VARCHAR(128) ¦ NO ¦ ¦ null ¦ ¦ +on_update ¦ VARCHAR(128) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_index_name ¦ VARCHAR(5000) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +on_delete_origin ¦ VARCHAR(64) ¦ NO ¦ ¦ ACTION_ORIGIN_EXPLICIT ¦ ¦ 𝄀 +on_update_origin ¦ VARCHAR(64) ¦ NO ¦ ¦ ACTION_ORIGIN_EXPLICIT ¦ ¦ desc mo_catalog.mo_snapshots ; ➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 snapshot_id ¦ UUID(0) ¦ YES ¦ UNI ¦ null ¦ ¦ 𝄀 @@ -632,7 +635,10 @@ refer_table_id ¦ BIGINT UNSIGNED(64) ¦ NO ¦ PRI ¦ 0 ¦ ¦ refer_column_name ¦ VARCHAR(256) ¦ NO ¦ PRI ¦ null ¦ ¦ 𝄀 refer_column_id ¦ BIGINT UNSIGNED(64) ¦ NO ¦ PRI ¦ 0 ¦ ¦ 𝄀 on_delete ¦ VARCHAR(128) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 -on_update ¦ VARCHAR(128) ¦ NO ¦ ¦ null ¦ ¦ +on_update ¦ VARCHAR(128) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_index_name ¦ VARCHAR(5000) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +on_delete_origin ¦ VARCHAR(64) ¦ NO ¦ ¦ ACTION_ORIGIN_EXPLICIT ¦ ¦ 𝄀 +on_update_origin ¦ VARCHAR(64) ¦ NO ¦ ¦ ACTION_ORIGIN_EXPLICIT ¦ ¦ show columns from mo_catalog.mo_snapshots ; ➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 snapshot_id ¦ UUID(0) ¦ YES ¦ UNI ¦ null ¦ ¦ 𝄀 @@ -932,7 +938,10 @@ refer_table_id ¦ BIGINT UNSIGNED(64) ¦ NO ¦ PRI ¦ 0 ¦ ¦ refer_column_name ¦ VARCHAR(256) ¦ NO ¦ PRI ¦ null ¦ ¦ 𝄀 refer_column_id ¦ BIGINT UNSIGNED(64) ¦ NO ¦ PRI ¦ 0 ¦ ¦ 𝄀 on_delete ¦ VARCHAR(128) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 -on_update ¦ VARCHAR(128) ¦ NO ¦ ¦ null ¦ ¦ +on_update ¦ VARCHAR(128) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_index_name ¦ VARCHAR(5000) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +on_delete_origin ¦ VARCHAR(64) ¦ NO ¦ ¦ ACTION_ORIGIN_EXPLICIT ¦ ¦ 𝄀 +on_update_origin ¦ VARCHAR(64) ¦ NO ¦ ¦ ACTION_ORIGIN_EXPLICIT ¦ ¦ desc mo_catalog.mo_snapshots ; ➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 snapshot_id ¦ UUID(0) ¦ YES ¦ UNI ¦ null ¦ ¦ 𝄀 @@ -1232,7 +1241,10 @@ refer_table_id ¦ BIGINT UNSIGNED(64) ¦ NO ¦ PRI ¦ 0 ¦ ¦ refer_column_name ¦ VARCHAR(256) ¦ NO ¦ PRI ¦ null ¦ ¦ 𝄀 refer_column_id ¦ BIGINT UNSIGNED(64) ¦ NO ¦ PRI ¦ 0 ¦ ¦ 𝄀 on_delete ¦ VARCHAR(128) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 -on_update ¦ VARCHAR(128) ¦ NO ¦ ¦ null ¦ ¦ +on_update ¦ VARCHAR(128) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_index_name ¦ VARCHAR(5000) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +on_delete_origin ¦ VARCHAR(64) ¦ NO ¦ ¦ ACTION_ORIGIN_EXPLICIT ¦ ¦ 𝄀 +on_update_origin ¦ VARCHAR(64) ¦ NO ¦ ¦ ACTION_ORIGIN_EXPLICIT ¦ ¦ show columns from mo_catalog.mo_snapshots ; ➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 snapshot_id ¦ UUID(0) ¦ YES ¦ UNI ¦ null ¦ ¦ 𝄀 diff --git a/test/distributed/cases/foreign_key/foreign_key.result b/test/distributed/cases/foreign_key/foreign_key.result index 8de680e2665fd..66ca0e7ab08ad 100644 --- a/test/distributed/cases/foreign_key/foreign_key.result +++ b/test/distributed/cases/foreign_key/foreign_key.result @@ -1,21 +1,26 @@ create table fk_01(col1 varchar(30) not null primary key,col2 int); create table fk_02(col1 int,col2 varchar(25),col3 tinyint,constraint ck foreign key(col2) REFERENCES fk_01(col1)); show create table fk_02; -Table Create Table -fk_02 CREATE TABLE `fk_02` (\n `col1` int DEFAULT NULL,\n `col2` varchar(25) DEFAULT NULL,\n `col3` tinyint DEFAULT NULL,\n CONSTRAINT `ck` FOREIGN KEY (`col2`) REFERENCES `fk_01` (`col1`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +fk_02 ¦ CREATE TABLE `fk_02` ( + `col1` int DEFAULT NULL, + `col2` varchar(25) DEFAULT NULL, + `col3` tinyint DEFAULT NULL, + CONSTRAINT `ck` FOREIGN KEY (`col2`) REFERENCES `fk_01` (`col1`) ON DELETE RESTRICT ON UPDATE RESTRICT +) insert into fk_01 values ('90',5983),('100',734),('190',50); insert into fk_02(col2,col3) values ('90',5),('90',4),('100',0),(NULL,80); select * from fk_01; -col1 col2 -90 5983 -100 734 -190 50 +➤ col1[12,-1,0] ¦ col2[4,32,0] 𝄀 +90 ¦ 5983 𝄀 +100 ¦ 734 𝄀 +190 ¦ 50 select * from fk_02; -col1 col2 col3 -null 90 5 -null 90 4 -null 100 0 -null null 80 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +null ¦ 90 ¦ 5 𝄀 +null ¦ 90 ¦ 4 𝄀 +null ¦ 100 ¦ 0 𝄀 +null ¦ null ¦ 80 insert into fk_02(col2,col3) values ('200',5); internal error: Cannot add or update a child row: a foreign key constraint fails update fk_02 set col2='80' where col2='90'; @@ -26,26 +31,26 @@ delete from fk_01 where col1='90'; internal error: Cannot delete or update a parent row: a foreign key constraint fails delete from fk_01 where col1='190'; select * from fk_01; -col1 col2 -90 5983 -100 734 +➤ col1[12,-1,0] ¦ col2[4,32,0] 𝄀 +90 ¦ 5983 𝄀 +100 ¦ 734 select * from fk_02; -col1 col2 col3 -null 90 5 -null 90 4 -null 100 0 -null null 80 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +null ¦ 90 ¦ 5 𝄀 +null ¦ 90 ¦ 4 𝄀 +null ¦ 100 ¦ 0 𝄀 +null ¦ null ¦ 80 update fk_01 set col2=500 where col2=734; delete from fk_02 where col2='100'; select * from fk_01; -col1 col2 -90 5983 -100 500 +➤ col1[12,-1,0] ¦ col2[4,32,0] 𝄀 +90 ¦ 5983 𝄀 +100 ¦ 500 select * from fk_02; -col1 col2 col3 -null 90 5 -null 90 4 -null null 80 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +null ¦ 90 ¦ 5 𝄀 +null ¦ 90 ¦ 4 𝄀 +null ¦ null ¦ 80 drop table fk_02; drop table fk_01; create table fk_01(col1 char(30) primary key,col2 int); @@ -57,15 +62,15 @@ insert into fk_02(col2,col3) values ('90',5),('90',4),('100',0); truncate table fk_01; internal error: can not truncate table 'fk_01' referenced by some foreign key constraint select * from fk_01; -col1 col2 -90 5983 -100 734 -190 50 +➤ col1[1,30,0] ¦ col2[4,32,0] 𝄀 +90 ¦ 5983 𝄀 +100 ¦ 734 𝄀 +190 ¦ 50 select * from fk_02; -col1 col2 col3 -null 90 5 -null 90 4 -null 100 0 +➤ col1[4,32,0] ¦ col2[1,25,0] ¦ col3[-6,8,0] 𝄀 +null ¦ 90 ¦ 5 𝄀 +null ¦ 90 ¦ 4 𝄀 +null ¦ 100 ¦ 0 drop table fk_02; drop table fk_01; create table fk_01(col1 int auto_increment primary key,col2 varchar(25),col3 tinyint); @@ -78,38 +83,38 @@ insert into fk_01 values (2,'yellow',20),(10,'apple',50),(11,'opppo',51); insert into fk_02 values(2,'score',1),(2,'student',4),(10,'goods',2); insert into fk_02 values(NULL,NULL,NULL); select * from fk_01; -col1 col2 col3 -2 yellow 20 -10 apple 50 -11 opppo 51 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +2 ¦ yellow ¦ 20 𝄀 +10 ¦ apple ¦ 50 𝄀 +11 ¦ opppo ¦ 51 select * from fk_02; -col1 col2 col3 -2 score 1 -2 student 4 -10 goods 2 -null null null +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +2 ¦ score ¦ 1 𝄀 +2 ¦ student ¦ 4 𝄀 +10 ¦ goods ¦ 2 𝄀 +null ¦ null ¦ null update fk_02 set col1=10 where col3=4; select * from fk_02; -col1 col2 col3 -2 score 1 -10 goods 2 -null null null -10 student 4 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +2 ¦ score ¦ 1 𝄀 +10 ¦ goods ¦ 2 𝄀 +null ¦ null ¦ null 𝄀 +10 ¦ student ¦ 4 update fk_02 set col1=20 where col3=4; Cannot add or update a child row: a foreign key constraint fails insert into fk_02 values(15,'ssss',10); internal error: Cannot add or update a child row: a foreign key constraint fails delete from fk_01 where col1=11; select * from fk_01; -col1 col2 col3 -2 yellow 20 -10 apple 50 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +2 ¦ yellow ¦ 20 𝄀 +10 ¦ apple ¦ 50 select * from fk_02; -col1 col2 col3 -2 score 1 -10 goods 2 -null null null -10 student 4 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +2 ¦ score ¦ 1 𝄀 +10 ¦ goods ¦ 2 𝄀 +null ¦ null ¦ null 𝄀 +10 ¦ student ¦ 4 update fk_01 set col3=110 where col1=10; delete from fk_01 where col1=2; internal error: Cannot delete or update a parent row: a foreign key constraint fails @@ -117,7 +122,7 @@ truncate table fk_01; internal error: can not truncate table 'fk_01' referenced by some foreign key constraint truncate table fk_02; select * from fk_02; -col1 col2 col3 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] drop table fk_01; internal error: can not drop table 'fk_01' referenced by some foreign key constraint drop table fk_02; @@ -129,15 +134,15 @@ insert into fk_02 values(2,'apple',1),(2,'apple',4),(1,'opppo',2); insert into fk_02 values(20,'score',1),(12,'apple',4),(1,'yellow',2); internal error: Cannot add or update a child row: a foreign key constraint fails select * from fk_01; -col1 col2 col3 -2 yellow 20 -2 apple 50 -1 opppo 51 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +2 ¦ yellow ¦ 20 𝄀 +2 ¦ apple ¦ 50 𝄀 +1 ¦ opppo ¦ 51 select * from fk_02; -col1 col2 col3 -2 apple 1 -2 apple 4 -1 opppo 2 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +2 ¦ apple ¦ 1 𝄀 +2 ¦ apple ¦ 4 𝄀 +1 ¦ opppo ¦ 2 update fk_02 set col1=3 where col1=2; Cannot add or update a child row: a foreign key constraint fails delete from fk_01 where col1=2 and col2='apple'; @@ -147,25 +152,25 @@ Cannot delete or update a parent row: a foreign key constraint fails update fk_01 set col1=1 where col1=2; Cannot delete or update a parent row: a foreign key constraint fails select * from fk_01; -col1 col2 col3 -2 yellow 20 -2 apple 50 -1 opppo 51 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +2 ¦ yellow ¦ 20 𝄀 +2 ¦ apple ¦ 50 𝄀 +1 ¦ opppo ¦ 51 select * from fk_02; -col1 col2 col3 -2 apple 1 -2 apple 4 -1 opppo 2 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +2 ¦ apple ¦ 1 𝄀 +2 ¦ apple ¦ 4 𝄀 +1 ¦ opppo ¦ 2 delete from fk_01 where col1=1; internal error: Cannot delete or update a parent row: a foreign key constraint fails delete from fk_02; select * from fk_01; -col1 col2 col3 -2 yellow 20 -2 apple 50 -1 opppo 51 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +2 ¦ yellow ¦ 20 𝄀 +2 ¦ apple ¦ 50 𝄀 +1 ¦ opppo ¦ 51 select * from fk_02; -col1 col2 col3 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] drop table fk_02; drop table fk_01; create table fk_01(col1 bigint primary key,col2 varchar(25),col3 tinyint); @@ -177,35 +182,35 @@ insert into fk_02 values(4,'age',3); internal error: Cannot add or update a child row: a foreign key constraint fails insert into fk_02 values(1,'score',1),(2,'student',NULL); select * from fk_01; -col1 col2 col3 -1 yellow 20 -2 apple 50 +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +1 ¦ yellow ¦ 20 𝄀 +2 ¦ apple ¦ 50 select * from fk_02; -col1 col2 col3 -1 score 1 -2 student null +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +1 ¦ score ¦ 1 𝄀 +2 ¦ student ¦ null update fk_02 set col3=4 where col3=1; select * from fk_01; -col1 col2 col3 -1 yellow 20 -2 apple 50 +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +1 ¦ yellow ¦ 20 𝄀 +2 ¦ apple ¦ 50 delete from fk_01 where col1=1; select * from fk_02; -col1 col2 col3 -2 student null +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +2 ¦ student ¦ null update fk_01 set col1=5 where col2='apple'; select * from fk_01; -col1 col2 col3 -5 apple 50 +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +5 ¦ apple ¦ 50 select * from fk_02; -col1 col2 col3 -5 student null +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +5 ¦ student ¦ null delete from fk_02 where col1=5; select * from fk_02; -col1 col2 col3 +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] select * from fk_01; -col1 col2 col3 -5 apple 50 +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +5 ¦ apple ¦ 50 drop table fk_02; drop table fk_01; create table fk_01(col1 decimal(38,18),col2 char(25),col3 int,col4 date,primary key(col1,col3,col4)); @@ -217,35 +222,35 @@ internal error: Cannot add or update a child row: a foreign key constraint fails insert into fk_02 values(0.001,'b',20,'2022-10-01'),(4.5,'a',21,'2022-10-01'),(56,'a',20,'2022-10-02'); internal error: Cannot add or update a child row: a foreign key constraint fails select * from fk_01; -col1 col2 col3 col4 -23.100000000000000000 a 20 2022-10-01 -23.100000000000000000 a 21 2022-10-01 -23.100000000000000000 a 20 2022-10-02 +➤ col1[3,38,18] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +23.100000000000000000 ¦ a ¦ 20 ¦ 2022-10-01 𝄀 +23.100000000000000000 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +23.100000000000000000 ¦ a ¦ 20 ¦ 2022-10-02 select * from fk_02; -col1 col2 col3 col4 -23.100000000000000000 a 20 2022-10-01 -23.100000000000000000 a 21 2022-10-01 -23.100000000000000000 a 20 2022-10-02 +➤ col1[3,38,18] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +23.100000000000000000 ¦ a ¦ 20 ¦ 2022-10-01 𝄀 +23.100000000000000000 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +23.100000000000000000 ¦ a ¦ 20 ¦ 2022-10-02 update fk_02 set col3=19 where col3=20; Cannot add or update a child row: a foreign key constraint fails delete from fk_01 where col3=20; select * from fk_01; -col1 col2 col3 col4 -23.100000000000000000 a 21 2022-10-01 +➤ col1[3,38,18] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +23.100000000000000000 ¦ a ¦ 21 ¦ 2022-10-01 select * from fk_02; -col1 col2 col3 col4 -23.100000000000000000 a 21 2022-10-01 -null a null null -null a null null +➤ col1[3,38,18] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +23.100000000000000000 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +null ¦ a ¦ null ¦ null 𝄀 +null ¦ a ¦ null ¦ null update fk_01 set col3=19 where col2='a'; select * from fk_01; -col1 col2 col3 col4 -23.100000000000000000 a 19 2022-10-01 +➤ col1[3,38,18] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +23.100000000000000000 ¦ a ¦ 19 ¦ 2022-10-01 select * from fk_02; -col1 col2 col3 col4 -null a null null -null a null null -null a null null +➤ col1[3,38,18] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +null ¦ a ¦ null ¦ null 𝄀 +null ¦ a ¦ null ¦ null 𝄀 +null ¦ a ¦ null ¦ null drop table fk_02; drop table fk_01; create table fk_01(col1 int primary key auto_increment,col2 varchar(25),col3 varchar(50)); @@ -259,39 +264,39 @@ Cannot add or update a child row: a foreign key constraint fails delete from fk_01 where col1=1; internal error: Cannot delete or update a parent row: a foreign key constraint fails select * from fk_01; -col1 col2 col3 -1 non-failing deli -2 safer prow -3 ultra strong +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[12,-1,0] 𝄀 +1 ¦ non-failing ¦ deli 𝄀 +2 ¦ safer ¦ prow 𝄀 +3 ¦ ultra ¦ strong select * from fk_02; -col1 col2 col3 col4 -1 aa bb 2 -2 cc dd 1 -3 ee ff 1 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[1,5,0] ¦ col4[4,32,0] 𝄀 +1 ¦ aa ¦ bb ¦ 2 𝄀 +2 ¦ cc ¦ dd ¦ 1 𝄀 +3 ¦ ee ¦ ff ¦ 1 delete from fk_02 where col4=1; delete from fk_01 where col1=1; select * from fk_01; -col1 col2 col3 -2 safer prow -3 ultra strong +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[12,-1,0] 𝄀 +2 ¦ safer ¦ prow 𝄀 +3 ¦ ultra ¦ strong select * from fk_02; -col1 col2 col3 col4 -1 aa bb 2 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[1,5,0] ¦ col4[4,32,0] 𝄀 +1 ¦ aa ¦ bb ¦ 2 update fk_01 set col1=8 where col1=2; Cannot delete or update a parent row: a foreign key constraint fails select * from fk_01; -col1 col2 col3 -2 safer prow -3 ultra strong +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[12,-1,0] 𝄀 +2 ¦ safer ¦ prow 𝄀 +3 ¦ ultra ¦ strong select * from fk_02; -col1 col2 col3 col4 -1 aa bb 2 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[1,5,0] ¦ col4[4,32,0] 𝄀 +1 ¦ aa ¦ bb ¦ 2 truncate table fk_01; internal error: can not truncate table 'fk_01' referenced by some foreign key constraint select * from fk_01; -col1 col2 col3 -2 safer prow -3 ultra strong +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[12,-1,0] 𝄀 +2 ¦ safer ¦ prow 𝄀 +3 ¦ ultra ¦ strong drop table fk_01; internal error: can not drop table 'fk_01' referenced by some foreign key constraint drop table fk_02; @@ -302,71 +307,71 @@ insert into fk_01(col2,col3) values ('non-failing','deli'),('safer','prow'),('ul insert into fk_02(col2,col3,col4) values('aa','bb',2),('cc','dd',1),('ee','ff',1); insert into fk_02(col2,col3,col4) values('aa','bb',3); select * from fk_01; -col1 col2 col3 -1 non-failing deli -2 safer prow -3 ultra strong -4 aaa bbb -select * from fk_02; -col1 col2 col3 col4 -1 aa bb 2 -2 cc dd 1 -3 ee ff 1 -4 aa bb 3 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[12,-1,0] 𝄀 +1 ¦ non-failing ¦ deli 𝄀 +2 ¦ safer ¦ prow 𝄀 +3 ¦ ultra ¦ strong 𝄀 +4 ¦ aaa ¦ bbb +select * from fk_02; +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[1,5,0] ¦ col4[4,32,0] 𝄀 +1 ¦ aa ¦ bb ¦ 2 𝄀 +2 ¦ cc ¦ dd ¦ 1 𝄀 +3 ¦ ee ¦ ff ¦ 1 𝄀 +4 ¦ aa ¦ bb ¦ 3 delete from fk_01 where col1=1; internal error: Cannot delete or update a parent row: a foreign key constraint fails delete from fk_02 where col4=1; select * from fk_02; -col1 col2 col3 col4 -1 aa bb 2 -4 aa bb 3 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[1,5,0] ¦ col4[4,32,0] 𝄀 +1 ¦ aa ¦ bb ¦ 2 𝄀 +4 ¦ aa ¦ bb ¦ 3 select * from fk_01; -col1 col2 col3 -1 non-failing deli -2 safer prow -3 ultra strong -4 aaa bbb +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[12,-1,0] 𝄀 +1 ¦ non-failing ¦ deli 𝄀 +2 ¦ safer ¦ prow 𝄀 +3 ¦ ultra ¦ strong 𝄀 +4 ¦ aaa ¦ bbb update fk_01 set col1=8 where col1=2; Cannot delete or update a parent row: a foreign key constraint fails update fk_02 set col4=5 where col3='ff'; select * from fk_01; -col1 col2 col3 -1 non-failing deli -2 safer prow -3 ultra strong -4 aaa bbb +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[12,-1,0] 𝄀 +1 ¦ non-failing ¦ deli 𝄀 +2 ¦ safer ¦ prow 𝄀 +3 ¦ ultra ¦ strong 𝄀 +4 ¦ aaa ¦ bbb select * from fk_02; -col1 col2 col3 col4 -1 aa bb 2 -4 aa bb 3 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[1,5,0] ¦ col4[4,32,0] 𝄀 +1 ¦ aa ¦ bb ¦ 2 𝄀 +4 ¦ aa ¦ bb ¦ 3 update fk_01 set col2='window' where col1=1; delete from fk_01 where col1=3; internal error: Cannot delete or update a parent row: a foreign key constraint fails select * from fk_01; -col1 col2 col3 -2 safer prow -3 ultra strong -4 aaa bbb -1 window deli +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[12,-1,0] 𝄀 +2 ¦ safer ¦ prow 𝄀 +3 ¦ ultra ¦ strong 𝄀 +4 ¦ aaa ¦ bbb 𝄀 +1 ¦ window ¦ deli select * from fk_02; -col1 col2 col3 col4 -1 aa bb 2 -4 aa bb 3 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[1,5,0] ¦ col4[4,32,0] 𝄀 +1 ¦ aa ¦ bb ¦ 2 𝄀 +4 ¦ aa ¦ bb ¦ 3 truncate table fk_01; internal error: can not truncate table 'fk_01' referenced by some foreign key constraint insert into fk_01(col2,col3) values ('zhi','gao'),('er','li'); select * from fk_01 order by col1; -col1 col2 col3 -1 window deli -2 safer prow -3 ultra strong -4 aaa bbb -9 zhi gao -10 er li -select * from fk_02; -col1 col2 col3 col4 -1 aa bb 2 -4 aa bb 3 +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[12,-1,0] 𝄀 +1 ¦ window ¦ deli 𝄀 +2 ¦ safer ¦ prow 𝄀 +3 ¦ ultra ¦ strong 𝄀 +4 ¦ aaa ¦ bbb 𝄀 +9 ¦ zhi ¦ gao 𝄀 +10 ¦ er ¦ li +select * from fk_02; +➤ col1[4,32,0] ¦ col2[12,-1,0] ¦ col3[1,5,0] ¦ col4[4,32,0] 𝄀 +1 ¦ aa ¦ bb ¦ 2 𝄀 +4 ¦ aa ¦ bb ¦ 3 drop table fk_01; internal error: can not drop table 'fk_01' referenced by some foreign key constraint drop table fk_02; @@ -380,35 +385,35 @@ insert into fk_02 values(4,'age',3); internal error: Cannot add or update a child row: a foreign key constraint fails insert into fk_02 values(1,'score',1),(2,'student',NULL); select * from fk_01; -col1 col2 col3 -1 yellow 20 -2 apple 50 +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +1 ¦ yellow ¦ 20 𝄀 +2 ¦ apple ¦ 50 select * from fk_02; -col1 col2 col3 -1 score 1 -2 student null +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +1 ¦ score ¦ 1 𝄀 +2 ¦ student ¦ null update fk_02 set col3=4 where col3=1; select * from fk_01; -col1 col2 col3 -1 yellow 20 -2 apple 50 +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +1 ¦ yellow ¦ 20 𝄀 +2 ¦ apple ¦ 50 delete from fk_01 where col1=1; select * from fk_02; -col1 col2 col3 -2 student null +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +2 ¦ student ¦ null update fk_01 set col1=5 where col2='apple'; select * from fk_01; -col1 col2 col3 -5 apple 50 +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +5 ¦ apple ¦ 50 select * from fk_02; -col1 col2 col3 -5 student null +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +5 ¦ student ¦ null delete from fk_02 where col1=5; select * from fk_02; -col1 col2 col3 +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] select * from fk_01; -col1 col2 col3 -5 apple 50 +➤ col1[-5,64,0] ¦ col2[12,-1,0] ¦ col3[-6,8,0] 𝄀 +5 ¦ apple ¦ 50 drop table fk_02; drop table fk_01; create table fk_01(id int primary key auto_increment,title varchar(25)); @@ -423,34 +428,34 @@ update fk_03 set book_id=6 where book_id=2; Cannot add or update a child row: a foreign key constraint fails update fk_03 set book_id=3 where book_id=2; select * from fk_03; -id book_id author_id -1 1 2 -3 3 1 -2 3 2 +➤ id[4,32,0] ¦ book_id[4,32,0] ¦ author_id[4,32,0] 𝄀 +1 ¦ 1 ¦ 2 𝄀 +3 ¦ 3 ¦ 1 𝄀 +2 ¦ 3 ¦ 2 update fk_01 set id=5 where title='self'; select * from fk_03; -id book_id author_id -3 3 1 -2 3 2 -1 5 2 -select * from fk_01; -id title -2 method -3 console -5 self +➤ id[4,32,0] ¦ book_id[4,32,0] ¦ author_id[4,32,0] 𝄀 +3 ¦ 3 ¦ 1 𝄀 +2 ¦ 3 ¦ 2 𝄀 +1 ¦ 5 ¦ 2 +select * from fk_01; +➤ id[4,32,0] ¦ title[12,-1,0] 𝄀 +2 ¦ method 𝄀 +3 ¦ console 𝄀 +5 ¦ self delete from fk_02 where id=1; select * from fk_02; -id name -2 wulan +➤ id[4,32,0] ¦ name[12,-1,0] 𝄀 +2 ¦ wulan select * from fk_03; -id book_id author_id -2 3 2 -1 5 2 +➤ id[4,32,0] ¦ book_id[4,32,0] ¦ author_id[4,32,0] 𝄀 +2 ¦ 3 ¦ 2 𝄀 +1 ¦ 5 ¦ 2 delete from fk_03; drop table fk_01; internal error: can not drop table 'fk_01' referenced by some foreign key constraint select * from fk_03; -id book_id author_id +➤ id[4,32,0] ¦ book_id[4,32,0] ¦ author_id[4,32,0] drop table fk_02; internal error: can not drop table 'fk_02' referenced by some foreign key constraint drop table fk_03; @@ -465,14 +470,14 @@ internal error: Cannot add or update a child row: a foreign key constraint fails delete from fk_01 where col3='2001-10-09 01:00:09'; internal error: Cannot delete or update a parent row: a foreign key constraint fails select * from fk_01; -col1 col2 col3 -9 2001-10-19 00:00:00 2001-10-09 01:00:09 -10 2011-12-09 00:00:00 2001-10-09 01:00:09 -11 2011-12-09 00:00:00 2001-10-09 01:00:09 +➤ col1[4,32,0] ¦ col2[93,64,0] ¦ col3[93,64,0] 𝄀 +9 ¦ 2001-10-19 00:00:00 ¦ 2001-10-09 01:00:09 𝄀 +10 ¦ 2011-12-09 00:00:00 ¦ 2001-10-09 01:00:09 𝄀 +11 ¦ 2011-12-09 00:00:00 ¦ 2001-10-09 01:00:09 select * from fk_02; -col1 col2 col3 col4 -9 2001-10-19 00:00:00 left 2001-10-09 01:00:09 -11 2011-12-09 00:00:00 right 2001-10-09 01:00:09 +➤ col1[4,32,0] ¦ col2[93,64,0] ¦ col3[1,25,0] ¦ col4[93,64,0] 𝄀 +9 ¦ 2001-10-19 00:00:00 ¦ left ¦ 2001-10-09 01:00:09 𝄀 +11 ¦ 2011-12-09 00:00:00 ¦ right ¦ 2001-10-09 01:00:09 drop table fk_02; drop table fk_01; create table fk_an_01(col1 int,col2 varchar(25),col3 tinyint,primary key(col2)); @@ -487,9 +492,9 @@ create table f1 (fa int primary key); CREATE TABLE c1 (ca INT, cb INT); ALTER TABLE c1 ADD CONSTRAINT ffa FOREIGN KEY (ca) REFERENCES f1(fa); desc c1; -Field Type Null Key Default Extra Comment -ca INT(32) YES MUL null -cb INT(32) YES null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +ca ¦ INT(32) ¦ YES ¦ MUL ¦ null ¦ ¦ 𝄀 +cb ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ drop table if exists c1; drop table if exists f1; create table f1 (a int, b int, c int, d int, e int, primary key(a,b), unique key(c,d)); @@ -503,7 +508,7 @@ create table c1 (a int primary key, f_a int, f_b int, f_c int, f_d int, constrai insert into c1 values (1,1,1,1,1); delete from f1 where a=1 and b=2; select * from c1; -a f_a f_b f_c f_d +➤ a[4,32,0] ¦ f_a[4,32,0] ¦ f_b[4,32,0] ¦ f_c[4,32,0] ¦ f_d[4,32,0] drop table c1; create table c1 (a int primary key, f_a int, f_b int, f_c int, f_d int, constraint ck foreign key(f_a,f_b) REFERENCES f1(a,b)); drop table c1; @@ -519,30 +524,30 @@ internal error: Cannot add or update a child row: a foreign key constraint fails insert into fk_02 values(0.001,'b',20,'2022-10-01'),(4.5,'a',21,'2022-10-01'),(56,'a',20,'2022-10-02'); internal error: Cannot add or update a child row: a foreign key constraint fails select * from fk_01; -col1 col2 col3 col4 -23.100 a 20 2022-10-01 -23.100 a 21 2022-10-01 -23.100 a 20 2022-10-02 +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +23.100 ¦ a ¦ 20 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 20 ¦ 2022-10-02 select * from fk_02; -col1 col2 col3 col4 -23.100 a 20 2022-10-01 -23.100 a 21 2022-10-01 -23.100 a 20 2022-10-02 +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +23.100 ¦ a ¦ 20 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 20 ¦ 2022-10-02 update fk_02 set col3=19 where col3=20; select * from fk_02; -col1 col2 col3 col4 -23.100 a 21 2022-10-01 -23.100 a 19 2022-10-01 -23.100 a 19 2022-10-02 +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +23.100 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 19 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 19 ¦ 2022-10-02 delete from fk_01 where col3=20; select * from fk_01; -col1 col2 col3 col4 -23.100 a 21 2022-10-01 +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +23.100 ¦ a ¦ 21 ¦ 2022-10-01 select * from fk_02; -col1 col2 col3 col4 -null a 21 2022-10-01 -null a 19 2022-10-01 -null a 19 2022-10-02 +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +null ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +null ¦ a ¦ 19 ¦ 2022-10-01 𝄀 +null ¦ a ¦ 19 ¦ 2022-10-02 drop table if exists c1; drop table if exists f1; create table f1(a int, b int, c int, primary key(a,b)); @@ -551,24 +556,24 @@ create table c1(a int primary key, c_a int, c_b int, constraint c1_ck foreign ke insert into c1 values (1,2,1),(2,2,2),(3,2,3); update f1 set a=111 where b=1; select * from f1; -a b c -2 2 2 -2 3 3 -111 1 1 +➤ a[4,32,0] ¦ b[4,32,0] ¦ c[4,32,0] 𝄀 +2 ¦ 2 ¦ 2 𝄀 +2 ¦ 3 ¦ 3 𝄀 +111 ¦ 1 ¦ 1 select * from c1; -a c_a c_b -1 111 1 -2 111 2 -3 111 3 +➤ a[4,32,0] ¦ c_a[4,32,0] ¦ c_b[4,32,0] 𝄀 +1 ¦ 111 ¦ 1 𝄀 +2 ¦ 111 ¦ 2 𝄀 +3 ¦ 111 ¦ 3 delete from c1; insert into c1 values (1,2,1),(2,2,2),(3,2,3); delete from f1 where b=2; select * from f1; -a b c -2 3 3 -111 1 1 +➤ a[4,32,0] ¦ b[4,32,0] ¦ c[4,32,0] 𝄀 +2 ¦ 3 ¦ 3 𝄀 +111 ¦ 1 ¦ 1 select * from c1; -a c_a c_b +➤ a[4,32,0] ¦ c_a[4,32,0] ¦ c_b[4,32,0] drop table if exists fk_02; drop table if exists fk_01; create table fk_01(col1 decimal(38,3),col2 char(25),col3 int,col4 date,primary key(col1,col3,col4)); @@ -580,32 +585,32 @@ internal error: Cannot add or update a child row: a foreign key constraint fails insert into fk_02 values(0.001,'b',20,'2022-10-01'),(4.5,'a',21,'2022-10-01'),(56,'a',20,'2022-10-02'); internal error: Cannot add or update a child row: a foreign key constraint fails select * from fk_01; -col1 col2 col3 col4 -23.100 a 20 2022-10-01 -23.100 a 21 2022-10-01 -23.100 a 20 2022-10-02 +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +23.100 ¦ a ¦ 20 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 20 ¦ 2022-10-02 select * from fk_02; -col1 col2 col3 col4 -23.100 a 20 2022-10-01 -23.100 a 21 2022-10-01 -23.100 a 20 2022-10-02 +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +23.100 ¦ a ¦ 20 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 20 ¦ 2022-10-02 update fk_02 set col3=19 where col3=20; select * from fk_02; -col1 col2 col3 col4 -23.100 a 21 2022-10-01 -23.100 a 19 2022-10-01 -23.100 a 19 2022-10-02 +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +23.100 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 19 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 19 ¦ 2022-10-02 delete from fk_01 where col3=19; select * from fk_01; -col1 col2 col3 col4 -23.100 a 20 2022-10-01 -23.100 a 21 2022-10-01 -23.100 a 20 2022-10-02 +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +23.100 ¦ a ¦ 20 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 20 ¦ 2022-10-02 select * from fk_02; -col1 col2 col3 col4 -23.100 a 21 2022-10-01 -23.100 a 19 2022-10-01 -23.100 a 19 2022-10-02 +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +23.100 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 19 ¦ 2022-10-01 𝄀 +23.100 ¦ a ¦ 19 ¦ 2022-10-02 drop table fk_02; drop table fk_01; create table fk_01(col1 decimal(38,3),col2 char(25),col3 int,col4 date,primary key(col1,col2), unique key(col3)); @@ -620,38 +625,38 @@ insert into fk_02 values(8.9,'c',20,'2022-10-01'),(null,'a',21,'2022-10-01'); insert into fk_02 values(3.5,'e',20,'2022-10-01'),(8.9,'a',21,'2022-10-01'); internal error: Cannot add or update a child row: a foreign key constraint fails select * from fk_01; -col1 col2 col3 col4 -8.900 a 20 2022-10-01 -6.000 a 21 2022-10-01 -4.300 c 20 2022-10-02 -select * from fk_02; -col1 col2 col3 col4 -8.900 a 20 2022-10-01 -8.900 a 21 2022-10-01 -6.000 a 20 2022-10-02 -8.900 c 20 2022-10-01 -null a 21 2022-10-01 +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +8.900 ¦ a ¦ 20 ¦ 2022-10-01 𝄀 +6.000 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +4.300 ¦ c ¦ 20 ¦ 2022-10-02 +select * from fk_02; +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +8.900 ¦ a ¦ 20 ¦ 2022-10-01 𝄀 +8.900 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +6.000 ¦ a ¦ 20 ¦ 2022-10-02 𝄀 +8.900 ¦ c ¦ 20 ¦ 2022-10-01 𝄀 +null ¦ a ¦ 21 ¦ 2022-10-01 update fk_02 set col1=6.0 where col3=21; select * from fk_02; -col1 col2 col3 col4 -8.900 a 20 2022-10-01 -6.000 a 20 2022-10-02 -8.900 c 20 2022-10-01 -6.000 a 21 2022-10-01 -6.000 a 21 2022-10-01 +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +8.900 ¦ a ¦ 20 ¦ 2022-10-01 𝄀 +6.000 ¦ a ¦ 20 ¦ 2022-10-02 𝄀 +8.900 ¦ c ¦ 20 ¦ 2022-10-01 𝄀 +6.000 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +6.000 ¦ a ¦ 21 ¦ 2022-10-01 update fk_01 set col2='d' where col1=6.0; select * from fk_01; -col1 col2 col3 col4 -8.900 a 20 2022-10-01 -4.300 c 20 2022-10-02 -6.000 d 21 2022-10-01 -select * from fk_02; -col1 col2 col3 col4 -8.900 a 20 2022-10-01 -6.000 a 20 2022-10-02 -8.900 c 20 2022-10-01 -6.000 a 21 2022-10-01 -6.000 a 21 2022-10-01 +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +8.900 ¦ a ¦ 20 ¦ 2022-10-01 𝄀 +4.300 ¦ c ¦ 20 ¦ 2022-10-02 𝄀 +6.000 ¦ d ¦ 21 ¦ 2022-10-01 +select * from fk_02; +➤ col1[3,38,3] ¦ col2[1,25,0] ¦ col3[4,32,0] ¦ col4[91,64,0] 𝄀 +8.900 ¦ a ¦ 20 ¦ 2022-10-01 𝄀 +6.000 ¦ a ¦ 20 ¦ 2022-10-02 𝄀 +8.900 ¦ c ¦ 20 ¦ 2022-10-01 𝄀 +6.000 ¦ a ¦ 21 ¦ 2022-10-01 𝄀 +6.000 ¦ a ¦ 21 ¦ 2022-10-01 set autocommit=0; create table t1(a int primary key); insert into t1 values (1); diff --git a/test/distributed/cases/git4data/clone/clone_fk_after_alter.result b/test/distributed/cases/git4data/clone/clone_fk_after_alter.result index 247f29fc460ae..8598f192443e3 100644 --- a/test/distributed/cases/git4data/clone/clone_fk_after_alter.result +++ b/test/distributed/cases/git4data/clone/clone_fk_after_alter.result @@ -25,25 +25,31 @@ select table_name, refer_table_name from mo_catalog.mo_foreign_keys where db_name = 'fk_clone_alter_child_src' order by constraint_name; -table_name refer_table_name -child parent +➤ table_name[12,-1,0] ¦ refer_table_name[12,-1,0] 𝄀 +child ¦ parent delete from fk_clone_alter_child_src.parent where id = 1; internal error: Cannot delete or update a parent row: a foreign key constraint fails create database fk_clone_alter_child_dst clone fk_clone_alter_child_src; select * from fk_clone_alter_child_dst.child order by id; -id parent_id payload -10 1 c1 -20 2 c2 +➤ id[4,32,0] ¦ parent_id[4,32,0] ¦ payload[12,-1,0] 𝄀 +10 ¦ 1 ¦ c1 𝄀 +20 ¦ 2 ¦ c2 show create table fk_clone_alter_child_dst.child; -Table Create Table -child CREATE TABLE `child` (\n `id` int NOT NULL,\n `parent_id` int DEFAULT NULL,\n `payload` varchar(64) DEFAULT NULL,\n PRIMARY KEY (`id`),\n CONSTRAINT `fk_child_parent` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +child ¦ CREATE TABLE `child` ( + `id` int NOT NULL, + `parent_id` int DEFAULT NULL, + `payload` varchar(64) DEFAULT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_child_parent` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) delete from fk_clone_alter_child_dst.parent where id = 1; internal error: Cannot delete or update a parent row: a foreign key constraint fails insert into fk_clone_alter_child_dst.child values (30, 999, 'invalid'); internal error: Cannot add or update a child row: a foreign key constraint fails insert into fk_clone_alter_child_dst.child values (30, 1, 'valid'); select count(*) from fk_clone_alter_child_dst.child; -count(*) +➤ count(*)[-5,64,0] 𝄀 3 drop database fk_clone_alter_child_dst; drop database fk_clone_alter_child_src; @@ -68,15 +74,27 @@ alter table fk_clone_alter_both_src.parent modify column description varchar(128 alter table fk_clone_alter_both_src.child add column created_at datetime; create database fk_clone_alter_both_dst clone fk_clone_alter_both_src; show create table fk_clone_alter_both_dst.parent; -Table Create Table -parent CREATE TABLE `parent` (\n `id` int NOT NULL,\n `code` varchar(16) DEFAULT NULL,\n `description` varchar(128) DEFAULT NULL,\n PRIMARY KEY (`id`),\n UNIQUE KEY `code` (`code`)\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +parent ¦ CREATE TABLE `parent` ( + `id` int NOT NULL, + `code` varchar(16) DEFAULT NULL, + `description` varchar(128) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `code` (`code`) +) show create table fk_clone_alter_both_dst.child; -Table Create Table -child CREATE TABLE `child` (\n `id` int NOT NULL,\n `parent_id` int DEFAULT NULL,\n `created_at` datetime DEFAULT NULL,\n PRIMARY KEY (`id`),\n CONSTRAINT `fk_both` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +child ¦ CREATE TABLE `child` ( + `id` int NOT NULL, + `parent_id` int DEFAULT NULL, + `created_at` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_both` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) insert into fk_clone_alter_both_dst.child(id, parent_id) values (2, 404); internal error: Cannot add or update a child row: a foreign key constraint fails select count(*) from fk_clone_alter_both_dst.child; -count(*) +➤ count(*)[-5,64,0] 𝄀 1 drop database fk_clone_alter_both_dst; drop database fk_clone_alter_both_src; @@ -102,11 +120,24 @@ alter table fk_clone_siblings_src.child_b add column b1 int default 2; alter table fk_clone_siblings_src.child_a add column a2 int default 3; create database fk_clone_siblings_dst clone fk_clone_siblings_src; show create table fk_clone_siblings_dst.child_a; -Table Create Table -child_a CREATE TABLE `child_a` (\n `id` int NOT NULL,\n `parent_id` int DEFAULT NULL,\n `a1` int DEFAULT 1,\n `a2` int DEFAULT 3,\n PRIMARY KEY (`id`),\n CONSTRAINT `fk_sibling_a` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +child_a ¦ CREATE TABLE `child_a` ( + `id` int NOT NULL, + `parent_id` int DEFAULT NULL, + `a1` int DEFAULT 1, + `a2` int DEFAULT 3, + PRIMARY KEY (`id`), + CONSTRAINT `fk_sibling_a` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) show create table fk_clone_siblings_dst.child_b; -Table Create Table -child_b CREATE TABLE `child_b` (\n `id` int NOT NULL,\n `parent_id` int DEFAULT NULL,\n `b1` int DEFAULT 2,\n PRIMARY KEY (`id`),\n CONSTRAINT `fk_sibling_b` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +child_b ¦ CREATE TABLE `child_b` ( + `id` int NOT NULL, + `parent_id` int DEFAULT NULL, + `b1` int DEFAULT 2, + PRIMARY KEY (`id`), + CONSTRAINT `fk_sibling_b` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) insert into fk_clone_siblings_dst.child_a values (1, 100, 1, 3); internal error: Cannot add or update a child row: a foreign key constraint fails insert into fk_clone_siblings_dst.child_b values (1, 100, 2); @@ -141,8 +172,8 @@ select leaf.id, middle.id, root.id from fk_clone_chain_dst.leaf leaf join fk_clone_chain_dst.middle middle on leaf.middle_id = middle.id join fk_clone_chain_dst.root root on middle.root_id = root.id; -id id id -1 1 1 +➤ id[4,32,0] ¦ id[4,32,0] ¦ id[4,32,0] 𝄀 +1 ¦ 1 ¦ 1 insert into fk_clone_chain_dst.leaf(id, middle_id) values (2, 999); internal error: Cannot add or update a child row: a foreign key constraint fails drop database fk_clone_chain_dst; @@ -169,8 +200,15 @@ alter table fk_clone_composite_src.child add column payload varchar(32); alter table fk_clone_composite_src.child modify column payload varchar(64); create database fk_clone_composite_dst clone fk_clone_composite_src; show create table fk_clone_composite_dst.child; -Table Create Table -child CREATE TABLE `child` (\n `id` int NOT NULL,\n `tenant_id` int DEFAULT NULL,\n `object_id` int DEFAULT NULL,\n `payload` varchar(64) DEFAULT NULL,\n PRIMARY KEY (`id`),\n CONSTRAINT `fk_composite` FOREIGN KEY (`tenant_id`,`object_id`) REFERENCES `parent` (`tenant_id`,`object_id`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +child ¦ CREATE TABLE `child` ( + `id` int NOT NULL, + `tenant_id` int DEFAULT NULL, + `object_id` int DEFAULT NULL, + `payload` varchar(64) DEFAULT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_composite` FOREIGN KEY (`tenant_id`,`object_id`) REFERENCES `parent` (`tenant_id`,`object_id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) insert into fk_clone_composite_dst.child(id, tenant_id, object_id) values (2, 1, 999); internal error: Cannot add or update a child row: a foreign key constraint fails drop database fk_clone_composite_dst; @@ -194,8 +232,17 @@ alter table fk_clone_multi_parent_src.child add column payload int default 0; alter table fk_clone_multi_parent_src.child add column note varchar(32); create database fk_clone_multi_parent_dst clone fk_clone_multi_parent_src; show create table fk_clone_multi_parent_dst.child; -Table Create Table -child CREATE TABLE `child` (\n `id` int NOT NULL,\n `parent_a_id` int DEFAULT NULL,\n `parent_b_id` int DEFAULT NULL,\n `payload` int DEFAULT 0,\n `note` varchar(32) DEFAULT NULL,\n PRIMARY KEY (`id`),\n CONSTRAINT `fk_multi_a` FOREIGN KEY (`parent_a_id`) REFERENCES `parent_a` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,\n CONSTRAINT `fk_multi_b` FOREIGN KEY (`parent_b_id`) REFERENCES `parent_b` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +child ¦ CREATE TABLE `child` ( + `id` int NOT NULL, + `parent_a_id` int DEFAULT NULL, + `parent_b_id` int DEFAULT NULL, + `payload` int DEFAULT 0, + `note` varchar(32) DEFAULT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_multi_a` FOREIGN KEY (`parent_a_id`) REFERENCES `parent_a` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `fk_multi_b` FOREIGN KEY (`parent_b_id`) REFERENCES `parent_b` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) insert into fk_clone_multi_parent_dst.child(id, parent_a_id, parent_b_id) values (1, 1, 1); internal error: Cannot add or update a child row: a foreign key constraint fails drop database fk_clone_multi_parent_dst; @@ -215,12 +262,19 @@ alter table fk_clone_self_src.node add column label varchar(32); alter table fk_clone_self_src.node add index idx_label(label); create database fk_clone_self_dst clone fk_clone_self_src; select id, parent_id from fk_clone_self_dst.node order by id; -id parent_id -1 null -2 1 +➤ id[4,32,0] ¦ parent_id[4,32,0] 𝄀 +1 ¦ null 𝄀 +2 ¦ 1 show create table fk_clone_self_dst.node; -Table Create Table -node CREATE TABLE `node` (\n `id` int NOT NULL,\n `parent_id` int DEFAULT NULL,\n `label` varchar(32) DEFAULT NULL,\n PRIMARY KEY (`id`),\n KEY `idx_label` (`label`),\n CONSTRAINT `fk_node_parent` FOREIGN KEY (`parent_id`) REFERENCES `node` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +node ¦ CREATE TABLE `node` ( + `id` int NOT NULL, + `parent_id` int DEFAULT NULL, + `label` varchar(32) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_label` (`label`), + CONSTRAINT `fk_node_parent` FOREIGN KEY (`parent_id`) REFERENCES `node` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) insert into fk_clone_self_dst.node(id, parent_id) values (3, 999); Cannot add or update a child row: a foreign key constraint fails drop database fk_clone_self_dst; @@ -244,8 +298,15 @@ references fk_clone_recreate_fk_src.parent(id); alter table fk_clone_recreate_fk_src.child add column note varchar(32); create database fk_clone_recreate_fk_dst clone fk_clone_recreate_fk_src; show create table fk_clone_recreate_fk_dst.child; -Table Create Table -child CREATE TABLE `child` (\n `id` int NOT NULL,\n `parent_id` int DEFAULT NULL,\n `payload` varchar(32) DEFAULT NULL,\n `note` varchar(32) DEFAULT NULL,\n PRIMARY KEY (`id`),\n CONSTRAINT `fk_recreated` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +child ¦ CREATE TABLE `child` ( + `id` int NOT NULL, + `parent_id` int DEFAULT NULL, + `payload` varchar(32) DEFAULT NULL, + `note` varchar(32) DEFAULT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_recreated` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) insert into fk_clone_recreate_fk_dst.child(id, parent_id) values (1, 999); internal error: Cannot add or update a child row: a foreign key constraint fails drop database fk_clone_recreate_fk_dst; @@ -265,13 +326,19 @@ select table_name, constraint_name, refer_table_name from mo_catalog.mo_foreign_keys where db_name = 'fk_clone_forward_src' order by constraint_name; -table_name constraint_name refer_table_name -child fk_forward parent +➤ table_name[12,-1,0] ¦ constraint_name[12,-1,0] ¦ refer_table_name[12,-1,0] 𝄀 +child ¦ fk_forward ¦ parent create table fk_clone_forward_src.parent (id int primary key); set foreign_key_checks = 1; show create table fk_clone_forward_src.child; -Table Create Table -child CREATE TABLE `child` (\n `id` int NOT NULL,\n `parent_id` int DEFAULT NULL,\n `payload` int DEFAULT NULL,\n PRIMARY KEY (`id`),\n CONSTRAINT `fk_forward` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +child ¦ CREATE TABLE `child` ( + `id` int NOT NULL, + `parent_id` int DEFAULT NULL, + `payload` int DEFAULT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_forward` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) insert into fk_clone_forward_src.child values (1, 404, 0); internal error: Cannot add or update a child row: a foreign key constraint fails drop database fk_clone_forward_src; @@ -292,13 +359,19 @@ select table_name, constraint_name, refer_table_name from mo_catalog.mo_foreign_keys where db_name = 'fk_clone_forward_drop_src' order by constraint_name; -table_name constraint_name refer_table_name -child fk_forward_drop parent +➤ table_name[12,-1,0] ¦ constraint_name[12,-1,0] ¦ refer_table_name[12,-1,0] 𝄀 +child ¦ fk_forward_drop ¦ parent create table fk_clone_forward_drop_src.parent (id int primary key); set foreign_key_checks = 1; show create table fk_clone_forward_drop_src.child; -Table Create Table -child CREATE TABLE `child` (\n `id` int NOT NULL,\n `parent_id` int DEFAULT NULL,\n `payload` int DEFAULT NULL,\n PRIMARY KEY (`id`),\n CONSTRAINT `fk_forward_drop` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +child ¦ CREATE TABLE `child` ( + `id` int NOT NULL, + `parent_id` int DEFAULT NULL, + `payload` int DEFAULT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_forward_drop` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) insert into fk_clone_forward_drop_src.child values (1, 404, 0); internal error: Cannot add or update a child row: a foreign key constraint fails drop database fk_clone_forward_drop_src; @@ -322,9 +395,9 @@ select table_name, constraint_name, refer_table_name from mo_catalog.mo_foreign_keys where db_name = 'fk_clone_self_external_src' order by table_name, constraint_name; -table_name constraint_name refer_table_name -child fk_self_external_child parent -parent fk_self_external_self parent +➤ table_name[12,-1,0] ¦ constraint_name[12,-1,0] ¦ refer_table_name[12,-1,0] 𝄀 +child ¦ fk_self_external_child ¦ parent 𝄀 +parent ¦ fk_self_external_self ¦ parent drop table fk_clone_self_external_src.child; drop table fk_clone_self_external_src.parent; drop database fk_clone_self_external_src; @@ -347,12 +420,17 @@ select table_name, column_name, refer_table_name, refer_column_name from mo_catalog.mo_foreign_keys where db_name = 'fk_clone_rename_columns_src' order by constraint_name; -table_name column_name refer_table_name refer_column_name -child parent_id parent id +➤ table_name[12,-1,0] ¦ column_name[12,-1,0] ¦ refer_table_name[12,-1,0] ¦ refer_column_name[12,-1,0] 𝄀 +child ¦ parent_id ¦ parent ¦ id create database fk_clone_rename_columns_dst clone fk_clone_rename_columns_src; show create table fk_clone_rename_columns_dst.child; -Table Create Table -child CREATE TABLE `child` (\n `id` int NOT NULL,\n `parent_id` int DEFAULT NULL,\n PRIMARY KEY (`id`),\n CONSTRAINT `fk_rename_columns` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +child ¦ CREATE TABLE `child` ( + `id` int NOT NULL, + `parent_id` int DEFAULT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_rename_columns` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) insert into fk_clone_rename_columns_dst.child values (1, 404); internal error: Cannot add or update a child row: a foreign key constraint fails drop database fk_clone_rename_columns_dst; @@ -379,11 +457,17 @@ insert into fk_clone_snapshot_src.child(id, parent_id) values (2, 2); create database fk_clone_snapshot_dst clone fk_clone_snapshot_src {snapshot = 'fk_clone_alter_snapshot'}; show create table fk_clone_snapshot_dst.child; -Table Create Table -child CREATE TABLE `child` (\n `id` int NOT NULL,\n `parent_id` int DEFAULT NULL,\n `before_snapshot` varchar(32) DEFAULT NULL,\n PRIMARY KEY (`id`),\n CONSTRAINT `fk_snapshot` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +child ¦ CREATE TABLE `child` ( + `id` int NOT NULL, + `parent_id` int DEFAULT NULL, + `before_snapshot` varchar(32) DEFAULT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_snapshot` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) select id, parent_id from fk_clone_snapshot_dst.child order by id; -id parent_id -1 1 +➤ id[4,32,0] ¦ parent_id[4,32,0] 𝄀 +1 ¦ 1 insert into fk_clone_snapshot_dst.child(id, parent_id) values (3, 999); internal error: Cannot add or update a child row: a foreign key constraint fails drop database fk_clone_snapshot_dst; @@ -407,8 +491,15 @@ use fk_clone_chain_clone_mid; alter table fk_clone_chain_clone_mid.child add column middle_value int; create database fk_clone_chain_clone_dst clone fk_clone_chain_clone_mid; show create table fk_clone_chain_clone_dst.child; -Table Create Table -child CREATE TABLE `child` (\n `id` int NOT NULL,\n `parent_id` int DEFAULT NULL,\n `source_value` int DEFAULT NULL,\n `middle_value` int DEFAULT NULL,\n PRIMARY KEY (`id`),\n CONSTRAINT `fk_clone_chain` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +child ¦ CREATE TABLE `child` ( + `id` int NOT NULL, + `parent_id` int DEFAULT NULL, + `source_value` int DEFAULT NULL, + `middle_value` int DEFAULT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_clone_chain` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT +) insert into fk_clone_chain_clone_dst.child(id, parent_id) values (1, 999); internal error: Cannot add or update a child row: a foreign key constraint fails drop database fk_clone_chain_clone_dst; @@ -432,8 +523,14 @@ rename table fk_clone_rename_src.child to fk_clone_rename_src.renamed_child; alter table fk_clone_rename_src.renamed_child add column payload varchar(32); create database fk_clone_rename_dst clone fk_clone_rename_src; show create table fk_clone_rename_dst.renamed_child; -Table Create Table -renamed_child CREATE TABLE `renamed_child` (\n `id` int NOT NULL,\n `parent_key` int DEFAULT NULL,\n `payload` varchar(32) DEFAULT NULL,\n PRIMARY KEY (`id`),\n CONSTRAINT `fk_rename` FOREIGN KEY (`parent_key`) REFERENCES `renamed_parent` (`parent_key`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +renamed_child ¦ CREATE TABLE `renamed_child` ( + `id` int NOT NULL, + `parent_key` int DEFAULT NULL, + `payload` varchar(32) DEFAULT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_rename` FOREIGN KEY (`parent_key`) REFERENCES `renamed_parent` (`parent_key`) ON DELETE RESTRICT ON UPDATE RESTRICT +) insert into fk_clone_rename_dst.renamed_child(id, parent_key) values (1, 999); internal error: Cannot add or update a child row: a foreign key constraint fails drop database fk_clone_rename_dst; diff --git a/test/distributed/cases/mo_cloud/mo_cloud.result b/test/distributed/cases/mo_cloud/mo_cloud.result index d5865f4f2dd17..f90bf1896e097 100644 --- a/test/distributed/cases/mo_cloud/mo_cloud.result +++ b/test/distributed/cases/mo_cloud/mo_cloud.result @@ -49,18 +49,18 @@ XA ¦ VARCHAR(3) ¦ null ¦ null 𝄀 SAVEPOINTS ¦ VARCHAR(3) ¦ null ¦ null SELECT attname AS name, mo_show_visible_bin(atttyp,3) AS data_type, replace(mo_table_col_max(att_database,att_relname,attname),'\\0', '') AS `maximum`, mo_table_col_min(att_database,att_relname,attname) as minimum from mo_catalog.mo_columns where att_database='information_schema' and att_relname='key_column_usage' and attname NOT IN ('__mo_rowid', '__mo_cpkey_col', '__mo_fake_pk_col') ORDER BY attnum; ➤ name[12,-1,0] ¦ data_type[12,-1,0] ¦ maximum[12,-1,0] ¦ minimum[12,-1,0] 𝄀 -CONSTRAINT_CATALOG ¦ VARCHAR(64) ¦ null ¦ null 𝄀 -CONSTRAINT_SCHEMA ¦ VARCHAR(64) ¦ null ¦ null 𝄀 -CONSTRAINT_NAME ¦ VARCHAR(64) ¦ null ¦ null 𝄀 -TABLE_CATALOG ¦ VARCHAR(64) ¦ null ¦ null 𝄀 -TABLE_SCHEMA ¦ VARCHAR(64) ¦ null ¦ null 𝄀 -TABLE_NAME ¦ VARCHAR(64) ¦ null ¦ null 𝄀 -COLUMN_NAME ¦ VARCHAR(64) ¦ null ¦ null 𝄀 -ORDINAL_POSITION ¦ INT UNSIGNED(32) ¦ null ¦ null 𝄀 -POSITION_IN_UNIQUE_CONSTRAINT ¦ INT UNSIGNED(32) ¦ null ¦ null 𝄀 -REFERENCED_TABLE_SCHEMA ¦ VARCHAR(64) ¦ null ¦ null 𝄀 -REFERENCED_TABLE_NAME ¦ VARCHAR(64) ¦ null ¦ null 𝄀 -REFERENCED_COLUMN_NAME ¦ VARCHAR(64) ¦ null ¦ null +constraint_catalog ¦ VARCHAR(64) ¦ null ¦ null 𝄀 +constraint_schema ¦ VARCHAR(64) ¦ null ¦ null 𝄀 +constraint_name ¦ VARCHAR(64) ¦ null ¦ null 𝄀 +table_catalog ¦ VARCHAR(64) ¦ null ¦ null 𝄀 +table_schema ¦ VARCHAR(64) ¦ null ¦ null 𝄀 +table_name ¦ VARCHAR(64) ¦ null ¦ null 𝄀 +column_name ¦ VARCHAR(64) ¦ null ¦ null 𝄀 +ordinal_position ¦ INT UNSIGNED(32) ¦ null ¦ null 𝄀 +position_in_unique_constraint ¦ INT UNSIGNED(32) ¦ null ¦ null 𝄀 +referenced_table_schema ¦ VARCHAR(64) ¦ null ¦ null 𝄀 +referenced_table_name ¦ VARCHAR(64) ¦ null ¦ null 𝄀 +referenced_column_name ¦ VARCHAR(64) ¦ null ¦ null SELECT attname AS name, mo_show_visible_bin(atttyp,3) AS data_type, replace(mo_table_col_max(att_database,att_relname,attname),'\\0', '') AS `maximum`, mo_table_col_min(att_database,att_relname,attname) as minimum from mo_catalog.mo_columns where att_database='information_schema' and att_relname='keywords' and attname NOT IN ('__mo_rowid', '__mo_cpkey_col', '__mo_fake_pk_col') ORDER BY attnum; ➤ name[12,-1,0] ¦ data_type[12,-1,0] ¦ maximum[12,-1,0] ¦ minimum[12,-1,0] 𝄀 WORD ¦ VARCHAR(64) ¦ null ¦ null 𝄀 @@ -207,7 +207,7 @@ account_id ¦ INT UNSIGNED(32) ¦ null ¦ null 𝄀 type ¦ VARCHAR(1024) ¦ null ¦ null 𝄀 __mo_cbkey_011collecttime010account_id011metric_name ¦ VARCHAR(65535) ¦ null ¦ null SELECT concat(DATE_FORMAT(date_add(`request_at`,Interval 1 MINUTE),'%Y-%m-%d %H'),':',LPAD(CAST(1 * floor(minute(date_add(`request_at`,Interval 1 MINUTE)) / 1) as int),2,0),':00') AS stat_ts, AVG(duration) AS value, `query_type` AS type FROM `system`.`statement_info` WHERE request_at >= '2023-07-28 04:20:43' AND request_at <= '2023-07-28 04:50:43' AND `query_type` in ('DQL','DDL','DML','DCL','TCL','Other') GROUP BY `query_type`, concat(DATE_FORMAT(date_add(`request_at`,Interval 1 MINUTE),'%Y-%m-%d %H'),':',LPAD(CAST(1 * floor(minute(date_add(`request_at`,Interval 1 MINUTE)) / 1) as int),2,0),':00') ORDER BY concat(DATE_FORMAT(date_add(`request_at`,Interval 1 MINUTE),'%Y-%m-%d %H'),':',LPAD(CAST(1 * floor(minute(date_add(`request_at`,Interval 1 MINUTE)) / 1) as int),2,0),':00')LIMIT 100; -➤ stat_ts[12,-1,0] ¦ value[8,54,0] ¦ type[12,-1,0] +➤ stat_ts[12,-1,0] ¦ value[3,38,4] ¦ type[12,-1,0] SELECT count(*) FROM (select `statement`,system.statement_info.statement_id,IF(`status`='Running', TIMESTAMPDIFF(MICROSECOND,`request_at`,now())*1000, `duration`) AS `duration`,`status`,`query_type`,`request_at`,system.statement_info.response_at,`user`,`database`,`transaction_id`,`session_id`,`rows_read`,`bytes_scan`,`result_count` from system.statement_info left join mo_catalog.statement_mo ON system.statement_info.statement_id = mo_catalog.statement_mo.statement_id where 1=1 AND `request_at` >= '2023-07-28 04:09:33' AND system.statement_info.statement_id LIKE '%cd%' AND system.statement_info.account = 'c3daefe4_2197_4192_a10e_d0acc5d9da30' AND `user` IN ('ab') AND `session_id` LIKE '%ef%' AND `duration` > 1000000000 AND `statement` LIKE '%show%' ESCAPE '\\\\' )t; SQL parser error: table "statement_mo" does not exist SELECT count(*) FROM `mo_catalog`.`mo_database`; @@ -227,21 +227,8 @@ engines ¦ CREATE TABLE `engines` ( `SAVEPOINTS` varchar(3) DEFAULT NULL ) SHOW CREATE TABLE information_schema.key_column_usage; -➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 -key_column_usage ¦ CREATE TABLE `key_column_usage` ( - `CONSTRAINT_CATALOG` varchar(64) DEFAULT NULL, - `CONSTRAINT_SCHEMA` varchar(64) DEFAULT NULL, - `CONSTRAINT_NAME` varchar(64) DEFAULT NULL, - `TABLE_CATALOG` varchar(64) DEFAULT NULL, - `TABLE_SCHEMA` varchar(64) DEFAULT NULL, - `TABLE_NAME` varchar(64) DEFAULT NULL, - `COLUMN_NAME` varchar(64) DEFAULT NULL, - `ORDINAL_POSITION` int unsigned DEFAULT NULL, - `POSITION_IN_UNIQUE_CONSTRAINT` int unsigned DEFAULT NULL, - `REFERENCED_TABLE_SCHEMA` varchar(64) DEFAULT NULL, - `REFERENCED_TABLE_NAME` varchar(64) DEFAULT NULL, - `REFERENCED_COLUMN_NAME` varchar(64) DEFAULT NULL -) +➤ View[12,-1,0] ¦ Create View[12,-1,0] ¦ character_set_client[12,-1,0] ¦ collation_connection[12,-1,0] 𝄀 +key_column_usage ¦ CREATE VIEW information_schema.KEY_COLUMN_USAGE AS SELECT CAST('def' AS varchar(64)) AS CONSTRAINT_CATALOG, CAST(fk.db_name AS varchar(64)) AS CONSTRAINT_SCHEMA, CAST(fk.constraint_name AS varchar(64)) AS CONSTRAINT_NAME, CAST('def' AS varchar(64)) AS TABLE_CATALOG, CAST(fk.db_name AS varchar(64)) AS TABLE_SCHEMA, CAST(fk.table_name AS varchar(64)) AS TABLE_NAME, CAST(fk.column_name AS varchar(64)) AS COLUMN_NAME, CAST(fk.constraint_id AS int unsigned) AS ORDINAL_POSITION, CAST(fk.constraint_id AS int unsigned) AS POSITION_IN_UNIQUE_CONSTRAINT, CAST(fk.refer_db_name AS varchar(64)) AS REFERENCED_TABLE_SCHEMA, CAST(fk.refer_table_name AS varchar(64)) AS REFERENCED_TABLE_NAME, CAST(fk.refer_column_name AS varchar(64)) AS REFERENCED_COLUMN_NAME FROM mo_catalog.mo_foreign_keys fk ¦ utf8mb4 ¦ utf8mb4_general_ci SHOW CREATE TABLE information_schema.keywords; ➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 keywords ¦ CREATE TABLE `keywords` ( @@ -512,18 +499,18 @@ XA ¦ VARCHAR(3) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 SAVEPOINTS ¦ VARCHAR(3) ¦ YES ¦ ¦ null ¦ ¦ DESC `information_schema`.`key_column_usage` ; ➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 -CONSTRAINT_CATALOG ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -CONSTRAINT_SCHEMA ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -CONSTRAINT_NAME ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -TABLE_CATALOG ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -TABLE_SCHEMA ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -TABLE_NAME ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -COLUMN_NAME ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -ORDINAL_POSITION ¦ INT UNSIGNED(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -POSITION_IN_UNIQUE_CONSTRAINT ¦ INT UNSIGNED(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -REFERENCED_TABLE_SCHEMA ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -REFERENCED_TABLE_NAME ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -REFERENCED_COLUMN_NAME ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ +constraint_catalog ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +constraint_schema ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +constraint_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_catalog ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_schema ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +column_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +ordinal_position ¦ INT UNSIGNED(32) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +position_in_unique_constraint ¦ INT UNSIGNED(32) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_table_schema ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_table_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_column_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ DESC `information_schema`.`keywords` ; ➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 WORD ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 @@ -784,7 +771,7 @@ SELECT count(*) FROM information_schema.tables WHERE table_schema = '' AND table SELECT datname AS name, IF (table_cnt IS NULL, 0, table_cnt) AS tables, role_name AS owner FROM (SELECT dat_id, datname, mo_database.created_time, IF(role_name IS NULL, '-', role_name) AS role_name FROM mo_catalog.mo_database LEFT JOIN mo_catalog.mo_role ON mo_database.owner = role_id) AS x LEFT JOIN(SELECT count(*) AS table_cnt, reldatabase_id FROM mo_catalog.mo_tables WHERE relkind IN ('r','v','e','cluster') GROUP BY reldatabase_id) AS y ON x.dat_id = y.reldatabase_id order by name; ➤ name[12,-1,0] ¦ tables[-5,64,0] ¦ owner[12,-1,0] 𝄀 information_schema ¦ 24 ¦ accountadmin 𝄀 -mo_catalog ¦ 25 ¦ - 𝄀 +mo_catalog ¦ 35 ¦ - 𝄀 mo_mo ¦ 0 ¦ accountadmin 𝄀 mysql ¦ 6 ¦ accountadmin 𝄀 system ¦ 1 ¦ accountadmin 𝄀 @@ -799,7 +786,7 @@ information_schema ¦ columns ¦ v ¦ accountadmin 𝄀 information_schema ¦ engines ¦ r ¦ accountadmin 𝄀 information_schema ¦ events ¦ r ¦ accountadmin 𝄀 information_schema ¦ files ¦ r ¦ accountadmin 𝄀 -information_schema ¦ key_column_usage ¦ r ¦ accountadmin 𝄀 +information_schema ¦ key_column_usage ¦ v ¦ accountadmin 𝄀 information_schema ¦ keywords ¦ r ¦ accountadmin 𝄀 information_schema ¦ parameters ¦ r ¦ accountadmin 𝄀 information_schema ¦ partitions ¦ v ¦ accountadmin 𝄀 @@ -873,14 +860,15 @@ system_metrics ¦ sql_transaction_total ¦ v ¦ accountadmin SELECT relname AS `name`, IF (role_name IS NULL, '-', role_name) AS `owner` FROM mo_catalog.mo_tables LEFT JOIN mo_catalog.mo_role ON mo_catalog.mo_tables.owner=role_id WHERE relkind IN ('v') AND reldatabase='information_schema'; ➤ name[12,-1,0] ¦ owner[12,-1,0] 𝄀 columns ¦ accountadmin 𝄀 +key_column_usage ¦ accountadmin 𝄀 +partitions ¦ accountadmin 𝄀 processlist ¦ accountadmin 𝄀 +referential_constraints ¦ accountadmin 𝄀 schemata ¦ accountadmin 𝄀 -tables ¦ accountadmin 𝄀 -partitions ¦ accountadmin 𝄀 -views ¦ accountadmin 𝄀 statistics ¦ accountadmin 𝄀 -referential_constraints ¦ accountadmin 𝄀 -table_constraints ¦ accountadmin +table_constraints ¦ accountadmin 𝄀 +tables ¦ accountadmin 𝄀 +views ¦ accountadmin SELECT relname AS `name`, IF (role_name IS NULL, '-', role_name) AS `owner` FROM mo_catalog.mo_tables LEFT JOIN mo_catalog.mo_role ON mo_catalog.mo_tables.owner=role_id WHERE relkind IN ('v') AND reldatabase='mo_sample_data_tpch_sf1'; ➤ name[12,-1,0] ¦ owner[12,-1,0] SELECT relname AS `name`, IF (role_name IS NULL, '-', role_name) AS `owner` FROM mo_catalog.mo_tables LEFT JOIN mo_catalog.mo_role ON mo_catalog.mo_tables.owner=role_id WHERE relkind IN ('v') AND reldatabase='mysql'; @@ -889,43 +877,42 @@ SELECT relname AS `name`, IF (role_name IS NULL, '-', role_name) AS `owner` FROM ➤ name[12,-1,0] ¦ owner[12,-1,0] SELECT relname AS `name`, IF (role_name IS NULL, '-', role_name) AS `owner` FROM mo_catalog.mo_tables LEFT JOIN mo_catalog.mo_role ON mo_catalog.mo_tables.owner=role_id WHERE relkind IN ('v') AND reldatabase='system_metrics'; ➤ name[12,-1,0] ¦ owner[12,-1,0] 𝄀 -sql_statement_total ¦ accountadmin 𝄀 -sql_statement_errors ¦ accountadmin 𝄀 -sql_transaction_total ¦ accountadmin 𝄀 -sql_transaction_errors ¦ accountadmin 𝄀 -sql_statement_duration_total ¦ accountadmin 𝄀 server_connections ¦ accountadmin 𝄀 -server_storage_usage ¦ accountadmin 𝄀 server_object_count ¦ accountadmin 𝄀 -server_snapshot_usage ¦ accountadmin +server_snapshot_usage ¦ accountadmin 𝄀 +server_storage_usage ¦ accountadmin 𝄀 +sql_statement_duration_total ¦ accountadmin 𝄀 +sql_statement_errors ¦ accountadmin 𝄀 +sql_statement_total ¦ accountadmin 𝄀 +sql_transaction_errors ¦ accountadmin 𝄀 +sql_transaction_total ¦ accountadmin set mo_table_stats.use_old_impl = yes; SELECT relname AS `name`, mo_table_rows(reldatabase, relname) AS `rows`, mo_table_size(reldatabase, relname) AS `size`, if (role_name IS NULL, '-', role_name) AS `owner` FROM mo_catalog.mo_tables LEFT JOIN mo_catalog.mo_role ON mo_catalog.mo_tables.owner=role_id WHERE relkind IN ('r','e','cluster') AND reldatabase='information_schema'; ➤ name[12,-1,0] ¦ rows[-5,64,0] ¦ size[-5,64,0] ¦ owner[12,-1,0] 𝄀 -key_column_usage ¦ 0 ¦ 0 ¦ accountadmin 𝄀 -profiling ¦ 0 ¦ 0 ¦ accountadmin 𝄀 -user_privileges ¦ 0 ¦ 0 ¦ accountadmin 𝄀 character_sets ¦ 3 ¦ 96 ¦ accountadmin 𝄀 -triggers ¦ 0 ¦ 0 ¦ accountadmin 𝄀 +collations ¦ 0 ¦ 0 ¦ accountadmin 𝄀 +column_privileges ¦ 0 ¦ 0 ¦ accountadmin 𝄀 engines ¦ 0 ¦ 0 ¦ accountadmin 𝄀 -routines ¦ 0 ¦ 0 ¦ accountadmin 𝄀 -parameters ¦ 0 ¦ 0 ¦ accountadmin 𝄀 +events ¦ 0 ¦ 0 ¦ accountadmin 𝄀 +files ¦ 0 ¦ 0 ¦ accountadmin 𝄀 keywords ¦ 747 ¦ 23904 ¦ accountadmin 𝄀 +parameters ¦ 0 ¦ 0 ¦ accountadmin 𝄀 +profiling ¦ 0 ¦ 0 ¦ accountadmin 𝄀 +routines ¦ 0 ¦ 0 ¦ accountadmin 𝄀 schema_privileges ¦ 0 ¦ 0 ¦ accountadmin 𝄀 table_privileges ¦ 0 ¦ 0 ¦ accountadmin 𝄀 -column_privileges ¦ 0 ¦ 0 ¦ accountadmin 𝄀 -collations ¦ 0 ¦ 0 ¦ accountadmin 𝄀 -events ¦ 0 ¦ 0 ¦ accountadmin 𝄀 -files ¦ 0 ¦ 0 ¦ accountadmin +triggers ¦ 0 ¦ 0 ¦ accountadmin 𝄀 +user_privileges ¦ 0 ¦ 0 ¦ accountadmin SELECT relname AS `name`, mo_table_rows(reldatabase, relname) AS `rows`, mo_table_size(reldatabase, relname) AS `size`, if (role_name IS NULL, '-', role_name) AS `owner` FROM mo_catalog.mo_tables LEFT JOIN mo_catalog.mo_role ON mo_catalog.mo_tables.owner=role_id WHERE relkind IN ('r','e','cluster') AND reldatabase='mo_sample_data_tpch_sf1'; ➤ name[12,-1,0] ¦ rows[-5,64,0] ¦ size[-5,64,0] ¦ owner[12,-1,0] SELECT relname AS `name`, mo_table_rows(reldatabase, relname) AS `rows`, mo_table_size(reldatabase, relname) AS `size`, if (role_name IS NULL, '-', role_name) AS `owner` FROM mo_catalog.mo_tables LEFT JOIN mo_catalog.mo_role ON mo_catalog.mo_tables.owner=role_id WHERE relkind IN ('r','e','cluster') AND reldatabase='mysql'; ➤ name[12,-1,0] ¦ rows[-5,64,0] ¦ size[-5,64,0] ¦ owner[12,-1,0] 𝄀 -user ¦ 0 ¦ 0 ¦ accountadmin 𝄀 +columns_priv ¦ 0 ¦ 0 ¦ accountadmin 𝄀 db ¦ 0 ¦ 0 ¦ accountadmin 𝄀 procs_priv ¦ 0 ¦ 0 ¦ accountadmin 𝄀 -columns_priv ¦ 0 ¦ 0 ¦ accountadmin 𝄀 +role_edges ¦ 0 ¦ 0 ¦ accountadmin 𝄀 tables_priv ¦ 0 ¦ 0 ¦ accountadmin 𝄀 -role_edges ¦ 0 ¦ 0 ¦ accountadmin +user ¦ 0 ¦ 0 ¦ accountadmin SELECT relname AS `name`, mo_table_rows(reldatabase, relname) AS `rows`, mo_table_size(reldatabase, relname) AS `size`, if (role_name IS NULL, '-', role_name) AS `owner` FROM mo_catalog.mo_tables LEFT JOIN mo_catalog.mo_role ON mo_catalog.mo_tables.owner=role_id WHERE relkind IN ('r','e','cluster') AND reldatabase='system'; ➤ name[12,-1,0] ¦ rows[-5,64,0] ¦ size[-5,64,0] ¦ owner[12,-1,0] 𝄀 statement_info ¦ 0 ¦ 0 ¦ accountadmin diff --git a/test/distributed/cases/prepare/prepare_ddl_schema_change.result b/test/distributed/cases/prepare/prepare_ddl_schema_change.result index e3db9a2fecfd5..527b79ad45acd 100644 --- a/test/distributed/cases/prepare/prepare_ddl_schema_change.result +++ b/test/distributed/cases/prepare/prepare_ddl_schema_change.result @@ -244,13 +244,13 @@ foreign key (pid) references expanded_parent(id) ); prepare expanded_like_stmt from 'create table expanded_like like expanded_src'; alter table expanded_parent drop primary key; +Cannot drop index 'PRIMARY': needed in a foreign key constraint execute expanded_like_stmt; -internal error: failed to add the foreign key constraint select count(*) from information_schema.referential_constraints where constraint_schema = 'prepare_ddl_schema_change' and table_name = 'expanded_like'; ➤ count(*)[-5,64,0] 𝄀 -0 +1 deallocate prepare expanded_like_stmt; set foreign_key_checks = 1; prepare missing_database_stmt from 'drop table if exists prepared_future_db.t'; diff --git a/test/distributed/cases/prepare/prepare_ddl_schema_change.sql b/test/distributed/cases/prepare/prepare_ddl_schema_change.sql index 22e9ed595e786..ec3bb63cad049 100644 --- a/test/distributed/cases/prepare/prepare_ddl_schema_change.sql +++ b/test/distributed/cases/prepare/prepare_ddl_schema_change.sql @@ -195,6 +195,9 @@ execute temporary_stmt; show tables like 'prepared_temporary'; deallocate prepare temporary_stmt; +-- MySQL-compatible exception: foreign_key_checks = 0 does not permit dropping +-- a PRIMARY/UNIQUE key required by a child foreign key. The failed ALTER keeps +-- the parent key intact, so the prepared CREATE TABLE LIKE succeeds with its FK. set foreign_key_checks = 0; create table expanded_parent (id int primary key); create table expanded_src ( diff --git a/test/distributed/cases/system_variable/system_variables.result b/test/distributed/cases/system_variable/system_variables.result index 290f48da83954..f3a9f5217caf2 100644 --- a/test/distributed/cases/system_variable/system_variables.result +++ b/test/distributed/cases/system_variable/system_variables.result @@ -7,149 +7,149 @@ set wait_timeout = default; set tx_isolation = default; set tx_isolation = default; show variables like 'server_id'; -Variable_name Value -server_id uuid +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +server_id ¦ dd1dccb4-4d3c-41f8-b482-5251dc7a41bf select @@server_id; -@@server_id -uuid +➤ @@server_id[12,0,0] 𝄀 +dd1dccb4-4d3c-41f8-b482-5251dc7a41bf show variables like 'auto%'; -Variable_name Value -auto_generate_certs on -auto_increment_increment 1 -auto_increment_offset 1 -autocommit on -automatic_sp_privileges on +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +auto_generate_certs ¦ on 𝄀 +auto_increment_increment ¦ 1 𝄀 +auto_increment_offset ¦ 1 𝄀 +autocommit ¦ on 𝄀 +automatic_sp_privileges ¦ on show variables like 'auto_increment_increment'; -Variable_name Value -auto_increment_increment 1 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +auto_increment_increment ¦ 1 set auto_increment_increment = 2; show variables like 'auto_increment_increment'; -Variable_name Value -auto_increment_increment 2 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +auto_increment_increment ¦ 2 set auto_increment_increment = 1+1; show variables like 'auto_increment_increment'; -Variable_name Value -auto_increment_increment 2 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +auto_increment_increment ¦ 2 set auto_increment_increment = 2*3; show variables like 'auto_increment_increment'; -Variable_name Value -auto_increment_increment 6 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +auto_increment_increment ¦ 6 show variables like 'init%'; -Variable_name Value -init_connect -init_file +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +init_connect ¦ 𝄀 +init_file ¦ show variables like 'init_connect'; -Variable_name Value -init_connect +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +init_connect ¦ show variables like 'interactive%'; -Variable_name Value -interactive_timeout 86400 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +interactive_timeout ¦ 86400 show variables like 'interactive_timeout'; -Variable_name Value -interactive_timeout 86400 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +interactive_timeout ¦ 86400 set interactive_timeout = 36600; show variables like 'interactive_timeout'; -Variable_name Value -interactive_timeout 36600 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +interactive_timeout ¦ 36600 set interactive_timeout = 30000+100; show variables like 'interactive_timeout'; -Variable_name Value -interactive_timeout 30100 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +interactive_timeout ¦ 30100 set global interactive_timeout = default; set @g_interactive_timeout_before = @@global.interactive_timeout; set global interactive_timeout = 30000+100; select @@global.interactive_timeout = @g_interactive_timeout_before; -@@interactive_timeout = @g_interactive_timeout_before +➤ @@global.interactive_timeout = @g_interactive_timeout_before[-7,1,0] 𝄀 0 show global variables like 'interactive_timeout'; -Variable_name Value -interactive_timeout 30100 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +interactive_timeout ¦ 30100 set global interactive_timeout = default; select @@session.interactive_timeout; -@@interactive_timeout +➤ @@interactive_timeout[12,0,0] 𝄀 30100 set interactive_timeout = 0; internal error: convert to the system variable int type failed set interactive_timeout = 1; show variables like 'interactive_timeout'; -Variable_name Value -interactive_timeout 1 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +interactive_timeout ¦ 1 set interactive_timeout = 86400; show variables like 'interactive_timeout'; -Variable_name Value -interactive_timeout 86400 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +interactive_timeout ¦ 86400 set interactive_timeout = 86401; invalid input: interactive_timeout must be <= 86400 show variables like 'interactive_timeout'; -Variable_name Value -interactive_timeout 86400 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +interactive_timeout ¦ 86400 show variables like 'lower%'; -Variable_name Value -lower_case_file_system off -lower_case_table_names 1 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +lower_case_file_system ¦ off 𝄀 +lower_case_table_names ¦ 1 show variables like 'lower_case_table_names'; -Variable_name Value -lower_case_table_names 1 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +lower_case_table_names ¦ 1 show variables like 'net_write_timeout'; -Variable_name Value -net_write_timeout 60 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +net_write_timeout ¦ 60 set net_write_timeout = 70; show variables like 'net_write_timeout'; -Variable_name Value -net_write_timeout 70 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +net_write_timeout ¦ 70 set net_write_timeout = 20*20; show variables like 'net_write_timeout'; -Variable_name Value -net_write_timeout 400 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +net_write_timeout ¦ 400 set net_write_timeout = 60; show variables like 'net_write_timeout'; -Variable_name Value -net_write_timeout 60 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +net_write_timeout ¦ 60 show variables where variable_name like 'system%' and variable_name != 'system_time_zone'; -Variable_name Value +➤ Variable_name[12,0,0] ¦ Value[12,0,0] select @@system_time_zone != ''; -@@system_time_zone != +➤ @@system_time_zone != [-7,1,0] 𝄀 1 show variables like 'trans%'; -Variable_name Value -transaction_alloc_block_size 8192 -transaction_isolation REPEATABLE-READ -transaction_operator_open_log off -transaction_prealloc_size 4096 -transaction_read_only 0 -transferred off +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +transaction_alloc_block_size ¦ 8192 𝄀 +transaction_isolation ¦ REPEATABLE-READ 𝄀 +transaction_operator_open_log ¦ off 𝄀 +transaction_prealloc_size ¦ 4096 𝄀 +transaction_read_only ¦ 0 𝄀 +transferred ¦ off show variables like 'transaction_isolation'; -Variable_name Value -transaction_isolation REPEATABLE-READ +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +transaction_isolation ¦ REPEATABLE-READ show variables like 'wait%'; -Variable_name Value -wait_timeout 86400 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +wait_timeout ¦ 86400 show variables like 'wait_timeout'; -Variable_name Value -wait_timeout 86400 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +wait_timeout ¦ 86400 set wait_timeout = 33600; show variables like 'wait_timeout'; -Variable_name Value -wait_timeout 33600 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +wait_timeout ¦ 33600 set wait_timeout = 10; show variables like 'wait_timeout'; -Variable_name Value -wait_timeout 10 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +wait_timeout ¦ 10 set wait_timeout = 0; internal error: convert to the system variable int type failed set wait_timeout = 1; show variables like 'wait_timeout'; -Variable_name Value -wait_timeout 1 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +wait_timeout ¦ 1 set wait_timeout = 86400; show variables like 'wait_timeout'; -Variable_name Value -wait_timeout 86400 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +wait_timeout ¦ 86400 set wait_timeout = 86401; invalid input: wait_timeout must be <= 86400 show variables like 'wait_timeout'; -Variable_name Value -wait_timeout 86400 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +wait_timeout ¦ 86400 set wait_timeout = 10; drop table if exists t; create table t( @@ -159,8 +159,8 @@ c int, primary key(a) ); show indexes from t; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Index_params Visible Expression -t 0 PRIMARY 1 a A 0 NULL NULL YES a +➤ Table[12,-1,0] ¦ Non_unique[-5,64,0] ¦ Key_name[12,-1,0] ¦ Seq_in_index[4,32,0] ¦ Column_name[12,-1,0] ¦ Collation[12,-1,0] ¦ Cardinality[-5,64,0] ¦ Sub_part[12,-1,0] ¦ Packed[12,-1,0] ¦ Null[12,-1,0] ¦ Index_type[12,-1,0] ¦ Comment[1,0,0] ¦ Index_comment[12,-1,0] ¦ Index_params[12,-1,0] ¦ Visible[12,-1,0] ¦ Expression[12,-1,0] 𝄀 +t ¦ 0 ¦ PRIMARY ¦ 1 ¦ a ¦ A ¦ 0 ¦ NULL ¦ NULL ¦ ¦ ¦ ¦ ¦ ¦ YES ¦ a create account acc_idx ADMIN_NAME 'root' IDENTIFIED BY '123456'; create database db1; use db1; @@ -172,395 +172,395 @@ c int, primary key(a) ); show indexes from t; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Index_params Visible Expression -t 0 PRIMARY 1 a A 0 NULL NULL YES a +➤ Table[12,-1,0] ¦ Non_unique[-5,64,0] ¦ Key_name[12,-1,0] ¦ Seq_in_index[4,32,0] ¦ Column_name[12,-1,0] ¦ Collation[12,-1,0] ¦ Cardinality[-5,64,0] ¦ Sub_part[12,-1,0] ¦ Packed[12,-1,0] ¦ Null[12,-1,0] ¦ Index_type[12,-1,0] ¦ Comment[1,0,0] ¦ Index_comment[12,-1,0] ¦ Index_params[12,-1,0] ¦ Visible[12,-1,0] ¦ Expression[12,-1,0] 𝄀 +t ¦ 0 ¦ PRIMARY ¦ 1 ¦ a ¦ A ¦ 0 ¦ NULL ¦ NULL ¦ ¦ ¦ ¦ ¦ ¦ YES ¦ a drop database db1; drop account acc_idx; use information_schema; show tables; -Tables_in_information_schema -character_sets -collations -column_privileges -columns -engines -events -files -key_column_usage -keywords -parameters -partitions -processlist -profiling -referential_constraints -routines -schema_privileges -schemata -statistics -table_constraints -table_privileges -tables -triggers -user_privileges +➤ Tables_in_information_schema[12,-1,0] 𝄀 +character_sets 𝄀 +collations 𝄀 +column_privileges 𝄀 +columns 𝄀 +engines 𝄀 +events 𝄀 +files 𝄀 +key_column_usage 𝄀 +keywords 𝄀 +parameters 𝄀 +partitions 𝄀 +processlist 𝄀 +profiling 𝄀 +referential_constraints 𝄀 +routines 𝄀 +schema_privileges 𝄀 +schemata 𝄀 +statistics 𝄀 +table_constraints 𝄀 +table_privileges 𝄀 +tables 𝄀 +triggers 𝄀 +user_privileges 𝄀 views desc key_column_usage; -Field Type Null Key Default Extra Comment -CONSTRAINT_CATALOG VARCHAR(64) YES null -CONSTRAINT_SCHEMA VARCHAR(64) YES null -CONSTRAINT_NAME VARCHAR(64) YES null -TABLE_CATALOG VARCHAR(64) YES null -TABLE_SCHEMA VARCHAR(64) YES null -TABLE_NAME VARCHAR(64) YES null -COLUMN_NAME VARCHAR(64) YES null -ORDINAL_POSITION INT UNSIGNED(32) YES null -POSITION_IN_UNIQUE_CONSTRAINT INT UNSIGNED(32) YES null -REFERENCED_TABLE_SCHEMA VARCHAR(64) YES null -REFERENCED_TABLE_NAME VARCHAR(64) YES null -REFERENCED_COLUMN_NAME VARCHAR(64) YES null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +constraint_catalog ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +constraint_schema ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +constraint_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_catalog ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_schema ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +column_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +ordinal_position ¦ INT UNSIGNED(32) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +position_in_unique_constraint ¦ INT UNSIGNED(32) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_table_schema ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_table_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +referenced_column_name ¦ VARCHAR(64) ¦ NO ¦ ¦ null ¦ ¦ select table_name, column_name from key_column_usage limit 2; -table_name column_name +➤ table_name[12,-1,0] ¦ column_name[12,-1,0] desc columns; -Field Type Null Key Default Extra Comment -table_catalog VARCHAR(3) NO null -table_schema VARCHAR(256) YES null -table_name VARCHAR(256) YES null -column_name VARCHAR(256) YES null -ordinal_position INT(0) YES null -column_default VARCHAR(65535) YES null -is_nullable VARCHAR(3) YES null -data_type VARCHAR(65535) YES null -character_maximum_length BIGINT(0) YES null -character_octet_length BIGINT(0) YES null -numeric_precision BIGINT(0) YES null -numeric_scale BIGINT(0) YES null -datetime_precision BIGINT(0) YES null -character_set_name VARCHAR(4) YES null -collation_name VARCHAR(8) YES null -column_type VARCHAR(65535) YES null -column_key VARCHAR(3) YES null -extra VARCHAR(24) YES null -privileges VARCHAR(31) NO null -column_comment VARCHAR(2048) YES null -generation_expression VARCHAR(500) YES null -srs_id BIGINT(0) YES null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +table_catalog ¦ VARCHAR(3) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_schema ¦ VARCHAR(256) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +table_name ¦ VARCHAR(256) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +column_name ¦ VARCHAR(256) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ordinal_position ¦ INT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +column_default ¦ VARCHAR(65535) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +is_nullable ¦ VARCHAR(3) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +data_type ¦ VARCHAR(65535) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +character_maximum_length ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +character_octet_length ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +numeric_precision ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +numeric_scale ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +datetime_precision ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +character_set_name ¦ VARCHAR(4) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +collation_name ¦ VARCHAR(8) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +column_type ¦ VARCHAR(65535) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +column_key ¦ VARCHAR(3) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +extra ¦ VARCHAR(24) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +privileges ¦ VARCHAR(31) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +column_comment ¦ VARCHAR(2048) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +generation_expression ¦ VARCHAR(500) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +srs_id ¦ BIGINT(0) ¦ YES ¦ ¦ null ¦ ¦ select table_name, column_name from columns where table_schema = 'mo_catalog' and column_name != '__mo_index_idx_col' and column_name != '__mo_index_pri_col' order by table_name, column_name limit 5; -table_name column_name -mo_account account_id -mo_account account_name -mo_account admin_name -mo_account comments -mo_account create_version +➤ table_name[12,-1,0] ¦ column_name[12,-1,0] 𝄀 +mo_account ¦ account_id 𝄀 +mo_account ¦ account_name 𝄀 +mo_account ¦ admin_name 𝄀 +mo_account ¦ comments 𝄀 +mo_account ¦ create_version desc views; -Field Type Null Key Default Extra Comment -table_catalog VARCHAR(3) NO null -table_schema VARCHAR(5000) YES null -table_name VARCHAR(5000) YES null -view_definition TEXT(0) YES null -check_option VARCHAR(4) NO null -is_updatable VARCHAR(3) NO null -definer VARCHAR(65535) YES null -security_type VARCHAR(7) NO null -character_set_client VARCHAR(7) NO null -collation_connection VARCHAR(18) NO null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +table_catalog ¦ VARCHAR(3) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +table_schema ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +table_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +view_definition ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +check_option ¦ VARCHAR(4) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +is_updatable ¦ VARCHAR(3) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +definer ¦ VARCHAR(65535) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +security_type ¦ VARCHAR(7) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +character_set_client ¦ VARCHAR(7) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +collation_connection ¦ VARCHAR(18) ¦ NO ¦ ¦ null ¦ ¦ select table_schema, table_name, definer from views where table_schema = 'system' order by table_name; -table_schema table_name definer -system error_info root@localhost -system log_info root@localhost -system span_info root@localhost -system sql_statement_hotspot root@localhost +➤ table_schema[12,-1,0] ¦ table_name[12,-1,0] ¦ definer[12,-1,0] 𝄀 +system ¦ error_info ¦ root@localhost 𝄀 +system ¦ log_info ¦ root@localhost 𝄀 +system ¦ span_info ¦ root@localhost 𝄀 +system ¦ sql_statement_hotspot ¦ root@localhost desc profiling; -Field Type Null Key Default Extra Comment -QUERY_ID INT(32) NO 0 -SEQ INT(32) NO 0 -STATE VARCHAR(30) NO -DURATION DECIMAL(9,6) NO 0.000000 -CPU_USER DECIMAL(9,6) YES null -CPU_SYSTEM DECIMAL(9,6) YES null -CONTEXT_VOLUNTARY INT(32) YES null -CONTEXT_INVOLUNTARY INT(32) YES null -BLOCK_OPS_IN INT(32) YES null -BLOCK_OPS_OUT INT(32) YES null -MESSAGES_SENT INT(32) YES null -MESSAGES_RECEIVED INT(32) YES null -PAGE_FAULTS_MAJOR INT(32) YES null -PAGE_FAULTS_MINOR INT(32) YES null -SWAPS INT(32) YES null -SOURCE_FUNCTION VARCHAR(30) YES null -SOURCE_FILE VARCHAR(20) YES null -SOURCE_LINE INT(32) YES null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +QUERY_ID ¦ INT(32) ¦ NO ¦ ¦ 0 ¦ ¦ 𝄀 +SEQ ¦ INT(32) ¦ NO ¦ ¦ 0 ¦ ¦ 𝄀 +STATE ¦ VARCHAR(30) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +DURATION ¦ DECIMAL(9,6) ¦ NO ¦ ¦ 0.000000 ¦ ¦ 𝄀 +CPU_USER ¦ DECIMAL(9,6) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +CPU_SYSTEM ¦ DECIMAL(9,6) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +CONTEXT_VOLUNTARY ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +CONTEXT_INVOLUNTARY ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +BLOCK_OPS_IN ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +BLOCK_OPS_OUT ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +MESSAGES_SENT ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +MESSAGES_RECEIVED ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +PAGE_FAULTS_MAJOR ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +PAGE_FAULTS_MINOR ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +SWAPS ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +SOURCE_FUNCTION ¦ VARCHAR(30) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +SOURCE_FILE ¦ VARCHAR(20) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +SOURCE_LINE ¦ INT(32) ¦ YES ¦ ¦ null ¦ ¦ select seq, state from profiling; -seq state +➤ seq[4,32,0] ¦ state[12,-1,0] desc user_privileges; -Field Type Null Key Default Extra Comment -GRANTEE VARCHAR(292) NO -TABLE_CATALOG VARCHAR(512) NO -PRIVILEGE_TYPE VARCHAR(64) NO -IS_GRANTABLE VARCHAR(3) NO +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +GRANTEE ¦ VARCHAR(292) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +TABLE_CATALOG ¦ VARCHAR(512) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +PRIVILEGE_TYPE ¦ VARCHAR(64) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +IS_GRANTABLE ¦ VARCHAR(3) ¦ NO ¦ ¦ ¦ ¦ select grantee, table_catalog from user_privileges limit 2; -grantee table_catalog +➤ grantee[12,-1,0] ¦ table_catalog[12,-1,0] desc schemata; -Field Type Null Key Default Extra Comment -catalog_name VARCHAR(3) NO null -schema_name VARCHAR(5000) YES null -default_character_set_name VARCHAR(7) NO null -default_collation_name VARCHAR(18) NO null -sql_path CHAR(0) YES null -default_encryption VARCHAR(3) NO null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +catalog_name ¦ VARCHAR(3) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +schema_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +default_character_set_name ¦ VARCHAR(7) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +default_collation_name ¦ VARCHAR(18) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 +sql_path ¦ CHAR(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +default_encryption ¦ VARCHAR(3) ¦ NO ¦ ¦ null ¦ ¦ select catalog_name, schema_name from schemata where schema_name = 'mo_catalog' or schema_name = 'mo_task' order by catalog_name, schema_name; -catalog_name schema_name -def mo_catalog -def mo_task +➤ catalog_name[12,-1,0] ¦ schema_name[12,-1,0] 𝄀 +def ¦ mo_catalog 𝄀 +def ¦ mo_task desc character_sets; -Field Type Null Key Default Extra Comment -CHARACTER_SET_NAME VARCHAR(64) YES null -DEFAULT_COLLATE_NAME VARCHAR(64) YES null -DESCRIPTION VARCHAR(2048) YES null -MAXLEN INT UNSIGNED(32) YES null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +CHARACTER_SET_NAME ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +DEFAULT_COLLATE_NAME ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +DESCRIPTION ¦ VARCHAR(2048) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +MAXLEN ¦ INT UNSIGNED(32) ¦ YES ¦ ¦ null ¦ ¦ select character_set_name, description, maxlen from character_sets limit 5; -character_set_name description maxlen -binary Binary pseudo charset 1 -utf8 UTF-8 Unicode 4 -utf8mb4 UTF-8 Unicode 4 +➤ character_set_name[12,-1,0] ¦ description[12,-1,0] ¦ maxlen[4,32,0] 𝄀 +binary ¦ Binary pseudo charset ¦ 1 𝄀 +utf8 ¦ UTF-8 Unicode ¦ 4 𝄀 +utf8mb4 ¦ UTF-8 Unicode ¦ 4 desc triggers; -Field Type Null Key Default Extra Comment -TRIGGER_CATALOG VARCHAR(64) YES null -TRIGGER_SCHEMA VARCHAR(64) YES null -TRIGGER_NAME VARCHAR(64) YES null -EVENT_MANIPULATION VARCHAR(10) YES null -EVENT_OBJECT_CATALOG VARCHAR(64) YES null -EVENT_OBJECT_SCHEMA VARCHAR(64) YES null -EVENT_OBJECT_TABLE VARCHAR(64) YES null -ACTION_ORDER INT UNSIGNED(32) YES null -ACTION_CONDITION BINARY(0) YES null -ACTION_STATEMENT TEXT(0) YES null -ACTION_ORIENTATION VARCHAR(3) YES null -ACTION_TIMING VARCHAR(10) YES null -ACTION_REFERENCE_OLD_TABLE BINARY(0) YES null -ACTION_REFERENCE_NEW_TABLE BINARY(0) YES null -ACTION_REFERENCE_OLD_ROW VARCHAR(3) YES null -ACTION_REFERENCE_NEW_ROW VARCHAR(3) YES null -CREATED TIMESTAMP(2) YES null -SQL_MODE VARCHAR(10) YES null -DEFINER VARCHAR(288) YES null -CHARACTER_SET_CLIENT VARCHAR(64) YES null -COLLATION_CONNECTION VARCHAR(64) YES null -DATABASE_COLLATION VARCHAR(64) YES null +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +TRIGGER_CATALOG ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +TRIGGER_SCHEMA ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +TRIGGER_NAME ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +EVENT_MANIPULATION ¦ VARCHAR(10) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +EVENT_OBJECT_CATALOG ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +EVENT_OBJECT_SCHEMA ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +EVENT_OBJECT_TABLE ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_ORDER ¦ INT UNSIGNED(32) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_CONDITION ¦ BINARY(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_STATEMENT ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_ORIENTATION ¦ VARCHAR(3) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_TIMING ¦ VARCHAR(10) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_REFERENCE_OLD_TABLE ¦ BINARY(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_REFERENCE_NEW_TABLE ¦ BINARY(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_REFERENCE_OLD_ROW ¦ VARCHAR(3) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +ACTION_REFERENCE_NEW_ROW ¦ VARCHAR(3) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +CREATED ¦ TIMESTAMP(2) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +SQL_MODE ¦ VARCHAR(10) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +DEFINER ¦ VARCHAR(288) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +CHARACTER_SET_CLIENT ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +COLLATION_CONNECTION ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +DATABASE_COLLATION ¦ VARCHAR(64) ¦ YES ¦ ¦ null ¦ ¦ select trigger_name, action_order from triggers limit 3; -trigger_name action_order +➤ trigger_name[12,-1,0] ¦ action_order[4,32,0] use mysql; select host, user from user limit 2; -host user +➤ host[1,255,0] ¦ user[1,32,0] desc db; -Field Type Null Key Default Extra Comment -Host CHAR(255) NO PRI -Db CHAR(64) NO PRI -User CHAR(32) NO PRI -Select_priv VARCHAR(10) NO N -Insert_priv VARCHAR(10) NO N -Update_priv VARCHAR(10) NO N -Delete_priv VARCHAR(10) NO N -Create_priv VARCHAR(10) NO N -Drop_priv VARCHAR(10) NO N -Grant_priv VARCHAR(10) NO N -References_priv VARCHAR(10) NO N -Index_priv VARCHAR(10) NO N -Alter_priv VARCHAR(10) NO N -Create_tmp_table_priv VARCHAR(10) NO N -Lock_tables_priv VARCHAR(10) NO N -Create_view_priv VARCHAR(10) NO N -Show_view_priv VARCHAR(10) NO N -Create_routine_priv VARCHAR(10) NO N -Alter_routine_priv VARCHAR(10) NO N -Execute_priv VARCHAR(10) NO N -Event_priv VARCHAR(10) NO N -Trigger_priv VARCHAR(10) NO N +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +Host ¦ CHAR(255) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Db ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +User ¦ CHAR(32) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Select_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Insert_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Update_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Delete_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Create_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Drop_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Grant_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +References_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Index_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Alter_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Create_tmp_table_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Lock_tables_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Create_view_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Show_view_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Create_routine_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Alter_routine_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Execute_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Event_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ 𝄀 +Trigger_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ N ¦ ¦ select db, user from db limit 5; -db user +➤ db[1,64,0] ¦ user[1,32,0] desc procs_priv; -Field Type Null Key Default Extra Comment -Host CHAR(255) NO PRI -Db CHAR(64) NO PRI -User CHAR(32) NO PRI -Routine_name CHAR(64) NO PRI -Routine_type VARCHAR(10) NO PRI null -Grantor VARCHAR(288) NO MUL -Proc_priv VARCHAR(10) NO -Timestamp TIMESTAMP(0) NO CURRENT_TIMESTAMP() +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +Host ¦ CHAR(255) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Db ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +User ¦ CHAR(32) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Routine_name ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Routine_type ¦ VARCHAR(10) ¦ NO ¦ PRI ¦ null ¦ ¦ 𝄀 +Grantor ¦ VARCHAR(288) ¦ NO ¦ MUL ¦ ¦ ¦ 𝄀 +Proc_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +Timestamp ¦ TIMESTAMP(0) ¦ NO ¦ ¦ CURRENT_TIMESTAMP() ¦ ¦ select routine_name, routine_type from procs_priv limit 5; -routine_name routine_type +➤ routine_name[1,64,0] ¦ routine_type[12,-1,0] desc columns_priv; -Field Type Null Key Default Extra Comment -Host CHAR(255) NO PRI -Db CHAR(64) NO PRI -User CHAR(32) NO PRI -Table_name CHAR(64) NO PRI -Column_name CHAR(64) NO PRI -Timestamp TIMESTAMP(0) NO CURRENT_TIMESTAMP() -Column_priv VARCHAR(10) NO +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +Host ¦ CHAR(255) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Db ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +User ¦ CHAR(32) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Table_name ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Column_name ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Timestamp ¦ TIMESTAMP(0) ¦ NO ¦ ¦ CURRENT_TIMESTAMP() ¦ ¦ 𝄀 +Column_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ ¦ ¦ select table_name, column_name from columns_priv limit 5; -table_name column_name +➤ table_name[1,64,0] ¦ column_name[1,64,0] desc tables_priv; -Field Type Null Key Default Extra Comment -Host CHAR(255) NO PRI -Db CHAR(64) NO PRI -User CHAR(32) NO PRI -Table_name CHAR(64) NO PRI -Grantor VARCHAR(288) NO MUL -Timestamp TIMESTAMP(0) NO CURRENT_TIMESTAMP() -Table_priv VARCHAR(10) NO -Column_priv VARCHAR(10) NO +➤ Field[1,0,0] ¦ Type[1,0,0] ¦ Null[1,0,0] ¦ Key[1,0,0] ¦ Default[1,0,0] ¦ Extra[1,0,0] ¦ Comment[1,0,0] 𝄀 +Host ¦ CHAR(255) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Db ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +User ¦ CHAR(32) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Table_name ¦ CHAR(64) ¦ NO ¦ PRI ¦ ¦ ¦ 𝄀 +Grantor ¦ VARCHAR(288) ¦ NO ¦ MUL ¦ ¦ ¦ 𝄀 +Timestamp ¦ TIMESTAMP(0) ¦ NO ¦ ¦ CURRENT_TIMESTAMP() ¦ ¦ 𝄀 +Table_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ ¦ ¦ 𝄀 +Column_priv ¦ VARCHAR(10) ¦ NO ¦ ¦ ¦ ¦ select host, table_name from tables_priv limit 5; -host table_name +➤ host[1,255,0] ¦ table_name[1,64,0] show variables like 'sql_select_limit'; -Variable_name Value -sql_select_limit 18446744073709551615 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +sql_select_limit ¦ 18446744073709551615 set sql_select_limit = 100000; show variables like 'sql_select_limit'; -Variable_name Value -sql_select_limit 100000 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +sql_select_limit ¦ 100000 set sql_select_limit = 1; show variables like 'sql_select_limit'; -Variable_name Value -sql_select_limit 1 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +sql_select_limit ¦ 1 SET SQL_SELECT_LIMIT = Default; show variables like 'sql_select_limit'; -Variable_name Value -sql_select_limit 18446744073709551615 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +sql_select_limit ¦ 18446744073709551615 show variables like 'max_allowed_packet'; -Variable_name Value -max_allowed_packet 67108864 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +max_allowed_packet ¦ 67108864 set max_allowed_packet = 10000; show variables like 'max_allowed_packet'; -Variable_name Value -max_allowed_packet 10000 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +max_allowed_packet ¦ 10000 set max_allowed_packet = default; show variables like 'max_allowed_packet'; -Variable_name Value -max_allowed_packet 67108864 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +max_allowed_packet ¦ 67108864 show variables like 'wait_timeout'; -Variable_name Value -wait_timeout 10 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +wait_timeout ¦ 10 set wait_timeout = 10000; show variables like 'wait_timeout'; -Variable_name Value -wait_timeout 10000 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +wait_timeout ¦ 10000 set wait_timeout = default; show variables like 'wait_timeout'; -Variable_name Value -wait_timeout 86400 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +wait_timeout ¦ 86400 show variables like 'character_set_results'; -Variable_name Value -character_set_results utf8 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +character_set_results ¦ utf8 set character_set_server = default; show variables like 'character_set_results'; -Variable_name Value -character_set_results utf8 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +character_set_results ¦ utf8 show variables like 'character_set_server'; -Variable_name Value -character_set_server utf8mb4 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +character_set_server ¦ utf8mb4 set character_set_server = default; show variables like 'character_set_server'; -Variable_name Value -character_set_server utf8mb4 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +character_set_server ¦ utf8mb4 show variables like 'transaction_isolation'; -Variable_name Value -transaction_isolation REPEATABLE-READ +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +transaction_isolation ¦ REPEATABLE-READ set transaction_isolation = default; show variables like 'transaction_isolation'; -Variable_name Value -transaction_isolation REPEATABLE-READ +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +transaction_isolation ¦ REPEATABLE-READ show variables like 'tx_isolation'; -Variable_name Value -tx_isolation REPEATABLE-READ +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +tx_isolation ¦ REPEATABLE-READ set tx_isolation = default; show variables like 'tx_isolation'; -Variable_name Value -tx_isolation REPEATABLE-READ +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +tx_isolation ¦ REPEATABLE-READ select @@sql_mode; -@@sql_mode +➤ @@sql_mode[12,0,0] 𝄀 ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES set @@sql_mode =''; select @@sql_mode; -@@sql_mode +➤ @@sql_mode[12,0,0] 𝄀 set @@sql_mode = 'ONLY_FULL_GROUP_BY'; select @@sql_mode; -@@sql_mode +➤ @@sql_mode[12,0,0] 𝄀 ONLY_FULL_GROUP_BY set @@sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES"; select @@sql_mode; -@@sql_mode +➤ @@sql_mode[12,0,0] 𝄀 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES set @@sql_mode = default; set global long_query_time = 1.1; show global variables like 'long_query_time'; -Variable_name Value -long_query_time 1.1 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +long_query_time ¦ 1.1 set global long_query_time = default; show global variables like 'long_query_time'; -Variable_name Value -long_query_time 10 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +long_query_time ¦ 10 create account acc_idx ADMIN_NAME 'root' IDENTIFIED BY '123456'; create database test_for_navicat; create database test_for_navicat; SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA where SCHEMA_NAME = 'test_for_navicat'; -SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME -test_for_navicat utf8mb4 utf8mb4_0900_ai_ci +➤ SCHEMA_NAME[12,-1,0] ¦ DEFAULT_CHARACTER_SET_NAME[12,-1,0] ¦ DEFAULT_COLLATION_NAME[12,-1,0] 𝄀 +test_for_navicat ¦ utf8mb4 ¦ utf8mb4_0900_ai_ci drop database test_for_navicat; drop account acc_idx; select @@profiling; -@@profiling +➤ @@profiling[12,0,0] 𝄀 0 select @@global.profiling; -@@profiling +➤ @@global.profiling[12,0,0] 𝄀 0 show variables like 'profiling'; -Variable_name Value -profiling 0 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +profiling ¦ 0 select @@profiling_history_size; -@@profiling_history_size +➤ @@profiling_history_size[12,0,0] 𝄀 15 select @@global.profiling_history_size; -@@profiling_history_size +➤ @@global.profiling_history_size[12,0,0] 𝄀 15 show variables like 'profiling_history_size'; -Variable_name Value -profiling_history_size 15 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +profiling_history_size ¦ 15 SET profiling_history_size = 0; select @@profiling_history_size; -@@profiling_history_size +➤ @@profiling_history_size[12,0,0] 𝄀 0 select @@global.profiling_history_size; -@@profiling_history_size +➤ @@global.profiling_history_size[12,0,0] 𝄀 15 show variables like 'profiling_history_size'; -Variable_name Value -profiling_history_size 0 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +profiling_history_size ¦ 0 SET profiling_history_size = 15; select @@profiling_history_size; -@@profiling_history_size +➤ @@profiling_history_size[12,0,0] 𝄀 15 select @@global.profiling_history_size; -@@profiling_history_size +➤ @@global.profiling_history_size[12,0,0] 𝄀 15 show variables like 'profiling_history_size'; -Variable_name Value -profiling_history_size 15 +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +profiling_history_size ¦ 15 SET profiling_history_size = default; select @@optimizer_switch; -@@optimizer_switch +➤ @@optimizer_switch[12,0,0] 𝄀 index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on,subquery_to_derived=off,prefer_ordering_index=on,hypergraph_optimizer=off,derived_condition_pushdown=on,hash_set_operations=on select @@global.optimizer_switch; -@@optimizer_switch +➤ @@global.optimizer_switch[12,0,0] 𝄀 index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on,subquery_to_derived=off,prefer_ordering_index=on,hypergraph_optimizer=off,derived_condition_pushdown=on,hash_set_operations=on show variables like 'optimizer_switch'; -Variable_name Value -optimizer_switch index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on,subquery_to_derived=off,prefer_ordering_index=on,hypergraph_optimizer=off,derived_condition_pushdown=on,hash_set_operations=on +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +optimizer_switch ¦ index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on,subquery_to_derived=off,prefer_ordering_index=on,hypergraph_optimizer=off,derived_condition_pushdown=on,hash_set_operations=on set optimizer_switch='semijoin=off'; select @@optimizer_switch; -@@optimizer_switch +➤ @@optimizer_switch[12,0,0] 𝄀 semijoin=off show variables like 'optimizer_switch'; -Variable_name Value -optimizer_switch semijoin=off +➤ Variable_name[12,0,0] ¦ Value[12,0,0] 𝄀 +optimizer_switch ¦ semijoin=off SET profiling_history_size = default; diff --git a/test/distributed/cases/table/truncate_table_2.result b/test/distributed/cases/table/truncate_table_2.result index 021ce0c696088..9a5c1b96acb1f 100644 --- a/test/distributed/cases/table/truncate_table_2.result +++ b/test/distributed/cases/table/truncate_table_2.result @@ -8,133 +8,132 @@ insert into trun_table_01 values (2,-2,90,56,9,8,10,50,99.0,82.99,'yellllow','20 insert into trun_table_01 values (3,-2,100,56,9,8,10,50,99.0,82.99,'yellllow','2021-01-21','1999-11-11 12:00:00','2010-11-11 11:00:00.00',false,77.3,'tttext','{"a": "3","b": [0,1,2]}'); insert into trun_table_01 values (4,-2,102,56,9,8,10,50,99.0,82.99,'yellllow','2022-10-11','1999-11-11 12:00:00','2010-11-11 11:00:00.00',false,209.43,'tttext','{"a": "3","b": [0,1,2]}'); select * from trun_table_01; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -1 -2 3 56 9 8 10 50 99.0 82.99 yellllow 1999-11-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} -2 -2 90 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 98.23 tttext {"a": "3", "b": [0, 1, 2]} -3 -2 100 56 9 8 10 50 99.0 82.99 yellllow 2021-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 77.30 tttext {"a": "3", "b": [0, 1, 2]} -4 -2 102 56 9 8 10 50 99.0 82.99 yellllow 2022-10-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 209.43 tttext {"a": "3", "b": [0, 1, 2]} +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +1 ¦ -2 ¦ 3 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 1999-11-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +2 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2011-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 98.23 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +3 ¦ -2 ¦ 100 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2021-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 77.30 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +4 ¦ -2 ¦ 102 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2022-10-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 209.43 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} truncate table trun_table_01; select * from trun_table_01; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] truncate table trun_table_01; select * from trun_table_01; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] insert into trun_table_01(clo2 ,clo3 ,clo4,clo5,clo6,clo7,clo8 ,col9,col10,col11,col12,col13,col14,col15,col16,col17,col18) values (-2,3,56,9,8,10,50,99.0,82.99,'yellllow','1999-11-11','1999-11-11 12:00:00','2010-11-11 11:00:00.00',false,54.3,'tttext','{"a": "3","b": [0,1,2]}'); insert into trun_table_01(clo2 ,clo3 ,clo4,clo5,clo6,clo7,clo8 ,col9,col10,col11,col12,col13,col14,col15,col16,col17,col18) values (-2,90,56,9,8,10,50,99.0,82.99,'yellllow','2011-01-21','1999-11-11 12:00:00','2010-11-11 11:00:00.00',false,11.43,'tttext','{"a": "3","b": [0,1,2]}'); select * from trun_table_01; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -1 -2 3 56 9 8 10 50 99.0 82.99 yellllow 1999-11-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 54.30 tttext {"a": "3", "b": [0, 1, 2]} -2 -2 90 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 11.43 tttext {"a": "3", "b": [0, 1, 2]} +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +1 ¦ -2 ¦ 3 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 1999-11-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 54.30 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +2 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2011-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 11.43 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} update trun_table_01 set clo3=90 ,col12='2011-01-21' where clo1=1; -Duplicate entry '3a155a41170b33cd' for key '__mo_cpkey_004clo3005col12' +[unknown result because it is related to issue#7133] update trun_table_01 set clo3=66 ,col12='2011-01-21' where clo1=1; +[unknown result because it is related to issue#7133] select * from trun_table_01; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -2 -2 90 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 11.43 tttext {"a": "3", "b": [0, 1, 2]} -1 -2 66 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 54.30 tttext {"a": "3", "b": [0, 1, 2]} +[unknown result because it is related to issue#7133] truncate table trun_table_01; select * from trun_table_01; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] delete from trun_table_01 where clo1=2; select * from trun_table_01; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] insert into trun_table_01(clo2,clo3,col12) select 36,118,'2002-12-03'; insert into trun_table_01(clo2,clo3,col12) select 45,108,'2012-02-23'; select * from trun_table_01; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -1 36 118 null null null null null null null style 2002-12-03 null null null null null null -2 45 108 null null null null null null null style 2012-02-23 null null null null null null +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +1 ¦ 36 ¦ 118 ¦ null ¦ null ¦ null ¦ null ¦ null ¦ null ¦ null ¦ style ¦ 2002-12-03 ¦ null ¦ null ¦ null ¦ null ¦ null ¦ null 𝄀 +2 ¦ 45 ¦ 108 ¦ null ¦ null ¦ null ¦ null ¦ null ¦ null ¦ null ¦ style ¦ 2012-02-23 ¦ null ¦ null ¦ null ¦ null ¦ null ¦ null truncate table trun_table_01; select * from trun_table_01; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] drop table trun_table_01; create table trun_table_01(clo1 tinyint AUTO_INCREMENT,clo2 smallint not null,clo3 int,clo4 bigint,clo5 tinyint unsigned,clo6 smallint unsigned,clo7 int unsigned,clo8 bigint unsigned,col9 float,col10 double,col11 varchar(255) default 'style',col12 Date,col13 DateTime,col14 timestamp,col15 bool,col16 decimal(5,2),col17 text,col18 json,primary key(clo3,col12),unique key uk1 (col16),key k1 (clo1)); insert into trun_table_01 values (1,-2,3,56,9,8,10,50,99.0,82.99,'yellllow','1999-11-11','1999-11-11 12:00:00','2010-11-11 11:00:00.00',false,23.98430943,'tttext','{"a": "3","b": [0,1,2]}'); select * from trun_table_01; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -1 -2 3 56 9 8 10 50 99.0 82.99 yellllow 1999-11-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +1 ¦ -2 ¦ 3 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 1999-11-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} create temporary table trun_table_02(clo1 tinyint AUTO_INCREMENT,clo2 smallint not null,clo3 int,clo4 bigint,clo5 tinyint unsigned,clo6 smallint unsigned,clo7 int unsigned,clo8 bigint unsigned,col9 float,col10 double,col11 varchar(255) default 'style',col12 Date,col13 DateTime,col14 timestamp,col15 bool,col16 decimal(5,2),col17 text,col18 json,primary key(clo3,col12),unique key uk1 (col16),key k1 (clo1)); insert into trun_table_02 values (1,-2,3,56,9,8,10,50,99.0,82.99,'yellllow','1999-11-11','1999-11-11 12:00:00','2010-11-11 11:00:00.00',false,23.98430943,'tttext','{"a": "3","b": [0,1,2]}'); insert into trun_table_02 values (2,-2,90,56,9,8,10,50,99.0,82.99,'yellllow','2011-01-21','1999-11-11 12:00:00','2010-11-11 11:00:00.00',false,98.23,'tttext','{"a": "3","b": [0,1,2]}'); insert into trun_table_02 values (3,-2,100,56,9,8,10,50,99.0,82.99,'yellllow','2021-01-21','1999-11-11 12:00:00','2010-11-11 11:00:00.00',false,77.3,'tttext','{"a": "3","b": [0,1,2]}'); insert into trun_table_02 values (4,-2,102,56,9,8,10,50,99.0,82.99,'yellllow','2022-10-11','1999-11-11 12:00:00','2010-11-11 11:00:00.00',false,209.43,'tttext','{"a": "3","b": [0,1,2]}'); select * from trun_table_02; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -1 -2 3 56 9 8 10 50 99.0 82.99 yellllow 1999-11-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} -2 -2 90 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 98.23 tttext {"a": "3", "b": [0, 1, 2]} -3 -2 100 56 9 8 10 50 99.0 82.99 yellllow 2021-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 77.30 tttext {"a": "3", "b": [0, 1, 2]} -4 -2 102 56 9 8 10 50 99.0 82.99 yellllow 2022-10-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 209.43 tttext {"a": "3", "b": [0, 1, 2]} +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +1 ¦ -2 ¦ 3 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 1999-11-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +2 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2011-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 98.23 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +3 ¦ -2 ¦ 100 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2021-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 77.30 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +4 ¦ -2 ¦ 102 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2022-10-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 209.43 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} truncate table trun_table_02; no such table truncate_table_2.trun_table_02 select * from trun_table_02; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -1 -2 3 56 9 8 10 50 99.0 82.99 yellllow 1999-11-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} -2 -2 90 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 98.23 tttext {"a": "3", "b": [0, 1, 2]} -3 -2 100 56 9 8 10 50 99.0 82.99 yellllow 2021-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 77.30 tttext {"a": "3", "b": [0, 1, 2]} -4 -2 102 56 9 8 10 50 99.0 82.99 yellllow 2022-10-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 209.43 tttext {"a": "3", "b": [0, 1, 2]} +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +1 ¦ -2 ¦ 3 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 1999-11-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +2 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2011-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 98.23 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +3 ¦ -2 ¦ 100 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2021-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 77.30 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +4 ¦ -2 ¦ 102 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2022-10-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 209.43 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} delete from trun_table_02 where clo1=1; --- @regex("Duplicate entry '\(100,2021-01-21\)' for key '(__mo_cpkey_col|\(clo3,col12\))'", true) insert into trun_table_02 values (3,-2,100,56,9,8,10,50,99.0,82.99,'yellllow','2021-01-21','1999-11-11 12:00:00','2010-11-11 11:00:00.00',false,23.98430943,'tttext','{"a": "3","b": [0,1,2]}'); -Duplicate entry '(100,2021-01-21)' for key '__mo_cpkey_col' --- @regex("Duplicate entry '\(102,2022-10-11\)' for key '(__mo_cpkey_col|\(clo3,col12\))'", true) +-- @regex("Duplicate entry '\(100,2021-01-21\)' for key '(__mo_cpkey_col|\(clo3,col12\))'", true) +Duplicate entry '(100,2021-01-21)' for key '(clo3,col12)' insert into trun_table_02 values (4,-2,102,56,9,8,10,50,99.0,82.99,'yellllow','2022-10-11','1999-11-11 12:00:00','2010-11-11 11:00:00.00',false,2.43,'tttext','{"a": "3","b": [0,1,2]}'); -Duplicate entry '(102,2022-10-11)' for key '__mo_cpkey_col' +-- @regex("Duplicate entry '\(102,2022-10-11\)' for key '(__mo_cpkey_col|\(clo3,col12\))'", true) +Duplicate entry '(102,2022-10-11)' for key '(clo3,col12)' select * from trun_table_02; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -2 -2 90 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 98.23 tttext {"a": "3", "b": [0, 1, 2]} -3 -2 100 56 9 8 10 50 99.0 82.99 yellllow 2021-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 77.30 tttext {"a": "3", "b": [0, 1, 2]} -4 -2 102 56 9 8 10 50 99.0 82.99 yellllow 2022-10-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 209.43 tttext {"a": "3", "b": [0, 1, 2]} +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +2 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2011-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 98.23 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +3 ¦ -2 ¦ 100 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2021-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 77.30 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +4 ¦ -2 ¦ 102 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2022-10-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 209.43 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} delete from trun_table_02 where clo1=3; select * from trun_table_02; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -2 -2 90 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 98.23 tttext {"a": "3", "b": [0, 1, 2]} -4 -2 102 56 9 8 10 50 99.0 82.99 yellllow 2022-10-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 209.43 tttext {"a": "3", "b": [0, 1, 2]} +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +2 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2011-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 98.23 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +4 ¦ -2 ¦ 102 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2022-10-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 209.43 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} truncate table trun_table_02; no such table truncate_table_2.trun_table_02 select * from trun_table_02; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -2 -2 90 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 98.23 tttext {"a": "3", "b": [0, 1, 2]} -4 -2 102 56 9 8 10 50 99.0 82.99 yellllow 2022-10-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 209.43 tttext {"a": "3", "b": [0, 1, 2]} +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +2 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2011-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 98.23 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +4 ¦ -2 ¦ 102 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2022-10-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 209.43 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} insert into trun_table_02 select * from trun_table_01; select * from trun_table_02; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -2 -2 90 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 98.23 tttext {"a": "3", "b": [0, 1, 2]} -4 -2 102 56 9 8 10 50 99.0 82.99 yellllow 2022-10-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 209.43 tttext {"a": "3", "b": [0, 1, 2]} -1 -2 3 56 9 8 10 50 99.0 82.99 yellllow 1999-11-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +2 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2011-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 98.23 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +4 ¦ -2 ¦ 102 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2022-10-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 209.43 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +1 ¦ -2 ¦ 3 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 1999-11-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} update trun_table_02 set clo3=90 where clo1=1; select * from trun_table_02; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -2 -2 90 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 98.23 tttext {"a": "3", "b": [0, 1, 2]} -4 -2 102 56 9 8 10 50 99.0 82.99 yellllow 2022-10-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 209.43 tttext {"a": "3", "b": [0, 1, 2]} -1 -2 90 56 9 8 10 50 99.0 82.99 yellllow 1999-11-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +2 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2011-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 98.23 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +4 ¦ -2 ¦ 102 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2022-10-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 209.43 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +1 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 1999-11-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} update trun_table_02 set clo3=90, col12='1992-11-01' where clo1=1; select * from trun_table_02; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -2 -2 90 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 98.23 tttext {"a": "3", "b": [0, 1, 2]} -4 -2 102 56 9 8 10 50 99.0 82.99 yellllow 2022-10-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 209.43 tttext {"a": "3", "b": [0, 1, 2]} -1 -2 90 56 9 8 10 50 99.0 82.99 yellllow 1992-11-01 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +2 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2011-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 98.23 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +4 ¦ -2 ¦ 102 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2022-10-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 209.43 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +1 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 1992-11-01 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} truncate table trun_table_02; no such table truncate_table_2.trun_table_02 select * from trun_table_02; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -2 -2 90 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 98.23 tttext {"a": "3", "b": [0, 1, 2]} -4 -2 102 56 9 8 10 50 99.0 82.99 yellllow 2022-10-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 209.43 tttext {"a": "3", "b": [0, 1, 2]} -1 -2 90 56 9 8 10 50 99.0 82.99 yellllow 1992-11-01 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +2 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2011-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 98.23 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +4 ¦ -2 ¦ 102 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2022-10-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 209.43 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +1 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 1992-11-01 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} drop table trun_table_02; create external table trun_table_03(clo1 tinyint AUTO_INCREMENT,clo2 smallint not null,clo3 int,clo4 bigint,clo5 tinyint unsigned,clo6 smallint unsigned,clo7 int unsigned,clo8 bigint unsigned,col9 float,col10 double,col11 varchar(255) default 'style',col12 Date,col13 DateTime,col14 timestamp,col15 bool,col16 decimal(5,2),col17 text,col18 json)infile{"filepath"='$resources/external_table_file/trun_table.csv'} fields terminated by '|' lines terminated by '\n'; select * from trun_table_03; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -1 -2 3 56 9 8 10 50 99.0 82.99 yellllow 1999-11-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} -2 -2 90 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} -3 -2 100 56 9 8 10 50 99.0 82.99 yellllow 2021-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} -4 -2 102 56 9 8 10 50 99.0 82.99 yellllow 2022-10-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +1 ¦ -2 ¦ 3 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 1999-11-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +2 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2011-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +3 ¦ -2 ¦ 100 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2021-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +4 ¦ -2 ¦ 102 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2022-10-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} truncate table trun_table_03; select * from trun_table_03; -clo1 clo2 clo3 clo4 clo5 clo6 clo7 clo8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 -1 -2 3 56 9 8 10 50 99.0 82.99 yellllow 1999-11-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} -2 -2 90 56 9 8 10 50 99.0 82.99 yellllow 2011-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} -3 -2 100 56 9 8 10 50 99.0 82.99 yellllow 2021-01-21 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} -4 -2 102 56 9 8 10 50 99.0 82.99 yellllow 2022-10-11 1999-11-11 12:00:00 2010-11-11 11:00:00 0 23.98 tttext {"a": "3", "b": [0, 1, 2]} +➤ clo1[-6,8,0] ¦ clo2[5,16,0] ¦ clo3[4,32,0] ¦ clo4[-5,64,0] ¦ clo5[-6,8,0] ¦ clo6[5,16,0] ¦ clo7[4,32,0] ¦ clo8[-5,64,0] ¦ col9[7,24,0] ¦ col10[8,54,0] ¦ col11[12,-1,0] ¦ col12[91,64,0] ¦ col13[93,64,0] ¦ col14[93,64,0] ¦ col15[-7,1,0] ¦ col16[3,5,2] ¦ col17[12,0,0] ¦ col18[-1,2147483647,0] 𝄀 +1 ¦ -2 ¦ 3 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 1999-11-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +2 ¦ -2 ¦ 90 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2011-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +3 ¦ -2 ¦ 100 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2021-01-21 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} 𝄀 +4 ¦ -2 ¦ 102 ¦ 56 ¦ 9 ¦ 8 ¦ 10 ¦ 50 ¦ 99.0 ¦ 82.99 ¦ yellllow ¦ 2022-10-11 ¦ 1999-11-11 12:00:00 ¦ 2010-11-11 11:00:00 ¦ 0 ¦ 23.98 ¦ tttext ¦ {"a": "3", "b": [0, 1, 2]} truncate table trun_table_03; drop table trun_table_03; create external table trun_table_03(clo1 tinyint AUTO_INCREMENT,clo2 smallint not null,clo3 int,clo4 bigint,clo5 tinyint unsigned,clo6 smallint unsigned,clo7 int unsigned,clo8 bigint unsigned,col9 float,col10 double,col11 varchar(255) default 'style',col12 Date,col13 DateTime,col14 timestamp,col15 bool,col16 decimal(5,2),col17 text,col18 json)infile{"filepath"='$resources/external_table_file/trun_table.csv'} fields terminated by '|' lines terminated by '\n'; @@ -167,7 +166,7 @@ truncate table span_info; no such table system.span_info use information_schema; truncate table key_column_usage ; -internal error: do not have privilege to execute the statement +no such table information_schema.key_column_usage truncate table columns; no such table information_schema.columns truncate table profiling;