From 123bc8f7f49470636be1e479a8b081f67b6c150b Mon Sep 17 00:00:00 2001 From: LiuBo Date: Fri, 20 Dec 2024 13:15:13 +0800 Subject: [PATCH 1/5] [improvement] proxy: filter duplicate set stmts. (#20828) filter duplicate set stmts in proxy. Approved by: @zhangxu19830126 --- pkg/proxy/client_conn.go | 15 +++++++++++++- pkg/proxy/client_conn_test.go | 38 +++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/pkg/proxy/client_conn.go b/pkg/proxy/client_conn.go index da134e30d92b9..974be97e46411 100644 --- a/pkg/proxy/client_conn.go +++ b/pkg/proxy/client_conn.go @@ -107,7 +107,8 @@ type ClientConn interface { } type migration struct { - setVarStmts []string + setVarStmtMap map[string]struct{} + setVarStmts []string } // clientConn is the connection between proxy and client. @@ -231,6 +232,7 @@ func newClientConn( } c.tlsConfig = tlsConfig } + c.migration.setVarStmtMap = make(map[string]struct{}) return c, nil } @@ -408,6 +410,17 @@ func (c *clientConn) handleKill(e *killEvent, resp chan<- []byte) error { // handleSetVar handles the set variable event. func (c *clientConn) handleSetVar(e *setVarEvent) error { defer e.notify() + _, ok := c.migration.setVarStmtMap[e.stmt] + if ok { + for i := 0; i < len(c.migration.setVarStmts); i++ { + if c.migration.setVarStmts[i] == e.stmt { + c.migration.setVarStmts = append(c.migration.setVarStmts[:i], c.migration.setVarStmts[i+1:]...) + i-- + } + } + } else { + c.migration.setVarStmtMap[e.stmt] = struct{}{} + } c.migration.setVarStmts = append(c.migration.setVarStmts, e.stmt) return nil } diff --git a/pkg/proxy/client_conn_test.go b/pkg/proxy/client_conn_test.go index e37be86e89af9..21b79351dbce7 100644 --- a/pkg/proxy/client_conn_test.go +++ b/pkg/proxy/client_conn_test.go @@ -708,3 +708,41 @@ func Test_connectToBackend(t *testing.T) { require.Error(t, err) require.Nil(t, sConn) } + +func TestHandleSetVar(t *testing.T) { + defer leaktest.AfterTest(t)() + var cc clientConn + cc.migration.setVarStmtMap = make(map[string]struct{}) + e0 := &setVarEvent{ + baseEvent: baseEvent{waitC: make(chan struct{}, 5)}, + stmt: "set autocommit=0", + } + require.NoError(t, cc.handleSetVar(e0)) + require.Equal(t, 1, len(cc.migration.setVarStmtMap)) + require.Equal(t, 1, len(cc.migration.setVarStmts)) + require.Equal(t, e0.stmt, cc.migration.setVarStmts[len(cc.migration.setVarStmts)-1]) + + require.NoError(t, cc.handleSetVar(e0)) + require.Equal(t, 1, len(cc.migration.setVarStmtMap)) + require.Equal(t, 1, len(cc.migration.setVarStmts)) + require.Equal(t, e0.stmt, cc.migration.setVarStmts[len(cc.migration.setVarStmts)-1]) + + e1 := &setVarEvent{ + baseEvent: baseEvent{waitC: make(chan struct{}, 5)}, + stmt: "set autocommit=1", + } + require.NoError(t, cc.handleSetVar(e1)) + require.Equal(t, 2, len(cc.migration.setVarStmtMap)) + require.Equal(t, 2, len(cc.migration.setVarStmts)) + require.Equal(t, e1.stmt, cc.migration.setVarStmts[len(cc.migration.setVarStmts)-1]) + + require.NoError(t, cc.handleSetVar(e0)) + require.Equal(t, 2, len(cc.migration.setVarStmtMap)) + require.Equal(t, 2, len(cc.migration.setVarStmts)) + require.Equal(t, e0.stmt, cc.migration.setVarStmts[len(cc.migration.setVarStmts)-1]) + + require.NoError(t, cc.handleSetVar(e1)) + require.Equal(t, 2, len(cc.migration.setVarStmtMap)) + require.Equal(t, 2, len(cc.migration.setVarStmts)) + require.Equal(t, e1.stmt, cc.migration.setVarStmts[len(cc.migration.setVarStmts)-1]) +} From eeed8d961eae86be3fddb82282665986a6b9fc5f Mon Sep 17 00:00:00 2001 From: qingxinhome <70939751+qingxinhome@users.noreply.github.com> Date: Fri, 20 Dec 2024 14:13:30 +0800 Subject: [PATCH 2/5] Print index name when doing explain or explain analyze (#20696) Print index name when doing explain or explain analyze Approved by: @badboynt1, @daviszhen, @heni02, @ouyuanning, @aunjgr --- pkg/frontend/mysql_cmd_executor.go | 6 +- pkg/pb/plan/plan.pb.go | 2466 ++++++++++------- pkg/sql/plan/apply_indices.go | 67 +- pkg/sql/plan/deepcopy.go | 9 + pkg/sql/plan/explain/explain_node.go | 20 +- pkg/sql/plan/explain/types.go | 13 +- proto/plan.proto | 11 + .../cases/fulltext/fulltext1.result | 2 +- .../cases/optimizer/explain_index.result | 36 +- test/distributed/cases/optimizer/index.result | 6 +- test/distributed/cases/optimizer/like.result | 2 +- 11 files changed, 1583 insertions(+), 1055 deletions(-) diff --git a/pkg/frontend/mysql_cmd_executor.go b/pkg/frontend/mysql_cmd_executor.go index 1e27a7cf6a801..1c7e3c566f1ad 100644 --- a/pkg/frontend/mysql_cmd_executor.go +++ b/pkg/frontend/mysql_cmd_executor.go @@ -34,6 +34,9 @@ import ( "github.com/confluentinc/confluent-kafka-go/v2/kafka" "github.com/google/uuid" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/clusterservice" "github.com/matrixorigin/matrixone/pkg/common/moerr" @@ -71,8 +74,6 @@ import ( "github.com/matrixorigin/matrixone/pkg/vm/engine/disttae" "github.com/matrixorigin/matrixone/pkg/vm/engine/disttae/route" "github.com/matrixorigin/matrixone/pkg/vm/process" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" ) func createDropDatabaseErrorInfo() string { @@ -1033,7 +1034,6 @@ func doExplainStmt(reqCtx context.Context, ses *Session, stmt *tree.ExplainStmt) if err != nil { return err } - es.CmpContext = ses.GetTxnCompileCtx() //get query optimizer and execute Optimize exPlan, err := buildPlan(reqCtx, ses, ses.GetTxnCompileCtx(), stmt.Statement) diff --git a/pkg/pb/plan/plan.pb.go b/pkg/pb/plan/plan.pb.go index 2e590ea414591..8881e339364f7 100644 --- a/pkg/pb/plan/plan.pb.go +++ b/pkg/pb/plan/plan.pb.go @@ -360,7 +360,7 @@ func (x Function_FuncFlag) String() string { } func (Function_FuncFlag) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{15, 0} + return fileDescriptor_2d655ab2f7683c23, []int{16, 0} } type ForeignKeyDef_RefAction int32 @@ -394,7 +394,7 @@ func (x ForeignKeyDef_RefAction) String() string { } func (ForeignKeyDef_RefAction) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{28, 0} + return fileDescriptor_2d655ab2f7683c23, []int{29, 0} } type OrderBySpec_OrderByFlag int32 @@ -431,7 +431,7 @@ func (x OrderBySpec_OrderByFlag) String() string { } func (OrderBySpec_OrderByFlag) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{46, 0} + return fileDescriptor_2d655ab2f7683c23, []int{47, 0} } type FrameClause_FrameType int32 @@ -456,7 +456,7 @@ func (x FrameClause_FrameType) String() string { } func (FrameClause_FrameType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{49, 0} + return fileDescriptor_2d655ab2f7683c23, []int{50, 0} } type FrameBound_BoundType int32 @@ -484,7 +484,7 @@ func (x FrameBound_BoundType) String() string { } func (FrameBound_BoundType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{50, 0} + return fileDescriptor_2d655ab2f7683c23, []int{51, 0} } type Node_NodeType int32 @@ -652,7 +652,7 @@ func (x Node_NodeType) String() string { } func (Node_NodeType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{59, 0} + return fileDescriptor_2d655ab2f7683c23, []int{60, 0} } type Node_JoinType int32 @@ -704,7 +704,7 @@ func (x Node_JoinType) String() string { } func (Node_JoinType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{59, 1} + return fileDescriptor_2d655ab2f7683c23, []int{60, 1} } type Node_AggMode int32 @@ -732,7 +732,7 @@ func (x Node_AggMode) String() string { } func (Node_AggMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{59, 2} + return fileDescriptor_2d655ab2f7683c23, []int{60, 2} } type Node_FillType int32 @@ -769,7 +769,7 @@ func (x Node_FillType) String() string { } func (Node_FillType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{59, 3} + return fileDescriptor_2d655ab2f7683c23, []int{60, 3} } type Node_OnDuplicateAction int32 @@ -797,7 +797,7 @@ func (x Node_OnDuplicateAction) String() string { } func (Node_OnDuplicateAction) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{59, 4} + return fileDescriptor_2d655ab2f7683c23, []int{60, 4} } type Node_ApplyType int32 @@ -822,7 +822,7 @@ func (x Node_ApplyType) String() string { } func (Node_ApplyType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{59, 5} + return fileDescriptor_2d655ab2f7683c23, []int{60, 5} } type Query_StatementType int32 @@ -862,7 +862,7 @@ func (x Query_StatementType) String() string { } func (Query_StatementType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{74, 0} + return fileDescriptor_2d655ab2f7683c23, []int{75, 0} } type TransationControl_TclType int32 @@ -890,7 +890,7 @@ func (x TransationControl_TclType) String() string { } func (TransationControl_TclType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{75, 0} + return fileDescriptor_2d655ab2f7683c23, []int{76, 0} } type TransationBegin_TransationMode int32 @@ -918,7 +918,7 @@ func (x TransationBegin_TransationMode) String() string { } func (TransationBegin_TransationMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{76, 0} + return fileDescriptor_2d655ab2f7683c23, []int{77, 0} } type DataControl_DclType int32 @@ -967,7 +967,7 @@ func (x DataControl_DclType) String() string { } func (DataControl_DclType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{81, 0} + return fileDescriptor_2d655ab2f7683c23, []int{82, 0} } type DataDefinition_DdlType int32 @@ -1094,7 +1094,7 @@ func (x DataDefinition_DdlType) String() string { } func (DataDefinition_DdlType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{82, 0} + return fileDescriptor_2d655ab2f7683c23, []int{83, 0} } type AlterTableDrop_Typ int32 @@ -1128,7 +1128,7 @@ func (x AlterTableDrop_Typ) String() string { } func (AlterTableDrop_Typ) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{90, 0} + return fileDescriptor_2d655ab2f7683c23, []int{91, 0} } type AlterTable_AlgorithmType int32 @@ -1159,7 +1159,7 @@ func (x AlterTable_AlgorithmType) String() string { } func (AlterTable_AlgorithmType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{102, 0} + return fileDescriptor_2d655ab2f7683c23, []int{103, 0} } type MetadataScanInfo_MetadataScanInfoType int32 @@ -1217,7 +1217,7 @@ func (x MetadataScanInfo_MetadataScanInfoType) String() string { } func (MetadataScanInfo_MetadataScanInfoType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{125, 0} + return fileDescriptor_2d655ab2f7683c23, []int{126, 0} } type Type struct { @@ -2525,6 +2525,93 @@ func (m *SubscriptionMeta) GetTables() string { return "" } +type IndexScanInfo struct { + IsIndexScan bool `protobuf:"varint,1,opt,name=is_index_scan,json=isIndexScan,proto3" json:"is_index_scan,omitempty"` + IndexName string `protobuf:"bytes,2,opt,name=index_name,json=indexName,proto3" json:"index_name,omitempty"` + BelongToTable string `protobuf:"bytes,3,opt,name=belong_to_table,json=belongToTable,proto3" json:"belong_to_table,omitempty"` + Parts []string `protobuf:"bytes,4,rep,name=parts,proto3" json:"parts,omitempty"` + IsUnique bool `protobuf:"varint,5,opt,name=is_unique,json=isUnique,proto3" json:"is_unique,omitempty"` + IndexTableName string `protobuf:"bytes,6,opt,name=index_table_name,json=indexTableName,proto3" json:"index_table_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *IndexScanInfo) Reset() { *m = IndexScanInfo{} } +func (m *IndexScanInfo) String() string { return proto.CompactTextString(m) } +func (*IndexScanInfo) ProtoMessage() {} +func (*IndexScanInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2d655ab2f7683c23, []int{15} +} +func (m *IndexScanInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IndexScanInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_IndexScanInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *IndexScanInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_IndexScanInfo.Merge(m, src) +} +func (m *IndexScanInfo) XXX_Size() int { + return m.ProtoSize() +} +func (m *IndexScanInfo) XXX_DiscardUnknown() { + xxx_messageInfo_IndexScanInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_IndexScanInfo proto.InternalMessageInfo + +func (m *IndexScanInfo) GetIsIndexScan() bool { + if m != nil { + return m.IsIndexScan + } + return false +} + +func (m *IndexScanInfo) GetIndexName() string { + if m != nil { + return m.IndexName + } + return "" +} + +func (m *IndexScanInfo) GetBelongToTable() string { + if m != nil { + return m.BelongToTable + } + return "" +} + +func (m *IndexScanInfo) GetParts() []string { + if m != nil { + return m.Parts + } + return nil +} + +func (m *IndexScanInfo) GetIsUnique() bool { + if m != nil { + return m.IsUnique + } + return false +} + +func (m *IndexScanInfo) GetIndexTableName() string { + if m != nil { + return m.IndexTableName + } + return "" +} + type Function struct { Func *ObjectRef `protobuf:"bytes,1,opt,name=func,proto3" json:"func,omitempty"` Args []*Expr `protobuf:"bytes,2,rep,name=args,proto3" json:"args,omitempty"` @@ -2537,7 +2624,7 @@ func (m *Function) Reset() { *m = Function{} } func (m *Function) String() string { return proto.CompactTextString(m) } func (*Function) ProtoMessage() {} func (*Function) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{15} + return fileDescriptor_2d655ab2f7683c23, []int{16} } func (m *Function) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2583,6 +2670,7 @@ func (m *Function) GetArgs() []*Expr { type Expr struct { Typ Type `protobuf:"bytes,1,opt,name=typ,proto3" json:"typ"` // Types that are valid to be assigned to Expr: + // // *Expr_Lit // *Expr_P // *Expr_V @@ -2610,7 +2698,7 @@ func (m *Expr) Reset() { *m = Expr{} } func (m *Expr) String() string { return proto.CompactTextString(m) } func (*Expr) ProtoMessage() {} func (*Expr) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{16} + return fileDescriptor_2d655ab2f7683c23, []int{17} } func (m *Expr) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2869,7 +2957,7 @@ func (m *FoldVal) Reset() { *m = FoldVal{} } func (m *FoldVal) String() string { return proto.CompactTextString(m) } func (*FoldVal) ProtoMessage() {} func (*FoldVal) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{17} + return fileDescriptor_2d655ab2f7683c23, []int{18} } func (m *FoldVal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2931,7 +3019,7 @@ func (m *LiteralVec) Reset() { *m = LiteralVec{} } func (m *LiteralVec) String() string { return proto.CompactTextString(m) } func (*LiteralVec) ProtoMessage() {} func (*LiteralVec) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{18} + return fileDescriptor_2d655ab2f7683c23, []int{19} } func (m *LiteralVec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2985,7 +3073,7 @@ func (m *Decimal64) Reset() { *m = Decimal64{} } func (m *Decimal64) String() string { return proto.CompactTextString(m) } func (*Decimal64) ProtoMessage() {} func (*Decimal64) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{19} + return fileDescriptor_2d655ab2f7683c23, []int{20} } func (m *Decimal64) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3033,7 +3121,7 @@ func (m *Decimal128) Reset() { *m = Decimal128{} } func (m *Decimal128) String() string { return proto.CompactTextString(m) } func (*Decimal128) ProtoMessage() {} func (*Decimal128) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{20} + return fileDescriptor_2d655ab2f7683c23, []int{21} } func (m *Decimal128) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3087,7 +3175,7 @@ func (m *ResultColDef) Reset() { *m = ResultColDef{} } func (m *ResultColDef) String() string { return proto.CompactTextString(m) } func (*ResultColDef) ProtoMessage() {} func (*ResultColDef) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{21} + return fileDescriptor_2d655ab2f7683c23, []int{22} } func (m *ResultColDef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3155,7 +3243,7 @@ func (m *ColDef) Reset() { *m = ColDef{} } func (m *ColDef) String() string { return proto.CompactTextString(m) } func (*ColDef) ProtoMessage() {} func (*ColDef) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{22} + return fileDescriptor_2d655ab2f7683c23, []int{23} } func (m *ColDef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3331,7 +3419,7 @@ func (m *Default) Reset() { *m = Default{} } func (m *Default) String() string { return proto.CompactTextString(m) } func (*Default) ProtoMessage() {} func (*Default) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{23} + return fileDescriptor_2d655ab2f7683c23, []int{24} } func (m *Default) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3393,7 +3481,7 @@ func (m *OnUpdate) Reset() { *m = OnUpdate{} } func (m *OnUpdate) String() string { return proto.CompactTextString(m) } func (*OnUpdate) ProtoMessage() {} func (*OnUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{24} + return fileDescriptor_2d655ab2f7683c23, []int{25} } func (m *OnUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3449,7 +3537,7 @@ func (m *IndexOption) Reset() { *m = IndexOption{} } func (m *IndexOption) String() string { return proto.CompactTextString(m) } func (*IndexOption) ProtoMessage() {} func (*IndexOption) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{25} + return fileDescriptor_2d655ab2f7683c23, []int{26} } func (m *IndexOption) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3521,7 +3609,7 @@ func (m *PrimaryKeyDef) Reset() { *m = PrimaryKeyDef{} } func (m *PrimaryKeyDef) String() string { return proto.CompactTextString(m) } func (*PrimaryKeyDef) ProtoMessage() {} func (*PrimaryKeyDef) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{26} + return fileDescriptor_2d655ab2f7683c23, []int{27} } func (m *PrimaryKeyDef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3617,7 +3705,7 @@ func (m *IndexDef) Reset() { *m = IndexDef{} } func (m *IndexDef) String() string { return proto.CompactTextString(m) } func (*IndexDef) ProtoMessage() {} func (*IndexDef) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{27} + return fileDescriptor_2d655ab2f7683c23, []int{28} } func (m *IndexDef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3749,7 +3837,7 @@ func (m *ForeignKeyDef) Reset() { *m = ForeignKeyDef{} } func (m *ForeignKeyDef) String() string { return proto.CompactTextString(m) } func (*ForeignKeyDef) ProtoMessage() {} func (*ForeignKeyDef) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{28} + return fileDescriptor_2d655ab2f7683c23, []int{29} } func (m *ForeignKeyDef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3833,7 +3921,7 @@ func (m *CheckDef) Reset() { *m = CheckDef{} } func (m *CheckDef) String() string { return proto.CompactTextString(m) } func (*CheckDef) ProtoMessage() {} func (*CheckDef) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{29} + return fileDescriptor_2d655ab2f7683c23, []int{30} } func (m *CheckDef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3890,7 +3978,7 @@ func (m *ClusterByDef) Reset() { *m = ClusterByDef{} } func (m *ClusterByDef) String() string { return proto.CompactTextString(m) } func (*ClusterByDef) ProtoMessage() {} func (*ClusterByDef) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{30} + return fileDescriptor_2d655ab2f7683c23, []int{31} } func (m *ClusterByDef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3945,7 +4033,7 @@ func (m *PropertyDef) Reset() { *m = PropertyDef{} } func (m *PropertyDef) String() string { return proto.CompactTextString(m) } func (*PropertyDef) ProtoMessage() {} func (*PropertyDef) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{31} + return fileDescriptor_2d655ab2f7683c23, []int{32} } func (m *PropertyDef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4000,7 +4088,7 @@ func (m *Property) Reset() { *m = Property{} } func (m *Property) String() string { return proto.CompactTextString(m) } func (*Property) ProtoMessage() {} func (*Property) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{32} + return fileDescriptor_2d655ab2f7683c23, []int{33} } func (m *Property) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4054,7 +4142,7 @@ func (m *PropertiesDef) Reset() { *m = PropertiesDef{} } func (m *PropertiesDef) String() string { return proto.CompactTextString(m) } func (*PropertiesDef) ProtoMessage() {} func (*PropertiesDef) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{33} + return fileDescriptor_2d655ab2f7683c23, []int{34} } func (m *PropertiesDef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4110,7 +4198,7 @@ func (m *PartitionByDef) Reset() { *m = PartitionByDef{} } func (m *PartitionByDef) String() string { return proto.CompactTextString(m) } func (*PartitionByDef) ProtoMessage() {} func (*PartitionByDef) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{34} + return fileDescriptor_2d655ab2f7683c23, []int{35} } func (m *PartitionByDef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4221,7 +4309,7 @@ func (m *PartitionExpr) Reset() { *m = PartitionExpr{} } func (m *PartitionExpr) String() string { return proto.CompactTextString(m) } func (*PartitionExpr) ProtoMessage() {} func (*PartitionExpr) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{35} + return fileDescriptor_2d655ab2f7683c23, []int{36} } func (m *PartitionExpr) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4277,7 +4365,7 @@ func (m *PartitionColumns) Reset() { *m = PartitionColumns{} } func (m *PartitionColumns) String() string { return proto.CompactTextString(m) } func (*PartitionColumns) ProtoMessage() {} func (*PartitionColumns) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{36} + return fileDescriptor_2d655ab2f7683c23, []int{37} } func (m *PartitionColumns) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4337,7 +4425,7 @@ func (m *PartitionItem) Reset() { *m = PartitionItem{} } func (m *PartitionItem) String() string { return proto.CompactTextString(m) } func (*PartitionItem) ProtoMessage() {} func (*PartitionItem) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{37} + return fileDescriptor_2d655ab2f7683c23, []int{38} } func (m *PartitionItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4426,7 +4514,7 @@ func (m *ViewDef) Reset() { *m = ViewDef{} } func (m *ViewDef) String() string { return proto.CompactTextString(m) } func (*ViewDef) ProtoMessage() {} func (*ViewDef) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{38} + return fileDescriptor_2d655ab2f7683c23, []int{39} } func (m *ViewDef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4500,7 +4588,7 @@ func (m *TableDef) Reset() { *m = TableDef{} } func (m *TableDef) String() string { return proto.CompactTextString(m) } func (*TableDef) ProtoMessage() {} func (*TableDef) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{39} + return fileDescriptor_2d655ab2f7683c23, []int{40} } func (m *TableDef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4726,7 +4814,7 @@ func (m *TableDef_DefType) Reset() { *m = TableDef_DefType{} } func (m *TableDef_DefType) String() string { return proto.CompactTextString(m) } func (*TableDef_DefType) ProtoMessage() {} func (*TableDef_DefType) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{39, 0} + return fileDescriptor_2d655ab2f7683c23, []int{40, 0} } func (m *TableDef_DefType) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4800,7 +4888,7 @@ func (m *TableFunction) Reset() { *m = TableFunction{} } func (m *TableFunction) String() string { return proto.CompactTextString(m) } func (*TableFunction) ProtoMessage() {} func (*TableFunction) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{40} + return fileDescriptor_2d655ab2f7683c23, []int{41} } func (m *TableFunction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4869,7 +4957,7 @@ func (m *HashMapStats) Reset() { *m = HashMapStats{} } func (m *HashMapStats) String() string { return proto.CompactTextString(m) } func (*HashMapStats) ProtoMessage() {} func (*HashMapStats) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{41} + return fileDescriptor_2d655ab2f7683c23, []int{42} } func (m *HashMapStats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5001,7 +5089,7 @@ func (m *Stats) Reset() { *m = Stats{} } func (m *Stats) String() string { return proto.CompactTextString(m) } func (*Stats) ProtoMessage() {} func (*Stats) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{42} + return fileDescriptor_2d655ab2f7683c23, []int{43} } func (m *Stats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5105,7 +5193,7 @@ func (m *RowsetExpr) Reset() { *m = RowsetExpr{} } func (m *RowsetExpr) String() string { return proto.CompactTextString(m) } func (*RowsetExpr) ProtoMessage() {} func (*RowsetExpr) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{43} + return fileDescriptor_2d655ab2f7683c23, []int{44} } func (m *RowsetExpr) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5159,7 +5247,7 @@ func (m *ColData) Reset() { *m = ColData{} } func (m *ColData) String() string { return proto.CompactTextString(m) } func (*ColData) ProtoMessage() {} func (*ColData) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{44} + return fileDescriptor_2d655ab2f7683c23, []int{45} } func (m *ColData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5207,7 +5295,7 @@ func (m *RowsetData) Reset() { *m = RowsetData{} } func (m *RowsetData) String() string { return proto.CompactTextString(m) } func (*RowsetData) ProtoMessage() {} func (*RowsetData) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{45} + return fileDescriptor_2d655ab2f7683c23, []int{46} } func (m *RowsetData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5263,7 +5351,7 @@ func (m *OrderBySpec) Reset() { *m = OrderBySpec{} } func (m *OrderBySpec) String() string { return proto.CompactTextString(m) } func (*OrderBySpec) ProtoMessage() {} func (*OrderBySpec) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{46} + return fileDescriptor_2d655ab2f7683c23, []int{47} } func (m *OrderBySpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5328,7 +5416,7 @@ func (m *WindowSpec) Reset() { *m = WindowSpec{} } func (m *WindowSpec) String() string { return proto.CompactTextString(m) } func (*WindowSpec) ProtoMessage() {} func (*WindowSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{47} + return fileDescriptor_2d655ab2f7683c23, []int{48} } func (m *WindowSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5405,7 +5493,7 @@ func (m *SampleFuncSpec) Reset() { *m = SampleFuncSpec{} } func (m *SampleFuncSpec) String() string { return proto.CompactTextString(m) } func (*SampleFuncSpec) ProtoMessage() {} func (*SampleFuncSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{48} + return fileDescriptor_2d655ab2f7683c23, []int{49} } func (m *SampleFuncSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5468,7 +5556,7 @@ func (m *FrameClause) Reset() { *m = FrameClause{} } func (m *FrameClause) String() string { return proto.CompactTextString(m) } func (*FrameClause) ProtoMessage() {} func (*FrameClause) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{49} + return fileDescriptor_2d655ab2f7683c23, []int{50} } func (m *FrameClause) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5531,7 +5619,7 @@ func (m *FrameBound) Reset() { *m = FrameBound{} } func (m *FrameBound) String() string { return proto.CompactTextString(m) } func (*FrameBound) ProtoMessage() {} func (*FrameBound) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{50} + return fileDescriptor_2d655ab2f7683c23, []int{51} } func (m *FrameBound) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5602,7 +5690,7 @@ func (m *OnDuplicateKeyCtx) Reset() { *m = OnDuplicateKeyCtx{} } func (m *OnDuplicateKeyCtx) String() string { return proto.CompactTextString(m) } func (*OnDuplicateKeyCtx) ProtoMessage() {} func (*OnDuplicateKeyCtx) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{51} + return fileDescriptor_2d655ab2f7683c23, []int{52} } func (m *OnDuplicateKeyCtx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5714,7 +5802,7 @@ func (m *DedupJoinCtx) Reset() { *m = DedupJoinCtx{} } func (m *DedupJoinCtx) String() string { return proto.CompactTextString(m) } func (*DedupJoinCtx) ProtoMessage() {} func (*DedupJoinCtx) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{52} + return fileDescriptor_2d655ab2f7683c23, []int{53} } func (m *DedupJoinCtx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5782,7 +5870,7 @@ func (m *UpdateCtx) Reset() { *m = UpdateCtx{} } func (m *UpdateCtx) String() string { return proto.CompactTextString(m) } func (*UpdateCtx) ProtoMessage() {} func (*UpdateCtx) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{53} + return fileDescriptor_2d655ab2f7683c23, []int{54} } func (m *UpdateCtx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5885,7 +5973,7 @@ func (m *InsertCtx) Reset() { *m = InsertCtx{} } func (m *InsertCtx) String() string { return proto.CompactTextString(m) } func (*InsertCtx) ProtoMessage() {} func (*InsertCtx) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{54} + return fileDescriptor_2d655ab2f7683c23, []int{55} } func (m *InsertCtx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5983,7 +6071,7 @@ func (m *ReplaceCtx) Reset() { *m = ReplaceCtx{} } func (m *ReplaceCtx) String() string { return proto.CompactTextString(m) } func (*ReplaceCtx) ProtoMessage() {} func (*ReplaceCtx) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{55} + return fileDescriptor_2d655ab2f7683c23, []int{56} } func (m *ReplaceCtx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6119,7 +6207,7 @@ func (m *AnalyzeInfo) Reset() { *m = AnalyzeInfo{} } func (m *AnalyzeInfo) String() string { return proto.CompactTextString(m) } func (*AnalyzeInfo) ProtoMessage() {} func (*AnalyzeInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{56} + return fileDescriptor_2d655ab2f7683c23, []int{57} } func (m *AnalyzeInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6384,7 +6472,7 @@ func (m *PartitionPrune) Reset() { *m = PartitionPrune{} } func (m *PartitionPrune) String() string { return proto.CompactTextString(m) } func (*PartitionPrune) ProtoMessage() {} func (*PartitionPrune) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{57} + return fileDescriptor_2d655ab2f7683c23, []int{58} } func (m *PartitionPrune) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6439,7 +6527,7 @@ func (m *OriginTableMessageForFuzzy) Reset() { *m = OriginTableMessageFo func (m *OriginTableMessageForFuzzy) String() string { return proto.CompactTextString(m) } func (*OriginTableMessageForFuzzy) ProtoMessage() {} func (*OriginTableMessageForFuzzy) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{58} + return fileDescriptor_2d655ab2f7683c23, []int{59} } func (m *OriginTableMessageForFuzzy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6510,6 +6598,7 @@ type Node struct { ObjRef *ObjectRef `protobuf:"bytes,18,opt,name=obj_ref,json=objRef,proto3" json:"obj_ref,omitempty"` ParentObjRef *ObjectRef `protobuf:"bytes,19,opt,name=parent_obj_ref,json=parentObjRef,proto3" json:"parent_obj_ref,omitempty"` RowsetData *RowsetData `protobuf:"bytes,20,opt,name=rowset_data,json=rowsetData,proto3" json:"rowset_data,omitempty"` + IndexScanInfo IndexScanInfo `protobuf:"bytes,21,opt,name=index_scan_info,json=indexScanInfo,proto3" json:"index_scan_info"` ExtraOptions string `protobuf:"bytes,22,opt,name=extra_options,json=extraOptions,proto3" json:"extra_options,omitempty"` DeleteCtx *DeleteCtx `protobuf:"bytes,23,opt,name=delete_ctx,json=deleteCtx,proto3" json:"delete_ctx,omitempty"` BindingTags []int32 `protobuf:"varint,24,rep,packed,name=binding_tags,json=bindingTags,proto3" json:"binding_tags,omitempty"` @@ -6570,7 +6659,7 @@ func (m *Node) Reset() { *m = Node{} } func (m *Node) String() string { return proto.CompactTextString(m) } func (*Node) ProtoMessage() {} func (*Node) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{59} + return fileDescriptor_2d655ab2f7683c23, []int{60} } func (m *Node) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6739,6 +6828,13 @@ func (m *Node) GetRowsetData() *RowsetData { return nil } +func (m *Node) GetIndexScanInfo() IndexScanInfo { + if m != nil { + return m.IndexScanInfo + } + return IndexScanInfo{} +} + func (m *Node) GetExtraOptions() string { if m != nil { return m.ExtraOptions @@ -7076,7 +7172,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{60} + return fileDescriptor_2d655ab2f7683c23, []int{61} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7132,7 +7228,7 @@ func (m *SnapshotTenant) Reset() { *m = SnapshotTenant{} } func (m *SnapshotTenant) String() string { return proto.CompactTextString(m) } func (*SnapshotTenant) ProtoMessage() {} func (*SnapshotTenant) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{61} + return fileDescriptor_2d655ab2f7683c23, []int{62} } func (m *SnapshotTenant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7195,7 +7291,7 @@ func (m *ExternScan) Reset() { *m = ExternScan{} } func (m *ExternScan) String() string { return proto.CompactTextString(m) } func (*ExternScan) ProtoMessage() {} func (*ExternScan) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{62} + return fileDescriptor_2d655ab2f7683c23, []int{63} } func (m *ExternScan) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7307,7 +7403,7 @@ func (m *ExternAttr) Reset() { *m = ExternAttr{} } func (m *ExternAttr) String() string { return proto.CompactTextString(m) } func (*ExternAttr) ProtoMessage() {} func (*ExternAttr) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{63} + return fileDescriptor_2d655ab2f7683c23, []int{64} } func (m *ExternAttr) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7381,7 +7477,7 @@ func (m *LockTarget) Reset() { *m = LockTarget{} } func (m *LockTarget) String() string { return proto.CompactTextString(m) } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{64} + return fileDescriptor_2d655ab2f7683c23, []int{65} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7523,7 +7619,7 @@ func (m *PreInsertUkCtx) Reset() { *m = PreInsertUkCtx{} } func (m *PreInsertUkCtx) String() string { return proto.CompactTextString(m) } func (*PreInsertUkCtx) ProtoMessage() {} func (*PreInsertUkCtx) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{65} + return fileDescriptor_2d655ab2f7683c23, []int{66} } func (m *PreInsertUkCtx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7592,7 +7688,7 @@ func (m *PreDeleteCtx) Reset() { *m = PreDeleteCtx{} } func (m *PreDeleteCtx) String() string { return proto.CompactTextString(m) } func (*PreDeleteCtx) ProtoMessage() {} func (*PreDeleteCtx) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{66} + return fileDescriptor_2d655ab2f7683c23, []int{67} } func (m *PreDeleteCtx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7644,7 +7740,7 @@ func (m *PreInsertCtx) Reset() { *m = PreInsertCtx{} } func (m *PreInsertCtx) String() string { return proto.CompactTextString(m) } func (*PreInsertCtx) ProtoMessage() {} func (*PreInsertCtx) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{67} + return fileDescriptor_2d655ab2f7683c23, []int{68} } func (m *PreInsertCtx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7729,7 +7825,7 @@ func (m *RuntimeFilterSpec) Reset() { *m = RuntimeFilterSpec{} } func (m *RuntimeFilterSpec) String() string { return proto.CompactTextString(m) } func (*RuntimeFilterSpec) ProtoMessage() {} func (*RuntimeFilterSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{68} + return fileDescriptor_2d655ab2f7683c23, []int{69} } func (m *RuntimeFilterSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7797,7 +7893,7 @@ func (m *IdList) Reset() { *m = IdList{} } func (m *IdList) String() string { return proto.CompactTextString(m) } func (*IdList) ProtoMessage() {} func (*IdList) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{69} + return fileDescriptor_2d655ab2f7683c23, []int{70} } func (m *IdList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7844,7 +7940,7 @@ func (m *ColPosMap) Reset() { *m = ColPosMap{} } func (m *ColPosMap) String() string { return proto.CompactTextString(m) } func (*ColPosMap) ProtoMessage() {} func (*ColPosMap) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{70} + return fileDescriptor_2d655ab2f7683c23, []int{71} } func (m *ColPosMap) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7902,7 +7998,7 @@ func (m *DeleteCtx) Reset() { *m = DeleteCtx{} } func (m *DeleteCtx) String() string { return proto.CompactTextString(m) } func (*DeleteCtx) ProtoMessage() {} func (*DeleteCtx) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{71} + return fileDescriptor_2d655ab2f7683c23, []int{72} } func (m *DeleteCtx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8022,7 +8118,7 @@ func (m *PostDmlFullTextCtx) Reset() { *m = PostDmlFullTextCtx{} } func (m *PostDmlFullTextCtx) String() string { return proto.CompactTextString(m) } func (*PostDmlFullTextCtx) ProtoMessage() {} func (*PostDmlFullTextCtx) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{72} + return fileDescriptor_2d655ab2f7683c23, []int{73} } func (m *PostDmlFullTextCtx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8097,7 +8193,7 @@ func (m *PostDmlCtx) Reset() { *m = PostDmlCtx{} } func (m *PostDmlCtx) String() string { return proto.CompactTextString(m) } func (*PostDmlCtx) ProtoMessage() {} func (*PostDmlCtx) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{73} + return fileDescriptor_2d655ab2f7683c23, []int{74} } func (m *PostDmlCtx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8209,7 +8305,7 @@ func (m *Query) Reset() { *m = Query{} } func (m *Query) String() string { return proto.CompactTextString(m) } func (*Query) ProtoMessage() {} func (*Query) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{74} + return fileDescriptor_2d655ab2f7683c23, []int{75} } func (m *Query) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8312,7 +8408,7 @@ func (m *TransationControl) Reset() { *m = TransationControl{} } func (m *TransationControl) String() string { return proto.CompactTextString(m) } func (*TransationControl) ProtoMessage() {} func (*TransationControl) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{75} + return fileDescriptor_2d655ab2f7683c23, []int{76} } func (m *TransationControl) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8416,7 +8512,7 @@ func (m *TransationBegin) Reset() { *m = TransationBegin{} } func (m *TransationBegin) String() string { return proto.CompactTextString(m) } func (*TransationBegin) ProtoMessage() {} func (*TransationBegin) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{76} + return fileDescriptor_2d655ab2f7683c23, []int{77} } func (m *TransationBegin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8463,7 +8559,7 @@ func (m *TransationCommit) Reset() { *m = TransationCommit{} } func (m *TransationCommit) String() string { return proto.CompactTextString(m) } func (*TransationCommit) ProtoMessage() {} func (*TransationCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{77} + return fileDescriptor_2d655ab2f7683c23, []int{78} } func (m *TransationCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8510,7 +8606,7 @@ func (m *TransationRollback) Reset() { *m = TransationRollback{} } func (m *TransationRollback) String() string { return proto.CompactTextString(m) } func (*TransationRollback) ProtoMessage() {} func (*TransationRollback) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{78} + return fileDescriptor_2d655ab2f7683c23, []int{79} } func (m *TransationRollback) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8565,7 +8661,7 @@ func (m *Plan) Reset() { *m = Plan{} } func (m *Plan) String() string { return proto.CompactTextString(m) } func (*Plan) ProtoMessage() {} func (*Plan) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{79} + return fileDescriptor_2d655ab2f7683c23, []int{80} } func (m *Plan) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8688,7 +8784,7 @@ func (m *Column) Reset() { *m = Column{} } func (m *Column) String() string { return proto.CompactTextString(m) } func (*Column) ProtoMessage() {} func (*Column) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{80} + return fileDescriptor_2d655ab2f7683c23, []int{81} } func (m *Column) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8744,7 +8840,7 @@ func (m *DataControl) Reset() { *m = DataControl{} } func (m *DataControl) String() string { return proto.CompactTextString(m) } func (*DataControl) ProtoMessage() {} func (*DataControl) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{81} + return fileDescriptor_2d655ab2f7683c23, []int{82} } func (m *DataControl) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8899,7 +8995,7 @@ func (m *DataDefinition) Reset() { *m = DataDefinition{} } func (m *DataDefinition) String() string { return proto.CompactTextString(m) } func (*DataDefinition) ProtoMessage() {} func (*DataDefinition) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{82} + return fileDescriptor_2d655ab2f7683c23, []int{83} } func (m *DataDefinition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9203,7 +9299,7 @@ func (m *SubscriptionOption) Reset() { *m = SubscriptionOption{} } func (m *SubscriptionOption) String() string { return proto.CompactTextString(m) } func (*SubscriptionOption) ProtoMessage() {} func (*SubscriptionOption) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{83} + return fileDescriptor_2d655ab2f7683c23, []int{84} } func (m *SubscriptionOption) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9260,7 +9356,7 @@ func (m *CreateDatabase) Reset() { *m = CreateDatabase{} } func (m *CreateDatabase) String() string { return proto.CompactTextString(m) } func (*CreateDatabase) ProtoMessage() {} func (*CreateDatabase) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{84} + return fileDescriptor_2d655ab2f7683c23, []int{85} } func (m *CreateDatabase) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9329,7 +9425,7 @@ func (m *AlterDatabase) Reset() { *m = AlterDatabase{} } func (m *AlterDatabase) String() string { return proto.CompactTextString(m) } func (*AlterDatabase) ProtoMessage() {} func (*AlterDatabase) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{85} + return fileDescriptor_2d655ab2f7683c23, []int{86} } func (m *AlterDatabase) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9391,7 +9487,7 @@ func (m *DropDatabase) Reset() { *m = DropDatabase{} } func (m *DropDatabase) String() string { return proto.CompactTextString(m) } func (*DropDatabase) ProtoMessage() {} func (*DropDatabase) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{86} + return fileDescriptor_2d655ab2f7683c23, []int{87} } func (m *DropDatabase) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9467,7 +9563,7 @@ func (m *FkColName) Reset() { *m = FkColName{} } func (m *FkColName) String() string { return proto.CompactTextString(m) } func (*FkColName) ProtoMessage() {} func (*FkColName) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{87} + return fileDescriptor_2d655ab2f7683c23, []int{88} } func (m *FkColName) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9533,7 +9629,7 @@ func (m *ForeignKeyInfo) Reset() { *m = ForeignKeyInfo{} } func (m *ForeignKeyInfo) String() string { return proto.CompactTextString(m) } func (*ForeignKeyInfo) ProtoMessage() {} func (*ForeignKeyInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{88} + return fileDescriptor_2d655ab2f7683c23, []int{89} } func (m *ForeignKeyInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9626,7 +9722,7 @@ func (m *CreateTable) Reset() { *m = CreateTable{} } func (m *CreateTable) String() string { return proto.CompactTextString(m) } func (*CreateTable) ProtoMessage() {} func (*CreateTable) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{89} + return fileDescriptor_2d655ab2f7683c23, []int{90} } func (m *CreateTable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9766,7 +9862,7 @@ func (m *AlterTableDrop) Reset() { *m = AlterTableDrop{} } func (m *AlterTableDrop) String() string { return proto.CompactTextString(m) } func (*AlterTableDrop) ProtoMessage() {} func (*AlterTableDrop) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{90} + return fileDescriptor_2d655ab2f7683c23, []int{91} } func (m *AlterTableDrop) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9831,7 +9927,7 @@ func (m *AlterTableAddFk) Reset() { *m = AlterTableAddFk{} } func (m *AlterTableAddFk) String() string { return proto.CompactTextString(m) } func (*AlterTableAddFk) ProtoMessage() {} func (*AlterTableAddFk) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{91} + return fileDescriptor_2d655ab2f7683c23, []int{92} } func (m *AlterTableAddFk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9903,7 +9999,7 @@ func (m *AlterTableAddIndex) Reset() { *m = AlterTableAddIndex{} } func (m *AlterTableAddIndex) String() string { return proto.CompactTextString(m) } func (*AlterTableAddIndex) ProtoMessage() {} func (*AlterTableAddIndex) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{92} + return fileDescriptor_2d655ab2f7683c23, []int{93} } func (m *AlterTableAddIndex) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9981,7 +10077,7 @@ func (m *AlterTableDropIndex) Reset() { *m = AlterTableDropIndex{} } func (m *AlterTableDropIndex) String() string { return proto.CompactTextString(m) } func (*AlterTableDropIndex) ProtoMessage() {} func (*AlterTableDropIndex) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{93} + return fileDescriptor_2d655ab2f7683c23, []int{94} } func (m *AlterTableDropIndex) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10052,7 +10148,7 @@ func (m *AlterTableAlterIndex) Reset() { *m = AlterTableAlterIndex{} } func (m *AlterTableAlterIndex) String() string { return proto.CompactTextString(m) } func (*AlterTableAlterIndex) ProtoMessage() {} func (*AlterTableAlterIndex) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{94} + return fileDescriptor_2d655ab2f7683c23, []int{95} } func (m *AlterTableAlterIndex) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10123,7 +10219,7 @@ func (m *AlterTableAlterReIndex) Reset() { *m = AlterTableAlterReIndex{} func (m *AlterTableAlterReIndex) String() string { return proto.CompactTextString(m) } func (*AlterTableAlterReIndex) ProtoMessage() {} func (*AlterTableAlterReIndex) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{95} + return fileDescriptor_2d655ab2f7683c23, []int{96} } func (m *AlterTableAlterReIndex) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10193,7 +10289,7 @@ func (m *AlterTableAddPartition) Reset() { *m = AlterTableAddPartition{} func (m *AlterTableAddPartition) String() string { return proto.CompactTextString(m) } func (*AlterTableAddPartition) ProtoMessage() {} func (*AlterTableAddPartition) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{96} + return fileDescriptor_2d655ab2f7683c23, []int{97} } func (m *AlterTableAddPartition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10254,7 +10350,7 @@ func (m *AlterTableComment) Reset() { *m = AlterTableComment{} } func (m *AlterTableComment) String() string { return proto.CompactTextString(m) } func (*AlterTableComment) ProtoMessage() {} func (*AlterTableComment) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{97} + return fileDescriptor_2d655ab2f7683c23, []int{98} } func (m *AlterTableComment) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10302,7 +10398,7 @@ func (m *AlterTableName) Reset() { *m = AlterTableName{} } func (m *AlterTableName) String() string { return proto.CompactTextString(m) } func (*AlterTableName) ProtoMessage() {} func (*AlterTableName) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{98} + return fileDescriptor_2d655ab2f7683c23, []int{99} } func (m *AlterTableName) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10359,7 +10455,7 @@ func (m *AlterAddColumn) Reset() { *m = AlterAddColumn{} } func (m *AlterAddColumn) String() string { return proto.CompactTextString(m) } func (*AlterAddColumn) ProtoMessage() {} func (*AlterAddColumn) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{99} + return fileDescriptor_2d655ab2f7683c23, []int{100} } func (m *AlterAddColumn) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10428,7 +10524,7 @@ func (m *AlterDropColumn) Reset() { *m = AlterDropColumn{} } func (m *AlterDropColumn) String() string { return proto.CompactTextString(m) } func (*AlterDropColumn) ProtoMessage() {} func (*AlterDropColumn) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{100} + return fileDescriptor_2d655ab2f7683c23, []int{101} } func (m *AlterDropColumn) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10482,7 +10578,7 @@ func (m *RenameTable) Reset() { *m = RenameTable{} } func (m *RenameTable) String() string { return proto.CompactTextString(m) } func (*RenameTable) ProtoMessage() {} func (*RenameTable) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{101} + return fileDescriptor_2d655ab2f7683c23, []int{102} } func (m *RenameTable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10542,7 +10638,7 @@ func (m *AlterTable) Reset() { *m = AlterTable{} } func (m *AlterTable) String() string { return proto.CompactTextString(m) } func (*AlterTable) ProtoMessage() {} func (*AlterTable) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{102} + return fileDescriptor_2d655ab2f7683c23, []int{103} } func (m *AlterTable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10671,7 +10767,7 @@ func (m *AlterTable_Action) Reset() { *m = AlterTable_Action{} } func (m *AlterTable_Action) String() string { return proto.CompactTextString(m) } func (*AlterTable_Action) ProtoMessage() {} func (*AlterTable_Action) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{102, 0} + return fileDescriptor_2d655ab2f7683c23, []int{103, 0} } func (m *AlterTable_Action) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10866,7 +10962,7 @@ func (m *DropTable) Reset() { *m = DropTable{} } func (m *DropTable) String() string { return proto.CompactTextString(m) } func (*DropTable) ProtoMessage() {} func (*DropTable) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{103} + return fileDescriptor_2d655ab2f7683c23, []int{104} } func (m *DropTable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10993,7 +11089,7 @@ func (m *CreateView) Reset() { *m = CreateView{} } func (m *CreateView) String() string { return proto.CompactTextString(m) } func (*CreateView) ProtoMessage() {} func (*CreateView) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{104} + return fileDescriptor_2d655ab2f7683c23, []int{105} } func (m *CreateView) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11063,7 +11159,7 @@ func (m *AlterView) Reset() { *m = AlterView{} } func (m *AlterView) String() string { return proto.CompactTextString(m) } func (*AlterView) ProtoMessage() {} func (*AlterView) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{105} + return fileDescriptor_2d655ab2f7683c23, []int{106} } func (m *AlterView) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11126,7 +11222,7 @@ func (m *CreateSequence) Reset() { *m = CreateSequence{} } func (m *CreateSequence) String() string { return proto.CompactTextString(m) } func (*CreateSequence) ProtoMessage() {} func (*CreateSequence) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{106} + return fileDescriptor_2d655ab2f7683c23, []int{107} } func (m *CreateSequence) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11190,7 +11286,7 @@ func (m *DropSequence) Reset() { *m = DropSequence{} } func (m *DropSequence) String() string { return proto.CompactTextString(m) } func (*DropSequence) ProtoMessage() {} func (*DropSequence) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{107} + return fileDescriptor_2d655ab2f7683c23, []int{108} } func (m *DropSequence) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11260,7 +11356,7 @@ func (m *AlterSequence) Reset() { *m = AlterSequence{} } func (m *AlterSequence) String() string { return proto.CompactTextString(m) } func (*AlterSequence) ProtoMessage() {} func (*AlterSequence) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{108} + return fileDescriptor_2d655ab2f7683c23, []int{109} } func (m *AlterSequence) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11326,7 +11422,7 @@ func (m *CreateIndex) Reset() { *m = CreateIndex{} } func (m *CreateIndex) String() string { return proto.CompactTextString(m) } func (*CreateIndex) ProtoMessage() {} func (*CreateIndex) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{109} + return fileDescriptor_2d655ab2f7683c23, []int{110} } func (m *CreateIndex) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11408,7 +11504,7 @@ func (m *AlterIndex) Reset() { *m = AlterIndex{} } func (m *AlterIndex) String() string { return proto.CompactTextString(m) } func (*AlterIndex) ProtoMessage() {} func (*AlterIndex) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{110} + return fileDescriptor_2d655ab2f7683c23, []int{111} } func (m *AlterIndex) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11458,7 +11554,7 @@ func (m *DropIndex) Reset() { *m = DropIndex{} } func (m *DropIndex) String() string { return proto.CompactTextString(m) } func (*DropIndex) ProtoMessage() {} func (*DropIndex) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{111} + return fileDescriptor_2d655ab2f7683c23, []int{112} } func (m *DropIndex) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11533,7 +11629,7 @@ func (m *TruncateTable) Reset() { *m = TruncateTable{} } func (m *TruncateTable) String() string { return proto.CompactTextString(m) } func (*TruncateTable) ProtoMessage() {} func (*TruncateTable) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{112} + return fileDescriptor_2d655ab2f7683c23, []int{113} } func (m *TruncateTable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11631,7 +11727,7 @@ func (m *ClusterTable) Reset() { *m = ClusterTable{} } func (m *ClusterTable) String() string { return proto.CompactTextString(m) } func (*ClusterTable) ProtoMessage() {} func (*ClusterTable) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{113} + return fileDescriptor_2d655ab2f7683c23, []int{114} } func (m *ClusterTable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11693,7 +11789,7 @@ func (m *ShowVariables) Reset() { *m = ShowVariables{} } func (m *ShowVariables) String() string { return proto.CompactTextString(m) } func (*ShowVariables) ProtoMessage() {} func (*ShowVariables) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{114} + return fileDescriptor_2d655ab2f7683c23, []int{115} } func (m *ShowVariables) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11747,7 +11843,7 @@ func (m *SetVariables) Reset() { *m = SetVariables{} } func (m *SetVariables) String() string { return proto.CompactTextString(m) } func (*SetVariables) ProtoMessage() {} func (*SetVariables) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{115} + return fileDescriptor_2d655ab2f7683c23, []int{116} } func (m *SetVariables) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11798,7 +11894,7 @@ func (m *SetVariablesItem) Reset() { *m = SetVariablesItem{} } func (m *SetVariablesItem) String() string { return proto.CompactTextString(m) } func (*SetVariablesItem) ProtoMessage() {} func (*SetVariablesItem) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{116} + return fileDescriptor_2d655ab2f7683c23, []int{117} } func (m *SetVariablesItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11876,7 +11972,7 @@ func (m *Prepare) Reset() { *m = Prepare{} } func (m *Prepare) String() string { return proto.CompactTextString(m) } func (*Prepare) ProtoMessage() {} func (*Prepare) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{117} + return fileDescriptor_2d655ab2f7683c23, []int{118} } func (m *Prepare) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11945,7 +12041,7 @@ func (m *Execute) Reset() { *m = Execute{} } func (m *Execute) String() string { return proto.CompactTextString(m) } func (*Execute) ProtoMessage() {} func (*Execute) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{118} + return fileDescriptor_2d655ab2f7683c23, []int{119} } func (m *Execute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11999,7 +12095,7 @@ func (m *Deallocate) Reset() { *m = Deallocate{} } func (m *Deallocate) String() string { return proto.CompactTextString(m) } func (*Deallocate) ProtoMessage() {} func (*Deallocate) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{119} + return fileDescriptor_2d655ab2f7683c23, []int{120} } func (m *Deallocate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12046,7 +12142,7 @@ func (m *OtherDCL) Reset() { *m = OtherDCL{} } func (m *OtherDCL) String() string { return proto.CompactTextString(m) } func (*OtherDCL) ProtoMessage() {} func (*OtherDCL) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{120} + return fileDescriptor_2d655ab2f7683c23, []int{121} } func (m *OtherDCL) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12094,7 +12190,7 @@ func (m *TableLockInfo) Reset() { *m = TableLockInfo{} } func (m *TableLockInfo) String() string { return proto.CompactTextString(m) } func (*TableLockInfo) ProtoMessage() {} func (*TableLockInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{121} + return fileDescriptor_2d655ab2f7683c23, []int{122} } func (m *TableLockInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12148,7 +12244,7 @@ func (m *LockTables) Reset() { *m = LockTables{} } func (m *LockTables) String() string { return proto.CompactTextString(m) } func (*LockTables) ProtoMessage() {} func (*LockTables) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{122} + return fileDescriptor_2d655ab2f7683c23, []int{123} } func (m *LockTables) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12194,7 +12290,7 @@ func (m *UnLockTables) Reset() { *m = UnLockTables{} } func (m *UnLockTables) String() string { return proto.CompactTextString(m) } func (*UnLockTables) ProtoMessage() {} func (*UnLockTables) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{123} + return fileDescriptor_2d655ab2f7683c23, []int{124} } func (m *UnLockTables) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12234,7 +12330,7 @@ func (m *MetadataScanInfos) Reset() { *m = MetadataScanInfos{} } func (m *MetadataScanInfos) String() string { return proto.CompactTextString(m) } func (*MetadataScanInfos) ProtoMessage() {} func (*MetadataScanInfos) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{124} + return fileDescriptor_2d655ab2f7683c23, []int{125} } func (m *MetadataScanInfos) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12291,7 +12387,7 @@ func (m *MetadataScanInfo) Reset() { *m = MetadataScanInfo{} } func (m *MetadataScanInfo) String() string { return proto.CompactTextString(m) } func (*MetadataScanInfo) ProtoMessage() {} func (*MetadataScanInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2d655ab2f7683c23, []int{125} + return fileDescriptor_2d655ab2f7683c23, []int{126} } func (m *MetadataScanInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12441,6 +12537,7 @@ func init() { proto.RegisterType((*ObjectRef)(nil), "plan.ObjectRef") proto.RegisterType((*PubInfo)(nil), "plan.PubInfo") proto.RegisterType((*SubscriptionMeta)(nil), "plan.SubscriptionMeta") + proto.RegisterType((*IndexScanInfo)(nil), "plan.IndexScanInfo") proto.RegisterType((*Function)(nil), "plan.Function") proto.RegisterType((*Expr)(nil), "plan.Expr") proto.RegisterType((*FoldVal)(nil), "plan.FoldVal") @@ -12564,751 +12661,757 @@ func init() { func init() { proto.RegisterFile("plan.proto", fileDescriptor_2d655ab2f7683c23) } var fileDescriptor_2d655ab2f7683c23 = []byte{ - // 11894 bytes of a gzipped FileDescriptorProto + // 11991 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0xbd, 0x5d, 0x8c, 0x23, 0x57, - 0x76, 0x18, 0xdc, 0x6c, 0xfe, 0x1f, 0xfe, 0x74, 0xf5, 0x9d, 0x3f, 0xce, 0x68, 0x34, 0xd3, 0x53, - 0x1a, 0x49, 0xa3, 0x91, 0x34, 0x92, 0x66, 0xf4, 0x33, 0x5a, 0xef, 0x7a, 0x97, 0xcd, 0x66, 0x4f, + 0x76, 0x18, 0xdc, 0x6c, 0xfe, 0x1f, 0xfe, 0x74, 0xf5, 0x9d, 0x9e, 0x11, 0x67, 0x34, 0x9a, 0xe9, + 0x29, 0x8d, 0xa4, 0xd1, 0x48, 0x1a, 0x49, 0x33, 0xfa, 0x5d, 0xef, 0x7a, 0x97, 0xcd, 0x66, 0x4f, 0x73, 0x87, 0x4d, 0xf6, 0x16, 0xd9, 0x33, 0xd2, 0x1a, 0xdf, 0x57, 0x28, 0xb2, 0x8a, 0xdd, 0xa5, - 0x2e, 0x56, 0x51, 0x55, 0xc5, 0xe9, 0x6e, 0x01, 0x06, 0x16, 0x31, 0xe0, 0xc4, 0x79, 0x35, 0xe0, - 0xa7, 0x38, 0x58, 0xfb, 0x29, 0x30, 0x62, 0x20, 0x40, 0x0c, 0x38, 0x08, 0xf2, 0x96, 0x3c, 0x38, - 0x46, 0x10, 0x04, 0xc8, 0x43, 0x90, 0x04, 0x70, 0x82, 0xcd, 0x83, 0x9f, 0x62, 0x3f, 0x38, 0x2f, - 0x41, 0x5e, 0x82, 0x73, 0xee, 0xad, 0xaa, 0x5b, 0x24, 0x5b, 0x23, 0x69, 0xd7, 0x48, 0xf2, 0xd2, - 0x5d, 0xf7, 0x9c, 0x73, 0xff, 0xef, 0x3d, 0x7f, 0xf7, 0xdc, 0x4b, 0x80, 0x99, 0x63, 0xb8, 0x0f, - 0x66, 0xbe, 0x17, 0x7a, 0x2c, 0x87, 0xdf, 0x37, 0xde, 0x3d, 0xb2, 0xc3, 0xe3, 0xf9, 0xe8, 0xc1, - 0xd8, 0x9b, 0xbe, 0x77, 0xe4, 0x1d, 0x79, 0xef, 0x11, 0x72, 0x34, 0x9f, 0x50, 0x8a, 0x12, 0xf4, - 0xc5, 0x33, 0xdd, 0x00, 0xc7, 0x1b, 0x9f, 0x88, 0xef, 0x8d, 0xd0, 0x9e, 0x5a, 0x41, 0x68, 0x4c, - 0x67, 0x1c, 0xa0, 0xfe, 0x69, 0x06, 0x72, 0xc3, 0xf3, 0x99, 0xc5, 0xea, 0xb0, 0x6e, 0x9b, 0x8d, - 0xcc, 0x56, 0xe6, 0x5e, 0x5e, 0x5b, 0xb7, 0x4d, 0xb6, 0x05, 0x15, 0xd7, 0x0b, 0x7b, 0x73, 0xc7, - 0x31, 0x46, 0x8e, 0xd5, 0x58, 0xdf, 0xca, 0xdc, 0x2b, 0x69, 0x32, 0x88, 0xbd, 0x02, 0x65, 0x63, - 0x1e, 0x7a, 0xba, 0xed, 0x8e, 0xfd, 0x46, 0x96, 0xf0, 0x25, 0x04, 0x74, 0xdc, 0xb1, 0xcf, 0x2e, - 0x43, 0xfe, 0xd4, 0x36, 0xc3, 0xe3, 0x46, 0x8e, 0x4a, 0xe4, 0x09, 0x84, 0x06, 0x63, 0xc3, 0xb1, - 0x1a, 0x79, 0x0e, 0xa5, 0x04, 0x42, 0x43, 0xaa, 0xa4, 0xb0, 0x95, 0xb9, 0x57, 0xd6, 0x78, 0x82, - 0xdd, 0x02, 0xb0, 0xdc, 0xf9, 0xf4, 0x85, 0xe1, 0xcc, 0xad, 0xa0, 0x51, 0x24, 0x94, 0x04, 0x51, - 0x7f, 0x08, 0xe5, 0x69, 0x70, 0xb4, 0x67, 0x19, 0xa6, 0xe5, 0xb3, 0x6b, 0x50, 0x9c, 0x06, 0x47, - 0x7a, 0x68, 0x1c, 0x89, 0x2e, 0x14, 0xa6, 0xc1, 0xd1, 0xd0, 0x38, 0x62, 0xd7, 0xa1, 0x44, 0x88, - 0xf3, 0x19, 0xef, 0x43, 0x5e, 0x43, 0x42, 0xec, 0xb1, 0xfa, 0xd7, 0x79, 0x28, 0x76, 0xed, 0xd0, - 0xf2, 0x0d, 0x87, 0x5d, 0x85, 0x82, 0x1d, 0xb8, 0x73, 0xc7, 0xa1, 0xec, 0x25, 0x4d, 0xa4, 0xd8, - 0x55, 0xc8, 0xdb, 0x8f, 0x5f, 0x18, 0x0e, 0xcf, 0xbb, 0xb7, 0xa6, 0xf1, 0x24, 0x6b, 0x40, 0xc1, - 0xfe, 0xe0, 0x63, 0x44, 0x64, 0x05, 0x42, 0xa4, 0x09, 0xf3, 0xe8, 0x21, 0x62, 0x72, 0x31, 0x86, - 0xd2, 0x84, 0xf9, 0xf8, 0x43, 0xc4, 0x60, 0xef, 0xb3, 0x84, 0xa1, 0x34, 0xd6, 0x32, 0xa7, 0x5a, - 0x70, 0x00, 0x6a, 0x58, 0xcb, 0x3c, 0xaa, 0x65, 0xce, 0x6b, 0x29, 0x0a, 0x84, 0x48, 0x13, 0x86, - 0xd7, 0x52, 0x8a, 0x31, 0x71, 0x2d, 0x73, 0x5e, 0x4b, 0x79, 0x2b, 0x73, 0x2f, 0x47, 0x18, 0x5e, - 0xcb, 0x65, 0xc8, 0x99, 0x08, 0x87, 0xad, 0xcc, 0xbd, 0xcc, 0xde, 0x9a, 0x46, 0x29, 0x84, 0x06, - 0x08, 0xad, 0xe0, 0x00, 0x23, 0x34, 0x10, 0xd0, 0x11, 0x42, 0xab, 0x38, 0x1a, 0x08, 0x1d, 0x09, - 0xe8, 0x04, 0xa1, 0xb5, 0xad, 0xcc, 0xbd, 0x75, 0x84, 0x62, 0x8a, 0xdd, 0x80, 0xa2, 0x69, 0x84, - 0x16, 0x22, 0xea, 0xa2, 0xcb, 0x11, 0x00, 0x71, 0xb8, 0xe2, 0x10, 0xb7, 0x21, 0x3a, 0x1d, 0x01, - 0x98, 0x0a, 0x15, 0x24, 0x8b, 0xf0, 0x8a, 0xc0, 0xcb, 0x40, 0xf6, 0x11, 0x54, 0x4d, 0x6b, 0x6c, - 0x4f, 0x0d, 0x87, 0xf7, 0x69, 0x73, 0x2b, 0x73, 0xaf, 0xf2, 0x70, 0xe3, 0x01, 0xed, 0x89, 0x18, - 0xb3, 0xb7, 0xa6, 0xa5, 0xc8, 0xd8, 0x63, 0xa8, 0x89, 0xf4, 0x07, 0x0f, 0x69, 0x60, 0x19, 0xe5, - 0x53, 0x52, 0xf9, 0x3e, 0x78, 0xf8, 0x78, 0x6f, 0x4d, 0x4b, 0x13, 0xb2, 0xbb, 0x50, 0x8d, 0xb7, - 0x08, 0x66, 0xbc, 0x24, 0x5a, 0x95, 0x82, 0x62, 0xb7, 0xbe, 0x08, 0x3c, 0x17, 0x09, 0x2e, 0x8b, - 0x71, 0x8b, 0x00, 0x6c, 0x0b, 0xc0, 0xb4, 0x26, 0xc6, 0xdc, 0x09, 0x11, 0x7d, 0x45, 0x0c, 0xa0, - 0x04, 0x63, 0xb7, 0xa0, 0x3c, 0x9f, 0x61, 0x2f, 0x9f, 0x19, 0x4e, 0xe3, 0xaa, 0x20, 0x48, 0x40, - 0x58, 0x3a, 0xae, 0x73, 0xc4, 0x5e, 0x13, 0xb3, 0x1b, 0x01, 0x70, 0xaf, 0xd8, 0xc1, 0xb6, 0xed, - 0x36, 0x1a, 0xb4, 0x4e, 0x79, 0x82, 0xdd, 0x84, 0x6c, 0xe0, 0x8f, 0x1b, 0xd7, 0xa9, 0x97, 0xc0, - 0x7b, 0xd9, 0x3e, 0x9b, 0xf9, 0x1a, 0x82, 0xb7, 0x8b, 0x90, 0xa7, 0x3d, 0xa3, 0xde, 0x84, 0xd2, - 0x81, 0xe1, 0x1b, 0x53, 0xcd, 0x9a, 0x30, 0x05, 0xb2, 0x33, 0x2f, 0x10, 0xbb, 0x05, 0x3f, 0xd5, - 0x2e, 0x14, 0x9e, 0x19, 0x3e, 0xe2, 0x18, 0xe4, 0x5c, 0x63, 0x6a, 0x11, 0xb2, 0xac, 0xd1, 0x37, - 0xee, 0x90, 0xe0, 0x3c, 0x08, 0xad, 0xa9, 0x60, 0x05, 0x22, 0x85, 0xf0, 0x23, 0xc7, 0x1b, 0x89, - 0x9d, 0x50, 0xd2, 0x44, 0x4a, 0xfd, 0x3b, 0x19, 0x28, 0xb4, 0x3c, 0x07, 0x8b, 0xbb, 0x06, 0x45, - 0xdf, 0x72, 0xf4, 0xa4, 0xba, 0x82, 0x6f, 0x39, 0x07, 0x5e, 0x80, 0x88, 0xb1, 0xc7, 0x11, 0x7c, - 0x6f, 0x16, 0xc6, 0x1e, 0x21, 0xa2, 0x06, 0x64, 0xa5, 0x06, 0x5c, 0x87, 0x52, 0x38, 0x72, 0x74, - 0x82, 0xe7, 0x08, 0x5e, 0x0c, 0x47, 0x4e, 0x0f, 0x51, 0xd7, 0xa0, 0x68, 0x8e, 0x38, 0x26, 0x4f, - 0x98, 0x82, 0x39, 0x42, 0x84, 0xfa, 0x29, 0x94, 0x35, 0xe3, 0x54, 0x34, 0xe3, 0x0a, 0x14, 0xb0, - 0x00, 0xc1, 0xe5, 0x72, 0x5a, 0x3e, 0x1c, 0x39, 0x1d, 0x13, 0xc1, 0xd8, 0x08, 0xdb, 0xa4, 0x36, - 0xe4, 0xb4, 0xfc, 0xd8, 0x73, 0x3a, 0xa6, 0x3a, 0x04, 0x68, 0x79, 0xbe, 0xff, 0x9d, 0xbb, 0x70, - 0x19, 0xf2, 0xa6, 0x35, 0x0b, 0x8f, 0x39, 0x83, 0xd0, 0x78, 0x42, 0xbd, 0x0f, 0x25, 0x9c, 0x97, - 0xae, 0x1d, 0x84, 0xec, 0x16, 0xe4, 0x1c, 0x3b, 0x08, 0x1b, 0x99, 0xad, 0xec, 0xc2, 0xac, 0x11, - 0x5c, 0xdd, 0x82, 0xd2, 0xbe, 0x71, 0xf6, 0x0c, 0x67, 0x0e, 0x4b, 0xa3, 0x29, 0x14, 0x53, 0x22, - 0xe6, 0xb3, 0x0a, 0x30, 0x34, 0xfc, 0x23, 0x2b, 0x24, 0x7e, 0xf6, 0x37, 0x19, 0xa8, 0x0c, 0xe6, - 0xa3, 0x2f, 0xe7, 0x96, 0x7f, 0x8e, 0x6d, 0xbe, 0x07, 0xd9, 0xf0, 0x7c, 0x46, 0x39, 0xea, 0x0f, - 0xaf, 0xf2, 0xe2, 0x25, 0xfc, 0x03, 0xcc, 0xa4, 0x21, 0x09, 0x76, 0xc2, 0xf5, 0x4c, 0x2b, 0x1a, - 0x83, 0xbc, 0x56, 0xc0, 0x64, 0xc7, 0x44, 0xa1, 0xe0, 0xcd, 0xc4, 0x2c, 0xac, 0x7b, 0x33, 0xb6, - 0x05, 0xf9, 0xf1, 0xb1, 0xed, 0x98, 0x34, 0x01, 0xe9, 0x36, 0x73, 0x04, 0xce, 0x92, 0xef, 0x9d, - 0xea, 0x81, 0xfd, 0x55, 0xc4, 0xe4, 0x8b, 0xbe, 0x77, 0x3a, 0xb0, 0xbf, 0xb2, 0xd4, 0xa1, 0x90, - 0x34, 0x00, 0x85, 0x41, 0xab, 0xd9, 0x6d, 0x6a, 0xca, 0x1a, 0x7e, 0xb7, 0x3f, 0xeb, 0x0c, 0x86, - 0x03, 0x25, 0xc3, 0xea, 0x00, 0xbd, 0xfe, 0x50, 0x17, 0xe9, 0x75, 0x56, 0x80, 0xf5, 0x4e, 0x4f, - 0xc9, 0x22, 0x0d, 0xc2, 0x3b, 0x3d, 0x25, 0xc7, 0x8a, 0x90, 0x6d, 0xf6, 0x3e, 0x57, 0xf2, 0xf4, - 0xd1, 0xed, 0x2a, 0x05, 0xf5, 0x8f, 0xd6, 0xa1, 0xdc, 0x1f, 0x7d, 0x61, 0x8d, 0x43, 0xec, 0x33, - 0xae, 0x52, 0xcb, 0x7f, 0x61, 0xf9, 0xd4, 0xed, 0xac, 0x26, 0x52, 0xd8, 0x11, 0x73, 0x44, 0x9d, - 0xcb, 0x6a, 0xeb, 0xe6, 0x88, 0xe8, 0xc6, 0xc7, 0xd6, 0xd4, 0xa0, 0xce, 0x21, 0x1d, 0xa5, 0x70, - 0x57, 0x78, 0xa3, 0x2f, 0xa8, 0x7b, 0x59, 0x0d, 0x3f, 0xd9, 0x6d, 0xa8, 0xf0, 0x32, 0xe4, 0xf5, - 0x05, 0x1c, 0xb4, 0xb8, 0xf8, 0x0a, 0xf2, 0xe2, 0xa3, 0x9c, 0x54, 0x2a, 0x47, 0x0a, 0x09, 0xc6, - 0x41, 0x3d, 0xb1, 0xa2, 0xbd, 0xd1, 0x17, 0x1c, 0x5b, 0xe2, 0x2b, 0xda, 0x1b, 0x7d, 0x41, 0xa8, - 0xb7, 0x61, 0x33, 0x98, 0x8f, 0x82, 0xb1, 0x6f, 0xcf, 0x42, 0xdb, 0x73, 0x39, 0x4d, 0x99, 0x68, - 0x14, 0x19, 0x41, 0xc4, 0xf7, 0xa0, 0x34, 0x9b, 0x8f, 0x74, 0xdb, 0x9d, 0x78, 0xc4, 0xdc, 0x2b, - 0x0f, 0x6b, 0x7c, 0x62, 0x0e, 0xe6, 0xa3, 0x8e, 0x3b, 0xf1, 0xb4, 0xe2, 0x8c, 0x7f, 0xa8, 0x6f, - 0x40, 0x51, 0xc0, 0x50, 0x7a, 0x87, 0x96, 0x6b, 0xb8, 0xa1, 0x1e, 0x8b, 0xfd, 0x12, 0x07, 0x74, - 0x4c, 0xf5, 0x4f, 0x32, 0xa0, 0x0c, 0xa4, 0x6a, 0xf6, 0xad, 0xd0, 0x58, 0xc9, 0x15, 0x5e, 0x05, - 0x30, 0xc6, 0x63, 0x6f, 0xce, 0x8b, 0xe1, 0x8b, 0xa7, 0x2c, 0x20, 0x1d, 0x53, 0x1e, 0x9b, 0x6c, - 0x6a, 0x6c, 0xee, 0x40, 0x35, 0xca, 0x27, 0x6d, 0xe8, 0x8a, 0x80, 0x45, 0xa3, 0x13, 0xcc, 0x53, - 0xbb, 0xba, 0x18, 0xcc, 0x79, 0xee, 0xab, 0x50, 0x20, 0x1d, 0x21, 0x88, 0x46, 0x9c, 0xa7, 0xd4, - 0xbf, 0xbf, 0x0e, 0xa5, 0xdd, 0xb9, 0x3b, 0xc6, 0x26, 0xb3, 0xd7, 0x20, 0x37, 0x99, 0xbb, 0x63, - 0x6a, 0x6e, 0x2c, 0x32, 0xe2, 0x95, 0xa2, 0x11, 0x12, 0xf7, 0xa0, 0xe1, 0x1f, 0xe1, 0xde, 0x5d, - 0xda, 0x83, 0x08, 0x57, 0xff, 0x59, 0x86, 0x97, 0xb8, 0xeb, 0x18, 0x47, 0xac, 0x04, 0xb9, 0x5e, - 0xbf, 0xd7, 0x56, 0xd6, 0x58, 0x15, 0x4a, 0x9d, 0xde, 0xb0, 0xad, 0xf5, 0x9a, 0x5d, 0x25, 0x43, - 0x0b, 0x7a, 0xd8, 0xdc, 0xee, 0xb6, 0x95, 0x75, 0xc4, 0x3c, 0xeb, 0x77, 0x9b, 0xc3, 0x4e, 0xb7, - 0xad, 0xe4, 0x38, 0x46, 0xeb, 0xb4, 0x86, 0x4a, 0x89, 0x29, 0x50, 0x3d, 0xd0, 0xfa, 0x3b, 0x87, - 0xad, 0xb6, 0xde, 0x3b, 0xec, 0x76, 0x15, 0x85, 0x5d, 0x82, 0x8d, 0x18, 0xd2, 0xe7, 0xc0, 0x2d, - 0xcc, 0xf2, 0xac, 0xa9, 0x35, 0xb5, 0x27, 0xca, 0x8f, 0x58, 0x09, 0xb2, 0xcd, 0x27, 0x4f, 0x94, - 0x9f, 0xe1, 0xde, 0x28, 0x3f, 0xef, 0xf4, 0xf4, 0x67, 0xcd, 0xee, 0x61, 0x5b, 0xf9, 0xd9, 0x7a, - 0x94, 0xee, 0x6b, 0x3b, 0x6d, 0x4d, 0xf9, 0x59, 0x8e, 0x6d, 0x42, 0xf5, 0xa7, 0xfd, 0x5e, 0x7b, - 0xbf, 0x79, 0x70, 0x40, 0x0d, 0xf9, 0x59, 0x49, 0xfd, 0xef, 0x39, 0xc8, 0x61, 0x4f, 0x98, 0x9a, - 0xf0, 0x81, 0xb8, 0x8b, 0xb8, 0x11, 0xb7, 0x73, 0x7f, 0xf6, 0x17, 0xb7, 0xd7, 0x38, 0x07, 0xb8, - 0x03, 0x59, 0xc7, 0x0e, 0x69, 0x02, 0xe3, 0xd5, 0x23, 0x74, 0xa3, 0xbd, 0x35, 0x0d, 0x71, 0xec, - 0x16, 0x64, 0x38, 0x2b, 0xa8, 0x3c, 0xac, 0x8b, 0xe5, 0x25, 0x64, 0xc9, 0xde, 0x9a, 0x96, 0x99, - 0xb1, 0x9b, 0x90, 0x79, 0x21, 0xf8, 0x42, 0x95, 0xe3, 0xb9, 0x34, 0x41, 0xec, 0x0b, 0xb6, 0x05, - 0xd9, 0xb1, 0xc7, 0x35, 0x9f, 0x18, 0xcf, 0x79, 0x2b, 0x96, 0x3f, 0xf6, 0x1c, 0xf6, 0x1a, 0x64, - 0x7d, 0xe3, 0x94, 0x66, 0x34, 0x9e, 0xae, 0x98, 0x79, 0x23, 0x91, 0x6f, 0x9c, 0x62, 0x23, 0x26, - 0xb4, 0x93, 0xe2, 0x46, 0x44, 0xf3, 0x8d, 0xd5, 0x4c, 0xd8, 0x16, 0x64, 0x4e, 0x69, 0x2f, 0xc5, - 0xc2, 0xfe, 0xb9, 0xed, 0x9a, 0xde, 0xe9, 0x60, 0x66, 0x8d, 0x91, 0xe2, 0x94, 0xbd, 0x0e, 0xd9, - 0x60, 0x3e, 0xa2, 0xbd, 0x54, 0x79, 0xb8, 0xb9, 0xc4, 0x15, 0xb1, 0xa2, 0x60, 0x3e, 0x62, 0x6f, - 0x40, 0x6e, 0xec, 0xf9, 0xbe, 0xd8, 0x4f, 0x4a, 0xd4, 0xe0, 0x48, 0x20, 0xa0, 0xf2, 0x83, 0x78, - 0xac, 0x30, 0x24, 0xdd, 0x29, 0x26, 0x4a, 0x38, 0x32, 0x56, 0x18, 0xb2, 0xbb, 0x82, 0xcd, 0x57, - 0xe5, 0x56, 0x47, 0x42, 0x00, 0xcb, 0x41, 0x2c, 0x4e, 0xd2, 0xd4, 0x38, 0x23, 0xcd, 0x2a, 0x26, - 0x8a, 0xb8, 0x3f, 0xb6, 0x69, 0x6a, 0x9c, 0xb1, 0xbb, 0x90, 0x7d, 0x61, 0x8d, 0x49, 0xc9, 0x8a, - 0x6b, 0x13, 0x93, 0xf4, 0x8c, 0xba, 0x87, 0x68, 0x5a, 0xf7, 0x9e, 0x63, 0x92, 0xbe, 0x15, 0xcf, - 0xe5, 0xae, 0xe7, 0x98, 0xcf, 0x68, 0x2e, 0x09, 0x89, 0x42, 0xcf, 0x98, 0x9f, 0xe1, 0x9e, 0x55, - 0xb8, 0x78, 0x32, 0xe6, 0x67, 0x1d, 0x13, 0xd9, 0x9f, 0x6b, 0xbe, 0x20, 0x2d, 0x2b, 0xa3, 0xe1, - 0x27, 0x9a, 0x01, 0x81, 0xe5, 0x58, 0xe3, 0xd0, 0x7e, 0x61, 0x87, 0xe7, 0xa4, 0x47, 0x65, 0x34, - 0x19, 0xb4, 0x5d, 0x80, 0x9c, 0x75, 0x36, 0xf3, 0xd5, 0x3d, 0x28, 0x8a, 0x5a, 0x96, 0x6c, 0x89, - 0xeb, 0x50, 0xb2, 0x03, 0x7d, 0xec, 0xb9, 0x41, 0x28, 0xb4, 0x87, 0xa2, 0x1d, 0xb4, 0x30, 0x89, - 0x4c, 0xc5, 0x34, 0x42, 0xce, 0x86, 0xab, 0x1a, 0x7d, 0xab, 0x0f, 0x01, 0x92, 0x6e, 0x61, 0x9b, - 0x1c, 0xcb, 0x8d, 0x14, 0x15, 0xc7, 0x72, 0xe3, 0x3c, 0xeb, 0x52, 0x9e, 0xeb, 0x50, 0x8e, 0x35, - 0x40, 0x56, 0x85, 0x8c, 0x21, 0x04, 0x40, 0xc6, 0x50, 0xef, 0xa1, 0x42, 0x16, 0xe9, 0x78, 0x69, - 0x1c, 0xa6, 0x22, 0xb1, 0x90, 0x19, 0xa9, 0xdf, 0x87, 0xaa, 0x66, 0x05, 0x73, 0x27, 0x6c, 0x79, - 0xce, 0x8e, 0x35, 0x61, 0xef, 0x00, 0xc4, 0xe9, 0x40, 0xc8, 0xe9, 0x64, 0xed, 0xee, 0x58, 0x13, - 0x4d, 0xc2, 0xab, 0xff, 0x28, 0x47, 0x1a, 0xcf, 0x0e, 0x57, 0x35, 0x84, 0x4e, 0x91, 0x91, 0x74, - 0x8a, 0x98, 0x83, 0xae, 0xa7, 0xf5, 0xaa, 0x63, 0xdb, 0x34, 0x2d, 0x37, 0xd2, 0x9f, 0x78, 0x0a, - 0x27, 0xdb, 0x70, 0x8e, 0x68, 0x43, 0xd5, 0x1f, 0xb2, 0xa8, 0xd2, 0xe9, 0xcc, 0xb7, 0x82, 0x80, - 0x4b, 0x6e, 0xc3, 0x39, 0x8a, 0xf6, 0x76, 0xfe, 0xeb, 0xf6, 0xf6, 0x75, 0x28, 0xb9, 0x5e, 0xa8, - 0x93, 0x75, 0x53, 0xe0, 0xa3, 0x2f, 0xcc, 0x38, 0xf6, 0x26, 0x14, 0x85, 0x5e, 0x2a, 0x36, 0x95, - 0x58, 0x2e, 0x3b, 0x1c, 0xa8, 0x45, 0x58, 0xd6, 0x40, 0x35, 0x67, 0x3a, 0xb5, 0xdc, 0x30, 0x92, - 0x54, 0x22, 0xc9, 0xde, 0x86, 0xb2, 0xe7, 0xea, 0x5c, 0x79, 0x15, 0xbb, 0x4a, 0x2c, 0xdf, 0xbe, - 0x7b, 0x48, 0x50, 0xad, 0xe4, 0x89, 0x2f, 0x6c, 0x8a, 0xe3, 0x9d, 0xea, 0x63, 0xc3, 0x37, 0x69, - 0x67, 0x95, 0xb4, 0xa2, 0xe3, 0x9d, 0xb6, 0x0c, 0xdf, 0xe4, 0x92, 0xfb, 0x4b, 0x77, 0x3e, 0xa5, - 0xdd, 0x54, 0xd3, 0x44, 0x8a, 0xdd, 0x84, 0xf2, 0xd8, 0x99, 0x07, 0xa1, 0xe5, 0x6f, 0x9f, 0x73, - 0x73, 0x44, 0x4b, 0x00, 0xd8, 0xae, 0x99, 0x6f, 0x4f, 0x0d, 0xff, 0x9c, 0xb6, 0x4e, 0x49, 0x8b, - 0x92, 0xa8, 0x31, 0xcd, 0x4e, 0x6c, 0xf3, 0x8c, 0xdb, 0x24, 0x1a, 0x4f, 0x20, 0xfd, 0x31, 0x59, - 0x8c, 0x01, 0xed, 0x8f, 0x92, 0x16, 0x25, 0x69, 0x1e, 0xe8, 0x93, 0x76, 0x44, 0x59, 0x13, 0xa9, - 0x94, 0xda, 0xb9, 0x79, 0xa1, 0xda, 0xc9, 0x16, 0x25, 0xbf, 0xe7, 0xdb, 0x47, 0xb6, 0x90, 0xdb, - 0x97, 0xb8, 0xe4, 0xe7, 0x20, 0xd2, 0x4b, 0xbf, 0x84, 0xa2, 0x18, 0x62, 0x94, 0x40, 0xb8, 0x7d, - 0xd2, 0xec, 0x99, 0x4b, 0x20, 0x84, 0xb3, 0xd7, 0xa0, 0x26, 0xca, 0x0a, 0x42, 0xdf, 0x76, 0x8f, - 0xc4, 0xe2, 0xa9, 0x72, 0xe0, 0x80, 0x60, 0x28, 0x4e, 0x71, 0x7a, 0x75, 0x63, 0x64, 0x3b, 0xb8, - 0x4d, 0xb3, 0xc2, 0x5a, 0x9f, 0x3b, 0x4e, 0x93, 0x83, 0xd4, 0x3e, 0x94, 0xa2, 0x09, 0xf9, 0x95, - 0xd4, 0xa9, 0xfe, 0x76, 0x06, 0x2a, 0x1d, 0xd7, 0xb4, 0xce, 0xfa, 0xa4, 0x22, 0xb0, 0x77, 0x80, - 0x8d, 0x7d, 0xcb, 0x08, 0x2d, 0xdd, 0x3a, 0x0b, 0x7d, 0x43, 0xe7, 0x26, 0x3d, 0x37, 0xa7, 0x15, - 0x8e, 0x69, 0x23, 0x62, 0x48, 0xd6, 0xfd, 0x6d, 0xa8, 0xcc, 0x0c, 0x3f, 0x88, 0xd4, 0x2a, 0x5e, - 0x01, 0x70, 0x90, 0x50, 0x6a, 0x14, 0xf7, 0xc8, 0x37, 0xa6, 0x7a, 0xe8, 0x9d, 0x58, 0x2e, 0x57, - 0x28, 0xb9, 0x2a, 0x5d, 0x27, 0xf8, 0x10, 0xc1, 0xa4, 0x57, 0xfe, 0xa7, 0x0c, 0xd4, 0x0e, 0xf8, - 0xac, 0x3f, 0xb5, 0xce, 0x77, 0xb8, 0xfd, 0x32, 0x8e, 0x76, 0x6c, 0x4e, 0xa3, 0x6f, 0x76, 0x0b, - 0x2a, 0xb3, 0x13, 0xeb, 0x5c, 0x4f, 0xe9, 0xfa, 0x65, 0x04, 0xb5, 0x68, 0x6f, 0xbe, 0x05, 0x05, - 0x8f, 0x3a, 0x22, 0x64, 0x9c, 0x10, 0x0d, 0x52, 0x0f, 0x35, 0x41, 0xc0, 0x54, 0xa8, 0xc5, 0x45, - 0xc9, 0xda, 0x8b, 0x28, 0x8c, 0x9a, 0x7f, 0x19, 0xf2, 0x88, 0x0a, 0x1a, 0xf9, 0xad, 0x2c, 0x2a, - 0xec, 0x94, 0x60, 0xef, 0x43, 0x6d, 0xec, 0x4d, 0x67, 0x7a, 0x94, 0x5d, 0x48, 0xbb, 0x34, 0x4f, - 0xa9, 0x20, 0xc9, 0x01, 0x2f, 0x4b, 0xfd, 0xbd, 0x2c, 0x94, 0xa8, 0x0d, 0x82, 0xad, 0xd8, 0xe6, - 0x59, 0xc4, 0x56, 0xca, 0x5a, 0xde, 0x36, 0x91, 0x6b, 0xbf, 0x0a, 0x60, 0x23, 0x89, 0x3c, 0x94, - 0x65, 0x82, 0x44, 0x4d, 0x99, 0x19, 0x7e, 0x18, 0x34, 0xb2, 0xbc, 0x29, 0x94, 0xc0, 0xf5, 0x3e, - 0x77, 0xed, 0x2f, 0xe7, 0xbc, 0xf5, 0x25, 0x4d, 0xa4, 0x70, 0xdc, 0x79, 0x61, 0x34, 0x7f, 0xb2, - 0xfa, 0x55, 0x27, 0x38, 0x4d, 0x5f, 0xb4, 0xca, 0x39, 0x8d, 0x75, 0x86, 0xf2, 0x8d, 0xb3, 0x16, - 0x20, 0x50, 0x1b, 0x21, 0x32, 0xd3, 0x28, 0xa6, 0x99, 0x46, 0x03, 0x8a, 0x2f, 0xec, 0xc0, 0xc6, - 0x05, 0x52, 0xe2, 0xdb, 0x50, 0x24, 0xa5, 0x69, 0x28, 0xbf, 0x6c, 0x1a, 0xe2, 0x6e, 0x1b, 0xce, - 0x11, 0x57, 0x7c, 0xa3, 0x6e, 0x37, 0x9d, 0x23, 0x8f, 0x7d, 0x00, 0x57, 0x12, 0xb4, 0xe8, 0x0d, - 0xb9, 0x81, 0xc8, 0xd3, 0xa1, 0xb1, 0x98, 0x92, 0x7a, 0x44, 0x96, 0xc9, 0x7d, 0xd8, 0x94, 0xb2, - 0xcc, 0x50, 0xbd, 0x09, 0x88, 0xe7, 0x94, 0xb5, 0x8d, 0x98, 0x9c, 0xb4, 0x9e, 0x40, 0xfd, 0xd7, - 0xeb, 0x50, 0xdb, 0xf5, 0x7c, 0xcb, 0x3e, 0x72, 0x93, 0x55, 0xb7, 0xa4, 0x1f, 0x47, 0x2b, 0x71, - 0x5d, 0x5a, 0x89, 0xb7, 0xa1, 0x32, 0xe1, 0x19, 0xf5, 0x70, 0xc4, 0xcd, 0xe6, 0x9c, 0x06, 0x02, - 0x34, 0x1c, 0x39, 0xb8, 0x9b, 0x23, 0x02, 0xca, 0x9c, 0xa3, 0xcc, 0x51, 0x26, 0x94, 0x35, 0xec, - 0x7b, 0xc4, 0x75, 0x4d, 0xcb, 0xb1, 0x42, 0x3e, 0x3d, 0xf5, 0x87, 0xaf, 0x46, 0x92, 0x5e, 0x6a, - 0xd3, 0x03, 0xcd, 0x9a, 0x34, 0x49, 0x3d, 0x42, 0x26, 0xbc, 0x43, 0xe4, 0x22, 0xaf, 0xe0, 0xd8, - 0x85, 0x6f, 0x98, 0x97, 0x73, 0x0e, 0x75, 0x08, 0xe5, 0x18, 0x8c, 0xba, 0xae, 0xd6, 0x16, 0xfa, - 0xed, 0x1a, 0xab, 0x40, 0xb1, 0xd5, 0x1c, 0xb4, 0x9a, 0x3b, 0x6d, 0x25, 0x83, 0xa8, 0x41, 0x7b, - 0xc8, 0x75, 0xda, 0x75, 0xb6, 0x01, 0x15, 0x4c, 0xed, 0xb4, 0x77, 0x9b, 0x87, 0xdd, 0xa1, 0x92, - 0x65, 0x35, 0x28, 0xf7, 0xfa, 0x7a, 0xb3, 0x35, 0xec, 0xf4, 0x7b, 0x4a, 0x4e, 0xfd, 0x11, 0x94, - 0x5a, 0xc7, 0xd6, 0xf8, 0xe4, 0xa2, 0x51, 0x24, 0xb3, 0xd3, 0x1a, 0x9f, 0x08, 0xfd, 0x74, 0xc1, - 0xec, 0xb4, 0xc6, 0x27, 0xea, 0x33, 0xa8, 0xb6, 0x22, 0xa1, 0x70, 0x51, 0x29, 0x0f, 0xa1, 0x4e, - 0x9b, 0x6f, 0x3c, 0x8a, 0x76, 0xdf, 0xfa, 0x8a, 0xdd, 0x57, 0x45, 0x9a, 0xd6, 0x48, 0x6c, 0xbf, - 0x8f, 0xa0, 0x72, 0xe0, 0x7b, 0x33, 0xcb, 0x0f, 0xa9, 0x58, 0x05, 0xb2, 0x27, 0xd6, 0xb9, 0x28, - 0x15, 0x3f, 0x13, 0xc3, 0x7c, 0x5d, 0x36, 0xcc, 0x1f, 0x42, 0x29, 0xca, 0xf6, 0x8d, 0xf3, 0xfc, - 0x10, 0xb9, 0x18, 0xe5, 0xb1, 0xad, 0x00, 0x2b, 0x7b, 0x00, 0x30, 0x8b, 0x01, 0x42, 0xfb, 0x88, - 0x34, 0x6f, 0x51, 0xb8, 0x26, 0x51, 0xa8, 0x7f, 0x93, 0x85, 0xfa, 0x81, 0xe1, 0x87, 0x36, 0x4e, - 0x0e, 0x1f, 0x86, 0x37, 0x21, 0x47, 0x4b, 0x9e, 0xfb, 0x00, 0x2e, 0xc5, 0x6a, 0x3b, 0xa7, 0x21, - 0x35, 0x82, 0x08, 0xd8, 0xf7, 0xa0, 0x3e, 0x8b, 0xc0, 0x3a, 0xc9, 0x06, 0x3e, 0x36, 0x8b, 0x59, - 0x68, 0xcc, 0x6b, 0x33, 0x39, 0xc9, 0x7e, 0x00, 0x97, 0xd3, 0x79, 0xad, 0x20, 0x48, 0xf8, 0xa8, - 0x3c, 0x59, 0x97, 0x52, 0x19, 0x39, 0x19, 0x6b, 0xc1, 0x66, 0x92, 0x7d, 0xec, 0x39, 0xf3, 0xa9, - 0x1b, 0x08, 0x3b, 0xe2, 0xea, 0x42, 0xed, 0x2d, 0x8e, 0xd5, 0x94, 0xd9, 0x02, 0x84, 0xa9, 0x50, - 0x8d, 0x61, 0xbd, 0xf9, 0x94, 0xb6, 0x44, 0x4e, 0x4b, 0xc1, 0xd8, 0x23, 0x80, 0x38, 0x8d, 0x96, - 0x63, 0x76, 0x45, 0xff, 0x3a, 0xa1, 0x35, 0xd5, 0x24, 0x32, 0x54, 0x3f, 0x90, 0x19, 0xf8, 0x76, - 0x78, 0x3c, 0x25, 0x2e, 0x96, 0xd5, 0x12, 0x00, 0x31, 0xcb, 0x40, 0x47, 0x33, 0x35, 0xce, 0x22, - 0x18, 0x5a, 0xdd, 0x0e, 0x06, 0xf3, 0x51, 0x5c, 0x2e, 0x8a, 0xd4, 0xa4, 0x97, 0xd3, 0xe0, 0x48, - 0x18, 0xf3, 0x49, 0x0b, 0xf7, 0x83, 0x23, 0xf6, 0x10, 0xae, 0x24, 0x44, 0x09, 0xff, 0x0d, 0x1a, - 0x40, 0x9c, 0x3b, 0x19, 0xbe, 0x98, 0x09, 0x07, 0xea, 0x8f, 0xa1, 0x96, 0x9a, 0x9d, 0x97, 0x0a, - 0xf7, 0xeb, 0x50, 0xc2, 0xff, 0x28, 0xda, 0xc5, 0x02, 0x2c, 0x62, 0x7a, 0x10, 0xfa, 0xaa, 0x05, - 0xca, 0xe2, 0x58, 0xb3, 0xbb, 0xe4, 0xe0, 0xa2, 0x49, 0x59, 0x76, 0x54, 0x45, 0x28, 0xf6, 0xf6, - 0xaa, 0x49, 0x5c, 0xa7, 0x56, 0x2f, 0x4d, 0x96, 0xfa, 0x07, 0xeb, 0x52, 0x9b, 0x71, 0xc4, 0xd9, - 0xeb, 0xf2, 0xf2, 0x93, 0x36, 0x6e, 0x32, 0x66, 0x24, 0x71, 0xde, 0x02, 0xc5, 0xf3, 0x4d, 0xdb, - 0x35, 0xc8, 0xe1, 0xc6, 0x87, 0x7b, 0x9d, 0xb4, 0xc5, 0x0d, 0x01, 0x3f, 0x10, 0x60, 0xb4, 0x5b, - 0x4c, 0x2b, 0xf6, 0x5f, 0x08, 0xef, 0x83, 0x0c, 0x92, 0xa5, 0x53, 0x2e, 0x2d, 0x9d, 0xde, 0x84, - 0xb2, 0x63, 0x05, 0x81, 0x1e, 0x1e, 0x1b, 0x2e, 0xc9, 0xef, 0x74, 0xa7, 0x4b, 0x88, 0x1c, 0x1e, - 0x1b, 0x2e, 0x12, 0xda, 0xae, 0x2e, 0x4e, 0x28, 0x0a, 0xcb, 0x84, 0xb6, 0x4b, 0xf6, 0x1b, 0xca, - 0xfd, 0xcb, 0xab, 0x26, 0x56, 0x88, 0x45, 0xb6, 0x3c, 0xaf, 0xea, 0xab, 0x50, 0x7c, 0x66, 0x5b, - 0xa7, 0x82, 0x97, 0xbd, 0xb0, 0xad, 0xd3, 0x88, 0x97, 0xe1, 0xb7, 0xfa, 0x57, 0x25, 0x28, 0x11, - 0xf1, 0xce, 0xc5, 0x8e, 0xcd, 0x6f, 0x63, 0x6d, 0x6c, 0x09, 0x39, 0x95, 0x5b, 0x61, 0xe3, 0x70, - 0xa9, 0xf5, 0x2a, 0x80, 0x24, 0x43, 0xb9, 0x46, 0x50, 0x0e, 0x63, 0xd1, 0x89, 0x6a, 0x3a, 0xe9, - 0x78, 0xc1, 0x97, 0x8e, 0xf0, 0xca, 0x24, 0x00, 0xf6, 0x80, 0x2b, 0xd1, 0xe4, 0x8f, 0x29, 0xca, - 0x8c, 0x85, 0xfa, 0x10, 0x99, 0xf0, 0xa4, 0x59, 0x63, 0x82, 0xf4, 0x03, 0xcb, 0x0f, 0xa2, 0xed, - 0x54, 0xd3, 0xa2, 0x24, 0x72, 0x34, 0x54, 0x9e, 0x84, 0xc9, 0x1d, 0x6d, 0x5f, 0x59, 0xfb, 0xd3, - 0x88, 0x80, 0xdd, 0x83, 0x22, 0x89, 0x6c, 0x0b, 0x25, 0xb8, 0xc4, 0x3a, 0x23, 0x65, 0x4a, 0x8b, - 0xd0, 0xec, 0x2d, 0xc8, 0x4f, 0x4e, 0xac, 0xf3, 0xa0, 0x51, 0x93, 0x59, 0x42, 0x4a, 0x16, 0x6a, - 0x9c, 0x82, 0xdd, 0x85, 0xba, 0x6f, 0x4d, 0x74, 0x72, 0x75, 0xa2, 0xf0, 0x0e, 0x1a, 0x75, 0x92, - 0xcd, 0x55, 0xdf, 0x9a, 0xb4, 0x10, 0x38, 0x1c, 0x39, 0x01, 0x7b, 0x03, 0x0a, 0x24, 0x95, 0xd0, - 0xc6, 0x90, 0x6a, 0x8e, 0x44, 0x9c, 0x26, 0xb0, 0xec, 0x21, 0x94, 0x13, 0xb6, 0x71, 0x85, 0x3a, - 0x74, 0x79, 0x81, 0x1f, 0x11, 0x1b, 0xd7, 0x12, 0x32, 0xf6, 0x01, 0x80, 0xb0, 0x7e, 0xf4, 0xd1, - 0x39, 0x1d, 0x1e, 0x54, 0x62, 0xeb, 0x50, 0x12, 0x80, 0xb2, 0x8d, 0xf4, 0x26, 0xe4, 0x51, 0x4a, - 0x04, 0x8d, 0x6b, 0xd4, 0x9a, 0xcd, 0xb4, 0x08, 0xa1, 0xde, 0x11, 0x9e, 0xdd, 0x83, 0x12, 0x2e, - 0x2e, 0x1d, 0xa7, 0xb0, 0x21, 0x9b, 0x83, 0x62, 0x25, 0xa2, 0x96, 0x66, 0x9d, 0x0e, 0xbe, 0x74, - 0xd8, 0x7d, 0xc8, 0x99, 0xd6, 0x24, 0x68, 0x5c, 0xa7, 0x12, 0xaf, 0x4a, 0x73, 0x89, 0x8a, 0xc3, - 0x8e, 0x35, 0xe1, 0xa2, 0x05, 0x69, 0xd8, 0x1e, 0xd4, 0x71, 0xe9, 0x3d, 0x24, 0xc5, 0x1b, 0x87, - 0xbc, 0x71, 0x83, 0x72, 0xdd, 0x59, 0xc8, 0xd5, 0x13, 0x44, 0x34, 0x41, 0x6d, 0x37, 0xf4, 0xcf, - 0xb5, 0x9a, 0x2b, 0xc3, 0xd8, 0x0d, 0x28, 0xd9, 0x41, 0xd7, 0x1b, 0x9f, 0x58, 0x66, 0xe3, 0x15, - 0x7e, 0xde, 0x18, 0xa5, 0xd9, 0xa7, 0x50, 0xa3, 0xc5, 0x88, 0x49, 0xac, 0xbc, 0x71, 0x53, 0x16, - 0x79, 0x43, 0x19, 0xa5, 0xa5, 0x29, 0x51, 0xdd, 0xb2, 0x03, 0x3d, 0xb4, 0xa6, 0x33, 0xcf, 0x47, - 0x43, 0xf2, 0x55, 0x6e, 0x3c, 0xd9, 0xc1, 0x30, 0x02, 0x21, 0x9f, 0x8f, 0x8f, 0x3a, 0x75, 0x6f, - 0x32, 0x09, 0xac, 0xb0, 0x71, 0x8b, 0xf6, 0x5a, 0x3d, 0x3a, 0xf1, 0xec, 0x13, 0x94, 0x94, 0xd2, - 0x40, 0x37, 0xcf, 0x5d, 0x63, 0x6a, 0x8f, 0x1b, 0xb7, 0xb9, 0xbd, 0x6a, 0x07, 0x3b, 0x1c, 0x20, - 0x9b, 0x8c, 0x5b, 0x29, 0x93, 0xf1, 0x12, 0xe4, 0xcd, 0x11, 0x6e, 0xe1, 0x3b, 0x54, 0x6c, 0xce, - 0x1c, 0x75, 0xcc, 0x1b, 0x4f, 0xc8, 0x4c, 0xa4, 0x46, 0x7e, 0xb4, 0xa0, 0x0c, 0xa4, 0x56, 0xbf, - 0xa4, 0x35, 0xec, 0xad, 0xc9, 0x3a, 0xc1, 0x76, 0x1e, 0xb2, 0xa6, 0x35, 0xb9, 0xf1, 0x23, 0x60, - 0xcb, 0xc3, 0xfb, 0x32, 0xcd, 0x24, 0x2f, 0x34, 0x93, 0xef, 0xad, 0x3f, 0xce, 0xa8, 0x9f, 0x42, - 0x2d, 0xb5, 0x57, 0x57, 0x6a, 0x58, 0xdc, 0xd2, 0x30, 0xa6, 0xc2, 0x33, 0xc3, 0x13, 0xea, 0xbf, - 0xcd, 0x42, 0x75, 0xcf, 0x08, 0x8e, 0xf7, 0x8d, 0xd9, 0x20, 0x34, 0xc2, 0x00, 0x07, 0xfc, 0xd8, - 0x08, 0x8e, 0xa7, 0xc6, 0x8c, 0x9b, 0x75, 0x19, 0xee, 0x54, 0x12, 0x30, 0xb4, 0xe9, 0x70, 0xaa, - 0x31, 0xd9, 0x77, 0x0f, 0x9e, 0x0a, 0x8f, 0x51, 0x9c, 0x46, 0xe6, 0x10, 0x1c, 0xcf, 0x27, 0x13, - 0xc7, 0x12, 0x4c, 0x2c, 0x4a, 0xb2, 0xbb, 0x50, 0x13, 0x9f, 0x64, 0xd3, 0x9d, 0x89, 0xc3, 0xe7, - 0x34, 0x90, 0x3d, 0x82, 0x8a, 0x00, 0x0c, 0x23, 0x56, 0x56, 0x8f, 0x3d, 0x81, 0x09, 0x42, 0x93, - 0xa9, 0xd8, 0x4f, 0xe0, 0x8a, 0x94, 0xdc, 0xf5, 0xfc, 0xfd, 0xb9, 0x13, 0xda, 0xad, 0x9e, 0x50, - 0xa0, 0x5f, 0x59, 0xca, 0x9e, 0x90, 0x68, 0xab, 0x73, 0xa6, 0x5b, 0xbb, 0x6f, 0xbb, 0x42, 0xbd, - 0x48, 0x03, 0x17, 0xa8, 0x8c, 0x33, 0x62, 0x88, 0x69, 0x2a, 0xe3, 0x0c, 0x97, 0xbf, 0x00, 0xec, - 0x5b, 0xe1, 0xb1, 0x67, 0x92, 0x7a, 0x11, 0x2f, 0xff, 0x81, 0x8c, 0xd2, 0xd2, 0x94, 0x38, 0x9c, - 0xee, 0xdc, 0x71, 0xc6, 0x6e, 0x48, 0x36, 0x54, 0x56, 0x8b, 0x92, 0x28, 0x2c, 0x7c, 0xc3, 0x3d, - 0xb2, 0x82, 0x46, 0x65, 0x2b, 0x7b, 0x2f, 0xa3, 0x89, 0x94, 0xfa, 0xbb, 0xeb, 0x90, 0xe7, 0x33, - 0xf9, 0x0a, 0x94, 0x47, 0x8e, 0x37, 0x3e, 0xd1, 0xdd, 0xf9, 0x34, 0x3a, 0x44, 0x20, 0x00, 0xea, - 0x5b, 0x64, 0xfb, 0x08, 0x8f, 0x5f, 0x46, 0xa3, 0x6f, 0x2c, 0xd2, 0x9b, 0x87, 0x58, 0x57, 0x96, - 0xa0, 0x22, 0x85, 0x8d, 0xf0, 0xbd, 0x53, 0x5a, 0x0d, 0x39, 0x42, 0x44, 0x49, 0x3a, 0xa7, 0x20, - 0xb9, 0x83, 0x99, 0xf2, 0x84, 0x2b, 0x11, 0xa0, 0xe5, 0x86, 0x8b, 0xde, 0xc9, 0xc2, 0x92, 0x77, - 0x92, 0xdd, 0x02, 0xb4, 0xac, 0xc6, 0x56, 0xdf, 0xb5, 0x5a, 0x3d, 0x1a, 0xe1, 0x92, 0x26, 0x41, - 0xd8, 0xc7, 0xf1, 0x5a, 0xa4, 0x1e, 0x09, 0xdf, 0xb1, 0xe0, 0xa8, 0xf2, 0xaa, 0xd5, 0x52, 0x74, - 0xb8, 0x77, 0x90, 0x4d, 0x72, 0x2d, 0x0e, 0x3f, 0xd5, 0x36, 0x80, 0xe6, 0x9d, 0x06, 0x56, 0x48, - 0x5a, 0xd8, 0x35, 0xea, 0x50, 0xea, 0xc0, 0xd0, 0x3b, 0x3d, 0xf0, 0x82, 0x58, 0x3d, 0x5b, 0x5f, - 0xad, 0x9e, 0xa9, 0xef, 0x41, 0x11, 0xe5, 0xae, 0x11, 0x1a, 0xec, 0xae, 0xf0, 0x73, 0x72, 0xbd, - 0x4b, 0x38, 0x7c, 0x93, 0x3a, 0x84, 0xe7, 0xb3, 0x1b, 0xd5, 0x4b, 0x79, 0xee, 0x48, 0xae, 0x8f, - 0x98, 0x7f, 0x8b, 0x02, 0x85, 0x24, 0x7f, 0x05, 0xca, 0xd8, 0x34, 0x3a, 0x69, 0x11, 0x1b, 0xbd, - 0xe4, 0x7b, 0xa7, 0x2d, 0x4c, 0xab, 0xff, 0x39, 0x03, 0x95, 0xbe, 0x6f, 0xa2, 0xe0, 0x18, 0xcc, - 0xac, 0xf1, 0x4b, 0xb5, 0x49, 0x94, 0xfb, 0x9e, 0xe3, 0x18, 0xb1, 0x2e, 0x86, 0x72, 0x3f, 0x02, - 0xb0, 0x0f, 0x20, 0x37, 0x71, 0x8c, 0x23, 0x9a, 0xec, 0xd8, 0xca, 0x94, 0x8a, 0x8f, 0xbe, 0x77, - 0x1d, 0xe3, 0x48, 0x23, 0x52, 0xf5, 0x37, 0xe2, 0xfa, 0xe9, 0xcc, 0x45, 0x3e, 0x69, 0x59, 0xa3, - 0x53, 0xbf, 0x41, 0x4b, 0xc9, 0xb0, 0x12, 0xe4, 0x76, 0xda, 0x83, 0x16, 0xb7, 0x2d, 0xd1, 0xca, - 0x1c, 0xe8, 0xbb, 0x1d, 0x6d, 0x30, 0x54, 0x72, 0x74, 0x8c, 0x48, 0x80, 0x6e, 0x73, 0x30, 0x54, - 0x4a, 0x0c, 0xa0, 0x70, 0xd8, 0xeb, 0xfc, 0xe4, 0xb0, 0xad, 0x28, 0xea, 0xbf, 0xcf, 0x00, 0x24, - 0x07, 0x02, 0xec, 0x6d, 0xa8, 0x9c, 0x52, 0x4a, 0x97, 0x4e, 0x8a, 0xe4, 0x3e, 0x02, 0x47, 0x93, - 0x4e, 0xf2, 0xae, 0x64, 0x62, 0xa0, 0xec, 0x5d, 0x3e, 0x32, 0xaa, 0xcc, 0x12, 0xb1, 0xcd, 0xde, - 0x81, 0x92, 0x87, 0xfd, 0x40, 0xd2, 0xac, 0x2c, 0x78, 0xa5, 0xee, 0x6b, 0x45, 0x8f, 0x27, 0x50, - 0x46, 0x4f, 0xfc, 0xc8, 0x95, 0x14, 0x93, 0xee, 0x22, 0xa8, 0xe5, 0x18, 0xf3, 0xc0, 0xd2, 0x38, - 0x3e, 0x66, 0xbb, 0xf9, 0x84, 0xed, 0xaa, 0x3f, 0x85, 0xfa, 0xc0, 0x98, 0xce, 0x38, 0x73, 0xa6, - 0x8e, 0x31, 0xc8, 0xe1, 0x9a, 0x10, 0x4b, 0x8f, 0xbe, 0x71, 0x8b, 0x1d, 0x58, 0xfe, 0xd8, 0x72, - 0xa3, 0x1d, 0x19, 0x25, 0x91, 0xd9, 0x1e, 0x06, 0xb6, 0x7b, 0xa4, 0x79, 0xa7, 0x51, 0x1c, 0x4f, - 0x94, 0x56, 0xff, 0x71, 0x06, 0x2a, 0x52, 0x33, 0xd8, 0x7b, 0x29, 0x8b, 0xf2, 0x95, 0xa5, 0x76, - 0xf2, 0x6f, 0xc9, 0xb2, 0x7c, 0x03, 0xf2, 0x41, 0x68, 0xf8, 0xd1, 0xd9, 0x92, 0x22, 0xe5, 0xd8, - 0xf6, 0xe6, 0xae, 0xa9, 0x71, 0x34, 0x53, 0x21, 0x6b, 0xb9, 0xa6, 0x30, 0x1a, 0x97, 0xa9, 0x10, - 0xa9, 0x6e, 0x41, 0x39, 0x2e, 0x1e, 0x97, 0x80, 0xd6, 0x7f, 0x3e, 0x50, 0xd6, 0x58, 0x19, 0xf2, - 0x5a, 0xb3, 0xf7, 0xa4, 0xad, 0x64, 0xd4, 0x3f, 0xc9, 0x00, 0x24, 0xb9, 0xd8, 0x83, 0x54, 0x6b, - 0x6f, 0x2c, 0x96, 0xfa, 0x80, 0xfe, 0x4a, 0x8d, 0xbd, 0x09, 0xe5, 0xb9, 0x4b, 0x40, 0xcb, 0x14, - 0x72, 0x27, 0x01, 0xb0, 0x9b, 0x90, 0x8d, 0x22, 0x7e, 0x16, 0xa2, 0x2c, 0x5e, 0x18, 0x8e, 0xfa, - 0x3d, 0x28, 0xc7, 0xc5, 0xb1, 0x1a, 0x94, 0x77, 0xfb, 0xdd, 0x6e, 0xff, 0x79, 0xa7, 0xf7, 0x44, - 0x59, 0xc3, 0xe4, 0x81, 0xd6, 0x6e, 0xb5, 0x77, 0x30, 0x99, 0xc1, 0x35, 0xdb, 0x3a, 0xd4, 0xb4, - 0x76, 0x6f, 0xa8, 0x6b, 0xfd, 0xe7, 0xca, 0xba, 0xfa, 0x5b, 0x39, 0xd8, 0xec, 0xbb, 0x3b, 0xf3, - 0x99, 0x63, 0x8f, 0x8d, 0xd0, 0x7a, 0x6a, 0x9d, 0xb7, 0xc2, 0x33, 0x14, 0xa7, 0x46, 0x18, 0xfa, - 0x7c, 0x33, 0x97, 0x35, 0x9e, 0xe0, 0x0e, 0xba, 0xc0, 0xf2, 0x43, 0xf2, 0x3f, 0xca, 0xbb, 0xb8, - 0xce, 0xe1, 0x2d, 0xcf, 0xa1, 0xbd, 0xcc, 0x7e, 0x00, 0x57, 0xb8, 0x53, 0x8f, 0x53, 0xa2, 0xd2, - 0xc9, 0x6d, 0xfb, 0xec, 0xd2, 0xd2, 0x65, 0x9c, 0x10, 0xb3, 0x22, 0x19, 0xb1, 0xb0, 0xdb, 0x50, - 0x49, 0xb2, 0x73, 0xd3, 0xa0, 0xac, 0x41, 0x4c, 0x48, 0x2d, 0xf1, 0x5c, 0xdd, 0x8c, 0x5a, 0xad, - 0xdb, 0xe6, 0x19, 0x99, 0x4b, 0x79, 0xad, 0xee, 0x25, 0x9d, 0x41, 0x91, 0xfb, 0x19, 0x6c, 0xa6, - 0x28, 0xa9, 0x15, 0xdc, 0x60, 0x7a, 0x27, 0x3a, 0x2c, 0x58, 0xe8, 0xbd, 0x0c, 0xc1, 0xe6, 0x70, - 0x8d, 0x70, 0xc3, 0x4b, 0x43, 0x91, 0x99, 0xd9, 0x81, 0x6e, 0x1f, 0xb9, 0x9e, 0x6f, 0x09, 0xf6, - 0x5e, 0xb2, 0x83, 0x0e, 0xa5, 0x13, 0x9b, 0x45, 0x3a, 0x62, 0xe7, 0xd2, 0x24, 0x3a, 0x61, 0xe6, - 0x68, 0x9b, 0xcb, 0xcb, 0x9c, 0x56, 0xa4, 0x74, 0xc7, 0x44, 0x73, 0x9d, 0xa3, 0x22, 0x33, 0x04, - 0xc8, 0x0c, 0xa9, 0x12, 0xf0, 0x19, 0x87, 0xdd, 0xe8, 0xc1, 0xe5, 0x55, 0x8d, 0x5c, 0xa1, 0x57, - 0x6d, 0xc9, 0x7a, 0xd5, 0x82, 0x03, 0x2b, 0xd1, 0xb1, 0xfe, 0x49, 0x06, 0xaa, 0x3b, 0x96, 0x39, - 0x9f, 0xfd, 0xd8, 0xb3, 0x5d, 0x5c, 0x00, 0x1f, 0x42, 0xd5, 0x73, 0x4c, 0x9a, 0x3d, 0x29, 0x52, - 0x24, 0x75, 0x7a, 0x2a, 0x0e, 0x7a, 0xc0, 0x73, 0xcc, 0x96, 0xe7, 0x50, 0x5c, 0xc9, 0xbb, 0x70, - 0x89, 0x3b, 0xf7, 0x84, 0xaf, 0xfb, 0x8c, 0x67, 0x5e, 0xa7, 0x99, 0x51, 0x38, 0x8a, 0xab, 0x42, - 0x44, 0xfe, 0x6b, 0x70, 0x59, 0x22, 0x27, 0xd7, 0x00, 0xd1, 0x2f, 0x2f, 0x92, 0xcd, 0x38, 0x6f, - 0x74, 0x7c, 0xa9, 0xfe, 0xbd, 0x2c, 0x94, 0xb9, 0x6b, 0x10, 0xdb, 0x7b, 0x0f, 0x8a, 0xde, 0xe8, - 0x0b, 0xdd, 0xb7, 0x26, 0x17, 0x9d, 0xba, 0x17, 0xbc, 0xd1, 0x17, 0x9a, 0x35, 0x61, 0x6f, 0x47, - 0x52, 0xdd, 0xb4, 0x26, 0x62, 0x50, 0xea, 0x69, 0x7b, 0x40, 0x48, 0x79, 0xee, 0x08, 0xbb, 0xb4, - 0x68, 0x3d, 0xdb, 0x26, 0x77, 0x67, 0xe7, 0xb4, 0xcd, 0xb4, 0xf1, 0xdc, 0x31, 0x83, 0x8b, 0xdd, - 0x28, 0xb9, 0x0b, 0xdd, 0x28, 0xec, 0x3e, 0x6c, 0xe2, 0x50, 0x27, 0xf9, 0xf8, 0x62, 0xc6, 0x6d, - 0xb5, 0xe1, 0x39, 0x66, 0xe2, 0xae, 0x30, 0xcf, 0x90, 0xd6, 0xb5, 0x4e, 0x17, 0x68, 0x0b, 0x9c, - 0xd6, 0xb5, 0x4e, 0x53, 0xb4, 0x8f, 0xa0, 0x92, 0xec, 0xd6, 0xa0, 0x51, 0xbc, 0x78, 0x06, 0xe3, - 0xcd, 0x1b, 0x60, 0x26, 0xee, 0xda, 0xe5, 0x99, 0x4a, 0x17, 0x67, 0xe2, 0x64, 0x74, 0xfc, 0xf8, - 0xcf, 0xd7, 0xa1, 0xdc, 0xe1, 0x65, 0x84, 0x67, 0xec, 0x0e, 0x64, 0xbf, 0x66, 0x1a, 0x10, 0x87, - 0xdd, 0x30, 0x4c, 0x53, 0x37, 0x26, 0x13, 0x6b, 0x1c, 0x5a, 0xa6, 0x8e, 0x1a, 0x97, 0x60, 0x7a, - 0x1b, 0x86, 0x69, 0x36, 0x05, 0x9c, 0x84, 0x07, 0x77, 0x74, 0x45, 0x96, 0x27, 0x3f, 0xda, 0xc9, - 0x46, 0x8e, 0x2e, 0x61, 0x78, 0xf2, 0x83, 0x9d, 0xd4, 0xcc, 0xe6, 0xbe, 0xdb, 0xcc, 0xe6, 0xbf, - 0xf5, 0xcc, 0x16, 0x2e, 0x9e, 0xd9, 0x94, 0xe7, 0x0d, 0x67, 0xaa, 0x48, 0x33, 0x95, 0x08, 0xf3, - 0x8e, 0x79, 0xa6, 0xfe, 0xc3, 0x2c, 0x80, 0x66, 0xcd, 0x1c, 0x63, 0x6c, 0xfd, 0xbf, 0x33, 0x7a, - 0xb7, 0xa5, 0x65, 0xe2, 0x9a, 0x51, 0x68, 0x52, 0xb4, 0x24, 0x48, 0xfc, 0xad, 0x1c, 0xde, 0xc2, - 0xb7, 0x1e, 0xde, 0xe2, 0xb7, 0x18, 0xde, 0xd2, 0xf2, 0xf0, 0xb2, 0x1f, 0xc1, 0xab, 0xbe, 0x75, - 0xea, 0xdb, 0xa1, 0xa5, 0x4f, 0x7c, 0x6f, 0xaa, 0xa7, 0x84, 0x01, 0xf2, 0xca, 0x32, 0x8d, 0xc6, - 0x75, 0x41, 0xb4, 0xeb, 0x7b, 0xd3, 0xb4, 0x40, 0x50, 0xff, 0xaa, 0x04, 0x95, 0xa6, 0x6b, 0x38, - 0xe7, 0x5f, 0x59, 0x14, 0xbe, 0x44, 0x87, 0x3f, 0xb3, 0x79, 0xc8, 0xc7, 0x9d, 0x9f, 0xe7, 0x97, - 0x09, 0x42, 0x23, 0x7e, 0x1b, 0x2a, 0xde, 0x3c, 0x8c, 0xf1, 0xfc, 0x84, 0x1f, 0x38, 0x88, 0x08, - 0xe2, 0xfc, 0xf1, 0xc1, 0x62, 0x94, 0x9f, 0xec, 0xcf, 0x24, 0x7f, 0x6c, 0x93, 0xc4, 0xf9, 0x89, - 0x00, 0x05, 0x84, 0x3d, 0xa5, 0x91, 0x0f, 0xe6, 0x53, 0x8b, 0x8f, 0x7e, 0x96, 0x87, 0x89, 0xb6, - 0x04, 0x0c, 0x4b, 0x99, 0x5a, 0x53, 0xcf, 0x3f, 0xe7, 0xa5, 0x14, 0x78, 0x29, 0x1c, 0x44, 0xa5, - 0xbc, 0x03, 0xec, 0xd4, 0xb0, 0x43, 0x3d, 0x5d, 0x14, 0xb7, 0x03, 0x15, 0xc4, 0x0c, 0xe5, 0xe2, - 0xae, 0x42, 0xc1, 0xb4, 0x83, 0x93, 0x4e, 0x5f, 0xd8, 0x80, 0x22, 0x85, 0x7d, 0x09, 0xc6, 0x06, - 0x2a, 0xa5, 0xa1, 0x15, 0xd0, 0x50, 0x66, 0xb5, 0x32, 0x42, 0xb6, 0x11, 0x80, 0x4a, 0x8d, 0x6b, - 0x85, 0xa7, 0x9e, 0x8f, 0x39, 0xb9, 0x89, 0x97, 0x00, 0x50, 0xf9, 0x43, 0x52, 0xac, 0x88, 0x9c, - 0x6a, 0x59, 0x2d, 0x4e, 0xa3, 0xf1, 0xc4, 0xb9, 0x12, 0x61, 0xab, 0xbc, 0xf9, 0x09, 0x84, 0xdd, - 0x85, 0x3a, 0x35, 0x9f, 0x4c, 0x40, 0xec, 0x03, 0x1d, 0xc2, 0x67, 0xb5, 0x2a, 0x42, 0xc9, 0xbf, - 0x82, 0x54, 0x9f, 0xc2, 0xf5, 0x54, 0xff, 0x74, 0xc3, 0xf7, 0x8d, 0x73, 0x7d, 0x6a, 0x7c, 0xe1, - 0xf9, 0xe4, 0x3f, 0xcb, 0x6a, 0x57, 0xe5, 0x61, 0x6b, 0x22, 0x7a, 0x1f, 0xb1, 0x17, 0x66, 0xb5, - 0x5d, 0xcf, 0x27, 0xe7, 0xda, 0xca, 0xac, 0x88, 0x25, 0xaf, 0x0e, 0x4d, 0x30, 0xd9, 0xa3, 0x01, - 0x0f, 0x2f, 0xd6, 0x2a, 0x04, 0xdb, 0x26, 0x10, 0xda, 0x68, 0xc1, 0x23, 0x2e, 0xec, 0x36, 0x45, - 0x14, 0xe0, 0x23, 0x12, 0x89, 0x1c, 0x71, 0x6c, 0x19, 0x26, 0x1d, 0xec, 0x13, 0x62, 0xcf, 0x32, - 0x28, 0x6c, 0x26, 0x78, 0xa4, 0xcf, 0xe6, 0x21, 0x8f, 0x0b, 0xd6, 0xf2, 0xc1, 0xa3, 0x83, 0x79, - 0x28, 0xc0, 0x47, 0x56, 0x48, 0xd1, 0xc0, 0x04, 0x7e, 0x62, 0x85, 0xa8, 0x9b, 0x04, 0x8f, 0xa2, - 0x43, 0xba, 0x2b, 0x62, 0x6c, 0x1f, 0x89, 0x53, 0x38, 0x15, 0x6a, 0x31, 0x52, 0x9f, 0xce, 0x79, - 0x20, 0x70, 0x56, 0xab, 0x44, 0x04, 0xfb, 0x73, 0x07, 0x27, 0x76, 0x6c, 0x8c, 0x8f, 0x2d, 0xdd, - 0xc7, 0xa6, 0x5c, 0xe3, 0x53, 0x47, 0x10, 0x0d, 0x5b, 0xf3, 0x0a, 0xf0, 0x84, 0x7e, 0x6c, 0x87, - 0xe4, 0xb0, 0xcb, 0x6a, 0x25, 0x02, 0xec, 0xd9, 0x21, 0xf2, 0x27, 0x8e, 0x14, 0x2b, 0x90, 0x8a, - 0xb8, 0x4e, 0x44, 0x1b, 0x84, 0xd8, 0x27, 0x38, 0x15, 0x74, 0x0f, 0x94, 0x14, 0x2d, 0x96, 0x77, - 0x83, 0x48, 0xeb, 0x12, 0x29, 0x96, 0xfa, 0x06, 0xf0, 0xcc, 0x3a, 0x2e, 0x3d, 0x5e, 0xe6, 0x2b, - 0xdc, 0x1f, 0x41, 0xe0, 0x1d, 0x3b, 0x38, 0xa1, 0x12, 0xef, 0x42, 0x5d, 0xa2, 0xc3, 0xf2, 0x6e, - 0xf2, 0x95, 0x11, 0x93, 0xa5, 0xda, 0xe8, 0x5b, 0x53, 0x2f, 0x14, 0xdd, 0x7c, 0x55, 0x6a, 0xa3, - 0x46, 0xf0, 0x74, 0x1b, 0x05, 0x2d, 0x96, 0x79, 0x4b, 0x6a, 0x23, 0x27, 0xc5, 0x52, 0xef, 0x40, - 0x15, 0xb9, 0x48, 0x68, 0xb9, 0x7c, 0xf3, 0xdf, 0xe6, 0x03, 0x2b, 0x60, 0xb4, 0xfb, 0xef, 0x40, - 0x95, 0x8f, 0xbc, 0xe0, 0xdb, 0x5b, 0x9c, 0x44, 0xc0, 0x90, 0x44, 0xf5, 0xa5, 0xc3, 0xb4, 0x03, - 0x7f, 0xee, 0x5a, 0xdc, 0xfd, 0x48, 0x9f, 0xa6, 0x08, 0x6b, 0x88, 0xd3, 0x6c, 0x07, 0x2e, 0x71, - 0xaf, 0x83, 0x25, 0xe9, 0x10, 0x51, 0x58, 0xe1, 0xca, 0x43, 0x26, 0x16, 0xd1, 0xc7, 0xe0, 0x40, - 0xfd, 0x59, 0x06, 0x6e, 0xf4, 0x29, 0xc6, 0x82, 0x18, 0xec, 0xbe, 0x15, 0x04, 0xc6, 0x91, 0xb5, - 0xeb, 0xf9, 0xbb, 0xf3, 0xaf, 0xbe, 0x3a, 0x67, 0xf7, 0x60, 0xe3, 0xc0, 0xf0, 0x2d, 0x37, 0x8c, - 0xd9, 0xaf, 0xd0, 0x31, 0x17, 0xc1, 0xec, 0x31, 0x1d, 0xe4, 0x58, 0x6e, 0x78, 0x18, 0x6b, 0xeb, - 0xa2, 0x2d, 0x69, 0xd7, 0xfe, 0x12, 0x95, 0xfa, 0xbf, 0xb6, 0x20, 0xd7, 0xf3, 0x4c, 0x8b, 0xbd, - 0x0f, 0x65, 0x8a, 0x09, 0x5e, 0x3e, 0x3f, 0x44, 0x34, 0xfd, 0x21, 0xc3, 0xa9, 0xe4, 0x8a, 0xaf, - 0x8b, 0xa3, 0x88, 0xef, 0x90, 0x09, 0x48, 0x01, 0x08, 0x28, 0xd0, 0x2a, 0xc2, 0x29, 0x45, 0x5e, - 0x15, 0x8e, 0xc1, 0xb1, 0x25, 0xa7, 0xba, 0x6f, 0xb9, 0xa4, 0xa5, 0xe5, 0xb5, 0x38, 0x4d, 0x86, - 0xb7, 0xef, 0xa1, 0xf0, 0xe5, 0x7b, 0x35, 0xbf, 0xc2, 0xf0, 0xe6, 0x78, 0xda, 0xbc, 0xef, 0x43, - 0xf9, 0x0b, 0xcf, 0x76, 0x79, 0xc3, 0x0b, 0x4b, 0x0d, 0x47, 0xdd, 0x9a, 0x37, 0xfc, 0x0b, 0xf1, - 0xc5, 0x5e, 0x83, 0xa2, 0xe7, 0xf2, 0xb2, 0x8b, 0x4b, 0x65, 0x17, 0x3c, 0xb7, 0xcb, 0x03, 0xf4, - 0x6a, 0xa3, 0xb9, 0xed, 0x98, 0x28, 0xbb, 0x1c, 0x6b, 0x12, 0x8a, 0x73, 0xbe, 0x0a, 0x01, 0xfb, - 0x6e, 0xd7, 0x9a, 0x84, 0xec, 0x6d, 0xa8, 0x4c, 0x6c, 0x07, 0x65, 0x3c, 0x15, 0x56, 0x5e, 0x2a, - 0x0c, 0x38, 0x9a, 0x0a, 0x7c, 0x1d, 0x4a, 0x47, 0xbe, 0x37, 0x9f, 0xe9, 0xa3, 0x73, 0x3a, 0xdf, - 0x5b, 0x38, 0x59, 0x23, 0xdc, 0xf6, 0x39, 0x0a, 0x1a, 0xfa, 0xb4, 0xdd, 0x23, 0x9d, 0x7c, 0x29, - 0x95, 0xad, 0xec, 0xbd, 0x92, 0x56, 0x8d, 0x80, 0xe4, 0x25, 0x79, 0x1d, 0x4a, 0xc6, 0xd1, 0x91, - 0x2e, 0xe2, 0x0c, 0x97, 0xca, 0x32, 0x8e, 0x8e, 0xa8, 0xca, 0x07, 0x50, 0x3b, 0xb5, 0x5d, 0x3d, - 0x98, 0x59, 0x63, 0x4e, 0x5b, 0x5b, 0x1e, 0xca, 0x53, 0xdb, 0x1d, 0xcc, 0xac, 0x31, 0xd1, 0xcb, - 0x3e, 0x8c, 0xfa, 0x4b, 0x7d, 0x18, 0x5b, 0x90, 0x77, 0xec, 0xa9, 0x1d, 0x8a, 0xc8, 0xc3, 0x94, - 0x91, 0x43, 0x08, 0xa6, 0x42, 0x41, 0x38, 0xcf, 0x95, 0x25, 0x12, 0x81, 0x49, 0x6b, 0x40, 0x9b, - 0x2f, 0xd1, 0x80, 0x24, 0x83, 0x83, 0x7d, 0xbd, 0xc1, 0xf1, 0x11, 0x9d, 0x30, 0x5a, 0x6e, 0xa8, - 0x47, 0x19, 0x2e, 0xad, 0xce, 0x50, 0xe5, 0x64, 0x7d, 0x9e, 0xed, 0x03, 0xa8, 0xf8, 0xe4, 0x5c, - 0xd3, 0xc9, 0x13, 0x77, 0x59, 0xf6, 0x4e, 0x24, 0x5e, 0x37, 0x0d, 0xfc, 0xc4, 0x03, 0xf7, 0x1a, - 0xd4, 0x78, 0x00, 0x14, 0x0f, 0x53, 0x09, 0x88, 0xb1, 0x97, 0xb5, 0x2a, 0x01, 0x79, 0x08, 0x4b, - 0xc0, 0x1e, 0x00, 0x44, 0xaa, 0x5b, 0x78, 0x46, 0x9c, 0x3d, 0x6e, 0x0a, 0x67, 0xff, 0xad, 0xf0, - 0x4c, 0x2b, 0x9b, 0xd1, 0x27, 0x32, 0xac, 0x91, 0xed, 0x9a, 0xb8, 0x08, 0x42, 0xe3, 0x28, 0x68, - 0x34, 0x68, 0x8f, 0x54, 0x04, 0x6c, 0x68, 0x1c, 0x05, 0x68, 0x2c, 0x1a, 0x5c, 0x41, 0xe2, 0x91, - 0xe0, 0xd7, 0x65, 0x4f, 0x92, 0xa4, 0x3a, 0x69, 0x15, 0x43, 0xd2, 0xa3, 0x3e, 0x01, 0x16, 0x9d, - 0xcc, 0x49, 0xb6, 0xdf, 0x8d, 0xa5, 0x75, 0xb1, 0x21, 0x8e, 0xe6, 0xe2, 0xdb, 0x0b, 0x9f, 0x40, - 0x2d, 0xad, 0xd0, 0xde, 0x5c, 0x71, 0x16, 0x45, 0x53, 0xa6, 0x55, 0xc7, 0xb2, 0x8a, 0xfb, 0x1a, - 0xd4, 0x5c, 0x2f, 0xd4, 0x89, 0x69, 0x53, 0x46, 0x7e, 0xde, 0x52, 0x75, 0xbd, 0xb0, 0x15, 0xc1, - 0x70, 0x7c, 0x22, 0xb3, 0x29, 0x3c, 0x23, 0x3e, 0x1f, 0x8f, 0x4f, 0x6c, 0xe3, 0xa0, 0xbe, 0x16, - 0x99, 0x3b, 0x38, 0x4f, 0x5c, 0x7d, 0xa7, 0x0c, 0xb7, 0x53, 0xf3, 0x14, 0xeb, 0xf5, 0x1a, 0xf8, - 0x89, 0x8e, 0x7f, 0x1b, 0x2a, 0x81, 0x37, 0xf7, 0xc7, 0x96, 0x1e, 0x84, 0xd6, 0xac, 0xb1, 0x45, - 0x23, 0x0a, 0x1c, 0x34, 0x08, 0xad, 0x19, 0x7b, 0x0c, 0xf5, 0x99, 0x6f, 0xe9, 0xd2, 0x3c, 0xdd, - 0x91, 0xbb, 0x78, 0xe0, 0x5b, 0xc9, 0x54, 0x55, 0x67, 0x52, 0x2a, 0xca, 0x29, 0xf5, 0x40, 0x5d, - 0xc8, 0x99, 0x74, 0x02, 0x73, 0x26, 0x66, 0xdb, 0x0f, 0x61, 0x53, 0xca, 0x39, 0x3f, 0xa1, 0xcc, - 0xaf, 0xa5, 0x8e, 0x06, 0x23, 0xf2, 0xc3, 0x13, 0xcc, 0x5e, 0x9f, 0xa5, 0xd2, 0xac, 0xb9, 0xe0, - 0x93, 0x41, 0xe5, 0xfa, 0x2e, 0xe5, 0xbf, 0x76, 0x81, 0xa3, 0x25, 0xe5, 0xac, 0x79, 0xca, 0x0f, - 0x81, 0x3a, 0x41, 0xdb, 0x35, 0x1b, 0xaf, 0xf3, 0x2b, 0x46, 0x94, 0x60, 0x8f, 0xa0, 0xca, 0xd5, - 0x3c, 0x0a, 0x6f, 0x0e, 0x1a, 0x6f, 0xc8, 0x4e, 0x69, 0xd2, 0xf5, 0x08, 0xa1, 0x55, 0x9c, 0xf8, - 0x3b, 0x60, 0x1f, 0xc3, 0x26, 0x3f, 0x1f, 0x90, 0xd9, 0xe2, 0x9b, 0xcb, 0x8b, 0x8b, 0x88, 0x76, - 0x13, 0xde, 0xa8, 0xc1, 0x75, 0x7f, 0xee, 0x92, 0xea, 0x27, 0x72, 0xce, 0x7c, 0x6f, 0x64, 0xf1, - 0xfc, 0xf7, 0x28, 0xbf, 0xe8, 0x8e, 0xc6, 0xc9, 0x78, 0x5e, 0xe2, 0x47, 0x57, 0x7d, 0x19, 0x74, - 0x80, 0xf9, 0x2e, 0x28, 0x93, 0xf3, 0x73, 0x2a, 0xf3, 0xad, 0x6f, 0x53, 0xe6, 0x36, 0xe6, 0xa3, - 0x32, 0x19, 0xe4, 0xe6, 0x73, 0xdb, 0x6c, 0xdc, 0xe7, 0x91, 0xc8, 0xf8, 0xcd, 0x5e, 0x87, 0xba, - 0x6f, 0x8d, 0xe7, 0x7e, 0x60, 0xbf, 0xb0, 0xf4, 0xc0, 0x76, 0x4f, 0x1a, 0x6f, 0xd3, 0x38, 0xd6, - 0x62, 0xe8, 0xc0, 0x76, 0x4f, 0x70, 0xc5, 0x5a, 0x67, 0xa1, 0xe5, 0xbb, 0x3a, 0xaa, 0xdb, 0x8d, - 0x77, 0xe4, 0x15, 0xdb, 0x26, 0xc4, 0x60, 0x6c, 0xb8, 0x1a, 0x58, 0xf1, 0x37, 0xfb, 0x01, 0x6c, - 0x24, 0xa6, 0xd6, 0x0c, 0x15, 0x8f, 0xc6, 0xbb, 0x2b, 0x4f, 0x8d, 0x49, 0x29, 0xd1, 0x92, 0x90, - 0x0a, 0xae, 0xbf, 0xa4, 0xd7, 0x56, 0xc0, 0xd7, 0xd6, 0x83, 0x6f, 0xb4, 0xb6, 0x06, 0xb4, 0xb6, - 0xde, 0x80, 0x92, 0xed, 0x86, 0x96, 0xff, 0xc2, 0x70, 0x1a, 0xef, 0x2d, 0x31, 0xf0, 0x18, 0xc7, - 0xee, 0x42, 0x31, 0x70, 0x6c, 0x64, 0x4c, 0x8d, 0xf7, 0x97, 0xc8, 0x22, 0x14, 0xbb, 0x07, 0xe5, - 0xf8, 0x4e, 0x5d, 0xe3, 0x83, 0x25, 0xba, 0x04, 0xc9, 0x6e, 0x41, 0xee, 0x14, 0xd7, 0xe3, 0xc3, - 0xe5, 0x33, 0x08, 0x84, 0xa3, 0xc4, 0x9f, 0xd8, 0x8e, 0xc3, 0x25, 0xfe, 0xa3, 0x25, 0x89, 0xbf, - 0x6b, 0x3b, 0x0e, 0x97, 0xf8, 0x13, 0xf1, 0x85, 0xf2, 0x92, 0x72, 0x60, 0x4f, 0x3e, 0x5c, 0x96, - 0x97, 0x88, 0x7b, 0x46, 0xb7, 0x0f, 0x2b, 0x01, 0x39, 0xd6, 0xf9, 0xf9, 0xc0, 0x47, 0xf2, 0x58, - 0xa5, 0x3d, 0xee, 0x1a, 0x04, 0x71, 0x1a, 0xd5, 0x76, 0x71, 0xac, 0x80, 0xf6, 0xf0, 0xc7, 0xfc, - 0x52, 0x0c, 0x87, 0xa0, 0x31, 0xfc, 0x3e, 0xd4, 0xa2, 0x78, 0x3a, 0xac, 0x2e, 0x68, 0x7c, 0xb2, - 0xd4, 0x82, 0x34, 0x01, 0xdb, 0x81, 0xea, 0x04, 0x35, 0xc0, 0x29, 0x57, 0x08, 0x1b, 0x8f, 0xa9, - 0x21, 0x5b, 0x91, 0x2c, 0xbe, 0x48, 0x61, 0xd4, 0x52, 0xb9, 0xd8, 0x03, 0x60, 0xf6, 0x84, 0xcf, - 0x27, 0x1a, 0xd8, 0x5c, 0xe9, 0x6b, 0x7c, 0x4a, 0x8b, 0x73, 0x05, 0x86, 0x3d, 0x82, 0x5a, 0x60, - 0xb9, 0xa6, 0x3e, 0x0d, 0x84, 0x66, 0xf1, 0x3d, 0x6a, 0xa7, 0x60, 0xc3, 0xf1, 0xdd, 0x5b, 0xad, - 0x82, 0x54, 0xfb, 0x01, 0x57, 0x31, 0x1e, 0x01, 0xae, 0xf3, 0x17, 0x49, 0xa6, 0x5f, 0xbb, 0x20, - 0x13, 0x52, 0x45, 0x99, 0x1e, 0x43, 0xdd, 0xb4, 0xcc, 0xf9, 0x4c, 0x27, 0xc5, 0x0d, 0x97, 0xe5, - 0xf7, 0x65, 0x7e, 0x29, 0xfb, 0x44, 0xb5, 0xaa, 0x29, 0x7b, 0x48, 0x3f, 0x81, 0x8d, 0xc8, 0x79, - 0x19, 0x0a, 0x3f, 0xe7, 0x0f, 0xe4, 0x0a, 0x63, 0xdf, 0xa4, 0x56, 0x9b, 0x47, 0x9f, 0x51, 0x3b, - 0xc9, 0x66, 0x0e, 0x5c, 0x63, 0x16, 0x1c, 0x7b, 0x61, 0xe3, 0xd7, 0x65, 0x55, 0x63, 0x20, 0xa0, - 0x5a, 0x15, 0x89, 0xa2, 0x14, 0x8a, 0xae, 0x64, 0x6b, 0x8f, 0x43, 0xab, 0xf1, 0x43, 0x2e, 0xba, - 0x62, 0x60, 0x2b, 0xc4, 0x61, 0x03, 0x63, 0x36, 0x73, 0xce, 0xf9, 0x72, 0xfc, 0x11, 0x2d, 0xc7, - 0xcb, 0xd2, 0x72, 0x6c, 0x22, 0x92, 0xd6, 0x63, 0xd9, 0x88, 0x3e, 0xd9, 0x43, 0xa8, 0xce, 0xbc, - 0x20, 0xd4, 0xcd, 0xa9, 0x43, 0xfd, 0x6f, 0xca, 0xec, 0xe0, 0xc0, 0x0b, 0xc2, 0x9d, 0xa9, 0x43, - 0x02, 0x6c, 0x16, 0x7f, 0xb3, 0x2e, 0x5c, 0x4a, 0xb1, 0x7a, 0x83, 0x0e, 0xe6, 0x1b, 0xdb, 0x54, - 0xe3, 0x4d, 0xa9, 0x46, 0x89, 0xe5, 0x8b, 0x80, 0xce, 0x4d, 0x6f, 0x11, 0x84, 0x16, 0x1b, 0x9f, - 0x83, 0x38, 0xaa, 0xb9, 0xc5, 0xf5, 0x16, 0x82, 0x46, 0x61, 0xcd, 0x8f, 0x61, 0x23, 0xa1, 0xc2, - 0x0e, 0x06, 0x8d, 0x1d, 0x79, 0xf5, 0x4a, 0x77, 0x0f, 0x6a, 0x51, 0x46, 0x84, 0x05, 0xea, 0x9f, - 0xe7, 0xa1, 0x14, 0x19, 0x0d, 0xac, 0x02, 0xc5, 0xc3, 0xde, 0xd3, 0x5e, 0xff, 0x79, 0x8f, 0xdf, - 0x01, 0x6c, 0x0e, 0x06, 0x6d, 0x6d, 0xa8, 0x98, 0xac, 0x0e, 0x40, 0x77, 0x9c, 0xf4, 0x41, 0xab, - 0xd9, 0xe3, 0x77, 0x02, 0xe9, 0x66, 0x15, 0x4f, 0xaf, 0xb3, 0x4d, 0xa8, 0xed, 0x1e, 0xf6, 0x28, - 0x6e, 0x94, 0x83, 0xb2, 0x08, 0x6a, 0x7f, 0xc6, 0x4f, 0x08, 0x39, 0x28, 0x87, 0xa0, 0xfd, 0xe6, - 0xb0, 0xad, 0x75, 0x22, 0x50, 0x9e, 0x42, 0x50, 0xfb, 0x87, 0x5a, 0x4b, 0x94, 0x54, 0x60, 0x57, - 0x60, 0x33, 0xce, 0x16, 0x15, 0xa9, 0x14, 0xb1, 0x65, 0x07, 0x5a, 0xff, 0xc7, 0xed, 0xd6, 0x50, - 0x01, 0x3a, 0x6e, 0x7c, 0xf2, 0x44, 0xa9, 0xb0, 0x2a, 0x94, 0x76, 0x3a, 0x83, 0x61, 0xa7, 0xd7, - 0x1a, 0x2a, 0x55, 0x6c, 0xf0, 0x6e, 0xa7, 0x3b, 0x6c, 0x6b, 0x4a, 0x8d, 0x95, 0x20, 0xf7, 0xe3, - 0x7e, 0xa7, 0xa7, 0xd4, 0xe9, 0xae, 0x57, 0x73, 0xff, 0xa0, 0xdb, 0x56, 0x36, 0x10, 0x3a, 0xe8, - 0x6b, 0x43, 0x45, 0x41, 0xe8, 0xf3, 0x4e, 0x6f, 0xa7, 0xff, 0x5c, 0xd9, 0x64, 0x65, 0xc8, 0x1f, - 0xf6, 0xb0, 0x1a, 0xc6, 0x6a, 0x50, 0xa6, 0x4f, 0xbd, 0xd9, 0xed, 0x2a, 0x97, 0xa4, 0x33, 0xca, - 0xcb, 0x88, 0xa2, 0x13, 0xcf, 0x01, 0xb6, 0xe1, 0x0a, 0xf6, 0x25, 0x4e, 0x12, 0xf5, 0x55, 0x2c, - 0x67, 0xbf, 0xd3, 0x3b, 0x1c, 0x28, 0xd7, 0x90, 0x98, 0x3e, 0x09, 0xd3, 0xc0, 0x72, 0x3a, 0x3d, - 0x1a, 0xca, 0x5b, 0xf8, 0xbd, 0xd3, 0xee, 0xb6, 0x87, 0x6d, 0xe5, 0x36, 0xf6, 0x4a, 0x6b, 0x1f, - 0x74, 0x9b, 0xad, 0xb6, 0xb2, 0x85, 0x89, 0x6e, 0xbf, 0xf5, 0x54, 0xef, 0x1f, 0x28, 0x77, 0xd8, - 0x65, 0x50, 0xfa, 0x3d, 0x7d, 0xe7, 0xf0, 0xa0, 0xdb, 0x69, 0x35, 0x87, 0x6d, 0xfd, 0x69, 0xfb, - 0x73, 0x45, 0xc5, 0x61, 0x3f, 0xd0, 0xda, 0xba, 0x28, 0xeb, 0xb5, 0x28, 0x2d, 0xca, 0xbb, 0xcb, - 0x14, 0xa8, 0xee, 0x1e, 0xfe, 0xf4, 0xa7, 0x9f, 0xeb, 0x62, 0x1c, 0x5e, 0xc7, 0x66, 0x26, 0x39, - 0xf4, 0xc3, 0xa7, 0xca, 0x1b, 0x0b, 0xa0, 0xc1, 0x53, 0xe5, 0x4d, 0x1c, 0xc7, 0x68, 0x62, 0x94, - 0x7b, 0x48, 0xa0, 0xb5, 0x5b, 0x87, 0xda, 0xa0, 0xf3, 0xac, 0xad, 0xb7, 0x86, 0x6d, 0xe5, 0x2d, - 0x1a, 0xb8, 0x4e, 0xef, 0xa9, 0x72, 0x1f, 0x7b, 0x86, 0x5f, 0x7c, 0xba, 0xde, 0x66, 0x0c, 0xea, - 0x09, 0x2d, 0xc1, 0xde, 0x41, 0x92, 0x6d, 0xad, 0xdf, 0xdc, 0x69, 0x35, 0x07, 0x43, 0xe5, 0x5d, - 0x1c, 0x96, 0xc1, 0x41, 0xb7, 0x33, 0x54, 0x1e, 0x60, 0xdf, 0x9f, 0x34, 0x87, 0x7b, 0x6d, 0x4d, - 0x79, 0x0f, 0x67, 0x7e, 0xd8, 0xd9, 0x6f, 0xeb, 0x62, 0x1a, 0x1e, 0x62, 0x1d, 0xbb, 0x9d, 0x6e, - 0x57, 0x79, 0x44, 0xc7, 0x72, 0x4d, 0x6d, 0xd8, 0xa1, 0xb9, 0xff, 0x10, 0x0b, 0x68, 0x1e, 0x1c, - 0x74, 0x3f, 0x57, 0x3e, 0xc2, 0x0e, 0xee, 0x1f, 0x76, 0x87, 0x1d, 0xfd, 0xf0, 0x60, 0xa7, 0x39, - 0x6c, 0x2b, 0x1f, 0xd3, 0xc2, 0xe8, 0x0f, 0x86, 0x3b, 0xfb, 0x5d, 0xe5, 0x13, 0xf5, 0x37, 0xa1, - 0x14, 0xd9, 0x91, 0x98, 0xab, 0xd3, 0xeb, 0xb5, 0x35, 0x65, 0x0d, 0x4b, 0xee, 0xb6, 0x77, 0x87, - 0x4a, 0x86, 0x8e, 0x24, 0x3b, 0x4f, 0xf6, 0x86, 0xca, 0x3a, 0x7e, 0xf6, 0x0f, 0x71, 0x90, 0xb2, - 0xd4, 0xbb, 0xf6, 0x7e, 0x47, 0xc9, 0xe1, 0x57, 0xb3, 0x37, 0xec, 0x28, 0x79, 0x5a, 0x36, 0x9d, - 0xde, 0x93, 0x6e, 0x5b, 0x29, 0x20, 0x74, 0xbf, 0xa9, 0x3d, 0x55, 0x8a, 0xbc, 0xd0, 0x9d, 0xf6, - 0x67, 0x4a, 0x89, 0x15, 0x60, 0xbd, 0xfb, 0x50, 0x29, 0x23, 0x68, 0xa7, 0xbd, 0x73, 0x78, 0xa0, - 0x80, 0x7a, 0x0f, 0x8a, 0xcd, 0xa3, 0xa3, 0x7d, 0x34, 0xd3, 0xb1, 0x33, 0x87, 0xdd, 0x2e, 0xdf, - 0x46, 0xdb, 0xfd, 0xe1, 0xb0, 0xbf, 0xaf, 0x64, 0x70, 0xe1, 0x0e, 0xfb, 0x07, 0xca, 0xba, 0xda, - 0x81, 0x52, 0x24, 0xfe, 0xa4, 0xeb, 0x8b, 0x25, 0xc8, 0x1d, 0x68, 0xed, 0x67, 0xfc, 0x1c, 0xbd, - 0xd7, 0xfe, 0x0c, 0x9b, 0x89, 0x5f, 0x58, 0x50, 0x16, 0x2b, 0xe2, 0xf7, 0x0c, 0xe9, 0xfe, 0x62, - 0xb7, 0xd3, 0x6b, 0x37, 0x35, 0x25, 0xaf, 0x7e, 0x94, 0x3a, 0xa2, 0x14, 0x5c, 0x03, 0xab, 0x6f, - 0x76, 0x44, 0xf5, 0x9d, 0x27, 0xbd, 0xbe, 0xd6, 0xe6, 0x17, 0x22, 0xc5, 0xb8, 0xad, 0xab, 0x6f, - 0x43, 0x39, 0xe6, 0x78, 0xb8, 0x8e, 0x5a, 0x5a, 0x7f, 0x30, 0xe0, 0xc3, 0xbc, 0x86, 0x69, 0x1a, - 0x1b, 0x9e, 0xce, 0xa8, 0xff, 0x3f, 0x94, 0x62, 0x66, 0x7b, 0x17, 0xd6, 0x87, 0x03, 0xe1, 0x82, - 0xbf, 0xfc, 0x20, 0x79, 0xb7, 0x62, 0x18, 0x7d, 0x69, 0xeb, 0xc3, 0x01, 0x7b, 0x07, 0x0a, 0xfc, - 0xd6, 0xaa, 0x38, 0x45, 0xba, 0x9c, 0x66, 0xe0, 0x43, 0xc2, 0x69, 0x82, 0x46, 0xed, 0x42, 0x3d, - 0x8d, 0x61, 0xb7, 0x00, 0x38, 0x4e, 0x72, 0xa7, 0x48, 0x10, 0x76, 0x03, 0xa2, 0x5b, 0xb1, 0x3b, - 0x22, 0xd4, 0x34, 0x4e, 0xab, 0xff, 0x20, 0x0b, 0x90, 0xa8, 0x6a, 0xa8, 0x0c, 0xc6, 0xce, 0x92, - 0xbc, 0x38, 0x50, 0x7e, 0x05, 0xca, 0x8e, 0x67, 0x98, 0xf2, 0xfb, 0x13, 0x25, 0x04, 0xd0, 0x68, - 0xc8, 0x77, 0xdf, 0xca, 0x3c, 0x9a, 0x83, 0x5d, 0x85, 0xc2, 0xc4, 0xf3, 0xa7, 0x46, 0x14, 0x94, - 0x2a, 0x52, 0x28, 0x7a, 0xf8, 0x21, 0x27, 0x2a, 0xac, 0x2e, 0xdd, 0x2b, 0xa1, 0x08, 0x67, 0x01, - 0xec, 0x22, 0x0c, 0x4d, 0x1a, 0xcb, 0x1d, 0x3b, 0x5e, 0x60, 0x99, 0x68, 0xb2, 0x17, 0x48, 0x2b, - 0x85, 0x08, 0xb4, 0x7d, 0xce, 0x7b, 0xeb, 0x4f, 0x6d, 0xd7, 0x08, 0x85, 0x9f, 0x99, 0x7a, 0x1b, - 0x41, 0xb0, 0xb9, 0x5f, 0x04, 0x9e, 0xf0, 0x9d, 0xf0, 0xf3, 0xd2, 0x12, 0x02, 0xa8, 0xb9, 0xaf, - 0x02, 0x58, 0xc1, 0xd8, 0x98, 0xf1, 0xc2, 0xcb, 0x54, 0x78, 0x59, 0x40, 0xb6, 0xcf, 0x59, 0x17, - 0xea, 0xc3, 0x11, 0xb2, 0x7b, 0x0f, 0xcd, 0xe0, 0x96, 0xe7, 0x08, 0xaf, 0xc6, 0xdd, 0x45, 0x9d, - 0xf6, 0x41, 0x9a, 0x8c, 0x1f, 0xec, 0x2e, 0xe4, 0xbd, 0xd1, 0x84, 0x4b, 0x2b, 0xc8, 0xbe, 0x55, - 0xc8, 0x9a, 0x13, 0xcd, 0x4e, 0x33, 0x0c, 0x29, 0xec, 0x39, 0x96, 0x6c, 0x99, 0x28, 0xde, 0x97, - 0x0b, 0xb5, 0x57, 0x28, 0x86, 0x45, 0x04, 0x27, 0x8a, 0x49, 0x8a, 0x83, 0x0e, 0xdf, 0x80, 0x0d, - 0x44, 0x4e, 0x6c, 0xcb, 0x31, 0x05, 0x09, 0xbf, 0x86, 0x54, 0x1b, 0x7b, 0xce, 0x2e, 0x42, 0x89, - 0x4e, 0xfd, 0xcb, 0x1c, 0x40, 0x62, 0x06, 0xa5, 0xce, 0x96, 0x33, 0xe9, 0xb3, 0xe5, 0x87, 0x70, - 0x55, 0x5c, 0x52, 0x8b, 0x0f, 0x68, 0x6d, 0x57, 0x1f, 0x19, 0xd1, 0x31, 0x3e, 0x13, 0x58, 0x7e, - 0x46, 0xdb, 0x71, 0xb7, 0x0d, 0xd4, 0x90, 0x36, 0xe4, 0x3c, 0xe1, 0xf9, 0x2c, 0x1d, 0x86, 0x20, - 0xcb, 0xdd, 0x24, 0xfb, 0xf0, 0x7c, 0xc6, 0xde, 0x87, 0x2b, 0xbe, 0x35, 0xf1, 0xad, 0xe0, 0x58, - 0x0f, 0x03, 0xb9, 0x32, 0x1e, 0x1b, 0xb7, 0x29, 0x90, 0xc3, 0x20, 0xae, 0xeb, 0x7d, 0xb8, 0x22, - 0x0c, 0xa4, 0x85, 0xe6, 0xf1, 0xe3, 0xd0, 0x4d, 0x8e, 0x94, 0x5b, 0xf7, 0x2a, 0x80, 0xb0, 0x0d, - 0xa3, 0x57, 0x5c, 0x4a, 0x5a, 0x99, 0xdb, 0x81, 0x68, 0xcc, 0xbf, 0x03, 0xcc, 0x0e, 0xf4, 0x85, - 0x93, 0x25, 0x71, 0x58, 0xaf, 0xd8, 0xc1, 0x41, 0xea, 0x54, 0xe9, 0xa2, 0x43, 0xab, 0xd2, 0x45, - 0x87, 0x56, 0x97, 0x21, 0x4f, 0xe6, 0xa3, 0x38, 0x43, 0xe2, 0x09, 0xa6, 0x42, 0x0e, 0xf9, 0x23, - 0x9d, 0x77, 0xd4, 0x1f, 0xd6, 0x1f, 0xd0, 0x1b, 0x38, 0x38, 0x3f, 0x08, 0xd5, 0x08, 0xc7, 0xde, - 0x85, 0x4b, 0xf2, 0xa0, 0x46, 0x0f, 0x3c, 0x54, 0xa8, 0x9b, 0x4a, 0x32, 0x8c, 0x1a, 0x7f, 0xea, - 0xe1, 0x6d, 0x60, 0xd2, 0xb8, 0x44, 0xd4, 0x55, 0x7e, 0xee, 0x1b, 0x0f, 0x8a, 0x20, 0x7e, 0x13, - 0x68, 0x00, 0xb8, 0x7b, 0xb9, 0xb6, 0x6c, 0x2c, 0x21, 0x92, 0x5c, 0xd1, 0xef, 0xc3, 0x95, 0x64, - 0xec, 0x74, 0x23, 0xd4, 0xc3, 0x63, 0x4b, 0xb7, 0x5c, 0x93, 0xee, 0x2d, 0x96, 0xb4, 0xcd, 0x78, - 0x18, 0x9b, 0xe1, 0xf0, 0xd8, 0x6a, 0xbb, 0xa6, 0xfa, 0xfb, 0x19, 0xa8, 0xa7, 0x2d, 0x35, 0x1e, - 0xcb, 0x9e, 0x04, 0xe9, 0xe7, 0x93, 0xc0, 0xfc, 0x57, 0xa0, 0x3c, 0x3b, 0x11, 0x11, 0xf9, 0xd1, - 0xda, 0x9e, 0x9d, 0xf0, 0x48, 0x7c, 0xf6, 0x16, 0x14, 0x67, 0x27, 0x7c, 0xb3, 0x5f, 0xb4, 0x9a, - 0x0a, 0x33, 0x1e, 0x24, 0xfb, 0x16, 0x14, 0xe7, 0x82, 0x34, 0x77, 0x11, 0xe9, 0x9c, 0x48, 0xd5, - 0x2d, 0xa8, 0xca, 0xbe, 0x11, 0xdc, 0xb3, 0x68, 0x07, 0xf1, 0x86, 0xe1, 0xa7, 0xfa, 0x5b, 0xeb, - 0x44, 0xf2, 0xad, 0x4e, 0xab, 0xbf, 0x55, 0xc4, 0xc0, 0x16, 0x45, 0xf5, 0xe9, 0x14, 0xb3, 0x3b, - 0xf6, 0xa2, 0xa7, 0x49, 0xe0, 0xd8, 0x08, 0x9a, 0xf3, 0xd0, 0x6b, 0x79, 0x8e, 0x88, 0x1b, 0x11, - 0x97, 0xa0, 0x72, 0x91, 0x37, 0x5f, 0xdc, 0x8f, 0x7c, 0x5f, 0xdc, 0x14, 0xa2, 0x6b, 0x7a, 0x14, - 0xab, 0x92, 0x5f, 0x9a, 0xc1, 0x6a, 0x74, 0x4b, 0x8f, 0xc2, 0x50, 0x1e, 0xc2, 0x46, 0x12, 0x96, - 0x1d, 0x85, 0xb7, 0x2c, 0x66, 0xa9, 0xc5, 0x31, 0xd9, 0x98, 0x54, 0x7f, 0x27, 0x03, 0x9b, 0x4b, - 0xae, 0x06, 0x1c, 0xad, 0xe4, 0x15, 0x23, 0xfc, 0x64, 0x77, 0xa0, 0x3a, 0x35, 0xc2, 0xf1, 0xb1, - 0x3e, 0xf3, 0xad, 0x89, 0x7d, 0x16, 0x3d, 0xc5, 0x44, 0xb0, 0x03, 0x02, 0x51, 0xa8, 0xce, 0x6c, - 0x46, 0x0e, 0x96, 0xa9, 0x1d, 0x0a, 0x06, 0x05, 0x04, 0xea, 0x92, 0xe7, 0x35, 0x0a, 0xe3, 0xcb, - 0x5d, 0x10, 0x75, 0x78, 0x13, 0x0a, 0x9d, 0xd8, 0xa5, 0x11, 0xc7, 0x9a, 0x64, 0xc5, 0x4b, 0x24, - 0x1e, 0x94, 0x5b, 0xf4, 0xaa, 0xc9, 0xbe, 0x31, 0x63, 0xf7, 0x21, 0x3b, 0x35, 0x66, 0x22, 0x16, - 0xa5, 0x11, 0x1f, 0x27, 0x70, 0xec, 0x83, 0x7d, 0x63, 0xc6, 0x19, 0x3a, 0x12, 0xdd, 0xf8, 0x18, - 0x4a, 0x11, 0xe0, 0x5b, 0xb1, 0xee, 0xff, 0x92, 0x85, 0xf2, 0x8e, 0xec, 0xfc, 0x44, 0x53, 0x2d, - 0xf4, 0xe7, 0x2e, 0xaa, 0x1e, 0xe2, 0xf0, 0xa5, 0x32, 0x36, 0xdc, 0xa1, 0x00, 0x45, 0x0b, 0x68, - 0xfd, 0x6b, 0x16, 0xd0, 0x4d, 0x00, 0x9f, 0x4c, 0x72, 0xb2, 0xca, 0xb3, 0x71, 0xdc, 0x63, 0xc7, - 0x14, 0x31, 0x1d, 0xcb, 0xc7, 0xf9, 0xb9, 0x6f, 0x7e, 0x9c, 0x9f, 0x5f, 0x79, 0x9c, 0xff, 0x7f, - 0xcd, 0x01, 0xfc, 0x1b, 0x89, 0xfc, 0xc0, 0x35, 0x8d, 0x64, 0x65, 0x2e, 0xc5, 0x66, 0xf1, 0xdd, - 0x09, 0xa4, 0xfb, 0x1e, 0xd4, 0xa3, 0x61, 0x16, 0x1d, 0x83, 0xd4, 0x75, 0x0d, 0x81, 0xe3, 0x7e, - 0xdd, 0x5a, 0x28, 0x27, 0xd3, 0x3b, 0xb4, 0xf2, 0xf5, 0x3b, 0x54, 0xfd, 0x83, 0x0c, 0x30, 0x61, - 0xd7, 0xee, 0xce, 0x1d, 0x67, 0x68, 0x9d, 0x11, 0x23, 0xb8, 0x0f, 0x9b, 0xc2, 0x29, 0x2b, 0x05, - 0x6e, 0x89, 0x43, 0x2e, 0x8e, 0x48, 0x0e, 0xb9, 0x56, 0xdd, 0x54, 0x5d, 0x5f, 0x79, 0x53, 0x75, - 0xf5, 0x0d, 0xd8, 0xdb, 0x50, 0x91, 0xef, 0x79, 0x72, 0x7d, 0x0b, 0x8c, 0xe4, 0x8a, 0xe7, 0x7f, - 0x5c, 0x07, 0x48, 0x6c, 0xef, 0x5f, 0x75, 0x50, 0xc8, 0x8a, 0x29, 0xc9, 0xae, 0x9a, 0x92, 0x7b, - 0xa0, 0xc8, 0x74, 0xd2, 0x85, 0xe3, 0x7a, 0x42, 0x18, 0xe9, 0x31, 0x76, 0x20, 0x5f, 0x0a, 0x25, - 0x9e, 0x26, 0xce, 0x9b, 0x45, 0xa0, 0x1c, 0xb1, 0x5c, 0x21, 0xa2, 0x4b, 0x76, 0xc0, 0x59, 0x30, - 0xfb, 0x14, 0xae, 0xc7, 0x39, 0xf5, 0x53, 0x3b, 0x3c, 0xf6, 0xe6, 0xa1, 0xf0, 0x92, 0x06, 0x42, - 0x50, 0x5f, 0x8d, 0x4a, 0x7a, 0xce, 0xd1, 0x9c, 0x65, 0x05, 0xec, 0x23, 0x28, 0x4f, 0xe6, 0x8e, - 0xa3, 0x87, 0xd6, 0x59, 0x28, 0xa2, 0xa7, 0x1b, 0x29, 0xb7, 0x85, 0x34, 0xbd, 0x5a, 0x69, 0x22, - 0x12, 0xea, 0xff, 0x5c, 0x87, 0xfc, 0x4f, 0xe6, 0x96, 0x7f, 0xce, 0x3e, 0x86, 0x72, 0x10, 0x4e, - 0x43, 0xf9, 0xa0, 0xf1, 0x3a, 0x2f, 0x80, 0xf0, 0x74, 0x4e, 0x68, 0x4d, 0x2d, 0x37, 0xe4, 0x3e, - 0x3c, 0xa4, 0x25, 0x89, 0x74, 0x19, 0xf2, 0x41, 0x68, 0xcd, 0x02, 0x11, 0xd8, 0xc6, 0x13, 0x6c, - 0x0b, 0xf2, 0xae, 0x67, 0x5a, 0x41, 0x3a, 0x7c, 0xad, 0x87, 0x42, 0x9f, 0x23, 0x98, 0x0a, 0x85, - 0x78, 0xc6, 0x97, 0x0e, 0xfb, 0x38, 0x86, 0xae, 0x1f, 0x58, 0x86, 0x69, 0xbb, 0x47, 0xd1, 0x05, - 0xee, 0x38, 0x8d, 0xb2, 0x96, 0x34, 0x78, 0xe3, 0x28, 0x7a, 0x4d, 0x41, 0x24, 0xd9, 0x16, 0x54, - 0xf0, 0xf3, 0xb9, 0x6f, 0x87, 0xd6, 0xe0, 0x91, 0x18, 0x37, 0x19, 0x84, 0xfa, 0xb7, 0x69, 0x85, - 0xd6, 0x38, 0x1c, 0x7c, 0x29, 0xe2, 0xba, 0x28, 0x60, 0x27, 0x82, 0xa8, 0x26, 0xd4, 0x52, 0xdd, - 0x5d, 0x72, 0x94, 0x0c, 0xda, 0xdd, 0x76, 0x6b, 0xc8, 0x4d, 0x2c, 0x61, 0x9d, 0xaf, 0xcb, 0xd6, - 0x7d, 0x56, 0x32, 0xfb, 0x73, 0x92, 0x1d, 0x96, 0x27, 0xa7, 0x41, 0x5b, 0x7b, 0xd2, 0x56, 0x0a, - 0xea, 0x1f, 0xae, 0xc3, 0xe6, 0xd0, 0x37, 0xdc, 0xc0, 0xe0, 0xb7, 0xf2, 0xdc, 0xd0, 0xf7, 0x1c, - 0xf6, 0x3d, 0x28, 0x85, 0x63, 0x47, 0x9e, 0x86, 0xdb, 0xd1, 0xa6, 0x5f, 0x20, 0x7d, 0x30, 0x1c, - 0x73, 0x87, 0x6a, 0x31, 0xe4, 0x1f, 0xec, 0x5d, 0xc8, 0x8f, 0xac, 0x23, 0xdb, 0x15, 0x0c, 0xf8, - 0xca, 0x62, 0xc6, 0x6d, 0x44, 0xee, 0xad, 0x69, 0x9c, 0x8a, 0xbd, 0x0f, 0x85, 0xb1, 0x37, 0x8d, - 0x24, 0x55, 0x72, 0x81, 0x48, 0xaa, 0x08, 0xb1, 0x7b, 0x6b, 0x9a, 0xa0, 0x63, 0x1f, 0x43, 0xc9, - 0xf7, 0x1c, 0x67, 0x64, 0x8c, 0x4f, 0x84, 0x0c, 0x6b, 0x2c, 0xe6, 0xd1, 0x04, 0x7e, 0x6f, 0x4d, - 0x8b, 0x69, 0xd5, 0x07, 0x50, 0x14, 0x8d, 0xc5, 0x01, 0xd8, 0x6e, 0x3f, 0xe9, 0x88, 0x81, 0x6c, - 0xf5, 0xf7, 0xf7, 0x3b, 0x43, 0x7e, 0x53, 0x59, 0xeb, 0x77, 0xbb, 0xdb, 0xcd, 0xd6, 0x53, 0x65, - 0x7d, 0xbb, 0x04, 0x05, 0xee, 0x46, 0x53, 0x7f, 0x3b, 0x03, 0x1b, 0x0b, 0x1d, 0x60, 0x8f, 0x21, - 0x37, 0x45, 0xa5, 0x92, 0x0f, 0xcf, 0xdd, 0x95, 0xbd, 0x94, 0xd2, 0x5c, 0xd5, 0xc4, 0x1c, 0xea, - 0xa7, 0x50, 0x4f, 0xc3, 0x25, 0x6b, 0xbc, 0x06, 0x65, 0xad, 0xdd, 0xdc, 0xd1, 0xfb, 0x3d, 0xb4, - 0x81, 0xd1, 0x26, 0xa6, 0xe4, 0x73, 0xad, 0x43, 0x06, 0xf4, 0x6f, 0x80, 0xb2, 0x38, 0x30, 0xec, - 0x09, 0x1a, 0x25, 0xd3, 0x99, 0x63, 0x71, 0x41, 0x91, 0x4c, 0xd9, 0xad, 0x15, 0x23, 0x29, 0xc8, - 0x68, 0xc6, 0xea, 0xe3, 0x54, 0x5a, 0xfd, 0xff, 0x80, 0x2d, 0x8f, 0xe0, 0xaf, 0xae, 0xf8, 0xff, - 0x91, 0x81, 0xdc, 0x81, 0x63, 0xb8, 0xec, 0x35, 0xc8, 0xd3, 0x0b, 0x3b, 0x82, 0x7b, 0x56, 0xa4, - 0x0d, 0x8e, 0xcb, 0x82, 0x70, 0xec, 0x6d, 0xc8, 0x86, 0xe3, 0xe8, 0x56, 0xf6, 0xb5, 0x0b, 0x16, - 0xdf, 0xde, 0x9a, 0x86, 0x54, 0xec, 0x1e, 0x64, 0x4d, 0x33, 0x0a, 0xc6, 0x16, 0x56, 0x3f, 0x9a, - 0x8a, 0x3b, 0xd6, 0xc4, 0x76, 0x6d, 0xf1, 0x22, 0x10, 0x92, 0xb0, 0xd7, 0x21, 0x6b, 0x8e, 0x9d, - 0x74, 0x64, 0x3d, 0x37, 0x2a, 0xe3, 0x02, 0xcd, 0xb1, 0xc3, 0x54, 0xa8, 0x85, 0xfe, 0xb9, 0xee, - 0xcf, 0x5d, 0x0a, 0x65, 0x0a, 0x84, 0xb9, 0x53, 0x41, 0x65, 0x66, 0x4e, 0xf1, 0x50, 0x81, 0xb8, - 0xdd, 0x35, 0xf3, 0xad, 0x99, 0xe1, 0xc7, 0x86, 0x8e, 0x1d, 0x1c, 0x70, 0xc0, 0x76, 0x01, 0xe8, - 0x81, 0x4e, 0xf5, 0x1d, 0x7a, 0xfe, 0x05, 0x35, 0x6c, 0x35, 0xfa, 0x5a, 0x71, 0x79, 0x56, 0x60, - 0xd4, 0xbf, 0xc8, 0x42, 0x45, 0x6a, 0x0f, 0xfb, 0x10, 0x4a, 0x66, 0x7a, 0x23, 0x5e, 0x5f, 0x6a, - 0xf4, 0x83, 0x9d, 0x68, 0x0b, 0x9a, 0x62, 0x79, 0x7f, 0x0a, 0xb5, 0xc0, 0x0a, 0xf5, 0x17, 0x86, - 0x6f, 0xf3, 0xa7, 0xb1, 0xd6, 0x65, 0x17, 0xfa, 0xc0, 0x0a, 0x9f, 0x45, 0x98, 0xbd, 0x35, 0xad, - 0x1a, 0x48, 0x69, 0x32, 0x03, 0x44, 0x97, 0xb2, 0xa9, 0xe7, 0xc3, 0x38, 0x70, 0x6f, 0x4d, 0x8b, - 0xf0, 0x48, 0x6a, 0x9d, 0x59, 0xe3, 0x79, 0x18, 0x99, 0x01, 0xb5, 0xa8, 0x43, 0x04, 0xa4, 0x97, - 0x0a, 0xf9, 0x27, 0x7b, 0x88, 0xbc, 0xce, 0x70, 0x1c, 0x8f, 0x74, 0xb6, 0xbc, 0xec, 0xd0, 0xde, - 0x89, 0xe1, 0xfc, 0x65, 0xc4, 0x28, 0xc5, 0xde, 0x80, 0xbc, 0x17, 0x1e, 0x5b, 0x91, 0xf2, 0x1c, - 0x3d, 0x24, 0x83, 0xa0, 0x9d, 0x56, 0x17, 0x57, 0x0a, 0xa1, 0xd5, 0x9f, 0x67, 0xa0, 0x28, 0x46, - 0x80, 0x6d, 0x42, 0x6d, 0xd0, 0x1e, 0xea, 0xcf, 0x9a, 0x5a, 0xa7, 0xb9, 0xdd, 0x6d, 0x8b, 0x0b, - 0x01, 0x4f, 0xb4, 0x66, 0x4f, 0xf0, 0x49, 0xad, 0xfd, 0xac, 0xff, 0xb4, 0xcd, 0x5d, 0x5c, 0x3b, - 0xed, 0xde, 0xe7, 0x4a, 0x96, 0x7b, 0x79, 0xdb, 0x07, 0x4d, 0x0d, 0xb9, 0x64, 0x05, 0x8a, 0xed, - 0xcf, 0xda, 0xad, 0x43, 0x62, 0x93, 0x75, 0x80, 0x9d, 0x76, 0xb3, 0xdb, 0xed, 0xb7, 0x90, 0x6d, - 0x16, 0x18, 0x83, 0x7a, 0x4b, 0x6b, 0x37, 0x87, 0x6d, 0xbd, 0xd9, 0x6a, 0xf5, 0x0f, 0x7b, 0x43, - 0xa5, 0x88, 0x35, 0x36, 0xbb, 0xc3, 0xb6, 0x16, 0x83, 0xe8, 0x71, 0xaf, 0x1d, 0xad, 0x7f, 0x10, - 0x43, 0xca, 0xdb, 0x65, 0x34, 0xc9, 0x68, 0xae, 0xd4, 0xbf, 0xac, 0x43, 0x3d, 0xbd, 0x34, 0xd9, - 0x27, 0x50, 0x32, 0xcd, 0xd4, 0x1c, 0xdf, 0x5c, 0xb5, 0x84, 0x1f, 0xec, 0x98, 0xd1, 0x34, 0xf3, - 0x0f, 0x76, 0x27, 0xda, 0x48, 0xeb, 0x4b, 0x1b, 0x29, 0xda, 0x46, 0x3f, 0x84, 0x0d, 0xf1, 0x10, - 0x8b, 0x69, 0x84, 0xc6, 0xc8, 0x08, 0xac, 0xf4, 0x2e, 0x69, 0x11, 0x72, 0x47, 0xe0, 0xf6, 0xd6, - 0xb4, 0xfa, 0x38, 0x05, 0x61, 0xdf, 0x87, 0xba, 0x41, 0x76, 0x6e, 0x9c, 0x3f, 0x27, 0x2b, 0x81, - 0x4d, 0xc4, 0x49, 0xd9, 0x6b, 0x86, 0x0c, 0xc0, 0x85, 0x68, 0xfa, 0xde, 0x2c, 0xc9, 0x9c, 0x4f, - 0x9d, 0xe5, 0xf8, 0xde, 0x4c, 0xca, 0x5b, 0x35, 0xa5, 0x34, 0xfb, 0x18, 0xaa, 0xa2, 0xe5, 0x89, - 0x27, 0x21, 0xde, 0xb2, 0xbc, 0xd9, 0xa4, 0xd4, 0xed, 0xad, 0x69, 0x95, 0x71, 0x92, 0x64, 0x8f, - 0x50, 0x93, 0x4b, 0x74, 0xf1, 0xa2, 0xbc, 0xd6, 0xa8, 0xb5, 0x51, 0x2e, 0x30, 0xe2, 0x14, 0x7b, - 0x1f, 0x80, 0xda, 0xc9, 0xf3, 0x94, 0x52, 0x21, 0x18, 0xbe, 0x37, 0x8b, 0xb2, 0x94, 0xcd, 0x28, - 0x21, 0x35, 0x8f, 0xfb, 0x81, 0xca, 0xcb, 0xcd, 0x23, 0x5f, 0x50, 0xd2, 0x3c, 0xee, 0x42, 0x8a, - 0x9b, 0xc7, 0xb3, 0xc1, 0x52, 0xf3, 0xa2, 0x5c, 0xbc, 0x79, 0x3c, 0x53, 0xd4, 0x3c, 0x9e, 0xa7, - 0xb2, 0xd8, 0xbc, 0x28, 0x0b, 0x35, 0x8f, 0xe7, 0xf8, 0xfe, 0x92, 0xee, 0x5e, 0xbd, 0x50, 0x77, - 0xc7, 0x69, 0x4b, 0x6b, 0xef, 0xdf, 0x87, 0x7a, 0x70, 0xec, 0x9d, 0x4a, 0x0c, 0xa4, 0x26, 0xe7, - 0x1e, 0x1c, 0x7b, 0xa7, 0x32, 0x07, 0xa9, 0x05, 0x32, 0x00, 0x5b, 0xcb, 0xbb, 0x48, 0x37, 0xd5, - 0xeb, 0x72, 0x6b, 0xa9, 0x87, 0xcf, 0x6c, 0xeb, 0x14, 0x5b, 0x6b, 0x44, 0x09, 0x1c, 0x94, 0xc4, - 0xef, 0x11, 0x88, 0x98, 0xa1, 0x54, 0x38, 0x81, 0xa8, 0x09, 0x62, 0x0f, 0x48, 0x80, 0x6b, 0x6b, - 0xee, 0xca, 0xd9, 0x14, 0x79, 0x6d, 0x1d, 0xba, 0xa9, 0x8c, 0x55, 0x4e, 0x2a, 0xb2, 0x26, 0xbb, - 0x22, 0xb0, 0xbe, 0x9c, 0x5b, 0xee, 0xd8, 0x12, 0xd1, 0x45, 0xa9, 0x5d, 0x31, 0x10, 0xb8, 0x64, - 0x57, 0x44, 0x90, 0x78, 0x5d, 0xc7, 0xd9, 0xd9, 0xe2, 0xba, 0x96, 0x32, 0xd3, 0xba, 0x8e, 0xb3, - 0xc6, 0x1b, 0x2a, 0xce, 0x7b, 0x69, 0x69, 0x43, 0x49, 0x99, 0xf9, 0x86, 0x8a, 0x73, 0x3f, 0x02, - 0xb1, 0x9a, 0xf8, 0xe0, 0xa6, 0x62, 0x90, 0x78, 0xab, 0xc5, 0xe8, 0xc2, 0x38, 0x4e, 0xe1, 0x5a, - 0xf5, 0x2d, 0xb4, 0x15, 0xc4, 0x52, 0xb8, 0x22, 0xaf, 0x55, 0x8d, 0x30, 0xf1, 0x56, 0xf2, 0x93, - 0xa4, 0xfa, 0xc7, 0x79, 0x28, 0x0a, 0xa6, 0xc3, 0x2e, 0xc1, 0x86, 0xe0, 0x7d, 0x3b, 0xcd, 0x61, - 0x73, 0xbb, 0x39, 0x40, 0x6d, 0x85, 0x41, 0x9d, 0x33, 0xbf, 0x18, 0x96, 0x41, 0x86, 0x48, 0xdc, - 0x2f, 0x06, 0xad, 0x23, 0x43, 0x14, 0x79, 0xf9, 0xcb, 0x88, 0x59, 0xb6, 0x01, 0x15, 0x9e, 0x91, - 0x03, 0xe8, 0xa2, 0x1e, 0xe5, 0xe2, 0xe9, 0xbc, 0x94, 0x85, 0x1f, 0x7d, 0x14, 0x92, 0x2c, 0x1c, - 0x50, 0x8c, 0xb3, 0x44, 0x67, 0x23, 0x0c, 0xea, 0x43, 0xed, 0xb0, 0xd7, 0x4a, 0xea, 0x29, 0xd3, - 0xe5, 0x2a, 0x5e, 0xcc, 0xb3, 0x4e, 0xfb, 0xb9, 0x02, 0x98, 0x89, 0x97, 0x42, 0xe9, 0x0a, 0xea, - 0x5b, 0x54, 0x08, 0x25, 0xab, 0xec, 0x1a, 0x5c, 0x1a, 0xec, 0xf5, 0x9f, 0xeb, 0x3c, 0x53, 0xdc, - 0x85, 0x1a, 0xbb, 0x0c, 0x8a, 0x84, 0xe0, 0xc5, 0xd7, 0xb1, 0x4a, 0x82, 0x46, 0x84, 0x03, 0x65, - 0x83, 0x0e, 0x17, 0x11, 0x36, 0xe4, 0x02, 0x48, 0xc1, 0xae, 0xf0, 0xac, 0xfd, 0xee, 0xe1, 0x7e, - 0x6f, 0xa0, 0x6c, 0x62, 0x23, 0x08, 0xc2, 0x5b, 0xce, 0xe2, 0x62, 0x12, 0xb1, 0x75, 0x89, 0x24, - 0x19, 0xc2, 0x9e, 0x37, 0xb5, 0x5e, 0xa7, 0xf7, 0x64, 0xa0, 0x5c, 0x8e, 0x4b, 0x6e, 0x6b, 0x5a, - 0x5f, 0x1b, 0x28, 0x57, 0x62, 0xc0, 0x60, 0xd8, 0x1c, 0x1e, 0x0e, 0x94, 0xab, 0x71, 0x2b, 0x0f, - 0xb4, 0x7e, 0xab, 0x3d, 0x18, 0x74, 0x3b, 0x83, 0xa1, 0x72, 0x8d, 0x5d, 0x81, 0xcd, 0xa4, 0x45, - 0x11, 0x71, 0x43, 0x6a, 0xa8, 0xf6, 0xa4, 0x3d, 0x54, 0xae, 0xc7, 0xcd, 0x68, 0xf5, 0xbb, 0xdd, - 0x26, 0x1d, 0x83, 0xdd, 0x40, 0x22, 0x3a, 0x1f, 0x14, 0xbd, 0x79, 0x05, 0xdb, 0x75, 0xd8, 0x93, - 0x41, 0x37, 0xa5, 0xa5, 0x31, 0x68, 0xff, 0xe4, 0xb0, 0xdd, 0x6b, 0xb5, 0x95, 0x57, 0x93, 0xa5, - 0x11, 0xc3, 0x6e, 0xc5, 0x4b, 0x23, 0x06, 0xdd, 0x8e, 0xeb, 0x8c, 0x40, 0x03, 0x65, 0x0b, 0xcb, - 0x13, 0xed, 0xe8, 0xf5, 0xda, 0xad, 0x21, 0xf6, 0xf5, 0x4e, 0x3c, 0x8a, 0x87, 0x07, 0x4f, 0xb4, - 0xe6, 0x4e, 0x5b, 0x51, 0x11, 0xa2, 0xb5, 0x7b, 0xcd, 0xfd, 0x68, 0xb6, 0x5f, 0xdb, 0xae, 0xd2, - 0x6b, 0xcb, 0x42, 0x5c, 0xaa, 0x3f, 0x06, 0x26, 0x3f, 0x5b, 0x2a, 0x5e, 0x26, 0x63, 0x90, 0x9b, - 0xf8, 0xde, 0x34, 0xba, 0xaa, 0x8e, 0xdf, 0x68, 0xab, 0xcd, 0xe6, 0x23, 0x3a, 0xcb, 0x4a, 0x6e, - 0xae, 0xca, 0x20, 0xf5, 0x8f, 0x33, 0x50, 0x4f, 0x8b, 0x4a, 0x54, 0x11, 0xed, 0x89, 0xee, 0x7a, - 0x21, 0x7f, 0xf2, 0x2a, 0x88, 0x3c, 0x51, 0xf6, 0xa4, 0xe7, 0x85, 0xf4, 0xe6, 0x15, 0x99, 0x8e, - 0xb1, 0xe4, 0xe3, 0xa5, 0xc6, 0x69, 0xd6, 0x81, 0x4b, 0xa9, 0x57, 0x5d, 0x53, 0x0f, 0x8e, 0x35, - 0xe2, 0xb7, 0x28, 0x17, 0xda, 0xaf, 0xb1, 0x60, 0xb9, 0x4f, 0xe2, 0xfe, 0x71, 0x2e, 0xb9, 0x7f, - 0xbc, 0x07, 0xb5, 0x94, 0x64, 0x26, 0x8b, 0x7f, 0x92, 0x6e, 0x69, 0xc9, 0x9e, 0xbc, 0xbc, 0x99, - 0xea, 0x1f, 0x65, 0xa0, 0x2a, 0xcb, 0xe9, 0xef, 0x5c, 0x12, 0xdd, 0x50, 0x11, 0xdf, 0xba, 0x6d, - 0x46, 0x4f, 0x5d, 0x45, 0xa0, 0x0e, 0xbd, 0x32, 0xcf, 0x7d, 0xb0, 0xbb, 0x27, 0x83, 0xb8, 0x3b, - 0x32, 0x08, 0x4d, 0x66, 0xba, 0xb9, 0xb8, 0xfb, 0x14, 0x09, 0xc4, 0x1d, 0x97, 0x04, 0xa2, 0xde, - 0x86, 0xf2, 0xee, 0x49, 0x14, 0x9e, 0x20, 0x3f, 0xfc, 0x56, 0xe6, 0xd7, 0x9d, 0xd5, 0x3f, 0xcd, - 0x40, 0x3d, 0x79, 0xcc, 0x83, 0x82, 0x1e, 0xf9, 0x6b, 0xc0, 0x7c, 0x39, 0xac, 0x9b, 0xa3, 0xe4, - 0x01, 0xfa, 0x75, 0xf9, 0x01, 0xfa, 0xd7, 0x44, 0x61, 0x59, 0x59, 0x9a, 0xc5, 0x75, 0x89, 0xcb, - 0xd4, 0x8f, 0xa0, 0x8a, 0xff, 0x35, 0x6b, 0x62, 0xf9, 0xbe, 0x15, 0x3d, 0x8c, 0xbc, 0x44, 0x9c, - 0x22, 0x22, 0x8b, 0xc4, 0x9a, 0x08, 0xc5, 0x68, 0xe5, 0x7b, 0x23, 0x88, 0x57, 0xff, 0x45, 0x0e, - 0x2a, 0x92, 0xd6, 0xf3, 0x8d, 0x96, 0xdf, 0x4d, 0x28, 0x27, 0x2f, 0x59, 0x88, 0x1b, 0xac, 0x31, - 0x20, 0x35, 0x57, 0xd9, 0x85, 0xb9, 0x6a, 0x40, 0x51, 0x44, 0x47, 0x0a, 0xbf, 0x67, 0x94, 0x4c, - 0x3b, 0xf6, 0xf2, 0x2f, 0x71, 0xbd, 0x7f, 0x00, 0x55, 0xc9, 0x2b, 0x17, 0x3d, 0x8b, 0xb3, 0x48, - 0x5f, 0x49, 0x3c, 0x74, 0x01, 0xbb, 0x02, 0x85, 0xc9, 0x89, 0x6e, 0x8e, 0x22, 0x37, 0x67, 0x7e, - 0x72, 0xb2, 0x33, 0xa2, 0xa3, 0x8b, 0x49, 0x2c, 0xe8, 0xb9, 0xaf, 0xa4, 0x34, 0x89, 0xc4, 0xf9, - 0x3d, 0x28, 0x4e, 0x4e, 0xf8, 0xf5, 0xb8, 0xb2, 0x1c, 0xf0, 0x93, 0x0c, 0x79, 0x61, 0x72, 0x42, - 0x97, 0xe9, 0x3e, 0x05, 0x65, 0xc1, 0xa7, 0x1a, 0x88, 0x93, 0xc9, 0xc5, 0x46, 0x6d, 0xa4, 0xdd, - 0xab, 0x01, 0x7b, 0x0f, 0x2e, 0x0b, 0xc9, 0x6b, 0x04, 0x3a, 0x8f, 0xd7, 0xa7, 0xc7, 0x51, 0xf8, - 0x0b, 0x72, 0x9b, 0x1c, 0xd7, 0x0c, 0x06, 0x84, 0xc1, 0xc5, 0xaa, 0x42, 0x55, 0x5a, 0xbb, 0xfc, - 0xe5, 0x99, 0xb2, 0x96, 0x82, 0xb1, 0xc7, 0x50, 0x9d, 0x9c, 0xf0, 0xb5, 0x30, 0xf4, 0xf6, 0x2d, - 0x11, 0x83, 0x7d, 0x79, 0x71, 0x15, 0x50, 0xa8, 0x6e, 0x8a, 0x92, 0xbd, 0x0b, 0xcc, 0xb7, 0x42, - 0xcb, 0xa5, 0x9e, 0x98, 0x96, 0x61, 0x3a, 0xb6, 0x6b, 0x91, 0xb2, 0x95, 0xd5, 0x36, 0x63, 0xcc, - 0x8e, 0x40, 0xa8, 0xff, 0x32, 0x03, 0xf5, 0x44, 0xfb, 0xc5, 0x0d, 0xcd, 0xee, 0xcb, 0x4f, 0x82, - 0x37, 0x16, 0x15, 0x64, 0x24, 0x79, 0x30, 0x3c, 0x9f, 0xf1, 0x67, 0x43, 0x57, 0x3d, 0x1f, 0xb4, - 0xca, 0xe5, 0x9a, 0x5d, 0xe5, 0x72, 0x55, 0x9f, 0x40, 0x76, 0x78, 0x3e, 0xe3, 0x9e, 0x16, 0x94, - 0x81, 0xdc, 0x2a, 0xe3, 0xd2, 0x8f, 0xe2, 0x13, 0x9e, 0xb6, 0x3f, 0xe7, 0xb7, 0xf7, 0x0f, 0xb4, - 0xce, 0x7e, 0x53, 0xfb, 0x9c, 0x22, 0x4f, 0x48, 0x4b, 0xd8, 0xed, 0x6b, 0xed, 0xce, 0x93, 0x1e, - 0x01, 0x72, 0xe4, 0x87, 0x49, 0x9a, 0xd8, 0x34, 0xcd, 0xdd, 0x13, 0xf9, 0x15, 0x95, 0x4c, 0xea, - 0x15, 0x95, 0xf4, 0x85, 0xdf, 0xf5, 0xc5, 0x0b, 0xbf, 0x2c, 0xde, 0xd1, 0x31, 0x7b, 0x60, 0x6f, - 0x42, 0x6e, 0x72, 0x62, 0x9d, 0xa7, 0x4d, 0x9c, 0xf4, 0x66, 0x24, 0x02, 0xf5, 0x17, 0x19, 0x60, - 0xa9, 0x86, 0x70, 0xad, 0xfb, 0xbb, 0xb6, 0xe5, 0x13, 0x68, 0x88, 0x37, 0x36, 0x39, 0x95, 0xe4, - 0xe3, 0x15, 0x43, 0x7a, 0xc5, 0x4b, 0x22, 0xfb, 0x92, 0x17, 0x8e, 0xd8, 0x7b, 0xc0, 0x1f, 0x39, - 0xc4, 0x05, 0x92, 0x76, 0x6a, 0x48, 0xbc, 0x42, 0x4b, 0x68, 0x92, 0x57, 0x0d, 0xe5, 0xd7, 0x1a, - 0xb9, 0x7b, 0x78, 0x23, 0x99, 0x35, 0xe2, 0x1f, 0xea, 0xef, 0x65, 0xe0, 0x52, 0x7a, 0x41, 0xfc, - 0x72, 0xbd, 0x4c, 0x3f, 0x4d, 0x99, 0x5d, 0x7c, 0x9a, 0x72, 0xd5, 0x7a, 0xca, 0xad, 0x5c, 0x4f, - 0x7f, 0x37, 0x03, 0x97, 0xa5, 0xd1, 0x4f, 0xec, 0xa4, 0xbf, 0xa5, 0x96, 0x49, 0x2f, 0x54, 0xe6, - 0x52, 0x2f, 0x54, 0xaa, 0x7f, 0x98, 0x81, 0xab, 0x0b, 0x2d, 0xd1, 0xac, 0xbf, 0xd5, 0xb6, 0xa4, - 0x5f, 0xb2, 0x24, 0x17, 0x35, 0x0f, 0x75, 0xe4, 0xd7, 0x12, 0x59, 0xfa, 0x69, 0x4a, 0xba, 0x97, - 0xfd, 0xaf, 0xd2, 0x8d, 0x34, 0x93, 0x5b, 0x46, 0xec, 0x23, 0xa8, 0x24, 0x1a, 0x53, 0xf4, 0x50, - 0xc8, 0xca, 0x2b, 0x4a, 0x32, 0xdd, 0x4a, 0x36, 0xba, 0xfe, 0xcd, 0xd8, 0xe8, 0x63, 0xa8, 0xc6, - 0x05, 0xef, 0x58, 0x93, 0xb4, 0x37, 0x62, 0xe1, 0xa9, 0xab, 0x14, 0xa5, 0xfa, 0x21, 0x6c, 0x26, - 0xbd, 0x68, 0x89, 0xe7, 0xd9, 0x6e, 0x43, 0xc5, 0xb5, 0x4e, 0xf5, 0xe8, 0xf1, 0x36, 0x11, 0xb3, - 0xe3, 0x5a, 0xa7, 0x82, 0x40, 0xdd, 0x95, 0xf9, 0x5e, 0xfc, 0xd2, 0xbe, 0x63, 0xa6, 0x82, 0x3f, - 0x3c, 0xc7, 0x8c, 0x50, 0x58, 0x9a, 0x34, 0x31, 0x45, 0xd7, 0x3a, 0xa5, 0x35, 0x77, 0x2a, 0xca, - 0x69, 0x9a, 0xa6, 0x38, 0x30, 0x5f, 0xf5, 0xe8, 0xd1, 0x75, 0x28, 0xcd, 0xfc, 0xd4, 0xcc, 0x16, - 0x67, 0x3e, 0xaf, 0xf6, 0xae, 0x88, 0x08, 0xba, 0xe8, 0x70, 0x9d, 0xc7, 0x08, 0x89, 0x5f, 0xe2, - 0xc8, 0x25, 0xbf, 0xc4, 0xf1, 0x91, 0x60, 0x79, 0xb8, 0xff, 0x44, 0xcd, 0xf1, 0x21, 0x7a, 0xe6, - 0x5e, 0x8d, 0x0e, 0xd1, 0x49, 0x03, 0xb4, 0xbe, 0x14, 0x41, 0x49, 0xf8, 0xa9, 0x6e, 0x43, 0x45, - 0xb2, 0xec, 0x50, 0x35, 0x91, 0xbc, 0x22, 0x41, 0xfa, 0x19, 0x99, 0x64, 0x80, 0xb4, 0x4a, 0xe2, - 0x14, 0x09, 0xd4, 0xdf, 0x07, 0x80, 0x04, 0x97, 0x52, 0x18, 0x32, 0x0b, 0x0a, 0xc3, 0xb7, 0x3a, - 0x91, 0xff, 0x10, 0xea, 0x63, 0x6f, 0x76, 0xae, 0x27, 0x39, 0xb2, 0x2b, 0x73, 0x54, 0x91, 0x6a, - 0x98, 0xdc, 0xef, 0x59, 0x3e, 0x69, 0xcd, 0xad, 0x3c, 0x69, 0xfd, 0x00, 0x8a, 0xdc, 0x71, 0x1f, - 0x88, 0xfb, 0x61, 0xd7, 0x16, 0xfb, 0xf9, 0x40, 0xc4, 0xbe, 0x46, 0x74, 0xac, 0x8d, 0x56, 0xb9, - 0x78, 0xc9, 0x51, 0xbe, 0x2d, 0x76, 0x6b, 0x39, 0x67, 0x44, 0xc6, 0x9f, 0x0f, 0x33, 0xe4, 0xa4, - 0xa4, 0x24, 0x84, 0x53, 0xe1, 0x4d, 0x22, 0x25, 0xa1, 0x28, 0x2b, 0x09, 0xc3, 0x29, 0xf7, 0x21, - 0xa1, 0x92, 0xf0, 0x2e, 0x5c, 0x12, 0x31, 0xf8, 0x98, 0x01, 0x87, 0x93, 0xe8, 0x79, 0xb8, 0x95, - 0x78, 0xdb, 0x63, 0x38, 0x25, 0xed, 0x1b, 0xc9, 0x3f, 0x83, 0xcb, 0xe3, 0x63, 0xc3, 0x3d, 0xb2, - 0xf4, 0x70, 0xe4, 0xe8, 0xf4, 0x90, 0xb8, 0x3e, 0x35, 0x66, 0x42, 0xed, 0x79, 0x73, 0xa9, 0xb1, - 0x2d, 0x22, 0x1e, 0x8e, 0x1c, 0x8a, 0xd0, 0x89, 0xcf, 0xe3, 0x37, 0xc7, 0x8b, 0xf0, 0x85, 0xd3, - 0x28, 0x58, 0x3c, 0x8d, 0x5a, 0xd2, 0x66, 0x2a, 0xcb, 0xda, 0xcc, 0x8d, 0xff, 0x90, 0x83, 0x82, - 0x88, 0x05, 0xbc, 0x0f, 0x39, 0xd3, 0xf7, 0x66, 0x71, 0xc8, 0xde, 0x0a, 0xed, 0x82, 0x7e, 0x75, - 0x08, 0x15, 0x91, 0x07, 0x50, 0x30, 0x4c, 0x53, 0x9f, 0x9c, 0xa4, 0x4f, 0x8c, 0x16, 0x04, 0xfd, - 0xde, 0x9a, 0x96, 0x37, 0x48, 0xe2, 0x7f, 0x02, 0x65, 0xa4, 0x4f, 0xe2, 0xaf, 0x2a, 0xcb, 0xea, - 0x4b, 0x24, 0x92, 0xf7, 0xd6, 0xb4, 0x92, 0x11, 0x89, 0xe7, 0x1f, 0xa4, 0x7d, 0x6f, 0x5c, 0x5e, - 0xde, 0x58, 0xca, 0x7a, 0x91, 0x17, 0xee, 0xd7, 0x81, 0x3b, 0x63, 0x62, 0x6e, 0x93, 0x97, 0x0f, - 0x27, 0x96, 0x78, 0xd3, 0xde, 0x9a, 0xc6, 0xf7, 0x5c, 0xc4, 0xab, 0x3e, 0x8a, 0xfc, 0x62, 0xf1, - 0xef, 0x83, 0xac, 0x18, 0x19, 0xe4, 0x15, 0xb1, 0x73, 0x8c, 0x18, 0x07, 0x66, 0x33, 0xcd, 0x28, - 0x6c, 0xa7, 0xb8, 0x94, 0x2d, 0xe6, 0x48, 0x94, 0x2d, 0x66, 0x4f, 0x8f, 0xa1, 0x42, 0x2e, 0x2a, - 0x91, 0xaf, 0xb4, 0x34, 0xb4, 0x09, 0x43, 0x21, 0xc7, 0x7b, 0xc2, 0x5e, 0x5a, 0x51, 0x3f, 0x7d, - 0x4b, 0xf6, 0x6d, 0xde, 0x5c, 0x39, 0x50, 0x5a, 0xec, 0xe6, 0xe4, 0x9d, 0xd5, 0x78, 0x1e, 0xb6, - 0x0d, 0x55, 0x43, 0x92, 0x34, 0xc2, 0xd1, 0x79, 0x73, 0xc5, 0x3c, 0xc5, 0x34, 0x54, 0x86, 0x94, - 0x4e, 0x0e, 0xe0, 0x6e, 0x68, 0x70, 0x75, 0xf5, 0x52, 0x96, 0x23, 0x49, 0x72, 0x3c, 0x92, 0x44, - 0x4d, 0xbf, 0xaf, 0x92, 0xbe, 0xe4, 0x2a, 0xc5, 0x95, 0xfc, 0x08, 0x6d, 0x64, 0x79, 0xf3, 0x56, - 0xa0, 0x18, 0xbd, 0x4a, 0x4c, 0x61, 0xb1, 0xad, 0xfe, 0xc1, 0xe7, 0x4a, 0x06, 0xc1, 0x9d, 0xde, - 0x60, 0xd8, 0xec, 0x89, 0xe3, 0xd5, 0x4e, 0x4f, 0x1c, 0xaf, 0xaa, 0xff, 0x26, 0x0b, 0xe5, 0xd8, - 0x3d, 0xfc, 0xdd, 0x0d, 0xe3, 0xd8, 0xe2, 0xcc, 0xca, 0x16, 0xe7, 0x82, 0xa6, 0x26, 0x3f, 0x5a, - 0xb2, 0x91, 0xd6, 0x87, 0x82, 0xe5, 0xfb, 0x77, 0xf9, 0x6f, 0x78, 0xff, 0x4e, 0x8e, 0x4c, 0x2c, - 0xa4, 0x23, 0x13, 0x17, 0x5e, 0xa6, 0x2e, 0x52, 0x98, 0x8a, 0xfc, 0x32, 0xf5, 0x85, 0xf1, 0x29, - 0xa5, 0x8b, 0xe3, 0x53, 0xe8, 0xa7, 0xd5, 0x9e, 0xd9, 0xd6, 0xa9, 0x08, 0xd0, 0x13, 0xa9, 0xb4, - 0xf8, 0x80, 0x97, 0x88, 0x8f, 0x6f, 0xc0, 0x8a, 0xd8, 0x43, 0xb8, 0x3c, 0x39, 0x89, 0x5f, 0xe1, - 0x4c, 0x0c, 0xac, 0x2a, 0x75, 0x63, 0x25, 0x4e, 0xfd, 0xdd, 0x0c, 0x40, 0xe2, 0x43, 0xfd, 0xa5, - 0x1d, 0x3c, 0x92, 0x0d, 0x9d, 0xfd, 0x1a, 0x1b, 0xfa, 0x25, 0x0f, 0x7b, 0xa8, 0x5f, 0x42, 0x39, - 0xf6, 0x9a, 0x7f, 0xf7, 0x35, 0xf6, 0xad, 0xaa, 0xfc, 0xcd, 0xc8, 0xd9, 0x15, 0xbb, 0x9d, 0x7f, - 0xd9, 0xb1, 0x48, 0x55, 0x9f, 0x7d, 0x49, 0xf5, 0x67, 0xdc, 0xe3, 0x14, 0x57, 0xfe, 0x2b, 0xde, - 0x58, 0xf2, 0x9a, 0xcf, 0xa5, 0xd6, 0xbc, 0x3a, 0x17, 0x6e, 0xb3, 0x5f, 0xbe, 0xea, 0x6f, 0xd5, - 0xe1, 0xbf, 0xce, 0x44, 0xbe, 0x9d, 0xf8, 0x6d, 0xd3, 0x0b, 0x15, 0xad, 0xd5, 0xee, 0xa9, 0x6f, - 0x53, 0xdd, 0xd7, 0x5a, 0x9b, 0xb9, 0xaf, 0xb3, 0x36, 0xdf, 0x84, 0x3c, 0x17, 0x08, 0xf9, 0x8b, - 0x2c, 0x4d, 0x8e, 0x7f, 0xe9, 0xaf, 0x01, 0xa8, 0xaa, 0x50, 0x2c, 0x79, 0x7f, 0x2f, 0x47, 0xe5, - 0x46, 0xbf, 0x64, 0x40, 0x41, 0xd4, 0xbf, 0x9d, 0xe1, 0xdc, 0xf5, 0xbb, 0x8e, 0xc9, 0xaf, 0xcc, - 0xdc, 0xfc, 0xa7, 0xeb, 0x50, 0x4b, 0x1d, 0x98, 0x7d, 0x87, 0xc6, 0xac, 0xe4, 0xe6, 0xd9, 0xd5, - 0xdc, 0xfc, 0xbb, 0x3c, 0x59, 0xf5, 0x7f, 0x44, 0x02, 0xa4, 0x62, 0xcc, 0x4a, 0xe9, 0x18, 0x33, - 0xe4, 0xa6, 0xd5, 0x94, 0x56, 0xbe, 0x4a, 0x7f, 0xcf, 0xac, 0xd4, 0xdf, 0x6f, 0xc5, 0x3f, 0x24, - 0xd6, 0xd9, 0xe1, 0x86, 0x65, 0x4d, 0x93, 0x20, 0xec, 0x53, 0xb8, 0xce, 0xb5, 0x1a, 0xae, 0xc8, - 0xe9, 0xde, 0x44, 0x8f, 0x7f, 0x66, 0x4c, 0xc4, 0xcd, 0x5d, 0xe5, 0x04, 0xfc, 0xa7, 0x22, 0x26, - 0xcd, 0x08, 0xab, 0x76, 0xa0, 0x96, 0x3a, 0xbd, 0x94, 0x7e, 0xb2, 0x30, 0x23, 0xff, 0x64, 0x21, - 0xdb, 0x82, 0xfc, 0xe9, 0xb1, 0xe5, 0x5b, 0x2b, 0x9e, 0x76, 0xe4, 0x08, 0xf5, 0xfb, 0x50, 0x95, - 0x23, 0x29, 0xd8, 0x3b, 0x90, 0xb7, 0x43, 0x6b, 0x1a, 0xd9, 0x56, 0x57, 0x97, 0x83, 0x2d, 0xc8, - 0x90, 0xe6, 0x44, 0xea, 0xcf, 0x33, 0xa0, 0x2c, 0xe2, 0xa4, 0xdf, 0x55, 0xcc, 0x5c, 0xf0, 0xbb, - 0x8a, 0xeb, 0xa9, 0x46, 0xae, 0xfa, 0x69, 0xc4, 0xf8, 0x79, 0xb9, 0xdc, 0x05, 0xcf, 0xcb, 0xb1, - 0x37, 0xa0, 0xe4, 0x5b, 0xf4, 0xa3, 0x75, 0xe6, 0x8a, 0x58, 0xe6, 0x18, 0xa7, 0xfe, 0x4e, 0x06, - 0x8a, 0x22, 0xec, 0x63, 0xa5, 0xb1, 0xfb, 0x16, 0x14, 0xf9, 0x0f, 0xd8, 0x45, 0xc6, 0xff, 0x52, - 0x1c, 0x64, 0x84, 0x67, 0xb7, 0x78, 0x30, 0x4c, 0xda, 0xf8, 0x3d, 0x70, 0x0c, 0x57, 0x23, 0xb8, - 0xf8, 0x05, 0x18, 0x63, 0x2a, 0xae, 0x11, 0xf2, 0x57, 0x3f, 0x80, 0x40, 0xfc, 0xc6, 0xe0, 0x0f, - 0xa0, 0x28, 0xc2, 0x4a, 0x56, 0x36, 0xe5, 0x65, 0x3f, 0xdd, 0xb6, 0x05, 0x90, 0xc4, 0x99, 0xac, - 0x2a, 0x41, 0xbd, 0x0f, 0xa5, 0x28, 0xb4, 0x04, 0xd7, 0x5f, 0x52, 0xb5, 0x88, 0x55, 0x97, 0x1b, - 0xe3, 0x88, 0xf7, 0x8f, 0xbb, 0xde, 0xf8, 0x84, 0xbc, 0x6a, 0xef, 0x01, 0xc5, 0xf0, 0x0f, 0x97, - 0x9e, 0x47, 0x49, 0xbf, 0x35, 0x1d, 0x13, 0xb1, 0xfb, 0x10, 0xb3, 0xe3, 0x97, 0x59, 0xcb, 0x6a, - 0x33, 0xba, 0x4b, 0x42, 0xab, 0xec, 0x91, 0xf0, 0x1e, 0x75, 0xe9, 0x21, 0xa3, 0x94, 0xc3, 0x26, - 0xd5, 0x26, 0x4d, 0x22, 0x53, 0xeb, 0x50, 0x95, 0xcf, 0xc3, 0xd5, 0x26, 0x6c, 0xee, 0x5b, 0xa1, - 0x81, 0x3c, 0x6b, 0x30, 0x36, 0x5c, 0xa4, 0xe7, 0xeb, 0x17, 0x3f, 0xd2, 0xeb, 0x77, 0x91, 0x4e, - 0xe3, 0x44, 0xea, 0xcf, 0x73, 0xa0, 0x2c, 0xe2, 0xbe, 0xee, 0x5e, 0xcd, 0x6d, 0xa8, 0x78, 0xb4, - 0x2e, 0x52, 0xbf, 0xf1, 0xc3, 0x41, 0x52, 0xc0, 0x6a, 0xea, 0x41, 0xfa, 0x92, 0x1d, 0xec, 0xf1, - 0x27, 0xe9, 0xaf, 0xf1, 0xb7, 0x3d, 0x1c, 0x6f, 0x4c, 0xcb, 0xba, 0x4a, 0x4f, 0x79, 0x74, 0xbd, - 0x31, 0x5d, 0xd7, 0x11, 0x06, 0x37, 0x0f, 0xd2, 0xaa, 0x6a, 0x25, 0x61, 0x65, 0xd3, 0xa1, 0x81, - 0x08, 0x63, 0x0d, 0x03, 0x71, 0x01, 0xaa, 0xc4, 0x01, 0xc3, 0x20, 0x7a, 0x94, 0x77, 0x2c, 0x7e, - 0x90, 0x26, 0x4b, 0x8f, 0xf2, 0xb6, 0x5c, 0xba, 0xad, 0x43, 0xbf, 0x9f, 0x34, 0x16, 0xbf, 0x6f, - 0x25, 0x1e, 0x41, 0x46, 0xd4, 0x6b, 0xfc, 0x27, 0x7b, 0x7c, 0x2b, 0x08, 0xf8, 0x2b, 0x5e, 0x65, - 0xf1, 0x90, 0x91, 0x00, 0xc6, 0xcf, 0x85, 0x89, 0x1f, 0x4c, 0x42, 0x12, 0x10, 0xcf, 0x85, 0xf1, - 0x9f, 0x4b, 0x42, 0x82, 0xeb, 0x50, 0xfa, 0xca, 0x73, 0x2d, 0x32, 0xdc, 0x2b, 0xd4, 0xaa, 0x22, - 0xa6, 0xf7, 0x8d, 0x99, 0xfa, 0xe7, 0x19, 0xb8, 0xbc, 0x38, 0xaa, 0xb4, 0x60, 0xaa, 0x50, 0x6a, - 0xf5, 0xbb, 0x7a, 0xaf, 0xb9, 0xdf, 0x56, 0xd6, 0xd8, 0x06, 0x54, 0xfa, 0xdb, 0x3f, 0x6e, 0xb7, - 0x86, 0x1c, 0x90, 0xa1, 0x7b, 0xa2, 0x03, 0x7d, 0xaf, 0xb3, 0xb3, 0xd3, 0xee, 0x71, 0x2b, 0xa5, - 0xbf, 0xfd, 0x63, 0xbd, 0xdb, 0x6f, 0xf1, 0xdf, 0x57, 0x89, 0x4e, 0xdf, 0x07, 0x4a, 0x8e, 0x4e, - 0xbc, 0x29, 0x26, 0x14, 0x93, 0x79, 0x1e, 0xf2, 0xf8, 0x7c, 0xa0, 0xb7, 0x7a, 0x43, 0xa5, 0x80, - 0xa9, 0xde, 0x61, 0xb7, 0x4b, 0x29, 0x8a, 0x6d, 0x6a, 0xf5, 0xf7, 0x0f, 0xb4, 0xf6, 0x60, 0xa0, - 0x0f, 0x3a, 0x3f, 0x6d, 0x2b, 0x25, 0xaa, 0x59, 0xeb, 0x3c, 0xe9, 0xf4, 0x38, 0xa0, 0xcc, 0x8a, - 0x90, 0xdd, 0xef, 0xf4, 0xf8, 0xfd, 0xd8, 0xfd, 0xe6, 0x67, 0x4a, 0x05, 0x3f, 0x06, 0x87, 0xfb, - 0x4a, 0xf5, 0xfe, 0x1d, 0xa8, 0xca, 0x3f, 0x52, 0x46, 0x51, 0x8e, 0x9e, 0x6b, 0xf1, 0xa7, 0x7b, - 0xbb, 0x5f, 0x7d, 0xa8, 0x64, 0xee, 0xff, 0xa6, 0xf4, 0xe3, 0x0f, 0x44, 0x23, 0x0e, 0x03, 0xe8, - 0x36, 0x20, 0xbf, 0x6d, 0x48, 0xae, 0x7f, 0xba, 0x9c, 0xb8, 0xd7, 0x1c, 0xec, 0xf1, 0x63, 0x02, - 0x81, 0x21, 0x40, 0x36, 0x79, 0xf2, 0x95, 0x2e, 0xfb, 0xd2, 0x67, 0x7c, 0xd8, 0x9e, 0xa7, 0x7b, - 0x98, 0x9d, 0x01, 0x76, 0x4e, 0x81, 0x2a, 0x7e, 0xc5, 0xb8, 0xe2, 0x7d, 0x15, 0x2a, 0xd2, 0x2b, - 0xdd, 0x54, 0x87, 0x11, 0x1c, 0x8b, 0x57, 0x64, 0xd1, 0xdc, 0x54, 0x32, 0xf7, 0xdf, 0x40, 0x89, - 0x21, 0xbf, 0x91, 0x0d, 0x50, 0xe8, 0x79, 0xfe, 0xd4, 0x70, 0x04, 0x9d, 0x35, 0x0f, 0x90, 0xee, - 0x3d, 0xb8, 0xb2, 0xf2, 0xc5, 0x6f, 0x8a, 0xd4, 0xb5, 0xa7, 0x33, 0xc7, 0xe2, 0xc1, 0xa6, 0x7b, - 0xe7, 0x23, 0xdf, 0x36, 0x95, 0xcc, 0xfd, 0xc7, 0xd1, 0x95, 0xb4, 0xa8, 0xee, 0x6e, 0xbf, 0xb9, - 0xc3, 0x27, 0x37, 0xbe, 0x8c, 0x3c, 0xdc, 0xe6, 0x2f, 0xc4, 0x6a, 0xed, 0xc1, 0x61, 0x77, 0x28, - 0x2e, 0x3e, 0xdf, 0xff, 0x11, 0x34, 0x2e, 0x8a, 0xba, 0xc4, 0x16, 0xb5, 0xf6, 0x9a, 0x14, 0xd9, - 0x8a, 0x93, 0xd9, 0xd7, 0x79, 0x2a, 0xc3, 0x03, 0x83, 0xbb, 0x6d, 0x8a, 0xc8, 0xb8, 0xff, 0xb3, - 0x8c, 0xc4, 0xc2, 0xa2, 0xc8, 0xb9, 0x18, 0x20, 0x66, 0x49, 0x06, 0x69, 0x96, 0x61, 0x2a, 0x19, - 0x76, 0x15, 0x58, 0x0a, 0xd4, 0xf5, 0xc6, 0x86, 0xa3, 0xac, 0x53, 0xec, 0x45, 0x04, 0xa7, 0xf8, - 0x66, 0x25, 0xcb, 0x5e, 0x85, 0xeb, 0x31, 0xac, 0xeb, 0x9d, 0x1e, 0xf8, 0x36, 0xda, 0xda, 0xe7, - 0x1c, 0x9d, 0xdb, 0xfe, 0xe1, 0x9f, 0xfd, 0xe2, 0x56, 0xe6, 0xdf, 0xfd, 0xe2, 0x56, 0xe6, 0xbf, - 0xfe, 0xe2, 0xd6, 0xda, 0xcf, 0xff, 0xdb, 0xad, 0xcc, 0x4f, 0xe5, 0x9f, 0x32, 0x9f, 0x1a, 0xa1, - 0x6f, 0x9f, 0xf1, 0x4d, 0x13, 0x25, 0x5c, 0xeb, 0xbd, 0xd9, 0xc9, 0xd1, 0x7b, 0xb3, 0xd1, 0x7b, - 0xc8, 0x99, 0x46, 0x05, 0xfa, 0xd1, 0xf2, 0x47, 0xff, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x24, - 0x7a, 0x5d, 0x14, 0x7d, 0x00, 0x00, + 0x2e, 0x56, 0x51, 0x55, 0xc5, 0xe9, 0x6e, 0x01, 0x06, 0x16, 0x9f, 0x01, 0x7f, 0x71, 0x5e, 0x0d, + 0xf8, 0x29, 0x0e, 0xd6, 0x7e, 0x0a, 0x8c, 0x18, 0x08, 0x10, 0x03, 0x0e, 0x82, 0x20, 0x2f, 0xc9, + 0x83, 0x63, 0x04, 0x41, 0x80, 0x3c, 0x18, 0x49, 0x00, 0x27, 0xd8, 0x3c, 0xf8, 0x29, 0xf6, 0x83, + 0xf3, 0x92, 0xb7, 0xe0, 0x9c, 0x7b, 0xab, 0xea, 0x16, 0xc9, 0xd6, 0x48, 0xda, 0x35, 0x92, 0xbc, + 0x74, 0xd7, 0x3d, 0xe7, 0xdc, 0xff, 0x7b, 0xcf, 0xdf, 0x3d, 0xf7, 0x12, 0x60, 0xe6, 0x18, 0xee, + 0x83, 0x99, 0xef, 0x85, 0x1e, 0xcb, 0xe1, 0xf7, 0x8d, 0x77, 0x8e, 0xed, 0xf0, 0x64, 0x3e, 0x7a, + 0x30, 0xf6, 0xa6, 0xef, 0x1e, 0x7b, 0xc7, 0xde, 0xbb, 0x84, 0x1c, 0xcd, 0x27, 0x94, 0xa2, 0x04, + 0x7d, 0xf1, 0x4c, 0x37, 0xc0, 0xf1, 0xc6, 0xa7, 0xe2, 0x7b, 0x23, 0xb4, 0xa7, 0x56, 0x10, 0x1a, + 0xd3, 0x19, 0x07, 0xa8, 0x7f, 0x9a, 0x81, 0xdc, 0xf0, 0x62, 0x66, 0xb1, 0x3a, 0xac, 0xdb, 0x66, + 0x23, 0xb3, 0x9d, 0xb9, 0x97, 0xd7, 0xd6, 0x6d, 0x93, 0x6d, 0x43, 0xc5, 0xf5, 0xc2, 0xde, 0xdc, + 0x71, 0x8c, 0x91, 0x63, 0x35, 0xd6, 0xb7, 0x33, 0xf7, 0x4a, 0x9a, 0x0c, 0x62, 0x2f, 0x43, 0xd9, + 0x98, 0x87, 0x9e, 0x6e, 0xbb, 0x63, 0xbf, 0x91, 0x25, 0x7c, 0x09, 0x01, 0x1d, 0x77, 0xec, 0xb3, + 0x2d, 0xc8, 0x9f, 0xd9, 0x66, 0x78, 0xd2, 0xc8, 0x51, 0x89, 0x3c, 0x81, 0xd0, 0x60, 0x6c, 0x38, + 0x56, 0x23, 0xcf, 0xa1, 0x94, 0x40, 0x68, 0x48, 0x95, 0x14, 0xb6, 0x33, 0xf7, 0xca, 0x1a, 0x4f, + 0xb0, 0x5b, 0x00, 0x96, 0x3b, 0x9f, 0x3e, 0x37, 0x9c, 0xb9, 0x15, 0x34, 0x8a, 0x84, 0x92, 0x20, + 0xea, 0x0f, 0xa1, 0x3c, 0x0d, 0x8e, 0xf7, 0x2d, 0xc3, 0xb4, 0x7c, 0xf6, 0x12, 0x14, 0xa7, 0xc1, + 0xb1, 0x1e, 0x1a, 0xc7, 0xa2, 0x0b, 0x85, 0x69, 0x70, 0x3c, 0x34, 0x8e, 0xd9, 0x75, 0x28, 0x11, + 0xe2, 0x62, 0xc6, 0xfb, 0x90, 0xd7, 0x90, 0x10, 0x7b, 0xac, 0xfe, 0x4d, 0x1e, 0x8a, 0x5d, 0x3b, + 0xb4, 0x7c, 0xc3, 0x61, 0xd7, 0xa0, 0x60, 0x07, 0xee, 0xdc, 0x71, 0x28, 0x7b, 0x49, 0x13, 0x29, + 0x76, 0x0d, 0xf2, 0xf6, 0x27, 0xcf, 0x0d, 0x87, 0xe7, 0xdd, 0x5f, 0xd3, 0x78, 0x92, 0x35, 0xa0, + 0x60, 0xbf, 0xff, 0x11, 0x22, 0xb2, 0x02, 0x21, 0xd2, 0x84, 0x79, 0xf4, 0x10, 0x31, 0xb9, 0x18, + 0x43, 0x69, 0xc2, 0x7c, 0xf4, 0x01, 0x62, 0xb0, 0xf7, 0x59, 0xc2, 0x50, 0x1a, 0x6b, 0x99, 0x53, + 0x2d, 0x38, 0x00, 0x35, 0xac, 0x65, 0x1e, 0xd5, 0x32, 0xe7, 0xb5, 0x14, 0x05, 0x42, 0xa4, 0x09, + 0xc3, 0x6b, 0x29, 0xc5, 0x98, 0xb8, 0x96, 0x39, 0xaf, 0xa5, 0xbc, 0x9d, 0xb9, 0x97, 0x23, 0x0c, + 0xaf, 0x65, 0x0b, 0x72, 0x26, 0xc2, 0x61, 0x3b, 0x73, 0x2f, 0xb3, 0xbf, 0xa6, 0x51, 0x0a, 0xa1, + 0x01, 0x42, 0x2b, 0x38, 0xc0, 0x08, 0x0d, 0x04, 0x74, 0x84, 0xd0, 0x2a, 0x8e, 0x06, 0x42, 0x47, + 0x02, 0x3a, 0x41, 0x68, 0x6d, 0x3b, 0x73, 0x6f, 0x1d, 0xa1, 0x98, 0x62, 0x37, 0xa0, 0x68, 0x1a, + 0xa1, 0x85, 0x88, 0xba, 0xe8, 0x72, 0x04, 0x40, 0x1c, 0xae, 0x38, 0xc4, 0x6d, 0x88, 0x4e, 0x47, + 0x00, 0xa6, 0x42, 0x05, 0xc9, 0x22, 0xbc, 0x22, 0xf0, 0x32, 0x90, 0x7d, 0x08, 0x55, 0xd3, 0x1a, + 0xdb, 0x53, 0xc3, 0xe1, 0x7d, 0xda, 0xdc, 0xce, 0xdc, 0xab, 0x3c, 0xdc, 0x78, 0x40, 0x7b, 0x22, + 0xc6, 0xec, 0xaf, 0x69, 0x29, 0x32, 0xf6, 0x09, 0xd4, 0x44, 0xfa, 0xfd, 0x87, 0x34, 0xb0, 0x8c, + 0xf2, 0x29, 0xa9, 0x7c, 0xef, 0x3f, 0xfc, 0x64, 0x7f, 0x4d, 0x4b, 0x13, 0xb2, 0xbb, 0x50, 0x8d, + 0xb7, 0x08, 0x66, 0xbc, 0x22, 0x5a, 0x95, 0x82, 0x62, 0xb7, 0xbe, 0x08, 0x3c, 0x17, 0x09, 0xb6, + 0xc4, 0xb8, 0x45, 0x00, 0xb6, 0x0d, 0x60, 0x5a, 0x13, 0x63, 0xee, 0x84, 0x88, 0xbe, 0x2a, 0x06, + 0x50, 0x82, 0xb1, 0x5b, 0x50, 0x9e, 0xcf, 0xb0, 0x97, 0x4f, 0x0d, 0xa7, 0x71, 0x4d, 0x10, 0x24, + 0x20, 0x2c, 0x1d, 0xd7, 0x39, 0x62, 0x5f, 0x12, 0xb3, 0x1b, 0x01, 0x70, 0xaf, 0xd8, 0xc1, 0x8e, + 0xed, 0x36, 0x1a, 0xb4, 0x4e, 0x79, 0x82, 0xdd, 0x84, 0x6c, 0xe0, 0x8f, 0x1b, 0xd7, 0xa9, 0x97, + 0xc0, 0x7b, 0xd9, 0x3e, 0x9f, 0xf9, 0x1a, 0x82, 0x77, 0x8a, 0x90, 0xa7, 0x3d, 0xa3, 0xde, 0x84, + 0xd2, 0xa1, 0xe1, 0x1b, 0x53, 0xcd, 0x9a, 0x30, 0x05, 0xb2, 0x33, 0x2f, 0x10, 0xbb, 0x05, 0x3f, + 0xd5, 0x2e, 0x14, 0x9e, 0x1a, 0x3e, 0xe2, 0x18, 0xe4, 0x5c, 0x63, 0x6a, 0x11, 0xb2, 0xac, 0xd1, + 0x37, 0xee, 0x90, 0xe0, 0x22, 0x08, 0xad, 0xa9, 0x60, 0x05, 0x22, 0x85, 0xf0, 0x63, 0xc7, 0x1b, + 0x89, 0x9d, 0x50, 0xd2, 0x44, 0x4a, 0xfd, 0xff, 0x32, 0x50, 0x68, 0x79, 0x0e, 0x16, 0xf7, 0x12, + 0x14, 0x7d, 0xcb, 0xd1, 0x93, 0xea, 0x0a, 0xbe, 0xe5, 0x1c, 0x7a, 0x01, 0x22, 0xc6, 0x1e, 0x47, + 0xf0, 0xbd, 0x59, 0x18, 0x7b, 0x84, 0x88, 0x1a, 0x90, 0x95, 0x1a, 0x70, 0x1d, 0x4a, 0xe1, 0xc8, + 0xd1, 0x09, 0x9e, 0x23, 0x78, 0x31, 0x1c, 0x39, 0x3d, 0x44, 0xbd, 0x04, 0x45, 0x73, 0xc4, 0x31, + 0x79, 0xc2, 0x14, 0xcc, 0x11, 0x22, 0xd4, 0x4f, 0xa1, 0xac, 0x19, 0x67, 0xa2, 0x19, 0x57, 0xa1, + 0x80, 0x05, 0x08, 0x2e, 0x97, 0xd3, 0xf2, 0xe1, 0xc8, 0xe9, 0x98, 0x08, 0xc6, 0x46, 0xd8, 0x26, + 0xb5, 0x21, 0xa7, 0xe5, 0xc7, 0x9e, 0xd3, 0x31, 0xd5, 0x21, 0x40, 0xcb, 0xf3, 0xfd, 0xef, 0xdc, + 0x85, 0x2d, 0xc8, 0x9b, 0xd6, 0x2c, 0x3c, 0xe1, 0x0c, 0x42, 0xe3, 0x09, 0xf5, 0x3e, 0x94, 0x70, + 0x5e, 0xba, 0x76, 0x10, 0xb2, 0x5b, 0x90, 0x73, 0xec, 0x20, 0x6c, 0x64, 0xb6, 0xb3, 0x0b, 0xb3, + 0x46, 0x70, 0x75, 0x1b, 0x4a, 0x07, 0xc6, 0xf9, 0x53, 0x9c, 0x39, 0x2c, 0x8d, 0xa6, 0x50, 0x4c, + 0x89, 0x98, 0xcf, 0x2a, 0xc0, 0xd0, 0xf0, 0x8f, 0xad, 0x90, 0xf8, 0xd9, 0xdf, 0x66, 0xa0, 0x32, + 0x98, 0x8f, 0xbe, 0x9c, 0x5b, 0xfe, 0x05, 0xb6, 0xf9, 0x1e, 0x64, 0xc3, 0x8b, 0x19, 0xe5, 0xa8, + 0x3f, 0xbc, 0xc6, 0x8b, 0x97, 0xf0, 0x0f, 0x30, 0x93, 0x86, 0x24, 0xd8, 0x09, 0xd7, 0x33, 0xad, + 0x68, 0x0c, 0xf2, 0x5a, 0x01, 0x93, 0x1d, 0x13, 0x85, 0x82, 0x37, 0x13, 0xb3, 0xb0, 0xee, 0xcd, + 0xd8, 0x36, 0xe4, 0xc7, 0x27, 0xb6, 0x63, 0xd2, 0x04, 0xa4, 0xdb, 0xcc, 0x11, 0x38, 0x4b, 0xbe, + 0x77, 0xa6, 0x07, 0xf6, 0x57, 0x11, 0x93, 0x2f, 0xfa, 0xde, 0xd9, 0xc0, 0xfe, 0xca, 0x52, 0x87, + 0x42, 0xd2, 0x00, 0x14, 0x06, 0xad, 0x66, 0xb7, 0xa9, 0x29, 0x6b, 0xf8, 0xdd, 0xfe, 0xac, 0x33, + 0x18, 0x0e, 0x94, 0x0c, 0xab, 0x03, 0xf4, 0xfa, 0x43, 0x5d, 0xa4, 0xd7, 0x59, 0x01, 0xd6, 0x3b, + 0x3d, 0x25, 0x8b, 0x34, 0x08, 0xef, 0xf4, 0x94, 0x1c, 0x2b, 0x42, 0xb6, 0xd9, 0xfb, 0x5c, 0xc9, + 0xd3, 0x47, 0xb7, 0xab, 0x14, 0xd4, 0x3f, 0x5a, 0x87, 0x72, 0x7f, 0xf4, 0x85, 0x35, 0x0e, 0xb1, + 0xcf, 0xb8, 0x4a, 0x2d, 0xff, 0xb9, 0xe5, 0x53, 0xb7, 0xb3, 0x9a, 0x48, 0x61, 0x47, 0xcc, 0x11, + 0x75, 0x2e, 0xab, 0xad, 0x9b, 0x23, 0xa2, 0x1b, 0x9f, 0x58, 0x53, 0x83, 0x3a, 0x87, 0x74, 0x94, + 0xc2, 0x5d, 0xe1, 0x8d, 0xbe, 0xa0, 0xee, 0x65, 0x35, 0xfc, 0x64, 0xb7, 0xa1, 0xc2, 0xcb, 0x90, + 0xd7, 0x17, 0x70, 0xd0, 0xe2, 0xe2, 0x2b, 0xc8, 0x8b, 0x8f, 0x72, 0x52, 0xa9, 0x1c, 0x29, 0x24, + 0x18, 0x07, 0xf5, 0xc4, 0x8a, 0xf6, 0x46, 0x5f, 0x70, 0x6c, 0x89, 0xaf, 0x68, 0x6f, 0xf4, 0x05, + 0xa1, 0xde, 0x82, 0xcd, 0x60, 0x3e, 0x0a, 0xc6, 0xbe, 0x3d, 0x0b, 0x6d, 0xcf, 0xe5, 0x34, 0x65, + 0xa2, 0x51, 0x64, 0x04, 0x11, 0xdf, 0x83, 0xd2, 0x6c, 0x3e, 0xd2, 0x6d, 0x77, 0xe2, 0x11, 0x73, + 0xaf, 0x3c, 0xac, 0xf1, 0x89, 0x39, 0x9c, 0x8f, 0x3a, 0xee, 0xc4, 0xd3, 0x8a, 0x33, 0xfe, 0xa1, + 0xbe, 0x0e, 0x45, 0x01, 0x43, 0xe9, 0x1d, 0x5a, 0xae, 0xe1, 0x86, 0x7a, 0x2c, 0xf6, 0x4b, 0x1c, + 0xd0, 0x31, 0xd5, 0x3f, 0xc9, 0x80, 0x32, 0x90, 0xaa, 0x39, 0xb0, 0x42, 0x63, 0x25, 0x57, 0x78, + 0x05, 0xc0, 0x18, 0x8f, 0xbd, 0x39, 0x2f, 0x86, 0x2f, 0x9e, 0xb2, 0x80, 0x74, 0x4c, 0x79, 0x6c, + 0xb2, 0xa9, 0xb1, 0xb9, 0x03, 0xd5, 0x28, 0x9f, 0xb4, 0xa1, 0x2b, 0x02, 0x16, 0x8d, 0x4e, 0x30, + 0x4f, 0xed, 0xea, 0x62, 0x30, 0xe7, 0xb9, 0xaf, 0x41, 0x81, 0x74, 0x84, 0x20, 0x1a, 0x71, 0x9e, + 0x52, 0xff, 0x22, 0x03, 0xb5, 0x8e, 0x6b, 0x5a, 0xe7, 0x83, 0xb1, 0xe1, 0x52, 0x2f, 0x55, 0xa8, + 0xd9, 0x81, 0x6e, 0x23, 0x4c, 0x0f, 0xc6, 0x86, 0x2b, 0xc4, 0x7b, 0xc5, 0x0e, 0x62, 0x3a, 0xec, + 0x03, 0x27, 0xa0, 0xaa, 0xd6, 0xa9, 0xc4, 0x32, 0x41, 0xa8, 0xb2, 0xd7, 0x61, 0x63, 0x64, 0x39, + 0x9e, 0x7b, 0xac, 0x87, 0x9e, 0xce, 0xf5, 0x14, 0xde, 0x97, 0x1a, 0x07, 0x0f, 0xbd, 0x21, 0xe9, + 0x2b, 0x5b, 0x90, 0x9f, 0x19, 0x7e, 0x18, 0x34, 0x72, 0xdb, 0x59, 0xdc, 0xa2, 0x94, 0xc0, 0x61, + 0xb6, 0x03, 0x7d, 0xee, 0xda, 0x5f, 0xce, 0x79, 0x37, 0x4a, 0x5a, 0xc9, 0x0e, 0x8e, 0x28, 0xcd, + 0xee, 0x81, 0xc2, 0x6b, 0xa6, 0x62, 0xe5, 0x35, 0x54, 0x27, 0x38, 0x15, 0x4c, 0x8c, 0xec, 0xef, + 0xaf, 0x43, 0x69, 0x6f, 0xee, 0x8e, 0x71, 0x32, 0xd8, 0xab, 0x90, 0x9b, 0xcc, 0xdd, 0x31, 0xf5, + 0x25, 0x16, 0x86, 0xf1, 0x1e, 0xd0, 0x08, 0x89, 0xdc, 0xc5, 0xf0, 0x8f, 0x91, 0x2b, 0x2d, 0x71, + 0x17, 0x84, 0xab, 0xff, 0x2c, 0xc3, 0x4b, 0xdc, 0x73, 0x8c, 0x63, 0x56, 0x82, 0x5c, 0xaf, 0xdf, + 0x6b, 0x2b, 0x6b, 0xac, 0x0a, 0xa5, 0x4e, 0x6f, 0xd8, 0xd6, 0x7a, 0xcd, 0xae, 0x92, 0xa1, 0xad, + 0x3a, 0x6c, 0xee, 0x74, 0xdb, 0xca, 0x3a, 0x62, 0x9e, 0xf6, 0xbb, 0xcd, 0x61, 0xa7, 0xdb, 0x56, + 0x72, 0x1c, 0xa3, 0x75, 0x5a, 0x43, 0xa5, 0xc4, 0x14, 0xa8, 0x1e, 0x6a, 0xfd, 0xdd, 0xa3, 0x56, + 0x5b, 0xef, 0x1d, 0x75, 0xbb, 0x8a, 0xc2, 0xae, 0xc0, 0x46, 0x0c, 0xe9, 0x73, 0xe0, 0x36, 0x66, + 0x79, 0xda, 0xd4, 0x9a, 0xda, 0x63, 0xe5, 0x47, 0xac, 0x04, 0xd9, 0xe6, 0xe3, 0xc7, 0xca, 0xcf, + 0x70, 0xd7, 0x97, 0x9f, 0x75, 0x7a, 0xfa, 0xd3, 0x66, 0xf7, 0xa8, 0xad, 0xfc, 0x6c, 0x3d, 0x4a, + 0xf7, 0xb5, 0xdd, 0xb6, 0xa6, 0xfc, 0x2c, 0xc7, 0x36, 0xa1, 0xfa, 0xd3, 0x7e, 0xaf, 0x7d, 0xd0, + 0x3c, 0x3c, 0xa4, 0x86, 0xfc, 0xac, 0xa4, 0xfe, 0xf7, 0x1c, 0xe4, 0xb0, 0x27, 0x4c, 0x4d, 0x38, + 0x5c, 0xdc, 0x45, 0x64, 0x31, 0x3b, 0xb9, 0x3f, 0xfb, 0xcb, 0xdb, 0x6b, 0x9c, 0xb7, 0xdd, 0x81, + 0xac, 0x63, 0x87, 0x34, 0xad, 0xf1, 0xbe, 0x10, 0x5a, 0xdf, 0xfe, 0x9a, 0x86, 0x38, 0x76, 0x0b, + 0x32, 0x9c, 0xc9, 0x55, 0x1e, 0xd6, 0xc5, 0xc6, 0x11, 0x52, 0x72, 0x7f, 0x4d, 0xcb, 0xcc, 0xd8, + 0x4d, 0xc8, 0x3c, 0x17, 0x1c, 0xaf, 0xca, 0xf1, 0x5c, 0x4e, 0x22, 0xf6, 0x39, 0xdb, 0x86, 0xec, + 0xd8, 0xe3, 0x3a, 0x5d, 0x8c, 0xe7, 0x52, 0x03, 0xcb, 0x1f, 0x7b, 0x0e, 0x7b, 0x15, 0xb2, 0xbe, + 0x71, 0x46, 0x33, 0x1b, 0x4f, 0x57, 0x2c, 0x96, 0x90, 0xc8, 0x37, 0xce, 0xb0, 0x11, 0x13, 0xe2, + 0x11, 0x71, 0x23, 0xa2, 0xf9, 0xc6, 0x6a, 0x26, 0x6c, 0x1b, 0x32, 0x67, 0xc4, 0x25, 0x62, 0x35, + 0xe6, 0x99, 0xed, 0x9a, 0xde, 0xd9, 0x60, 0x66, 0x8d, 0x91, 0xe2, 0x8c, 0xbd, 0x06, 0xd9, 0x60, + 0x3e, 0x22, 0x2e, 0x51, 0x79, 0xb8, 0xb9, 0xc4, 0xef, 0xb1, 0xa2, 0x60, 0x3e, 0x62, 0xaf, 0x43, + 0x6e, 0xec, 0xf9, 0xbe, 0xe0, 0x14, 0x4a, 0xd4, 0xe0, 0x48, 0xd4, 0xa1, 0x5a, 0x87, 0x78, 0xac, + 0x30, 0x24, 0xad, 0x30, 0x26, 0x4a, 0x64, 0x0d, 0x56, 0x18, 0xb2, 0xbb, 0x42, 0x80, 0x55, 0xe5, + 0x56, 0x47, 0xe2, 0x0d, 0xcb, 0x41, 0x2c, 0x4e, 0xd2, 0xd4, 0x38, 0x27, 0x9d, 0x31, 0x26, 0x8a, + 0xe4, 0x1a, 0xb6, 0x69, 0x6a, 0x9c, 0xb3, 0xbb, 0x90, 0x7d, 0x6e, 0x8d, 0x49, 0x7d, 0x8c, 0x6b, + 0x13, 0x93, 0xf4, 0x94, 0xba, 0x87, 0x68, 0x5a, 0xf7, 0x9e, 0x63, 0x92, 0x26, 0x19, 0xcf, 0xe5, + 0x9e, 0xe7, 0x98, 0x4f, 0x69, 0x2e, 0x09, 0x89, 0xe2, 0xdc, 0x98, 0x9f, 0x23, 0x37, 0x52, 0xb8, + 0xe0, 0x35, 0xe6, 0xe7, 0x1d, 0x13, 0x19, 0xbb, 0x6b, 0x3e, 0x27, 0xfd, 0x31, 0xa3, 0xe1, 0x27, + 0x1a, 0x38, 0x81, 0xe5, 0x58, 0xe3, 0xd0, 0x7e, 0x6e, 0x87, 0x17, 0xa4, 0x21, 0x66, 0x34, 0x19, + 0xb4, 0x53, 0x80, 0x9c, 0x75, 0x3e, 0xf3, 0xd5, 0x7d, 0x28, 0x8a, 0x5a, 0x96, 0xac, 0xa4, 0xeb, + 0x50, 0xb2, 0x03, 0x7d, 0xec, 0xb9, 0x41, 0x28, 0xf4, 0xa2, 0xa2, 0x1d, 0xb4, 0x30, 0x89, 0xec, + 0xd2, 0x34, 0x42, 0x2e, 0x60, 0xaa, 0x1a, 0x7d, 0xab, 0x0f, 0x01, 0x92, 0x6e, 0x61, 0x9b, 0x1c, + 0xcb, 0x8d, 0x54, 0x30, 0xc7, 0x72, 0xe3, 0x3c, 0xeb, 0x52, 0x9e, 0xeb, 0x50, 0x8e, 0x75, 0x5b, + 0x56, 0x85, 0x8c, 0x21, 0x44, 0x5b, 0xc6, 0x50, 0xef, 0xa1, 0xaa, 0x19, 0x69, 0xaf, 0x69, 0x1c, + 0xa6, 0x22, 0x81, 0x97, 0x19, 0xa9, 0xdf, 0x87, 0xaa, 0x66, 0x05, 0x73, 0x27, 0x6c, 0x79, 0xce, + 0xae, 0x35, 0x61, 0x6f, 0x03, 0xc4, 0xe9, 0x40, 0x68, 0x20, 0xc9, 0xda, 0xdd, 0xb5, 0x26, 0x9a, + 0x84, 0x57, 0xff, 0x51, 0x8e, 0x74, 0xb9, 0x5d, 0xae, 0x44, 0x09, 0x6d, 0x29, 0x23, 0x69, 0x4b, + 0xb1, 0x6c, 0x58, 0x4f, 0x6b, 0x8c, 0x27, 0xb6, 0x69, 0x5a, 0x6e, 0xa4, 0x19, 0xf2, 0x14, 0x4e, + 0xb6, 0xe1, 0x1c, 0xd3, 0x86, 0xaa, 0x3f, 0x64, 0x51, 0xa5, 0xd3, 0x99, 0x6f, 0x05, 0x01, 0xd7, + 0x49, 0x0c, 0xe7, 0x38, 0xda, 0xdb, 0xf9, 0xaf, 0xdb, 0xdb, 0xd7, 0xa1, 0xe4, 0x7a, 0xa1, 0x4e, + 0x76, 0x5b, 0x81, 0x8f, 0xbe, 0x30, 0x50, 0xd9, 0x1b, 0x50, 0x14, 0x1a, 0xb7, 0xd8, 0x54, 0x62, + 0xb9, 0xec, 0x72, 0xa0, 0x16, 0x61, 0x59, 0x03, 0x15, 0xb8, 0xe9, 0xd4, 0x72, 0xc3, 0x48, 0x06, + 0x8b, 0x24, 0x7b, 0x0b, 0xca, 0x9e, 0xab, 0x73, 0xb5, 0x5c, 0xec, 0x2a, 0xb1, 0x7c, 0xfb, 0xee, + 0x11, 0x41, 0xb5, 0x92, 0x27, 0xbe, 0xb0, 0x29, 0x8e, 0x77, 0xa6, 0x8f, 0x0d, 0xdf, 0xa4, 0x9d, + 0x55, 0xd2, 0x8a, 0x8e, 0x77, 0xd6, 0x32, 0x7c, 0x93, 0xeb, 0x24, 0x5f, 0xba, 0xf3, 0x29, 0xed, + 0xa6, 0x9a, 0x26, 0x52, 0xec, 0x26, 0x94, 0xc7, 0xce, 0x3c, 0x08, 0x2d, 0x7f, 0xe7, 0x82, 0x1b, + 0x5a, 0x5a, 0x02, 0xc0, 0x76, 0xcd, 0x7c, 0x7b, 0x6a, 0xf8, 0x17, 0xb4, 0x75, 0x4a, 0x5a, 0x94, + 0x24, 0x41, 0x73, 0x6a, 0x9b, 0xe7, 0xdc, 0xda, 0xd2, 0x78, 0x02, 0xe9, 0x4f, 0xc8, 0x16, 0x0e, + 0x68, 0x7f, 0x94, 0xb4, 0x28, 0x49, 0xf3, 0x40, 0x9f, 0xb4, 0x23, 0xca, 0x9a, 0x48, 0xa5, 0x14, + 0xea, 0xcd, 0x4b, 0x15, 0x6a, 0xb6, 0xa8, 0xd3, 0x78, 0xbe, 0x7d, 0x6c, 0x0b, 0x8d, 0xe4, 0x0a, + 0xd7, 0x69, 0x38, 0x88, 0x04, 0xd5, 0x97, 0x50, 0x14, 0x43, 0x8c, 0x12, 0x08, 0xb7, 0x4f, 0x9a, + 0x3d, 0x73, 0x09, 0x84, 0x70, 0xf6, 0x2a, 0xd4, 0x44, 0x59, 0x41, 0xe8, 0xdb, 0xee, 0xb1, 0x58, + 0x3c, 0x55, 0x0e, 0x1c, 0x10, 0x0c, 0x15, 0x05, 0x9c, 0x5e, 0xdd, 0x18, 0xd9, 0x0e, 0x6e, 0xd3, + 0xac, 0xf0, 0x43, 0xcc, 0x1d, 0xa7, 0xc9, 0x41, 0x6a, 0x1f, 0x4a, 0xd1, 0x84, 0xfc, 0x4a, 0xea, + 0x54, 0x7f, 0x3b, 0x03, 0x15, 0x52, 0x0f, 0xfa, 0xa4, 0xfc, 0xb0, 0xb7, 0x81, 0x8d, 0x7d, 0xcb, + 0x08, 0x2d, 0xdd, 0x3a, 0x0f, 0x7d, 0x43, 0x28, 0x01, 0x5c, 0x93, 0x50, 0x38, 0xa6, 0x8d, 0x08, + 0xae, 0x07, 0xdc, 0x86, 0xca, 0xcc, 0xf0, 0x83, 0x48, 0x61, 0xe4, 0x15, 0x00, 0x07, 0x09, 0x75, + 0x4d, 0x71, 0x8f, 0x7d, 0x63, 0xaa, 0x87, 0xde, 0xa9, 0xe5, 0x72, 0x55, 0x99, 0x1b, 0x09, 0x75, + 0x82, 0x0f, 0x11, 0x4c, 0x1a, 0xf3, 0x7f, 0xca, 0x40, 0xed, 0x90, 0xcf, 0xfa, 0x13, 0xeb, 0x62, + 0x97, 0x5b, 0x66, 0xe3, 0x68, 0xc7, 0xe6, 0x34, 0xfa, 0x66, 0xb7, 0xa0, 0x32, 0x3b, 0xb5, 0x2e, + 0xf4, 0x94, 0x15, 0x53, 0x46, 0x50, 0x8b, 0xf6, 0xe6, 0x9b, 0x50, 0xf0, 0xa8, 0x23, 0x42, 0xc6, + 0x09, 0xd1, 0x20, 0xf5, 0x50, 0x13, 0x04, 0xa8, 0x2e, 0xc5, 0x45, 0xc9, 0x7a, 0x99, 0x28, 0x8c, + 0x9a, 0xbf, 0x05, 0x79, 0x44, 0x05, 0x8d, 0x3c, 0xd7, 0x73, 0x28, 0xc1, 0xde, 0x83, 0xda, 0xd8, + 0x9b, 0xce, 0xf4, 0x28, 0xbb, 0x90, 0x76, 0x69, 0x9e, 0x52, 0x41, 0x92, 0x43, 0x5e, 0x96, 0xfa, + 0x7b, 0x59, 0x28, 0x51, 0x1b, 0x04, 0x5b, 0xb1, 0xcd, 0xf3, 0x88, 0xad, 0x94, 0xb5, 0xbc, 0x6d, + 0x22, 0xd7, 0x7e, 0x81, 0x6a, 0x16, 0xab, 0x5c, 0x59, 0x59, 0xe5, 0xba, 0x06, 0x05, 0xa1, 0x6f, + 0xe5, 0x38, 0xdf, 0x99, 0x5f, 0xae, 0x6d, 0xe5, 0x57, 0x69, 0x5b, 0x38, 0x85, 0x9c, 0xc6, 0x3a, + 0x47, 0xf9, 0xc6, 0x59, 0x0b, 0x10, 0xa8, 0x8d, 0x10, 0x99, 0x69, 0x14, 0xd3, 0x4c, 0xa3, 0x01, + 0xc5, 0xe7, 0x76, 0x60, 0xe3, 0x02, 0x29, 0xf1, 0x6d, 0x28, 0x92, 0xd2, 0x34, 0x94, 0x5f, 0x34, + 0x0d, 0x71, 0xb7, 0x0d, 0xe7, 0x98, 0xab, 0xf4, 0x51, 0xb7, 0x9b, 0xce, 0xb1, 0xc7, 0xde, 0x87, + 0xab, 0x09, 0x5a, 0xf4, 0x86, 0x1c, 0x5c, 0xe4, 0xc3, 0xd1, 0x58, 0x4c, 0x49, 0x3d, 0x22, 0x9b, + 0xeb, 0x3e, 0x6c, 0x4a, 0x59, 0x66, 0xa8, 0xde, 0x04, 0xc4, 0x73, 0xca, 0xda, 0x46, 0x4c, 0x4e, + 0x5a, 0x4f, 0xa0, 0xfe, 0x9b, 0x75, 0xa8, 0xed, 0x79, 0xbe, 0x65, 0x1f, 0xbb, 0xc9, 0xaa, 0x5b, + 0xd2, 0xfc, 0xa3, 0x95, 0xb8, 0x2e, 0xad, 0xc4, 0xdb, 0x50, 0x99, 0xf0, 0x8c, 0x7a, 0x38, 0xe2, + 0x0e, 0x81, 0x9c, 0x06, 0x02, 0x34, 0x1c, 0x39, 0xb8, 0x9b, 0x23, 0x02, 0xca, 0x9c, 0xa3, 0xcc, + 0x51, 0x26, 0x94, 0x35, 0xec, 0x7b, 0xc4, 0x75, 0x4d, 0xcb, 0xb1, 0x42, 0x3e, 0x3d, 0xf5, 0x87, + 0xaf, 0x44, 0x92, 0x5e, 0x6a, 0xd3, 0x03, 0xcd, 0x9a, 0x34, 0x49, 0x3d, 0x42, 0x26, 0xbc, 0x4b, + 0xe4, 0x22, 0xaf, 0xe0, 0xd8, 0x85, 0x6f, 0x98, 0x97, 0x73, 0x0e, 0x75, 0x08, 0xe5, 0x18, 0x8c, + 0xba, 0xae, 0xd6, 0x16, 0xfa, 0xed, 0x1a, 0xab, 0x40, 0xb1, 0xd5, 0x1c, 0xb4, 0x9a, 0xbb, 0x6d, + 0x25, 0x83, 0xa8, 0x41, 0x7b, 0xc8, 0x75, 0xda, 0x75, 0xb6, 0x01, 0x15, 0x4c, 0xed, 0xb6, 0xf7, + 0x9a, 0x47, 0xdd, 0xa1, 0x92, 0x65, 0x35, 0x28, 0xf7, 0xfa, 0x7a, 0xb3, 0x35, 0xec, 0xf4, 0x7b, + 0x4a, 0x4e, 0xfd, 0x11, 0x94, 0x5a, 0x27, 0xd6, 0xf8, 0xf4, 0xb2, 0x51, 0x24, 0x83, 0xda, 0x1a, + 0x9f, 0x0a, 0xfd, 0x74, 0xc1, 0xa0, 0xb6, 0xc6, 0xa7, 0xea, 0x53, 0xa8, 0xb6, 0x22, 0xa1, 0x70, + 0x59, 0x29, 0x0f, 0xa1, 0x4e, 0x9b, 0x6f, 0x3c, 0x8a, 0x76, 0xdf, 0xfa, 0x8a, 0xdd, 0x57, 0x45, + 0x9a, 0xd6, 0x48, 0x6c, 0xbf, 0x0f, 0xa1, 0x72, 0xe8, 0x7b, 0x33, 0xcb, 0x0f, 0xa9, 0x58, 0x05, + 0xb2, 0xa7, 0xd6, 0x85, 0x28, 0x15, 0x3f, 0x13, 0x97, 0xc3, 0xba, 0xec, 0x72, 0x78, 0x08, 0xa5, + 0x28, 0xdb, 0x37, 0xce, 0xf3, 0x43, 0xe4, 0x62, 0x94, 0xc7, 0xb6, 0x02, 0xac, 0xec, 0x01, 0xc0, + 0x2c, 0x06, 0x08, 0xed, 0x23, 0xd2, 0xbc, 0x45, 0xe1, 0x9a, 0x44, 0xa1, 0xfe, 0x6d, 0x16, 0xea, + 0x87, 0x86, 0x1f, 0xda, 0x38, 0x39, 0x7c, 0x18, 0xde, 0x80, 0x1c, 0x2d, 0x79, 0xee, 0xdd, 0xb8, + 0x12, 0xab, 0xed, 0x9c, 0x86, 0xd4, 0x08, 0x22, 0x60, 0xdf, 0x83, 0xfa, 0x2c, 0x02, 0xeb, 0x24, + 0x1b, 0xf8, 0xd8, 0x2c, 0x66, 0xa1, 0x31, 0xaf, 0xcd, 0xe4, 0x24, 0xfb, 0x01, 0x6c, 0xa5, 0xf3, + 0x5a, 0x41, 0x90, 0xf0, 0x51, 0x79, 0xb2, 0xae, 0xa4, 0x32, 0x72, 0x32, 0xd6, 0x82, 0xcd, 0x24, + 0xfb, 0xd8, 0x73, 0xe6, 0x53, 0x37, 0x10, 0x76, 0xc4, 0xb5, 0x85, 0xda, 0x5b, 0x1c, 0xab, 0x29, + 0xb3, 0x05, 0x08, 0x53, 0xa1, 0x1a, 0xc3, 0x7a, 0xf3, 0x29, 0x6d, 0x89, 0x9c, 0x96, 0x82, 0xb1, + 0x47, 0x00, 0x71, 0x1a, 0x6d, 0xe2, 0xec, 0x8a, 0xfe, 0x75, 0x42, 0x6b, 0xaa, 0x49, 0x64, 0xa8, + 0x7e, 0x20, 0x33, 0xf0, 0xed, 0xf0, 0x64, 0x4a, 0x5c, 0x2c, 0xab, 0x25, 0x00, 0x62, 0x96, 0x81, + 0x8e, 0x06, 0x78, 0x9c, 0x45, 0x30, 0xb4, 0xba, 0x1d, 0x0c, 0xe6, 0xa3, 0xb8, 0x5c, 0x14, 0xa9, + 0x49, 0x2f, 0xa7, 0xc1, 0xb1, 0x70, 0x53, 0x24, 0x2d, 0x3c, 0x08, 0x8e, 0xd9, 0x43, 0xb8, 0x9a, + 0x10, 0x25, 0xfc, 0x37, 0x68, 0x00, 0x71, 0xee, 0x64, 0xf8, 0x62, 0x26, 0x1c, 0xa8, 0x3f, 0x86, + 0x5a, 0x6a, 0x76, 0x5e, 0x28, 0xdc, 0xaf, 0x43, 0x09, 0xff, 0xa3, 0x68, 0x17, 0x0b, 0xb0, 0x88, + 0xe9, 0x41, 0xe8, 0xab, 0x16, 0x28, 0x8b, 0x63, 0xcd, 0xee, 0x92, 0xeb, 0x8e, 0x26, 0x65, 0xd9, + 0x05, 0x17, 0xa1, 0xd8, 0x5b, 0xab, 0x26, 0x71, 0x9d, 0x5a, 0xbd, 0x34, 0x59, 0xea, 0x1f, 0xac, + 0x4b, 0x6d, 0xc6, 0x11, 0x67, 0xaf, 0xc9, 0xcb, 0x4f, 0xda, 0xb8, 0xc9, 0x98, 0x91, 0xc4, 0x79, + 0x13, 0x14, 0xcf, 0x37, 0x6d, 0xd7, 0x20, 0x57, 0x22, 0x1f, 0xee, 0x75, 0xd2, 0x16, 0x37, 0x04, + 0xfc, 0x50, 0x80, 0xd1, 0x6e, 0x31, 0xad, 0xd8, 0x33, 0x23, 0x7c, 0x11, 0x32, 0x48, 0x96, 0x4e, + 0xb9, 0xb4, 0x74, 0x7a, 0x03, 0xca, 0x8e, 0x15, 0x04, 0x7a, 0x78, 0x62, 0xb8, 0x24, 0xbf, 0xd3, + 0x9d, 0x2e, 0x21, 0x72, 0x78, 0x62, 0xb8, 0x48, 0x68, 0xbb, 0xba, 0x38, 0x7b, 0x29, 0x2c, 0x13, + 0xda, 0x2e, 0xd9, 0x6f, 0x28, 0xf7, 0xb7, 0x56, 0x4d, 0xac, 0x10, 0x8b, 0x6c, 0x79, 0x5e, 0xd5, + 0x57, 0xa0, 0xf8, 0xd4, 0xb6, 0xce, 0x04, 0x2f, 0x7b, 0x6e, 0x5b, 0x67, 0x11, 0x2f, 0xc3, 0x6f, + 0xf5, 0xaf, 0x4b, 0x50, 0x22, 0xe2, 0xdd, 0xcb, 0x5d, 0xb6, 0xdf, 0xc6, 0xda, 0xd8, 0x16, 0x72, + 0x2a, 0xb7, 0xc2, 0xc6, 0xe1, 0x52, 0xeb, 0x15, 0x00, 0x49, 0x86, 0x72, 0x8d, 0xa0, 0x1c, 0xc6, + 0xa2, 0x13, 0xd5, 0x74, 0xd2, 0xf1, 0x82, 0x2f, 0x1d, 0xe1, 0x9d, 0x49, 0x00, 0xec, 0x01, 0x57, + 0xa2, 0xc9, 0x1f, 0x53, 0x94, 0x19, 0x0b, 0xf5, 0x21, 0x32, 0xe1, 0x49, 0xb3, 0xc6, 0x04, 0xe9, + 0x07, 0x96, 0x1f, 0x44, 0xdb, 0xa9, 0xa6, 0x45, 0x49, 0xe4, 0x68, 0xa8, 0x3c, 0x09, 0x93, 0x3b, + 0xda, 0xbe, 0xb2, 0xf6, 0xa7, 0x11, 0x01, 0xbb, 0x07, 0x45, 0x12, 0xd9, 0x16, 0x4a, 0x70, 0x89, + 0x75, 0x46, 0xca, 0x94, 0x16, 0xa1, 0xd9, 0x9b, 0x90, 0x9f, 0x9c, 0x5a, 0x17, 0x41, 0xa3, 0x26, + 0xb3, 0x84, 0x94, 0x2c, 0xd4, 0x38, 0x05, 0xbb, 0x0b, 0x75, 0xdf, 0x9a, 0xe8, 0xe4, 0xc4, 0x45, + 0xe1, 0x1d, 0x34, 0xea, 0x24, 0x9b, 0xab, 0xbe, 0x35, 0x69, 0x21, 0x70, 0x38, 0x72, 0x02, 0xf6, + 0x3a, 0x14, 0x48, 0x2a, 0xa1, 0x8d, 0x21, 0xd5, 0x1c, 0x89, 0x38, 0x4d, 0x60, 0xd9, 0x43, 0x28, + 0x27, 0x6c, 0xe3, 0x2a, 0x75, 0x68, 0x6b, 0x81, 0x1f, 0x11, 0x1b, 0xd7, 0x12, 0x32, 0xf6, 0x3e, + 0x80, 0xb0, 0x7e, 0xf4, 0xd1, 0x05, 0x1d, 0x8b, 0x54, 0x62, 0xeb, 0x50, 0x12, 0x80, 0xb2, 0x8d, + 0xf4, 0x06, 0xe4, 0x51, 0x4a, 0x04, 0x8d, 0x97, 0xa8, 0x35, 0x9b, 0x69, 0x11, 0x42, 0xbd, 0x23, + 0x3c, 0xbb, 0x07, 0x25, 0x5c, 0x5c, 0x3a, 0x4e, 0x61, 0x43, 0x36, 0x07, 0xc5, 0x4a, 0x44, 0x2d, + 0xcd, 0x3a, 0x1b, 0x7c, 0xe9, 0xb0, 0xfb, 0x90, 0x33, 0xad, 0x49, 0xd0, 0xb8, 0x4e, 0x25, 0x5e, + 0x93, 0xe6, 0x12, 0x15, 0x87, 0x5d, 0x6b, 0xc2, 0x45, 0x0b, 0xd2, 0xb0, 0x7d, 0xa8, 0xe3, 0xd2, + 0x7b, 0x48, 0x8a, 0x37, 0x0e, 0x79, 0xe3, 0x06, 0xe5, 0xba, 0xb3, 0x90, 0xab, 0x27, 0x88, 0x68, + 0x82, 0xda, 0x6e, 0xe8, 0x5f, 0x68, 0x35, 0x57, 0x86, 0xb1, 0x1b, 0x50, 0xb2, 0x83, 0xae, 0x37, + 0x3e, 0xb5, 0xcc, 0xc6, 0xcb, 0x91, 0x93, 0x90, 0xa7, 0xd9, 0xa7, 0x50, 0xa3, 0xc5, 0x88, 0x49, + 0xac, 0xbc, 0x71, 0x53, 0x16, 0x79, 0x43, 0x19, 0xa5, 0xa5, 0x29, 0x51, 0xdd, 0xb2, 0x03, 0x3d, + 0xb4, 0xa6, 0x33, 0xcf, 0x47, 0x43, 0xf2, 0x95, 0xc8, 0xf9, 0x39, 0x8c, 0x40, 0xc8, 0xe7, 0xe3, + 0x43, 0x5c, 0xdd, 0x9b, 0x4c, 0x02, 0x2b, 0x6c, 0xdc, 0xa2, 0xbd, 0x56, 0x8f, 0xce, 0x72, 0xfb, + 0x04, 0x25, 0xa5, 0x34, 0xd0, 0xcd, 0x0b, 0xd7, 0x98, 0xda, 0xe3, 0xc6, 0x6d, 0x6e, 0xaf, 0xda, + 0xc1, 0x2e, 0x07, 0xc8, 0x26, 0xe3, 0x76, 0xca, 0x64, 0xbc, 0x02, 0x79, 0x73, 0x84, 0x5b, 0xf8, + 0x0e, 0x15, 0x9b, 0x33, 0x47, 0x1d, 0xf3, 0xc6, 0x63, 0x32, 0x13, 0xa9, 0x91, 0x1f, 0x2e, 0x28, + 0x03, 0xa9, 0xd5, 0x2f, 0x69, 0x0d, 0xfb, 0x6b, 0xb2, 0x4e, 0xb0, 0x93, 0x87, 0xac, 0x69, 0x4d, + 0x6e, 0xfc, 0x08, 0xd8, 0xf2, 0xf0, 0xbe, 0x48, 0x33, 0xc9, 0x0b, 0xcd, 0xe4, 0x7b, 0xeb, 0x9f, + 0x64, 0xd4, 0x4f, 0xa1, 0x96, 0xda, 0xab, 0x2b, 0x35, 0x2c, 0x6e, 0x69, 0x18, 0x53, 0xe1, 0x99, + 0xe1, 0x09, 0xf5, 0xdf, 0x65, 0xa1, 0xba, 0x6f, 0x04, 0x27, 0x07, 0xc6, 0x6c, 0x10, 0x1a, 0x61, + 0x80, 0x03, 0x7e, 0x62, 0x04, 0x27, 0x53, 0x63, 0xc6, 0xcd, 0xba, 0x0c, 0x77, 0x2a, 0x09, 0x18, + 0xda, 0x74, 0x38, 0xd5, 0x98, 0xec, 0xbb, 0x87, 0x4f, 0x84, 0xc7, 0x28, 0x4e, 0x23, 0x73, 0x08, + 0x4e, 0xe6, 0x93, 0x89, 0x70, 0x31, 0x97, 0xb4, 0x28, 0xc9, 0xee, 0x42, 0x4d, 0x7c, 0x92, 0x4d, + 0x77, 0x2e, 0x8e, 0xd5, 0xd3, 0x40, 0xf6, 0x08, 0x2a, 0x02, 0x30, 0x8c, 0x58, 0x59, 0x3d, 0xf6, + 0x04, 0x26, 0x08, 0x4d, 0xa6, 0x62, 0x3f, 0x81, 0xab, 0x52, 0x72, 0xcf, 0xf3, 0x0f, 0xe6, 0x4e, + 0x68, 0xb7, 0x7a, 0x42, 0x81, 0x7e, 0x79, 0x29, 0x7b, 0x42, 0xa2, 0xad, 0xce, 0x99, 0x6e, 0xed, + 0x81, 0xed, 0x0a, 0xf5, 0x22, 0x0d, 0x5c, 0xa0, 0x32, 0xce, 0x89, 0x21, 0xa6, 0xa9, 0x8c, 0x73, + 0x5c, 0xfe, 0x02, 0x70, 0x60, 0x85, 0x27, 0x9e, 0x49, 0xea, 0x45, 0xbc, 0xfc, 0x07, 0x32, 0x4a, + 0x4b, 0x53, 0xe2, 0x70, 0xba, 0x73, 0xc7, 0x19, 0xbb, 0x21, 0xd9, 0x50, 0x59, 0x2d, 0x4a, 0xa2, + 0xb0, 0xf0, 0x0d, 0xf7, 0xd8, 0x0a, 0x1a, 0x95, 0xed, 0xec, 0xbd, 0x8c, 0x26, 0x52, 0xea, 0xef, + 0xae, 0x43, 0x9e, 0xcf, 0xe4, 0xcb, 0x50, 0x1e, 0x39, 0xde, 0xf8, 0x54, 0x77, 0xe7, 0xd3, 0xe8, + 0x78, 0x84, 0x00, 0xa8, 0x6f, 0x91, 0xed, 0x23, 0x3c, 0x7e, 0x19, 0x8d, 0xbe, 0xb1, 0x48, 0x6f, + 0x1e, 0x62, 0x5d, 0x59, 0x82, 0x8a, 0x14, 0x36, 0xc2, 0xf7, 0xce, 0x68, 0x35, 0xe4, 0x08, 0x11, + 0x25, 0xe9, 0x04, 0x86, 0xe4, 0x0e, 0x66, 0xca, 0x13, 0xae, 0x44, 0x80, 0x96, 0x1b, 0x2e, 0x7a, + 0x27, 0x0b, 0x4b, 0xde, 0x49, 0x76, 0x0b, 0xd0, 0xb2, 0x1a, 0x5b, 0x7d, 0xd7, 0x6a, 0xf5, 0x68, + 0x84, 0x4b, 0x9a, 0x04, 0x61, 0x1f, 0xc5, 0x6b, 0x91, 0x7a, 0x24, 0x7c, 0xc7, 0x82, 0xa3, 0xca, + 0xab, 0x56, 0x4b, 0xd1, 0xe1, 0xde, 0x41, 0x36, 0xc9, 0xb5, 0x38, 0xfc, 0x54, 0xdb, 0x00, 0x9a, + 0x77, 0x16, 0x58, 0x21, 0x69, 0x61, 0x2f, 0x51, 0x87, 0x52, 0x47, 0xa1, 0xde, 0xd9, 0xa1, 0x17, + 0xc4, 0xea, 0xd9, 0xfa, 0x6a, 0xf5, 0x4c, 0x7d, 0x17, 0x8a, 0x28, 0x77, 0x8d, 0xd0, 0x60, 0x77, + 0x85, 0x9f, 0x93, 0xeb, 0x5d, 0xc2, 0xe1, 0x9b, 0xd4, 0x21, 0x3c, 0x9f, 0xdd, 0xa8, 0x5e, 0xca, + 0x73, 0x47, 0x72, 0x7d, 0xc4, 0xfc, 0x5b, 0x14, 0x28, 0x24, 0xf9, 0xcb, 0x50, 0xc6, 0xa6, 0xd1, + 0x19, 0x92, 0xd8, 0xe8, 0x25, 0xdf, 0x3b, 0x6b, 0x61, 0x5a, 0xfd, 0xcf, 0x19, 0xa8, 0xf4, 0x7d, + 0x13, 0x05, 0xc7, 0x60, 0x66, 0x8d, 0x5f, 0xa8, 0x4d, 0xa2, 0xdc, 0xf7, 0x1c, 0xc7, 0x88, 0x75, + 0x31, 0x94, 0xfb, 0x11, 0x80, 0xbd, 0x0f, 0xb9, 0x89, 0x63, 0x1c, 0xd3, 0x64, 0xc7, 0x56, 0xa6, + 0x54, 0x7c, 0xf4, 0xbd, 0xe7, 0x18, 0xc7, 0x1a, 0x91, 0xaa, 0xbf, 0x11, 0xd7, 0x4f, 0x67, 0x2e, + 0xf2, 0x49, 0xcb, 0x1a, 0x9d, 0x67, 0x0e, 0x5a, 0x4a, 0x86, 0x95, 0x20, 0xb7, 0xdb, 0x1e, 0xb4, + 0xb8, 0x6d, 0x89, 0x56, 0xe6, 0x40, 0xdf, 0xeb, 0x68, 0x83, 0xa1, 0x92, 0xa3, 0x03, 0x52, 0x02, + 0x74, 0x9b, 0x83, 0xa1, 0x52, 0x62, 0x00, 0x85, 0xa3, 0x5e, 0xe7, 0x27, 0x47, 0x6d, 0x45, 0x51, + 0xff, 0x43, 0x06, 0x20, 0x39, 0x10, 0x60, 0x6f, 0x41, 0xe5, 0x8c, 0x52, 0xba, 0x74, 0x52, 0x24, + 0xf7, 0x11, 0x38, 0x9a, 0x74, 0x92, 0x77, 0x24, 0x13, 0x03, 0x65, 0xef, 0xf2, 0x91, 0x51, 0x65, + 0x96, 0x88, 0x6d, 0xf6, 0x36, 0x94, 0x3c, 0xec, 0x07, 0x92, 0x66, 0x65, 0xc1, 0x2b, 0x75, 0x5f, + 0x2b, 0x7a, 0x3c, 0x81, 0x32, 0x7a, 0xe2, 0x47, 0xae, 0xa4, 0x98, 0x74, 0x0f, 0x41, 0x2d, 0xc7, + 0x98, 0x07, 0x96, 0xc6, 0xf1, 0x31, 0xdb, 0xcd, 0x27, 0x6c, 0x57, 0xfd, 0x29, 0xd4, 0x07, 0xc6, + 0x74, 0xc6, 0x99, 0x33, 0x75, 0x8c, 0x41, 0x0e, 0xd7, 0x84, 0x58, 0x7a, 0xf4, 0x8d, 0x5b, 0xec, + 0xd0, 0xf2, 0xc7, 0x96, 0x1b, 0xed, 0xc8, 0x28, 0x89, 0xcc, 0xf6, 0x28, 0xb0, 0xdd, 0x63, 0xcd, + 0x3b, 0x8b, 0x22, 0x94, 0xa2, 0xb4, 0xfa, 0x8f, 0x33, 0x50, 0x91, 0x9a, 0xc1, 0xde, 0x4d, 0x59, + 0x94, 0x2f, 0x2f, 0xb5, 0x93, 0x7f, 0x4b, 0x96, 0xe5, 0xeb, 0x90, 0x0f, 0x42, 0xc3, 0x8f, 0xce, + 0x96, 0x14, 0x29, 0xc7, 0x8e, 0x37, 0x77, 0x4d, 0x8d, 0xa3, 0x99, 0x0a, 0x59, 0xcb, 0x35, 0x85, + 0xd1, 0xb8, 0x4c, 0x85, 0x48, 0x75, 0x1b, 0xca, 0x71, 0xf1, 0xb8, 0x04, 0xb4, 0xfe, 0xb3, 0x81, + 0xb2, 0xc6, 0xca, 0x90, 0xd7, 0x9a, 0xbd, 0xc7, 0x6d, 0x25, 0xa3, 0xfe, 0x49, 0x06, 0x20, 0xc9, + 0xc5, 0x1e, 0xa4, 0x5a, 0x7b, 0x63, 0xb1, 0xd4, 0x07, 0xf4, 0x57, 0x6a, 0xec, 0x4d, 0x28, 0xcf, + 0x5d, 0x02, 0x5a, 0xa6, 0x90, 0x3b, 0x09, 0x80, 0xdd, 0x84, 0x6c, 0x14, 0xcb, 0xb4, 0x10, 0x3f, + 0xf2, 0xdc, 0x70, 0xd4, 0xef, 0x41, 0x39, 0x2e, 0x8e, 0xd5, 0xa0, 0xbc, 0xd7, 0xef, 0x76, 0xfb, + 0xcf, 0x3a, 0xbd, 0xc7, 0xca, 0x1a, 0x26, 0x0f, 0xb5, 0x76, 0xab, 0xbd, 0x8b, 0xc9, 0x0c, 0xae, + 0xd9, 0xd6, 0x91, 0xa6, 0xb5, 0x7b, 0x43, 0x5d, 0xeb, 0x3f, 0x53, 0xd6, 0xd5, 0xdf, 0xca, 0xc1, + 0x66, 0xdf, 0xdd, 0x9d, 0xcf, 0x1c, 0x7b, 0x6c, 0x84, 0xd6, 0x13, 0xeb, 0xa2, 0x15, 0x9e, 0xa3, + 0x38, 0x35, 0xc2, 0xd0, 0xe7, 0x9b, 0xb9, 0xac, 0xf1, 0x04, 0x77, 0xd0, 0x05, 0x96, 0x1f, 0x92, + 0xff, 0x51, 0xde, 0xc5, 0x75, 0x0e, 0x6f, 0x79, 0x0e, 0xed, 0x65, 0xf6, 0x03, 0xb8, 0xca, 0x9d, + 0x7a, 0x9c, 0x12, 0x95, 0x4e, 0x6e, 0xdb, 0x67, 0x97, 0x96, 0x2e, 0xe3, 0x84, 0x98, 0x15, 0xc9, + 0x88, 0x85, 0xdd, 0x86, 0x4a, 0x92, 0x3d, 0x3a, 0xb0, 0x85, 0x98, 0x90, 0x5a, 0xe2, 0xb9, 0xba, + 0x19, 0xb5, 0x5a, 0xb7, 0xcd, 0x73, 0x32, 0x97, 0xf2, 0x5a, 0xdd, 0x4b, 0x3a, 0x83, 0x22, 0xf7, + 0x33, 0xd8, 0x4c, 0x51, 0x52, 0x2b, 0xb8, 0xc1, 0xf4, 0x76, 0x74, 0x58, 0xb0, 0xd0, 0x7b, 0x19, + 0x82, 0xcd, 0xe1, 0x1a, 0xe1, 0x86, 0x97, 0x86, 0x8a, 0x93, 0x63, 0xfb, 0xd8, 0xf5, 0x7c, 0x4b, + 0xb0, 0xf7, 0x92, 0x1d, 0x74, 0x28, 0x9d, 0xd8, 0x2c, 0x52, 0xf0, 0x00, 0x97, 0x26, 0xd1, 0xd9, + 0x39, 0x47, 0xdb, 0x5c, 0x5e, 0xe6, 0xb4, 0x22, 0xa5, 0x3b, 0x26, 0x9a, 0xeb, 0x1c, 0x15, 0x99, + 0x21, 0x40, 0x66, 0x48, 0x95, 0x80, 0x4f, 0x39, 0xec, 0x46, 0x0f, 0xb6, 0x56, 0x35, 0x72, 0x85, + 0x5e, 0xb5, 0x2d, 0xeb, 0x55, 0x0b, 0x0e, 0xac, 0x44, 0xc7, 0xfa, 0x27, 0x19, 0xa8, 0xee, 0x5a, + 0xe6, 0x7c, 0xf6, 0x63, 0xcf, 0x76, 0x71, 0x01, 0x7c, 0x00, 0x55, 0xcf, 0x31, 0x69, 0xf6, 0xa4, + 0x18, 0x98, 0xd4, 0xe9, 0xa9, 0x38, 0xe8, 0x01, 0xcf, 0x31, 0x5b, 0x9e, 0x43, 0x11, 0x33, 0xef, + 0xc0, 0x15, 0xee, 0xdc, 0x13, 0xbe, 0xee, 0x73, 0x9e, 0x79, 0x9d, 0x66, 0x46, 0xe1, 0x28, 0xae, + 0x0a, 0x11, 0xf9, 0xaf, 0xc1, 0x96, 0x44, 0x4e, 0xae, 0x01, 0xa2, 0x5f, 0x5e, 0x24, 0x9b, 0x71, + 0xde, 0xe8, 0xf8, 0x52, 0xfd, 0x7b, 0x59, 0x28, 0x73, 0xd7, 0x20, 0xb6, 0xf7, 0x1e, 0x14, 0xbd, + 0xd1, 0x17, 0xba, 0x6f, 0x4d, 0x2e, 0x3b, 0x75, 0x2f, 0x78, 0xa3, 0x2f, 0x34, 0x6b, 0xc2, 0xde, + 0x8a, 0xa4, 0xba, 0x69, 0x4d, 0xc4, 0xa0, 0xd4, 0xd3, 0xf6, 0x80, 0x90, 0xf2, 0xdc, 0x11, 0x76, + 0x65, 0xd1, 0x7a, 0xb6, 0x4d, 0xee, 0xce, 0xce, 0x69, 0x9b, 0x69, 0xe3, 0xb9, 0x63, 0x06, 0x97, + 0xbb, 0x51, 0x72, 0x97, 0xba, 0x51, 0xd8, 0x7d, 0xd8, 0xc4, 0xa1, 0x4e, 0xf2, 0xf1, 0xc5, 0x8c, + 0xdb, 0x6a, 0xc3, 0x73, 0xcc, 0xc4, 0x5d, 0x61, 0x9e, 0x23, 0xad, 0x6b, 0x9d, 0x2d, 0xd0, 0x16, + 0x38, 0xad, 0x6b, 0x9d, 0xa5, 0x68, 0x1f, 0x41, 0x25, 0xd9, 0xad, 0x41, 0xa3, 0x78, 0xf9, 0x0c, + 0xc6, 0x9b, 0x37, 0xc0, 0x4c, 0xdc, 0xb5, 0xcb, 0x33, 0x95, 0x2e, 0xcf, 0xc4, 0xc9, 0xe8, 0xf8, + 0xf1, 0x9f, 0xaf, 0x43, 0xb9, 0xc3, 0xcb, 0x08, 0xcf, 0xd9, 0x1d, 0xc8, 0x7e, 0xcd, 0x34, 0x20, + 0x0e, 0xbb, 0x61, 0x98, 0xa6, 0x6e, 0x4c, 0x26, 0xd6, 0x38, 0xb4, 0x4c, 0x1d, 0x35, 0x2e, 0xc1, + 0xf4, 0x36, 0x0c, 0xd3, 0x6c, 0x0a, 0x38, 0x09, 0x0f, 0xee, 0xe8, 0x8a, 0x2c, 0xcf, 0x24, 0xbe, + 0x83, 0x1c, 0x5d, 0xc2, 0xf0, 0xe4, 0x07, 0x3b, 0xa9, 0x99, 0xcd, 0x7d, 0xb7, 0x99, 0xcd, 0x7f, + 0xeb, 0x99, 0x2d, 0x5c, 0x3e, 0xb3, 0x29, 0xcf, 0x1b, 0xce, 0x54, 0x91, 0x66, 0x2a, 0x11, 0xe6, + 0x1d, 0xf3, 0x5c, 0xfd, 0x87, 0x59, 0x00, 0xcd, 0x9a, 0x39, 0xc6, 0xd8, 0xfa, 0xbf, 0x67, 0xf4, + 0x6e, 0x4b, 0xcb, 0xc4, 0x35, 0xa3, 0xa0, 0xab, 0x68, 0x49, 0x90, 0xf8, 0x5b, 0x39, 0xbc, 0x85, + 0x6f, 0x3d, 0xbc, 0xc5, 0x6f, 0x31, 0xbc, 0xa5, 0xe5, 0xe1, 0x65, 0x3f, 0x82, 0x57, 0x7c, 0xeb, + 0xcc, 0xb7, 0x43, 0x4b, 0x9f, 0xf8, 0xde, 0x54, 0x4f, 0x09, 0x03, 0xe4, 0x95, 0x65, 0x1a, 0x8d, + 0xeb, 0x82, 0x68, 0xcf, 0xf7, 0xa6, 0x69, 0x81, 0xa0, 0xfe, 0x75, 0x09, 0x2a, 0x4d, 0xd7, 0x70, + 0x2e, 0xbe, 0xb2, 0x28, 0x64, 0x89, 0x0e, 0x7f, 0x66, 0xf3, 0x90, 0x8f, 0x3b, 0x3f, 0xcf, 0x2f, + 0x13, 0x84, 0x46, 0xfc, 0x36, 0x54, 0xbc, 0x79, 0x18, 0xe3, 0xf9, 0x09, 0x3f, 0x70, 0x10, 0x11, + 0xc4, 0xf9, 0xe3, 0x83, 0xc5, 0x28, 0x3f, 0xd9, 0x9f, 0x49, 0xfe, 0xd8, 0x26, 0x89, 0xf3, 0x13, + 0x01, 0x0a, 0x08, 0x7b, 0x4a, 0x23, 0x1f, 0xcc, 0xa7, 0x16, 0x1f, 0xfd, 0x2c, 0x0f, 0x80, 0x6d, + 0x09, 0x18, 0x96, 0x32, 0xb5, 0xa6, 0x9e, 0x7f, 0xc1, 0x4b, 0x29, 0xf0, 0x52, 0x38, 0x88, 0x4a, + 0x79, 0x1b, 0xd8, 0x99, 0x61, 0x87, 0x7a, 0xba, 0x28, 0x6e, 0x07, 0x2a, 0x88, 0x19, 0xca, 0xc5, + 0x5d, 0x83, 0x82, 0x69, 0x07, 0xa7, 0x9d, 0xbe, 0xb0, 0x01, 0x45, 0x0a, 0xfb, 0x12, 0x8c, 0x0d, + 0x54, 0x4a, 0x43, 0x2b, 0xa0, 0xa1, 0xcc, 0x6a, 0x65, 0x84, 0xec, 0x20, 0x00, 0x95, 0x1a, 0xd7, + 0x0a, 0xcf, 0x3c, 0x1f, 0x73, 0x72, 0x13, 0x2f, 0x01, 0xa0, 0xf2, 0x87, 0xa4, 0x58, 0x11, 0x39, + 0xd5, 0xb2, 0x5a, 0x9c, 0x46, 0xe3, 0x89, 0x73, 0x25, 0xc2, 0x56, 0x79, 0xf3, 0x13, 0x08, 0xbb, + 0x0b, 0x75, 0x6a, 0x3e, 0x99, 0x80, 0xd8, 0x07, 0x3a, 0x84, 0xcf, 0x6a, 0x55, 0x84, 0x92, 0x7f, + 0x05, 0xa9, 0x3e, 0x85, 0xeb, 0xa9, 0xfe, 0xe9, 0x86, 0xef, 0x1b, 0x17, 0xfa, 0xd4, 0xf8, 0xc2, + 0xf3, 0xc9, 0x7f, 0x96, 0xd5, 0xae, 0xc9, 0xc3, 0xd6, 0x44, 0xf4, 0x01, 0x62, 0x2f, 0xcd, 0x6a, + 0xbb, 0x9e, 0x4f, 0xce, 0xb5, 0x95, 0x59, 0x11, 0x4b, 0x5e, 0x1d, 0x9a, 0x60, 0xb2, 0x47, 0x03, + 0x1e, 0x38, 0xad, 0x55, 0x08, 0xb6, 0x43, 0x20, 0xb4, 0xd1, 0x82, 0x47, 0x5c, 0xd8, 0x6d, 0x8a, + 0xf8, 0xc6, 0x47, 0x24, 0x12, 0x39, 0xe2, 0xc4, 0x32, 0x4c, 0x3a, 0xd8, 0x27, 0xc4, 0xbe, 0x65, + 0x50, 0xd8, 0x4c, 0xf0, 0x48, 0x9f, 0xcd, 0x43, 0x1e, 0xf1, 0xac, 0xe5, 0x83, 0x47, 0x87, 0xf3, + 0x50, 0x80, 0x8f, 0xad, 0x90, 0xe2, 0x9c, 0x09, 0xfc, 0xd8, 0x0a, 0x51, 0x37, 0x09, 0x1e, 0x45, + 0x87, 0x74, 0x57, 0xc5, 0xd8, 0x3e, 0x12, 0xa7, 0x70, 0x2a, 0xd4, 0x62, 0xa4, 0x3e, 0x9d, 0xf3, + 0x10, 0xe7, 0xac, 0x56, 0x89, 0x08, 0x0e, 0xe6, 0x0e, 0x4e, 0xec, 0xd8, 0x18, 0x9f, 0x58, 0xba, + 0x8f, 0x4d, 0x79, 0x89, 0x4f, 0x1d, 0x41, 0x34, 0x6c, 0xcd, 0xcb, 0xc0, 0x13, 0xfa, 0x89, 0x1d, + 0x92, 0xc3, 0x2e, 0xab, 0x95, 0x08, 0xb0, 0x6f, 0x87, 0xc8, 0x9f, 0x38, 0x52, 0xac, 0x40, 0x2a, + 0xe2, 0x3a, 0x11, 0x6d, 0x10, 0xe2, 0x80, 0xe0, 0x54, 0xd0, 0x3d, 0x50, 0x52, 0xb4, 0x58, 0xde, + 0x0d, 0x22, 0xad, 0x4b, 0xa4, 0x58, 0xea, 0xeb, 0xc0, 0x33, 0xeb, 0xb8, 0xf4, 0x78, 0x99, 0x2f, + 0x73, 0x7f, 0x04, 0x81, 0x77, 0xed, 0xe0, 0x94, 0x4a, 0xbc, 0x0b, 0x75, 0x89, 0x0e, 0xcb, 0xbb, + 0xc9, 0x57, 0x46, 0x4c, 0x96, 0x6a, 0xa3, 0x6f, 0x4d, 0xbd, 0x50, 0x74, 0xf3, 0x15, 0xa9, 0x8d, + 0x1a, 0xc1, 0xd3, 0x6d, 0x14, 0xb4, 0x58, 0xe6, 0x2d, 0xa9, 0x8d, 0x9c, 0x14, 0x4b, 0xbd, 0x03, + 0x55, 0xe4, 0x22, 0xa1, 0xe5, 0xf2, 0xcd, 0x7f, 0x9b, 0x0f, 0xac, 0x80, 0xd1, 0xee, 0xbf, 0x03, + 0x55, 0x3e, 0xf2, 0x82, 0x6f, 0x6f, 0x73, 0x12, 0x01, 0x43, 0x12, 0xd5, 0x97, 0x0e, 0xd3, 0x0e, + 0xfd, 0xb9, 0x6b, 0x71, 0xf7, 0x23, 0x7d, 0x9a, 0x22, 0xac, 0x21, 0x4e, 0xb3, 0x5d, 0xb8, 0xc2, + 0xbd, 0x0e, 0x96, 0xa4, 0x43, 0x44, 0x61, 0x85, 0x2b, 0x0f, 0x99, 0x58, 0x44, 0x1f, 0x83, 0x03, + 0xf5, 0x67, 0x19, 0xb8, 0xd1, 0xa7, 0x18, 0x0b, 0x62, 0xb0, 0x07, 0x56, 0x10, 0x18, 0xc7, 0xd6, + 0x9e, 0xe7, 0xef, 0xcd, 0xbf, 0xfa, 0xea, 0x82, 0xdd, 0x83, 0x8d, 0x43, 0xc3, 0xb7, 0xdc, 0x30, + 0x66, 0xbf, 0x42, 0xc7, 0x5c, 0x04, 0xb3, 0x4f, 0xe8, 0x20, 0xc7, 0x72, 0xc3, 0xa3, 0x58, 0x5b, + 0x17, 0x6d, 0x49, 0xbb, 0xf6, 0x97, 0xa8, 0xd4, 0x7f, 0x79, 0x07, 0x72, 0x3d, 0xcf, 0xb4, 0xd8, + 0x7b, 0x50, 0xa6, 0x68, 0xe7, 0xe5, 0xf3, 0x43, 0x44, 0xd3, 0x1f, 0x32, 0x9c, 0x4a, 0xae, 0xf8, + 0xba, 0x3c, 0x3e, 0xfa, 0x0e, 0x99, 0x80, 0x14, 0x80, 0x80, 0x02, 0xad, 0x22, 0x9c, 0x52, 0xe4, + 0x55, 0xe1, 0x18, 0x1c, 0x5b, 0x72, 0xaa, 0xfb, 0x96, 0x4b, 0x5a, 0x5a, 0x5e, 0x8b, 0xd3, 0x64, + 0x78, 0xfb, 0x1e, 0x0a, 0x5f, 0xbe, 0x57, 0xf3, 0x2b, 0x0c, 0x6f, 0x8e, 0xa7, 0xcd, 0xfb, 0x1e, + 0x94, 0xbf, 0xf0, 0x6c, 0x97, 0x37, 0xbc, 0xb0, 0xd4, 0x70, 0xd4, 0xad, 0x79, 0xc3, 0xbf, 0x10, + 0x5f, 0xec, 0x55, 0x28, 0x7a, 0x2e, 0x2f, 0xbb, 0xb8, 0x54, 0x76, 0xc1, 0x73, 0xbb, 0x3c, 0x40, + 0xaf, 0x36, 0x9a, 0xdb, 0x8e, 0x89, 0xb2, 0xcb, 0xb1, 0x26, 0xa1, 0x38, 0xe7, 0xab, 0x10, 0xb0, + 0xef, 0x76, 0xad, 0x49, 0xc8, 0xde, 0x82, 0xca, 0xc4, 0x76, 0x50, 0xc6, 0x53, 0x61, 0xe5, 0xa5, + 0xc2, 0x80, 0xa3, 0xa9, 0xc0, 0xd7, 0xa0, 0x74, 0xec, 0x7b, 0xf3, 0x99, 0x3e, 0xba, 0xa0, 0xf3, + 0xbd, 0x85, 0x93, 0x35, 0xc2, 0xed, 0x5c, 0xa0, 0xa0, 0xa1, 0x4f, 0xdb, 0x3d, 0xd6, 0xc9, 0x97, + 0x52, 0xd9, 0xce, 0xde, 0x2b, 0x69, 0xd5, 0x08, 0x48, 0x5e, 0x92, 0xd7, 0xa0, 0x64, 0x1c, 0x1f, + 0xeb, 0x22, 0xce, 0x70, 0xa9, 0x2c, 0xe3, 0xf8, 0x98, 0xaa, 0x7c, 0x00, 0xb5, 0x33, 0xdb, 0xd5, + 0x83, 0x99, 0x35, 0xe6, 0xb4, 0xb5, 0xe5, 0xa1, 0x3c, 0xb3, 0xdd, 0xc1, 0xcc, 0x1a, 0x13, 0xbd, + 0xec, 0xc3, 0xa8, 0xbf, 0xd0, 0x87, 0xb1, 0x0d, 0x79, 0xc7, 0x9e, 0xda, 0xa1, 0x88, 0x3c, 0x4c, + 0x19, 0x39, 0x84, 0x60, 0x2a, 0x14, 0x84, 0xf3, 0x5c, 0x59, 0x22, 0x11, 0x98, 0xb4, 0x06, 0xb4, + 0xf9, 0x02, 0x0d, 0x48, 0x32, 0x38, 0xd8, 0xd7, 0x1b, 0x1c, 0x1f, 0xd2, 0x09, 0xa3, 0xe5, 0x86, + 0x7a, 0x94, 0xe1, 0xca, 0xea, 0x0c, 0x55, 0x4e, 0xd6, 0xe7, 0xd9, 0xde, 0x87, 0x8a, 0x4f, 0xce, + 0x35, 0x9d, 0x3c, 0x71, 0x5b, 0xb2, 0x77, 0x22, 0xf1, 0xba, 0x69, 0xe0, 0x27, 0x1e, 0xb8, 0x26, + 0x6c, 0x24, 0x91, 0xd4, 0x3c, 0xdc, 0xfc, 0xaa, 0xec, 0xae, 0x4f, 0x85, 0x5e, 0x0b, 0x3d, 0xbe, + 0x66, 0xa7, 0xe2, 0xb1, 0x5f, 0x85, 0x1a, 0x8f, 0xa1, 0xe2, 0x91, 0x2e, 0x01, 0xc9, 0x86, 0xb2, + 0x56, 0x25, 0x20, 0x8f, 0x82, 0x09, 0xd8, 0x03, 0x80, 0x48, 0xfb, 0x0b, 0xcf, 0x49, 0x38, 0xc4, + 0xbd, 0xe1, 0x12, 0xa4, 0x15, 0x9e, 0x6b, 0x65, 0x33, 0xfa, 0x44, 0x9e, 0x37, 0xb2, 0x5d, 0x13, + 0xd7, 0x51, 0x68, 0x1c, 0x07, 0x8d, 0x06, 0x6d, 0xb3, 0x8a, 0x80, 0x0d, 0x8d, 0xe3, 0x00, 0xed, + 0x4d, 0x83, 0xeb, 0x58, 0xbc, 0xdd, 0xd7, 0x65, 0x67, 0x94, 0xa4, 0x7d, 0x69, 0x15, 0x43, 0x52, + 0xc5, 0x3e, 0x06, 0x16, 0x1d, 0xee, 0x49, 0xe6, 0xe3, 0x8d, 0xa5, 0xa5, 0xb5, 0x21, 0x4e, 0xf7, + 0xe2, 0xab, 0x1d, 0x1f, 0x43, 0x2d, 0xad, 0x13, 0xdf, 0x5c, 0x71, 0x9c, 0x45, 0xb3, 0xae, 0x55, + 0xc7, 0xb2, 0x96, 0xfc, 0x2a, 0xd4, 0x5c, 0x2f, 0xd4, 0x89, 0xef, 0x53, 0x46, 0x7e, 0x64, 0x53, + 0x75, 0xbd, 0xb0, 0x15, 0xc1, 0x70, 0x7c, 0x22, 0xcb, 0x2b, 0x3c, 0x27, 0x51, 0x11, 0x8f, 0x4f, + 0x6c, 0x26, 0xa1, 0xca, 0x17, 0x59, 0x4c, 0x38, 0xd5, 0xdc, 0x02, 0xa0, 0x0c, 0xb7, 0x53, 0x53, + 0x1d, 0x9b, 0x06, 0x1a, 0xf8, 0x89, 0x99, 0x70, 0x1b, 0x2a, 0x81, 0x37, 0xf7, 0xc7, 0x96, 0x1e, + 0x84, 0xd6, 0xac, 0xb1, 0x4d, 0x23, 0x0a, 0x1c, 0x34, 0x08, 0xad, 0x19, 0xfb, 0x04, 0xea, 0x33, + 0xdf, 0xd2, 0xa5, 0x79, 0xba, 0x23, 0x77, 0xf1, 0xd0, 0xb7, 0x92, 0xa9, 0xaa, 0xce, 0xa4, 0x54, + 0x94, 0x53, 0xea, 0x81, 0xba, 0x90, 0x33, 0xe9, 0x04, 0xe6, 0x4c, 0x2c, 0xbf, 0x1f, 0xc2, 0xa6, + 0x94, 0x73, 0x7e, 0x4a, 0x99, 0x5f, 0x4d, 0x9d, 0x2e, 0x46, 0xe4, 0x47, 0xa7, 0x98, 0xbd, 0x3e, + 0x4b, 0xa5, 0x59, 0x73, 0xc1, 0xad, 0x83, 0xfa, 0xf9, 0x5d, 0xca, 0xff, 0xd2, 0x25, 0xbe, 0x9a, + 0x94, 0xbf, 0xe7, 0x09, 0x3f, 0x47, 0xea, 0x04, 0x6d, 0xd7, 0x6c, 0xbc, 0xc6, 0xef, 0x5f, 0x51, + 0x82, 0x3d, 0x82, 0x2a, 0xd7, 0x14, 0x29, 0x42, 0x3a, 0x68, 0xbc, 0x2e, 0xfb, 0xb5, 0x49, 0x5d, + 0x24, 0x84, 0x56, 0x71, 0xe2, 0xef, 0x80, 0x7d, 0x04, 0x9b, 0xfc, 0x88, 0x41, 0xe6, 0xac, 0x6f, + 0x2c, 0x2f, 0x2e, 0x22, 0xda, 0x4b, 0xd8, 0xab, 0x06, 0xd7, 0xfd, 0xb9, 0x4b, 0xda, 0xa3, 0xc8, + 0x39, 0xf3, 0xbd, 0x91, 0xc5, 0xf3, 0xdf, 0xa3, 0xfc, 0xa2, 0x3b, 0x1a, 0x27, 0xe3, 0x79, 0x89, + 0xa5, 0x5d, 0xf3, 0x65, 0xd0, 0x21, 0xe6, 0xbb, 0xa4, 0x4c, 0x2e, 0x12, 0xa8, 0xcc, 0x37, 0xbf, + 0x4d, 0x99, 0x3b, 0x98, 0x8f, 0xca, 0x64, 0x90, 0x9b, 0xcf, 0x6d, 0xb3, 0x71, 0x9f, 0x07, 0x33, + 0xe3, 0x37, 0x7b, 0x0d, 0xea, 0xbe, 0x35, 0x9e, 0xfb, 0x81, 0xfd, 0xdc, 0xd2, 0x03, 0xdb, 0x3d, + 0x6d, 0xbc, 0x45, 0xe3, 0x58, 0x8b, 0xa1, 0x03, 0xdb, 0x3d, 0xc5, 0x15, 0x6b, 0x9d, 0x87, 0x96, + 0xef, 0xf2, 0x4b, 0x1b, 0x6f, 0xcb, 0x2b, 0xb6, 0x4d, 0x08, 0xe4, 0x28, 0x1a, 0x58, 0xf1, 0x37, + 0xfb, 0x01, 0x6c, 0x24, 0xd6, 0xda, 0x0c, 0x75, 0x97, 0xc6, 0x3b, 0x2b, 0x0f, 0x9e, 0x49, 0xaf, + 0xd1, 0x92, 0xa8, 0x0c, 0xae, 0x02, 0xa5, 0xd7, 0x56, 0xc0, 0xd7, 0xd6, 0x83, 0x6f, 0xb4, 0xb6, + 0x06, 0xb4, 0xb6, 0x5e, 0x87, 0x92, 0xed, 0x86, 0x96, 0xff, 0xdc, 0x70, 0x1a, 0xef, 0x2e, 0xc9, + 0x80, 0x18, 0xc7, 0xee, 0x42, 0x31, 0x70, 0x6c, 0x64, 0x4c, 0x8d, 0xf7, 0x96, 0xc8, 0x22, 0x14, + 0xbb, 0x07, 0xe5, 0xf8, 0xc2, 0x61, 0xe3, 0xfd, 0x25, 0xba, 0x04, 0xc9, 0x6e, 0x41, 0xee, 0x0c, + 0xd7, 0xe3, 0xc3, 0xe5, 0x63, 0x0c, 0x84, 0xa3, 0xd2, 0x30, 0xb1, 0x1d, 0x87, 0x2b, 0x0d, 0x8f, + 0x96, 0x94, 0x86, 0x3d, 0xdb, 0x71, 0xb8, 0xd2, 0x30, 0x11, 0x5f, 0x28, 0x72, 0x29, 0x07, 0xf6, + 0xe4, 0x83, 0x65, 0x91, 0x8b, 0xb8, 0xa7, 0x74, 0x35, 0xb3, 0x12, 0x90, 0x6f, 0x9e, 0x1f, 0x31, + 0x7c, 0x28, 0x8f, 0x55, 0xda, 0x69, 0xaf, 0x41, 0x10, 0xa7, 0x51, 0xf3, 0x17, 0x27, 0x13, 0x68, + 0x52, 0x7f, 0xc4, 0x6f, 0x0c, 0x71, 0x08, 0xda, 0xd3, 0xef, 0x41, 0x2d, 0x0a, 0xc9, 0xc3, 0xea, + 0x82, 0xc6, 0xc7, 0x4b, 0x2d, 0x48, 0x13, 0xb0, 0x5d, 0xa8, 0x4e, 0x50, 0x89, 0x9c, 0x72, 0x9d, + 0xb2, 0xf1, 0x09, 0x35, 0x64, 0x3b, 0x12, 0xe7, 0x97, 0xe9, 0x9c, 0x5a, 0x2a, 0x17, 0x7b, 0x00, + 0xcc, 0x9e, 0xf0, 0xf9, 0x44, 0x1b, 0x9d, 0xeb, 0x8d, 0x8d, 0x4f, 0x69, 0x71, 0xae, 0xc0, 0xb0, + 0x47, 0x50, 0x0b, 0x2c, 0xd7, 0xd4, 0xa7, 0x81, 0x50, 0x4e, 0xbe, 0x47, 0xed, 0x14, 0x6c, 0x38, + 0xbe, 0x98, 0xac, 0x55, 0x90, 0xea, 0x20, 0xe0, 0x5a, 0xca, 0x23, 0xc0, 0x75, 0xfe, 0x3c, 0xc9, + 0xf4, 0x6b, 0x97, 0x64, 0x42, 0xaa, 0x28, 0xd3, 0x27, 0x50, 0x37, 0x2d, 0x73, 0x3e, 0xd3, 0x49, + 0xf7, 0xc3, 0x65, 0xf9, 0x7d, 0x99, 0x5f, 0xca, 0x6e, 0x55, 0xad, 0x6a, 0xca, 0x4e, 0xd6, 0x8f, + 0x61, 0x23, 0xf2, 0x7f, 0x86, 0xc2, 0x55, 0xfa, 0x03, 0xb9, 0xc2, 0xd8, 0xbd, 0xa9, 0xd5, 0xe6, + 0xd1, 0x67, 0xd4, 0x4e, 0x12, 0xf1, 0x81, 0x6b, 0xcc, 0x82, 0x13, 0x2f, 0x6c, 0xfc, 0xba, 0xac, + 0xad, 0x0c, 0x04, 0x54, 0xab, 0x22, 0x51, 0x94, 0x42, 0xd1, 0x95, 0x6c, 0xed, 0x71, 0x68, 0x35, + 0x7e, 0xc8, 0x45, 0x57, 0x0c, 0x6c, 0x85, 0x38, 0x6c, 0x60, 0xcc, 0x66, 0xce, 0x05, 0x5f, 0x8e, + 0x3f, 0xa2, 0xe5, 0xb8, 0x25, 0x2d, 0xc7, 0x26, 0x22, 0x69, 0x3d, 0x96, 0x8d, 0xe8, 0x93, 0x3d, + 0x84, 0xea, 0xcc, 0x0b, 0x42, 0xdd, 0x9c, 0x3a, 0xd4, 0xff, 0xa6, 0xcc, 0x0e, 0x0e, 0xbd, 0x20, + 0xdc, 0x9d, 0x3a, 0x24, 0xc0, 0x66, 0xf1, 0x37, 0xeb, 0xc2, 0x95, 0x14, 0xab, 0x37, 0xe8, 0x6c, + 0xbf, 0xb1, 0x43, 0x35, 0xde, 0x94, 0x6a, 0x94, 0x58, 0xbe, 0x88, 0x09, 0xdd, 0xf4, 0x16, 0x41, + 0x68, 0xf4, 0xf1, 0x39, 0x88, 0x03, 0xa3, 0x5b, 0x5c, 0x6f, 0x21, 0x68, 0x14, 0x19, 0xfd, 0x09, + 0x6c, 0x24, 0x54, 0xd8, 0xc1, 0xa0, 0xb1, 0x2b, 0xaf, 0x5e, 0xe9, 0xfa, 0x42, 0x2d, 0xca, 0x88, + 0xb0, 0x40, 0xfd, 0xf3, 0x3c, 0x94, 0x22, 0xbb, 0x83, 0x55, 0xa0, 0x78, 0xd4, 0x7b, 0xd2, 0xeb, + 0x3f, 0xeb, 0xf1, 0x0b, 0x92, 0xcd, 0xc1, 0xa0, 0xad, 0x0d, 0x15, 0x93, 0xd5, 0x01, 0xe8, 0x9a, + 0x94, 0x3e, 0x68, 0x35, 0x7b, 0xfc, 0xc2, 0x24, 0x5d, 0xce, 0xe2, 0xe9, 0x75, 0xb6, 0x09, 0xb5, + 0xbd, 0xa3, 0x1e, 0x85, 0x9e, 0x72, 0x50, 0x16, 0x41, 0xed, 0xcf, 0xf8, 0x21, 0x23, 0x07, 0xe5, + 0x10, 0x74, 0xd0, 0x1c, 0xb6, 0xb5, 0x4e, 0x04, 0xca, 0x53, 0x14, 0x6b, 0xff, 0x48, 0x6b, 0x89, + 0x92, 0x0a, 0xec, 0x2a, 0x6c, 0xc6, 0xd9, 0xa2, 0x22, 0x95, 0x22, 0xb6, 0xec, 0x50, 0xeb, 0xff, + 0xb8, 0xdd, 0x1a, 0x2a, 0x40, 0x27, 0x96, 0x8f, 0x1f, 0x2b, 0x15, 0x56, 0x85, 0xd2, 0x6e, 0x67, + 0x30, 0xec, 0xf4, 0x5a, 0x43, 0xa5, 0x8a, 0x0d, 0xde, 0xeb, 0x74, 0x87, 0x6d, 0x4d, 0xa9, 0xb1, + 0x12, 0xe4, 0x7e, 0xdc, 0xef, 0xf4, 0x94, 0x3a, 0x5d, 0x17, 0x6b, 0x1e, 0x1c, 0x76, 0xdb, 0xca, + 0x06, 0x42, 0x07, 0x7d, 0x6d, 0xa8, 0x28, 0x08, 0x7d, 0xd6, 0xe9, 0xed, 0xf6, 0x9f, 0x29, 0x9b, + 0xac, 0x0c, 0xf9, 0xa3, 0x1e, 0x56, 0xc3, 0x58, 0x0d, 0xca, 0xf4, 0xa9, 0x37, 0xbb, 0x5d, 0xe5, + 0x8a, 0x74, 0xcc, 0xb9, 0x85, 0x28, 0x3a, 0x34, 0x1d, 0x60, 0x1b, 0xae, 0x62, 0x5f, 0xe2, 0x24, + 0x51, 0x5f, 0xc3, 0x72, 0x0e, 0x3a, 0xbd, 0xa3, 0x81, 0xf2, 0x12, 0x12, 0xd3, 0x27, 0x61, 0x1a, + 0x58, 0x4e, 0xa7, 0x47, 0x43, 0x79, 0x0b, 0xbf, 0x77, 0xdb, 0xdd, 0xf6, 0xb0, 0xad, 0xdc, 0xc6, + 0x5e, 0x69, 0xed, 0xc3, 0x6e, 0xb3, 0xd5, 0x56, 0xb6, 0x31, 0xd1, 0xed, 0xb7, 0x9e, 0xe8, 0xfd, + 0x43, 0xe5, 0x0e, 0xdb, 0x02, 0xa5, 0xdf, 0xd3, 0x77, 0x8f, 0x0e, 0xbb, 0x9d, 0x56, 0x73, 0xd8, + 0xd6, 0x9f, 0xb4, 0x3f, 0x57, 0x54, 0x1c, 0xf6, 0x43, 0xad, 0xad, 0x8b, 0xb2, 0x5e, 0x8d, 0xd2, + 0xa2, 0xbc, 0xbb, 0x4c, 0x81, 0xea, 0xde, 0xd1, 0x4f, 0x7f, 0xfa, 0xb9, 0x2e, 0xc6, 0xe1, 0x35, + 0x6c, 0x66, 0x92, 0x43, 0x3f, 0x7a, 0xa2, 0xbc, 0xbe, 0x00, 0x1a, 0x3c, 0x51, 0xde, 0xc0, 0x71, + 0x8c, 0x26, 0x46, 0xb9, 0x87, 0x04, 0x5a, 0xbb, 0x75, 0xa4, 0x0d, 0x3a, 0x4f, 0xdb, 0x7a, 0x6b, + 0xd8, 0x56, 0xde, 0xa4, 0x81, 0xeb, 0xf4, 0x9e, 0x28, 0xf7, 0xb1, 0x67, 0xf8, 0xc5, 0xa7, 0xeb, + 0x2d, 0xc6, 0xa0, 0x9e, 0xd0, 0x12, 0xec, 0x6d, 0x24, 0xd9, 0xd1, 0xfa, 0xcd, 0xdd, 0x56, 0x73, + 0x30, 0x54, 0xde, 0xc1, 0x61, 0x19, 0x1c, 0x76, 0x3b, 0x43, 0xe5, 0x01, 0xf6, 0xfd, 0x71, 0x73, + 0xb8, 0xdf, 0xd6, 0x94, 0x77, 0x71, 0xe6, 0x87, 0x9d, 0x83, 0xb6, 0x2e, 0xa6, 0xe1, 0x21, 0xd6, + 0xb1, 0xd7, 0xe9, 0x76, 0x95, 0x47, 0x74, 0xb2, 0xd7, 0xd4, 0x86, 0x1d, 0x9a, 0xfb, 0x0f, 0xb0, + 0x80, 0xe6, 0xe1, 0x61, 0xf7, 0x73, 0xe5, 0x43, 0xec, 0xe0, 0xc1, 0x51, 0x77, 0xd8, 0xd1, 0x8f, + 0x0e, 0x77, 0x9b, 0xc3, 0xb6, 0xf2, 0x11, 0x2d, 0x8c, 0xfe, 0x60, 0xb8, 0x7b, 0xd0, 0x55, 0x3e, + 0x56, 0x7f, 0x13, 0x4a, 0x91, 0x29, 0x8a, 0xb9, 0x3a, 0xbd, 0x5e, 0x5b, 0x53, 0xd6, 0xb0, 0xe4, + 0x6e, 0x7b, 0x6f, 0xa8, 0x64, 0xe8, 0x54, 0xb3, 0xf3, 0x78, 0x7f, 0xa8, 0xac, 0xe3, 0x67, 0xff, + 0x08, 0x07, 0x29, 0x4b, 0xbd, 0x6b, 0x1f, 0x74, 0x94, 0x1c, 0x7e, 0x35, 0x7b, 0xc3, 0x8e, 0x92, + 0xa7, 0x65, 0xd3, 0xe9, 0x3d, 0xee, 0xb6, 0x95, 0x02, 0x42, 0x0f, 0x9a, 0xda, 0x13, 0xa5, 0xc8, + 0x0b, 0xdd, 0x6d, 0x7f, 0xa6, 0x94, 0x58, 0x01, 0xd6, 0xbb, 0x0f, 0x95, 0x32, 0x82, 0x76, 0xdb, + 0xbb, 0x47, 0x87, 0x0a, 0xa8, 0xf7, 0xa0, 0xd8, 0x3c, 0x3e, 0x3e, 0x40, 0x4b, 0x1f, 0x3b, 0x73, + 0xd4, 0xed, 0xf2, 0x6d, 0xb4, 0xd3, 0x1f, 0x0e, 0xfb, 0x07, 0x4a, 0x06, 0x17, 0xee, 0xb0, 0x7f, + 0xa8, 0xac, 0xab, 0x1d, 0x28, 0x45, 0xe2, 0x4f, 0xba, 0x01, 0x59, 0x82, 0xdc, 0xa1, 0xd6, 0x7e, + 0xca, 0x8f, 0xe2, 0x7b, 0xed, 0xcf, 0xb0, 0x99, 0xf8, 0x85, 0x05, 0x65, 0xb1, 0x22, 0x7e, 0x55, + 0x91, 0xae, 0x40, 0x76, 0x3b, 0xbd, 0x76, 0x53, 0x53, 0xf2, 0xea, 0x87, 0xa9, 0x53, 0x4e, 0xc1, + 0x35, 0xb0, 0xfa, 0x66, 0x47, 0x54, 0xdf, 0x79, 0xdc, 0xeb, 0x6b, 0x6d, 0x7e, 0xa7, 0x52, 0x8c, + 0xdb, 0xba, 0xfa, 0x16, 0x94, 0x63, 0x8e, 0x87, 0xeb, 0xa8, 0xa5, 0xf5, 0x07, 0x03, 0x3e, 0xcc, + 0x6b, 0x98, 0xa6, 0xb1, 0xe1, 0xe9, 0x8c, 0xfa, 0xff, 0x42, 0x29, 0x66, 0xb6, 0x77, 0x61, 0x7d, + 0x38, 0x10, 0x5e, 0xfc, 0xad, 0x07, 0xc9, 0xa3, 0x1e, 0xc3, 0xe8, 0x4b, 0x5b, 0x1f, 0x0e, 0xd8, + 0xdb, 0x50, 0xe0, 0x57, 0x7a, 0xc5, 0x41, 0xd4, 0x56, 0x9a, 0x81, 0x0f, 0x09, 0xa7, 0x09, 0x1a, + 0xb5, 0x0b, 0xf5, 0x34, 0x86, 0xdd, 0x02, 0xe0, 0x38, 0xc9, 0x23, 0x23, 0x41, 0xd8, 0x0d, 0x88, + 0xae, 0x0c, 0xef, 0x8a, 0x68, 0xd5, 0x38, 0xad, 0xfe, 0x83, 0x2c, 0x40, 0xa2, 0xaa, 0xa1, 0x32, + 0x18, 0xfb, 0x5b, 0xf2, 0xe2, 0x4c, 0xfa, 0x65, 0x28, 0x3b, 0x9e, 0x61, 0xca, 0x8f, 0x73, 0x94, + 0x10, 0x40, 0xa3, 0x21, 0x5f, 0x9f, 0x2b, 0xf3, 0x80, 0x10, 0x76, 0x0d, 0x0a, 0x13, 0xcf, 0x9f, + 0x1a, 0x51, 0x5c, 0xab, 0x48, 0xa1, 0xe8, 0xe1, 0xe7, 0xa4, 0xa8, 0xb0, 0xba, 0x74, 0x35, 0x85, + 0x82, 0xa4, 0x05, 0xb0, 0x8b, 0x30, 0x34, 0x69, 0x2c, 0x77, 0xec, 0x78, 0x81, 0x65, 0xa2, 0xd5, + 0x5f, 0x20, 0xad, 0x14, 0x22, 0xd0, 0xce, 0x05, 0xef, 0xad, 0x3f, 0xb5, 0x5d, 0x23, 0x14, 0xae, + 0x6a, 0xea, 0x6d, 0x04, 0xc1, 0xe6, 0x7e, 0x11, 0x78, 0xc2, 0xfd, 0xc2, 0x8f, 0x5c, 0x4b, 0x08, + 0xa0, 0xe6, 0xbe, 0x02, 0x60, 0x05, 0x63, 0x63, 0xc6, 0x0b, 0x2f, 0x53, 0xe1, 0x65, 0x01, 0xd9, + 0xb9, 0x60, 0x5d, 0xa8, 0x0f, 0x47, 0xc8, 0xee, 0x3d, 0xb4, 0xa4, 0x5b, 0x9e, 0x23, 0x1c, 0x23, + 0x77, 0x17, 0x75, 0xda, 0x07, 0x69, 0x32, 0x7e, 0x36, 0xbc, 0x90, 0xf7, 0x46, 0x13, 0xae, 0xac, + 0x20, 0xfb, 0x56, 0x51, 0x6f, 0x4e, 0x34, 0x3b, 0xcd, 0x30, 0xa4, 0xc8, 0xe9, 0x58, 0xb2, 0x65, + 0xa2, 0x90, 0x61, 0x2e, 0xd4, 0x5e, 0xa6, 0x30, 0x18, 0x11, 0xdf, 0x28, 0x26, 0x29, 0x8e, 0x5b, + 0x7c, 0x1d, 0x36, 0x10, 0x39, 0xb1, 0x2d, 0xc7, 0x14, 0x24, 0xfc, 0x26, 0x53, 0x6d, 0xec, 0x39, + 0x7b, 0x08, 0x25, 0x3a, 0xf5, 0xaf, 0x72, 0x00, 0x89, 0x19, 0x94, 0x3a, 0x9e, 0xce, 0xa4, 0x8f, + 0xa7, 0x1f, 0xc2, 0x35, 0x71, 0xcf, 0x2d, 0x3e, 0xe3, 0xb5, 0x5d, 0x7d, 0x64, 0x44, 0x91, 0x00, + 0x4c, 0x60, 0xf9, 0x31, 0x6f, 0xc7, 0xdd, 0x31, 0x50, 0x43, 0xda, 0x90, 0xf3, 0x84, 0x17, 0xb3, + 0x74, 0x24, 0x83, 0x2c, 0x77, 0x93, 0xec, 0xc3, 0x8b, 0x19, 0x7b, 0x0f, 0xae, 0xfa, 0xd6, 0xc4, + 0xb7, 0x82, 0x13, 0x3d, 0x0c, 0xe4, 0xca, 0x78, 0x78, 0xdd, 0xa6, 0x40, 0x0e, 0x83, 0xb8, 0xae, + 0xf7, 0xe0, 0xaa, 0x30, 0x90, 0x16, 0x9a, 0xc7, 0x4f, 0x54, 0x37, 0x39, 0x52, 0x6e, 0xdd, 0x2b, + 0x00, 0xc2, 0x36, 0x8c, 0x9e, 0xb8, 0x29, 0x69, 0x65, 0x6e, 0x07, 0xa2, 0x31, 0xff, 0x36, 0x30, + 0x3b, 0xd0, 0x17, 0x0e, 0xa7, 0xc4, 0x79, 0xbf, 0x62, 0x07, 0x87, 0xa9, 0x83, 0xa9, 0xcb, 0xce, + 0xbd, 0x4a, 0x97, 0x9d, 0x7b, 0x6d, 0x41, 0x9e, 0xcc, 0x47, 0x71, 0x0c, 0xc5, 0x13, 0x4c, 0x85, + 0x1c, 0xf2, 0x47, 0x3a, 0x32, 0xa9, 0x3f, 0xac, 0x3f, 0xa0, 0x07, 0x82, 0x70, 0x7e, 0x10, 0xaa, + 0x11, 0x8e, 0xbd, 0x03, 0x57, 0xe4, 0x41, 0x8d, 0x5e, 0xbf, 0xa8, 0x50, 0x37, 0x95, 0x64, 0x18, + 0x35, 0xfe, 0x0e, 0xc6, 0x5b, 0xc0, 0xa4, 0x71, 0x89, 0xa8, 0xab, 0xfc, 0xe8, 0x38, 0x1e, 0x14, + 0x41, 0xfc, 0x06, 0xd0, 0x00, 0x70, 0x0f, 0x75, 0x6d, 0xd9, 0x58, 0x42, 0x24, 0x79, 0xb3, 0xdf, + 0x83, 0xab, 0xc9, 0xd8, 0xe9, 0x46, 0xa8, 0x87, 0x27, 0x96, 0x6e, 0xb9, 0x26, 0x5d, 0x7d, 0x2c, + 0x69, 0x9b, 0xf1, 0x30, 0x36, 0xc3, 0xe1, 0x89, 0xd5, 0x76, 0x4d, 0xf5, 0xf7, 0x33, 0x50, 0x4f, + 0x5b, 0x6a, 0x3c, 0x1c, 0x3e, 0x89, 0xf3, 0xcf, 0x27, 0xb1, 0xfd, 0x2f, 0x43, 0x79, 0x76, 0x2a, + 0x82, 0xfa, 0xa3, 0xb5, 0x3d, 0x3b, 0xe5, 0xc1, 0xfc, 0xec, 0x4d, 0x28, 0xce, 0x4e, 0xf9, 0x66, + 0xbf, 0x6c, 0x35, 0x15, 0x66, 0x3c, 0xce, 0xf6, 0x4d, 0x28, 0xce, 0x05, 0x69, 0xee, 0x32, 0xd2, + 0x39, 0x91, 0xaa, 0xdb, 0x50, 0x95, 0x7d, 0x23, 0xb8, 0x67, 0xd1, 0x0e, 0xe2, 0x0d, 0xc3, 0x4f, + 0xf5, 0xb7, 0xd6, 0x89, 0xe4, 0x5b, 0x1d, 0x78, 0x7f, 0xab, 0xa0, 0x83, 0x6d, 0x0a, 0x0c, 0xd4, + 0x29, 0xec, 0x77, 0xec, 0x45, 0xef, 0xb6, 0xc0, 0x89, 0x11, 0x34, 0xe7, 0xa1, 0xd7, 0xf2, 0x9c, + 0xe8, 0xd1, 0x02, 0x7e, 0x8f, 0x2a, 0x17, 0x3f, 0x5a, 0xc0, 0xaf, 0x58, 0xbe, 0x27, 0x2e, 0x1b, + 0xd1, 0x4d, 0x3f, 0x0a, 0x77, 0xc9, 0x2f, 0xcd, 0x60, 0x35, 0xba, 0xe8, 0x47, 0x91, 0x2c, 0x0f, + 0x61, 0x23, 0x89, 0xec, 0x8e, 0x22, 0x64, 0x16, 0xb3, 0xd4, 0xe2, 0xb0, 0x6e, 0x4c, 0xaa, 0xbf, + 0x93, 0x81, 0xcd, 0x25, 0x57, 0x03, 0x8e, 0x56, 0xf2, 0xc4, 0x13, 0x7e, 0xb2, 0x3b, 0x50, 0x9d, + 0x1a, 0xe1, 0xf8, 0x44, 0x9f, 0xf9, 0xd6, 0xc4, 0x3e, 0x8f, 0xde, 0xa9, 0x22, 0xd8, 0x21, 0x81, + 0x28, 0xda, 0x67, 0x36, 0x23, 0x07, 0xcb, 0xd4, 0x0e, 0x05, 0x83, 0x02, 0x02, 0x75, 0xc9, 0x79, + 0x1b, 0x45, 0x02, 0xe6, 0x2e, 0x09, 0x5c, 0xbc, 0x09, 0x85, 0x4e, 0xec, 0xd2, 0x88, 0xc3, 0x55, + 0xb2, 0xe2, 0x99, 0x16, 0x0f, 0xca, 0x2d, 0x7a, 0xf2, 0xe5, 0xc0, 0x98, 0xb1, 0xfb, 0x90, 0x9d, + 0x1a, 0x33, 0x11, 0xce, 0xd2, 0x88, 0x4f, 0x24, 0x38, 0xf6, 0xc1, 0x81, 0x31, 0xe3, 0x0c, 0x1d, + 0x89, 0x6e, 0x7c, 0x04, 0xa5, 0x08, 0xf0, 0xad, 0x58, 0xf7, 0x7f, 0xc9, 0x42, 0x79, 0x57, 0x76, + 0x7e, 0xa2, 0xa9, 0x16, 0xfa, 0x73, 0x17, 0x55, 0x8f, 0xe8, 0x81, 0x8b, 0xb1, 0xe1, 0x0e, 0x05, + 0x28, 0x5a, 0x40, 0xeb, 0x5f, 0xb3, 0x80, 0x6e, 0x02, 0xf8, 0x64, 0x92, 0x93, 0x55, 0x9e, 0x8d, + 0x43, 0x27, 0x3b, 0xa6, 0x08, 0x0b, 0x59, 0x8e, 0x08, 0xc8, 0x7d, 0xf3, 0x88, 0x80, 0xfc, 0xca, + 0x88, 0x80, 0xff, 0x63, 0xce, 0xf0, 0x5f, 0x4f, 0xe4, 0x07, 0xae, 0x69, 0x24, 0x2b, 0x73, 0x29, + 0x36, 0x8b, 0xaf, 0x5f, 0x20, 0xdd, 0xf7, 0xa0, 0x1e, 0x0d, 0xb3, 0xe8, 0x18, 0xa4, 0x6e, 0x7c, + 0x08, 0x1c, 0xf7, 0xeb, 0xd6, 0x42, 0x39, 0x99, 0xde, 0xa1, 0x95, 0xaf, 0xdf, 0xa1, 0xea, 0x1f, + 0x64, 0x80, 0x09, 0xbb, 0x76, 0x6f, 0xee, 0x38, 0x43, 0xeb, 0x9c, 0x18, 0xc1, 0x7d, 0xd8, 0x14, + 0x4e, 0x59, 0x29, 0xf6, 0x4b, 0x9c, 0x93, 0x71, 0x44, 0x72, 0x4e, 0xb6, 0xea, 0xb2, 0xeb, 0xfa, + 0xca, 0xcb, 0xae, 0xab, 0x2f, 0xd1, 0xde, 0x86, 0x8a, 0x7c, 0x55, 0x94, 0xeb, 0x5b, 0x60, 0x24, + 0xb7, 0x44, 0xff, 0xe3, 0x3a, 0x40, 0x62, 0x7b, 0xff, 0xaa, 0xe3, 0x4a, 0x56, 0x4c, 0x49, 0x76, + 0xd5, 0x94, 0xdc, 0x03, 0x45, 0xa6, 0x93, 0xee, 0x2c, 0xd7, 0x13, 0xc2, 0x48, 0x8f, 0xb1, 0x03, + 0xf9, 0x5e, 0x29, 0xf1, 0x34, 0x71, 0x64, 0x2d, 0x62, 0xed, 0x88, 0xe5, 0x0a, 0x11, 0x5d, 0xb2, + 0x03, 0xce, 0x82, 0xd9, 0xa7, 0x70, 0x3d, 0xce, 0xa9, 0x9f, 0xd9, 0xe1, 0x89, 0x37, 0x0f, 0x85, + 0x97, 0x34, 0x10, 0x82, 0xfa, 0x5a, 0x54, 0xd2, 0x33, 0x8e, 0xe6, 0x2c, 0x2b, 0x60, 0x1f, 0x42, + 0x79, 0x32, 0x77, 0x1c, 0x3d, 0xb4, 0xce, 0x43, 0x11, 0x80, 0xdd, 0x48, 0xb9, 0x2d, 0xa4, 0xe9, + 0xd5, 0x4a, 0x13, 0x91, 0x50, 0xff, 0xe7, 0x3a, 0xe4, 0x7f, 0x32, 0xb7, 0xfc, 0x0b, 0xf6, 0x11, + 0x94, 0x83, 0x70, 0x1a, 0xca, 0x67, 0x95, 0xd7, 0x79, 0x01, 0x84, 0xa7, 0xa3, 0x46, 0x6b, 0x6a, + 0xb9, 0x21, 0xf7, 0xe1, 0x21, 0x2d, 0x49, 0xa4, 0x2d, 0xc8, 0x07, 0xa1, 0x35, 0x0b, 0x44, 0x6c, + 0x1c, 0x4f, 0xb0, 0x6d, 0xc8, 0xbb, 0x9e, 0x69, 0x05, 0xe9, 0x08, 0xb8, 0x1e, 0x0a, 0x7d, 0x8e, + 0x60, 0x2a, 0x14, 0xe2, 0x19, 0x5f, 0x3a, 0x2f, 0xe4, 0x18, 0xba, 0xc1, 0x60, 0x19, 0xa6, 0xed, + 0x1e, 0x47, 0x77, 0xc0, 0xe3, 0x34, 0xca, 0x5a, 0xd2, 0xe0, 0x8d, 0xe3, 0xe8, 0x41, 0x06, 0x91, + 0x64, 0xdb, 0x50, 0xc1, 0xcf, 0x67, 0xbe, 0x1d, 0x5a, 0x83, 0x47, 0x62, 0xdc, 0x64, 0x10, 0xea, + 0xdf, 0xa6, 0x15, 0x5a, 0xe3, 0x70, 0xf0, 0xa5, 0x08, 0x0d, 0xa3, 0x98, 0x9f, 0x08, 0xa2, 0x9a, + 0x50, 0x4b, 0x75, 0x77, 0xc9, 0x51, 0x32, 0x68, 0x77, 0xdb, 0xad, 0x21, 0x37, 0xb1, 0x84, 0x75, + 0xbe, 0x2e, 0x5b, 0xf7, 0x59, 0xc9, 0xec, 0xcf, 0x49, 0x76, 0x58, 0x9e, 0x9c, 0x06, 0x6d, 0xed, + 0x71, 0x5b, 0x29, 0xa8, 0x7f, 0xb8, 0x0e, 0x9b, 0x43, 0xdf, 0x70, 0x03, 0x83, 0x5f, 0xec, 0x73, + 0x43, 0xdf, 0x73, 0xd8, 0xf7, 0xa0, 0x14, 0x8e, 0x1d, 0x79, 0x1a, 0x6e, 0x47, 0x9b, 0x7e, 0x81, + 0xf4, 0xc1, 0x70, 0xcc, 0x1d, 0xaa, 0xc5, 0x90, 0x7f, 0xb0, 0x77, 0x20, 0x3f, 0xb2, 0x8e, 0x6d, + 0x57, 0x30, 0xe0, 0xab, 0x8b, 0x19, 0x77, 0x10, 0xb9, 0xbf, 0xa6, 0x71, 0x2a, 0xf6, 0x1e, 0x14, + 0xc6, 0xde, 0x34, 0x92, 0x54, 0xc9, 0x1d, 0x24, 0xa9, 0x22, 0xc4, 0xee, 0xaf, 0x69, 0x82, 0x8e, + 0x7d, 0x04, 0x25, 0xdf, 0x73, 0x9c, 0x91, 0x31, 0x3e, 0x15, 0x32, 0xac, 0xb1, 0x98, 0x47, 0x13, + 0xf8, 0xfd, 0x35, 0x2d, 0xa6, 0x55, 0x1f, 0x40, 0x51, 0x34, 0x16, 0x07, 0x60, 0xa7, 0xfd, 0xb8, + 0x23, 0x06, 0xb2, 0xd5, 0x3f, 0x38, 0xe8, 0x0c, 0xf9, 0x65, 0x67, 0xad, 0xdf, 0xed, 0xee, 0x34, + 0x5b, 0x4f, 0x94, 0xf5, 0x9d, 0x12, 0x14, 0xb8, 0x1b, 0x4d, 0xfd, 0xed, 0x0c, 0x6c, 0x2c, 0x74, + 0x80, 0x7d, 0x02, 0xb9, 0x29, 0x2a, 0x95, 0x7c, 0x78, 0xee, 0xae, 0xec, 0xa5, 0x94, 0xe6, 0xaa, + 0x26, 0xe6, 0x50, 0x3f, 0x85, 0x7a, 0x1a, 0x2e, 0x59, 0xe3, 0x35, 0x28, 0x6b, 0xed, 0xe6, 0xae, + 0xde, 0xef, 0xa1, 0x0d, 0x8c, 0x36, 0x31, 0x25, 0x9f, 0x69, 0x1d, 0x32, 0xa0, 0x7f, 0x03, 0x94, + 0xc5, 0x81, 0x61, 0x8f, 0xd1, 0x28, 0x99, 0xce, 0x1c, 0x8b, 0x0b, 0x8a, 0x64, 0xca, 0x6e, 0xad, + 0x18, 0x49, 0x41, 0x46, 0x33, 0x56, 0x1f, 0xa7, 0xd2, 0xea, 0xff, 0x03, 0x6c, 0x79, 0x04, 0x7f, + 0x75, 0xc5, 0xff, 0x8f, 0x0c, 0xe4, 0x0e, 0x1d, 0xc3, 0x65, 0xaf, 0x42, 0x9e, 0x1e, 0xe9, 0x11, + 0xdc, 0xb3, 0x22, 0x6d, 0x70, 0x5c, 0x16, 0x84, 0x63, 0x6f, 0x41, 0x36, 0x1c, 0x47, 0x17, 0xbb, + 0x5f, 0xba, 0x64, 0xf1, 0xed, 0xaf, 0x69, 0x48, 0xc5, 0xee, 0x41, 0xd6, 0x34, 0xa3, 0x78, 0x6e, + 0x61, 0xf5, 0xa3, 0xa9, 0xb8, 0x6b, 0x4d, 0x6c, 0xd7, 0x16, 0x8f, 0x0a, 0x21, 0x09, 0x7b, 0x0d, + 0xb2, 0xe6, 0xd8, 0x49, 0x07, 0xe7, 0x73, 0xa3, 0x32, 0x2e, 0xd0, 0x1c, 0x3b, 0x4c, 0x85, 0x5a, + 0xe8, 0x5f, 0xe8, 0xfe, 0xdc, 0xa5, 0x68, 0xa8, 0x40, 0x98, 0x3b, 0x15, 0x54, 0x66, 0xe6, 0x14, + 0x52, 0x15, 0x88, 0x0b, 0x62, 0x33, 0xdf, 0x9a, 0x19, 0x7e, 0x6c, 0xe8, 0xd8, 0xc1, 0x21, 0x07, + 0xec, 0x14, 0x80, 0x5e, 0x2f, 0x55, 0xdf, 0xa6, 0x17, 0x64, 0x50, 0xc3, 0x56, 0xa3, 0xaf, 0x15, + 0xf7, 0x6f, 0x05, 0x46, 0xfd, 0xcb, 0x2c, 0x54, 0xa4, 0xf6, 0xb0, 0x0f, 0xa0, 0x64, 0xa6, 0x37, + 0xe2, 0xf5, 0xa5, 0x46, 0x3f, 0xd8, 0x8d, 0xb6, 0xa0, 0x29, 0x96, 0xf7, 0xa7, 0x50, 0x0b, 0xac, + 0x50, 0x7f, 0x6e, 0xf8, 0x36, 0x7f, 0x37, 0x6c, 0x5d, 0x76, 0xa1, 0x0f, 0xac, 0xf0, 0x69, 0x84, + 0xd9, 0x5f, 0xd3, 0xaa, 0x81, 0x94, 0x26, 0x33, 0x40, 0x74, 0x29, 0x9b, 0x7a, 0x5b, 0x8d, 0x03, + 0xf7, 0xd7, 0xb4, 0x08, 0x8f, 0xa4, 0xd6, 0xb9, 0x35, 0x9e, 0x87, 0x91, 0x19, 0x50, 0x8b, 0x3a, + 0x44, 0x40, 0x7a, 0xc6, 0x91, 0x7f, 0xb2, 0x87, 0xc8, 0xeb, 0x0c, 0xc7, 0xf1, 0x48, 0x67, 0xcb, + 0xcb, 0x0e, 0xed, 0xdd, 0x18, 0xce, 0x9f, 0x8d, 0x8c, 0x52, 0xec, 0x75, 0xc8, 0x7b, 0xe1, 0x89, + 0x15, 0x29, 0xcf, 0xd1, 0x5b, 0x34, 0x08, 0xda, 0x6d, 0x75, 0x71, 0xa5, 0x10, 0x5a, 0xfd, 0x79, + 0x06, 0x8a, 0x62, 0x04, 0xd8, 0x26, 0xd4, 0x06, 0xed, 0xa1, 0xfe, 0xb4, 0xa9, 0x75, 0x9a, 0x3b, + 0xdd, 0xb6, 0xb8, 0x53, 0xf0, 0x58, 0x6b, 0xf6, 0x04, 0x9f, 0xd4, 0xda, 0x4f, 0xfb, 0x4f, 0xda, + 0xdc, 0xc5, 0xb5, 0xdb, 0xee, 0x7d, 0xae, 0x64, 0xb9, 0x97, 0xb7, 0x7d, 0xd8, 0xd4, 0x90, 0x4b, + 0x56, 0xa0, 0xd8, 0xfe, 0xac, 0xdd, 0x3a, 0x22, 0x36, 0x59, 0x07, 0xd8, 0x6d, 0x37, 0xbb, 0xdd, + 0x7e, 0x0b, 0xd9, 0x66, 0x81, 0x31, 0xa8, 0xb7, 0xb4, 0x76, 0x73, 0xd8, 0xd6, 0x9b, 0xad, 0x56, + 0xff, 0xa8, 0x37, 0x54, 0x8a, 0x58, 0x63, 0xb3, 0x3b, 0x6c, 0x6b, 0x31, 0x88, 0xde, 0x07, 0xdb, + 0xd5, 0xfa, 0x87, 0x31, 0xa4, 0xbc, 0x53, 0x46, 0x93, 0x8c, 0xe6, 0x4a, 0xfd, 0xab, 0x3a, 0xd4, + 0xd3, 0x4b, 0x93, 0x7d, 0x0c, 0x25, 0xd3, 0x4c, 0xcd, 0xf1, 0xcd, 0x55, 0x4b, 0xf8, 0xc1, 0xae, + 0x19, 0x4d, 0x33, 0xff, 0x60, 0x77, 0xa2, 0x8d, 0xb4, 0xbe, 0xb4, 0x91, 0xa2, 0x6d, 0xf4, 0x43, + 0xd8, 0x10, 0x6f, 0xb9, 0x98, 0x46, 0x68, 0x8c, 0x8c, 0xc0, 0x4a, 0xef, 0x92, 0x16, 0x21, 0x77, + 0x05, 0x6e, 0x7f, 0x4d, 0xab, 0x8f, 0x53, 0x10, 0xf6, 0x7d, 0xa8, 0x1b, 0x64, 0xe7, 0xc6, 0xf9, + 0x73, 0xb2, 0x12, 0xd8, 0x44, 0x9c, 0x94, 0xbd, 0x66, 0xc8, 0x00, 0x5c, 0x88, 0xa6, 0xef, 0xcd, + 0x92, 0xcc, 0xf9, 0xd4, 0x59, 0x8e, 0xef, 0xcd, 0xa4, 0xbc, 0x55, 0x53, 0x4a, 0xb3, 0x8f, 0xa0, + 0x2a, 0x5a, 0x9e, 0x78, 0x12, 0xe2, 0x2d, 0xcb, 0x9b, 0x4d, 0x4a, 0xdd, 0xfe, 0x9a, 0x56, 0x19, + 0x27, 0x49, 0xf6, 0x08, 0x35, 0xb9, 0x44, 0x17, 0x2f, 0xca, 0x6b, 0x8d, 0x5a, 0x1b, 0xe5, 0x02, + 0x23, 0x4e, 0xb1, 0xf7, 0x00, 0xa8, 0x9d, 0x3c, 0x4f, 0x29, 0x15, 0x82, 0xe1, 0x7b, 0xb3, 0x28, + 0x4b, 0xd9, 0x8c, 0x12, 0x52, 0xf3, 0xb8, 0x1f, 0xa8, 0xbc, 0xdc, 0x3c, 0xf2, 0x05, 0x25, 0xcd, + 0xe3, 0x2e, 0xa4, 0xb8, 0x79, 0x3c, 0x1b, 0x2c, 0x35, 0x2f, 0xca, 0xc5, 0x9b, 0xc7, 0x33, 0x45, + 0xcd, 0xe3, 0x79, 0x2a, 0x8b, 0xcd, 0x8b, 0xb2, 0x50, 0xf3, 0x78, 0x8e, 0xef, 0x2f, 0xe9, 0xee, + 0xd5, 0x4b, 0x75, 0x77, 0x9c, 0xb6, 0xb4, 0xf6, 0xfe, 0x7d, 0xa8, 0x07, 0x27, 0xde, 0x99, 0xc4, + 0x40, 0x6a, 0x72, 0xee, 0xc1, 0x89, 0x77, 0x26, 0x73, 0x90, 0x5a, 0x20, 0x03, 0xb0, 0xb5, 0xbc, + 0x8b, 0x74, 0xd9, 0xbd, 0x2e, 0xb7, 0x96, 0x7a, 0xf8, 0xd4, 0xb6, 0xce, 0xb0, 0xb5, 0x46, 0x94, + 0xc0, 0x41, 0x49, 0xfc, 0x1e, 0x81, 0x08, 0x3b, 0x4a, 0x85, 0x13, 0x88, 0x9a, 0x20, 0xf6, 0x80, + 0x04, 0xb8, 0xb6, 0xe6, 0xae, 0x9c, 0x4d, 0x91, 0xd7, 0xd6, 0x91, 0x9b, 0xca, 0x58, 0xe5, 0xa4, + 0x22, 0x6b, 0xb2, 0x2b, 0x02, 0xeb, 0xcb, 0xb9, 0xe5, 0x8e, 0x2d, 0x11, 0xa0, 0x94, 0xda, 0x15, + 0x03, 0x81, 0x4b, 0x76, 0x45, 0x04, 0x89, 0xd7, 0x75, 0x9c, 0x9d, 0x2d, 0xae, 0x6b, 0x29, 0x33, + 0xad, 0xeb, 0x38, 0x6b, 0xbc, 0xa1, 0xe2, 0xbc, 0x57, 0x96, 0x36, 0x94, 0x94, 0x99, 0x6f, 0xa8, + 0x38, 0xf7, 0x23, 0x10, 0xab, 0x89, 0x0f, 0x6e, 0x2a, 0x8c, 0x89, 0xb7, 0x5a, 0x8c, 0x2e, 0x8c, + 0xe3, 0x14, 0xae, 0x55, 0xdf, 0x42, 0x5b, 0x41, 0x2c, 0x85, 0xab, 0xf2, 0x5a, 0xd5, 0x08, 0x13, + 0x6f, 0x25, 0x3f, 0x49, 0xaa, 0x7f, 0x9c, 0x87, 0xa2, 0x60, 0x3a, 0xec, 0x0a, 0x6c, 0x08, 0xde, + 0xb7, 0xdb, 0x1c, 0x36, 0x77, 0x9a, 0x03, 0xd4, 0x56, 0x18, 0xd4, 0x39, 0xf3, 0x8b, 0x61, 0x19, + 0x64, 0x88, 0xc4, 0xfd, 0x62, 0xd0, 0x3a, 0x32, 0x44, 0x91, 0x97, 0x3f, 0xae, 0x98, 0x65, 0x1b, + 0x50, 0xe1, 0x19, 0x39, 0x80, 0xee, 0xfa, 0x51, 0x2e, 0x9e, 0xce, 0x4b, 0x59, 0xf8, 0xd1, 0x47, + 0x21, 0xc9, 0xc2, 0x01, 0xc5, 0x38, 0x4b, 0x74, 0x36, 0xc2, 0xa0, 0x3e, 0xd4, 0x8e, 0x7a, 0xad, + 0xa4, 0x9e, 0x32, 0xdd, 0xcf, 0xe2, 0xc5, 0x3c, 0xed, 0xb4, 0x9f, 0x29, 0x80, 0x99, 0x78, 0x29, + 0x94, 0xae, 0xa0, 0xbe, 0x45, 0x85, 0x50, 0xb2, 0xca, 0x5e, 0x82, 0x2b, 0x83, 0xfd, 0xfe, 0x33, + 0x9d, 0x67, 0x8a, 0xbb, 0x50, 0x63, 0x5b, 0xa0, 0x48, 0x08, 0x5e, 0x7c, 0x1d, 0xab, 0x24, 0x68, + 0x44, 0x38, 0x50, 0x36, 0xe8, 0x70, 0x11, 0x61, 0x43, 0x2e, 0x80, 0x14, 0xec, 0x0a, 0xcf, 0xda, + 0xef, 0x1e, 0x1d, 0xf4, 0x06, 0xca, 0x26, 0x36, 0x82, 0x20, 0xbc, 0xe5, 0x2c, 0x2e, 0x26, 0x11, + 0x5b, 0x57, 0x48, 0x92, 0x21, 0xec, 0x59, 0x53, 0xeb, 0x75, 0x7a, 0x8f, 0x07, 0xca, 0x56, 0x5c, + 0x72, 0x5b, 0xd3, 0xfa, 0xda, 0x40, 0xb9, 0x1a, 0x03, 0x06, 0xc3, 0xe6, 0xf0, 0x68, 0xa0, 0x5c, + 0x8b, 0x5b, 0x79, 0xa8, 0xf5, 0x5b, 0xed, 0xc1, 0xa0, 0xdb, 0x19, 0x0c, 0x95, 0x97, 0xd8, 0x55, + 0xd8, 0x4c, 0x5a, 0x14, 0x11, 0x37, 0xa4, 0x86, 0x6a, 0x8f, 0xdb, 0x43, 0xe5, 0x7a, 0xdc, 0x8c, + 0x56, 0xbf, 0xdb, 0x6d, 0xd2, 0x31, 0xd8, 0x0d, 0x24, 0xa2, 0xf3, 0x41, 0xd1, 0x9b, 0x97, 0xb1, + 0x5d, 0x47, 0x3d, 0x19, 0x74, 0x53, 0x5a, 0x1a, 0x83, 0xf6, 0x4f, 0x8e, 0xda, 0xbd, 0x56, 0x5b, + 0x79, 0x25, 0x59, 0x1a, 0x31, 0xec, 0x56, 0xbc, 0x34, 0x62, 0xd0, 0xed, 0xb8, 0xce, 0x08, 0x34, + 0x50, 0xb6, 0xb1, 0x3c, 0xd1, 0x8e, 0x5e, 0xaf, 0xdd, 0x1a, 0x62, 0x5f, 0xef, 0xc4, 0xa3, 0x78, + 0x74, 0xf8, 0x58, 0x6b, 0xee, 0xb6, 0x15, 0x15, 0x21, 0x5a, 0xbb, 0xd7, 0x3c, 0x88, 0x66, 0xfb, + 0xd5, 0x9d, 0x2a, 0x3d, 0x45, 0x2d, 0xc4, 0xa5, 0xfa, 0x63, 0x60, 0xf2, 0x9b, 0xae, 0xe2, 0x71, + 0x33, 0x06, 0xb9, 0x89, 0xef, 0x4d, 0xa3, 0xdb, 0xee, 0xf8, 0x8d, 0xb6, 0xda, 0x6c, 0x3e, 0xa2, + 0xb3, 0xac, 0xe4, 0xf2, 0xab, 0x0c, 0x52, 0xff, 0x38, 0x03, 0xf5, 0xb4, 0xa8, 0xa4, 0xa7, 0x56, + 0x27, 0xba, 0xeb, 0x85, 0xfc, 0xd5, 0xac, 0x20, 0x7e, 0x6a, 0x75, 0xd2, 0xf3, 0x42, 0x7a, 0x36, + 0x8b, 0x4c, 0xc7, 0x58, 0xf2, 0xf1, 0x52, 0xe3, 0x34, 0xeb, 0xc0, 0x95, 0xd4, 0x93, 0xb7, 0xa9, + 0x37, 0xcb, 0x1a, 0xf1, 0x73, 0x96, 0x0b, 0xed, 0xd7, 0x58, 0xb0, 0xdc, 0x27, 0x71, 0x85, 0x39, + 0x97, 0x5c, 0x61, 0xde, 0x87, 0x5a, 0x4a, 0x32, 0x93, 0xc5, 0x3f, 0x49, 0xb7, 0xb4, 0x64, 0x4f, + 0x5e, 0xdc, 0x4c, 0xf5, 0x8f, 0x32, 0x50, 0x95, 0xe5, 0xf4, 0x77, 0x2e, 0x89, 0x2e, 0xb9, 0x88, + 0x6f, 0xdd, 0x36, 0xa3, 0xd7, 0xb2, 0x22, 0x50, 0x87, 0x9e, 0xe0, 0xe7, 0x3e, 0xd8, 0xbd, 0xd3, + 0x41, 0xdc, 0x1d, 0x19, 0x84, 0x26, 0x33, 0x5d, 0x7e, 0xdc, 0x7b, 0x82, 0x04, 0xe2, 0x9a, 0x4c, + 0x02, 0x51, 0x6f, 0x43, 0x79, 0xef, 0x34, 0x0a, 0x4f, 0x90, 0xdf, 0x8e, 0x2b, 0xf3, 0x1b, 0xd3, + 0xea, 0x9f, 0x66, 0xa0, 0x9e, 0xbc, 0x07, 0x42, 0x41, 0x8f, 0xfc, 0xa9, 0x64, 0xbe, 0x1c, 0xd6, + 0xcd, 0x51, 0xf2, 0x3a, 0xff, 0xba, 0xfc, 0x3a, 0xff, 0xab, 0xa2, 0xb0, 0xac, 0x2c, 0xcd, 0xe2, + 0xba, 0xc4, 0x7d, 0xec, 0x47, 0x50, 0xc5, 0xff, 0x9a, 0x35, 0xb1, 0x7c, 0xdf, 0x8a, 0x5e, 0x8d, + 0x5e, 0x22, 0x4e, 0x11, 0x91, 0x45, 0x62, 0x4d, 0x84, 0x62, 0xb4, 0xf2, 0xc9, 0x12, 0xc4, 0xab, + 0xff, 0x22, 0x07, 0x15, 0x49, 0xeb, 0xf9, 0x46, 0xcb, 0xef, 0x26, 0x94, 0x93, 0xc7, 0x30, 0xc4, + 0x25, 0xd8, 0x18, 0x90, 0x9a, 0xab, 0xec, 0xc2, 0x5c, 0x35, 0xa0, 0x28, 0xa2, 0x23, 0x85, 0xdf, + 0x33, 0x4a, 0xa6, 0x1d, 0x7b, 0xf9, 0x17, 0xb8, 0xde, 0xdf, 0x87, 0xaa, 0xe4, 0x95, 0x8b, 0x5e, + 0xd6, 0x59, 0xa4, 0xaf, 0x24, 0x1e, 0xba, 0x80, 0x5d, 0x85, 0xc2, 0xe4, 0x54, 0x37, 0x47, 0x91, + 0x9b, 0x33, 0x3f, 0x39, 0xdd, 0x1d, 0xd1, 0xd1, 0xc5, 0x24, 0x16, 0xf4, 0xdc, 0x57, 0x52, 0x9a, + 0x44, 0xe2, 0xfc, 0x1e, 0x14, 0x27, 0xa7, 0xfc, 0x86, 0x5d, 0x59, 0x0e, 0xf8, 0x49, 0x86, 0xbc, + 0x30, 0x39, 0xa5, 0xfb, 0x78, 0x9f, 0x82, 0xb2, 0xe0, 0x53, 0x0d, 0xc4, 0xc9, 0xe4, 0x62, 0xa3, + 0x36, 0xd2, 0xee, 0xd5, 0x80, 0xbd, 0x0b, 0x5b, 0x42, 0xf2, 0x1a, 0x81, 0xce, 0x43, 0xfe, 0xe9, + 0x7d, 0x15, 0xfe, 0x08, 0xdd, 0x26, 0xc7, 0x35, 0x83, 0x01, 0x61, 0x70, 0xb1, 0xaa, 0x50, 0x95, + 0xd6, 0x2e, 0x7f, 0xbc, 0xa6, 0xac, 0xa5, 0x60, 0xec, 0x13, 0xa8, 0x4e, 0x4e, 0xf9, 0x5a, 0x18, + 0x7a, 0x07, 0x96, 0x08, 0xe3, 0xde, 0x5a, 0x5c, 0x05, 0x14, 0xaa, 0x9b, 0xa2, 0x64, 0xef, 0x00, + 0xf3, 0xad, 0xd0, 0x72, 0xa9, 0x27, 0xa6, 0x65, 0x98, 0x8e, 0xed, 0x5a, 0xa4, 0x6c, 0x65, 0xb5, + 0xcd, 0x18, 0xb3, 0x2b, 0x10, 0xea, 0xbf, 0xca, 0x40, 0x3d, 0xd1, 0x7e, 0x71, 0x43, 0xb3, 0xfb, + 0xf2, 0x7b, 0xe9, 0x8d, 0x45, 0x05, 0x19, 0x49, 0x1e, 0x0c, 0x2f, 0x66, 0xfc, 0xe5, 0xd1, 0x55, + 0x2f, 0x10, 0xad, 0x72, 0xb9, 0x66, 0x57, 0xbe, 0xe6, 0xfc, 0x18, 0xb2, 0xc3, 0x8b, 0x19, 0xf7, + 0xb4, 0xa0, 0x0c, 0xe4, 0x56, 0x19, 0x97, 0x7e, 0x14, 0x9f, 0xf0, 0xa4, 0xfd, 0x39, 0x7f, 0x00, + 0xe0, 0x50, 0xeb, 0x1c, 0x34, 0xb5, 0xcf, 0x29, 0xf2, 0x84, 0xb4, 0x84, 0xbd, 0xbe, 0xd6, 0xee, + 0x3c, 0xee, 0x11, 0x20, 0x47, 0x7e, 0x98, 0xa4, 0x89, 0x4d, 0xd3, 0xdc, 0x3b, 0x95, 0x1f, 0x62, + 0xc9, 0xa4, 0x1e, 0x62, 0x49, 0xdf, 0x19, 0x5e, 0x5f, 0xbc, 0x33, 0xcc, 0xe2, 0x1d, 0x1d, 0xb3, + 0x07, 0xf6, 0x06, 0xe4, 0x26, 0xa7, 0xd6, 0x45, 0xda, 0xc4, 0x49, 0x6f, 0x46, 0x22, 0x50, 0x7f, + 0x91, 0x01, 0x96, 0x6a, 0x08, 0xd7, 0xba, 0xbf, 0x6b, 0x5b, 0x3e, 0x86, 0x86, 0x78, 0xa6, 0x93, + 0x53, 0x49, 0x3e, 0x5e, 0x31, 0xa4, 0x57, 0xbd, 0x24, 0xb2, 0x2f, 0x79, 0x24, 0x89, 0xbd, 0x0b, + 0xfc, 0x9d, 0x44, 0x5c, 0x20, 0x69, 0xa7, 0x86, 0xc4, 0x2b, 0xb4, 0x84, 0x26, 0x79, 0x18, 0x51, + 0x7e, 0xf0, 0x91, 0xbb, 0x87, 0x37, 0x92, 0x59, 0x23, 0xfe, 0xa1, 0xfe, 0x5e, 0x06, 0xae, 0xa4, + 0x17, 0xc4, 0x2f, 0xd7, 0xcb, 0xf4, 0xeb, 0x96, 0xd9, 0xc5, 0xd7, 0x2d, 0x57, 0xad, 0xa7, 0xdc, + 0xca, 0xf5, 0xf4, 0xff, 0x67, 0x60, 0x4b, 0x1a, 0xfd, 0xc4, 0x4e, 0xfa, 0x3b, 0x6a, 0x99, 0xf4, + 0xc8, 0x65, 0x2e, 0xf5, 0xc8, 0xa5, 0xfa, 0x87, 0x19, 0xb8, 0xb6, 0xd0, 0x12, 0xcd, 0xfa, 0x3b, + 0x6d, 0x4b, 0xfa, 0x31, 0x4c, 0x72, 0x51, 0xf3, 0x50, 0x47, 0x7e, 0xb3, 0x91, 0xa5, 0x5f, 0xb7, + 0xa4, 0xab, 0xdd, 0xff, 0x3a, 0xdd, 0x48, 0x33, 0xb9, 0xa8, 0xc4, 0x3e, 0x84, 0x4a, 0xa2, 0x31, + 0x45, 0x6f, 0x8d, 0xac, 0xbc, 0xe5, 0x24, 0xd3, 0xad, 0x64, 0xa3, 0xeb, 0xdf, 0x8c, 0x8d, 0x7e, + 0x02, 0xd5, 0xb8, 0xe0, 0x5d, 0x6b, 0x92, 0xf6, 0x46, 0x2c, 0xbc, 0x96, 0x95, 0xa2, 0x54, 0x3f, + 0x80, 0xcd, 0xa4, 0x17, 0x2d, 0xf1, 0xc2, 0xdb, 0x6d, 0xa8, 0xb8, 0xd6, 0x99, 0x1e, 0xbd, 0xff, + 0x26, 0x62, 0x76, 0x5c, 0xeb, 0x4c, 0x10, 0xa8, 0x7b, 0x32, 0xdf, 0x8b, 0x7f, 0x86, 0xc0, 0x31, + 0x53, 0xc1, 0x1f, 0x9e, 0x63, 0x46, 0x28, 0x2c, 0x4d, 0x9a, 0x98, 0xa2, 0x6b, 0x9d, 0xd1, 0x9a, + 0x3b, 0x13, 0xe5, 0x34, 0x4d, 0x53, 0x1c, 0x98, 0xaf, 0x7a, 0x37, 0xe9, 0x3a, 0x94, 0x66, 0x7e, + 0x6a, 0x66, 0x8b, 0x33, 0x9f, 0x57, 0x7b, 0x57, 0x44, 0x04, 0x5d, 0x76, 0xb8, 0xce, 0x63, 0x84, + 0xc4, 0xcf, 0x94, 0xe4, 0x92, 0x9f, 0x29, 0xf9, 0x50, 0xb0, 0x3c, 0xdc, 0x7f, 0xa2, 0xe6, 0xf8, + 0x10, 0x3d, 0x73, 0xaf, 0x46, 0x87, 0xe8, 0xa4, 0x01, 0x5a, 0x5f, 0x8a, 0xa0, 0x24, 0xfc, 0x54, + 0x77, 0xa0, 0x22, 0x59, 0x76, 0xa8, 0x9a, 0x48, 0x5e, 0x91, 0x20, 0xfd, 0x12, 0x4d, 0x32, 0x40, + 0x5a, 0x25, 0x71, 0x8a, 0x04, 0xea, 0xef, 0x03, 0x40, 0x82, 0x4b, 0x29, 0x0c, 0x99, 0x05, 0x85, + 0xe1, 0x5b, 0x9d, 0xc8, 0x7f, 0x00, 0xf5, 0xb1, 0x37, 0xbb, 0xd0, 0x93, 0x1c, 0xd9, 0x95, 0x39, + 0xaa, 0x48, 0x35, 0x4c, 0xae, 0x08, 0x2d, 0x9f, 0xb4, 0xe6, 0x56, 0x9e, 0xb4, 0xbe, 0x0f, 0x45, + 0xee, 0xb8, 0x0f, 0xc4, 0x15, 0xb3, 0x97, 0x16, 0xfb, 0xf9, 0x40, 0xc4, 0xbe, 0x46, 0x74, 0xac, + 0x8d, 0x56, 0xb9, 0x78, 0x0c, 0x52, 0xbe, 0x70, 0x76, 0x6b, 0x39, 0x67, 0x44, 0xc6, 0x5f, 0x20, + 0x33, 0xe4, 0xa4, 0xa4, 0x24, 0x84, 0x53, 0xe1, 0x4d, 0x22, 0x25, 0xa1, 0x28, 0x2b, 0x09, 0xc3, + 0x29, 0xf7, 0x21, 0xa1, 0x92, 0xf0, 0x0e, 0x5c, 0x11, 0x31, 0xf8, 0x98, 0x01, 0x87, 0x93, 0xe8, + 0x79, 0xb8, 0x95, 0x78, 0x1e, 0x64, 0x38, 0x25, 0xed, 0x1b, 0xc9, 0x3f, 0x83, 0xad, 0xf1, 0x89, + 0xe1, 0x1e, 0x5b, 0x7a, 0x38, 0x72, 0x74, 0x7a, 0x8b, 0x5c, 0x9f, 0x1a, 0x33, 0xa1, 0xf6, 0xbc, + 0xb1, 0xd4, 0xd8, 0x16, 0x11, 0x0f, 0x47, 0x0e, 0x45, 0xe8, 0xc4, 0xe7, 0xf1, 0x9b, 0xe3, 0x45, + 0xf8, 0xc2, 0x69, 0x14, 0x2c, 0x9e, 0x46, 0x2d, 0x69, 0x33, 0x95, 0x65, 0x6d, 0xe6, 0xc6, 0x5f, + 0xe4, 0xa0, 0x20, 0x62, 0x01, 0xef, 0x43, 0xce, 0xf4, 0xbd, 0x59, 0x1c, 0xb2, 0xb7, 0x42, 0xbb, + 0xa0, 0x9f, 0x64, 0x42, 0x45, 0xe4, 0x01, 0x14, 0x0c, 0xd3, 0xd4, 0x27, 0xa7, 0xe9, 0x13, 0xa3, + 0x05, 0x41, 0xbf, 0xbf, 0xa6, 0xe5, 0x0d, 0x92, 0xf8, 0x1f, 0x43, 0x19, 0xe9, 0x93, 0xf8, 0xab, + 0xca, 0xb2, 0xfa, 0x12, 0x89, 0xe4, 0xfd, 0x35, 0xad, 0x64, 0x44, 0xe2, 0xf9, 0x07, 0x69, 0xdf, + 0x1b, 0x97, 0x97, 0x37, 0x96, 0xb2, 0x5e, 0xe6, 0x85, 0xfb, 0x75, 0xe0, 0xce, 0x98, 0x98, 0xdb, + 0xe4, 0xe5, 0xc3, 0x89, 0x25, 0xde, 0xb4, 0xbf, 0xa6, 0xf1, 0x3d, 0x17, 0xf1, 0xaa, 0x0f, 0x23, + 0xbf, 0x58, 0xfc, 0xc3, 0x17, 0x2b, 0x46, 0x06, 0x79, 0x45, 0xec, 0x1c, 0x23, 0xc6, 0x81, 0xd9, + 0x4c, 0x33, 0x0a, 0xdb, 0x29, 0x2e, 0x65, 0x8b, 0x39, 0x12, 0x65, 0x8b, 0xd9, 0xd3, 0x27, 0x50, + 0x21, 0x17, 0x95, 0xc8, 0x57, 0x5a, 0x1a, 0xda, 0x84, 0xa1, 0x90, 0xe3, 0x3d, 0x61, 0x2f, 0xad, + 0xa8, 0x9f, 0xbe, 0x25, 0xfb, 0x36, 0x6f, 0xae, 0x1c, 0x28, 0x2d, 0x76, 0x73, 0xf2, 0xce, 0x6a, + 0x3c, 0x0f, 0xdb, 0x81, 0xaa, 0x21, 0x49, 0x1a, 0xe1, 0xe8, 0xbc, 0xb9, 0x62, 0x9e, 0x62, 0x1a, + 0x2a, 0x43, 0x4a, 0x27, 0x07, 0x70, 0x37, 0x34, 0xb8, 0xb6, 0x7a, 0x29, 0xcb, 0x91, 0x24, 0x39, + 0x1e, 0x49, 0xa2, 0xa6, 0x9f, 0x68, 0x49, 0xdf, 0x93, 0x95, 0xe2, 0x4a, 0x7e, 0x84, 0x36, 0xb2, + 0xbc, 0x79, 0x2b, 0x50, 0x8c, 0x1e, 0x36, 0xa6, 0xb0, 0xd8, 0x56, 0xff, 0xf0, 0x73, 0x25, 0x83, + 0xe0, 0x4e, 0x6f, 0x30, 0x6c, 0xf6, 0xc4, 0xf1, 0x6a, 0xa7, 0x27, 0x8e, 0x57, 0xd5, 0x7f, 0x9b, + 0x85, 0x72, 0xec, 0x1e, 0xfe, 0xee, 0x86, 0x71, 0x6c, 0x71, 0x66, 0x65, 0x8b, 0x73, 0x41, 0x53, + 0x93, 0xdf, 0x3d, 0xd9, 0x48, 0xeb, 0x43, 0xc1, 0xf2, 0xfd, 0xbb, 0xfc, 0x37, 0xbc, 0x7f, 0x27, + 0x47, 0x26, 0x16, 0xd2, 0x91, 0x89, 0x0b, 0x8f, 0x5b, 0x17, 0x29, 0x4c, 0x45, 0x7e, 0xdc, 0xfa, + 0xd2, 0xf8, 0x94, 0xd2, 0xe5, 0xf1, 0x29, 0xf4, 0xbb, 0x73, 0x4f, 0x6d, 0xeb, 0x4c, 0x04, 0xe8, + 0x89, 0x54, 0x5a, 0x7c, 0xc0, 0x0b, 0xc4, 0xc7, 0x37, 0x60, 0x45, 0xec, 0x21, 0x6c, 0x4d, 0x4e, + 0xe3, 0x87, 0x3c, 0x13, 0x03, 0xab, 0x4a, 0xdd, 0x58, 0x89, 0x53, 0x7f, 0x37, 0x03, 0x90, 0xf8, + 0x50, 0x7f, 0x69, 0x07, 0x8f, 0x64, 0x43, 0x67, 0xbf, 0xc6, 0x86, 0x7e, 0xc1, 0xdb, 0x20, 0xea, + 0x97, 0x50, 0x8e, 0xbd, 0xe6, 0xdf, 0x7d, 0x8d, 0x7d, 0xab, 0x2a, 0x7f, 0x33, 0x72, 0x76, 0xc5, + 0x6e, 0xe7, 0x5f, 0x76, 0x2c, 0x52, 0xd5, 0x67, 0x5f, 0x50, 0xfd, 0x39, 0xf7, 0x38, 0xc5, 0x95, + 0xff, 0x8a, 0x37, 0x96, 0xbc, 0xe6, 0x73, 0xa9, 0x35, 0xaf, 0xce, 0x85, 0xdb, 0xec, 0x97, 0xaf, + 0xfa, 0x5b, 0x75, 0xf8, 0x6f, 0x32, 0x91, 0x6f, 0x27, 0x7e, 0x1e, 0xf5, 0x52, 0x45, 0x6b, 0xb5, + 0x7b, 0xea, 0xdb, 0x54, 0xf7, 0xb5, 0xd6, 0x66, 0xee, 0xeb, 0xac, 0xcd, 0x37, 0x20, 0xcf, 0x05, + 0x42, 0xfe, 0x32, 0x4b, 0x93, 0xe3, 0x5f, 0xf8, 0x83, 0x02, 0xaa, 0x2a, 0x14, 0x4b, 0xde, 0xdf, + 0xad, 0xa8, 0xdc, 0xe8, 0xc7, 0x10, 0x28, 0x88, 0xfa, 0xb7, 0x33, 0x9c, 0xbb, 0x7e, 0xd7, 0x31, + 0xf9, 0x95, 0x99, 0x9b, 0xff, 0x74, 0x1d, 0x6a, 0xa9, 0x03, 0xb3, 0xef, 0xd0, 0x98, 0x95, 0xdc, + 0x3c, 0xbb, 0x9a, 0x9b, 0x7f, 0x97, 0x57, 0xaf, 0xfe, 0xb7, 0x48, 0x80, 0x54, 0x8c, 0x59, 0x29, + 0x1d, 0x63, 0x86, 0xdc, 0xb4, 0x9a, 0xd2, 0xca, 0x57, 0xe9, 0xef, 0x99, 0x95, 0xfa, 0xfb, 0xad, + 0xf8, 0x57, 0xd6, 0x3a, 0xbb, 0xdc, 0xb0, 0xac, 0x69, 0x12, 0x84, 0x7d, 0x0a, 0xd7, 0xb9, 0x56, + 0x23, 0x7e, 0xe9, 0xcc, 0x9b, 0xe8, 0xf1, 0x6f, 0xb0, 0x89, 0xb8, 0xb9, 0x6b, 0x9c, 0x80, 0xff, + 0xda, 0xc4, 0xa4, 0x19, 0x61, 0xd5, 0x0e, 0xd4, 0x52, 0xa7, 0x97, 0xd2, 0xef, 0x39, 0x66, 0xe4, + 0xdf, 0x73, 0x64, 0xdb, 0x90, 0x3f, 0x3b, 0xb1, 0x7c, 0x6b, 0xc5, 0xeb, 0x90, 0x1c, 0xa1, 0x7e, + 0x1f, 0xaa, 0x72, 0x24, 0x05, 0x7b, 0x1b, 0xf2, 0x76, 0x68, 0x4d, 0x23, 0xdb, 0xea, 0xda, 0x72, + 0xb0, 0x05, 0x19, 0xd2, 0x9c, 0x48, 0xfd, 0x79, 0x06, 0x94, 0x45, 0x9c, 0xf4, 0xa3, 0x93, 0x99, + 0x4b, 0x7e, 0x74, 0x72, 0x3d, 0xd5, 0xc8, 0x55, 0xbf, 0x1b, 0x19, 0xbf, 0x50, 0x97, 0xbb, 0xe4, + 0x85, 0x3a, 0xf6, 0x3a, 0x94, 0x7c, 0x8b, 0x7e, 0xd1, 0xcf, 0x5c, 0x11, 0xcb, 0x1c, 0xe3, 0xd4, + 0xdf, 0xc9, 0x40, 0x51, 0x84, 0x7d, 0xac, 0x34, 0x76, 0xdf, 0x84, 0x22, 0xff, 0x75, 0xbf, 0xc8, + 0xf8, 0x5f, 0x8a, 0x83, 0x8c, 0xf0, 0xec, 0x16, 0x0f, 0x86, 0x49, 0x1b, 0xbf, 0x87, 0x8e, 0xe1, + 0x6a, 0x04, 0x17, 0x3f, 0x22, 0x63, 0x4c, 0xc5, 0x35, 0x42, 0xfe, 0x70, 0x08, 0x10, 0x88, 0xdf, + 0x18, 0xfc, 0x01, 0x14, 0x45, 0x58, 0xc9, 0xca, 0xa6, 0xbc, 0xe8, 0xd7, 0xdf, 0xb6, 0x01, 0x92, + 0x38, 0x93, 0x55, 0x25, 0xa8, 0xf7, 0xa1, 0x14, 0x85, 0x96, 0xe0, 0xfa, 0x4b, 0xaa, 0x16, 0xb1, + 0xea, 0x72, 0x63, 0x1c, 0xf1, 0x84, 0x72, 0xd7, 0x1b, 0x9f, 0x92, 0x57, 0xed, 0x5d, 0xa0, 0x18, + 0xfe, 0xe1, 0xd2, 0x0b, 0x2b, 0xe9, 0xe7, 0xaa, 0x63, 0x22, 0x76, 0x1f, 0x62, 0x76, 0xfc, 0x22, + 0x6b, 0x59, 0x6d, 0x46, 0x77, 0x49, 0x68, 0x95, 0x3d, 0x12, 0xde, 0xa3, 0x2e, 0xbd, 0x85, 0x94, + 0x72, 0xd8, 0xa4, 0xda, 0xa4, 0x49, 0x64, 0x6a, 0x1d, 0xaa, 0xf2, 0x79, 0xb8, 0xda, 0x84, 0xcd, + 0x03, 0x2b, 0x34, 0x90, 0x67, 0x45, 0x4f, 0x55, 0xf0, 0xf5, 0x8b, 0x1f, 0xe9, 0xf5, 0xbb, 0x48, + 0xa7, 0x71, 0x22, 0xf5, 0xe7, 0x39, 0x50, 0x16, 0x71, 0x5f, 0x77, 0xaf, 0xe6, 0x36, 0x54, 0x3c, + 0x5a, 0x17, 0xa9, 0x9f, 0x09, 0xe2, 0x20, 0x29, 0x60, 0x35, 0xf5, 0xa6, 0x7d, 0xc9, 0x0e, 0xf6, + 0xf9, 0xab, 0xf6, 0x2f, 0xf1, 0xe7, 0x41, 0x1c, 0x6f, 0x4c, 0xcb, 0xba, 0x4a, 0xaf, 0x81, 0x74, + 0xbd, 0x31, 0x5d, 0xd7, 0x11, 0x06, 0x37, 0x0f, 0xd2, 0xaa, 0x6a, 0x25, 0x61, 0x65, 0xd3, 0xa1, + 0x81, 0x08, 0x63, 0x0d, 0x03, 0x71, 0x01, 0xaa, 0xc4, 0x01, 0xc3, 0x20, 0x7a, 0xd7, 0x77, 0x2c, + 0x7e, 0xd3, 0x26, 0x4b, 0xef, 0xfa, 0xb6, 0x5c, 0xba, 0xad, 0x43, 0x3f, 0xc1, 0x34, 0x16, 0x3f, + 0x91, 0x25, 0xde, 0x51, 0x46, 0xd4, 0xab, 0xfc, 0x57, 0x7f, 0x7c, 0x2b, 0x08, 0xf8, 0x43, 0x60, + 0x65, 0xf1, 0x16, 0x92, 0x00, 0xc6, 0x2f, 0x8e, 0x89, 0xdf, 0x5c, 0x42, 0x12, 0x10, 0x2f, 0x8e, + 0xf1, 0x5f, 0x5c, 0x42, 0x82, 0xeb, 0x50, 0xfa, 0xca, 0x73, 0x2d, 0x32, 0xdc, 0x2b, 0xd4, 0xaa, + 0x22, 0xa6, 0x0f, 0x8c, 0x99, 0xfa, 0xe7, 0x19, 0xd8, 0x5a, 0x1c, 0x55, 0x5a, 0x30, 0x55, 0x28, + 0xb5, 0xfa, 0x5d, 0xbd, 0xd7, 0x3c, 0x68, 0x2b, 0x6b, 0x6c, 0x03, 0x2a, 0xfd, 0x9d, 0x1f, 0xb7, + 0x5b, 0x43, 0x0e, 0xc8, 0xd0, 0x3d, 0xd1, 0x81, 0xbe, 0xdf, 0xd9, 0xdd, 0x6d, 0xf7, 0xb8, 0x95, + 0xd2, 0xdf, 0xf9, 0xb1, 0xde, 0xed, 0xb7, 0xf8, 0x4f, 0xb4, 0x44, 0xa7, 0xef, 0x03, 0x25, 0x47, + 0x27, 0xde, 0x14, 0x13, 0x8a, 0xc9, 0x3c, 0x0f, 0x79, 0x7c, 0x36, 0xd0, 0x5b, 0xbd, 0xa1, 0x52, + 0xc0, 0x54, 0xef, 0xa8, 0xdb, 0xa5, 0x14, 0xc5, 0x36, 0xb5, 0xfa, 0x07, 0x87, 0x5a, 0x7b, 0x30, + 0xd0, 0x07, 0x9d, 0x9f, 0xb6, 0x95, 0x12, 0xd5, 0xac, 0x75, 0x1e, 0x77, 0x7a, 0x1c, 0x50, 0x66, + 0x45, 0xc8, 0x1e, 0x74, 0x7a, 0xfc, 0x7e, 0xec, 0x41, 0xf3, 0x33, 0xa5, 0x82, 0x1f, 0x83, 0xa3, + 0x03, 0xa5, 0x7a, 0xff, 0x0e, 0x54, 0xe5, 0xdf, 0x39, 0xa3, 0x28, 0x47, 0xcf, 0xb5, 0xf8, 0xeb, + 0xbf, 0xdd, 0xaf, 0x3e, 0x50, 0x32, 0xf7, 0x7f, 0x53, 0xfa, 0xfd, 0x08, 0xa2, 0x11, 0x87, 0x01, + 0x74, 0x1b, 0x90, 0xdf, 0x36, 0x24, 0xd7, 0x3f, 0x5d, 0x4e, 0xdc, 0x6f, 0x0e, 0xf6, 0xf9, 0x31, + 0x81, 0xc0, 0x10, 0x20, 0x9b, 0xbc, 0x1a, 0x4b, 0x97, 0x7d, 0xe9, 0x33, 0x3e, 0x6c, 0xcf, 0xd3, + 0x3d, 0xcc, 0xce, 0x00, 0x3b, 0xa7, 0x40, 0x15, 0xbf, 0x62, 0x5c, 0xf1, 0xbe, 0x0a, 0x15, 0xe9, + 0xa1, 0x6f, 0xaa, 0xc3, 0x08, 0x4e, 0xc4, 0x43, 0xb4, 0x68, 0x6e, 0x2a, 0x99, 0xfb, 0xaf, 0xa3, + 0xc4, 0x90, 0x9f, 0xd9, 0x06, 0x28, 0xf4, 0x3c, 0x7f, 0x6a, 0x38, 0x82, 0xce, 0x9a, 0x07, 0x48, + 0xf7, 0x2e, 0x5c, 0x5d, 0xf9, 0x68, 0x38, 0x45, 0xea, 0xda, 0xd3, 0x99, 0x63, 0xf1, 0x60, 0xd3, + 0xfd, 0x8b, 0x91, 0x6f, 0x9b, 0x4a, 0xe6, 0xfe, 0x27, 0xd1, 0x95, 0xb4, 0xa8, 0xee, 0x6e, 0xbf, + 0xb9, 0xcb, 0x27, 0x37, 0xbe, 0x8c, 0x3c, 0xdc, 0xe1, 0x8f, 0xcc, 0x6a, 0xed, 0xc1, 0x51, 0x77, + 0x28, 0x2e, 0x3e, 0xdf, 0xff, 0x11, 0x34, 0x2e, 0x8b, 0xba, 0xc4, 0x16, 0xb5, 0xf6, 0x9b, 0x14, + 0xd9, 0x8a, 0x93, 0xd9, 0xd7, 0x79, 0x2a, 0xc3, 0x03, 0x83, 0xbb, 0x6d, 0x8a, 0xc8, 0xb8, 0xff, + 0xb3, 0x8c, 0xc4, 0xc2, 0xa2, 0xc8, 0xb9, 0x18, 0x20, 0x66, 0x49, 0x06, 0x69, 0x96, 0x61, 0x2a, + 0x19, 0x76, 0x0d, 0x58, 0x0a, 0xd4, 0xf5, 0xc6, 0x86, 0xa3, 0xac, 0x53, 0xec, 0x45, 0x04, 0xa7, + 0xf8, 0x66, 0x25, 0xcb, 0x5e, 0x81, 0xeb, 0x31, 0xac, 0xeb, 0x9d, 0x1d, 0xfa, 0x36, 0xda, 0xda, + 0x17, 0x1c, 0x9d, 0xdb, 0xf9, 0xe1, 0x9f, 0xfd, 0xe2, 0x56, 0xe6, 0xdf, 0xff, 0xe2, 0x56, 0xe6, + 0xbf, 0xfe, 0xe2, 0xd6, 0xda, 0xcf, 0xff, 0xdb, 0xad, 0xcc, 0x4f, 0xe5, 0xdf, 0x79, 0x9f, 0x1a, + 0xa1, 0x6f, 0x9f, 0xf3, 0x4d, 0x13, 0x25, 0x5c, 0xeb, 0xdd, 0xd9, 0xe9, 0xf1, 0xbb, 0xb3, 0xd1, + 0xbb, 0xc8, 0x99, 0x46, 0x05, 0xfa, 0x45, 0xf7, 0x47, 0xff, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x7a, + 0xdd, 0xdd, 0xf7, 0x31, 0x7e, 0x00, 0x00, } func (m *Type) Marshal() (dAtA []byte, err error) { @@ -14394,6 +14497,83 @@ func (m *SubscriptionMeta) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *IndexScanInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IndexScanInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.ProtoSize() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IndexScanInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.IndexTableName) > 0 { + i -= len(m.IndexTableName) + copy(dAtA[i:], m.IndexTableName) + i = encodeVarintPlan(dAtA, i, uint64(len(m.IndexTableName))) + i-- + dAtA[i] = 0x32 + } + if m.IsUnique { + i-- + if m.IsUnique { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + if len(m.Parts) > 0 { + for iNdEx := len(m.Parts) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Parts[iNdEx]) + copy(dAtA[i:], m.Parts[iNdEx]) + i = encodeVarintPlan(dAtA, i, uint64(len(m.Parts[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if len(m.BelongToTable) > 0 { + i -= len(m.BelongToTable) + copy(dAtA[i:], m.BelongToTable) + i = encodeVarintPlan(dAtA, i, uint64(len(m.BelongToTable))) + i-- + dAtA[i] = 0x1a + } + if len(m.IndexName) > 0 { + i -= len(m.IndexName) + copy(dAtA[i:], m.IndexName) + i = encodeVarintPlan(dAtA, i, uint64(len(m.IndexName))) + i-- + dAtA[i] = 0x12 + } + if m.IsIndexScan { + i-- + if m.IsIndexScan { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *Function) Marshal() (dAtA []byte, err error) { size := m.ProtoSize() dAtA = make([]byte, size) @@ -18789,6 +18969,18 @@ func (m *Node) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0xb2 } + { + size, err := m.IndexScanInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPlan(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xaa if m.RowsetData != nil { { size, err := m.RowsetData.MarshalToSizedBuffer(dAtA[:i]) @@ -18998,21 +19190,21 @@ func (m *Node) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if len(m.Children) > 0 { - dAtA112 := make([]byte, len(m.Children)*10) - var j111 int + dAtA113 := make([]byte, len(m.Children)*10) + var j112 int for _, num1 := range m.Children { num := uint64(num1) for num >= 1<<7 { - dAtA112[j111] = uint8(uint64(num)&0x7f | 0x80) + dAtA113[j112] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j111++ + j112++ } - dAtA112[j111] = uint8(num) - j111++ + dAtA113[j112] = uint8(num) + j112++ } - i -= j111 - copy(dAtA[i:], dAtA112[:j111]) - i = encodeVarintPlan(dAtA, i, uint64(j111)) + i -= j112 + copy(dAtA[i:], dAtA113[:j112]) + i = encodeVarintPlan(dAtA, i, uint64(j112)) i-- dAtA[i] = 0x22 } @@ -19348,20 +19540,20 @@ func (m *LockTarget) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x48 } if len(m.PartitionTableIds) > 0 { - dAtA118 := make([]byte, len(m.PartitionTableIds)*10) - var j117 int + dAtA119 := make([]byte, len(m.PartitionTableIds)*10) + var j118 int for _, num := range m.PartitionTableIds { for num >= 1<<7 { - dAtA118[j117] = uint8(uint64(num)&0x7f | 0x80) + dAtA119[j118] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j117++ + j118++ } - dAtA118[j117] = uint8(num) - j117++ + dAtA119[j118] = uint8(num) + j118++ } - i -= j117 - copy(dAtA[i:], dAtA118[:j117]) - i = encodeVarintPlan(dAtA, i, uint64(j117)) + i -= j118 + copy(dAtA[i:], dAtA119[:j118]) + i = encodeVarintPlan(dAtA, i, uint64(j118)) i-- dAtA[i] = 0x42 } @@ -19468,21 +19660,21 @@ func (m *PreInsertUkCtx) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x10 } if len(m.Columns) > 0 { - dAtA123 := make([]byte, len(m.Columns)*10) - var j122 int + dAtA124 := make([]byte, len(m.Columns)*10) + var j123 int for _, num1 := range m.Columns { num := uint64(num1) for num >= 1<<7 { - dAtA123[j122] = uint8(uint64(num)&0x7f | 0x80) + dAtA124[j123] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j122++ + j123++ } - dAtA123[j122] = uint8(num) - j122++ + dAtA124[j123] = uint8(num) + j123++ } - i -= j122 - copy(dAtA[i:], dAtA123[:j122]) - i = encodeVarintPlan(dAtA, i, uint64(j122)) + i -= j123 + copy(dAtA[i:], dAtA124[:j123]) + i = encodeVarintPlan(dAtA, i, uint64(j123)) i-- dAtA[i] = 0xa } @@ -19514,21 +19706,21 @@ func (m *PreDeleteCtx) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Idx) > 0 { - dAtA125 := make([]byte, len(m.Idx)*10) - var j124 int + dAtA126 := make([]byte, len(m.Idx)*10) + var j125 int for _, num1 := range m.Idx { num := uint64(num1) for num >= 1<<7 { - dAtA125[j124] = uint8(uint64(num)&0x7f | 0x80) + dAtA126[j125] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j124++ + j125++ } - dAtA125[j124] = uint8(num) - j124++ + dAtA126[j125] = uint8(num) + j125++ } - i -= j124 - copy(dAtA[i:], dAtA125[:j124]) - i = encodeVarintPlan(dAtA, i, uint64(j124)) + i -= j125 + copy(dAtA[i:], dAtA126[:j125]) + i = encodeVarintPlan(dAtA, i, uint64(j125)) i-- dAtA[i] = 0xa } @@ -19714,21 +19906,21 @@ func (m *IdList) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.List) > 0 { - dAtA132 := make([]byte, len(m.List)*10) - var j131 int + dAtA133 := make([]byte, len(m.List)*10) + var j132 int for _, num1 := range m.List { num := uint64(num1) for num >= 1<<7 { - dAtA132[j131] = uint8(uint64(num)&0x7f | 0x80) + dAtA133[j132] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j131++ + j132++ } - dAtA132[j131] = uint8(num) - j131++ + dAtA133[j132] = uint8(num) + j132++ } - i -= j131 - copy(dAtA[i:], dAtA132[:j131]) - i = encodeVarintPlan(dAtA, i, uint64(j131)) + i -= j132 + copy(dAtA[i:], dAtA133[:j132]) + i = encodeVarintPlan(dAtA, i, uint64(j132)) i-- dAtA[i] = 0xa } @@ -19847,20 +20039,20 @@ func (m *DeleteCtx) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if len(m.PartitionTableIds) > 0 { - dAtA136 := make([]byte, len(m.PartitionTableIds)*10) - var j135 int + dAtA137 := make([]byte, len(m.PartitionTableIds)*10) + var j136 int for _, num := range m.PartitionTableIds { for num >= 1<<7 { - dAtA136[j135] = uint8(uint64(num)&0x7f | 0x80) + dAtA137[j136] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j135++ + j136++ } - dAtA136[j135] = uint8(num) - j135++ + dAtA137[j136] = uint8(num) + j136++ } - i -= j135 - copy(dAtA[i:], dAtA136[:j135]) - i = encodeVarintPlan(dAtA, i, uint64(j135)) + i -= j136 + copy(dAtA[i:], dAtA137[:j136]) + i = encodeVarintPlan(dAtA, i, uint64(j136)) i-- dAtA[i] = 0x32 } @@ -20165,21 +20357,21 @@ func (m *Query) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if len(m.Steps) > 0 { - dAtA141 := make([]byte, len(m.Steps)*10) - var j140 int + dAtA142 := make([]byte, len(m.Steps)*10) + var j141 int for _, num1 := range m.Steps { num := uint64(num1) for num >= 1<<7 { - dAtA141[j140] = uint8(uint64(num)&0x7f | 0x80) + dAtA142[j141] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j140++ + j141++ } - dAtA141[j140] = uint8(num) - j140++ + dAtA142[j141] = uint8(num) + j141++ } - i -= j140 - copy(dAtA[i:], dAtA141[:j140]) - i = encodeVarintPlan(dAtA, i, uint64(j140)) + i -= j141 + copy(dAtA[i:], dAtA142[:j141]) + i = encodeVarintPlan(dAtA, i, uint64(j141)) i-- dAtA[i] = 0x12 } @@ -22706,20 +22898,20 @@ func (m *DropTable) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.FkChildTblsReferToMe) > 0 { - dAtA197 := make([]byte, len(m.FkChildTblsReferToMe)*10) - var j196 int + dAtA198 := make([]byte, len(m.FkChildTblsReferToMe)*10) + var j197 int for _, num := range m.FkChildTblsReferToMe { for num >= 1<<7 { - dAtA197[j196] = uint8(uint64(num)&0x7f | 0x80) + dAtA198[j197] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j196++ + j197++ } - dAtA197[j196] = uint8(num) - j196++ + dAtA198[j197] = uint8(num) + j197++ } - i -= j196 - copy(dAtA[i:], dAtA197[:j196]) - i = encodeVarintPlan(dAtA, i, uint64(j196)) + i -= j197 + copy(dAtA[i:], dAtA198[:j197]) + i = encodeVarintPlan(dAtA, i, uint64(j197)) i-- dAtA[i] = 0x62 } @@ -22764,20 +22956,20 @@ func (m *DropTable) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if len(m.ForeignTbl) > 0 { - dAtA200 := make([]byte, len(m.ForeignTbl)*10) - var j199 int + dAtA201 := make([]byte, len(m.ForeignTbl)*10) + var j200 int for _, num := range m.ForeignTbl { for num >= 1<<7 { - dAtA200[j199] = uint8(uint64(num)&0x7f | 0x80) + dAtA201[j200] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j199++ + j200++ } - dAtA200[j199] = uint8(num) - j199++ + dAtA201[j200] = uint8(num) + j200++ } - i -= j199 - copy(dAtA[i:], dAtA200[:j199]) - i = encodeVarintPlan(dAtA, i, uint64(j199)) + i -= j200 + copy(dAtA[i:], dAtA201[:j200]) + i = encodeVarintPlan(dAtA, i, uint64(j200)) i-- dAtA[i] = 0x3a } @@ -23330,20 +23522,20 @@ func (m *TruncateTable) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x40 } if len(m.ForeignTbl) > 0 { - dAtA209 := make([]byte, len(m.ForeignTbl)*10) - var j208 int + dAtA210 := make([]byte, len(m.ForeignTbl)*10) + var j209 int for _, num := range m.ForeignTbl { for num >= 1<<7 { - dAtA209[j208] = uint8(uint64(num)&0x7f | 0x80) + dAtA210[j209] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j208++ + j209++ } - dAtA209[j208] = uint8(num) - j208++ + dAtA210[j209] = uint8(num) + j209++ } - i -= j208 - copy(dAtA[i:], dAtA209[:j208]) - i = encodeVarintPlan(dAtA, i, uint64(j208)) + i -= j209 + copy(dAtA[i:], dAtA210[:j209]) + i = encodeVarintPlan(dAtA, i, uint64(j209)) i-- dAtA[i] = 0x3a } @@ -23429,20 +23621,20 @@ func (m *ClusterTable) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x18 } if len(m.AccountIDs) > 0 { - dAtA212 := make([]byte, len(m.AccountIDs)*10) - var j211 int + dAtA213 := make([]byte, len(m.AccountIDs)*10) + var j212 int for _, num := range m.AccountIDs { for num >= 1<<7 { - dAtA212[j211] = uint8(uint64(num)&0x7f | 0x80) + dAtA213[j212] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j211++ + j212++ } - dAtA212[j211] = uint8(num) - j211++ + dAtA213[j212] = uint8(num) + j212++ } - i -= j211 - copy(dAtA[i:], dAtA212[:j211]) - i = encodeVarintPlan(dAtA, i, uint64(j211)) + i -= j212 + copy(dAtA[i:], dAtA213[:j212]) + i = encodeVarintPlan(dAtA, i, uint64(j212)) i-- dAtA[i] = 0x12 } @@ -23654,21 +23846,21 @@ func (m *Prepare) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.ParamTypes) > 0 { - dAtA216 := make([]byte, len(m.ParamTypes)*10) - var j215 int + dAtA217 := make([]byte, len(m.ParamTypes)*10) + var j216 int for _, num1 := range m.ParamTypes { num := uint64(num1) for num >= 1<<7 { - dAtA216[j215] = uint8(uint64(num)&0x7f | 0x80) + dAtA217[j216] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j215++ + j216++ } - dAtA216[j215] = uint8(num) - j215++ + dAtA217[j216] = uint8(num) + j216++ } - i -= j215 - copy(dAtA[i:], dAtA216[:j215]) - i = encodeVarintPlan(dAtA, i, uint64(j215)) + i -= j216 + copy(dAtA[i:], dAtA217[:j216]) + i = encodeVarintPlan(dAtA, i, uint64(j216)) i-- dAtA[i] = 0x22 } @@ -23815,21 +24007,21 @@ func (m *OtherDCL) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.ParamTypes) > 0 { - dAtA219 := make([]byte, len(m.ParamTypes)*10) - var j218 int + dAtA220 := make([]byte, len(m.ParamTypes)*10) + var j219 int for _, num1 := range m.ParamTypes { num := uint64(num1) for num >= 1<<7 { - dAtA219[j218] = uint8(uint64(num)&0x7f | 0x80) + dAtA220[j219] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j218++ + j219++ } - dAtA219[j218] = uint8(num) - j218++ + dAtA220[j219] = uint8(num) + j219++ } - i -= j218 - copy(dAtA[i:], dAtA219[:j218]) - i = encodeVarintPlan(dAtA, i, uint64(j218)) + i -= j219 + copy(dAtA[i:], dAtA220[:j219]) + i = encodeVarintPlan(dAtA, i, uint64(j219)) i-- dAtA[i] = 0xa } @@ -24662,6 +24854,42 @@ func (m *SubscriptionMeta) ProtoSize() (n int) { return n } +func (m *IndexScanInfo) ProtoSize() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.IsIndexScan { + n += 2 + } + l = len(m.IndexName) + if l > 0 { + n += 1 + l + sovPlan(uint64(l)) + } + l = len(m.BelongToTable) + if l > 0 { + n += 1 + l + sovPlan(uint64(l)) + } + if len(m.Parts) > 0 { + for _, s := range m.Parts { + l = len(s) + n += 1 + l + sovPlan(uint64(l)) + } + } + if m.IsUnique { + n += 2 + } + l = len(m.IndexTableName) + if l > 0 { + n += 1 + l + sovPlan(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *Function) ProtoSize() (n int) { if m == nil { return 0 @@ -26440,6 +26668,8 @@ func (m *Node) ProtoSize() (n int) { l = m.RowsetData.ProtoSize() n += 2 + l + sovPlan(uint64(l)) } + l = m.IndexScanInfo.ProtoSize() + n += 2 + l + sovPlan(uint64(l)) l = len(m.ExtraOptions) if l > 0 { n += 2 + l + sovPlan(uint64(l)) @@ -31499,6 +31729,225 @@ func (m *SubscriptionMeta) Unmarshal(dAtA []byte) error { } return nil } +func (m *IndexScanInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlan + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IndexScanInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IndexScanInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsIndexScan", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlan + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IsIndexScan = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IndexName", 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.IndexName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BelongToTable", 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.BelongToTable = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Parts", 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.Parts = append(m.Parts, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsUnique", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlan + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IsUnique = bool(v != 0) + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IndexTableName", 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.IndexTableName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPlan(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPlan + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Function) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -42101,6 +42550,39 @@ func (m *Node) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 21: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IndexScanInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlan + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPlan + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPlan + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.IndexScanInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex case 22: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ExtraOptions", wireType) diff --git a/pkg/sql/plan/apply_indices.go b/pkg/sql/plan/apply_indices.go index dffd34d661be2..4dac70f2a8c74 100644 --- a/pkg/sql/plan/apply_indices.go +++ b/pkg/sql/plan/apply_indices.go @@ -16,6 +16,7 @@ package plan import ( "fmt" + "slices" "sort" "github.com/matrixorigin/matrixone/pkg/catalog" @@ -727,16 +728,27 @@ func (builder *QueryBuilder) tryIndexOnlyScan(idxDef *IndexDef, node *plan.Node, newFilterList = append(newFilterList, replaceColumnsForExpr(node.FilterList[idx], idxColMap)) } + // recod index table scan info + idxScanInfo := plan.IndexScanInfo{ + IsIndexScan: true, + IndexName: idxDef.IndexName, + BelongToTable: node.ObjRef.ObjName, + Parts: slices.Clone(idxDef.Parts), + IsUnique: idxDef.Unique, + IndexTableName: idxDef.IndexTableName, + } + idxTableNodeID := builder.appendNode(&plan.Node{ - NodeType: plan.Node_TABLE_SCAN, - TableDef: idxTableDef, - ObjRef: idxObjRef, - ParentObjRef: node.ObjRef, - FilterList: newFilterList, - Limit: node.Limit, - Offset: node.Offset, - BindingTags: []int32{idxTag}, - ScanSnapshot: node.ScanSnapshot, + NodeType: plan.Node_TABLE_SCAN, + TableDef: idxTableDef, + IndexScanInfo: idxScanInfo, + ObjRef: idxObjRef, + ParentObjRef: node.ObjRef, + FilterList: newFilterList, + Limit: node.Limit, + Offset: node.Offset, + BindingTags: []int32{idxTag}, + ScanSnapshot: node.ScanSnapshot, }, builder.ctxByNode[node.NodeId]) forceScanNodeStatsTP(idxTableNodeID, builder) @@ -783,14 +795,25 @@ func (builder *QueryBuilder) applyIndexJoin(idxDef *IndexDef, node *plan.Node, f idxFilter = builder.replaceNonEqualCondition(node.FilterList[filterIdx[0]], idxTag, idxTableDef, numParts) } + // recod index table scan info + idxScanInfo := plan.IndexScanInfo{ + IsIndexScan: true, + IndexName: idxDef.IndexName, + BelongToTable: node.ObjRef.ObjName, + Parts: slices.Clone(idxDef.Parts), + IsUnique: idxDef.Unique, + IndexTableName: idxDef.IndexTableName, + } + idxTableNode := &plan.Node{ - NodeType: plan.Node_TABLE_SCAN, - TableDef: idxTableDef, - ObjRef: idxObjRef, - ParentObjRef: DeepCopyObjectRef(node.ObjRef), - FilterList: []*plan.Expr{idxFilter}, - BindingTags: []int32{idxTag}, - ScanSnapshot: node.ScanSnapshot, + NodeType: plan.Node_TABLE_SCAN, + TableDef: idxTableDef, + ObjRef: idxObjRef, + IndexScanInfo: idxScanInfo, + ParentObjRef: DeepCopyObjectRef(node.ObjRef), + FilterList: []*plan.Expr{idxFilter}, + BindingTags: []int32{idxTag}, + ScanSnapshot: node.ScanSnapshot, } idxTableNodeID := builder.appendNode(idxTableNode, builder.ctxByNode[node.NodeId]) forceScanNodeStatsTP(idxTableNodeID, builder) @@ -1026,10 +1049,22 @@ func (builder *QueryBuilder) applyIndicesForJoins(nodeID int32, node *plan.Node, }, }, } + + // recod index table scan info + idxScanInfo := plan.IndexScanInfo{ + IsIndexScan: true, + IndexName: idxDef.IndexName, + BelongToTable: leftChild.ObjRef.ObjName, + Parts: slices.Clone(idxDef.Parts), + IsUnique: idxDef.Unique, + IndexTableName: idxDef.IndexTableName, + } + idxTableNodeID := builder.appendNode(&plan.Node{ NodeType: plan.Node_TABLE_SCAN, TableDef: idxTableDef, ObjRef: idxObjRef, + IndexScanInfo: idxScanInfo, ParentObjRef: DeepCopyObjectRef(leftChild.ObjRef), BindingTags: []int32{idxTag}, ScanSnapshot: leftChild.ScanSnapshot, diff --git a/pkg/sql/plan/deepcopy.go b/pkg/sql/plan/deepcopy.go index 5060870f7e480..c4cdb906d65c9 100644 --- a/pkg/sql/plan/deepcopy.go +++ b/pkg/sql/plan/deepcopy.go @@ -259,6 +259,15 @@ func DeepCopyNode(node *plan.Node) *plan.Node { newNode.ObjRef = DeepCopyObjectRef(node.ObjRef) newNode.ParentObjRef = DeepCopyObjectRef(node.ParentObjRef) + newNode.IndexScanInfo = plan.IndexScanInfo{ + IsIndexScan: node.IndexScanInfo.IsIndexScan, + IndexName: node.IndexScanInfo.IndexName, + BelongToTable: node.IndexScanInfo.BelongToTable, + Parts: slices.Clone(node.IndexScanInfo.Parts), + IsUnique: node.IndexScanInfo.IsUnique, + IndexTableName: node.IndexScanInfo.IndexTableName, + } + if node.WinSpecList != nil { newNode.WinSpecList = make([]*Expr, len(node.WinSpecList)) for i, w := range node.WinSpecList { diff --git a/pkg/sql/plan/explain/explain_node.go b/pkg/sql/plan/explain/explain_node.go index 59336b89a0995..bf8ec6ddbbe8a 100644 --- a/pkg/sql/plan/explain/explain_node.go +++ b/pkg/sql/plan/explain/explain_node.go @@ -44,6 +44,7 @@ func NewNodeDescriptionImpl(node *plan.Node) *NodeDescribeImpl { } const TableScan = "Table Scan" +const IndexTableScan = "Index Table Scan" const ExternalScan = "External Scan" func (ndesc *NodeDescribeImpl) GetNodeBasicInfo(ctx context.Context, options *ExplainOptions) (string, error) { @@ -58,6 +59,9 @@ func (ndesc *NodeDescribeImpl) GetNodeBasicInfo(ctx context.Context, options *Ex pname = "Values Scan" case plan.Node_TABLE_SCAN: pname = TableScan + if ndesc.Node.IndexScanInfo.IsIndexScan { + pname = IndexTableScan + } case plan.Node_EXTERNAL_SCAN: pname = ExternalScan case plan.Node_SOURCE_SCAN: @@ -164,20 +168,10 @@ func (ndesc *NodeDescribeImpl) GetNodeBasicInfo(ctx context.Context, options *Ex case plan.Node_TABLE_SCAN, plan.Node_EXTERNAL_SCAN, plan.Node_MATERIAL_SCAN, plan.Node_INSERT, plan.Node_SOURCE_SCAN: buf.WriteString(" on ") if ndesc.Node.ObjRef != nil { - if ndesc.Node.ParentObjRef == nil || options.CmpContext == nil { // original table + if ndesc.Node.IndexScanInfo.IsIndexScan { + buf.WriteString(ndesc.Node.IndexScanInfo.BelongToTable + "." + ndesc.Node.IndexScanInfo.IndexName) + } else { buf.WriteString(ndesc.Node.ObjRef.GetSchemaName() + "." + ndesc.Node.ObjRef.GetObjName()) - } else { // index table, need to get index table name - scanSnapshot := ndesc.Node.ScanSnapshot - if scanSnapshot == nil { - scanSnapshot = &plan.Snapshot{} - } - _, origTableDef := options.CmpContext.Resolve(ndesc.Node.ParentObjRef.GetSchemaName(), ndesc.Node.ParentObjRef.GetObjName(), scanSnapshot) - for i := range origTableDef.Indexes { - if origTableDef.Indexes[i].IndexTableName == ndesc.Node.ObjRef.GetObjName() { - buf.WriteString(ndesc.Node.ObjRef.GetSchemaName() + "." + origTableDef.Indexes[i].IndexName + "(index)") - break - } - } } } else if ndesc.Node.TableDef != nil { buf.WriteString(ndesc.Node.TableDef.GetName()) diff --git a/pkg/sql/plan/explain/types.go b/pkg/sql/plan/explain/types.go index 9b2977b1e3f2f..6711b339f7a06 100644 --- a/pkg/sql/plan/explain/types.go +++ b/pkg/sql/plan/explain/types.go @@ -19,10 +19,8 @@ import ( "context" "strings" - "github.com/matrixorigin/matrixone/pkg/pb/plan" - plan2 "github.com/matrixorigin/matrixone/pkg/sql/plan" - "github.com/matrixorigin/matrixone/pkg/logutil" + "github.com/matrixorigin/matrixone/pkg/pb/plan" ) type ExplainQuery interface { @@ -141,11 +139,10 @@ const ( ) type ExplainOptions struct { - Verbose bool - Analyze bool - Format ExplainFormat - NodeType plan.Node_NodeType - CmpContext plan2.CompilerContext + Verbose bool + Analyze bool + Format ExplainFormat + NodeType plan.Node_NodeType } func NewExplainDefaultOptions() *ExplainOptions { diff --git a/proto/plan.proto b/proto/plan.proto index 9a073571e5d8c..2cd91cd98132f 100644 --- a/proto/plan.proto +++ b/proto/plan.proto @@ -165,6 +165,15 @@ message SubscriptionMeta{ string tables = 6; // pubTables (separated by ',') } +message IndexScanInfo { + bool is_index_scan = 1; + string index_name = 2; + string belong_to_table = 3; + repeated string parts = 4; + bool is_unique = 5; + string index_table_name = 6; +} + message Function { // Function flags enum FuncFlag { @@ -843,6 +852,8 @@ message Node { ObjectRef parent_obj_ref = 19; RowsetData rowset_data = 20; + IndexScanInfo index_scan_info = 21 [(gogoproto.nullable) = false]; + string extra_options = 22; DeleteCtx delete_ctx = 23; diff --git a/test/distributed/cases/fulltext/fulltext1.result b/test/distributed/cases/fulltext/fulltext1.result index 3557fd614cf0d..ad86cfd2f9fcf 100644 --- a/test/distributed/cases/fulltext/fulltext1.result +++ b/test/distributed/cases/fulltext/fulltext1.result @@ -146,7 +146,7 @@ Project Filter Cond: (t1.c = 100) Block Filter Cond: (t1.c = 100) Runtime Filter Probe: t1.a - -> Table Scan on test.index2(index) [ForceOneCN] + -> Index Table Scan on t1.index2 [ForceOneCN] Filter Cond: prefix_eq(#[0,0]) Block Filter Cond: prefix_eq(#[0,0]) drop table t1; diff --git a/test/distributed/cases/optimizer/explain_index.result b/test/distributed/cases/optimizer/explain_index.result index 4a24c5018ae79..eefccee505f52 100644 --- a/test/distributed/cases/optimizer/explain_index.result +++ b/test/distributed/cases/optimizer/explain_index.result @@ -15,7 +15,7 @@ Sleep(1) explain select c3,c4,c5 from t1 where c3=1; TP QUERY PLAN Project - -> Table Scan on d1.t1i1(index) + -> Index Table Scan on t1.t1i1 Filter Cond: prefix_eq(#[0,0]) Block Filter Cond: prefix_eq(#[0,0]) select c3,c4,c5 from t1 where c3=1; @@ -43,7 +43,7 @@ count(*) explain select c3,c4,c5 from t1 where c3 in (1,5,10,20); TP QUERY PLAN Project - -> Table Scan on d1.t1i1(index) + -> Index Table Scan on t1.t1i1 Filter Cond: prefix_in(#[0,0]) Block Filter Cond: prefix_in(#[0,0]) select c3,c4,c5 from t1 where c3 in (1,5,10,20); @@ -91,7 +91,7 @@ c3 c4 c5 explain select c3,c4,c5 from t1 where c3 between 4 and 7 and c5=5; TP QUERY PLAN Project - -> Table Scan on d1.t1i1(index) + -> Index Table Scan on t1.t1i1 Filter Cond: prefix_between(#[0,0]), (serial_extract(#[0,0], 2, INT)) = 5) Block Filter Cond: prefix_between(#[0,0]) select c3,c4,c5 from t1 where c3 between 4 and 7 and c5=5; @@ -160,7 +160,7 @@ Project Filter Cond: (t1.c3 = 1) Block Filter Cond: (t1.c3 = 1) Runtime Filter Probe: t1.__mo_cpkey_col - -> Table Scan on d1.t1i1(index) [ForceOneCN] + -> Index Table Scan on t1.t1i1 [ForceOneCN] Filter Cond: prefix_eq(#[0,0]) Block Filter Cond: prefix_eq(#[0,0]) select * from t1 where c3=1; @@ -189,7 +189,7 @@ TP QUERY PLAN Project -> Aggregate Aggregate Functions: starcount(1) - -> Table Scan on d1.t1i1(index) + -> Index Table Scan on t1.t1i1 Filter Cond: prefix_between(#[0,0]) Block Filter Cond: prefix_between(#[0,0]) select count(*) from t1 where c3 between 100 and 200; @@ -210,7 +210,7 @@ TP QUERY PLAN Project -> Aggregate Aggregate Functions: starcount(1) - -> Table Scan on d1.t1i1(index) + -> Index Table Scan on t1.t1i1 Filter Cond: prefix_in(#[0,0]) Block Filter Cond: prefix_in(#[0,0]) select count(*) from t1 where c3 in(1,13,15,90,99); @@ -221,7 +221,7 @@ TP QUERY PLAN Project -> Aggregate Aggregate Functions: starcount(1) - -> Table Scan on d1.t1i1(index) + -> Index Table Scan on t1.t1i1 Filter Cond: prefix_between(#[0,0]), (serial_extract(#[0,0], 2, INT)) < 100) Block Filter Cond: prefix_between(#[0,0]) select count(*) from t1 where c3 between 1 and 100 and c5 <100; @@ -232,7 +232,7 @@ TP QUERY PLAN Project -> Aggregate Aggregate Functions: starcount(1) - -> Table Scan on d1.t1i1(index) + -> Index Table Scan on t1.t1i1 Filter Cond: prefix_between(#[0,0]), (serial_extract(#[0,0], 2, INT)) = -1) Block Filter Cond: prefix_between(#[0,0]) select count(*) from t1 where c3 between 100 and 200 and c5 =-1; @@ -249,7 +249,7 @@ Project Filter Cond: (t1.c2 < 650), t1.c3 BETWEEN 200 AND 300 Block Filter Cond: (t1.c2 < 650) Runtime Filter Probe: t1.__mo_cpkey_col - -> Table Scan on d1.t1i1(index) [ForceOneCN] + -> Index Table Scan on t1.t1i1 [ForceOneCN] Filter Cond: prefix_between(#[0,0]), (serial_extract(#[0,1], 1, INT)) < 650) Block Filter Cond: prefix_between(#[0,0]) select * from t1 where c3 between 200 and 300 and c2 <650; @@ -282,7 +282,7 @@ Project Filter Cond: t1.c2 in ([271386 271461 271485]), t1.c3 BETWEEN 100 AND 500 Block Filter Cond: t1.c2 in ([271386 271461 271485]) Runtime Filter Probe: t1.__mo_cpkey_col - -> Table Scan on d1.t1i1(index) [ForceOneCN] + -> Index Table Scan on t1.t1i1 [ForceOneCN] Filter Cond: prefix_between(#[0,0]), serial_extract(#[0,1], 1, INT)) in ([271386 271461 271485]) Block Filter Cond: prefix_between(#[0,0]) select * from t1 where c3 between 100 and 500 and c2 in (271461, 271485, 271386); @@ -300,7 +300,7 @@ Project -> Table Scan on d1.t1 [ForceOneCN] Filter Cond: (t1.c3 BETWEEN 100 AND 500 or t1.c3 BETWEEN 1000 AND 1100 or t1.c3 BETWEEN 1300 AND 1500) Runtime Filter Probe: t1.__mo_cpkey_col - -> Table Scan on d1.t1i1(index) [ForceOneCN] + -> Index Table Scan on t1.t1i1 [ForceOneCN] Filter Cond: (prefix_between(#[0,0]) or prefix_between(#[0,0]) or prefix_between(#[0,0])) Block Filter Cond: (prefix_between(#[0,0]) or prefix_between(#[0,0]) or prefix_between(#[0,0])) explain select count(*) from t1 where c3 between 100 and 500 or c3 between 1000 and 1100 or c3 between 1300 and 1500; @@ -308,7 +308,7 @@ TP QUERY PLAN Project -> Aggregate Aggregate Functions: starcount(1) - -> Table Scan on d1.t1i1(index) + -> Index Table Scan on t1.t1i1 Filter Cond: (prefix_between(#[0,0]) or prefix_between(#[0,0]) or prefix_between(#[0,0])) Block Filter Cond: (prefix_between(#[0,0]) or prefix_between(#[0,0]) or prefix_between(#[0,0])) select count(*) from t1 where c3 between 100 and 500 or c3 between 1000 and 1100 or c3 between 1300 and 1500; @@ -341,7 +341,7 @@ Project -> Table Scan on d1.t1 [ForceOneCN] Filter Cond: (t1.c3 BETWEEN 100 AND 500 or t1.c3 BETWEEN 1000 AND 1100 or t1.c3 in ([271386 271461 271485])) Runtime Filter Probe: t1.__mo_cpkey_col - -> Table Scan on d1.t1i1(index) [ForceOneCN] + -> Index Table Scan on t1.t1i1 [ForceOneCN] Filter Cond: (prefix_between(#[0,0]) or prefix_between(#[0,0]) or prefix_in(#[0,0])) Block Filter Cond: (prefix_between(#[0,0]) or prefix_between(#[0,0]) or prefix_in(#[0,0])) explain select count(*) from t1 where c3 between 100 and 500 or c3 between 1000 and 1100 or c3 in (271461, 271485, 271386); @@ -349,7 +349,7 @@ TP QUERY PLAN Project -> Aggregate Aggregate Functions: starcount(1) - -> Table Scan on d1.t1i1(index) + -> Index Table Scan on t1.t1i1 Filter Cond: (prefix_between(#[0,0]) or prefix_between(#[0,0]) or prefix_in(#[0,0])) Block Filter Cond: (prefix_between(#[0,0]) or prefix_between(#[0,0]) or prefix_in(#[0,0])) select count(*) from t1 where c3 between 100 and 500 or c3 between 1000 and 1100 or c3 in (271461, 271485, 271386); @@ -377,7 +377,7 @@ Project Filter Cond: t2.c2 in ([1 2 3 4 5 6 7 8 9]) Block Filter Cond: t2.c2 in ([1 2 3 4 5 6 7 8 9]) Runtime Filter Probe: t2.c1 - -> Table Scan on d1.t2i1(index) [ForceOneCN] + -> Index Table Scan on t2.t2i1 [ForceOneCN] Filter Cond: prefix_in(#[0,0]) Block Filter Cond: prefix_in(#[0,0]) select * from t2 where c2 in (1,2,3,4,5,6,7,8,9); @@ -411,7 +411,7 @@ Project Filter Cond: t2.c2 in ([1 2 3 4 5 6 7 8 9]), t2.c3 in ([1 2 3]) Block Filter Cond: t2.c2 in ([1 2 3 4 5 6 7 8 9]) Runtime Filter Probe: t2.c1 - -> Table Scan on d1.t2i1(index) [ForceOneCN] + -> Index Table Scan on t2.t2i1 [ForceOneCN] Filter Cond: prefix_in(#[0,0]), serial_extract(#[0,0], 1, INT)) in ([1 2 3]) Block Filter Cond: prefix_in(#[0,0]) select * from t2 where c2 in (1,2,3,4,5,6,7,8,9) and c3 in (1,2,3); @@ -433,7 +433,7 @@ Project Filter Cond: t2.c4 in ([1 2 3 4 5 6 7 8 9]), t2.c5 in ([2 3 4]) Block Filter Cond: t2.c4 in ([1 2 3 4 5 6 7 8 9]) Runtime Filter Probe: t2.c1 - -> Table Scan on d1.t2i2(index) [ForceOneCN] + -> Index Table Scan on t2.t2i2 [ForceOneCN] Filter Cond: prefix_in(#[0,0]), serial_extract(#[0,0], 1, INT)) in ([2 3 4]) Block Filter Cond: prefix_in(#[0,0]) select * from t2 where c4 in (1,2,3,4,5,6,7,8,9) and c5 in (2,3,4); @@ -458,7 +458,7 @@ Project Filter Cond: t2.c4 in ([1 2 3 4 5 6 7 8 9]), t2.c1 BETWEEN 1 AND 10000 Block Filter Cond: t2.c4 in ([1 2 3 4 5 6 7 8 9]), t2.c1 BETWEEN 1 AND 10000 Runtime Filter Probe: t2.c1 - -> Table Scan on d1.t2i2(index) [ForceOneCN] + -> Index Table Scan on t2.t2i2 [ForceOneCN] Filter Cond: prefix_in(#[0,0]), serial_extract(#[0,0], 2, INT)) BETWEEN 1 AND 10000 Block Filter Cond: prefix_in(#[0,0]) select * from t2 where c4 in (1,2,3,4,5,6,7,8,9) and c1 between 1 and 10000; diff --git a/test/distributed/cases/optimizer/index.result b/test/distributed/cases/optimizer/index.result index 4ef4caa8b79e2..6d5d94121459e 100644 --- a/test/distributed/cases/optimizer/index.result +++ b/test/distributed/cases/optimizer/index.result @@ -35,7 +35,7 @@ Project Filter Cond: (t1.c3 = 11) Block Filter Cond: (t1.c3 = 11) Runtime Filter Probe: t1.c1 - -> Table Scan on d1.id1(index) [ForceOneCN] + -> Index Table Scan on t1.id1 [ForceOneCN] Filter Cond: (#[0,0] = 11) Block Filter Cond: (#[0,0] = 11) select * from t1,t2 where t1.c1=t2.c0 and t1.c3=11; @@ -213,7 +213,7 @@ select * from t1 where c2=1; c1 c2 c3 1 1 1 explain select * from t1 where c3<2000; -TP QURERY PLAN +TP QUERY PLAN Project -> Table Scan on d1.t1 Filter Cond: (t1.c3 < 2000) @@ -250,4 +250,4 @@ insert into t1 select *,1111,* from generate_series(100001,150000) g; update t1 set c1=c1+1000000, c2=1,c3=c3-1000000 where c2=1; delete from t1; drop table t1; -drop database d1; \ No newline at end of file +drop database d1; diff --git a/test/distributed/cases/optimizer/like.result b/test/distributed/cases/optimizer/like.result index abba4239ea6f6..100d641813800 100644 --- a/test/distributed/cases/optimizer/like.result +++ b/test/distributed/cases/optimizer/like.result @@ -82,7 +82,7 @@ Project -> Table Scan on d1.t1 [ForceOneCN] Filter Cond: (t1.c2 = '123') Runtime Filter Probe: t1.c1 - -> Table Scan on d1.c2(index) [ForceOneCN] + -> Index Table Scan on t1.c2 [ForceOneCN] Filter Cond: prefix_eq(#[0,0]) Block Filter Cond: prefix_eq(#[0,0]) select * from t1 where c2 like '123'; From b2b0864b66f4b0bbaa0e0762bfceccb0122ab18d Mon Sep 17 00:00:00 2001 From: Kai Cao Date: Fri, 20 Dec 2024 15:11:19 +0800 Subject: [PATCH 3/5] [Cherry-pick] revert maximum value of max_allowed_packet to 1G (#20852) revert maximum value of max_allowed_packet to 1G Approved by: @daviszhen --- pkg/frontend/variables.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/frontend/variables.go b/pkg/frontend/variables.go index 48b4a777a7048..84d62ec3993bd 100644 --- a/pkg/frontend/variables.go +++ b/pkg/frontend/variables.go @@ -1040,7 +1040,7 @@ var gSysVarsDefs = map[string]SystemVariable{ Scope: ScopeBoth, Dynamic: true, SetVarHintApplies: false, - Type: InitSystemVariableIntType("max_allowed_packet", 1024, 67108864, false), + Type: InitSystemVariableIntType("max_allowed_packet", 1024, 1073741824, false), Default: int64(67108864), }, "version_comment": { From 2b6ab7e70c18feab704ec7bf92f998587a5952d6 Mon Sep 17 00:00:00 2001 From: qingxinhome <70939751+qingxinhome@users.noreply.github.com> Date: Fri, 20 Dec 2024 16:09:45 +0800 Subject: [PATCH 4/5] Locate sql parser error new-main (#20813) debug SQL Parser error issue when alter table Approved by: @badboynt1, @m-schen, @ouyuanning, @heni02 --- pkg/sql/compile/alter.go | 32 +- pkg/sql/compile/alter_test.go | 778 +++++++++++++++++ pkg/sql/compile/compile_test.go | 19 + pkg/sql/compile/ddl.go | 95 ++- pkg/sql/compile/ddl_test.go | 802 +++++++++++++++++- pkg/sql/compile/util.go | 2 +- .../transaction_enhance.result | 2 +- 7 files changed, 1696 insertions(+), 34 deletions(-) create mode 100644 pkg/sql/compile/alter_test.go diff --git a/pkg/sql/compile/alter.go b/pkg/sql/compile/alter.go index 5ea1fc37a681d..14eeb649bb532 100644 --- a/pkg/sql/compile/alter.go +++ b/pkg/sql/compile/alter.go @@ -35,10 +35,6 @@ func (s *Scope) AlterTableCopy(c *Compile) error { dbName = c.db } tblName := qry.GetTableDef().GetName() - - if err := lockMoDatabase(c, dbName, lock.LockMode_Shared); err != nil { - return err - } dbSource, err := c.e.Database(c.proc.Ctx, dbName, c.proc.GetTxnOperator()) if err != nil { return moerr.NewBadDB(c.proc.Ctx, dbName) @@ -51,13 +47,20 @@ func (s *Scope) AlterTableCopy(c *Compile) error { if c.proc.GetTxnOperator().Txn().IsPessimistic() { var retryErr error + // 0. lock origin database metadata in catalog + if err = lockMoDatabase(c, dbName, lock.LockMode_Shared); err != nil { + return err + } + // 1. lock origin table metadata in catalog if err = lockMoTable(c, dbName, tblName, lock.LockMode_Exclusive); err != nil { if !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetry) && !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged) { return err } - retryErr = err + // The changes recorded in the data dictionary table imply a change in the structure of the corresponding entity table, + // therefore it is necessary to rebuild the logical plan and redirect err to ErrTxnNeedRetryWithDefChanged + retryErr = moerr.NewTxnNeedRetryWithDefChanged(c.proc.Ctx) } // 2. lock origin table @@ -69,16 +72,31 @@ func (s *Scope) AlterTableCopy(c *Compile) error { if err = lockTable(c.proc.Ctx, c.e, c.proc, originRel, dbName, partitionTableNames, true); err != nil { if !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetry) && !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged) { + c.proc.Error(c.proc.Ctx, "lock origin table for alter table", + zap.String("databaseName", c.db), + zap.String("origin tableName", qry.GetTableDef().Name), + zap.Error(err)) return err } - retryErr = err + retryErr = moerr.NewTxnNeedRetryWithDefChanged(c.proc.Ctx) } if qry.TableDef.Indexes != nil { for _, indexdef := range qry.TableDef.Indexes { if indexdef.TableExist { if err = lockIndexTable(c.proc.Ctx, dbSource, c.e, c.proc, indexdef.IndexTableName, true); err != nil { - return err + if !moerr.IsMoErrCode(err, moerr.ErrParseError) && + !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetry) && + !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged) { + c.proc.Error(c.proc.Ctx, "lock index table for alter table", + zap.String("databaseName", c.db), + zap.String("origin tableName", qry.GetTableDef().Name), + zap.String("index name", indexdef.IndexName), + zap.String("index tableName", indexdef.IndexTableName), + zap.Error(err)) + return err + } + retryErr = moerr.NewTxnNeedRetryWithDefChanged(c.proc.Ctx) } } } diff --git a/pkg/sql/compile/alter_test.go b/pkg/sql/compile/alter_test.go new file mode 100644 index 0000000000000..bfd6e7738cca6 --- /dev/null +++ b/pkg/sql/compile/alter_test.go @@ -0,0 +1,778 @@ +// Copyright 2024 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// 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 compile + +import ( + "context" + "testing" + "time" + + "github.com/golang/mock/gomock" + "github.com/prashantv/gostub" + "github.com/smartystreets/goconvey/convey" + "github.com/stretchr/testify/assert" + + "github.com/matrixorigin/matrixone/pkg/common/buffer" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" + "github.com/matrixorigin/matrixone/pkg/pb/lock" + plan2 "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/sql/plan" + "github.com/matrixorigin/matrixone/pkg/testutil" + "github.com/matrixorigin/matrixone/pkg/vm/engine" + "github.com/matrixorigin/matrixone/pkg/vm/process" +) + +func TestScope_AlterTableInplace(t *testing.T) { + tableDef := &plan.TableDef{ + TblId: 282826, + Name: "dept", + Cols: []*plan.ColDef{ + { + ColId: 0, + Name: "deptno", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 27, + NotNullable: false, + AutoIncr: true, + Width: 32, + Scale: -1, + }, + Default: &plan2.Default{}, + NotNull: true, + Primary: true, + Pkidx: 0, + }, + { + ColId: 1, + Name: "dname", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 61, + NotNullable: false, + AutoIncr: false, + Width: 15, + Scale: 0, + }, + Default: &plan2.Default{}, + NotNull: false, + Primary: false, + Pkidx: 0, + }, + { + ColId: 2, + Name: "loc", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 61, + NotNullable: false, + AutoIncr: false, + Width: 50, + Scale: 0, + }, + Default: &plan2.Default{}, + NotNull: false, + Primary: false, + Pkidx: 0, + }, + }, + Pkey: &plan.PrimaryKeyDef{ + Cols: nil, + PkeyColId: 0, + PkeyColName: "deptno", + Names: []string{"deptno"}, + }, + Indexes: []*plan.IndexDef{ + { + IndexName: "idxloc", + Parts: []string{"loc", "__mo_alias_deptno"}, + Unique: false, + IndexTableName: "__mo_index_secondary_0193dc98-4148-74f4-808a", + TableExist: true, + }, + }, + Defs: []*plan2.TableDef_DefType{ + { + Def: &plan.TableDef_DefType_Properties{ + Properties: &plan.PropertiesDef{ + Properties: []*plan.Property{ + { + Key: "relkind", + Value: "r", + }, + }, + }, + }, + }, + }, + } + + alterTable := &plan2.AlterTable{ + Database: "test", + TableDef: tableDef, + Actions: []*plan2.AlterTable_Action{ + { + Action: &plan2.AlterTable_Action_AddIndex{ + AddIndex: &plan2.AlterTableAddIndex{ + DbName: "test", + TableName: "dept", + OriginTablePrimaryKey: "deptno", + IndexTableExist: true, + IndexInfo: &plan2.CreateTable{ + TableDef: &plan.TableDef{ + Indexes: []*plan.IndexDef{ + { + IndexName: "idx", + Parts: []string{"dname", "__mo_alias_deptno"}, + Unique: false, + IndexTableName: "__mo_index_secondary_0193d918", + TableExist: true, + }, + }, + }, + IndexTables: []*plan.TableDef{ + { + Name: "__mo_index_secondary_0193d918-3e7b", + Cols: []*plan.ColDef{ + { + Name: "__mo_index_idx_col", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 61, + NotNullable: false, + AutoIncr: false, + Width: 65535, + Scale: 0, + }, + NotNull: false, + Default: &plan2.Default{ + NullAbility: false, + }, + Pkidx: 0, + }, + { + Name: "__mo_index_pri_col", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 27, + NotNullable: false, + AutoIncr: false, + Width: 32, + Scale: -1, + }, + NotNull: false, + Default: &plan2.Default{ + NullAbility: false, + }, + Pkidx: 0, + }, + }, + Pkey: &plan2.PrimaryKeyDef{ + PkeyColName: "__mo_index_idx_col", + Names: []string{"__mo_index_idx_col"}, + }, + }, + }, + }, + }, + }, + }, + }, + } + + cplan := &plan.Plan{ + Plan: &plan2.Plan_Ddl{ + Ddl: &plan2.DataDefinition{ + DdlType: plan2.DataDefinition_ALTER_TABLE, + Definition: &plan2.DataDefinition_AlterTable{ + AlterTable: alterTable, + }, + }, + }, + } + + s := &Scope{ + Magic: AlterTable, + Plan: cplan, + TxnOffset: 0, + } + + sql := `alter table dept add index idx(dname)` + + convey.Convey("create table lock mo_database", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOpWithPessimistic(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDb := mock_frontend.NewMockDatabase(ctrl) + mockDb.EXPECT().GetDatabaseId(gomock.Any()).Return("12").AnyTimes() + mockDb.EXPECT().Relation(gomock.Any(), gomock.Any(), gomock.Any()).Return(relation, nil).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDb, nil).AnyTimes() + + getConstraintDef := gostub.Stub(&GetConstraintDef, func(_ context.Context, _ engine.Relation) (*engine.ConstraintDef, error) { + cstrDef := &engine.ConstraintDef{} + cstrDef.Cts = make([]engine.Constraint, 0) + return cstrDef, nil + }) + defer getConstraintDef.Reset() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return moerr.NewTxnNeedRetryWithDefChangedNoCtx() + }) + defer lockMoDb.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.AlterTableInplace(c)) + }) + + convey.Convey("create table lock mo_tables", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOpWithPessimistic(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDb := mock_frontend.NewMockDatabase(ctrl) + mockDb.EXPECT().GetDatabaseId(gomock.Any()).Return("12").AnyTimes() + mockDb.EXPECT().Relation(gomock.Any(), gomock.Any(), gomock.Any()).Return(relation, nil).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDb, nil).AnyTimes() + + getConstraintDef := gostub.Stub(&GetConstraintDef, func(_ context.Context, _ engine.Relation) (*engine.ConstraintDef, error) { + cstrDef := &engine.ConstraintDef{} + cstrDef.Cts = make([]engine.Constraint, 0) + return cstrDef, nil + }) + defer getConstraintDef.Reset() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoDb.Reset() + + lockMoTbl := gostub.Stub(&lockMoTable, func(_ *Compile, _ string, _ string, _ lock.LockMode) error { + return moerr.NewTxnNeedRetryNoCtx() + }) + defer lockMoTbl.Reset() + + lockTbl := gostub.Stub(&lockTable, func(_ context.Context, _ engine.Engine, _ *process.Process, _ engine.Relation, _ string, _ []string, _ bool) error { + return moerr.NewTxnNeedRetryNoCtx() + }) + defer lockTbl.Reset() + + lockIdxTbl := gostub.Stub(&lockIndexTable, func(_ context.Context, _ engine.Database, _ engine.Engine, _ *process.Process, _ string, _ bool) error { + return moerr.NewParseErrorNoCtx("table \"__mo_index_unique_0192748f-6868-7182-a6de-2e457c2975c6\" does not exist") + }) + defer lockIdxTbl.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.AlterTableInplace(c)) + }) + + convey.Convey("create table lock index table1", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOpWithPessimistic(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDb := mock_frontend.NewMockDatabase(ctrl) + mockDb.EXPECT().GetDatabaseId(gomock.Any()).Return("12").AnyTimes() + mockDb.EXPECT().Relation(gomock.Any(), gomock.Any(), gomock.Any()).Return(relation, nil).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDb, nil).AnyTimes() + + getConstraintDef := gostub.Stub(&GetConstraintDef, func(_ context.Context, _ engine.Relation) (*engine.ConstraintDef, error) { + cstrDef := &engine.ConstraintDef{} + cstrDef.Cts = make([]engine.Constraint, 0) + return cstrDef, nil + }) + defer getConstraintDef.Reset() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoDb.Reset() + + lockMoTbl := gostub.Stub(&lockMoTable, func(_ *Compile, _ string, _ string, _ lock.LockMode) error { + return moerr.NewTxnNeedRetryNoCtx() + }) + defer lockMoTbl.Reset() + + lockTbl := gostub.Stub(&lockTable, func(_ context.Context, _ engine.Engine, _ *process.Process, _ engine.Relation, _ string, _ []string, _ bool) error { + return moerr.NewTxnNeedRetryNoCtx() + }) + defer lockTbl.Reset() + + lockIdxTbl := gostub.Stub(&lockIndexTable, func(_ context.Context, _ engine.Database, _ engine.Engine, _ *process.Process, _ string, _ bool) error { + return moerr.NewParseErrorNoCtx("table \"__mo_index_unique_0192748f-6868-7182-a6de-2e457c2975c6\" does not exist") + }) + defer lockIdxTbl.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.AlterTableCopy(c)) + }) + + convey.Convey("create table lock index table2", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOpWithPessimistic(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDb := mock_frontend.NewMockDatabase(ctrl) + mockDb.EXPECT().GetDatabaseId(gomock.Any()).Return("12").AnyTimes() + mockDb.EXPECT().Relation(gomock.Any(), gomock.Any(), gomock.Any()).Return(relation, nil).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDb, nil).AnyTimes() + + getConstraintDef := gostub.Stub(&GetConstraintDef, func(_ context.Context, _ engine.Relation) (*engine.ConstraintDef, error) { + cstrDef := &engine.ConstraintDef{} + cstrDef.Cts = make([]engine.Constraint, 0) + return cstrDef, nil + }) + defer getConstraintDef.Reset() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoDb.Reset() + + lockMoTbl := gostub.Stub(&lockMoTable, func(_ *Compile, _ string, _ string, _ lock.LockMode) error { + return moerr.NewTxnNeedRetryNoCtx() + }) + defer lockMoTbl.Reset() + + lockTbl := gostub.Stub(&lockTable, func(_ context.Context, _ engine.Engine, _ *process.Process, _ engine.Relation, _ string, _ []string, _ bool) error { + return moerr.NewTxnNeedRetryNoCtx() + }) + defer lockTbl.Reset() + + lockIdxTbl := gostub.Stub(&lockIndexTable, func(_ context.Context, _ engine.Database, _ engine.Engine, _ *process.Process, _ string, _ bool) error { + return moerr.NewTxnNeedRetryNoCtx() + }) + defer lockIdxTbl.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.AlterTableInplace(c)) + }) +} + +func TestScope_AlterTableCopy(t *testing.T) { + tableDef := &plan.TableDef{ + TblId: 282826, + Name: "dept", + Cols: []*plan.ColDef{ + { + ColId: 0, + Name: "deptno", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 27, + NotNullable: false, + AutoIncr: true, + Width: 32, + Scale: -1, + }, + Default: &plan2.Default{}, + NotNull: true, + Primary: true, + Pkidx: 0, + }, + { + ColId: 1, + Name: "dname", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 61, + NotNullable: false, + AutoIncr: false, + Width: 15, + Scale: 0, + }, + Default: &plan2.Default{}, + NotNull: false, + Primary: false, + Pkidx: 0, + }, + { + ColId: 2, + Name: "loc", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 61, + NotNullable: false, + AutoIncr: false, + Width: 50, + Scale: 0, + }, + Default: &plan2.Default{}, + NotNull: false, + Primary: false, + Pkidx: 0, + }, + }, + Pkey: &plan.PrimaryKeyDef{ + Cols: nil, + PkeyColId: 0, + PkeyColName: "deptno", + Names: []string{"deptno"}, + }, + Indexes: []*plan.IndexDef{ + { + IndexName: "idxloc", + Parts: []string{"loc", "__mo_alias_deptno"}, + Unique: false, + IndexTableName: "__mo_index_secondary_0193dc98-4148-74f4-808a", + TableExist: true, + }, + }, + Defs: []*plan2.TableDef_DefType{ + { + Def: &plan.TableDef_DefType_Properties{ + Properties: &plan.PropertiesDef{ + Properties: []*plan.Property{ + { + Key: "relkind", + Value: "r", + }, + }, + }, + }, + }, + }, + } + + copyTableDef := &plan.TableDef{ + TblId: 282826, + Name: "dept_copy_0193dcb4-4c07-77d8", + Cols: []*plan.ColDef{ + { + ColId: 1, + Name: "deptno", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 27, + NotNullable: false, + AutoIncr: true, + Width: 32, + Scale: -1, + }, + Default: &plan2.Default{}, + NotNull: true, + Primary: true, + Pkidx: 0, + }, + { + ColId: 2, + Name: "dname", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 61, + NotNullable: false, + AutoIncr: false, + Width: 20, + Scale: 0, + }, + Default: &plan2.Default{}, + NotNull: false, + Primary: false, + Pkidx: 0, + }, + { + ColId: 3, + Name: "loc", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 61, + NotNullable: false, + AutoIncr: false, + Width: 50, + Scale: 0, + }, + Default: &plan2.Default{}, + NotNull: false, + Primary: false, + Pkidx: 0, + }, + { + ColId: 4, + Name: "__mo_rowid", + Hidden: true, + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 101, + NotNullable: true, + AutoIncr: false, + Width: 0, + Scale: 0, + Table: "dept", + }, + Default: &plan2.Default{}, + NotNull: false, + Primary: false, + Pkidx: 0, + }, + }, + TableType: "r", + Createsql: `create table dept (deptno int unsigned auto_increment comment "部门编号", dname varchar(15) comment "部门名称", loc varchar(50) comment "部门所在位置", index idxloc (loc), primary key (deptno)) comment = '部门表'`, + Pkey: &plan.PrimaryKeyDef{ + Cols: nil, + PkeyColId: 0, + PkeyColName: "deptno", + Names: []string{"deptno"}, + }, + Indexes: []*plan.IndexDef{ + { + IndexName: "idxloc", + Parts: []string{"loc", "__mo_alias_deptno"}, + Unique: false, + IndexTableName: "__mo_index_secondary_0193dc98-4148-74f4-808a", + TableExist: true, + }, + }, + Defs: []*plan2.TableDef_DefType{ + { + Def: &plan.TableDef_DefType_Properties{ + Properties: &plan.PropertiesDef{ + Properties: []*plan.Property{ + { + Key: "relkind", + Value: "r", + }, + }, + }, + }, + }, + }, + } + + alterTable := &plan2.AlterTable{ + Database: "test", + TableDef: tableDef, + CopyTableDef: copyTableDef, + } + + cplan := &plan.Plan{ + Plan: &plan2.Plan_Ddl{ + Ddl: &plan2.DataDefinition{ + DdlType: plan2.DataDefinition_ALTER_TABLE, + Definition: &plan2.DataDefinition_AlterTable{ + AlterTable: alterTable, + }, + }, + }, + } + + s := &Scope{ + Magic: AlterTable, + Plan: cplan, + TxnOffset: 0, + } + + sql := `alter table dept add index idx(dname)` + + convey.Convey("create table lock mo_database", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOpWithPessimistic(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDb := mock_frontend.NewMockDatabase(ctrl) + mockDb.EXPECT().GetDatabaseId(gomock.Any()).Return("12").AnyTimes() + mockDb.EXPECT().Relation(gomock.Any(), gomock.Any(), gomock.Any()).Return(relation, nil).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDb, nil).AnyTimes() + + getConstraintDef := gostub.Stub(&GetConstraintDef, func(_ context.Context, _ engine.Relation) (*engine.ConstraintDef, error) { + return nil, nil + }) + defer getConstraintDef.Reset() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return moerr.NewTxnNeedRetryWithDefChangedNoCtx() + }) + defer lockMoDb.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.AlterTableCopy(c)) + }) + + convey.Convey("create table lock index table1", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOpWithPessimistic(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDb := mock_frontend.NewMockDatabase(ctrl) + mockDb.EXPECT().GetDatabaseId(gomock.Any()).Return("12").AnyTimes() + mockDb.EXPECT().Relation(gomock.Any(), gomock.Any(), gomock.Any()).Return(relation, nil).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDb, nil).AnyTimes() + + getConstraintDef := gostub.Stub(&GetConstraintDef, func(_ context.Context, _ engine.Relation) (*engine.ConstraintDef, error) { + return nil, nil + }) + defer getConstraintDef.Reset() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoDb.Reset() + + lockMoTbl := gostub.Stub(&lockMoTable, func(_ *Compile, _ string, _ string, _ lock.LockMode) error { + return moerr.NewTxnNeedRetryNoCtx() + }) + defer lockMoTbl.Reset() + + lockTbl := gostub.Stub(&lockTable, func(_ context.Context, _ engine.Engine, _ *process.Process, _ engine.Relation, _ string, _ []string, _ bool) error { + return moerr.NewTxnNeedRetryNoCtx() + }) + defer lockTbl.Reset() + + lockIdxTbl := gostub.Stub(&lockIndexTable, func(_ context.Context, _ engine.Database, _ engine.Engine, _ *process.Process, _ string, _ bool) error { + return moerr.NewParseErrorNoCtx("table \"__mo_index_unique_0192748f-6868-7182-a6de-2e457c2975c6\" does not exist") + }) + defer lockIdxTbl.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.AlterTableCopy(c)) + }) + + convey.Convey("create table lock index table2", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOpWithPessimistic(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDb := mock_frontend.NewMockDatabase(ctrl) + mockDb.EXPECT().GetDatabaseId(gomock.Any()).Return("12").AnyTimes() + mockDb.EXPECT().Relation(gomock.Any(), gomock.Any(), gomock.Any()).Return(relation, nil).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDb, nil).AnyTimes() + + getConstraintDef := gostub.Stub(&GetConstraintDef, func(_ context.Context, _ engine.Relation) (*engine.ConstraintDef, error) { + return nil, nil + }) + defer getConstraintDef.Reset() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoDb.Reset() + + lockMoTbl := gostub.Stub(&lockMoTable, func(_ *Compile, _ string, _ string, _ lock.LockMode) error { + return moerr.NewTxnNeedRetryNoCtx() + }) + defer lockMoTbl.Reset() + + lockTbl := gostub.Stub(&lockTable, func(_ context.Context, _ engine.Engine, _ *process.Process, _ engine.Relation, _ string, _ []string, _ bool) error { + return moerr.NewTxnNeedRetryNoCtx() + }) + defer lockTbl.Reset() + + lockIdxTbl := gostub.Stub(&lockIndexTable, func(_ context.Context, _ engine.Database, _ engine.Engine, _ *process.Process, _ string, _ bool) error { + return moerr.NewTxnNeedRetryNoCtx() + }) + defer lockIdxTbl.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.AlterTableCopy(c)) + }) +} diff --git a/pkg/sql/compile/compile_test.go b/pkg/sql/compile/compile_test.go index 1ab8d8fb823ee..7b97529023fd7 100644 --- a/pkg/sql/compile/compile_test.go +++ b/pkg/sql/compile/compile_test.go @@ -241,6 +241,25 @@ func newTestTxnClientAndOp(ctrl *gomock.Controller) (client.TxnClient, client.Tx return txnClient, txnOperator } +func newTestTxnClientAndOpWithPessimistic(ctrl *gomock.Controller) (client.TxnClient, client.TxnOperator) { + txnOperator := mock_frontend.NewMockTxnOperator(ctrl) + txnOperator.EXPECT().Commit(gomock.Any()).Return(nil).AnyTimes() + txnOperator.EXPECT().Rollback(gomock.Any()).Return(nil).AnyTimes() + txnOperator.EXPECT().GetWorkspace().Return(&Ws{}).AnyTimes() + txnOperator.EXPECT().Txn().Return(txn.TxnMeta{ + Mode: txn.TxnMode_Pessimistic, + }).AnyTimes() + txnOperator.EXPECT().TxnOptions().Return(txn.TxnOptions{}).AnyTimes() + txnOperator.EXPECT().NextSequence().Return(uint64(0)).AnyTimes() + txnOperator.EXPECT().EnterRunSql().Return().AnyTimes() + txnOperator.EXPECT().ExitRunSql().Return().AnyTimes() + txnOperator.EXPECT().Snapshot().Return(txn.CNTxnSnapshot{}, nil).AnyTimes() + txnOperator.EXPECT().Status().Return(txn.TxnStatus_Active).AnyTimes() + txnClient := mock_frontend.NewMockTxnClient(ctrl) + txnClient.EXPECT().New(gomock.Any(), gomock.Any()).Return(txnOperator, nil).AnyTimes() + return txnClient, txnOperator +} + func newTestCase(sql string, t *testing.T) compileTestCase { proc := testutil.NewProcess() proc.GetSessionInfo().Buf = buffer.New() diff --git a/pkg/sql/compile/ddl.go b/pkg/sql/compile/ddl.go index d47bf33b2bc91..57616333eae95 100644 --- a/pkg/sql/compile/ddl.go +++ b/pkg/sql/compile/ddl.go @@ -385,10 +385,6 @@ func (s *Scope) AlterTableInplace(c *Compile) error { } tblName := qry.GetTableDef().GetName() - - if err := lockMoDatabase(c, dbName, lock.LockMode_Shared); err != nil { - return err - } dbSource, err := c.e.Database(c.proc.Ctx, dbName, c.proc.GetTxnOperator()) if err != nil { return moerr.NewBadDB(c.proc.Ctx, dbName) @@ -428,13 +424,20 @@ func (s *Scope) AlterTableInplace(c *Compile) error { if c.proc.GetTxnOperator().Txn().IsPessimistic() { var retryErr error + // 0. lock origin database metadata in catalog + if err = lockMoDatabase(c, dbName, lock.LockMode_Shared); err != nil { + return err + } + // 1. lock origin table metadata in catalog if err = lockMoTable(c, dbName, tblName, lock.LockMode_Exclusive); err != nil { if !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetry) && !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged) { return err } - retryErr = err + // The changes recorded in the data dictionary table imply a change in the structure of the corresponding entity table, + // therefore it is necessary to rebuild the logical plan and redirect err to ErrTxnNeedRetryWithDefChanged + retryErr = moerr.NewTxnNeedRetryWithDefChanged(c.proc.Ctx) } // 2. lock origin table @@ -447,7 +450,28 @@ func (s *Scope) AlterTableInplace(c *Compile) error { !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged) { return err } - retryErr = err + retryErr = moerr.NewTxnNeedRetryWithDefChanged(c.proc.Ctx) + } + + if qry.TableDef.Indexes != nil { + for _, indexdef := range qry.TableDef.Indexes { + if indexdef.TableExist { + if err = lockIndexTable(c.proc.Ctx, dbSource, c.e, c.proc, indexdef.IndexTableName, true); err != nil { + if !moerr.IsMoErrCode(err, moerr.ErrParseError) && + !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetry) && + !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged) { + c.proc.Error(c.proc.Ctx, "lock index table for alter table", + zap.String("databaseName", c.db), + zap.String("origin tableName", qry.GetTableDef().Name), + zap.String("index name", indexdef.IndexName), + zap.String("index tableName", indexdef.IndexTableName), + zap.Error(err)) + return err + } + retryErr = moerr.NewTxnNeedRetryWithDefChanged(c.proc.Ctx) + } + } + } } // 3. lock foreign key's table @@ -970,7 +994,7 @@ func (s *Scope) CreateTable(c *Compile) error { // convert the plan's defs to the execution's defs exeDefs, err := planDefsToExeDefs(qry.GetTableDef()) if err != nil { - c.proc.Info(c.proc.Ctx, "createTable", + c.proc.Error(c.proc.Ctx, "createTable", zap.String("databaseName", c.db), zap.String("tableName", qry.GetTableDef().GetName()), zap.Error(err), @@ -1033,7 +1057,7 @@ func (s *Scope) CreateTable(c *Compile) error { } if err = lockMoTable(c, dbName, tblName, lock.LockMode_Exclusive); err != nil { - c.proc.Info(c.proc.Ctx, "createTable", + c.proc.Error(c.proc.Ctx, "createTable", zap.String("databaseName", c.db), zap.String("tableName", qry.GetTableDef().GetName()), zap.Error(err), @@ -1042,7 +1066,7 @@ func (s *Scope) CreateTable(c *Compile) error { } if err = dbSource.Create(context.WithValue(c.proc.Ctx, defines.SqlKey{}, c.sql), tblName, append(exeCols, exeDefs...)); err != nil { - c.proc.Info(c.proc.Ctx, "createTable", + c.proc.Error(c.proc.Ctx, "createTable", zap.String("databaseName", c.db), zap.String("tableName", qry.GetTableDef().GetName()), zap.Error(err), @@ -1055,7 +1079,7 @@ func (s *Scope) CreateTable(c *Compile) error { storageCols := planColsToExeCols(table.GetCols()) storageDefs, err := planDefsToExeDefs(table) if err != nil { - c.proc.Info(c.proc.Ctx, "createTable", + c.proc.Error(c.proc.Ctx, "createTable", zap.String("databaseName", c.db), zap.String("tableName", qry.GetTableDef().GetName()), zap.Error(err), @@ -1064,7 +1088,7 @@ func (s *Scope) CreateTable(c *Compile) error { } err = dbSource.Create(c.proc.Ctx, table.GetName(), append(storageCols, storageDefs...)) if err != nil { - c.proc.Info(c.proc.Ctx, "createTable", + c.proc.Error(c.proc.Ctx, "createTable", zap.String("databaseName", c.db), zap.String("tableName", qry.GetTableDef().GetName()), zap.Error(err), @@ -1340,7 +1364,7 @@ func (s *Scope) CreateTable(c *Compile) error { exeCols = planColsToExeCols(planCols) exeDefs, err = planDefsToExeDefs(def) if err != nil { - c.proc.Info(c.proc.Ctx, "createTable", + c.proc.Error(c.proc.Ctx, "createTable", zap.String("databaseName", c.db), zap.String("tableName", qry.GetTableDef().GetName()), zap.Error(err), @@ -1362,7 +1386,7 @@ func (s *Scope) CreateTable(c *Compile) error { } if err := dbSource.Create(c.proc.Ctx, def.Name, append(exeCols, exeDefs...)); err != nil { - c.proc.Info(c.proc.Ctx, "createTable", + c.proc.Error(c.proc.Ctx, "createTable", zap.String("databaseName", c.db), zap.String("tableName", qry.GetTableDef().GetName()), zap.Error(err), @@ -1379,6 +1403,12 @@ func (s *Scope) CreateTable(c *Compile) error { nil, ) if err != nil { + c.proc.Error(c.proc.Ctx, "create index table for maybeCreateAutoIncrement", + zap.String("databaseName", c.db), + zap.String("tableName", qry.GetTableDef().GetName()), + zap.String("index tableName", def.Name), + zap.Error(err), + ) return err } @@ -1403,15 +1433,21 @@ func (s *Scope) CreateTable(c *Compile) error { } err = c.runSql(initSQL) if err != nil { + c.proc.Error(c.proc.Ctx, "create index table for execute initSQL", + zap.String("databaseName", c.db), + zap.String("tableName", qry.GetTableDef().GetName()), + zap.String("index tableName", def.Name), + zap.String("initSQL", initSQL), + zap.Error(err), + ) return err } - } if checkIndexInitializable(dbName, tblName) { newRelation, err := dbSource.Relation(c.proc.Ctx, tblName, nil) if err != nil { - c.proc.Info(c.proc.Ctx, "createTable", + c.proc.Error(c.proc.Ctx, "createTable", zap.String("databaseName", c.db), zap.String("tableName", qry.GetTableDef().GetName()), zap.Error(err), @@ -1442,7 +1478,7 @@ func (s *Scope) CreateTable(c *Compile) error { insertSQL2, err := makeInsertTablePartitionsSQL(c.proc.Ctx, dbSource, newRelation) if err != nil { - c.proc.Info(c.proc.Ctx, "createTable", + c.proc.Error(c.proc.Ctx, "createTable", zap.String("databaseName", c.db), zap.String("tableName", qry.GetTableDef().GetName()), zap.Error(err), @@ -1451,7 +1487,7 @@ func (s *Scope) CreateTable(c *Compile) error { } err = c.runSql(insertSQL2) if err != nil { - c.proc.Info(c.proc.Ctx, "createTable", + c.proc.Error(c.proc.Ctx, "createTable", zap.String("databaseName", c.db), zap.String("tableName", qry.GetTableDef().GetName()), zap.Error(err), @@ -1470,6 +1506,11 @@ func (s *Scope) CreateTable(c *Compile) error { nil, ) if err != nil { + c.proc.Error(c.proc.Ctx, "create table for maybeCreateAutoIncrement", + zap.String("databaseName", c.db), + zap.String("tableName", qry.GetTableDef().GetName()), + zap.Error(err), + ) return err } @@ -1478,6 +1519,12 @@ func (s *Scope) CreateTable(c *Compile) error { catalog.MO_CATALOG, catalog.MO_RETENTION, dbName, tblName, qry.RetentionDeadline) err = c.runSql(insertRetention) if err != nil { + c.proc.Error(c.proc.Ctx, "create table for RetentionDeadline", + zap.String("databaseName", c.db), + zap.String("tableName", qry.GetTableDef().GetName()), + zap.String("insertRetention sql", insertRetention), + zap.Error(err), + ) return err } } @@ -1633,7 +1680,7 @@ func (s *Scope) CreateView(c *Compile) error { return nil } -func checkIndexInitializable(dbName string, tblName string) bool { +var checkIndexInitializable = func(dbName string, tblName string) bool { if dbName == catalog.MOTaskDB { return false } else if dbName == catalog.MO_CATALOG && strings.HasPrefix(tblName, catalog.MO_INDEXES) { @@ -2711,7 +2758,7 @@ func (s *Scope) DropTable(c *Compile) error { return err } -func planDefsToExeDefs(tableDef *plan.TableDef) ([]engine.TableDef, error) { +var planDefsToExeDefs = func(tableDef *plan.TableDef) ([]engine.TableDef, error) { planDefs := tableDef.GetDefs() var exeDefs []engine.TableDef c := new(engine.ConstraintDef) @@ -3545,7 +3592,7 @@ func doLockTable( return err } -func lockTable( +var lockTable = func( ctx context.Context, eng engine.Engine, proc *process.Process, @@ -3577,7 +3624,7 @@ func lockTable( } // lockIndexTable -func lockIndexTable(ctx context.Context, dbSource engine.Database, eng engine.Engine, proc *process.Process, tableName string, defChanged bool) error { +var lockIndexTable = func(ctx context.Context, dbSource engine.Database, eng engine.Engine, proc *process.Process, tableName string, defChanged bool) error { rel, err := dbSource.Relation(ctx, tableName, nil) if err != nil { return err @@ -3612,7 +3659,7 @@ func lockRows( return err } -func maybeCreateAutoIncrement( +var maybeCreateAutoIncrement = func( ctx context.Context, sid string, db engine.Database, @@ -3765,7 +3812,7 @@ func getLockVector(proc *process.Process, accountId uint32, names []string) (*ve return vec, nil } -func lockMoDatabase(c *Compile, dbName string, lockMode lock.LockMode) error { +var lockMoDatabase = func(c *Compile, dbName string, lockMode lock.LockMode) error { dbRel, err := getRelFromMoCatalog(c, catalog.MO_DATABASE) if err != nil { return err @@ -3782,7 +3829,7 @@ func lockMoDatabase(c *Compile, dbName string, lockMode lock.LockMode) error { return nil } -func lockMoTable( +var lockMoTable = func( c *Compile, dbName string, tblName string, diff --git a/pkg/sql/compile/ddl_test.go b/pkg/sql/compile/ddl_test.go index 9e6f0642a9c0d..7f666ea0a3847 100644 --- a/pkg/sql/compile/ddl_test.go +++ b/pkg/sql/compile/ddl_test.go @@ -20,6 +20,7 @@ import ( "time" "github.com/golang/mock/gomock" + "github.com/prashantv/gostub" "github.com/smartystreets/goconvey/convey" "github.com/stretchr/testify/assert" @@ -28,9 +29,11 @@ import ( "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/defines" mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" + "github.com/matrixorigin/matrixone/pkg/pb/lock" plan2 "github.com/matrixorigin/matrixone/pkg/pb/plan" "github.com/matrixorigin/matrixone/pkg/sql/plan" "github.com/matrixorigin/matrixone/pkg/testutil" + "github.com/matrixorigin/matrixone/pkg/txn/client" "github.com/matrixorigin/matrixone/pkg/vm/engine" "github.com/matrixorigin/matrixone/pkg/vm/process" ) @@ -220,7 +223,7 @@ func TestScope_CreateTable(t *testing.T) { assert.Error(t, s.CreateTable(c)) }) - convey.Convey("create table FaultTolerance1", t, func() { + convey.Convey("create table FaultTolerance2", t, func() { ctrl := gomock.NewController(t) defer ctrl.Finish() @@ -259,6 +262,803 @@ func TestScope_CreateTable(t *testing.T) { assert.Error(t, s.CreateTable(c)) }) + convey.Convey("create table FaultTolerance3", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOp(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDbMeta := mock_frontend.NewMockDatabase(ctrl) + mockDbMeta.EXPECT().Relation(gomock.Any(), catalog.MO_DATABASE, gomock.Any()).Return(relation, nil).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDbMeta, nil).AnyTimes() + + planDef2ExecDef := gostub.Stub(&planDefsToExeDefs, func(_ *plan.TableDef) ([]engine.TableDef, error) { + return nil, moerr.NewInternalErrorNoCtx("test error") + }) + defer planDef2ExecDef.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.CreateTable(c)) + }) + + convey.Convey("create table FaultTolerance4", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOp(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDbMeta := mock_frontend.NewMockDatabase(ctrl) + mockDbMeta.EXPECT().Relation(gomock.Any(), catalog.MO_DATABASE, gomock.Any()).Return(relation, nil).AnyTimes() + mockDbMeta.EXPECT().RelationExists(gomock.Any(), gomock.Any(), gomock.Any()).Return(false, nil).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDbMeta, nil).AnyTimes() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoDb.Reset() + + lockMoTbl := gostub.Stub(&lockMoTable, func(_ *Compile, _ string, _ string, _ lock.LockMode) error { + return moerr.NewTxnNeedRetryNoCtx() + }) + defer lockMoTbl.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.CreateTable(c)) + }) + + convey.Convey("create table FaultTolerance5", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOp(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDbMeta := mock_frontend.NewMockDatabase(ctrl) + mockDbMeta.EXPECT().Relation(gomock.Any(), catalog.MO_DATABASE, gomock.Any()).Return(relation, nil).AnyTimes() + mockDbMeta.EXPECT().RelationExists(gomock.Any(), gomock.Any(), gomock.Any()).Return(false, nil).AnyTimes() + mockDbMeta.EXPECT().Create(gomock.Any(), gomock.Any(), gomock.Any()).Return(moerr.NewInternalErrorNoCtx("test err")).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDbMeta, nil).AnyTimes() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoDb.Reset() + + lockMoTbl := gostub.Stub(&lockMoTable, func(_ *Compile, _ string, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoTbl.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.CreateTable(c)) + }) + + convey.Convey("create table FaultTolerance10", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOp(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDbMeta := mock_frontend.NewMockDatabase(ctrl) + mockDbMeta.EXPECT().Relation(gomock.Any(), catalog.MO_DATABASE, gomock.Any()).Return(relation, nil).AnyTimes() + mockDbMeta.EXPECT().RelationExists(gomock.Any(), gomock.Any(), gomock.Any()).Return(false, nil).AnyTimes() + mockDbMeta.EXPECT().Create(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(_ context.Context, tblName string, _ []engine.TableDef) error { + if tblName == "dept" { + return nil + } else if tblName == "%!%p0%!%dept" || tblName == "%!%p1%!%dept" { + return nil + } else if tblName == "__mo_index_secondary_0193d918-3e7b-7506-9f70-64fbcf055c19" { + return nil + } + return nil + }).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDbMeta, nil).AnyTimes() + + planDef2ExecDef := gostub.Stub(&planDefsToExeDefs, func(tbl *plan.TableDef) ([]engine.TableDef, error) { + if tbl.Name == "dept" { + return nil, nil + } else if tbl.Name == "%!%p0%!%dept" || tbl.Name == "%!%p1%!%dept" { + return nil, nil + } else if tbl.Name == "__mo_index_secondary_0193d918-3e7b-7506-9f70-64fbcf055c19" { + return nil, nil + } + return nil, nil + }) + defer planDef2ExecDef.Reset() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoDb.Reset() + + lockMoTbl := gostub.Stub(&lockMoTable, func(_ *Compile, _ string, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoTbl.Reset() + + checkIndexInit := gostub.Stub(&checkIndexInitializable, func(_ string, _ string) bool { + return false + }) + defer checkIndexInit.Reset() + + createAutoIncrement := gostub.Stub(&maybeCreateAutoIncrement, func(_ context.Context, _ string, _ engine.Database, _ *plan.TableDef, _ client.TxnOperator, _ func() string) error { + return moerr.NewInternalErrorNoCtx("test err") + }) + defer createAutoIncrement.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.CreateTable(c)) + }) +} + +func TestScope_CreateTable2(t *testing.T) { + tableDef := &plan.TableDef{ + Name: "dept", + Cols: []*plan.ColDef{ + { + ColId: 0, + Name: "deptno", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 27, + NotNullable: false, + AutoIncr: true, + Width: 32, + Scale: -1, + }, + Default: &plan2.Default{}, + NotNull: true, + Primary: true, + Pkidx: 0, + }, + { + ColId: 1, + Name: "dname", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 61, + NotNullable: false, + AutoIncr: false, + Width: 15, + Scale: 0, + }, + Default: &plan2.Default{}, + NotNull: false, + Primary: false, + Pkidx: 0, + }, + { + ColId: 2, + Name: "loc", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 61, + NotNullable: false, + AutoIncr: false, + Width: 50, + Scale: 0, + }, + Default: &plan2.Default{}, + NotNull: false, + Primary: false, + Pkidx: 0, + }, + }, + Pkey: &plan.PrimaryKeyDef{ + Cols: nil, + PkeyColId: 0, + PkeyColName: "deptno", + Names: []string{"deptno"}, + }, + Indexes: []*plan.IndexDef{ + { + IndexName: "idxloc", + Parts: []string{"loc", "__mo_alias_deptno"}, + Unique: false, + IndexTableName: "__mo_index_secondary_0193dc98-4148-74f4-808a", + TableExist: true, + }, + }, + Partition: &plan2.PartitionByDef{ + Type: plan2.PartitionType_KEY, + PartitionNum: 2, + Partitions: []*plan2.PartitionItem{ + { + PartitionName: "p0", + OrdinalPosition: 1, + PartitionTableName: "%!%p0%!%dept", + }, + { + PartitionName: "p1", + OrdinalPosition: 2, + PartitionTableName: "%!%p1%!%dept", + }, + }, + PartitionTableNames: []string{ + "%!%p0%!%dept", + "%!%p1%!%dept", + }, + }, + Defs: []*plan2.TableDef_DefType{ + { + Def: &plan.TableDef_DefType_Properties{ + Properties: &plan.PropertiesDef{ + Properties: []*plan.Property{ + { + Key: "relkind", + Value: "r", + }, + }, + }, + }, + }, + }, + } + + partitionTable1Def := &plan.TableDef{ + Name: "%!%p0%!%dept", + Cols: []*plan.ColDef{ + { + ColId: 0, + Name: "deptno", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 27, + NotNullable: false, + AutoIncr: true, + Width: 32, + Scale: -1, + }, + Default: &plan2.Default{}, + NotNull: true, + Primary: true, + Pkidx: 0, + }, + { + ColId: 1, + Name: "dname", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 61, + NotNullable: false, + AutoIncr: false, + Width: 15, + Scale: 0, + }, + Default: &plan2.Default{}, + NotNull: false, + Primary: false, + Pkidx: 0, + }, + { + ColId: 2, + Name: "loc", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 61, + NotNullable: false, + AutoIncr: false, + Width: 50, + Scale: 0, + }, + Default: &plan2.Default{}, + NotNull: false, + Primary: false, + Pkidx: 0, + }, + }, + Pkey: &plan.PrimaryKeyDef{ + Cols: nil, + PkeyColId: 0, + PkeyColName: "deptno", + Names: []string{"deptno"}, + }, + Defs: []*plan2.TableDef_DefType{ + { + Def: &plan.TableDef_DefType_Properties{ + Properties: &plan.PropertiesDef{ + Properties: []*plan.Property{ + { + Key: "relkind", + Value: "r", + }, + }, + }, + }, + }, + }, + } + + partitionTable2Def := &plan.TableDef{ + Name: "%!%p0%!%dept", + Cols: []*plan.ColDef{ + { + ColId: 0, + Name: "deptno", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 27, + NotNullable: false, + AutoIncr: true, + Width: 32, + Scale: -1, + }, + Default: &plan2.Default{}, + NotNull: true, + Primary: true, + Pkidx: 0, + }, + { + ColId: 1, + Name: "dname", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 61, + NotNullable: false, + AutoIncr: false, + Width: 15, + Scale: 0, + }, + Default: &plan2.Default{}, + NotNull: false, + Primary: false, + Pkidx: 0, + }, + { + ColId: 2, + Name: "loc", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 61, + NotNullable: false, + AutoIncr: false, + Width: 50, + Scale: 0, + }, + Default: &plan2.Default{}, + NotNull: false, + Primary: false, + Pkidx: 0, + }, + }, + Pkey: &plan.PrimaryKeyDef{ + Cols: nil, + PkeyColId: 0, + PkeyColName: "deptno", + Names: []string{"deptno"}, + }, + Defs: []*plan2.TableDef_DefType{ + { + Def: &plan.TableDef_DefType_Properties{ + Properties: &plan.PropertiesDef{ + Properties: []*plan.Property{ + { + Key: "relkind", + Value: "r", + }, + }, + }, + }, + }, + }, + } + + createTableDef := &plan2.CreateTable{ + IfNotExists: false, + Database: "test", + Replace: false, + TableDef: tableDef, + IndexTables: []*plan.TableDef{ + { + Name: "__mo_index_secondary_0193d918-3e7b-7506-9f70-64fbcf055c19", + Cols: []*plan.ColDef{ + { + Name: "__mo_index_idx_col", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 61, + NotNullable: false, + AutoIncr: false, + Width: 65535, + Scale: 0, + }, + NotNull: false, + Default: &plan2.Default{ + NullAbility: false, + }, + Pkidx: 0, + }, + { + Name: "__mo_index_pri_col", + Alg: plan2.CompressType_Lz4, + Typ: plan.Type{ + Id: 27, + NotNullable: false, + AutoIncr: false, + Width: 32, + Scale: -1, + }, + NotNull: false, + Default: &plan2.Default{ + NullAbility: false, + }, + Pkidx: 0, + }, + }, + Pkey: &plan2.PrimaryKeyDef{ + PkeyColName: "__mo_index_idx_col", + Names: []string{"__mo_index_idx_col"}, + }, + }, + }, + PartitionTables: []*plan.TableDef{ + partitionTable1Def, + partitionTable2Def, + }, + } + + cplan := &plan.Plan{ + Plan: &plan2.Plan_Ddl{ + Ddl: &plan2.DataDefinition{ + DdlType: plan2.DataDefinition_CREATE_TABLE, + Definition: &plan2.DataDefinition_CreateTable{ + CreateTable: createTableDef, + }, + }, + }, + } + + s := &Scope{ + Magic: CreateTable, + Plan: cplan, + TxnOffset: 0, + } + + sql := `create table dept( + deptno int unsigned auto_increment COMMENT '部门编号', + dname varchar(15) COMMENT '部门名称', + loc varchar(50) COMMENT '部门所在位置', + key idxloc (loc), + primary key(deptno) + ) partition by key(deptno) partitions 2` + + convey.Convey("create table FaultTolerance6", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOp(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDbMeta := mock_frontend.NewMockDatabase(ctrl) + mockDbMeta.EXPECT().Relation(gomock.Any(), catalog.MO_DATABASE, gomock.Any()).Return(relation, nil).AnyTimes() + mockDbMeta.EXPECT().RelationExists(gomock.Any(), gomock.Any(), gomock.Any()).Return(false, nil).AnyTimes() + mockDbMeta.EXPECT().Create(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(_ context.Context, tblName string, _ []engine.TableDef) error { + if tblName == "dept" { + return nil + } else if tblName == "%!%p0%!%dept" || tblName == "%!%p1%!%dept" { + return moerr.NewInternalErrorNoCtx("test err") + } + return nil + }).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDbMeta, nil).AnyTimes() + + planDef2ExecDef := gostub.Stub(&planDefsToExeDefs, func(tbl *plan.TableDef) ([]engine.TableDef, error) { + if tbl.Name == "dept" { + return nil, nil + } else if tbl.Name == "%!%p0%!%dept" || tbl.Name == "%!%p1%!%dept" { + return nil, moerr.NewInternalErrorNoCtx("test err") + } + return nil, nil + }) + defer planDef2ExecDef.Reset() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoDb.Reset() + + lockMoTbl := gostub.Stub(&lockMoTable, func(_ *Compile, _ string, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoTbl.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.CreateTable(c)) + }) + + convey.Convey("create table FaultTolerance7", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOp(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDbMeta := mock_frontend.NewMockDatabase(ctrl) + mockDbMeta.EXPECT().Relation(gomock.Any(), catalog.MO_DATABASE, gomock.Any()).Return(relation, nil).AnyTimes() + mockDbMeta.EXPECT().RelationExists(gomock.Any(), gomock.Any(), gomock.Any()).Return(false, nil).AnyTimes() + mockDbMeta.EXPECT().Create(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(_ context.Context, tblName string, _ []engine.TableDef) error { + if tblName == "dept" { + return nil + } else if tblName == "%!%p0%!%dept" || tblName == "%!%p1%!%dept" { + return moerr.NewInternalErrorNoCtx("test err") + } + return nil + }).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDbMeta, nil).AnyTimes() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoDb.Reset() + + lockMoTbl := gostub.Stub(&lockMoTable, func(_ *Compile, _ string, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoTbl.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.CreateTable(c)) + }) + + convey.Convey("create table FaultTolerance8", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOp(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDbMeta := mock_frontend.NewMockDatabase(ctrl) + mockDbMeta.EXPECT().Relation(gomock.Any(), catalog.MO_DATABASE, gomock.Any()).Return(relation, nil).AnyTimes() + mockDbMeta.EXPECT().RelationExists(gomock.Any(), gomock.Any(), gomock.Any()).Return(false, nil).AnyTimes() + mockDbMeta.EXPECT().Create(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(_ context.Context, tblName string, _ []engine.TableDef) error { + if tblName == "dept" { + return nil + } else if tblName == "%!%p0%!%dept" || tblName == "%!%p1%!%dept" { + return nil + } else if tblName == "__mo_index_secondary_0193d918-3e7b-7506-9f70-64fbcf055c19" { + return moerr.NewInternalErrorNoCtx("test err") + } + return nil + }).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDbMeta, nil).AnyTimes() + + planDef2ExecDef := gostub.Stub(&planDefsToExeDefs, func(tbl *plan.TableDef) ([]engine.TableDef, error) { + if tbl.Name == "dept" { + return nil, nil + } else if tbl.Name == "%!%p0%!%dept" || tbl.Name == "%!%p1%!%dept" { + return nil, nil + } else if tbl.Name == "__mo_index_secondary_0193d918-3e7b-7506-9f70-64fbcf055c19" { + return nil, moerr.NewInternalErrorNoCtx("test err") + } + return nil, nil + }) + defer planDef2ExecDef.Reset() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoDb.Reset() + + lockMoTbl := gostub.Stub(&lockMoTable, func(_ *Compile, _ string, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoTbl.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.CreateTable(c)) + }) + + convey.Convey("create table FaultTolerance9", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOp(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDbMeta := mock_frontend.NewMockDatabase(ctrl) + mockDbMeta.EXPECT().Relation(gomock.Any(), catalog.MO_DATABASE, gomock.Any()).Return(relation, nil).AnyTimes() + mockDbMeta.EXPECT().RelationExists(gomock.Any(), gomock.Any(), gomock.Any()).Return(false, nil).AnyTimes() + mockDbMeta.EXPECT().Create(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(_ context.Context, tblName string, _ []engine.TableDef) error { + if tblName == "dept" { + return nil + } else if tblName == "%!%p0%!%dept" || tblName == "%!%p1%!%dept" { + return nil + } else if tblName == "__mo_index_secondary_0193d918-3e7b-7506-9f70-64fbcf055c19" { + return moerr.NewInternalErrorNoCtx("test err") + } + return nil + }).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDbMeta, nil).AnyTimes() + + planDef2ExecDef := gostub.Stub(&planDefsToExeDefs, func(tbl *plan.TableDef) ([]engine.TableDef, error) { + if tbl.Name == "dept" { + return nil, nil + } else if tbl.Name == "%!%p0%!%dept" || tbl.Name == "%!%p1%!%dept" { + return nil, nil + } else if tbl.Name == "__mo_index_secondary_0193d918-3e7b-7506-9f70-64fbcf055c19" { + return nil, nil + } + return nil, nil + }) + defer planDef2ExecDef.Reset() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoDb.Reset() + + lockMoTbl := gostub.Stub(&lockMoTable, func(_ *Compile, _ string, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoTbl.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.CreateTable(c)) + }) + + convey.Convey("create table FaultTolerance10", t, func() { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProcess() + proc.Base.SessionInfo.Buf = buffer.New() + + ctx := context.Background() + proc.Ctx = context.Background() + txnCli, txnOp := newTestTxnClientAndOp(ctrl) + proc.Base.TxnClient = txnCli + proc.Base.TxnOperator = txnOp + proc.ReplaceTopCtx(ctx) + + relation := mock_frontend.NewMockRelation(ctrl) + relation.EXPECT().GetTableID(gomock.Any()).Return(uint64(1)).AnyTimes() + + mockDbMeta := mock_frontend.NewMockDatabase(ctrl) + mockDbMeta.EXPECT().Relation(gomock.Any(), catalog.MO_DATABASE, gomock.Any()).Return(relation, nil).AnyTimes() + mockDbMeta.EXPECT().RelationExists(gomock.Any(), gomock.Any(), gomock.Any()).Return(false, nil).AnyTimes() + mockDbMeta.EXPECT().Create(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(_ context.Context, tblName string, _ []engine.TableDef) error { + if tblName == "dept" { + return nil + } else if tblName == "%!%p0%!%dept" || tblName == "%!%p1%!%dept" { + return nil + } else if tblName == "__mo_index_secondary_0193d918-3e7b-7506-9f70-64fbcf055c19" { + return nil + } + return nil + }).AnyTimes() + + eng := mock_frontend.NewMockEngine(ctrl) + eng.EXPECT().Database(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockDbMeta, nil).AnyTimes() + + planDef2ExecDef := gostub.Stub(&planDefsToExeDefs, func(tbl *plan.TableDef) ([]engine.TableDef, error) { + if tbl.Name == "dept" { + return nil, nil + } else if tbl.Name == "%!%p0%!%dept" || tbl.Name == "%!%p1%!%dept" { + return nil, nil + } else if tbl.Name == "__mo_index_secondary_0193d918-3e7b-7506-9f70-64fbcf055c19" { + return nil, nil + } + return nil, nil + }) + defer planDef2ExecDef.Reset() + + lockMoDb := gostub.Stub(&lockMoDatabase, func(_ *Compile, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoDb.Reset() + + lockMoTbl := gostub.Stub(&lockMoTable, func(_ *Compile, _ string, _ string, _ lock.LockMode) error { + return nil + }) + defer lockMoTbl.Reset() + + createAutoIncrement := gostub.Stub(&maybeCreateAutoIncrement, func(_ context.Context, _ string, _ engine.Database, _ *plan.TableDef, _ client.TxnOperator, _ func() string) error { + return moerr.NewInternalErrorNoCtx("test err") + }) + defer createAutoIncrement.Reset() + + c := NewCompile("test", "test", sql, "", "", eng, proc, nil, false, nil, time.Now()) + assert.Error(t, s.CreateTable(c)) + }) } func TestScope_CreateView(t *testing.T) { diff --git a/pkg/sql/compile/util.go b/pkg/sql/compile/util.go index b631f6d369d20..511e1e9bbfda0 100644 --- a/pkg/sql/compile/util.go +++ b/pkg/sql/compile/util.go @@ -511,7 +511,7 @@ func genInsertMoTablePartitionsSql(databaseId string, tableId uint64, partitionB return buffer.String() } -func GetConstraintDef(ctx context.Context, rel engine.Relation) (*engine.ConstraintDef, error) { +var GetConstraintDef = func(ctx context.Context, rel engine.Relation) (*engine.ConstraintDef, error) { defs, err := rel.TableDefs(ctx) if err != nil { return nil, err diff --git a/test/distributed/cases/pessimistic_transaction/transaction_enhance.result b/test/distributed/cases/pessimistic_transaction/transaction_enhance.result index 50f7bef8860b9..46f390d70cd74 100644 --- a/test/distributed/cases/pessimistic_transaction/transaction_enhance.result +++ b/test/distributed/cases/pessimistic_transaction/transaction_enhance.result @@ -276,7 +276,7 @@ insert into atomic_table_17 values (6,"a"),(7,"b"); drop table atomic_table_17; use transaction_enhance; alter table atomic_table_17 add constraint unique key (c1); -SQL parser error: table "atomic_table_17" does not exist +no such table transaction_enhance.atomic_table_17 update atomic_table_17 set c1=8 where c2="b"; no such table transaction_enhance.atomic_table_17 commit; From b4cb3634fda307595ca2507afaccd95f699f8397 Mon Sep 17 00:00:00 2001 From: YANGGMM Date: Fri, 20 Dec 2024 17:10:54 +0800 Subject: [PATCH 5/5] support create database/table level snapshot (#20850) support create database/table level snapshot Approved by: @heni02, @daviszhen --- pkg/frontend/snapshot.go | 216 +++++++++++++++--- .../snapshot/snapshot_database_level.result | 80 +++++++ .../snapshot/snapshot_database_level.sql | 92 ++++++++ 3 files changed, 357 insertions(+), 31 deletions(-) create mode 100644 test/distributed/cases/snapshot/snapshot_database_level.result create mode 100644 test/distributed/cases/snapshot/snapshot_database_level.sql diff --git a/pkg/frontend/snapshot.go b/pkg/frontend/snapshot.go index d231cec7deba9..e6b828a3d4ca7 100644 --- a/pkg/frontend/snapshot.go +++ b/pkg/frontend/snapshot.go @@ -17,11 +17,13 @@ package frontend import ( "context" "fmt" + "math" "slices" "strings" "time" "github.com/google/uuid" + "go.uber.org/zap" "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/common/moerr" @@ -188,21 +190,56 @@ func doCreateSnapshot(ctx context.Context, ses *Session, stmt *tree.CreateSnapSh return err } - // 2.only sys can create cluster level snapshot tenantInfo := ses.GetTenantInfo() currentAccount := tenantInfo.GetTenant() snapshotLevel = stmt.Object.SLevel.Level - if snapshotLevel == tree.SNAPSHOTLEVELCLUSTER && currentAccount != sysAccountName { - return moerr.NewInternalError(ctx, "only sys tenant can create cluster level snapshot") + + // 1.check create snapshot priv + err = doCheckCreateSnapshotPriv(ctx, ses, stmt) + if err != nil { + return err } - // 3.only sys can create tenant level snapshot for other tenant - if snapshotLevel == tree.SNAPSHOTLEVELACCOUNT { - snapshotForAccount = string(stmt.Object.ObjName) - if currentAccount != sysAccountName && currentAccount != snapshotForAccount { - return moerr.NewInternalError(ctx, "only sys tenant can create tenant level snapshot for other tenant") + // 2. check snapshot exists or not + snapshotName = string(stmt.Name) + snapshotExist, err = checkSnapShotExistOrNot(ctx, bh, snapshotName) + if err != nil { + return err + } + if snapshotExist { + if !stmt.IfNotExists { + return moerr.NewInternalErrorf(ctx, "snapshot %s already exists", snapshotName) + } else { + return nil } + } + + // 3.1 generate snapshot id + newUUid, err := uuid.NewV7() + if err != nil { + return err + } + snapshotId = newUUid.String() + // 3. get database name , table name and objId according to the snapshot level + switch snapshotLevel { + case tree.SNAPSHOTLEVELCLUSTER: + sql, err = getSqlForCreateSnapshot( + ctx, + snapshotId, + snapshotName, + time.Now().UTC().UnixNano(), + snapshotLevel.String(), + "", + "", + "", + math.MaxUint64, + ) + if err != nil { + return err + } + case tree.SNAPSHOTLEVELACCOUNT: + snapshotForAccount = string(stmt.Object.ObjName) // check account exists or not and get accountId getAccountIdFunc := func(accountName string) (accountId uint64, rtnErr error) { var erArray []ExecResult @@ -244,48 +281,165 @@ func doCreateSnapshot(ctx context.Context, ses *Session, stmt *tree.CreateSnapSh } else { objId = uint64(tenantInfo.GetTenantID()) } - } - // check snapshot exists or not - snapshotName = string(stmt.Name) - snapshotExist, err = checkSnapShotExistOrNot(ctx, bh, snapshotName) - if err != nil { - return err - } - if snapshotExist { - if !stmt.IfNotExists { - return moerr.NewInternalErrorf(ctx, "snapshot %s already exists", snapshotName) - } else { - return nil + sql, err = getSqlForCreateSnapshot( + ctx, + snapshotId, + snapshotName, + time.Now().UTC().UnixNano(), + snapshotLevel.String(), + snapshotForAccount, + "", + "", + objId, + ) + if err != nil { + return err } - } else { - // insert record to the system table + case tree.SNAPSHOTLEVELDATABASE: + databaseName = string(stmt.Object.ObjName) + if len(databaseName) > 0 && needSkipDb(databaseName) { + return moerr.NewInternalError(ctx, fmt.Sprintf("can not create snapshot for current database %s", databaseName)) + } + + getDatabaseIdFunc := func(dbName string) (dbId uint64, rtnErr error) { + var erArray []ExecResult + sql, rtnErr = getSqlForCheckDatabase(ctx, dbName) + if rtnErr != nil { + return 0, rtnErr + } + bh.ClearExecResultSet() + rtnErr = bh.Exec(ctx, sql) + if rtnErr != nil { + return 0, rtnErr + } + + erArray, rtnErr = getResultSet(ctx, bh) + if rtnErr != nil { + return 0, rtnErr + } - // 1. get snapshot id - newUUid, err := uuid.NewV7() + if execResultArrayHasData(erArray) { + for i := uint64(0); i < erArray[0].GetRowCount(); i++ { + dbId, rtnErr = erArray[0].GetUint64(ctx, i, 0) + if rtnErr != nil { + return 0, rtnErr + } + } + } else { + return 0, moerr.NewInternalErrorf(ctx, "database %s does not exist", dbName) + } + return dbId, rtnErr + } + objId, err = getDatabaseIdFunc(databaseName) + if err != nil { + return err + } + + sql, err = getSqlForCreateSnapshot( + ctx, + snapshotId, + snapshotName, + time.Now().UTC().UnixNano(), + snapshotLevel.String(), + currentAccount, + databaseName, + "", + objId, + ) if err != nil { return err } - snapshotId = newUUid.String() - // 2. get snapshot ts - // ts := ses.proc.TxnOperator.SnapshotTS() - // snapshotTs = ts.String() + case tree.SNAPSHOTLEVELTABLE: + objectName := string(stmt.Object.ObjName) + objects := strings.Split(objectName, ".") + if len(objects) != 2 { + return moerr.NewInternalError(ctx, fmt.Sprintf("invalid table name %s", objectName)) + } + databaseName = objects[0] + tableName = objects[1] + if len(databaseName) > 0 && needSkipDb(databaseName) { + return moerr.NewInternalError(ctx, fmt.Sprintf("can not create pitr for current table %s.%s", databaseName, tableName)) + } + + getTableIdFunc := func(dbName, tblName string) (tblId uint64, rtnErr error) { + var erArray []ExecResult + sql, rtnErr = getSqlForCheckDatabaseTable(ctx, dbName, tblName) + if rtnErr != nil { + return 0, rtnErr + } + bh.ClearExecResultSet() + rtnErr = bh.Exec(ctx, sql) + if rtnErr != nil { + return 0, rtnErr + } + + erArray, rtnErr = getResultSet(ctx, bh) + if rtnErr != nil { + return 0, rtnErr + } - sql, err = getSqlForCreateSnapshot(ctx, snapshotId, snapshotName, time.Now().UTC().UnixNano(), snapshotLevel.String(), string(stmt.Object.ObjName), databaseName, tableName, objId) + if execResultArrayHasData(erArray) { + for i := uint64(0); i < erArray[0].GetRowCount(); i++ { + tblId, rtnErr = erArray[0].GetUint64(ctx, i, 0) + if rtnErr != nil { + return 0, rtnErr + } + } + } else { + return 0, moerr.NewInternalErrorf(ctx, "table %s.%s does not exist", dbName, tblName) + } + return tblId, rtnErr + } + objId, err = getTableIdFunc(databaseName, tableName) if err != nil { return err } - err = bh.Exec(ctx, sql) + sql, err = getSqlForCreateSnapshot( + ctx, + snapshotId, + snapshotName, + time.Now().UTC().UnixNano(), + snapshotLevel.String(), + currentAccount, + databaseName, + tableName, + objId, + ) if err != nil { return err } } + + getLogger(ses.GetService()).Info("create pitr", zap.String("sql", sql)) + err = bh.Exec(ctx, sql) + if err != nil { + return err + } + getLogger(ses.GetService()).Info(fmt.Sprintf("create snapshot %s success", snapshotName)) + return err +} - // insert record to the system table +func doCheckCreateSnapshotPriv(ctx context.Context, ses *Session, stmt *tree.CreateSnapShot) error { + var err error + snapshotLevel := stmt.Object.SLevel.Level + tenantInfo := ses.GetTenantInfo() + currentAccount := tenantInfo.GetTenant() + switch snapshotLevel { + case tree.SNAPSHOTLEVELCLUSTER: + if currentAccount != sysAccountName { + return moerr.NewInternalError(ctx, "only sys tenant can create cluster level snapshot") + } + case tree.SNAPSHOTLEVELACCOUNT: + snapshotForAccount := string(stmt.Object.ObjName) + if currentAccount != sysAccountName && currentAccount != snapshotForAccount { + return moerr.NewInternalError(ctx, "only sys tenant can create tenant level snapshot for other tenant") + } + } return err } diff --git a/test/distributed/cases/snapshot/snapshot_database_level.result b/test/distributed/cases/snapshot/snapshot_database_level.result new file mode 100644 index 0000000000000..cf5e3861891be --- /dev/null +++ b/test/distributed/cases/snapshot/snapshot_database_level.result @@ -0,0 +1,80 @@ +drop snapshot if exists sn1; +create snapshot sn1 for database db1; +internal error: database db1 does not exist +show snapshots; +SNAPSHOT_NAME TIMESTAMP SNAPSHOT_LEVEL ACCOUNT_NAME DATABASE_NAME TABLE_NAME +drop database if exists db1; +create database if not exists db1; +create snapshot sn2 for database db1; +show snapshots; +SNAPSHOT_NAME TIMESTAMP SNAPSHOT_LEVEL ACCOUNT_NAME DATABASE_NAME TABLE_NAME +sn2 2024-12-20 02:58:51.442498 database sys db1 +drop database if exists db1; +drop snapshot if exists sn2; +drop snapshot if exists sn1; +show snapshots; +SNAPSHOT_NAME TIMESTAMP SNAPSHOT_LEVEL ACCOUNT_NAME DATABASE_NAME TABLE_NAME +drop account if exists acc01; +create account acc01 admin_name = 'test_account' identified by '111'; +drop snapshot if exists sn1; +create snapshot sn1 for database db1; +internal error: database db1 does not exist +show snapshots; +SNAPSHOT_NAME TIMESTAMP SNAPSHOT_LEVEL ACCOUNT_NAME DATABASE_NAME TABLE_NAME +drop database if exists db1; +create database if not exists db1; +create snapshot sn2 for database db1; +show snapshots; +SNAPSHOT_NAME TIMESTAMP SNAPSHOT_LEVEL ACCOUNT_NAME DATABASE_NAME TABLE_NAME +sn2 2024-12-20 02:58:51.951431 database acc01 db1 +drop database if exists db1; +drop snapshot if exists sn2; +drop snapshot if exists sn1; +drop account if exists acc1; +drop snapshot if exists sn1; +create snapshot sn1 for table db1 tbl1; +internal error: table db1.tbl1 does not exist +show snapshots; +SNAPSHOT_NAME TIMESTAMP SNAPSHOT_LEVEL ACCOUNT_NAME DATABASE_NAME TABLE_NAME +drop database if exists db1; +create database if not exists db1; +create table db1.tbl1 (a int); +insert into db1.tbl1 values (1), (2), (3); +create snapshot sn2 for table db1 tbl1; +show snapshots; +SNAPSHOT_NAME TIMESTAMP SNAPSHOT_LEVEL ACCOUNT_NAME DATABASE_NAME TABLE_NAME +sn2 2024-12-20 02:58:52.013035 table sys db1 tbl1 +drop database if exists db1; +drop snapshot if exists sn2; +drop snapshot if exists sn1; +show snapshots; +SNAPSHOT_NAME TIMESTAMP SNAPSHOT_LEVEL ACCOUNT_NAME DATABASE_NAME TABLE_NAME +drop account if exists acc01; +create account acc01 admin_name = 'test_account' identified by '111'; +drop snapshot if exists sn1; +create snapshot sn1 for table db1 tbl1; +internal error: table db1.tbl1 does not exist +show snapshots; +SNAPSHOT_NAME TIMESTAMP SNAPSHOT_LEVEL ACCOUNT_NAME DATABASE_NAME TABLE_NAME +drop database if exists db1; +create database if not exists db1; +create table db1.tbl1 (a int); +insert into db1.tbl1 values (1), (2), (3); +create snapshot sn2 for table db1 tbl1; +show snapshots; +SNAPSHOT_NAME TIMESTAMP SNAPSHOT_LEVEL ACCOUNT_NAME DATABASE_NAME TABLE_NAME +sn2 2024-12-20 02:58:52.689975 table acc01 db1 tbl1 +drop database if exists db1; +drop snapshot if exists sn2; +drop snapshot if exists sn1; +drop account if exists acc1; +create snapshot sn1 for account sys; +create snapshot sn1 for account sys; +internal error: snapshot sn1 already exists +create snapshot if not exists sn1 for account sys; +drop snapshot if exists sn1; +create snapshot sn1 for database mo_catalog; +internal error: can not create snapshot for current database mo_catalog +create snapshot sn1 for table mo_catalog mo_user; +internal error: can not create pitr for current table mo_catalog.mo_user +drop snapshot if exists sn1; diff --git a/test/distributed/cases/snapshot/snapshot_database_level.sql b/test/distributed/cases/snapshot/snapshot_database_level.sql new file mode 100644 index 0000000000000..b38d7f5e97c51 --- /dev/null +++ b/test/distributed/cases/snapshot/snapshot_database_level.sql @@ -0,0 +1,92 @@ +drop snapshot if exists sn1; +create snapshot sn1 for database db1; +-- @ignore:1 +show snapshots; + +drop database if exists db1; +create database if not exists db1; +create snapshot sn2 for database db1; +-- @ignore:1 +show snapshots; + +drop database if exists db1; +drop snapshot if exists sn2; +drop snapshot if exists sn1; +-- @ignore:1 +show snapshots; + +drop account if exists acc01; +create account acc01 admin_name = 'test_account' identified by '111'; + +-- @session:id=1&user=acc01:test_account&password=111 +drop snapshot if exists sn1; +create snapshot sn1 for database db1; +-- @ignore:1 +show snapshots; + +drop database if exists db1; +create database if not exists db1; +create snapshot sn2 for database db1; +-- @ignore:1 +show snapshots; + +drop database if exists db1; +drop snapshot if exists sn2; +drop snapshot if exists sn1; +-- @session + +drop account if exists acc1; + +drop snapshot if exists sn1; +create snapshot sn1 for table db1 tbl1; +-- @ignore:1 +show snapshots; + +drop database if exists db1; +create database if not exists db1; +create table db1.tbl1 (a int); +insert into db1.tbl1 values (1), (2), (3); +create snapshot sn2 for table db1 tbl1; +-- @ignore:1 +show snapshots; + +drop database if exists db1; +drop snapshot if exists sn2; +drop snapshot if exists sn1; +-- @ignore:1 +show snapshots; + +drop account if exists acc01; +create account acc01 admin_name = 'test_account' identified by '111'; + +-- @session:id=2&user=acc01:test_account&password=111 +drop snapshot if exists sn1; +create snapshot sn1 for table db1 tbl1; +-- @ignore:1 +show snapshots; + +drop database if exists db1; +create database if not exists db1; +create table db1.tbl1 (a int); +insert into db1.tbl1 values (1), (2), (3); +create snapshot sn2 for table db1 tbl1; +-- @ignore:1 +show snapshots; + +drop database if exists db1; +drop snapshot if exists sn2; +drop snapshot if exists sn1; +-- @session + +drop account if exists acc1; + +create snapshot sn1 for account sys; +create snapshot sn1 for account sys; +create snapshot if not exists sn1 for account sys; + +drop snapshot if exists sn1; + +create snapshot sn1 for database mo_catalog; +create snapshot sn1 for table mo_catalog mo_user; + +drop snapshot if exists sn1;