diff --git a/pkg/bootstrap/versions/v4_0_0/cluster_upgrade_list.go b/pkg/bootstrap/versions/v4_0_0/cluster_upgrade_list.go index f43259b7f72a1..55dbd04ef5630 100644 --- a/pkg/bootstrap/versions/v4_0_0/cluster_upgrade_list.go +++ b/pkg/bootstrap/versions/v4_0_0/cluster_upgrade_list.go @@ -25,6 +25,7 @@ import ( ) var clusterUpgEntries = []versions.UpgradeEntry{ + upg_mo_indexes_add_included_columns_for_cluster, upg_mo_iscp_log_new, upg_mo_iscp_task, upg_mo_publication_task, @@ -45,6 +46,34 @@ var clusterUpgEntries = []versions.UpgradeEntry{ upg_mo_columns_add_attr_generated, } +var checkMoIndexesIncludedColumns = func(txn executor.TxnExecutor, accountId uint32) (versions.ColumnInfo, error) { + return versions.CheckTableColumn(txn, accountId, catalog.MO_CATALOG, catalog.MO_INDEXES, catalog.IndexIncludedColumns) +} + +func newMoIndexesAddIncludedColumnsEntry() versions.UpgradeEntry { + return versions.UpgradeEntry{ + Schema: catalog.MO_CATALOG, + TableName: catalog.MO_INDEXES, + UpgType: versions.ADD_COLUMN, + UpgSql: fmt.Sprintf( + "alter table %s.%s add column %s text after %s", + catalog.MO_CATALOG, + catalog.MO_INDEXES, + catalog.IndexIncludedColumns, + "index_table_name", + ), + CheckFunc: func(txn executor.TxnExecutor, accountId uint32) (bool, error) { + info, err := checkMoIndexesIncludedColumns(txn, accountId) + if err != nil { + return false, err + } + return info.IsExits, nil + }, + } +} + +var upg_mo_indexes_add_included_columns_for_cluster = newMoIndexesAddIncludedColumnsEntry() + var upg_mo_iscp_log_new = versions.UpgradeEntry{ Schema: catalog.MO_CATALOG, TableName: catalog.MO_ISCP_LOG, diff --git a/pkg/bootstrap/versions/v4_0_0/tenant_upgrade_list.go b/pkg/bootstrap/versions/v4_0_0/tenant_upgrade_list.go index 7c32af1445642..d38fdde9b3f97 100644 --- a/pkg/bootstrap/versions/v4_0_0/tenant_upgrade_list.go +++ b/pkg/bootstrap/versions/v4_0_0/tenant_upgrade_list.go @@ -26,6 +26,7 @@ import ( ) var tenantUpgEntries = []versions.UpgradeEntry{ + upg_mo_indexes_add_included_columns_for_tenant, enablePartitionMetadata, enablePartitionTables, upg_alter_mo_snapshots, @@ -35,6 +36,8 @@ var tenantUpgEntries = []versions.UpgradeEntry{ upg_information_schema_statistics, } +var upg_mo_indexes_add_included_columns_for_tenant = newMoIndexesAddIncludedColumnsEntry() + var enablePartitionMetadata = versions.UpgradeEntry{ Schema: catalog.MO_CATALOG, TableName: catalog.MOPartitionMetadata, diff --git a/pkg/bootstrap/versions/v4_0_0/upgrade_test.go b/pkg/bootstrap/versions/v4_0_0/upgrade_test.go index d8115801dc4a6..22b8687ce7089 100644 --- a/pkg/bootstrap/versions/v4_0_0/upgrade_test.go +++ b/pkg/bootstrap/versions/v4_0_0/upgrade_test.go @@ -17,6 +17,7 @@ package v4_0_0 import ( "context" "fmt" + "strings" "testing" "github.com/golang/mock/gomock" @@ -33,6 +34,18 @@ import ( "github.com/matrixorigin/matrixone/pkg/util/sysview" ) +func findUpgradeEntryIndex(entries []versions.UpgradeEntry, target versions.UpgradeEntry) int { + for i, entry := range entries { + if entry.Schema == target.Schema && + entry.TableName == target.TableName && + entry.UpgType == target.UpgType && + entry.UpgSql == target.UpgSql { + return i + } + } + return -1 +} + func mockTenantUpgrade(t *testing.T) { drop_mo_retention := versions.UpgradeEntry{ Schema: catalog.MO_CATALOG, @@ -48,6 +61,10 @@ func mockTenantUpgrade(t *testing.T) { } func Test_Upgrade(t *testing.T) { + originalTenantUpgEntries := append([]versions.UpgradeEntry(nil), tenantUpgEntries...) + defer func() { + tenantUpgEntries = originalTenantUpgEntries + }() mockTenantUpgrade(t) sid := "" @@ -84,6 +101,10 @@ func Test_Upgrade(t *testing.T) { } func Test_versionHandle_HandleClusterUpgrade(t *testing.T) { + originalClusterUpgEntries := append([]versions.UpgradeEntry(nil), clusterUpgEntries...) + defer func() { + clusterUpgEntries = originalClusterUpgEntries + }() clusterUpgEntries = []versions.UpgradeEntry{} v := &versionHandle{ @@ -169,3 +190,46 @@ func Test_upg_statistics_view_check_mismatch(t *testing.T) { assert.NoError(t, err) assert.False(t, ok) } + +func Test_upg_mo_indexes_add_included_columns_check(t *testing.T) { + stubs := gostub.Stub(&checkMoIndexesIncludedColumns, func(txn executor.TxnExecutor, accountId uint32) (versions.ColumnInfo, error) { + return versions.ColumnInfo{IsExits: true}, nil + }) + defer stubs.Reset() + + ok, err := upg_mo_indexes_add_included_columns_for_cluster.CheckFunc(nil, catalog.System_Account) + assert.NoError(t, err) + assert.True(t, ok) + + ok, err = upg_mo_indexes_add_included_columns_for_tenant.CheckFunc(nil, 100) + assert.NoError(t, err) + assert.True(t, ok) +} + +func Test_upg_mo_indexes_add_included_columns_check_error(t *testing.T) { + stubs := gostub.Stub(&checkMoIndexesIncludedColumns, func(txn executor.TxnExecutor, accountId uint32) (versions.ColumnInfo, error) { + return versions.ColumnInfo{}, moerr.NewInternalErrorNoCtx("return error") + }) + defer stubs.Reset() + + ok, err := upg_mo_indexes_add_included_columns_for_cluster.CheckFunc(nil, catalog.System_Account) + assert.Error(t, err) + assert.False(t, ok) +} + +func Test_upg_mo_indexes_add_included_columns_ordering(t *testing.T) { + clusterEntryIdx := findUpgradeEntryIndex(clusterUpgEntries, upg_mo_indexes_add_included_columns_for_cluster) + clusterCreateIdx := findUpgradeEntryIndex(clusterUpgEntries, upg_mo_iscp_log_new) + if assert.NotEqual(t, -1, clusterEntryIdx) && assert.NotEqual(t, -1, clusterCreateIdx) { + assert.Less(t, clusterEntryIdx, clusterCreateIdx) + } + + tenantEntryIdx := findUpgradeEntryIndex(tenantUpgEntries, upg_mo_indexes_add_included_columns_for_tenant) + tenantCreateIdx := findUpgradeEntryIndex(tenantUpgEntries, enablePartitionMetadata) + if assert.NotEqual(t, -1, tenantEntryIdx) && assert.NotEqual(t, -1, tenantCreateIdx) { + assert.Less(t, tenantEntryIdx, tenantCreateIdx) + } + + assert.True(t, strings.Contains(upg_mo_indexes_add_included_columns_for_cluster.UpgSql, catalog.IndexIncludedColumns)) + assert.True(t, strings.Contains(upg_mo_indexes_add_included_columns_for_cluster.UpgSql, "index_table_name")) +} diff --git a/pkg/catalog/secondary_index_utils.go b/pkg/catalog/secondary_index_utils.go index 3bb4916dd3ecd..9bb5041a329bc 100644 --- a/pkg/catalog/secondary_index_utils.go +++ b/pkg/catalog/secondary_index_utils.go @@ -85,18 +85,58 @@ func IsHnswIndexAlgo(algo string) bool { // ------------------------[START] IndexAlgoParams------------------------ const ( - IndexAlgoParamLists = "lists" - IndexAlgoParamOpType = "op_type" - HnswM = "m" - HnswEfConstruction = "ef_construction" - HnswQuantization = "quantization" - HnswEfSearch = "ef_search" - Async = "async" - AutoUpdate = "auto_update" - Day = "day" - Hour = "hour" + IndexAlgoParamLists = "lists" + IndexAlgoParamOpType = "op_type" + IndexAlgoParamIncludeColumns = "include_columns" + HnswM = "m" + HnswEfConstruction = "ef_construction" + HnswQuantization = "quantization" + HnswEfSearch = "ef_search" + Async = "async" + AutoUpdate = "auto_update" + Day = "day" + Hour = "hour" ) +func MarshalIncludeColumnsValue(cols []string) (string, error) { + if len(cols) == 0 { + return "", nil + } + data, err := json.Marshal(cols) + if err != nil { + return "", err + } + return string(data), nil +} + +func ParseIncludeColumnsValue(raw string) ([]string, error) { + raw = strings.TrimSpace(raw) + if raw == "" { + return nil, nil + } + + if strings.HasPrefix(raw, "[") { + var cols []string + if err := json.Unmarshal([]byte(raw), &cols); err == nil { + return cols, nil + } + } + + parts := strings.Split(raw, ",") + cols := make([]string, 0, len(parts)) + for _, part := range parts { + part = strings.TrimSpace(part) + if part == "" { + continue + } + cols = append(cols, part) + } + if len(cols) == 0 { + return nil, nil + } + return cols, nil +} + /* 1. ToString Functions */ // IndexParamsToStringList used by buildShowCreateTable and restoreDDL @@ -227,7 +267,7 @@ func indexParamsToMap(def interface{}) (map[string]string, error) { case tree.INDEX_TYPE_BTREE, tree.INDEX_TYPE_INVALID, tree.INDEX_TYPE_RTREE: // do nothing case tree.INDEX_TYPE_MASTER: - // do nothing + // do nothing case tree.INDEX_TYPE_IVFFLAT: if idx.IndexOption.AlgoParamList == 0 { // NOTE: @@ -265,6 +305,7 @@ func indexParamsToMap(def interface{}) (map[string]string, error) { if idx.IndexOption.Hour > 0 { res[Hour] = strconv.FormatInt(idx.IndexOption.Hour, 10) } + case tree.INDEX_TYPE_HNSW: if idx.IndexOption.HnswM < 0 { return nil, moerr.NewInternalErrorNoCtx("invalid M. hnsw.M must be > 0") diff --git a/pkg/catalog/secondary_index_utils_test.go b/pkg/catalog/secondary_index_utils_test.go index 559fd8690cf12..1df04bbfea4d4 100644 --- a/pkg/catalog/secondary_index_utils_test.go +++ b/pkg/catalog/secondary_index_utils_test.go @@ -18,10 +18,11 @@ import ( "testing" "github.com/stretchr/testify/require" + + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" ) func TestIsIndexAsync(t *testing.T) { - var ( json string err error @@ -47,3 +48,53 @@ func TestIsIndexAsync(t *testing.T) { _, err = IsIndexAsync(json) require.NotNil(t, err) } + +func unresolvedName(name string) *tree.UnresolvedName { + return tree.NewUnresolvedName(tree.NewCStr(name, 1)) +} + +func TestIndexParamsToJsonString_DoesNotSerializeIvfFlatIncludeColumns(t *testing.T) { + idx := tree.NewIndex( + false, + []*tree.KeyPart{tree.NewKeyPart(unresolvedName("embedding"), -1, tree.DefaultDirection, nil)}, + "idx1", + tree.INDEX_TYPE_IVFFLAT, + &tree.IndexOption{ + AlgoParamList: 10, + AlgoParamVectorOpType: "vector_l2_ops", + IncludeColumns: []*tree.UnresolvedName{ + unresolvedName("title"), + unresolvedName("category"), + }, + }, + ) + + params, err := IndexParamsToJsonString(idx) + require.NoError(t, err) + + paramMap, err := IndexParamsStringToMap(params) + require.NoError(t, err) + require.Equal(t, "10", paramMap[IndexAlgoParamLists]) + require.Equal(t, "vector_l2_ops", paramMap[IndexAlgoParamOpType]) + _, ok := paramMap[IndexAlgoParamIncludeColumns] + require.False(t, ok) +} + +func TestIndexParamsToStringList_DoesNotRenderIncludeColumns(t *testing.T) { + paramList, err := IndexParamsToStringList(`{"lists":"10","op_type":"vector_l2_ops","include_columns":"[\"title\",\"category\"]"}`) + require.NoError(t, err) + require.Contains(t, paramList, "lists = 10") + require.Contains(t, paramList, "op_type 'vector_l2_ops'") + require.NotContains(t, paramList, "INCLUDE") + require.NotContains(t, paramList, "title") +} + +func TestParseIncludeColumnsValue_BackwardCompatible(t *testing.T) { + cols, err := ParseIncludeColumnsValue(`["title","category"]`) + require.NoError(t, err) + require.Equal(t, []string{"title", "category"}, cols) + + cols, err = ParseIncludeColumnsValue("title,category") + require.NoError(t, err) + require.Equal(t, []string{"title", "category"}, cols) +} diff --git a/pkg/catalog/types.go b/pkg/catalog/types.go index d5d4cc08e3f87..245e5590dc54e 100644 --- a/pkg/catalog/types.go +++ b/pkg/catalog/types.go @@ -253,9 +253,10 @@ const ( SystemRelAttr_LogicalID = "rel_logical_id" // 'mo_indexes' table - IndexAlgoName = "algo" - IndexAlgoTableType = "algo_table_type" - IndexAlgoParams = "algo_params" + IndexAlgoName = "algo" + IndexAlgoTableType = "algo_table_type" + IndexAlgoParams = "algo_params" + IndexIncludedColumns = "included_columns" // 'mo_columns' table SystemColAttr_UniqName = "att_uniq_name" @@ -385,6 +386,7 @@ const ( SystemSI_IVFFLAT_TblCol_Entries_id = "__mo_index_centroid_fk_id" SystemSI_IVFFLAT_TblCol_Entries_pk = IndexTablePrimaryColName SystemSI_IVFFLAT_TblCol_Entries_entry = "__mo_index_centroid_fk_entry" + SystemSI_IVFFLAT_IncludeColPrefix = "__mo_index_include_" /************ 3. FULLTEXT Index **************/ diff --git a/pkg/frontend/predefined.go b/pkg/frontend/predefined.go index 96026a01ce7c2..9a845c976c700 100644 --- a/pkg/frontend/predefined.go +++ b/pkg/frontend/predefined.go @@ -455,6 +455,7 @@ var ( ordinal_position int unsigned not null, options text, index_table_name varchar(5000), + included_columns text, primary key(id, column_name) )`, catalog.MO_CATALOG, catalog.MO_INDEXES) diff --git a/pkg/pb/pipeline/pipeline.pb.go b/pkg/pb/pipeline/pipeline.pb.go index 3484d0c95c731..dfdcffddef167 100644 --- a/pkg/pb/pipeline/pipeline.pb.go +++ b/pkg/pb/pipeline/pipeline.pb.go @@ -2890,15 +2890,17 @@ func (m *IndexJoin) GetRuntimeFilterBuildList() []*plan.RuntimeFilterSpec { } type TableFunction struct { - Attrs []string `protobuf:"bytes,1,rep,name=attrs,proto3" json:"attrs,omitempty"` - Rets []*plan.ColDef `protobuf:"bytes,2,rep,name=rets,proto3" json:"rets,omitempty"` - Args []*plan.Expr `protobuf:"bytes,3,rep,name=args,proto3" json:"args,omitempty"` - Params []byte `protobuf:"bytes,4,opt,name=params,proto3" json:"params,omitempty"` - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - IsSingle bool `protobuf:"varint,6,opt,name=is_single,json=isSingle,proto3" json:"is_single,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Attrs []string `protobuf:"bytes,1,rep,name=attrs,proto3" json:"attrs,omitempty"` + Rets []*plan.ColDef `protobuf:"bytes,2,rep,name=rets,proto3" json:"rets,omitempty"` + Args []*plan.Expr `protobuf:"bytes,3,rep,name=args,proto3" json:"args,omitempty"` + Params []byte `protobuf:"bytes,4,opt,name=params,proto3" json:"params,omitempty"` + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + IsSingle bool `protobuf:"varint,6,opt,name=is_single,json=isSingle,proto3" json:"is_single,omitempty"` + RuntimeFilterSpecs []*plan.RuntimeFilterSpec `protobuf:"bytes,7,rep,name=runtime_filter_specs,json=runtimeFilterSpecs,proto3" json:"runtime_filter_specs,omitempty"` + IndexReaderParam *plan.IndexReaderParam `protobuf:"bytes,8,opt,name=index_reader_param,json=indexReaderParam,proto3" json:"index_reader_param,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *TableFunction) Reset() { *m = TableFunction{} } @@ -2976,6 +2978,20 @@ func (m *TableFunction) GetIsSingle() bool { return false } +func (m *TableFunction) GetRuntimeFilterSpecs() []*plan.RuntimeFilterSpec { + if m != nil { + return m.RuntimeFilterSpecs + } + return nil +} + +func (m *TableFunction) GetIndexReaderParam() *plan.IndexReaderParam { + if m != nil { + return m.IndexReaderParam + } + return nil +} + type ExternalName2ColIndex struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Index int32 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"` @@ -5232,374 +5248,377 @@ func init() { func init() { proto.RegisterFile("pipeline.proto", fileDescriptor_7ac67a7adf3df9c7) } var fileDescriptor_7ac67a7adf3df9c7 = []byte{ - // 5871 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7b, 0x5b, 0x6f, 0x1c, 0xc9, - 0x75, 0xb0, 0xe6, 0x3e, 0x73, 0xe6, 0xc2, 0x61, 0xe9, 0x36, 0x92, 0x76, 0x25, 0xaa, 0x2d, 0x69, - 0x69, 0xad, 0x44, 0x69, 0xb9, 0x96, 0xbd, 0xfe, 0xfc, 0xf9, 0x42, 0x91, 0x92, 0x4d, 0x9b, 0x94, - 0x98, 0x22, 0x95, 0x45, 0xfc, 0x90, 0x46, 0xb3, 0xbb, 0x66, 0xd8, 0xcb, 0x9e, 0xae, 0x56, 0x5f, - 0x24, 0x52, 0x4f, 0x01, 0x12, 0x20, 0x40, 0xfe, 0x40, 0x80, 0x04, 0x01, 0x0c, 0xbf, 0x04, 0x0e, - 0x12, 0x24, 0x40, 0xfe, 0x84, 0x1f, 0xf3, 0x94, 0xc7, 0x20, 0x70, 0x1e, 0x03, 0xe4, 0x25, 0x17, - 0x18, 0x08, 0x02, 0x04, 0xe7, 0x54, 0x55, 0x77, 0xcf, 0x70, 0x24, 0xef, 0x6e, 0x02, 0xbf, 0xc4, - 0x4f, 0x53, 0x75, 0xce, 0xa9, 0x9a, 0xea, 0x53, 0xe7, 0x5e, 0x55, 0x30, 0x88, 0xfc, 0x48, 0x04, - 0x7e, 0x28, 0xd6, 0xa2, 0x58, 0xa6, 0x92, 0xb5, 0x4d, 0xff, 0xea, 0xfd, 0x89, 0x9f, 0x1e, 0x65, - 0x87, 0x6b, 0xae, 0x9c, 0x3e, 0x98, 0xc8, 0x89, 0x7c, 0x40, 0x04, 0x87, 0xd9, 0x98, 0x7a, 0xd4, - 0xa1, 0x96, 0x1a, 0x78, 0x15, 0x02, 0xe9, 0x1e, 0x9b, 0x76, 0x14, 0x38, 0xa1, 0x6e, 0x2f, 0xa5, - 0xfe, 0x54, 0x24, 0xa9, 0x33, 0x8d, 0x34, 0xa0, 0x93, 0x9e, 0x68, 0x9c, 0xf5, 0xa7, 0x55, 0x68, - 0xed, 0x8a, 0x24, 0x71, 0x26, 0x82, 0x59, 0x50, 0x4b, 0x7c, 0x6f, 0x54, 0x59, 0xa9, 0xac, 0x0e, - 0xd6, 0x87, 0x6b, 0xf9, 0xb2, 0xf6, 0x53, 0x27, 0xcd, 0x12, 0x8e, 0x48, 0xa4, 0x71, 0xa7, 0xde, - 0xa8, 0x3a, 0x4f, 0xb3, 0x2b, 0xd2, 0x23, 0xe9, 0x71, 0x44, 0xb2, 0x21, 0xd4, 0x44, 0x1c, 0x8f, - 0x6a, 0x2b, 0x95, 0xd5, 0x1e, 0xc7, 0x26, 0x63, 0x50, 0xf7, 0x9c, 0xd4, 0x19, 0xd5, 0x09, 0x44, - 0x6d, 0x76, 0x0b, 0x06, 0x51, 0x2c, 0x5d, 0xdb, 0x0f, 0xc7, 0xd2, 0x26, 0x6c, 0x83, 0xb0, 0x3d, - 0x84, 0x6e, 0x87, 0x63, 0xb9, 0x85, 0x54, 0x23, 0x68, 0x39, 0xa1, 0x13, 0x9c, 0x26, 0x62, 0xd4, - 0x24, 0xb4, 0xe9, 0xb2, 0x01, 0x54, 0x7d, 0x6f, 0xd4, 0x5a, 0xa9, 0xac, 0xd6, 0x79, 0xd5, 0xf7, - 0xf0, 0x3f, 0xb2, 0xcc, 0xf7, 0x46, 0x6d, 0xf5, 0x1f, 0xd8, 0x66, 0x16, 0xf4, 0x42, 0x21, 0xbc, - 0x67, 0x32, 0xe5, 0x22, 0x0a, 0x4e, 0x47, 0x9d, 0x95, 0xca, 0x6a, 0x9b, 0xcf, 0xc0, 0xd8, 0x55, - 0x68, 0x7b, 0xe2, 0x30, 0x9b, 0xec, 0x26, 0x93, 0x11, 0xac, 0x54, 0x56, 0x3b, 0x3c, 0xef, 0x5b, - 0x2f, 0xa0, 0xb3, 0x29, 0xc3, 0x50, 0xb8, 0xa9, 0x8c, 0xd9, 0x0d, 0xe8, 0x9a, 0xcf, 0xb5, 0x35, - 0x9b, 0x1a, 0x1c, 0x0c, 0x68, 0xdb, 0x63, 0x1f, 0xc0, 0x92, 0x6b, 0xa8, 0x6d, 0x3f, 0xf4, 0xc4, - 0x09, 0xf1, 0xa9, 0xc1, 0x07, 0x39, 0x78, 0x1b, 0xa1, 0xd6, 0x9f, 0xd4, 0xa0, 0xb5, 0x7f, 0x94, - 0x8d, 0xc7, 0x81, 0x60, 0xb7, 0xa0, 0xaf, 0x9b, 0x9b, 0x32, 0xd8, 0xf6, 0x4e, 0xf4, 0xbc, 0xb3, - 0x40, 0xb6, 0x02, 0x5d, 0x0d, 0x38, 0x38, 0x8d, 0x84, 0x9e, 0xb6, 0x0c, 0x9a, 0x9d, 0x67, 0xd7, - 0x0f, 0x89, 0xfd, 0x35, 0x3e, 0x0b, 0x9c, 0xa3, 0x72, 0x4e, 0x68, 0x47, 0x66, 0xa9, 0x1c, 0xfa, - 0xb7, 0x8d, 0xc0, 0x7f, 0x25, 0xb8, 0x98, 0x6c, 0x86, 0x29, 0xed, 0x4b, 0x83, 0x97, 0x41, 0x6c, - 0x1d, 0x2e, 0x26, 0x6a, 0x88, 0x1d, 0x3b, 0xe1, 0x44, 0x24, 0x76, 0xe6, 0x87, 0xe9, 0xd7, 0xbf, - 0x36, 0x6a, 0xae, 0xd4, 0x56, 0xeb, 0xfc, 0xbc, 0x46, 0x72, 0xc2, 0xbd, 0x20, 0x14, 0x7b, 0x08, - 0x17, 0xe6, 0xc6, 0xa8, 0x21, 0xad, 0x95, 0xda, 0x6a, 0x8d, 0xb3, 0x99, 0x21, 0xdb, 0x34, 0xe2, - 0x09, 0x2c, 0xc7, 0x59, 0x88, 0xd2, 0xfb, 0xd4, 0x0f, 0x52, 0x11, 0xef, 0x47, 0xc2, 0xa5, 0xfd, - 0xed, 0xae, 0x5f, 0x5e, 0x23, 0x01, 0xe7, 0xf3, 0x68, 0x7e, 0x76, 0x04, 0xbb, 0x97, 0x33, 0xef, - 0xc9, 0x49, 0x14, 0x93, 0x10, 0x74, 0xd7, 0x41, 0x4d, 0x80, 0x10, 0x5e, 0x46, 0x5b, 0xbf, 0xac, - 0x42, 0x7b, 0xcb, 0x4f, 0x22, 0x27, 0x75, 0x8f, 0xd8, 0x65, 0x68, 0x8d, 0xb3, 0xd0, 0x2d, 0xf6, - 0xbb, 0x89, 0xdd, 0x6d, 0x8f, 0xfd, 0x7f, 0x58, 0x0a, 0xa4, 0xeb, 0x04, 0x76, 0xbe, 0xb5, 0xa3, - 0xea, 0x4a, 0x6d, 0xb5, 0xbb, 0x7e, 0xbe, 0xd0, 0x89, 0x5c, 0x74, 0xf8, 0x80, 0x68, 0x0b, 0x51, - 0xfa, 0x36, 0x0c, 0x63, 0x31, 0x95, 0xa9, 0x28, 0x0d, 0xaf, 0xd1, 0x70, 0x56, 0x0c, 0xff, 0x34, - 0x76, 0xa2, 0x67, 0xd2, 0x13, 0x7c, 0x49, 0xd1, 0x16, 0xc3, 0x3f, 0x2a, 0x71, 0x5f, 0x4c, 0x6c, - 0xdf, 0x3b, 0xb1, 0xe9, 0x0f, 0x46, 0xf5, 0x95, 0xda, 0x6a, 0xa3, 0x60, 0xa5, 0x98, 0x6c, 0x7b, - 0x27, 0x3b, 0x88, 0x61, 0x1f, 0xc3, 0xa5, 0xf9, 0x21, 0x6a, 0xd6, 0x51, 0x83, 0xc6, 0x9c, 0x9f, - 0x19, 0xc3, 0x09, 0xc5, 0x6e, 0x42, 0xcf, 0x0c, 0x4a, 0x51, 0xec, 0x9a, 0x4a, 0x10, 0x92, 0x92, - 0xd8, 0x5d, 0x86, 0x96, 0x9f, 0xd8, 0x89, 0x1f, 0x1e, 0x93, 0x2a, 0xb6, 0x79, 0xd3, 0x4f, 0xf6, - 0xfd, 0xf0, 0x98, 0x5d, 0x81, 0x76, 0x2c, 0x5c, 0x85, 0x69, 0x13, 0xa6, 0x15, 0x0b, 0x97, 0x50, - 0x97, 0x01, 0x9b, 0xb6, 0x9b, 0x0a, 0xad, 0x90, 0xcd, 0x58, 0xb8, 0x9b, 0xa9, 0xb0, 0x12, 0x68, - 0xec, 0x8a, 0x78, 0x22, 0x50, 0x27, 0x71, 0xe0, 0xbe, 0xeb, 0x84, 0xc4, 0xf7, 0x36, 0xcf, 0xfb, - 0x68, 0x11, 0x22, 0x27, 0x4e, 0x7d, 0x27, 0x20, 0x35, 0x68, 0x73, 0xd3, 0x65, 0xd7, 0xa0, 0x93, - 0xa4, 0x4e, 0x9c, 0xe2, 0xd7, 0x91, 0xf8, 0x37, 0x78, 0x9b, 0x00, 0xa8, 0x41, 0x97, 0xa1, 0x25, - 0x42, 0x8f, 0x50, 0x75, 0xb5, 0x93, 0x22, 0xf4, 0xb6, 0xbd, 0x13, 0xeb, 0x6f, 0x2b, 0xd0, 0xdf, - 0xcd, 0x82, 0xd4, 0xdf, 0x88, 0x27, 0x99, 0x98, 0x86, 0x29, 0x5a, 0x92, 0x2d, 0x3f, 0x49, 0xf5, - 0x3f, 0x53, 0x9b, 0xad, 0x42, 0xe7, 0xfb, 0xb1, 0xcc, 0x22, 0x92, 0x20, 0xb5, 0xd3, 0x65, 0x09, - 0x2a, 0x90, 0x28, 0x6d, 0xcf, 0x63, 0x4f, 0xc4, 0x8f, 0x4f, 0x89, 0xb6, 0x76, 0x86, 0xb6, 0x8c, - 0x66, 0xef, 0x41, 0x67, 0x5f, 0x44, 0x4e, 0xec, 0xa0, 0x08, 0xd4, 0xc9, 0xfc, 0x14, 0x00, 0xfc, - 0x56, 0x22, 0xde, 0xf6, 0xb4, 0x12, 0x9a, 0xae, 0x35, 0x81, 0xce, 0xc6, 0x64, 0x12, 0x8b, 0x89, - 0x93, 0x92, 0x29, 0x94, 0x11, 0x2d, 0xb7, 0xc6, 0xab, 0x32, 0x22, 0x73, 0x8b, 0x1f, 0xa0, 0xf8, - 0x43, 0x6d, 0x76, 0x1d, 0xea, 0x62, 0xf1, 0x7a, 0x08, 0xce, 0x2e, 0x41, 0xd3, 0x95, 0xe1, 0xd8, - 0x9f, 0x68, 0x23, 0xad, 0x7b, 0xd6, 0x5f, 0xd4, 0xa0, 0x41, 0x1f, 0x87, 0xec, 0x45, 0xc3, 0x69, - 0x8b, 0x57, 0x4e, 0x60, 0x76, 0x05, 0x01, 0x4f, 0x5e, 0x39, 0x01, 0x5b, 0x81, 0x06, 0x4e, 0x93, - 0x2c, 0xe0, 0x8d, 0x42, 0xb0, 0x3b, 0xd0, 0x40, 0x21, 0x4a, 0x66, 0x57, 0x80, 0x42, 0xf4, 0xb8, - 0xfe, 0xf3, 0x7f, 0xb8, 0x71, 0x8e, 0x2b, 0x34, 0xfb, 0x00, 0xea, 0xce, 0x64, 0x92, 0x90, 0x2c, - 0xcf, 0xa8, 0x53, 0xfe, 0xbd, 0x9c, 0x08, 0xd8, 0x23, 0xe8, 0xa8, 0x7d, 0x43, 0xea, 0x06, 0x51, - 0x5f, 0x2e, 0x39, 0xa4, 0xf2, 0x96, 0xf2, 0x82, 0x12, 0x39, 0xee, 0x27, 0x5a, 0xe1, 0x49, 0xa2, - 0xdb, 0xbc, 0x00, 0xa0, 0xc7, 0x88, 0x62, 0xb1, 0x11, 0x04, 0xd2, 0xdd, 0xf7, 0xdf, 0x08, 0xed, - 0x5f, 0x66, 0x60, 0xec, 0x0e, 0x0c, 0xf6, 0x94, 0xc8, 0x71, 0x91, 0x64, 0x41, 0x9a, 0x68, 0x9f, - 0x33, 0x07, 0x65, 0x6b, 0xc0, 0x66, 0x20, 0x07, 0xf4, 0xf9, 0x9d, 0x95, 0xda, 0x6a, 0x9f, 0x2f, - 0xc0, 0xb0, 0xaf, 0x40, 0x7f, 0x82, 0x9c, 0xf6, 0xc3, 0x89, 0x3d, 0x0e, 0x1c, 0x74, 0x47, 0x35, - 0x74, 0x57, 0x06, 0xf8, 0x34, 0x70, 0x26, 0x24, 0xe4, 0x91, 0x1f, 0x04, 0xf6, 0x54, 0x4c, 0x47, - 0x5d, 0xda, 0xf2, 0x36, 0x01, 0x76, 0xc5, 0xd4, 0xfa, 0xb7, 0x2a, 0x34, 0xb7, 0xc3, 0x44, 0xc4, - 0x29, 0xaa, 0x90, 0x33, 0x1e, 0x0b, 0x37, 0x15, 0xca, 0x74, 0xd5, 0x79, 0xde, 0x47, 0x16, 0x1c, - 0xc8, 0x4f, 0x63, 0x3f, 0x15, 0xfb, 0x1f, 0x6b, 0x21, 0x29, 0x00, 0xec, 0x2e, 0x2c, 0x3b, 0x9e, - 0x67, 0x1b, 0x6a, 0x3b, 0x96, 0xaf, 0x13, 0x52, 0xa7, 0x36, 0x5f, 0x72, 0x3c, 0x6f, 0x43, 0xc3, - 0xb9, 0x7c, 0x9d, 0xb0, 0x9b, 0x50, 0x8b, 0xc5, 0x98, 0x44, 0xa6, 0xbb, 0xbe, 0xa4, 0xb6, 0xf4, - 0xf9, 0xe1, 0x67, 0xc2, 0x4d, 0xb9, 0x18, 0x73, 0xc4, 0xb1, 0x0b, 0xd0, 0x70, 0xd2, 0x34, 0x56, - 0x5b, 0xd4, 0xe1, 0xaa, 0xc3, 0xd6, 0xe0, 0x3c, 0xa9, 0x6d, 0xea, 0xcb, 0xd0, 0x4e, 0x9d, 0xc3, - 0x00, 0x7d, 0x6a, 0xa2, 0xdd, 0xc7, 0x72, 0x8e, 0x3a, 0x40, 0xcc, 0xb6, 0x97, 0xa0, 0xc3, 0x99, - 0xa7, 0x0f, 0x9d, 0xa9, 0x48, 0xc8, 0x7b, 0x74, 0xf8, 0xf9, 0xd9, 0x11, 0xcf, 0x10, 0x85, 0xfc, - 0x2c, 0xc6, 0xa0, 0xe2, 0xb7, 0x49, 0x87, 0x7a, 0x39, 0x10, 0xed, 0xc2, 0x45, 0x68, 0xfa, 0x89, - 0x2d, 0x42, 0x4f, 0xdb, 0xa2, 0x86, 0x9f, 0x3c, 0x09, 0x3d, 0xf6, 0x21, 0x74, 0xd4, 0xbf, 0x78, - 0x62, 0x4c, 0x61, 0x41, 0x77, 0x7d, 0xa0, 0x25, 0x16, 0xc1, 0x5b, 0x62, 0xcc, 0xdb, 0xa9, 0x6e, - 0x59, 0xbf, 0x5f, 0x81, 0x2e, 0x09, 0xd8, 0x8b, 0xc8, 0x43, 0x7d, 0xfc, 0x0a, 0xf4, 0x67, 0xb9, - 0xa7, 0x36, 0xa0, 0xe7, 0x94, 0x59, 0x77, 0x09, 0x9a, 0x1b, 0x2e, 0xae, 0x82, 0x76, 0xa0, 0xcf, - 0x75, 0x8f, 0x7d, 0x03, 0x96, 0x32, 0x9a, 0xc6, 0x76, 0xd3, 0x13, 0x3b, 0x40, 0x3d, 0x56, 0x1a, - 0xa3, 0xd9, 0xab, 0xfe, 0x63, 0x33, 0x3d, 0xe1, 0xfd, 0xcc, 0x34, 0x77, 0xfc, 0x24, 0xb5, 0xde, - 0x87, 0xc6, 0x46, 0x1c, 0x3b, 0xa7, 0xc4, 0x71, 0x6c, 0x8c, 0x2a, 0x64, 0xda, 0x55, 0xc7, 0x72, - 0xa1, 0xb6, 0xeb, 0x44, 0xec, 0x36, 0x54, 0xa7, 0x11, 0x61, 0xba, 0xeb, 0x17, 0x4b, 0xea, 0xe2, - 0x44, 0x6b, 0xbb, 0xd1, 0x93, 0x30, 0x8d, 0x4f, 0x79, 0x75, 0x1a, 0x5d, 0x7d, 0x04, 0x2d, 0xdd, - 0xc5, 0x70, 0xee, 0x58, 0x9c, 0xd2, 0x37, 0x74, 0x38, 0x36, 0xf1, 0x0f, 0x5e, 0x39, 0x41, 0x66, - 0xe2, 0x10, 0xd5, 0xf9, 0x7f, 0xd5, 0x4f, 0x2a, 0xd6, 0xbf, 0xd7, 0xa1, 0xbd, 0x25, 0x02, 0x41, - 0x5f, 0x62, 0x41, 0xaf, 0x2c, 0x2c, 0x86, 0x0b, 0x33, 0x02, 0x64, 0x41, 0x4f, 0x39, 0x1b, 0x1a, - 0x25, 0xb4, 0x34, 0xce, 0xc0, 0xd0, 0x0a, 0x6e, 0x3f, 0xce, 0xdc, 0x63, 0x91, 0x92, 0x18, 0xf6, - 0xb9, 0xe9, 0x22, 0xe6, 0x99, 0xc6, 0xd4, 0x15, 0x46, 0x77, 0xd9, 0x7b, 0x00, 0xb1, 0x7c, 0x6d, - 0xfb, 0xca, 0xe2, 0x2b, 0xe3, 0xd9, 0x8e, 0xe5, 0xeb, 0x6d, 0xb4, 0xf9, 0xbf, 0x16, 0xe9, 0xfb, - 0x06, 0x8c, 0x4a, 0xd2, 0x87, 0x71, 0x9f, 0xed, 0x87, 0xf6, 0x21, 0x86, 0x15, 0x5a, 0x10, 0x8b, - 0x39, 0x29, 0x2c, 0xdc, 0x0e, 0x1f, 0x53, 0xcc, 0xa1, 0x75, 0xaa, 0xf3, 0x0e, 0x9d, 0x5a, 0xa8, - 0xa2, 0xb0, 0x58, 0x45, 0x1f, 0x03, 0xec, 0x8b, 0xc9, 0x54, 0x84, 0xe9, 0xae, 0x13, 0x8d, 0xba, - 0xb4, 0xf1, 0x56, 0xb1, 0xf1, 0x66, 0xb7, 0xd6, 0x0a, 0x22, 0x25, 0x05, 0xa5, 0x51, 0x18, 0x08, - 0xb8, 0x4e, 0x68, 0xa7, 0x71, 0x16, 0xba, 0x4e, 0x2a, 0x46, 0x3d, 0xfa, 0xab, 0xae, 0xeb, 0x84, - 0x07, 0x1a, 0x54, 0xd2, 0xa3, 0x7e, 0x59, 0x8f, 0xee, 0xc0, 0x52, 0x14, 0xfb, 0x53, 0x27, 0x3e, - 0xb5, 0x8f, 0xc5, 0x29, 0x6d, 0xc6, 0x40, 0x05, 0xb8, 0x1a, 0xfc, 0x23, 0x71, 0xba, 0xed, 0x9d, - 0x5c, 0xfd, 0x36, 0x2c, 0xcd, 0x2d, 0xe0, 0x0b, 0xc9, 0xdd, 0x4f, 0x6a, 0xd0, 0xd9, 0x8b, 0x85, - 0xb6, 0x7d, 0x37, 0xa0, 0x9b, 0xb8, 0x47, 0x62, 0xea, 0xd0, 0x2e, 0xe9, 0x19, 0x40, 0x81, 0x70, - 0x73, 0x66, 0xb5, 0xbb, 0xfa, 0x6e, 0xed, 0xc6, 0x75, 0xa8, 0x80, 0x02, 0x95, 0x09, 0x9b, 0x85, - 0x49, 0xab, 0x97, 0x4d, 0xda, 0x0a, 0xf4, 0x8e, 0x9c, 0xc4, 0x76, 0xb2, 0x54, 0xda, 0xae, 0x0c, - 0x48, 0xe8, 0xda, 0x1c, 0x8e, 0x9c, 0x64, 0x23, 0x4b, 0xe5, 0xa6, 0x0c, 0xd8, 0xfb, 0x00, 0xae, - 0x0c, 0x6c, 0x39, 0x1e, 0x27, 0x22, 0xd5, 0xd1, 0x54, 0xc7, 0x95, 0xc1, 0x73, 0x02, 0xa0, 0x54, - 0x8a, 0x24, 0xf5, 0xa7, 0x8e, 0xde, 0x52, 0xdb, 0x95, 0x59, 0x98, 0x92, 0x0b, 0xaa, 0xf1, 0xe5, - 0x1c, 0xc5, 0xe5, 0xeb, 0x4d, 0x44, 0xb0, 0x87, 0x30, 0x70, 0xe5, 0x34, 0xb2, 0x23, 0xe4, 0x2c, - 0x39, 0xf7, 0xf6, 0x99, 0xd0, 0xb6, 0x87, 0x14, 0x7b, 0xc7, 0x42, 0x45, 0x1b, 0xeb, 0xb0, 0xe4, - 0x06, 0x59, 0x92, 0x8a, 0xd8, 0x3e, 0xd4, 0x43, 0xce, 0x46, 0xc3, 0x7d, 0x4d, 0xa2, 0x23, 0x14, - 0x0b, 0xfa, 0x7e, 0x62, 0xcb, 0xc0, 0xb3, 0x95, 0xb9, 0xd1, 0x72, 0xd6, 0xf5, 0x93, 0xe7, 0x81, - 0xa7, 0x0d, 0x9e, 0xa2, 0x09, 0xc5, 0x6b, 0x43, 0xd3, 0x35, 0x34, 0xcf, 0xc4, 0x6b, 0x45, 0x63, - 0xfd, 0x7d, 0x15, 0x5a, 0x7b, 0x32, 0x49, 0xb7, 0xa6, 0x81, 0x11, 0xf1, 0xca, 0x17, 0x15, 0xf1, - 0xea, 0x62, 0x11, 0x5f, 0x20, 0x64, 0xb5, 0x05, 0x42, 0xc6, 0x56, 0x61, 0x58, 0xa6, 0x23, 0xe1, - 0x50, 0x31, 0xd7, 0xa0, 0x20, 0x24, 0x01, 0xb9, 0x86, 0x41, 0x82, 0xed, 0x29, 0x9b, 0xa4, 0x36, - 0xb2, 0xed, 0x27, 0xda, 0x1e, 0x29, 0xa4, 0x4f, 0xb2, 0xa6, 0x23, 0x88, 0xb6, 0x9f, 0x68, 0xd9, - 0xfb, 0x26, 0x5c, 0xc9, 0x47, 0xda, 0xaf, 0xfd, 0xf4, 0x48, 0x66, 0xa9, 0x3d, 0xa6, 0x64, 0x24, - 0xd1, 0x21, 0xf2, 0x25, 0x33, 0xd3, 0xa7, 0x0a, 0xad, 0x52, 0x15, 0x0a, 0x68, 0xc6, 0x59, 0x10, - 0xd8, 0xa9, 0x38, 0x49, 0xf5, 0x56, 0x8e, 0x14, 0x6f, 0x34, 0xdf, 0x9e, 0x66, 0x41, 0x70, 0x20, - 0x4e, 0x52, 0x34, 0xfe, 0xed, 0xb1, 0xee, 0x58, 0x7f, 0x5c, 0x07, 0xd8, 0x91, 0xee, 0xf1, 0x81, - 0x13, 0x4f, 0x44, 0x8a, 0x81, 0xb7, 0xb1, 0x68, 0xda, 0xe2, 0xb6, 0x52, 0x65, 0xc7, 0xd8, 0x3a, - 0x5c, 0x32, 0xdf, 0x8f, 0x72, 0x88, 0x49, 0x80, 0x32, 0x49, 0x5a, 0xa1, 0x98, 0xc6, 0xaa, 0xa4, - 0x93, 0xec, 0x11, 0xfb, 0xa4, 0xe0, 0x2d, 0x8e, 0x49, 0x4f, 0x23, 0xe2, 0xed, 0xa2, 0x00, 0xae, - 0x5f, 0x0c, 0x3f, 0x38, 0x8d, 0xd8, 0x43, 0xb8, 0x18, 0x8b, 0x71, 0x2c, 0x92, 0x23, 0x3b, 0x4d, - 0xca, 0x7f, 0xa6, 0xe2, 0xef, 0x65, 0x8d, 0x3c, 0x48, 0xf2, 0xff, 0x7a, 0x08, 0x17, 0x15, 0xa7, - 0xe6, 0x97, 0xa7, 0xec, 0xf7, 0xb2, 0x42, 0x96, 0x57, 0xf7, 0x3e, 0x50, 0xd1, 0x43, 0xd9, 0x64, - 0x13, 0xcd, 0x05, 0xc4, 0x8c, 0xc3, 0x40, 0x60, 0xa0, 0xb3, 0x79, 0x84, 0x09, 0xe5, 0x96, 0x18, - 0x6b, 0xe6, 0x17, 0x00, 0x66, 0x41, 0x7d, 0x57, 0x7a, 0x82, 0x58, 0x3d, 0x58, 0x1f, 0xac, 0x51, - 0xf9, 0x04, 0x39, 0x89, 0x50, 0x4e, 0x38, 0xf6, 0x01, 0xd0, 0x74, 0x4a, 0xfc, 0xce, 0xea, 0x4a, - 0x1b, 0x91, 0x24, 0x83, 0x0f, 0xe1, 0x62, 0xb1, 0x12, 0xdb, 0x49, 0xed, 0xf4, 0x48, 0x90, 0x39, - 0x54, 0xea, 0xb2, 0x9c, 0x2f, 0x6a, 0x23, 0x3d, 0x38, 0x12, 0x68, 0x1a, 0x57, 0xa1, 0x25, 0x0f, - 0x3f, 0xb3, 0x51, 0x11, 0xba, 0x8b, 0x15, 0xa1, 0x29, 0x0f, 0x3f, 0xe3, 0x62, 0xcc, 0xbe, 0x5e, - 0x76, 0x25, 0x73, 0xac, 0xe9, 0x11, 0x6b, 0x2e, 0xe4, 0xf8, 0x12, 0x77, 0xac, 0x4f, 0xa0, 0x89, - 0x9f, 0xf3, 0x3c, 0x62, 0x6b, 0xd0, 0x4a, 0x49, 0x3c, 0x12, 0xed, 0xfa, 0x2f, 0x14, 0x1e, 0xa0, - 0x90, 0x1d, 0x6e, 0x88, 0x2c, 0x0e, 0x4b, 0xb9, 0x39, 0x7d, 0x11, 0xfa, 0x2f, 0x33, 0xc1, 0xbe, - 0x0b, 0xcb, 0x51, 0x2c, 0xb4, 0xd8, 0xdb, 0xd9, 0x31, 0x86, 0x27, 0x5a, 0x83, 0x2f, 0x68, 0x29, - 0xcd, 0x47, 0x1c, 0xa3, 0x84, 0x0e, 0xa2, 0x99, 0xbe, 0xf5, 0x63, 0xb8, 0x9c, 0x53, 0xec, 0x0b, - 0x57, 0x86, 0x9e, 0x13, 0x9f, 0x92, 0xe7, 0x9b, 0x9b, 0x3b, 0xf9, 0x22, 0x73, 0xef, 0xd3, 0xdc, - 0x3f, 0xad, 0xc1, 0xe0, 0x79, 0xb8, 0x95, 0x45, 0x81, 0x8f, 0xde, 0xe8, 0x47, 0xca, 0x59, 0x28, - 0x23, 0x5d, 0x29, 0x1b, 0xe9, 0x55, 0x18, 0xea, 0x7f, 0x41, 0x3e, 0x2a, 0x03, 0xab, 0x8b, 0x34, - 0x0a, 0xbe, 0x29, 0x03, 0x65, 0x5d, 0xbf, 0x0d, 0x17, 0x33, 0xfa, 0x72, 0x45, 0x79, 0x24, 0xdc, - 0x63, 0xfb, 0x2d, 0x19, 0x14, 0x53, 0x84, 0x38, 0x14, 0xc9, 0xc8, 0x6c, 0xde, 0x80, 0x6e, 0x31, - 0xdc, 0x78, 0x0a, 0xc8, 0x09, 0x69, 0x25, 0x32, 0xb4, 0x3d, 0xb3, 0x64, 0x1d, 0xa7, 0xa0, 0x8f, - 0x19, 0xc8, 0xe2, 0x4b, 0xd0, 0x6c, 0xfd, 0x0e, 0x2c, 0xcf, 0x50, 0xd2, 0x2a, 0x9a, 0xb4, 0x8a, - 0xfb, 0xc5, 0x36, 0xce, 0x7e, 0x7e, 0xb9, 0x8b, 0xeb, 0x51, 0x3e, 0x7d, 0x49, 0xce, 0x42, 0x8d, - 0x29, 0x9b, 0x84, 0x32, 0x16, 0x5a, 0x41, 0xd0, 0x94, 0x51, 0xff, 0xea, 0x33, 0xb8, 0xb0, 0x68, - 0x96, 0x05, 0x8e, 0x79, 0xa5, 0xec, 0x98, 0xe7, 0xb2, 0xbf, 0xc2, 0x49, 0xff, 0x79, 0x05, 0xba, - 0x4f, 0xb3, 0x37, 0x6f, 0x4e, 0x95, 0xc1, 0x63, 0x3d, 0xa8, 0x3c, 0xa3, 0x59, 0xaa, 0xbc, 0xf2, - 0x0c, 0xe3, 0xe1, 0xbd, 0x63, 0x34, 0xbe, 0x34, 0x49, 0x87, 0xeb, 0x1e, 0xe6, 0x8d, 0x7b, 0xc7, - 0x07, 0xef, 0x30, 0x3b, 0x0a, 0x8d, 0x09, 0xcf, 0xe3, 0xcc, 0x0f, 0x30, 0xbe, 0xd3, 0x16, 0x26, - 0xef, 0x63, 0x26, 0xb6, 0x3d, 0x56, 0xf2, 0xf2, 0x34, 0x96, 0x53, 0x25, 0xd1, 0xda, 0xae, 0x2f, - 0xc0, 0x58, 0xbf, 0xac, 0x43, 0xfb, 0x07, 0x4e, 0x72, 0xf4, 0x43, 0xe9, 0x87, 0xec, 0x21, 0x74, - 0x3e, 0x93, 0x7e, 0xa8, 0x4a, 0x20, 0xaa, 0x38, 0x7a, 0x5e, 0x2d, 0xe2, 0x99, 0xf4, 0xc4, 0x1a, - 0xd2, 0xe0, 0x6a, 0x78, 0xfb, 0x33, 0xdd, 0xd2, 0xee, 0x30, 0xf6, 0x27, 0x47, 0xa9, 0x8d, 0x40, - 0xed, 0xb7, 0xba, 0x7e, 0xc2, 0x11, 0x46, 0xb3, 0xbe, 0x07, 0x18, 0x19, 0x1c, 0xd9, 0x32, 0xb4, - 0xa3, 0x63, 0x9d, 0x5e, 0xb5, 0x11, 0xf2, 0x3c, 0xdc, 0x3b, 0x46, 0xbb, 0xe6, 0x27, 0xb6, 0x2e, - 0xb4, 0xd0, 0xe7, 0xcc, 0x64, 0xa9, 0xb7, 0x60, 0x80, 0xf1, 0x58, 0x72, 0xec, 0x47, 0x76, 0x14, - 0xcb, 0x43, 0xf3, 0x2d, 0x18, 0xa5, 0xed, 0x1f, 0xfb, 0xd1, 0x1e, 0xc2, 0x28, 0x0c, 0xd2, 0xe5, - 0x1b, 0x14, 0x2e, 0x15, 0x6f, 0x80, 0x06, 0x21, 0x5b, 0xa8, 0x46, 0x13, 0xa8, 0x1c, 0xa3, 0x45, - 0xa2, 0xd7, 0x8a, 0x45, 0x80, 0xc9, 0x04, 0xa2, 0x50, 0xec, 0x09, 0xd5, 0x56, 0x28, 0x57, 0x2a, - 0xd4, 0x57, 0x01, 0x02, 0x31, 0x46, 0x05, 0x0a, 0x3d, 0x95, 0xce, 0xce, 0xd5, 0x42, 0x10, 0xbb, - 0x89, 0x48, 0xf6, 0x21, 0x74, 0x15, 0x17, 0x14, 0x2d, 0x9c, 0xa1, 0x05, 0x42, 0x2b, 0xe2, 0xbb, - 0xd0, 0x0d, 0x65, 0x68, 0x8b, 0x97, 0x44, 0xad, 0x6d, 0xe2, 0xcc, 0xc4, 0xa1, 0x0c, 0x9f, 0xbc, - 0x44, 0x62, 0xf6, 0x40, 0xaf, 0x41, 0x55, 0x14, 0x7a, 0x6f, 0xa9, 0x28, 0xd0, 0x4a, 0x54, 0x6e, - 0xfd, 0x91, 0x59, 0x89, 0x1a, 0xd1, 0x7f, 0xcb, 0x08, 0xb5, 0x1e, 0x35, 0x64, 0x05, 0x7a, 0xb4, - 0xef, 0x53, 0x27, 0xb2, 0x53, 0x67, 0xa2, 0xe3, 0x56, 0x40, 0xd8, 0xae, 0x13, 0x1d, 0x38, 0x13, - 0xc6, 0xe1, 0x8a, 0xae, 0x36, 0x6a, 0x0f, 0x6f, 0x1f, 0xa2, 0xc4, 0x29, 0xae, 0x2d, 0x99, 0x8a, - 0xc4, 0xe2, 0x3a, 0xe5, 0xa5, 0x99, 0x3a, 0x25, 0x49, 0x2a, 0x65, 0x71, 0xff, 0x5a, 0x81, 0xf6, - 0x8e, 0x94, 0xd1, 0x97, 0x14, 0xbd, 0xf2, 0x96, 0x56, 0xdf, 0xbe, 0xa5, 0xb5, 0xd9, 0x2d, 0x9d, - 0x63, 0x7d, 0xfd, 0x5d, 0xac, 0x9f, 0xe3, 0x64, 0xe3, 0x4b, 0x70, 0xb2, 0x39, 0xcf, 0x49, 0xab, - 0x05, 0x8d, 0x7d, 0x91, 0x3e, 0x8f, 0xac, 0xff, 0x6c, 0x42, 0x67, 0x4b, 0x78, 0x99, 0xfa, 0xfe, - 0xf2, 0xd7, 0x54, 0xde, 0xfe, 0x35, 0xd5, 0xd9, 0xaf, 0x41, 0x9f, 0x6d, 0x04, 0x74, 0x81, 0xb5, - 0x6e, 0x1b, 0xf9, 0x44, 0x49, 0x2e, 0xc4, 0x53, 0x17, 0x9c, 0x66, 0xbe, 0x3a, 0x97, 0xce, 0x77, - 0x6f, 0x75, 0xe3, 0x4b, 0x6d, 0xf5, 0x9c, 0x92, 0x9f, 0x29, 0x45, 0xcd, 0x73, 0xad, 0x75, 0x46, - 0xfe, 0xe6, 0x14, 0xbc, 0x7d, 0x46, 0xc1, 0x77, 0xe0, 0xfc, 0x8c, 0xe7, 0x70, 0x54, 0xc1, 0xa1, - 0x43, 0x92, 0xf4, 0x5e, 0x49, 0x92, 0x4a, 0x76, 0x5e, 0x95, 0x21, 0xf8, 0xb2, 0x9c, 0x07, 0xa1, - 0xd5, 0xf1, 0x70, 0x6b, 0xc8, 0x21, 0x52, 0xf0, 0xac, 0xce, 0x4b, 0x7a, 0x04, 0xdd, 0x94, 0x01, - 0xd9, 0xeb, 0x4f, 0x60, 0xa9, 0xa0, 0x52, 0x32, 0xd2, 0x7d, 0x8b, 0x8c, 0xf4, 0xcd, 0x40, 0x25, - 0x26, 0xbf, 0x0e, 0xa5, 0xbe, 0x0f, 0xe7, 0x4d, 0x75, 0x45, 0xc7, 0x51, 0xb4, 0x83, 0x03, 0x92, - 0xa0, 0xa1, 0x2e, 0xa8, 0x50, 0x08, 0x45, 0x5b, 0xf4, 0x2d, 0xb8, 0x50, 0x22, 0x47, 0xc7, 0x5b, - 0x56, 0xee, 0xb2, 0xac, 0x2c, 0xe7, 0x63, 0xb1, 0xbb, 0xa3, 0x4a, 0xae, 0x5d, 0x4f, 0x04, 0xe6, - 0x8f, 0x46, 0x43, 0x95, 0xef, 0x79, 0x22, 0xd0, 0x87, 0x3a, 0xbb, 0x70, 0x0b, 0xd3, 0x2a, 0x0a, - 0x2f, 0x9c, 0x28, 0xcd, 0x62, 0x61, 0x47, 0x81, 0xe3, 0x8a, 0x23, 0x19, 0x78, 0x22, 0x2e, 0x16, - 0xb7, 0x4c, 0x8b, 0xbb, 0x21, 0x03, 0x0f, 0x23, 0x0c, 0x45, 0xb9, 0x57, 0x10, 0x9a, 0xb5, 0x6e, - 0xc0, 0xf5, 0x33, 0xd3, 0xa1, 0x1f, 0x28, 0x26, 0x62, 0x34, 0xd1, 0x95, 0xd9, 0x89, 0x90, 0x44, - 0x4f, 0x61, 0xfd, 0x4b, 0x03, 0x06, 0xe4, 0xa2, 0x7e, 0xa3, 0x82, 0xbf, 0x51, 0xc1, 0xff, 0x03, - 0x2a, 0x68, 0xfd, 0x5e, 0x05, 0x5a, 0x7b, 0xb1, 0xf4, 0x32, 0x37, 0xfd, 0x92, 0x92, 0x3e, 0x2b, - 0x41, 0xb5, 0x5f, 0x25, 0x41, 0xf5, 0x33, 0xae, 0xef, 0x67, 0x15, 0xe8, 0xe8, 0x25, 0xec, 0xac, - 0x7f, 0xc9, 0x45, 0x14, 0x87, 0x3b, 0x95, 0x85, 0x87, 0x3b, 0xbf, 0x72, 0x15, 0x28, 0x58, 0xaf, - 0xd4, 0xc1, 0xb5, 0x8c, 0x54, 0xb8, 0xd1, 0x50, 0x82, 0xa5, 0xa0, 0xcf, 0x23, 0xdc, 0x3b, 0xeb, - 0x35, 0x74, 0x28, 0x61, 0x23, 0xcb, 0x70, 0x09, 0x9a, 0x31, 0x9d, 0x5e, 0xe8, 0x85, 0xea, 0xde, - 0xbb, 0xf5, 0xb4, 0xfa, 0xe5, 0xa2, 0xa2, 0xbf, 0xa9, 0x40, 0x9f, 0xb2, 0xe7, 0xa7, 0x59, 0xa8, - 0x34, 0x61, 0x71, 0x7a, 0xb7, 0x02, 0xf5, 0x18, 0x93, 0x5c, 0xf5, 0x37, 0x3d, 0xf5, 0x37, 0x9b, - 0x32, 0xd8, 0x12, 0x63, 0x4e, 0x18, 0x64, 0x95, 0x13, 0x4f, 0x92, 0x45, 0xe7, 0x60, 0x08, 0xc7, - 0xaf, 0x8a, 0x9c, 0xd8, 0x99, 0x26, 0xe6, 0x1c, 0x4c, 0xf5, 0x18, 0x83, 0x3a, 0xe9, 0x9b, 0x62, - 0x0b, 0xb5, 0x75, 0xf6, 0x94, 0xf8, 0xe1, 0x24, 0x37, 0x1e, 0x6d, 0x3a, 0xfe, 0x9c, 0x04, 0xc2, - 0xda, 0x80, 0x8b, 0x4f, 0x4e, 0x52, 0x11, 0x87, 0x0e, 0x29, 0xe5, 0x3a, 0x4a, 0x1c, 0x25, 0xbb, - 0x66, 0xa6, 0x4a, 0x69, 0xa6, 0x0b, 0xd0, 0x28, 0x5f, 0x18, 0x50, 0x1d, 0xeb, 0x36, 0x74, 0xc7, - 0x7e, 0x20, 0x74, 0xc1, 0x10, 0x97, 0xa6, 0x4b, 0x87, 0x15, 0x3a, 0x32, 0xd7, 0x3d, 0xeb, 0xcf, - 0x6a, 0xd0, 0x33, 0x7f, 0x45, 0x47, 0xa4, 0xf7, 0xca, 0xbc, 0xe9, 0xae, 0x0f, 0xcd, 0x47, 0x22, - 0xc9, 0x46, 0x9a, 0xc6, 0x26, 0x71, 0x52, 0x3c, 0xbb, 0x06, 0x1d, 0xfa, 0x97, 0xc4, 0x7f, 0x23, - 0x88, 0x71, 0x35, 0xde, 0x46, 0x00, 0x9d, 0x75, 0x6d, 0xc0, 0x72, 0x69, 0x09, 0x76, 0x2a, 0x53, - 0x27, 0xd0, 0xbc, 0x2b, 0x9d, 0x1e, 0x94, 0x48, 0xf8, 0x12, 0x76, 0x54, 0x45, 0xf3, 0x00, 0xa9, - 0x71, 0x4f, 0xf2, 0x14, 0xf8, 0xcc, 0x9e, 0x20, 0x86, 0xea, 0xa2, 0xb1, 0x40, 0x15, 0x4f, 0x5e, - 0x06, 0x9a, 0xc3, 0x1d, 0x05, 0xd9, 0x7f, 0x19, 0xe4, 0x0b, 0x24, 0x01, 0x6a, 0xd2, 0x76, 0xd3, - 0x02, 0x49, 0xf4, 0xef, 0x43, 0x57, 0xc6, 0xfe, 0xc4, 0x0f, 0x55, 0x9e, 0xdd, 0x5a, 0xf0, 0x27, - 0xa0, 0x08, 0x28, 0xeb, 0xb6, 0xa0, 0xa9, 0x84, 0x72, 0x41, 0xad, 0x54, 0x63, 0xd8, 0x1d, 0x58, - 0x4a, 0xd2, 0xd8, 0x77, 0x53, 0x5c, 0x8e, 0x3d, 0x95, 0x9e, 0x39, 0xa7, 0xee, 0x2b, 0xf0, 0xfe, - 0xcb, 0x80, 0x6a, 0x43, 0x77, 0x60, 0xc9, 0x95, 0x41, 0x36, 0x0d, 0x69, 0x65, 0x76, 0x20, 0x42, - 0xb2, 0xc6, 0x0d, 0xde, 0x57, 0x60, 0x5c, 0xdf, 0x8e, 0x08, 0x2d, 0x17, 0x60, 0x3f, 0x8d, 0x85, - 0x33, 0xa5, 0xcd, 0xf9, 0x00, 0x5a, 0xe9, 0x61, 0x40, 0x95, 0xe7, 0xca, 0xc2, 0xca, 0x73, 0x33, - 0x3d, 0xc4, 0x65, 0x97, 0xb6, 0xbb, 0x4a, 0x15, 0x60, 0xdd, 0x43, 0x59, 0x09, 0xfc, 0xa9, 0x9f, - 0xea, 0x1b, 0x1e, 0xaa, 0x63, 0x1d, 0x42, 0x87, 0x66, 0xa0, 0xff, 0xc8, 0xcf, 0x5a, 0x2b, 0xef, - 0x3e, 0x6b, 0xbd, 0x0f, 0x3d, 0xad, 0xa2, 0x6f, 0x3b, 0xbc, 0xed, 0x2a, 0x3c, 0xb6, 0x13, 0xeb, - 0x1e, 0x74, 0x7e, 0x1b, 0xb3, 0x79, 0xfa, 0x8f, 0x1b, 0xd0, 0xa5, 0xc3, 0x0c, 0xfb, 0x30, 0x90, - 0xee, 0xb1, 0x29, 0xb2, 0x13, 0xe8, 0x31, 0x42, 0x2c, 0x80, 0xf6, 0x8b, 0xd0, 0x97, 0xe1, 0x46, - 0x10, 0x58, 0x7f, 0xd8, 0x80, 0x0e, 0x26, 0xd4, 0xa4, 0xd1, 0x98, 0x1f, 0xd3, 0x49, 0x32, 0x25, - 0xc0, 0x53, 0x27, 0xd2, 0xa7, 0xc9, 0x5d, 0x04, 0x22, 0xd5, 0xae, 0x13, 0xcd, 0xe5, 0xc7, 0xd5, - 0xb9, 0xfc, 0xf8, 0xa6, 0xba, 0xd8, 0xa3, 0x8e, 0x53, 0x84, 0x39, 0x9e, 0xa4, 0x09, 0x1e, 0x2b, - 0x10, 0xbb, 0x07, 0x8c, 0x48, 0x9c, 0x20, 0x90, 0xe4, 0x79, 0x13, 0x11, 0x24, 0x3a, 0x95, 0x1e, - 0x22, 0x66, 0x43, 0x23, 0xf6, 0x85, 0x12, 0xc1, 0x92, 0x19, 0x6f, 0xcc, 0x9b, 0xf1, 0xbb, 0x00, - 0x18, 0xa0, 0x50, 0x85, 0x2d, 0xd1, 0xb5, 0x97, 0x99, 0x3c, 0xb6, 0xc0, 0x7e, 0x8e, 0xa0, 0xe1, - 0x03, 0x18, 0xe6, 0x14, 0xb1, 0x18, 0xdb, 0x6e, 0x98, 0xea, 0xc8, 0xa1, 0xaf, 0xa9, 0xb8, 0x18, - 0x6f, 0x86, 0xe9, 0x7c, 0x74, 0xd1, 0x39, 0x13, 0x5d, 0x7c, 0x1f, 0xce, 0xcf, 0xd9, 0xda, 0x24, - 0x12, 0xae, 0x3e, 0xb0, 0xfc, 0x22, 0x77, 0x64, 0xae, 0x40, 0x9b, 0xca, 0xd6, 0x5e, 0x16, 0xe9, - 0xe2, 0x7d, 0xcb, 0x4f, 0x28, 0x0a, 0x7c, 0x5b, 0x04, 0xd3, 0xfb, 0xdf, 0x8a, 0x60, 0xfa, 0x9f, - 0x2f, 0x82, 0x19, 0x7c, 0xbe, 0x08, 0x66, 0xce, 0xe3, 0x2f, 0xcd, 0x7b, 0xfc, 0x17, 0x00, 0x64, - 0x86, 0xc9, 0x27, 0xbd, 0x8d, 0x7f, 0x95, 0x2f, 0xca, 0x3f, 0xeb, 0xbf, 0x2a, 0x00, 0xfb, 0xce, - 0x34, 0x52, 0x1e, 0x8a, 0x7d, 0x0f, 0xba, 0x09, 0xf5, 0xca, 0xa9, 0xfb, 0x8d, 0xd2, 0x95, 0xba, - 0x9c, 0x54, 0x37, 0x29, 0x8d, 0x87, 0x24, 0x6f, 0xd3, 0xd6, 0xab, 0x19, 0xf2, 0x93, 0x8f, 0x86, - 0x21, 0xa0, 0x82, 0xf3, 0x6d, 0x18, 0x68, 0x82, 0x48, 0xc4, 0xae, 0x08, 0x95, 0x3d, 0xa8, 0xf0, - 0xbe, 0x82, 0xee, 0x29, 0x20, 0xfb, 0x28, 0x27, 0x53, 0x46, 0x29, 0x59, 0x10, 0x64, 0xeb, 0x21, - 0x9b, 0x8a, 0xc0, 0x5a, 0x37, 0x9f, 0x42, 0x0b, 0x69, 0x43, 0x1d, 0xff, 0x6f, 0x78, 0x8e, 0x75, - 0xa1, 0xa5, 0x67, 0x1d, 0x56, 0x58, 0x1f, 0x3a, 0x74, 0x57, 0x87, 0x70, 0x55, 0xeb, 0xa7, 0xcb, - 0xd0, 0xdd, 0x0e, 0x93, 0x34, 0xce, 0xd4, 0x36, 0x17, 0x57, 0x52, 0x1a, 0x74, 0x25, 0x45, 0x1f, - 0xa2, 0xa9, 0xcf, 0xa0, 0x43, 0xb4, 0xfb, 0xd0, 0xd2, 0x97, 0x9f, 0x74, 0xd8, 0xb2, 0xf0, 0xe6, - 0x94, 0xa1, 0x61, 0x6b, 0xd0, 0xf6, 0xf4, 0xad, 0x2c, 0x5d, 0x9f, 0x28, 0x5d, 0x95, 0x32, 0xf7, - 0xb5, 0x78, 0x4e, 0xc3, 0x6e, 0x42, 0xcd, 0x99, 0x4c, 0x48, 0x93, 0xa9, 0xb2, 0x6e, 0x48, 0xe9, - 0x2e, 0x0b, 0x47, 0x1c, 0x7b, 0x00, 0x1d, 0x32, 0x31, 0x54, 0xa2, 0x6b, 0xce, 0xcf, 0x69, 0xea, - 0x7f, 0xca, 0xea, 0x50, 0xc4, 0xf3, 0x00, 0x3a, 0x81, 0x94, 0x91, 0x1a, 0xd0, 0x9a, 0x1f, 0x60, - 0xaa, 0x36, 0xbc, 0x1d, 0x98, 0xfa, 0xcd, 0x1d, 0x68, 0xa2, 0xd7, 0x94, 0x91, 0xf6, 0x36, 0xa5, - 0x75, 0x50, 0xb9, 0x83, 0x37, 0x12, 0xfc, 0x61, 0xeb, 0x00, 0x4a, 0xdc, 0x69, 0xe6, 0xce, 0x3c, - 0x3b, 0xf2, 0x6c, 0x0c, 0x05, 0xd9, 0x24, 0x66, 0x8f, 0x61, 0xa8, 0x22, 0xef, 0xd2, 0x48, 0x30, - 0x87, 0x46, 0x66, 0xe4, 0x6c, 0x32, 0xc7, 0x07, 0xf1, 0x6c, 0x72, 0xf7, 0x21, 0xb4, 0x22, 0x15, - 0x7a, 0x92, 0x16, 0x76, 0xd7, 0x97, 0x8b, 0xa1, 0x3a, 0x26, 0xe5, 0x86, 0x82, 0x7d, 0x07, 0x06, - 0xea, 0x70, 0x63, 0xac, 0x63, 0x30, 0xaa, 0x88, 0xcd, 0x5c, 0xba, 0x99, 0x09, 0xd1, 0x78, 0x3f, - 0x9d, 0x89, 0xd8, 0xbe, 0x05, 0x7d, 0xa1, 0xa3, 0x14, 0x3b, 0x71, 0x9d, 0x90, 0x74, 0xb3, 0xbb, - 0x7e, 0xa9, 0x18, 0x5e, 0x0e, 0x62, 0x78, 0x4f, 0x94, 0x43, 0x9a, 0x55, 0x68, 0xea, 0x03, 0xb7, - 0x21, 0x8d, 0x2a, 0x5d, 0x3d, 0x55, 0xd5, 0x5b, 0xae, 0xf1, 0xc8, 0x97, 0x19, 0x73, 0x75, 0x2c, - 0x4e, 0x47, 0xcb, 0xf3, 0x7c, 0x99, 0x2d, 0x96, 0xcf, 0x54, 0xdc, 0x7f, 0x24, 0x4e, 0x71, 0x3f, - 0x8a, 0xf3, 0x88, 0x11, 0x9b, 0xdf, 0x8f, 0xfc, 0x30, 0x82, 0x77, 0xf2, 0x73, 0x08, 0xf6, 0x64, - 0xf6, 0x7c, 0x44, 0x95, 0x98, 0xcf, 0xd3, 0xd0, 0x2b, 0x0b, 0x86, 0xaa, 0x4a, 0x33, 0x5f, 0x8a, - 0xe6, 0x8e, 0x59, 0xee, 0x41, 0x5b, 0xc6, 0x1e, 0x1d, 0xd0, 0x8e, 0x2e, 0x90, 0xa6, 0x2e, 0xeb, - 0x63, 0x21, 0x75, 0x6b, 0x8c, 0x0c, 0x50, 0x4b, 0xaa, 0x0e, 0x3a, 0xf0, 0x28, 0x96, 0x9f, 0x09, - 0x37, 0x55, 0xd1, 0xd1, 0xc5, 0xb3, 0x0e, 0x5c, 0xe3, 0x29, 0x58, 0xba, 0x05, 0x2d, 0x73, 0x14, - 0x79, 0xe9, 0x0c, 0xa5, 0x41, 0xb1, 0x8f, 0x61, 0x69, 0xd6, 0x28, 0x26, 0xa3, 0xcb, 0x67, 0xa8, - 0x07, 0x33, 0x36, 0x10, 0xbd, 0x9e, 0x8e, 0x4a, 0x46, 0x67, 0x8f, 0x00, 0x08, 0x81, 0xa1, 0x97, - 0x8e, 0x67, 0xae, 0x9c, 0x0d, 0xbd, 0x74, 0x6c, 0x33, 0x82, 0x96, 0x9f, 0x3c, 0xf5, 0xe3, 0x24, - 0x1d, 0x5d, 0x35, 0x5e, 0x88, 0xba, 0x18, 0x0d, 0xf9, 0xc9, 0x8e, 0x93, 0xa4, 0xa3, 0x6b, 0xe6, - 0x9e, 0x21, 0xf6, 0xd8, 0x5d, 0x68, 0xea, 0x63, 0xda, 0x95, 0x33, 0x56, 0x41, 0x5f, 0x6d, 0xe0, - 0x9a, 0x82, 0x7d, 0x15, 0x5a, 0x74, 0x46, 0x27, 0xa3, 0xd1, 0xcd, 0x79, 0x29, 0x52, 0x07, 0x65, - 0xbc, 0x19, 0xa8, 0x03, 0xb3, 0x0f, 0xa1, 0x65, 0x82, 0x01, 0x6b, 0x5e, 0x33, 0x74, 0x50, 0xc0, - 0x0d, 0x05, 0xbb, 0x0d, 0x8d, 0x29, 0xda, 0xc2, 0xd1, 0x57, 0xe6, 0xb5, 0x5c, 0x99, 0x48, 0x85, - 0x65, 0x8f, 0xa0, 0x9b, 0x50, 0x1c, 0xa8, 0xc4, 0xff, 0x96, 0x39, 0xdf, 0x2a, 0xee, 0x59, 0x9b, - 0x20, 0x91, 0x43, 0x52, 0x04, 0x8c, 0xbf, 0x0b, 0x57, 0xcb, 0x87, 0x63, 0xe6, 0xe4, 0x4c, 0xdf, - 0x30, 0xbe, 0x4d, 0xb3, 0xdc, 0x5c, 0x20, 0x61, 0xb3, 0x67, 0x6c, 0xfc, 0x72, 0xf4, 0x96, 0xc3, - 0xb7, 0x47, 0xb9, 0xa7, 0x41, 0xc5, 0x1e, 0xdd, 0x39, 0xb3, 0xac, 0xdc, 0x57, 0x19, 0xff, 0x43, - 0x2e, 0xee, 0x13, 0xe8, 0x8d, 0xb3, 0x37, 0x6f, 0x4e, 0xb5, 0x8c, 0x8c, 0x3e, 0xa0, 0x71, 0xa5, - 0xa4, 0xa0, 0x74, 0xd4, 0xc3, 0xbb, 0xe3, 0xd2, 0xb9, 0xcf, 0x65, 0x68, 0xb9, 0xa1, 0xed, 0x78, - 0x5e, 0x3c, 0x5a, 0x55, 0x47, 0x3d, 0x6e, 0xb8, 0xe1, 0x79, 0x74, 0x66, 0x26, 0x23, 0x41, 0x57, - 0x1f, 0x6d, 0xdf, 0x1b, 0x7d, 0x55, 0xf9, 0x3c, 0x03, 0xda, 0xf6, 0xe8, 0x0a, 0xb6, 0x13, 0x3b, - 0x41, 0x20, 0xd0, 0xbb, 0x8f, 0xee, 0xea, 0x2b, 0xd8, 0x1a, 0xb4, 0xed, 0x61, 0x5c, 0x38, 0x75, - 0x4e, 0x6c, 0x03, 0x19, 0x7d, 0xa8, 0x6e, 0xac, 0x4e, 0x9d, 0x93, 0x3d, 0x0d, 0x42, 0xdd, 0x56, - 0xb7, 0x71, 0xc8, 0x62, 0xde, 0x9b, 0xd7, 0xed, 0x3c, 0xbf, 0xe5, 0x1d, 0x3f, 0x4f, 0x75, 0xc9, - 0x1e, 0x90, 0x15, 0xb4, 0x83, 0xf5, 0xd1, 0xfd, 0xb3, 0xf6, 0x40, 0xa7, 0xef, 0x68, 0x0f, 0x4c, - 0x26, 0xbf, 0x0e, 0xa0, 0xcc, 0x25, 0x6d, 0xf6, 0xda, 0xfc, 0x98, 0x3c, 0x58, 0xe7, 0xea, 0x2a, - 0x0a, 0x6d, 0xf5, 0x3a, 0x00, 0x1d, 0x97, 0xa9, 0x31, 0x0f, 0xe6, 0xc7, 0xe4, 0xc1, 0x37, 0xef, - 0xbc, 0xca, 0xe3, 0xf0, 0x07, 0xd0, 0xc9, 0x30, 0xcc, 0xc6, 0x40, 0x77, 0xf4, 0x70, 0x5e, 0x07, - 0x4c, 0x04, 0xce, 0xdb, 0x99, 0x6e, 0xe1, 0x9f, 0x90, 0xdb, 0xa3, 0x08, 0x68, 0xf4, 0xd1, 0xfc, - 0x9f, 0xe4, 0x61, 0x3a, 0x27, 0xef, 0xa8, 0x22, 0xf6, 0x47, 0xd0, 0x55, 0x4c, 0x53, 0x83, 0xd6, - 0xe7, 0x65, 0xa4, 0x08, 0xa9, 0xb8, 0xe2, 0xae, 0x1a, 0x76, 0x1b, 0x1a, 0x4e, 0x14, 0x05, 0xa7, - 0xa3, 0x8f, 0xe7, 0x15, 0x63, 0x03, 0xc1, 0x5c, 0x61, 0x51, 0x94, 0xa6, 0x59, 0x90, 0xfa, 0xe6, - 0xf6, 0xc8, 0xd7, 0xe6, 0x45, 0xa9, 0x74, 0xb9, 0x8e, 0x77, 0xa7, 0xa5, 0x9b, 0x76, 0xf7, 0xa0, - 0x1d, 0xc9, 0x24, 0xb5, 0xbd, 0x69, 0x30, 0x7a, 0x74, 0xc6, 0x83, 0xa9, 0x5b, 0x13, 0xbc, 0x15, - 0xa9, 0x86, 0xf5, 0x08, 0x7a, 0x1b, 0xf4, 0x7a, 0xc0, 0x4f, 0xc8, 0x1c, 0xde, 0x86, 0x7a, 0x5e, - 0x68, 0xc9, 0xed, 0x2c, 0x51, 0xbc, 0x11, 0xdb, 0xe1, 0x58, 0x72, 0x42, 0x5b, 0x7f, 0x59, 0x87, - 0xe6, 0xbe, 0xcc, 0x62, 0x57, 0xfc, 0xea, 0x9b, 0x45, 0xef, 0x9b, 0x5d, 0x0f, 0x8b, 0x93, 0x4c, - 0xb5, 0xc1, 0x84, 0x9e, 0x3f, 0x83, 0xe9, 0x14, 0x35, 0x9c, 0x0b, 0xd0, 0x50, 0x99, 0x94, 0xba, - 0x91, 0xa2, 0x3a, 0x24, 0xf1, 0x59, 0x72, 0xe4, 0xc9, 0xd7, 0x21, 0x4a, 0x7c, 0x83, 0x2e, 0x74, - 0x80, 0x01, 0x6d, 0x7b, 0x74, 0xc9, 0xd1, 0x10, 0x90, 0x4a, 0x35, 0x55, 0x38, 0x6d, 0x80, 0xa4, - 0x58, 0xa6, 0x3e, 0xd4, 0x7a, 0x4b, 0x7d, 0xe8, 0x3a, 0xd4, 0x43, 0x73, 0x13, 0x22, 0xc7, 0xd3, - 0xdd, 0x73, 0x82, 0xb3, 0xbb, 0x90, 0x5f, 0x87, 0xd2, 0xd1, 0xc9, 0xdb, 0xaf, 0x4b, 0xad, 0x43, - 0x27, 0x7f, 0x6f, 0xa2, 0x03, 0x92, 0x0b, 0x6b, 0xc5, 0x0b, 0x94, 0x03, 0xd3, 0xe2, 0x05, 0xd9, - 0x82, 0x92, 0x91, 0xaa, 0x5c, 0x13, 0x9f, 0xba, 0x5f, 0xa4, 0x64, 0x44, 0xe5, 0x6c, 0x53, 0x2e, - 0xf3, 0x13, 0xdb, 0x95, 0x61, 0x92, 0xea, 0xfb, 0x6a, 0x2d, 0x3f, 0xd9, 0xc4, 0x2e, 0xfb, 0x26, - 0xf4, 0x63, 0xe1, 0xbe, 0xb2, 0xa7, 0xc9, 0x44, 0xfd, 0x45, 0xbf, 0x7c, 0xc1, 0x72, 0x9a, 0x4c, - 0x7e, 0x20, 0x1c, 0xf4, 0xaf, 0x2a, 0xc1, 0xe8, 0x22, 0xed, 0x6e, 0x32, 0xa1, 0x59, 0x6f, 0x42, - 0xef, 0x30, 0x90, 0x72, 0x6a, 0xac, 0xde, 0x80, 0x8a, 0x44, 0x5d, 0x82, 0xa9, 0x15, 0x58, 0x7f, - 0x54, 0x81, 0x36, 0xf2, 0x0e, 0x25, 0x88, 0x31, 0xa8, 0x4f, 0xdd, 0x28, 0xd3, 0x91, 0x30, 0xb5, - 0xf5, 0xcb, 0x15, 0x25, 0x1b, 0xfa, 0xe5, 0x0a, 0xed, 0x5c, 0x4d, 0x15, 0x84, 0xb0, 0xad, 0x6e, - 0xb9, 0x9f, 0x06, 0xd2, 0xf1, 0xb4, 0x3c, 0x98, 0x2e, 0xbb, 0x08, 0x4d, 0x37, 0xa4, 0x94, 0x51, - 0xdd, 0x8a, 0x69, 0xb8, 0x21, 0xa6, 0x8a, 0x0a, 0x5c, 0x9c, 0xf3, 0x36, 0xdc, 0x10, 0xd3, 0x9d, - 0xbf, 0xaa, 0xc0, 0xf2, 0x5e, 0x2c, 0x5d, 0x91, 0x24, 0x3b, 0xe8, 0x85, 0x1d, 0x0a, 0xc5, 0x18, - 0xd4, 0xa9, 0xda, 0xa3, 0xae, 0x8c, 0x53, 0x1b, 0x25, 0x57, 0xe5, 0xf3, 0x79, 0xbe, 0x51, 0xe3, - 0x1d, 0x82, 0x50, 0xba, 0x91, 0xa3, 0x69, 0x60, 0xad, 0x84, 0xa6, 0x3a, 0xd1, 0x6d, 0x18, 0x14, - 0x57, 0x54, 0x68, 0x06, 0xfd, 0xb2, 0x24, 0x87, 0xd2, 0x2c, 0x37, 0xa0, 0x1b, 0x13, 0x6f, 0xd5, - 0x34, 0x0d, 0xa2, 0x01, 0x05, 0xc2, 0x79, 0xac, 0x23, 0x18, 0xee, 0xc5, 0x22, 0x72, 0x62, 0x81, - 0x06, 0x7b, 0x4a, 0x3c, 0xbc, 0x04, 0xcd, 0x40, 0x84, 0x93, 0xf4, 0x48, 0xaf, 0x57, 0xf7, 0xf2, - 0x57, 0x45, 0xd5, 0xd2, 0xab, 0x22, 0xe4, 0x65, 0x2c, 0x1c, 0xfd, 0xf8, 0x88, 0xda, 0xa8, 0x59, - 0x61, 0x16, 0xe8, 0x0a, 0x54, 0x9b, 0xab, 0x8e, 0xf5, 0xb3, 0x1a, 0x74, 0x35, 0x67, 0xe8, 0x5f, - 0xd4, 0xae, 0x54, 0xf2, 0x5d, 0x19, 0x42, 0x2d, 0x79, 0x19, 0xe8, 0x6d, 0xc2, 0x26, 0xfb, 0x18, - 0x6a, 0x81, 0x3f, 0xd5, 0xd9, 0xca, 0xb5, 0x19, 0xf3, 0x3f, 0xcb, 0x5f, 0x2d, 0x38, 0x48, 0xcd, - 0xae, 0x91, 0x79, 0x3e, 0xb1, 0x51, 0x44, 0x35, 0x4f, 0xd0, 0x14, 0x9f, 0xa0, 0x1e, 0x20, 0x53, - 0x1d, 0x97, 0x2e, 0xa1, 0x18, 0xe5, 0xee, 0xf3, 0x8e, 0x86, 0x6c, 0x7b, 0xec, 0x6b, 0xd0, 0x4e, - 0x42, 0x27, 0x4a, 0x8e, 0x64, 0x9a, 0xe7, 0x27, 0xe9, 0x49, 0xb8, 0xb6, 0xf9, 0xec, 0xe0, 0x24, - 0xdc, 0xd7, 0x18, 0xfd, 0x67, 0x39, 0x25, 0xfb, 0x0e, 0xf4, 0x12, 0x91, 0x24, 0xea, 0xda, 0xe9, - 0x58, 0x6a, 0xa5, 0xbf, 0x58, 0x4e, 0x3d, 0x08, 0x8b, 0x5f, 0x6d, 0x44, 0x3c, 0x29, 0x40, 0xec, - 0x07, 0x30, 0x30, 0xe3, 0x03, 0x39, 0x99, 0xe4, 0xa5, 0xb2, 0x6b, 0x67, 0x66, 0xd8, 0x21, 0x74, - 0x69, 0x9e, 0x7e, 0x52, 0x46, 0xb0, 0xef, 0xc3, 0x20, 0x52, 0x9b, 0x69, 0xeb, 0x9a, 0xaa, 0x32, - 0x1e, 0x57, 0x67, 0xa2, 0x95, 0x99, 0xcd, 0x2e, 0xae, 0x92, 0x15, 0xf0, 0xc4, 0xfa, 0x8f, 0x0a, - 0x74, 0x4b, 0xab, 0xa6, 0xb7, 0x5e, 0x89, 0x88, 0x4d, 0x09, 0x15, 0xdb, 0x08, 0x3b, 0x92, 0xfa, - 0xd1, 0x43, 0x87, 0x53, 0x1b, 0x61, 0xb1, 0xd4, 0x65, 0xf9, 0x0e, 0xa7, 0x36, 0x1a, 0x4c, 0x9d, - 0x53, 0xaa, 0x6b, 0xe1, 0xb4, 0x29, 0x75, 0xde, 0x2b, 0x80, 0xdb, 0x1e, 0x3d, 0x0a, 0x73, 0x52, - 0xe7, 0xd0, 0x49, 0x4c, 0xc5, 0x37, 0xef, 0xa3, 0x6a, 0xbe, 0x12, 0x31, 0xae, 0x45, 0xdb, 0x5a, - 0xd3, 0xc5, 0xbd, 0x26, 0x1b, 0xf6, 0x46, 0x86, 0xea, 0x36, 0x4d, 0x8f, 0xb7, 0x11, 0xf0, 0x63, - 0x19, 0xd2, 0x30, 0xbd, 0xb3, 0xc4, 0xcf, 0x0e, 0x37, 0x5d, 0xb4, 0x54, 0x2f, 0x33, 0x81, 0x11, - 0x9d, 0x47, 0xd7, 0x29, 0x3a, 0xbc, 0x45, 0xfd, 0x6d, 0xcf, 0xfa, 0xe7, 0x0a, 0x2c, 0x9f, 0x61, - 0x36, 0x06, 0x50, 0xc8, 0x68, 0x73, 0xc3, 0xaf, 0xc7, 0x9b, 0xd8, 0xdd, 0xf6, 0x08, 0x91, 0x4e, - 0x49, 0x98, 0xaa, 0x1a, 0x91, 0x4e, 0x51, 0x92, 0x2e, 0x42, 0x33, 0x3d, 0xa1, 0xaf, 0x55, 0x8a, - 0xd1, 0x48, 0x4f, 0xf0, 0x33, 0x37, 0x30, 0xa1, 0x9d, 0xd8, 0x81, 0x78, 0x25, 0x02, 0xe2, 0xc3, - 0x60, 0xfd, 0xd6, 0x3b, 0x76, 0x79, 0x6d, 0x47, 0x4e, 0x76, 0x90, 0x16, 0x53, 0x5c, 0xd5, 0xb2, - 0x7e, 0x08, 0x6d, 0x03, 0x65, 0x1d, 0x68, 0x6c, 0x89, 0xc3, 0x6c, 0x32, 0x3c, 0xc7, 0xda, 0x50, - 0xc7, 0x11, 0xc3, 0x0a, 0xb6, 0x3e, 0x75, 0xe2, 0x70, 0x58, 0x45, 0xf4, 0x93, 0x38, 0x96, 0xf1, - 0xb0, 0x86, 0xcd, 0x3d, 0x27, 0xf4, 0xdd, 0x61, 0x1d, 0x9b, 0x4f, 0x9d, 0xd4, 0x09, 0x86, 0x0d, - 0xeb, 0xaf, 0x1b, 0xd0, 0xde, 0xd3, 0xff, 0xce, 0xb6, 0xa0, 0x9f, 0x3f, 0xb7, 0x5b, 0x5c, 0x44, - 0xd9, 0x9b, 0x6f, 0x50, 0x11, 0xa5, 0x17, 0x95, 0x7a, 0xf3, 0x8f, 0xf6, 0xaa, 0x67, 0x1e, 0xed, - 0xbd, 0x07, 0xb5, 0x97, 0xf1, 0xe9, 0xec, 0xc9, 0xc9, 0x5e, 0xe0, 0x84, 0x1c, 0xc1, 0xec, 0x23, - 0xe8, 0xe2, 0xbe, 0xdb, 0x09, 0xb9, 0x7f, 0x5d, 0x78, 0x28, 0x3f, 0x8d, 0x24, 0x38, 0x07, 0x24, - 0xd2, 0x21, 0xc2, 0x1a, 0xb4, 0xdd, 0x23, 0x3f, 0xf0, 0x62, 0x11, 0xea, 0x53, 0x49, 0x76, 0x76, - 0xc9, 0x3c, 0xa7, 0x61, 0xdf, 0xa3, 0x1b, 0x69, 0xa6, 0x70, 0x52, 0x14, 0xb9, 0x67, 0x54, 0xb6, - 0x54, 0x5a, 0xe1, 0x4b, 0x25, 0x72, 0xf2, 0x49, 0xc5, 0xd5, 0xeb, 0x56, 0xf9, 0xea, 0xb5, 0x7a, - 0x9a, 0x45, 0x2e, 0xa4, 0x9d, 0xa7, 0x4c, 0xe8, 0x41, 0xee, 0x68, 0x6f, 0xdf, 0x99, 0x0f, 0x16, - 0x8d, 0xd7, 0xd2, 0x5e, 0xff, 0x16, 0x0c, 0x30, 0x8a, 0xb0, 0x55, 0xf0, 0x81, 0xa6, 0x04, 0xf4, - 0x03, 0x8a, 0x2c, 0x39, 0xda, 0xc2, 0xf0, 0x03, 0x85, 0xf1, 0x36, 0x0c, 0xcc, 0xb7, 0xe8, 0xfb, - 0x74, 0x5d, 0x5d, 0x04, 0xd7, 0x50, 0x75, 0x9d, 0x6e, 0x0d, 0xce, 0xbb, 0x47, 0x4e, 0x18, 0x8a, - 0xc0, 0x3e, 0xcc, 0xc6, 0x63, 0xe3, 0x01, 0x7a, 0x74, 0x74, 0xb4, 0xac, 0x51, 0x8f, 0x09, 0x43, - 0x0e, 0xc5, 0x82, 0x7e, 0xe8, 0x07, 0xaa, 0xc0, 0x4b, 0xde, 0xae, 0x4f, 0x94, 0xdd, 0xd0, 0x0f, - 0xa8, 0xc2, 0x8b, 0x3e, 0xef, 0xbb, 0x30, 0xcc, 0x32, 0xdf, 0x4b, 0xec, 0x54, 0x9a, 0x57, 0x6d, - 0xba, 0x4c, 0x58, 0x2a, 0x2a, 0xbc, 0xc8, 0x7c, 0xef, 0x40, 0xea, 0x77, 0x6d, 0x7d, 0xa2, 0x37, - 0x5d, 0xeb, 0xbb, 0xd0, 0x2b, 0xcb, 0x0e, 0xca, 0x22, 0x65, 0x6c, 0xc3, 0x73, 0x0c, 0xa0, 0xf9, - 0x4c, 0xc6, 0x53, 0x27, 0x18, 0x56, 0xb0, 0xad, 0x1e, 0x24, 0x0c, 0xab, 0xac, 0x07, 0x6d, 0x93, - 0x4a, 0x0c, 0x6b, 0xd6, 0xb7, 0xa0, 0x6d, 0x9e, 0xe9, 0xd1, 0xfb, 0x28, 0xe9, 0x09, 0x15, 0x85, - 0x29, 0xcb, 0xd4, 0x46, 0x00, 0x45, 0x60, 0xe6, 0x75, 0x6a, 0xb5, 0x78, 0x9d, 0x6a, 0xfd, 0x16, - 0xf4, 0xca, 0x8b, 0x33, 0x35, 0xb2, 0x4a, 0x51, 0x23, 0x5b, 0x30, 0x8a, 0x4e, 0x43, 0x62, 0x39, - 0xb5, 0x4b, 0x21, 0x43, 0x1b, 0x01, 0xf8, 0x37, 0xd6, 0x1f, 0x54, 0xa0, 0x41, 0xa1, 0x35, 0xb9, - 0x16, 0x6c, 0x14, 0xba, 0xd3, 0xe0, 0x1d, 0x82, 0xfc, 0x0f, 0xee, 0x09, 0xe5, 0xe7, 0x0a, 0xf5, - 0x77, 0x9e, 0x2b, 0xdc, 0x7d, 0x09, 0x4d, 0xf5, 0x20, 0x98, 0x2d, 0x43, 0xff, 0x45, 0x78, 0x1c, - 0xca, 0xd7, 0xa1, 0x02, 0x0c, 0xcf, 0xb1, 0xf3, 0xb0, 0x64, 0x98, 0xae, 0x5f, 0x1e, 0x0f, 0x2b, - 0x6c, 0x08, 0x3d, 0xda, 0x56, 0x03, 0xa9, 0xb2, 0xf7, 0x60, 0xa4, 0x9d, 0xc3, 0x96, 0x0c, 0xc5, - 0x33, 0x99, 0xfa, 0xe3, 0x53, 0x83, 0xad, 0xb1, 0x25, 0xe8, 0xee, 0xa7, 0x32, 0xda, 0x17, 0xa1, - 0xe7, 0x87, 0x93, 0x61, 0xfd, 0xee, 0x53, 0x68, 0xaa, 0x77, 0xca, 0xa5, 0xbf, 0x54, 0x80, 0xe1, - 0x39, 0xa4, 0xfe, 0xd4, 0xf1, 0x53, 0x3f, 0x9c, 0x3c, 0x13, 0x27, 0xa9, 0x32, 0x4a, 0x3b, 0x4e, - 0x92, 0x0e, 0xab, 0x6c, 0x00, 0xa0, 0x67, 0x7d, 0x12, 0x7a, 0xc3, 0xda, 0xe3, 0xcd, 0x9f, 0xff, - 0xe2, 0x7a, 0xe5, 0xef, 0x7e, 0x71, 0xbd, 0xf2, 0x8f, 0xbf, 0xb8, 0x7e, 0xee, 0x27, 0xff, 0x74, - 0xbd, 0xf2, 0xe3, 0x8f, 0x4a, 0xaf, 0xb0, 0xa7, 0x4e, 0x1a, 0xfb, 0x27, 0xea, 0x3c, 0xc9, 0x74, - 0x42, 0xf1, 0x20, 0x3a, 0x9e, 0x3c, 0x88, 0x0e, 0x1f, 0x18, 0x99, 0x3b, 0x6c, 0xd2, 0xe3, 0xea, - 0x8f, 0xff, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x4a, 0x72, 0x8d, 0xc3, 0xdb, 0x3d, 0x00, 0x00, + // 5916 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7b, 0xcd, 0x6f, 0x1c, 0xc9, + 0x75, 0xb8, 0xe6, 0x7b, 0xe6, 0xcd, 0x07, 0x87, 0xa5, 0xaf, 0x91, 0xb4, 0x2b, 0x51, 0x6d, 0x49, + 0x4b, 0x6b, 0x25, 0x4a, 0xcb, 0xb5, 0xec, 0xf5, 0xcf, 0x3f, 0x7f, 0x50, 0xa4, 0x64, 0xd3, 0x26, + 0x25, 0xa6, 0x48, 0x65, 0x11, 0x1f, 0xd2, 0x68, 0x76, 0xd7, 0x0c, 0x7b, 0xd9, 0xd3, 0xd5, 0xea, + 0x0f, 0x89, 0xd4, 0x29, 0x40, 0x02, 0x04, 0xc8, 0x3f, 0x10, 0x20, 0x41, 0x00, 0xc3, 0x97, 0xc0, + 0x41, 0x82, 0x1c, 0xf2, 0x17, 0xe4, 0xe6, 0x63, 0x4e, 0x39, 0x06, 0x81, 0x73, 0x0c, 0x90, 0x4b, + 0x3e, 0x60, 0x20, 0x08, 0x10, 0xbc, 0x57, 0x55, 0xdd, 0x3d, 0xc3, 0x91, 0xbc, 0xbb, 0x09, 0x7c, + 0x89, 0x4f, 0x53, 0xf5, 0xde, 0xab, 0x9a, 0xea, 0x57, 0xef, 0xab, 0xde, 0xab, 0x82, 0x41, 0xe4, + 0x47, 0x22, 0xf0, 0x43, 0xb1, 0x16, 0xc5, 0x32, 0x95, 0xac, 0x6d, 0xfa, 0x57, 0xef, 0x4f, 0xfc, + 0xf4, 0x28, 0x3b, 0x5c, 0x73, 0xe5, 0xf4, 0xc1, 0x44, 0x4e, 0xe4, 0x03, 0x22, 0x38, 0xcc, 0xc6, + 0xd4, 0xa3, 0x0e, 0xb5, 0xd4, 0xc0, 0xab, 0x10, 0x48, 0xf7, 0xd8, 0xb4, 0xa3, 0xc0, 0x09, 0x75, + 0x7b, 0x29, 0xf5, 0xa7, 0x22, 0x49, 0x9d, 0x69, 0xa4, 0x01, 0x9d, 0xf4, 0x44, 0xe3, 0xac, 0x3f, + 0xad, 0x42, 0x6b, 0x57, 0x24, 0x89, 0x33, 0x11, 0xcc, 0x82, 0x5a, 0xe2, 0x7b, 0xa3, 0xca, 0x4a, + 0x65, 0x75, 0xb0, 0x3e, 0x5c, 0xcb, 0x97, 0xb5, 0x9f, 0x3a, 0x69, 0x96, 0x70, 0x44, 0x22, 0x8d, + 0x3b, 0xf5, 0x46, 0xd5, 0x79, 0x9a, 0x5d, 0x91, 0x1e, 0x49, 0x8f, 0x23, 0x92, 0x0d, 0xa1, 0x26, + 0xe2, 0x78, 0x54, 0x5b, 0xa9, 0xac, 0xf6, 0x38, 0x36, 0x19, 0x83, 0xba, 0xe7, 0xa4, 0xce, 0xa8, + 0x4e, 0x20, 0x6a, 0xb3, 0x5b, 0x30, 0x88, 0x62, 0xe9, 0xda, 0x7e, 0x38, 0x96, 0x36, 0x61, 0x1b, + 0x84, 0xed, 0x21, 0x74, 0x3b, 0x1c, 0xcb, 0x2d, 0xa4, 0x1a, 0x41, 0xcb, 0x09, 0x9d, 0xe0, 0x34, + 0x11, 0xa3, 0x26, 0xa1, 0x4d, 0x97, 0x0d, 0xa0, 0xea, 0x7b, 0xa3, 0xd6, 0x4a, 0x65, 0xb5, 0xce, + 0xab, 0xbe, 0x87, 0xff, 0x91, 0x65, 0xbe, 0x37, 0x6a, 0xab, 0xff, 0xc0, 0x36, 0xb3, 0xa0, 0x17, + 0x0a, 0xe1, 0x3d, 0x93, 0x29, 0x17, 0x51, 0x70, 0x3a, 0xea, 0xac, 0x54, 0x56, 0xdb, 0x7c, 0x06, + 0xc6, 0xae, 0x42, 0xdb, 0x13, 0x87, 0xd9, 0x64, 0x37, 0x99, 0x8c, 0x60, 0xa5, 0xb2, 0xda, 0xe1, + 0x79, 0xdf, 0x7a, 0x01, 0x9d, 0x4d, 0x19, 0x86, 0xc2, 0x4d, 0x65, 0xcc, 0x6e, 0x40, 0xd7, 0x7c, + 0xae, 0xad, 0xd9, 0xd4, 0xe0, 0x60, 0x40, 0xdb, 0x1e, 0xfb, 0x00, 0x96, 0x5c, 0x43, 0x6d, 0xfb, + 0xa1, 0x27, 0x4e, 0x88, 0x4f, 0x0d, 0x3e, 0xc8, 0xc1, 0xdb, 0x08, 0xb5, 0xfe, 0xa4, 0x06, 0xad, + 0xfd, 0xa3, 0x6c, 0x3c, 0x0e, 0x04, 0xbb, 0x05, 0x7d, 0xdd, 0xdc, 0x94, 0xc1, 0xb6, 0x77, 0xa2, + 0xe7, 0x9d, 0x05, 0xb2, 0x15, 0xe8, 0x6a, 0xc0, 0xc1, 0x69, 0x24, 0xf4, 0xb4, 0x65, 0xd0, 0xec, + 0x3c, 0xbb, 0x7e, 0x48, 0xec, 0xaf, 0xf1, 0x59, 0xe0, 0x1c, 0x95, 0x73, 0x42, 0x3b, 0x32, 0x4b, + 0xe5, 0xd0, 0xbf, 0x6d, 0x04, 0xfe, 0x2b, 0xc1, 0xc5, 0x64, 0x33, 0x4c, 0x69, 0x5f, 0x1a, 0xbc, + 0x0c, 0x62, 0xeb, 0x70, 0x31, 0x51, 0x43, 0xec, 0xd8, 0x09, 0x27, 0x22, 0xb1, 0x33, 0x3f, 0x4c, + 0xbf, 0xfe, 0xb5, 0x51, 0x73, 0xa5, 0xb6, 0x5a, 0xe7, 0xe7, 0x35, 0x92, 0x13, 0xee, 0x05, 0xa1, + 0xd8, 0x43, 0xb8, 0x30, 0x37, 0x46, 0x0d, 0x69, 0xad, 0xd4, 0x56, 0x6b, 0x9c, 0xcd, 0x0c, 0xd9, + 0xa6, 0x11, 0x4f, 0x60, 0x39, 0xce, 0x42, 0x94, 0xde, 0xa7, 0x7e, 0x90, 0x8a, 0x78, 0x3f, 0x12, + 0x2e, 0xed, 0x6f, 0x77, 0xfd, 0xf2, 0x1a, 0x09, 0x38, 0x9f, 0x47, 0xf3, 0xb3, 0x23, 0xd8, 0xbd, + 0x9c, 0x79, 0x4f, 0x4e, 0xa2, 0x98, 0x84, 0xa0, 0xbb, 0x0e, 0x6a, 0x02, 0x84, 0xf0, 0x32, 0xda, + 0xfa, 0x65, 0x15, 0xda, 0x5b, 0x7e, 0x12, 0x39, 0xa9, 0x7b, 0xc4, 0x2e, 0x43, 0x6b, 0x9c, 0x85, + 0x6e, 0xb1, 0xdf, 0x4d, 0xec, 0x6e, 0x7b, 0xec, 0xff, 0xc3, 0x52, 0x20, 0x5d, 0x27, 0xb0, 0xf3, + 0xad, 0x1d, 0x55, 0x57, 0x6a, 0xab, 0xdd, 0xf5, 0xf3, 0x85, 0x4e, 0xe4, 0xa2, 0xc3, 0x07, 0x44, + 0x5b, 0x88, 0xd2, 0xb7, 0x61, 0x18, 0x8b, 0xa9, 0x4c, 0x45, 0x69, 0x78, 0x8d, 0x86, 0xb3, 0x62, + 0xf8, 0xa7, 0xb1, 0x13, 0x3d, 0x93, 0x9e, 0xe0, 0x4b, 0x8a, 0xb6, 0x18, 0xfe, 0x51, 0x89, 0xfb, + 0x62, 0x62, 0xfb, 0xde, 0x89, 0x4d, 0x7f, 0x30, 0xaa, 0xaf, 0xd4, 0x56, 0x1b, 0x05, 0x2b, 0xc5, + 0x64, 0xdb, 0x3b, 0xd9, 0x41, 0x0c, 0xfb, 0x18, 0x2e, 0xcd, 0x0f, 0x51, 0xb3, 0x8e, 0x1a, 0x34, + 0xe6, 0xfc, 0xcc, 0x18, 0x4e, 0x28, 0x76, 0x13, 0x7a, 0x66, 0x50, 0x8a, 0x62, 0xd7, 0x54, 0x82, + 0x90, 0x94, 0xc4, 0xee, 0x32, 0xb4, 0xfc, 0xc4, 0x4e, 0xfc, 0xf0, 0x98, 0x54, 0xb1, 0xcd, 0x9b, + 0x7e, 0xb2, 0xef, 0x87, 0xc7, 0xec, 0x0a, 0xb4, 0x63, 0xe1, 0x2a, 0x4c, 0x9b, 0x30, 0xad, 0x58, + 0xb8, 0x84, 0xba, 0x0c, 0xd8, 0xb4, 0xdd, 0x54, 0x68, 0x85, 0x6c, 0xc6, 0xc2, 0xdd, 0x4c, 0x85, + 0x95, 0x40, 0x63, 0x57, 0xc4, 0x13, 0x81, 0x3a, 0x89, 0x03, 0xf7, 0x5d, 0x27, 0x24, 0xbe, 0xb7, + 0x79, 0xde, 0x47, 0x8b, 0x10, 0x39, 0x71, 0xea, 0x3b, 0x01, 0xa9, 0x41, 0x9b, 0x9b, 0x2e, 0xbb, + 0x06, 0x9d, 0x24, 0x75, 0xe2, 0x14, 0xbf, 0x8e, 0xc4, 0xbf, 0xc1, 0xdb, 0x04, 0x40, 0x0d, 0xba, + 0x0c, 0x2d, 0x11, 0x7a, 0x84, 0xaa, 0xab, 0x9d, 0x14, 0xa1, 0xb7, 0xed, 0x9d, 0x58, 0x7f, 0x53, + 0x81, 0xfe, 0x6e, 0x16, 0xa4, 0xfe, 0x46, 0x3c, 0xc9, 0xc4, 0x34, 0x4c, 0xd1, 0x92, 0x6c, 0xf9, + 0x49, 0xaa, 0xff, 0x99, 0xda, 0x6c, 0x15, 0x3a, 0xdf, 0x8f, 0x65, 0x16, 0x91, 0x04, 0xa9, 0x9d, + 0x2e, 0x4b, 0x50, 0x81, 0x44, 0x69, 0x7b, 0x1e, 0x7b, 0x22, 0x7e, 0x7c, 0x4a, 0xb4, 0xb5, 0x33, + 0xb4, 0x65, 0x34, 0x7b, 0x0f, 0x3a, 0xfb, 0x22, 0x72, 0x62, 0x07, 0x45, 0xa0, 0x4e, 0xe6, 0xa7, + 0x00, 0xe0, 0xb7, 0x12, 0xf1, 0xb6, 0xa7, 0x95, 0xd0, 0x74, 0xad, 0x09, 0x74, 0x36, 0x26, 0x93, + 0x58, 0x4c, 0x9c, 0x94, 0x4c, 0xa1, 0x8c, 0x68, 0xb9, 0x35, 0x5e, 0x95, 0x11, 0x99, 0x5b, 0xfc, + 0x00, 0xc5, 0x1f, 0x6a, 0xb3, 0xeb, 0x50, 0x17, 0x8b, 0xd7, 0x43, 0x70, 0x76, 0x09, 0x9a, 0xae, + 0x0c, 0xc7, 0xfe, 0x44, 0x1b, 0x69, 0xdd, 0xb3, 0xfe, 0xa2, 0x06, 0x0d, 0xfa, 0x38, 0x64, 0x2f, + 0x1a, 0x4e, 0x5b, 0xbc, 0x72, 0x02, 0xb3, 0x2b, 0x08, 0x78, 0xf2, 0xca, 0x09, 0xd8, 0x0a, 0x34, + 0x70, 0x9a, 0x64, 0x01, 0x6f, 0x14, 0x82, 0xdd, 0x81, 0x06, 0x0a, 0x51, 0x32, 0xbb, 0x02, 0x14, + 0xa2, 0xc7, 0xf5, 0x9f, 0xff, 0xc3, 0x8d, 0x73, 0x5c, 0xa1, 0xd9, 0x07, 0x50, 0x77, 0x26, 0x93, + 0x84, 0x64, 0x79, 0x46, 0x9d, 0xf2, 0xef, 0xe5, 0x44, 0xc0, 0x1e, 0x41, 0x47, 0xed, 0x1b, 0x52, + 0x37, 0x88, 0xfa, 0x72, 0xc9, 0x21, 0x95, 0xb7, 0x94, 0x17, 0x94, 0xc8, 0x71, 0x3f, 0xd1, 0x0a, + 0x4f, 0x12, 0xdd, 0xe6, 0x05, 0x00, 0x3d, 0x46, 0x14, 0x8b, 0x8d, 0x20, 0x90, 0xee, 0xbe, 0xff, + 0x46, 0x68, 0xff, 0x32, 0x03, 0x63, 0x77, 0x60, 0xb0, 0xa7, 0x44, 0x8e, 0x8b, 0x24, 0x0b, 0xd2, + 0x44, 0xfb, 0x9c, 0x39, 0x28, 0x5b, 0x03, 0x36, 0x03, 0x39, 0xa0, 0xcf, 0xef, 0xac, 0xd4, 0x56, + 0xfb, 0x7c, 0x01, 0x86, 0x7d, 0x05, 0xfa, 0x13, 0xe4, 0xb4, 0x1f, 0x4e, 0xec, 0x71, 0xe0, 0xa0, + 0x3b, 0xaa, 0xa1, 0xbb, 0x32, 0xc0, 0xa7, 0x81, 0x33, 0x21, 0x21, 0x8f, 0xfc, 0x20, 0xb0, 0xa7, + 0x62, 0x3a, 0xea, 0xd2, 0x96, 0xb7, 0x09, 0xb0, 0x2b, 0xa6, 0xd6, 0xbf, 0x55, 0xa1, 0xb9, 0x1d, + 0x26, 0x22, 0x4e, 0x51, 0x85, 0x9c, 0xf1, 0x58, 0xb8, 0xa9, 0x50, 0xa6, 0xab, 0xce, 0xf3, 0x3e, + 0xb2, 0xe0, 0x40, 0x7e, 0x1a, 0xfb, 0xa9, 0xd8, 0xff, 0x58, 0x0b, 0x49, 0x01, 0x60, 0x77, 0x61, + 0xd9, 0xf1, 0x3c, 0xdb, 0x50, 0xdb, 0xb1, 0x7c, 0x9d, 0x90, 0x3a, 0xb5, 0xf9, 0x92, 0xe3, 0x79, + 0x1b, 0x1a, 0xce, 0xe5, 0xeb, 0x84, 0xdd, 0x84, 0x5a, 0x2c, 0xc6, 0x24, 0x32, 0xdd, 0xf5, 0x25, + 0xb5, 0xa5, 0xcf, 0x0f, 0x3f, 0x13, 0x6e, 0xca, 0xc5, 0x98, 0x23, 0x8e, 0x5d, 0x80, 0x86, 0x93, + 0xa6, 0xb1, 0xda, 0xa2, 0x0e, 0x57, 0x1d, 0xb6, 0x06, 0xe7, 0x49, 0x6d, 0x53, 0x5f, 0x86, 0x76, + 0xea, 0x1c, 0x06, 0xe8, 0x53, 0x13, 0xed, 0x3e, 0x96, 0x73, 0xd4, 0x01, 0x62, 0xb6, 0xbd, 0x04, + 0x1d, 0xce, 0x3c, 0x7d, 0xe8, 0x4c, 0x45, 0x42, 0xde, 0xa3, 0xc3, 0xcf, 0xcf, 0x8e, 0x78, 0x86, + 0x28, 0xe4, 0x67, 0x31, 0x06, 0x15, 0xbf, 0x4d, 0x3a, 0xd4, 0xcb, 0x81, 0x68, 0x17, 0x2e, 0x42, + 0xd3, 0x4f, 0x6c, 0x11, 0x7a, 0xda, 0x16, 0x35, 0xfc, 0xe4, 0x49, 0xe8, 0xb1, 0x0f, 0xa1, 0xa3, + 0xfe, 0xc5, 0x13, 0x63, 0x0a, 0x0b, 0xba, 0xeb, 0x03, 0x2d, 0xb1, 0x08, 0xde, 0x12, 0x63, 0xde, + 0x4e, 0x75, 0xcb, 0xfa, 0xfd, 0x0a, 0x74, 0x49, 0xc0, 0x5e, 0x44, 0x1e, 0xea, 0xe3, 0x57, 0xa0, + 0x3f, 0xcb, 0x3d, 0xb5, 0x01, 0x3d, 0xa7, 0xcc, 0xba, 0x4b, 0xd0, 0xdc, 0x70, 0x71, 0x15, 0xb4, + 0x03, 0x7d, 0xae, 0x7b, 0xec, 0x1b, 0xb0, 0x94, 0xd1, 0x34, 0xb6, 0x9b, 0x9e, 0xd8, 0x01, 0xea, + 0xb1, 0xd2, 0x18, 0xcd, 0x5e, 0xf5, 0x1f, 0x9b, 0xe9, 0x09, 0xef, 0x67, 0xa6, 0xb9, 0xe3, 0x27, + 0xa9, 0xf5, 0x3e, 0x34, 0x36, 0xe2, 0xd8, 0x39, 0x25, 0x8e, 0x63, 0x63, 0x54, 0x21, 0xd3, 0xae, + 0x3a, 0x96, 0x0b, 0xb5, 0x5d, 0x27, 0x62, 0xb7, 0xa1, 0x3a, 0x8d, 0x08, 0xd3, 0x5d, 0xbf, 0x58, + 0x52, 0x17, 0x27, 0x5a, 0xdb, 0x8d, 0x9e, 0x84, 0x69, 0x7c, 0xca, 0xab, 0xd3, 0xe8, 0xea, 0x23, + 0x68, 0xe9, 0x2e, 0x86, 0x73, 0xc7, 0xe2, 0x94, 0xbe, 0xa1, 0xc3, 0xb1, 0x89, 0x7f, 0xf0, 0xca, + 0x09, 0x32, 0x13, 0x87, 0xa8, 0xce, 0xff, 0xab, 0x7e, 0x52, 0xb1, 0xfe, 0xbd, 0x0e, 0xed, 0x2d, + 0x11, 0x08, 0xfa, 0x12, 0x0b, 0x7a, 0x65, 0x61, 0x31, 0x5c, 0x98, 0x11, 0x20, 0x0b, 0x7a, 0xca, + 0xd9, 0xd0, 0x28, 0xa1, 0xa5, 0x71, 0x06, 0x86, 0x56, 0x70, 0xfb, 0x71, 0xe6, 0x1e, 0x8b, 0x94, + 0xc4, 0xb0, 0xcf, 0x4d, 0x17, 0x31, 0xcf, 0x34, 0xa6, 0xae, 0x30, 0xba, 0xcb, 0xde, 0x03, 0x88, + 0xe5, 0x6b, 0xdb, 0x57, 0x16, 0x5f, 0x19, 0xcf, 0x76, 0x2c, 0x5f, 0x6f, 0xa3, 0xcd, 0xff, 0xb5, + 0x48, 0xdf, 0x37, 0x60, 0x54, 0x92, 0x3e, 0x8c, 0xfb, 0x6c, 0x3f, 0xb4, 0x0f, 0x31, 0xac, 0xd0, + 0x82, 0x58, 0xcc, 0x49, 0x61, 0xe1, 0x76, 0xf8, 0x98, 0x62, 0x0e, 0xad, 0x53, 0x9d, 0x77, 0xe8, + 0xd4, 0x42, 0x15, 0x85, 0xc5, 0x2a, 0xfa, 0x18, 0x60, 0x5f, 0x4c, 0xa6, 0x22, 0x4c, 0x77, 0x9d, + 0x68, 0xd4, 0xa5, 0x8d, 0xb7, 0x8a, 0x8d, 0x37, 0xbb, 0xb5, 0x56, 0x10, 0x29, 0x29, 0x28, 0x8d, + 0xc2, 0x40, 0xc0, 0x75, 0x42, 0x3b, 0x8d, 0xb3, 0xd0, 0x75, 0x52, 0x31, 0xea, 0xd1, 0x5f, 0x75, + 0x5d, 0x27, 0x3c, 0xd0, 0xa0, 0x92, 0x1e, 0xf5, 0xcb, 0x7a, 0x74, 0x07, 0x96, 0xa2, 0xd8, 0x9f, + 0x3a, 0xf1, 0xa9, 0x7d, 0x2c, 0x4e, 0x69, 0x33, 0x06, 0x2a, 0xc0, 0xd5, 0xe0, 0x1f, 0x89, 0xd3, + 0x6d, 0xef, 0xe4, 0xea, 0xb7, 0x61, 0x69, 0x6e, 0x01, 0x5f, 0x48, 0xee, 0x7e, 0x52, 0x83, 0xce, + 0x5e, 0x2c, 0xb4, 0xed, 0xbb, 0x01, 0xdd, 0xc4, 0x3d, 0x12, 0x53, 0x87, 0x76, 0x49, 0xcf, 0x00, + 0x0a, 0x84, 0x9b, 0x33, 0xab, 0xdd, 0xd5, 0x77, 0x6b, 0x37, 0xae, 0x43, 0x05, 0x14, 0xa8, 0x4c, + 0xd8, 0x2c, 0x4c, 0x5a, 0xbd, 0x6c, 0xd2, 0x56, 0xa0, 0x77, 0xe4, 0x24, 0xb6, 0x93, 0xa5, 0xd2, + 0x76, 0x65, 0x40, 0x42, 0xd7, 0xe6, 0x70, 0xe4, 0x24, 0x1b, 0x59, 0x2a, 0x37, 0x65, 0xc0, 0xde, + 0x07, 0x70, 0x65, 0x60, 0xcb, 0xf1, 0x38, 0x11, 0xa9, 0x8e, 0xa6, 0x3a, 0xae, 0x0c, 0x9e, 0x13, + 0x00, 0xa5, 0x52, 0x24, 0xa9, 0x3f, 0x75, 0xf4, 0x96, 0xda, 0xae, 0xcc, 0xc2, 0x94, 0x5c, 0x50, + 0x8d, 0x2f, 0xe7, 0x28, 0x2e, 0x5f, 0x6f, 0x22, 0x82, 0x3d, 0x84, 0x81, 0x2b, 0xa7, 0x91, 0x1d, + 0x21, 0x67, 0xc9, 0xb9, 0xb7, 0xcf, 0x84, 0xb6, 0x3d, 0xa4, 0xd8, 0x3b, 0x16, 0x2a, 0xda, 0x58, + 0x87, 0x25, 0x37, 0xc8, 0x92, 0x54, 0xc4, 0xf6, 0xa1, 0x1e, 0x72, 0x36, 0x1a, 0xee, 0x6b, 0x12, + 0x1d, 0xa1, 0x58, 0xd0, 0xf7, 0x13, 0x5b, 0x06, 0x9e, 0xad, 0xcc, 0x8d, 0x96, 0xb3, 0xae, 0x9f, + 0x3c, 0x0f, 0x3c, 0x6d, 0xf0, 0x14, 0x4d, 0x28, 0x5e, 0x1b, 0x9a, 0xae, 0xa1, 0x79, 0x26, 0x5e, + 0x2b, 0x1a, 0xeb, 0xef, 0xab, 0xd0, 0xda, 0x93, 0x49, 0xba, 0x35, 0x0d, 0x8c, 0x88, 0x57, 0xbe, + 0xa8, 0x88, 0x57, 0x17, 0x8b, 0xf8, 0x02, 0x21, 0xab, 0x2d, 0x10, 0x32, 0xb6, 0x0a, 0xc3, 0x32, + 0x1d, 0x09, 0x87, 0x8a, 0xb9, 0x06, 0x05, 0x21, 0x09, 0xc8, 0x35, 0x0c, 0x12, 0x6c, 0x4f, 0xd9, + 0x24, 0xb5, 0x91, 0x6d, 0x3f, 0xd1, 0xf6, 0x48, 0x21, 0x7d, 0x92, 0x35, 0x1d, 0x41, 0xb4, 0xfd, + 0x44, 0xcb, 0xde, 0x37, 0xe1, 0x4a, 0x3e, 0xd2, 0x7e, 0xed, 0xa7, 0x47, 0x32, 0x4b, 0xed, 0x31, + 0x1d, 0x46, 0x12, 0x1d, 0x22, 0x5f, 0x32, 0x33, 0x7d, 0xaa, 0xd0, 0xea, 0xa8, 0x42, 0x01, 0xcd, + 0x38, 0x0b, 0x02, 0x3b, 0x15, 0x27, 0xa9, 0xde, 0xca, 0x91, 0xe2, 0x8d, 0xe6, 0xdb, 0xd3, 0x2c, + 0x08, 0x0e, 0xc4, 0x49, 0x8a, 0xc6, 0xbf, 0x3d, 0xd6, 0x1d, 0xeb, 0x8f, 0xeb, 0x00, 0x3b, 0xd2, + 0x3d, 0x3e, 0x70, 0xe2, 0x89, 0x48, 0x31, 0xf0, 0x36, 0x16, 0x4d, 0x5b, 0xdc, 0x56, 0xaa, 0xec, + 0x18, 0x5b, 0x87, 0x4b, 0xe6, 0xfb, 0x51, 0x0e, 0xf1, 0x10, 0xa0, 0x4c, 0x92, 0x56, 0x28, 0xa6, + 0xb1, 0xea, 0xd0, 0x49, 0xf6, 0x88, 0x7d, 0x52, 0xf0, 0x16, 0xc7, 0xa4, 0xa7, 0x11, 0xf1, 0x76, + 0x51, 0x00, 0xd7, 0x2f, 0x86, 0x1f, 0x9c, 0x46, 0xec, 0x21, 0x5c, 0x8c, 0xc5, 0x38, 0x16, 0xc9, + 0x91, 0x9d, 0x26, 0xe5, 0x3f, 0x53, 0xf1, 0xf7, 0xb2, 0x46, 0x1e, 0x24, 0xf9, 0x7f, 0x3d, 0x84, + 0x8b, 0x8a, 0x53, 0xf3, 0xcb, 0x53, 0xf6, 0x7b, 0x59, 0x21, 0xcb, 0xab, 0x7b, 0x1f, 0x28, 0xe9, + 0xa1, 0x6c, 0xb2, 0x89, 0xe6, 0x02, 0x62, 0xc6, 0x61, 0x20, 0x30, 0xd0, 0xd9, 0x3c, 0xc2, 0x03, + 0xe5, 0x96, 0x18, 0x6b, 0xe6, 0x17, 0x00, 0x66, 0x41, 0x7d, 0x57, 0x7a, 0x82, 0x58, 0x3d, 0x58, + 0x1f, 0xac, 0x51, 0xfa, 0x04, 0x39, 0x89, 0x50, 0x4e, 0x38, 0xf6, 0x01, 0xd0, 0x74, 0x4a, 0xfc, + 0xce, 0xea, 0x4a, 0x1b, 0x91, 0x24, 0x83, 0x0f, 0xe1, 0x62, 0xb1, 0x12, 0xdb, 0x49, 0xed, 0xf4, + 0x48, 0x90, 0x39, 0x54, 0xea, 0xb2, 0x9c, 0x2f, 0x6a, 0x23, 0x3d, 0x38, 0x12, 0x68, 0x1a, 0x57, + 0xa1, 0x25, 0x0f, 0x3f, 0xb3, 0x51, 0x11, 0xba, 0x8b, 0x15, 0xa1, 0x29, 0x0f, 0x3f, 0xe3, 0x62, + 0xcc, 0xbe, 0x5e, 0x76, 0x25, 0x73, 0xac, 0xe9, 0x11, 0x6b, 0x2e, 0xe4, 0xf8, 0x12, 0x77, 0xac, + 0x4f, 0xa0, 0x89, 0x9f, 0xf3, 0x3c, 0x62, 0x6b, 0xd0, 0x4a, 0x49, 0x3c, 0x12, 0xed, 0xfa, 0x2f, + 0x14, 0x1e, 0xa0, 0x90, 0x1d, 0x6e, 0x88, 0x2c, 0x0e, 0x4b, 0xb9, 0x39, 0x7d, 0x11, 0xfa, 0x2f, + 0x33, 0xc1, 0xbe, 0x0b, 0xcb, 0x51, 0x2c, 0xb4, 0xd8, 0xdb, 0xd9, 0x31, 0x86, 0x27, 0x5a, 0x83, + 0x2f, 0x68, 0x29, 0xcd, 0x47, 0x1c, 0xa3, 0x84, 0x0e, 0xa2, 0x99, 0xbe, 0xf5, 0x63, 0xb8, 0x9c, + 0x53, 0xec, 0x0b, 0x57, 0x86, 0x9e, 0x13, 0x9f, 0x92, 0xe7, 0x9b, 0x9b, 0x3b, 0xf9, 0x22, 0x73, + 0xef, 0xd3, 0xdc, 0x3f, 0xad, 0xc1, 0xe0, 0x79, 0xb8, 0x95, 0x45, 0x81, 0x8f, 0xde, 0xe8, 0x47, + 0xca, 0x59, 0x28, 0x23, 0x5d, 0x29, 0x1b, 0xe9, 0x55, 0x18, 0xea, 0x7f, 0x41, 0x3e, 0x2a, 0x03, + 0xab, 0x93, 0x34, 0x0a, 0xbe, 0x29, 0x03, 0x65, 0x5d, 0xbf, 0x0d, 0x17, 0x33, 0xfa, 0x72, 0x45, + 0x79, 0x24, 0xdc, 0x63, 0xfb, 0x2d, 0x27, 0x28, 0xa6, 0x08, 0x71, 0x28, 0x92, 0x91, 0xd9, 0xbc, + 0x01, 0xdd, 0x62, 0xb8, 0xf1, 0x14, 0x90, 0x13, 0xd2, 0x4a, 0x64, 0x68, 0x7b, 0x66, 0xc9, 0x3a, + 0x4e, 0x41, 0x1f, 0x33, 0x90, 0xc5, 0x97, 0xa0, 0xd9, 0xfa, 0x1d, 0x58, 0x9e, 0xa1, 0xa4, 0x55, + 0x34, 0x69, 0x15, 0xf7, 0x8b, 0x6d, 0x9c, 0xfd, 0xfc, 0x72, 0x17, 0xd7, 0xa3, 0x7c, 0xfa, 0x92, + 0x9c, 0x85, 0x1a, 0x53, 0x36, 0x09, 0x65, 0x2c, 0xb4, 0x82, 0xa0, 0x29, 0xa3, 0xfe, 0xd5, 0x67, + 0x70, 0x61, 0xd1, 0x2c, 0x0b, 0x1c, 0xf3, 0x4a, 0xd9, 0x31, 0xcf, 0x9d, 0xfe, 0x0a, 0x27, 0xfd, + 0xe7, 0x15, 0xe8, 0x3e, 0xcd, 0xde, 0xbc, 0x39, 0x55, 0x06, 0x8f, 0xf5, 0xa0, 0xf2, 0x8c, 0x66, + 0xa9, 0xf2, 0xca, 0x33, 0x8c, 0x87, 0xf7, 0x8e, 0xd1, 0xf8, 0xd2, 0x24, 0x1d, 0xae, 0x7b, 0x78, + 0x6e, 0xdc, 0x3b, 0x3e, 0x78, 0x87, 0xd9, 0x51, 0x68, 0x3c, 0xf0, 0x3c, 0xce, 0xfc, 0x00, 0xe3, + 0x3b, 0x6d, 0x61, 0xf2, 0x3e, 0x9e, 0xc4, 0xb6, 0xc7, 0x4a, 0x5e, 0x9e, 0xc6, 0x72, 0xaa, 0x24, + 0x5a, 0xdb, 0xf5, 0x05, 0x18, 0xeb, 0x97, 0x75, 0x68, 0xff, 0xc0, 0x49, 0x8e, 0x7e, 0x28, 0xfd, + 0x90, 0x3d, 0x84, 0xce, 0x67, 0xd2, 0x0f, 0x55, 0x0a, 0x44, 0x25, 0x47, 0xcf, 0xab, 0x45, 0x3c, + 0x93, 0x9e, 0x58, 0x43, 0x1a, 0x5c, 0x0d, 0x6f, 0x7f, 0xa6, 0x5b, 0xda, 0x1d, 0xc6, 0xfe, 0xe4, + 0x28, 0xb5, 0x11, 0xa8, 0xfd, 0x56, 0xd7, 0x4f, 0x38, 0xc2, 0x68, 0xd6, 0xf7, 0x00, 0x23, 0x83, + 0x23, 0x5b, 0x86, 0x76, 0x74, 0xac, 0x8f, 0x57, 0x6d, 0x84, 0x3c, 0x0f, 0xf7, 0x8e, 0xd1, 0xae, + 0xf9, 0x89, 0xad, 0x13, 0x2d, 0xf4, 0x39, 0x33, 0xa7, 0xd4, 0x5b, 0x30, 0xc0, 0x78, 0x2c, 0x39, + 0xf6, 0x23, 0x3b, 0x8a, 0xe5, 0xa1, 0xf9, 0x16, 0x8c, 0xd2, 0xf6, 0x8f, 0xfd, 0x68, 0x0f, 0x61, + 0x14, 0x06, 0xe9, 0xf4, 0x0d, 0x0a, 0x97, 0x8a, 0x37, 0x40, 0x83, 0x90, 0x2d, 0x94, 0xa3, 0x09, + 0xd4, 0x19, 0xa3, 0x45, 0xa2, 0xd7, 0x8a, 0x45, 0x80, 0x87, 0x09, 0x44, 0xa1, 0xd8, 0x13, 0xaa, + 0xad, 0x50, 0xae, 0x54, 0xa8, 0xaf, 0x02, 0x04, 0x62, 0x8c, 0x0a, 0x14, 0x7a, 0xea, 0x38, 0x3b, + 0x97, 0x0b, 0x41, 0xec, 0x26, 0x22, 0xd9, 0x87, 0xd0, 0x55, 0x5c, 0x50, 0xb4, 0x70, 0x86, 0x16, + 0x08, 0xad, 0x88, 0xef, 0x42, 0x37, 0x94, 0xa1, 0x2d, 0x5e, 0x12, 0xb5, 0xb6, 0x89, 0x33, 0x13, + 0x87, 0x32, 0x7c, 0xf2, 0x12, 0x89, 0xd9, 0x03, 0xbd, 0x06, 0x95, 0x51, 0xe8, 0xbd, 0x25, 0xa3, + 0x40, 0x2b, 0x51, 0x67, 0xeb, 0x8f, 0xcc, 0x4a, 0xd4, 0x88, 0xfe, 0x5b, 0x46, 0xa8, 0xf5, 0xa8, + 0x21, 0x2b, 0xd0, 0xa3, 0x7d, 0x9f, 0x3a, 0x91, 0x9d, 0x3a, 0x13, 0x1d, 0xb7, 0x02, 0xc2, 0x76, + 0x9d, 0xe8, 0xc0, 0x99, 0x30, 0x0e, 0x57, 0x74, 0xb6, 0x51, 0x7b, 0x78, 0xfb, 0x10, 0x25, 0x4e, + 0x71, 0x6d, 0xc9, 0x64, 0x24, 0x16, 0xe7, 0x29, 0x2f, 0xcd, 0xe4, 0x29, 0x49, 0x52, 0xe9, 0x14, + 0xf7, 0xaf, 0x15, 0x68, 0xef, 0x48, 0x19, 0x7d, 0x49, 0xd1, 0x2b, 0x6f, 0x69, 0xf5, 0xed, 0x5b, + 0x5a, 0x9b, 0xdd, 0xd2, 0x39, 0xd6, 0xd7, 0xdf, 0xc5, 0xfa, 0x39, 0x4e, 0x36, 0xbe, 0x04, 0x27, + 0x9b, 0xf3, 0x9c, 0xb4, 0x5a, 0xd0, 0xd8, 0x17, 0xe9, 0xf3, 0xc8, 0xfa, 0xcf, 0x26, 0x74, 0xb6, + 0x84, 0x97, 0xa9, 0xef, 0x2f, 0x7f, 0x4d, 0xe5, 0xed, 0x5f, 0x53, 0x9d, 0xfd, 0x1a, 0xf4, 0xd9, + 0x46, 0x40, 0x17, 0x58, 0xeb, 0xb6, 0x91, 0x4f, 0x94, 0xe4, 0x42, 0x3c, 0x75, 0xc2, 0x69, 0xe6, + 0xab, 0x73, 0xe9, 0x7c, 0xf7, 0x56, 0x37, 0xbe, 0xd4, 0x56, 0xcf, 0x29, 0xf9, 0x99, 0x54, 0xd4, + 0x3c, 0xd7, 0x5a, 0x67, 0xe4, 0x6f, 0x4e, 0xc1, 0xdb, 0x67, 0x14, 0x7c, 0x07, 0xce, 0xcf, 0x78, + 0x0e, 0x47, 0x25, 0x1c, 0x3a, 0x24, 0x49, 0xef, 0x95, 0x24, 0xa9, 0x64, 0xe7, 0x55, 0x1a, 0x82, + 0x2f, 0xcb, 0x79, 0x10, 0x5a, 0x1d, 0x0f, 0xb7, 0x86, 0x1c, 0x22, 0x05, 0xcf, 0xaa, 0x5e, 0xd2, + 0x23, 0xe8, 0xa6, 0x0c, 0xc8, 0x5e, 0x7f, 0x02, 0x4b, 0x05, 0x95, 0x92, 0x91, 0xee, 0x5b, 0x64, + 0xa4, 0x6f, 0x06, 0x2a, 0x31, 0xf9, 0x75, 0x28, 0xf5, 0x7d, 0x38, 0x6f, 0xb2, 0x2b, 0x3a, 0x8e, + 0xa2, 0x1d, 0x1c, 0x90, 0x04, 0x0d, 0x75, 0x42, 0x85, 0x42, 0x28, 0xda, 0xa2, 0x6f, 0xc1, 0x85, + 0x12, 0x39, 0x3a, 0xde, 0xb2, 0x72, 0x97, 0x65, 0x65, 0x39, 0x1f, 0x8b, 0xdd, 0x1d, 0x95, 0x72, + 0xed, 0x7a, 0x22, 0x30, 0x7f, 0x34, 0x1a, 0xaa, 0xf3, 0x9e, 0x27, 0x02, 0x5d, 0xd4, 0xd9, 0x85, + 0x5b, 0x78, 0xac, 0xa2, 0xf0, 0xc2, 0x89, 0xd2, 0x2c, 0x16, 0x76, 0x14, 0x38, 0xae, 0x38, 0x92, + 0x81, 0x27, 0xe2, 0x62, 0x71, 0xcb, 0xb4, 0xb8, 0x1b, 0x32, 0xf0, 0x30, 0xc2, 0x50, 0x94, 0x7b, + 0x05, 0xa1, 0x59, 0xeb, 0x06, 0x5c, 0x3f, 0x33, 0x1d, 0xfa, 0x81, 0x62, 0x22, 0x46, 0x13, 0x5d, + 0x99, 0x9d, 0x08, 0x49, 0xf4, 0x14, 0xd6, 0xbf, 0x34, 0x60, 0x40, 0x2e, 0xea, 0x37, 0x2a, 0xf8, + 0x1b, 0x15, 0xfc, 0x3f, 0xa0, 0x82, 0xd6, 0xef, 0x55, 0xa0, 0xb5, 0x17, 0x4b, 0x2f, 0x73, 0xd3, + 0x2f, 0x29, 0xe9, 0xb3, 0x12, 0x54, 0xfb, 0x55, 0x12, 0x54, 0x3f, 0xe3, 0xfa, 0x7e, 0x56, 0x81, + 0x8e, 0x5e, 0xc2, 0xce, 0xfa, 0x97, 0x5c, 0x44, 0x51, 0xdc, 0xa9, 0x2c, 0x2c, 0xee, 0xfc, 0xca, + 0x55, 0xa0, 0x60, 0xbd, 0x52, 0x85, 0x6b, 0x19, 0xa9, 0x70, 0xa3, 0xa1, 0x04, 0x4b, 0x41, 0x9f, + 0x47, 0xb8, 0x77, 0xd6, 0x6b, 0xe8, 0xd0, 0x81, 0x8d, 0x2c, 0xc3, 0x25, 0x68, 0xc6, 0x54, 0xbd, + 0xd0, 0x0b, 0xd5, 0xbd, 0x77, 0xeb, 0x69, 0xf5, 0xcb, 0x45, 0x45, 0x7f, 0x5b, 0x85, 0x3e, 0x9d, + 0x9e, 0x9f, 0x66, 0xa1, 0xd2, 0x84, 0xc5, 0xc7, 0xbb, 0x15, 0xa8, 0xc7, 0x78, 0xc8, 0x55, 0x7f, + 0xd3, 0x53, 0x7f, 0xb3, 0x29, 0x83, 0x2d, 0x31, 0xe6, 0x84, 0x41, 0x56, 0x39, 0xf1, 0x24, 0x59, + 0x54, 0x07, 0x43, 0x38, 0x7e, 0x55, 0xe4, 0xc4, 0xce, 0x34, 0x31, 0x75, 0x30, 0xd5, 0x63, 0x0c, + 0xea, 0xa4, 0x6f, 0x8a, 0x2d, 0xd4, 0xd6, 0xa7, 0xa7, 0xc4, 0x0f, 0x27, 0xb9, 0xf1, 0x68, 0x53, + 0xf9, 0x73, 0x12, 0x08, 0xb6, 0x0d, 0x17, 0xe6, 0xd8, 0x90, 0x44, 0xc2, 0x55, 0x29, 0xe3, 0x77, + 0x70, 0x80, 0x9d, 0xa9, 0x5f, 0x27, 0x6c, 0x0b, 0x98, 0x4a, 0x20, 0xc7, 0xc2, 0x41, 0xcf, 0x40, + 0x4b, 0xd2, 0x19, 0xa2, 0x4b, 0x6a, 0x22, 0xda, 0x16, 0x4e, 0xe8, 0x3d, 0xc4, 0xf2, 0xa1, 0x3f, + 0x07, 0xb1, 0x36, 0xe0, 0xe2, 0x93, 0x93, 0x54, 0xc4, 0xa1, 0x43, 0x56, 0x62, 0x1d, 0x55, 0x80, + 0x4e, 0xdf, 0xe6, 0xd3, 0x2a, 0xa5, 0x4f, 0xbb, 0x00, 0x8d, 0xf2, 0x0d, 0x06, 0xd5, 0xb1, 0x6e, + 0x43, 0x77, 0xec, 0x07, 0x42, 0x67, 0x30, 0x91, 0x57, 0x3a, 0x97, 0x59, 0xa1, 0x1a, 0xbe, 0xee, + 0x59, 0x7f, 0x56, 0x83, 0x9e, 0xf9, 0x2b, 0xaa, 0xd9, 0xde, 0x2b, 0x6f, 0x56, 0x77, 0x7d, 0x68, + 0xb8, 0x8e, 0x24, 0x1b, 0x69, 0x1a, 0x9b, 0x93, 0x9c, 0xda, 0xc4, 0x6b, 0xd0, 0xa1, 0x7f, 0x49, + 0xfc, 0x37, 0x82, 0x76, 0xb2, 0xc6, 0xdb, 0x08, 0xa0, 0xe2, 0xdb, 0x06, 0x2c, 0x97, 0x96, 0x60, + 0xa7, 0x32, 0x75, 0x02, 0xbd, 0x99, 0xa5, 0x72, 0x46, 0x89, 0x84, 0x2f, 0x61, 0x47, 0xa5, 0x58, + 0x0f, 0x90, 0x1a, 0x85, 0x24, 0x3f, 0x93, 0x9f, 0x11, 0x12, 0xc4, 0x50, 0xa2, 0x36, 0x16, 0x68, + 0x73, 0x92, 0x97, 0x81, 0xde, 0xf2, 0x8e, 0x82, 0xec, 0xbf, 0x0c, 0xf2, 0x05, 0x92, 0x44, 0x37, + 0x49, 0xfe, 0x68, 0x81, 0xa4, 0x8b, 0xf7, 0xa1, 0x2b, 0x63, 0x7f, 0xe2, 0x87, 0xea, 0xe0, 0xdf, + 0x5a, 0xf0, 0x27, 0xa0, 0x08, 0x28, 0x0d, 0x60, 0x41, 0x53, 0x89, 0xc7, 0x82, 0xe4, 0xad, 0xc6, + 0xb0, 0x3b, 0xb0, 0x94, 0xa4, 0xb1, 0xef, 0xa6, 0xb8, 0x1c, 0x7b, 0x2a, 0x3d, 0x53, 0x38, 0xef, + 0x2b, 0xf0, 0xfe, 0xcb, 0x80, 0x92, 0x55, 0x77, 0x60, 0xc9, 0x95, 0x41, 0x36, 0x0d, 0x69, 0x65, + 0x76, 0x20, 0x42, 0x72, 0x0f, 0x0d, 0xde, 0x57, 0x60, 0x5c, 0xdf, 0x8e, 0x08, 0x2d, 0x17, 0x60, + 0x3f, 0x8d, 0x85, 0x33, 0xa5, 0xcd, 0xf9, 0x00, 0x5a, 0xe9, 0x61, 0x40, 0xa9, 0xf0, 0xca, 0xc2, + 0x54, 0x78, 0x33, 0x3d, 0xc4, 0x65, 0x97, 0xb6, 0xbb, 0x4a, 0x29, 0x69, 0xdd, 0x43, 0x59, 0x09, + 0xfc, 0xa9, 0x9f, 0xea, 0x2b, 0x27, 0xaa, 0x63, 0x1d, 0x42, 0x87, 0x66, 0xa0, 0xff, 0xc8, 0x8b, + 0xbf, 0x95, 0x77, 0x17, 0x7f, 0xef, 0x43, 0x4f, 0x2b, 0xcb, 0xdb, 0xaa, 0xc9, 0x5d, 0x85, 0xc7, + 0x76, 0x62, 0xdd, 0x83, 0xce, 0x6f, 0x3b, 0x41, 0xa6, 0xfe, 0xe3, 0x06, 0x74, 0xa9, 0xba, 0x62, + 0x1f, 0x06, 0xd2, 0x3d, 0x36, 0x59, 0x7f, 0x02, 0x3d, 0x46, 0x88, 0x05, 0xd0, 0x7e, 0x11, 0xfa, + 0x32, 0xdc, 0x08, 0x02, 0xeb, 0x0f, 0x1b, 0xd0, 0xc1, 0x13, 0x3e, 0x99, 0x18, 0x3c, 0xb0, 0x53, + 0x69, 0x9b, 0x4e, 0xe4, 0x53, 0x27, 0xd2, 0xe5, 0xed, 0x2e, 0x02, 0x91, 0x6a, 0xd7, 0x89, 0xe6, + 0x0e, 0xec, 0xd5, 0xb9, 0x03, 0xfb, 0x4d, 0x75, 0xd3, 0x48, 0xd5, 0x77, 0x84, 0xa9, 0x97, 0xd2, + 0x04, 0x8f, 0x15, 0x88, 0xdd, 0x03, 0x46, 0x24, 0x4e, 0x10, 0x48, 0x0a, 0x05, 0x12, 0x11, 0x24, + 0xfa, 0x6c, 0x3f, 0x44, 0xcc, 0x86, 0x46, 0xec, 0x0b, 0x25, 0x82, 0x25, 0xbf, 0xd2, 0x98, 0xf7, + 0x2b, 0x77, 0x01, 0x30, 0x62, 0xa2, 0x94, 0x5f, 0xa2, 0x93, 0x41, 0x33, 0x07, 0xeb, 0x02, 0xfb, + 0x39, 0xa2, 0x98, 0x0f, 0x60, 0x98, 0x53, 0xc4, 0x62, 0x6c, 0xbb, 0x61, 0xaa, 0x43, 0x99, 0xbe, + 0xa6, 0xe2, 0x62, 0xbc, 0x19, 0xa6, 0xf3, 0xe1, 0x4e, 0xe7, 0x4c, 0xb8, 0xf3, 0x7d, 0x38, 0xbf, + 0xc0, 0xea, 0xe9, 0x0a, 0xea, 0x17, 0xb9, 0xb4, 0x73, 0x05, 0xda, 0x94, 0x47, 0xf7, 0xb2, 0x48, + 0x57, 0x13, 0x5a, 0x7e, 0x42, 0x61, 0xe9, 0xdb, 0x42, 0xaa, 0xde, 0xff, 0x56, 0x48, 0xd5, 0xff, + 0x7c, 0x21, 0xd5, 0xe0, 0xf3, 0x85, 0x54, 0x73, 0x21, 0xc8, 0xd2, 0x7c, 0x08, 0xf2, 0x02, 0x80, + 0xcc, 0x30, 0x39, 0xc9, 0xb7, 0xf1, 0xaf, 0xf2, 0x45, 0xf9, 0x67, 0xfd, 0x57, 0x05, 0x60, 0xdf, + 0x99, 0x46, 0xca, 0x65, 0xb2, 0xef, 0x41, 0x37, 0xa1, 0x5e, 0x39, 0x97, 0x70, 0xa3, 0x74, 0xc7, + 0x2f, 0x27, 0xd5, 0x4d, 0xca, 0x2b, 0x40, 0x92, 0xb7, 0x69, 0xeb, 0xd5, 0x0c, 0x79, 0x29, 0xa6, + 0x61, 0x08, 0x28, 0x03, 0x7e, 0x1b, 0x06, 0x9a, 0x20, 0x12, 0xb1, 0x2b, 0x42, 0x65, 0x0f, 0x2a, + 0xbc, 0xaf, 0xa0, 0x7b, 0x0a, 0xc8, 0x3e, 0xca, 0xc9, 0x94, 0x51, 0x4a, 0x16, 0x44, 0xfd, 0x7a, + 0xc8, 0xa6, 0x22, 0xb0, 0xd6, 0xcd, 0xa7, 0xd0, 0x42, 0xda, 0x50, 0xc7, 0xff, 0x1b, 0x9e, 0x63, + 0x5d, 0x68, 0xe9, 0x59, 0x87, 0x15, 0xd6, 0x87, 0x0e, 0x5d, 0x1e, 0x22, 0x5c, 0xd5, 0xfa, 0xe9, + 0x32, 0x74, 0xb7, 0xc3, 0x24, 0x8d, 0x33, 0xb5, 0xcd, 0xc5, 0x1d, 0x99, 0x06, 0xdd, 0x91, 0xd1, + 0x55, 0x3d, 0xf5, 0x19, 0x54, 0xd5, 0xbb, 0x0f, 0x2d, 0x7d, 0x1b, 0x4b, 0xc7, 0x51, 0x0b, 0xaf, + 0x72, 0x19, 0x1a, 0xb6, 0x06, 0x6d, 0x4f, 0x5f, 0x13, 0xd3, 0x09, 0x93, 0xd2, 0xdd, 0x2d, 0x73, + 0x81, 0x8c, 0xe7, 0x34, 0xec, 0x26, 0xd4, 0x9c, 0xc9, 0x84, 0x34, 0x99, 0x52, 0xfd, 0x86, 0x94, + 0x2e, 0xd7, 0x70, 0xc4, 0xb1, 0x07, 0xd0, 0x21, 0x13, 0x43, 0x39, 0xc3, 0xe6, 0xfc, 0x9c, 0x26, + 0x21, 0xa9, 0xac, 0x0e, 0x85, 0x60, 0x0f, 0xa0, 0x13, 0x48, 0x19, 0xa9, 0x01, 0xad, 0xf9, 0x01, + 0x26, 0x8d, 0xc4, 0xdb, 0x81, 0x49, 0x28, 0xdd, 0x81, 0x26, 0x7a, 0x4d, 0x19, 0x69, 0x6f, 0x53, + 0x5a, 0x07, 0xe5, 0x5f, 0x78, 0x23, 0xc1, 0x1f, 0xb6, 0x0e, 0xa0, 0xc4, 0x9d, 0x66, 0xee, 0xcc, + 0xb3, 0x23, 0x3f, 0x1e, 0xa2, 0x20, 0x9b, 0x93, 0xe2, 0x63, 0x18, 0xaa, 0xa3, 0x40, 0x69, 0x24, + 0x98, 0x2a, 0x96, 0x19, 0x39, 0x7b, 0xba, 0xe4, 0x83, 0x78, 0xf6, 0xb4, 0xf9, 0x21, 0xb4, 0x22, + 0x15, 0x0b, 0x93, 0x16, 0x76, 0xd7, 0x97, 0x8b, 0xa1, 0x3a, 0x48, 0xe6, 0x86, 0x82, 0x7d, 0x07, + 0x06, 0xaa, 0xda, 0x32, 0xd6, 0x41, 0x21, 0xa5, 0xe8, 0x66, 0x6e, 0x01, 0xcd, 0xc4, 0x8c, 0xbc, + 0x9f, 0xce, 0x84, 0x90, 0xdf, 0x82, 0xbe, 0xd0, 0x51, 0x8a, 0x9d, 0xb8, 0x4e, 0x48, 0xba, 0x49, + 0x11, 0x95, 0x19, 0x5e, 0x0e, 0x62, 0x78, 0x4f, 0x94, 0x43, 0x9a, 0x55, 0x68, 0xea, 0x0a, 0xe0, + 0x90, 0x46, 0x95, 0xee, 0xc2, 0xaa, 0x74, 0x32, 0xd7, 0x78, 0xe4, 0xcb, 0x8c, 0xb9, 0x3a, 0x16, + 0xa7, 0xa3, 0xe5, 0x79, 0xbe, 0xcc, 0x66, 0xef, 0x67, 0x4a, 0x00, 0x3f, 0x12, 0xa7, 0xb8, 0x1f, + 0x45, 0x81, 0x64, 0xc4, 0xe6, 0xf7, 0x23, 0xaf, 0x8e, 0xf0, 0x4e, 0x5e, 0x18, 0x61, 0x4f, 0x66, + 0x0b, 0x36, 0x2a, 0xe7, 0x7d, 0x9e, 0x86, 0x5e, 0x59, 0x30, 0x54, 0xa5, 0xbe, 0xf9, 0x52, 0x34, + 0x57, 0xf7, 0xb9, 0x07, 0x6d, 0x19, 0x7b, 0x54, 0x31, 0x1e, 0x5d, 0x20, 0x4d, 0x5d, 0xd6, 0x75, + 0x2a, 0x75, 0x8d, 0x8d, 0x0c, 0x50, 0x4b, 0xaa, 0x0e, 0x3a, 0xf0, 0x28, 0x96, 0x9f, 0x09, 0x37, + 0x55, 0xd1, 0xd1, 0xc5, 0xb3, 0x0e, 0x5c, 0xe3, 0x29, 0x58, 0xba, 0x05, 0x2d, 0x53, 0x1b, 0xbd, + 0x74, 0x86, 0xd2, 0xa0, 0xd8, 0xc7, 0xb0, 0x34, 0x6b, 0x14, 0x93, 0xd1, 0xe5, 0x33, 0xd4, 0x83, + 0x19, 0x1b, 0x88, 0x5e, 0x4f, 0x47, 0x25, 0xa3, 0xb3, 0x35, 0x09, 0x42, 0x60, 0xe8, 0xa5, 0xe3, + 0x99, 0x2b, 0x67, 0x43, 0x2f, 0x1d, 0xdb, 0x8c, 0xa0, 0xe5, 0x27, 0x4f, 0xfd, 0x38, 0x49, 0x47, + 0x57, 0x8d, 0x17, 0xa2, 0x2e, 0x46, 0x43, 0x7e, 0xb2, 0xe3, 0x24, 0xe9, 0xe8, 0x9a, 0xb9, 0xf8, + 0x88, 0x3d, 0x76, 0x17, 0x9a, 0xba, 0x6e, 0xbc, 0x72, 0xc6, 0x2a, 0xe8, 0xbb, 0x16, 0x5c, 0x53, + 0xb0, 0xaf, 0x42, 0x8b, 0x8a, 0x86, 0x32, 0x1a, 0xdd, 0x9c, 0x97, 0x22, 0x55, 0xb9, 0xe3, 0xcd, + 0x40, 0x55, 0xf0, 0x3e, 0x84, 0x96, 0x09, 0x06, 0xac, 0x79, 0xcd, 0xd0, 0x41, 0x01, 0x37, 0x14, + 0xec, 0x36, 0x34, 0xa6, 0x68, 0x0b, 0x47, 0x5f, 0x99, 0xd7, 0x72, 0x65, 0x22, 0x15, 0x96, 0x3d, + 0x82, 0x6e, 0x42, 0x71, 0xa0, 0x12, 0xff, 0x5b, 0xa6, 0xe0, 0x56, 0x5c, 0xfc, 0x36, 0x41, 0x22, + 0x87, 0xa4, 0x08, 0x18, 0x7f, 0x17, 0xae, 0x96, 0xab, 0x75, 0xa6, 0x94, 0xa7, 0xaf, 0x3c, 0xdf, + 0xa6, 0x59, 0x6e, 0x2e, 0x90, 0xb0, 0xd9, 0xa2, 0x1f, 0xbf, 0x1c, 0xbd, 0xa5, 0x1a, 0xf8, 0x28, + 0xf7, 0x34, 0xa8, 0xd8, 0xa3, 0x3b, 0x67, 0x96, 0x95, 0xfb, 0x2a, 0xe3, 0x7f, 0xc8, 0xc5, 0x7d, + 0x02, 0xbd, 0x71, 0xf6, 0xe6, 0xcd, 0xa9, 0x96, 0x91, 0xd1, 0x07, 0x34, 0xae, 0x74, 0x28, 0x28, + 0xd5, 0x9e, 0x78, 0x77, 0x5c, 0x2a, 0x44, 0x5d, 0x86, 0x96, 0x1b, 0xda, 0x8e, 0xe7, 0xc5, 0xa3, + 0x55, 0x55, 0x7b, 0x72, 0xc3, 0x0d, 0xcf, 0xa3, 0x22, 0x9e, 0x8c, 0x04, 0xdd, 0xc5, 0xb4, 0x7d, + 0x6f, 0xf4, 0x55, 0xe5, 0xf3, 0x0c, 0x68, 0xdb, 0xa3, 0x3b, 0xe1, 0x4e, 0xec, 0x04, 0x81, 0x40, + 0xef, 0x3e, 0xba, 0xab, 0xef, 0x84, 0x6b, 0xd0, 0xb6, 0x87, 0x71, 0xe1, 0xd4, 0x39, 0xb1, 0x0d, + 0x64, 0xf4, 0xa1, 0xba, 0x42, 0x3b, 0x75, 0x4e, 0xf6, 0x34, 0x08, 0x75, 0x5b, 0x9d, 0xee, 0xc8, + 0x62, 0xde, 0x9b, 0xd7, 0xed, 0xfc, 0xc0, 0xcd, 0x3b, 0x7e, 0x7e, 0xf6, 0x26, 0x7b, 0x40, 0x56, + 0xd0, 0x0e, 0xd6, 0x47, 0xf7, 0xcf, 0xda, 0x03, 0x9d, 0x4f, 0x40, 0x7b, 0x60, 0x52, 0x0b, 0xeb, + 0x00, 0xca, 0x5c, 0xd2, 0x66, 0xaf, 0xcd, 0x8f, 0xc9, 0x83, 0x75, 0xae, 0xee, 0xc6, 0xd0, 0x56, + 0xaf, 0x03, 0x50, 0xfd, 0x4e, 0x8d, 0x79, 0x30, 0x3f, 0x26, 0x0f, 0xbe, 0x79, 0xe7, 0x55, 0x1e, + 0x87, 0x3f, 0x80, 0x4e, 0x86, 0x61, 0x36, 0x06, 0xba, 0xa3, 0x87, 0xf3, 0x3a, 0x60, 0x22, 0x70, + 0xde, 0xce, 0x74, 0x0b, 0xff, 0x84, 0xdc, 0x1e, 0x45, 0x40, 0xa3, 0x8f, 0xe6, 0xff, 0x24, 0x0f, + 0xd3, 0x39, 0x79, 0x47, 0x15, 0xb1, 0x3f, 0x82, 0xae, 0x62, 0x9a, 0x1a, 0xb4, 0x3e, 0x2f, 0x23, + 0x45, 0x48, 0xc5, 0x15, 0x77, 0xd5, 0xb0, 0xdb, 0xd0, 0x70, 0xa2, 0x28, 0x38, 0x1d, 0x7d, 0x3c, + 0xaf, 0x18, 0x1b, 0x08, 0xe6, 0x0a, 0x8b, 0xa2, 0x34, 0xcd, 0x82, 0xd4, 0x37, 0xd7, 0x59, 0xbe, + 0x36, 0x2f, 0x4a, 0xa5, 0xdb, 0x7e, 0xbc, 0x3b, 0x2d, 0x5d, 0xfd, 0xbb, 0x07, 0xed, 0x48, 0x26, + 0xa9, 0xed, 0x4d, 0x83, 0xd1, 0xa3, 0x33, 0x1e, 0x4c, 0x5d, 0xe3, 0xe0, 0xad, 0x48, 0x35, 0xac, + 0x47, 0xd0, 0xdb, 0xa0, 0xe7, 0x0c, 0x7e, 0x42, 0xe6, 0xf0, 0x36, 0xd4, 0xf3, 0xcc, 0x4f, 0x6e, + 0x67, 0x89, 0xe2, 0x8d, 0xd8, 0x0e, 0xc7, 0x92, 0x13, 0xda, 0xfa, 0xcb, 0x3a, 0x34, 0xf7, 0x65, + 0x16, 0xbb, 0xe2, 0x57, 0x5f, 0x75, 0x7a, 0xdf, 0xec, 0x7a, 0x58, 0x94, 0x56, 0xd5, 0x06, 0x13, + 0x7a, 0xbe, 0x28, 0xd4, 0x29, 0x92, 0x4a, 0x17, 0xa0, 0xa1, 0x4e, 0x52, 0xea, 0x8a, 0x8c, 0xea, + 0x90, 0xc4, 0x67, 0xc9, 0x91, 0x27, 0x5f, 0x87, 0x28, 0xf1, 0x0d, 0xba, 0x61, 0x02, 0x06, 0xb4, + 0xed, 0xd1, 0xad, 0x4b, 0x43, 0x40, 0x2a, 0xd5, 0x54, 0xe1, 0xb4, 0x01, 0x92, 0x62, 0x99, 0x84, + 0x55, 0xeb, 0x2d, 0x09, 0xab, 0xeb, 0x50, 0x0f, 0xcd, 0xd5, 0x8c, 0x1c, 0x4f, 0x97, 0xe1, 0x09, + 0xce, 0xee, 0x42, 0x7e, 0x3f, 0x4b, 0x47, 0x27, 0x6f, 0xbf, 0xbf, 0xb5, 0x0e, 0x9d, 0xfc, 0x01, + 0x8c, 0x0e, 0x48, 0x2e, 0xac, 0x15, 0x4f, 0x62, 0x0e, 0x4c, 0x8b, 0x17, 0x64, 0x0b, 0x72, 0x58, + 0x2a, 0x95, 0x4e, 0x7c, 0xea, 0x7e, 0x91, 0x1c, 0x16, 0xe5, 0xd7, 0x4d, 0xfe, 0xce, 0x4f, 0x6c, + 0x57, 0x86, 0x49, 0xaa, 0x2f, 0xd0, 0xb5, 0xfc, 0x64, 0x13, 0xbb, 0xec, 0x9b, 0xd0, 0x8f, 0x85, + 0xfb, 0xca, 0x9e, 0x26, 0x13, 0xf5, 0x17, 0xfd, 0xf2, 0x8d, 0xcf, 0x69, 0x32, 0xf9, 0x01, 0xe5, + 0x71, 0xf4, 0x01, 0xa3, 0x8b, 0xb4, 0xbb, 0xc9, 0x84, 0x66, 0xbd, 0x09, 0xbd, 0xc3, 0x40, 0xca, + 0xa9, 0xb1, 0x7a, 0x03, 0xca, 0x5a, 0x75, 0x09, 0xa6, 0x56, 0x60, 0xfd, 0x51, 0x05, 0xda, 0xc8, + 0x3b, 0x94, 0x20, 0xc6, 0xa0, 0x3e, 0x75, 0xa3, 0x4c, 0x47, 0xc2, 0xd4, 0xd6, 0x4f, 0x69, 0x94, + 0x6c, 0xe8, 0xa7, 0x34, 0xb4, 0x73, 0x35, 0x95, 0x10, 0xc2, 0xb6, 0xba, 0x76, 0x7f, 0x1a, 0x48, + 0xc7, 0xd3, 0xf2, 0x60, 0xba, 0xec, 0x22, 0x34, 0xdd, 0x90, 0x8e, 0x8c, 0xea, 0x9a, 0x4e, 0xc3, + 0x0d, 0xf1, 0xa8, 0xa8, 0xc0, 0x45, 0xe1, 0xb9, 0xe1, 0x86, 0x78, 0xdc, 0xf9, 0xab, 0x0a, 0x2c, + 0xef, 0xc5, 0xd2, 0x15, 0x49, 0xb2, 0x83, 0x5e, 0xd8, 0xa1, 0x50, 0x8c, 0x41, 0x9d, 0xb2, 0x3d, + 0xea, 0x0e, 0x3b, 0xb5, 0x51, 0x72, 0xd5, 0x79, 0x3e, 0x3f, 0x6f, 0xd4, 0x78, 0x87, 0x20, 0x74, + 0xdc, 0xc8, 0xd1, 0x34, 0xb0, 0x56, 0x42, 0x53, 0x9e, 0xe8, 0x36, 0x0c, 0x8a, 0x3b, 0x33, 0x34, + 0x83, 0x7e, 0xea, 0x92, 0x43, 0x69, 0x96, 0x1b, 0xd0, 0xd5, 0x49, 0x35, 0x9a, 0xa6, 0x41, 0x34, + 0xa0, 0x40, 0x38, 0x8f, 0x75, 0x04, 0xc3, 0xbd, 0x58, 0x44, 0x4e, 0x2c, 0x28, 0x8b, 0x46, 0x3c, + 0xbc, 0x04, 0xcd, 0x40, 0x84, 0x93, 0xf4, 0x48, 0xaf, 0x57, 0xf7, 0xf2, 0x67, 0x4e, 0xd5, 0xd2, + 0x33, 0x27, 0xe4, 0x65, 0x2c, 0x1c, 0xfd, 0x1a, 0x8a, 0xda, 0xa8, 0x59, 0x61, 0x16, 0xe8, 0x0c, + 0x54, 0x9b, 0xab, 0x8e, 0xf5, 0xb3, 0x1a, 0x74, 0x35, 0x67, 0xe8, 0x5f, 0xd4, 0xae, 0x54, 0xf2, + 0x5d, 0x19, 0x42, 0x2d, 0x79, 0x19, 0xe8, 0x6d, 0xc2, 0x26, 0xfb, 0x18, 0x6a, 0x81, 0x3f, 0xd5, + 0xa7, 0x95, 0x6b, 0x33, 0xe6, 0x7f, 0x96, 0xbf, 0x5a, 0x70, 0x90, 0x9a, 0x5d, 0x23, 0xf3, 0x7c, + 0x62, 0xa3, 0x88, 0x6a, 0x9e, 0xa0, 0x29, 0x3e, 0x41, 0x3d, 0x40, 0xa6, 0x3a, 0x2e, 0xdd, 0x8a, + 0x31, 0xca, 0xdd, 0xe7, 0x1d, 0x0d, 0xd9, 0xf6, 0xd8, 0xd7, 0xa0, 0x9d, 0x84, 0x4e, 0x94, 0x1c, + 0xc9, 0x34, 0x3f, 0x9f, 0xa4, 0x27, 0xe1, 0xda, 0xe6, 0xb3, 0x83, 0x93, 0x70, 0x5f, 0x63, 0xf4, + 0x9f, 0xe5, 0x94, 0xec, 0x3b, 0xd0, 0x4b, 0x44, 0x92, 0xa8, 0x7b, 0xb0, 0x63, 0xa9, 0x95, 0xfe, + 0x62, 0xf9, 0xe8, 0x41, 0x58, 0xfc, 0x6a, 0x23, 0xe2, 0x49, 0x01, 0x62, 0x3f, 0x80, 0x81, 0x19, + 0x1f, 0xc8, 0xc9, 0x24, 0x4f, 0x95, 0x5d, 0x3b, 0x33, 0xc3, 0x0e, 0xa1, 0x4b, 0xf3, 0xf4, 0x93, + 0x32, 0x82, 0x7d, 0x1f, 0x06, 0x91, 0xda, 0x4c, 0x5b, 0x27, 0x79, 0x95, 0xf1, 0xb8, 0x3a, 0x13, + 0xad, 0xcc, 0x6c, 0x76, 0x71, 0xb7, 0xad, 0x80, 0x27, 0xd6, 0x7f, 0x54, 0xa0, 0x5b, 0x5a, 0x35, + 0x3d, 0x3e, 0x4b, 0x44, 0x6c, 0x52, 0xa8, 0xd8, 0x46, 0xd8, 0x91, 0xd4, 0xaf, 0x30, 0x3a, 0x9c, + 0xda, 0x08, 0x8b, 0xa5, 0xae, 0x13, 0x74, 0x38, 0xb5, 0xd1, 0x60, 0xea, 0x33, 0xa5, 0xba, 0xa7, + 0x4e, 0x9b, 0x52, 0xe7, 0xbd, 0x02, 0xb8, 0xed, 0xd1, 0x2b, 0x35, 0x27, 0x75, 0x0e, 0x9d, 0xc4, + 0xa4, 0xa0, 0xf3, 0x3e, 0xaa, 0xe6, 0x2b, 0x11, 0xe3, 0x5a, 0xb4, 0xad, 0x35, 0x5d, 0xdc, 0x6b, + 0xb2, 0x61, 0x6f, 0x64, 0xa8, 0xae, 0xf7, 0xf4, 0x78, 0x1b, 0x01, 0x3f, 0x96, 0x21, 0x0d, 0xd3, + 0x3b, 0x4b, 0xfc, 0xec, 0x70, 0xd3, 0x45, 0x4b, 0xf5, 0x32, 0x13, 0x18, 0xd1, 0x79, 0x74, 0xbf, + 0xa3, 0xc3, 0x5b, 0xd4, 0xdf, 0xf6, 0xac, 0x7f, 0xae, 0xc0, 0xf2, 0x19, 0x66, 0x63, 0x00, 0x85, + 0x8c, 0x36, 0x57, 0x0e, 0x7b, 0xbc, 0x89, 0xdd, 0x6d, 0x8f, 0x10, 0xe9, 0x94, 0x84, 0xa9, 0xaa, + 0x11, 0xe9, 0x14, 0x25, 0xe9, 0x22, 0x34, 0xd3, 0x13, 0xfa, 0x5a, 0xa5, 0x18, 0x8d, 0xf4, 0x04, + 0x3f, 0x73, 0x03, 0x0f, 0xb4, 0x13, 0x3b, 0x10, 0xaf, 0x44, 0x40, 0x7c, 0x18, 0xac, 0xdf, 0x7a, + 0xc7, 0x2e, 0xaf, 0xed, 0xc8, 0xc9, 0x0e, 0xd2, 0xe2, 0x11, 0x57, 0xb5, 0xac, 0x1f, 0x42, 0xdb, + 0x40, 0x59, 0x07, 0x1a, 0x5b, 0xe2, 0x30, 0x9b, 0x0c, 0xcf, 0xb1, 0x36, 0xd4, 0x71, 0xc4, 0xb0, + 0x82, 0xad, 0x4f, 0x9d, 0x38, 0x1c, 0x56, 0x11, 0xfd, 0x24, 0x8e, 0x65, 0x3c, 0xac, 0x61, 0x73, + 0xcf, 0x09, 0x7d, 0x77, 0x58, 0xc7, 0xe6, 0x53, 0x27, 0x75, 0x82, 0x61, 0xc3, 0xfa, 0xeb, 0x06, + 0xb4, 0xf7, 0xf4, 0xbf, 0xb3, 0x2d, 0xe8, 0xe7, 0xef, 0xff, 0x16, 0x27, 0x51, 0xf6, 0xe6, 0x1b, + 0x94, 0x44, 0xe9, 0x45, 0xa5, 0xde, 0xfc, 0x2b, 0xc2, 0xea, 0x99, 0x57, 0x84, 0xef, 0x41, 0xed, + 0x65, 0x7c, 0x3a, 0x5b, 0xca, 0xd9, 0x0b, 0x9c, 0x90, 0x23, 0x98, 0x7d, 0x04, 0x5d, 0xdc, 0x77, + 0x3b, 0x21, 0xf7, 0xaf, 0x13, 0x0f, 0xe5, 0xb7, 0x9a, 0x04, 0xe7, 0x80, 0x44, 0x3a, 0x44, 0x58, + 0x83, 0xb6, 0x7b, 0xe4, 0x07, 0x5e, 0x2c, 0x42, 0x5d, 0x26, 0x65, 0x67, 0x97, 0xcc, 0x73, 0x1a, + 0xf6, 0x3d, 0xba, 0x22, 0x67, 0x12, 0x27, 0x45, 0x92, 0x7b, 0x46, 0x65, 0x4b, 0xa9, 0x15, 0xbe, + 0x54, 0x22, 0x27, 0x9f, 0x54, 0xdc, 0x05, 0x6f, 0x95, 0xef, 0x82, 0xab, 0xb7, 0x62, 0xe4, 0x42, + 0xda, 0xf9, 0x91, 0x09, 0x3d, 0xc8, 0x1d, 0xed, 0xed, 0x3b, 0xf3, 0xc1, 0xa2, 0xf1, 0x5a, 0xda, + 0xeb, 0xdf, 0x82, 0x01, 0x46, 0x11, 0xb6, 0x0a, 0x3e, 0xd0, 0x94, 0x80, 0x7e, 0xd1, 0x91, 0x25, + 0x47, 0x5b, 0x18, 0x7e, 0xa0, 0x30, 0xde, 0x86, 0x81, 0xf9, 0x16, 0x7d, 0xc1, 0xaf, 0xab, 0x93, + 0xe0, 0x1a, 0xaa, 0xee, 0xf7, 0xad, 0xc1, 0x79, 0xf7, 0xc8, 0x09, 0x43, 0x11, 0xd8, 0x87, 0xd9, + 0x78, 0x6c, 0x3c, 0x40, 0x8f, 0x6a, 0x59, 0xcb, 0x1a, 0xf5, 0x98, 0x30, 0xe4, 0x50, 0x2c, 0xe8, + 0x87, 0x7e, 0xa0, 0x12, 0xbc, 0xe4, 0xed, 0xfa, 0x44, 0xd9, 0x0d, 0xfd, 0x80, 0x32, 0xbc, 0xe8, + 0xf3, 0xbe, 0x0b, 0xc3, 0x2c, 0xf3, 0xbd, 0xc4, 0x4e, 0xa5, 0x79, 0x66, 0xa7, 0xd3, 0x84, 0xa5, + 0xa4, 0xc2, 0x8b, 0xcc, 0xf7, 0x0e, 0xa4, 0x7e, 0x68, 0xd7, 0x27, 0x7a, 0xd3, 0xb5, 0xbe, 0x0b, + 0xbd, 0xb2, 0xec, 0xa0, 0x2c, 0xd2, 0x89, 0x6d, 0x78, 0x8e, 0x01, 0x34, 0x9f, 0xc9, 0x78, 0xea, + 0x04, 0xc3, 0x0a, 0xb6, 0xd5, 0x0b, 0x89, 0x61, 0x95, 0xf5, 0xa0, 0x6d, 0x8e, 0x12, 0xc3, 0x9a, + 0xf5, 0x2d, 0x68, 0x9b, 0x77, 0x83, 0xf4, 0x60, 0x4b, 0x7a, 0x42, 0x45, 0x61, 0xca, 0x32, 0xb5, + 0x11, 0x40, 0x11, 0x98, 0x79, 0x2e, 0x5b, 0x2d, 0x9e, 0xcb, 0x5a, 0xbf, 0x05, 0xbd, 0xf2, 0xe2, + 0x4c, 0x8e, 0xac, 0x52, 0xe4, 0xc8, 0x16, 0x8c, 0xa2, 0x6a, 0x48, 0x2c, 0xa7, 0x76, 0x29, 0x64, + 0x68, 0x23, 0x00, 0xff, 0xc6, 0xfa, 0x83, 0x0a, 0x34, 0x28, 0xb4, 0x26, 0xd7, 0x82, 0x8d, 0x42, + 0x77, 0x1a, 0xbc, 0x43, 0x90, 0xff, 0xc1, 0xc5, 0xa5, 0xbc, 0xae, 0x50, 0x7f, 0x67, 0x5d, 0xe1, + 0xee, 0x4b, 0x68, 0xaa, 0x17, 0xca, 0x6c, 0x19, 0xfa, 0x2f, 0xc2, 0xe3, 0x50, 0xbe, 0x0e, 0x15, + 0x60, 0x78, 0x8e, 0x9d, 0x87, 0x25, 0xc3, 0x74, 0xfd, 0x14, 0x7a, 0x58, 0x61, 0x43, 0xe8, 0xd1, + 0xb6, 0x1a, 0x48, 0x95, 0xbd, 0x07, 0x23, 0xed, 0x1c, 0xb6, 0x64, 0x28, 0x9e, 0xc9, 0xd4, 0x1f, + 0x9f, 0x1a, 0x6c, 0x8d, 0x2d, 0x41, 0x77, 0x3f, 0x95, 0xd1, 0xbe, 0x08, 0x3d, 0x3f, 0x9c, 0x0c, + 0xeb, 0x77, 0x9f, 0x42, 0x53, 0x3d, 0x9c, 0x2e, 0xfd, 0xa5, 0x02, 0x0c, 0xcf, 0x21, 0xf5, 0xa7, + 0x8e, 0x9f, 0xfa, 0xe1, 0xe4, 0x99, 0x38, 0x49, 0x95, 0x51, 0xda, 0x71, 0x92, 0x74, 0x58, 0x65, + 0x03, 0x00, 0x3d, 0xeb, 0x93, 0xd0, 0x1b, 0xd6, 0x1e, 0x6f, 0xfe, 0xfc, 0x17, 0xd7, 0x2b, 0x7f, + 0xf7, 0x8b, 0xeb, 0x95, 0x7f, 0xfc, 0xc5, 0xf5, 0x73, 0x3f, 0xf9, 0xa7, 0xeb, 0x95, 0x1f, 0x7f, + 0x54, 0x7a, 0x16, 0x3e, 0x75, 0xd2, 0xd8, 0x3f, 0x51, 0xf5, 0x24, 0xd3, 0x09, 0xc5, 0x83, 0xe8, + 0x78, 0xf2, 0x20, 0x3a, 0x7c, 0x60, 0x64, 0xee, 0xb0, 0x49, 0xaf, 0xbd, 0x3f, 0xfe, 0xef, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x1d, 0x3a, 0xd9, 0xd2, 0x6c, 0x3e, 0x00, 0x00, } func (m *Message) Marshal() (dAtA []byte, err error) { @@ -8480,6 +8499,32 @@ func (m *TableFunction) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.IndexReaderParam != nil { + { + size, err := m.IndexReaderParam.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPipeline(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 + } + if len(m.RuntimeFilterSpecs) > 0 { + for iNdEx := len(m.RuntimeFilterSpecs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RuntimeFilterSpecs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPipeline(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + } if m.IsSingle { i-- if m.IsSingle { @@ -8608,21 +8653,21 @@ func (m *FileOffset) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Offset) > 0 { - dAtA76 := make([]byte, len(m.Offset)*10) - var j75 int + dAtA77 := make([]byte, len(m.Offset)*10) + var j76 int for _, num1 := range m.Offset { num := uint64(num1) for num >= 1<<7 { - dAtA76[j75] = uint8(uint64(num)&0x7f | 0x80) + dAtA77[j76] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j75++ + j76++ } - dAtA76[j75] = uint8(num) - j75++ + dAtA77[j76] = uint8(num) + j76++ } - i -= j75 - copy(dAtA[i:], dAtA76[:j75]) - i = encodeVarintPipeline(dAtA, i, uint64(j75)) + i -= j76 + copy(dAtA[i:], dAtA77[:j76]) + i = encodeVarintPipeline(dAtA, i, uint64(j76)) i-- dAtA[i] = 0xa } @@ -8739,21 +8784,21 @@ func (m *ExternalScan) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if len(m.FileSize) > 0 { - dAtA79 := make([]byte, len(m.FileSize)*10) - var j78 int + dAtA80 := make([]byte, len(m.FileSize)*10) + var j79 int for _, num1 := range m.FileSize { num := uint64(num1) for num >= 1<<7 { - dAtA79[j78] = uint8(uint64(num)&0x7f | 0x80) + dAtA80[j79] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j78++ + j79++ } - dAtA79[j78] = uint8(num) - j78++ + dAtA80[j79] = uint8(num) + j79++ } - i -= j78 - copy(dAtA[i:], dAtA79[:j78]) - i = encodeVarintPipeline(dAtA, i, uint64(j78)) + i -= j79 + copy(dAtA[i:], dAtA80[:j79]) + i = encodeVarintPipeline(dAtA, i, uint64(j79)) i-- dAtA[i] = 0x12 } @@ -10477,40 +10522,40 @@ func (m *Pipeline) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if len(m.NilBatchCnt) > 0 { - dAtA128 := make([]byte, len(m.NilBatchCnt)*10) - var j127 int + dAtA129 := make([]byte, len(m.NilBatchCnt)*10) + var j128 int for _, num1 := range m.NilBatchCnt { num := uint64(num1) for num >= 1<<7 { - dAtA128[j127] = uint8(uint64(num)&0x7f | 0x80) + dAtA129[j128] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j127++ + j128++ } - dAtA128[j127] = uint8(num) - j127++ + dAtA129[j128] = uint8(num) + j128++ } - i -= j127 - copy(dAtA[i:], dAtA128[:j127]) - i = encodeVarintPipeline(dAtA, i, uint64(j127)) + i -= j128 + copy(dAtA[i:], dAtA129[:j128]) + i = encodeVarintPipeline(dAtA, i, uint64(j128)) i-- dAtA[i] = 0x6a } if len(m.ChannelBufferSize) > 0 { - dAtA130 := make([]byte, len(m.ChannelBufferSize)*10) - var j129 int + dAtA131 := make([]byte, len(m.ChannelBufferSize)*10) + var j130 int for _, num1 := range m.ChannelBufferSize { num := uint64(num1) for num >= 1<<7 { - dAtA130[j129] = uint8(uint64(num)&0x7f | 0x80) + dAtA131[j130] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j129++ + j130++ } - dAtA130[j129] = uint8(num) - j129++ + dAtA131[j130] = uint8(num) + j130++ } - i -= j129 - copy(dAtA[i:], dAtA130[:j129]) - i = encodeVarintPipeline(dAtA, i, uint64(j129)) + i -= j130 + copy(dAtA[i:], dAtA131[:j130]) + i = encodeVarintPipeline(dAtA, i, uint64(j130)) i-- dAtA[i] = 0x62 } @@ -10747,40 +10792,40 @@ func (m *Apply) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if len(m.ColList) > 0 { - dAtA135 := make([]byte, len(m.ColList)*10) - var j134 int + dAtA136 := make([]byte, len(m.ColList)*10) + var j135 int for _, num1 := range m.ColList { num := uint64(num1) for num >= 1<<7 { - dAtA135[j134] = uint8(uint64(num)&0x7f | 0x80) + dAtA136[j135] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j134++ + j135++ } - dAtA135[j134] = uint8(num) - j134++ + dAtA136[j135] = uint8(num) + j135++ } - i -= j134 - copy(dAtA[i:], dAtA135[:j134]) - i = encodeVarintPipeline(dAtA, i, uint64(j134)) + i -= j135 + copy(dAtA[i:], dAtA136[:j135]) + i = encodeVarintPipeline(dAtA, i, uint64(j135)) i-- dAtA[i] = 0x1a } if len(m.RelList) > 0 { - dAtA137 := make([]byte, len(m.RelList)*10) - var j136 int + dAtA138 := make([]byte, len(m.RelList)*10) + var j137 int for _, num1 := range m.RelList { num := uint64(num1) for num >= 1<<7 { - dAtA137[j136] = uint8(uint64(num)&0x7f | 0x80) + dAtA138[j137] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j136++ + j137++ } - dAtA137[j136] = uint8(num) - j136++ + dAtA138[j137] = uint8(num) + j137++ } - i -= j136 - copy(dAtA[i:], dAtA137[:j136]) - i = encodeVarintPipeline(dAtA, i, uint64(j136)) + i -= j137 + copy(dAtA[i:], dAtA138[:j137]) + i = encodeVarintPipeline(dAtA, i, uint64(j137)) i-- dAtA[i] = 0x12 } @@ -12046,6 +12091,16 @@ func (m *TableFunction) ProtoSize() (n int) { if m.IsSingle { n += 2 } + if len(m.RuntimeFilterSpecs) > 0 { + for _, e := range m.RuntimeFilterSpecs { + l = e.ProtoSize() + n += 1 + l + sovPipeline(uint64(l)) + } + } + if m.IndexReaderParam != nil { + l = m.IndexReaderParam.ProtoSize() + n += 1 + l + sovPipeline(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -21396,6 +21451,76 @@ func (m *TableFunction) Unmarshal(dAtA []byte) error { } } m.IsSingle = bool(v != 0) + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RuntimeFilterSpecs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPipeline + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RuntimeFilterSpecs = append(m.RuntimeFilterSpecs, &plan.RuntimeFilterSpec{}) + if err := m.RuntimeFilterSpecs[len(m.RuntimeFilterSpecs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IndexReaderParam", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPipeline + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.IndexReaderParam == nil { + m.IndexReaderParam = &plan.IndexReaderParam{} + } + if err := m.IndexReaderParam.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPipeline(dAtA[iNdEx:]) diff --git a/pkg/pb/plan/plan.pb.go b/pkg/pb/plan/plan.pb.go index d1ddffea76bf9..ef8e9ee065dcc 100644 --- a/pkg/pb/plan/plan.pb.go +++ b/pkg/pb/plan/plan.pb.go @@ -6,13 +6,14 @@ package plan import ( encoding_binary "encoding/binary" fmt "fmt" + io "io" + math "math" + math_bits "math/bits" + _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" lock "github.com/matrixorigin/matrixone/pkg/pb/lock" timestamp "github.com/matrixorigin/matrixone/pkg/pb/timestamp" - io "io" - math "math" - math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -3805,19 +3806,21 @@ type IndexDef struct { // letter case: lower IndexName string `protobuf:"bytes,2,opt,name=index_name,json=indexName,proto3" json:"index_name,omitempty"` // The constituent columns of the index, letter case: lower - Parts []string `protobuf:"bytes,3,rep,name=parts,proto3" json:"parts,omitempty"` - Unique bool `protobuf:"varint,4,opt,name=unique,proto3" json:"unique,omitempty"` - IndexTableName string `protobuf:"bytes,5,opt,name=index_table_name,json=indexTableName,proto3" json:"index_table_name,omitempty"` - TableExist bool `protobuf:"varint,6,opt,name=table_exist,json=tableExist,proto3" json:"table_exist,omitempty"` - Comment string `protobuf:"bytes,7,opt,name=comment,proto3" json:"comment,omitempty"` - Visible bool `protobuf:"varint,8,opt,name=visible,proto3" json:"visible,omitempty"` - Option *IndexOption `protobuf:"bytes,9,opt,name=option,proto3" json:"option,omitempty"` - IndexAlgo string `protobuf:"bytes,10,opt,name=index_algo,json=indexAlgo,proto3" json:"index_algo,omitempty"` - IndexAlgoTableType string `protobuf:"bytes,11,opt,name=index_algo_table_type,json=indexAlgoTableType,proto3" json:"index_algo_table_type,omitempty"` - IndexAlgoParams string `protobuf:"bytes,12,opt,name=index_algo_params,json=indexAlgoParams,proto3" json:"index_algo_params,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Parts []string `protobuf:"bytes,3,rep,name=parts,proto3" json:"parts,omitempty"` + Unique bool `protobuf:"varint,4,opt,name=unique,proto3" json:"unique,omitempty"` + IndexTableName string `protobuf:"bytes,5,opt,name=index_table_name,json=indexTableName,proto3" json:"index_table_name,omitempty"` + TableExist bool `protobuf:"varint,6,opt,name=table_exist,json=tableExist,proto3" json:"table_exist,omitempty"` + Comment string `protobuf:"bytes,7,opt,name=comment,proto3" json:"comment,omitempty"` + Visible bool `protobuf:"varint,8,opt,name=visible,proto3" json:"visible,omitempty"` + Option *IndexOption `protobuf:"bytes,9,opt,name=option,proto3" json:"option,omitempty"` + IndexAlgo string `protobuf:"bytes,10,opt,name=index_algo,json=indexAlgo,proto3" json:"index_algo,omitempty"` + IndexAlgoTableType string `protobuf:"bytes,11,opt,name=index_algo_table_type,json=indexAlgoTableType,proto3" json:"index_algo_table_type,omitempty"` + IndexAlgoParams string `protobuf:"bytes,12,opt,name=index_algo_params,json=indexAlgoParams,proto3" json:"index_algo_params,omitempty"` + // Logical INCLUDE columns of the index, letter case: lower. + IncludedColumns []string `protobuf:"bytes,13,rep,name=included_columns,json=includedColumns,proto3" json:"included_columns,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *IndexDef) Reset() { *m = IndexDef{} } @@ -3937,6 +3940,13 @@ func (m *IndexDef) GetIndexAlgoParams() string { return "" } +func (m *IndexDef) GetIncludedColumns() []string { + if m != nil { + return m.IncludedColumns + } + return nil +} + type ForeignKeyDef struct { // letter case: lower Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -13798,832 +13808,834 @@ func init() { func init() { proto.RegisterFile("plan.proto", fileDescriptor_2d655ab2f7683c23) } var fileDescriptor_2d655ab2f7683c23 = []byte{ - // 13198 bytes of a gzipped FileDescriptorProto + // 13220 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x5d, 0x8c, 0x1b, 0x57, 0x96, 0x18, 0xdc, 0x6c, 0x92, 0x4d, 0xf2, 0xf0, 0xa7, 0xab, 0xaf, 0x5a, 0x12, 0x25, 0xcb, 0x52, 0xbb, 0x2c, 0xcb, 0xb2, 0x6c, 0xcb, 0xb6, 0xe4, 0x1f, 0x79, 0x76, 0x66, 0x67, 0xd8, 0x24, 0x5b, 0x4d, 0x9b, 0x4d, 0xf6, 0x14, 0xd9, 0x92, 0x3d, 0xfb, 0x2d, 0x0a, 0x45, 0x56, 0xb1, 0xbb, 0xdc, - 0xc5, 0x2a, 0xba, 0xaa, 0xa8, 0xee, 0x1e, 0x60, 0xf1, 0x0d, 0xbe, 0x0f, 0xd8, 0x9f, 0xbc, 0x06, - 0xd9, 0xbc, 0x64, 0x81, 0x4d, 0x80, 0x20, 0x40, 0x90, 0x3c, 0x24, 0x58, 0x60, 0x77, 0xdf, 0xb2, - 0x48, 0x10, 0x6c, 0x10, 0x64, 0x37, 0x40, 0x90, 0x04, 0x49, 0x80, 0x4d, 0x32, 0x79, 0x0e, 0x12, - 0x20, 0x79, 0x0c, 0x90, 0xe0, 0x9c, 0x7b, 0xab, 0xea, 0x16, 0x49, 0x49, 0xb6, 0x67, 0x16, 0xc8, - 0x4b, 0x37, 0xef, 0xf9, 0xb9, 0xff, 0xf7, 0xdc, 0x73, 0xce, 0x3d, 0xf7, 0x16, 0xc0, 0xcc, 0x31, - 0xdc, 0xfb, 0x33, 0xdf, 0x0b, 0x3d, 0x96, 0xc3, 0xdf, 0xd7, 0xdf, 0x3d, 0xb6, 0xc3, 0x93, 0xf9, - 0xe8, 0xfe, 0xd8, 0x9b, 0xbe, 0x77, 0xec, 0x1d, 0x7b, 0xef, 0x11, 0x72, 0x34, 0x9f, 0x50, 0x8a, - 0x12, 0xf4, 0x8b, 0x33, 0x5d, 0x07, 0xc7, 0x1b, 0x9f, 0x8a, 0xdf, 0x9b, 0xa1, 0x3d, 0xb5, 0x82, - 0xd0, 0x98, 0xce, 0x38, 0x40, 0xfd, 0xc3, 0x0c, 0xe4, 0x86, 0x17, 0x33, 0x8b, 0xd5, 0x60, 0xdd, - 0x36, 0xeb, 0x99, 0x9d, 0xcc, 0xdd, 0xbc, 0xb6, 0x6e, 0x9b, 0x6c, 0x07, 0xca, 0xae, 0x17, 0xf6, - 0xe6, 0x8e, 0x63, 0x8c, 0x1c, 0xab, 0xbe, 0xbe, 0x93, 0xb9, 0x5b, 0xd4, 0x64, 0x10, 0x7b, 0x05, - 0x4a, 0xc6, 0x3c, 0xf4, 0x74, 0xdb, 0x1d, 0xfb, 0xf5, 0x2c, 0xe1, 0x8b, 0x08, 0xe8, 0xb8, 0x63, - 0x9f, 0x6d, 0x43, 0xfe, 0xcc, 0x36, 0xc3, 0x93, 0x7a, 0x8e, 0x72, 0xe4, 0x09, 0x84, 0x06, 0x63, - 0xc3, 0xb1, 0xea, 0x79, 0x0e, 0xa5, 0x04, 0x42, 0x43, 0x2a, 0x64, 0x63, 0x27, 0x73, 0xb7, 0xa4, - 0xf1, 0x04, 0xbb, 0x09, 0x60, 0xb9, 0xf3, 0xe9, 0x33, 0xc3, 0x99, 0x5b, 0x41, 0xbd, 0x40, 0x28, - 0x09, 0xa2, 0xfe, 0x10, 0x4a, 0xd3, 0xe0, 0x78, 0xdf, 0x32, 0x4c, 0xcb, 0x67, 0x57, 0xa1, 0x30, - 0x0d, 0x8e, 0xf5, 0xd0, 0x38, 0x16, 0x4d, 0xd8, 0x98, 0x06, 0xc7, 0x43, 0xe3, 0x98, 0x5d, 0x83, - 0x22, 0x21, 0x2e, 0x66, 0xbc, 0x0d, 0x79, 0x0d, 0x09, 0xb1, 0xc5, 0xea, 0xef, 0x6c, 0x40, 0xa1, - 0x6b, 0x87, 0x96, 0x6f, 0x38, 0xec, 0x0a, 0x6c, 0xd8, 0x81, 0x3b, 0x77, 0x1c, 0x62, 0x2f, 0x6a, - 0x22, 0xc5, 0xae, 0x40, 0xde, 0x7e, 0xf4, 0xcc, 0x70, 0x38, 0xef, 0xfe, 0x9a, 0xc6, 0x93, 0xac, - 0x0e, 0x1b, 0xf6, 0x07, 0x1f, 0x23, 0x22, 0x2b, 0x10, 0x22, 0x4d, 0x98, 0x87, 0x0f, 0x10, 0x93, - 0x8b, 0x31, 0x94, 0x26, 0xcc, 0xc7, 0x1f, 0x22, 0x06, 0x5b, 0x9f, 0x25, 0x0c, 0xa5, 0xb1, 0x94, - 0x39, 0x95, 0x82, 0x1d, 0x50, 0xc5, 0x52, 0xe6, 0x51, 0x29, 0x73, 0x5e, 0x4a, 0x41, 0x20, 0x44, - 0x9a, 0x30, 0xbc, 0x94, 0x62, 0x8c, 0x89, 0x4b, 0x99, 0xf3, 0x52, 0x4a, 0x3b, 0x99, 0xbb, 0x39, - 0xc2, 0xf0, 0x52, 0xb6, 0x21, 0x67, 0x22, 0x1c, 0x76, 0x32, 0x77, 0x33, 0xfb, 0x6b, 0x1a, 0xa5, - 0x10, 0x1a, 0x20, 0xb4, 0x8c, 0x1d, 0x8c, 0xd0, 0x40, 0x40, 0x47, 0x08, 0xad, 0x60, 0x6f, 0x20, - 0x74, 0x24, 0xa0, 0x13, 0x84, 0x56, 0x77, 0x32, 0x77, 0xd7, 0x11, 0x8a, 0x29, 0x76, 0x1d, 0x0a, - 0xa6, 0x11, 0x5a, 0x88, 0xa8, 0x89, 0x26, 0x47, 0x00, 0xc4, 0xe1, 0x8c, 0x43, 0xdc, 0xa6, 0x68, - 0x74, 0x04, 0x60, 0x2a, 0x94, 0x91, 0x2c, 0xc2, 0x2b, 0x02, 0x2f, 0x03, 0xd9, 0x47, 0x50, 0x31, - 0xad, 0xb1, 0x3d, 0x35, 0x1c, 0xde, 0xa6, 0xad, 0x9d, 0xcc, 0xdd, 0xf2, 0x83, 0xcd, 0xfb, 0xb4, - 0x26, 0x62, 0xcc, 0xfe, 0x9a, 0x96, 0x22, 0x63, 0x8f, 0xa0, 0x2a, 0xd2, 0x1f, 0x3c, 0xa0, 0x8e, - 0x65, 0xc4, 0xa7, 0xa4, 0xf8, 0x3e, 0x78, 0xf0, 0x68, 0x7f, 0x4d, 0x4b, 0x13, 0xb2, 0xdb, 0x50, - 0x89, 0x97, 0x08, 0x32, 0x5e, 0x12, 0xb5, 0x4a, 0x41, 0xb1, 0x59, 0x5f, 0x05, 0x9e, 0x8b, 0x04, - 0xdb, 0xa2, 0xdf, 0x22, 0x00, 0xdb, 0x01, 0x30, 0xad, 0x89, 0x31, 0x77, 0x42, 0x44, 0x5f, 0x16, - 0x1d, 0x28, 0xc1, 0xd8, 0x4d, 0x28, 0xcd, 0x67, 0xd8, 0xca, 0x27, 0x86, 0x53, 0xbf, 0x22, 0x08, - 0x12, 0x10, 0xe6, 0x8e, 0xf3, 0x1c, 0xb1, 0x57, 0xc5, 0xe8, 0x46, 0x00, 0x1c, 0xde, 0x67, 0xd6, - 0x18, 0x51, 0x75, 0x51, 0xb0, 0x48, 0xe3, 0x2a, 0xb2, 0x83, 0x5d, 0xdb, 0xad, 0x5f, 0xa3, 0x19, - 0xcc, 0x13, 0xec, 0x06, 0x64, 0x03, 0x7f, 0x5c, 0xbf, 0x4e, 0xed, 0x07, 0xde, 0xfe, 0xf6, 0xf9, - 0xcc, 0xd7, 0x10, 0xbc, 0x5b, 0x80, 0x3c, 0xad, 0x26, 0xf5, 0x06, 0x14, 0x0f, 0x0d, 0xdf, 0x98, - 0x6a, 0xd6, 0x84, 0x29, 0x90, 0x9d, 0x79, 0x81, 0x58, 0x47, 0xf8, 0x53, 0xed, 0xc2, 0xc6, 0x13, - 0xc3, 0x47, 0x1c, 0x83, 0x9c, 0x6b, 0x4c, 0x2d, 0x42, 0x96, 0x34, 0xfa, 0x8d, 0x6b, 0x27, 0xb8, - 0x08, 0x42, 0x6b, 0x2a, 0x84, 0x84, 0x48, 0x21, 0xfc, 0xd8, 0xf1, 0x46, 0x62, 0x8d, 0x14, 0x35, - 0x91, 0x52, 0xff, 0xbf, 0x0c, 0x6c, 0x34, 0x3d, 0x07, 0xb3, 0xbb, 0x0a, 0x05, 0xdf, 0x72, 0xf4, - 0xa4, 0xb8, 0x0d, 0xdf, 0x72, 0x0e, 0xbd, 0x00, 0x11, 0x63, 0x8f, 0x23, 0xf8, 0xaa, 0xdd, 0x18, - 0x7b, 0x84, 0x88, 0x2a, 0x90, 0x95, 0x2a, 0x70, 0x0d, 0x8a, 0xe1, 0xc8, 0xd1, 0x09, 0x9e, 0x23, - 0x78, 0x21, 0x1c, 0x39, 0x3d, 0x44, 0x5d, 0x85, 0x82, 0x39, 0xe2, 0x98, 0x3c, 0x61, 0x36, 0xcc, - 0x11, 0x22, 0xd4, 0x4f, 0xa1, 0xa4, 0x19, 0x67, 0xa2, 0x1a, 0x97, 0x61, 0x03, 0x33, 0x10, 0xf2, - 0x2f, 0xa7, 0xe5, 0xc3, 0x91, 0xd3, 0x31, 0x11, 0x8c, 0x95, 0xb0, 0x4d, 0xaa, 0x43, 0x4e, 0xcb, - 0x8f, 0x3d, 0xa7, 0x63, 0xaa, 0x43, 0x80, 0xa6, 0xe7, 0xfb, 0xdf, 0xb9, 0x09, 0xdb, 0x90, 0x37, - 0xad, 0x59, 0x78, 0xc2, 0x45, 0x87, 0xc6, 0x13, 0xea, 0x3d, 0x28, 0xe2, 0xb8, 0x74, 0xed, 0x20, - 0x64, 0x37, 0x21, 0xe7, 0xd8, 0x41, 0x58, 0xcf, 0xec, 0x64, 0x17, 0x46, 0x8d, 0xe0, 0xea, 0x0e, - 0x14, 0x0f, 0x8c, 0xf3, 0x27, 0x38, 0x72, 0x98, 0x1b, 0x0d, 0xa1, 0x18, 0x12, 0x31, 0x9e, 0x15, - 0x80, 0xa1, 0xe1, 0x1f, 0x5b, 0x21, 0x49, 0xba, 0xff, 0x91, 0x81, 0xf2, 0x60, 0x3e, 0xfa, 0x7a, - 0x6e, 0xf9, 0x17, 0x58, 0xe7, 0xbb, 0x90, 0x0d, 0x2f, 0x66, 0xc4, 0x51, 0x7b, 0x70, 0x85, 0x67, - 0x2f, 0xe1, 0xef, 0x23, 0x93, 0x86, 0x24, 0xd8, 0x08, 0xd7, 0x33, 0xad, 0xa8, 0x0f, 0xf2, 0xda, - 0x06, 0x26, 0x3b, 0x26, 0x6e, 0x17, 0xde, 0x4c, 0x8c, 0xc2, 0xba, 0x37, 0x63, 0x3b, 0x90, 0x1f, - 0x9f, 0xd8, 0x8e, 0x49, 0x03, 0x90, 0xae, 0x33, 0x47, 0xe0, 0x28, 0xf9, 0xde, 0x99, 0x1e, 0xd8, - 0x3f, 0x8d, 0xc4, 0x7f, 0xc1, 0xf7, 0xce, 0x06, 0xf6, 0x4f, 0x2d, 0x75, 0x28, 0xf6, 0x20, 0x80, - 0x8d, 0x41, 0xb3, 0xd1, 0x6d, 0x68, 0xca, 0x1a, 0xfe, 0x6e, 0x7f, 0xd1, 0x19, 0x0c, 0x07, 0x4a, - 0x86, 0xd5, 0x00, 0x7a, 0xfd, 0xa1, 0x2e, 0xd2, 0xeb, 0x6c, 0x03, 0xd6, 0x3b, 0x3d, 0x25, 0x8b, - 0x34, 0x08, 0xef, 0xf4, 0x94, 0x1c, 0x2b, 0x40, 0xb6, 0xd1, 0xfb, 0x52, 0xc9, 0xd3, 0x8f, 0x6e, - 0x57, 0xd9, 0x50, 0xff, 0x6c, 0x1d, 0x4a, 0xfd, 0xd1, 0x57, 0xd6, 0x38, 0xc4, 0x36, 0xe3, 0x2c, - 0xb5, 0xfc, 0x67, 0x96, 0x4f, 0xcd, 0xce, 0x6a, 0x22, 0x85, 0x0d, 0x31, 0x47, 0xd4, 0xb8, 0xac, - 0xb6, 0x6e, 0x8e, 0x88, 0x6e, 0x7c, 0x62, 0x4d, 0x0d, 0x6a, 0x1c, 0xd2, 0x51, 0x0a, 0x57, 0x85, - 0x37, 0xfa, 0x8a, 0x9a, 0x97, 0xd5, 0xf0, 0x27, 0xbb, 0x05, 0x65, 0x9e, 0x87, 0x3c, 0xbf, 0x80, - 0x83, 0x16, 0x27, 0xdf, 0x86, 0x3c, 0xf9, 0x88, 0x93, 0x72, 0xe5, 0x48, 0xb1, 0xb7, 0x71, 0x50, - 0x4f, 0xcc, 0x68, 0x6f, 0xf4, 0x15, 0xc7, 0x16, 0xf9, 0x8c, 0xf6, 0x46, 0x5f, 0x11, 0xea, 0x6d, - 0xd8, 0x0a, 0xe6, 0xa3, 0x60, 0xec, 0xdb, 0xb3, 0xd0, 0xf6, 0x5c, 0x4e, 0x53, 0x22, 0x1a, 0x45, - 0x46, 0x10, 0xf1, 0x5d, 0x28, 0xce, 0xe6, 0x23, 0xdd, 0x76, 0x27, 0x1e, 0x89, 0xfd, 0xf2, 0x83, - 0x2a, 0x1f, 0x98, 0xc3, 0xf9, 0xa8, 0xe3, 0x4e, 0x3c, 0xad, 0x30, 0xe3, 0x3f, 0x98, 0x0a, 0x55, - 0xd7, 0x0b, 0x75, 0x54, 0x15, 0xf4, 0xa9, 0x15, 0x1a, 0xb4, 0x1f, 0xf0, 0x0d, 0xbf, 0xeb, 0x8d, - 0x4f, 0x0f, 0xac, 0xd0, 0x50, 0xef, 0x40, 0x41, 0xf0, 0xe1, 0xde, 0x1f, 0x5a, 0xae, 0xe1, 0x86, - 0x7a, 0xac, 0x34, 0x14, 0x39, 0xa0, 0x63, 0xaa, 0x7f, 0x90, 0x01, 0x65, 0x20, 0x55, 0x05, 0x99, - 0x57, 0x4a, 0x8e, 0x57, 0x01, 0x8c, 0xf1, 0xd8, 0x9b, 0xf3, 0x6c, 0xf8, 0x04, 0x2b, 0x09, 0x48, - 0xc7, 0x94, 0xfb, 0x2f, 0x9b, 0xea, 0xbf, 0xd7, 0xa0, 0x12, 0xf1, 0x49, 0x8b, 0xbe, 0x2c, 0x60, - 0x51, 0x0f, 0x06, 0xf3, 0xd4, 0xca, 0x2f, 0x04, 0x73, 0xce, 0x7d, 0x05, 0x36, 0x48, 0xc3, 0x08, - 0xa2, 0x51, 0xe1, 0x29, 0xf5, 0xdf, 0x66, 0xa0, 0xda, 0x71, 0x4d, 0xeb, 0x7c, 0x30, 0x36, 0xdc, - 0xa8, 0x53, 0xec, 0x40, 0xb7, 0x11, 0xa6, 0x07, 0x63, 0xc3, 0x15, 0xca, 0x41, 0xd9, 0x0e, 0x62, - 0x3a, 0x6c, 0x03, 0x27, 0xa0, 0xa2, 0xd6, 0x29, 0xc7, 0x12, 0x41, 0xa8, 0xb0, 0x3b, 0xb0, 0x39, - 0xb2, 0x1c, 0xcf, 0x3d, 0xd6, 0x43, 0x4f, 0xe7, 0x5a, 0x0e, 0x6f, 0x4b, 0x95, 0x83, 0x87, 0xde, - 0x90, 0xb4, 0x9d, 0x6d, 0xc8, 0xcf, 0x0c, 0x3f, 0x0c, 0xea, 0xb9, 0x9d, 0x2c, 0x2e, 0x63, 0x4a, - 0x60, 0x37, 0xdb, 0x81, 0x3e, 0x77, 0xed, 0xaf, 0xe7, 0xbc, 0x19, 0x45, 0xad, 0x68, 0x07, 0x47, - 0x94, 0x66, 0x77, 0x41, 0xe1, 0x25, 0x53, 0xb6, 0xf2, 0x3c, 0xab, 0x11, 0x9c, 0x32, 0x26, 0x61, - 0xf7, 0x57, 0xd6, 0xa1, 0xb8, 0x37, 0x77, 0xc7, 0x38, 0x18, 0xec, 0x75, 0xc8, 0x4d, 0xe6, 0xee, - 0x98, 0xda, 0x12, 0x6f, 0xa5, 0xf1, 0x3a, 0xd1, 0x08, 0x89, 0x12, 0xc8, 0xf0, 0x8f, 0x51, 0x72, - 0x2d, 0x49, 0x20, 0x84, 0xab, 0x7f, 0x94, 0xe1, 0x39, 0xee, 0x39, 0xc6, 0x31, 0x2b, 0x42, 0xae, - 0xd7, 0xef, 0xb5, 0x95, 0x35, 0x56, 0x81, 0x62, 0xa7, 0x37, 0x6c, 0x6b, 0xbd, 0x46, 0x57, 0xc9, - 0xd0, 0x72, 0x1e, 0x36, 0x76, 0xbb, 0x6d, 0x65, 0x1d, 0x31, 0x4f, 0xfa, 0xdd, 0xc6, 0xb0, 0xd3, - 0x6d, 0x2b, 0x39, 0x8e, 0xd1, 0x3a, 0xcd, 0xa1, 0x52, 0x64, 0x0a, 0x54, 0x0e, 0xb5, 0x7e, 0xeb, - 0xa8, 0xd9, 0xd6, 0x7b, 0x47, 0xdd, 0xae, 0xa2, 0xb0, 0x4b, 0xb0, 0x19, 0x43, 0xfa, 0x1c, 0xb8, - 0x83, 0x2c, 0x4f, 0x1a, 0x5a, 0x43, 0x7b, 0xac, 0xfc, 0x88, 0x15, 0x21, 0xdb, 0x78, 0xfc, 0x58, - 0xf9, 0x19, 0x4a, 0x86, 0xd2, 0xd3, 0x4e, 0x4f, 0x7f, 0xd2, 0xe8, 0x1e, 0xb5, 0x95, 0x9f, 0xad, - 0x47, 0xe9, 0xbe, 0xd6, 0x6a, 0x6b, 0xca, 0xcf, 0x72, 0x6c, 0x0b, 0x2a, 0x3f, 0xe9, 0xf7, 0xda, - 0x07, 0x8d, 0xc3, 0x43, 0xaa, 0xc8, 0xcf, 0x8a, 0xea, 0x7f, 0xcd, 0x41, 0x0e, 0x5b, 0xc2, 0xd4, - 0x44, 0x0a, 0xc6, 0x4d, 0x44, 0x31, 0xb4, 0x9b, 0xfb, 0xd3, 0xbf, 0xb8, 0xb5, 0xc6, 0xe5, 0xdf, - 0x6b, 0x90, 0x75, 0xec, 0x90, 0x86, 0x35, 0x5e, 0x3b, 0x42, 0x67, 0xdc, 0x5f, 0xd3, 0x10, 0xc7, - 0x6e, 0x42, 0x86, 0x0b, 0xc2, 0xf2, 0x83, 0x9a, 0x58, 0x5c, 0x62, 0x27, 0xdd, 0x5f, 0xd3, 0x32, - 0x33, 0x76, 0x03, 0x32, 0xcf, 0x84, 0x54, 0xac, 0x70, 0x3c, 0xdf, 0x4b, 0x11, 0xfb, 0x8c, 0xed, - 0x40, 0x76, 0xec, 0x71, 0x8d, 0x30, 0xc6, 0xf3, 0x9d, 0x05, 0xf3, 0x1f, 0x7b, 0x0e, 0x7b, 0x1d, - 0xb2, 0xbe, 0x71, 0x46, 0x23, 0x1b, 0x0f, 0x57, 0xbc, 0x75, 0x21, 0x91, 0x6f, 0x9c, 0x61, 0x25, - 0x26, 0x24, 0x47, 0xe2, 0x4a, 0x44, 0xe3, 0x8d, 0xc5, 0x4c, 0xd8, 0x0e, 0x64, 0xce, 0x48, 0x92, - 0xc4, 0x4a, 0xd0, 0x53, 0xdb, 0x35, 0xbd, 0xb3, 0xc1, 0xcc, 0x1a, 0x23, 0xc5, 0x19, 0x7b, 0x03, - 0xb2, 0xc1, 0x7c, 0x44, 0x92, 0xa4, 0xfc, 0x60, 0x6b, 0x69, 0x4f, 0xc0, 0x82, 0x82, 0xf9, 0x88, - 0xdd, 0x81, 0xdc, 0xd8, 0xf3, 0x7d, 0x21, 0x4d, 0x94, 0xa8, 0xc2, 0xd1, 0x76, 0x88, 0x4a, 0x21, - 0xe2, 0xb1, 0xc0, 0x90, 0x64, 0x48, 0x4c, 0x94, 0xec, 0x47, 0x58, 0x60, 0xc8, 0x6e, 0x8b, 0x4d, - 0xae, 0x22, 0xd7, 0x3a, 0xda, 0x02, 0x31, 0x1f, 0xc4, 0xe2, 0x20, 0x4d, 0x8d, 0x73, 0xd2, 0x38, - 0x63, 0xa2, 0x68, 0xef, 0xc3, 0x3a, 0x4d, 0x8d, 0x73, 0x76, 0x1b, 0xb2, 0xcf, 0xac, 0x31, 0x29, - 0x9f, 0x71, 0x69, 0x62, 0x90, 0x9e, 0x50, 0xf3, 0x10, 0x4d, 0xf3, 0xde, 0x73, 0x4c, 0xd2, 0x43, - 0xe3, 0xb1, 0xdc, 0xf3, 0x1c, 0xf3, 0x09, 0x8d, 0x25, 0x21, 0x71, 0xcb, 0x37, 0xe6, 0xe7, 0x28, - 0x8d, 0x14, 0xbe, 0x39, 0x1b, 0xf3, 0xf3, 0x8e, 0x89, 0xc2, 0xdf, 0x35, 0x9f, 0x91, 0xf6, 0x99, - 0xd1, 0xf0, 0x27, 0x9a, 0x47, 0x81, 0xe5, 0x58, 0xe3, 0xd0, 0x7e, 0x66, 0x87, 0x17, 0xa4, 0x5f, - 0x66, 0x34, 0x19, 0xb4, 0xbb, 0x01, 0x39, 0xeb, 0x7c, 0xe6, 0xab, 0xfb, 0x50, 0x10, 0xa5, 0x2c, - 0xd9, 0x58, 0xd7, 0xa0, 0x68, 0x07, 0xfa, 0xd8, 0x73, 0x83, 0x50, 0xe8, 0x4e, 0x05, 0x3b, 0x68, - 0x62, 0x12, 0xc5, 0xa5, 0x69, 0x84, 0x7c, 0x13, 0xaa, 0x68, 0xf4, 0x5b, 0x7d, 0x00, 0x90, 0x34, - 0x0b, 0xeb, 0xe4, 0x58, 0x6e, 0xa4, 0xa6, 0x39, 0x96, 0x1b, 0xf3, 0xac, 0x4b, 0x3c, 0xd7, 0xa0, - 0x14, 0x6b, 0xc6, 0xac, 0x02, 0x19, 0x43, 0x6c, 0x7f, 0x19, 0x43, 0xbd, 0x8b, 0x8a, 0x6a, 0xa4, - 0xfb, 0xa6, 0x71, 0x98, 0x8a, 0x36, 0xc5, 0xcc, 0x48, 0xfd, 0x3e, 0x54, 0x34, 0x2b, 0x98, 0x3b, - 0x61, 0xd3, 0x73, 0x5a, 0xd6, 0x84, 0xbd, 0x03, 0x10, 0xa7, 0x03, 0xa1, 0xa5, 0x24, 0x73, 0xb7, - 0x65, 0x4d, 0x34, 0x09, 0xaf, 0xfe, 0xe7, 0x1c, 0xe9, 0x7b, 0x2d, 0xae, 0x68, 0x09, 0x8d, 0x2a, - 0x23, 0x69, 0x54, 0xf1, 0xde, 0xb0, 0x9e, 0xd6, 0x2a, 0x4f, 0x6c, 0xd3, 0xb4, 0xdc, 0x48, 0x7b, - 0xe4, 0x29, 0x1c, 0x6c, 0xc3, 0x39, 0xa6, 0x05, 0x55, 0x7b, 0xc0, 0xa2, 0x42, 0xa7, 0x33, 0xdf, - 0x0a, 0x02, 0xae, 0xb7, 0x18, 0xce, 0x71, 0xb4, 0xb6, 0xf3, 0x2f, 0x5a, 0xdb, 0xd7, 0xa0, 0x88, - 0x5b, 0x1e, 0x59, 0x7d, 0x1b, 0xbc, 0xf7, 0x85, 0x79, 0xcb, 0xde, 0x84, 0x82, 0xd0, 0xd7, 0xc5, - 0xa2, 0x12, 0xd3, 0xa5, 0xc5, 0x81, 0x5a, 0x84, 0x65, 0x75, 0x54, 0xf2, 0xa6, 0x53, 0xcb, 0x0d, - 0xa3, 0x7d, 0x5a, 0x24, 0xd9, 0xdb, 0x50, 0xf2, 0x5c, 0x9d, 0x2b, 0xf5, 0x62, 0x55, 0x89, 0xe9, - 0xdb, 0x77, 0x8f, 0x08, 0xaa, 0x15, 0x3d, 0xf1, 0x0b, 0xab, 0xe2, 0x78, 0x67, 0xfa, 0xd8, 0xf0, - 0x4d, 0x5a, 0x59, 0x45, 0xad, 0xe0, 0x78, 0x67, 0x4d, 0xc3, 0x37, 0xb9, 0xde, 0xf2, 0xb5, 0x3b, - 0x9f, 0xd2, 0x6a, 0xaa, 0x6a, 0x22, 0xc5, 0x6e, 0x40, 0x69, 0xec, 0xcc, 0x83, 0xd0, 0xf2, 0x77, - 0x2f, 0xb8, 0x99, 0xa6, 0x25, 0x00, 0xac, 0xd7, 0xcc, 0xb7, 0xa7, 0x86, 0x7f, 0x41, 0x4b, 0xa7, - 0xa8, 0x45, 0x49, 0xda, 0x68, 0x4e, 0x6d, 0xf3, 0x9c, 0xdb, 0x6a, 0x1a, 0x4f, 0x20, 0xfd, 0x09, - 0x59, 0xd2, 0x01, 0xad, 0x8f, 0xa2, 0x16, 0x25, 0x69, 0x1c, 0xe8, 0x27, 0xad, 0x88, 0x92, 0x26, - 0x52, 0x29, 0xa5, 0x7b, 0xeb, 0xb9, 0x4a, 0x37, 0x5b, 0xd4, 0x7b, 0x3c, 0xdf, 0x3e, 0xb6, 0x85, - 0xd6, 0x72, 0x89, 0xeb, 0x3d, 0x1c, 0x44, 0x04, 0x9f, 0x40, 0xf5, 0xd8, 0x72, 0x2d, 0xdf, 0x08, - 0x2d, 0x53, 0x47, 0xb9, 0xb8, 0x4d, 0x1d, 0x27, 0x86, 0xf9, 0x71, 0x84, 0x42, 0x59, 0x53, 0x39, - 0x96, 0x52, 0xea, 0xd7, 0x50, 0x10, 0x63, 0x83, 0x5b, 0x17, 0xae, 0xbb, 0xb4, 0x5c, 0xe7, 0x5b, - 0x17, 0xc2, 0xd9, 0xeb, 0x50, 0x15, 0x95, 0x08, 0x42, 0xdf, 0x76, 0x8f, 0xc5, 0xac, 0xab, 0x70, - 0xe0, 0x80, 0x60, 0xa8, 0x61, 0xe0, 0xbc, 0xd0, 0x8d, 0x91, 0xed, 0xe0, 0xfa, 0xce, 0x0a, 0x6d, - 0x68, 0xee, 0x38, 0x0d, 0x0e, 0x52, 0xfb, 0x50, 0x8c, 0x46, 0xf2, 0x97, 0x52, 0xa6, 0x3a, 0x83, - 0x8a, 0xdc, 0xc2, 0x5f, 0x4e, 0x43, 0xb8, 0x06, 0x11, 0x84, 0x9e, 0x6f, 0x99, 0x91, 0x93, 0xc6, - 0x0e, 0x06, 0x94, 0x56, 0x7f, 0x33, 0x03, 0x65, 0xd2, 0x64, 0xfa, 0xa4, 0xa7, 0xb1, 0x77, 0x80, - 0x8d, 0x7d, 0xcb, 0x08, 0x2d, 0xdd, 0x3a, 0x0f, 0x7d, 0x43, 0xe8, 0x2b, 0x5c, 0xe9, 0x51, 0x38, - 0xa6, 0x8d, 0x08, 0xae, 0xb2, 0xdc, 0x82, 0xf2, 0xcc, 0xf0, 0x83, 0x48, 0xff, 0xe5, 0xa5, 0x03, - 0x07, 0x09, 0xed, 0x53, 0x71, 0x8f, 0x7d, 0x63, 0xaa, 0x87, 0xde, 0xa9, 0xe5, 0x72, 0xcd, 0x9f, - 0xdb, 0x3c, 0x35, 0x82, 0x0f, 0x11, 0x4c, 0x06, 0xc0, 0xbf, 0xcf, 0x40, 0xf5, 0x90, 0x4f, 0xd0, - 0xcf, 0xad, 0x8b, 0x16, 0x37, 0x34, 0xc7, 0x91, 0x70, 0xc9, 0x69, 0xf4, 0x9b, 0xdd, 0x84, 0xf2, - 0xec, 0xd4, 0xba, 0xd0, 0x53, 0x46, 0x59, 0x09, 0x41, 0x4d, 0x12, 0x23, 0x6f, 0xc1, 0x86, 0x47, - 0x0d, 0x11, 0xdb, 0xb1, 0xd8, 0xc5, 0xa4, 0x16, 0x6a, 0x82, 0x00, 0x35, 0xbb, 0x38, 0x2b, 0x59, - 0x85, 0x14, 0x99, 0x51, 0xf5, 0xb7, 0x21, 0x8f, 0xa8, 0xa0, 0x9e, 0xe7, 0x2a, 0x19, 0x25, 0xd8, - 0xfb, 0x50, 0x1d, 0x7b, 0xd3, 0x99, 0x1e, 0xb1, 0x8b, 0x8d, 0x39, 0x2d, 0xfe, 0xca, 0x48, 0x72, - 0xc8, 0xf3, 0x52, 0x7f, 0x37, 0x0b, 0x45, 0xaa, 0x83, 0x90, 0x80, 0xb6, 0x79, 0x1e, 0x49, 0xc0, - 0x92, 0x96, 0xb7, 0x4d, 0xdc, 0x60, 0x5e, 0xa2, 0x45, 0xc6, 0xda, 0x61, 0x56, 0xd6, 0x0e, 0xaf, - 0xc0, 0x86, 0x50, 0x0d, 0x73, 0x5c, 0x44, 0xce, 0x9f, 0xaf, 0x18, 0xe6, 0x57, 0x29, 0x86, 0x38, - 0x84, 0x9c, 0xc6, 0x3a, 0xc7, 0xad, 0x98, 0x4b, 0x41, 0x20, 0x50, 0x1b, 0x21, 0xb2, 0x7c, 0x2b, - 0xa4, 0xe5, 0x5b, 0x1d, 0x0a, 0xcf, 0xec, 0xc0, 0xc6, 0x09, 0x52, 0xe4, 0x12, 0x43, 0x24, 0xa5, - 0x61, 0x28, 0xbd, 0x6c, 0x18, 0xe2, 0x66, 0x1b, 0xce, 0x31, 0xb7, 0x50, 0xa2, 0x66, 0x37, 0x9c, - 0x63, 0x8f, 0x7d, 0x00, 0x97, 0x13, 0xb4, 0x68, 0x0d, 0x79, 0xf2, 0xc8, 0x59, 0xa5, 0xb1, 0x98, - 0x92, 0x5a, 0x44, 0x26, 0xe4, 0x3d, 0xd8, 0x92, 0x58, 0x66, 0xa8, 0x89, 0x05, 0x24, 0x1e, 0x4b, - 0xda, 0x66, 0x4c, 0x4e, 0x0a, 0x5a, 0xa0, 0xfe, 0xb3, 0x75, 0xa8, 0xee, 0x79, 0xbe, 0x65, 0x1f, - 0xbb, 0xc9, 0xac, 0x5b, 0x32, 0x52, 0xa2, 0x99, 0xb8, 0x2e, 0xcd, 0xc4, 0x5b, 0x50, 0x9e, 0x70, - 0x46, 0x3d, 0x1c, 0x71, 0xff, 0x46, 0x4e, 0x03, 0x01, 0x1a, 0x8e, 0x1c, 0x94, 0x1f, 0x11, 0x01, - 0x31, 0xe7, 0x88, 0x39, 0x62, 0xc2, 0x6d, 0x91, 0x7d, 0x8f, 0x36, 0x08, 0xd3, 0x72, 0xac, 0x90, - 0x0f, 0x4f, 0xed, 0xc1, 0xab, 0x91, 0x52, 0x22, 0xd5, 0xe9, 0xbe, 0x66, 0x4d, 0x1a, 0xa4, 0xc9, - 0xe1, 0x7e, 0xd1, 0x22, 0x72, 0xc1, 0x2b, 0x36, 0x97, 0x8d, 0x6f, 0xc8, 0xcb, 0x65, 0x95, 0x3a, - 0x84, 0x52, 0x0c, 0x46, 0xb5, 0x5c, 0x6b, 0x0b, 0x55, 0x7c, 0x8d, 0x95, 0xa1, 0xd0, 0x6c, 0x0c, - 0x9a, 0x8d, 0x56, 0x5b, 0xc9, 0x20, 0x6a, 0xd0, 0x1e, 0x72, 0xf5, 0x7b, 0x9d, 0x6d, 0x42, 0x19, - 0x53, 0xad, 0xf6, 0x5e, 0xe3, 0xa8, 0x3b, 0x54, 0xb2, 0xac, 0x0a, 0xa5, 0x5e, 0x5f, 0x6f, 0x34, - 0x87, 0x9d, 0x7e, 0x4f, 0xc9, 0xa9, 0x3f, 0x82, 0x62, 0xf3, 0xc4, 0x1a, 0x9f, 0x3e, 0xaf, 0x17, - 0xc9, 0x3f, 0x60, 0x8d, 0x4f, 0x85, 0x2a, 0xbd, 0xe0, 0x1f, 0xb0, 0xc6, 0xa7, 0x6a, 0x1b, 0x4a, - 0x87, 0x86, 0x1f, 0xda, 0x54, 0xaf, 0x47, 0x50, 0x8d, 0x13, 0x2d, 0x6b, 0x12, 0x29, 0x19, 0x2c, - 0x56, 0xb0, 0x63, 0x94, 0x96, 0x26, 0x54, 0xdf, 0x81, 0x8a, 0x0c, 0x60, 0x37, 0x20, 0x6b, 0x5a, - 0x93, 0x15, 0x42, 0x14, 0xc1, 0xea, 0x13, 0xa8, 0x34, 0xa3, 0x4d, 0xf3, 0x79, 0x55, 0x7f, 0x00, - 0x35, 0x5a, 0xf1, 0xe3, 0x51, 0xb4, 0xe4, 0xd7, 0x57, 0x2c, 0xf9, 0x0a, 0xd2, 0x34, 0x47, 0x62, - 0xcd, 0x7f, 0x04, 0xe5, 0x43, 0xdf, 0x9b, 0x59, 0x7e, 0x48, 0xd9, 0x2a, 0x90, 0x3d, 0xb5, 0x2e, - 0x44, 0xae, 0xf8, 0x33, 0x71, 0xdb, 0xac, 0xcb, 0x6e, 0x9b, 0x07, 0x50, 0x8c, 0xd8, 0xbe, 0x31, - 0xcf, 0x0f, 0x51, 0x74, 0x12, 0x8f, 0x6d, 0x05, 0x58, 0xd8, 0x7d, 0x80, 0x59, 0x0c, 0x10, 0x1d, - 0x17, 0x59, 0x26, 0x22, 0x73, 0x4d, 0xa2, 0x50, 0x5f, 0x85, 0xc2, 0x13, 0xdb, 0x3a, 0x13, 0xcd, - 0x7f, 0x66, 0x5b, 0x67, 0x51, 0xf3, 0xf1, 0xb7, 0xfa, 0xe7, 0x25, 0x28, 0xd2, 0xfa, 0x6a, 0x3d, - 0xdf, 0x53, 0xf6, 0x6d, 0x14, 0xb8, 0x1d, 0xb1, 0x9e, 0x72, 0x2b, 0xd4, 0x46, 0xbe, 0xba, 0x5e, - 0x05, 0x90, 0xd6, 0x3a, 0x97, 0x5c, 0xa5, 0x30, 0x5e, 0xe2, 0xa8, 0xf9, 0xd0, 0x5e, 0x14, 0x7c, - 0xed, 0x08, 0x83, 0x37, 0x01, 0xb0, 0xfb, 0x5c, 0x2f, 0x21, 0x13, 0x97, 0xeb, 0x6e, 0x97, 0x22, - 0xfb, 0x63, 0xe4, 0x58, 0x91, 0x55, 0x44, 0xca, 0x0a, 0x26, 0x48, 0x8e, 0x59, 0x7e, 0x80, 0xe2, - 0x8a, 0x5c, 0xe9, 0x5a, 0x94, 0x64, 0x6f, 0x42, 0x0e, 0x85, 0xbc, 0xb0, 0x62, 0x2e, 0x45, 0x3d, - 0x28, 0xed, 0x52, 0x1a, 0x11, 0xb0, 0xbb, 0x50, 0x20, 0xd1, 0x62, 0xa1, 0xa4, 0x91, 0x7a, 0x3b, - 0x12, 0xfa, 0x5a, 0x84, 0x66, 0x6f, 0x41, 0x7e, 0x72, 0x6a, 0x5d, 0x04, 0xf5, 0x2a, 0xd1, 0x5d, - 0x5a, 0xb1, 0x66, 0x35, 0x4e, 0xc1, 0x6e, 0x43, 0xcd, 0xb7, 0x26, 0x3a, 0xf9, 0xce, 0x50, 0xc8, - 0x04, 0xf5, 0x1a, 0xc9, 0x90, 0x8a, 0x6f, 0x4d, 0x9a, 0x08, 0x1c, 0x8e, 0x9c, 0x80, 0xdd, 0x81, - 0x0d, 0x5a, 0x3d, 0xa8, 0xb6, 0x49, 0x25, 0x47, 0x4b, 0x51, 0x13, 0x58, 0xf6, 0x01, 0x80, 0x50, - 0x0e, 0xf5, 0xd1, 0x05, 0xf9, 0x9c, 0xe3, 0xc5, 0x24, 0xcf, 0x7f, 0x59, 0x85, 0x7c, 0x13, 0xf2, - 0x38, 0x49, 0x82, 0xfa, 0x55, 0xca, 0x79, 0x2b, 0x3d, 0x83, 0xa8, 0xa6, 0x84, 0x67, 0x77, 0xa1, - 0x88, 0x13, 0x45, 0xc7, 0xe1, 0xa8, 0xcb, 0xda, 0xb2, 0x98, 0x55, 0xb8, 0x33, 0x58, 0x67, 0x83, - 0xaf, 0x1d, 0x76, 0x0f, 0x72, 0x26, 0x2e, 0xe6, 0x6b, 0x94, 0xe3, 0x15, 0x69, 0x5c, 0x50, 0x58, - 0xb5, 0xac, 0x09, 0x29, 0xf0, 0x44, 0xc3, 0xf6, 0xa1, 0x86, 0xd3, 0xe8, 0x01, 0x6d, 0xf6, 0xd8, - 0x7d, 0xf5, 0xeb, 0xc4, 0xf5, 0xda, 0x02, 0x57, 0x4f, 0x10, 0x51, 0x67, 0xb7, 0xdd, 0xd0, 0xbf, - 0xd0, 0xaa, 0xae, 0x0c, 0x63, 0xd7, 0xd1, 0xca, 0xea, 0x7a, 0xe3, 0x53, 0xcb, 0xac, 0xbf, 0x12, - 0x69, 0x40, 0x3c, 0xcd, 0x3e, 0x85, 0x2a, 0x4d, 0x2c, 0x4c, 0x62, 0xe1, 0xf5, 0x1b, 0x24, 0x4c, - 0xe5, 0x29, 0x13, 0xa1, 0xb4, 0x34, 0x25, 0x8a, 0x78, 0x3b, 0xd0, 0x43, 0x6b, 0x3a, 0xf3, 0x7c, - 0xd4, 0xb3, 0x5f, 0x8d, 0x7c, 0x43, 0xc3, 0x08, 0x84, 0x1b, 0x71, 0x7c, 0x42, 0xa6, 0x7b, 0x93, - 0x49, 0x60, 0x85, 0xf5, 0x9b, 0xb4, 0x6e, 0x6a, 0xd1, 0x41, 0x59, 0x9f, 0xa0, 0xb4, 0x11, 0x06, - 0xba, 0x79, 0xe1, 0x1a, 0x53, 0x7b, 0x5c, 0xbf, 0xc5, 0xd5, 0x79, 0x3b, 0x68, 0x71, 0x80, 0xac, - 0x51, 0xef, 0xa4, 0x34, 0xea, 0x4b, 0x90, 0x37, 0x47, 0xb8, 0x1c, 0x5f, 0xa3, 0x6c, 0x73, 0xe6, - 0xa8, 0x63, 0xb2, 0x77, 0xa1, 0x34, 0x8b, 0x44, 0x60, 0x5d, 0x95, 0xfd, 0x06, 0xb1, 0x64, 0xd4, - 0x12, 0x0a, 0x34, 0x65, 0xf7, 0x2c, 0x23, 0x9c, 0xfb, 0xd6, 0x9e, 0x63, 0x1c, 0xd7, 0x5f, 0xa7, - 0x9c, 0x64, 0x10, 0xd6, 0xce, 0xf1, 0x8e, 0xed, 0xb1, 0x41, 0x2b, 0xff, 0x36, 0xd7, 0xbb, 0x04, - 0xa4, 0x63, 0x26, 0x8a, 0xa8, 0x21, 0x94, 0xa9, 0x37, 0x64, 0x45, 0xd4, 0x20, 0x6d, 0xea, 0xfa, - 0x63, 0xd2, 0xd0, 0xa9, 0xe7, 0x3e, 0x5a, 0x10, 0x50, 0xa9, 0xe5, 0x25, 0x49, 0xb2, 0xfd, 0x35, - 0x59, 0x4e, 0xed, 0xe6, 0x49, 0x92, 0x5f, 0xff, 0x11, 0xb0, 0xe5, 0x31, 0x7f, 0x99, 0xb4, 0xcc, - 0x0b, 0x69, 0xf9, 0xbd, 0xf5, 0x47, 0x19, 0xf5, 0x09, 0x54, 0x53, 0xc2, 0x60, 0xa5, 0xd4, 0xe7, - 0x2a, 0x97, 0x31, 0x15, 0xd6, 0x34, 0x4f, 0x44, 0xea, 0xb4, 0xed, 0x1e, 0x0b, 0x47, 0x1e, 0x57, - 0xa7, 0x29, 0xad, 0xfe, 0x59, 0x16, 0x2a, 0xfb, 0x46, 0x70, 0x72, 0x60, 0xcc, 0x06, 0xa1, 0x11, - 0x06, 0x38, 0x45, 0x4e, 0x8c, 0xe0, 0x64, 0x6a, 0xcc, 0xb8, 0xf2, 0x9b, 0xe1, 0x5e, 0x02, 0x01, - 0x43, 0xcd, 0x17, 0x27, 0x27, 0x26, 0xfb, 0xee, 0xe1, 0xe7, 0xc2, 0x05, 0x10, 0xa7, 0x51, 0x34, - 0x05, 0x27, 0xf3, 0xc9, 0x24, 0x2e, 0x2a, 0x4a, 0xb2, 0xdb, 0x50, 0x15, 0x3f, 0x49, 0xf3, 0x3d, - 0x17, 0xa7, 0xac, 0x69, 0x20, 0x7b, 0x08, 0x65, 0x01, 0x18, 0x46, 0x82, 0xb4, 0x16, 0xbb, 0x76, - 0x12, 0x84, 0x26, 0x53, 0xb1, 0x1f, 0xc3, 0x65, 0x29, 0xb9, 0xe7, 0xf9, 0x07, 0x73, 0x27, 0xb4, - 0x9b, 0x3d, 0xa1, 0x66, 0xbc, 0xb2, 0xc4, 0x9e, 0x90, 0x68, 0xab, 0x39, 0xd3, 0xb5, 0x3d, 0xb0, - 0x5d, 0x92, 0xcb, 0x59, 0x2d, 0x0d, 0x5c, 0xa0, 0x32, 0xce, 0x49, 0x1c, 0xa7, 0xa9, 0x8c, 0x73, - 0x5c, 0xb0, 0x02, 0x70, 0x60, 0x85, 0x27, 0x9e, 0x49, 0x3a, 0x66, 0xbc, 0x60, 0x07, 0x32, 0x4a, - 0x4b, 0x53, 0x62, 0x77, 0xa2, 0xfd, 0x36, 0x76, 0x43, 0xd2, 0x34, 0xb3, 0x5a, 0x94, 0xc4, 0xad, - 0xca, 0x37, 0xdc, 0x63, 0x2b, 0xa8, 0x97, 0x77, 0xb2, 0x77, 0x33, 0x9a, 0x48, 0xa9, 0x7f, 0x7b, - 0x1d, 0xf2, 0x7c, 0x24, 0x5f, 0x81, 0xd2, 0x88, 0x7c, 0xe3, 0x68, 0x88, 0x0b, 0x7f, 0x37, 0x01, - 0x7a, 0xf3, 0x29, 0xd7, 0x10, 0x85, 0x0b, 0x27, 0xa3, 0xd1, 0x6f, 0xcc, 0xd2, 0x9b, 0x87, 0x58, - 0x56, 0x96, 0xa0, 0x22, 0x85, 0x95, 0xf0, 0xbd, 0x33, 0x9a, 0x0d, 0x39, 0x42, 0x44, 0x49, 0x72, - 0xa9, 0xd3, 0xae, 0x87, 0x4c, 0x79, 0xc2, 0x15, 0x09, 0xd0, 0x74, 0xc3, 0x45, 0x77, 0xd3, 0xc6, - 0x92, 0xbb, 0x89, 0xdd, 0x04, 0xd4, 0x3f, 0xc7, 0x56, 0xdf, 0xb5, 0x9a, 0x3d, 0xea, 0xe1, 0xa2, - 0x26, 0x41, 0x70, 0x81, 0x98, 0xde, 0x8c, 0x3a, 0x35, 0xaf, 0xe1, 0x4f, 0xf6, 0x71, 0x3c, 0x3b, - 0xa9, 0x8d, 0x42, 0x5b, 0x17, 0xbb, 0x82, 0x3c, 0x8f, 0xb5, 0x14, 0x1d, 0xe6, 0x84, 0xa2, 0x9e, - 0x6b, 0xeb, 0xf8, 0x53, 0x6d, 0x03, 0x68, 0xde, 0x59, 0x60, 0x85, 0xe4, 0x57, 0xbd, 0x4a, 0x4d, - 0x4c, 0x9d, 0x88, 0x79, 0x67, 0x87, 0x5e, 0x10, 0x1b, 0xb4, 0xeb, 0xab, 0x0d, 0x5a, 0xf5, 0x3d, - 0x28, 0xa0, 0x1e, 0x60, 0x84, 0x06, 0xbb, 0x2d, 0x5c, 0x59, 0x5c, 0x7b, 0x11, 0x3e, 0xbd, 0xa4, - 0x0c, 0xe1, 0xdc, 0xea, 0x46, 0xe5, 0x12, 0xcf, 0x6b, 0x92, 0xc9, 0x18, 0xef, 0x41, 0x22, 0x43, - 0xa1, 0x59, 0xbc, 0x02, 0x25, 0xac, 0x1a, 0x1d, 0x13, 0x08, 0xb9, 0x50, 0xf4, 0xbd, 0xb3, 0x26, - 0xa6, 0xd5, 0xff, 0x90, 0x81, 0x72, 0xdf, 0x37, 0x71, 0xf3, 0x1b, 0xcc, 0xac, 0xf1, 0x4b, 0xed, - 0x6f, 0xd4, 0x43, 0x3c, 0xc7, 0x31, 0x48, 0xcc, 0x0a, 0x93, 0x2d, 0x06, 0xb0, 0x0f, 0x20, 0x37, - 0x41, 0x71, 0x9a, 0x95, 0xb5, 0x73, 0x29, 0xfb, 0xe8, 0x37, 0x0a, 0x58, 0x8d, 0x48, 0xd5, 0x5f, - 0x8b, 0xcb, 0x27, 0xa9, 0x2b, 0x3b, 0xd3, 0xd7, 0xe8, 0x58, 0x6b, 0xd0, 0x54, 0x32, 0xac, 0x08, - 0xb9, 0x56, 0x7b, 0xd0, 0xe4, 0x3a, 0x39, 0x6a, 0xe7, 0x03, 0x7d, 0xaf, 0xa3, 0x0d, 0x86, 0x4a, - 0x8e, 0xce, 0xc9, 0x08, 0xd0, 0x6d, 0x0c, 0x86, 0x4a, 0x91, 0x01, 0x6c, 0x1c, 0xf5, 0x3a, 0x3f, - 0x3e, 0x6a, 0x2b, 0x8a, 0xfa, 0xaf, 0x32, 0x00, 0x89, 0xcf, 0x97, 0xbd, 0x0d, 0xe5, 0x33, 0x4a, - 0xe9, 0xd2, 0x61, 0x80, 0xdc, 0x46, 0xe0, 0x68, 0xd2, 0x91, 0xde, 0x85, 0x4a, 0xbc, 0x5d, 0xa0, - 0xfe, 0xb0, 0x7c, 0x2a, 0x50, 0x8e, 0xf1, 0xbb, 0x17, 0xec, 0x1d, 0x28, 0x7a, 0xd8, 0x0e, 0x24, - 0xcd, 0xca, 0xca, 0x83, 0xd4, 0x7c, 0xad, 0xe0, 0xf1, 0x04, 0xea, 0x19, 0x13, 0x3f, 0x32, 0xc1, - 0x63, 0xd2, 0x3d, 0x04, 0x35, 0x1d, 0x63, 0x1e, 0x58, 0x1a, 0xc7, 0xc7, 0x52, 0x3a, 0x9f, 0x48, - 0x69, 0xf5, 0x27, 0x50, 0x1b, 0x18, 0xd3, 0x19, 0x97, 0xe5, 0xd4, 0x30, 0x06, 0x39, 0x9c, 0x13, - 0x62, 0xea, 0xd1, 0x6f, 0x5c, 0x74, 0x87, 0x96, 0x3f, 0xb6, 0xdc, 0x68, 0x8d, 0x46, 0x49, 0x14, - 0xbf, 0x47, 0x28, 0xcd, 0x35, 0xef, 0x2c, 0x12, 0xe7, 0x51, 0x5a, 0xfd, 0x7b, 0x19, 0x28, 0x4b, - 0xd5, 0x60, 0xef, 0x41, 0x8e, 0x14, 0xd2, 0x8c, 0x2c, 0x08, 0x25, 0x02, 0xfe, 0x9b, 0xab, 0x30, - 0x48, 0xc8, 0xee, 0x40, 0x3e, 0x08, 0x0d, 0x3f, 0x3a, 0x3e, 0x50, 0x24, 0x8e, 0x5d, 0x6f, 0xee, - 0x9a, 0x1a, 0x47, 0x33, 0x15, 0xb2, 0x96, 0x6b, 0x0a, 0xa7, 0xc5, 0x32, 0x15, 0x22, 0xd5, 0x1d, - 0x28, 0xc5, 0xd9, 0xe3, 0x14, 0xd0, 0xfa, 0x4f, 0x07, 0xca, 0x1a, 0x2b, 0x41, 0x5e, 0x6b, 0xf4, - 0x1e, 0xb7, 0x95, 0x8c, 0xfa, 0x07, 0x19, 0x80, 0x84, 0x8b, 0xdd, 0x4f, 0xd5, 0xf6, 0xfa, 0x62, - 0xae, 0xf7, 0xe9, 0xaf, 0x54, 0xd9, 0x1b, 0x50, 0x9a, 0xbb, 0x04, 0xb4, 0x4c, 0xb1, 0x13, 0x25, - 0x00, 0xb4, 0xa2, 0xa2, 0x60, 0x97, 0x05, 0x2b, 0xea, 0x99, 0xe1, 0xa8, 0xdf, 0x83, 0x52, 0x9c, - 0x1d, 0x1a, 0x86, 0x7b, 0xfd, 0x6e, 0xb7, 0xff, 0xb4, 0xd3, 0x7b, 0xac, 0xac, 0x61, 0xf2, 0x50, - 0x6b, 0x37, 0xdb, 0x2d, 0x4c, 0x66, 0x70, 0xce, 0x36, 0x8f, 0x34, 0xad, 0xdd, 0x1b, 0xea, 0x5a, - 0xff, 0xa9, 0xb2, 0xae, 0xfe, 0xff, 0x39, 0xd8, 0xea, 0xbb, 0xad, 0xf9, 0xcc, 0xb1, 0xc7, 0x46, - 0x68, 0x7d, 0x6e, 0x5d, 0x34, 0xc3, 0x73, 0xdc, 0x7d, 0x8d, 0x30, 0xf4, 0xf9, 0x62, 0x2e, 0x69, - 0x3c, 0xc1, 0x1d, 0x1b, 0x81, 0xe5, 0x87, 0xe4, 0xb7, 0x91, 0x57, 0x71, 0x8d, 0xc3, 0x9b, 0x9e, - 0x43, 0x6b, 0x99, 0xfd, 0x00, 0x2e, 0x73, 0x67, 0x08, 0xa7, 0x44, 0x25, 0x58, 0xa7, 0xc5, 0x9c, - 0x5d, 0x9a, 0xba, 0x8c, 0x13, 0x22, 0x2b, 0x92, 0x91, 0x08, 0xbb, 0x05, 0xe5, 0x84, 0x3d, 0x3a, - 0x93, 0x83, 0x98, 0x90, 0x6a, 0x82, 0xc6, 0x7b, 0x54, 0x6b, 0xdd, 0x36, 0xcf, 0xc9, 0x4d, 0x94, - 0xd7, 0x6a, 0x5e, 0xd2, 0x18, 0xdc, 0x84, 0xbf, 0x80, 0xad, 0x14, 0x25, 0xd5, 0x62, 0x83, 0x6a, - 0xf1, 0x4e, 0xe4, 0x0f, 0x5e, 0x68, 0xbd, 0x0c, 0xc1, 0xea, 0x70, 0xad, 0x76, 0xd3, 0x4b, 0x43, - 0x85, 0x2e, 0x62, 0x1f, 0xbb, 0x9e, 0x6f, 0x09, 0x81, 0x5f, 0xb4, 0x83, 0x0e, 0xa5, 0x13, 0x1b, - 0x4a, 0x3a, 0x43, 0xe6, 0xfb, 0x4b, 0x74, 0x3c, 0xca, 0xd1, 0x36, 0xdf, 0x41, 0x73, 0x5a, 0x81, - 0xd2, 0x5c, 0x9b, 0xe3, 0xa8, 0xc8, 0x2c, 0x02, 0x32, 0x8b, 0x2a, 0x04, 0x7c, 0xc2, 0x61, 0xd7, - 0x7b, 0xb0, 0xbd, 0xaa, 0x92, 0x2b, 0xd4, 0xb0, 0x1d, 0x59, 0x0d, 0x5b, 0x30, 0xfc, 0x13, 0x95, - 0xec, 0xb7, 0x32, 0x50, 0xed, 0x3b, 0x26, 0x0e, 0x82, 0x31, 0x43, 0xbd, 0x93, 0xfd, 0x10, 0xb6, - 0x46, 0x73, 0xb4, 0x7d, 0x66, 0x8e, 0x31, 0xb6, 0x4e, 0x3c, 0xc7, 0xb4, 0x22, 0x51, 0x9c, 0x3a, - 0x26, 0x13, 0x1e, 0x7d, 0x85, 0x88, 0x0f, 0x13, 0x5a, 0xf6, 0x11, 0x54, 0x66, 0xbe, 0x37, 0xb2, - 0xf4, 0xc0, 0x9b, 0xfb, 0x63, 0x6b, 0xc9, 0x68, 0x4f, 0x78, 0xcb, 0x44, 0x37, 0x20, 0x32, 0xf5, - 0x7f, 0x65, 0xa0, 0xd2, 0xb2, 0xcc, 0xf9, 0xec, 0x33, 0xcf, 0x76, 0x71, 0x2a, 0x7e, 0x08, 0x15, - 0xcf, 0x21, 0x6f, 0xb4, 0x2e, 0x05, 0x65, 0xac, 0xca, 0x07, 0x3c, 0x6a, 0x01, 0x85, 0x70, 0xbc, - 0x0b, 0x97, 0xb8, 0x7b, 0x46, 0x78, 0x2b, 0xcf, 0x39, 0xf3, 0x3a, 0xcd, 0x11, 0x85, 0xa3, 0xb8, - 0x9a, 0x46, 0xe4, 0xbf, 0x02, 0xdb, 0x12, 0x39, 0xce, 0x11, 0x4e, 0xbf, 0x3c, 0x5d, 0xb7, 0x62, - 0xde, 0x38, 0x5c, 0xe4, 0x33, 0xd8, 0x8e, 0x6a, 0x38, 0xe6, 0xbd, 0xc7, 0x99, 0x73, 0xb2, 0x91, - 0x99, 0xea, 0x5d, 0x51, 0xe1, 0x2d, 0x4f, 0x06, 0x62, 0x5e, 0xea, 0x6f, 0xad, 0x43, 0x89, 0x3b, - 0x8a, 0xb0, 0xed, 0x77, 0xa1, 0xe0, 0x8d, 0xbe, 0xd2, 0xfd, 0xd8, 0x81, 0xb2, 0x74, 0x5c, 0xbc, - 0xe1, 0x8d, 0xbe, 0xd2, 0xac, 0x09, 0x7b, 0x3b, 0xd2, 0x5e, 0x4c, 0x6b, 0x22, 0xba, 0xba, 0x96, - 0xb6, 0xd4, 0x84, 0x36, 0xd3, 0xb2, 0x26, 0xa8, 0x98, 0x26, 0xeb, 0x38, 0xa8, 0x17, 0x9e, 0xdf, - 0xa3, 0xf1, 0xb2, 0x0e, 0x90, 0x89, 0x3b, 0xcb, 0x38, 0x53, 0xf1, 0xf9, 0x4c, 0x9c, 0x8c, 0x98, - 0x3e, 0x85, 0x5a, 0xb2, 0x73, 0x11, 0x5f, 0xe9, 0xb9, 0x7c, 0xd5, 0x98, 0x92, 0x8e, 0xad, 0xfe, - 0x41, 0x06, 0x4a, 0x1d, 0x5e, 0x7c, 0x78, 0xce, 0x5e, 0x83, 0xec, 0x0b, 0x7a, 0x01, 0x71, 0xec, - 0x1e, 0x6c, 0x19, 0xa6, 0xa9, 0x1b, 0x93, 0x89, 0x35, 0x0e, 0x2d, 0x53, 0x47, 0xc5, 0x4e, 0x48, - 0xd2, 0x4d, 0xc3, 0x34, 0x1b, 0x02, 0x4e, 0x3b, 0x12, 0x4a, 0xb2, 0x40, 0x8f, 0x4c, 0xf2, 0x24, - 0x2e, 0xa0, 0xa8, 0xd5, 0xec, 0x40, 0x58, 0xe4, 0xdc, 0xcb, 0x9e, 0xea, 0xd8, 0xdc, 0x8b, 0x3b, - 0x56, 0x65, 0x00, 0x9a, 0x45, 0x0b, 0xa6, 0x19, 0x9e, 0x7f, 0x96, 0x2b, 0x66, 0x14, 0x50, 0xff, - 0x79, 0x19, 0xca, 0x0d, 0xd7, 0x70, 0x2e, 0x7e, 0x6a, 0x51, 0x50, 0x03, 0xf9, 0x5c, 0x67, 0xf3, - 0x90, 0xd7, 0x8f, 0x9f, 0xf8, 0x95, 0x08, 0x42, 0x35, 0xbb, 0x05, 0x65, 0x6f, 0x1e, 0xc6, 0x78, - 0x7e, 0x06, 0x08, 0x1c, 0x44, 0x04, 0x31, 0x7f, 0xec, 0xcf, 0x8f, 0xf8, 0xc9, 0xa0, 0x49, 0xf8, - 0x63, 0x25, 0x37, 0xe6, 0x27, 0x02, 0x94, 0x2f, 0xf6, 0xd4, 0xa2, 0x63, 0xcf, 0xf9, 0xd4, 0x32, - 0x79, 0x34, 0x24, 0x0f, 0xb0, 0x6b, 0x0a, 0x18, 0xe6, 0x32, 0xb5, 0xa6, 0x9e, 0x7f, 0xc1, 0x73, - 0xd9, 0xe0, 0xb9, 0x70, 0x10, 0xe5, 0xf2, 0x0e, 0xb0, 0x33, 0xc3, 0x0e, 0xf5, 0x74, 0x56, 0xdc, - 0xb0, 0x50, 0x10, 0x33, 0x94, 0xb3, 0xbb, 0x02, 0x1b, 0xa6, 0x1d, 0x9c, 0x76, 0xfa, 0xc2, 0xa8, - 0x10, 0x29, 0x6c, 0x4b, 0x30, 0x36, 0x50, 0xa7, 0x09, 0x2d, 0xae, 0x00, 0x67, 0xb5, 0x12, 0x42, - 0x76, 0x11, 0x80, 0x7b, 0xa2, 0x6b, 0x85, 0x67, 0x9e, 0x8f, 0x9c, 0xdc, 0x66, 0x48, 0x00, 0xa8, - 0x3b, 0x20, 0x29, 0x16, 0x44, 0x3e, 0xa2, 0xac, 0x16, 0xa7, 0x51, 0x1b, 0xe7, 0x53, 0x97, 0xb0, - 0x15, 0x5e, 0xfd, 0x04, 0xc2, 0x6e, 0x43, 0x8d, 0xaa, 0x4f, 0x36, 0x05, 0xb6, 0x81, 0x8e, 0xe9, - 0xb2, 0x5a, 0x05, 0xa1, 0xe4, 0x62, 0x40, 0xaa, 0x4f, 0xe1, 0x5a, 0xaa, 0x7d, 0xba, 0xe1, 0xfb, - 0xc6, 0x85, 0x3e, 0x35, 0xbe, 0xf2, 0x7c, 0x72, 0x07, 0x65, 0xb5, 0x2b, 0x72, 0xb7, 0x35, 0x10, - 0x7d, 0x80, 0xd8, 0xe7, 0xb2, 0xda, 0xae, 0xe7, 0x93, 0xaf, 0x68, 0x25, 0x2b, 0x62, 0xc9, 0xb1, - 0x41, 0x03, 0x4c, 0x06, 0x4e, 0xc0, 0x03, 0x33, 0xb5, 0x32, 0xc1, 0x76, 0x09, 0x84, 0x2a, 0x7e, - 0xf0, 0x90, 0x0b, 0x99, 0x2d, 0x11, 0x25, 0xf5, 0x90, 0x44, 0x11, 0x47, 0x9c, 0x58, 0x86, 0x49, - 0x47, 0x7f, 0x84, 0xd8, 0xb7, 0x0c, 0x3a, 0x58, 0x0f, 0x1e, 0xea, 0xb3, 0x79, 0xc8, 0x23, 0x2a, - 0xb5, 0x7c, 0xf0, 0xf0, 0x70, 0x1e, 0x0a, 0xf0, 0xb1, 0x15, 0xd2, 0x49, 0x1f, 0x81, 0x1f, 0x5b, - 0x21, 0x6e, 0x6d, 0xc1, 0xc3, 0xc8, 0x37, 0x7e, 0x59, 0xf4, 0xed, 0x43, 0xe1, 0xfc, 0x56, 0xa1, - 0x1a, 0x23, 0xf5, 0xe9, 0x9c, 0x87, 0x50, 0x66, 0xb5, 0x72, 0x44, 0x70, 0x30, 0x77, 0x70, 0x60, - 0xc7, 0xc6, 0xf8, 0xc4, 0xd2, 0x7d, 0xac, 0xca, 0x55, 0x3e, 0x74, 0x04, 0xd1, 0xb0, 0x36, 0xaf, - 0x00, 0x4f, 0xe8, 0x27, 0x76, 0x48, 0x3e, 0xab, 0xac, 0x56, 0x24, 0xc0, 0xbe, 0x1d, 0xe2, 0x3a, - 0xe6, 0x48, 0x31, 0x03, 0x29, 0x8b, 0x6b, 0x44, 0xb4, 0x49, 0x88, 0x03, 0x82, 0x53, 0x46, 0x77, - 0x41, 0x49, 0xd1, 0x62, 0x7e, 0xd7, 0x89, 0xb4, 0x26, 0x91, 0x62, 0xae, 0x77, 0x80, 0x33, 0xeb, - 0x38, 0xf5, 0x78, 0x9e, 0xaf, 0x70, 0x03, 0x97, 0xc0, 0x2d, 0x3b, 0x38, 0xa5, 0x1c, 0x6f, 0x43, - 0x4d, 0xa2, 0xc3, 0xfc, 0x6e, 0xf0, 0x99, 0x11, 0x93, 0xa5, 0xea, 0xe8, 0x5b, 0x53, 0x2f, 0x14, - 0xcd, 0x7c, 0x55, 0xaa, 0xa3, 0x46, 0xf0, 0x74, 0x1d, 0x05, 0x2d, 0xe6, 0x79, 0x53, 0xaa, 0x23, - 0x27, 0xc5, 0x5c, 0x5f, 0x83, 0xca, 0x99, 0x6f, 0x87, 0xa1, 0xe5, 0xf2, 0xc5, 0x7f, 0x8b, 0x77, - 0xac, 0x80, 0xd1, 0xea, 0x7f, 0x0d, 0x2a, 0xbc, 0xe7, 0x85, 0x7c, 0xdb, 0xe1, 0x24, 0x02, 0x16, - 0x09, 0x08, 0xd1, 0x1b, 0x53, 0xdb, 0x25, 0xc7, 0x54, 0x56, 0x2b, 0x71, 0x08, 0xda, 0xf9, 0x12, - 0xda, 0x38, 0x27, 0xf7, 0x54, 0x82, 0x36, 0xce, 0x69, 0x49, 0xce, 0x6c, 0xc7, 0xe1, 0x0b, 0xff, - 0x75, 0xb1, 0x24, 0x11, 0x42, 0xeb, 0x3e, 0x46, 0x53, 0xe9, 0xb7, 0x25, 0x34, 0x95, 0x8d, 0x13, - 0x87, 0xd0, 0x58, 0xf4, 0x1b, 0x62, 0xe2, 0x20, 0x00, 0x4b, 0x4e, 0x90, 0xc6, 0x79, 0xfd, 0x8e, - 0x8c, 0x34, 0xce, 0x85, 0xdc, 0xc2, 0x5c, 0x89, 0xf7, 0xcd, 0x58, 0x6e, 0x21, 0x08, 0xb9, 0x65, - 0x02, 0xe3, 0xbc, 0x7e, 0x37, 0x4d, 0x60, 0x9c, 0x93, 0x71, 0x69, 0x19, 0x26, 0xaf, 0xf8, 0x5b, - 0x3c, 0x7b, 0x04, 0x50, 0xbd, 0x77, 0xa0, 0x12, 0x3c, 0xd4, 0x13, 0xfc, 0x3d, 0xce, 0x1e, 0x3c, - 0xd4, 0x22, 0x8a, 0xdb, 0x50, 0x8b, 0xa7, 0x06, 0xa7, 0x79, 0x9b, 0x0f, 0xbc, 0x29, 0xa6, 0x06, - 0x9d, 0x94, 0xfe, 0x2c, 0x03, 0xd7, 0xfb, 0xe4, 0x57, 0x23, 0xf1, 0x7f, 0x60, 0x05, 0x81, 0x71, - 0x6c, 0xed, 0x79, 0xfe, 0xde, 0xfc, 0xa7, 0x3f, 0xbd, 0x60, 0x77, 0x61, 0xf3, 0xd0, 0xf0, 0x2d, - 0x37, 0x8c, 0xcf, 0xf8, 0x84, 0x2e, 0xb6, 0x08, 0x66, 0x8f, 0x40, 0xe1, 0xa0, 0xa3, 0x58, 0xab, - 0x15, 0x76, 0x5d, 0xda, 0x25, 0xbf, 0x44, 0x85, 0x76, 0x72, 0xa9, 0x65, 0x07, 0xa1, 0x66, 0xb8, - 0xc7, 0x28, 0xa3, 0x14, 0xc7, 0x3b, 0x43, 0x63, 0x0f, 0x2d, 0x00, 0x5d, 0xb2, 0x39, 0xc4, 0x2e, - 0x99, 0x18, 0x1a, 0x35, 0x22, 0x4c, 0x2c, 0x85, 0x4f, 0x41, 0x99, 0xcf, 0x66, 0x69, 0xd6, 0xf5, - 0xe7, 0xb0, 0x12, 0x61, 0xc2, 0xfa, 0x36, 0x94, 0xa5, 0x52, 0x57, 0xd8, 0x25, 0x90, 0x94, 0x85, - 0xc4, 0x52, 0x39, 0x2b, 0x22, 0x54, 0x21, 0xc9, 0x5d, 0xfd, 0xa3, 0x0c, 0x28, 0xe4, 0x57, 0xd4, - 0x28, 0xce, 0x81, 0x8e, 0x0a, 0x53, 0x16, 0x6d, 0xe6, 0xa5, 0x16, 0xed, 0x0e, 0xe4, 0x1d, 0x7b, - 0x1a, 0x87, 0x8d, 0xa5, 0x54, 0x5e, 0x42, 0xe0, 0x58, 0x7b, 0xbe, 0x7d, 0x4c, 0xb6, 0xb7, 0x1c, - 0xe0, 0x48, 0x2e, 0x53, 0x34, 0x65, 0x69, 0x88, 0xee, 0x03, 0x98, 0x76, 0x10, 0xea, 0xe4, 0x8d, - 0x12, 0xd5, 0x16, 0x3d, 0x13, 0xf7, 0xbf, 0x56, 0x32, 0xa3, 0x9f, 0xea, 0xef, 0xa9, 0x90, 0xeb, - 0x79, 0xa6, 0xc5, 0xde, 0x87, 0x12, 0x45, 0xed, 0x4a, 0x83, 0x21, 0xb4, 0x40, 0x44, 0xd3, 0x1f, - 0xea, 0xd5, 0xa2, 0x2b, 0x7e, 0x3d, 0x3f, 0xce, 0xf7, 0x35, 0xb2, 0x61, 0xe9, 0xe4, 0x19, 0x8b, - 0x2f, 0x0b, 0x3f, 0x1b, 0xb9, 0x85, 0x38, 0x06, 0xf7, 0x41, 0x3a, 0xa5, 0xf0, 0x2d, 0x97, 0x54, - 0xce, 0xbc, 0x16, 0xa7, 0xc9, 0x73, 0xe0, 0x7b, 0xa8, 0x26, 0xf1, 0xdd, 0x22, 0xbf, 0xc2, 0x73, - 0xc0, 0xf1, 0xb4, 0x7d, 0xbc, 0x0f, 0xa5, 0xaf, 0x3c, 0xdb, 0xe5, 0x15, 0xdf, 0x58, 0xaa, 0x38, - 0xaa, 0xe4, 0xbc, 0xe2, 0x5f, 0x89, 0x5f, 0xec, 0x75, 0x28, 0x78, 0x2e, 0xcf, 0xbb, 0xb0, 0x94, - 0xf7, 0x86, 0xe7, 0x76, 0x79, 0x10, 0x59, 0xd5, 0x0e, 0x74, 0xdf, 0x3e, 0x3e, 0x09, 0x75, 0xe4, - 0x14, 0x27, 0xd6, 0x65, 0x3b, 0xd0, 0x10, 0x86, 0xd9, 0xe2, 0x24, 0x99, 0xd8, 0x0e, 0x6a, 0x63, - 0x94, 0x59, 0x69, 0x29, 0x33, 0xe0, 0x68, 0xca, 0xf0, 0x0d, 0x28, 0x1e, 0xfb, 0xde, 0x7c, 0x86, - 0xf3, 0x01, 0x96, 0x28, 0x0b, 0x84, 0xdb, 0xbd, 0x40, 0x55, 0x87, 0x7e, 0xda, 0xee, 0xb1, 0x4e, - 0xce, 0xa0, 0xf2, 0x4e, 0xf6, 0x6e, 0x51, 0xab, 0x44, 0x40, 0x72, 0xf3, 0xbc, 0x01, 0x45, 0xe3, - 0xf8, 0x58, 0x17, 0xb1, 0x70, 0x4b, 0x79, 0x19, 0xc7, 0xc7, 0x54, 0xe4, 0x7d, 0xa8, 0x9e, 0xd9, - 0xae, 0x1e, 0xcc, 0xac, 0x31, 0xa7, 0xad, 0x2e, 0x77, 0xe5, 0x99, 0xed, 0xe2, 0x4c, 0x24, 0x7a, - 0x79, 0xca, 0xd6, 0xbe, 0xf9, 0x94, 0xdd, 0x7c, 0xde, 0x94, 0x55, 0x61, 0x43, 0x9c, 0x60, 0x28, - 0x4b, 0x24, 0x02, 0xc3, 0x3e, 0x80, 0xb2, 0x6f, 0xb8, 0xa7, 0xba, 0x38, 0xfe, 0xff, 0x52, 0x76, - 0x68, 0x68, 0x86, 0x7b, 0x2a, 0x4e, 0xff, 0xc1, 0x8f, 0x7f, 0xa7, 0xd5, 0xdb, 0xad, 0x97, 0xd8, - 0x0d, 0x92, 0x39, 0xc2, 0x5e, 0x6c, 0x8e, 0x7c, 0x44, 0x7a, 0xbf, 0xe5, 0x86, 0x7a, 0xc4, 0x70, - 0x69, 0x35, 0x43, 0x85, 0x93, 0xf5, 0x39, 0x1b, 0x36, 0x80, 0x1c, 0x8a, 0x3a, 0x79, 0x1f, 0xb7, - 0x53, 0x0d, 0x88, 0x3d, 0x8d, 0x1a, 0xf8, 0x89, 0xd7, 0xb1, 0x01, 0x9b, 0x49, 0x80, 0x30, 0x8f, - 0xb4, 0xbe, 0x2c, 0x9f, 0x68, 0xa4, 0x22, 0x8a, 0x23, 0x4b, 0xc3, 0x4e, 0x85, 0x19, 0xbf, 0x0e, - 0x55, 0x1e, 0x6f, 0xc3, 0xfb, 0x2d, 0x20, 0x85, 0xa6, 0xa4, 0x55, 0x08, 0xc8, 0xfb, 0x29, 0x20, - 0x61, 0x20, 0xcc, 0x9f, 0xf0, 0x9c, 0x34, 0x9a, 0x44, 0x18, 0x70, 0x7b, 0x27, 0x3c, 0xd7, 0x4a, - 0x66, 0xf4, 0x13, 0x37, 0xea, 0x91, 0xed, 0x9a, 0x38, 0xf5, 0x42, 0xe3, 0x38, 0xa8, 0xd7, 0x69, - 0x65, 0x96, 0x05, 0x6c, 0x68, 0x1c, 0x07, 0x68, 0xd9, 0x1a, 0xdc, 0x30, 0xe0, 0xf5, 0xbe, 0x26, - 0x3b, 0xe0, 0x24, 0x93, 0x41, 0x2b, 0x1b, 0x92, 0xfd, 0xf0, 0x09, 0xb0, 0xe8, 0x80, 0x55, 0x32, - 0x54, 0xaf, 0x2f, 0xcd, 0xc6, 0x4d, 0x71, 0xc2, 0x1a, 0x9b, 0xa9, 0xb7, 0xa0, 0xcc, 0x4d, 0x71, - 0x3d, 0x08, 0xad, 0x59, 0xfd, 0x15, 0xaa, 0x10, 0x70, 0xd0, 0x20, 0xb4, 0x66, 0xec, 0x13, 0xa8, - 0xa6, 0x2d, 0xa2, 0x1b, 0x2b, 0xce, 0x29, 0x69, 0x5a, 0x68, 0x95, 0xb1, 0x6c, 0x23, 0xbd, 0xce, - 0x83, 0xd7, 0x49, 0x9b, 0x21, 0x46, 0x7e, 0x16, 0x57, 0x71, 0xbd, 0xb0, 0x19, 0xc1, 0xb0, 0x03, - 0x23, 0xa3, 0x33, 0x3c, 0x27, 0x05, 0x28, 0xee, 0xc0, 0xd8, 0xcc, 0x43, 0x43, 0x26, 0xb2, 0xf8, - 0x5a, 0xc0, 0xe3, 0x4b, 0x68, 0x43, 0xb6, 0x7c, 0x1e, 0x4b, 0x42, 0xfa, 0x4e, 0x7c, 0x74, 0xb9, - 0xb8, 0x4f, 0x68, 0x3c, 0xee, 0x46, 0xde, 0x39, 0x1e, 0x41, 0x6d, 0xe6, 0x63, 0xff, 0xc6, 0x25, - 0xab, 0x72, 0xa3, 0x0e, 0x7d, 0x2b, 0x29, 0xbc, 0x32, 0x93, 0x52, 0xec, 0x87, 0xb0, 0x25, 0x71, - 0xce, 0x4f, 0x89, 0xf9, 0x75, 0x62, 0xde, 0x5e, 0x60, 0x3e, 0x3a, 0x45, 0xf6, 0xda, 0x2c, 0x95, - 0x66, 0x8d, 0x05, 0x1f, 0xd5, 0xa9, 0x75, 0x41, 0x0a, 0x53, 0xf9, 0xc1, 0xd5, 0xe7, 0x38, 0x9e, - 0x52, 0xce, 0xab, 0xcf, 0xf9, 0x19, 0x5a, 0x27, 0x68, 0xbb, 0x26, 0xa9, 0x52, 0x45, 0x8d, 0x27, - 0xd8, 0x43, 0xa8, 0x70, 0xbb, 0x85, 0x22, 0x7a, 0x83, 0xfa, 0x1d, 0xd9, 0x49, 0x4f, 0xc6, 0x0b, - 0x21, 0xb4, 0xb2, 0x13, 0xff, 0x0e, 0xd8, 0xc7, 0xb0, 0xc5, 0x4f, 0x50, 0x64, 0x29, 0xfb, 0xe6, - 0xf2, 0xac, 0x21, 0xa2, 0xbd, 0x44, 0xd4, 0x6a, 0x70, 0xcd, 0x9f, 0xbb, 0x64, 0xcb, 0x08, 0x4e, - 0xee, 0xd5, 0x21, 0xfe, 0xbb, 0xc4, 0x2f, 0x9a, 0xa3, 0x71, 0x32, 0xce, 0x4b, 0xe2, 0xed, 0x8a, - 0x2f, 0x83, 0x0e, 0x91, 0xef, 0x39, 0x79, 0x72, 0x57, 0x13, 0xe5, 0xf9, 0xd6, 0xb7, 0xc9, 0x73, - 0x17, 0xf9, 0x28, 0x4f, 0x06, 0xb9, 0xf9, 0xdc, 0x36, 0x49, 0xb1, 0xab, 0x68, 0xf4, 0x9b, 0xbd, - 0x01, 0x35, 0xdf, 0x1a, 0xcf, 0xfd, 0xc0, 0x7e, 0x66, 0xe9, 0x81, 0xed, 0x9e, 0x92, 0x4a, 0x57, - 0xd4, 0xaa, 0x31, 0x74, 0x60, 0xbb, 0xa7, 0x28, 0x75, 0xac, 0xf3, 0xd0, 0xf2, 0x5d, 0x7e, 0xc9, - 0xe0, 0x1d, 0x59, 0xea, 0xb4, 0x09, 0x81, 0xa2, 0x42, 0x03, 0x2b, 0xfe, 0xbd, 0x30, 0x39, 0x02, - 0x3e, 0x39, 0xee, 0x7f, 0xa3, 0xc9, 0x31, 0xa0, 0xc9, 0x71, 0x07, 0x8a, 0xb6, 0x1b, 0x5a, 0xfe, - 0x33, 0xc3, 0xa9, 0xbf, 0xb7, 0x24, 0xd0, 0x63, 0x1c, 0xbb, 0x0d, 0x85, 0xc0, 0xb1, 0x51, 0x64, - 0xd4, 0xdf, 0x5f, 0x22, 0x8b, 0x50, 0xec, 0x2e, 0x94, 0xe2, 0xfb, 0x71, 0xf5, 0x0f, 0x96, 0xe8, - 0x12, 0x24, 0xbb, 0x09, 0xb9, 0x33, 0x9c, 0x50, 0x0f, 0x96, 0x0f, 0x55, 0x10, 0x8e, 0x1a, 0xc0, - 0x04, 0x55, 0x74, 0xd2, 0x00, 0x1e, 0x2e, 0x69, 0x00, 0x7b, 0xb6, 0xe3, 0x70, 0x0d, 0x60, 0x22, - 0x7e, 0xe1, 0xfe, 0x49, 0x1c, 0xd8, 0x92, 0x0f, 0x97, 0xf7, 0x4f, 0xc4, 0x3d, 0xa1, 0x9b, 0x84, - 0xe5, 0x80, 0x4e, 0x0a, 0xf8, 0x81, 0xc7, 0x47, 0x72, 0x5f, 0xa5, 0x8f, 0x10, 0x34, 0x08, 0xe2, - 0x34, 0xda, 0x1b, 0xe2, 0x9c, 0xc4, 0x36, 0xcf, 0xeb, 0x1f, 0xf3, 0x2b, 0x2a, 0x1c, 0xd2, 0x31, - 0xcf, 0xd9, 0xfb, 0x50, 0x8d, 0x02, 0xab, 0xb0, 0xb8, 0xa0, 0xfe, 0xc9, 0x52, 0x0d, 0xd2, 0x04, - 0xac, 0x05, 0x95, 0x09, 0xaa, 0xea, 0x53, 0xae, 0xb9, 0xd7, 0x1f, 0x51, 0x45, 0x76, 0xa2, 0xbd, - 0xf9, 0x79, 0x9a, 0xbd, 0x96, 0xe2, 0x62, 0xf7, 0x81, 0xd9, 0x13, 0x3e, 0x9e, 0x7b, 0xbe, 0x37, - 0xe5, 0xda, 0x79, 0xfd, 0x53, 0x9a, 0x5d, 0x2b, 0x30, 0x74, 0x6c, 0x6a, 0xb9, 0xa6, 0x3e, 0x0d, - 0x84, 0xa6, 0xf1, 0x3d, 0xaa, 0xa7, 0x90, 0x7f, 0xf1, 0x3d, 0xda, 0xc8, 0x21, 0x8a, 0xb4, 0x07, - 0x01, 0x57, 0x3c, 0x3e, 0x05, 0x9c, 0xae, 0xcf, 0x12, 0xd6, 0x5f, 0x79, 0x21, 0x2b, 0xd2, 0x46, - 0xac, 0x8f, 0xa0, 0x66, 0x5a, 0xe6, 0x7c, 0x46, 0x4a, 0x17, 0x4d, 0xd1, 0xef, 0xcb, 0xc2, 0x4f, - 0x76, 0xb3, 0x6a, 0x15, 0x53, 0x76, 0xba, 0x7e, 0x02, 0x9b, 0x91, 0x3f, 0x34, 0x14, 0xae, 0xd3, - 0x1f, 0xc8, 0xc5, 0xc6, 0x2e, 0x4a, 0xad, 0x3a, 0x8f, 0x7e, 0x52, 0x91, 0x0f, 0xa1, 0x4a, 0x1b, - 0x71, 0xe0, 0x1a, 0xb3, 0xe0, 0xc4, 0x0b, 0xeb, 0xbf, 0x2a, 0xeb, 0x14, 0x03, 0x01, 0xd5, 0x2a, - 0x48, 0x14, 0xa5, 0x70, 0xff, 0x48, 0xd6, 0xe9, 0x38, 0xb4, 0xea, 0x3f, 0xe4, 0xfb, 0x47, 0x0c, - 0x6c, 0x86, 0x16, 0x7b, 0x08, 0x60, 0xcc, 0x66, 0xce, 0x05, 0x9f, 0x9a, 0x3f, 0xa2, 0xa9, 0xb9, - 0x2d, 0x4d, 0xcd, 0x06, 0x22, 0x69, 0x6e, 0x96, 0x8c, 0xe8, 0x27, 0x7b, 0x00, 0x95, 0x99, 0x17, - 0x84, 0xba, 0x39, 0x75, 0xa8, 0xfd, 0x0d, 0x79, 0x6d, 0x1f, 0x7a, 0x41, 0xd8, 0x9a, 0x3a, 0xd8, - 0x0a, 0x98, 0xc5, 0xbf, 0x59, 0x17, 0x2e, 0xa5, 0xe4, 0xb6, 0x41, 0x41, 0x0a, 0xf5, 0x5d, 0x2a, - 0xf1, 0x86, 0x54, 0xa2, 0x24, 0xbf, 0x45, 0x94, 0xdf, 0x96, 0xb7, 0x08, 0x22, 0xb3, 0x92, 0xc6, - 0x20, 0x0e, 0x75, 0x6d, 0x72, 0xed, 0x82, 0xa0, 0x51, 0xac, 0xeb, 0x23, 0xd8, 0x4c, 0xa8, 0xb0, - 0x81, 0x41, 0xbd, 0x25, 0xcf, 0x64, 0x29, 0x76, 0xbe, 0x1a, 0x31, 0x22, 0x2c, 0xa0, 0xbe, 0xf3, - 0x1c, 0x67, 0x3e, 0x13, 0xa2, 0xb4, 0xde, 0x16, 0x7d, 0x47, 0x40, 0x2e, 0x25, 0x25, 0xcb, 0xdb, - 0x9a, 0xd6, 0xf7, 0x64, 0xcb, 0xdb, 0x9a, 0xa2, 0xa6, 0x22, 0xe2, 0x98, 0x9f, 0xd9, 0xd6, 0x59, - 0x50, 0x7f, 0x4c, 0xa7, 0x2d, 0x22, 0x52, 0xfc, 0x09, 0x82, 0x50, 0x75, 0x30, 0x6d, 0x1f, 0xad, - 0x08, 0x0a, 0x4f, 0xdb, 0xe7, 0xa1, 0xc6, 0x1c, 0x84, 0x14, 0xea, 0x3f, 0xc9, 0x43, 0x31, 0x32, - 0x6b, 0x58, 0x19, 0x0a, 0x47, 0xbd, 0xcf, 0x7b, 0xfd, 0xa7, 0x3d, 0x7e, 0x8f, 0xb0, 0x31, 0x18, - 0xb4, 0xb5, 0xa1, 0x62, 0xb2, 0x1a, 0x00, 0xdd, 0x14, 0xd2, 0x07, 0xcd, 0x46, 0x8f, 0xdf, 0x2b, - 0xa4, 0xfb, 0x49, 0x3c, 0xbd, 0xce, 0xb6, 0xa0, 0xba, 0x77, 0xd4, 0xa3, 0x90, 0x46, 0x0e, 0xca, - 0x22, 0xa8, 0xfd, 0x05, 0x3f, 0x84, 0xe5, 0xa0, 0x1c, 0x82, 0x0e, 0x1a, 0xc3, 0xb6, 0xd6, 0x89, - 0x40, 0x79, 0x8a, 0x8e, 0xec, 0x1f, 0x69, 0x4d, 0x91, 0xd3, 0x06, 0xbb, 0x0c, 0x5b, 0x31, 0x5b, - 0x94, 0xa5, 0x52, 0xc0, 0x9a, 0x1d, 0x6a, 0xfd, 0xcf, 0xda, 0xcd, 0xa1, 0x02, 0x74, 0xa2, 0xfb, - 0xf8, 0xb1, 0x52, 0x66, 0x15, 0x28, 0xb6, 0x3a, 0x83, 0x61, 0xa7, 0xd7, 0x1c, 0x2a, 0x15, 0xac, - 0xf0, 0x5e, 0xa7, 0x3b, 0x6c, 0x6b, 0x4a, 0x95, 0x15, 0x21, 0xf7, 0x59, 0xbf, 0xd3, 0x53, 0x6a, - 0x74, 0x63, 0xaa, 0x71, 0x70, 0xd8, 0x6d, 0x2b, 0x9b, 0x08, 0x1d, 0xf4, 0xb5, 0xa1, 0xa2, 0x20, - 0xf4, 0x69, 0xa7, 0xd7, 0xea, 0x3f, 0x55, 0xb6, 0x58, 0x09, 0xf2, 0x47, 0x3d, 0x2c, 0x86, 0xb1, - 0x2a, 0x94, 0xe8, 0xa7, 0xde, 0xe8, 0x76, 0x95, 0x4b, 0xd2, 0x31, 0xf0, 0x36, 0xa2, 0xe8, 0x50, - 0x79, 0x80, 0x75, 0xb8, 0x8c, 0x6d, 0x89, 0x93, 0x44, 0x7d, 0x05, 0xf3, 0x39, 0xe8, 0xf4, 0x8e, - 0x06, 0xca, 0x55, 0x24, 0xa6, 0x9f, 0x84, 0xa9, 0x63, 0x3e, 0x9d, 0x1e, 0x75, 0xe5, 0x4d, 0xfc, - 0xdd, 0x6a, 0x77, 0xdb, 0xc3, 0xb6, 0x72, 0x0b, 0x5b, 0xd5, 0xed, 0x37, 0x3f, 0xd7, 0xfb, 0x87, - 0xca, 0x6b, 0x6c, 0x1b, 0x94, 0x7e, 0x4f, 0x6f, 0x1d, 0x1d, 0x76, 0x3b, 0xcd, 0xc6, 0xb0, 0xad, - 0x7f, 0xde, 0xfe, 0x52, 0x51, 0xb1, 0xa7, 0x0f, 0xb5, 0xb6, 0x2e, 0xd8, 0x5f, 0x67, 0x0a, 0x54, - 0xf6, 0x8e, 0x7e, 0xf2, 0x93, 0x2f, 0x75, 0xd1, 0xd4, 0x37, 0xb0, 0x26, 0x09, 0x85, 0x7e, 0xf4, - 0xb9, 0x72, 0x67, 0x01, 0x34, 0xf8, 0x5c, 0x79, 0x13, 0xbb, 0x2a, 0xea, 0x7b, 0xe5, 0x2e, 0x12, - 0x68, 0xed, 0xe6, 0x91, 0x36, 0xe8, 0x3c, 0x69, 0xeb, 0xcd, 0x61, 0x5b, 0x79, 0x8b, 0xfa, 0xa6, - 0xd3, 0xfb, 0x5c, 0xb9, 0x87, 0x95, 0xc7, 0x5f, 0x7c, 0x44, 0xde, 0x66, 0x0c, 0x6a, 0x09, 0x2d, - 0xc1, 0xde, 0x41, 0x92, 0x5d, 0xad, 0xdf, 0x68, 0x35, 0x1b, 0x83, 0xa1, 0xf2, 0x2e, 0xb6, 0x7c, - 0x70, 0xd8, 0xed, 0x0c, 0x95, 0xfb, 0xd8, 0xbc, 0xc7, 0x8d, 0xe1, 0x7e, 0x5b, 0x53, 0xde, 0xc3, - 0xc1, 0x1d, 0x76, 0x0e, 0xda, 0xba, 0xe8, 0xe9, 0x07, 0x58, 0xc6, 0x5e, 0xa7, 0xdb, 0x55, 0x1e, - 0xd2, 0xe1, 0x66, 0x43, 0x1b, 0x76, 0x68, 0x78, 0x3f, 0xc4, 0x0c, 0x1a, 0x87, 0x87, 0xdd, 0x2f, - 0x95, 0x8f, 0xb0, 0x81, 0x07, 0x47, 0xdd, 0x61, 0x47, 0x3f, 0x3a, 0x6c, 0x35, 0x86, 0x6d, 0xe5, - 0x63, 0x1a, 0xfb, 0xfe, 0x60, 0xd8, 0x3a, 0xe8, 0x2a, 0x9f, 0x50, 0x9e, 0x34, 0xf3, 0x9a, 0xdd, - 0x7e, 0xaf, 0xad, 0x3c, 0x52, 0x73, 0xc5, 0x1d, 0x65, 0x47, 0xfd, 0x0d, 0x28, 0x46, 0x36, 0x2e, - 0x66, 0xd6, 0xe9, 0xf5, 0xda, 0x9a, 0xb2, 0x86, 0x05, 0x76, 0xdb, 0x7b, 0x43, 0x25, 0x43, 0xe7, - 0xbd, 0x9d, 0xc7, 0xfb, 0x43, 0x65, 0x1d, 0x7f, 0xf6, 0x8f, 0xb0, 0xef, 0xb2, 0xd4, 0xe8, 0xf6, - 0x41, 0x47, 0xc9, 0xe1, 0xaf, 0x46, 0x6f, 0xd8, 0x51, 0xf2, 0x34, 0x61, 0x3a, 0xbd, 0xc7, 0xdd, - 0xb6, 0xb2, 0x81, 0xd0, 0x83, 0x86, 0xf6, 0xb9, 0x52, 0xe0, 0x99, 0xb6, 0xda, 0x5f, 0x28, 0x45, - 0xb6, 0x01, 0xeb, 0xdd, 0x07, 0x4a, 0x09, 0x41, 0xad, 0x76, 0xeb, 0xe8, 0x50, 0x01, 0xf5, 0x2e, - 0x14, 0x1a, 0xc7, 0xc7, 0x07, 0x9e, 0x49, 0x47, 0xcc, 0x7b, 0x47, 0xdd, 0x2e, 0x5f, 0x40, 0xbb, - 0xfd, 0xe1, 0xb0, 0x7f, 0xa0, 0x64, 0x70, 0xca, 0x0e, 0xfb, 0x87, 0xca, 0xba, 0xda, 0x81, 0x62, - 0xb4, 0x15, 0x4b, 0xd7, 0xff, 0x8a, 0x90, 0x3b, 0xd4, 0xda, 0x4f, 0x78, 0x90, 0x42, 0xaf, 0xfd, - 0x05, 0x56, 0x13, 0x7f, 0x61, 0x46, 0x59, 0x2c, 0x88, 0xdf, 0xd3, 0xa3, 0xfb, 0x7f, 0xdd, 0x4e, - 0xaf, 0xdd, 0xd0, 0x94, 0xbc, 0xfa, 0x51, 0xea, 0xfc, 0x57, 0x48, 0x2d, 0x2c, 0xbe, 0xd1, 0x11, - 0xc5, 0x77, 0x1e, 0xf7, 0xfa, 0x5a, 0x9b, 0x5f, 0x28, 0x14, 0xdd, 0xb9, 0xae, 0xbe, 0x0d, 0xa5, - 0x58, 0xe2, 0xe2, 0xf4, 0x6a, 0x6a, 0xfd, 0xc1, 0x80, 0xf7, 0xfe, 0x1a, 0xa6, 0xa9, 0x6f, 0x78, - 0x3a, 0xf3, 0x59, 0xae, 0x78, 0x4b, 0xd9, 0x51, 0x07, 0xb0, 0x15, 0x89, 0x7c, 0xba, 0xc6, 0x40, - 0xe6, 0xcc, 0x36, 0xe4, 0xbb, 0xd6, 0x33, 0xcb, 0x89, 0xe2, 0xf1, 0x29, 0x81, 0xd0, 0xfe, 0xe8, - 0xab, 0x4e, 0x7c, 0xf3, 0x9b, 0x12, 0xa8, 0xe3, 0xf5, 0xa4, 0xcb, 0xe7, 0x74, 0xb7, 0xf2, 0xaf, - 0x65, 0xa0, 0x18, 0x6f, 0x24, 0xb7, 0x61, 0x7d, 0x38, 0x10, 0x87, 0x44, 0xdb, 0xf7, 0x93, 0xb7, - 0x36, 0x86, 0xd1, 0x2f, 0x6d, 0x7d, 0x38, 0x60, 0xef, 0xc0, 0x06, 0xbf, 0x2b, 0x2b, 0x1c, 0x44, - 0xdb, 0xe9, 0xcd, 0x69, 0x48, 0x38, 0x4d, 0xd0, 0xb0, 0x8f, 0xa0, 0x14, 0xd7, 0x56, 0x78, 0x61, - 0xae, 0xa6, 0x19, 0x62, 0xb4, 0x96, 0x50, 0xaa, 0x5d, 0xa8, 0xa5, 0x33, 0x64, 0x37, 0x01, 0x78, - 0x96, 0x92, 0x5b, 0x50, 0x82, 0xb0, 0xeb, 0x10, 0x5d, 0xe1, 0x6d, 0x51, 0xc5, 0xaa, 0xf1, 0x95, - 0xde, 0x96, 0xfa, 0x37, 0xb2, 0x00, 0x89, 0x2a, 0x8a, 0x1d, 0x11, 0xfb, 0x96, 0xf2, 0x22, 0x80, - 0xe0, 0x15, 0x28, 0x39, 0x9e, 0x61, 0xca, 0x4f, 0x6d, 0x14, 0x11, 0x40, 0x03, 0x24, 0x5f, 0x67, - 0x2b, 0xf1, 0xe8, 0x1d, 0x76, 0x05, 0x36, 0x26, 0x9e, 0x3f, 0x35, 0x42, 0x71, 0xf9, 0x42, 0xa4, - 0x70, 0x47, 0xe1, 0x87, 0xda, 0xa8, 0x90, 0xbb, 0x74, 0xff, 0x02, 0xc7, 0xa0, 0x22, 0x80, 0x5d, - 0x84, 0xe1, 0x8e, 0x60, 0xb9, 0x63, 0xc7, 0x0b, 0x2c, 0x53, 0x1f, 0xf1, 0x80, 0xa8, 0x8a, 0x06, - 0x11, 0x68, 0xf7, 0x82, 0xb7, 0xd6, 0x9f, 0xda, 0xae, 0x11, 0x8a, 0x83, 0x21, 0x6a, 0x6d, 0x04, - 0xc1, 0xea, 0x7e, 0x15, 0x78, 0xc2, 0xd5, 0xc4, 0xcf, 0xc7, 0x8b, 0x08, 0xa0, 0xea, 0xbe, 0x0a, - 0x60, 0x05, 0x63, 0x63, 0xc6, 0x33, 0x2f, 0x51, 0xe6, 0x25, 0x01, 0xd9, 0xbd, 0x60, 0x5d, 0xa8, - 0x0d, 0x47, 0xb8, 0x03, 0x7a, 0x2d, 0x23, 0x34, 0x9a, 0x9e, 0x23, 0x9c, 0x40, 0xb7, 0x17, 0x75, - 0xf6, 0xfb, 0x69, 0x32, 0x7e, 0x90, 0xbf, 0xc0, 0x7b, 0xbd, 0x01, 0x97, 0x56, 0x90, 0x7d, 0xab, - 0x88, 0x46, 0x27, 0x1a, 0x9d, 0x46, 0x18, 0xd2, 0xd5, 0xac, 0x78, 0xb3, 0xcf, 0x44, 0xb7, 0x36, - 0xf8, 0x3e, 0xff, 0x0a, 0xc5, 0x2c, 0x89, 0x80, 0x5a, 0x31, 0x48, 0x71, 0xa0, 0xec, 0x1d, 0xd8, - 0x44, 0xe4, 0xc4, 0xb6, 0x1c, 0x53, 0x90, 0xf0, 0xeb, 0x3a, 0xd5, 0xb1, 0xe7, 0xec, 0x21, 0x94, - 0xe8, 0xd4, 0xbf, 0x9e, 0x07, 0x48, 0xcc, 0xbc, 0x54, 0x2c, 0x41, 0x26, 0x1d, 0x4b, 0xf0, 0x00, - 0xae, 0x88, 0x7b, 0x67, 0xf1, 0x31, 0xb8, 0xed, 0xea, 0x23, 0x23, 0x0a, 0xdb, 0x60, 0x02, 0xcb, - 0x4f, 0xc2, 0x3b, 0xee, 0xae, 0x81, 0x4a, 0xe3, 0xa6, 0xcc, 0x13, 0x5e, 0xcc, 0xd2, 0xee, 0x5d, - 0x59, 0x15, 0x49, 0xd8, 0x87, 0x17, 0x33, 0xf6, 0x3e, 0x5c, 0xf6, 0xad, 0x89, 0x6f, 0x05, 0x27, - 0x7a, 0x18, 0xc8, 0x85, 0xf1, 0xe8, 0xc8, 0x2d, 0x81, 0x1c, 0x06, 0x71, 0x59, 0xef, 0xc3, 0x65, - 0x61, 0x00, 0x2e, 0x54, 0x8f, 0x3f, 0x50, 0xb0, 0xc5, 0x91, 0x72, 0xed, 0x28, 0x14, 0x96, 0x6c, - 0xdf, 0xe8, 0xc1, 0x9a, 0xa2, 0x56, 0xe2, 0x76, 0xae, 0xb8, 0xc6, 0x4d, 0x06, 0x2c, 0xcd, 0x99, - 0xa2, 0xc6, 0x13, 0x4c, 0x85, 0x1c, 0x0a, 0x55, 0x3a, 0x42, 0xac, 0x3d, 0xa8, 0xdd, 0xa7, 0x07, - 0x79, 0xe8, 0x5a, 0xbd, 0x67, 0x5a, 0x1a, 0xe1, 0xd8, 0xbb, 0x70, 0x49, 0x6e, 0x76, 0xf4, 0xa6, - 0x44, 0x99, 0x2a, 0xa2, 0x24, 0x0d, 0xd5, 0xf8, 0xeb, 0x12, 0x6f, 0x03, 0x93, 0x6a, 0x1e, 0x51, - 0x57, 0x88, 0x7a, 0x33, 0xae, 0xb6, 0x20, 0x7e, 0x13, 0xa8, 0x8a, 0xfc, 0xcc, 0xa4, 0xba, 0x6c, - 0xed, 0x21, 0x92, 0x8e, 0x4f, 0xde, 0x87, 0xcb, 0x49, 0xeb, 0x74, 0x23, 0xd4, 0xc3, 0x13, 0x4b, - 0xb7, 0x5c, 0x93, 0x2e, 0x0b, 0x16, 0xb5, 0xad, 0xb8, 0xa1, 0x8d, 0x70, 0x78, 0x62, 0xa1, 0xbd, - 0x26, 0xb9, 0xe4, 0x36, 0x5f, 0xec, 0x92, 0xfb, 0x18, 0xea, 0xa9, 0xa3, 0x78, 0xb9, 0xbb, 0xf9, - 0x65, 0xdb, 0x6d, 0xf9, 0x00, 0x3e, 0xee, 0xf1, 0x7b, 0xb0, 0x75, 0x62, 0x04, 0x7a, 0x8a, 0x97, - 0x3c, 0x85, 0x45, 0x6d, 0xf3, 0xc4, 0x08, 0x0e, 0x25, 0x1e, 0xf5, 0xf7, 0x32, 0x50, 0x4b, 0x1b, - 0xbe, 0xfc, 0x06, 0x93, 0x33, 0x9f, 0xba, 0x3c, 0x96, 0x28, 0xaf, 0x45, 0x49, 0x5c, 0x0b, 0xb3, - 0x53, 0x9d, 0xa7, 0xa2, 0xb5, 0x30, 0x3b, 0x6d, 0x52, 0x9a, 0xbd, 0x05, 0x85, 0xd9, 0x29, 0x17, - 0x0e, 0xcf, 0x9b, 0x7d, 0x1b, 0x33, 0x1e, 0x08, 0xfe, 0x16, 0x14, 0xe6, 0x82, 0x34, 0xf7, 0x3c, - 0xd2, 0x39, 0x91, 0xaa, 0xff, 0x62, 0x1d, 0x2a, 0xb2, 0xcb, 0xe7, 0x9b, 0x84, 0x15, 0x7c, 0xab, - 0xc8, 0x8a, 0x1d, 0x8a, 0xe9, 0xd4, 0x29, 0xea, 0x1c, 0xfb, 0x89, 0xc7, 0x14, 0xc0, 0x89, 0x11, - 0x34, 0xe6, 0xa1, 0xd7, 0xf4, 0xf8, 0xc9, 0xa8, 0xe7, 0x44, 0xd1, 0xe8, 0x7c, 0x65, 0xa0, 0x4c, - 0x10, 0x81, 0xe8, 0xef, 0x8b, 0xcb, 0x2e, 0x74, 0xbd, 0x8d, 0x62, 0x95, 0xf2, 0x4b, 0xf3, 0xa5, - 0x12, 0xdd, 0x6e, 0xa3, 0x30, 0xa4, 0x07, 0xb0, 0x99, 0x5c, 0x2d, 0x88, 0xc2, 0x9b, 0x16, 0x59, - 0xaa, 0xf1, 0xbd, 0x02, 0x71, 0xf5, 0xbe, 0x6a, 0x07, 0xba, 0xe7, 0x98, 0xd1, 0x1d, 0xa6, 0x42, - 0xe4, 0x90, 0xef, 0x3b, 0xa6, 0xb8, 0x53, 0xc9, 0x69, 0x5c, 0xeb, 0x2c, 0xa2, 0x89, 0x9d, 0xf6, - 0x3d, 0xeb, 0x4c, 0xdc, 0x65, 0xfa, 0xf3, 0x0c, 0x6c, 0x2d, 0xb9, 0x68, 0x50, 0x72, 0x26, 0x0f, - 0x41, 0xe1, 0x4f, 0x34, 0x31, 0xa6, 0x46, 0x38, 0x3e, 0xd1, 0x67, 0xbe, 0x35, 0xb1, 0xcf, 0xa3, - 0xd7, 0xac, 0x08, 0x76, 0x48, 0x20, 0x0a, 0xf9, 0xa2, 0x43, 0x22, 0xee, 0x07, 0xe7, 0x82, 0x8f, - 0x1f, 0x0c, 0x75, 0xc9, 0x01, 0x1e, 0x85, 0x83, 0xe6, 0x9e, 0x13, 0x0e, 0x7a, 0x1d, 0x4a, 0xae, - 0x17, 0xea, 0x9e, 0xab, 0xcf, 0x4e, 0xc5, 0x5b, 0x0d, 0x05, 0xd7, 0x0b, 0xfb, 0xee, 0xe1, 0x29, - 0xbb, 0x0b, 0xca, 0x3c, 0xb0, 0xf4, 0x91, 0xe3, 0x79, 0xd3, 0xc8, 0x4e, 0xe2, 0xb2, 0xa3, 0x36, - 0x0f, 0xac, 0x5d, 0x04, 0xf3, 0xfa, 0xab, 0x37, 0x60, 0xa3, 0x13, 0x3b, 0x94, 0xe2, 0x78, 0xa3, - 0xac, 0x78, 0xf8, 0xc5, 0x83, 0x52, 0x93, 0x1e, 0x91, 0x39, 0x30, 0x66, 0xec, 0x1e, 0x64, 0xa7, - 0xc6, 0x4c, 0x9c, 0x47, 0xd5, 0xe3, 0x43, 0x3b, 0x8e, 0xbd, 0x7f, 0x60, 0xcc, 0xf8, 0x76, 0x83, - 0x44, 0xd7, 0x3f, 0x86, 0x62, 0x04, 0xf8, 0x56, 0x1b, 0xcb, 0xbf, 0x59, 0x87, 0x52, 0x4b, 0xf6, - 0x29, 0xa3, 0x6d, 0x1d, 0xfa, 0x73, 0x17, 0x75, 0xb5, 0xe8, 0x39, 0x8c, 0xb1, 0xe1, 0x0e, 0x05, - 0x28, 0x9a, 0xd0, 0xeb, 0x2f, 0x98, 0xd0, 0x37, 0x00, 0x7c, 0xf2, 0xa7, 0x90, 0x4b, 0x25, 0x1b, - 0x47, 0xe1, 0x76, 0xcc, 0x8e, 0x79, 0xbe, 0x3a, 0x8a, 0x26, 0xf7, 0xcd, 0xa3, 0x68, 0xf2, 0x2b, - 0xa3, 0x68, 0xee, 0x24, 0x9b, 0x0a, 0x4e, 0x6c, 0x2c, 0xb8, 0xc4, 0xb7, 0xb6, 0x59, 0x7c, 0xa1, - 0x07, 0x4b, 0xff, 0x1e, 0xd4, 0xa2, 0xd6, 0x89, 0xfc, 0x20, 0x75, 0x87, 0x48, 0xe0, 0xb8, 0x13, - 0xba, 0x1a, 0xca, 0xc9, 0xf4, 0x42, 0x2d, 0xbf, 0x24, 0x52, 0xe7, 0x6f, 0x66, 0x80, 0x09, 0xfb, - 0x7f, 0x6f, 0xee, 0x38, 0x43, 0xeb, 0x9c, 0xe4, 0xc1, 0x3d, 0xd8, 0x12, 0x3e, 0x72, 0x29, 0x7a, - 0x4f, 0x9c, 0xe0, 0x72, 0x44, 0x72, 0x82, 0xbb, 0xea, 0x9a, 0xe7, 0xfa, 0xca, 0x6b, 0x9e, 0xab, - 0xaf, 0x8f, 0xde, 0x82, 0xb2, 0x7c, 0x49, 0x92, 0x2b, 0x61, 0x60, 0x24, 0xf7, 0x23, 0xff, 0xdd, - 0x3a, 0x40, 0xe2, 0xa3, 0xf8, 0x65, 0x87, 0x40, 0xad, 0x18, 0x92, 0xec, 0xaa, 0x21, 0xb9, 0x0b, - 0x8a, 0x4c, 0x27, 0xdd, 0xd6, 0xad, 0x25, 0x84, 0x91, 0x72, 0x63, 0x07, 0xf2, 0x8d, 0x4a, 0x0a, - 0x88, 0x14, 0x51, 0x23, 0x22, 0x5a, 0x92, 0x24, 0xaf, 0x58, 0x7b, 0x45, 0x3b, 0xe0, 0x92, 0x98, - 0x7d, 0x0a, 0xd7, 0x62, 0x4e, 0xfd, 0xcc, 0x0e, 0x4f, 0xbc, 0x79, 0x28, 0xd6, 0x69, 0x20, 0x64, - 0xd3, 0x95, 0x28, 0xa7, 0xa7, 0x1c, 0xcd, 0xd7, 0x6b, 0x80, 0xea, 0xf9, 0x64, 0xee, 0x38, 0x7a, - 0x68, 0x9d, 0x87, 0xe2, 0x85, 0x8d, 0x7a, 0xca, 0xbd, 0x23, 0x0d, 0xaf, 0x56, 0x9c, 0x88, 0x84, - 0xfa, 0x4f, 0xb3, 0x90, 0xff, 0xf1, 0xdc, 0xf2, 0x2f, 0xd8, 0xc7, 0x50, 0x0a, 0xc2, 0x69, 0x28, - 0x1f, 0xd6, 0x5e, 0xe3, 0x19, 0x10, 0x9e, 0xce, 0x5a, 0xad, 0xa9, 0xe5, 0x86, 0xdc, 0xef, 0x89, - 0xb4, 0xb4, 0xed, 0x6c, 0x43, 0x3e, 0x08, 0xad, 0x59, 0x20, 0x62, 0x0a, 0x79, 0x82, 0xed, 0x40, - 0xde, 0xf5, 0x4c, 0x2b, 0x48, 0x47, 0x0e, 0xf6, 0x50, 0xcf, 0xe0, 0x08, 0xa6, 0xc2, 0x46, 0x3c, - 0xe2, 0x4b, 0x07, 0xa6, 0x1c, 0x43, 0xb7, 0x52, 0x2c, 0xc3, 0xb4, 0xdd, 0xe3, 0xe8, 0xf6, 0x73, - 0x9c, 0xc6, 0x0d, 0x95, 0xd4, 0x7a, 0xe3, 0x38, 0x7a, 0x35, 0x41, 0x24, 0xd9, 0x0e, 0x94, 0xf1, - 0xe7, 0x53, 0xdf, 0x0e, 0xad, 0xc1, 0xc3, 0x48, 0xa6, 0x4b, 0x20, 0x54, 0xca, 0x4d, 0x2b, 0xb4, - 0xc6, 0xe1, 0xe0, 0x6b, 0x11, 0xc2, 0x57, 0xd2, 0x24, 0x08, 0xfb, 0x1e, 0xb0, 0x91, 0x31, 0x3e, - 0x3d, 0xf6, 0x29, 0x20, 0xe0, 0xeb, 0xb9, 0xe5, 0xdb, 0x56, 0x14, 0xb2, 0x57, 0x96, 0x3a, 0x45, - 0xdb, 0x4a, 0xc8, 0x7e, 0xcc, 0xa9, 0xd0, 0x9c, 0x98, 0x1a, 0xe7, 0x2d, 0x6f, 0x26, 0x22, 0xb5, - 0x44, 0x4a, 0xfd, 0x75, 0xa8, 0xa6, 0xba, 0x70, 0xc9, 0x3d, 0x34, 0x68, 0x77, 0xdb, 0xcd, 0x21, - 0x37, 0x2f, 0x85, 0x83, 0x62, 0x5d, 0xf2, 0x6f, 0xe4, 0x24, 0xb3, 0x33, 0x4f, 0xde, 0x91, 0xb6, - 0xf6, 0xb8, 0xad, 0x6c, 0xa8, 0xb9, 0x62, 0x56, 0xc9, 0xaa, 0x7f, 0x6b, 0x1d, 0xb6, 0x86, 0xbe, - 0xe1, 0x06, 0x06, 0x57, 0x42, 0xdc, 0xd0, 0xf7, 0x1c, 0xf6, 0x3d, 0x28, 0x86, 0x63, 0x47, 0x1e, - 0xd3, 0x5b, 0x91, 0x04, 0x59, 0x20, 0xbd, 0x3f, 0x1c, 0x73, 0x8f, 0x76, 0x21, 0xe4, 0x3f, 0xd8, - 0xbb, 0x90, 0x1f, 0x59, 0xc7, 0xb6, 0x2b, 0x84, 0xe8, 0xe5, 0x45, 0xc6, 0x5d, 0x44, 0xee, 0xaf, - 0x69, 0x9c, 0x8a, 0xbd, 0x0f, 0x1b, 0x63, 0x6f, 0x1a, 0xed, 0x59, 0xc9, 0xb5, 0x3a, 0xa9, 0x20, - 0xc4, 0xee, 0xaf, 0x69, 0x82, 0x8e, 0x7d, 0x0c, 0x45, 0xdf, 0x73, 0x1c, 0xec, 0x42, 0xb1, 0x9b, - 0xd5, 0x17, 0x79, 0x34, 0x81, 0xdf, 0x5f, 0xd3, 0x62, 0x5a, 0xf5, 0x3e, 0x14, 0x44, 0x65, 0xb1, - 0x1b, 0x76, 0xdb, 0x8f, 0x3b, 0xa2, 0x07, 0x9b, 0xfd, 0x83, 0x83, 0xce, 0x90, 0xdf, 0x19, 0xd6, - 0xfa, 0xdd, 0xee, 0x6e, 0xa3, 0xf9, 0xb9, 0xb2, 0xbe, 0x5b, 0x84, 0x0d, 0xee, 0xbb, 0x54, 0x7f, - 0x33, 0x03, 0x9b, 0x0b, 0x0d, 0x60, 0x8f, 0x20, 0x37, 0x45, 0xa5, 0x98, 0x77, 0xcf, 0xed, 0x95, - 0xad, 0x94, 0xd2, 0x5c, 0x55, 0x46, 0x0e, 0xf5, 0x53, 0xa8, 0xa5, 0xe1, 0x92, 0x0b, 0xa2, 0x0a, - 0x25, 0xad, 0xdd, 0x68, 0xe9, 0xfd, 0x1e, 0x1a, 0xfe, 0xac, 0x06, 0x40, 0xc9, 0xa7, 0x5a, 0x87, - 0xbc, 0x06, 0xbf, 0x06, 0xca, 0x62, 0xc7, 0xb0, 0xc7, 0x68, 0xf6, 0x4c, 0x67, 0x8e, 0x45, 0xda, - 0xa5, 0x34, 0x64, 0x37, 0x57, 0xf4, 0xa4, 0x20, 0xe3, 0x41, 0x29, 0xe3, 0x54, 0x5a, 0xfd, 0x75, - 0x60, 0xcb, 0x3d, 0xf8, 0xcb, 0xcb, 0xfe, 0x7f, 0x66, 0x20, 0x77, 0xe8, 0x18, 0x2e, 0x7b, 0x1d, - 0xf2, 0xf4, 0x2c, 0x8f, 0x10, 0xc5, 0xf2, 0xc2, 0xc0, 0x69, 0x41, 0x38, 0xf6, 0x36, 0x64, 0xc3, - 0x71, 0x74, 0x55, 0xf9, 0xea, 0x73, 0x26, 0xdf, 0xfe, 0x9a, 0x86, 0x54, 0xec, 0x2e, 0x64, 0x4d, - 0x33, 0x0a, 0xef, 0x17, 0xee, 0x08, 0x34, 0x46, 0x5b, 0xd6, 0xc4, 0x76, 0x6d, 0xf1, 0x8c, 0x10, - 0x92, 0xb0, 0x37, 0x20, 0x6b, 0x8e, 0x9d, 0xf4, 0x5d, 0x0d, 0x6e, 0xb6, 0xc6, 0x19, 0x9a, 0x63, - 0x07, 0x95, 0xb7, 0xd0, 0xbf, 0xd0, 0xfd, 0xb9, 0x4b, 0xd1, 0x8d, 0x81, 0x30, 0xa8, 0xca, 0xa8, - 0x90, 0xcc, 0x29, 0x44, 0x32, 0x10, 0x77, 0x1e, 0x67, 0xbe, 0x35, 0x33, 0xfc, 0xd8, 0x94, 0xb2, - 0x83, 0x43, 0x0e, 0xd8, 0xdd, 0x00, 0x7a, 0xed, 0x54, 0x7d, 0x87, 0xde, 0x8c, 0x41, 0x9d, 0x5c, - 0x8d, 0x7e, 0xad, 0x78, 0x18, 0x4f, 0x60, 0xd4, 0xbf, 0xc8, 0x42, 0x59, 0xaa, 0x0f, 0xfb, 0x10, - 0x8a, 0x66, 0x7a, 0x21, 0x5e, 0x5b, 0xaa, 0xf4, 0xfd, 0x56, 0xb4, 0x04, 0x4d, 0x31, 0xbd, 0xe9, - 0xb8, 0x24, 0xd4, 0x9f, 0x19, 0xbe, 0xcd, 0x5f, 0x0a, 0x5b, 0x97, 0xcf, 0x2d, 0x06, 0x56, 0xf8, - 0x24, 0xc2, 0xec, 0xaf, 0x69, 0x95, 0x40, 0x4a, 0x93, 0xe1, 0x20, 0x9a, 0x94, 0x4d, 0xbd, 0xb8, - 0xc6, 0x81, 0xfb, 0x6b, 0x5a, 0x84, 0x47, 0x52, 0xeb, 0xdc, 0x1a, 0xcf, 0xc3, 0xc8, 0x70, 0xa8, - 0x46, 0x0d, 0x22, 0x20, 0x3d, 0xfb, 0xc8, 0x7f, 0xb2, 0x07, 0x28, 0x38, 0x0d, 0xc7, 0xf1, 0x48, - 0xef, 0xca, 0xcb, 0xa7, 0x08, 0xad, 0x18, 0xce, 0x9f, 0x99, 0x8c, 0x52, 0xec, 0x0e, 0xe4, 0xbd, - 0xf0, 0xc4, 0x8a, 0xd4, 0xf1, 0xe8, 0xf5, 0x19, 0x04, 0xb5, 0x9a, 0x5d, 0x9c, 0x29, 0x84, 0x56, - 0x7f, 0x3f, 0x03, 0x05, 0xd1, 0x03, 0x6c, 0x0b, 0xaa, 0x83, 0xf6, 0x50, 0x7f, 0xd2, 0xd0, 0x3a, - 0x8d, 0xdd, 0x6e, 0x5b, 0x5c, 0x31, 0x79, 0xac, 0x35, 0x7a, 0x42, 0x40, 0x6a, 0xed, 0x27, 0xfd, - 0xcf, 0xdb, 0xdc, 0xaf, 0xd7, 0x6a, 0xf7, 0xbe, 0x54, 0xb2, 0xdc, 0xa9, 0xdd, 0x3e, 0x6c, 0x68, - 0x28, 0x2b, 0xcb, 0x50, 0x68, 0x7f, 0xd1, 0x6e, 0x1e, 0x91, 0xb0, 0xac, 0x01, 0xb4, 0xda, 0x8d, - 0x6e, 0xb7, 0xdf, 0x44, 0xe1, 0xb9, 0xc1, 0x18, 0xd4, 0x9a, 0x5a, 0xbb, 0x31, 0x6c, 0xeb, 0x8d, - 0x66, 0xb3, 0x7f, 0xd4, 0x1b, 0x2a, 0x05, 0x2c, 0xb1, 0xd1, 0x1d, 0xb6, 0xb5, 0x18, 0x44, 0x2f, - 0x82, 0xb5, 0xb4, 0xfe, 0x61, 0x0c, 0x29, 0xed, 0x96, 0xd0, 0x88, 0xa3, 0xb1, 0x52, 0xff, 0x78, - 0x0b, 0x6a, 0xe9, 0xa9, 0xc9, 0x3e, 0x81, 0xa2, 0x69, 0xa6, 0xc6, 0xf8, 0xc6, 0xaa, 0x29, 0x7c, - 0xbf, 0x65, 0x46, 0xc3, 0xcc, 0x7f, 0xb0, 0xd7, 0xa2, 0x85, 0xb4, 0xbe, 0xb4, 0x90, 0xa2, 0x65, - 0xf4, 0x43, 0xd8, 0x14, 0x4f, 0xa2, 0x98, 0x46, 0x68, 0x8c, 0x8c, 0xc0, 0x4a, 0xaf, 0x92, 0x26, - 0x21, 0x5b, 0x02, 0xb7, 0xbf, 0xa6, 0xd5, 0xc6, 0x29, 0x08, 0xfb, 0x3e, 0xd4, 0x0c, 0xb2, 0xd3, - 0x63, 0xfe, 0x9c, 0xac, 0x51, 0x36, 0x10, 0x27, 0xb1, 0x57, 0x0d, 0x19, 0x80, 0x13, 0xd1, 0xf4, - 0xbd, 0x59, 0xc2, 0x9c, 0x4f, 0x1d, 0xa0, 0xf9, 0xde, 0x4c, 0xe2, 0xad, 0x98, 0x52, 0x9a, 0x7d, - 0x0c, 0x15, 0x51, 0xf3, 0xc4, 0x57, 0x11, 0x2f, 0x59, 0x5e, 0x6d, 0xd2, 0x10, 0xf7, 0xd7, 0xb4, - 0xf2, 0x38, 0x49, 0xb2, 0x87, 0xa8, 0x16, 0x26, 0xfa, 0x74, 0x41, 0x9e, 0x6b, 0x54, 0xdb, 0x88, - 0x0b, 0x8c, 0x38, 0xc5, 0xde, 0x07, 0xa0, 0x7a, 0x72, 0x9e, 0x62, 0x2a, 0x3a, 0xc5, 0xf7, 0x66, - 0x11, 0x4b, 0xc9, 0x8c, 0x12, 0x52, 0xf5, 0xb8, 0xa7, 0xa9, 0xb4, 0x5c, 0x3d, 0xf2, 0x36, 0x25, - 0xd5, 0xe3, 0x4e, 0xaa, 0xb8, 0x7a, 0x9c, 0x0d, 0x96, 0xaa, 0x17, 0x71, 0xf1, 0xea, 0x71, 0xa6, - 0xa8, 0x7a, 0x9c, 0xa7, 0xbc, 0x58, 0xbd, 0x88, 0x85, 0xaa, 0xc7, 0x39, 0xbe, 0xbf, 0x64, 0x08, - 0x54, 0x9e, 0x6b, 0x08, 0xe0, 0xb0, 0xa5, 0x4d, 0x81, 0xef, 0x43, 0x2d, 0x38, 0xf1, 0xce, 0x24, - 0x01, 0x52, 0x95, 0xb9, 0x07, 0x27, 0xde, 0x99, 0x2c, 0x41, 0xaa, 0x81, 0x0c, 0xc0, 0xda, 0xf2, - 0x26, 0xd2, 0x61, 0x57, 0x4d, 0xae, 0x2d, 0xb5, 0xf0, 0x89, 0x6d, 0x9d, 0x61, 0x6d, 0x8d, 0x28, - 0x81, 0x9d, 0x92, 0xf8, 0x6d, 0x02, 0xe1, 0x89, 0x49, 0x05, 0x64, 0x88, 0x92, 0x20, 0xf6, 0xe0, - 0x04, 0x38, 0xb7, 0xe6, 0xae, 0xcc, 0xa6, 0xc8, 0x73, 0xeb, 0xc8, 0x4d, 0x31, 0x56, 0x38, 0xa9, - 0x60, 0x4d, 0x56, 0x45, 0x60, 0x7d, 0x3d, 0xb7, 0xdc, 0xb1, 0x25, 0x62, 0xb7, 0x52, 0xab, 0x62, - 0x20, 0x70, 0xc9, 0xaa, 0x88, 0x20, 0xf1, 0xbc, 0x8e, 0xd9, 0xd9, 0xe2, 0xbc, 0x96, 0x98, 0x69, - 0x5e, 0xc7, 0xac, 0xf1, 0x82, 0x8a, 0x79, 0x2f, 0x2d, 0x2d, 0x28, 0x89, 0x99, 0x2f, 0xa8, 0x98, - 0xfb, 0x21, 0x88, 0xd9, 0xc4, 0x3b, 0x37, 0x15, 0xe1, 0xc5, 0x6b, 0x2d, 0x7a, 0x17, 0xc6, 0x71, - 0x0a, 0xe7, 0xaa, 0x6f, 0xa1, 0xe1, 0x21, 0xa6, 0xc2, 0x65, 0x79, 0xae, 0x6a, 0x84, 0x89, 0x97, - 0x92, 0x9f, 0x24, 0xa5, 0xc2, 0x66, 0x76, 0xe8, 0xd7, 0xcd, 0xe5, 0xc2, 0x0e, 0xed, 0xd0, 0x4f, - 0x0a, 0xc3, 0x14, 0x7b, 0x17, 0x68, 0x1a, 0x72, 0x16, 0x4b, 0x16, 0xdd, 0xd8, 0x2d, 0x82, 0xa1, - 0x68, 0x8a, 0xdf, 0x38, 0x59, 0x44, 0x19, 0x63, 0x73, 0x5c, 0x9f, 0xc8, 0x93, 0x85, 0x17, 0xd1, - 0x6c, 0x35, 0x71, 0xb2, 0x70, 0xa2, 0xa6, 0x39, 0x66, 0xf7, 0x80, 0xb8, 0x89, 0xfe, 0x38, 0xf5, - 0xba, 0x99, 0xef, 0xcd, 0x38, 0x75, 0x01, 0x09, 0x90, 0x16, 0x5b, 0xe0, 0x78, 0x6e, 0xd4, 0xf0, - 0x93, 0x54, 0x0b, 0x10, 0x11, 0x0b, 0x83, 0x71, 0x9c, 0x52, 0x7f, 0x7b, 0x03, 0x0a, 0x42, 0xd6, - 0xb2, 0x4b, 0xb0, 0x29, 0x44, 0x7e, 0xab, 0x31, 0x6c, 0xec, 0x36, 0x06, 0xa8, 0xa4, 0x31, 0xa8, - 0x71, 0x99, 0x1f, 0xc3, 0x32, 0xb8, 0x0f, 0x90, 0xd0, 0x8f, 0x41, 0xeb, 0xb8, 0x0f, 0x08, 0x5e, - 0xfe, 0x8a, 0x64, 0x96, 0x6d, 0x42, 0x99, 0x33, 0x72, 0x00, 0xdd, 0x78, 0x25, 0x2e, 0x9e, 0xce, - 0x4b, 0x2c, 0xfc, 0x98, 0x6b, 0x23, 0x61, 0xe1, 0x80, 0x42, 0xcc, 0x12, 0x9d, 0x83, 0x31, 0xa8, - 0x0d, 0xb5, 0xa3, 0x5e, 0x33, 0x29, 0xa7, 0x44, 0xb7, 0x14, 0x79, 0x36, 0x4f, 0x3a, 0xed, 0xa7, - 0x0a, 0x20, 0x13, 0xcf, 0x85, 0xd2, 0x65, 0x54, 0x33, 0x29, 0x13, 0x4a, 0x56, 0xd8, 0x55, 0xb8, - 0x34, 0xd8, 0xef, 0x3f, 0xd5, 0x39, 0x53, 0xdc, 0x84, 0x2a, 0xdb, 0x06, 0x45, 0x42, 0xf0, 0xec, - 0x6b, 0x58, 0x24, 0x41, 0x23, 0xc2, 0x81, 0xb2, 0x49, 0x47, 0xc8, 0x08, 0x1b, 0xf2, 0x7d, 0x57, - 0xc1, 0xa6, 0x70, 0xd6, 0x7e, 0xf7, 0xe8, 0xa0, 0x37, 0x50, 0xb6, 0xb0, 0x12, 0x04, 0xe1, 0x35, - 0x67, 0x71, 0x36, 0xc9, 0x6e, 0x7d, 0x89, 0x36, 0x70, 0x84, 0x3d, 0x6d, 0x68, 0xbd, 0x4e, 0xef, - 0xf1, 0x40, 0xd9, 0x8e, 0x73, 0x6e, 0x6b, 0x5a, 0x5f, 0x1b, 0x28, 0x97, 0x63, 0xc0, 0x60, 0xd8, - 0x18, 0x1e, 0x0d, 0x94, 0x2b, 0x71, 0x2d, 0x0f, 0xb5, 0x7e, 0xb3, 0x3d, 0x18, 0x74, 0x3b, 0x83, - 0xa1, 0x72, 0x95, 0x5d, 0x86, 0xad, 0xa4, 0x46, 0x11, 0x71, 0x5d, 0xaa, 0xa8, 0xf6, 0xb8, 0x3d, - 0x54, 0xae, 0xc5, 0xd5, 0x68, 0xf6, 0xbb, 0xdd, 0x06, 0x9d, 0x84, 0x5e, 0x47, 0x22, 0x3a, 0x12, - 0x16, 0xad, 0x79, 0x05, 0xeb, 0x75, 0xd4, 0x93, 0x41, 0x37, 0xa4, 0xa9, 0x31, 0x68, 0xff, 0xf8, - 0xa8, 0xdd, 0x6b, 0xb6, 0x95, 0x57, 0x93, 0xa9, 0x11, 0xc3, 0x6e, 0xc6, 0x53, 0x23, 0x06, 0xdd, - 0x8a, 0xcb, 0x8c, 0x40, 0x03, 0x65, 0x07, 0xf3, 0x13, 0xf5, 0xe8, 0xf5, 0xda, 0xcd, 0x21, 0xb6, - 0xf5, 0xb5, 0xb8, 0x17, 0x8f, 0x0e, 0x1f, 0x6b, 0x8d, 0x56, 0x5b, 0x51, 0x11, 0xa2, 0xb5, 0x7b, - 0x8d, 0x83, 0x68, 0xb4, 0x5f, 0x97, 0x46, 0xfb, 0xb0, 0x33, 0xd4, 0x94, 0xdb, 0xf1, 0xe8, 0x52, - 0xf2, 0x0d, 0xf6, 0x0a, 0x5c, 0x95, 0xe7, 0xa1, 0xfe, 0xb4, 0x33, 0xdc, 0x17, 0x07, 0xb7, 0x77, - 0xf8, 0xd1, 0x23, 0x21, 0x9b, 0xad, 0x26, 0x3f, 0xa1, 0x26, 0x5e, 0x4c, 0xdd, 0xdd, 0xad, 0xd0, - 0x63, 0xe0, 0x42, 0x01, 0x51, 0x3f, 0x03, 0x26, 0xbf, 0x8b, 0x2b, 0x42, 0x60, 0x19, 0xe4, 0x26, - 0xbe, 0x37, 0x8d, 0x5e, 0x9f, 0xc0, 0xdf, 0x68, 0x4a, 0xcf, 0xe6, 0x23, 0x3a, 0x12, 0x4d, 0x6e, - 0x97, 0xcb, 0x20, 0xf5, 0xef, 0x67, 0xa0, 0x96, 0x56, 0x3e, 0xc8, 0x63, 0x3a, 0xd1, 0x5d, 0x2f, - 0xe4, 0xcf, 0x79, 0x05, 0xf1, 0x73, 0xb5, 0x93, 0x9e, 0x17, 0xd2, 0x7b, 0x5e, 0x64, 0xd9, 0xc7, - 0xba, 0x04, 0xcf, 0x35, 0x4e, 0xb3, 0x0e, 0x5c, 0x4a, 0x3d, 0x2d, 0x9c, 0x7a, 0x4c, 0xad, 0x1e, - 0x3f, 0x09, 0xba, 0x50, 0x7f, 0x8d, 0x05, 0xcb, 0x6d, 0x12, 0x6f, 0x04, 0xe4, 0x92, 0x37, 0x02, - 0xf6, 0xa1, 0x9a, 0xd2, 0x75, 0xc8, 0x21, 0x33, 0x49, 0xd7, 0xb4, 0x68, 0x4f, 0x5e, 0x5e, 0x4d, - 0xf5, 0xef, 0x66, 0xa0, 0x22, 0x6b, 0x3e, 0xdf, 0x39, 0x27, 0x0a, 0x2b, 0x11, 0xbf, 0x75, 0xdb, - 0x8c, 0x9e, 0xf1, 0x8a, 0x40, 0x1d, 0xfa, 0x08, 0x02, 0x77, 0x3e, 0xef, 0x9d, 0x0e, 0xe2, 0xe6, - 0xc8, 0x20, 0x76, 0x13, 0x80, 0x6e, 0x17, 0xef, 0x7d, 0x8e, 0x04, 0xe2, 0x0d, 0xe8, 0x04, 0xa2, - 0xde, 0x82, 0xd2, 0xde, 0x69, 0x14, 0x65, 0x23, 0x3f, 0x6a, 0x57, 0xe2, 0x4f, 0x12, 0xa8, 0x7f, - 0x98, 0x81, 0x5a, 0xf2, 0x00, 0x10, 0x1d, 0x49, 0xf3, 0x27, 0xa9, 0xf9, 0x74, 0x58, 0x37, 0x47, - 0xc9, 0xf7, 0x11, 0xd6, 0xe5, 0xef, 0x23, 0xbc, 0x2e, 0x32, 0xcb, 0xca, 0x22, 0x3f, 0x2e, 0x4b, - 0x3c, 0x78, 0xf0, 0x10, 0x2a, 0xf8, 0x5f, 0xb3, 0x26, 0x96, 0xef, 0x5b, 0x66, 0xfa, 0x12, 0x41, - 0x42, 0x9c, 0x22, 0x22, 0x1b, 0xcf, 0x9a, 0x08, 0x55, 0x73, 0xe5, 0x1b, 0x45, 0xf4, 0x76, 0xd6, - 0x7f, 0xcf, 0x42, 0x59, 0xd2, 0x23, 0xbf, 0xd1, 0xf4, 0xbb, 0x01, 0xa5, 0xe4, 0xc5, 0x1c, 0x71, - 0xcb, 0x3c, 0x06, 0xa4, 0xc6, 0x2a, 0xbb, 0x30, 0x56, 0x75, 0x28, 0xf8, 0xfc, 0x6a, 0xa3, 0xf0, - 0x06, 0x47, 0xc9, 0xb4, 0xdf, 0x35, 0xff, 0x92, 0x03, 0x92, 0x0f, 0xa0, 0x22, 0x39, 0x4d, 0x03, - 0x71, 0x13, 0x7b, 0x91, 0xbe, 0x9c, 0x38, 0x50, 0x03, 0x76, 0x19, 0x36, 0x26, 0xa7, 0xba, 0x39, - 0xe2, 0x17, 0x55, 0x4b, 0x5a, 0x7e, 0x72, 0xda, 0x1a, 0xd1, 0xf1, 0xd1, 0x24, 0x56, 0x9d, 0xb8, - 0x2b, 0xab, 0x38, 0x89, 0x14, 0xa4, 0xbb, 0x50, 0x98, 0x9c, 0xca, 0x17, 0x4e, 0x97, 0xba, 0x7c, - 0x63, 0x72, 0x4a, 0x37, 0x54, 0xdf, 0x83, 0x6d, 0xb1, 0x7f, 0x1b, 0x81, 0xce, 0x1f, 0xf4, 0xa0, - 0x97, 0x94, 0xf8, 0x13, 0x77, 0x5b, 0x1c, 0xd7, 0x08, 0x06, 0x84, 0xc1, 0x19, 0xa7, 0x42, 0x45, - 0x9a, 0x80, 0xfc, 0xc9, 0xa9, 0x92, 0x96, 0x82, 0xb1, 0x47, 0x50, 0x99, 0x9c, 0xf2, 0x01, 0x1d, - 0x7a, 0x07, 0x96, 0xb8, 0x2b, 0xb0, 0xbd, 0x38, 0x94, 0x14, 0x33, 0x90, 0xa2, 0x64, 0x57, 0x60, - 0x43, 0x33, 0xce, 0x06, 0x3f, 0xee, 0x92, 0x12, 0x59, 0xd2, 0x44, 0xea, 0xb3, 0x5c, 0xb1, 0xa6, - 0x6c, 0xaa, 0xff, 0x38, 0x03, 0xb5, 0xc4, 0x06, 0xc0, 0x45, 0xc8, 0xee, 0xc9, 0x6f, 0xc9, 0xd7, - 0x17, 0xcd, 0x04, 0x24, 0xb9, 0x3f, 0xbc, 0x98, 0xf1, 0x17, 0x57, 0x57, 0x3d, 0x13, 0xb6, 0xca, - 0x8b, 0x9d, 0x5d, 0xf9, 0x8a, 0xf5, 0x63, 0xc8, 0x0e, 0x2f, 0x66, 0xdc, 0xdf, 0x84, 0x5b, 0x22, - 0xb7, 0x4d, 0xf9, 0x66, 0x48, 0xa1, 0x29, 0x9f, 0xb7, 0xbf, 0xe4, 0xaf, 0x62, 0x1c, 0x6a, 0x9d, - 0x83, 0x86, 0xf6, 0x25, 0xc5, 0x1e, 0x91, 0xd2, 0xb0, 0xd7, 0xd7, 0xda, 0x9d, 0xc7, 0x3d, 0x02, - 0xe4, 0xc8, 0x1b, 0x95, 0x54, 0xb1, 0x61, 0x9a, 0x7b, 0xa7, 0xf2, 0x0b, 0x4b, 0x99, 0xd4, 0x0b, - 0x4b, 0xe9, 0x8b, 0xf4, 0xeb, 0x8b, 0x17, 0xe9, 0x59, 0xbc, 0x0a, 0xe3, 0x25, 0xcd, 0xde, 0x84, - 0xdc, 0xe4, 0xd4, 0xba, 0x48, 0x1b, 0x7a, 0xe9, 0x05, 0x44, 0x04, 0xea, 0xcf, 0x33, 0xc0, 0x52, - 0x15, 0xe1, 0xb6, 0xc7, 0x77, 0xad, 0xcb, 0x27, 0x50, 0x17, 0x81, 0x74, 0x9c, 0x4a, 0x72, 0x9b, - 0x8b, 0x2e, 0xbd, 0xec, 0x25, 0x01, 0xa6, 0xc9, 0x4b, 0x66, 0xec, 0x3d, 0xe0, 0x8f, 0x2e, 0x52, - 0x88, 0x49, 0xee, 0x39, 0x76, 0xa2, 0x96, 0xd0, 0x24, 0xaf, 0x2c, 0xca, 0xaf, 0x47, 0x72, 0x8f, - 0xfb, 0x66, 0x32, 0x6a, 0xb4, 0xe6, 0xd5, 0xdf, 0xcd, 0xc0, 0xa5, 0xf4, 0x84, 0xf8, 0xc5, 0x5a, - 0x99, 0x7e, 0x2a, 0x33, 0xbb, 0xf8, 0x54, 0xe6, 0xaa, 0xf9, 0x94, 0x5b, 0x39, 0x9f, 0x7e, 0x2b, - 0x03, 0xdb, 0x52, 0xef, 0x27, 0xd6, 0xe2, 0x5f, 0x52, 0xcd, 0xa4, 0x17, 0x33, 0x73, 0xa9, 0x17, - 0x33, 0xd5, 0x3f, 0xc9, 0xc0, 0x95, 0x85, 0x9a, 0x68, 0xd6, 0x5f, 0x6a, 0x5d, 0xd2, 0x2f, 0x6b, - 0x92, 0xd7, 0x3f, 0x7a, 0x33, 0x20, 0x73, 0x37, 0x2b, 0xbd, 0xac, 0x49, 0x47, 0x41, 0x74, 0x1e, - 0xf9, 0xaa, 0x78, 0x60, 0x48, 0x0f, 0x2e, 0xdc, 0xb1, 0x18, 0xec, 0x12, 0x41, 0x06, 0x17, 0xee, - 0x58, 0xfd, 0xe3, 0x0c, 0x5c, 0x5b, 0x68, 0x43, 0x63, 0x1e, 0x7a, 0xe2, 0x30, 0xf7, 0x2f, 0xa9, - 0x19, 0xb7, 0xa0, 0x4c, 0x47, 0xdd, 0xe2, 0x84, 0x98, 0x77, 0x2b, 0x18, 0x49, 0xb9, 0x0a, 0x64, - 0x4d, 0xe3, 0x42, 0x5c, 0x31, 0xc7, 0x9f, 0xb8, 0x60, 0x4f, 0xbc, 0xb9, 0x2f, 0xae, 0x94, 0xd3, - 0x6f, 0xf5, 0x43, 0xd8, 0x4a, 0xaa, 0xde, 0x14, 0x0f, 0x9c, 0xde, 0x82, 0xb2, 0x6b, 0x9d, 0xe9, - 0xd1, 0xf3, 0xa7, 0x22, 0x5e, 0xca, 0xb5, 0xce, 0x04, 0x81, 0xba, 0x27, 0xcb, 0xc2, 0xf8, 0xb3, - 0x0d, 0x8e, 0x99, 0x0a, 0xbc, 0xf1, 0x1c, 0x33, 0x42, 0x61, 0x6e, 0x52, 0x2b, 0x0b, 0xae, 0x75, - 0x46, 0xf3, 0xf0, 0x4c, 0xe4, 0xd3, 0x30, 0x4d, 0x11, 0x7c, 0xb0, 0xea, 0x3d, 0xb2, 0x6b, 0x50, - 0x9c, 0xf9, 0xa9, 0x6e, 0x2a, 0xcc, 0x7c, 0x5e, 0xec, 0x6d, 0x11, 0x8d, 0xf5, 0xbc, 0x40, 0x05, - 0x1e, 0x9f, 0x25, 0x3e, 0xeb, 0x92, 0x4b, 0x3e, 0xeb, 0xf2, 0x91, 0x10, 0x83, 0x64, 0xf7, 0xf1, - 0x92, 0x15, 0xc8, 0xda, 0xe6, 0x39, 0x15, 0x5c, 0xd5, 0xf0, 0x27, 0x69, 0x72, 0xd6, 0xd7, 0x22, - 0x20, 0x0c, 0x7f, 0xaa, 0xbb, 0x50, 0xd6, 0x52, 0x46, 0x6e, 0x45, 0xf2, 0x17, 0x05, 0xe9, 0x27, - 0x9b, 0x92, 0x0e, 0xd2, 0xca, 0x89, 0xbb, 0x28, 0x50, 0x03, 0x21, 0xf8, 0x9e, 0x18, 0xfe, 0xf8, - 0xc4, 0xf0, 0xbb, 0x96, 0x7b, 0x1c, 0x9e, 0x60, 0x97, 0x73, 0x37, 0xae, 0xdc, 0x85, 0xc0, 0x41, - 0xd1, 0x74, 0xc0, 0x5e, 0x74, 0x88, 0x3c, 0xfa, 0x60, 0x84, 0x6b, 0x9d, 0x09, 0xfe, 0x57, 0x01, - 0xb0, 0xff, 0x05, 0x9a, 0x9f, 0x26, 0x96, 0x3c, 0xc7, 0xe4, 0x68, 0x75, 0x4b, 0xb4, 0x57, 0x3c, - 0x91, 0xd0, 0xb2, 0x26, 0xaa, 0x23, 0x46, 0x9e, 0x37, 0x48, 0x74, 0xc2, 0x77, 0x1a, 0x46, 0xf6, - 0x1a, 0x54, 0x22, 0x8f, 0x04, 0xbd, 0x12, 0xc6, 0x8b, 0x2f, 0x47, 0xb0, 0xde, 0x7c, 0xaa, 0xfe, - 0x5e, 0x16, 0x2a, 0x0d, 0x1e, 0x9a, 0x33, 0xbb, 0xe8, 0xcf, 0x42, 0xf6, 0xeb, 0x70, 0x39, 0x38, - 0xb5, 0x67, 0xe2, 0x0b, 0x0f, 0x14, 0x11, 0x43, 0xd1, 0xd5, 0xa2, 0x13, 0xef, 0x49, 0x9d, 0x28, - 0x58, 0xee, 0x0f, 0x4e, 0xed, 0x19, 0x0f, 0xea, 0xef, 0x98, 0xe7, 0x14, 0x41, 0xcf, 0x8f, 0xf9, - 0x59, 0xb0, 0x84, 0xa0, 0x9b, 0xf2, 0x98, 0xfd, 0xec, 0x54, 0x64, 0x2b, 0xe2, 0x1e, 0x10, 0x78, - 0x78, 0xca, 0x69, 0xee, 0xc1, 0x16, 0xbf, 0xc7, 0xb3, 0xbc, 0x01, 0x6f, 0x72, 0x44, 0x32, 0xbf, - 0x07, 0xb0, 0x45, 0xf9, 0x89, 0xe7, 0x2c, 0xf5, 0xb1, 0x37, 0xbb, 0x10, 0xa7, 0x88, 0x6f, 0x3e, - 0xa7, 0xaa, 0x1d, 0x4e, 0x8a, 0x20, 0xf1, 0x8c, 0x4d, 0x90, 0x86, 0x5e, 0x6f, 0xc3, 0xd5, 0xe7, - 0xb4, 0xe9, 0x65, 0x91, 0x0a, 0x45, 0x29, 0x52, 0xe1, 0xfa, 0x2e, 0x6c, 0xaf, 0x2a, 0xef, 0xdb, - 0xe4, 0xa1, 0xfe, 0x41, 0x15, 0x20, 0x99, 0xb1, 0x29, 0x75, 0x34, 0xb3, 0xa0, 0x8e, 0x7e, 0xab, - 0xa8, 0x9c, 0x0f, 0xa1, 0x86, 0x5d, 0xa5, 0x27, 0x1c, 0xd9, 0x95, 0x1c, 0x15, 0xa4, 0x1a, 0x26, - 0xb7, 0x1d, 0x97, 0xa3, 0x1b, 0x72, 0x2b, 0xa3, 0x1b, 0x3e, 0x80, 0x02, 0x3f, 0x68, 0x0b, 0xc4, - 0x05, 0xdb, 0xab, 0x8b, 0xab, 0xef, 0xbe, 0xb8, 0x20, 0x10, 0xd1, 0xb1, 0x36, 0xd4, 0x50, 0xf4, - 0xfb, 0x76, 0x78, 0x32, 0x95, 0xaf, 0xdb, 0xde, 0x5c, 0xe6, 0x8c, 0xc8, 0xf8, 0x23, 0x98, 0x86, - 0x9c, 0x94, 0xb4, 0xd7, 0x70, 0x2a, 0xbc, 0xbf, 0xa4, 0xbd, 0x16, 0x64, 0xed, 0x75, 0x38, 0xe5, - 0x3e, 0x5f, 0xd4, 0x5e, 0xdf, 0x85, 0x4b, 0xe2, 0xd2, 0x12, 0x32, 0x60, 0x77, 0x12, 0x3d, 0x0f, - 0xc0, 0x14, 0xaf, 0x3b, 0x0d, 0xa7, 0x64, 0xdb, 0x21, 0xf9, 0x17, 0xb0, 0x3d, 0x3e, 0x31, 0xdc, - 0x63, 0x4b, 0x0f, 0x47, 0x8e, 0x4e, 0x5f, 0x0b, 0xd0, 0xa7, 0xc6, 0x4c, 0x28, 0xd5, 0x6f, 0x2e, - 0x55, 0xb6, 0x49, 0xc4, 0xc3, 0x91, 0x43, 0x11, 0x64, 0x71, 0x0c, 0xcc, 0xd6, 0x78, 0x11, 0xbe, - 0x70, 0x14, 0x0d, 0x4b, 0x47, 0xd1, 0x8b, 0x6a, 0x76, 0x79, 0x85, 0x9a, 0x9d, 0x28, 0xcb, 0x15, - 0x59, 0x59, 0x66, 0xef, 0x40, 0x41, 0x5c, 0xdb, 0x14, 0x7e, 0x5f, 0xb6, 0xbc, 0x3a, 0xb4, 0x88, - 0x04, 0x4b, 0x8a, 0x02, 0x23, 0xe8, 0x16, 0x7e, 0x8d, 0x97, 0x24, 0xc3, 0xd8, 0xae, 0x70, 0x7a, - 0xc6, 0xd1, 0x6e, 0xc2, 0xc7, 0x7b, 0x5d, 0xca, 0x38, 0xc6, 0x09, 0xbb, 0x7c, 0x81, 0xe3, 0xfa, - 0x3f, 0xda, 0x80, 0x0d, 0x11, 0x5e, 0x7d, 0x0f, 0x72, 0xa6, 0xef, 0xcd, 0xe2, 0x48, 0xe5, 0x15, - 0x5a, 0x3b, 0x7d, 0x20, 0x0e, 0x15, 0xfc, 0xfb, 0xb0, 0x61, 0x98, 0xa6, 0x3e, 0x39, 0x4d, 0x9f, - 0x47, 0x2f, 0x28, 0xd0, 0xfb, 0x6b, 0x5a, 0xde, 0x20, 0x4d, 0xfa, 0x13, 0x28, 0x21, 0x7d, 0x12, - 0x3f, 0x5a, 0x5e, 0x36, 0x0b, 0x22, 0x55, 0x77, 0x7f, 0x4d, 0x2b, 0x1a, 0x91, 0xda, 0xfb, 0x83, - 0xb4, 0x67, 0x3f, 0xb7, 0xd4, 0xc0, 0x05, 0x3d, 0x6d, 0xc1, 0xc7, 0xff, 0xab, 0xc0, 0x5d, 0xbd, - 0xf1, 0x8e, 0x9d, 0x97, 0x8f, 0x3e, 0x97, 0xf6, 0xf7, 0xfd, 0x35, 0x8d, 0xef, 0x5b, 0xd1, 0x7e, - 0xff, 0x51, 0xe4, 0x75, 0x8f, 0x3f, 0xa4, 0xb3, 0xa2, 0x67, 0x50, 0x0c, 0xc6, 0xae, 0x77, 0x92, - 0x89, 0xc8, 0x66, 0x9a, 0x51, 0x18, 0x61, 0x61, 0x89, 0x2d, 0xde, 0xd5, 0x89, 0x2d, 0xde, 0xe2, - 0x1f, 0x41, 0x99, 0x3b, 0x61, 0x39, 0x5f, 0x71, 0xa9, 0x6b, 0x93, 0x4d, 0x99, 0x8e, 0xf5, 0x92, - 0x2d, 0xba, 0x19, 0xb5, 0xd3, 0xb7, 0xe4, 0x93, 0x93, 0x1b, 0x2b, 0x3b, 0x4a, 0x8b, 0x0f, 0x51, - 0x78, 0x63, 0x35, 0xce, 0xc3, 0xba, 0xb0, 0x2d, 0x8e, 0x18, 0xf8, 0x06, 0x1c, 0xed, 0x99, 0xb0, - 0x34, 0x5e, 0xa9, 0x1d, 0x7a, 0x7f, 0x4d, 0x63, 0xc6, 0xf2, 0xbe, 0xdd, 0x84, 0xad, 0xa8, 0x4a, - 0xb4, 0xb3, 0x4a, 0x11, 0x50, 0x72, 0x93, 0x92, 0x7d, 0x77, 0x7f, 0x4d, 0xdb, 0x34, 0xd2, 0x20, - 0xd6, 0x81, 0x4b, 0x51, 0x26, 0xe4, 0x6a, 0x17, 0x3d, 0x53, 0x59, 0x1a, 0x45, 0x79, 0xaf, 0xde, - 0x5f, 0xd3, 0xb6, 0x8c, 0xa5, 0x0d, 0xfc, 0x20, 0xaa, 0x8f, 0xac, 0x1c, 0xf2, 0x95, 0x78, 0x6b, - 0x65, 0x37, 0x25, 0x9a, 0x6a, 0x5c, 0xb3, 0x04, 0x94, 0xc4, 0x31, 0x5c, 0xd7, 0xe0, 0xca, 0x6a, - 0x09, 0x23, 0x6f, 0x33, 0x39, 0xbe, 0xcd, 0xa8, 0xe9, 0x87, 0xcf, 0xd2, 0xaf, 0x6a, 0x48, 0x9b, - 0xce, 0x8f, 0xa0, 0x9a, 0x12, 0xb1, 0xac, 0x0c, 0x85, 0xe8, 0x99, 0x75, 0xba, 0x52, 0xd1, 0xec, - 0x1f, 0x7e, 0xa9, 0x64, 0x10, 0xdc, 0xe9, 0x0d, 0x86, 0x8d, 0xde, 0x50, 0x59, 0xe7, 0x89, 0xc3, - 0x6e, 0xa3, 0xd9, 0x56, 0xb2, 0xea, 0x9f, 0x64, 0xa1, 0x14, 0x9f, 0xb2, 0x7d, 0x77, 0x6f, 0x58, - 0xec, 0x66, 0xca, 0xca, 0x6e, 0xa6, 0x05, 0x53, 0x8f, 0x7f, 0x11, 0x81, 0x3f, 0x88, 0xb7, 0x99, - 0x36, 0xa8, 0x82, 0xe5, 0x0b, 0xdc, 0xf9, 0x6f, 0x78, 0x81, 0x5b, 0x0e, 0x21, 0xdf, 0x48, 0x87, - 0x90, 0x2f, 0x3c, 0xb5, 0x5f, 0xa0, 0x47, 0xb0, 0xe5, 0xa7, 0xf6, 0xe9, 0xd3, 0x9d, 0x4f, 0x6c, - 0xeb, 0x4c, 0xc4, 0x5c, 0x8b, 0x54, 0x7a, 0x87, 0x86, 0x97, 0xec, 0xd0, 0xdf, 0x44, 0xda, 0x3f, - 0x80, 0xed, 0xc9, 0x69, 0xfc, 0xf4, 0x76, 0xe2, 0x5c, 0xa9, 0x50, 0x95, 0x56, 0xe2, 0xd8, 0x9b, - 0xf1, 0xb7, 0xc6, 0xaa, 0xb2, 0x1b, 0x28, 0x1e, 0xad, 0xf8, 0xe3, 0x63, 0x7f, 0x35, 0x03, 0x90, - 0x9c, 0x3f, 0xfd, 0xc2, 0xae, 0x5c, 0xc9, 0x5b, 0x96, 0x7d, 0x81, 0xb7, 0xec, 0x65, 0xef, 0x89, - 0x7d, 0x0d, 0xa5, 0xf8, 0xc4, 0xf1, 0xbb, 0x4f, 0xac, 0x6f, 0x55, 0xe4, 0x6f, 0x44, 0x6e, 0xed, - 0xf8, 0xc8, 0xee, 0x17, 0xed, 0x8b, 0x54, 0xf1, 0xd9, 0x97, 0x14, 0x7f, 0xce, 0x7d, 0xcb, 0x71, - 0xe1, 0xbf, 0xe4, 0xd5, 0x24, 0x4f, 0xf4, 0x5c, 0x6a, 0xa2, 0xab, 0x73, 0xe1, 0x20, 0xff, 0xc5, - 0x8b, 0xfe, 0x56, 0x0d, 0xfe, 0x6f, 0x99, 0xc8, 0x8b, 0x1b, 0xbf, 0x96, 0xfe, 0x5c, 0xa5, 0x77, - 0xb5, 0x23, 0xfa, 0xdb, 0x14, 0xf7, 0x42, 0x1f, 0x55, 0xee, 0x45, 0x3e, 0xaa, 0x37, 0x21, 0xcf, - 0xb7, 0xbb, 0xfc, 0xf3, 0xfc, 0x53, 0x1c, 0xff, 0xd2, 0x6f, 0x9a, 0xa8, 0xaa, 0x50, 0xf2, 0x79, - 0x7b, 0xb7, 0xa3, 0x7c, 0xa3, 0xef, 0xb1, 0xd0, 0x15, 0x97, 0xff, 0x87, 0x4b, 0xd4, 0xef, 0xda, - 0x25, 0x2f, 0x76, 0x5b, 0xa8, 0xff, 0x3b, 0x03, 0xd5, 0x54, 0x04, 0xc1, 0x77, 0x28, 0x62, 0xa5, - 0x5c, 0xce, 0xfe, 0x5f, 0x24, 0x97, 0x53, 0xd1, 0xb8, 0xc5, 0x74, 0x34, 0x2e, 0x8a, 0xbb, 0x4a, - 0xca, 0x84, 0x59, 0x65, 0xec, 0x64, 0x56, 0x1a, 0x3b, 0x37, 0xe3, 0x8f, 0x46, 0x76, 0x5a, 0x3c, - 0xf8, 0xb5, 0xaa, 0x49, 0x10, 0xf6, 0x29, 0x5c, 0x13, 0x4e, 0x04, 0xde, 0x3f, 0xde, 0x44, 0x8f, - 0x3f, 0x29, 0x29, 0x8c, 0xf2, 0x2b, 0x9c, 0x80, 0x7f, 0x91, 0x66, 0xd2, 0x88, 0xb0, 0x6a, 0x07, - 0xaa, 0xa9, 0xd0, 0x0c, 0xe9, 0x13, 0xb6, 0x19, 0xf9, 0x13, 0xb6, 0x6c, 0x07, 0xf2, 0x67, 0x27, - 0x96, 0x6f, 0xad, 0x78, 0x09, 0x99, 0x23, 0xd4, 0xef, 0x43, 0x45, 0x0e, 0x13, 0x63, 0xef, 0x40, - 0xde, 0x0e, 0xad, 0x69, 0xe4, 0x1e, 0xb9, 0xb2, 0x1c, 0x49, 0xd6, 0x09, 0xad, 0xa9, 0xc6, 0x89, - 0xd4, 0xdf, 0xcf, 0x80, 0xb2, 0x88, 0x93, 0xbe, 0xb3, 0x9b, 0x79, 0xce, 0x77, 0x76, 0xd7, 0x53, - 0x95, 0x5c, 0xf5, 0xa9, 0xdc, 0xf8, 0x35, 0xd6, 0xdc, 0x73, 0x5e, 0x63, 0x65, 0x77, 0xa0, 0xe8, - 0x5b, 0xf4, 0x11, 0x53, 0x73, 0xc5, 0xd5, 0x8f, 0x18, 0xa7, 0xfe, 0x4e, 0x06, 0x0a, 0x22, 0xa6, - 0x6d, 0xa5, 0xbf, 0xea, 0x2d, 0x28, 0xf0, 0x0f, 0x9a, 0x46, 0xcf, 0x8a, 0x2d, 0x45, 0x8c, 0x47, - 0x78, 0x76, 0x93, 0x47, 0xfa, 0xa5, 0xfd, 0x57, 0x87, 0x8e, 0xe1, 0x6a, 0x04, 0x17, 0x1f, 0x9a, - 0x32, 0xa6, 0xe2, 0x62, 0x3a, 0x7f, 0x63, 0x0a, 0x08, 0x44, 0x77, 0xd0, 0xd5, 0x1f, 0x40, 0x41, - 0xc4, 0xcc, 0xad, 0xac, 0xca, 0xcb, 0x3e, 0x66, 0xb9, 0x03, 0x90, 0x04, 0xd1, 0xad, 0xca, 0x41, - 0xbd, 0x07, 0xc5, 0x28, 0x6e, 0x0e, 0xe7, 0x5f, 0x52, 0xb4, 0xb8, 0x53, 0x24, 0x57, 0xc6, 0x11, - 0x5f, 0x17, 0xe8, 0x7a, 0xe3, 0x53, 0x72, 0x96, 0xbf, 0x07, 0x74, 0xc1, 0x6a, 0xb8, 0xf4, 0x18, - 0x57, 0xfa, 0xf3, 0x12, 0x31, 0x11, 0xbb, 0x07, 0xb1, 0xbc, 0x7c, 0x99, 0x6b, 0x41, 0x6d, 0x44, - 0x57, 0xf1, 0x68, 0x96, 0x3d, 0x14, 0xde, 0xd4, 0x2e, 0x3d, 0xdc, 0x98, 0x91, 0xdf, 0x7f, 0x4d, - 0xd5, 0x49, 0x93, 0xc8, 0xd4, 0x1a, 0x54, 0xe4, 0x60, 0x1f, 0xb5, 0x01, 0x5b, 0x07, 0x56, 0x68, - 0xa0, 0xfc, 0x89, 0x9e, 0x28, 0xe2, 0xf3, 0x17, 0x7f, 0xa4, 0xe7, 0xef, 0x22, 0x9d, 0xc6, 0x89, - 0xd4, 0x3f, 0xc9, 0x81, 0xb2, 0x88, 0x7b, 0xd1, 0xb5, 0xc4, 0x5b, 0x50, 0xf6, 0x68, 0x5e, 0xa4, - 0x3e, 0x25, 0xc6, 0x41, 0x52, 0x68, 0x7f, 0xea, 0x7b, 0x32, 0x45, 0x3b, 0xd8, 0xe7, 0x5f, 0x94, - 0xb9, 0xca, 0xef, 0xa0, 0x39, 0xde, 0x98, 0xa6, 0x75, 0x85, 0xae, 0x9c, 0x75, 0xbd, 0x31, 0xdd, - 0x76, 0x14, 0xde, 0x09, 0x1e, 0x81, 0x5a, 0xd1, 0x8a, 0xc2, 0x25, 0x41, 0xe7, 0x77, 0x22, 0xe0, - 0x3f, 0x0c, 0xc4, 0xfd, 0xd1, 0x22, 0x07, 0x0c, 0x83, 0xe8, 0x0d, 0xfb, 0xb1, 0xf8, 0xee, 0x55, - 0x96, 0xde, 0xb0, 0x6f, 0xba, 0x74, 0xd9, 0x91, 0x3e, 0x0c, 0x37, 0x16, 0x5f, 0xfc, 0x13, 0x5f, - 0x11, 0x40, 0xd4, 0xeb, 0xfc, 0xcb, 0x60, 0xbe, 0x15, 0x04, 0xfc, 0xfd, 0xbe, 0x92, 0x78, 0xb8, - 0x51, 0x00, 0xe3, 0xe7, 0x51, 0xc5, 0x47, 0xdb, 0x90, 0x04, 0xc4, 0x2b, 0x82, 0xfc, 0x93, 0x6d, - 0x48, 0x70, 0x0d, 0x8a, 0x3f, 0xf5, 0x5c, 0x8b, 0xbc, 0x1c, 0x65, 0xaa, 0x55, 0x01, 0xd3, 0x07, - 0xc6, 0x0c, 0x37, 0x02, 0x87, 0xae, 0x2a, 0xf3, 0x6b, 0x7e, 0x3c, 0xa1, 0xfe, 0xeb, 0x0c, 0x6c, - 0x2f, 0xf6, 0x35, 0x4d, 0xa3, 0x0a, 0x14, 0x9b, 0xfd, 0xae, 0xde, 0x6b, 0x1c, 0xb4, 0x95, 0x35, - 0xb6, 0x09, 0xe5, 0xfe, 0xee, 0x67, 0xed, 0xe6, 0x90, 0x03, 0x32, 0xf4, 0x12, 0xc0, 0x40, 0xdf, - 0xef, 0xb4, 0x5a, 0xed, 0x1e, 0xb7, 0x28, 0xfa, 0xbb, 0x9f, 0xe9, 0xdd, 0x7e, 0x93, 0x7f, 0xdc, - 0x29, 0x8a, 0x78, 0x18, 0x28, 0x39, 0x8a, 0x87, 0xa0, 0x60, 0x78, 0x4c, 0xe6, 0x79, 0x94, 0xf7, - 0xd3, 0x81, 0xde, 0xec, 0x0d, 0x95, 0x0d, 0x4c, 0xf5, 0x8e, 0xba, 0x5d, 0x4a, 0x51, 0x38, 0x67, - 0xb3, 0x7f, 0x70, 0xa8, 0xb5, 0x07, 0x03, 0x7d, 0xd0, 0xf9, 0x49, 0x5b, 0x29, 0x52, 0xc9, 0x5a, - 0xe7, 0x71, 0xa7, 0xc7, 0x01, 0x25, 0x56, 0x80, 0xec, 0x41, 0xa7, 0xc7, 0x5f, 0x40, 0x38, 0x68, - 0x7c, 0xa1, 0x94, 0xf1, 0xc7, 0xe0, 0xe8, 0x40, 0xa9, 0xb0, 0x12, 0xe4, 0xbb, 0xed, 0x27, 0xed, - 0xae, 0x52, 0x55, 0xff, 0x63, 0x36, 0xd2, 0x88, 0x29, 0xce, 0xe9, 0x9b, 0x68, 0x81, 0xab, 0xce, - 0x17, 0xe3, 0x4e, 0xcb, 0x4a, 0x9d, 0xf6, 0x4d, 0xbe, 0x20, 0xfc, 0x3a, 0x54, 0xe3, 0xe0, 0x00, - 0xe9, 0xdd, 0xf9, 0x4a, 0x04, 0x5c, 0x71, 0x7c, 0xb1, 0xb1, 0xe2, 0xf8, 0x62, 0x66, 0x87, 0x68, - 0x65, 0xa3, 0xcc, 0xe5, 0x33, 0xa9, 0x84, 0x10, 0xfe, 0xed, 0xee, 0x57, 0x80, 0x12, 0xfa, 0xdc, - 0xb5, 0xa3, 0xef, 0x47, 0x16, 0x11, 0x70, 0xe4, 0xda, 0xe1, 0x62, 0x70, 0x42, 0x69, 0x29, 0x38, - 0x41, 0xde, 0x9c, 0x21, 0xbd, 0x39, 0xa7, 0x3f, 0xac, 0xcc, 0x3f, 0x1c, 0x29, 0x7d, 0x58, 0xf9, - 0x1d, 0x60, 0xe3, 0xb9, 0x4f, 0xcf, 0xa3, 0x49, 0x64, 0x15, 0x22, 0x53, 0x04, 0x26, 0xde, 0x15, - 0xd9, 0x9b, 0xb0, 0xb9, 0x40, 0x4d, 0xb6, 0x74, 0x49, 0xab, 0xa5, 0x49, 0xd9, 0x7d, 0xb8, 0x24, - 0xe6, 0x76, 0xaa, 0x6f, 0xc5, 0xdd, 0x51, 0x8e, 0x6a, 0x24, 0x3d, 0xac, 0xfe, 0x0a, 0x14, 0xa3, - 0x90, 0xb6, 0x17, 0x2b, 0xbb, 0x2b, 0xc6, 0x55, 0xfd, 0x87, 0xeb, 0x50, 0x8a, 0x03, 0xdc, 0xbe, - 0xd1, 0xec, 0xa0, 0x0f, 0x6c, 0x04, 0xa7, 0xb2, 0x88, 0x29, 0x22, 0x20, 0x1a, 0x29, 0x71, 0xf1, - 0x6a, 0xee, 0xdb, 0x91, 0xc6, 0xc6, 0x21, 0x47, 0xbe, 0x4d, 0x0f, 0x98, 0xd8, 0xae, 0x74, 0xcb, - 0xb3, 0xa4, 0x15, 0x11, 0x40, 0x0b, 0xed, 0x1a, 0xd0, 0x6f, 0xe2, 0x8c, 0xbe, 0x35, 0x6d, 0xbb, - 0xa7, 0xc8, 0xf7, 0x9c, 0x6f, 0x4d, 0xd3, 0xe7, 0x41, 0x78, 0x74, 0x0d, 0x8f, 0x29, 0x88, 0x3e, - 0x88, 0xf7, 0x0a, 0x94, 0xe6, 0xf1, 0x17, 0x15, 0xc5, 0x8c, 0x98, 0x47, 0xdf, 0x53, 0x4c, 0x8f, - 0x6a, 0x69, 0x71, 0x54, 0x17, 0xe7, 0x34, 0x2c, 0xcd, 0x69, 0x35, 0x84, 0x82, 0x08, 0xf2, 0x7b, - 0x71, 0x87, 0xbf, 0xb0, 0xab, 0x14, 0xc8, 0x1a, 0x4e, 0x74, 0xb5, 0x14, 0x7f, 0x2e, 0x54, 0x2c, - 0xb7, 0x50, 0x31, 0xf5, 0xef, 0xac, 0x03, 0x24, 0xc1, 0x82, 0xec, 0xdd, 0x85, 0xc0, 0xe4, 0xcc, - 0xd2, 0xb6, 0xbf, 0x10, 0x8f, 0xbc, 0xf0, 0xa2, 0xcf, 0xfa, 0x37, 0x78, 0xd1, 0xe7, 0x01, 0x54, - 0x03, 0x7f, 0xfc, 0x52, 0x87, 0x7b, 0x39, 0xf0, 0xc7, 0xb1, 0xbf, 0xfd, 0x3d, 0xc0, 0x24, 0x3d, - 0x18, 0x98, 0x18, 0xaa, 0x4b, 0x5a, 0x4b, 0x29, 0xf0, 0xc7, 0xfd, 0xd1, 0x57, 0x2d, 0x7e, 0xdb, - 0xcd, 0x0c, 0x42, 0x7d, 0x95, 0x94, 0xd8, 0x34, 0x83, 0xb0, 0x25, 0x0b, 0x8a, 0xdb, 0x50, 0x43, - 0xda, 0x25, 0x61, 0x51, 0x31, 0x83, 0xe4, 0x80, 0x45, 0xfd, 0xed, 0xe8, 0x48, 0x7a, 0xc1, 0x97, - 0xcb, 0x3e, 0x16, 0x86, 0xb8, 0xa4, 0x44, 0xd4, 0x57, 0xb9, 0x7e, 0xf9, 0xfb, 0x43, 0x31, 0xe9, - 0xf2, 0x77, 0xf4, 0xd6, 0xbf, 0xe9, 0x77, 0xf4, 0x76, 0x00, 0x92, 0x27, 0x1b, 0x71, 0x05, 0xc6, - 0x97, 0x75, 0x4a, 0xfc, 0x1a, 0xce, 0xbd, 0xd7, 0xa0, 0x22, 0x7f, 0x78, 0x97, 0x2e, 0xe1, 0x78, - 0xae, 0xc5, 0xbf, 0x55, 0xd2, 0xfd, 0xe9, 0x87, 0x4a, 0xe6, 0x9e, 0x0a, 0x65, 0xe9, 0x4b, 0x41, - 0x48, 0xb1, 0x6f, 0x04, 0x27, 0xe2, 0xbb, 0x15, 0x86, 0x7b, 0x6c, 0x29, 0x99, 0x7b, 0x77, 0x50, - 0xe9, 0x96, 0xbf, 0xd3, 0x03, 0xb0, 0xd1, 0xf3, 0xfc, 0xa9, 0xe1, 0x08, 0x3a, 0x6b, 0x1e, 0x20, - 0xdd, 0x7b, 0x70, 0x79, 0xe5, 0x57, 0x87, 0xe8, 0x0a, 0x97, 0x3d, 0x9d, 0x39, 0x16, 0xbf, 0x8c, - 0xb4, 0x7f, 0x31, 0xf2, 0x6d, 0x53, 0xc9, 0xdc, 0x7b, 0xb4, 0xf0, 0x55, 0x8a, 0xa3, 0xde, 0x6e, - 0xff, 0xa8, 0xd7, 0x6a, 0xb7, 0xf8, 0x35, 0xa1, 0x4e, 0xaf, 0xd9, 0x3d, 0x1a, 0x74, 0x9e, 0x88, - 0xbd, 0xb0, 0xfd, 0x45, 0x94, 0x5c, 0xbf, 0xf7, 0x28, 0x7a, 0x4e, 0x21, 0xaa, 0x75, 0xb7, 0xdf, - 0x68, 0xf1, 0x3d, 0x34, 0x7e, 0xd5, 0x67, 0xb8, 0xcb, 0xbf, 0x66, 0xa1, 0xb5, 0x07, 0x47, 0xdd, - 0xa1, 0x78, 0x41, 0xe8, 0xde, 0x8f, 0xa0, 0xfe, 0xbc, 0xfb, 0x3c, 0xd8, 0x96, 0xe6, 0x7e, 0x83, - 0xee, 0x4c, 0xe1, 0x9e, 0xd9, 0xd7, 0x79, 0x8a, 0x3c, 0x7b, 0x5a, 0xbb, 0xdb, 0xa6, 0xa0, 0xd7, - 0x7b, 0x3f, 0xcb, 0x48, 0xfa, 0x63, 0x74, 0x27, 0x23, 0x06, 0x88, 0x0e, 0x96, 0x41, 0x9a, 0x65, - 0x98, 0x4a, 0x86, 0x5d, 0x01, 0x96, 0x02, 0x75, 0xbd, 0xb1, 0xe1, 0x28, 0xeb, 0x14, 0xde, 0x1a, - 0xc1, 0xe9, 0x1a, 0x9e, 0x92, 0x65, 0xaf, 0xc2, 0xb5, 0x18, 0xd6, 0xf5, 0xce, 0x0e, 0x7d, 0xdb, - 0xf3, 0xed, 0xf0, 0x82, 0xa3, 0x73, 0xf7, 0xfe, 0x5f, 0x71, 0x38, 0x9b, 0x9a, 0x55, 0x58, 0x40, - 0xc3, 0x34, 0x13, 0x18, 0x09, 0x32, 0x65, 0x8d, 0x5d, 0x85, 0x4b, 0x24, 0xc5, 0x17, 0x10, 0x19, - 0xf6, 0x0a, 0x5c, 0x8d, 0x8c, 0xdc, 0x45, 0xe4, 0x3a, 0x22, 0x35, 0x8b, 0x42, 0x23, 0x97, 0x90, - 0xd9, 0xdd, 0x1f, 0xfe, 0xe9, 0xcf, 0x6f, 0x66, 0xfe, 0xe5, 0xcf, 0x6f, 0x66, 0xfe, 0xd3, 0xcf, - 0x6f, 0xae, 0xfd, 0xfe, 0x7f, 0xb9, 0x99, 0xf9, 0xc9, 0xbb, 0xc7, 0x76, 0x78, 0x32, 0x1f, 0xdd, - 0x1f, 0x7b, 0xd3, 0xf7, 0xa6, 0x46, 0xe8, 0xdb, 0xe7, 0x7c, 0x3b, 0x89, 0x12, 0xae, 0xf5, 0xde, - 0xec, 0xf4, 0xf8, 0xbd, 0xd9, 0xe8, 0x3d, 0x9c, 0xd8, 0xa3, 0x8d, 0x99, 0xef, 0x85, 0xde, 0xc3, - 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xef, 0x6d, 0x1a, 0x43, 0x3c, 0x89, 0x00, 0x00, + 0xc5, 0x2a, 0xba, 0xaa, 0xa8, 0xee, 0x1e, 0x60, 0xf1, 0x0d, 0xbe, 0x0f, 0xd8, 0x9f, 0xef, 0xf5, + 0x43, 0x92, 0x97, 0x2c, 0xb0, 0x09, 0x10, 0x04, 0x08, 0x92, 0x87, 0x04, 0x0b, 0xec, 0xee, 0x5b, + 0x06, 0x09, 0x82, 0x0d, 0x82, 0xec, 0x06, 0x08, 0x92, 0x20, 0x09, 0xb0, 0x49, 0x26, 0xcf, 0x41, + 0x02, 0x24, 0x8f, 0x01, 0x12, 0x9c, 0x73, 0x6f, 0x55, 0xdd, 0x22, 0x29, 0xc9, 0xf6, 0xcc, 0x02, + 0x79, 0xe9, 0xe6, 0x3d, 0x3f, 0xf7, 0xff, 0x9e, 0x7b, 0xce, 0xb9, 0xe7, 0xde, 0x02, 0x98, 0x39, + 0x86, 0x7b, 0x7f, 0xe6, 0x7b, 0xa1, 0xc7, 0x72, 0xf8, 0xfb, 0xfa, 0xbb, 0xc7, 0x76, 0x78, 0x32, + 0x1f, 0xdd, 0x1f, 0x7b, 0xd3, 0xf7, 0x8e, 0xbd, 0x63, 0xef, 0x3d, 0x42, 0x8e, 0xe6, 0x13, 0x4a, + 0x51, 0x82, 0x7e, 0x71, 0xa6, 0xeb, 0xe0, 0x78, 0xe3, 0x53, 0xf1, 0x7b, 0x33, 0xb4, 0xa7, 0x56, + 0x10, 0x1a, 0xd3, 0x19, 0x07, 0xa8, 0x7f, 0x94, 0x81, 0xdc, 0xf0, 0x62, 0x66, 0xb1, 0x1a, 0xac, + 0xdb, 0x66, 0x3d, 0xb3, 0x93, 0xb9, 0x9b, 0xd7, 0xd6, 0x6d, 0x93, 0xed, 0x40, 0xd9, 0xf5, 0xc2, + 0xde, 0xdc, 0x71, 0x8c, 0x91, 0x63, 0xd5, 0xd7, 0x77, 0x32, 0x77, 0x8b, 0x9a, 0x0c, 0x62, 0xaf, + 0x40, 0xc9, 0x98, 0x87, 0x9e, 0x6e, 0xbb, 0x63, 0xbf, 0x9e, 0x25, 0x7c, 0x11, 0x01, 0x1d, 0x77, + 0xec, 0xb3, 0x6d, 0xc8, 0x9f, 0xd9, 0x66, 0x78, 0x52, 0xcf, 0x51, 0x8e, 0x3c, 0x81, 0xd0, 0x60, + 0x6c, 0x38, 0x56, 0x3d, 0xcf, 0xa1, 0x94, 0x40, 0x68, 0x48, 0x85, 0x6c, 0xec, 0x64, 0xee, 0x96, + 0x34, 0x9e, 0x60, 0x37, 0x01, 0x2c, 0x77, 0x3e, 0x7d, 0x66, 0x38, 0x73, 0x2b, 0xa8, 0x17, 0x08, + 0x25, 0x41, 0xd4, 0x1f, 0x42, 0x69, 0x1a, 0x1c, 0xef, 0x5b, 0x86, 0x69, 0xf9, 0xec, 0x2a, 0x14, + 0xa6, 0xc1, 0xb1, 0x1e, 0x1a, 0xc7, 0xa2, 0x09, 0x1b, 0xd3, 0xe0, 0x78, 0x68, 0x1c, 0xb3, 0x6b, + 0x50, 0x24, 0xc4, 0xc5, 0x8c, 0xb7, 0x21, 0xaf, 0x21, 0x21, 0xb6, 0x58, 0xfd, 0xbd, 0x0d, 0x28, + 0x74, 0xed, 0xd0, 0xf2, 0x0d, 0x87, 0x5d, 0x81, 0x0d, 0x3b, 0x70, 0xe7, 0x8e, 0x43, 0xec, 0x45, + 0x4d, 0xa4, 0xd8, 0x15, 0xc8, 0xdb, 0x8f, 0x9e, 0x19, 0x0e, 0xe7, 0xdd, 0x5f, 0xd3, 0x78, 0x92, + 0xd5, 0x61, 0xc3, 0xfe, 0xe0, 0x63, 0x44, 0x64, 0x05, 0x42, 0xa4, 0x09, 0xf3, 0xf0, 0x01, 0x62, + 0x72, 0x31, 0x86, 0xd2, 0x84, 0xf9, 0xf8, 0x43, 0xc4, 0x60, 0xeb, 0xb3, 0x84, 0xa1, 0x34, 0x96, + 0x32, 0xa7, 0x52, 0xb0, 0x03, 0xaa, 0x58, 0xca, 0x3c, 0x2a, 0x65, 0xce, 0x4b, 0x29, 0x08, 0x84, + 0x48, 0x13, 0x86, 0x97, 0x52, 0x8c, 0x31, 0x71, 0x29, 0x73, 0x5e, 0x4a, 0x69, 0x27, 0x73, 0x37, + 0x47, 0x18, 0x5e, 0xca, 0x36, 0xe4, 0x4c, 0x84, 0xc3, 0x4e, 0xe6, 0x6e, 0x66, 0x7f, 0x4d, 0xa3, + 0x14, 0x42, 0x03, 0x84, 0x96, 0xb1, 0x83, 0x11, 0x1a, 0x08, 0xe8, 0x08, 0xa1, 0x15, 0xec, 0x0d, + 0x84, 0x8e, 0x04, 0x74, 0x82, 0xd0, 0xea, 0x4e, 0xe6, 0xee, 0x3a, 0x42, 0x31, 0xc5, 0xae, 0x43, + 0xc1, 0x34, 0x42, 0x0b, 0x11, 0x35, 0xd1, 0xe4, 0x08, 0x80, 0x38, 0x9c, 0x71, 0x88, 0xdb, 0x14, + 0x8d, 0x8e, 0x00, 0x4c, 0x85, 0x32, 0x92, 0x45, 0x78, 0x45, 0xe0, 0x65, 0x20, 0xfb, 0x08, 0x2a, + 0xa6, 0x35, 0xb6, 0xa7, 0x86, 0xc3, 0xdb, 0xb4, 0xb5, 0x93, 0xb9, 0x5b, 0x7e, 0xb0, 0x79, 0x9f, + 0xd6, 0x44, 0x8c, 0xd9, 0x5f, 0xd3, 0x52, 0x64, 0xec, 0x11, 0x54, 0x45, 0xfa, 0x83, 0x07, 0xd4, + 0xb1, 0x8c, 0xf8, 0x94, 0x14, 0xdf, 0x07, 0x0f, 0x1e, 0xed, 0xaf, 0x69, 0x69, 0x42, 0x76, 0x1b, + 0x2a, 0xf1, 0x12, 0x41, 0xc6, 0x4b, 0xa2, 0x56, 0x29, 0x28, 0x36, 0xeb, 0xab, 0xc0, 0x73, 0x91, + 0x60, 0x5b, 0xf4, 0x5b, 0x04, 0x60, 0x3b, 0x00, 0xa6, 0x35, 0x31, 0xe6, 0x4e, 0x88, 0xe8, 0xcb, + 0xa2, 0x03, 0x25, 0x18, 0xbb, 0x09, 0xa5, 0xf9, 0x0c, 0x5b, 0xf9, 0xc4, 0x70, 0xea, 0x57, 0x04, + 0x41, 0x02, 0xc2, 0xdc, 0x71, 0x9e, 0x23, 0xf6, 0xaa, 0x18, 0xdd, 0x08, 0x80, 0xc3, 0xfb, 0xcc, + 0x1a, 0x23, 0xaa, 0x2e, 0x0a, 0x16, 0x69, 0x5c, 0x45, 0x76, 0xb0, 0x6b, 0xbb, 0xf5, 0x6b, 0x34, + 0x83, 0x79, 0x82, 0xdd, 0x80, 0x6c, 0xe0, 0x8f, 0xeb, 0xd7, 0xa9, 0xfd, 0xc0, 0xdb, 0xdf, 0x3e, + 0x9f, 0xf9, 0x1a, 0x82, 0x77, 0x0b, 0x90, 0xa7, 0xd5, 0xa4, 0xde, 0x80, 0xe2, 0xa1, 0xe1, 0x1b, + 0x53, 0xcd, 0x9a, 0x30, 0x05, 0xb2, 0x33, 0x2f, 0x10, 0xeb, 0x08, 0x7f, 0xaa, 0x5d, 0xd8, 0x78, + 0x62, 0xf8, 0x88, 0x63, 0x90, 0x73, 0x8d, 0xa9, 0x45, 0xc8, 0x92, 0x46, 0xbf, 0x71, 0xed, 0x04, + 0x17, 0x41, 0x68, 0x4d, 0x85, 0x90, 0x10, 0x29, 0x84, 0x1f, 0x3b, 0xde, 0x48, 0xac, 0x91, 0xa2, + 0x26, 0x52, 0xea, 0xff, 0x93, 0x81, 0x8d, 0xa6, 0xe7, 0x60, 0x76, 0x57, 0xa1, 0xe0, 0x5b, 0x8e, + 0x9e, 0x14, 0xb7, 0xe1, 0x5b, 0xce, 0xa1, 0x17, 0x20, 0x62, 0xec, 0x71, 0x04, 0x5f, 0xb5, 0x1b, + 0x63, 0x8f, 0x10, 0x51, 0x05, 0xb2, 0x52, 0x05, 0xae, 0x41, 0x31, 0x1c, 0x39, 0x3a, 0xc1, 0x73, + 0x04, 0x2f, 0x84, 0x23, 0xa7, 0x87, 0xa8, 0xab, 0x50, 0x30, 0x47, 0x1c, 0x93, 0x27, 0xcc, 0x86, + 0x39, 0x42, 0x84, 0xfa, 0x29, 0x94, 0x34, 0xe3, 0x4c, 0x54, 0xe3, 0x32, 0x6c, 0x60, 0x06, 0x42, + 0xfe, 0xe5, 0xb4, 0x7c, 0x38, 0x72, 0x3a, 0x26, 0x82, 0xb1, 0x12, 0xb6, 0x49, 0x75, 0xc8, 0x69, + 0xf9, 0xb1, 0xe7, 0x74, 0x4c, 0x75, 0x08, 0xd0, 0xf4, 0x7c, 0xff, 0x3b, 0x37, 0x61, 0x1b, 0xf2, + 0xa6, 0x35, 0x0b, 0x4f, 0xb8, 0xe8, 0xd0, 0x78, 0x42, 0xbd, 0x07, 0x45, 0x1c, 0x97, 0xae, 0x1d, + 0x84, 0xec, 0x26, 0xe4, 0x1c, 0x3b, 0x08, 0xeb, 0x99, 0x9d, 0xec, 0xc2, 0xa8, 0x11, 0x5c, 0xdd, + 0x81, 0xe2, 0x81, 0x71, 0xfe, 0x04, 0x47, 0x0e, 0x73, 0xa3, 0x21, 0x14, 0x43, 0x22, 0xc6, 0xb3, + 0x02, 0x30, 0x34, 0xfc, 0x63, 0x2b, 0x24, 0x49, 0xf7, 0xdf, 0x33, 0x50, 0x1e, 0xcc, 0x47, 0x5f, + 0xcf, 0x2d, 0xff, 0x02, 0xeb, 0x7c, 0x17, 0xb2, 0xe1, 0xc5, 0x8c, 0x38, 0x6a, 0x0f, 0xae, 0xf0, + 0xec, 0x25, 0xfc, 0x7d, 0x64, 0xd2, 0x90, 0x04, 0x1b, 0xe1, 0x7a, 0xa6, 0x15, 0xf5, 0x41, 0x5e, + 0xdb, 0xc0, 0x64, 0xc7, 0xc4, 0xed, 0xc2, 0x9b, 0x89, 0x51, 0x58, 0xf7, 0x66, 0x6c, 0x07, 0xf2, + 0xe3, 0x13, 0xdb, 0x31, 0x69, 0x00, 0xd2, 0x75, 0xe6, 0x08, 0x1c, 0x25, 0xdf, 0x3b, 0xd3, 0x03, + 0xfb, 0xa7, 0x91, 0xf8, 0x2f, 0xf8, 0xde, 0xd9, 0xc0, 0xfe, 0xa9, 0xa5, 0x0e, 0xc5, 0x1e, 0x04, + 0xb0, 0x31, 0x68, 0x36, 0xba, 0x0d, 0x4d, 0x59, 0xc3, 0xdf, 0xed, 0x2f, 0x3a, 0x83, 0xe1, 0x40, + 0xc9, 0xb0, 0x1a, 0x40, 0xaf, 0x3f, 0xd4, 0x45, 0x7a, 0x9d, 0x6d, 0xc0, 0x7a, 0xa7, 0xa7, 0x64, + 0x91, 0x06, 0xe1, 0x9d, 0x9e, 0x92, 0x63, 0x05, 0xc8, 0x36, 0x7a, 0x5f, 0x2a, 0x79, 0xfa, 0xd1, + 0xed, 0x2a, 0x1b, 0xea, 0x9f, 0xad, 0x43, 0xa9, 0x3f, 0xfa, 0xca, 0x1a, 0x87, 0xd8, 0x66, 0x9c, + 0xa5, 0x96, 0xff, 0xcc, 0xf2, 0xa9, 0xd9, 0x59, 0x4d, 0xa4, 0xb0, 0x21, 0xe6, 0x88, 0x1a, 0x97, + 0xd5, 0xd6, 0xcd, 0x11, 0xd1, 0x8d, 0x4f, 0xac, 0xa9, 0x41, 0x8d, 0x43, 0x3a, 0x4a, 0xe1, 0xaa, + 0xf0, 0x46, 0x5f, 0x51, 0xf3, 0xb2, 0x1a, 0xfe, 0x64, 0xb7, 0xa0, 0xcc, 0xf3, 0x90, 0xe7, 0x17, + 0x70, 0xd0, 0xe2, 0xe4, 0xdb, 0x90, 0x27, 0x1f, 0x71, 0x52, 0xae, 0x1c, 0x29, 0xf6, 0x36, 0x0e, + 0xea, 0x89, 0x19, 0xed, 0x8d, 0xbe, 0xe2, 0xd8, 0x22, 0x9f, 0xd1, 0xde, 0xe8, 0x2b, 0x42, 0xbd, + 0x0d, 0x5b, 0xc1, 0x7c, 0x14, 0x8c, 0x7d, 0x7b, 0x16, 0xda, 0x9e, 0xcb, 0x69, 0x4a, 0x44, 0xa3, + 0xc8, 0x08, 0x22, 0xbe, 0x0b, 0xc5, 0xd9, 0x7c, 0xa4, 0xdb, 0xee, 0xc4, 0x23, 0xb1, 0x5f, 0x7e, + 0x50, 0xe5, 0x03, 0x73, 0x38, 0x1f, 0x75, 0xdc, 0x89, 0xa7, 0x15, 0x66, 0xfc, 0x07, 0x53, 0xa1, + 0xea, 0x7a, 0xa1, 0x8e, 0xaa, 0x82, 0x3e, 0xb5, 0x42, 0x83, 0xf6, 0x03, 0xbe, 0xe1, 0x77, 0xbd, + 0xf1, 0xe9, 0x81, 0x15, 0x1a, 0xea, 0x1d, 0x28, 0x08, 0x3e, 0xdc, 0xfb, 0x43, 0xcb, 0x35, 0xdc, + 0x50, 0x8f, 0x95, 0x86, 0x22, 0x07, 0x74, 0x4c, 0xf5, 0x0f, 0x33, 0xa0, 0x0c, 0xa4, 0xaa, 0x20, + 0xf3, 0x4a, 0xc9, 0xf1, 0x2a, 0x80, 0x31, 0x1e, 0x7b, 0x73, 0x9e, 0x0d, 0x9f, 0x60, 0x25, 0x01, + 0xe9, 0x98, 0x72, 0xff, 0x65, 0x53, 0xfd, 0xf7, 0x1a, 0x54, 0x22, 0x3e, 0x69, 0xd1, 0x97, 0x05, + 0x2c, 0xea, 0xc1, 0x60, 0x9e, 0x5a, 0xf9, 0x85, 0x60, 0xce, 0xb9, 0xaf, 0xc0, 0x06, 0x69, 0x18, + 0x41, 0x34, 0x2a, 0x3c, 0xa5, 0xfe, 0x9b, 0x0c, 0x54, 0x3b, 0xae, 0x69, 0x9d, 0x0f, 0xc6, 0x86, + 0x1b, 0x75, 0x8a, 0x1d, 0xe8, 0x36, 0xc2, 0xf4, 0x60, 0x6c, 0xb8, 0x42, 0x39, 0x28, 0xdb, 0x41, + 0x4c, 0x87, 0x6d, 0xe0, 0x04, 0x54, 0xd4, 0x3a, 0xe5, 0x58, 0x22, 0x08, 0x15, 0x76, 0x07, 0x36, + 0x47, 0x96, 0xe3, 0xb9, 0xc7, 0x7a, 0xe8, 0xe9, 0x5c, 0xcb, 0xe1, 0x6d, 0xa9, 0x72, 0xf0, 0xd0, + 0x1b, 0x92, 0xb6, 0xb3, 0x0d, 0xf9, 0x99, 0xe1, 0x87, 0x41, 0x3d, 0xb7, 0x93, 0xc5, 0x65, 0x4c, + 0x09, 0xec, 0x66, 0x3b, 0xd0, 0xe7, 0xae, 0xfd, 0xf5, 0x9c, 0x37, 0xa3, 0xa8, 0x15, 0xed, 0xe0, + 0x88, 0xd2, 0xec, 0x2e, 0x28, 0xbc, 0x64, 0xca, 0x56, 0x9e, 0x67, 0x35, 0x82, 0x53, 0xc6, 0x24, + 0xec, 0xfe, 0xbf, 0x75, 0x28, 0xee, 0xcd, 0xdd, 0x31, 0x0e, 0x06, 0x7b, 0x1d, 0x72, 0x93, 0xb9, + 0x3b, 0xa6, 0xb6, 0xc4, 0x5b, 0x69, 0xbc, 0x4e, 0x34, 0x42, 0xa2, 0x04, 0x32, 0xfc, 0x63, 0x94, + 0x5c, 0x4b, 0x12, 0x08, 0xe1, 0xea, 0x1f, 0x67, 0x78, 0x8e, 0x7b, 0x8e, 0x71, 0xcc, 0x8a, 0x90, + 0xeb, 0xf5, 0x7b, 0x6d, 0x65, 0x8d, 0x55, 0xa0, 0xd8, 0xe9, 0x0d, 0xdb, 0x5a, 0xaf, 0xd1, 0x55, + 0x32, 0xb4, 0x9c, 0x87, 0x8d, 0xdd, 0x6e, 0x5b, 0x59, 0x47, 0xcc, 0x93, 0x7e, 0xb7, 0x31, 0xec, + 0x74, 0xdb, 0x4a, 0x8e, 0x63, 0xb4, 0x4e, 0x73, 0xa8, 0x14, 0x99, 0x02, 0x95, 0x43, 0xad, 0xdf, + 0x3a, 0x6a, 0xb6, 0xf5, 0xde, 0x51, 0xb7, 0xab, 0x28, 0xec, 0x12, 0x6c, 0xc6, 0x90, 0x3e, 0x07, + 0xee, 0x20, 0xcb, 0x93, 0x86, 0xd6, 0xd0, 0x1e, 0x2b, 0x3f, 0x62, 0x45, 0xc8, 0x36, 0x1e, 0x3f, + 0x56, 0x7e, 0x86, 0x92, 0xa1, 0xf4, 0xb4, 0xd3, 0xd3, 0x9f, 0x34, 0xba, 0x47, 0x6d, 0xe5, 0x67, + 0xeb, 0x51, 0xba, 0xaf, 0xb5, 0xda, 0x9a, 0xf2, 0xb3, 0x1c, 0xdb, 0x82, 0xca, 0x4f, 0xfa, 0xbd, + 0xf6, 0x41, 0xe3, 0xf0, 0x90, 0x2a, 0xf2, 0xb3, 0xa2, 0xfa, 0x5f, 0x72, 0x90, 0xc3, 0x96, 0x30, + 0x35, 0x91, 0x82, 0x71, 0x13, 0x51, 0x0c, 0xed, 0xe6, 0xfe, 0xf4, 0x2f, 0x6e, 0xad, 0x71, 0xf9, + 0xf7, 0x1a, 0x64, 0x1d, 0x3b, 0xa4, 0x61, 0x8d, 0xd7, 0x8e, 0xd0, 0x19, 0xf7, 0xd7, 0x34, 0xc4, + 0xb1, 0x9b, 0x90, 0xe1, 0x82, 0xb0, 0xfc, 0xa0, 0x26, 0x16, 0x97, 0xd8, 0x49, 0xf7, 0xd7, 0xb4, + 0xcc, 0x8c, 0xdd, 0x80, 0xcc, 0x33, 0x21, 0x15, 0x2b, 0x1c, 0xcf, 0xf7, 0x52, 0xc4, 0x3e, 0x63, + 0x3b, 0x90, 0x1d, 0x7b, 0x5c, 0x23, 0x8c, 0xf1, 0x7c, 0x67, 0xc1, 0xfc, 0xc7, 0x9e, 0xc3, 0x5e, + 0x87, 0xac, 0x6f, 0x9c, 0xd1, 0xc8, 0xc6, 0xc3, 0x15, 0x6f, 0x5d, 0x48, 0xe4, 0x1b, 0x67, 0x58, + 0x89, 0x09, 0xc9, 0x91, 0xb8, 0x12, 0xd1, 0x78, 0x63, 0x31, 0x13, 0xb6, 0x03, 0x99, 0x33, 0x92, + 0x24, 0xb1, 0x12, 0xf4, 0xd4, 0x76, 0x4d, 0xef, 0x6c, 0x30, 0xb3, 0xc6, 0x48, 0x71, 0xc6, 0xde, + 0x80, 0x6c, 0x30, 0x1f, 0x91, 0x24, 0x29, 0x3f, 0xd8, 0x5a, 0xda, 0x13, 0xb0, 0xa0, 0x60, 0x3e, + 0x62, 0x77, 0x20, 0x37, 0xf6, 0x7c, 0x5f, 0x48, 0x13, 0x25, 0xaa, 0x70, 0xb4, 0x1d, 0xa2, 0x52, + 0x88, 0x78, 0x2c, 0x30, 0x24, 0x19, 0x12, 0x13, 0x25, 0xfb, 0x11, 0x16, 0x18, 0xb2, 0xdb, 0x62, + 0x93, 0xab, 0xc8, 0xb5, 0x8e, 0xb6, 0x40, 0xcc, 0x07, 0xb1, 0x38, 0x48, 0x53, 0xe3, 0x9c, 0x34, + 0xce, 0x98, 0x28, 0xda, 0xfb, 0xb0, 0x4e, 0x53, 0xe3, 0x9c, 0xdd, 0x86, 0xec, 0x33, 0x6b, 0x4c, + 0xca, 0x67, 0x5c, 0x9a, 0x18, 0xa4, 0x27, 0xd4, 0x3c, 0x44, 0xd3, 0xbc, 0xf7, 0x1c, 0x93, 0xf4, + 0xd0, 0x78, 0x2c, 0xf7, 0x3c, 0xc7, 0x7c, 0x42, 0x63, 0x49, 0x48, 0xdc, 0xf2, 0x8d, 0xf9, 0x39, + 0x4a, 0x23, 0x85, 0x6f, 0xce, 0xc6, 0xfc, 0xbc, 0x63, 0xa2, 0xf0, 0x77, 0xcd, 0x67, 0xa4, 0x7d, + 0x66, 0x34, 0xfc, 0x89, 0xe6, 0x51, 0x60, 0x39, 0xd6, 0x38, 0xb4, 0x9f, 0xd9, 0xe1, 0x05, 0xe9, + 0x97, 0x19, 0x4d, 0x06, 0xed, 0x6e, 0x40, 0xce, 0x3a, 0x9f, 0xf9, 0xea, 0x3e, 0x14, 0x44, 0x29, + 0x4b, 0x36, 0xd6, 0x35, 0x28, 0xda, 0x81, 0x3e, 0xf6, 0xdc, 0x20, 0x14, 0xba, 0x53, 0xc1, 0x0e, + 0x9a, 0x98, 0x44, 0x71, 0x69, 0x1a, 0x21, 0xdf, 0x84, 0x2a, 0x1a, 0xfd, 0x56, 0x1f, 0x00, 0x24, + 0xcd, 0xc2, 0x3a, 0x39, 0x96, 0x1b, 0xa9, 0x69, 0x8e, 0xe5, 0xc6, 0x3c, 0xeb, 0x12, 0xcf, 0x35, + 0x28, 0xc5, 0x9a, 0x31, 0xab, 0x40, 0xc6, 0x10, 0xdb, 0x5f, 0xc6, 0x50, 0xef, 0xa2, 0xa2, 0x1a, + 0xe9, 0xbe, 0x69, 0x1c, 0xa6, 0xa2, 0x4d, 0x31, 0x33, 0x52, 0xbf, 0x0f, 0x15, 0xcd, 0x0a, 0xe6, + 0x4e, 0xd8, 0xf4, 0x9c, 0x96, 0x35, 0x61, 0xef, 0x00, 0xc4, 0xe9, 0x40, 0x68, 0x29, 0xc9, 0xdc, + 0x6d, 0x59, 0x13, 0x4d, 0xc2, 0xab, 0xff, 0x29, 0x47, 0xfa, 0x5e, 0x8b, 0x2b, 0x5a, 0x42, 0xa3, + 0xca, 0x48, 0x1a, 0x55, 0xbc, 0x37, 0xac, 0xa7, 0xb5, 0xca, 0x13, 0xdb, 0x34, 0x2d, 0x37, 0xd2, + 0x1e, 0x79, 0x0a, 0x07, 0xdb, 0x70, 0x8e, 0x69, 0x41, 0xd5, 0x1e, 0xb0, 0xa8, 0xd0, 0xe9, 0xcc, + 0xb7, 0x82, 0x80, 0xeb, 0x2d, 0x86, 0x73, 0x1c, 0xad, 0xed, 0xfc, 0x8b, 0xd6, 0xf6, 0x35, 0x28, + 0xe2, 0x96, 0x47, 0x56, 0xdf, 0x06, 0xef, 0x7d, 0x61, 0xde, 0xb2, 0x37, 0xa1, 0x20, 0xf4, 0x75, + 0xb1, 0xa8, 0xc4, 0x74, 0x69, 0x71, 0xa0, 0x16, 0x61, 0x59, 0x1d, 0x95, 0xbc, 0xe9, 0xd4, 0x72, + 0xc3, 0x68, 0x9f, 0x16, 0x49, 0xf6, 0x36, 0x94, 0x3c, 0x57, 0xe7, 0x4a, 0xbd, 0x58, 0x55, 0x62, + 0xfa, 0xf6, 0xdd, 0x23, 0x82, 0x6a, 0x45, 0x4f, 0xfc, 0xc2, 0xaa, 0x38, 0xde, 0x99, 0x3e, 0x36, + 0x7c, 0x93, 0x56, 0x56, 0x51, 0x2b, 0x38, 0xde, 0x59, 0xd3, 0xf0, 0x4d, 0xae, 0xb7, 0x7c, 0xed, + 0xce, 0xa7, 0xb4, 0x9a, 0xaa, 0x9a, 0x48, 0xb1, 0x1b, 0x50, 0x1a, 0x3b, 0xf3, 0x20, 0xb4, 0xfc, + 0xdd, 0x0b, 0x6e, 0xa6, 0x69, 0x09, 0x00, 0xeb, 0x35, 0xf3, 0xed, 0xa9, 0xe1, 0x5f, 0xd0, 0xd2, + 0x29, 0x6a, 0x51, 0x92, 0x36, 0x9a, 0x53, 0xdb, 0x3c, 0xe7, 0xb6, 0x9a, 0xc6, 0x13, 0x48, 0x7f, + 0x42, 0x96, 0x74, 0x40, 0xeb, 0xa3, 0xa8, 0x45, 0x49, 0x1a, 0x07, 0xfa, 0x49, 0x2b, 0xa2, 0xa4, + 0x89, 0x54, 0x4a, 0xe9, 0xde, 0x7a, 0xae, 0xd2, 0xcd, 0x16, 0xf5, 0x1e, 0xcf, 0xb7, 0x8f, 0x6d, + 0xa1, 0xb5, 0x5c, 0xe2, 0x7a, 0x0f, 0x07, 0x11, 0xc1, 0x27, 0x50, 0x3d, 0xb6, 0x5c, 0xcb, 0x37, + 0x42, 0xcb, 0xd4, 0x51, 0x2e, 0x6e, 0x53, 0xc7, 0x89, 0x61, 0x7e, 0x1c, 0xa1, 0x50, 0xd6, 0x54, + 0x8e, 0xa5, 0x94, 0xfa, 0x35, 0x14, 0xc4, 0xd8, 0xe0, 0xd6, 0x85, 0xeb, 0x2e, 0x2d, 0xd7, 0xf9, + 0xd6, 0x85, 0x70, 0xf6, 0x3a, 0x54, 0x45, 0x25, 0x82, 0xd0, 0xb7, 0xdd, 0x63, 0x31, 0xeb, 0x2a, + 0x1c, 0x38, 0x20, 0x18, 0x6a, 0x18, 0x38, 0x2f, 0x74, 0x63, 0x64, 0x3b, 0xb8, 0xbe, 0xb3, 0x42, + 0x1b, 0x9a, 0x3b, 0x4e, 0x83, 0x83, 0xd4, 0x3e, 0x14, 0xa3, 0x91, 0xfc, 0x95, 0x94, 0xa9, 0xce, + 0xa0, 0x22, 0xb7, 0xf0, 0x57, 0xd3, 0x10, 0xae, 0x41, 0x04, 0xa1, 0xe7, 0x5b, 0x66, 0xe4, 0xa4, + 0xb1, 0x83, 0x01, 0xa5, 0xd5, 0xdf, 0xce, 0x40, 0x99, 0x34, 0x99, 0x3e, 0xe9, 0x69, 0xec, 0x1d, + 0x60, 0x63, 0xdf, 0x32, 0x42, 0x4b, 0xb7, 0xce, 0x43, 0xdf, 0x10, 0xfa, 0x0a, 0x57, 0x7a, 0x14, + 0x8e, 0x69, 0x23, 0x82, 0xab, 0x2c, 0xb7, 0xa0, 0x3c, 0x33, 0xfc, 0x20, 0xd2, 0x7f, 0x79, 0xe9, + 0xc0, 0x41, 0x42, 0xfb, 0x54, 0xdc, 0x63, 0xdf, 0x98, 0xea, 0xa1, 0x77, 0x6a, 0xb9, 0x5c, 0xf3, + 0xe7, 0x36, 0x4f, 0x8d, 0xe0, 0x43, 0x04, 0x93, 0x01, 0xf0, 0xef, 0x32, 0x50, 0x3d, 0xe4, 0x13, + 0xf4, 0x73, 0xeb, 0xa2, 0xc5, 0x0d, 0xcd, 0x71, 0x24, 0x5c, 0x72, 0x1a, 0xfd, 0x66, 0x37, 0xa1, + 0x3c, 0x3b, 0xb5, 0x2e, 0xf4, 0x94, 0x51, 0x56, 0x42, 0x50, 0x93, 0xc4, 0xc8, 0x5b, 0xb0, 0xe1, + 0x51, 0x43, 0xc4, 0x76, 0x2c, 0x76, 0x31, 0xa9, 0x85, 0x9a, 0x20, 0x40, 0xcd, 0x2e, 0xce, 0x4a, + 0x56, 0x21, 0x45, 0x66, 0x54, 0xfd, 0x6d, 0xc8, 0x23, 0x2a, 0xa8, 0xe7, 0xb9, 0x4a, 0x46, 0x09, + 0xf6, 0x3e, 0x54, 0xc7, 0xde, 0x74, 0xa6, 0x47, 0xec, 0x62, 0x63, 0x4e, 0x8b, 0xbf, 0x32, 0x92, + 0x1c, 0xf2, 0xbc, 0xd4, 0x9f, 0x67, 0xa1, 0x48, 0x75, 0x10, 0x12, 0xd0, 0x36, 0xcf, 0x23, 0x09, + 0x58, 0xd2, 0xf2, 0xb6, 0x89, 0x1b, 0xcc, 0x4b, 0xb4, 0xc8, 0x58, 0x3b, 0xcc, 0xca, 0xda, 0xe1, + 0x15, 0xd8, 0x10, 0xaa, 0x61, 0x8e, 0x8b, 0xc8, 0xf9, 0xf3, 0x15, 0xc3, 0xfc, 0x2a, 0xc5, 0x10, + 0x87, 0x90, 0xd3, 0x58, 0xe7, 0xb8, 0x15, 0x73, 0x29, 0x08, 0x04, 0x6a, 0x23, 0x44, 0x96, 0x6f, + 0x85, 0xb4, 0x7c, 0xab, 0x43, 0xe1, 0x99, 0x1d, 0xd8, 0x38, 0x41, 0x8a, 0x5c, 0x62, 0x88, 0xa4, + 0x34, 0x0c, 0xa5, 0x97, 0x0d, 0x43, 0xdc, 0x6c, 0xc3, 0x39, 0xe6, 0x16, 0x4a, 0xd4, 0xec, 0x86, + 0x73, 0xec, 0xb1, 0x0f, 0xe0, 0x72, 0x82, 0x16, 0xad, 0x21, 0x4f, 0x1e, 0x39, 0xab, 0x34, 0x16, + 0x53, 0x52, 0x8b, 0xc8, 0x84, 0xbc, 0x07, 0x5b, 0x12, 0xcb, 0x0c, 0x35, 0xb1, 0x80, 0xc4, 0x63, + 0x49, 0xdb, 0x8c, 0xc9, 0x49, 0x41, 0x0b, 0xd8, 0x5b, 0xd8, 0x4f, 0x63, 0x67, 0x6e, 0x72, 0x61, + 0x33, 0x9f, 0xba, 0x41, 0xbd, 0x4a, 0x1d, 0xbc, 0x19, 0xc1, 0x9b, 0x1c, 0xac, 0xfe, 0xd3, 0x75, + 0xa8, 0xee, 0x79, 0xbe, 0x65, 0x1f, 0xbb, 0xc9, 0x04, 0x5d, 0xb2, 0x67, 0xa2, 0x49, 0xbb, 0x2e, + 0x4d, 0xda, 0x5b, 0x50, 0x9e, 0x70, 0x46, 0x3d, 0x1c, 0x71, 0x57, 0x48, 0x4e, 0x03, 0x01, 0x1a, + 0x8e, 0x1c, 0x14, 0x35, 0x11, 0x01, 0x31, 0xe7, 0x88, 0x39, 0x62, 0xc2, 0x1d, 0x94, 0x7d, 0x8f, + 0xf6, 0x12, 0xd3, 0x72, 0xac, 0x90, 0x8f, 0x64, 0xed, 0xc1, 0xab, 0x91, 0xfe, 0x22, 0xd5, 0xe9, + 0xbe, 0x66, 0x4d, 0x1a, 0xa4, 0xf4, 0xe1, 0xd6, 0xd2, 0x22, 0x72, 0xc1, 0x2b, 0xf6, 0xa1, 0x8d, + 0x6f, 0xc8, 0xcb, 0xc5, 0x9a, 0x3a, 0x84, 0x52, 0x0c, 0x46, 0x0d, 0x5e, 0x6b, 0x0b, 0xad, 0x7d, + 0x8d, 0x95, 0xa1, 0xd0, 0x6c, 0x0c, 0x9a, 0x8d, 0x56, 0x5b, 0xc9, 0x20, 0x6a, 0xd0, 0x1e, 0x72, + 0x4d, 0x7d, 0x9d, 0x6d, 0x42, 0x19, 0x53, 0xad, 0xf6, 0x5e, 0xe3, 0xa8, 0x3b, 0x54, 0xb2, 0xac, + 0x0a, 0xa5, 0x5e, 0x5f, 0x6f, 0x34, 0x87, 0x9d, 0x7e, 0x4f, 0xc9, 0xa9, 0x3f, 0x82, 0x62, 0xf3, + 0xc4, 0x1a, 0x9f, 0x3e, 0xaf, 0x17, 0xc9, 0x95, 0x60, 0x8d, 0x4f, 0x85, 0xd6, 0xbd, 0xe0, 0x4a, + 0xb0, 0xc6, 0xa7, 0x6a, 0x1b, 0x4a, 0x87, 0x86, 0x1f, 0xda, 0x54, 0xaf, 0x47, 0x50, 0x8d, 0x13, + 0x2d, 0x6b, 0x12, 0xe9, 0x23, 0x2c, 0xd6, 0xc5, 0x63, 0x94, 0x96, 0x26, 0x54, 0xdf, 0x81, 0x8a, + 0x0c, 0x60, 0x37, 0x20, 0x6b, 0x5a, 0x93, 0x15, 0xf2, 0x16, 0xc1, 0xea, 0x13, 0xa8, 0x34, 0xa3, + 0xfd, 0xf5, 0x79, 0x55, 0x7f, 0x00, 0x35, 0x12, 0x0e, 0xe3, 0x51, 0x24, 0x1d, 0xd6, 0x57, 0x48, + 0x87, 0x0a, 0xd2, 0x34, 0x47, 0x42, 0x3c, 0x7c, 0x04, 0xe5, 0x43, 0xdf, 0x9b, 0x59, 0x7e, 0x48, + 0xd9, 0x2a, 0x90, 0x3d, 0xb5, 0x2e, 0x44, 0xae, 0xf8, 0x33, 0xf1, 0xf0, 0xac, 0xcb, 0x1e, 0x9e, + 0x07, 0x50, 0x8c, 0xd8, 0xbe, 0x31, 0xcf, 0x0f, 0x51, 0xca, 0x12, 0x8f, 0x6d, 0x05, 0x58, 0xd8, + 0x7d, 0x80, 0x59, 0x0c, 0x10, 0x1d, 0x17, 0x19, 0x31, 0x22, 0x73, 0x4d, 0xa2, 0x50, 0x5f, 0x85, + 0xc2, 0x13, 0xdb, 0x3a, 0x13, 0xcd, 0x7f, 0x66, 0x5b, 0x67, 0x51, 0xf3, 0xf1, 0xb7, 0xfa, 0xe7, + 0x25, 0x28, 0xd2, 0x52, 0x6c, 0x3d, 0xdf, 0xa9, 0xf6, 0x6d, 0x74, 0xbd, 0x1d, 0xb1, 0x9e, 0x72, + 0x2b, 0x34, 0x4c, 0xbe, 0xba, 0x5e, 0x05, 0x90, 0xc4, 0x02, 0x17, 0x72, 0xa5, 0x30, 0x96, 0x06, + 0xa8, 0x24, 0xd1, 0xb6, 0x15, 0x7c, 0xed, 0x08, 0xdb, 0x38, 0x01, 0xb0, 0xfb, 0x5c, 0x85, 0x21, + 0x6b, 0x98, 0xab, 0x79, 0x97, 0x22, 0x53, 0x65, 0xe4, 0x58, 0x91, 0x01, 0x45, 0x7a, 0x0d, 0x26, + 0x48, 0xe4, 0x59, 0x7e, 0x80, 0x92, 0x8d, 0xbc, 0xee, 0x5a, 0x94, 0x64, 0x6f, 0x42, 0x0e, 0xf7, + 0x03, 0x61, 0xf0, 0x5c, 0x8a, 0x7a, 0x50, 0xda, 0xd0, 0x34, 0x22, 0x60, 0x77, 0xa1, 0x40, 0x52, + 0xc8, 0x42, 0xa1, 0x24, 0xf5, 0x76, 0xb4, 0x3f, 0x68, 0x11, 0x9a, 0xbd, 0x05, 0xf9, 0xc9, 0xa9, + 0x75, 0xc1, 0x25, 0x52, 0x9c, 0x67, 0x6a, 0xcd, 0x6a, 0x9c, 0x82, 0xdd, 0x86, 0x9a, 0x6f, 0x4d, + 0x74, 0x72, 0xb3, 0xa1, 0x90, 0x09, 0xea, 0x35, 0x92, 0x21, 0x15, 0xdf, 0x9a, 0x34, 0x11, 0x38, + 0x1c, 0x39, 0x01, 0xbb, 0x03, 0x1b, 0xb4, 0x7a, 0x50, 0xc3, 0x93, 0x4a, 0x8e, 0x96, 0xa2, 0x26, + 0xb0, 0xec, 0x03, 0x00, 0xa1, 0x47, 0xea, 0xa3, 0x0b, 0x72, 0x4f, 0xc7, 0x8b, 0x49, 0x9e, 0xff, + 0xb2, 0xb6, 0xf9, 0x26, 0xe4, 0x71, 0x92, 0x04, 0xf5, 0xab, 0x94, 0xf3, 0x56, 0x7a, 0x06, 0x51, + 0x4d, 0x09, 0xcf, 0xee, 0x42, 0x11, 0x27, 0x8a, 0x8e, 0xc3, 0x51, 0x97, 0x15, 0x6b, 0x31, 0xab, + 0x70, 0x13, 0xb1, 0xce, 0x06, 0x5f, 0x3b, 0xec, 0x1e, 0xe4, 0x4c, 0x5c, 0xcc, 0xd7, 0x28, 0xc7, + 0x2b, 0xd2, 0xb8, 0xa0, 0xb0, 0x6a, 0x59, 0x13, 0xd2, 0xf5, 0x89, 0x86, 0xed, 0x43, 0x0d, 0xa7, + 0xd1, 0x03, 0xd2, 0x0b, 0xb0, 0xfb, 0xea, 0xd7, 0x89, 0xeb, 0xb5, 0x05, 0xae, 0x9e, 0x20, 0xa2, + 0xce, 0x6e, 0xbb, 0xa1, 0x7f, 0xa1, 0x55, 0x5d, 0x19, 0xc6, 0xae, 0xa3, 0x41, 0xd6, 0xf5, 0xc6, + 0xa7, 0x96, 0x59, 0x7f, 0x25, 0x52, 0x96, 0x78, 0x9a, 0x7d, 0x0a, 0x55, 0x9a, 0x58, 0x98, 0xc4, + 0xc2, 0xeb, 0x37, 0x48, 0x98, 0xca, 0x53, 0x26, 0x42, 0x69, 0x69, 0x4a, 0x14, 0xf1, 0x76, 0xa0, + 0x87, 0xd6, 0x74, 0xe6, 0xf9, 0xa8, 0x92, 0xbf, 0x1a, 0xb9, 0x91, 0x86, 0x11, 0x08, 0xf7, 0xec, + 0xf8, 0x30, 0x4d, 0xf7, 0x26, 0x93, 0xc0, 0x0a, 0xeb, 0x37, 0x69, 0xdd, 0xd4, 0xa2, 0x33, 0xb5, + 0x3e, 0x41, 0x69, 0xcf, 0x0c, 0x74, 0xf3, 0xc2, 0x35, 0xa6, 0xf6, 0xb8, 0x7e, 0x8b, 0x6b, 0xfe, + 0x76, 0xd0, 0xe2, 0x00, 0x59, 0xf9, 0xde, 0x49, 0x29, 0xdf, 0x97, 0x20, 0x6f, 0x8e, 0x70, 0x39, + 0xbe, 0x46, 0xd9, 0xe6, 0xcc, 0x51, 0xc7, 0x64, 0xef, 0x42, 0x69, 0x16, 0x89, 0xc0, 0xba, 0x2a, + 0xbb, 0x18, 0x62, 0xc9, 0xa8, 0x25, 0x14, 0x68, 0xf5, 0xee, 0x59, 0x46, 0x38, 0xf7, 0xad, 0x3d, + 0xc7, 0x38, 0xae, 0xbf, 0x4e, 0x39, 0xc9, 0x20, 0xac, 0x9d, 0xe3, 0x1d, 0xdb, 0x63, 0x83, 0x56, + 0xfe, 0x6d, 0xae, 0xa2, 0x09, 0x48, 0xc7, 0x4c, 0x74, 0x56, 0x43, 0xe8, 0x5d, 0x6f, 0xc8, 0x3a, + 0xab, 0x41, 0x8a, 0xd7, 0xf5, 0xc7, 0xa4, 0xcc, 0x53, 0xcf, 0x7d, 0xb4, 0x20, 0xa0, 0x52, 0xcb, + 0x4b, 0x92, 0x64, 0xfb, 0x6b, 0xb2, 0x9c, 0xda, 0xcd, 0x93, 0x24, 0xbf, 0xfe, 0x23, 0x60, 0xcb, + 0x63, 0xfe, 0x32, 0x69, 0x99, 0x17, 0xd2, 0xf2, 0x7b, 0xeb, 0x8f, 0x32, 0xea, 0x13, 0xa8, 0xa6, + 0x84, 0xc1, 0x4a, 0xa9, 0xcf, 0xb5, 0x33, 0x63, 0x2a, 0x0c, 0x6f, 0x9e, 0x88, 0x34, 0x6f, 0xdb, + 0x3d, 0x16, 0x3e, 0x3f, 0xae, 0x79, 0x53, 0x5a, 0xfd, 0xb3, 0x2c, 0x54, 0xf6, 0x8d, 0xe0, 0xe4, + 0xc0, 0x98, 0x0d, 0x42, 0x23, 0x0c, 0x70, 0x8a, 0x9c, 0x18, 0xc1, 0xc9, 0xd4, 0x98, 0x71, 0x3d, + 0x39, 0xc3, 0x1d, 0x0a, 0x02, 0x86, 0x4a, 0x32, 0x4e, 0x4e, 0x4c, 0xf6, 0xdd, 0xc3, 0xcf, 0x85, + 0xb7, 0x20, 0x4e, 0xa3, 0x68, 0x0a, 0x4e, 0xe6, 0x93, 0x49, 0x5c, 0x54, 0x94, 0x64, 0xb7, 0xa1, + 0x2a, 0x7e, 0x92, 0x92, 0x7c, 0x2e, 0x0e, 0x64, 0xd3, 0x40, 0xf6, 0x10, 0xca, 0x02, 0x30, 0x8c, + 0x04, 0x69, 0x2d, 0xf6, 0x02, 0x25, 0x08, 0x4d, 0xa6, 0x62, 0x3f, 0x86, 0xcb, 0x52, 0x72, 0xcf, + 0xf3, 0x0f, 0xe6, 0x4e, 0x68, 0x37, 0x7b, 0x42, 0xcd, 0x78, 0x65, 0x89, 0x3d, 0x21, 0xd1, 0x56, + 0x73, 0xa6, 0x6b, 0x7b, 0x60, 0xbb, 0x24, 0x97, 0xb3, 0x5a, 0x1a, 0xb8, 0x40, 0x65, 0x9c, 0x93, + 0x38, 0x4e, 0x53, 0x19, 0xe7, 0xb8, 0x60, 0x05, 0xe0, 0xc0, 0x0a, 0x4f, 0x3c, 0x93, 0xd4, 0xd1, + 0x78, 0xc1, 0x0e, 0x64, 0x94, 0x96, 0xa6, 0xc4, 0xee, 0x44, 0x53, 0x6f, 0xec, 0x86, 0xa4, 0x94, + 0x66, 0xb5, 0x28, 0x89, 0x5b, 0x95, 0x6f, 0xb8, 0xc7, 0x56, 0x50, 0x2f, 0xef, 0x64, 0xef, 0x66, + 0x34, 0x91, 0x52, 0xff, 0xd6, 0x3a, 0xe4, 0xf9, 0x48, 0xbe, 0x02, 0xa5, 0x11, 0xb9, 0xd1, 0xd1, + 0x66, 0x17, 0xae, 0x71, 0x02, 0xf4, 0xe6, 0x53, 0xae, 0x21, 0x0a, 0x6f, 0x4f, 0x46, 0xa3, 0xdf, + 0x98, 0xa5, 0x37, 0x0f, 0xb1, 0xac, 0x2c, 0x41, 0x45, 0x0a, 0x2b, 0xe1, 0x7b, 0x67, 0x34, 0x1b, + 0x72, 0x84, 0x88, 0x92, 0xe4, 0x7d, 0xa7, 0x5d, 0x0f, 0x99, 0xf2, 0x84, 0x2b, 0x12, 0xa0, 0xe9, + 0x86, 0x8b, 0x9e, 0xa9, 0x8d, 0x25, 0xcf, 0x14, 0xbb, 0x09, 0xa8, 0x7f, 0x8e, 0xad, 0xbe, 0x6b, + 0x35, 0x7b, 0xd4, 0xc3, 0x45, 0x4d, 0x82, 0xe0, 0x02, 0x31, 0xbd, 0x19, 0x75, 0x6a, 0x5e, 0xc3, + 0x9f, 0xec, 0xe3, 0x78, 0x76, 0x52, 0x1b, 0x85, 0x62, 0x2f, 0x76, 0x05, 0x79, 0x1e, 0x6b, 0x29, + 0x3a, 0xcc, 0x09, 0x45, 0x3d, 0x57, 0xec, 0xf1, 0xa7, 0xda, 0x06, 0xd0, 0xbc, 0xb3, 0xc0, 0x0a, + 0xc9, 0x05, 0x7b, 0x95, 0x9a, 0x98, 0x3a, 0x3c, 0xf3, 0xce, 0x0e, 0xbd, 0x20, 0xb6, 0x7d, 0xd7, + 0x57, 0xdb, 0xbe, 0xea, 0x7b, 0x50, 0x40, 0x3d, 0xc0, 0x08, 0x0d, 0x76, 0x5b, 0x78, 0xbd, 0xb8, + 0xf6, 0x22, 0xdc, 0x7f, 0x49, 0x19, 0xc2, 0x0f, 0xd6, 0x8d, 0xca, 0x25, 0x9e, 0xd7, 0x24, 0xeb, + 0x32, 0xde, 0x83, 0x44, 0x86, 0x42, 0xb3, 0x78, 0x05, 0x4a, 0x58, 0x35, 0x3a, 0x51, 0x10, 0x72, + 0xa1, 0xe8, 0x7b, 0x67, 0x4d, 0x4c, 0xab, 0xff, 0x3e, 0x03, 0xe5, 0xbe, 0x6f, 0xe2, 0xe6, 0x37, + 0x98, 0x59, 0xe3, 0x97, 0x9a, 0xea, 0xa8, 0x87, 0x78, 0x8e, 0x63, 0x90, 0x98, 0x15, 0xd6, 0x5d, + 0x0c, 0x60, 0x1f, 0x40, 0x6e, 0x82, 0xe2, 0x34, 0x2b, 0x6b, 0xe7, 0x52, 0xf6, 0xd1, 0x6f, 0x14, + 0xb0, 0x1a, 0x91, 0xaa, 0xbf, 0x11, 0x97, 0x4f, 0x52, 0x57, 0xf6, 0xbb, 0xaf, 0xd1, 0x09, 0xd8, + 0xa0, 0xa9, 0x64, 0x58, 0x11, 0x72, 0xad, 0xf6, 0xa0, 0xc9, 0x75, 0x72, 0xd4, 0xce, 0x07, 0xfa, + 0x5e, 0x47, 0x1b, 0x0c, 0x95, 0x1c, 0x1d, 0xa9, 0x11, 0xa0, 0xdb, 0x18, 0x0c, 0x95, 0x22, 0x03, + 0xd8, 0x38, 0xea, 0x75, 0x7e, 0x7c, 0xd4, 0x56, 0x14, 0xf5, 0x5f, 0x66, 0x00, 0x12, 0xf7, 0x30, + 0x7b, 0x1b, 0xca, 0x67, 0x94, 0xd2, 0xa5, 0x73, 0x03, 0xb9, 0x8d, 0xc0, 0xd1, 0xa4, 0x23, 0xbd, + 0x0b, 0x95, 0x78, 0xbb, 0x40, 0xfd, 0x61, 0xf9, 0x00, 0xa1, 0x1c, 0xe3, 0x77, 0x2f, 0xd8, 0x3b, + 0x50, 0xf4, 0xb0, 0x1d, 0x48, 0x9a, 0x95, 0x95, 0x07, 0xa9, 0xf9, 0x5a, 0xc1, 0xe3, 0x09, 0xd4, + 0x33, 0x26, 0x7e, 0x64, 0xad, 0xc7, 0xa4, 0x7b, 0x08, 0x6a, 0x3a, 0xc6, 0x3c, 0xb0, 0x34, 0x8e, + 0x8f, 0xa5, 0x74, 0x3e, 0x91, 0xd2, 0xea, 0x4f, 0xa0, 0x36, 0x30, 0xa6, 0x33, 0x2e, 0xcb, 0xa9, + 0x61, 0x0c, 0x72, 0x38, 0x27, 0xc4, 0xd4, 0xa3, 0xdf, 0xb8, 0xe8, 0x0e, 0x2d, 0x7f, 0x6c, 0xb9, + 0xd1, 0x1a, 0x8d, 0x92, 0x28, 0x7e, 0x8f, 0x50, 0x9a, 0x6b, 0xde, 0x59, 0x24, 0xce, 0xa3, 0xb4, + 0xfa, 0x77, 0x33, 0x50, 0x96, 0xaa, 0xc1, 0xde, 0x83, 0x1c, 0x29, 0xa4, 0x19, 0x59, 0x10, 0x4a, + 0x04, 0xfc, 0x37, 0x57, 0x61, 0x90, 0x90, 0xdd, 0x81, 0x7c, 0x10, 0x1a, 0x7e, 0x74, 0xd2, 0xa0, + 0x48, 0x1c, 0xbb, 0xde, 0xdc, 0x35, 0x35, 0x8e, 0x66, 0x2a, 0x64, 0x2d, 0xd7, 0x14, 0xfe, 0x8d, + 0x65, 0x2a, 0x44, 0xaa, 0x3b, 0x50, 0x8a, 0xb3, 0xc7, 0x29, 0xa0, 0xf5, 0x9f, 0x0e, 0x94, 0x35, + 0x56, 0x82, 0xbc, 0xd6, 0xe8, 0x3d, 0x6e, 0x2b, 0x19, 0xf5, 0x0f, 0x33, 0x00, 0x09, 0x17, 0xbb, + 0x9f, 0xaa, 0xed, 0xf5, 0xc5, 0x5c, 0xef, 0xd3, 0x5f, 0xa9, 0xb2, 0x37, 0xa0, 0x34, 0x77, 0x09, + 0x68, 0x99, 0x62, 0x27, 0x4a, 0x00, 0x68, 0x45, 0x45, 0x71, 0x31, 0x0b, 0x56, 0xd4, 0x33, 0xc3, + 0x51, 0xbf, 0x07, 0xa5, 0x38, 0x3b, 0x34, 0x0c, 0xf7, 0xfa, 0xdd, 0x6e, 0xff, 0x69, 0xa7, 0xf7, + 0x58, 0x59, 0xc3, 0xe4, 0xa1, 0xd6, 0x6e, 0xb6, 0x5b, 0x98, 0xcc, 0xe0, 0x9c, 0x6d, 0x1e, 0x69, + 0x5a, 0xbb, 0x37, 0xd4, 0xb5, 0xfe, 0x53, 0x65, 0x5d, 0xfd, 0x7f, 0x73, 0xb0, 0xd5, 0x77, 0x5b, + 0xf3, 0x99, 0x63, 0x8f, 0x8d, 0xd0, 0xfa, 0xdc, 0xba, 0x68, 0x86, 0xe7, 0xb8, 0xfb, 0x1a, 0x61, + 0xe8, 0xf3, 0xc5, 0x5c, 0xd2, 0x78, 0x82, 0xfb, 0x40, 0x02, 0xcb, 0x0f, 0xc9, 0xc5, 0x23, 0xaf, + 0xe2, 0x1a, 0x87, 0x37, 0x3d, 0x87, 0xd6, 0x32, 0xfb, 0x01, 0x5c, 0xe6, 0x7e, 0x13, 0x4e, 0x89, + 0x4a, 0xb0, 0x4e, 0x8b, 0x39, 0xbb, 0x34, 0x75, 0x19, 0x27, 0x44, 0x56, 0x24, 0x23, 0x11, 0x76, + 0x0b, 0xca, 0x09, 0x7b, 0x74, 0x7c, 0x07, 0x31, 0x21, 0xd5, 0x04, 0x8d, 0xf7, 0xa8, 0xd6, 0xba, + 0x6d, 0x9e, 0x93, 0x47, 0x29, 0xaf, 0xd5, 0xbc, 0xa4, 0x31, 0xb8, 0x09, 0x7f, 0x01, 0x5b, 0x29, + 0x4a, 0xaa, 0xc5, 0x06, 0xd5, 0xe2, 0x9d, 0xc8, 0x75, 0xbc, 0xd0, 0x7a, 0x19, 0x82, 0xd5, 0xe1, + 0x5a, 0xed, 0xa6, 0x97, 0x86, 0x0a, 0x5d, 0xc4, 0x3e, 0x76, 0x3d, 0xdf, 0x12, 0x02, 0xbf, 0x68, + 0x07, 0x1d, 0x4a, 0x27, 0x36, 0x94, 0x74, 0xdc, 0xcc, 0xf7, 0x97, 0xe8, 0x24, 0x95, 0xa3, 0x6d, + 0xbe, 0x83, 0xe6, 0xb4, 0x02, 0xa5, 0xb9, 0x36, 0xc7, 0x51, 0x91, 0x59, 0x04, 0x64, 0x16, 0x55, + 0x08, 0xf8, 0x84, 0xc3, 0xae, 0xf7, 0x60, 0x7b, 0x55, 0x25, 0x57, 0xa8, 0x61, 0x3b, 0xb2, 0x1a, + 0xb6, 0x60, 0xf8, 0x27, 0x2a, 0xd9, 0xef, 0x64, 0xa0, 0xda, 0x77, 0x4c, 0x1c, 0x04, 0x63, 0x86, + 0x7a, 0x27, 0xfb, 0x21, 0x6c, 0x8d, 0xe6, 0x68, 0xfb, 0xcc, 0x1c, 0x63, 0x6c, 0x9d, 0x78, 0x8e, + 0x69, 0x45, 0xa2, 0x38, 0x75, 0xa2, 0x26, 0x9c, 0xff, 0x0a, 0x11, 0x1f, 0x26, 0xb4, 0xec, 0x23, + 0xa8, 0xcc, 0x7c, 0x6f, 0x64, 0xe9, 0x81, 0x37, 0xf7, 0xc7, 0xd6, 0x92, 0xd1, 0x9e, 0xf0, 0x96, + 0x89, 0x6e, 0x40, 0x64, 0xea, 0xff, 0xcc, 0x40, 0xa5, 0x65, 0x99, 0xf3, 0xd9, 0x67, 0x9e, 0xed, + 0xe2, 0x54, 0xfc, 0x10, 0x2a, 0x9e, 0x43, 0xbe, 0x24, 0x5d, 0x8a, 0xdf, 0x58, 0x95, 0x0f, 0x78, + 0xd4, 0x02, 0x8a, 0xf6, 0x78, 0x17, 0x2e, 0x71, 0xf7, 0x8c, 0x70, 0x6c, 0x9e, 0x73, 0xe6, 0x75, + 0x9a, 0x23, 0x0a, 0x47, 0x71, 0x35, 0x8d, 0xc8, 0x7f, 0x0d, 0xb6, 0x25, 0x72, 0x9c, 0x23, 0x9c, + 0x7e, 0x79, 0xba, 0x6e, 0xc5, 0xbc, 0x71, 0x64, 0xc9, 0x67, 0xb0, 0x1d, 0xd5, 0x70, 0xcc, 0x7b, + 0x8f, 0x33, 0xe7, 0x64, 0x23, 0x33, 0xd5, 0xbb, 0xa2, 0xc2, 0x5b, 0x9e, 0x0c, 0xc4, 0xbc, 0xd4, + 0xdf, 0x59, 0x87, 0x12, 0x77, 0x14, 0x61, 0xdb, 0xef, 0x42, 0xc1, 0x1b, 0x7d, 0xa5, 0xfb, 0xb1, + 0x03, 0x65, 0xe9, 0x64, 0x79, 0xc3, 0x1b, 0x7d, 0xa5, 0x59, 0x13, 0xf6, 0x76, 0xa4, 0xbd, 0x98, + 0xd6, 0x44, 0x74, 0x75, 0x2d, 0x6d, 0xa9, 0x09, 0x6d, 0xa6, 0x65, 0x4d, 0x50, 0x31, 0x4d, 0xd6, + 0x71, 0x50, 0x2f, 0x3c, 0xbf, 0x47, 0xe3, 0x65, 0x1d, 0x20, 0x13, 0x77, 0x96, 0x71, 0xa6, 0xe2, + 0xf3, 0x99, 0x38, 0x19, 0x31, 0x7d, 0x0a, 0xb5, 0x64, 0xe7, 0x22, 0xbe, 0xd2, 0x73, 0xf9, 0xaa, + 0x31, 0x25, 0x9d, 0x70, 0xfd, 0xfd, 0x0c, 0x94, 0x3a, 0xbc, 0xf8, 0xf0, 0x9c, 0xbd, 0x06, 0xd9, + 0x17, 0xf4, 0x02, 0xe2, 0xd8, 0x3d, 0xd8, 0x32, 0x4c, 0x53, 0x37, 0x26, 0x13, 0x6b, 0x1c, 0x5a, + 0xa6, 0x8e, 0x8a, 0x9d, 0x90, 0xa4, 0x9b, 0x86, 0x69, 0x36, 0x04, 0x9c, 0x76, 0x24, 0x94, 0x64, + 0x81, 0x1e, 0x99, 0xe4, 0x49, 0x08, 0x41, 0x51, 0xab, 0xd9, 0x81, 0xb0, 0xc8, 0xb9, 0x43, 0x3e, + 0xd5, 0xb1, 0xb9, 0x17, 0x77, 0xac, 0xca, 0x00, 0x34, 0x8b, 0x16, 0x4c, 0x33, 0x3c, 0xff, 0x2c, + 0x57, 0xcc, 0x28, 0xa0, 0xfe, 0xb3, 0x32, 0x94, 0x1b, 0xae, 0xe1, 0x5c, 0xfc, 0xd4, 0xa2, 0xf8, + 0x07, 0x72, 0xcf, 0xce, 0xe6, 0x21, 0xaf, 0x1f, 0x3f, 0x1c, 0x2c, 0x11, 0x84, 0x6a, 0x76, 0x0b, + 0xca, 0xde, 0x3c, 0x8c, 0xf1, 0xfc, 0xb8, 0x10, 0x38, 0x88, 0x08, 0x62, 0xfe, 0xd8, 0xf5, 0x1f, + 0xf1, 0x93, 0x41, 0x93, 0xf0, 0xc7, 0x4a, 0x6e, 0xcc, 0x4f, 0x04, 0x28, 0x5f, 0xec, 0xa9, 0x45, + 0x27, 0xa4, 0xf3, 0xa9, 0x65, 0xf2, 0xc0, 0x49, 0x1e, 0x8b, 0xd7, 0x14, 0x30, 0xcc, 0x65, 0x6a, + 0x4d, 0x3d, 0xff, 0x82, 0xe7, 0xb2, 0xc1, 0x73, 0xe1, 0x20, 0xca, 0xe5, 0x1d, 0x60, 0x67, 0x86, + 0x1d, 0xea, 0xe9, 0xac, 0xb8, 0x61, 0xa1, 0x20, 0x66, 0x28, 0x67, 0x77, 0x05, 0x36, 0x4c, 0x3b, + 0x38, 0xed, 0xf4, 0x85, 0x51, 0x21, 0x52, 0xd8, 0x96, 0x60, 0x6c, 0xa0, 0x4e, 0x13, 0x5a, 0x5c, + 0x01, 0xce, 0x6a, 0x25, 0x84, 0xec, 0x22, 0x00, 0xf7, 0x44, 0xd7, 0x0a, 0xcf, 0x3c, 0x1f, 0x39, + 0xb9, 0xcd, 0x90, 0x00, 0x50, 0x77, 0x40, 0x52, 0x2c, 0x88, 0x7c, 0x44, 0x59, 0x2d, 0x4e, 0xa3, + 0x36, 0xce, 0xa7, 0x2e, 0x61, 0x2b, 0xbc, 0xfa, 0x09, 0x84, 0xdd, 0x86, 0x1a, 0x55, 0x9f, 0x6c, + 0x0a, 0x6c, 0x03, 0x9d, 0xe8, 0x65, 0xb5, 0x0a, 0x42, 0xc9, 0xc5, 0x80, 0x54, 0x9f, 0xc2, 0xb5, + 0x54, 0xfb, 0x74, 0xc3, 0xf7, 0x8d, 0x0b, 0x7d, 0x6a, 0x7c, 0xe5, 0xf9, 0xe4, 0x0e, 0xca, 0x6a, + 0x57, 0xe4, 0x6e, 0x6b, 0x20, 0xfa, 0x00, 0xb1, 0xcf, 0x65, 0xb5, 0x5d, 0xcf, 0x27, 0x5f, 0xd1, + 0x4a, 0x56, 0xc4, 0x92, 0x63, 0x83, 0x06, 0x98, 0x0c, 0x9c, 0x80, 0xc7, 0x70, 0x6a, 0x65, 0x82, + 0xed, 0x12, 0x08, 0x55, 0xfc, 0xe0, 0x21, 0x17, 0x32, 0x5b, 0x22, 0xa0, 0xea, 0x21, 0x89, 0x22, + 0x8e, 0x38, 0xb1, 0x0c, 0x93, 0x4e, 0x09, 0x09, 0xb1, 0x6f, 0x19, 0x74, 0x06, 0x1f, 0x3c, 0xd4, + 0x67, 0xf3, 0x90, 0x07, 0x5f, 0x6a, 0xf9, 0xe0, 0xe1, 0xe1, 0x3c, 0x14, 0xe0, 0x63, 0x2b, 0xa4, + 0x43, 0x41, 0x02, 0x3f, 0xb6, 0x42, 0xdc, 0xda, 0x82, 0x87, 0x91, 0x6f, 0xfc, 0xb2, 0xe8, 0xdb, + 0x87, 0xc2, 0xf9, 0xad, 0x42, 0x35, 0x46, 0xea, 0xd3, 0x39, 0x8f, 0xb6, 0xcc, 0x6a, 0xe5, 0x88, + 0xe0, 0x60, 0xee, 0xe0, 0xc0, 0x8e, 0x8d, 0xf1, 0x89, 0xa5, 0xfb, 0x58, 0x95, 0xab, 0x7c, 0xe8, + 0x08, 0xa2, 0x61, 0x6d, 0x5e, 0x01, 0x9e, 0xd0, 0x4f, 0xec, 0x90, 0x7c, 0x56, 0x59, 0xad, 0x48, + 0x80, 0x7d, 0x3b, 0xc4, 0x75, 0xcc, 0x91, 0x62, 0x06, 0x52, 0x16, 0xd7, 0x88, 0x68, 0x93, 0x10, + 0x07, 0x04, 0xa7, 0x8c, 0xee, 0x82, 0x92, 0xa2, 0xc5, 0xfc, 0xae, 0x13, 0x69, 0x4d, 0x22, 0xc5, + 0x5c, 0xef, 0x00, 0x67, 0xd6, 0x71, 0xea, 0xf1, 0x3c, 0x5f, 0xe1, 0x06, 0x2e, 0x81, 0x5b, 0x76, + 0x70, 0x4a, 0x39, 0xde, 0x86, 0x9a, 0x44, 0x87, 0xf9, 0xdd, 0xe0, 0x33, 0x23, 0x26, 0x4b, 0xd5, + 0xd1, 0xb7, 0xa6, 0x5e, 0x28, 0x9a, 0xf9, 0xaa, 0x54, 0x47, 0x8d, 0xe0, 0xe9, 0x3a, 0x0a, 0x5a, + 0xcc, 0xf3, 0xa6, 0x54, 0x47, 0x4e, 0x8a, 0xb9, 0xbe, 0x06, 0x95, 0x33, 0xdf, 0x0e, 0x43, 0xcb, + 0xe5, 0x8b, 0xff, 0x16, 0xef, 0x58, 0x01, 0xa3, 0xd5, 0xff, 0x1a, 0x54, 0x78, 0xcf, 0x0b, 0xf9, + 0xb6, 0xc3, 0x49, 0x04, 0x2c, 0x12, 0x10, 0xa2, 0x37, 0xa6, 0xb6, 0x4b, 0x8e, 0xa9, 0xac, 0x56, + 0xe2, 0x10, 0xb4, 0xf3, 0x25, 0xb4, 0x71, 0x4e, 0xee, 0xa9, 0x04, 0x6d, 0x9c, 0xd3, 0x92, 0x9c, + 0xd9, 0x8e, 0xc3, 0x17, 0xfe, 0xeb, 0x62, 0x49, 0x22, 0x84, 0xd6, 0x7d, 0x8c, 0xa6, 0xd2, 0x6f, + 0x4b, 0x68, 0x2a, 0x1b, 0x27, 0x0e, 0xa1, 0xb1, 0xe8, 0x37, 0xc4, 0xc4, 0x41, 0x00, 0x96, 0x9c, + 0x20, 0x8d, 0xf3, 0xfa, 0x1d, 0x19, 0x69, 0x9c, 0x0b, 0xb9, 0x85, 0xb9, 0x12, 0xef, 0x9b, 0xb1, + 0xdc, 0x42, 0x10, 0x72, 0xcb, 0x04, 0xc6, 0x79, 0xfd, 0x6e, 0x9a, 0xc0, 0x38, 0x27, 0xe3, 0xd2, + 0x32, 0x4c, 0x5e, 0xf1, 0xb7, 0x78, 0xf6, 0x08, 0xa0, 0x7a, 0xef, 0x40, 0x25, 0x78, 0xa8, 0x27, + 0xf8, 0x7b, 0x9c, 0x3d, 0x78, 0xa8, 0x45, 0x14, 0xb7, 0xa1, 0x16, 0x4f, 0x0d, 0x4e, 0xf3, 0x36, + 0x1f, 0x78, 0x53, 0x4c, 0x0d, 0x3a, 0x54, 0xfd, 0x59, 0x06, 0xae, 0xf7, 0xc9, 0xaf, 0x46, 0xe2, + 0xff, 0xc0, 0x0a, 0x02, 0xe3, 0xd8, 0xda, 0xf3, 0xfc, 0xbd, 0xf9, 0x4f, 0x7f, 0x7a, 0xc1, 0xee, + 0xc2, 0xe6, 0xa1, 0xe1, 0x5b, 0x6e, 0x18, 0x1f, 0x07, 0x0a, 0x5d, 0x6c, 0x11, 0xcc, 0x1e, 0x81, + 0xc2, 0x41, 0x47, 0xb1, 0x56, 0x2b, 0xec, 0xba, 0xb4, 0x4b, 0x7e, 0x89, 0x0a, 0xed, 0xe4, 0x52, + 0xcb, 0x0e, 0x42, 0xcd, 0x70, 0x8f, 0x51, 0x46, 0x29, 0x8e, 0x77, 0x86, 0xc6, 0x1e, 0x5a, 0x00, + 0xba, 0x64, 0x73, 0x88, 0x5d, 0x32, 0x31, 0x34, 0x6a, 0x44, 0x98, 0x58, 0x0a, 0x9f, 0x82, 0x32, + 0x9f, 0xcd, 0xd2, 0xac, 0xeb, 0xcf, 0x61, 0x25, 0xc2, 0x84, 0xf5, 0x6d, 0x28, 0x4b, 0xa5, 0xae, + 0xb0, 0x4b, 0x20, 0x29, 0x0b, 0x89, 0xa5, 0x72, 0x56, 0x04, 0xb3, 0x42, 0x92, 0xbb, 0xfa, 0xc7, + 0x19, 0x50, 0xc8, 0xaf, 0xa8, 0x51, 0x48, 0x04, 0x9d, 0x2a, 0xa6, 0x2c, 0xda, 0xcc, 0x4b, 0x2d, + 0xda, 0x1d, 0xc8, 0x3b, 0xf6, 0x34, 0x8e, 0x30, 0x4b, 0xa9, 0xbc, 0x84, 0xc0, 0xb1, 0xf6, 0x7c, + 0xfb, 0x98, 0x6c, 0x6f, 0x39, 0x16, 0x92, 0x5c, 0xa6, 0x68, 0xca, 0xd2, 0x10, 0xdd, 0x07, 0x30, + 0xed, 0x20, 0xd4, 0xc9, 0x1b, 0x25, 0xaa, 0x2d, 0x7a, 0x26, 0xee, 0x7f, 0xad, 0x64, 0x46, 0x3f, + 0xd5, 0xdf, 0x57, 0x21, 0xd7, 0xf3, 0x4c, 0x8b, 0xbd, 0x0f, 0x25, 0x0a, 0xf0, 0x95, 0x06, 0x43, + 0x68, 0x81, 0x88, 0xa6, 0x3f, 0xd4, 0xab, 0x45, 0x57, 0xfc, 0x7a, 0x7e, 0x48, 0xf0, 0x6b, 0x64, + 0xc3, 0xd2, 0x21, 0x35, 0x16, 0x5f, 0x16, 0x7e, 0x36, 0x72, 0x0b, 0x71, 0x0c, 0xee, 0x83, 0x74, + 0x4a, 0xe1, 0x5b, 0x2e, 0xa9, 0x9c, 0x79, 0x2d, 0x4e, 0x93, 0xe7, 0xc0, 0xf7, 0x50, 0x4d, 0xe2, + 0xbb, 0x45, 0x7e, 0x85, 0xe7, 0x80, 0xe3, 0x69, 0xfb, 0x78, 0x1f, 0x4a, 0x5f, 0x79, 0xb6, 0xcb, + 0x2b, 0xbe, 0xb1, 0x54, 0x71, 0x54, 0xc9, 0x79, 0xc5, 0xbf, 0x12, 0xbf, 0xd8, 0xeb, 0x50, 0xf0, + 0x5c, 0x9e, 0x77, 0x61, 0x29, 0xef, 0x0d, 0xcf, 0xed, 0xf2, 0x78, 0xb3, 0xaa, 0x1d, 0xe8, 0xbe, + 0x7d, 0x7c, 0x12, 0xea, 0xc8, 0x29, 0x0e, 0xb7, 0xcb, 0x76, 0xa0, 0x21, 0x0c, 0xb3, 0xc5, 0x49, + 0x32, 0xb1, 0x1d, 0xd4, 0xc6, 0x28, 0xb3, 0xd2, 0x52, 0x66, 0xc0, 0xd1, 0x94, 0xe1, 0x1b, 0x50, + 0x3c, 0xf6, 0xbd, 0xf9, 0x0c, 0xe7, 0x03, 0x2c, 0x51, 0x16, 0x08, 0xb7, 0x7b, 0x81, 0xaa, 0x0e, + 0xfd, 0xb4, 0xdd, 0x63, 0x9d, 0x9c, 0x41, 0xe5, 0x9d, 0xec, 0xdd, 0xa2, 0x56, 0x89, 0x80, 0xe4, + 0xe6, 0x79, 0x03, 0x8a, 0xc6, 0xf1, 0xb1, 0x2e, 0xc2, 0xe6, 0x96, 0xf2, 0x32, 0x8e, 0x8f, 0xa9, + 0xc8, 0xfb, 0x50, 0x3d, 0xb3, 0x5d, 0x3d, 0x98, 0x59, 0x63, 0x4e, 0x5b, 0x5d, 0xee, 0xca, 0x33, + 0xdb, 0xc5, 0x99, 0x48, 0xf4, 0xf2, 0x94, 0xad, 0x7d, 0xf3, 0x29, 0xbb, 0xf9, 0xbc, 0x29, 0xab, + 0xc2, 0x86, 0x38, 0xc1, 0x50, 0x96, 0x48, 0x04, 0x86, 0x7d, 0x00, 0x65, 0xdf, 0x70, 0x4f, 0x75, + 0x11, 0x29, 0xf0, 0xa5, 0xec, 0xd0, 0xd0, 0x0c, 0xf7, 0x54, 0x04, 0x0a, 0x80, 0x1f, 0xff, 0x4e, + 0xab, 0xb7, 0x5b, 0x2f, 0xb1, 0x1b, 0x24, 0x73, 0x84, 0xbd, 0xd8, 0x1c, 0xf9, 0x88, 0xf4, 0x7e, + 0xcb, 0x0d, 0xf5, 0x88, 0xe1, 0xd2, 0x6a, 0x86, 0x0a, 0x27, 0xeb, 0x73, 0x36, 0x6c, 0x00, 0x39, + 0x14, 0x75, 0xf2, 0x3e, 0x6e, 0xa7, 0x1a, 0x10, 0x7b, 0x1a, 0x35, 0xf0, 0x13, 0xaf, 0x63, 0x03, + 0x36, 0x93, 0x58, 0x62, 0x1e, 0x94, 0x7d, 0x59, 0x3e, 0xd1, 0x48, 0x05, 0x1f, 0x47, 0x96, 0x86, + 0x9d, 0x8a, 0x48, 0x7e, 0x1d, 0xaa, 0x3c, 0x34, 0x87, 0xf7, 0x5b, 0x40, 0x0a, 0x4d, 0x49, 0xab, + 0x10, 0x90, 0xf7, 0x53, 0x40, 0xc2, 0x40, 0x98, 0x3f, 0xe1, 0x39, 0x69, 0x34, 0x89, 0x30, 0xe0, + 0xf6, 0x4e, 0x78, 0xae, 0x95, 0xcc, 0xe8, 0x27, 0x6e, 0xd4, 0x23, 0xdb, 0x35, 0x71, 0xea, 0x85, + 0xc6, 0x71, 0x50, 0xaf, 0xd3, 0xca, 0x2c, 0x0b, 0xd8, 0xd0, 0x38, 0x0e, 0xd0, 0xb2, 0x35, 0xb8, + 0x61, 0xc0, 0xeb, 0x7d, 0x4d, 0x76, 0xc0, 0x49, 0x26, 0x83, 0x56, 0x36, 0x24, 0xfb, 0xe1, 0x13, + 0x60, 0xd1, 0x01, 0xab, 0x64, 0xa8, 0x5e, 0x5f, 0x9a, 0x8d, 0x9b, 0xe2, 0x84, 0x35, 0x36, 0x53, + 0x6f, 0x41, 0x99, 0x9b, 0xe2, 0x7a, 0x10, 0x5a, 0xb3, 0xfa, 0x2b, 0x54, 0x21, 0xe0, 0xa0, 0x41, + 0x68, 0xcd, 0xd8, 0x27, 0x50, 0x4d, 0x5b, 0x44, 0x37, 0x56, 0x9c, 0x53, 0xd2, 0xb4, 0xd0, 0x2a, + 0x63, 0xd9, 0x46, 0x7a, 0x9d, 0xc7, 0xb9, 0x93, 0x36, 0x43, 0x8c, 0xfc, 0x2c, 0xae, 0xe2, 0x7a, + 0x61, 0x33, 0x82, 0x61, 0x07, 0x46, 0x46, 0x67, 0x78, 0x4e, 0x0a, 0x50, 0xdc, 0x81, 0xb1, 0x99, + 0x87, 0x86, 0x4c, 0x64, 0xf1, 0xb5, 0x80, 0x87, 0xa2, 0xd0, 0x86, 0x6c, 0xf9, 0x3c, 0xec, 0x84, + 0xf4, 0x9d, 0xf8, 0xe8, 0x72, 0x71, 0x9f, 0xd0, 0x78, 0x88, 0x8e, 0xbc, 0x73, 0x3c, 0x82, 0xda, + 0xcc, 0xc7, 0xfe, 0x8d, 0x4b, 0x56, 0xe5, 0x46, 0x1d, 0xfa, 0x56, 0x52, 0x78, 0x65, 0x26, 0xa5, + 0xd8, 0x0f, 0x61, 0x4b, 0xe2, 0x9c, 0x9f, 0x12, 0xf3, 0xeb, 0xc4, 0xbc, 0xbd, 0xc0, 0x7c, 0x74, + 0x8a, 0xec, 0xb5, 0x59, 0x2a, 0xcd, 0x1a, 0x0b, 0x3e, 0xaa, 0x53, 0xeb, 0x82, 0x14, 0xa6, 0xf2, + 0x83, 0xab, 0xcf, 0x71, 0x3c, 0xa5, 0x9c, 0x57, 0x9f, 0xf3, 0x33, 0xb4, 0x4e, 0xd0, 0x76, 0x4d, + 0x52, 0xa5, 0x8a, 0x1a, 0x4f, 0xb0, 0x87, 0x50, 0xe1, 0x76, 0x0b, 0x05, 0xff, 0x06, 0xf5, 0x3b, + 0xb2, 0x93, 0x9e, 0x8c, 0x17, 0x42, 0x68, 0x65, 0x27, 0xfe, 0x1d, 0xb0, 0x8f, 0x61, 0x8b, 0x9f, + 0xa0, 0xc8, 0x52, 0xf6, 0xcd, 0xe5, 0x59, 0x43, 0x44, 0x7b, 0x89, 0xa8, 0xd5, 0xe0, 0x9a, 0x3f, + 0x77, 0xc9, 0x96, 0x11, 0x9c, 0xdc, 0xab, 0x43, 0xfc, 0x77, 0x89, 0x5f, 0x34, 0x47, 0xe3, 0x64, + 0x9c, 0x97, 0xc4, 0xdb, 0x15, 0x5f, 0x06, 0x1d, 0x22, 0xdf, 0x73, 0xf2, 0xe4, 0xae, 0x26, 0xca, + 0xf3, 0xad, 0x6f, 0x93, 0xe7, 0x2e, 0xf2, 0x51, 0x9e, 0x0c, 0x72, 0xf3, 0xb9, 0x6d, 0x92, 0x62, + 0x57, 0xd1, 0xe8, 0x37, 0x7b, 0x03, 0x6a, 0xbe, 0x35, 0x9e, 0xfb, 0x81, 0xfd, 0xcc, 0xd2, 0x03, + 0xdb, 0x3d, 0x25, 0x95, 0xae, 0xa8, 0x55, 0x63, 0xe8, 0xc0, 0x76, 0x4f, 0x51, 0xea, 0x58, 0xe7, + 0xa1, 0xe5, 0xbb, 0xfc, 0x3e, 0xc2, 0x3b, 0xb2, 0xd4, 0x69, 0x13, 0x02, 0x45, 0x85, 0x06, 0x56, + 0xfc, 0x7b, 0x61, 0x72, 0x04, 0x7c, 0x72, 0xdc, 0xff, 0x46, 0x93, 0x63, 0x40, 0x93, 0xe3, 0x0e, + 0x14, 0x6d, 0x37, 0xb4, 0xfc, 0x67, 0x86, 0x53, 0x7f, 0x6f, 0x49, 0xa0, 0xc7, 0x38, 0x76, 0x1b, + 0x0a, 0x81, 0x63, 0xa3, 0xc8, 0xa8, 0xbf, 0xbf, 0x44, 0x16, 0xa1, 0xd8, 0x5d, 0x28, 0xc5, 0x57, + 0xe9, 0xea, 0x1f, 0x2c, 0xd1, 0x25, 0x48, 0x76, 0x13, 0x72, 0x67, 0x38, 0xa1, 0x1e, 0x2c, 0x1f, + 0xaa, 0x20, 0x1c, 0x35, 0x80, 0x09, 0xaa, 0xe8, 0xa4, 0x01, 0x3c, 0x5c, 0xd2, 0x00, 0xf6, 0x6c, + 0xc7, 0xe1, 0x1a, 0xc0, 0x44, 0xfc, 0xc2, 0xfd, 0x93, 0x38, 0xb0, 0x25, 0x1f, 0x2e, 0xef, 0x9f, + 0x88, 0x7b, 0x42, 0x97, 0x0e, 0xcb, 0x01, 0x9d, 0x14, 0xf0, 0x03, 0x8f, 0x8f, 0xe4, 0xbe, 0x4a, + 0x1f, 0x21, 0x68, 0x10, 0xc4, 0x69, 0xb4, 0x37, 0xc4, 0x39, 0x89, 0x6d, 0x9e, 0xd7, 0x3f, 0xe6, + 0xb7, 0x59, 0x38, 0xa4, 0x63, 0x9e, 0xb3, 0xf7, 0xa1, 0x1a, 0x05, 0x56, 0x61, 0x71, 0x41, 0xfd, + 0x93, 0xa5, 0x1a, 0xa4, 0x09, 0x58, 0x0b, 0x2a, 0x13, 0x54, 0xd5, 0xa7, 0x5c, 0x73, 0xaf, 0x3f, + 0xa2, 0x8a, 0xec, 0x44, 0x7b, 0xf3, 0xf3, 0x34, 0x7b, 0x2d, 0xc5, 0xc5, 0xee, 0x03, 0xb3, 0x27, + 0x7c, 0x3c, 0xf7, 0x7c, 0x6f, 0xca, 0xb5, 0xf3, 0xfa, 0xa7, 0x34, 0xbb, 0x56, 0x60, 0xe8, 0xd8, + 0xd4, 0x72, 0x4d, 0x7d, 0x1a, 0x08, 0x4d, 0xe3, 0x7b, 0x54, 0x4f, 0x21, 0xff, 0xe2, 0x2b, 0xb7, + 0x91, 0x43, 0x14, 0x69, 0x0f, 0x02, 0xae, 0x78, 0x7c, 0x0a, 0x38, 0x5d, 0x9f, 0x25, 0xac, 0xbf, + 0xf6, 0x42, 0x56, 0xa4, 0x8d, 0x58, 0x1f, 0x41, 0xcd, 0xb4, 0xcc, 0xf9, 0x8c, 0x94, 0x2e, 0x9a, + 0xa2, 0xdf, 0x97, 0x85, 0x9f, 0xec, 0x66, 0xd5, 0x2a, 0xa6, 0xec, 0x74, 0xfd, 0x04, 0x36, 0x23, + 0x7f, 0x68, 0x28, 0x5c, 0xa7, 0x3f, 0x90, 0x8b, 0x8d, 0x5d, 0x94, 0x5a, 0x75, 0x1e, 0xfd, 0xa4, + 0x22, 0x1f, 0x42, 0x95, 0x36, 0xe2, 0xc0, 0x35, 0x66, 0xc1, 0x89, 0x17, 0xd6, 0x7f, 0x5d, 0xd6, + 0x29, 0x06, 0x02, 0xaa, 0x55, 0x90, 0x28, 0x4a, 0xe1, 0xfe, 0x91, 0xac, 0xd3, 0x71, 0x68, 0xd5, + 0x7f, 0xc8, 0xf7, 0x8f, 0x18, 0xd8, 0x0c, 0x2d, 0xf6, 0x10, 0xc0, 0x98, 0xcd, 0x9c, 0x0b, 0x3e, + 0x35, 0x7f, 0x44, 0x53, 0x73, 0x5b, 0x9a, 0x9a, 0x0d, 0x44, 0xd2, 0xdc, 0x2c, 0x19, 0xd1, 0x4f, + 0xf6, 0x00, 0x2a, 0x33, 0x2f, 0x08, 0x75, 0x73, 0xea, 0x50, 0xfb, 0x1b, 0xf2, 0xda, 0x3e, 0xf4, + 0x82, 0xb0, 0x35, 0x75, 0xb0, 0x15, 0x30, 0x8b, 0x7f, 0xb3, 0x2e, 0x5c, 0x4a, 0xc9, 0x6d, 0x83, + 0x82, 0x14, 0xea, 0xbb, 0x54, 0xe2, 0x0d, 0xa9, 0x44, 0x49, 0x7e, 0x8b, 0x28, 0xbf, 0x2d, 0x6f, + 0x11, 0x44, 0x66, 0x25, 0x8d, 0x41, 0x1c, 0x15, 0xdb, 0xe4, 0xda, 0x05, 0x41, 0xa3, 0xb0, 0xd8, + 0x47, 0xb0, 0x99, 0x50, 0x61, 0x03, 0x83, 0x7a, 0x4b, 0x9e, 0xc9, 0x52, 0x98, 0x7d, 0x35, 0x62, + 0x44, 0x58, 0x40, 0x7d, 0xe7, 0x39, 0xce, 0x7c, 0x26, 0x44, 0x69, 0xbd, 0x2d, 0xfa, 0x8e, 0x80, + 0x5c, 0x4a, 0x4a, 0x96, 0xb7, 0x35, 0xad, 0xef, 0xc9, 0x96, 0xb7, 0x35, 0x45, 0x4d, 0x45, 0x84, + 0x3c, 0x3f, 0xb3, 0xad, 0xb3, 0xa0, 0xfe, 0x98, 0x4e, 0x5b, 0x44, 0x50, 0xf9, 0x13, 0x04, 0xa1, + 0xea, 0x60, 0xda, 0x3e, 0x5a, 0x11, 0x14, 0x9e, 0xb6, 0xcf, 0xa3, 0x92, 0x39, 0x08, 0x29, 0xd4, + 0x7f, 0x9c, 0x87, 0x62, 0x64, 0xd6, 0xb0, 0x32, 0x14, 0x8e, 0x7a, 0x9f, 0xf7, 0xfa, 0x4f, 0x7b, + 0xfc, 0xca, 0x61, 0x63, 0x30, 0x68, 0x6b, 0x43, 0xc5, 0x64, 0x35, 0x00, 0xba, 0x54, 0xa4, 0x0f, + 0x9a, 0x8d, 0x1e, 0xbf, 0x82, 0x48, 0x57, 0x99, 0x78, 0x7a, 0x9d, 0x6d, 0x41, 0x75, 0xef, 0xa8, + 0x47, 0x21, 0x8d, 0x1c, 0x94, 0x45, 0x50, 0xfb, 0x0b, 0x7e, 0x08, 0xcb, 0x41, 0x39, 0x04, 0x1d, + 0x34, 0x86, 0x6d, 0xad, 0x13, 0x81, 0xf2, 0x14, 0x1d, 0xd9, 0x3f, 0xd2, 0x9a, 0x22, 0xa7, 0x0d, + 0x76, 0x19, 0xb6, 0x62, 0xb6, 0x28, 0x4b, 0xa5, 0x80, 0x35, 0x3b, 0xd4, 0xfa, 0x9f, 0xb5, 0x9b, + 0x43, 0x05, 0xe8, 0x44, 0xf7, 0xf1, 0x63, 0xa5, 0xcc, 0x2a, 0x50, 0x6c, 0x75, 0x06, 0xc3, 0x4e, + 0xaf, 0x39, 0x54, 0x2a, 0x58, 0xe1, 0xbd, 0x4e, 0x77, 0xd8, 0xd6, 0x94, 0x2a, 0x2b, 0x42, 0xee, + 0xb3, 0x7e, 0xa7, 0xa7, 0xd4, 0xe8, 0x72, 0x55, 0xe3, 0xe0, 0xb0, 0xdb, 0x56, 0x36, 0x11, 0x3a, + 0xe8, 0x6b, 0x43, 0x45, 0x41, 0xe8, 0xd3, 0x4e, 0xaf, 0xd5, 0x7f, 0xaa, 0x6c, 0xb1, 0x12, 0xe4, + 0x8f, 0x7a, 0x58, 0x0c, 0x63, 0x55, 0x28, 0xd1, 0x4f, 0xbd, 0xd1, 0xed, 0x2a, 0x97, 0xa4, 0x63, + 0xe0, 0x6d, 0x44, 0xd1, 0xa1, 0xf2, 0x00, 0xeb, 0x70, 0x19, 0xdb, 0x12, 0x27, 0x89, 0xfa, 0x0a, + 0xe6, 0x73, 0xd0, 0xe9, 0x1d, 0x0d, 0x94, 0xab, 0x48, 0x4c, 0x3f, 0x09, 0x53, 0xc7, 0x7c, 0x3a, + 0x3d, 0xea, 0xca, 0x9b, 0xf8, 0xbb, 0xd5, 0xee, 0xb6, 0x87, 0x6d, 0xe5, 0x16, 0xb6, 0xaa, 0xdb, + 0x6f, 0x7e, 0xae, 0xf7, 0x0f, 0x95, 0xd7, 0xd8, 0x36, 0x28, 0xfd, 0x9e, 0xde, 0x3a, 0x3a, 0xec, + 0x76, 0x9a, 0x8d, 0x61, 0x5b, 0xff, 0xbc, 0xfd, 0xa5, 0xa2, 0x62, 0x4f, 0x1f, 0x6a, 0x6d, 0x5d, + 0xb0, 0xbf, 0xce, 0x14, 0xa8, 0xec, 0x1d, 0xfd, 0xe4, 0x27, 0x5f, 0xea, 0xa2, 0xa9, 0x6f, 0x60, + 0x4d, 0x12, 0x0a, 0xfd, 0xe8, 0x73, 0xe5, 0xce, 0x02, 0x68, 0xf0, 0xb9, 0xf2, 0x26, 0x76, 0x55, + 0xd4, 0xf7, 0xca, 0x5d, 0x24, 0xd0, 0xda, 0xcd, 0x23, 0x6d, 0xd0, 0x79, 0xd2, 0xd6, 0x9b, 0xc3, + 0xb6, 0xf2, 0x16, 0xf5, 0x4d, 0xa7, 0xf7, 0xb9, 0x72, 0x0f, 0x2b, 0x8f, 0xbf, 0xf8, 0x88, 0xbc, + 0xcd, 0x18, 0xd4, 0x12, 0x5a, 0x82, 0xbd, 0x83, 0x24, 0xbb, 0x5a, 0xbf, 0xd1, 0x6a, 0x36, 0x06, + 0x43, 0xe5, 0x5d, 0x6c, 0xf9, 0xe0, 0xb0, 0xdb, 0x19, 0x2a, 0xf7, 0xb1, 0x79, 0x8f, 0x1b, 0xc3, + 0xfd, 0xb6, 0xa6, 0xbc, 0x87, 0x83, 0x3b, 0xec, 0x1c, 0xb4, 0x75, 0xd1, 0xd3, 0x0f, 0xb0, 0x8c, + 0xbd, 0x4e, 0xb7, 0xab, 0x3c, 0xa4, 0xc3, 0xcd, 0x86, 0x36, 0xec, 0xd0, 0xf0, 0x7e, 0x88, 0x19, + 0x34, 0x0e, 0x0f, 0xbb, 0x5f, 0x2a, 0x1f, 0x61, 0x03, 0x0f, 0x8e, 0xba, 0xc3, 0x8e, 0x7e, 0x74, + 0xd8, 0x6a, 0x0c, 0xdb, 0xca, 0xc7, 0x34, 0xf6, 0xfd, 0xc1, 0xb0, 0x75, 0xd0, 0x55, 0x3e, 0xa1, + 0x3c, 0x69, 0xe6, 0x35, 0xbb, 0xfd, 0x5e, 0x5b, 0x79, 0xa4, 0xe6, 0x8a, 0x3b, 0xca, 0x8e, 0xfa, + 0x5b, 0x50, 0x8c, 0x6c, 0x5c, 0xcc, 0xac, 0xd3, 0xeb, 0xb5, 0x35, 0x65, 0x0d, 0x0b, 0xec, 0xb6, + 0xf7, 0x86, 0x4a, 0x86, 0xce, 0x7b, 0x3b, 0x8f, 0xf7, 0x87, 0xca, 0x3a, 0xfe, 0xec, 0x1f, 0x61, + 0xdf, 0x65, 0xa9, 0xd1, 0xed, 0x83, 0x8e, 0x92, 0xc3, 0x5f, 0x8d, 0xde, 0xb0, 0xa3, 0xe4, 0x69, + 0xc2, 0x74, 0x7a, 0x8f, 0xbb, 0x6d, 0x65, 0x03, 0xa1, 0x07, 0x0d, 0xed, 0x73, 0xa5, 0xc0, 0x33, + 0x6d, 0xb5, 0xbf, 0x50, 0x8a, 0x6c, 0x03, 0xd6, 0xbb, 0x0f, 0x94, 0x12, 0x82, 0x5a, 0xed, 0xd6, + 0xd1, 0xa1, 0x02, 0xea, 0x5d, 0x28, 0x34, 0x8e, 0x8f, 0x0f, 0x3c, 0x93, 0x8e, 0x98, 0xf7, 0x8e, + 0xba, 0x5d, 0xbe, 0x80, 0x76, 0xfb, 0xc3, 0x61, 0xff, 0x40, 0xc9, 0xe0, 0x94, 0x1d, 0xf6, 0x0f, + 0x95, 0x75, 0xb5, 0x03, 0xc5, 0x68, 0x2b, 0x96, 0x6e, 0x0a, 0x16, 0x21, 0x77, 0xa8, 0xb5, 0x9f, + 0xf0, 0x20, 0x85, 0x5e, 0xfb, 0x0b, 0xac, 0x26, 0xfe, 0xc2, 0x8c, 0xb2, 0x58, 0x10, 0xbf, 0xd2, + 0x47, 0x57, 0x05, 0xbb, 0x9d, 0x5e, 0xbb, 0xa1, 0x29, 0x79, 0xf5, 0xa3, 0xd4, 0xf9, 0xaf, 0x90, + 0x5a, 0x58, 0x7c, 0xa3, 0x23, 0x8a, 0xef, 0x3c, 0xee, 0xf5, 0xb5, 0x36, 0xbf, 0x7b, 0x28, 0xba, + 0x73, 0x5d, 0x7d, 0x1b, 0x4a, 0xb1, 0xc4, 0xc5, 0xe9, 0xd5, 0xd4, 0xfa, 0x83, 0x01, 0xef, 0xfd, + 0x35, 0x4c, 0x53, 0xdf, 0xf0, 0x74, 0xe6, 0xb3, 0x5c, 0xf1, 0x96, 0xb2, 0xa3, 0x0e, 0x60, 0x2b, + 0x12, 0xf9, 0x74, 0xe3, 0x81, 0xcc, 0x99, 0x6d, 0xc8, 0x77, 0xad, 0x67, 0x96, 0x13, 0x85, 0xee, + 0x53, 0x02, 0xa1, 0xfd, 0xd1, 0x57, 0x9d, 0xf8, 0x92, 0x38, 0x25, 0x50, 0xc7, 0xeb, 0x49, 0xf7, + 0xd4, 0xe9, 0x1a, 0xe6, 0x5f, 0xc9, 0x40, 0x31, 0xde, 0x48, 0x6e, 0xc3, 0xfa, 0x70, 0x20, 0x0e, + 0x89, 0xb6, 0xef, 0x27, 0xcf, 0x72, 0x0c, 0xa3, 0x5f, 0xda, 0xfa, 0x70, 0xc0, 0xde, 0x81, 0x0d, + 0x7e, 0xad, 0x56, 0x38, 0x88, 0xb6, 0xd3, 0x9b, 0xd3, 0x90, 0x70, 0x9a, 0xa0, 0x61, 0x1f, 0x41, + 0x29, 0xae, 0xad, 0xf0, 0xc2, 0x5c, 0x4d, 0x33, 0xc4, 0x68, 0x2d, 0xa1, 0x54, 0xbb, 0x50, 0x4b, + 0x67, 0xc8, 0x6e, 0x02, 0xf0, 0x2c, 0x25, 0xb7, 0xa0, 0x04, 0x61, 0xd7, 0x21, 0xba, 0xed, 0xdb, + 0xa2, 0x8a, 0x55, 0xe3, 0xdb, 0xbf, 0x2d, 0xf5, 0xaf, 0x67, 0x01, 0x12, 0x55, 0x14, 0x3b, 0x22, + 0xf6, 0x2d, 0xe5, 0x45, 0x00, 0xc1, 0x2b, 0x50, 0x72, 0x3c, 0xc3, 0x94, 0x5f, 0xe5, 0x28, 0x22, + 0x80, 0x06, 0x48, 0xbe, 0xf9, 0x56, 0xe2, 0xd1, 0x3b, 0xec, 0x0a, 0x6c, 0x4c, 0x3c, 0x7f, 0x6a, + 0x84, 0xe2, 0x9e, 0x86, 0x48, 0xe1, 0x8e, 0xc2, 0x0f, 0xb5, 0x51, 0x21, 0x77, 0xe9, 0xaa, 0x06, + 0x8e, 0x41, 0x45, 0x00, 0xbb, 0x08, 0xc3, 0x1d, 0xc1, 0x72, 0xc7, 0x8e, 0x17, 0x58, 0xa6, 0x3e, + 0xe2, 0x01, 0x51, 0x15, 0x0d, 0x22, 0xd0, 0xee, 0x05, 0x6f, 0xad, 0x3f, 0xb5, 0x5d, 0x23, 0x14, + 0x07, 0x43, 0xd4, 0xda, 0x08, 0x82, 0xd5, 0xfd, 0x2a, 0xf0, 0x84, 0xab, 0x89, 0x9f, 0x8f, 0x17, + 0x11, 0x40, 0xd5, 0x7d, 0x15, 0xc0, 0x0a, 0xc6, 0xc6, 0x8c, 0x67, 0x5e, 0xa2, 0xcc, 0x4b, 0x02, + 0xb2, 0x7b, 0xc1, 0xba, 0x50, 0x1b, 0x8e, 0x70, 0x07, 0xf4, 0x5a, 0x46, 0x68, 0x34, 0x3d, 0x47, + 0x38, 0x81, 0x6e, 0x2f, 0xea, 0xec, 0xf7, 0xd3, 0x64, 0xfc, 0x20, 0x7f, 0x81, 0xf7, 0x7a, 0x03, + 0x2e, 0xad, 0x20, 0xfb, 0x56, 0x11, 0x8d, 0x4e, 0x34, 0x3a, 0x8d, 0x30, 0xa4, 0x5b, 0x5c, 0xf1, + 0x66, 0x9f, 0x89, 0x2e, 0x78, 0xf0, 0x7d, 0xfe, 0x15, 0x8a, 0x59, 0x12, 0x01, 0xb5, 0x62, 0x90, + 0xe2, 0x40, 0xd9, 0x3b, 0xb0, 0x89, 0xc8, 0x89, 0x6d, 0x39, 0xa6, 0x20, 0xe1, 0x37, 0x7b, 0xaa, + 0x63, 0xcf, 0xd9, 0x43, 0x28, 0xd1, 0xa9, 0x7f, 0x2d, 0x0f, 0x90, 0x98, 0x79, 0xa9, 0x58, 0x82, + 0x4c, 0x3a, 0x96, 0xe0, 0x01, 0x5c, 0x11, 0x57, 0xd4, 0xe2, 0x63, 0x70, 0xdb, 0xd5, 0x47, 0x46, + 0x14, 0xb6, 0xc1, 0x04, 0x96, 0x9f, 0x84, 0x77, 0xdc, 0x5d, 0x03, 0x95, 0xc6, 0x4d, 0x99, 0x27, + 0xbc, 0x98, 0xa5, 0xdd, 0xbb, 0xb2, 0x2a, 0x92, 0xb0, 0x0f, 0x2f, 0x66, 0xec, 0x7d, 0xb8, 0xec, + 0x5b, 0x13, 0xdf, 0x0a, 0x4e, 0xf4, 0x30, 0x90, 0x0b, 0xe3, 0xd1, 0x91, 0x5b, 0x02, 0x39, 0x0c, + 0xe2, 0xb2, 0xde, 0x87, 0xcb, 0xc2, 0x00, 0x5c, 0xa8, 0x1e, 0x7f, 0xcb, 0x60, 0x8b, 0x23, 0xe5, + 0xda, 0x51, 0x28, 0x2c, 0xd9, 0xbe, 0xd1, 0xdb, 0x36, 0x45, 0xad, 0xc4, 0xed, 0x5c, 0x71, 0xe3, + 0x9b, 0x0c, 0x58, 0x9a, 0x33, 0x45, 0x8d, 0x27, 0x98, 0x0a, 0x39, 0x14, 0xaa, 0x74, 0x84, 0x58, + 0x7b, 0x50, 0xbb, 0x4f, 0x6f, 0xf7, 0xd0, 0x0d, 0x7c, 0xcf, 0xb4, 0x34, 0xc2, 0xb1, 0x77, 0xe1, + 0x92, 0xdc, 0xec, 0xe8, 0xf9, 0x89, 0x32, 0x55, 0x44, 0x49, 0x1a, 0xaa, 0xf1, 0x87, 0x28, 0xde, + 0x06, 0x26, 0xd5, 0x3c, 0xa2, 0xae, 0x10, 0xf5, 0x66, 0x5c, 0x6d, 0x41, 0xfc, 0x26, 0x50, 0x15, + 0xf9, 0x99, 0x49, 0x75, 0xd9, 0xda, 0x43, 0x24, 0x1d, 0x9f, 0xbc, 0x0f, 0x97, 0x93, 0xd6, 0xe9, + 0x46, 0xa8, 0x87, 0x27, 0x96, 0x6e, 0xb9, 0x26, 0xdd, 0x2b, 0x2c, 0x6a, 0x5b, 0x71, 0x43, 0x1b, + 0xe1, 0xf0, 0xc4, 0x42, 0x7b, 0x4d, 0x72, 0xc9, 0x6d, 0xbe, 0xd8, 0x25, 0xf7, 0x31, 0xd4, 0x53, + 0x47, 0xf1, 0x72, 0x77, 0xf3, 0x7b, 0xb9, 0xdb, 0xf2, 0x01, 0x7c, 0xdc, 0xe3, 0xf7, 0x60, 0xeb, + 0xc4, 0x08, 0xf4, 0x14, 0x2f, 0x79, 0x0a, 0x8b, 0xda, 0xe6, 0x89, 0x11, 0x1c, 0x4a, 0x3c, 0xea, + 0xef, 0x67, 0xa0, 0x96, 0x36, 0x7c, 0xf9, 0x65, 0x27, 0x7e, 0x0d, 0x28, 0x43, 0x1e, 0xa7, 0x28, + 0x89, 0x6b, 0x61, 0x76, 0x2a, 0xee, 0x08, 0x45, 0x6b, 0x61, 0x76, 0xca, 0x2f, 0x07, 0xb1, 0xb7, + 0xa0, 0x30, 0x3b, 0xe5, 0xc2, 0xe1, 0x79, 0xb3, 0x6f, 0x63, 0xc6, 0x03, 0xc1, 0xdf, 0x82, 0xc2, + 0x5c, 0x90, 0xe6, 0x9e, 0x47, 0x3a, 0x27, 0x52, 0xf5, 0x9f, 0xaf, 0x43, 0x45, 0x76, 0xf9, 0x7c, + 0x93, 0xb0, 0x82, 0x6f, 0x15, 0x59, 0xb1, 0x43, 0x31, 0x9d, 0x3a, 0x45, 0x9d, 0x63, 0x3f, 0xf1, + 0x98, 0x02, 0x38, 0x31, 0x82, 0xc6, 0x3c, 0xf4, 0x9a, 0x1e, 0x3f, 0x19, 0xf5, 0x9c, 0x28, 0x1a, + 0x9d, 0xaf, 0x0c, 0x94, 0x09, 0x22, 0x10, 0xfd, 0x7d, 0x71, 0xd9, 0x85, 0x6e, 0xc2, 0x51, 0xac, + 0x52, 0x7e, 0x69, 0xbe, 0x54, 0xa2, 0x8b, 0x70, 0x14, 0x86, 0xf4, 0x00, 0x36, 0x93, 0xab, 0x05, + 0x51, 0x78, 0xd3, 0x22, 0x4b, 0x35, 0xbe, 0x57, 0x20, 0x6e, 0xe9, 0x57, 0xed, 0x40, 0xf7, 0x1c, + 0x33, 0xba, 0xc3, 0x54, 0x88, 0x1c, 0xf2, 0x7d, 0xc7, 0x14, 0xd7, 0x2f, 0x39, 0x8d, 0x6b, 0x9d, + 0x45, 0x34, 0xb1, 0xd3, 0xbe, 0x67, 0x9d, 0x89, 0xbb, 0x4c, 0x7f, 0x9e, 0x81, 0xad, 0x25, 0x17, + 0x0d, 0x4a, 0xce, 0xe4, 0xcd, 0x28, 0xfc, 0x89, 0x26, 0xc6, 0xd4, 0x08, 0xc7, 0x27, 0xfa, 0xcc, + 0xb7, 0x26, 0xf6, 0x79, 0xf4, 0xf0, 0x15, 0xc1, 0x0e, 0x09, 0x44, 0x21, 0x5f, 0x74, 0x48, 0xc4, + 0xfd, 0xe0, 0x5c, 0xf0, 0xf1, 0x83, 0xa1, 0x2e, 0x39, 0xc0, 0xa3, 0x70, 0xd0, 0xdc, 0x73, 0xc2, + 0x41, 0xaf, 0x43, 0xc9, 0xf5, 0x42, 0xdd, 0x73, 0xf5, 0xd9, 0xa9, 0x78, 0xd6, 0xa1, 0xe0, 0x7a, + 0x61, 0xdf, 0x3d, 0x3c, 0x65, 0x77, 0x41, 0x99, 0x07, 0x96, 0x3e, 0x72, 0x3c, 0x6f, 0x1a, 0xd9, + 0x49, 0x5c, 0x76, 0xd4, 0xe6, 0x81, 0xb5, 0x8b, 0x60, 0x5e, 0x7f, 0xf5, 0x06, 0x6c, 0x74, 0x62, + 0x87, 0x52, 0x1c, 0x6f, 0x94, 0x15, 0x6f, 0xc4, 0x78, 0x50, 0x6a, 0xd2, 0x7b, 0x33, 0x07, 0xc6, + 0x8c, 0xdd, 0x83, 0xec, 0xd4, 0x98, 0x89, 0xf3, 0xa8, 0x7a, 0x7c, 0x68, 0xc7, 0xb1, 0xf7, 0x0f, + 0x8c, 0x19, 0xdf, 0x6e, 0x90, 0xe8, 0xfa, 0xc7, 0x50, 0x8c, 0x00, 0xdf, 0x6a, 0x63, 0xf9, 0xd7, + 0xeb, 0x50, 0x6a, 0xc9, 0x3e, 0x65, 0xb4, 0xad, 0x43, 0x7f, 0xee, 0xa2, 0xae, 0x16, 0xbd, 0x9c, + 0x31, 0x36, 0xdc, 0xa1, 0x00, 0x45, 0x13, 0x7a, 0xfd, 0x05, 0x13, 0xfa, 0x06, 0x80, 0x4f, 0xfe, + 0x14, 0x72, 0xa9, 0x64, 0xe3, 0x28, 0xdc, 0x8e, 0xd9, 0x31, 0xcf, 0x57, 0x47, 0xd1, 0xe4, 0xbe, + 0x79, 0x14, 0x4d, 0x7e, 0x65, 0x14, 0xcd, 0x9d, 0x64, 0x53, 0xc1, 0x89, 0x8d, 0x05, 0x97, 0xf8, + 0xd6, 0x36, 0x8b, 0x2f, 0xf4, 0x60, 0xe9, 0xdf, 0x83, 0x5a, 0xd4, 0x3a, 0x91, 0x1f, 0xa4, 0xee, + 0x10, 0x09, 0x1c, 0x77, 0x42, 0x57, 0x43, 0x39, 0x99, 0x5e, 0xa8, 0xe5, 0x97, 0x44, 0xea, 0xfc, + 0x8d, 0x0c, 0x30, 0x61, 0xff, 0xef, 0xcd, 0x1d, 0x67, 0x68, 0x9d, 0x93, 0x3c, 0xb8, 0x07, 0x5b, + 0xc2, 0x47, 0x2e, 0x45, 0xef, 0x89, 0x13, 0x5c, 0x8e, 0x48, 0x4e, 0x70, 0x57, 0xdd, 0x08, 0x5d, + 0x5f, 0x79, 0x23, 0x74, 0xf5, 0x4d, 0xd3, 0x5b, 0x50, 0x96, 0xef, 0x53, 0x72, 0x25, 0x0c, 0x8c, + 0xf8, 0x2a, 0xa5, 0xfa, 0x6f, 0xd7, 0x01, 0x12, 0x1f, 0xc5, 0xaf, 0x3a, 0x04, 0x6a, 0xc5, 0x90, + 0x64, 0x57, 0x0d, 0xc9, 0x5d, 0x50, 0x64, 0x3a, 0xe9, 0x62, 0x6f, 0x2d, 0x21, 0x8c, 0x94, 0x1b, + 0x3b, 0x90, 0x6f, 0x54, 0x52, 0x40, 0xa4, 0x88, 0x1a, 0x11, 0xd1, 0x92, 0x24, 0x79, 0xc5, 0xda, + 0x2b, 0xda, 0x01, 0x97, 0xc4, 0xec, 0x53, 0xb8, 0x16, 0x73, 0xea, 0x67, 0x76, 0x78, 0xe2, 0xcd, + 0x43, 0xb1, 0x4e, 0x03, 0x21, 0x9b, 0xae, 0x44, 0x39, 0x3d, 0xe5, 0x68, 0xbe, 0x5e, 0x03, 0x54, + 0xcf, 0x27, 0x73, 0xc7, 0xd1, 0x43, 0xeb, 0x3c, 0x14, 0x8f, 0x71, 0xd4, 0x53, 0xee, 0x1d, 0x69, + 0x78, 0xb5, 0xe2, 0x44, 0x24, 0xd4, 0x7f, 0x92, 0x85, 0xfc, 0x8f, 0xe7, 0x96, 0x7f, 0xc1, 0x3e, + 0x86, 0x52, 0x10, 0x4e, 0x43, 0xf9, 0xb0, 0xf6, 0x1a, 0xcf, 0x80, 0xf0, 0x74, 0xd6, 0x6a, 0x4d, + 0x2d, 0x37, 0xe4, 0x7e, 0x4f, 0xa4, 0xa5, 0x6d, 0x67, 0x1b, 0xf2, 0x41, 0x68, 0xcd, 0x02, 0x11, + 0x53, 0xc8, 0x13, 0x6c, 0x07, 0xf2, 0xae, 0x67, 0x5a, 0x41, 0x3a, 0x72, 0xb0, 0x87, 0x7a, 0x06, + 0x47, 0x30, 0x15, 0x36, 0xe2, 0x11, 0x5f, 0x3a, 0x30, 0xe5, 0x18, 0xba, 0x95, 0x62, 0x19, 0xa6, + 0xed, 0x1e, 0x47, 0x17, 0xa5, 0xe3, 0x34, 0x6e, 0xa8, 0xa4, 0xd6, 0x1b, 0xc7, 0xd1, 0x03, 0x0b, + 0x22, 0xc9, 0x76, 0xa0, 0x8c, 0x3f, 0x9f, 0xfa, 0x76, 0x68, 0x0d, 0x1e, 0x46, 0x32, 0x5d, 0x02, + 0xa1, 0x52, 0x6e, 0x5a, 0xa1, 0x35, 0x0e, 0x07, 0x5f, 0x8b, 0x10, 0xbe, 0x92, 0x26, 0x41, 0xd8, + 0xf7, 0x80, 0x8d, 0x8c, 0xf1, 0xe9, 0xb1, 0x4f, 0x01, 0x01, 0x5f, 0xcf, 0x2d, 0xdf, 0xb6, 0xa2, + 0x90, 0xbd, 0xb2, 0xd4, 0x29, 0xda, 0x56, 0x42, 0xf6, 0x63, 0x4e, 0x85, 0xe6, 0xc4, 0xd4, 0x38, + 0x6f, 0x79, 0x33, 0x11, 0xa9, 0x25, 0x52, 0xea, 0x6f, 0x42, 0x35, 0xd5, 0x85, 0x4b, 0xee, 0xa1, + 0x41, 0xbb, 0xdb, 0x6e, 0x0e, 0xb9, 0x79, 0x29, 0x1c, 0x14, 0xeb, 0x92, 0x7f, 0x23, 0x27, 0x99, + 0x9d, 0x79, 0xf2, 0x8e, 0xb4, 0xb5, 0xc7, 0x6d, 0x65, 0x43, 0xcd, 0x15, 0xb3, 0x4a, 0x56, 0xfd, + 0x9b, 0xeb, 0xb0, 0x35, 0xf4, 0x0d, 0x37, 0x30, 0xb8, 0x12, 0xe2, 0x86, 0xbe, 0xe7, 0xb0, 0xef, + 0x41, 0x31, 0x1c, 0x3b, 0xf2, 0x98, 0xde, 0x8a, 0x24, 0xc8, 0x02, 0xe9, 0xfd, 0xe1, 0x98, 0x7b, + 0xb4, 0x0b, 0x21, 0xff, 0xc1, 0xde, 0x85, 0xfc, 0xc8, 0x3a, 0xb6, 0x5d, 0x21, 0x44, 0x2f, 0x2f, + 0x32, 0xee, 0x22, 0x72, 0x7f, 0x4d, 0xe3, 0x54, 0xec, 0x7d, 0xd8, 0x18, 0x7b, 0xd3, 0x68, 0xcf, + 0x4a, 0xae, 0xd5, 0x49, 0x05, 0x21, 0x76, 0x7f, 0x4d, 0x13, 0x74, 0xec, 0x63, 0x28, 0xfa, 0x9e, + 0xe3, 0x60, 0x17, 0x8a, 0xdd, 0xac, 0xbe, 0xc8, 0xa3, 0x09, 0xfc, 0xfe, 0x9a, 0x16, 0xd3, 0xaa, + 0xf7, 0xa1, 0x20, 0x2a, 0x8b, 0xdd, 0xb0, 0xdb, 0x7e, 0xdc, 0x11, 0x3d, 0xd8, 0xec, 0x1f, 0x1c, + 0x74, 0x86, 0xfc, 0xce, 0xb0, 0xd6, 0xef, 0x76, 0x77, 0x1b, 0xcd, 0xcf, 0x95, 0xf5, 0xdd, 0x22, + 0x6c, 0x70, 0xdf, 0xa5, 0xfa, 0xdb, 0x19, 0xd8, 0x5c, 0x68, 0x00, 0x7b, 0x04, 0xb9, 0x29, 0x2a, + 0xc5, 0xbc, 0x7b, 0x6e, 0xaf, 0x6c, 0xa5, 0x94, 0xe6, 0xaa, 0x32, 0x72, 0xa8, 0x9f, 0x42, 0x2d, + 0x0d, 0x97, 0x5c, 0x10, 0x55, 0x28, 0x69, 0xed, 0x46, 0x4b, 0xef, 0xf7, 0xd0, 0xf0, 0x67, 0x35, + 0x00, 0x4a, 0x3e, 0xd5, 0x3a, 0xe4, 0x35, 0xf8, 0x0d, 0x50, 0x16, 0x3b, 0x86, 0x3d, 0x46, 0xb3, + 0x67, 0x3a, 0x73, 0x2c, 0xd2, 0x2e, 0xa5, 0x21, 0xbb, 0xb9, 0xa2, 0x27, 0x05, 0x19, 0x0f, 0x4a, + 0x19, 0xa7, 0xd2, 0xea, 0x6f, 0x02, 0x5b, 0xee, 0xc1, 0x5f, 0x5d, 0xf6, 0xff, 0x23, 0x03, 0xb9, + 0x43, 0xc7, 0x70, 0xd9, 0xeb, 0x90, 0xa7, 0x17, 0x7c, 0x84, 0x28, 0x96, 0x17, 0x06, 0x4e, 0x0b, + 0xc2, 0xb1, 0xb7, 0x21, 0x1b, 0x8e, 0xa3, 0xab, 0xca, 0x57, 0x9f, 0x33, 0xf9, 0xf6, 0xd7, 0x34, + 0xa4, 0x62, 0x77, 0x21, 0x6b, 0x9a, 0x51, 0x78, 0xbf, 0x70, 0x47, 0xa0, 0x31, 0xda, 0xb2, 0x26, + 0xb6, 0x6b, 0x8b, 0x17, 0x87, 0x90, 0x84, 0xbd, 0x01, 0x59, 0x73, 0xec, 0xa4, 0xef, 0x6a, 0x70, + 0xb3, 0x35, 0xce, 0xd0, 0x1c, 0x3b, 0xa8, 0xbc, 0x85, 0xfe, 0x85, 0xee, 0xcf, 0x5d, 0x8a, 0x6e, + 0x0c, 0x84, 0x41, 0x55, 0x46, 0x85, 0x64, 0x4e, 0x21, 0x92, 0x81, 0xb8, 0xf3, 0x38, 0xf3, 0xad, + 0x99, 0xe1, 0xc7, 0xa6, 0x94, 0x1d, 0x1c, 0x72, 0xc0, 0xee, 0x06, 0xd0, 0xc3, 0xa8, 0xea, 0x3b, + 0xf4, 0xbc, 0x0c, 0xea, 0xe4, 0x6a, 0xf4, 0x6b, 0xc5, 0x1b, 0x7a, 0x02, 0xa3, 0xfe, 0x45, 0x16, + 0xca, 0x52, 0x7d, 0xd8, 0x87, 0x50, 0x34, 0xd3, 0x0b, 0xf1, 0xda, 0x52, 0xa5, 0xef, 0xb7, 0xa2, + 0x25, 0x68, 0x8a, 0xe9, 0x4d, 0xc7, 0x25, 0xa1, 0xfe, 0xcc, 0xf0, 0x6d, 0xfe, 0xa8, 0xd8, 0xba, + 0x7c, 0x6e, 0x31, 0xb0, 0xc2, 0x27, 0x11, 0x66, 0x7f, 0x4d, 0xab, 0x04, 0x52, 0x9a, 0x0c, 0x07, + 0xd1, 0xa4, 0x6c, 0xea, 0x71, 0x36, 0x0e, 0xdc, 0x5f, 0xd3, 0x22, 0x3c, 0x92, 0x5a, 0xe7, 0xd6, + 0x78, 0x1e, 0x46, 0x86, 0x43, 0x35, 0x6a, 0x10, 0x01, 0xe9, 0x85, 0x48, 0xfe, 0x93, 0x3d, 0x40, + 0xc1, 0x69, 0x38, 0x8e, 0x47, 0x7a, 0x57, 0x5e, 0x3e, 0x45, 0x68, 0xc5, 0x70, 0xfe, 0x22, 0x65, + 0x94, 0x62, 0x77, 0x20, 0xef, 0x85, 0x27, 0x56, 0xa4, 0x8e, 0x47, 0x0f, 0xd5, 0x20, 0xa8, 0xd5, + 0xec, 0xe2, 0x4c, 0x21, 0xb4, 0xfa, 0x07, 0x19, 0x28, 0x88, 0x1e, 0x60, 0x5b, 0x50, 0x1d, 0xb4, + 0x87, 0xfa, 0x93, 0x86, 0xd6, 0x69, 0xec, 0x76, 0xdb, 0xe2, 0x8a, 0xc9, 0x63, 0xad, 0xd1, 0x13, + 0x02, 0x52, 0x6b, 0x3f, 0xe9, 0x7f, 0xde, 0xe6, 0x7e, 0xbd, 0x56, 0xbb, 0xf7, 0xa5, 0x92, 0xe5, + 0x4e, 0xed, 0xf6, 0x61, 0x43, 0x43, 0x59, 0x59, 0x86, 0x42, 0xfb, 0x8b, 0x76, 0xf3, 0x88, 0x84, + 0x65, 0x0d, 0xa0, 0xd5, 0x6e, 0x74, 0xbb, 0xfd, 0x26, 0x0a, 0xcf, 0x0d, 0xc6, 0xa0, 0xd6, 0xd4, + 0xda, 0x8d, 0x61, 0x5b, 0x6f, 0x34, 0x9b, 0xfd, 0xa3, 0xde, 0x50, 0x29, 0x60, 0x89, 0x8d, 0xee, + 0xb0, 0xad, 0xc5, 0x20, 0x7a, 0x3c, 0xac, 0xa5, 0xf5, 0x0f, 0x63, 0x48, 0x69, 0xb7, 0x84, 0x46, + 0x1c, 0x8d, 0x95, 0xfa, 0x27, 0x5b, 0x50, 0x4b, 0x4f, 0x4d, 0xf6, 0x09, 0x14, 0x4d, 0x33, 0x35, + 0xc6, 0x37, 0x56, 0x4d, 0xe1, 0xfb, 0x2d, 0x33, 0x1a, 0x66, 0xfe, 0x83, 0xbd, 0x16, 0x2d, 0xa4, + 0xf5, 0xa5, 0x85, 0x14, 0x2d, 0xa3, 0x1f, 0xc2, 0xa6, 0x78, 0x3d, 0xc5, 0x34, 0x42, 0x63, 0x64, + 0x04, 0x56, 0x7a, 0x95, 0x34, 0x09, 0xd9, 0x12, 0xb8, 0xfd, 0x35, 0xad, 0x36, 0x4e, 0x41, 0xd8, + 0xf7, 0xa1, 0x66, 0x90, 0x9d, 0x1e, 0xf3, 0xe7, 0x64, 0x8d, 0xb2, 0x81, 0x38, 0x89, 0xbd, 0x6a, + 0xc8, 0x00, 0x9c, 0x88, 0xa6, 0xef, 0xcd, 0x12, 0xe6, 0x7c, 0xea, 0x00, 0xcd, 0xf7, 0x66, 0x12, + 0x6f, 0xc5, 0x94, 0xd2, 0xec, 0x63, 0xa8, 0x88, 0x9a, 0x27, 0xbe, 0x8a, 0x78, 0xc9, 0xf2, 0x6a, + 0x93, 0x86, 0xb8, 0xbf, 0xa6, 0x95, 0xc7, 0x49, 0x92, 0x3d, 0x44, 0xb5, 0x30, 0xd1, 0xa7, 0x0b, + 0xf2, 0x5c, 0xa3, 0xda, 0x46, 0x5c, 0x60, 0xc4, 0x29, 0xf6, 0x3e, 0x00, 0xd5, 0x93, 0xf3, 0x14, + 0x53, 0xd1, 0x29, 0xbe, 0x37, 0x8b, 0x58, 0x4a, 0x66, 0x94, 0x90, 0xaa, 0xc7, 0x3d, 0x4d, 0xa5, + 0xe5, 0xea, 0x91, 0xb7, 0x29, 0xa9, 0x1e, 0x77, 0x52, 0xc5, 0xd5, 0xe3, 0x6c, 0xb0, 0x54, 0xbd, + 0x88, 0x8b, 0x57, 0x8f, 0x33, 0x45, 0xd5, 0xe3, 0x3c, 0xe5, 0xc5, 0xea, 0x45, 0x2c, 0x54, 0x3d, + 0xce, 0xf1, 0xfd, 0x25, 0x43, 0xa0, 0xf2, 0x5c, 0x43, 0x00, 0x87, 0x2d, 0x6d, 0x0a, 0x7c, 0x1f, + 0x6a, 0xc1, 0x89, 0x77, 0x26, 0x09, 0x90, 0xaa, 0xcc, 0x3d, 0x38, 0xf1, 0xce, 0x64, 0x09, 0x52, + 0x0d, 0x64, 0x00, 0xd6, 0x96, 0x37, 0x91, 0x0e, 0xbb, 0x6a, 0x72, 0x6d, 0xa9, 0x85, 0x4f, 0x6c, + 0xeb, 0x0c, 0x6b, 0x6b, 0x44, 0x09, 0xec, 0x94, 0xc4, 0x6f, 0x13, 0x08, 0x4f, 0x4c, 0x2a, 0x20, + 0x43, 0x94, 0x04, 0xb1, 0x07, 0x27, 0xc0, 0xb9, 0x35, 0x77, 0x65, 0x36, 0x45, 0x9e, 0x5b, 0x47, + 0x6e, 0x8a, 0xb1, 0xc2, 0x49, 0x05, 0x6b, 0xb2, 0x2a, 0x02, 0xeb, 0xeb, 0xb9, 0xe5, 0x8e, 0x2d, + 0x11, 0xbb, 0x95, 0x5a, 0x15, 0x03, 0x81, 0x4b, 0x56, 0x45, 0x04, 0x89, 0xe7, 0x75, 0xcc, 0xce, + 0x16, 0xe7, 0xb5, 0xc4, 0x4c, 0xf3, 0x3a, 0x66, 0x8d, 0x17, 0x54, 0xcc, 0x7b, 0x69, 0x69, 0x41, + 0x49, 0xcc, 0x7c, 0x41, 0xc5, 0xdc, 0x0f, 0x41, 0xcc, 0x26, 0xde, 0xb9, 0xa9, 0x08, 0x2f, 0x5e, + 0x6b, 0xd1, 0xbb, 0x30, 0x8e, 0x53, 0x38, 0x57, 0x7d, 0x0b, 0x0d, 0x0f, 0x31, 0x15, 0x2e, 0xcb, + 0x73, 0x55, 0x23, 0x4c, 0xbc, 0x94, 0xfc, 0x24, 0x29, 0x15, 0x36, 0xb3, 0x43, 0xbf, 0x6e, 0x2e, + 0x17, 0x76, 0x68, 0x87, 0x7e, 0x52, 0x18, 0xa6, 0xd8, 0xbb, 0x40, 0xd3, 0x90, 0xb3, 0x58, 0xb2, + 0xe8, 0xc6, 0x6e, 0x11, 0x0c, 0x45, 0x53, 0xfc, 0xc6, 0xc9, 0x22, 0xca, 0x18, 0x9b, 0xe3, 0xfa, + 0x44, 0x9e, 0x2c, 0xbc, 0x88, 0x66, 0xab, 0x89, 0x93, 0x85, 0x13, 0x35, 0xcd, 0x31, 0xbb, 0x07, + 0xc4, 0x4d, 0xf4, 0xc7, 0xa9, 0x87, 0xd0, 0x7c, 0x6f, 0xc6, 0xa9, 0x0b, 0x48, 0x80, 0xb4, 0xd8, + 0x02, 0xc7, 0x73, 0xa3, 0x86, 0x9f, 0xa4, 0x5a, 0x80, 0x88, 0x58, 0x18, 0x8c, 0xe3, 0x94, 0xfa, + 0xbb, 0x1b, 0x50, 0x10, 0xb2, 0x96, 0x5d, 0x82, 0x4d, 0x21, 0xf2, 0x5b, 0x8d, 0x61, 0x63, 0xb7, + 0x31, 0x40, 0x25, 0x8d, 0x41, 0x8d, 0xcb, 0xfc, 0x18, 0x96, 0xc1, 0x7d, 0x80, 0x84, 0x7e, 0x0c, + 0x5a, 0xc7, 0x7d, 0x40, 0xf0, 0xf2, 0x07, 0x27, 0xb3, 0x6c, 0x13, 0xca, 0x9c, 0x91, 0x03, 0xe8, + 0xc6, 0x2b, 0x71, 0xf1, 0x74, 0x5e, 0x62, 0xe1, 0xc7, 0x5c, 0x1b, 0x09, 0x0b, 0x07, 0x14, 0x62, + 0x96, 0xe8, 0x1c, 0x8c, 0x41, 0x6d, 0xa8, 0x1d, 0xf5, 0x9a, 0x49, 0x39, 0x25, 0xba, 0xa5, 0xc8, + 0xb3, 0x79, 0xd2, 0x69, 0x3f, 0x55, 0x00, 0x99, 0x78, 0x2e, 0x94, 0x2e, 0xa3, 0x9a, 0x49, 0x99, + 0x50, 0xb2, 0xc2, 0xae, 0xc2, 0xa5, 0xc1, 0x7e, 0xff, 0xa9, 0xce, 0x99, 0xe2, 0x26, 0x54, 0xd9, + 0x36, 0x28, 0x12, 0x82, 0x67, 0x5f, 0xc3, 0x22, 0x09, 0x1a, 0x11, 0x0e, 0x94, 0x4d, 0x3a, 0x42, + 0x46, 0xd8, 0x90, 0xef, 0xbb, 0x0a, 0x36, 0x85, 0xb3, 0xf6, 0xbb, 0x47, 0x07, 0xbd, 0x81, 0xb2, + 0x85, 0x95, 0x20, 0x08, 0xaf, 0x39, 0x8b, 0xb3, 0x49, 0x76, 0xeb, 0x4b, 0xb4, 0x81, 0x23, 0xec, + 0x69, 0x43, 0xeb, 0x75, 0x7a, 0x8f, 0x07, 0xca, 0x76, 0x9c, 0x73, 0x5b, 0xd3, 0xfa, 0xda, 0x40, + 0xb9, 0x1c, 0x03, 0x06, 0xc3, 0xc6, 0xf0, 0x68, 0xa0, 0x5c, 0x89, 0x6b, 0x79, 0xa8, 0xf5, 0x9b, + 0xed, 0xc1, 0xa0, 0xdb, 0x19, 0x0c, 0x95, 0xab, 0xec, 0x32, 0x6c, 0x25, 0x35, 0x8a, 0x88, 0xeb, + 0x52, 0x45, 0xb5, 0xc7, 0xed, 0xa1, 0x72, 0x2d, 0xae, 0x46, 0xb3, 0xdf, 0xed, 0x36, 0xe8, 0x24, + 0xf4, 0x3a, 0x12, 0xd1, 0x91, 0xb0, 0x68, 0xcd, 0x2b, 0x58, 0xaf, 0xa3, 0x9e, 0x0c, 0xba, 0x21, + 0x4d, 0x8d, 0x41, 0xfb, 0xc7, 0x47, 0xed, 0x5e, 0xb3, 0xad, 0xbc, 0x9a, 0x4c, 0x8d, 0x18, 0x76, + 0x33, 0x9e, 0x1a, 0x31, 0xe8, 0x56, 0x5c, 0x66, 0x04, 0x1a, 0x28, 0x3b, 0x98, 0x9f, 0xa8, 0x47, + 0xaf, 0xd7, 0x6e, 0x0e, 0xb1, 0xad, 0xaf, 0xc5, 0xbd, 0x78, 0x74, 0xf8, 0x58, 0x6b, 0xb4, 0xda, + 0x8a, 0x8a, 0x10, 0xad, 0xdd, 0x6b, 0x1c, 0x44, 0xa3, 0xfd, 0xba, 0x34, 0xda, 0x87, 0x9d, 0xa1, + 0xa6, 0xdc, 0x8e, 0x47, 0x97, 0x92, 0x6f, 0xb0, 0x57, 0xe0, 0xaa, 0x3c, 0x0f, 0xf5, 0xa7, 0x9d, + 0xe1, 0xbe, 0x38, 0xb8, 0xbd, 0xc3, 0x8f, 0x1e, 0x09, 0xd9, 0x6c, 0x35, 0xf9, 0x09, 0x35, 0xf1, + 0x62, 0xea, 0xee, 0x6e, 0x85, 0xde, 0x0d, 0x17, 0x0a, 0x88, 0xfa, 0x19, 0x30, 0xf9, 0x09, 0x5d, + 0x11, 0x02, 0xcb, 0x20, 0x37, 0xf1, 0xbd, 0x69, 0xf4, 0xfa, 0x04, 0xfe, 0x46, 0x53, 0x7a, 0x36, + 0x1f, 0xd1, 0x91, 0x68, 0x72, 0xbb, 0x5c, 0x06, 0xa9, 0x7f, 0x2f, 0x03, 0xb5, 0xb4, 0xf2, 0x41, + 0x1e, 0xd3, 0x89, 0xee, 0x7a, 0x21, 0x7f, 0xf9, 0x2b, 0x88, 0x5f, 0xb6, 0x9d, 0xf4, 0xbc, 0x90, + 0x9e, 0xfe, 0x22, 0xcb, 0x3e, 0xd6, 0x25, 0x78, 0xae, 0x71, 0x9a, 0x75, 0xe0, 0x52, 0xea, 0x15, + 0xe2, 0xd4, 0xbb, 0x6b, 0xf5, 0xf8, 0xf5, 0xd0, 0x85, 0xfa, 0x6b, 0x2c, 0x58, 0x6e, 0x93, 0x78, + 0x23, 0x20, 0x97, 0xbc, 0x11, 0xb0, 0x0f, 0xd5, 0x94, 0xae, 0x43, 0x0e, 0x99, 0x49, 0xba, 0xa6, + 0x45, 0x7b, 0xf2, 0xf2, 0x6a, 0xaa, 0x7f, 0x27, 0x03, 0x15, 0x59, 0xf3, 0xf9, 0xce, 0x39, 0x51, + 0x58, 0x89, 0xf8, 0xad, 0xdb, 0x66, 0xf4, 0x8c, 0x57, 0x04, 0xea, 0xd0, 0xf7, 0x12, 0xb8, 0xf3, + 0x79, 0xef, 0x74, 0x10, 0x37, 0x47, 0x06, 0xb1, 0x9b, 0x00, 0x74, 0xbb, 0x78, 0xef, 0x73, 0x24, + 0x10, 0xcf, 0x45, 0x27, 0x10, 0xf5, 0x16, 0x94, 0xf6, 0x4e, 0xa3, 0x28, 0x1b, 0xf9, 0xfd, 0xbb, + 0x12, 0x7f, 0x92, 0x40, 0xfd, 0xa3, 0x0c, 0xd4, 0x92, 0x07, 0x80, 0xe8, 0x48, 0x9a, 0xbf, 0x5e, + 0xcd, 0xa7, 0xc3, 0xba, 0x39, 0x4a, 0x3e, 0xa5, 0xb0, 0x2e, 0x7f, 0x4a, 0xe1, 0x75, 0x91, 0x59, + 0x56, 0x16, 0xf9, 0x71, 0x59, 0xe2, 0xc1, 0x83, 0x87, 0x50, 0xc1, 0xff, 0x9a, 0x35, 0xb1, 0x7c, + 0xdf, 0x32, 0xd3, 0x97, 0x08, 0x12, 0xe2, 0x14, 0x11, 0xd9, 0x78, 0xd6, 0x44, 0xa8, 0x9a, 0x2b, + 0xdf, 0x28, 0xa2, 0xb7, 0xb3, 0xfe, 0x5b, 0x16, 0xca, 0x92, 0x1e, 0xf9, 0x8d, 0xa6, 0xdf, 0x0d, + 0x28, 0x25, 0x2f, 0xe6, 0x88, 0x5b, 0xe6, 0x31, 0x20, 0x35, 0x56, 0xd9, 0x85, 0xb1, 0xaa, 0x43, + 0xc1, 0xe7, 0x57, 0x1b, 0x85, 0x37, 0x38, 0x4a, 0xa6, 0xfd, 0xae, 0xf9, 0x97, 0x1c, 0x90, 0x7c, + 0x00, 0x15, 0xc9, 0x69, 0x1a, 0x88, 0x9b, 0xd8, 0x8b, 0xf4, 0xe5, 0xc4, 0x81, 0x1a, 0xb0, 0xcb, + 0xb0, 0x31, 0x39, 0xd5, 0xcd, 0x11, 0xbf, 0xa8, 0x5a, 0xd2, 0xf2, 0x93, 0xd3, 0xd6, 0x88, 0x8e, + 0x8f, 0x26, 0xb1, 0xea, 0xc4, 0x5d, 0x59, 0xc5, 0x49, 0xa4, 0x20, 0xdd, 0x85, 0xc2, 0xe4, 0x54, + 0xbe, 0x70, 0xba, 0xd4, 0xe5, 0x1b, 0x93, 0x53, 0xba, 0xa1, 0xfa, 0x1e, 0x6c, 0x8b, 0xfd, 0xdb, + 0x08, 0x74, 0xfe, 0xa0, 0x07, 0xbd, 0xa4, 0xc4, 0x5f, 0xc3, 0xdb, 0xe2, 0xb8, 0x46, 0x30, 0x20, + 0x0c, 0xce, 0x38, 0x15, 0x2a, 0xd2, 0x04, 0xe4, 0x4f, 0x4e, 0x95, 0xb4, 0x14, 0x8c, 0x3d, 0x82, + 0xca, 0xe4, 0x94, 0x0f, 0xe8, 0xd0, 0x3b, 0xb0, 0xc4, 0x5d, 0x81, 0xed, 0xc5, 0xa1, 0xa4, 0x98, + 0x81, 0x14, 0x25, 0xbb, 0x02, 0x1b, 0x9a, 0x71, 0x36, 0xf8, 0x71, 0x97, 0x94, 0xc8, 0x92, 0x26, + 0x52, 0x9f, 0xe5, 0x8a, 0x35, 0x65, 0x53, 0xfd, 0x47, 0x19, 0xa8, 0x25, 0x36, 0x00, 0x2e, 0x42, + 0x76, 0x4f, 0x7e, 0x76, 0xbe, 0xbe, 0x68, 0x26, 0x20, 0xc9, 0xfd, 0xe1, 0xc5, 0x8c, 0x3f, 0xce, + 0xba, 0xea, 0x99, 0xb0, 0x55, 0x5e, 0xec, 0xec, 0xca, 0x07, 0xaf, 0x1f, 0x43, 0x76, 0x78, 0x31, + 0xe3, 0xfe, 0x26, 0xdc, 0x12, 0xb9, 0x6d, 0xca, 0x37, 0x43, 0x0a, 0x4d, 0xf9, 0xbc, 0xfd, 0x25, + 0x7f, 0x15, 0xe3, 0x50, 0xeb, 0x1c, 0x34, 0xb4, 0x2f, 0x29, 0xf6, 0x88, 0x94, 0x86, 0xbd, 0xbe, + 0xd6, 0xee, 0x3c, 0xee, 0x11, 0x20, 0x47, 0xde, 0xa8, 0xa4, 0x8a, 0x0d, 0xd3, 0xdc, 0x3b, 0x95, + 0x5f, 0x58, 0xca, 0xa4, 0x5e, 0x58, 0x4a, 0x5f, 0xa4, 0x5f, 0x5f, 0xbc, 0x48, 0xcf, 0xe2, 0x55, + 0x18, 0x2f, 0x69, 0xf6, 0x26, 0xe4, 0x26, 0xa7, 0xd6, 0x45, 0xda, 0xd0, 0x4b, 0x2f, 0x20, 0x22, + 0x50, 0x7f, 0x91, 0x01, 0x96, 0xaa, 0x08, 0xb7, 0x3d, 0xbe, 0x6b, 0x5d, 0x3e, 0x81, 0xba, 0x08, + 0xa4, 0xe3, 0x54, 0x92, 0xdb, 0x5c, 0x74, 0xe9, 0x65, 0x2f, 0x09, 0x30, 0x4d, 0x5e, 0x32, 0x63, + 0xef, 0x01, 0x7f, 0x9f, 0x91, 0x42, 0x4c, 0x72, 0xcf, 0xb1, 0x13, 0xb5, 0x84, 0x26, 0x79, 0x90, + 0x51, 0x7e, 0x68, 0x92, 0x7b, 0xdc, 0x37, 0x93, 0x51, 0xa3, 0x35, 0xaf, 0xfe, 0xd5, 0x0c, 0x5c, + 0x4a, 0x4f, 0x88, 0x5f, 0xae, 0x95, 0xe9, 0x57, 0x35, 0xb3, 0x8b, 0xaf, 0x6a, 0xae, 0x9a, 0x4f, + 0xb9, 0x95, 0xf3, 0xe9, 0x77, 0x32, 0xb0, 0x2d, 0xf5, 0x7e, 0x62, 0x2d, 0xfe, 0x25, 0xd5, 0x4c, + 0x7a, 0x5c, 0x33, 0x97, 0x7a, 0x5c, 0x53, 0xfd, 0x79, 0x06, 0xae, 0x2c, 0xd4, 0x44, 0xb3, 0xfe, + 0x52, 0xeb, 0x92, 0x7e, 0x84, 0x93, 0xbc, 0xfe, 0xd1, 0x9b, 0x01, 0x99, 0xbb, 0x59, 0xe9, 0x11, + 0x4e, 0x3a, 0x0a, 0xa2, 0xf3, 0xc8, 0x57, 0xc5, 0x03, 0x43, 0x7a, 0x70, 0xe1, 0x8e, 0xc5, 0x60, + 0x97, 0x08, 0x32, 0xb8, 0x70, 0xc7, 0xea, 0x9f, 0x64, 0xe0, 0xda, 0x42, 0x1b, 0x1a, 0xf3, 0xd0, + 0x13, 0x87, 0xb9, 0x7f, 0x49, 0xcd, 0xb8, 0x05, 0x65, 0x3a, 0xea, 0x16, 0x27, 0xc4, 0xbc, 0x5b, + 0xc1, 0x48, 0xca, 0x55, 0x20, 0x6b, 0x1a, 0x17, 0xe2, 0x8a, 0x39, 0xfe, 0xc4, 0x05, 0x7b, 0xe2, + 0xcd, 0x7d, 0x71, 0xa5, 0x9c, 0x7e, 0xab, 0x1f, 0xc2, 0x56, 0x52, 0xf5, 0xa6, 0x78, 0x0b, 0xf5, + 0x16, 0x94, 0x5d, 0xeb, 0x4c, 0x8f, 0x5e, 0x4a, 0x15, 0xf1, 0x52, 0xae, 0x75, 0x26, 0x08, 0xd4, + 0x3d, 0x59, 0x16, 0xc6, 0x5f, 0x78, 0x70, 0xcc, 0x54, 0xe0, 0x8d, 0xe7, 0x98, 0x11, 0x0a, 0x73, + 0x93, 0x5a, 0x59, 0x70, 0xad, 0x33, 0x9a, 0x87, 0x67, 0x22, 0x9f, 0x86, 0x29, 0x5e, 0x26, 0x5d, + 0xf9, 0x1e, 0xd9, 0x35, 0x28, 0xce, 0xfc, 0x54, 0x37, 0x15, 0x66, 0x3e, 0x2f, 0xf6, 0xb6, 0x88, + 0xc6, 0x7a, 0x5e, 0xa0, 0x02, 0x8f, 0xcf, 0x12, 0x5f, 0x80, 0xc9, 0x25, 0x5f, 0x80, 0xf9, 0x48, + 0x88, 0x41, 0xb2, 0xfb, 0x78, 0xc9, 0x0a, 0x64, 0x6d, 0xf3, 0x9c, 0x0a, 0xae, 0x6a, 0xf8, 0x93, + 0x34, 0x39, 0xeb, 0x6b, 0x11, 0x10, 0x86, 0x3f, 0xd5, 0x5d, 0x28, 0x6b, 0x29, 0x23, 0xb7, 0x22, + 0xf9, 0x8b, 0x82, 0xf4, 0x93, 0x4d, 0x49, 0x07, 0x69, 0xe5, 0xc4, 0x5d, 0x14, 0xa8, 0x81, 0x10, + 0x7c, 0x4f, 0x0c, 0x7f, 0x7c, 0x62, 0xf8, 0x5d, 0xcb, 0x3d, 0x0e, 0x4f, 0xb0, 0xcb, 0xb9, 0x1b, + 0x57, 0xee, 0x42, 0xe0, 0xa0, 0x68, 0x3a, 0x60, 0x2f, 0x3a, 0x44, 0x1e, 0x7d, 0x5b, 0xc2, 0xb5, + 0xce, 0x04, 0xff, 0xab, 0x00, 0xd8, 0xff, 0x02, 0xcd, 0x4f, 0x13, 0x4b, 0x9e, 0x63, 0x72, 0xb4, + 0xba, 0x25, 0xda, 0x2b, 0x9e, 0x48, 0x68, 0x59, 0x13, 0xd5, 0x11, 0x23, 0xcf, 0x1b, 0x24, 0x3a, + 0xe1, 0x3b, 0x0d, 0x23, 0x7b, 0x0d, 0x2a, 0x91, 0x47, 0x82, 0x5e, 0x09, 0xe3, 0xc5, 0x97, 0x23, + 0x58, 0x6f, 0x3e, 0x55, 0x7f, 0x3f, 0x0b, 0x95, 0x06, 0x0f, 0xcd, 0x99, 0x5d, 0xf4, 0x67, 0x21, + 0xfb, 0x4d, 0xb8, 0x1c, 0x9c, 0xda, 0x33, 0xf1, 0x31, 0x08, 0x8a, 0x88, 0xa1, 0xe8, 0x6a, 0xd1, + 0x89, 0xf7, 0xa4, 0x4e, 0x14, 0x2c, 0xf7, 0x07, 0xa7, 0xf6, 0x8c, 0x07, 0xf5, 0x77, 0xcc, 0x73, + 0x8a, 0xa0, 0xe7, 0xc7, 0xfc, 0x2c, 0x58, 0x42, 0xd0, 0x4d, 0x79, 0xcc, 0x7e, 0x76, 0x2a, 0xb2, + 0x15, 0x71, 0x0f, 0x08, 0x3c, 0x3c, 0xe5, 0x34, 0xf7, 0x60, 0x8b, 0xdf, 0xe3, 0x59, 0xde, 0x80, + 0x37, 0x39, 0x22, 0x99, 0xdf, 0x03, 0xd8, 0xa2, 0xfc, 0xc4, 0x73, 0x96, 0xfa, 0xd8, 0x9b, 0x5d, + 0x88, 0x53, 0xc4, 0x37, 0x9f, 0x53, 0xd5, 0x0e, 0x27, 0x45, 0x90, 0x78, 0xc6, 0x26, 0x48, 0x43, + 0xaf, 0xb7, 0xe1, 0xea, 0x73, 0xda, 0xf4, 0xb2, 0x48, 0x85, 0xa2, 0x14, 0xa9, 0x70, 0x7d, 0x17, + 0xb6, 0x57, 0x95, 0xf7, 0x6d, 0xf2, 0x50, 0xff, 0xb0, 0x0a, 0x90, 0xcc, 0xd8, 0x94, 0x3a, 0x9a, + 0x59, 0x50, 0x47, 0xbf, 0x55, 0x54, 0xce, 0x87, 0x50, 0xc3, 0xae, 0xd2, 0x13, 0x8e, 0xec, 0x4a, + 0x8e, 0x0a, 0x52, 0x0d, 0x93, 0xdb, 0x8e, 0xcb, 0xd1, 0x0d, 0xb9, 0x95, 0xd1, 0x0d, 0x1f, 0x40, + 0x81, 0x1f, 0xb4, 0x05, 0xe2, 0x82, 0xed, 0xd5, 0xc5, 0xd5, 0x77, 0x5f, 0x5c, 0x10, 0x88, 0xe8, + 0x58, 0x1b, 0x6a, 0x28, 0xfa, 0x7d, 0x3b, 0x3c, 0x99, 0xca, 0xd7, 0x6d, 0x6f, 0x2e, 0x73, 0x46, + 0x64, 0xfc, 0x11, 0x4c, 0x43, 0x4e, 0x4a, 0xda, 0x6b, 0x38, 0x15, 0xde, 0x5f, 0xd2, 0x5e, 0x0b, + 0xb2, 0xf6, 0x3a, 0x9c, 0x72, 0x9f, 0x2f, 0x6a, 0xaf, 0xef, 0xc2, 0x25, 0x71, 0x69, 0x09, 0x19, + 0xb0, 0x3b, 0x89, 0x9e, 0x07, 0x60, 0x8a, 0xd7, 0x9d, 0x86, 0x53, 0xb2, 0xed, 0x90, 0xfc, 0x0b, + 0xd8, 0x1e, 0x9f, 0x18, 0xee, 0xb1, 0xa5, 0x87, 0x23, 0x47, 0xa7, 0x0f, 0x0b, 0xe8, 0x53, 0x63, + 0x26, 0x94, 0xea, 0x37, 0x97, 0x2a, 0xdb, 0x24, 0xe2, 0xe1, 0xc8, 0xa1, 0x08, 0xb2, 0x38, 0x06, + 0x66, 0x6b, 0xbc, 0x08, 0x5f, 0x38, 0x8a, 0x86, 0xa5, 0xa3, 0xe8, 0x45, 0x35, 0xbb, 0xbc, 0x42, + 0xcd, 0x4e, 0x94, 0xe5, 0x8a, 0xac, 0x2c, 0xb3, 0x77, 0xa0, 0x20, 0xae, 0x6d, 0x0a, 0xbf, 0x2f, + 0x5b, 0x5e, 0x1d, 0x5a, 0x44, 0x82, 0x25, 0x45, 0x81, 0x11, 0x74, 0x0b, 0xbf, 0xc6, 0x4b, 0x92, + 0x61, 0x6c, 0x57, 0x38, 0x3d, 0xe3, 0x68, 0x37, 0xe1, 0xe3, 0xbd, 0x2e, 0x65, 0x1c, 0xe3, 0x84, + 0x5d, 0xbe, 0xc0, 0x71, 0xfd, 0x1f, 0x6e, 0xc0, 0x86, 0x08, 0xaf, 0xbe, 0x07, 0x39, 0xd3, 0xf7, + 0x66, 0x71, 0xa4, 0xf2, 0x0a, 0xad, 0x9d, 0xbe, 0x25, 0x87, 0x0a, 0xfe, 0x7d, 0xd8, 0x30, 0x4c, + 0x53, 0x9f, 0x9c, 0xa6, 0xcf, 0xa3, 0x17, 0x14, 0xe8, 0xfd, 0x35, 0x2d, 0x6f, 0x90, 0x26, 0xfd, + 0x09, 0x94, 0x90, 0x3e, 0x89, 0x1f, 0x2d, 0x2f, 0x9b, 0x05, 0x91, 0xaa, 0xbb, 0xbf, 0xa6, 0x15, + 0x8d, 0x48, 0xed, 0xfd, 0x41, 0xda, 0xb3, 0x9f, 0x5b, 0x6a, 0xe0, 0x82, 0x9e, 0xb6, 0xe0, 0xe3, + 0xff, 0x75, 0xe0, 0xae, 0xde, 0x78, 0xc7, 0xce, 0xcb, 0x47, 0x9f, 0x4b, 0xfb, 0xfb, 0xfe, 0x9a, + 0xc6, 0xf7, 0xad, 0x68, 0xbf, 0xff, 0x28, 0xf2, 0xba, 0xc7, 0xdf, 0xdc, 0x59, 0xd1, 0x33, 0x28, + 0x06, 0x63, 0xd7, 0x3b, 0xc9, 0x44, 0x64, 0x33, 0xa3, 0xa7, 0xc6, 0xc5, 0x69, 0x89, 0xcc, 0x16, + 0xef, 0xea, 0xc4, 0x16, 0x6f, 0xf1, 0x8f, 0xa0, 0xcc, 0x9d, 0xb0, 0x9c, 0xaf, 0xb8, 0xd4, 0xb5, + 0xc9, 0xa6, 0x4c, 0xc7, 0x7a, 0xc9, 0x16, 0xdd, 0x8c, 0xda, 0xe9, 0x5b, 0xf2, 0xc9, 0xc9, 0x8d, + 0x95, 0x1d, 0xa5, 0xc5, 0x87, 0x28, 0xbc, 0xb1, 0x1a, 0xe7, 0x61, 0x5d, 0xd8, 0x16, 0x47, 0x0c, + 0x7c, 0x03, 0x8e, 0xf6, 0x4c, 0x58, 0x1a, 0xaf, 0xd4, 0x0e, 0xbd, 0xbf, 0xa6, 0x31, 0x63, 0x79, + 0xdf, 0x6e, 0xc2, 0x56, 0x54, 0x25, 0xda, 0x59, 0xa5, 0x08, 0x28, 0xb9, 0x49, 0xc9, 0xbe, 0xbb, + 0xbf, 0xa6, 0x6d, 0x1a, 0x69, 0x10, 0xeb, 0xc0, 0xa5, 0x28, 0x13, 0x72, 0xb5, 0x8b, 0x9e, 0xa9, + 0x2c, 0x8d, 0xa2, 0xbc, 0x57, 0xef, 0xaf, 0x69, 0x5b, 0xc6, 0xd2, 0x06, 0x7e, 0x10, 0xd5, 0x47, + 0x56, 0x0e, 0xf9, 0x4a, 0xbc, 0xb5, 0xb2, 0x9b, 0x12, 0x4d, 0x35, 0xae, 0x59, 0x02, 0x4a, 0xe2, + 0x18, 0xae, 0x6b, 0x70, 0x65, 0xb5, 0x84, 0x91, 0xb7, 0x99, 0x1c, 0xdf, 0x66, 0xd4, 0xf4, 0xc3, + 0x67, 0xe9, 0x57, 0x35, 0xa4, 0x4d, 0xe7, 0x47, 0x50, 0x4d, 0x89, 0x58, 0x56, 0x86, 0x42, 0xf4, + 0xcc, 0x3a, 0x5d, 0xa9, 0x68, 0xf6, 0x0f, 0xbf, 0x54, 0x32, 0x08, 0xee, 0xf4, 0x06, 0xc3, 0x46, + 0x6f, 0xa8, 0xac, 0xf3, 0xc4, 0x61, 0xb7, 0xd1, 0x6c, 0x2b, 0x59, 0xf5, 0xe7, 0x59, 0x28, 0xc5, + 0xa7, 0x6c, 0xdf, 0xdd, 0x1b, 0x16, 0xbb, 0x99, 0xb2, 0xb2, 0x9b, 0x69, 0xc1, 0xd4, 0xe3, 0x1f, + 0x4f, 0xc8, 0x45, 0x0f, 0xea, 0xcb, 0x06, 0x55, 0xb0, 0x7c, 0x81, 0x3b, 0xff, 0x0d, 0x2f, 0x70, + 0xcb, 0x21, 0xe4, 0x1b, 0xe9, 0x10, 0xf2, 0x85, 0xa7, 0xf6, 0x0b, 0xf4, 0x08, 0xb6, 0xfc, 0xd4, + 0x3e, 0x7d, 0xe5, 0xf3, 0x89, 0x6d, 0x9d, 0x89, 0x98, 0x6b, 0x91, 0x4a, 0xef, 0xd0, 0xf0, 0x92, + 0x1d, 0xfa, 0x9b, 0x48, 0xfb, 0x07, 0xb0, 0x3d, 0x39, 0x8d, 0x9f, 0xde, 0x4e, 0x9c, 0x2b, 0x15, + 0xaa, 0xd2, 0x4a, 0x1c, 0x7b, 0x33, 0xfe, 0x2c, 0x59, 0x55, 0x76, 0x03, 0xc5, 0xa3, 0x15, 0x7f, + 0xa7, 0xec, 0xff, 0xcf, 0x00, 0x24, 0xe7, 0x4f, 0xbf, 0xb4, 0x2b, 0x57, 0xf2, 0x96, 0x65, 0x5f, + 0xe0, 0x2d, 0x7b, 0xd9, 0x7b, 0x62, 0x5f, 0x43, 0x29, 0x3e, 0x71, 0xfc, 0xee, 0x13, 0xeb, 0x5b, + 0x15, 0xf9, 0x5b, 0x91, 0x5b, 0x3b, 0x3e, 0xb2, 0xfb, 0x65, 0xfb, 0x22, 0x55, 0x7c, 0xf6, 0x25, + 0xc5, 0x9f, 0x73, 0xdf, 0x72, 0x5c, 0xf8, 0xaf, 0x78, 0x35, 0xc9, 0x13, 0x3d, 0x97, 0x9a, 0xe8, + 0xea, 0x5c, 0x38, 0xc8, 0x7f, 0xf9, 0xa2, 0xbf, 0x55, 0x83, 0xff, 0x6b, 0x26, 0xf2, 0xe2, 0xc6, + 0xaf, 0xa5, 0x3f, 0x57, 0xe9, 0x5d, 0xed, 0x88, 0xfe, 0x36, 0xc5, 0xbd, 0xd0, 0x47, 0x95, 0x7b, + 0x91, 0x8f, 0xea, 0x4d, 0xc8, 0xf3, 0xed, 0x2e, 0xff, 0x3c, 0xff, 0x14, 0xc7, 0xbf, 0xf4, 0xf3, + 0x27, 0xaa, 0x2a, 0x94, 0x7c, 0xde, 0xde, 0xed, 0x28, 0xdf, 0xe8, 0xd3, 0x2d, 0x74, 0xc5, 0xe5, + 0xff, 0xe2, 0x12, 0xf5, 0xbb, 0x76, 0xc9, 0x8b, 0xdd, 0x16, 0xea, 0xff, 0xca, 0x40, 0x35, 0x15, + 0x41, 0xf0, 0x1d, 0x8a, 0x58, 0x29, 0x97, 0xb3, 0xff, 0x07, 0xc9, 0xe5, 0x54, 0x34, 0x6e, 0x31, + 0x1d, 0x8d, 0x8b, 0xe2, 0xae, 0x92, 0x32, 0x61, 0x56, 0x19, 0x3b, 0x99, 0x95, 0xc6, 0xce, 0xcd, + 0xf8, 0xfb, 0x92, 0x9d, 0x16, 0x0f, 0x7e, 0xad, 0x6a, 0x12, 0x84, 0x7d, 0x0a, 0xd7, 0x84, 0x13, + 0x81, 0xf7, 0x8f, 0x37, 0xd1, 0xe3, 0xaf, 0x4f, 0x0a, 0xa3, 0xfc, 0x0a, 0x27, 0xe0, 0x1f, 0xaf, + 0x99, 0x34, 0x22, 0xac, 0xda, 0x81, 0x6a, 0x2a, 0x34, 0x43, 0xfa, 0xda, 0x6d, 0x46, 0xfe, 0xda, + 0x2d, 0xdb, 0x81, 0xfc, 0xd9, 0x89, 0xe5, 0x5b, 0x2b, 0x5e, 0x42, 0xe6, 0x08, 0xf5, 0xfb, 0x50, + 0x91, 0xc3, 0xc4, 0xd8, 0x3b, 0x90, 0xb7, 0x43, 0x6b, 0x1a, 0xb9, 0x47, 0xae, 0x2c, 0x47, 0x92, + 0x75, 0x42, 0x6b, 0xaa, 0x71, 0x22, 0xf5, 0x0f, 0x32, 0xa0, 0x2c, 0xe2, 0xa4, 0x4f, 0xf2, 0x66, + 0x9e, 0xf3, 0x49, 0xde, 0xf5, 0x54, 0x25, 0x57, 0x7d, 0x55, 0x37, 0x7e, 0x8d, 0x35, 0xf7, 0x9c, + 0xd7, 0x58, 0xd9, 0x1d, 0x28, 0xfa, 0x16, 0x7d, 0xef, 0xd4, 0x5c, 0x71, 0xf5, 0x23, 0xc6, 0xa9, + 0xbf, 0x97, 0x81, 0x82, 0x88, 0x69, 0x5b, 0xe9, 0xaf, 0x7a, 0x0b, 0x0a, 0xfc, 0xdb, 0xa7, 0xd1, + 0xb3, 0x62, 0x4b, 0x11, 0xe3, 0x11, 0x9e, 0xdd, 0xe4, 0x91, 0x7e, 0x69, 0xff, 0xd5, 0xa1, 0x63, + 0xb8, 0x1a, 0xc1, 0xc5, 0x37, 0xa9, 0x8c, 0xa9, 0xb8, 0x98, 0xce, 0xdf, 0x98, 0x02, 0x02, 0xd1, + 0x1d, 0x74, 0xf5, 0x07, 0x50, 0x10, 0x31, 0x73, 0x2b, 0xab, 0xf2, 0xb2, 0xef, 0x5e, 0xee, 0x00, + 0x24, 0x41, 0x74, 0xab, 0x72, 0x50, 0xef, 0x41, 0x31, 0x8a, 0x9b, 0xc3, 0xf9, 0x97, 0x14, 0x2d, + 0xee, 0x14, 0xc9, 0x95, 0x71, 0xc4, 0xd7, 0x05, 0xba, 0xde, 0xf8, 0x94, 0x9c, 0xe5, 0xef, 0x01, + 0x5d, 0xb0, 0x1a, 0x2e, 0x3d, 0xc6, 0x95, 0xfe, 0xbc, 0x44, 0x4c, 0xc4, 0xee, 0x41, 0x2c, 0x2f, + 0x5f, 0xe6, 0x5a, 0x50, 0x1b, 0xd1, 0x55, 0x3c, 0x9a, 0x65, 0x0f, 0x85, 0x37, 0xb5, 0x4b, 0x0f, + 0x37, 0x66, 0xe4, 0xf7, 0x5f, 0x53, 0x75, 0xd2, 0x24, 0x32, 0xb5, 0x06, 0x15, 0x39, 0xd8, 0x47, + 0x6d, 0xc0, 0xd6, 0x81, 0x15, 0x1a, 0x28, 0x7f, 0xa2, 0x27, 0x8a, 0xf8, 0xfc, 0xc5, 0x1f, 0xe9, + 0xf9, 0xbb, 0x48, 0xa7, 0x71, 0x22, 0xf5, 0xe7, 0x39, 0x50, 0x16, 0x71, 0x2f, 0xba, 0x96, 0x78, + 0x0b, 0xca, 0x1e, 0xcd, 0x8b, 0xd4, 0x57, 0xc7, 0x38, 0x48, 0x0a, 0xed, 0x4f, 0x7d, 0x4f, 0xa6, + 0x68, 0x07, 0xfb, 0xfc, 0x8b, 0x32, 0x57, 0xf9, 0x1d, 0x34, 0xc7, 0x1b, 0xd3, 0xb4, 0xae, 0xd0, + 0x95, 0xb3, 0xae, 0x37, 0xa6, 0xdb, 0x8e, 0xc2, 0x3b, 0xc1, 0x23, 0x50, 0x2b, 0x5a, 0x51, 0xb8, + 0x24, 0xe8, 0xfc, 0x4e, 0x04, 0xfc, 0x87, 0x81, 0xb8, 0x3f, 0x5a, 0xe4, 0x80, 0x61, 0x10, 0xbd, + 0x61, 0x3f, 0x16, 0x9f, 0xc8, 0xca, 0xd2, 0x1b, 0xf6, 0x4d, 0x97, 0x2e, 0x3b, 0xd2, 0x37, 0xe4, + 0xc6, 0xe2, 0xe3, 0x80, 0xe2, 0x2b, 0x02, 0x88, 0x7a, 0x9d, 0x7f, 0x44, 0xcc, 0xb7, 0x82, 0x80, + 0xbf, 0xdf, 0x57, 0x12, 0x0f, 0x37, 0x0a, 0x60, 0xfc, 0x3c, 0xaa, 0xf8, 0xbe, 0x1b, 0x92, 0x80, + 0x78, 0x45, 0x90, 0x7f, 0xdd, 0x0d, 0x09, 0xae, 0x41, 0xf1, 0xa7, 0x9e, 0x6b, 0x91, 0x97, 0xa3, + 0x4c, 0xb5, 0x2a, 0x60, 0xfa, 0xc0, 0x98, 0xe1, 0x46, 0xe0, 0xd0, 0x55, 0x65, 0x7e, 0xcd, 0x8f, + 0x27, 0xd4, 0x7f, 0x95, 0x81, 0xed, 0xc5, 0xbe, 0xa6, 0x69, 0x54, 0x81, 0x62, 0xb3, 0xdf, 0xd5, + 0x7b, 0x8d, 0x83, 0xb6, 0xb2, 0xc6, 0x36, 0xa1, 0xdc, 0xdf, 0xfd, 0xac, 0xdd, 0x1c, 0x72, 0x40, + 0x86, 0x5e, 0x02, 0x18, 0xe8, 0xfb, 0x9d, 0x56, 0xab, 0xdd, 0xe3, 0x16, 0x45, 0x7f, 0xf7, 0x33, + 0xbd, 0xdb, 0x6f, 0xf2, 0x8f, 0x3b, 0x45, 0x11, 0x0f, 0x03, 0x25, 0x47, 0xf1, 0x10, 0x14, 0x0c, + 0x8f, 0xc9, 0x3c, 0x8f, 0xf2, 0x7e, 0x3a, 0xd0, 0x9b, 0xbd, 0xa1, 0xb2, 0x81, 0xa9, 0xde, 0x51, + 0xb7, 0x4b, 0x29, 0x0a, 0xe7, 0x6c, 0xf6, 0x0f, 0x0e, 0xb5, 0xf6, 0x60, 0xa0, 0x0f, 0x3a, 0x3f, + 0x69, 0x2b, 0x45, 0x2a, 0x59, 0xeb, 0x3c, 0xee, 0xf4, 0x38, 0xa0, 0xc4, 0x0a, 0x90, 0x3d, 0xe8, + 0xf4, 0xf8, 0x0b, 0x08, 0x07, 0x8d, 0x2f, 0x94, 0x32, 0xfe, 0x18, 0x1c, 0x1d, 0x28, 0x15, 0x56, + 0x82, 0x7c, 0xb7, 0xfd, 0xa4, 0xdd, 0x55, 0xaa, 0xea, 0x7f, 0xc8, 0x46, 0x1a, 0x31, 0xc5, 0x39, + 0x7d, 0x13, 0x2d, 0x70, 0xd5, 0xf9, 0x62, 0xdc, 0x69, 0x59, 0xa9, 0xd3, 0xbe, 0xc9, 0xc7, 0x86, + 0x5f, 0x87, 0x6a, 0x1c, 0x1c, 0x20, 0xbd, 0x3b, 0x5f, 0x89, 0x80, 0x2b, 0x8e, 0x2f, 0x36, 0x56, + 0x1c, 0x5f, 0xcc, 0xec, 0x10, 0xad, 0x6c, 0x94, 0xb9, 0x7c, 0x26, 0x95, 0x10, 0xc2, 0x3f, 0xf3, + 0xfd, 0x0a, 0x50, 0x42, 0x9f, 0xbb, 0x76, 0xf4, 0xa9, 0xc9, 0x22, 0x02, 0x8e, 0x5c, 0x3b, 0x5c, + 0x0c, 0x4e, 0x28, 0x2d, 0x05, 0x27, 0xc8, 0x9b, 0x33, 0xa4, 0x37, 0xe7, 0xf4, 0x37, 0x98, 0xf9, + 0x37, 0x26, 0xa5, 0x6f, 0x30, 0xbf, 0x03, 0x6c, 0x3c, 0xf7, 0xe9, 0x79, 0x34, 0x89, 0xac, 0x42, + 0x64, 0x8a, 0xc0, 0xc4, 0xbb, 0x22, 0x7b, 0x13, 0x36, 0x17, 0xa8, 0xc9, 0x96, 0x2e, 0x69, 0xb5, + 0x34, 0x29, 0xbb, 0x0f, 0x97, 0xc4, 0xdc, 0x4e, 0xf5, 0xad, 0xb8, 0x3b, 0xca, 0x51, 0x8d, 0xa4, + 0x87, 0xd5, 0x5f, 0x83, 0x62, 0x14, 0xd2, 0xf6, 0x62, 0x65, 0x77, 0xc5, 0xb8, 0xaa, 0xff, 0x60, + 0x1d, 0x4a, 0x71, 0x80, 0xdb, 0x37, 0x9a, 0x1d, 0xf4, 0x81, 0x8d, 0xe0, 0x54, 0x16, 0x31, 0x45, + 0x04, 0x44, 0x23, 0x25, 0x2e, 0x5e, 0xcd, 0x7d, 0x3b, 0xd2, 0xd8, 0x38, 0xe4, 0xc8, 0xb7, 0xe9, + 0x01, 0x13, 0xdb, 0x95, 0x6e, 0x79, 0x96, 0xb4, 0x22, 0x02, 0x68, 0xa1, 0x5d, 0x03, 0xfa, 0x4d, + 0x9c, 0xd1, 0x67, 0xa9, 0x6d, 0xf7, 0x14, 0xf9, 0x9e, 0xf3, 0x59, 0x6a, 0xfa, 0x3c, 0x08, 0x8f, + 0xae, 0xe1, 0x31, 0x05, 0xd1, 0xb7, 0xf3, 0x5e, 0x81, 0xd2, 0x3c, 0xfe, 0xf8, 0xa2, 0x98, 0x11, + 0xf3, 0xe8, 0xd3, 0x8b, 0xe9, 0x51, 0x2d, 0x2d, 0x8e, 0xea, 0xe2, 0x9c, 0x86, 0xa5, 0x39, 0xad, + 0x86, 0x50, 0x10, 0x41, 0x7e, 0x2f, 0xee, 0xf0, 0x17, 0x76, 0x95, 0x02, 0x59, 0xc3, 0x89, 0xae, + 0x96, 0xe2, 0xcf, 0x85, 0x8a, 0xe5, 0x16, 0x2a, 0xa6, 0xfe, 0xed, 0x75, 0x80, 0x24, 0x58, 0x90, + 0xbd, 0xbb, 0x10, 0x98, 0x9c, 0x59, 0xda, 0xf6, 0x17, 0xe2, 0x91, 0x17, 0x5e, 0xf4, 0x59, 0xff, + 0x06, 0x2f, 0xfa, 0x3c, 0x80, 0x6a, 0xe0, 0x8f, 0x5f, 0xea, 0x70, 0x2f, 0x07, 0xfe, 0x38, 0xf6, + 0xb7, 0xbf, 0x07, 0x98, 0xa4, 0x07, 0x03, 0x13, 0x43, 0x75, 0x49, 0x6b, 0x29, 0x05, 0xfe, 0xb8, + 0x3f, 0xfa, 0xaa, 0xc5, 0x6f, 0xbb, 0x99, 0x41, 0xa8, 0xaf, 0x92, 0x12, 0x9b, 0x66, 0x10, 0xb6, + 0x64, 0x41, 0x71, 0x1b, 0x6a, 0x48, 0xbb, 0x24, 0x2c, 0x2a, 0x66, 0x90, 0x1c, 0xb0, 0xa8, 0xbf, + 0x1b, 0x1d, 0x49, 0x2f, 0xf8, 0x72, 0xd9, 0xc7, 0xc2, 0x10, 0x97, 0x94, 0x88, 0xfa, 0x2a, 0xd7, + 0x2f, 0x7f, 0x7f, 0x28, 0x26, 0x5d, 0xfe, 0x8e, 0xde, 0xfa, 0x37, 0xfd, 0x8e, 0xde, 0x0e, 0x40, + 0xf2, 0x64, 0x23, 0xae, 0xc0, 0xf8, 0xb2, 0x4e, 0x89, 0x5f, 0xc3, 0xb9, 0xf7, 0x1a, 0x54, 0xe4, + 0x6f, 0xf4, 0xd2, 0x25, 0x1c, 0xcf, 0xb5, 0xf8, 0xb7, 0x4a, 0xba, 0x3f, 0xfd, 0x50, 0xc9, 0xdc, + 0x53, 0xa1, 0x2c, 0x7d, 0x29, 0x08, 0x29, 0xf6, 0x8d, 0xe0, 0x44, 0x7c, 0xb7, 0xc2, 0x70, 0x8f, + 0x2d, 0x25, 0x73, 0xef, 0x0e, 0x2a, 0xdd, 0xf2, 0x77, 0x7a, 0x00, 0x36, 0x7a, 0x9e, 0x3f, 0x35, + 0x1c, 0x41, 0x67, 0xcd, 0x03, 0xa4, 0x7b, 0x0f, 0x2e, 0xaf, 0xfc, 0xea, 0x10, 0x5d, 0xe1, 0xb2, + 0xa7, 0x33, 0xc7, 0xe2, 0x97, 0x91, 0xf6, 0x2f, 0x46, 0xbe, 0x6d, 0x2a, 0x99, 0x7b, 0x8f, 0x16, + 0xbe, 0x4a, 0x71, 0xd4, 0xdb, 0xed, 0x1f, 0xf5, 0x5a, 0xed, 0x16, 0xbf, 0x26, 0xd4, 0xe9, 0x35, + 0xbb, 0x47, 0x83, 0xce, 0x13, 0xb1, 0x17, 0xb6, 0xbf, 0x88, 0x92, 0xeb, 0xf7, 0x1e, 0x45, 0xcf, + 0x29, 0x44, 0xb5, 0xee, 0xf6, 0x1b, 0x2d, 0xbe, 0x87, 0xc6, 0xaf, 0xfa, 0x0c, 0x77, 0xf9, 0xd7, + 0x2c, 0xb4, 0xf6, 0xe0, 0xa8, 0x3b, 0x14, 0x2f, 0x08, 0xdd, 0xfb, 0x11, 0xd4, 0x9f, 0x77, 0x9f, + 0x07, 0xdb, 0xd2, 0xdc, 0x6f, 0xd0, 0x9d, 0x29, 0xdc, 0x33, 0xfb, 0x3a, 0x4f, 0x91, 0x67, 0x4f, + 0x6b, 0x77, 0xdb, 0x14, 0xf4, 0x7a, 0xef, 0x67, 0x19, 0x49, 0x7f, 0x8c, 0xee, 0x64, 0xc4, 0x00, + 0xd1, 0xc1, 0x32, 0x48, 0xb3, 0x0c, 0x53, 0xc9, 0xb0, 0x2b, 0xc0, 0x52, 0xa0, 0xae, 0x37, 0x36, + 0x1c, 0x65, 0x9d, 0xc2, 0x5b, 0x23, 0x38, 0x5d, 0xc3, 0x53, 0xb2, 0xec, 0x55, 0xb8, 0x16, 0xc3, + 0xba, 0xde, 0xd9, 0xa1, 0x6f, 0x7b, 0xbe, 0x1d, 0x5e, 0x70, 0x74, 0xee, 0xde, 0xff, 0x2d, 0x0e, + 0x67, 0x53, 0xb3, 0x0a, 0x0b, 0x68, 0x98, 0x66, 0x02, 0x23, 0x41, 0xa6, 0xac, 0xb1, 0xab, 0x70, + 0x89, 0xa4, 0xf8, 0x02, 0x22, 0xc3, 0x5e, 0x81, 0xab, 0x91, 0x91, 0xbb, 0x88, 0x5c, 0x47, 0xa4, + 0x66, 0x51, 0x68, 0xe4, 0x12, 0x32, 0xbb, 0xfb, 0xc3, 0x3f, 0xfd, 0xc5, 0xcd, 0xcc, 0xbf, 0xf8, + 0xc5, 0xcd, 0xcc, 0x7f, 0xfc, 0xc5, 0xcd, 0xb5, 0x3f, 0xf8, 0xcf, 0x37, 0x33, 0x3f, 0x79, 0xf7, + 0xd8, 0x0e, 0x4f, 0xe6, 0xa3, 0xfb, 0x63, 0x6f, 0xfa, 0xde, 0xd4, 0x08, 0x7d, 0xfb, 0x9c, 0x6f, + 0x27, 0x51, 0xc2, 0xb5, 0xde, 0x9b, 0x9d, 0x1e, 0xbf, 0x37, 0x1b, 0xbd, 0x87, 0x13, 0x7b, 0xb4, + 0x31, 0xf3, 0xbd, 0xd0, 0x7b, 0xf8, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x87, 0xb1, 0x43, 0xe5, + 0x67, 0x89, 0x00, 0x00, } func (m *Type) Marshal() (dAtA []byte, err error) { @@ -16952,6 +16964,15 @@ func (m *IndexDef) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.IncludedColumns) > 0 { + for iNdEx := len(m.IncludedColumns) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.IncludedColumns[iNdEx]) + copy(dAtA[i:], m.IncludedColumns[iNdEx]) + i = encodeVarintPlan(dAtA, i, uint64(len(m.IncludedColumns[iNdEx]))) + i-- + dAtA[i] = 0x6a + } + } if len(m.IndexAlgoParams) > 0 { i -= len(m.IndexAlgoParams) copy(dAtA[i:], m.IndexAlgoParams) @@ -27637,6 +27658,12 @@ func (m *IndexDef) ProtoSize() (n int) { if l > 0 { n += 1 + l + sovPlan(uint64(l)) } + if len(m.IncludedColumns) > 0 { + for _, s := range m.IncludedColumns { + l = len(s) + n += 1 + l + sovPlan(uint64(l)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -37566,6 +37593,38 @@ func (m *IndexDef) Unmarshal(dAtA []byte) error { } m.IndexAlgoParams = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IncludedColumns", 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.IncludedColumns = append(m.IncludedColumns, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPlan(dAtA[iNdEx:]) diff --git a/pkg/sql/colexec/index_metadata.go b/pkg/sql/colexec/index_metadata.go index c8e24f7b792f7..fc4a42cd806f2 100644 --- a/pkg/sql/colexec/index_metadata.go +++ b/pkg/sql/colexec/index_metadata.go @@ -56,6 +56,7 @@ const ( MO_INDEX_COLUMN_NAME = "column_name" MO_INDEX_ORDINAL_POSITION = "ordinal_position" MO_INDEX_TABLE_NAME = "index_table_name" + MO_INDEX_INCLUDED_COLUMNS = catalog.IndexIncludedColumns MO_INDEX_PRIKEY = catalog.CPrimaryKeyColName ) @@ -76,6 +77,7 @@ var MO_INDEX_COLTYPE = map[string]types.T{ MO_INDEX_ORDINAL_POSITION: types.T_uint32, MO_INDEX_OPTIONS: types.T_text, MO_INDEX_TABLE_NAME: types.T_varchar, + MO_INDEX_INCLUDED_COLUMNS: types.T_text, MO_INDEX_PRIKEY: types.T_varchar, } @@ -199,8 +201,8 @@ func InsertOneIndexMetadata(eg engine.Engine, ctx context.Context, db engine.Dat func buildInsertIndexMetaBatch(tableId uint64, databaseId uint64, ct *engine.ConstraintDef, eg engine.Engine, proc *process.Process) (*batch.Batch, error) { bat := &batch.Batch{ - Attrs: make([]string, 16), - Vecs: make([]*vector.Vector, 16), + Attrs: make([]string, 17), + Vecs: make([]*vector.Vector, 17), } bat.Attrs[0] = MO_INDEX_ID bat.Attrs[1] = MO_INDEX_TABLE_ID @@ -217,7 +219,8 @@ func buildInsertIndexMetaBatch(tableId uint64, databaseId uint64, ct *engine.Con bat.Attrs[12] = MO_INDEX_ORDINAL_POSITION bat.Attrs[13] = MO_INDEX_OPTIONS bat.Attrs[14] = MO_INDEX_TABLE_NAME - bat.Attrs[15] = MO_INDEX_PRIKEY + bat.Attrs[15] = MO_INDEX_INCLUDED_COLUMNS + bat.Attrs[16] = MO_INDEX_PRIKEY vec_id := vector.NewVec(MO_INDEX_COLTYPE[MO_INDEX_ID].ToType()) bat.Vecs[0] = vec_id @@ -264,6 +267,9 @@ func buildInsertIndexMetaBatch(tableId uint64, databaseId uint64, ct *engine.Con vec_index_table := vector.NewVec(MO_INDEX_COLTYPE[MO_INDEX_TABLE_NAME].ToType()) bat.Vecs[14] = vec_index_table + vec_included_columns := vector.NewVec(MO_INDEX_COLTYPE[MO_INDEX_INCLUDED_COLUMNS].ToType()) + bat.Vecs[15] = vec_included_columns + var indexId uint64 var err error defer func() { @@ -367,6 +373,18 @@ func buildInsertIndexMetaBatch(tableId uint64, databaseId uint64, ct *engine.Con if err != nil { return nil, err } + includedColumns, err := catalog.MarshalIncludeColumnsValue(index.IncludedColumns) + if err != nil { + return nil, err + } + if includedColumns == "" { + err = vector.AppendBytes(vec_included_columns, []byte(""), true, proc.Mp()) + } else { + err = vector.AppendBytes(vec_included_columns, []byte(includedColumns), false, proc.Mp()) + } + if err != nil { + return nil, err + } } } case *engine.PrimaryKeyDef: @@ -440,6 +458,10 @@ func buildInsertIndexMetaBatch(tableId uint64, databaseId uint64, ct *engine.Con if err != nil { return nil, err } + err = vector.AppendBytes(vec_included_columns, []byte(""), true, proc.Mp()) + if err != nil { + return nil, err + } } } @@ -452,7 +474,7 @@ func buildInsertIndexMetaBatch(tableId uint64, databaseId uint64, ct *engine.Con if err != nil { return nil, err } - bat.Vecs[12] = vecPrikey + bat.Vecs[16] = vecPrikey bat.SetRowCount(bat.GetVector(0).Length()) return bat, nil diff --git a/pkg/sql/colexec/index_metadata_test.go b/pkg/sql/colexec/index_metadata_test.go index a2c98b244bf33..c9646a62c800c 100644 --- a/pkg/sql/colexec/index_metadata_test.go +++ b/pkg/sql/colexec/index_metadata_test.go @@ -203,6 +203,61 @@ func TestInsertOneIndexMetadata(t *testing.T) { } } +func TestBuildInsertIndexMetaBatchIncludedColumnsLayout(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + proc := testutil.NewProc(t) + mockEngine := mock_frontend.NewMockEngine(ctrl) + mockEngine.EXPECT().AllocateIDByKey(gomock.Any(), gomock.Any()).Return(uint64(272510), nil).Times(1) + + ct := &engine.ConstraintDef{ + Cts: []engine.Constraint{ + &engine.IndexDef{ + Indexes: []*plan.IndexDef{ + { + IndexName: "idx_vec", + Parts: []string{"embedding"}, + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Entries, + IndexAlgoParams: `{"lists":"2","op_type":"vector_l2_ops"}`, + IndexTableName: "__mo_index_entries_idx_vec", + TableExist: true, + IncludedColumns: []string{"title", "category"}, + }, + }, + }, + }, + } + + bat, err := buildInsertIndexMetaBatch(272464, 123456, ct, mockEngine, proc) + require.NoError(t, err) + defer bat.Clean(proc.Mp()) + + require.Equal(t, []string{ + MO_INDEX_ID, + MO_INDEX_TABLE_ID, + MO_INDEX_DATABASE_ID, + MO_INDEX_NAME, + MO_INDEX_TYPE, + MO_INDEX_ALGORITHM, + MO_INDEX_ALGORITHM_TABLE_TYPE, + MO_INDEX_ALGORITHM_PARAMS, + MO_INDEX_IS_VISIBLE, + MO_INDEX_HIDDEN, + MO_INDEX_COMMENT, + MO_INDEX_COLUMN_NAME, + MO_INDEX_ORDINAL_POSITION, + MO_INDEX_OPTIONS, + MO_INDEX_TABLE_NAME, + MO_INDEX_INCLUDED_COLUMNS, + MO_INDEX_PRIKEY, + }, bat.Attrs) + require.Equal(t, 1, bat.RowCount()) + require.Equal(t, [][]byte{[]byte(`["title","category"]`)}, vector.InefficientMustBytesCol(bat.Vecs[15])) + require.NotNil(t, bat.Vecs[16]) +} + // Define an anonymous function to construct the table structure func buildMockTableDefs(table_cols []string) []engine.TableDef { exeCols := make([]engine.TableDef, len(table_cols)) diff --git a/pkg/sql/colexec/table_function/hnsw_search.go b/pkg/sql/colexec/table_function/hnsw_search.go index 6f342aab1d60d..3dcd68f631684 100644 --- a/pkg/sql/colexec/table_function/hnsw_search.go +++ b/pkg/sql/colexec/table_function/hnsw_search.go @@ -36,14 +36,15 @@ import ( ) type hnswSearchState struct { - inited bool - param vectorindex.HnswParam - tblcfg vectorindex.IndexTableConfig - idxcfg vectorindex.IndexConfig - offset int - limit uint64 - keys []int64 - distances []float64 + inited bool + param vectorindex.HnswParam + tblcfg vectorindex.IndexTableConfig + idxcfg vectorindex.IndexConfig + offset int + limit uint64 + filterPayload string + keys []int64 + distances []float64 // holding one call batch, tokenizedState owns it. batch *batch.Batch } @@ -188,6 +189,17 @@ func (u *hnswSearchState) start(tf *TableFunction, proc *process.Process, nthRow // array vector faVec := tf.ctr.argVecs[1] + if len(tf.ctr.argVecs) >= 3 { + filterPayloadVec := tf.ctr.argVecs[2] + if filterPayloadVec.GetType().Oid != types.T_varchar { + return moerr.NewInvalidInput(proc.Ctx, "Third argument (filter payload) must be a string") + } + if !filterPayloadVec.IsConst() { + return moerr.NewInternalError(proc.Ctx, "Filter payload must be a String constant") + } + u.filterPayload = filterPayloadVec.UnsafeGetStringAt(0) + } + // quantization u.idxcfg.Usearch.Quantization, err = hnsw.QuantizationToUsearch(int32(faVec.GetType().Oid)) if err != nil { @@ -239,8 +251,9 @@ func runHnswSearch[T types.RealNumbers](proc *process.Process, u *hnswSearchStat algo := newHnswAlgo(u.idxcfg, u.tblcfg) rt := vectorindex.RuntimeConfig{ - Limit: uint(u.limit), - OrigFuncName: u.tblcfg.OrigFuncName, + Limit: uint(u.limit), + OrigFuncName: u.tblcfg.OrigFuncName, + FilterPayload: u.filterPayload, } var keys any keys, u.distances, err = veccache.Cache.Search(sqlexec.NewSqlProcess(proc), u.tblcfg.IndexTable, algo, fa, rt) diff --git a/pkg/sql/colexec/table_function/hnsw_search_test.go b/pkg/sql/colexec/table_function/hnsw_search_test.go index fba55b4cbba79..01e27c9d0251e 100644 --- a/pkg/sql/colexec/table_function/hnsw_search_test.go +++ b/pkg/sql/colexec/table_function/hnsw_search_test.go @@ -122,6 +122,28 @@ func newMockAlgoFn(idxcfg vectorindex.IndexConfig, tblcfg vectorindex.IndexTable return &MockSearch{Idxcfg: idxcfg, Tblcfg: tblcfg} } +type capturingMockSearch struct { + Idxcfg vectorindex.IndexConfig + Tblcfg vectorindex.IndexTableConfig + rt *vectorindex.RuntimeConfig +} + +func (m *capturingMockSearch) Search(sqlproc *sqlexec.SqlProcess, query any, rt vectorindex.RuntimeConfig) (keys any, distances []float64, err error) { + *m.rt = rt + return []int64{1}, []float64{2.0}, nil +} + +func (m *capturingMockSearch) Destroy() { +} + +func (m *capturingMockSearch) Load(*sqlexec.SqlProcess) error { + return nil +} + +func (m *capturingMockSearch) UpdateConfig(newalgo cache.VectorIndexSearchIf) error { + return nil +} + func TestHnswSearch(t *testing.T) { newHnswAlgo = newMockAlgoFn @@ -162,6 +184,75 @@ func TestHnswSearch(t *testing.T) { ut.arg.ctr.state.free(ut.arg, ut.proc, false, nil) } +func TestHnswSearchPassesFilterPayloadToRuntime(t *testing.T) { + oldNewHnswAlgo := newHnswAlgo + defer func() { + newHnswAlgo = oldNewHnswAlgo + }() + + var captured vectorindex.RuntimeConfig + newHnswAlgo = func(idxcfg vectorindex.IndexConfig, tblcfg vectorindex.IndexTableConfig) veccache.VectorIndexSearchIf { + return &capturingMockSearch{ + Idxcfg: idxcfg, + Tblcfg: tblcfg, + rt: &captured, + } + } + + const indexTable = "__index_filter_payload" + veccache.Cache.Remove(indexTable) + defer veccache.Cache.Remove(indexTable) + + param := "{\"op_type\": \"vector_l2_ops\"}" + ut := newHnswSearchTestCase(t, mpool.MustNewZero(), hnswsearchdefaultAttrs, param) + inbat := makeBatchHnswSearch(ut.proc) + payload := `{"version":1,"conj":"and","column_mode":"logical_name","exprs":[{"kind":"func","op":"=","args":[{"kind":"column","column":"category"},{"kind":"literal","value":2}]}]}` + ut.arg.Args = []*plan.Expr{ + { + Typ: plan.Type{ + Id: int32(types.T_varchar), + Width: 512, + }, + Expr: &plan.Expr_Lit{ + Lit: &plan.Literal{ + Value: &plan.Literal_Sval{ + Sval: `{"db":"db", "src":"src", "metadata":"__metadata", "index":"` + indexTable + `"}`, + }, + }, + }, + }, + plan2.MakePlan2Vecf32ConstExprWithType("[0,1,2]", 3), + { + Typ: plan.Type{ + Id: int32(types.T_varchar), + Width: 512, + }, + Expr: &plan.Expr_Lit{ + Lit: &plan.Literal{ + Value: &plan.Literal_Sval{ + Sval: payload, + }, + }, + }, + }, + } + + err := ut.arg.Prepare(ut.proc) + require.NoError(t, err) + + for i := range ut.arg.ctr.executorsForArgs { + ut.arg.ctr.argVecs[i], err = ut.arg.ctr.executorsForArgs[i].Eval(ut.proc, []*batch.Batch{inbat}, nil) + require.NoError(t, err) + } + + err = ut.arg.ctr.state.start(ut.arg, ut.proc, 0, nil) + require.NoError(t, err) + assert.Equal(t, payload, captured.FilterPayload) + assert.Equal(t, uint(1), captured.Limit) + + ut.arg.ctr.state.free(ut.arg, ut.proc, false, nil) +} + var failedsearchparam []string = []string{"{", "{\"op_type\": \"vector_cos_ops\"}", "{\"op_type\": \"vector_l2_ops\", \"m\":\"notnumber\"}", diff --git a/pkg/sql/colexec/table_function/ivf_search.go b/pkg/sql/colexec/table_function/ivf_search.go index 621290471f1a0..a3a8577164b20 100644 --- a/pkg/sql/colexec/table_function/ivf_search.go +++ b/pkg/sql/colexec/table_function/ivf_search.go @@ -17,8 +17,10 @@ package table_function import ( "fmt" "strconv" + "strings" "github.com/bytedance/sonic" + "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/container/batch" "github.com/matrixorigin/matrixone/pkg/container/types" @@ -31,22 +33,38 @@ import ( "github.com/matrixorigin/matrixone/pkg/vectorindex/metric" "github.com/matrixorigin/matrixone/pkg/vectorindex/sqlexec" "github.com/matrixorigin/matrixone/pkg/vm" + "github.com/matrixorigin/matrixone/pkg/vm/message" "github.com/matrixorigin/matrixone/pkg/vm/process" ) type ivfSearchState struct { - inited bool - param vectorindex.IvfParam - tblcfg vectorindex.IndexTableConfig - idxcfg vectorindex.IndexConfig - offset int - limit uint64 - keys any - distances []float64 + inited bool + param vectorindex.IvfParam + tblcfg vectorindex.IndexTableConfig + idxcfg vectorindex.IndexConfig + offset int + limit uint64 + keys []any + distances []float64 + includeColumns []string + // includeData stays keyed by column name for round-merge lookups and test + // assertions; output order still comes from includeColumns, not map iteration. + includeData map[string][]any + pushdownFilterSQL string + seenPK map[string]struct{} + cursor *vectorindex.IvfSearchCursor + multiRoundEnabled bool + baseSearchRoundLimit uint + baseBucketExpandStep uint + searchRoundLimit uint + bucketExpandStep uint + nthRow int // holding one call batch, tokenizedState owns it. batch *batch.Batch - // runtime filter BloomFilter bytes from hash build side (optional) + // Raw runtime-filter payload from the hash build side (optional). + // IVF code will convert it into an exact-pk filter or entries bloom filter. + bloomFilter []byte indexReaderParam *plan.IndexReaderParam } @@ -56,6 +74,10 @@ var ( getVersion = ivfflat.GetVersion ) +const ( + maxConsecutiveEmptyIvfRounds = 32 +) + func newIvfAlgoFn(idxcfg vectorindex.IndexConfig, tblcfg vectorindex.IndexTableConfig) (veccache.VectorIndexSearchIf, error) { switch idxcfg.Ivfflat.VectorType { case int32(types.T_array_float32): @@ -76,28 +98,62 @@ func (u *ivfSearchState) reset(tf *TableFunction, proc *process.Process) { if u.batch != nil { u.batch.CleanOnlyData() } + u.offset = 0 + u.keys = nil + u.distances = nil + u.includeData = nil + u.seenPK = nil + u.cursor = nil + // Note: bloomFilter is kept across resets as it's only set once during initialization + // It will be cleared in free() method } func (u *ivfSearchState) call(tf *TableFunction, proc *process.Process) (vm.CallResult, error) { u.batch.CleanOnlyData() - keys, ok := u.keys.([]any) - if !ok { - return vm.CancelResult, moerr.NewInternalError(proc.Ctx, "keys is not []any") - } - - nkeys := len(keys) n := 0 + consecutiveEmptyRounds := 0 + batchTargetRows := int(colexec.DefaultBatchSize) + if u.limit > 0 && u.limit < uint64(batchTargetRows) { + batchTargetRows = int(u.limit) + } + for n < batchTargetRows { + if u.offset >= len(u.keys) { + if !u.multiRoundEnabled { + break + } + if u.cursor != nil && u.cursor.Exhausted { + break + } + if err := u.fetchNextRound(tf, proc); err != nil { + return vm.CancelResult, err + } + if u.offset >= len(u.keys) { + if u.cursor != nil && u.cursor.Exhausted { + break + } + consecutiveEmptyRounds++ + if consecutiveEmptyRounds >= maxConsecutiveEmptyIvfRounds { + if u.cursor != nil { + u.cursor.Exhausted = true + } + break + } + continue + } + } - for i := u.offset; i < nkeys && n < 8192; i++ { - vector.AppendAny(u.batch.Vecs[0], keys[i], false, proc.Mp()) - vector.AppendFixed(u.batch.Vecs[1], u.distances[i], false, proc.Mp()) + consecutiveEmptyRounds = 0 + vector.AppendAny(u.batch.Vecs[0], u.keys[u.offset], false, proc.Mp()) + vector.AppendFixed(u.batch.Vecs[1], u.distances[u.offset], false, proc.Mp()) + for i, col := range u.includeColumns { + vector.AppendAny(u.batch.Vecs[2+i], u.includeData[col][u.offset], false, proc.Mp()) + } + u.offset++ n++ } - u.offset += n - u.batch.SetRowCount(n) if u.batch.RowCount() == 0 { @@ -112,6 +168,52 @@ func (u *ivfSearchState) free(tf *TableFunction, proc *process.Process, pipeline if u.batch != nil { u.batch.Clean(proc.Mp()) } + // Clear bloomFilter bytes to release memory + u.bloomFilter = nil + u.keys = nil + u.distances = nil + u.includeData = nil + u.cursor = nil + u.seenPK = nil +} + +// waitBloomFilterForTableFunction blocks until it receives a bloomfilter runtime +// filter that matches tf.RuntimeFilterSpecs (if any). It is used when ivf_search +// acts as probe side in a join and the build side produces a runtime filter. +// We keep the raw serialized unique-join-key payload here and let IVF search +// decide whether to build an exact-pk predicate or a real entries bloom filter. +func waitBloomFilterForTableFunction(tf *TableFunction, proc *process.Process) ([]byte, error) { + if len(tf.RuntimeFilterSpecs) == 0 { + return nil, nil + } + spec := tf.RuntimeFilterSpecs[0] + if !spec.UseBloomFilter { + return nil, nil + } + + msgReceiver := message.NewMessageReceiver( + []int32{spec.Tag}, + message.AddrBroadCastOnCurrentCN(), + proc.GetMessageBoard(), + ) + msgs, ctxDone, err := msgReceiver.ReceiveMessage(true, proc.Ctx) + if err != nil || ctxDone { + return nil, err + } + + for i := range msgs { + m, ok := msgs[i].(message.RuntimeFilterMessage) + if !ok { + continue + } + if m.Typ != message.RuntimeFilter_BLOOMFILTER { + continue + } + + return m.Data, nil + } + + return nil, nil } func ivfSearchPrepare(proc *process.Process, arg *TableFunction) (tvfState, error) { @@ -121,7 +223,21 @@ func ivfSearchPrepare(proc *process.Process, arg *TableFunction) (tvfState, erro arg.ctr.executorsForArgs, err = colexec.NewExpressionExecutorsFromPlanExpressions(proc, arg.Args) arg.ctr.argVecs = make([]*vector.Vector, len(arg.Args)) - st.limit = max(arg.IndexReaderParam.GetLimit().GetLit().GetU64Val(), uint64(1)) + if arg.Limit != nil { + if litExpr, ok := arg.Limit.Expr.(*plan.Expr_Lit); ok { + if val, ok := litExpr.Lit.Value.(*plan.Literal_U64Val); ok { + st.limit = max(val.U64Val, uint64(1)) + } + } + } + if arg.IndexReaderParam != nil && + arg.IndexReaderParam.GetLimit() != nil && + arg.IndexReaderParam.GetLimit().GetLit() != nil { + // Planner may record a larger candidate budget than the user-visible LIMIT + // so IVF search can fetch enough rows before residual filtering / OFFSET. + // The outer sort/limit still enforces the final query semantics. + st.limit = max(st.limit, max(arg.IndexReaderParam.GetLimit().GetLit().GetU64Val(), uint64(1))) + } st.indexReaderParam = arg.IndexReaderParam return st, err @@ -133,6 +249,12 @@ func ivfSearchPrepare(proc *process.Process, arg *TableFunction) (tvfState, erro func (u *ivfSearchState) start(tf *TableFunction, proc *process.Process, nthRow int, analyzer process.Analyzer) (err error) { if !u.inited { + if bf, err := waitBloomFilterForTableFunction(tf, proc); err != nil { + return err + } else { + u.bloomFilter = bf + } + if len(tf.Params) > 0 { err = sonic.Unmarshal([]byte(tf.Params), &u.param) if err != nil { @@ -174,6 +296,30 @@ func (u *ivfSearchState) start(tf *TableFunction, proc *process.Process, nthRow return err } + if len(tf.ctr.argVecs) >= 3 { + filterVec := tf.ctr.argVecs[2] + if filterVec.GetType().Oid != types.T_varchar { + return moerr.NewInvalidInput(proc.Ctx, "Third argument (pushdown filter) must be a string") + } + if !filterVec.IsConst() { + return moerr.NewInternalError(proc.Ctx, "Pushdown filter must be a String constant") + } + u.pushdownFilterSQL = filterVec.UnsafeGetStringAt(0) + } + if len(tf.ctr.argVecs) >= 4 { + roundLimitVec := tf.ctr.argVecs[3] + if roundLimitVec.IsConst() && roundLimitVec.GetType().Oid == types.T_uint64 { + u.baseSearchRoundLimit = uint(vector.GetFixedAtNoTypeCheck[uint64](roundLimitVec, 0)) + } + } + if len(tf.ctr.argVecs) >= 5 { + stepVec := tf.ctr.argVecs[4] + if stepVec.IsConst() && stepVec.GetType().Oid == types.T_uint64 { + u.baseBucketExpandStep = uint(vector.GetFixedAtNoTypeCheck[uint64](stepVec, 0)) + } + } + u.multiRoundEnabled = u.baseSearchRoundLimit > 0 || u.baseBucketExpandStep > 0 + // f32vec faVec := tf.ctr.argVecs[1] if faVec.GetType().Oid != types.T_array_float32 && faVec.GetType().Oid != types.T_array_float64 { @@ -199,27 +345,108 @@ func (u *ivfSearchState) start(tf *TableFunction, proc *process.Process, nthRow u.idxcfg.Ivfflat.VectorType = u.tblcfg.KeyPartType // array float32 or array float64 u.batch = tf.createResultBatch() + u.includeColumns = requestedIvfIncludeColumns(tf.Attrs) + if u.limit == 0 && (!u.multiRoundEnabled || len(u.includeColumns) == 0) { + u.limit = 1 + } u.inited = true } - // reset slice u.offset = 0 u.keys = nil u.distances = nil + u.includeData = make(map[string][]any, len(u.includeColumns)) + for _, col := range u.includeColumns { + u.includeData[col] = nil + } + u.seenPK = make(map[string]struct{}) + u.searchRoundLimit = u.baseSearchRoundLimit + if u.searchRoundLimit == 0 { + u.searchRoundLimit = uint(u.limit) + if u.searchRoundLimit == 0 { + u.searchRoundLimit = 1 + } + } + u.bucketExpandStep = u.baseBucketExpandStep + if u.bucketExpandStep == 0 { + u.bucketExpandStep = uint(u.tblcfg.Nprobe) + if u.bucketExpandStep == 0 { + u.bucketExpandStep = 1 + } + } + if u.multiRoundEnabled { + u.cursor = &vectorindex.IvfSearchCursor{} + } else { + u.cursor = nil + } + u.nthRow = nthRow - // cleanup the batch u.batch.CleanOnlyData() - // vector cache - veccache.Cache.Once() + return u.fetchNextRound(tf, proc) +} - faVec := tf.ctr.argVecs[1] +func requestedIvfIncludeColumns(attrs []string) []string { + if len(attrs) <= 2 { + return nil + } + + cols := make([]string, 0, len(attrs)-2) + for _, attr := range attrs[2:] { + if strings.HasPrefix(attr, catalog.SystemSI_IVFFLAT_IncludeColPrefix) { + cols = append(cols, strings.TrimPrefix(attr, catalog.SystemSI_IVFFLAT_IncludeColPrefix)) + } + } + return cols +} + +func ivfSearchSeenKey(v any) string { + return fmt.Sprintf("%T:%v", v, v) +} + +func (u *ivfSearchState) advanceCursor() { + if !u.multiRoundEnabled || u.cursor == nil || u.cursor.Round == 0 || u.cursor.Exhausted { + return + } + + nextOffset := u.cursor.NextBucketOffset + u.cursor.CurrentBucketCount + total := uint(len(u.cursor.RankedCentroidIDs)) + if nextOffset >= total { + u.cursor.NextBucketOffset = total + u.cursor.CurrentBucketCount = 0 + u.cursor.Exhausted = true + return + } + + nextCount := u.bucketExpandStep + remaining := total - nextOffset + if nextCount > remaining { + nextCount = remaining + } + u.cursor.NextBucketOffset = nextOffset + u.cursor.CurrentBucketCount = nextCount + u.cursor.Exhausted = false +} +func (u *ivfSearchState) fetchNextRound(tf *TableFunction, proc *process.Process) error { + if u.cursor != nil && u.cursor.Exhausted { + u.keys = nil + u.distances = nil + for _, col := range u.includeColumns { + u.includeData[col] = nil + } + u.offset = 0 + return nil + } + + u.advanceCursor() + + faVec := tf.ctr.argVecs[1] switch faVec.GetType().Oid { case types.T_array_float32: - return runIvfSearchVector[float32](tf, u, proc, faVec, nthRow) + return runIvfSearchVector[float32](tf, u, proc, faVec, u.nthRow) case types.T_array_float64: - return runIvfSearchVector[float64](tf, u, proc, faVec, nthRow) + return runIvfSearchVector[float64](tf, u, proc, faVec, u.nthRow) default: return moerr.NewInternalError(proc.Ctx, "vector is not array_float32 or array_float64") } @@ -227,6 +454,9 @@ func (u *ivfSearchState) start(tf *TableFunction, proc *process.Process, nthRow func runIvfSearchVector[T types.RealNumbers](tf *TableFunction, u *ivfSearchState, proc *process.Process, faVec *vector.Vector, nthRow int) (err error) { if faVec.IsNull(uint64(nthRow)) { + if u.cursor != nil { + u.cursor.Exhausted = true + } return nil } @@ -235,22 +465,52 @@ func runIvfSearchVector[T types.RealNumbers](tf *TableFunction, u *ivfSearchStat return moerr.NewInvalidInput(proc.Ctx, fmt.Sprintf("vector ops between different dimensions (%d, %d) is not permitted.", u.idxcfg.Ivfflat.Dimensions, len(fa))) } + veccache.Cache.Once() + algo, err := newIvfAlgo(u.idxcfg, u.tblcfg) if err != nil { return err } key := fmt.Sprintf("%s:%d", u.tblcfg.IndexTable, u.idxcfg.Ivfflat.Version) + rtLimit := uint(u.limit) + if rtLimit == 0 { + rtLimit = 1 + } + useIncludeRuntime := u.multiRoundEnabled || len(u.includeColumns) > 0 || u.pushdownFilterSQL != "" + + var includeResult *vectorindex.IvfIncludeResult + var requestedIncludeColumns []string + var pushdownFilterSQL string + var searchRoundLimit uint + var bucketExpandStep uint + var searchCursor *vectorindex.IvfSearchCursor + if useIncludeRuntime { + includeResult = &vectorindex.IvfIncludeResult{} + requestedIncludeColumns = u.includeColumns + pushdownFilterSQL = u.pushdownFilterSQL + searchRoundLimit = u.searchRoundLimit + bucketExpandStep = u.bucketExpandStep + searchCursor = u.cursor + } + rt := vectorindex.RuntimeConfig{ - Limit: uint(u.limit), - Probe: uint(u.tblcfg.Nprobe), - OrigFuncName: u.tblcfg.OrigFuncName, - BackgroundQueries: make([]*plan.Query, 1), + Limit: rtLimit, + Probe: uint(u.tblcfg.Nprobe), + OrigFuncName: u.tblcfg.OrigFuncName, + BackgroundQueries: make([]*plan.Query, 1), + BloomFilter: u.bloomFilter, + RequestedIncludeColumns: requestedIncludeColumns, + PushdownFilterSQL: pushdownFilterSQL, + IncludeResult: includeResult, + SearchRoundLimit: searchRoundLimit, + BucketExpandStep: bucketExpandStep, + SearchCursor: searchCursor, } sqlProc := sqlexec.NewSqlProcess(proc) sqlProc.IndexReaderParam = u.indexReaderParam sqlProc.RuntimeFilterSpecs = tf.RuntimeFilterSpecs - u.keys, u.distances, err = veccache.Cache.Search(sqlProc, key, algo, fa, rt) + keys, distances, err := veccache.Cache.Search(sqlProc, key, algo, fa, rt) if err != nil { return err } @@ -258,5 +518,41 @@ func runIvfSearchVector[T types.RealNumbers](tf *TableFunction, u *ivfSearchStat opStats := tf.OpAnalyzer.GetOpStats() opStats.BackgroundQueries = append(opStats.BackgroundQueries, rt.BackgroundQueries...) + keySlice, ok := keys.([]any) + if !ok { + return moerr.NewInternalError(proc.Ctx, "keys is not []any") + } + for _, col := range u.includeColumns { + if len(includeResult.Data[col]) != len(keySlice) { + return moerr.NewInternalErrorf( + proc.Ctx, + "ivf_search: include data length mismatch for column %s: keys=%d, data=%d", + col, + len(keySlice), + len(includeResult.Data[col]), + ) + } + } + + u.keys = u.keys[:0] + u.distances = u.distances[:0] + for _, col := range u.includeColumns { + u.includeData[col] = u.includeData[col][:0] + } + u.offset = 0 + + for i, keyAny := range keySlice { + seenKey := ivfSearchSeenKey(keyAny) + if _, ok := u.seenPK[seenKey]; ok { + continue + } + u.seenPK[seenKey] = struct{}{} + u.keys = append(u.keys, keyAny) + u.distances = append(u.distances, distances[i]) + for _, col := range u.includeColumns { + u.includeData[col] = append(u.includeData[col], includeResult.Data[col][i]) + } + } + return nil } diff --git a/pkg/sql/colexec/table_function/ivf_search_test.go b/pkg/sql/colexec/table_function/ivf_search_test.go index 265fcd2da8ba9..78e45c79f25e8 100644 --- a/pkg/sql/colexec/table_function/ivf_search_test.go +++ b/pkg/sql/colexec/table_function/ivf_search_test.go @@ -16,9 +16,9 @@ package table_function import ( "fmt" - "os" "testing" + "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/common/mpool" "github.com/matrixorigin/matrixone/pkg/container/batch" "github.com/matrixorigin/matrixone/pkg/container/types" @@ -104,12 +104,15 @@ func mockVersion(sqlproc *sqlexec.SqlProcess, tblcfg vectorindex.IndexTableConfi } type MockIvfSearch[T types.RealNumbers] struct { - Idxcfg vectorindex.IndexConfig - Tblcfg vectorindex.IndexTableConfig + Idxcfg vectorindex.IndexConfig + Tblcfg vectorindex.IndexTableConfig + searchFn func(sqlproc *sqlexec.SqlProcess, query any, rt vectorindex.RuntimeConfig) (keys any, distances []float64, err error) } func (m *MockIvfSearch[T]) Search(sqlproc *sqlexec.SqlProcess, query any, rt vectorindex.RuntimeConfig) (keys any, distances []float64, err error) { - //time.Sleep(2 * time.Millisecond) + if m.searchFn != nil { + return m.searchFn(sqlproc, query, rt) + } return []any{int64(1)}, []float64{2.0}, nil } @@ -129,6 +132,25 @@ func newMockIvfAlgoFn(idxcfg vectorindex.IndexConfig, tblcfg vectorindex.IndexTa return &MockIvfSearch[float32]{Idxcfg: idxcfg, Tblcfg: tblcfg}, nil } +func makeConstInputExprsIvfSearchWithConfig(tblcfg string) []*plan.Expr { + return []*plan.Expr{ + { + Typ: plan.Type{ + Id: int32(types.T_varchar), + Width: 512, + }, + Expr: &plan.Expr_Lit{ + Lit: &plan.Literal{ + Value: &plan.Literal_Sval{ + Sval: tblcfg, + }, + }, + }, + }, + plan2.MakePlan2Vecf32ConstExprWithType("[0,1,2]", 3), + } +} + func TestIvfSearch(t *testing.T) { newIvfAlgo = newMockIvfAlgoFn @@ -198,10 +220,8 @@ func TestIvfSearchParamFail(t *testing.T) { } // start - fmt.Println(param) err = ut.arg.ctr.state.start(ut.arg, ut.proc, 0, nil) require.NotNil(t, err) - os.Stderr.WriteString(fmt.Sprintf("%v\n", err)) } /* @@ -247,7 +267,6 @@ func TestIvfSearchIndexTableConfigFail(t *testing.T) { // start err = ut.arg.ctr.state.start(ut.arg, ut.proc, 0, nil) require.NotNil(t, err) - os.Stderr.WriteString(fmt.Sprintf("%v\n", err)) } /* @@ -271,25 +290,7 @@ func TestIvfSearchIndexTableConfigFail(t *testing.T) { func makeConstInputExprsIvfSearch() []*plan.Expr { tblcfg := fmt.Sprintf(`{"db":"db", "src":"src", "metadata":"__metadata", "index":"__index", "entries":"__entries", "parttype": %d}`, int32(types.T_array_float32)) - ret := []*plan.Expr{ - { - Typ: plan.Type{ - Id: int32(types.T_varchar), - Width: 512, - }, - Expr: &plan.Expr_Lit{ - Lit: &plan.Literal{ - Value: &plan.Literal_Sval{ - Sval: tblcfg, - }, - }, - }, - }, - - plan2.MakePlan2Vecf32ConstExprWithType("[0,1,2]", 3), - } - - return ret + return makeConstInputExprsIvfSearchWithConfig(tblcfg) } func makeBatchIvfSearch(proc *process.Process) *batch.Batch { @@ -309,6 +310,480 @@ func makeBatchIvfSearch(proc *process.Process) *batch.Batch { } +func TestIvfSearchCallReturnsIncludeColumnsAndLazyFetchesMoreRounds(t *testing.T) { + oldNewIvfAlgo := newIvfAlgo + oldGetVersion := getVersion + defer func() { + newIvfAlgo = oldNewIvfAlgo + getVersion = oldGetVersion + }() + + mock := &MockIvfSearch[float32]{} + mock.searchFn = func(sqlproc *sqlexec.SqlProcess, query any, rt vectorindex.RuntimeConfig) (keys any, distances []float64, err error) { + if rt.SearchCursor != nil { + if len(rt.SearchCursor.RankedCentroidIDs) == 0 { + rt.SearchCursor.RankedCentroidIDs = []int64{11, 22} + } + if rt.SearchCursor.CurrentBucketCount == 0 { + rt.SearchCursor.CurrentBucketCount = 1 + } + rt.SearchCursor.Round++ + rt.SearchCursor.Exhausted = rt.SearchCursor.NextBucketOffset+rt.SearchCursor.CurrentBucketCount >= uint(len(rt.SearchCursor.RankedCentroidIDs)) + } + if rt.IncludeResult != nil { + rt.IncludeResult.ColNames = []string{"rank"} + rt.IncludeResult.Data = map[string][]any{"rank": nil} + } + + if rt.SearchCursor.Round == 1 { + rt.IncludeResult.Data["rank"] = []any{int32(7)} + return []any{int64(1)}, []float64{2.0}, nil + } + rt.IncludeResult.Data["rank"] = []any{int32(7), int32(9)} + return []any{int64(1), int64(2)}, []float64{2.0, 3.0}, nil + } + + newIvfAlgo = func(idxcfg vectorindex.IndexConfig, tblcfg vectorindex.IndexTableConfig) (cache.VectorIndexSearchIf, error) { + return mock, nil + } + getVersion = mockVersion + + param := "{\"op_type\": \"vector_l2_ops\", \"lists\": \"3\"}" + attrs := []string{"pkid", "score", catalog.SystemSI_IVFFLAT_IncludeColPrefix + "rank"} + ut := newIvfSearchTestCase(t, mpool.MustNewZero(), attrs, param) + ut.arg.Rets = []*plan.ColDef{ + {Name: "pkid", Typ: plan.Type{Id: int32(types.T_int64)}}, + {Name: "score", Typ: plan.Type{Id: int32(types.T_float64)}}, + {Name: catalog.SystemSI_IVFFLAT_IncludeColPrefix + "rank", Typ: plan.Type{Id: int32(types.T_int32)}}, + } + + tblcfg := fmt.Sprintf( + `{"db":"db","src":"src","metadata":"__metadata","index":"__index_include_rounds","entries":"__entries","parttype":%d,"include_columns":["rank"],"include_column_types":[%d]}`, + int32(types.T_array_float32), + int32(types.T_int32), + ) + inbat := makeBatchIvfSearch(ut.proc) + ut.arg.Args = makeConstInputExprsIvfSearchWithConfig(tblcfg) + ut.arg.Args = append( + ut.arg.Args, + plan2.MakePlan2StringConstExprWithType(""), + plan2.MakePlan2Uint64ConstExprWithType(2), + plan2.MakePlan2Uint64ConstExprWithType(1), + ) + + err := ut.arg.Prepare(ut.proc) + require.NoError(t, err) + for i := range ut.arg.ctr.executorsForArgs { + ut.arg.ctr.argVecs[i], err = ut.arg.ctr.executorsForArgs[i].Eval(ut.proc, []*batch.Batch{inbat}, nil) + require.NoError(t, err) + } + + err = ut.arg.ctr.state.start(ut.arg, ut.proc, 0, nil) + require.NoError(t, err) + + result, err := ut.arg.ctr.state.call(ut.arg, ut.proc) + require.NoError(t, err) + require.Equal(t, vm.ExecNext, result.Status) + require.Equal(t, 2, result.Batch.RowCount()) + require.Equal(t, int64(1), vector.GetFixedAtNoTypeCheck[int64](result.Batch.Vecs[0], 0)) + require.Equal(t, int64(2), vector.GetFixedAtNoTypeCheck[int64](result.Batch.Vecs[0], 1)) + require.Equal(t, int32(7), vector.GetFixedAtNoTypeCheck[int32](result.Batch.Vecs[2], 0)) + require.Equal(t, int32(9), vector.GetFixedAtNoTypeCheck[int32](result.Batch.Vecs[2], 1)) +} + +func TestIvfSearchStartReadsOptionalQueryScopedArgs(t *testing.T) { + oldNewIvfAlgo := newIvfAlgo + oldGetVersion := getVersion + defer func() { + newIvfAlgo = oldNewIvfAlgo + getVersion = oldGetVersion + }() + + mock := &MockIvfSearch[float32]{} + mock.searchFn = func(sqlproc *sqlexec.SqlProcess, query any, rt vectorindex.RuntimeConfig) (keys any, distances []float64, err error) { + require.Equal(t, "`__mo_index_include_category` >= 20", rt.PushdownFilterSQL) + require.Equal(t, uint(12), rt.SearchRoundLimit) + require.Equal(t, uint(10), rt.BucketExpandStep) + return []any{int64(1)}, []float64{2.0}, nil + } + + newIvfAlgo = func(idxcfg vectorindex.IndexConfig, tblcfg vectorindex.IndexTableConfig) (cache.VectorIndexSearchIf, error) { + return mock, nil + } + getVersion = mockVersion + + param := "{\"op_type\": \"vector_l2_ops\", \"lists\": \"3\"}" + ut := newIvfSearchTestCase(t, mpool.MustNewZero(), ivfsearchdefaultAttrs, param) + inbat := makeBatchIvfSearch(ut.proc) + + ut.arg.Args = append( + makeConstInputExprsIvfSearch(), + plan2.MakePlan2StringConstExprWithType("`__mo_index_include_category` >= 20"), + plan2.MakePlan2Uint64ConstExprWithType(12), + plan2.MakePlan2Uint64ConstExprWithType(10), + ) + + err := ut.arg.Prepare(ut.proc) + require.NoError(t, err) + for i := range ut.arg.ctr.executorsForArgs { + ut.arg.ctr.argVecs[i], err = ut.arg.ctr.executorsForArgs[i].Eval(ut.proc, []*batch.Batch{inbat}, nil) + require.NoError(t, err) + } + + err = ut.arg.ctr.state.start(ut.arg, ut.proc, 0, nil) + require.NoError(t, err) +} + +func TestIvfSearchStartKeepsLegacyRuntimePathWithoutIncludeArgs(t *testing.T) { + oldNewIvfAlgo := newIvfAlgo + oldGetVersion := getVersion + defer func() { + newIvfAlgo = oldNewIvfAlgo + getVersion = oldGetVersion + }() + + mock := &MockIvfSearch[float32]{} + mock.searchFn = func(sqlproc *sqlexec.SqlProcess, query any, rt vectorindex.RuntimeConfig) (keys any, distances []float64, err error) { + require.Nil(t, rt.IncludeResult) + require.Nil(t, rt.RequestedIncludeColumns) + require.Empty(t, rt.PushdownFilterSQL) + require.Zero(t, rt.SearchRoundLimit) + require.Zero(t, rt.BucketExpandStep) + require.Nil(t, rt.SearchCursor) + return []any{int64(1)}, []float64{1.0}, nil + } + + newIvfAlgo = func(idxcfg vectorindex.IndexConfig, tblcfg vectorindex.IndexTableConfig) (cache.VectorIndexSearchIf, error) { + return mock, nil + } + getVersion = mockVersion + cache.Cache = cache.NewVectorIndexCache() + + param := "{\"op_type\": \"vector_l2_ops\", \"lists\": \"3\"}" + ut := newIvfSearchTestCase(t, mpool.MustNewZero(), ivfsearchdefaultAttrs, param) + inbat := makeBatchIvfSearch(ut.proc) + + ut.arg.Args = makeConstInputExprsIvfSearchWithConfig( + fmt.Sprintf(`{"db":"db","src":"src","metadata":"__metadata","index":"__index_legacy_runtime_path","entries":"__entries","parttype": %d}`, int32(types.T_array_float32)), + ) + ut.arg.Limit = plan2.MakePlan2Uint64ConstExprWithType(3) + ut.arg.IndexReaderParam = &plan.IndexReaderParam{ + Limit: plan2.MakePlan2Uint64ConstExprWithType(12), + } + + err := ut.arg.Prepare(ut.proc) + require.NoError(t, err) + for i := range ut.arg.ctr.executorsForArgs { + ut.arg.ctr.argVecs[i], err = ut.arg.ctr.executorsForArgs[i].Eval(ut.proc, []*batch.Batch{inbat}, nil) + require.NoError(t, err) + } + + err = ut.arg.ctr.state.start(ut.arg, ut.proc, 0, nil) + require.NoError(t, err) +} + +func TestIvfSearchStartResetsRoundStatePerNthRow(t *testing.T) { + oldNewIvfAlgo := newIvfAlgo + oldGetVersion := getVersion + defer func() { + newIvfAlgo = oldNewIvfAlgo + getVersion = oldGetVersion + }() + + type searchCall struct { + query []float32 + searchRoundLimit uint + nextBucketOffset uint + currentBucketCnt uint + } + var calls []searchCall + + mock := &MockIvfSearch[float32]{} + mock.searchFn = func(sqlproc *sqlexec.SqlProcess, query any, rt vectorindex.RuntimeConfig) (keys any, distances []float64, err error) { + q := append([]float32(nil), query.([]float32)...) + call := searchCall{query: q, searchRoundLimit: rt.SearchRoundLimit} + if rt.SearchCursor != nil { + call.nextBucketOffset = rt.SearchCursor.NextBucketOffset + call.currentBucketCnt = rt.SearchCursor.CurrentBucketCount + if len(rt.SearchCursor.RankedCentroidIDs) == 0 { + rt.SearchCursor.RankedCentroidIDs = []int64{11, 22, 33} + } + if rt.SearchCursor.CurrentBucketCount == 0 { + rt.SearchCursor.CurrentBucketCount = 1 + } + rt.SearchCursor.Round++ + rt.SearchCursor.Exhausted = rt.SearchCursor.NextBucketOffset+rt.SearchCursor.CurrentBucketCount >= uint(len(rt.SearchCursor.RankedCentroidIDs)) + } + calls = append(calls, call) + + if len(q) > 0 && q[0] == 0 { + if rt.SearchCursor != nil && rt.SearchCursor.Round == 1 { + return []any{}, []float64{}, nil + } + return []any{int64(1)}, []float64{1.0}, nil + } + return []any{int64(2)}, []float64{2.0}, nil + } + + newIvfAlgo = func(idxcfg vectorindex.IndexConfig, tblcfg vectorindex.IndexTableConfig) (cache.VectorIndexSearchIf, error) { + return mock, nil + } + getVersion = mockVersion + cache.Cache = cache.NewVectorIndexCache() + + param := "{\"op_type\": \"vector_l2_ops\", \"lists\": \"3\"}" + ut := newIvfSearchTestCase(t, mpool.MustNewZero(), ivfsearchdefaultAttrs, param) + inbat := makeBatchIvfSearch(ut.proc) + ut.arg.Args = append( + makeConstInputExprsIvfSearchWithConfig( + fmt.Sprintf(`{"db":"db","src":"src","metadata":"__metadata","index":"__index_nthrow_reset","entries":"__entries","parttype": %d}`, int32(types.T_array_float32)), + ), + plan2.MakePlan2StringConstExprWithType(""), + plan2.MakePlan2Uint64ConstExprWithType(2), + plan2.MakePlan2Uint64ConstExprWithType(1), + ) + + err := ut.arg.Prepare(ut.proc) + require.NoError(t, err) + for i := range ut.arg.ctr.executorsForArgs { + ut.arg.ctr.argVecs[i], err = ut.arg.ctr.executorsForArgs[i].Eval(ut.proc, []*batch.Batch{inbat}, nil) + require.NoError(t, err) + } + + queryVec := vector.NewVec(types.New(types.T_array_float32, 3, 0)) + require.NoError(t, vector.AppendArray(queryVec, []float32{0, 1, 2}, false, ut.proc.Mp())) + require.NoError(t, vector.AppendArray(queryVec, []float32{9, 9, 9}, false, ut.proc.Mp())) + ut.arg.ctr.argVecs[1] = queryVec + + err = ut.arg.ctr.state.start(ut.arg, ut.proc, 0, nil) + require.NoError(t, err) + _, err = ut.arg.ctr.state.call(ut.arg, ut.proc) + require.NoError(t, err) + + err = ut.arg.ctr.state.start(ut.arg, ut.proc, 1, nil) + require.NoError(t, err) + + require.Len(t, calls, 3) + require.Equal(t, []float32{0, 1, 2}, calls[0].query) + require.Equal(t, uint(2), calls[0].searchRoundLimit) + require.Equal(t, uint(0), calls[0].nextBucketOffset) + require.Equal(t, uint(0), calls[0].currentBucketCnt) + + require.Equal(t, []float32{0, 1, 2}, calls[1].query) + require.Equal(t, uint(2), calls[1].searchRoundLimit) + require.Equal(t, uint(1), calls[1].nextBucketOffset) + require.Equal(t, uint(1), calls[1].currentBucketCnt) + + require.Equal(t, []float32{9, 9, 9}, calls[2].query) + require.Equal(t, uint(2), calls[2].searchRoundLimit) + require.Equal(t, uint(0), calls[2].nextBucketOffset) + require.Equal(t, uint(0), calls[2].currentBucketCnt) +} + +func TestIvfSearchStartFailsWhenIncludeDataMisaligns(t *testing.T) { + oldNewIvfAlgo := newIvfAlgo + oldGetVersion := getVersion + defer func() { + newIvfAlgo = oldNewIvfAlgo + getVersion = oldGetVersion + }() + + mock := &MockIvfSearch[float32]{} + mock.searchFn = func(sqlproc *sqlexec.SqlProcess, query any, rt vectorindex.RuntimeConfig) (keys any, distances []float64, err error) { + rt.IncludeResult.ColNames = []string{"rank"} + rt.IncludeResult.Data = map[string][]any{"rank": nil} + return []any{int64(1)}, []float64{2.0}, nil + } + + newIvfAlgo = func(idxcfg vectorindex.IndexConfig, tblcfg vectorindex.IndexTableConfig) (cache.VectorIndexSearchIf, error) { + return mock, nil + } + getVersion = mockVersion + + param := "{\"op_type\": \"vector_l2_ops\", \"lists\": \"3\"}" + attrs := []string{"pkid", "score", catalog.SystemSI_IVFFLAT_IncludeColPrefix + "rank"} + ut := newIvfSearchTestCase(t, mpool.MustNewZero(), attrs, param) + ut.arg.Rets = []*plan.ColDef{ + {Name: "pkid", Typ: plan.Type{Id: int32(types.T_int64)}}, + {Name: "score", Typ: plan.Type{Id: int32(types.T_float64)}}, + {Name: catalog.SystemSI_IVFFLAT_IncludeColPrefix + "rank", Typ: plan.Type{Id: int32(types.T_int32)}}, + } + tblcfg := fmt.Sprintf( + `{"db":"db","src":"src","metadata":"__metadata","index":"__index_include_mismatch","entries":"__entries","parttype":%d,"include_columns":["rank"],"include_column_types":[%d]}`, + int32(types.T_array_float32), + int32(types.T_int32), + ) + inbat := makeBatchIvfSearch(ut.proc) + ut.arg.Args = makeConstInputExprsIvfSearchWithConfig(tblcfg) + + err := ut.arg.Prepare(ut.proc) + require.NoError(t, err) + for i := range ut.arg.ctr.executorsForArgs { + ut.arg.ctr.argVecs[i], err = ut.arg.ctr.executorsForArgs[i].Eval(ut.proc, []*batch.Batch{inbat}, nil) + require.NoError(t, err) + } + + err = ut.arg.ctr.state.start(ut.arg, ut.proc, 0, nil) + require.Error(t, err) + require.Contains(t, err.Error(), "include data length mismatch") +} + +func TestIvfSearchCallStopsAfterTooManyEmptyRounds(t *testing.T) { + oldNewIvfAlgo := newIvfAlgo + oldGetVersion := getVersion + defer func() { + newIvfAlgo = oldNewIvfAlgo + getVersion = oldGetVersion + }() + + mock := &MockIvfSearch[float32]{} + mock.searchFn = func(sqlproc *sqlexec.SqlProcess, query any, rt vectorindex.RuntimeConfig) (keys any, distances []float64, err error) { + if rt.SearchCursor != nil { + if len(rt.SearchCursor.RankedCentroidIDs) == 0 { + rt.SearchCursor.RankedCentroidIDs = []int64{11, 22, 33} + } + if rt.SearchCursor.CurrentBucketCount == 0 { + rt.SearchCursor.CurrentBucketCount = 1 + } + rt.SearchCursor.Round++ + rt.SearchCursor.Exhausted = rt.SearchCursor.NextBucketOffset+rt.SearchCursor.CurrentBucketCount >= uint(len(rt.SearchCursor.RankedCentroidIDs)) + } + return []any{}, []float64{}, nil + } + + newIvfAlgo = func(idxcfg vectorindex.IndexConfig, tblcfg vectorindex.IndexTableConfig) (cache.VectorIndexSearchIf, error) { + return mock, nil + } + getVersion = mockVersion + + param := "{\"op_type\": \"vector_l2_ops\", \"lists\": \"3\"}" + ut := newIvfSearchTestCase(t, mpool.MustNewZero(), ivfsearchdefaultAttrs, param) + inbat := makeBatchIvfSearch(ut.proc) + ut.arg.Args = makeConstInputExprsIvfSearchWithConfig( + fmt.Sprintf(`{"db":"db","src":"src","metadata":"__metadata","index":"__index_empty_rounds","entries":"__entries","parttype": %d}`, int32(types.T_array_float32)), + ) + ut.arg.Args = append( + ut.arg.Args, + plan2.MakePlan2StringConstExprWithType(""), + plan2.MakePlan2Uint64ConstExprWithType(1), + plan2.MakePlan2Uint64ConstExprWithType(1), + ) + + err := ut.arg.Prepare(ut.proc) + require.NoError(t, err) + for i := range ut.arg.ctr.executorsForArgs { + ut.arg.ctr.argVecs[i], err = ut.arg.ctr.executorsForArgs[i].Eval(ut.proc, []*batch.Batch{inbat}, nil) + require.NoError(t, err) + } + + err = ut.arg.ctr.state.start(ut.arg, ut.proc, 0, nil) + require.NoError(t, err) + + state := ut.arg.ctr.state.(*ivfSearchState) + result, err := state.call(ut.arg, ut.proc) + require.NoError(t, err) + require.Equal(t, vm.CancelResult.Status, result.Status) + require.NotNil(t, state.cursor) + require.True(t, state.cursor.Exhausted) +} + +func TestIvfSearchCallStopsOnceLimitRowsAreBuffered(t *testing.T) { + oldNewIvfAlgo := newIvfAlgo + oldGetVersion := getVersion + defer func() { + newIvfAlgo = oldNewIvfAlgo + getVersion = oldGetVersion + }() + + var calls int + mock := &MockIvfSearch[float32]{} + mock.searchFn = func(sqlproc *sqlexec.SqlProcess, query any, rt vectorindex.RuntimeConfig) (keys any, distances []float64, err error) { + calls++ + if rt.SearchCursor != nil && len(rt.SearchCursor.RankedCentroidIDs) == 0 { + rt.SearchCursor.RankedCentroidIDs = []int64{11, 22, 33} + } + return []any{int64(1), int64(2)}, []float64{1.0, 2.0}, nil + } + + newIvfAlgo = func(idxcfg vectorindex.IndexConfig, tblcfg vectorindex.IndexTableConfig) (cache.VectorIndexSearchIf, error) { + return mock, nil + } + getVersion = mockVersion + cache.Cache = cache.NewVectorIndexCache() + + param := "{\"op_type\": \"vector_l2_ops\", \"lists\": \"3\"}" + ut := newIvfSearchTestCase(t, mpool.MustNewZero(), ivfsearchdefaultAttrs, param) + inbat := makeBatchIvfSearch(ut.proc) + ut.arg.Args = append( + makeConstInputExprsIvfSearchWithConfig( + fmt.Sprintf(`{"db":"db","src":"src","metadata":"__metadata","index":"__index_limit_stop","entries":"__entries","parttype": %d}`, int32(types.T_array_float32)), + ), + plan2.MakePlan2StringConstExprWithType(""), + plan2.MakePlan2Uint64ConstExprWithType(2), + plan2.MakePlan2Uint64ConstExprWithType(1), + ) + ut.arg.Limit = plan2.MakePlan2Uint64ConstExprWithType(2) + + err := ut.arg.Prepare(ut.proc) + require.NoError(t, err) + for i := range ut.arg.ctr.executorsForArgs { + ut.arg.ctr.argVecs[i], err = ut.arg.ctr.executorsForArgs[i].Eval(ut.proc, []*batch.Batch{inbat}, nil) + require.NoError(t, err) + } + + err = ut.arg.ctr.state.start(ut.arg, ut.proc, 0, nil) + require.NoError(t, err) + + result, err := ut.arg.ctr.state.call(ut.arg, ut.proc) + require.NoError(t, err) + require.Equal(t, vm.ExecNext, result.Status) + require.Equal(t, 2, result.Batch.RowCount()) + require.Equal(t, 1, calls) +} + +func TestIvfSearchPreparePrefersLargerIndexReaderLimit(t *testing.T) { + newIvfAlgo = newMockIvfAlgoFn + getVersion = mockVersion + + param := "{\"op_type\": \"vector_l2_ops\", \"lists\": \"3\"}" + ut := newIvfSearchTestCase(t, mpool.MustNewZero(), ivfsearchdefaultAttrs, param) + + ut.arg.Args = makeConstInputExprsIvfSearchWithConfig( + fmt.Sprintf(`{"db":"db","src":"src","metadata":"__metadata","index":"__index_limit_precedence","entries":"__entries","parttype": %d}`, int32(types.T_array_float32)), + ) + ut.arg.Limit = plan2.MakePlan2Uint64ConstExprWithType(3) + ut.arg.IndexReaderParam = &plan.IndexReaderParam{ + Limit: plan2.MakePlan2Uint64ConstExprWithType(15), + } + ut.arg.RuntimeFilterSpecs = []*plan.RuntimeFilterSpec{{UseBloomFilter: true}} + + err := ut.arg.Prepare(ut.proc) + require.NoError(t, err) + state := ut.arg.ctr.state.(*ivfSearchState) + require.Equal(t, uint64(15), state.limit) +} + +func TestIvfSearchPrepareUsesIndexReaderLimitWithoutRuntimeFilter(t *testing.T) { + newIvfAlgo = newMockIvfAlgoFn + getVersion = mockVersion + + param := "{\"op_type\": \"vector_l2_ops\", \"lists\": \"3\"}" + ut := newIvfSearchTestCase(t, mpool.MustNewZero(), ivfsearchdefaultAttrs, param) + + ut.arg.Args = makeConstInputExprsIvfSearchWithConfig( + fmt.Sprintf(`{"db":"db","src":"src","metadata":"__metadata","index":"__index_limit_no_runtime_filter","entries":"__entries","parttype": %d}`, int32(types.T_array_float32)), + ) + ut.arg.Limit = plan2.MakePlan2Uint64ConstExprWithType(3) + ut.arg.IndexReaderParam = &plan.IndexReaderParam{ + Limit: plan2.MakePlan2Uint64ConstExprWithType(15), + } + + err := ut.arg.Prepare(ut.proc) + require.NoError(t, err) + state := ut.arg.ctr.state.(*ivfSearchState) + require.Equal(t, uint64(15), state.limit) +} + func makeBatchIvfSearchFail(proc *process.Process) []failBatch { failBatches := make([]failBatch, 0, 3) diff --git a/pkg/sql/compile/ddl.go b/pkg/sql/compile/ddl.go index 8a15f463569b3..18db6e68a874b 100644 --- a/pkg/sql/compile/ddl.go +++ b/pkg/sql/compile/ddl.go @@ -5593,6 +5593,19 @@ func isLegal(name string, sqls []string) bool { return yes } +func isMissingCCPRCatalogError(err error, tableName string) bool { + if err == nil { + return false + } + if !moerr.IsMoErrCode(err, moerr.ErrNoSuchTable) && + !moerr.IsMoErrCode(err, moerr.ErrParseError) { + return false + } + msg := err.Error() + return strings.Contains(msg, fmt.Sprintf("%s.%s", catalog.MO_CATALOG, tableName)) || + strings.Contains(msg, fmt.Sprintf(`"%s"`, tableName)) +} + // checkCCPRTableBeforeDrop checks if a table can be dropped based on CCPR rules. // Returns: // - true if the table can be dropped @@ -5609,6 +5622,13 @@ func checkCCPRTableBeforeDrop(c *Compile, tableID uint64) (bool, error) { res, err := c.runSqlWithResult(querySql, int32(catalog.System_Account)) if err != nil { + if isMissingCCPRCatalogError(err, catalog.MO_CCPR_TABLES) { + logutil.Info("CCPR: metadata table missing, skip table drop protection", + zap.Uint64("tableID", tableID), + zap.String("metadataTable", catalog.MO_CCPR_TABLES), + zap.Error(err)) + return true, nil + } return false, err } defer res.Close() @@ -5637,6 +5657,13 @@ func checkCCPRTableBeforeDrop(c *Compile, tableID uint64) (bool, error) { taskRes, err := c.runSqlWithResult(checkTaskSql, int32(catalog.System_Account)) if err != nil { + if isMissingCCPRCatalogError(err, catalog.MO_CCPR_LOG) { + logutil.Info("CCPR: metadata table missing, skip table drop protection", + zap.Uint64("tableID", tableID), + zap.String("metadataTable", catalog.MO_CCPR_LOG), + zap.Error(err)) + return true, nil + } return false, err } defer taskRes.Close() @@ -5698,6 +5725,13 @@ func checkCCPRDbBeforeDrop(c *Compile, dbID uint64) (bool, error) { res, err := c.runSqlWithResult(querySql, int32(catalog.System_Account)) if err != nil { + if isMissingCCPRCatalogError(err, catalog.MO_CCPR_DBS) { + logutil.Info("CCPR: metadata table missing, skip database drop protection", + zap.Uint64("dbID", dbID), + zap.String("metadataTable", catalog.MO_CCPR_DBS), + zap.Error(err)) + return true, nil + } return false, err } defer res.Close() @@ -5726,6 +5760,13 @@ func checkCCPRDbBeforeDrop(c *Compile, dbID uint64) (bool, error) { taskRes, err := c.runSqlWithResult(checkTaskSql, int32(catalog.System_Account)) if err != nil { + if isMissingCCPRCatalogError(err, catalog.MO_CCPR_LOG) { + logutil.Info("CCPR: metadata table missing, skip database drop protection", + zap.Uint64("dbID", dbID), + zap.String("metadataTable", catalog.MO_CCPR_LOG), + zap.Error(err)) + return true, nil + } return false, err } defer taskRes.Close() diff --git a/pkg/sql/compile/ddl_index_algo.go b/pkg/sql/compile/ddl_index_algo.go index 1e646f47328e2..33db0b31bb13c 100644 --- a/pkg/sql/compile/ddl_index_algo.go +++ b/pkg/sql/compile/ddl_index_algo.go @@ -19,6 +19,7 @@ import ( "fmt" "slices" "strconv" + "strings" "github.com/bytedance/sonic" "github.com/matrixorigin/matrixone/pkg/catalog" @@ -318,18 +319,10 @@ func (s *Scope) handleIvfIndexCentroidsTable(c *Compile, indexDef *plan.IndexDef } cfg.KmeansMaxIteration = val.(int64) - params_str := indexDef.IndexAlgoParams - - cfgbytes, err := json.Marshal(cfg) + sql, err = buildIvfCreateSQL(indexDef.IndexAlgoParams, cfg) if err != nil { return err } - - //part := src_alias + "." + indexDef.Parts[0] - insertIntoIvfIndexTableFormat := "SELECT * FROM ivf_create('%s', '%s') AS f;" - sql = fmt.Sprintf(insertIntoIvfIndexTableFormat, - params_str, - string(cfgbytes)) } async, err := catalog.IsIndexAsync(indexDef.IndexAlgoParams) @@ -364,8 +357,8 @@ func (s *Scope) handleIvfIndexCentroidsTable(c *Compile, indexDef *plan.IndexDef } logutil.Infof("Ivfflat index Async = true, forceSync = true") - sinker_type := getSinkerTypeFromAlgo(catalog.MoIndexIvfFlatAlgo.ToString()) - err = CreateIndexCdcTask(c, qryDatabase, originalTableDef.Name, originalTableDef.TblId, indexDef.IndexName, sinker_type, true, "", originalTableDef) + sinkerType := getSinkerTypeFromAlgo(catalog.MoIndexIvfFlatAlgo.ToString()) + err = CreateIndexCdcTask(c, qryDatabase, originalTableDef.Name, originalTableDef.TblId, indexDef.IndexName, sinkerType, true, "", originalTableDef) if err != nil { return err } @@ -408,123 +401,161 @@ func (s *Scope) handleIvfIndexCentroidsTable(c *Compile, indexDef *plan.IndexDef return nil } +func buildIvfCreateSQL(params string, cfg vectorindex.IndexTableConfig) (string, error) { + cfgbytes, err := json.Marshal(cfg) + if err != nil { + return "", err + } + + return fmt.Sprintf( + "SELECT * FROM ivf_create('%s', '%s') AS f;", + escapeSQLStringLiteral(params), + escapeSQLStringLiteral(string(cfgbytes)), + ), nil +} + func (s *Scope) handleIvfIndexEntriesTable(c *Compile, indexDef *plan.IndexDef, qryDatabase string, originalTableDef *plan.TableDef, metadataTableName string, centroidsTableName string) error { + centroidsCrossL2JoinTbl, err := buildIvfEntriesInsertSQL(indexDef, qryDatabase, originalTableDef, metadataTableName, centroidsTableName) + if err != nil { + return err + } - // 1.a algo params - val, err := sonic.Get([]byte(indexDef.IndexAlgoParams), catalog.IndexAlgoParamOpType) + err = s.logTimestamp(c, qryDatabase, metadataTableName, "mapping_start") + if err != nil { + return err + } + + err = c.runSql(centroidsCrossL2JoinTbl) + if err != nil { + return err + } + + err = s.logTimestamp(c, qryDatabase, metadataTableName, "mapping_end") if err != nil { return err } - optype, err := val.StrictString() + + return nil +} + +func (s *Scope) handleIvfIndexRegisterUpdate(c *Compile, indexDef *plan.IndexDef, qryDatabase string, originalTableDef *plan.TableDef) error { + + metadata, frontend, err := getIvfflatMetadata(c) if err != nil { return err } - // 1. Original table's pkey name and value + if !frontend { + // this function call is from background so ignore it + logutil.Infof("Background invoke reindex and ignore register index update function call") + return nil + } + + return idxcron.RegisterUpdate(c.proc.Ctx, + c.proc.GetService(), + c.proc.GetTxnOperator(), + originalTableDef.TblId, + qryDatabase, + originalTableDef.Name, + indexDef.IndexName, + idxcron.Action_Ivfflat_Reindex, + string(metadata)) +} + +func buildIvfEntriesInsertSQL(indexDef *plan.IndexDef, qryDatabase string, originalTableDef *plan.TableDef, + metadataTableName string, centroidsTableName string) (string, error) { + + // 1.a algo params + params, err := catalog.IndexParamsStringToMap(indexDef.IndexAlgoParams) + if err != nil { + return "", err + } + optype, ok := params[catalog.IndexAlgoParamOpType] + if !ok { + return "", moerr.NewInternalErrorNoCtx("vector optype not found") + } + + includeCols := slices.Clone(indexDef.IncludedColumns) + var originalTblPkColsCommaSeperated string var originalTblPkColMaySerial string + srcAlias := "src" + centroidsAlias := "centroids_cur" + srcTableRef := fmt.Sprintf("`%s`.`%s`", qryDatabase, originalTableDef.Name) if originalTableDef.Pkey.PkeyColName == catalog.CPrimaryKeyColName { for i, part := range originalTableDef.Pkey.Names { if i > 0 { originalTblPkColsCommaSeperated += "," } - originalTblPkColsCommaSeperated += fmt.Sprintf("`%s`.`%s`", originalTableDef.Name, part) + originalTblPkColsCommaSeperated += fmt.Sprintf("`%s`.`%s`", srcAlias, part) } originalTblPkColMaySerial = fmt.Sprintf("serial(%s)", originalTblPkColsCommaSeperated) } else { - originalTblPkColsCommaSeperated = fmt.Sprintf("`%s`.`%s`", originalTableDef.Name, originalTableDef.Pkey.PkeyColName) + originalTblPkColsCommaSeperated = fmt.Sprintf("`%s`.`%s`", srcAlias, originalTableDef.Pkey.PkeyColName) originalTblPkColMaySerial = originalTblPkColsCommaSeperated } - // 2. insert into entries table - insertSQL := fmt.Sprintf("insert into `%s`.`%s` (`%s`, `%s`, `%s`, `%s`) ", - qryDatabase, - indexDef.IndexTableName, + insertCols := []string{ catalog.SystemSI_IVFFLAT_TblCol_Entries_version, catalog.SystemSI_IVFFLAT_TblCol_Entries_id, catalog.SystemSI_IVFFLAT_TblCol_Entries_pk, catalog.SystemSI_IVFFLAT_TblCol_Entries_entry, + } + selectCols := []string{ + fmt.Sprintf("`%s`.`%s`", centroidsAlias, catalog.SystemSI_IVFFLAT_TblCol_Centroids_version), + fmt.Sprintf("`%s`.`%s`", centroidsAlias, catalog.SystemSI_IVFFLAT_TblCol_Centroids_id), + originalTblPkColMaySerial, + fmt.Sprintf("`%s`.`%s`", srcAlias, indexDef.Parts[0]), + } + for _, includeCol := range includeCols { + insertCols = append(insertCols, catalog.SystemSI_IVFFLAT_IncludeColPrefix+includeCol) + selectCols = append(selectCols, fmt.Sprintf("`%s`.`%s`", srcAlias, includeCol)) + } + + insertSQL := fmt.Sprintf("INSERT INTO `%s`.`%s` (%s) ", + qryDatabase, + indexDef.IndexTableName, + joinQuotedIdentifiers(insertCols), ) - // 3. centroids table with latest version - centroidsTableForCurrentVersionSql := fmt.Sprintf("(select * from "+ - "`%s`.`%s` where `%s` = "+ - "(select CAST(%s as BIGINT) from `%s`.`%s` where `%s` = 'version')) as `%s`", + centroidsTableForCurrentVersionSQL := fmt.Sprintf("(SELECT * FROM "+ + "`%s`.`%s` WHERE `%s` = "+ + "(SELECT CAST(%s as BIGINT) FROM `%s`.`%s` WHERE `%s` = 'version')) AS `%s`", qryDatabase, centroidsTableName, catalog.SystemSI_IVFFLAT_TblCol_Centroids_version, - catalog.SystemSI_IVFFLAT_TblCol_Metadata_val, qryDatabase, metadataTableName, catalog.SystemSI_IVFFLAT_TblCol_Metadata_key, - centroidsTableName, + centroidsAlias, ) - // 4. select * from table and cross join centroids; - indexColumnName := indexDef.Parts[0] centroidsCrossL2JoinTbl := fmt.Sprintf("%s "+ - "SELECT `%s`, `%s`, %s, `%s`"+ - " FROM `%s`.`%s` CENTROIDX ('%s') join %s "+ - " using (`%s`, `%s`) ", + "SELECT %s"+ + " FROM %s AS `%s` CENTROIDX ('%s') JOIN %s "+ + " USING (`%s`, `%s`) ", insertSQL, - - catalog.SystemSI_IVFFLAT_TblCol_Centroids_version, - catalog.SystemSI_IVFFLAT_TblCol_Centroids_id, - originalTblPkColMaySerial, - indexColumnName, - - qryDatabase, - originalTableDef.Name, + strings.Join(selectCols, ", "), + srcTableRef, + srcAlias, optype, - centroidsTableForCurrentVersionSql, - + centroidsTableForCurrentVersionSQL, catalog.SystemSI_IVFFLAT_TblCol_Centroids_centroid, - indexColumnName, + indexDef.Parts[0], ) - err = s.logTimestamp(c, qryDatabase, metadataTableName, "mapping_start") - if err != nil { - return err - } - - err = c.runSql(centroidsCrossL2JoinTbl) - if err != nil { - return err - } - - err = s.logTimestamp(c, qryDatabase, metadataTableName, "mapping_end") - if err != nil { - return err - } - - return nil + return centroidsCrossL2JoinTbl, nil } -func (s *Scope) handleIvfIndexRegisterUpdate(c *Compile, indexDef *plan.IndexDef, qryDatabase string, originalTableDef *plan.TableDef) error { - - metadata, frontend, err := getIvfflatMetadata(c) - if err != nil { - return err - } - - if !frontend { - // this function call is from background so ignore it - logutil.Infof("Background invoke reindex and ignore register index update function call") - return nil +func joinQuotedIdentifiers(cols []string) string { + quoted := make([]string, len(cols)) + for i, col := range cols { + quoted[i] = fmt.Sprintf("`%s`", col) } - - return idxcron.RegisterUpdate(c.proc.Ctx, - c.proc.GetService(), - c.proc.GetTxnOperator(), - originalTableDef.TblId, - qryDatabase, - originalTableDef.Name, - indexDef.IndexName, - idxcron.Action_Ivfflat_Reindex, - string(metadata)) + return strings.Join(quoted, ", ") } func (s *Scope) logTimestamp(c *Compile, qryDatabase, metadataTableName, metrics string) error { diff --git a/pkg/sql/compile/ddl_index_algo_ivfflat_include_test.go b/pkg/sql/compile/ddl_index_algo_ivfflat_include_test.go new file mode 100644 index 0000000000000..7b923d7ece052 --- /dev/null +++ b/pkg/sql/compile/ddl_index_algo_ivfflat_include_test.go @@ -0,0 +1,95 @@ +// Copyright 2022 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 ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/vectorindex" +) + +func TestBuildIvfEntriesInsertSQL_IncludesIncludeColumns(t *testing.T) { + indexDef := &plan.IndexDef{ + IndexTableName: "idx_entries_tbl", + Parts: []string{"embedding"}, + IndexAlgoParams: `{"lists":"2","op_type":"vector_l2_ops"}`, + IncludedColumns: []string{"title", "category"}, + } + originalTableDef := &plan.TableDef{ + Name: "src_tbl", + Pkey: &plan.PrimaryKeyDef{ + Names: []string{"id"}, + PkeyColName: "id", + }, + } + + sql, err := buildIvfEntriesInsertSQL(indexDef, "test_db", originalTableDef, "meta_tbl", "centroids_tbl") + require.NoError(t, err) + + require.Contains(t, sql, "INSERT INTO `test_db`.`idx_entries_tbl` (`"+ + catalog.SystemSI_IVFFLAT_TblCol_Entries_version+"`, `"+ + catalog.SystemSI_IVFFLAT_TblCol_Entries_id+"`, `"+ + catalog.SystemSI_IVFFLAT_TblCol_Entries_pk+"`, `"+ + catalog.SystemSI_IVFFLAT_TblCol_Entries_entry+"`, `"+ + catalog.SystemSI_IVFFLAT_IncludeColPrefix+"title`, `"+ + catalog.SystemSI_IVFFLAT_IncludeColPrefix+"category`)") + require.Contains(t, sql, "FROM `test_db`.`src_tbl` AS `src` CENTROIDX ('vector_l2_ops')") + require.Contains(t, sql, "SELECT `centroids_cur`.`"+catalog.SystemSI_IVFFLAT_TblCol_Centroids_version+"`, `centroids_cur`.`"+catalog.SystemSI_IVFFLAT_TblCol_Centroids_id+"`, `src`.`id`, `src`.`embedding`, `src`.`title`, `src`.`category`") +} + +func TestBuildIvfEntriesInsertSQL_UsesSerialForCompositePrimaryKey(t *testing.T) { + indexDef := &plan.IndexDef{ + IndexTableName: "idx_entries_tbl", + Parts: []string{"embedding"}, + IndexAlgoParams: `{"lists":"2","op_type":"vector_l2_ops"}`, + } + originalTableDef := &plan.TableDef{ + Name: "src_tbl", + Pkey: &plan.PrimaryKeyDef{ + Names: []string{"tenant_id", "doc_id"}, + PkeyColName: catalog.CPrimaryKeyColName, + }, + } + + sql, err := buildIvfEntriesInsertSQL(indexDef, "test_db", originalTableDef, "meta_tbl", "centroids_tbl") + require.NoError(t, err) + + require.Contains(t, sql, "serial(`src`.`tenant_id`,`src`.`doc_id`)") +} + +func TestBuildIvfCreateSQL_UsesAlgorithmParamsOnly(t *testing.T) { + cfg := vectorindex.IndexTableConfig{ + DbName: "test_db", + SrcTable: "src_tbl", + MetadataTable: "meta_tbl", + IndexTable: "idx_tbl", + PKey: "src.id", + KeyPart: "embedding", + } + + sql, err := buildIvfCreateSQL( + `{"lists":"2","op_type":"vector_l2_ops"}`, + cfg, + ) + require.NoError(t, err) + + require.Contains(t, sql, `ivf_create('{"lists":"2","op_type":"vector_l2_ops"}',`) + require.Contains(t, sql, `{"db":"test_db","src":"src_tbl","metadata":"meta_tbl"`) + require.Contains(t, sql, `"index":"idx_tbl","pkey":"src.id","part":"embedding"`) +} diff --git a/pkg/sql/compile/ddl_test.go b/pkg/sql/compile/ddl_test.go index 9eecf7c2390f3..e0abbdcdcb763 100644 --- a/pkg/sql/compile/ddl_test.go +++ b/pkg/sql/compile/ddl_test.go @@ -60,6 +60,59 @@ func TestConvertDBEOBToNoSuchTablePassThrough(t *testing.T) { require.Same(t, want, got) } +func TestIsMissingCCPRCatalogError(t *testing.T) { + ctx := context.Background() + testCases := []struct { + name string + err error + tableName string + want bool + }{ + { + name: "nil error", + err: nil, + tableName: catalog.MO_CCPR_TABLES, + want: false, + }, + { + name: "no such target table", + err: moerr.NewNoSuchTable(ctx, catalog.MO_CATALOG, catalog.MO_CCPR_TABLES), + tableName: catalog.MO_CCPR_TABLES, + want: true, + }, + { + name: "parse error target table", + err: moerr.NewParseErrorNoCtxf("table %q does not exist", catalog.MO_CCPR_LOG), + tableName: catalog.MO_CCPR_LOG, + want: true, + }, + { + name: "other table missing", + err: moerr.NewNoSuchTable(ctx, catalog.MO_CATALOG, "other_table"), + tableName: catalog.MO_CCPR_DBS, + want: false, + }, + { + name: "unrelated parse error", + err: moerr.NewParseErrorNoCtx("syntax error"), + tableName: catalog.MO_CCPR_TABLES, + want: false, + }, + { + name: "other error code mentioning table", + err: moerr.NewInternalErrorNoCtx(`table "mo_ccpr_tables" does not exist`), + tableName: catalog.MO_CCPR_TABLES, + want: false, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + require.Equal(t, tc.want, isMissingCCPRCatalogError(tc.err, tc.tableName)) + }) + } +} + func TestTableScopedDDLDatabaseEOBMapsToNoSuchTable(t *testing.T) { newCompileWithStubEngine := func(t *testing.T, eng *stubEngine, sql string) *Compile { t.Helper() diff --git a/pkg/sql/compile/operator.go b/pkg/sql/compile/operator.go index 33a8348cc1f4a..d0ddb48bea720 100644 --- a/pkg/sql/compile/operator.go +++ b/pkg/sql/compile/operator.go @@ -330,6 +330,9 @@ func dupOperator(sourceOp vm.Operator, index int, maxParallel int) vm.Operator { op.Attrs = t.Attrs op.Params = t.Params op.IsSingle = t.IsSingle + op.Limit = t.Limit + op.RuntimeFilterSpecs = t.RuntimeFilterSpecs + op.IndexReaderParam = t.IndexReaderParam op.SetInfo(&info) if op.FuncName == "generate_series" { op.GenerateSeriesCtrNumState(t.OffsetTotal[index][0], t.OffsetTotal[index][1], t.GetGenerateSeriesCtrNumStateStep(), t.OffsetTotal[index][0]) @@ -529,6 +532,9 @@ func dupOperator(sourceOp vm.Operator, index int, maxParallel int) vm.Operator { op.TableFunction.Attrs = t.TableFunction.Attrs op.TableFunction.Params = t.TableFunction.Params op.TableFunction.IsSingle = t.TableFunction.IsSingle + op.TableFunction.Limit = t.TableFunction.Limit + op.TableFunction.RuntimeFilterSpecs = t.TableFunction.RuntimeFilterSpecs + op.TableFunction.IndexReaderParam = t.TableFunction.IndexReaderParam op.TableFunction.SetInfo(&info) op.SetInfo(&info) return op diff --git a/pkg/sql/compile/operator_test.go b/pkg/sql/compile/operator_test.go index 1c223f5bff3e5..f43a83b7b5517 100644 --- a/pkg/sql/compile/operator_test.go +++ b/pkg/sql/compile/operator_test.go @@ -27,6 +27,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/sql/colexec/multi_update" "github.com/matrixorigin/matrixone/pkg/sql/colexec/shuffle" "github.com/matrixorigin/matrixone/pkg/sql/colexec/shuffleV2" + "github.com/matrixorigin/matrixone/pkg/sql/colexec/table_function" plan2 "github.com/matrixorigin/matrixone/pkg/sql/plan" "github.com/stretchr/testify/require" ) @@ -138,3 +139,20 @@ func TestDupOperatorShuffleV2SharesPoolAcrossWorkers(t *testing.T) { require.Same(t, op.GetShufflePool(), dup1.GetShufflePool()) require.Same(t, op.GetShufflePool(), dup2.GetShufflePool()) } + +func TestDupOperatorTableFunctionPreservesProbeState(t *testing.T) { + op := table_function.NewArgument() + op.FuncName = "ivf_search" + op.RuntimeFilterSpecs = []*plan.RuntimeFilterSpec{ + {Tag: 8, UseBloomFilter: true}, + } + op.IndexReaderParam = &plan.IndexReaderParam{ + Limit: plan2.MakePlan2Uint64ConstExprWithType(7), + OrigFuncName: "l2_distance", + } + + dup := dupOperator(op, 0, 1).(*table_function.TableFunction) + require.Equal(t, op.RuntimeFilterSpecs, dup.RuntimeFilterSpecs) + require.Equal(t, uint64(7), dup.IndexReaderParam.GetLimit().GetLit().GetU64Val()) + require.Equal(t, "l2_distance", dup.IndexReaderParam.GetOrigFuncName()) +} diff --git a/pkg/sql/compile/remoterun.go b/pkg/sql/compile/remoterun.go index b469e4e4787b8..6f1262f2a548d 100644 --- a/pkg/sql/compile/remoterun.go +++ b/pkg/sql/compile/remoterun.go @@ -641,13 +641,16 @@ func convertToPipelineInstruction(op vm.Operator, proc *process.Process, ctx *sc } case *table_function.TableFunction: in.TableFunction = &pipeline.TableFunction{ - Attrs: t.Attrs, - Rets: t.Rets, - Args: t.Args, - Params: t.Params, - Name: t.FuncName, - IsSingle: t.IsSingle, + Attrs: t.Attrs, + Rets: t.Rets, + Args: t.Args, + Params: t.Params, + Name: t.FuncName, + IsSingle: t.IsSingle, + RuntimeFilterSpecs: t.RuntimeFilterSpecs, + IndexReaderParam: t.IndexReaderParam, } + in.Limit = t.Limit case *external.External: in.ExternalScan = &pipeline.ExternalScan{ @@ -763,12 +766,14 @@ func convertToPipelineInstruction(op vm.Operator, proc *process.Process, ctx *sc Types: convertToPlanTypes(t.Typs), } in.TableFunction = &pipeline.TableFunction{ - Attrs: t.TableFunction.Attrs, - Rets: t.TableFunction.Rets, - Args: t.TableFunction.Args, - Params: t.TableFunction.Params, - Name: t.TableFunction.FuncName, - IsSingle: t.TableFunction.IsSingle, + Attrs: t.TableFunction.Attrs, + Rets: t.TableFunction.Rets, + Args: t.TableFunction.Args, + Params: t.TableFunction.Params, + Name: t.TableFunction.FuncName, + IsSingle: t.TableFunction.IsSingle, + RuntimeFilterSpecs: t.TableFunction.RuntimeFilterSpecs, + IndexReaderParam: t.TableFunction.IndexReaderParam, } case *multi_update.MultiUpdate: updateCtxList := make([]*plan.UpdateCtx, len(t.MultiUpdateCtx)) @@ -1094,6 +1099,9 @@ func convertToVmOperator(opr *pipeline.Instruction, ctx *scopeContext, eng engin arg.FuncName = opr.TableFunction.Name arg.Params = opr.TableFunction.Params arg.IsSingle = opr.TableFunction.IsSingle + arg.Limit = opr.Limit + arg.RuntimeFilterSpecs = opr.TableFunction.RuntimeFilterSpecs + arg.IndexReaderParam = opr.TableFunction.IndexReaderParam op = arg case vm.External: t := opr.GetExternalScan() @@ -1217,6 +1225,8 @@ func convertToVmOperator(opr *pipeline.Instruction, ctx *scopeContext, eng engin arg.TableFunction.FuncName = opr.TableFunction.Name arg.TableFunction.Params = opr.TableFunction.Params arg.TableFunction.IsSingle = opr.TableFunction.IsSingle + arg.TableFunction.RuntimeFilterSpecs = opr.TableFunction.RuntimeFilterSpecs + arg.TableFunction.IndexReaderParam = opr.TableFunction.IndexReaderParam op = arg case vm.MultiUpdate: arg := multi_update.NewArgument() diff --git a/pkg/sql/compile/remoterun_test.go b/pkg/sql/compile/remoterun_test.go index a34f4c4f14797..2bc02e313ff1f 100644 --- a/pkg/sql/compile/remoterun_test.go +++ b/pkg/sql/compile/remoterun_test.go @@ -33,6 +33,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/defines" mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" "github.com/matrixorigin/matrixone/pkg/pb/pipeline" + planpb "github.com/matrixorigin/matrixone/pkg/pb/plan" "github.com/matrixorigin/matrixone/pkg/pb/txn" "github.com/matrixorigin/matrixone/pkg/sql/colexec" "github.com/matrixorigin/matrixone/pkg/sql/colexec/aggexec" @@ -345,6 +346,38 @@ func Test_DMLOperatorSerializationRoundtrip(t *testing.T) { require.Equal(t, "pk", restoredOp.PkName) }) + t.Run("TableFunction_Limit", func(t *testing.T) { + op := table_function.NewArgument() + op.FuncName = "ivf_search" + op.Limit = plan.MakePlan2Uint64ConstExprWithType(4) + op.RuntimeFilterSpecs = []*planpb.RuntimeFilterSpec{ + {Tag: 9, UseBloomFilter: true}, + } + op.IndexReaderParam = &planpb.IndexReaderParam{ + Limit: plan.MakePlan2Uint64ConstExprWithType(4), + OrigFuncName: "l2_distance", + } + + _, pipeInstr, err := convertToPipelineInstruction(op, proc, ctx, 1) + require.NoError(t, err) + require.Equal(t, uint64(4), pipeInstr.Limit.GetLit().GetU64Val()) + require.Len(t, pipeInstr.TableFunction.RuntimeFilterSpecs, 1) + require.NotNil(t, pipeInstr.TableFunction.IndexReaderParam) + + data, err := pipeInstr.Marshal() + require.NoError(t, err) + var decoded pipeline.Instruction + require.NoError(t, decoded.Unmarshal(data)) + + restored, err := convertToVmOperator(&decoded, ctx, nil) + require.NoError(t, err) + restoredOp := restored.(*table_function.TableFunction) + require.Equal(t, uint64(4), restoredOp.Limit.GetLit().GetU64Val()) + require.Equal(t, op.RuntimeFilterSpecs, restoredOp.RuntimeFilterSpecs) + require.Equal(t, uint64(4), restoredOp.IndexReaderParam.GetLimit().GetLit().GetU64Val()) + require.Equal(t, "l2_distance", restoredOp.IndexReaderParam.GetOrigFuncName()) + }) + t.Run("MultiUpdate_PartitionCols", func(t *testing.T) { op := &multi_update.MultiUpdate{ MultiUpdateCtx: []*multi_update.MultiUpdateCtx{ diff --git a/pkg/sql/compile/types.go b/pkg/sql/compile/types.go index df9a36db99604..b9ebf4be77384 100644 --- a/pkg/sql/compile/types.go +++ b/pkg/sql/compile/types.go @@ -350,6 +350,8 @@ type fuzzyCheck struct { type MultiTableIndex struct { IndexAlgo string + // Compile DDL/ALTER paths keep physical index defs grouped by table type. + // They should not infer logical INCLUDE metadata from one physical def. IndexDefs map[string]*plan.IndexDef } diff --git a/pkg/sql/compile/util.go b/pkg/sql/compile/util.go index fac150b430c16..39b8d9f71505e 100644 --- a/pkg/sql/compile/util.go +++ b/pkg/sql/compile/util.go @@ -109,6 +109,11 @@ var ( dropTableBeforeDropDatabase = "drop table if exists `%v`.`%v`;" ) +func escapeSQLStringLiteral(s string) string { + s = strings.ReplaceAll(s, `\`, `\\`) + return strings.ReplaceAll(s, `'`, `''`) +} + var ( insertIntoFullTextIndexTableFormat = "INSERT INTO `%s`.`%s` SELECT f.* FROM `%s`.`%s` AS %s CROSS APPLY fulltext_index_tokenize('%s', %s, %s) AS f;" ) @@ -260,8 +265,8 @@ func genInsertMOIndexesSql(eg engine.Engine, proc *process.Process, databaseId s fmt.Fprintf(buffer, "'%s', ", algorithm_table_type) //8. algorithm_params - var algorithm_params = indexDef.IndexAlgoParams - fmt.Fprintf(buffer, "'%s', ", algorithm_params) + var algorithmParams = indexDef.IndexAlgoParams + fmt.Fprintf(buffer, "'%s', ", escapeSQLStringLiteral(algorithmParams)) // 9. index visible fmt.Fprintf(buffer, "%d, ", INDEX_VISIBLE_YES) @@ -289,7 +294,18 @@ func genInsertMOIndexesSql(eg engine.Engine, proc *process.Process, databaseId s // 15. index vec_index_table if indexDef.TableExist { - fmt.Fprintf(buffer, "'%s')", indexDef.IndexTableName) + fmt.Fprintf(buffer, "'%s', ", indexDef.IndexTableName) + } else { + fmt.Fprintf(buffer, "%s, ", NULL_VALUE) + } + + // 16. index vec_included_columns + includedColumns, err := catalog.MarshalIncludeColumnsValue(indexDef.IncludedColumns) + if err != nil { + return "", err + } + if includedColumns != "" { + fmt.Fprintf(buffer, "'%s')", escapeSQLStringLiteral(includedColumns)) } else { fmt.Fprintf(buffer, "%s)", NULL_VALUE) } @@ -352,6 +368,9 @@ func genInsertMOIndexesSql(eg engine.Engine, proc *process.Process, databaseId s fmt.Fprintf(buffer, "%s, ", NULL_VALUE) // 15. index vec_index_table + fmt.Fprintf(buffer, "%s, ", NULL_VALUE) + + // 16. index vec_included_columns fmt.Fprintf(buffer, "%s)", NULL_VALUE) } } diff --git a/pkg/sql/compile/util_mo_indexes_test.go b/pkg/sql/compile/util_mo_indexes_test.go new file mode 100644 index 0000000000000..79a9891422606 --- /dev/null +++ b/pkg/sql/compile/util_mo_indexes_test.go @@ -0,0 +1,66 @@ +// Copyright 2021 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 ( + "testing" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + + "github.com/matrixorigin/matrixone/pkg/catalog" + mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" + "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/testutil" + "github.com/matrixorigin/matrixone/pkg/vm/engine" +) + +func TestGenInsertMOIndexesSqlIncludesIncludedColumns(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockEngine := mock_frontend.NewMockEngine(ctrl) + mockEngine.EXPECT().AllocateIDByKey(gomock.Any(), ALLOCID_INDEX_KEY).Return(uint64(272510), nil).Times(1) + + proc := testutil.NewProc(t) + tableDef := &plan.TableDef{ + Name2ColIndex: map[string]int32{"embedding": 0}, + Cols: []*plan.ColDef{ + {Name: "embedding", OriginName: "embedding"}, + }, + } + ct := &engine.ConstraintDef{ + Cts: []engine.Constraint{ + &engine.IndexDef{ + Indexes: []*plan.IndexDef{ + { + IndexName: "idx_vec", + Parts: []string{"embedding"}, + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Entries, + IndexAlgoParams: `{"lists":"2","op_type":"vector_l2_ops"}`, + IndexTableName: "__mo_index_entries_idx_vec", + TableExist: true, + IncludedColumns: []string{"title", "category"}, + }, + }, + }, + }, + } + + sql, err := genInsertMOIndexesSql(mockEngine, proc, "123456", 272464, ct, tableDef) + require.NoError(t, err) + require.Contains(t, sql, `'__mo_index_entries_idx_vec', '["title","category"]')`) +} diff --git a/pkg/sql/parsers/dialect/mysql/keywords.go b/pkg/sql/parsers/dialect/mysql/keywords.go index d073061bf6c3d..5148baf3c04da 100644 --- a/pkg/sql/parsers/dialect/mysql/keywords.go +++ b/pkg/sql/parsers/dialect/mysql/keywords.go @@ -287,6 +287,7 @@ func init() { "linestring": LINESTRING, "load": LOAD, "import": IMPORT, + "include": INCLUDE, "discard": DISCARD, "localtime": LOCALTIME, "localtimestamp": LOCALTIMESTAMP, diff --git a/pkg/sql/parsers/dialect/mysql/mysql_sql.go b/pkg/sql/parsers/dialect/mysql/mysql_sql.go index 24f4203df21a9..c783cb18f34c3 100644 --- a/pkg/sql/parsers/dialect/mysql/mysql_sql.go +++ b/pkg/sql/parsers/dialect/mysql/mysql_sql.go @@ -394,319 +394,321 @@ const M = 57717 const ASYNC = 57718 const FORCE_SYNC = 57719 const AUTO_UPDATE = 57720 -const EXPIRE = 57721 -const ACCOUNT = 57722 -const ACCOUNTS = 57723 -const UNLOCK = 57724 -const DAY = 57725 -const NEVER = 57726 -const PUMP = 57727 -const MYSQL_COMPATIBILITY_MODE = 57728 -const UNIQUE_CHECK_ON_AUTOINCR = 57729 -const MODIFY = 57730 -const CHANGE = 57731 -const SECOND = 57732 -const ASCII = 57733 -const COALESCE = 57734 -const COLLATION = 57735 -const HOUR = 57736 -const MICROSECOND = 57737 -const MINUTE = 57738 -const MONTH = 57739 -const QUARTER = 57740 -const REPEAT = 57741 -const REVERSE = 57742 -const ROW_COUNT = 57743 -const WEEK = 57744 -const REVOKE = 57745 -const FUNCTION = 57746 -const PRIVILEGES = 57747 -const TABLESPACE = 57748 -const EXECUTE = 57749 -const SUPER = 57750 -const GRANT = 57751 -const OPTION = 57752 -const REFERENCES = 57753 -const REPLICATION = 57754 -const SLAVE = 57755 -const CLIENT = 57756 -const USAGE = 57757 -const RELOAD = 57758 -const FILE = 57759 -const FILES = 57760 -const TEMPORARY = 57761 -const ROUTINE = 57762 -const EVENT = 57763 -const SHUTDOWN = 57764 -const NULLX = 57765 -const AUTO_INCREMENT = 57766 -const APPROXNUM = 57767 -const ENGINES = 57768 -const LOW_CARDINALITY = 57769 -const AUTOEXTEND_SIZE = 57770 -const ADMIN_NAME = 57771 -const RANDOM = 57772 -const SUSPEND = 57773 -const ATTRIBUTE = 57774 -const HISTORY = 57775 -const REUSE = 57776 -const CURRENT = 57777 -const OPTIONAL = 57778 -const FAILED_LOGIN_ATTEMPTS = 57779 -const PASSWORD_LOCK_TIME = 57780 -const UNBOUNDED = 57781 -const SECONDARY = 57782 -const RESTRICTED = 57783 -const USER = 57784 -const IDENTIFIED = 57785 -const CIPHER = 57786 -const ISSUER = 57787 -const X509 = 57788 -const SUBJECT = 57789 -const SAN = 57790 -const REQUIRE = 57791 -const SSL = 57792 -const NONE = 57793 -const PASSWORD = 57794 -const SHARED = 57795 -const EXCLUSIVE = 57796 -const MAX_QUERIES_PER_HOUR = 57797 -const MAX_UPDATES_PER_HOUR = 57798 -const MAX_CONNECTIONS_PER_HOUR = 57799 -const MAX_USER_CONNECTIONS = 57800 -const FORMAT = 57801 -const VERBOSE = 57802 -const CONNECTION = 57803 -const TRIGGERS = 57804 -const PROFILES = 57805 -const LOAD = 57806 -const INLINE = 57807 -const INFILE = 57808 -const TERMINATED = 57809 -const OPTIONALLY = 57810 -const ENCLOSED = 57811 -const ESCAPED = 57812 -const STARTING = 57813 -const LINES = 57814 -const ROWS = 57815 -const IMPORT = 57816 -const DISCARD = 57817 -const JSONTYPE = 57818 -const MODUMP = 57819 -const OVER = 57820 -const PRECEDING = 57821 -const FOLLOWING = 57822 -const GROUPS = 57823 -const DATABASES = 57824 -const TABLES = 57825 -const SEQUENCES = 57826 -const EXTENDED = 57827 -const FULL = 57828 -const PROCESSLIST = 57829 -const FIELDS = 57830 -const COLUMNS = 57831 -const OPEN = 57832 -const ERRORS = 57833 -const WARNINGS = 57834 -const INDEXES = 57835 -const SCHEMAS = 57836 -const NODE = 57837 -const LOCKS = 57838 -const ROLES = 57839 -const RULE = 57840 -const RULES = 57841 -const TABLE_NUMBER = 57842 -const COLUMN_NUMBER = 57843 -const TABLE_VALUES = 57844 -const TABLE_SIZE = 57845 -const NAMES = 57846 -const GLOBAL = 57847 -const PERSIST = 57848 -const SESSION = 57849 -const ISOLATION = 57850 -const LEVEL = 57851 -const READ = 57852 -const WRITE = 57853 -const ONLY = 57854 -const REPEATABLE = 57855 -const COMMITTED = 57856 -const UNCOMMITTED = 57857 -const SERIALIZABLE = 57858 -const LOCAL = 57859 -const EVENTS = 57860 -const PLUGINS = 57861 -const CURRENT_TIMESTAMP = 57862 -const DATABASE = 57863 -const CURRENT_TIME = 57864 -const LOCALTIME = 57865 -const LOCALTIMESTAMP = 57866 -const UTC_DATE = 57867 -const UTC_TIME = 57868 -const UTC_TIMESTAMP = 57869 -const REPLACE = 57870 -const CONVERT = 57871 -const SEPARATOR = 57872 -const TIMESTAMPDIFF = 57873 -const TIMESTAMPADD = 57874 -const CURRENT_DATE = 57875 -const CURRENT_USER = 57876 -const CURRENT_ROLE = 57877 -const SECOND_MICROSECOND = 57878 -const MINUTE_MICROSECOND = 57879 -const MINUTE_SECOND = 57880 -const HOUR_MICROSECOND = 57881 -const HOUR_SECOND = 57882 -const HOUR_MINUTE = 57883 -const DAY_MICROSECOND = 57884 -const DAY_SECOND = 57885 -const DAY_MINUTE = 57886 -const DAY_HOUR = 57887 -const YEAR_MONTH = 57888 -const SQL_TSI_HOUR = 57889 -const SQL_TSI_DAY = 57890 -const SQL_TSI_WEEK = 57891 -const SQL_TSI_MONTH = 57892 -const SQL_TSI_QUARTER = 57893 -const SQL_TSI_YEAR = 57894 -const SQL_TSI_SECOND = 57895 -const SQL_TSI_MINUTE = 57896 -const RECURSIVE = 57897 -const CONFIG = 57898 -const DRAINER = 57899 -const SOURCE = 57900 -const STREAM = 57901 -const HEADERS = 57902 -const CONNECTOR = 57903 -const CONNECTORS = 57904 -const DAEMON = 57905 -const PAUSE = 57906 -const CANCEL = 57907 -const TASK = 57908 -const RESUME = 57909 -const MATCH = 57910 -const AGAINST = 57911 -const BOOLEAN = 57912 -const LANGUAGE = 57913 -const QUERY = 57914 -const EXPANSION = 57915 -const WITHOUT = 57916 -const VALIDATION = 57917 -const UPGRADE = 57918 -const RETRY = 57919 -const ADDDATE = 57920 -const BIT_AND = 57921 -const BIT_OR = 57922 -const BIT_XOR = 57923 -const CAST = 57924 -const COUNT = 57925 -const APPROX_COUNT = 57926 -const APPROX_COUNT_DISTINCT = 57927 -const SERIAL_EXTRACT = 57928 -const APPROX_PERCENTILE = 57929 -const CURDATE = 57930 -const CURTIME = 57931 -const DATE_ADD = 57932 -const DATE_SUB = 57933 -const EXTRACT = 57934 -const GROUP_CONCAT = 57935 -const MAX = 57936 -const MID = 57937 -const MIN = 57938 -const NOW = 57939 -const POSITION = 57940 -const SESSION_USER = 57941 -const STD = 57942 -const STDDEV = 57943 -const MEDIAN = 57944 -const CLUSTER_CENTERS = 57945 -const KMEANS = 57946 -const STDDEV_POP = 57947 -const STDDEV_SAMP = 57948 -const SUBDATE = 57949 -const SUBSTR = 57950 -const SUBSTRING = 57951 -const SUM = 57952 -const SYSDATE = 57953 -const SYSTEM_USER = 57954 -const TRANSLATE = 57955 -const TRIM = 57956 -const VARIANCE = 57957 -const VAR_POP = 57958 -const VAR_SAMP = 57959 -const AVG = 57960 -const RANK = 57961 -const ROW_NUMBER = 57962 -const DENSE_RANK = 57963 -const CUME_DIST = 57964 -const BIT_CAST = 57965 -const LAG = 57966 -const LEAD = 57967 -const FIRST_VALUE = 57968 -const LAST_VALUE = 57969 -const NTH_VALUE = 57970 -const NTILE = 57971 -const PERCENT_RANK = 57972 -const BITMAP_BIT_POSITION = 57973 -const BITMAP_BUCKET_NUMBER = 57974 -const BITMAP_COUNT = 57975 -const BITMAP_CONSTRUCT_AGG = 57976 -const BITMAP_OR_AGG = 57977 -const GET_FORMAT = 57978 -const SRID = 57979 -const NEXTVAL = 57980 -const SETVAL = 57981 -const CURRVAL = 57982 -const LASTVAL = 57983 -const ROW = 57984 -const OUTFILE = 57985 -const HEADER = 57986 -const MAX_FILE_SIZE = 57987 -const FORCE_QUOTE = 57988 -const PARALLEL = 57989 -const STRICT = 57990 -const SPLITSIZE = 57991 -const UNUSED = 57992 -const BINDINGS = 57993 -const GENERATED = 57994 -const ALWAYS = 57995 -const STORED = 57996 -const VIRTUAL = 57997 -const DO = 57998 -const DECLARE = 57999 -const LOOP = 58000 -const WHILE = 58001 -const LEAVE = 58002 -const ITERATE = 58003 -const UNTIL = 58004 -const CALL = 58005 -const PREV = 58006 -const SLIDING = 58007 -const FILL = 58008 -const SPBEGIN = 58009 -const BACKEND = 58010 -const SERVERS = 58011 -const HANDLER = 58012 -const PERCENT = 58013 -const SAMPLE = 58014 -const MO_TS = 58015 -const PITR = 58016 -const RECOVERY_WINDOW = 58017 -const INTERNAL = 58018 -const CDC = 58019 -const GROUPING = 58020 -const SETS = 58021 -const CUBE = 58022 -const ROLLUP = 58023 -const LOGSERVICE = 58024 -const REPLICAS = 58025 -const STORES = 58026 -const SETTINGS = 58027 -const KILL = 58028 -const BACKUP = 58029 -const FILESYSTEM = 58030 -const PARALLELISM = 58031 -const RESTORE = 58032 -const QUERY_RESULT = 58033 +const QUANTIZATION = 57721 +const INCLUDE = 57722 +const EXPIRE = 57723 +const ACCOUNT = 57724 +const ACCOUNTS = 57725 +const UNLOCK = 57726 +const DAY = 57727 +const NEVER = 57728 +const PUMP = 57729 +const MYSQL_COMPATIBILITY_MODE = 57730 +const UNIQUE_CHECK_ON_AUTOINCR = 57731 +const MODIFY = 57732 +const CHANGE = 57733 +const SECOND = 57734 +const ASCII = 57735 +const COALESCE = 57736 +const COLLATION = 57737 +const HOUR = 57738 +const MICROSECOND = 57739 +const MINUTE = 57740 +const MONTH = 57741 +const QUARTER = 57742 +const REPEAT = 57743 +const REVERSE = 57744 +const ROW_COUNT = 57745 +const WEEK = 57746 +const REVOKE = 57747 +const FUNCTION = 57748 +const PRIVILEGES = 57749 +const TABLESPACE = 57750 +const EXECUTE = 57751 +const SUPER = 57752 +const GRANT = 57753 +const OPTION = 57754 +const REFERENCES = 57755 +const REPLICATION = 57756 +const SLAVE = 57757 +const CLIENT = 57758 +const USAGE = 57759 +const RELOAD = 57760 +const FILE = 57761 +const FILES = 57762 +const TEMPORARY = 57763 +const ROUTINE = 57764 +const EVENT = 57765 +const SHUTDOWN = 57766 +const NULLX = 57767 +const AUTO_INCREMENT = 57768 +const APPROXNUM = 57769 +const ENGINES = 57770 +const LOW_CARDINALITY = 57771 +const AUTOEXTEND_SIZE = 57772 +const ADMIN_NAME = 57773 +const RANDOM = 57774 +const SUSPEND = 57775 +const ATTRIBUTE = 57776 +const HISTORY = 57777 +const REUSE = 57778 +const CURRENT = 57779 +const OPTIONAL = 57780 +const FAILED_LOGIN_ATTEMPTS = 57781 +const PASSWORD_LOCK_TIME = 57782 +const UNBOUNDED = 57783 +const SECONDARY = 57784 +const RESTRICTED = 57785 +const USER = 57786 +const IDENTIFIED = 57787 +const CIPHER = 57788 +const ISSUER = 57789 +const X509 = 57790 +const SUBJECT = 57791 +const SAN = 57792 +const REQUIRE = 57793 +const SSL = 57794 +const NONE = 57795 +const PASSWORD = 57796 +const SHARED = 57797 +const EXCLUSIVE = 57798 +const MAX_QUERIES_PER_HOUR = 57799 +const MAX_UPDATES_PER_HOUR = 57800 +const MAX_CONNECTIONS_PER_HOUR = 57801 +const MAX_USER_CONNECTIONS = 57802 +const FORMAT = 57803 +const VERBOSE = 57804 +const CONNECTION = 57805 +const TRIGGERS = 57806 +const PROFILES = 57807 +const LOAD = 57808 +const INLINE = 57809 +const INFILE = 57810 +const TERMINATED = 57811 +const OPTIONALLY = 57812 +const ENCLOSED = 57813 +const ESCAPED = 57814 +const STARTING = 57815 +const LINES = 57816 +const ROWS = 57817 +const IMPORT = 57818 +const DISCARD = 57819 +const JSONTYPE = 57820 +const MODUMP = 57821 +const OVER = 57822 +const PRECEDING = 57823 +const FOLLOWING = 57824 +const GROUPS = 57825 +const DATABASES = 57826 +const TABLES = 57827 +const SEQUENCES = 57828 +const EXTENDED = 57829 +const FULL = 57830 +const PROCESSLIST = 57831 +const FIELDS = 57832 +const COLUMNS = 57833 +const OPEN = 57834 +const ERRORS = 57835 +const WARNINGS = 57836 +const INDEXES = 57837 +const SCHEMAS = 57838 +const NODE = 57839 +const LOCKS = 57840 +const ROLES = 57841 +const RULE = 57842 +const RULES = 57843 +const TABLE_NUMBER = 57844 +const COLUMN_NUMBER = 57845 +const TABLE_VALUES = 57846 +const TABLE_SIZE = 57847 +const NAMES = 57848 +const GLOBAL = 57849 +const PERSIST = 57850 +const SESSION = 57851 +const ISOLATION = 57852 +const LEVEL = 57853 +const READ = 57854 +const WRITE = 57855 +const ONLY = 57856 +const REPEATABLE = 57857 +const COMMITTED = 57858 +const UNCOMMITTED = 57859 +const SERIALIZABLE = 57860 +const LOCAL = 57861 +const EVENTS = 57862 +const PLUGINS = 57863 +const CURRENT_TIMESTAMP = 57864 +const DATABASE = 57865 +const CURRENT_TIME = 57866 +const LOCALTIME = 57867 +const LOCALTIMESTAMP = 57868 +const UTC_DATE = 57869 +const UTC_TIME = 57870 +const UTC_TIMESTAMP = 57871 +const REPLACE = 57872 +const CONVERT = 57873 +const SEPARATOR = 57874 +const TIMESTAMPDIFF = 57875 +const TIMESTAMPADD = 57876 +const CURRENT_DATE = 57877 +const CURRENT_USER = 57878 +const CURRENT_ROLE = 57879 +const SECOND_MICROSECOND = 57880 +const MINUTE_MICROSECOND = 57881 +const MINUTE_SECOND = 57882 +const HOUR_MICROSECOND = 57883 +const HOUR_SECOND = 57884 +const HOUR_MINUTE = 57885 +const DAY_MICROSECOND = 57886 +const DAY_SECOND = 57887 +const DAY_MINUTE = 57888 +const DAY_HOUR = 57889 +const YEAR_MONTH = 57890 +const SQL_TSI_HOUR = 57891 +const SQL_TSI_DAY = 57892 +const SQL_TSI_WEEK = 57893 +const SQL_TSI_MONTH = 57894 +const SQL_TSI_QUARTER = 57895 +const SQL_TSI_YEAR = 57896 +const SQL_TSI_SECOND = 57897 +const SQL_TSI_MINUTE = 57898 +const RECURSIVE = 57899 +const CONFIG = 57900 +const DRAINER = 57901 +const SOURCE = 57902 +const STREAM = 57903 +const HEADERS = 57904 +const CONNECTOR = 57905 +const CONNECTORS = 57906 +const DAEMON = 57907 +const PAUSE = 57908 +const CANCEL = 57909 +const TASK = 57910 +const RESUME = 57911 +const MATCH = 57912 +const AGAINST = 57913 +const BOOLEAN = 57914 +const LANGUAGE = 57915 +const QUERY = 57916 +const EXPANSION = 57917 +const WITHOUT = 57918 +const VALIDATION = 57919 +const UPGRADE = 57920 +const RETRY = 57921 +const ADDDATE = 57922 +const BIT_AND = 57923 +const BIT_OR = 57924 +const BIT_XOR = 57925 +const CAST = 57926 +const COUNT = 57927 +const APPROX_COUNT = 57928 +const APPROX_COUNT_DISTINCT = 57929 +const SERIAL_EXTRACT = 57930 +const APPROX_PERCENTILE = 57931 +const CURDATE = 57932 +const CURTIME = 57933 +const DATE_ADD = 57934 +const DATE_SUB = 57935 +const EXTRACT = 57936 +const GROUP_CONCAT = 57937 +const MAX = 57938 +const MID = 57939 +const MIN = 57940 +const NOW = 57941 +const POSITION = 57942 +const SESSION_USER = 57943 +const STD = 57944 +const STDDEV = 57945 +const MEDIAN = 57946 +const CLUSTER_CENTERS = 57947 +const KMEANS = 57948 +const STDDEV_POP = 57949 +const STDDEV_SAMP = 57950 +const SUBDATE = 57951 +const SUBSTR = 57952 +const SUBSTRING = 57953 +const SUM = 57954 +const SYSDATE = 57955 +const SYSTEM_USER = 57956 +const TRANSLATE = 57957 +const TRIM = 57958 +const VARIANCE = 57959 +const VAR_POP = 57960 +const VAR_SAMP = 57961 +const AVG = 57962 +const RANK = 57963 +const ROW_NUMBER = 57964 +const DENSE_RANK = 57965 +const CUME_DIST = 57966 +const BIT_CAST = 57967 +const LAG = 57968 +const LEAD = 57969 +const FIRST_VALUE = 57970 +const LAST_VALUE = 57971 +const NTH_VALUE = 57972 +const NTILE = 57973 +const PERCENT_RANK = 57974 +const BITMAP_BIT_POSITION = 57975 +const BITMAP_BUCKET_NUMBER = 57976 +const BITMAP_COUNT = 57977 +const BITMAP_CONSTRUCT_AGG = 57978 +const BITMAP_OR_AGG = 57979 +const GET_FORMAT = 57980 +const SRID = 57981 +const NEXTVAL = 57982 +const SETVAL = 57983 +const CURRVAL = 57984 +const LASTVAL = 57985 +const ROW = 57986 +const OUTFILE = 57987 +const HEADER = 57988 +const MAX_FILE_SIZE = 57989 +const FORCE_QUOTE = 57990 +const PARALLEL = 57991 +const STRICT = 57992 +const SPLITSIZE = 57993 +const UNUSED = 57994 +const BINDINGS = 57995 +const GENERATED = 57996 +const ALWAYS = 57997 +const STORED = 57998 +const VIRTUAL = 57999 +const DO = 58000 +const DECLARE = 58001 +const LOOP = 58002 +const WHILE = 58003 +const LEAVE = 58004 +const ITERATE = 58005 +const UNTIL = 58006 +const CALL = 58007 +const PREV = 58008 +const SLIDING = 58009 +const FILL = 58010 +const SPBEGIN = 58011 +const BACKEND = 58012 +const SERVERS = 58013 +const HANDLER = 58014 +const PERCENT = 58015 +const SAMPLE = 58016 +const MO_TS = 58017 +const PITR = 58018 +const RECOVERY_WINDOW = 58019 +const INTERNAL = 58020 +const CDC = 58021 +const GROUPING = 58022 +const SETS = 58023 +const CUBE = 58024 +const ROLLUP = 58025 +const LOGSERVICE = 58026 +const REPLICAS = 58027 +const STORES = 58028 +const SETTINGS = 58029 +const KILL = 58030 +const BACKUP = 58031 +const FILESYSTEM = 58032 +const PARALLELISM = 58033 +const RESTORE = 58034 +const QUERY_RESULT = 58035 var yyToknames = [...]string{ "$end", @@ -1104,6 +1106,8 @@ var yyToknames = [...]string{ "ASYNC", "FORCE_SYNC", "AUTO_UPDATE", + "QUANTIZATION", + "INCLUDE", "EXPIRE", "ACCOUNT", "ACCOUNTS", @@ -1430,7 +1434,7 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line mysql_sql.y:13942 +//line mysql_sql.y:13958 //line yacctab:1 var yyExca = [...]int{ @@ -1442,289 +1446,281 @@ var yyExca = [...]int{ 24, 851, -2, 844, -1, 177, - 259, 1341, + 259, 1343, 261, 1197, - -2, 1258, + -2, 1260, -1, 206, 46, 664, 261, 664, 288, 671, 289, 671, - 510, 664, + 512, 664, -2, 702, -1, 246, - 712, 2167, + 714, 2170, -2, 559, - -1, 580, - 712, 2295, + -1, 581, + 714, 2298, -2, 428, - -1, 638, - 712, 2354, - -2, 426, -1, 639, - 712, 2355, - -2, 427, + 714, 2357, + -2, 426, -1, 640, - 712, 2356, + 714, 2358, + -2, 427, + -1, 641, + 714, 2359, -2, 429, - -1, 791, + -1, 792, 340, 195, - 482, 195, - 483, 195, - -2, 2058, - -1, 858, - 88, 1827, - -2, 2231, + 484, 195, + 485, 195, + -2, 2060, -1, 859, - 88, 1846, - -2, 2200, - -1, 863, - 88, 1847, - -2, 2230, - -1, 907, - 88, 1748, - -2, 2439, + 88, 1829, + -2, 2234, + -1, 860, + 88, 1848, + -2, 2203, + -1, 864, + 88, 1849, + -2, 2233, -1, 908, - 88, 1749, - -2, 2438, - -1, 909, 88, 1750, - -2, 2428, + -2, 2442, + -1, 909, + 88, 1751, + -2, 2441, -1, 910, - 88, 2400, - -2, 2421, + 88, 1752, + -2, 2431, -1, 911, - 88, 2401, - -2, 2422, + 88, 2403, + -2, 2424, -1, 912, - 88, 2402, - -2, 2430, + 88, 2404, + -2, 2425, -1, 913, - 88, 2403, - -2, 2410, + 88, 2405, + -2, 2433, -1, 914, - 88, 2404, - -2, 2419, + 88, 2406, + -2, 2413, -1, 915, - 88, 2405, - -2, 2431, + 88, 2407, + -2, 2422, -1, 916, - 88, 2406, - -2, 2432, + 88, 2408, + -2, 2434, -1, 917, - 88, 2407, - -2, 2437, + 88, 2409, + -2, 2435, -1, 918, - 88, 2408, - -2, 2442, + 88, 2410, + -2, 2440, -1, 919, - 88, 2409, - -2, 2443, + 88, 2411, + -2, 2445, -1, 920, - 88, 1823, - -2, 2269, + 88, 2412, + -2, 2446, -1, 921, - 88, 1824, - -2, 2038, - -1, 922, 88, 1825, - -2, 2278, - -1, 923, + -2, 2272, + -1, 922, 88, 1826, - -2, 2051, - -1, 925, - 88, 1829, - -2, 2060, - -1, 927, + -2, 2040, + -1, 923, + 88, 1827, + -2, 2281, + -1, 924, + 88, 1828, + -2, 2053, + -1, 926, 88, 1831, - -2, 2303, - -1, 929, - 88, 1834, - -2, 2081, - -1, 931, + -2, 2062, + -1, 928, + 88, 1833, + -2, 2306, + -1, 930, 88, 1836, - -2, 2315, + -2, 2083, -1, 932, - 88, 1837, - -2, 2314, - -1, 933, 88, 1838, - -2, 2129, - -1, 934, + -2, 2318, + -1, 933, 88, 1839, - -2, 2226, - -1, 937, - 88, 1842, - -2, 2326, - -1, 939, + -2, 2317, + -1, 934, + 88, 1840, + -2, 2132, + -1, 935, + 88, 1841, + -2, 2229, + -1, 938, 88, 1844, -2, 2329, -1, 940, - 88, 1845, - -2, 2331, + 88, 1846, + -2, 2332, -1, 941, - 88, 1848, - -2, 2338, + 88, 1847, + -2, 2334, -1, 942, - 88, 1849, - -2, 2209, - -1, 943, 88, 1850, - -2, 2256, - -1, 944, + -2, 2341, + -1, 943, 88, 1851, - -2, 2220, - -1, 945, + -2, 2212, + -1, 944, 88, 1852, - -2, 2246, - -1, 956, - 88, 1726, - -2, 2433, + -2, 2259, + -1, 945, + 88, 1853, + -2, 2223, + -1, 946, + 88, 1854, + -2, 2249, -1, 957, - 88, 1727, - -2, 2434, - -1, 958, 88, 1728, - -2, 2435, - -1, 1069, - 505, 702, - 506, 702, + -2, 2436, + -1, 958, + 88, 1729, + -2, 2437, + -1, 959, + 88, 1730, + -2, 2438, + -1, 1070, + 507, 702, + 508, 702, -2, 665, - -1, 1123, - 130, 2038, - 141, 2038, - 173, 2038, - -2, 2008, - -1, 1245, + -1, 1124, + 130, 2040, + 141, 2040, + 173, 2040, + -2, 2010, + -1, 1246, 24, 880, -2, 823, - -1, 1366, + -1, 1367, 11, 851, 24, 851, - -2, 1588, - -1, 1460, + -2, 1590, + -1, 1461, 24, 880, -2, 823, - -1, 1838, - 88, 1899, - -2, 2228, -1, 1839, - 88, 1900, - -2, 2229, - -1, 2518, + 88, 1901, + -2, 2231, + -1, 1840, + 88, 1902, + -2, 2232, + -1, 2519, 89, 1053, -2, 1059, - -1, 2535, - 113, 1250, - 160, 1250, - 207, 1250, - 210, 1250, - 301, 1250, - -2, 1243, - -1, 2712, + -1, 2536, + 113, 1252, + 160, 1252, + 207, 1252, + 210, 1252, + 301, 1252, + -2, 1245, + -1, 2713, 11, 851, 24, 851, -2, 994, - -1, 2746, - 89, 1994, - 174, 1994, - -2, 2211, -1, 2747, - 89, 1994, - 174, 1994, - -2, 2210, + 89, 1996, + 174, 1996, + -2, 2214, -1, 2748, - 89, 1962, - 174, 1962, - -2, 2197, + 89, 1996, + 174, 1996, + -2, 2213, -1, 2749, - 89, 1963, - 174, 1963, - -2, 2202, - -1, 2750, 89, 1964, 174, 1964, - -2, 2117, - -1, 2751, + -2, 2200, + -1, 2750, 89, 1965, 174, 1965, - -2, 2110, - -1, 2752, + -2, 2205, + -1, 2751, 89, 1966, 174, 1966, - -2, 2026, - -1, 2753, + -2, 2120, + -1, 2752, 89, 1967, 174, 1967, - -2, 2199, - -1, 2754, + -2, 2113, + -1, 2753, 89, 1968, 174, 1968, - -2, 2115, - -1, 2755, + -2, 2028, + -1, 2754, 89, 1969, 174, 1969, - -2, 2109, - -1, 2756, + -2, 2202, + -1, 2755, 89, 1970, 174, 1970, - -2, 2097, + -2, 2118, + -1, 2756, + 89, 1971, + 174, 1971, + -2, 2112, -1, 2757, - 89, 1994, - 174, 1994, - -2, 2098, + 89, 1972, + 174, 1972, + -2, 2100, -1, 2758, - 89, 1994, - 174, 1994, - -2, 2099, - -1, 2760, - 89, 1975, - 174, 1975, - -2, 2246, + 89, 1996, + 174, 1996, + -2, 2101, + -1, 2759, + 89, 1996, + 174, 1996, + -2, 2102, -1, 2761, - 89, 1952, - 174, 1952, - -2, 2231, + 89, 1977, + 174, 1977, + -2, 2249, -1, 2762, - 89, 1992, - 174, 1992, - -2, 2200, + 89, 1954, + 174, 1954, + -2, 2234, -1, 2763, - 89, 1992, - 174, 1992, - -2, 2230, + 89, 1994, + 174, 1994, + -2, 2203, -1, 2764, - 89, 1992, - 174, 1992, - -2, 2061, + 89, 1994, + 174, 1994, + -2, 2233, -1, 2765, - 89, 1990, - 174, 1990, - -2, 2220, + 89, 1994, + 174, 1994, + -2, 2063, -1, 2766, - 88, 1933, - 89, 1933, - 163, 1933, - 164, 1933, - 166, 1933, - 174, 1933, - -2, 2025, + 89, 1992, + 174, 1992, + -2, 2223, -1, 2767, - 88, 1934, - 89, 1934, - 163, 1934, - 164, 1934, - 166, 1934, - 174, 1934, - -2, 2027, - -1, 2768, 88, 1935, 89, 1935, 163, 1935, 164, 1935, 166, 1935, 174, 1935, - -2, 2274, + -2, 2027, + -1, 2768, + 88, 1936, + 89, 1936, + 163, 1936, + 164, 1936, + 166, 1936, + 174, 1936, + -2, 2029, -1, 2769, 88, 1937, 89, 1937, @@ -1732,7 +1728,7 @@ var yyExca = [...]int{ 164, 1937, 166, 1937, 174, 1937, - -2, 2201, + -2, 2277, -1, 2770, 88, 1939, 89, 1939, @@ -1740,7 +1736,7 @@ var yyExca = [...]int{ 164, 1939, 166, 1939, 174, 1939, - -2, 2177, + -2, 2204, -1, 2771, 88, 1941, 89, 1941, @@ -1748,7 +1744,7 @@ var yyExca = [...]int{ 164, 1941, 166, 1941, 174, 1941, - -2, 2116, + -2, 2180, -1, 2772, 88, 1943, 89, 1943, @@ -1756,15 +1752,15 @@ var yyExca = [...]int{ 164, 1943, 166, 1943, 174, 1943, - -2, 2093, + -2, 2119, -1, 2773, - 88, 1944, - 89, 1944, - 163, 1944, - 164, 1944, - 166, 1944, - 174, 1944, - -2, 2094, + 88, 1945, + 89, 1945, + 163, 1945, + 164, 1945, + 166, 1945, + 174, 1945, + -2, 2096, -1, 2774, 88, 1946, 89, 1946, @@ -1772,6557 +1768,6611 @@ var yyExca = [...]int{ 164, 1946, 166, 1946, 174, 1946, - -2, 2024, + -2, 2097, -1, 2775, - 89, 1997, - 163, 1997, - 164, 1997, - 166, 1997, - 174, 1997, - -2, 2066, + 88, 1948, + 89, 1948, + 163, 1948, + 164, 1948, + 166, 1948, + 174, 1948, + -2, 2026, -1, 2776, - 89, 1997, - 163, 1997, - 164, 1997, - 166, 1997, - 174, 1997, - -2, 2082, + 89, 1999, + 163, 1999, + 164, 1999, + 166, 1999, + 174, 1999, + -2, 2068, -1, 2777, - 89, 2000, - 163, 2000, - 164, 2000, - 166, 2000, - 174, 2000, - -2, 2062, + 89, 1999, + 163, 1999, + 164, 1999, + 166, 1999, + 174, 1999, + -2, 2084, -1, 2778, - 89, 2000, - 163, 2000, - 164, 2000, - 166, 2000, - 174, 2000, - -2, 2132, + 89, 2002, + 163, 2002, + 164, 2002, + 166, 2002, + 174, 2002, + -2, 2064, -1, 2779, - 89, 1997, - 163, 1997, - 164, 1997, - 166, 1997, - 174, 1997, - -2, 2159, + 89, 2002, + 163, 2002, + 164, 2002, + 166, 2002, + 174, 2002, + -2, 2135, -1, 2780, - 89, 1980, - 174, 1980, - -2, 2087, + 89, 1999, + 163, 1999, + 164, 1999, + 166, 1999, + 174, 1999, + -2, 2162, -1, 2781, - 89, 1981, - 174, 1981, - -2, 2146, - -1, 2782, 89, 1982, 174, 1982, - -2, 2107, - -1, 2783, + -2, 2089, + -1, 2782, 89, 1983, 174, 1983, - -2, 2147, - -1, 2784, + -2, 2149, + -1, 2783, 89, 1984, 174, 1984, - -2, 2088, - -1, 2785, + -2, 2110, + -1, 2784, 89, 1985, 174, 1985, - -2, 2121, - -1, 2786, + -2, 2150, + -1, 2785, 89, 1986, 174, 1986, - -2, 2120, - -1, 2787, + -2, 2090, + -1, 2786, 89, 1987, 174, 1987, - -2, 2122, - -1, 3032, - 113, 1250, - 160, 1250, - 207, 1250, - 210, 1250, - 301, 1250, - -2, 1244, - -1, 3059, + -2, 2124, + -1, 2787, + 89, 1988, + 174, 1988, + -2, 2123, + -1, 2788, + 89, 1989, + 174, 1989, + -2, 2125, + -1, 3033, + 113, 1252, + 160, 1252, + 207, 1252, + 210, 1252, + 301, 1252, + -2, 1246, + -1, 3060, 86, 765, 174, 765, - -2, 1456, - -1, 3513, - 210, 1250, - 325, 1551, - -2, 1517, - -1, 3733, - 113, 1250, - 160, 1250, - 207, 1250, - 210, 1250, - -2, 1397, - -1, 3737, - 113, 1250, - 160, 1250, - 207, 1250, - 210, 1250, - -2, 1397, - -1, 3752, + -2, 1458, + -1, 3514, + 210, 1252, + 325, 1553, + -2, 1519, + -1, 3734, + 113, 1252, + 160, 1252, + 207, 1252, + 210, 1252, + -2, 1399, + -1, 3738, + 113, 1252, + 160, 1252, + 207, 1252, + 210, 1252, + -2, 1399, + -1, 3753, 86, 765, 174, 765, - -2, 1456, - -1, 3773, - 210, 1250, - 325, 1551, - -2, 1518, - -1, 3915, + -2, 1458, + -1, 3774, + 210, 1252, + 325, 1553, + -2, 1520, + -1, 3916, 11, 851, 24, 851, - -2, 1588, - -1, 3962, - 113, 1250, - 160, 1250, - 207, 1250, - 210, 1250, - -2, 1398, - -1, 3990, - 89, 1359, - 174, 1359, - -2, 1250, - -1, 4176, - 89, 1359, - 174, 1359, - -2, 1250, - -1, 4377, - 89, 1363, - 174, 1363, - -2, 1250, - -1, 4431, - 89, 1364, - 174, 1364, - -2, 1250, + -2, 1590, + -1, 3963, + 113, 1252, + 160, 1252, + 207, 1252, + 210, 1252, + -2, 1400, + -1, 3991, + 89, 1361, + 174, 1361, + -2, 1252, + -1, 4179, + 89, 1361, + 174, 1361, + -2, 1252, + -1, 4384, + 89, 1365, + 174, 1365, + -2, 1252, + -1, 4439, + 89, 1366, + 174, 1366, + -2, 1252, } const yyPrivate = 57344 -const yyLast = 63784 +const yyLast = 64249 var yyAct = [...]int{ - 825, 801, 4480, 827, 4454, 3088, 235, 4472, 4387, 2145, - 1818, 1743, 4381, 3867, 3758, 4392, 4391, 4380, 4176, 810, - 3499, 3534, 4289, 4239, 4338, 3819, 2260, 4074, 3615, 4021, - 3787, 3082, 4154, 3400, 803, 1814, 4115, 3398, 1654, 4230, - 3862, 3616, 1402, 4266, 3949, 1884, 4175, 3704, 2987, 1744, - 685, 3613, 855, 3085, 3712, 4144, 2086, 3872, 4240, 3273, - 4242, 1246, 1581, 3970, 3718, 1122, 1871, 704, 2594, 3508, - 3062, 715, 3774, 3464, 3959, 2916, 715, 728, 737, 3204, - 3930, 737, 1821, 3422, 3964, 3447, 3738, 3671, 150, 1587, - 2823, 2247, 38, 3205, 2262, 3451, 3702, 220, 69, 2244, - 3111, 3177, 754, 3528, 3510, 3740, 3517, 2706, 2323, 3203, - 2992, 1886, 2286, 3665, 2209, 3200, 1867, 2355, 2742, 1889, - 3597, 1647, 3233, 2597, 1251, 3576, 3020, 3427, 2103, 2830, - 3191, 3423, 1509, 3429, 3425, 3424, 745, 3516, 1248, 2557, - 3475, 3420, 37, 3382, 1721, 3033, 2485, 1732, 793, 2389, - 2484, 798, 2332, 1996, 1728, 1868, 2805, 2331, 2291, 2324, - 1733, 2321, 2351, 997, 1736, 2240, 2350, 3008, 3002, 734, - 2707, 2685, 3113, 1748, 3093, 3049, 749, 2556, 2595, 715, - 1034, 2213, 2135, 2690, 2057, 2535, 1184, 1552, 2740, 231, - 8, 230, 7, 6, 1812, 1885, 2385, 2352, 794, 1695, - 2318, 1663, 802, 1632, 1626, 2526, 2078, 2487, 792, 703, - 1590, 685, 2102, 1543, 2330, 1878, 2327, 811, 1854, 1803, - 2529, 1269, 2210, 2307, 2590, 1817, 1811, 15, 1702, 2714, - 1116, 2052, 1566, 2056, 1115, 235, 1631, 235, 742, 1175, - 1176, 1570, 2686, 1556, 719, 1628, 715, 1033, 960, 1685, - 1890, 1591, 752, 1482, 1155, 751, 25, 221, 26, 17, - 10, 1487, 217, 1013, 1582, 736, 712, 1019, 1031, 24, - 1064, 1458, 1080, 213, 2359, 748, 1331, 1332, 1333, 1330, - 684, 1172, 4251, 1403, 4140, 1331, 1332, 1333, 1330, 28, - 1331, 1332, 1333, 1330, 2716, 2961, 2961, 2961, 794, 3755, - 962, 16, 3629, 1128, 732, 963, 3487, 1027, 3392, 1028, - 14, 3391, 3296, 1131, 3295, 2369, 34, 2019, 1252, 1483, - 3916, 3721, 1253, 3608, 2868, 2811, 1150, 2809, 2808, 722, - 2806, 1484, 1171, 2009, 1173, 1709, 1705, 1168, 219, 1167, - 705, 2483, 1477, 710, 1630, 4217, 740, 1443, 1008, 984, - 1548, 1549, 1550, 2261, 3389, 2497, 2490, 1130, 1168, 2016, - 1486, 3377, 1022, 3375, 1018, 1168, 733, 799, 981, 3374, - 1101, 3372, 4466, 1607, 2003, 1473, 1762, 3860, 729, 1252, - 3269, 1707, 3267, 2296, 800, 2953, 2951, 731, 1331, 1332, - 1333, 1330, 4014, 730, 4389, 4388, 3622, 4225, 4081, 179, - 218, 178, 209, 180, 4075, 1331, 1332, 1333, 1330, 8, - 1151, 7, 3863, 1166, 3614, 2317, 1397, 4244, 2326, 210, - 961, 2828, 3346, 2313, 2635, 4486, 201, 4238, 4463, 2955, - 211, 4089, 1000, 4236, 4126, 4087, 3904, 2235, 972, 179, - 218, 178, 209, 180, 3693, 1029, 2895, 2504, 4302, 149, - 3902, 1671, 1488, 1494, 1492, 1491, 985, 982, 1132, 210, - 3344, 1535, 747, 2367, 135, 951, 201, 950, 952, 953, - 211, 954, 955, 214, 2096, 3198, 2530, 4128, 2734, 1328, - 3241, 3242, 2986, 2029, 1144, 1139, 1134, 1138, 1142, 149, - 2027, 2224, 2225, 783, 1603, 2257, 785, 1604, 979, 2721, - 3240, 784, 2720, 2735, 135, 2722, 1024, 1501, 1017, 1517, - 2982, 2223, 1147, 214, 1126, 2671, 1137, 1021, 1020, 1127, - 783, 2670, 1760, 785, 2034, 2035, 1588, 1589, 784, 1095, - 1093, 783, 1094, 1515, 785, 1633, 1924, 1635, 1009, 784, - 3004, 3397, 1759, 2824, 179, 218, 178, 209, 180, 973, - 3005, 4395, 4396, 1089, 3503, 1321, 3501, 2984, 1016, 985, - 1097, 3376, 158, 159, 2117, 160, 161, 1145, 1804, 3373, - 162, 1808, 1820, 163, 1326, 1578, 1125, 1026, 982, 1124, - 4247, 4352, 1015, 4246, 4351, 2979, 1014, 4247, 3889, 1148, - 4245, 4350, 1002, 4246, 4245, 1807, 1149, 4420, 1606, 3003, - 2462, 4228, 158, 159, 4364, 160, 161, 4458, 4459, 3274, - 162, 1007, 2094, 163, 4231, 4232, 4233, 4234, 214, 4340, - 2983, 3617, 906, 1135, 1784, 4340, 4343, 4078, 179, 218, - 178, 209, 180, 1102, 177, 207, 216, 208, 74, 133, - 1708, 1706, 3275, 3617, 3276, 1005, 2849, 1146, 2980, 1586, - 2956, 1258, 1824, 1585, 1588, 1589, 3279, 2371, 206, 200, - 199, 4262, 2241, 3632, 2231, 75, 3941, 1098, 1516, 3011, - 1799, 3703, 716, 983, 177, 207, 216, 208, 74, 133, - 2363, 3710, 2673, 157, 1025, 1136, 179, 218, 178, 209, - 180, 2524, 980, 1025, 1616, 2680, 3443, 3309, 206, 200, - 199, 2989, 214, 2627, 3802, 75, 1809, 1006, 1324, 1325, - 1301, 3192, 1308, 1303, 715, 1309, 205, 4366, 3624, 715, - 1257, 3307, 1323, 157, 4130, 4131, 202, 203, 204, 1100, - 1806, 4394, 179, 218, 178, 209, 180, 2859, 976, 737, - 737, 1304, 715, 1311, 2368, 2633, 179, 218, 178, 209, - 180, 3888, 1264, 2095, 179, 218, 178, 209, 180, 3890, - 214, 2985, 2030, 1296, 1143, 3861, 202, 203, 204, 2028, - 1619, 3906, 3268, 1605, 3437, 746, 2255, 2256, 3132, 177, - 207, 216, 208, 3441, 212, 3186, 1023, 2675, 2954, 2981, - 1576, 4136, 1319, 1320, 1823, 1822, 2676, 2677, 1769, 3938, - 3448, 1140, 3900, 206, 1141, 145, 214, 1476, 1099, 205, - 1374, 146, 1261, 977, 3818, 1128, 734, 734, 734, 4250, - 214, 4139, 1518, 3449, 212, 1131, 1012, 2963, 214, 1272, - 1275, 1256, 3635, 3313, 2960, 2683, 1253, 3438, 3439, 1178, - 2737, 1318, 702, 1253, 4203, 145, 3903, 1805, 1297, 205, - 1306, 146, 3505, 3440, 1368, 1253, 1598, 1257, 2613, 3532, - 4097, 3533, 4098, 3705, 2593, 2616, 147, 1690, 1267, 1130, - 2234, 3297, 1601, 1602, 1299, 1493, 978, 1490, 4092, 67, - 3294, 3814, 4254, 3530, 3531, 2394, 4118, 1302, 1305, 3529, - 3965, 1406, 4166, 1128, 3917, 2358, 4097, 3727, 4098, 3601, - 1276, 3462, 3435, 1131, 3476, 1168, 147, 1168, 3007, 1168, - 1298, 1168, 1307, 4282, 4277, 3050, 1253, 1152, 1168, 67, - 1133, 1168, 2615, 1288, 1830, 1833, 1834, 3675, 4100, 2537, - 70, 2370, 2374, 2376, 2377, 1831, 3677, 986, 3449, 1001, - 739, 4158, 999, 738, 4088, 2807, 3196, 1130, 4129, 2532, - 3807, 732, 732, 732, 3383, 4069, 3766, 4267, 4099, 4284, - 3759, 1096, 1710, 4290, 4100, 3500, 155, 215, 1407, 156, - 70, 1588, 1589, 1588, 1589, 3087, 1479, 1481, 65, 1485, - 3908, 3909, 3910, 1245, 1565, 4124, 2614, 961, 3689, 1300, - 3536, 1310, 3925, 2515, 4099, 1505, 1285, 1277, 3686, 1508, - 1489, 2952, 3410, 1514, 1281, 1282, 155, 215, 1484, 156, - 1484, 1244, 3905, 733, 733, 733, 1127, 975, 65, 2667, - 1500, 1456, 1287, 3010, 1461, 729, 729, 729, 1761, 1313, - 1375, 715, 1314, 1034, 731, 731, 731, 2242, 3820, 1577, - 730, 730, 730, 786, 787, 788, 789, 790, 3444, 2679, - 3310, 1274, 1273, 1260, 1262, 1265, 3688, 4365, 148, 49, - 1316, 4261, 3193, 3449, 4009, 66, 4167, 4492, 2645, 5, - 786, 787, 788, 789, 790, 3942, 2644, 4132, 3014, 3015, - 3875, 786, 787, 788, 789, 790, 179, 218, 152, 153, - 2737, 1266, 154, 3013, 2600, 735, 715, 2232, 148, 49, - 1621, 3998, 4004, 1800, 715, 66, 1279, 3017, 685, 685, - 2363, 1794, 215, 3506, 1795, 4159, 2665, 2666, 685, 685, - 2089, 1643, 1658, 1658, 1642, 715, 1584, 1563, 152, 153, - 1286, 3436, 154, 1511, 1512, 4475, 149, 1562, 1521, 1523, - 1524, 1525, 1526, 1027, 1528, 1028, 737, 1686, 704, 1263, - 1534, 1418, 1419, 735, 1698, 2915, 1561, 1656, 1656, 70, - 214, 1660, 3083, 3084, 4291, 3087, 4145, 1312, 1539, 235, - 4022, 4023, 4024, 4028, 4026, 4027, 4029, 4025, 685, 3024, - 3028, 3029, 3030, 3025, 3027, 3026, 1496, 3509, 1665, 1249, - 1370, 1371, 1372, 1373, 1580, 1579, 3535, 3366, 3741, 735, - 1617, 1832, 3133, 4379, 3134, 3135, 4180, 1317, 4093, 2375, - 3530, 3531, 4094, 735, 3161, 2218, 2636, 70, 2593, 1365, - 1364, 735, 2610, 2600, 2603, 1498, 1462, 1090, 1620, 1315, - 179, 218, 1555, 1522, 1460, 3045, 3251, 3252, 1740, 3858, - 1564, 1652, 1653, 1745, 4093, 3747, 2599, 1574, 4241, 1510, - 747, 2601, 4337, 1758, 3041, 1593, 1594, 2536, 1596, 1597, - 991, 1629, 1599, 70, 3235, 3237, 1293, 3672, 3552, 3525, - 2855, 2726, 1520, 2669, 3458, 2631, 2488, 70, 2360, 1782, - 2230, 2207, 1507, 1527, 1785, 70, 714, 2603, 4476, 3829, - 1558, 717, 2012, 1658, 2516, 1658, 1257, 1540, 3567, 1572, - 1573, 1542, 1547, 3554, 3039, 2602, 1747, 1567, 1571, 1571, - 1571, 3312, 2600, 2603, 1533, 1608, 1609, 3180, 4012, 1532, - 1531, 1092, 1530, 995, 1091, 3696, 1272, 1275, 993, 992, - 1719, 1716, 1722, 1723, 1567, 1567, 2386, 1592, 1637, 1639, - 1595, 1754, 1103, 3526, 1724, 1725, 1519, 1131, 1650, 1651, - 4179, 1090, 4005, 4006, 3042, 1292, 734, 1687, 741, 734, - 734, 1730, 1731, 1641, 2196, 2194, 1658, 4000, 3130, 2195, - 2604, 3999, 1546, 1793, 2976, 2599, 2593, 2598, 1035, 2596, - 2601, 3666, 2846, 1257, 1888, 2508, 1735, 2372, 2373, 1739, - 1666, 2588, 1738, 1504, 714, 1672, 4378, 1276, 1937, 1919, - 1920, 1872, 1923, 1678, 994, 710, 2037, 1819, 1711, 1699, - 1938, 1684, 2038, 1026, 998, 3459, 3679, 1495, 2510, 2509, - 2507, 4473, 4474, 1945, 1779, 1947, 1700, 1948, 1949, 1950, - 1955, 1957, 1956, 2604, 2602, 1037, 1038, 1039, 1502, 1503, - 1776, 1777, 1927, 1928, 1929, 1092, 2011, 2609, 1091, 3236, - 2017, 2607, 2036, 987, 2657, 1943, 988, 1816, 1944, 2604, - 3971, 717, 3152, 3153, 2599, 2593, 2598, 2428, 2596, 2601, - 2427, 965, 966, 967, 968, 1257, 1557, 1963, 1964, 1510, - 3162, 3164, 3165, 3166, 3163, 4494, 1797, 2020, 1835, 1557, - 2021, 732, 3748, 2024, 732, 732, 4488, 3486, 715, 715, - 715, 4068, 4482, 1954, 4469, 1993, 2704, 2039, 2041, 1922, - 2042, 1750, 2044, 2045, 2528, 4347, 704, 1686, 1813, 1994, - 1497, 1499, 2053, 2602, 1658, 2059, 2060, 3573, 2062, 1621, - 715, 1767, 2013, 4433, 1770, 715, 3060, 1791, 1658, 1787, - 1790, 1786, 1034, 1781, 2357, 2087, 1815, 1810, 1274, 1273, - 1936, 1997, 1780, 733, 1669, 1329, 733, 733, 991, 1090, - 3527, 1658, 1329, 3044, 4406, 729, 2737, 1621, 729, 729, - 1792, 2833, 728, 4403, 731, 4397, 1856, 731, 731, 3569, - 730, 2365, 1789, 730, 730, 3061, 2005, 4483, 1104, 4434, - 1293, 1788, 2116, 1768, 2357, 3699, 1771, 1772, 3634, 1621, - 2995, 3151, 2477, 2854, 2125, 2125, 2630, 1621, 1247, 1621, - 1621, 4375, 3369, 715, 715, 4330, 2192, 4329, 4434, 2053, - 2200, 990, 4312, 1658, 2204, 2205, 993, 992, 3540, 2220, - 2705, 685, 2080, 3538, 2000, 2996, 2997, 970, 1131, 1331, - 1332, 1333, 1330, 3573, 2527, 685, 2705, 1658, 4285, 4407, - 2049, 2050, 2051, 1092, 3416, 4273, 1091, 2063, 4404, 3367, - 2404, 1329, 4215, 2065, 2066, 2067, 2068, 965, 966, 967, - 968, 1951, 1952, 1247, 715, 2053, 1658, 4214, 2267, 2083, - 715, 715, 715, 745, 745, 2120, 1331, 1332, 1333, 1330, - 2277, 3061, 2279, 2280, 2281, 3381, 4376, 3370, 2287, 2147, - 1329, 1801, 1329, 2061, 1293, 235, 1995, 2404, 235, 235, - 4195, 235, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, - 1848, 1849, 1850, 1851, 3379, 2047, 2001, 2121, 2258, 2198, - 1865, 1866, 2010, 2365, 2014, 2128, 2705, 3254, 2127, 2018, - 4274, 1852, 1853, 4194, 3368, 1863, 1864, 4216, 2838, 2058, - 2100, 2101, 2250, 2251, 2854, 4193, 1937, 1937, 2334, 2227, - 4192, 2229, 2554, 2074, 2957, 2341, 2048, 2110, 2111, 2829, - 2356, 1329, 2248, 2249, 2269, 2270, 2271, 1163, 1164, 1165, - 1946, 2104, 4170, 2106, 2107, 2222, 2097, 4044, 2122, 2084, - 1291, 2088, 2586, 2403, 2099, 2404, 2090, 2113, 2482, 2087, - 2476, 2475, 2295, 1658, 2354, 2298, 2299, 2437, 2301, 2243, - 2316, 1162, 2436, 1567, 1159, 2435, 2105, 2109, 2108, 4169, - 2236, 2129, 2130, 1331, 1332, 1333, 1330, 1571, 2404, 2114, - 2347, 2253, 2206, 970, 2115, 2357, 1457, 2118, 2119, 1571, - 2404, 1541, 2285, 1290, 1128, 2404, 2124, 2126, 2203, 2573, - 2197, 4142, 4112, 2266, 1131, 2348, 2202, 1875, 2208, 4109, - 3825, 2221, 1644, 4501, 4484, 4212, 734, 2365, 1802, 1612, - 1613, 4043, 1615, 2226, 1618, 2228, 1622, 1623, 1624, 2237, - 3937, 2402, 4058, 2335, 1345, 1344, 1354, 1355, 1356, 1357, - 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1346, 1130, 3755, - 1910, 1813, 2265, 3768, 2365, 3729, 2264, 2379, 2329, 3259, - 1673, 1674, 1675, 1676, 1677, 2430, 1679, 1680, 1681, 1682, - 1683, 2272, 2273, 3063, 1689, 2470, 1691, 1692, 1693, 1250, - 2292, 3709, 1291, 2966, 1255, 2304, 2404, 1329, 2091, 2092, - 1331, 1332, 1333, 1330, 2554, 2737, 1128, 1331, 1332, 1333, - 1330, 2309, 1331, 1332, 1333, 1330, 1131, 1284, 3658, 3654, - 1958, 1959, 1960, 1961, 2468, 795, 1965, 1966, 1967, 1968, - 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, - 1980, 2087, 2857, 2856, 1156, 1157, 1158, 1161, 3769, 1160, - 3730, 1331, 1332, 1333, 1330, 2356, 2345, 2283, 2572, 2848, - 1130, 732, 2580, 3548, 4056, 3341, 2423, 3230, 2438, 2439, - 2471, 2441, 2489, 3053, 2491, 2408, 2493, 2494, 2448, 2934, - 2392, 2349, 1346, 1293, 2346, 2922, 2914, 2870, 715, 1621, - 715, 1621, 2290, 2275, 2406, 2015, 2852, 2460, 2362, 2343, - 2840, 2511, 2835, 3659, 3655, 4040, 1764, 793, 989, 2469, - 715, 715, 715, 1383, 2378, 2820, 2525, 2461, 2463, 2464, - 2465, 2387, 2467, 733, 2818, 2816, 715, 715, 715, 715, - 2814, 1331, 1332, 1333, 1330, 729, 1856, 2380, 1278, 1242, - 2891, 2892, 1937, 1937, 731, 1237, 2553, 2885, 3549, 2558, - 730, 3823, 2705, 2396, 1906, 2560, 2561, 2562, 2836, 2565, - 1621, 1903, 2478, 2344, 2554, 1905, 1902, 1904, 1908, 1909, - 1329, 1329, 1329, 1907, 1228, 1224, 1225, 1226, 1227, 2444, - 2890, 2554, 2889, 2888, 2886, 2841, 2443, 2836, 1621, 3340, - 2426, 1331, 1332, 1333, 1330, 2417, 1331, 1332, 1333, 1330, - 2821, 3491, 2416, 2415, 2252, 2622, 4045, 4046, 2405, 2819, - 2815, 2364, 1773, 2391, 2390, 2815, 3304, 2501, 1648, 2503, - 4041, 4042, 1568, 4049, 4048, 4047, 4050, 4051, 4052, 1649, - 1128, 2554, 4495, 4053, 1715, 1714, 2080, 1365, 1364, 4278, - 1131, 4462, 1131, 3879, 4054, 3972, 3477, 2477, 2547, 2474, - 2628, 4252, 2559, 2887, 2400, 4160, 3744, 4207, 1169, 1170, - 4141, 4085, 2479, 1174, 1329, 1926, 1925, 715, 2125, 4038, - 996, 1329, 4002, 2629, 1646, 1329, 2709, 2709, 2220, 2709, - 1329, 4001, 2492, 3987, 1130, 4279, 2496, 1329, 1329, 2383, - 2384, 3973, 3742, 2404, 2329, 3945, 2365, 1774, 3720, 685, - 685, 3574, 3745, 2577, 2381, 2382, 714, 1257, 1553, 2579, - 3565, 2581, 1554, 1658, 715, 2517, 2582, 3557, 1913, 1914, - 1915, 1916, 1917, 1918, 1911, 1912, 3550, 3478, 1600, 715, - 3453, 1926, 1925, 2592, 2591, 1257, 2788, 704, 3743, 3189, - 3188, 1406, 3022, 1569, 1698, 4161, 2220, 1862, 2732, 2796, - 2551, 2798, 2962, 3606, 235, 2806, 2668, 2550, 2548, 3402, - 2877, 2574, 2867, 1859, 1861, 1858, 1128, 1860, 2792, 3878, - 2839, 1614, 2566, 3479, 2728, 2495, 1131, 2338, 1645, 1627, - 2569, 1969, 2337, 2336, 2711, 2575, 2715, 2723, 2576, 2724, - 1537, 4162, 2713, 1536, 1259, 2800, 2293, 1879, 2843, 2397, - 1664, 3399, 1879, 2717, 2567, 2568, 2585, 2850, 2729, 2730, - 2354, 1703, 3402, 2293, 2570, 2571, 4349, 1658, 1407, 1658, - 1130, 1658, 2578, 2739, 2605, 2606, 1257, 2611, 828, 838, - 3260, 1553, 1571, 4111, 2869, 1554, 2043, 3399, 829, 4110, - 830, 834, 837, 833, 831, 832, 2745, 1962, 1333, 1330, - 1330, 2801, 4017, 4016, 2860, 1331, 1332, 1333, 1330, 3480, - 2795, 3122, 3120, 3099, 1658, 1257, 3609, 3097, 2678, 2898, - 3993, 2684, 1354, 1355, 1356, 1357, 1347, 1348, 1349, 1350, - 1351, 1352, 1353, 1346, 2905, 2944, 2718, 2945, 3401, 1658, - 2744, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1346, 1656, - 4319, 4320, 2893, 3939, 3319, 835, 1349, 1350, 1351, 1352, - 1353, 1346, 4197, 4198, 2268, 2733, 3946, 3947, 4411, 2736, - 1331, 1332, 1333, 1330, 1656, 4491, 2278, 2906, 4374, 1637, - 1639, 2810, 1331, 1332, 1333, 1330, 836, 2864, 4373, 4322, - 1385, 3607, 1941, 2794, 4321, 4318, 2789, 1331, 1332, 1333, - 1330, 2964, 2827, 1384, 3707, 1703, 2968, 1942, 2970, 4317, - 2911, 2912, 3333, 3940, 3173, 715, 715, 715, 1337, 1338, - 1339, 1340, 1341, 1342, 1343, 1335, 2880, 2825, 2882, 4316, - 1257, 2866, 1331, 1332, 1333, 1330, 2793, 2861, 1658, 4314, - 4490, 1621, 1331, 1332, 1333, 1330, 2896, 1621, 2200, 2340, - 2875, 2879, 2936, 4313, 2937, 3021, 2939, 2853, 2941, 2942, - 2851, 2858, 4280, 3171, 3708, 3056, 3059, 1331, 1332, 1333, - 1330, 2988, 4183, 3064, 3172, 3332, 2802, 2831, 2832, 2948, - 2419, 1331, 1332, 1333, 1330, 4436, 3169, 4173, 2871, 2872, - 1704, 3074, 1813, 1331, 1332, 1333, 1330, 4163, 3158, 2884, - 1763, 1257, 1331, 1332, 1333, 1330, 4135, 4108, 2904, 3096, - 2894, 4076, 1331, 1332, 1333, 1330, 1257, 1257, 1257, 2125, - 4011, 3975, 1257, 3170, 3106, 3107, 3108, 3109, 1257, 3116, - 3034, 3117, 3118, 3974, 3119, 3760, 3121, 4384, 3746, 3706, - 3442, 2745, 3040, 3300, 3272, 3271, 3168, 3116, 1131, 3156, - 2418, 3155, 4493, 1331, 1332, 1333, 1330, 3037, 3157, 2709, - 4299, 3154, 3146, 2949, 1331, 1332, 1333, 1330, 3140, 3018, - 3139, 3138, 3137, 3174, 2958, 3035, 2822, 1331, 1332, 1333, - 1330, 2147, 2725, 2481, 2312, 2744, 685, 1331, 1332, 1333, - 1330, 2311, 2310, 3713, 2200, 2306, 2305, 2259, 1257, 2220, - 2220, 2220, 2220, 2220, 2220, 1331, 1332, 1333, 1330, 2026, - 3051, 2023, 3091, 1765, 1475, 1257, 2220, 3075, 2998, 2709, - 3719, 3428, 3016, 2031, 2032, 2033, 3179, 3091, 3102, 3103, - 3094, 4487, 3090, 3105, 3094, 3043, 4485, 1658, 3238, 3112, - 3095, 4133, 4134, 3058, 2999, 3868, 3001, 3101, 715, 715, - 3077, 3065, 8, 1240, 7, 2064, 3055, 4460, 4426, 4361, - 2069, 4359, 4116, 2058, 3066, 840, 151, 4335, 3896, 3076, - 4264, 151, 1334, 3071, 3072, 3950, 3893, 4258, 4249, 3079, - 1367, 2874, 3181, 3092, 4235, 3098, 4226, 4202, 4201, 1377, - 3104, 4187, 4182, 4181, 3226, 1331, 1332, 1333, 1330, 3073, - 4138, 4123, 3256, 1331, 1332, 1333, 1330, 4121, 2907, 3206, - 4107, 4077, 1239, 235, 3995, 1386, 3892, 3954, 235, 3136, - 3943, 3194, 3927, 3067, 3926, 3922, 3206, 3239, 3070, 3148, - 3920, 3899, 3898, 3882, 3895, 711, 3894, 3870, 2131, 2132, - 3866, 3864, 151, 1331, 1332, 1333, 1330, 1937, 3835, 1937, - 3832, 3184, 3293, 3827, 3178, 3701, 3190, 3681, 3667, 3299, - 1331, 1332, 1333, 1330, 3646, 1658, 2634, 3644, 3306, 2637, - 2638, 2639, 2640, 2641, 2642, 2643, 3638, 3623, 2646, 2647, - 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2656, 3229, - 2658, 2659, 2660, 2661, 2662, 3223, 2663, 3227, 3585, 2263, - 3563, 3562, 1723, 3243, 3246, 2263, 2263, 2263, 1640, 3560, - 3261, 3255, 1724, 1725, 3559, 3265, 3187, 3551, 3546, 3545, - 3247, 3207, 3208, 3209, 3210, 3211, 3212, 3454, 1730, 1731, - 3228, 3414, 3413, 2873, 3403, 3393, 1997, 3388, 3288, 3386, - 2486, 3292, 3314, 3311, 1131, 3298, 3270, 1735, 3245, 3182, - 1739, 3167, 3159, 1738, 3149, 3147, 3290, 1345, 1344, 1354, - 1355, 1356, 1357, 1347, 1348, 1349, 1350, 1351, 1352, 1353, - 1346, 3263, 3262, 3143, 3387, 3142, 3141, 3390, 2411, 2977, - 1129, 2967, 715, 1621, 2959, 151, 3881, 906, 905, 3308, - 2847, 3404, 3406, 3407, 3409, 3880, 3411, 3412, 3286, 3289, - 151, 3281, 151, 3284, 2401, 1257, 3291, 2826, 2790, 3277, - 2399, 1257, 2512, 1331, 1332, 1333, 1330, 3431, 3433, 2499, - 2498, 2315, 1331, 1332, 1333, 1330, 2308, 3302, 3446, 3315, - 2123, 2055, 3811, 2025, 715, 3316, 3640, 3331, 2022, 2008, - 3322, 3323, 3303, 2007, 1766, 1414, 3324, 3461, 3326, 3465, - 1257, 3327, 3328, 715, 3325, 715, 2200, 1257, 1257, 1331, - 1332, 1333, 1330, 1331, 1332, 1333, 1330, 3371, 1410, 1409, - 1243, 2220, 2558, 3342, 3490, 1331, 1332, 1333, 1330, 974, - 4448, 4297, 1331, 1332, 1333, 1330, 4293, 3380, 1331, 1332, - 1333, 1330, 2622, 4113, 1331, 1332, 1333, 1330, 179, 218, - 1331, 1332, 1333, 1330, 3515, 3336, 3518, 4104, 3518, 3518, - 3457, 3395, 4103, 1257, 3384, 3450, 3417, 4090, 3385, 4086, - 3897, 3876, 3091, 3845, 3737, 3335, 3736, 3034, 3733, 1697, - 3698, 3541, 1331, 1332, 1333, 1330, 3663, 3661, 1128, 1658, - 1658, 3537, 3660, 3657, 3468, 3656, 3645, 3643, 1131, 3434, - 1131, 3474, 1331, 1332, 1333, 1330, 3482, 1131, 3627, 3612, - 3611, 3091, 1131, 3596, 3595, 3037, 3484, 3418, 3091, 3091, - 3460, 3415, 214, 3483, 1656, 1656, 3378, 3542, 3543, 3338, - 3329, 3498, 3321, 3502, 3504, 3488, 715, 1131, 3456, 3320, - 3334, 3467, 1130, 3318, 3253, 2817, 3431, 2813, 3472, 3473, - 2812, 2933, 2449, 2442, 2434, 3493, 3485, 2932, 2433, 1621, - 3514, 3489, 2200, 2200, 2432, 2431, 3523, 1331, 1332, 1333, - 1330, 2931, 2429, 2425, 3091, 2592, 2591, 3497, 1331, 1332, - 1333, 1330, 2930, 2424, 1331, 1332, 1333, 1330, 3006, 2929, - 2422, 2413, 3521, 2410, 3524, 3519, 3520, 2409, 1331, 1332, - 1333, 1330, 3539, 2500, 2928, 2502, 2314, 3513, 2927, 1331, - 1332, 1333, 1330, 1986, 1984, 1257, 1331, 1332, 1333, 1330, - 2898, 3496, 2926, 1983, 1982, 2520, 2521, 2522, 3610, 1981, - 3547, 1331, 1332, 1333, 1330, 1331, 1332, 1333, 1330, 1940, - 1939, 2539, 2540, 2541, 2542, 1930, 1670, 1668, 3089, 1331, - 1332, 1333, 1330, 179, 218, 1825, 1826, 1827, 1828, 1829, - 4311, 2925, 218, 178, 209, 180, 218, 179, 218, 3558, - 3492, 4447, 3555, 715, 4410, 3494, 3495, 3570, 3571, 3556, - 4328, 3561, 3564, 2924, 4298, 1404, 4292, 3568, 1331, 1332, - 1333, 1330, 4221, 3128, 3129, 3581, 4218, 3582, 179, 218, - 1876, 2921, 4191, 3481, 1880, 1881, 1882, 1883, 3144, 3145, - 1331, 1332, 1333, 1330, 1921, 3589, 2920, 3287, 2082, 3592, - 3593, 3594, 1931, 4184, 4071, 4070, 2745, 214, 1331, 1332, - 1333, 1330, 2919, 3599, 4033, 214, 4015, 3185, 4013, 214, - 4008, 214, 3986, 1331, 1332, 1333, 1330, 3969, 2079, 3846, - 3669, 3843, 3809, 3808, 2287, 3805, 3628, 3804, 3620, 1331, - 1332, 1333, 1330, 2913, 3767, 3764, 3682, 3762, 3684, 3722, - 2744, 3680, 2081, 3690, 1985, 3676, 1987, 1988, 1989, 1990, - 1991, 3631, 1627, 4309, 2901, 1998, 3647, 3330, 1718, 1729, - 1331, 1332, 1333, 1330, 1720, 1734, 3636, 2897, 3678, 1737, - 3691, 1726, 1544, 3649, 3217, 3651, 2876, 3653, 3572, 715, - 2200, 1331, 1332, 1333, 1330, 3175, 3100, 3685, 3047, 3687, - 3046, 4307, 2473, 3728, 1331, 1332, 1333, 1330, 3038, 1664, - 3588, 3000, 3735, 1331, 1332, 1333, 1330, 2935, 3630, 151, - 151, 151, 1129, 2834, 2263, 2727, 2709, 2220, 3752, 1331, - 1332, 1333, 1330, 2664, 2552, 2519, 2518, 2480, 3668, 1857, - 214, 3664, 2472, 2274, 2004, 3717, 3670, 2466, 1798, 1757, - 3770, 1727, 3697, 1257, 179, 218, 1474, 1459, 1131, 3700, - 3673, 1455, 3515, 2093, 1874, 1131, 1257, 3694, 1454, 1331, - 1332, 1333, 1330, 1453, 1331, 1332, 1333, 1330, 1452, 1257, - 1451, 3822, 1450, 3714, 1449, 1658, 179, 218, 3726, 2112, - 1448, 1331, 1332, 1333, 1330, 3830, 1447, 1446, 3734, 1445, - 1366, 3754, 1444, 1443, 149, 3716, 1756, 1442, 715, 1441, - 2200, 1440, 1439, 3695, 1257, 1438, 1437, 1436, 1435, 1434, - 1656, 1433, 3803, 3824, 1432, 1431, 1430, 1429, 214, 1428, - 3749, 1427, 1426, 3750, 1425, 1424, 1753, 1423, 3794, 2917, - 2918, 3751, 3852, 3757, 1422, 2923, 1421, 1420, 235, 1417, - 1416, 1415, 1413, 1998, 1412, 1411, 1408, 1401, 1998, 1998, - 1755, 3836, 1400, 1398, 3771, 1397, 1396, 1395, 3810, 3812, - 3815, 1394, 1393, 1392, 3839, 3851, 1391, 3813, 1390, 3821, - 1389, 1388, 1387, 1382, 1381, 1380, 1379, 1378, 1295, 1241, - 3112, 3826, 4305, 3831, 3854, 3828, 3577, 3578, 3833, 3806, - 3834, 2564, 3837, 2534, 1283, 4440, 3841, 3840, 4438, 2294, - 4393, 3580, 2297, 3553, 3871, 2300, 3183, 2087, 2302, 3838, - 3911, 3023, 2738, 2546, 3918, 3206, 1551, 1294, 3225, 3220, - 3924, 3215, 3218, 3222, 3221, 2699, 2700, 3219, 3891, 3874, - 1257, 3587, 3214, 3586, 3583, 3859, 3224, 3213, 134, 4348, - 72, 4237, 3869, 3991, 71, 3054, 3848, 2322, 68, 1463, - 2973, 2974, 2975, 1257, 1658, 1658, 3849, 2837, 3955, 1538, - 3913, 3465, 3753, 3907, 3283, 3921, 3452, 3923, 2076, 2077, - 3756, 2632, 3124, 3963, 2071, 2072, 2073, 3963, 1257, 3125, - 3126, 3127, 3511, 3816, 3512, 3625, 3626, 3600, 2184, 1656, - 1872, 3901, 3952, 1257, 3980, 1257, 3957, 3958, 3951, 3914, - 1712, 3057, 3052, 3983, 1749, 3985, 3847, 2865, 706, 1131, - 707, 3934, 1658, 3933, 708, 3932, 2831, 2832, 709, 2506, - 2505, 3953, 1746, 2513, 2276, 2193, 1289, 4188, 3426, 3419, - 3944, 3078, 3048, 715, 3956, 1257, 1257, 2584, 2544, 1257, - 1257, 3091, 3968, 2085, 2046, 1926, 1925, 1872, 4451, 3967, - 4186, 3979, 3544, 3754, 1470, 1471, 3960, 3976, 1468, 1469, - 4057, 2681, 1131, 4035, 1466, 1467, 2674, 4030, 2201, 3989, - 1611, 2393, 3803, 4037, 2087, 2398, 3992, 4063, 3996, 1610, - 4019, 4020, 3929, 2407, 4031, 4032, 1464, 1465, 3794, 3206, - 1322, 4072, 4073, 2339, 3598, 3591, 2514, 2342, 1560, 3761, - 1559, 3763, 1529, 1583, 1819, 1658, 1819, 2335, 4417, 3936, - 2863, 4415, 4367, 1667, 4345, 3258, 4344, 711, 3935, 2862, - 2414, 4342, 4268, 4222, 4066, 4065, 3981, 3865, 2421, 4059, - 4061, 4105, 4060, 715, 3648, 3619, 3618, 4096, 3604, 2319, - 1656, 2617, 2587, 4084, 1751, 3603, 1557, 3919, 4117, 3683, - 4119, 4442, 4441, 4441, 151, 3301, 2440, 2972, 2971, 4079, - 2965, 2445, 2446, 2447, 2791, 2412, 2450, 2451, 2452, 2453, - 2454, 2455, 2456, 2457, 2458, 2459, 4091, 4120, 4095, 4122, - 1280, 4174, 1254, 3248, 3249, 2694, 2698, 2699, 2700, 2695, - 2703, 2696, 2701, 4083, 4442, 2697, 4150, 2702, 4101, 4102, - 4155, 4010, 4148, 3850, 4125, 965, 966, 967, 968, 4421, - 1247, 3931, 3739, 1247, 3280, 2538, 3984, 1257, 1742, 222, - 3, 1575, 80, 2, 3977, 3978, 4464, 4172, 4465, 4137, - 4178, 1, 2950, 4143, 151, 1345, 1344, 1354, 1355, 1356, - 1357, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1346, 151, - 2002, 1472, 151, 151, 4152, 4151, 969, 964, 1634, 2719, - 4149, 2254, 1662, 3874, 1257, 4168, 151, 2006, 971, 4164, - 1345, 1344, 1354, 1355, 1356, 1357, 1347, 1348, 1349, 1350, - 1351, 1352, 1353, 1346, 4146, 3231, 1658, 3232, 3590, 4213, - 1131, 3234, 2978, 4185, 2361, 3195, 2687, 2672, 2523, 3347, - 3348, 3445, 1545, 1036, 1932, 3349, 3350, 3351, 3352, 4196, - 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360, 3361, 3362, - 3363, 1656, 1778, 1271, 4210, 1775, 1270, 1268, 1819, 1877, - 1953, 842, 2325, 2694, 2698, 2699, 2700, 2695, 2703, 2696, - 2701, 4248, 4243, 2697, 3176, 2702, 3150, 4062, 4450, 4253, - 4219, 4220, 4479, 4409, 4453, 1796, 826, 4260, 4336, 3621, - 3278, 4223, 4227, 4413, 4229, 3988, 4082, 2366, 1327, 3285, - 1060, 885, 853, 1399, 1752, 3994, 3345, 3343, 4255, 852, - 4256, 3711, 3012, 4067, 3250, 4157, 1061, 4269, 2303, 4224, - 4080, 3723, 3724, 3725, 1713, 1717, 2583, 4165, 4265, 3731, - 3732, 4288, 3990, 4257, 3507, 3086, 1741, 4283, 3765, 3887, - 3885, 3886, 4036, 753, 2233, 4263, 4287, 3394, 683, 1113, - 4034, 2545, 1257, 1998, 2563, 1998, 4272, 4039, 4271, 4190, - 1010, 3692, 2533, 1011, 4315, 1003, 3032, 3031, 1836, 1336, - 1855, 3364, 1658, 4324, 1998, 1998, 3365, 4325, 4304, 4306, - 4308, 4310, 4332, 4286, 1376, 797, 2395, 4281, 4295, 3009, - 3788, 3244, 79, 78, 77, 76, 4333, 4303, 243, 3455, - 844, 242, 4114, 1048, 3948, 4331, 4455, 1656, 823, 1697, - 4323, 822, 821, 820, 819, 4360, 818, 2692, 3469, 2693, - 3470, 2691, 2689, 2688, 4334, 2215, 2214, 3257, 3602, 4341, - 4339, 1658, 2282, 2284, 3463, 4155, 3115, 4357, 3817, 3110, - 2136, 2134, 4354, 4356, 1625, 4362, 4353, 4355, 4358, 2612, - 2619, 4377, 2133, 4390, 3637, 151, 3877, 4385, 4300, 4301, - 4368, 4007, 2842, 3160, 2845, 3873, 1656, 4370, 2070, 4369, - 4371, 4372, 2608, 2153, 3131, 1044, 1045, 2150, 2149, 3123, - 4003, 3997, 2181, 4153, 3962, 3772, 1090, 3773, 3779, 1209, - 2543, 1183, 1179, 1181, 1182, 4398, 1180, 4399, 2883, 4400, - 4405, 4401, 3566, 4402, 2589, 3421, 2994, 2993, 2991, 2990, - 1513, 4259, 4363, 3928, 2743, 2741, 4416, 1238, 4418, 4419, - 3579, 3575, 4408, 2878, 4414, 3396, 2881, 4412, 1257, 4243, - 1480, 1478, 2333, 4422, 3584, 3216, 2320, 2899, 2900, 3282, - 2216, 2212, 2211, 1154, 2219, 2902, 2903, 4178, 4425, 4429, - 1153, 2263, 4423, 1694, 4424, 3674, 4431, 4432, 48, 4430, - 3197, 2908, 2909, 2910, 2682, 4127, 4435, 4437, 4449, 4439, - 2075, 4457, 1004, 2531, 4456, 116, 42, 130, 115, 197, - 1092, 63, 196, 1091, 4443, 4444, 4445, 4446, 62, 1257, - 3798, 4461, 18, 128, 194, 2938, 3777, 2940, 61, 4467, - 2943, 4287, 1825, 1998, 4468, 4471, 47, 4470, 46, 192, - 4477, 110, 109, 4481, 108, 107, 127, 191, 60, 4478, - 151, 227, 1076, 151, 151, 226, 151, 229, 228, 225, - 2803, 2804, 1049, 224, 4489, 1701, 223, 3789, 4346, 4427, - 3966, 4327, 959, 45, 4457, 4497, 44, 4456, 4496, 2388, - 3780, 198, 43, 117, 64, 41, 4481, 4498, 40, 1051, - 39, 3775, 4502, 35, 13, 12, 3800, 3801, 36, 23, - 22, 1129, 3776, 1345, 1344, 1354, 1355, 1356, 1357, 1347, - 1348, 1349, 1350, 1351, 1352, 1353, 1346, 4055, 3633, 151, - 1783, 21, 27, 33, 32, 144, 143, 31, 3068, 3069, - 1819, 142, 141, 140, 765, 764, 771, 761, 139, 138, - 137, 136, 3781, 30, 20, 55, 54, 768, 769, 53, - 770, 774, 52, 51, 755, 50, 9, 132, 131, 126, - 124, 29, 125, 122, 779, 123, 1072, 120, 1074, 1071, - 119, 118, 113, 1075, 111, 91, 90, 89, 104, 765, - 764, 771, 761, 103, 102, 101, 100, 99, 97, 98, - 1059, 88, 768, 769, 87, 770, 774, 86, 85, 755, - 84, 1070, 121, 1366, 106, 114, 112, 95, 1359, 779, - 1363, 105, 96, 1043, 94, 93, 92, 83, 82, 81, - 176, 175, 174, 173, 1050, 1085, 1360, 1362, 1358, 172, - 1361, 1345, 1344, 1354, 1355, 1356, 1357, 1347, 1348, 1349, - 1350, 1351, 1352, 1353, 1346, 170, 1081, 171, 3799, 169, - 2598, 168, 167, 166, 2263, 783, 165, 164, 785, 56, - 57, 58, 59, 784, 187, 186, 188, 190, 193, 189, - 195, 184, 182, 1998, 185, 3785, 183, 181, 73, 11, - 129, 19, 1082, 1086, 1331, 1332, 1333, 1330, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 3782, 3786, 3784, - 3783, 0, 1067, 0, 1065, 1069, 1089, 0, 0, 0, - 1066, 1063, 1062, 0, 1068, 1053, 1054, 1052, 0, 1042, - 1055, 1056, 1057, 1058, 0, 1087, 0, 1088, 0, 0, - 0, 0, 0, 0, 4199, 4200, 0, 0, 1083, 1084, - 0, 4204, 4205, 4206, 0, 0, 0, 4208, 4209, 0, - 4211, 0, 0, 0, 0, 3792, 3793, 0, 0, 0, - 0, 0, 3264, 0, 3266, 0, 0, 0, 756, 758, - 757, 0, 0, 2263, 1910, 0, 1079, 0, 0, 0, - 763, 0, 1078, 0, 0, 2322, 0, 0, 0, 3883, - 1998, 3884, 767, 0, 0, 1998, 1073, 0, 0, 782, - 0, 0, 0, 0, 0, 0, 760, 0, 0, 0, - 3802, 0, 0, 756, 758, 757, 0, 0, 0, 0, - 0, 0, 0, 3778, 0, 763, 3791, 1129, 0, 151, - 0, 0, 0, 0, 0, 3317, 0, 767, 0, 1910, - 0, 0, 0, 4270, 782, 765, 764, 771, 761, 4275, - 4276, 760, 3982, 0, 0, 750, 0, 0, 768, 769, - 3337, 770, 774, 0, 0, 755, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 779, 0, 0, 0, 0, - 4296, 0, 0, 0, 0, 0, 0, 0, 1077, 0, - 0, 0, 0, 0, 1046, 1047, 0, 1040, 0, 0, - 0, 0, 1041, 0, 0, 0, 1345, 1344, 1354, 1355, - 1356, 1357, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1346, - 0, 783, 0, 0, 785, 0, 0, 0, 0, 784, - 1344, 1354, 1355, 1356, 1357, 1347, 1348, 1349, 1350, 1351, - 1352, 1353, 1346, 762, 766, 772, 0, 773, 775, 0, - 0, 776, 777, 778, 0, 3339, 0, 780, 781, 3796, - 0, 0, 0, 2712, 0, 0, 0, 0, 1906, 0, - 0, 0, 0, 0, 0, 1903, 0, 0, 0, 1905, - 1902, 1904, 1908, 1909, 0, 0, 0, 1907, 762, 766, - 772, 0, 773, 775, 0, 0, 776, 777, 778, 0, - 0, 0, 780, 781, 0, 0, 0, 0, 4018, 1345, - 1344, 1354, 1355, 1356, 1357, 1347, 1348, 1349, 1350, 1351, - 1352, 1353, 1346, 0, 0, 0, 0, 0, 0, 0, - 0, 2219, 0, 1906, 0, 0, 3790, 0, 0, 151, - 1903, 0, 0, 3795, 1905, 1902, 1904, 1908, 1909, 0, - 0, 3797, 1907, 0, 0, 0, 3522, 1345, 1344, 1354, - 1355, 1356, 1357, 1347, 1348, 1349, 1350, 1351, 1352, 1353, - 1346, 0, 0, 0, 0, 0, 0, 0, 0, 756, - 758, 757, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 763, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 767, 0, 0, 0, 0, 4106, 0, - 782, 0, 759, 0, 0, 0, 0, 760, 0, 0, - 0, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, - 1900, 1901, 1913, 1914, 1915, 1916, 1917, 1918, 1911, 1912, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 759, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1202, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1891, 1892, 1893, 1894, - 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1913, 1914, 1915, - 1916, 1917, 1918, 1911, 1912, 786, 787, 788, 789, 790, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 762, 766, 772, 0, 773, 775, - 0, 0, 776, 777, 778, 0, 0, 0, 780, 781, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 151, 0, 0, 0, 3639, - 0, 0, 0, 0, 0, 0, 3641, 3642, 151, 0, - 0, 0, 1869, 1870, 0, 0, 0, 1220, 1221, 1187, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3650, 0, 3652, 0, 0, 0, - 1210, 1214, 1216, 1218, 1223, 3662, 1228, 1224, 1225, 1226, - 1227, 0, 1205, 1206, 1207, 1208, 1185, 1186, 1211, 0, - 1188, 0, 1190, 1191, 1192, 1193, 1189, 1194, 1195, 1196, - 1197, 1198, 1201, 1203, 1199, 1200, 1229, 1230, 1231, 1232, - 1233, 1234, 1235, 1236, 1213, 1215, 1217, 1219, 1222, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2182, 0, 0, 0, 0, 2143, 0, 0, - 2190, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1204, 0, 0, 0, 0, - 0, 0, 0, 759, 0, 0, 0, 1202, 0, 0, - 2184, 2152, 0, 0, 2219, 2219, 2219, 2219, 2219, 2219, - 2185, 2186, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2219, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2151, 0, 0, 0, - 0, 786, 787, 788, 789, 790, 0, 0, 0, 0, - 0, 0, 0, 0, 2159, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1998, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1998, 0, 0, 3842, 0, 0, 3844, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 151, 0, - 0, 0, 0, 151, 0, 0, 0, 0, 0, 3853, - 0, 1220, 1221, 1187, 2175, 0, 0, 1177, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 151, 0, 0, 1210, 1214, 1216, 1218, 1223, 0, - 1228, 1224, 1225, 1226, 1227, 0, 1205, 1206, 1207, 1208, - 1185, 1186, 1211, 0, 1188, 0, 1190, 1191, 1192, 1193, - 1189, 1194, 1195, 1196, 1197, 1198, 1201, 1203, 1199, 1200, - 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1213, 1215, - 1217, 1219, 1222, 0, 0, 0, 2142, 2144, 2141, 0, - 0, 0, 2138, 0, 0, 0, 0, 2163, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2169, 0, - 0, 0, 0, 0, 0, 0, 2154, 0, 2137, 1204, - 0, 0, 0, 0, 0, 0, 0, 0, 2157, 2191, - 0, 0, 2158, 2160, 2162, 0, 2164, 2165, 2166, 2170, - 2171, 2172, 2174, 2177, 2178, 2179, 0, 0, 0, 0, - 0, 0, 0, 2167, 2176, 2168, 0, 0, 0, 0, - 0, 0, 2182, 0, 0, 2146, 0, 2143, 0, 0, - 2190, 0, 1202, 0, 0, 0, 1212, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2184, 2152, 0, 0, 0, 0, 0, 2183, 0, 0, - 2185, 2186, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1129, 2151, 151, 0, 0, - 0, 2139, 2140, 0, 151, 0, 0, 0, 0, 151, - 0, 0, 0, 0, 2159, 0, 2219, 0, 0, 2180, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 151, 0, 0, 2156, 0, 0, - 0, 2155, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2173, 1220, 1221, 1187, 0, - 0, 0, 0, 0, 2161, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2188, 2187, 1210, - 1214, 1216, 1218, 1223, 2175, 1228, 1224, 1225, 1226, 1227, - 0, 1205, 1206, 1207, 1208, 1185, 1186, 1211, 0, 1188, - 0, 1190, 1191, 1192, 1193, 1189, 1194, 1195, 1196, 1197, - 1198, 1201, 1203, 1199, 1200, 1229, 1230, 1231, 1232, 1233, - 1234, 1235, 1236, 1213, 1215, 1217, 1219, 1222, 0, 0, - 0, 0, 2148, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2142, 3081, 2141, 0, - 0, 0, 3080, 0, 1204, 0, 0, 2163, 0, 0, - 0, 4189, 0, 0, 0, 0, 0, 2189, 2169, 0, - 1212, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2182, 0, 0, 0, 0, 0, 2157, 2191, - 0, 0, 2158, 2160, 2162, 0, 2164, 2165, 2166, 2170, - 2171, 2172, 2174, 2177, 2178, 2179, 0, 0, 0, 0, - 0, 0, 0, 2167, 2176, 2168, 0, 0, 0, 0, - 2184, 0, 0, 0, 0, 2146, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1386, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4177, 0, 0, 2183, 0, 0, - 0, 0, 0, 0, 2159, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2139, 2140, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2180, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4294, 0, 0, 0, 0, 0, 0, 2156, 0, 0, - 0, 2155, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2175, 151, 0, 0, 0, 0, - 0, 0, 151, 0, 0, 2173, 0, 0, 0, 0, - 0, 0, 0, 0, 2161, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2188, 2187, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2219, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2163, 4382, 0, - 0, 0, 2148, 0, 4386, 0, 0, 0, 2169, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1212, 0, 0, 2157, 2191, - 0, 0, 2158, 2160, 2162, 0, 2164, 2165, 2166, 2170, - 2171, 2172, 2174, 2177, 2178, 2179, 0, 2189, 0, 0, - 0, 0, 0, 2167, 2176, 2168, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 860, 0, - 0, 0, 0, 0, 0, 4382, 0, 425, 0, 0, - 564, 598, 587, 670, 552, 0, 0, 0, 0, 0, - 0, 812, 0, 151, 0, 359, 0, 2183, 393, 602, - 583, 594, 584, 569, 570, 571, 578, 371, 572, 573, - 574, 544, 575, 545, 576, 577, 851, 601, 551, 462, - 409, 0, 618, 0, 0, 930, 938, 0, 0, 0, - 4382, 0, 0, 0, 0, 926, 0, 0, 0, 0, - 804, 0, 0, 841, 906, 905, 828, 838, 0, 2180, - 328, 241, 546, 666, 548, 547, 829, 0, 830, 834, - 837, 833, 831, 832, 0, 921, 3915, 2156, 0, 0, - 0, 2155, 796, 808, 0, 813, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4500, 0, 0, 0, 2173, 0, 0, 0, 0, - 0, 805, 806, 0, 2161, 0, 0, 861, 0, 807, - 0, 0, 0, 0, 0, 463, 493, 0, 506, 151, - 383, 384, 856, 835, 839, 0, 0, 0, 0, 316, - 470, 490, 329, 457, 504, 334, 465, 482, 324, 424, - 454, 0, 0, 318, 488, 464, 406, 317, 0, 448, - 357, 373, 354, 422, 836, 859, 863, 353, 944, 857, - 498, 320, 0, 497, 421, 484, 489, 407, 400, 0, - 319, 486, 405, 399, 387, 363, 945, 388, 389, 378, - 436, 397, 437, 379, 411, 410, 412, 0, 0, 0, - 0, 0, 528, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 659, - 854, 0, 663, 0, 500, 0, 0, 928, 0, 0, - 0, 468, 0, 0, 390, 0, 0, 0, 858, 0, - 451, 427, 941, 0, 0, 449, 395, 485, 438, 491, - 471, 499, 443, 439, 310, 472, 356, 408, 325, 327, - 687, 358, 360, 364, 365, 417, 418, 432, 456, 475, - 476, 477, 355, 339, 450, 340, 375, 341, 311, 347, - 345, 348, 458, 349, 313, 433, 481, 0, 370, 446, - 403, 314, 402, 434, 480, 479, 326, 508, 515, 516, - 606, 0, 521, 698, 699, 700, 530, 0, 440, 322, - 321, 0, 0, 0, 351, 435, 335, 337, 338, 336, - 430, 431, 535, 536, 537, 539, 0, 540, 541, 0, - 0, 0, 0, 542, 607, 623, 591, 560, 523, 615, - 557, 561, 562, 381, 626, 1934, 1933, 1935, 514, 391, - 392, 0, 362, 361, 404, 315, 0, 151, 368, 306, - 307, 693, 925, 423, 628, 661, 662, 553, 0, 940, - 920, 922, 923, 927, 931, 932, 933, 934, 935, 937, - 939, 943, 692, 0, 608, 622, 696, 621, 689, 429, - 0, 455, 619, 566, 0, 612, 585, 586, 0, 613, - 581, 617, 0, 555, 0, 524, 527, 556, 641, 642, - 643, 312, 526, 645, 646, 647, 648, 649, 650, 651, - 644, 942, 589, 565, 592, 505, 568, 567, 0, 0, - 603, 862, 604, 605, 413, 414, 415, 416, 929, 629, - 333, 525, 442, 0, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 595, 596, 593, 701, 0, 652, 653, - 0, 0, 519, 520, 367, 374, 538, 376, 332, 428, - 369, 503, 385, 0, 531, 597, 532, 444, 445, 655, - 658, 656, 657, 420, 380, 382, 459, 386, 396, 447, - 502, 426, 452, 330, 492, 461, 401, 582, 610, 951, - 924, 950, 952, 953, 949, 954, 955, 936, 817, 0, - 869, 870, 947, 946, 948, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 637, 636, 635, 634, - 633, 632, 631, 630, 0, 0, 579, 478, 346, 300, - 342, 343, 350, 690, 686, 483, 691, 824, 308, 559, - 394, 441, 366, 624, 625, 0, 676, 913, 878, 879, - 880, 814, 881, 875, 876, 815, 877, 914, 867, 910, - 911, 843, 872, 882, 909, 883, 912, 915, 916, 956, - 957, 889, 873, 270, 958, 886, 917, 908, 907, 884, - 868, 918, 919, 850, 845, 887, 888, 874, 893, 894, - 895, 898, 816, 899, 900, 901, 902, 903, 897, 896, - 864, 865, 866, 890, 891, 871, 469, 846, 847, 848, - 849, 0, 0, 509, 510, 511, 534, 0, 512, 494, - 558, 377, 309, 473, 501, 688, 0, 0, 0, 0, - 0, 0, 0, 609, 620, 654, 0, 664, 665, 667, - 669, 904, 671, 466, 467, 677, 0, 892, 674, 675, - 672, 398, 453, 474, 460, 0, 694, 549, 550, 695, - 660, 0, 809, 179, 218, 860, 0, 0, 0, 0, - 0, 0, 0, 0, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 0, 0, 0, 0, 812, 0, - 0, 0, 359, 0, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 851, 601, 551, 462, 409, 0, 618, - 0, 0, 930, 938, 0, 0, 0, 0, 0, 0, - 0, 0, 926, 0, 0, 0, 0, 804, 0, 0, - 841, 906, 905, 828, 838, 0, 0, 328, 241, 546, - 666, 548, 547, 829, 0, 830, 834, 837, 833, 831, - 832, 0, 921, 0, 0, 0, 0, 0, 0, 796, - 808, 0, 813, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 805, 806, - 0, 0, 0, 0, 861, 0, 807, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 856, - 835, 839, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 482, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 836, 859, 863, 353, 944, 857, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 945, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 854, 0, 663, - 0, 500, 0, 0, 928, 0, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 858, 0, 451, 427, 941, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 443, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 515, 516, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 925, - 423, 628, 661, 662, 553, 0, 940, 920, 922, 923, - 927, 931, 932, 933, 934, 935, 937, 939, 943, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 651, 644, 942, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 862, 604, - 605, 413, 414, 415, 416, 929, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 951, 924, 950, 952, - 953, 949, 954, 955, 936, 817, 0, 869, 870, 947, - 946, 948, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 824, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 913, 878, 879, 880, 814, 881, - 875, 876, 815, 877, 914, 867, 910, 911, 843, 872, - 882, 909, 883, 912, 915, 916, 956, 957, 889, 873, - 270, 958, 886, 917, 908, 907, 884, 868, 918, 919, - 850, 845, 887, 888, 874, 893, 894, 895, 898, 816, - 899, 900, 901, 902, 903, 897, 896, 864, 865, 866, - 890, 891, 871, 469, 846, 847, 848, 849, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 904, 671, - 466, 467, 677, 0, 892, 674, 675, 672, 398, 453, - 474, 460, 860, 694, 549, 550, 695, 660, 0, 809, - 0, 425, 0, 0, 564, 598, 587, 670, 552, 0, - 0, 0, 0, 0, 0, 812, 0, 0, 0, 359, - 1999, 0, 393, 602, 583, 594, 584, 569, 570, 571, - 578, 371, 572, 573, 574, 544, 575, 545, 576, 577, - 851, 601, 551, 462, 409, 0, 618, 0, 0, 930, - 938, 0, 0, 0, 0, 0, 0, 0, 0, 926, - 0, 2245, 0, 0, 804, 0, 0, 841, 906, 905, - 828, 838, 0, 0, 328, 241, 546, 666, 548, 547, - 829, 0, 830, 834, 837, 833, 831, 832, 0, 921, - 0, 0, 0, 0, 0, 0, 796, 808, 0, 813, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 805, 806, 0, 0, 0, - 0, 861, 0, 807, 0, 0, 0, 0, 0, 463, - 493, 0, 506, 0, 383, 384, 2246, 835, 839, 0, - 0, 0, 0, 316, 470, 490, 329, 457, 504, 334, - 465, 482, 324, 424, 454, 0, 0, 318, 488, 464, - 406, 317, 0, 448, 357, 373, 354, 422, 836, 859, - 863, 353, 944, 857, 498, 320, 0, 497, 421, 484, - 489, 407, 400, 0, 319, 486, 405, 399, 387, 363, - 945, 388, 389, 378, 436, 397, 437, 379, 411, 410, - 412, 0, 0, 0, 0, 0, 528, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 659, 854, 0, 663, 0, 500, 0, - 0, 928, 0, 0, 0, 468, 0, 0, 390, 0, - 0, 0, 858, 0, 451, 427, 941, 0, 0, 449, - 395, 485, 438, 491, 471, 499, 443, 439, 310, 472, - 356, 408, 325, 327, 687, 358, 360, 364, 365, 417, - 418, 432, 456, 475, 476, 477, 355, 339, 450, 340, - 375, 341, 311, 347, 345, 348, 458, 349, 313, 433, - 481, 0, 370, 446, 403, 314, 402, 434, 480, 479, - 326, 508, 515, 516, 606, 0, 521, 698, 699, 700, - 530, 0, 440, 322, 321, 0, 0, 0, 351, 435, - 335, 337, 338, 336, 430, 431, 535, 536, 537, 539, - 0, 540, 541, 0, 0, 0, 0, 542, 607, 623, - 591, 560, 523, 615, 557, 561, 562, 381, 626, 0, - 0, 0, 514, 391, 392, 0, 362, 361, 404, 315, - 0, 0, 368, 306, 307, 693, 925, 423, 628, 661, - 662, 553, 0, 940, 920, 922, 923, 927, 931, 932, - 933, 934, 935, 937, 939, 943, 692, 0, 608, 622, - 696, 621, 689, 429, 0, 455, 619, 566, 0, 612, - 585, 586, 0, 613, 581, 617, 0, 555, 0, 524, - 527, 556, 641, 642, 643, 312, 526, 645, 646, 647, - 648, 649, 650, 651, 644, 942, 589, 565, 592, 505, - 568, 567, 0, 0, 603, 862, 604, 605, 413, 414, - 415, 416, 929, 629, 333, 525, 442, 0, 590, 0, - 0, 0, 0, 0, 0, 0, 0, 595, 596, 593, - 701, 0, 652, 653, 0, 0, 519, 520, 367, 374, - 538, 376, 332, 428, 369, 503, 385, 0, 531, 597, - 532, 444, 445, 655, 658, 656, 657, 420, 380, 382, - 459, 386, 396, 447, 502, 426, 452, 330, 492, 461, - 401, 582, 610, 951, 924, 950, 952, 953, 949, 954, - 955, 936, 817, 0, 869, 870, 947, 946, 948, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 637, 636, 635, 634, 633, 632, 631, 630, 0, 0, - 579, 478, 346, 300, 342, 343, 350, 690, 686, 483, - 691, 824, 308, 559, 394, 441, 366, 624, 625, 0, - 676, 913, 878, 879, 880, 814, 881, 875, 876, 815, - 877, 914, 867, 910, 911, 843, 872, 882, 909, 883, - 912, 915, 916, 956, 957, 889, 873, 270, 958, 886, - 917, 908, 907, 884, 868, 918, 919, 850, 845, 887, - 888, 874, 893, 894, 895, 898, 816, 899, 900, 901, - 902, 903, 897, 896, 864, 865, 866, 890, 891, 871, - 469, 846, 847, 848, 849, 0, 0, 509, 510, 511, - 534, 0, 512, 494, 558, 377, 309, 473, 501, 688, - 0, 0, 0, 0, 0, 0, 0, 609, 620, 654, - 0, 664, 665, 667, 669, 904, 671, 466, 467, 677, - 0, 892, 674, 675, 672, 398, 453, 474, 460, 0, - 694, 549, 550, 695, 660, 0, 809, 179, 218, 860, - 0, 0, 0, 0, 0, 0, 0, 0, 425, 0, - 0, 564, 598, 587, 670, 552, 0, 0, 0, 0, - 0, 0, 812, 0, 0, 0, 359, 0, 0, 393, - 602, 583, 594, 584, 569, 570, 571, 578, 371, 572, - 573, 574, 544, 575, 545, 576, 577, 1369, 601, 551, - 462, 409, 0, 618, 0, 0, 930, 938, 0, 0, - 0, 0, 0, 0, 0, 0, 926, 0, 0, 0, - 0, 804, 0, 0, 841, 906, 905, 828, 838, 0, - 0, 328, 241, 546, 666, 548, 547, 829, 0, 830, - 834, 837, 833, 831, 832, 0, 921, 0, 0, 0, - 0, 0, 0, 796, 808, 0, 813, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 805, 806, 0, 0, 0, 0, 861, 0, - 807, 0, 0, 0, 0, 0, 463, 493, 0, 506, - 0, 383, 384, 856, 835, 839, 0, 0, 0, 0, - 316, 470, 490, 329, 457, 504, 334, 465, 482, 324, - 424, 454, 0, 0, 318, 488, 464, 406, 317, 0, - 448, 357, 373, 354, 422, 836, 859, 863, 353, 944, - 857, 498, 320, 0, 497, 421, 484, 489, 407, 400, - 0, 319, 486, 405, 399, 387, 363, 945, 388, 389, - 378, 436, 397, 437, 379, 411, 410, 412, 0, 0, - 0, 0, 0, 528, 529, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 659, 854, 0, 663, 0, 500, 0, 0, 928, 0, - 0, 0, 468, 0, 0, 390, 0, 0, 0, 858, - 0, 451, 427, 941, 0, 0, 449, 395, 485, 438, - 491, 471, 499, 443, 439, 310, 472, 356, 408, 325, - 327, 687, 358, 360, 364, 365, 417, 418, 432, 456, - 475, 476, 477, 355, 339, 450, 340, 375, 341, 311, - 347, 345, 348, 458, 349, 313, 433, 481, 0, 370, - 446, 403, 314, 402, 434, 480, 479, 326, 508, 515, - 516, 606, 0, 521, 698, 699, 700, 530, 0, 440, - 322, 321, 0, 0, 0, 351, 435, 335, 337, 338, - 336, 430, 431, 535, 536, 537, 539, 0, 540, 541, - 0, 0, 0, 0, 542, 607, 623, 591, 560, 523, - 615, 557, 561, 562, 381, 626, 0, 0, 0, 514, - 391, 392, 0, 362, 361, 404, 315, 0, 0, 368, - 306, 307, 693, 925, 423, 628, 661, 662, 553, 0, - 940, 920, 922, 923, 927, 931, 932, 933, 934, 935, - 937, 939, 943, 692, 0, 608, 622, 696, 621, 689, - 429, 0, 455, 619, 566, 0, 612, 585, 586, 0, - 613, 581, 617, 0, 555, 0, 524, 527, 556, 641, - 642, 643, 312, 526, 645, 646, 647, 648, 649, 650, - 651, 644, 942, 589, 565, 592, 505, 568, 567, 0, - 0, 603, 862, 604, 605, 413, 414, 415, 416, 929, - 629, 333, 525, 442, 0, 590, 0, 0, 0, 0, - 0, 0, 0, 0, 595, 596, 593, 701, 0, 652, - 653, 0, 0, 519, 520, 367, 374, 538, 376, 332, - 428, 369, 503, 385, 0, 531, 597, 532, 444, 445, - 655, 658, 656, 657, 420, 380, 382, 459, 386, 396, - 447, 502, 426, 452, 330, 492, 461, 401, 582, 610, - 951, 924, 950, 952, 953, 949, 954, 955, 936, 817, - 0, 869, 870, 947, 946, 948, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 636, 635, - 634, 633, 632, 631, 630, 0, 0, 579, 478, 346, - 300, 342, 343, 350, 690, 686, 483, 691, 824, 308, - 559, 394, 441, 366, 624, 625, 0, 676, 913, 878, - 879, 880, 814, 881, 875, 876, 815, 877, 914, 867, - 910, 911, 843, 872, 882, 909, 883, 912, 915, 916, - 956, 957, 889, 873, 270, 958, 886, 917, 908, 907, - 884, 868, 918, 919, 850, 845, 887, 888, 874, 893, - 894, 895, 898, 816, 899, 900, 901, 902, 903, 897, - 896, 864, 865, 866, 890, 891, 871, 469, 846, 847, - 848, 849, 0, 0, 509, 510, 511, 534, 0, 512, - 494, 558, 377, 309, 473, 501, 688, 0, 0, 0, - 0, 0, 0, 0, 609, 620, 654, 0, 664, 665, - 667, 669, 904, 671, 466, 467, 677, 0, 892, 674, - 675, 672, 398, 453, 474, 460, 860, 694, 549, 550, - 695, 660, 0, 809, 0, 425, 0, 0, 564, 598, - 587, 670, 552, 0, 0, 0, 0, 0, 0, 812, - 0, 0, 0, 359, 4499, 0, 393, 602, 583, 594, - 584, 569, 570, 571, 578, 371, 572, 573, 574, 544, - 575, 545, 576, 577, 851, 601, 551, 462, 409, 0, - 618, 0, 0, 930, 938, 0, 0, 0, 0, 0, - 0, 0, 0, 926, 0, 0, 0, 0, 804, 0, - 0, 841, 906, 905, 828, 838, 0, 0, 328, 241, - 546, 666, 548, 547, 829, 0, 830, 834, 837, 833, - 831, 832, 0, 921, 0, 0, 0, 0, 0, 0, - 796, 808, 0, 813, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 805, - 806, 0, 0, 0, 0, 861, 0, 807, 0, 0, - 0, 0, 0, 463, 493, 0, 506, 0, 383, 384, - 856, 835, 839, 0, 0, 0, 0, 316, 470, 490, - 329, 457, 504, 334, 465, 482, 324, 424, 454, 0, - 0, 318, 488, 464, 406, 317, 0, 448, 357, 373, - 354, 422, 836, 859, 863, 353, 944, 857, 498, 320, - 0, 497, 421, 484, 489, 407, 400, 0, 319, 486, - 405, 399, 387, 363, 945, 388, 389, 378, 436, 397, - 437, 379, 411, 410, 412, 0, 0, 0, 0, 0, - 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 659, 854, 0, - 663, 0, 500, 0, 0, 928, 0, 0, 0, 468, - 0, 0, 390, 0, 0, 0, 858, 0, 451, 427, - 941, 0, 0, 449, 395, 485, 438, 491, 471, 499, - 443, 439, 310, 472, 356, 408, 325, 327, 687, 358, - 360, 364, 365, 417, 418, 432, 456, 475, 476, 477, - 355, 339, 450, 340, 375, 341, 311, 347, 345, 348, - 458, 349, 313, 433, 481, 0, 370, 446, 403, 314, - 402, 434, 480, 479, 326, 508, 515, 516, 606, 0, - 521, 698, 699, 700, 530, 0, 440, 322, 321, 0, - 0, 0, 351, 435, 335, 337, 338, 336, 430, 431, - 535, 536, 537, 539, 0, 540, 541, 0, 0, 0, - 0, 542, 607, 623, 591, 560, 523, 615, 557, 561, - 562, 381, 626, 0, 0, 0, 514, 391, 392, 0, - 362, 361, 404, 315, 0, 0, 368, 306, 307, 693, - 925, 423, 628, 661, 662, 553, 0, 940, 920, 922, - 923, 927, 931, 932, 933, 934, 935, 937, 939, 943, - 692, 0, 608, 622, 696, 621, 689, 429, 0, 455, - 619, 566, 0, 612, 585, 586, 0, 613, 581, 617, - 0, 555, 0, 524, 527, 556, 641, 642, 643, 312, - 526, 645, 646, 647, 648, 649, 650, 651, 644, 942, - 589, 565, 592, 505, 568, 567, 0, 0, 603, 862, - 604, 605, 413, 414, 415, 416, 929, 629, 333, 525, - 442, 0, 590, 0, 0, 0, 0, 0, 0, 0, - 0, 595, 596, 593, 701, 0, 652, 653, 0, 0, - 519, 520, 367, 374, 538, 376, 332, 428, 369, 503, - 385, 0, 531, 597, 532, 444, 445, 655, 658, 656, - 657, 420, 380, 382, 459, 386, 396, 447, 502, 426, - 452, 330, 492, 461, 401, 582, 610, 951, 924, 950, - 952, 953, 949, 954, 955, 936, 817, 0, 869, 870, - 947, 946, 948, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 637, 636, 635, 634, 633, 632, - 631, 630, 0, 0, 579, 478, 346, 300, 342, 343, - 350, 690, 686, 483, 691, 824, 308, 559, 394, 441, - 366, 624, 625, 0, 676, 913, 878, 879, 880, 814, - 881, 875, 876, 815, 877, 914, 867, 910, 911, 843, - 872, 882, 909, 883, 912, 915, 916, 956, 957, 889, - 873, 270, 958, 886, 917, 908, 907, 884, 868, 918, - 919, 850, 845, 887, 888, 874, 893, 894, 895, 898, - 816, 899, 900, 901, 902, 903, 897, 896, 864, 865, - 866, 890, 891, 871, 469, 846, 847, 848, 849, 0, - 0, 509, 510, 511, 534, 0, 512, 494, 558, 377, - 309, 473, 501, 688, 0, 0, 0, 0, 0, 0, - 0, 609, 620, 654, 0, 664, 665, 667, 669, 904, - 671, 466, 467, 677, 0, 892, 674, 675, 672, 398, - 453, 474, 460, 860, 694, 549, 550, 695, 660, 0, - 809, 0, 425, 0, 0, 564, 598, 587, 670, 552, - 0, 0, 0, 0, 0, 0, 812, 0, 0, 0, - 359, 0, 0, 393, 602, 583, 594, 584, 569, 570, - 571, 578, 371, 572, 573, 574, 544, 575, 545, 576, - 577, 851, 601, 551, 462, 409, 0, 618, 0, 0, - 930, 938, 0, 0, 0, 0, 0, 0, 0, 0, - 926, 0, 0, 0, 0, 804, 0, 0, 841, 906, - 905, 828, 838, 0, 0, 328, 241, 546, 666, 548, - 547, 829, 0, 830, 834, 837, 833, 831, 832, 0, - 921, 0, 0, 0, 0, 0, 0, 796, 808, 0, - 813, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 805, 806, 0, 0, - 0, 0, 861, 0, 807, 0, 0, 0, 0, 0, - 463, 493, 0, 506, 0, 383, 384, 856, 835, 839, - 0, 0, 0, 0, 316, 470, 490, 329, 457, 504, - 334, 465, 482, 324, 424, 454, 0, 0, 318, 488, - 464, 406, 317, 0, 448, 357, 373, 354, 422, 836, - 859, 863, 353, 944, 857, 498, 320, 0, 497, 421, - 484, 489, 407, 400, 0, 319, 486, 405, 399, 387, - 363, 945, 388, 389, 378, 436, 397, 437, 379, 411, - 410, 412, 0, 0, 0, 0, 0, 528, 529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 659, 854, 0, 663, 0, 500, - 0, 0, 928, 0, 0, 0, 468, 0, 0, 390, - 0, 0, 0, 858, 0, 451, 427, 941, 4383, 0, - 449, 395, 485, 438, 491, 471, 499, 443, 439, 310, - 472, 356, 408, 325, 327, 687, 358, 360, 364, 365, - 417, 418, 432, 456, 475, 476, 477, 355, 339, 450, - 340, 375, 341, 311, 347, 345, 348, 458, 349, 313, - 433, 481, 0, 370, 446, 403, 314, 402, 434, 480, - 479, 326, 508, 515, 516, 606, 0, 521, 698, 699, - 700, 530, 0, 440, 322, 321, 0, 0, 0, 351, - 435, 335, 337, 338, 336, 430, 431, 535, 536, 537, - 539, 0, 540, 541, 0, 0, 0, 0, 542, 607, - 623, 591, 560, 523, 615, 557, 561, 562, 381, 626, - 0, 0, 0, 514, 391, 392, 0, 362, 361, 404, - 315, 0, 0, 368, 306, 307, 693, 925, 423, 628, - 661, 662, 553, 0, 940, 920, 922, 923, 927, 931, - 932, 933, 934, 935, 937, 939, 943, 692, 0, 608, - 622, 696, 621, 689, 429, 0, 455, 619, 566, 0, - 612, 585, 586, 0, 613, 581, 617, 0, 555, 0, - 524, 527, 556, 641, 642, 643, 312, 526, 645, 646, - 647, 648, 649, 650, 651, 644, 942, 589, 565, 592, - 505, 568, 567, 0, 0, 603, 862, 604, 605, 413, - 414, 415, 416, 929, 629, 333, 525, 442, 0, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 595, 596, - 593, 701, 0, 652, 653, 0, 0, 519, 520, 367, - 374, 538, 376, 332, 428, 369, 503, 385, 0, 531, - 597, 532, 444, 445, 655, 658, 656, 657, 420, 380, - 382, 459, 386, 396, 447, 502, 426, 452, 330, 492, - 461, 401, 582, 610, 951, 924, 950, 952, 953, 949, - 954, 955, 936, 817, 0, 869, 870, 947, 946, 948, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 636, 635, 634, 633, 632, 631, 630, 0, - 0, 579, 478, 346, 300, 342, 343, 350, 690, 686, - 483, 691, 824, 308, 559, 394, 441, 366, 624, 625, - 0, 676, 913, 878, 879, 880, 814, 881, 875, 876, - 815, 877, 914, 867, 910, 911, 843, 872, 882, 909, - 883, 912, 915, 916, 956, 957, 889, 873, 270, 958, - 886, 917, 908, 907, 884, 868, 918, 919, 850, 845, - 887, 888, 874, 893, 894, 895, 898, 816, 899, 900, - 901, 902, 903, 897, 896, 864, 865, 866, 890, 891, - 871, 469, 846, 847, 848, 849, 0, 0, 509, 510, - 511, 534, 0, 512, 494, 558, 377, 309, 473, 501, - 688, 0, 0, 0, 0, 0, 0, 0, 609, 620, - 654, 0, 664, 665, 667, 669, 904, 671, 466, 467, - 677, 0, 892, 674, 675, 672, 398, 453, 474, 460, - 860, 694, 549, 550, 695, 660, 0, 809, 0, 425, - 0, 0, 564, 598, 587, 670, 552, 0, 0, 0, - 0, 0, 0, 812, 0, 0, 0, 359, 1999, 0, - 393, 602, 583, 594, 584, 569, 570, 571, 578, 371, - 572, 573, 574, 544, 575, 545, 576, 577, 851, 601, - 551, 462, 409, 0, 618, 0, 0, 930, 938, 0, - 0, 0, 0, 0, 0, 0, 0, 926, 0, 0, - 0, 0, 804, 0, 0, 841, 906, 905, 828, 838, - 0, 0, 328, 241, 546, 666, 548, 547, 829, 0, - 830, 834, 837, 833, 831, 832, 0, 921, 0, 0, - 0, 0, 0, 0, 796, 808, 0, 813, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 805, 806, 0, 0, 0, 0, 861, - 0, 807, 0, 0, 0, 0, 0, 463, 493, 0, - 506, 0, 383, 384, 856, 835, 839, 0, 0, 0, - 0, 316, 470, 490, 329, 457, 504, 334, 465, 482, - 324, 424, 454, 0, 0, 318, 488, 464, 406, 317, - 0, 448, 357, 373, 354, 422, 836, 859, 863, 353, - 944, 857, 498, 320, 0, 497, 421, 484, 489, 407, - 400, 0, 319, 486, 405, 399, 387, 363, 945, 388, - 389, 378, 436, 397, 437, 379, 411, 410, 412, 0, - 0, 0, 0, 0, 528, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 659, 854, 0, 663, 0, 500, 0, 0, 928, - 0, 0, 0, 468, 0, 0, 390, 0, 0, 0, - 858, 0, 451, 427, 941, 0, 0, 449, 395, 485, - 438, 491, 471, 499, 443, 439, 310, 472, 356, 408, - 325, 327, 687, 358, 360, 364, 365, 417, 418, 432, - 456, 475, 476, 477, 355, 339, 450, 340, 375, 341, - 311, 347, 345, 348, 458, 349, 313, 433, 481, 0, - 370, 446, 403, 314, 402, 434, 480, 479, 326, 508, - 515, 516, 606, 0, 521, 698, 699, 700, 530, 0, - 440, 322, 321, 0, 0, 0, 351, 435, 335, 337, - 338, 336, 430, 431, 535, 536, 537, 539, 0, 540, - 541, 0, 0, 0, 0, 542, 607, 623, 591, 560, - 523, 615, 557, 561, 562, 381, 626, 0, 0, 0, - 514, 391, 392, 0, 362, 361, 404, 315, 0, 0, - 368, 306, 307, 693, 925, 423, 628, 661, 662, 553, - 0, 940, 920, 922, 923, 927, 931, 932, 933, 934, - 935, 937, 939, 943, 692, 0, 608, 622, 696, 621, - 689, 429, 0, 455, 619, 566, 0, 612, 585, 586, - 0, 613, 581, 617, 0, 555, 0, 524, 527, 556, - 641, 642, 643, 312, 526, 645, 646, 647, 648, 649, - 650, 651, 644, 942, 589, 565, 592, 505, 568, 567, - 0, 0, 603, 862, 604, 605, 413, 414, 415, 416, - 929, 629, 333, 525, 442, 0, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 595, 596, 593, 701, 0, - 652, 653, 0, 0, 519, 520, 367, 374, 538, 376, - 332, 428, 369, 503, 385, 0, 531, 597, 532, 444, - 445, 655, 658, 656, 657, 420, 380, 382, 459, 386, - 396, 447, 502, 426, 452, 330, 492, 461, 401, 582, - 610, 951, 924, 950, 952, 953, 949, 954, 955, 936, - 817, 0, 869, 870, 947, 946, 948, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 637, 636, - 635, 634, 633, 632, 631, 630, 0, 0, 579, 478, - 346, 300, 342, 343, 350, 690, 686, 483, 691, 824, - 308, 559, 394, 441, 366, 624, 625, 0, 676, 913, - 878, 879, 880, 814, 881, 875, 876, 815, 877, 914, - 867, 910, 911, 843, 872, 882, 909, 883, 912, 915, - 916, 956, 957, 889, 873, 270, 958, 886, 917, 908, - 907, 884, 868, 918, 919, 850, 845, 887, 888, 874, - 893, 894, 895, 898, 816, 899, 900, 901, 902, 903, - 897, 896, 864, 865, 866, 890, 891, 871, 469, 846, - 847, 848, 849, 0, 0, 509, 510, 511, 534, 0, - 512, 494, 558, 377, 309, 473, 501, 688, 0, 0, - 0, 0, 0, 0, 0, 609, 620, 654, 0, 664, - 665, 667, 669, 904, 671, 466, 467, 677, 0, 892, - 674, 675, 672, 398, 453, 474, 460, 860, 694, 549, - 550, 695, 660, 0, 809, 0, 425, 0, 0, 564, - 598, 587, 670, 552, 0, 0, 0, 0, 0, 0, - 812, 0, 0, 0, 359, 0, 0, 393, 602, 583, - 594, 584, 569, 570, 571, 578, 371, 572, 573, 574, - 544, 575, 545, 576, 577, 851, 601, 551, 462, 409, - 0, 618, 0, 0, 930, 938, 0, 0, 0, 0, - 0, 0, 0, 0, 926, 0, 0, 0, 0, 804, - 0, 0, 841, 906, 905, 828, 838, 0, 0, 328, - 241, 546, 666, 548, 547, 829, 0, 830, 834, 837, - 833, 831, 832, 0, 921, 0, 0, 0, 0, 0, - 0, 796, 808, 0, 813, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 805, 806, 1696, 0, 0, 0, 861, 0, 807, 0, - 0, 0, 0, 0, 463, 493, 0, 506, 0, 383, - 384, 856, 835, 839, 0, 0, 0, 0, 316, 470, - 490, 329, 457, 504, 334, 465, 482, 324, 424, 454, - 0, 0, 318, 488, 464, 406, 317, 0, 448, 357, - 373, 354, 422, 836, 859, 863, 353, 944, 857, 498, - 320, 0, 497, 421, 484, 489, 407, 400, 0, 319, - 486, 405, 399, 387, 363, 945, 388, 389, 378, 436, - 397, 437, 379, 411, 410, 412, 0, 0, 0, 0, - 0, 528, 529, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 659, 854, - 0, 663, 0, 500, 0, 0, 928, 0, 0, 0, - 468, 0, 0, 390, 0, 0, 0, 858, 0, 451, - 427, 941, 0, 0, 449, 395, 485, 438, 491, 471, - 499, 443, 439, 310, 472, 356, 408, 325, 327, 687, - 358, 360, 364, 365, 417, 418, 432, 456, 475, 476, - 477, 355, 339, 450, 340, 375, 341, 311, 347, 345, - 348, 458, 349, 313, 433, 481, 0, 370, 446, 403, - 314, 402, 434, 480, 479, 326, 508, 515, 516, 606, - 0, 521, 698, 699, 700, 530, 0, 440, 322, 321, - 0, 0, 0, 351, 435, 335, 337, 338, 336, 430, - 431, 535, 536, 537, 539, 0, 540, 541, 0, 0, - 0, 0, 542, 607, 623, 591, 560, 523, 615, 557, - 561, 562, 381, 626, 0, 0, 0, 514, 391, 392, - 0, 362, 361, 404, 315, 0, 0, 368, 306, 307, - 693, 925, 423, 628, 661, 662, 553, 0, 940, 920, - 922, 923, 927, 931, 932, 933, 934, 935, 937, 939, - 943, 692, 0, 608, 622, 696, 621, 689, 429, 0, - 455, 619, 566, 0, 612, 585, 586, 0, 613, 581, - 617, 0, 555, 0, 524, 527, 556, 641, 642, 643, - 312, 526, 645, 646, 647, 648, 649, 650, 651, 644, - 942, 589, 565, 592, 505, 568, 567, 0, 0, 603, - 862, 604, 605, 413, 414, 415, 416, 929, 629, 333, - 525, 442, 0, 590, 0, 0, 0, 0, 0, 0, - 0, 0, 595, 596, 593, 701, 0, 652, 653, 0, - 0, 519, 520, 367, 374, 538, 376, 332, 428, 369, - 503, 385, 0, 531, 597, 532, 444, 445, 655, 658, - 656, 657, 420, 380, 382, 459, 386, 396, 447, 502, - 426, 452, 330, 492, 461, 401, 582, 610, 951, 924, - 950, 952, 953, 949, 954, 955, 936, 817, 0, 869, - 870, 947, 946, 948, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 636, 635, 634, 633, - 632, 631, 630, 0, 0, 579, 478, 346, 300, 342, - 343, 350, 690, 686, 483, 691, 824, 308, 559, 394, - 441, 366, 624, 625, 0, 676, 913, 878, 879, 880, - 814, 881, 875, 876, 815, 877, 914, 867, 910, 911, - 843, 872, 882, 909, 883, 912, 915, 916, 956, 957, - 889, 873, 270, 958, 886, 917, 908, 907, 884, 868, - 918, 919, 850, 845, 887, 888, 874, 893, 894, 895, - 898, 816, 899, 900, 901, 902, 903, 897, 896, 864, - 865, 866, 890, 891, 871, 469, 846, 847, 848, 849, - 0, 0, 509, 510, 511, 534, 0, 512, 494, 558, - 377, 309, 473, 501, 688, 0, 0, 0, 0, 0, - 0, 0, 609, 620, 654, 0, 664, 665, 667, 669, - 904, 671, 466, 467, 677, 0, 892, 674, 675, 672, - 398, 453, 474, 460, 0, 694, 549, 550, 695, 660, - 860, 809, 0, 2420, 0, 0, 0, 0, 0, 425, - 0, 0, 564, 598, 587, 670, 552, 0, 0, 0, - 0, 0, 0, 812, 0, 0, 0, 359, 0, 0, - 393, 602, 583, 594, 584, 569, 570, 571, 578, 371, - 572, 573, 574, 544, 575, 545, 576, 577, 851, 601, - 551, 462, 409, 0, 618, 0, 0, 930, 938, 0, - 0, 0, 0, 0, 0, 0, 0, 926, 0, 0, - 0, 0, 804, 0, 0, 841, 906, 905, 828, 838, - 0, 0, 328, 241, 546, 666, 548, 547, 829, 0, - 830, 834, 837, 833, 831, 832, 0, 921, 0, 0, - 0, 0, 0, 0, 796, 808, 0, 813, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 805, 806, 0, 0, 0, 0, 861, - 0, 807, 0, 0, 0, 0, 0, 463, 493, 0, - 506, 0, 383, 384, 856, 835, 839, 0, 0, 0, - 0, 316, 470, 490, 329, 457, 504, 334, 465, 482, - 324, 424, 454, 0, 0, 318, 488, 464, 406, 317, - 0, 448, 357, 373, 354, 422, 836, 859, 863, 353, - 944, 857, 498, 320, 0, 497, 421, 484, 489, 407, - 400, 0, 319, 486, 405, 399, 387, 363, 945, 388, - 389, 378, 436, 397, 437, 379, 411, 410, 412, 0, - 0, 0, 0, 0, 528, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 659, 854, 0, 663, 0, 500, 0, 0, 928, - 0, 0, 0, 468, 0, 0, 390, 0, 0, 0, - 858, 0, 451, 427, 941, 0, 0, 449, 395, 485, - 438, 491, 471, 499, 443, 439, 310, 472, 356, 408, - 325, 327, 687, 358, 360, 364, 365, 417, 418, 432, - 456, 475, 476, 477, 355, 339, 450, 340, 375, 341, - 311, 347, 345, 348, 458, 349, 313, 433, 481, 0, - 370, 446, 403, 314, 402, 434, 480, 479, 326, 508, - 515, 516, 606, 0, 521, 698, 699, 700, 530, 0, - 440, 322, 321, 0, 0, 0, 351, 435, 335, 337, - 338, 336, 430, 431, 535, 536, 537, 539, 0, 540, - 541, 0, 0, 0, 0, 542, 607, 623, 591, 560, - 523, 615, 557, 561, 562, 381, 626, 0, 0, 0, - 514, 391, 392, 0, 362, 361, 404, 315, 0, 0, - 368, 306, 307, 693, 925, 423, 628, 661, 662, 553, - 0, 940, 920, 922, 923, 927, 931, 932, 933, 934, - 935, 937, 939, 943, 692, 0, 608, 622, 696, 621, - 689, 429, 0, 455, 619, 566, 0, 612, 585, 586, - 0, 613, 581, 617, 0, 555, 0, 524, 527, 556, - 641, 642, 643, 312, 526, 645, 646, 647, 648, 649, - 650, 651, 644, 942, 589, 565, 592, 505, 568, 567, - 0, 0, 603, 862, 604, 605, 413, 414, 415, 416, - 929, 629, 333, 525, 442, 0, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 595, 596, 593, 701, 0, - 652, 653, 0, 0, 519, 520, 367, 374, 538, 376, - 332, 428, 369, 503, 385, 0, 531, 597, 532, 444, - 445, 655, 658, 656, 657, 420, 380, 382, 459, 386, - 396, 447, 502, 426, 452, 330, 492, 461, 401, 582, - 610, 951, 924, 950, 952, 953, 949, 954, 955, 936, - 817, 0, 869, 870, 947, 946, 948, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 637, 636, - 635, 634, 633, 632, 631, 630, 0, 0, 579, 478, - 346, 300, 342, 343, 350, 690, 686, 483, 691, 824, - 308, 559, 394, 441, 366, 624, 625, 0, 676, 913, - 878, 879, 880, 814, 881, 875, 876, 815, 877, 914, - 867, 910, 911, 843, 872, 882, 909, 883, 912, 915, - 916, 956, 957, 889, 873, 270, 958, 886, 917, 908, - 907, 884, 868, 918, 919, 850, 845, 887, 888, 874, - 893, 894, 895, 898, 816, 899, 900, 901, 902, 903, - 897, 896, 864, 865, 866, 890, 891, 871, 469, 846, - 847, 848, 849, 0, 0, 509, 510, 511, 534, 0, - 512, 494, 558, 377, 309, 473, 501, 688, 0, 0, - 0, 0, 0, 0, 0, 609, 620, 654, 0, 664, - 665, 667, 669, 904, 671, 466, 467, 677, 0, 892, - 674, 675, 672, 398, 453, 474, 460, 860, 694, 549, - 550, 695, 660, 0, 809, 0, 425, 0, 0, 564, - 598, 587, 670, 552, 0, 0, 0, 0, 0, 0, - 812, 0, 0, 0, 359, 0, 0, 393, 602, 583, - 594, 584, 569, 570, 571, 578, 371, 572, 573, 574, - 544, 575, 545, 576, 577, 851, 601, 551, 462, 409, - 0, 618, 0, 0, 930, 938, 0, 0, 0, 0, - 0, 0, 0, 0, 926, 0, 0, 0, 0, 804, - 0, 0, 841, 906, 905, 828, 838, 0, 0, 328, - 241, 546, 666, 548, 547, 829, 0, 830, 834, 837, - 833, 831, 832, 0, 921, 0, 0, 0, 0, 0, - 0, 796, 808, 0, 813, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 805, 806, 1992, 0, 0, 0, 861, 0, 807, 0, - 0, 0, 0, 0, 463, 493, 0, 506, 0, 383, - 384, 856, 835, 839, 0, 0, 0, 0, 316, 470, - 490, 329, 457, 504, 334, 465, 482, 324, 424, 454, - 0, 0, 318, 488, 464, 406, 317, 0, 448, 357, - 373, 354, 422, 836, 859, 863, 353, 944, 857, 498, - 320, 0, 497, 421, 484, 489, 407, 400, 0, 319, - 486, 405, 399, 387, 363, 945, 388, 389, 378, 436, - 397, 437, 379, 411, 410, 412, 0, 0, 0, 0, - 0, 528, 529, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 659, 854, - 0, 663, 0, 500, 0, 0, 928, 0, 0, 0, - 468, 0, 0, 390, 0, 0, 0, 858, 0, 451, - 427, 941, 0, 0, 449, 395, 485, 438, 491, 471, - 499, 443, 439, 310, 472, 356, 408, 325, 327, 687, - 358, 360, 364, 365, 417, 418, 432, 456, 475, 476, - 477, 355, 339, 450, 340, 375, 341, 311, 347, 345, - 348, 458, 349, 313, 433, 481, 0, 370, 446, 403, - 314, 402, 434, 480, 479, 326, 508, 515, 516, 606, - 0, 521, 698, 699, 700, 530, 0, 440, 322, 321, - 0, 0, 0, 351, 435, 335, 337, 338, 336, 430, - 431, 535, 536, 537, 539, 0, 540, 541, 0, 0, - 0, 0, 542, 607, 623, 591, 560, 523, 615, 557, - 561, 562, 381, 626, 0, 0, 0, 514, 391, 392, - 0, 362, 361, 404, 315, 0, 0, 368, 306, 307, - 693, 925, 423, 628, 661, 662, 553, 0, 940, 920, - 922, 923, 927, 931, 932, 933, 934, 935, 937, 939, - 943, 692, 0, 608, 622, 696, 621, 689, 429, 0, - 455, 619, 566, 0, 612, 585, 586, 0, 613, 581, - 617, 0, 555, 0, 524, 527, 556, 641, 642, 643, - 312, 526, 645, 646, 647, 648, 649, 650, 651, 644, - 942, 589, 565, 592, 505, 568, 567, 0, 0, 603, - 862, 604, 605, 413, 414, 415, 416, 929, 629, 333, - 525, 442, 0, 590, 0, 0, 0, 0, 0, 0, - 0, 0, 595, 596, 593, 701, 0, 652, 653, 0, - 0, 519, 520, 367, 374, 538, 376, 332, 428, 369, - 503, 385, 0, 531, 597, 532, 444, 445, 655, 658, - 656, 657, 420, 380, 382, 459, 386, 396, 447, 502, - 426, 452, 330, 492, 461, 401, 582, 610, 951, 924, - 950, 952, 953, 949, 954, 955, 936, 817, 0, 869, - 870, 947, 946, 948, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 636, 635, 634, 633, - 632, 631, 630, 0, 0, 579, 478, 346, 300, 342, - 343, 350, 690, 686, 483, 691, 824, 308, 559, 394, - 441, 366, 624, 625, 0, 676, 913, 878, 879, 880, - 814, 881, 875, 876, 815, 877, 914, 867, 910, 911, - 843, 872, 882, 909, 883, 912, 915, 916, 956, 957, - 889, 873, 270, 958, 886, 917, 908, 907, 884, 868, - 918, 919, 850, 845, 887, 888, 874, 893, 894, 895, - 898, 816, 899, 900, 901, 902, 903, 897, 896, 864, - 865, 866, 890, 891, 871, 469, 846, 847, 848, 849, - 0, 0, 509, 510, 511, 534, 0, 512, 494, 558, - 377, 309, 473, 501, 688, 0, 0, 0, 0, 0, - 0, 0, 609, 620, 654, 0, 664, 665, 667, 669, - 904, 671, 466, 467, 677, 0, 892, 674, 675, 672, - 398, 453, 474, 460, 860, 694, 549, 550, 695, 660, - 0, 809, 0, 425, 0, 0, 564, 598, 587, 670, - 552, 0, 0, 0, 0, 0, 0, 812, 0, 0, - 0, 359, 0, 0, 393, 602, 583, 594, 584, 569, - 570, 571, 578, 371, 572, 573, 574, 544, 575, 545, - 576, 577, 851, 601, 551, 462, 409, 0, 618, 0, - 0, 930, 938, 0, 0, 0, 0, 0, 0, 0, - 0, 926, 0, 0, 0, 0, 804, 0, 0, 841, - 906, 905, 828, 838, 0, 0, 328, 241, 546, 666, - 548, 547, 829, 0, 830, 834, 837, 833, 831, 832, - 0, 921, 0, 0, 0, 0, 0, 0, 796, 808, - 0, 813, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 805, 806, 0, - 0, 0, 0, 861, 0, 807, 0, 0, 0, 0, - 0, 463, 493, 0, 506, 0, 383, 384, 856, 835, - 839, 0, 0, 0, 0, 316, 470, 490, 329, 457, - 504, 334, 465, 482, 324, 424, 454, 0, 0, 318, - 488, 464, 406, 317, 0, 448, 357, 373, 354, 422, - 836, 859, 863, 353, 944, 857, 498, 320, 0, 497, - 421, 484, 489, 407, 400, 0, 319, 486, 405, 399, - 387, 363, 945, 388, 389, 378, 436, 397, 437, 379, - 411, 410, 412, 0, 0, 0, 0, 0, 528, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 659, 854, 0, 663, 0, - 500, 0, 0, 928, 0, 0, 0, 468, 0, 0, - 390, 0, 0, 0, 858, 0, 451, 427, 941, 0, - 0, 449, 395, 485, 438, 491, 471, 499, 443, 439, - 310, 472, 356, 408, 325, 327, 687, 358, 360, 364, - 365, 417, 418, 432, 456, 475, 476, 477, 355, 339, - 450, 340, 375, 341, 311, 347, 345, 348, 458, 349, - 313, 433, 481, 0, 370, 446, 403, 314, 402, 434, - 480, 479, 326, 508, 515, 516, 606, 0, 521, 698, - 699, 700, 530, 0, 440, 322, 321, 0, 0, 0, - 351, 435, 335, 337, 338, 336, 430, 431, 535, 536, - 537, 539, 0, 540, 541, 0, 0, 0, 0, 542, - 607, 623, 591, 560, 523, 615, 557, 561, 562, 381, - 626, 0, 0, 0, 514, 391, 392, 0, 362, 361, - 404, 315, 0, 0, 368, 306, 307, 693, 925, 423, - 628, 661, 662, 553, 0, 940, 920, 922, 923, 927, - 931, 932, 933, 934, 935, 937, 939, 943, 692, 0, - 608, 622, 696, 621, 689, 429, 0, 455, 619, 566, - 0, 612, 585, 586, 0, 613, 581, 617, 0, 555, - 0, 524, 527, 556, 641, 642, 643, 312, 526, 645, - 646, 647, 648, 649, 650, 651, 644, 942, 589, 565, - 592, 505, 568, 567, 0, 0, 603, 862, 604, 605, - 413, 414, 415, 416, 929, 629, 333, 525, 442, 0, - 590, 0, 0, 0, 0, 0, 0, 0, 0, 595, - 596, 593, 701, 0, 652, 653, 0, 0, 519, 520, - 367, 374, 538, 376, 332, 428, 369, 503, 385, 0, - 531, 597, 532, 444, 445, 655, 658, 656, 657, 420, - 380, 382, 459, 386, 396, 447, 502, 426, 452, 330, - 492, 461, 401, 582, 610, 951, 924, 950, 952, 953, - 949, 954, 955, 936, 817, 0, 869, 870, 947, 946, - 948, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 637, 636, 635, 634, 633, 632, 631, 630, - 0, 0, 579, 478, 346, 300, 342, 343, 350, 690, - 686, 483, 691, 824, 308, 559, 394, 441, 366, 624, - 625, 0, 676, 913, 878, 879, 880, 814, 881, 875, - 876, 815, 877, 914, 867, 910, 911, 843, 872, 882, - 909, 883, 912, 915, 916, 956, 957, 889, 873, 270, - 958, 886, 917, 908, 907, 884, 868, 918, 919, 850, - 845, 887, 888, 874, 893, 894, 895, 898, 816, 899, - 900, 901, 902, 903, 897, 896, 864, 865, 866, 890, - 891, 871, 469, 846, 847, 848, 849, 0, 0, 509, - 510, 511, 534, 0, 512, 494, 558, 377, 309, 473, - 501, 688, 0, 0, 0, 0, 0, 0, 0, 609, - 620, 654, 0, 664, 665, 667, 669, 904, 671, 466, - 467, 677, 0, 892, 674, 675, 672, 398, 453, 474, - 460, 860, 694, 549, 550, 695, 660, 0, 809, 0, - 425, 0, 0, 564, 598, 587, 670, 552, 0, 0, - 0, 0, 0, 0, 812, 0, 0, 0, 359, 0, - 0, 393, 602, 583, 594, 584, 569, 570, 571, 578, - 371, 572, 573, 574, 544, 575, 545, 576, 577, 851, - 601, 551, 462, 409, 0, 618, 0, 0, 930, 938, - 0, 0, 0, 0, 0, 0, 0, 0, 926, 0, - 0, 0, 0, 804, 0, 0, 841, 906, 905, 828, - 838, 0, 0, 328, 241, 546, 666, 548, 547, 829, - 0, 830, 834, 837, 833, 831, 832, 0, 921, 0, - 0, 0, 0, 0, 0, 796, 808, 0, 813, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 805, 806, 0, 0, 0, 0, - 861, 0, 807, 0, 0, 0, 0, 0, 463, 493, - 0, 506, 0, 383, 384, 856, 835, 839, 0, 0, - 0, 0, 316, 470, 490, 329, 457, 504, 334, 465, - 482, 324, 424, 454, 0, 0, 318, 488, 464, 406, - 317, 0, 448, 357, 373, 354, 422, 836, 859, 863, - 353, 944, 857, 498, 320, 0, 497, 421, 484, 489, - 407, 400, 0, 319, 486, 405, 399, 387, 363, 945, - 388, 389, 378, 436, 397, 437, 379, 411, 410, 412, - 0, 0, 0, 0, 0, 528, 529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 659, 854, 0, 663, 0, 500, 0, 0, - 928, 0, 0, 0, 468, 0, 0, 390, 0, 0, - 0, 858, 0, 451, 427, 941, 0, 0, 449, 395, - 485, 438, 491, 471, 499, 443, 439, 310, 472, 356, - 408, 325, 327, 687, 358, 360, 364, 365, 417, 418, - 432, 456, 475, 476, 477, 355, 339, 450, 340, 375, - 341, 311, 347, 345, 348, 458, 349, 313, 433, 481, - 0, 370, 446, 403, 314, 402, 434, 480, 479, 326, - 508, 515, 516, 606, 0, 521, 698, 699, 700, 530, - 0, 440, 322, 321, 0, 0, 0, 351, 435, 335, - 337, 338, 336, 430, 431, 535, 536, 537, 539, 0, - 540, 541, 0, 0, 0, 0, 542, 607, 623, 591, - 560, 523, 615, 557, 561, 562, 381, 626, 0, 0, - 0, 514, 391, 392, 0, 362, 361, 404, 315, 0, - 0, 368, 306, 307, 693, 925, 423, 628, 661, 662, - 553, 0, 940, 920, 922, 923, 927, 931, 932, 933, - 934, 935, 937, 939, 943, 692, 0, 608, 622, 696, - 621, 689, 429, 0, 455, 619, 566, 0, 612, 585, - 586, 0, 613, 581, 617, 0, 555, 0, 524, 527, - 556, 641, 642, 643, 312, 526, 645, 646, 647, 648, - 649, 650, 651, 644, 942, 589, 565, 592, 505, 568, - 567, 0, 0, 603, 862, 604, 605, 413, 414, 415, - 416, 929, 629, 333, 525, 442, 0, 590, 0, 0, - 0, 0, 0, 0, 0, 0, 595, 596, 593, 701, - 0, 652, 653, 0, 0, 519, 520, 367, 374, 538, - 376, 332, 428, 369, 503, 385, 0, 531, 597, 532, - 444, 445, 655, 658, 656, 657, 420, 380, 382, 459, - 386, 396, 447, 502, 426, 452, 330, 492, 461, 401, - 582, 610, 951, 924, 950, 952, 953, 949, 954, 955, - 936, 817, 0, 869, 870, 947, 946, 948, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 636, 635, 634, 633, 632, 631, 630, 0, 0, 579, - 478, 346, 300, 342, 343, 350, 690, 686, 483, 691, - 824, 308, 559, 394, 441, 366, 624, 625, 0, 676, - 913, 878, 879, 880, 814, 881, 875, 876, 815, 877, - 914, 867, 910, 911, 843, 872, 882, 909, 883, 912, - 915, 916, 956, 957, 889, 873, 270, 958, 886, 917, - 908, 907, 884, 868, 918, 919, 850, 845, 887, 888, - 874, 893, 894, 895, 898, 816, 899, 900, 901, 902, - 903, 897, 896, 864, 865, 866, 890, 891, 871, 469, - 846, 847, 848, 849, 0, 0, 509, 510, 511, 534, - 0, 512, 494, 558, 377, 309, 473, 501, 688, 0, - 0, 0, 0, 0, 0, 0, 609, 620, 654, 0, - 664, 665, 667, 669, 904, 671, 466, 467, 677, 0, - 3855, 674, 3856, 3857, 398, 453, 474, 460, 860, 694, - 549, 550, 695, 660, 0, 809, 0, 425, 0, 0, - 564, 598, 587, 670, 552, 0, 0, 0, 0, 0, - 0, 812, 0, 0, 0, 359, 0, 0, 393, 602, - 583, 594, 584, 569, 570, 571, 578, 371, 572, 573, - 574, 544, 575, 545, 576, 577, 851, 601, 551, 462, - 409, 0, 618, 0, 0, 930, 938, 0, 0, 0, - 0, 0, 0, 0, 0, 926, 0, 0, 0, 0, - 804, 0, 0, 841, 906, 905, 828, 838, 0, 0, - 328, 241, 546, 666, 548, 547, 2946, 0, 2947, 834, - 837, 833, 831, 832, 0, 921, 0, 0, 0, 0, - 0, 0, 796, 808, 0, 813, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 805, 806, 0, 0, 0, 0, 861, 0, 807, - 0, 0, 0, 0, 0, 463, 493, 0, 506, 0, - 383, 384, 856, 835, 839, 0, 0, 0, 0, 316, - 470, 490, 329, 457, 504, 334, 465, 482, 324, 424, - 454, 0, 0, 318, 488, 464, 406, 317, 0, 448, - 357, 373, 354, 422, 836, 859, 863, 353, 944, 857, - 498, 320, 0, 497, 421, 484, 489, 407, 400, 0, - 319, 486, 405, 399, 387, 363, 945, 388, 389, 378, - 436, 397, 437, 379, 411, 410, 412, 0, 0, 0, - 0, 0, 528, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 659, - 854, 0, 663, 0, 500, 0, 0, 928, 0, 0, - 0, 468, 0, 0, 390, 0, 0, 0, 858, 0, - 451, 427, 941, 0, 0, 449, 395, 485, 438, 491, - 471, 499, 443, 439, 310, 472, 356, 408, 325, 327, - 687, 358, 360, 364, 365, 417, 418, 432, 456, 475, - 476, 477, 355, 339, 450, 340, 375, 341, 311, 347, - 345, 348, 458, 349, 313, 433, 481, 0, 370, 446, - 403, 314, 402, 434, 480, 479, 326, 508, 515, 516, - 606, 0, 521, 698, 699, 700, 530, 0, 440, 322, - 321, 0, 0, 0, 351, 435, 335, 337, 338, 336, - 430, 431, 535, 536, 537, 539, 0, 540, 541, 0, - 0, 0, 0, 542, 607, 623, 591, 560, 523, 615, - 557, 561, 562, 381, 626, 0, 0, 0, 514, 391, - 392, 0, 362, 361, 404, 315, 0, 0, 368, 306, - 307, 693, 925, 423, 628, 661, 662, 553, 0, 940, - 920, 922, 923, 927, 931, 932, 933, 934, 935, 937, - 939, 943, 692, 0, 608, 622, 696, 621, 689, 429, - 0, 455, 619, 566, 0, 612, 585, 586, 0, 613, - 581, 617, 0, 555, 0, 524, 527, 556, 641, 642, - 643, 312, 526, 645, 646, 647, 648, 649, 650, 651, - 644, 942, 589, 565, 592, 505, 568, 567, 0, 0, - 603, 862, 604, 605, 413, 414, 415, 416, 929, 629, - 333, 525, 442, 0, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 595, 596, 593, 701, 0, 652, 653, - 0, 0, 519, 520, 367, 374, 538, 376, 332, 428, - 369, 503, 385, 0, 531, 597, 532, 444, 445, 655, - 658, 656, 657, 420, 380, 382, 459, 386, 396, 447, - 502, 426, 452, 330, 492, 461, 401, 582, 610, 951, - 924, 950, 952, 953, 949, 954, 955, 936, 817, 0, - 869, 870, 947, 946, 948, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 637, 636, 635, 634, - 633, 632, 631, 630, 0, 0, 579, 478, 346, 300, - 342, 343, 350, 690, 686, 483, 691, 824, 308, 559, - 394, 441, 366, 624, 625, 0, 676, 913, 878, 879, - 880, 814, 881, 875, 876, 815, 877, 914, 867, 910, - 911, 843, 872, 882, 909, 883, 912, 915, 916, 956, - 957, 889, 873, 270, 958, 886, 917, 908, 907, 884, - 868, 918, 919, 850, 845, 887, 888, 874, 893, 894, - 895, 898, 816, 899, 900, 901, 902, 903, 897, 896, - 864, 865, 866, 890, 891, 871, 469, 846, 847, 848, - 849, 0, 0, 509, 510, 511, 534, 0, 512, 494, - 558, 377, 309, 473, 501, 688, 0, 0, 0, 0, - 0, 0, 0, 609, 620, 654, 0, 664, 665, 667, - 669, 904, 671, 466, 467, 677, 0, 892, 674, 675, - 672, 398, 453, 474, 460, 860, 694, 549, 550, 695, - 660, 0, 809, 0, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 1837, 0, 0, 0, 812, 0, - 0, 0, 359, 0, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 851, 601, 551, 462, 409, 0, 618, - 0, 0, 930, 938, 0, 0, 0, 0, 0, 0, - 0, 0, 926, 0, 0, 0, 0, 804, 0, 0, - 841, 906, 905, 828, 838, 0, 0, 328, 241, 546, - 666, 548, 547, 829, 0, 830, 834, 837, 833, 831, - 832, 0, 921, 0, 0, 0, 0, 0, 0, 0, - 808, 0, 813, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 805, 806, - 0, 0, 0, 0, 861, 0, 807, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 856, - 835, 839, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 482, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 836, 859, 863, 353, 944, 857, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 945, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 854, 0, 663, - 0, 500, 0, 0, 928, 0, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 858, 0, 451, 427, 941, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 443, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 1838, 1839, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 925, - 423, 628, 661, 662, 553, 0, 940, 920, 922, 923, - 927, 931, 932, 933, 934, 935, 937, 939, 943, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 651, 644, 942, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 862, 604, - 605, 413, 414, 415, 416, 929, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 951, 924, 950, 952, - 953, 949, 954, 955, 936, 817, 0, 869, 870, 947, - 946, 948, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 824, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 913, 878, 879, 880, 814, 881, - 875, 876, 815, 877, 914, 867, 910, 911, 843, 872, - 882, 909, 883, 912, 915, 916, 956, 957, 889, 873, - 270, 958, 886, 917, 908, 907, 884, 868, 918, 919, - 850, 845, 887, 888, 874, 893, 894, 895, 898, 816, - 899, 900, 901, 902, 903, 897, 896, 864, 865, 866, - 890, 891, 871, 469, 846, 847, 848, 849, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 904, 671, - 466, 467, 677, 0, 892, 674, 675, 672, 398, 453, - 474, 460, 860, 694, 549, 550, 695, 660, 0, 809, - 0, 425, 0, 0, 564, 598, 587, 670, 552, 0, - 0, 0, 0, 0, 0, 812, 0, 0, 0, 359, - 0, 0, 393, 602, 583, 594, 584, 569, 570, 571, - 578, 371, 572, 573, 574, 544, 575, 545, 576, 577, - 851, 601, 551, 462, 409, 0, 618, 0, 0, 930, - 938, 0, 0, 0, 0, 0, 0, 0, 0, 926, - 0, 0, 0, 0, 804, 0, 0, 841, 906, 905, - 828, 838, 0, 0, 328, 241, 546, 666, 548, 547, - 829, 0, 830, 834, 837, 833, 831, 832, 0, 921, - 0, 0, 0, 0, 0, 0, 0, 808, 0, 813, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 805, 806, 0, 0, 0, - 0, 861, 0, 807, 0, 0, 0, 0, 0, 463, - 493, 0, 506, 0, 383, 384, 856, 835, 839, 0, - 0, 0, 0, 316, 470, 490, 329, 457, 504, 334, - 465, 482, 324, 424, 454, 0, 0, 318, 488, 464, - 406, 317, 0, 448, 357, 373, 354, 422, 836, 859, - 863, 353, 944, 857, 498, 320, 0, 497, 421, 484, - 489, 407, 400, 0, 319, 486, 405, 399, 387, 363, - 945, 388, 389, 378, 436, 397, 437, 379, 411, 410, - 412, 0, 0, 0, 0, 0, 528, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 659, 854, 0, 663, 0, 500, 0, - 0, 928, 0, 0, 0, 468, 0, 0, 390, 0, - 0, 0, 858, 0, 451, 427, 941, 0, 0, 449, - 395, 485, 438, 491, 471, 499, 443, 439, 310, 472, - 356, 408, 325, 327, 687, 358, 360, 364, 365, 417, - 418, 432, 456, 475, 476, 477, 355, 339, 450, 340, - 375, 341, 311, 347, 345, 348, 458, 349, 313, 433, - 481, 0, 370, 446, 403, 314, 402, 434, 480, 479, - 326, 508, 515, 516, 606, 0, 521, 698, 699, 700, - 530, 0, 440, 322, 321, 0, 0, 0, 351, 435, - 335, 337, 338, 336, 430, 431, 535, 536, 537, 539, - 0, 540, 541, 0, 0, 0, 0, 542, 607, 623, - 591, 560, 523, 615, 557, 561, 562, 381, 626, 0, - 0, 0, 514, 391, 392, 0, 362, 361, 404, 315, - 0, 0, 368, 306, 307, 693, 925, 423, 628, 661, - 662, 553, 0, 940, 920, 922, 923, 927, 931, 932, - 933, 934, 935, 937, 939, 943, 692, 0, 608, 622, - 696, 621, 689, 429, 0, 455, 619, 566, 0, 612, - 585, 586, 0, 613, 581, 617, 0, 555, 0, 524, - 527, 556, 641, 642, 643, 312, 526, 645, 646, 647, - 648, 649, 650, 651, 644, 942, 589, 565, 592, 505, - 568, 567, 0, 0, 603, 862, 604, 605, 413, 414, - 415, 416, 929, 629, 333, 525, 442, 0, 590, 0, - 0, 0, 0, 0, 0, 0, 0, 595, 596, 593, - 701, 0, 652, 653, 0, 0, 519, 520, 367, 374, - 538, 376, 332, 428, 369, 503, 385, 0, 531, 597, - 532, 444, 445, 655, 658, 656, 657, 420, 380, 382, - 459, 386, 396, 447, 502, 426, 452, 330, 492, 461, - 401, 582, 610, 951, 924, 950, 952, 953, 949, 954, - 955, 936, 817, 0, 869, 870, 947, 946, 948, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 637, 636, 635, 634, 633, 632, 631, 630, 0, 0, - 579, 478, 346, 300, 342, 343, 350, 690, 686, 483, - 691, 824, 308, 559, 394, 441, 366, 624, 625, 0, - 676, 913, 878, 879, 880, 814, 881, 875, 876, 815, - 877, 914, 867, 910, 911, 843, 872, 882, 909, 883, - 912, 915, 916, 956, 957, 889, 873, 270, 958, 886, - 917, 908, 907, 884, 868, 918, 919, 850, 845, 887, - 888, 874, 893, 894, 895, 898, 816, 899, 900, 901, - 902, 903, 897, 896, 864, 865, 866, 890, 891, 871, - 469, 846, 847, 848, 849, 0, 0, 509, 510, 511, - 534, 0, 512, 494, 558, 377, 309, 473, 501, 688, - 0, 0, 0, 0, 0, 0, 0, 609, 620, 654, - 0, 664, 665, 667, 669, 904, 671, 466, 467, 677, - 0, 892, 674, 675, 672, 398, 453, 474, 460, 860, - 694, 549, 550, 695, 660, 0, 809, 0, 425, 0, - 0, 564, 598, 587, 670, 552, 0, 0, 0, 0, - 0, 0, 812, 0, 0, 0, 359, 0, 0, 393, - 602, 583, 594, 584, 569, 570, 571, 578, 371, 572, - 573, 574, 544, 575, 545, 576, 577, 851, 601, 551, - 462, 409, 0, 618, 0, 0, 930, 938, 0, 0, - 0, 0, 0, 0, 0, 0, 926, 0, 0, 0, - 0, 0, 0, 0, 841, 906, 905, 828, 838, 0, - 0, 328, 241, 546, 666, 548, 547, 829, 0, 830, - 834, 837, 833, 831, 832, 0, 921, 0, 0, 0, - 0, 0, 0, 796, 808, 0, 813, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 805, 806, 0, 0, 0, 0, 861, 0, - 807, 0, 0, 0, 0, 0, 463, 493, 0, 506, - 0, 383, 384, 856, 835, 839, 0, 0, 0, 0, - 316, 470, 490, 329, 457, 504, 334, 465, 482, 324, - 424, 454, 0, 0, 318, 488, 464, 406, 317, 0, - 448, 357, 373, 354, 422, 836, 859, 863, 353, 944, - 857, 498, 320, 0, 497, 421, 484, 489, 407, 400, - 0, 319, 486, 405, 399, 387, 363, 945, 388, 389, - 378, 436, 397, 437, 379, 411, 410, 412, 0, 0, - 0, 0, 0, 528, 529, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 659, 854, 0, 663, 0, 500, 0, 0, 928, 0, - 0, 0, 468, 0, 0, 390, 0, 0, 0, 858, - 0, 451, 427, 941, 0, 0, 449, 395, 485, 438, - 491, 471, 499, 443, 439, 310, 472, 356, 408, 325, - 327, 687, 358, 360, 364, 365, 417, 418, 432, 456, - 475, 476, 477, 355, 339, 450, 340, 375, 341, 311, - 347, 345, 348, 458, 349, 313, 433, 481, 0, 370, - 446, 403, 314, 402, 434, 480, 479, 326, 508, 515, - 516, 606, 0, 521, 698, 699, 700, 530, 0, 440, - 322, 321, 0, 0, 0, 351, 435, 335, 337, 338, - 336, 430, 431, 535, 536, 537, 539, 0, 540, 541, - 0, 0, 0, 0, 542, 607, 623, 591, 560, 523, - 615, 557, 561, 562, 381, 626, 0, 0, 0, 514, - 391, 392, 0, 362, 361, 404, 315, 0, 0, 368, - 306, 307, 693, 925, 423, 628, 661, 662, 553, 0, - 940, 920, 922, 923, 927, 931, 932, 933, 934, 935, - 937, 939, 943, 692, 0, 608, 622, 696, 621, 689, - 429, 0, 455, 619, 566, 0, 612, 585, 586, 0, - 613, 581, 617, 0, 555, 0, 524, 527, 556, 641, - 642, 643, 312, 526, 645, 646, 647, 648, 649, 650, - 651, 644, 942, 589, 565, 592, 505, 568, 567, 0, - 0, 603, 862, 604, 605, 413, 414, 415, 416, 929, - 629, 333, 525, 442, 0, 590, 0, 0, 0, 0, - 0, 0, 0, 0, 595, 596, 593, 701, 0, 652, - 653, 0, 0, 519, 520, 367, 374, 538, 376, 332, - 428, 369, 503, 385, 0, 531, 597, 532, 444, 445, - 655, 658, 656, 657, 420, 380, 382, 459, 386, 396, - 447, 502, 426, 452, 330, 492, 461, 401, 582, 610, - 951, 924, 950, 952, 953, 949, 954, 955, 936, 817, - 0, 869, 870, 947, 946, 948, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 636, 635, - 634, 633, 632, 631, 630, 0, 0, 579, 478, 346, - 300, 342, 343, 350, 690, 686, 483, 691, 824, 308, - 559, 394, 441, 366, 624, 625, 0, 676, 913, 878, - 879, 880, 814, 881, 875, 876, 815, 877, 914, 867, - 910, 911, 843, 872, 882, 909, 883, 912, 915, 916, - 956, 957, 889, 873, 270, 958, 886, 917, 908, 907, - 884, 868, 918, 919, 850, 845, 887, 888, 874, 893, - 894, 895, 898, 816, 899, 900, 901, 902, 903, 897, - 896, 864, 865, 866, 890, 891, 871, 469, 846, 847, - 848, 849, 0, 0, 509, 510, 511, 534, 0, 512, - 494, 558, 377, 309, 473, 501, 688, 0, 0, 0, - 0, 0, 0, 0, 609, 620, 654, 0, 664, 665, - 667, 669, 904, 671, 466, 467, 677, 0, 892, 674, - 675, 672, 398, 453, 474, 460, 0, 694, 549, 550, - 695, 660, 0, 809, 179, 218, 178, 209, 180, 0, - 0, 0, 0, 0, 0, 425, 0, 0, 564, 598, - 587, 670, 552, 0, 210, 0, 0, 0, 0, 0, - 0, 201, 0, 359, 0, 211, 393, 602, 583, 594, - 584, 569, 570, 571, 578, 371, 572, 573, 574, 544, - 575, 545, 576, 577, 149, 601, 551, 462, 409, 0, - 618, 0, 0, 0, 0, 0, 0, 0, 0, 135, - 0, 0, 0, 0, 0, 0, 0, 0, 214, 0, - 0, 240, 0, 0, 0, 0, 0, 0, 328, 241, - 546, 666, 548, 547, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 232, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 463, 493, 0, 506, 0, 383, 384, - 0, 0, 0, 0, 0, 0, 0, 316, 470, 490, - 329, 457, 504, 334, 465, 482, 324, 424, 454, 0, - 0, 318, 488, 464, 406, 317, 0, 448, 357, 373, - 354, 422, 0, 487, 517, 353, 507, 0, 498, 320, - 0, 497, 421, 484, 489, 407, 400, 0, 319, 486, - 405, 399, 387, 363, 533, 388, 389, 378, 436, 397, - 437, 379, 411, 410, 412, 0, 0, 0, 0, 0, - 528, 529, 0, 0, 0, 0, 0, 0, 0, 177, - 207, 216, 208, 74, 133, 0, 0, 659, 0, 0, - 663, 0, 500, 0, 0, 233, 0, 0, 0, 468, - 0, 0, 390, 206, 200, 199, 518, 0, 451, 427, - 245, 0, 0, 449, 395, 485, 438, 491, 471, 499, - 443, 439, 310, 472, 356, 408, 325, 327, 253, 358, - 360, 364, 365, 417, 418, 432, 456, 475, 476, 477, - 355, 339, 450, 340, 375, 341, 311, 347, 345, 348, - 458, 349, 313, 433, 481, 0, 370, 446, 403, 314, - 402, 434, 480, 479, 326, 508, 515, 516, 606, 0, - 521, 638, 639, 640, 530, 0, 440, 322, 321, 0, - 0, 0, 351, 435, 335, 337, 338, 336, 430, 431, - 535, 536, 537, 539, 0, 540, 541, 0, 0, 0, - 0, 542, 607, 623, 591, 560, 523, 615, 557, 561, - 562, 381, 626, 0, 0, 0, 514, 391, 392, 0, - 362, 361, 404, 315, 0, 0, 368, 306, 307, 495, - 352, 423, 628, 661, 662, 553, 0, 616, 554, 563, - 344, 588, 600, 599, 419, 513, 236, 611, 614, 543, - 246, 0, 608, 622, 580, 621, 247, 429, 0, 455, - 619, 566, 0, 612, 585, 586, 0, 613, 581, 617, - 0, 555, 0, 524, 527, 556, 641, 642, 643, 312, - 526, 645, 646, 647, 648, 649, 650, 651, 644, 496, - 589, 565, 592, 505, 568, 567, 0, 0, 603, 522, - 604, 605, 413, 414, 415, 416, 372, 629, 333, 525, - 442, 147, 590, 0, 0, 0, 0, 0, 0, 0, - 0, 595, 596, 593, 244, 0, 652, 653, 0, 0, - 519, 520, 367, 374, 538, 376, 332, 428, 369, 503, - 385, 0, 531, 597, 532, 444, 445, 655, 658, 656, - 657, 420, 380, 382, 459, 386, 396, 447, 502, 426, - 452, 330, 492, 461, 401, 582, 610, 0, 0, 0, - 0, 0, 0, 0, 0, 70, 0, 0, 293, 294, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 637, 636, 635, 634, 633, 632, - 631, 630, 0, 0, 579, 478, 346, 300, 342, 343, - 350, 251, 323, 483, 252, 0, 308, 559, 394, 441, - 366, 624, 625, 65, 676, 254, 255, 256, 257, 258, - 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, - 268, 271, 272, 273, 274, 275, 276, 277, 278, 627, - 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 0, 0, 0, 0, - 302, 678, 679, 680, 681, 682, 0, 0, 303, 304, - 305, 0, 0, 295, 469, 296, 297, 298, 299, 0, - 0, 509, 510, 511, 534, 0, 512, 494, 558, 377, - 309, 473, 501, 248, 49, 234, 237, 239, 238, 0, - 66, 609, 620, 654, 5, 664, 665, 667, 669, 668, - 671, 466, 467, 677, 0, 673, 674, 675, 672, 398, - 453, 474, 460, 152, 249, 549, 550, 250, 660, 179, - 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 425, 0, 0, 564, 598, 587, 670, 552, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, - 0, 393, 602, 583, 594, 584, 569, 570, 571, 578, - 371, 572, 573, 574, 544, 575, 545, 576, 577, 149, - 601, 551, 462, 409, 0, 618, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 214, 0, 0, 240, 0, 0, 0, - 0, 0, 0, 328, 241, 546, 666, 548, 547, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 331, 2600, - 2603, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 463, 493, - 0, 506, 0, 383, 384, 0, 0, 0, 0, 0, - 0, 0, 316, 470, 490, 329, 457, 504, 334, 465, - 482, 324, 424, 454, 0, 0, 318, 488, 464, 406, - 317, 0, 448, 357, 373, 354, 422, 0, 487, 517, - 353, 507, 0, 498, 320, 0, 497, 421, 484, 489, - 407, 400, 0, 319, 486, 405, 399, 387, 363, 533, - 388, 389, 378, 436, 397, 437, 379, 411, 410, 412, - 0, 0, 0, 0, 0, 528, 529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 659, 0, 0, 663, 2604, 500, 0, 0, - 0, 2599, 0, 2598, 468, 2596, 2601, 390, 0, 0, - 0, 518, 0, 451, 427, 697, 0, 0, 449, 395, - 485, 438, 491, 471, 499, 443, 439, 310, 472, 356, - 408, 325, 327, 687, 358, 360, 364, 365, 417, 418, - 432, 456, 475, 476, 477, 355, 339, 450, 340, 375, - 341, 311, 347, 345, 348, 458, 349, 313, 433, 481, - 2602, 370, 446, 403, 314, 402, 434, 480, 479, 326, - 508, 515, 516, 606, 0, 521, 698, 699, 700, 530, - 0, 440, 322, 321, 0, 0, 0, 351, 435, 335, - 337, 338, 336, 430, 431, 535, 536, 537, 539, 0, - 540, 541, 0, 0, 0, 0, 542, 607, 623, 591, - 560, 523, 615, 557, 561, 562, 381, 626, 0, 0, - 0, 514, 391, 392, 0, 362, 361, 404, 315, 0, - 0, 368, 306, 307, 693, 352, 423, 628, 661, 662, - 553, 0, 616, 554, 563, 344, 588, 600, 599, 419, - 513, 0, 611, 614, 543, 692, 0, 608, 622, 696, - 621, 689, 429, 0, 455, 619, 566, 0, 612, 585, - 586, 0, 613, 581, 617, 0, 555, 0, 524, 527, - 556, 641, 642, 643, 312, 526, 645, 646, 647, 648, - 649, 650, 651, 644, 496, 589, 565, 592, 505, 568, - 567, 0, 0, 603, 522, 604, 605, 413, 414, 415, - 416, 372, 629, 333, 525, 442, 0, 590, 0, 0, - 0, 0, 0, 0, 0, 0, 595, 596, 593, 701, - 0, 652, 653, 0, 0, 519, 520, 367, 374, 538, - 376, 332, 428, 369, 503, 385, 0, 531, 597, 532, - 444, 445, 655, 658, 656, 657, 420, 380, 382, 459, - 386, 396, 447, 502, 426, 452, 330, 492, 461, 401, - 582, 610, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 636, 635, 634, 633, 632, 631, 630, 0, 0, 579, - 478, 346, 300, 342, 343, 350, 690, 686, 483, 691, - 0, 308, 559, 394, 441, 366, 624, 625, 0, 676, - 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, - 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, - 275, 276, 277, 278, 627, 269, 270, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 0, 0, 0, 0, 302, 678, 679, 680, 681, - 682, 0, 0, 303, 304, 305, 0, 0, 295, 469, - 296, 297, 298, 299, 0, 0, 509, 510, 511, 534, - 0, 512, 494, 558, 377, 309, 473, 501, 688, 0, - 0, 0, 0, 0, 0, 0, 609, 620, 654, 0, - 664, 665, 667, 669, 668, 671, 466, 467, 677, 0, - 673, 674, 675, 672, 398, 453, 474, 460, 0, 694, - 549, 550, 695, 660, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 359, 0, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 0, 601, 551, 462, 409, 0, 618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1405, 0, 0, - 240, 0, 0, 828, 838, 0, 0, 328, 241, 546, - 666, 548, 547, 829, 0, 830, 834, 837, 833, 831, - 832, 0, 331, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 0, - 835, 0, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 482, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 836, 487, 517, 353, 507, 0, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 533, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 0, 0, 663, - 0, 500, 0, 0, 0, 0, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 518, 0, 451, 427, 697, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 443, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 515, 516, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 352, - 423, 628, 661, 662, 553, 0, 616, 554, 563, 344, - 588, 600, 599, 419, 513, 0, 611, 614, 543, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 651, 644, 496, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 522, 604, - 605, 413, 414, 415, 416, 372, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 0, 0, 0, 0, + 826, 802, 4488, 828, 4462, 3089, 235, 4480, 1744, 2146, + 4394, 4388, 3759, 3868, 1819, 4398, 4387, 3535, 4399, 4179, + 3500, 4294, 811, 4244, 3399, 4345, 4022, 3616, 4077, 2261, + 3788, 4157, 1655, 4118, 804, 4235, 3083, 3401, 3617, 3863, + 4271, 1403, 3950, 4178, 1815, 2988, 3614, 3705, 856, 1885, + 686, 3086, 4147, 3713, 1247, 69, 3873, 1582, 3274, 3820, + 1588, 2087, 2595, 1745, 3719, 4245, 4247, 705, 1872, 3775, + 3509, 716, 1123, 3971, 3063, 3960, 716, 729, 738, 1822, + 3205, 738, 3448, 3465, 3931, 3739, 3423, 3672, 2824, 2248, + 1869, 3206, 3965, 2263, 2245, 150, 800, 3703, 3452, 3112, + 3204, 38, 755, 3529, 3511, 220, 3178, 3741, 2210, 2324, + 3518, 2707, 3201, 2993, 1890, 2287, 1868, 3598, 3666, 2743, + 3577, 3234, 3021, 1887, 3430, 2831, 2356, 2598, 2104, 2917, + 3517, 3428, 3192, 3426, 3476, 750, 746, 3421, 1648, 1252, + 3425, 799, 2390, 2558, 2486, 3034, 1722, 3383, 794, 37, + 1249, 1729, 2485, 3424, 2332, 2333, 2325, 2806, 3114, 2352, + 1737, 1733, 1997, 998, 2322, 2292, 1734, 2241, 2351, 2691, + 3003, 3009, 2686, 1749, 2708, 3094, 2596, 3050, 735, 716, + 1035, 1510, 2058, 2214, 2557, 1886, 2136, 2741, 2386, 231, + 8, 1185, 230, 7, 1544, 1813, 6, 2536, 801, 2353, + 803, 1696, 1664, 704, 1633, 1627, 2079, 1557, 1818, 2319, + 2527, 686, 795, 2591, 2103, 2331, 793, 2328, 1855, 2488, + 1879, 1591, 2530, 1270, 1804, 812, 2308, 1703, 2211, 1116, + 1117, 743, 24, 1812, 2715, 235, 2687, 235, 1567, 1176, + 1177, 1632, 2057, 2053, 1034, 720, 716, 1629, 1583, 1686, + 1483, 1571, 752, 25, 221, 1553, 753, 1156, 961, 217, + 26, 1014, 17, 713, 1891, 10, 1488, 1020, 1032, 737, + 1132, 213, 15, 1065, 1459, 1404, 2360, 1173, 749, 1081, + 685, 1332, 1333, 1334, 1331, 1332, 1333, 1334, 1331, 1332, + 1333, 1334, 1331, 4256, 4143, 2962, 2962, 1592, 28, 2962, + 2717, 3756, 3630, 3488, 1028, 3393, 1029, 3392, 3297, 3296, + 1129, 1253, 795, 2370, 3917, 963, 964, 3722, 34, 2916, + 2020, 1484, 1254, 3609, 2869, 2812, 2810, 2809, 2807, 723, + 1485, 2010, 1710, 1706, 1168, 1169, 1151, 219, 706, 2484, + 1172, 711, 1174, 1478, 1631, 1009, 1549, 1550, 1551, 733, + 741, 985, 4222, 1444, 982, 2262, 3390, 1169, 1763, 1023, + 2498, 1019, 1169, 2491, 1131, 2017, 1487, 3376, 16, 3378, + 3373, 3375, 4474, 1608, 2004, 734, 1474, 1102, 1708, 3861, + 1332, 1333, 1334, 1331, 3270, 1253, 14, 3268, 2297, 4015, + 179, 218, 178, 209, 180, 731, 3623, 1332, 1333, 1334, + 1331, 4230, 2954, 2952, 4396, 4395, 4084, 4078, 3864, 8, + 210, 3615, 7, 2318, 4249, 1398, 1167, 201, 2327, 962, + 1152, 211, 2829, 3347, 2314, 3905, 2636, 4494, 4243, 1001, + 784, 973, 4471, 786, 4092, 4241, 4129, 4090, 785, 3903, + 149, 3694, 1030, 2896, 2505, 730, 2956, 4307, 1672, 1495, + 1493, 1492, 1489, 986, 983, 135, 1133, 1518, 748, 3345, + 1536, 2236, 3199, 732, 214, 2368, 179, 218, 178, 209, + 180, 952, 2030, 951, 953, 954, 1309, 955, 956, 1310, + 1604, 1516, 2097, 1605, 179, 218, 178, 209, 180, 2028, + 2531, 4131, 2735, 1329, 1145, 1140, 1135, 1139, 1143, 2736, + 1925, 2987, 3241, 1025, 1761, 1018, 1805, 1312, 2224, 1809, + 3242, 3243, 2983, 2258, 1022, 1021, 1502, 784, 2225, 2226, + 786, 1634, 1148, 1636, 1760, 785, 1138, 2672, 2722, 1127, + 1128, 2721, 2671, 1808, 2723, 1010, 1096, 1094, 3504, 1095, + 214, 3398, 974, 2825, 907, 1090, 1785, 179, 218, 178, + 209, 180, 3005, 158, 159, 1017, 160, 161, 214, 2035, + 2036, 162, 3006, 986, 163, 3377, 983, 1098, 3374, 1322, + 3502, 1579, 1589, 1590, 1027, 2118, 2985, 1146, 784, 1016, + 1821, 786, 3890, 1015, 1607, 1327, 785, 2980, 1126, 1003, + 1125, 4252, 179, 218, 178, 209, 180, 1587, 4251, 1149, + 4428, 1586, 1589, 1590, 1617, 4250, 1150, 2463, 1008, 4252, + 4359, 3004, 1302, 1770, 4233, 1304, 1307, 3275, 1517, 4402, + 4403, 214, 2095, 4371, 4347, 177, 207, 216, 208, 74, + 133, 4251, 4358, 4250, 4357, 1136, 4350, 1709, 1707, 980, + 1103, 2984, 4081, 1305, 1006, 1825, 1810, 4466, 4467, 206, + 200, 199, 2981, 3618, 3618, 2850, 75, 4347, 1265, 1147, + 179, 218, 178, 209, 180, 1259, 214, 2957, 3280, 3276, + 1807, 3277, 2372, 2242, 157, 4267, 1099, 984, 1308, 3633, + 981, 3942, 2232, 1026, 179, 218, 178, 209, 180, 4236, + 4237, 4238, 4239, 1800, 3704, 1273, 1276, 1137, 3711, 2364, + 3193, 177, 207, 216, 208, 3444, 1007, 2628, 3310, 3133, + 3442, 4133, 4134, 1026, 2674, 716, 2525, 202, 203, 204, + 716, 1258, 717, 2990, 1268, 206, 1262, 4373, 3012, 1325, + 1326, 2634, 2860, 3803, 214, 2681, 4139, 3625, 1101, 3308, + 738, 738, 1324, 716, 205, 1297, 3862, 3889, 2369, 3269, + 3187, 747, 1298, 2031, 4100, 3891, 4101, 1311, 214, 3438, + 3907, 1606, 2676, 2096, 3439, 3440, 1277, 3939, 1620, 2738, + 2029, 3901, 1519, 2677, 2678, 1179, 1144, 212, 1300, 3450, + 3441, 3449, 2986, 1132, 2964, 1024, 1577, 1806, 2684, 1824, + 1823, 1303, 1306, 2982, 1319, 703, 2256, 2257, 145, 3819, + 1599, 4401, 205, 3533, 146, 3534, 3506, 2955, 1320, 1321, + 1477, 1375, 2614, 1141, 1299, 4206, 1142, 1100, 2594, 2617, + 4259, 3815, 4103, 1129, 3706, 1013, 735, 735, 735, 2375, + 2377, 2378, 4255, 4142, 3636, 3314, 1691, 3904, 2961, 1494, + 1254, 1491, 1254, 4121, 1257, 4100, 3966, 4101, 179, 218, + 1254, 3918, 4102, 3728, 3531, 3532, 1602, 1603, 1258, 147, + 3530, 1132, 3602, 4095, 1831, 1834, 1835, 3463, 3008, 1369, + 3477, 4287, 67, 4169, 4161, 1832, 2616, 1131, 3298, 977, + 4282, 3051, 3295, 1289, 3676, 3678, 2395, 3436, 4045, 3909, + 3910, 3911, 1407, 1301, 987, 2538, 2235, 740, 149, 2359, + 739, 1129, 3197, 2533, 3808, 3384, 4272, 1169, 4289, 1169, + 1169, 1169, 3760, 4103, 4295, 3501, 3088, 1169, 1169, 1275, + 1274, 3450, 214, 70, 1254, 3084, 3085, 2516, 3088, 1153, + 4127, 2371, 1134, 3767, 1314, 1566, 3537, 1315, 1002, 2808, + 2615, 1000, 3926, 4102, 4266, 3687, 2601, 3821, 4091, 1267, + 3411, 2668, 4010, 736, 978, 1131, 1711, 1589, 1590, 155, + 215, 1278, 156, 4072, 4132, 1317, 4500, 2646, 2645, 2738, + 1097, 65, 4044, 3690, 3876, 3999, 1280, 1480, 1482, 3018, + 1486, 1408, 787, 788, 789, 790, 791, 1246, 962, 1589, + 1590, 2090, 4005, 1028, 3450, 1029, 1506, 733, 733, 733, + 1509, 1286, 1490, 3906, 1515, 1371, 1372, 1373, 1374, 1282, + 1283, 1911, 1762, 1485, 1485, 1457, 736, 70, 1462, 979, + 2953, 2666, 2667, 734, 734, 734, 1288, 1245, 1128, 1644, + 1643, 1501, 716, 4483, 1035, 1795, 215, 1578, 1796, 1376, + 1287, 3689, 1564, 731, 731, 731, 1563, 4170, 4162, 1562, + 2243, 148, 49, 3194, 1261, 1263, 1266, 1264, 66, 3445, + 1497, 736, 5, 3311, 1581, 1580, 4135, 3507, 4296, 787, + 788, 789, 790, 791, 1313, 4148, 3510, 2594, 4372, 4386, + 70, 152, 153, 4183, 3011, 154, 1250, 3742, 1273, 1276, + 3367, 2680, 3943, 730, 730, 730, 2637, 716, 2600, 1499, + 3859, 1622, 1511, 2602, 4096, 716, 2376, 1523, 4246, 686, + 686, 732, 732, 732, 1318, 3252, 3253, 2233, 3437, 686, + 686, 748, 1585, 1659, 1659, 70, 716, 4344, 1801, 736, + 787, 788, 789, 790, 791, 3134, 1316, 3135, 3136, 3015, + 3016, 1833, 3536, 1630, 1419, 1420, 4041, 738, 1687, 705, + 3531, 3532, 2364, 736, 3014, 1699, 1661, 2603, 3748, 1277, + 976, 2611, 3162, 1294, 1366, 1365, 3673, 1657, 1657, 3553, + 235, 4023, 4024, 4025, 4029, 4027, 4028, 4030, 4026, 686, + 3526, 1540, 1666, 1512, 1513, 2856, 4484, 2727, 1522, 1524, + 1525, 1526, 1527, 70, 1529, 4096, 1520, 2604, 2670, 4097, + 1535, 1618, 2632, 2489, 1956, 1958, 1957, 1907, 2361, 2231, + 2208, 1528, 1508, 3830, 1904, 3568, 3555, 70, 1906, 1903, + 1905, 1909, 1910, 2537, 1463, 2013, 1908, 4182, 2517, 1621, + 3025, 3029, 3030, 3031, 3026, 3028, 3027, 3313, 1461, 1741, + 1534, 4001, 4006, 4007, 1746, 4000, 1533, 4046, 4047, 3236, + 3238, 1532, 1293, 1531, 1759, 1559, 1104, 742, 3527, 1653, + 1654, 4042, 4043, 1027, 4050, 4049, 4048, 4051, 4052, 4053, + 4056, 4057, 4385, 1521, 2197, 2195, 4054, 1955, 3697, 2196, + 1783, 2387, 3181, 2373, 2374, 1786, 4013, 4055, 3131, 3667, + 2847, 1496, 1547, 1036, 1659, 1541, 1659, 1258, 3153, 3154, + 1748, 1556, 1543, 2511, 2510, 1132, 2039, 2977, 1548, 1565, + 1573, 1574, 1275, 1274, 2509, 1505, 1575, 2038, 1091, 4481, + 4482, 999, 1609, 1610, 1594, 1595, 3680, 1597, 1598, 1503, + 1504, 1600, 2508, 1720, 2018, 1723, 1724, 2037, 988, 1638, + 1640, 1593, 2658, 2605, 1596, 989, 1717, 1725, 1726, 1651, + 1652, 1755, 1688, 1511, 1568, 1572, 1572, 1572, 3972, 1731, + 1732, 1038, 1039, 1040, 3061, 3459, 735, 1659, 1642, 735, + 735, 1914, 1915, 1916, 1917, 1918, 1919, 1912, 1913, 2012, + 4509, 1568, 1568, 1794, 1258, 1889, 2610, 1091, 1667, 1739, + 2608, 1802, 1091, 1736, 1498, 1500, 1740, 1920, 1921, 1938, + 1924, 1673, 1679, 992, 711, 3749, 1248, 4502, 1939, 1712, + 4354, 1873, 1093, 1700, 992, 1092, 1685, 3574, 2601, 2604, + 1820, 1946, 4496, 1948, 1701, 1949, 1950, 1951, 3163, 3165, + 3166, 3167, 3164, 2996, 3237, 1330, 4490, 3152, 2738, 2631, + 2834, 3570, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, + 1849, 1850, 1851, 1852, 1294, 1817, 4071, 1928, 1929, 1930, + 1866, 1867, 3700, 4477, 2429, 2014, 991, 2428, 2997, 2998, + 1944, 994, 993, 1945, 1558, 3528, 1258, 996, 4492, 1836, + 1292, 1093, 994, 993, 1092, 1798, 1093, 2705, 2021, 1092, + 2286, 2022, 1964, 1965, 2025, 1768, 1751, 4441, 1771, 716, + 716, 716, 1814, 1105, 2358, 1923, 3460, 2366, 2040, 2042, + 1947, 2043, 3635, 2045, 2046, 1995, 2478, 705, 1687, 3062, + 1994, 4491, 4414, 2054, 4411, 1659, 2060, 2061, 4410, 2063, + 1622, 716, 2529, 4404, 4382, 1792, 716, 733, 4337, 1659, + 733, 733, 1788, 1035, 1791, 1811, 2088, 1787, 4442, 3370, + 1998, 1816, 1330, 2855, 1937, 4336, 1853, 1854, 995, 2404, + 1864, 1865, 1659, 734, 4317, 2605, 734, 734, 1622, 1330, + 2600, 2594, 2599, 729, 2597, 2602, 1332, 1333, 1334, 1331, + 1793, 1558, 4442, 731, 4290, 1857, 731, 731, 1248, 1332, + 1333, 1334, 1331, 2117, 1769, 4278, 1132, 1772, 1773, 2006, + 1622, 1332, 1333, 1334, 1331, 2126, 2126, 4415, 1622, 4412, + 1622, 1622, 4220, 2366, 716, 716, 1330, 2193, 2405, 4383, + 2054, 2201, 1780, 1330, 1659, 2205, 2206, 2706, 2706, 2603, + 2221, 3487, 686, 730, 3371, 2001, 730, 730, 1777, 1778, + 1330, 4219, 2081, 3541, 3368, 2284, 686, 2403, 1659, 2405, + 1790, 732, 3539, 4198, 732, 732, 3417, 2121, 2064, 3342, + 3382, 2358, 2528, 2062, 1294, 179, 218, 4197, 1789, 2366, + 3046, 1332, 1333, 1334, 1331, 716, 2054, 1659, 4196, 2268, + 4279, 716, 716, 716, 746, 746, 1952, 1953, 4195, 3042, + 3380, 2278, 2084, 2280, 2281, 2282, 4173, 4221, 2358, 2288, + 2050, 2051, 2052, 2706, 1803, 3255, 235, 4172, 2148, 235, + 235, 2002, 235, 2066, 2067, 2068, 2069, 1996, 2839, 3062, + 2048, 2199, 2958, 4145, 2259, 4115, 2555, 2830, 2122, 3369, + 2011, 4112, 2015, 2059, 2357, 3574, 2129, 2019, 2405, 3040, + 1291, 1782, 3826, 966, 967, 968, 969, 2075, 2251, 2252, + 1781, 1458, 2405, 2092, 2093, 2223, 2587, 1938, 1938, 2335, + 3769, 2091, 2483, 2405, 2477, 3730, 2342, 2049, 2476, 2438, + 2098, 3659, 2437, 2405, 2270, 2271, 2272, 2228, 2436, 2230, + 2237, 2366, 3655, 2109, 3549, 2348, 3231, 2085, 2128, 3043, + 2249, 2250, 2366, 2105, 2089, 2107, 2108, 3054, 2935, 2116, + 2088, 2100, 2119, 2120, 1659, 2355, 2317, 2244, 2405, 2114, + 1330, 2296, 1132, 2267, 2299, 2300, 2555, 2302, 2106, 2101, + 2102, 2855, 2923, 2915, 2130, 2131, 1670, 2738, 2110, 1292, + 2254, 2207, 2204, 2601, 2604, 2871, 2111, 2112, 2853, 2841, + 2115, 2125, 2127, 1542, 2836, 3770, 1613, 1614, 1876, 1616, + 3731, 1619, 1129, 1623, 1624, 1625, 3660, 2123, 2357, 1294, + 1568, 2349, 2222, 2198, 2209, 1645, 2203, 3656, 3938, 3550, + 2574, 2706, 2821, 2819, 1572, 2238, 735, 4217, 4061, 2227, + 3756, 2229, 2837, 2555, 3260, 1814, 1572, 1674, 1675, 1676, + 1677, 1678, 3710, 1680, 1681, 1682, 1683, 1684, 2817, 2336, + 3064, 1690, 2967, 1692, 1693, 1694, 1131, 1330, 1330, 971, + 2266, 2815, 2330, 2858, 1132, 2273, 2274, 2554, 2857, 2265, + 1330, 2849, 2380, 2555, 2842, 1959, 1960, 1961, 1962, 2837, + 2293, 1966, 1967, 1968, 1969, 1971, 1972, 1973, 1974, 1975, + 1976, 1977, 1978, 1979, 1980, 1981, 2581, 1164, 1165, 1166, + 966, 967, 968, 969, 1129, 2310, 2305, 2822, 2820, 2384, + 2385, 1332, 1333, 1334, 1331, 2471, 2424, 2409, 2347, 796, + 1332, 1333, 1334, 1331, 2291, 2276, 2479, 2469, 2016, 2445, + 2605, 1163, 2088, 2816, 1160, 2600, 2594, 2599, 1765, 2597, + 2602, 2444, 1332, 1333, 1334, 1331, 2816, 1384, 3045, 2346, + 1279, 2589, 2555, 2344, 1332, 1333, 1334, 1331, 1131, 2427, + 1243, 1238, 4059, 2490, 2393, 2492, 3824, 2494, 2495, 2573, + 2418, 2417, 2416, 2439, 2440, 2406, 2442, 2350, 3341, 716, + 1622, 716, 1622, 2449, 1332, 1333, 1334, 1331, 2392, 2391, + 2253, 2363, 2512, 2461, 2603, 1716, 1715, 733, 794, 2407, + 2472, 716, 716, 716, 2388, 1347, 2365, 2526, 4163, 2382, + 2383, 2478, 2470, 2379, 1330, 1774, 990, 716, 716, 716, + 716, 1366, 1365, 734, 4283, 3492, 1330, 3305, 2381, 1332, + 1333, 1334, 1331, 1938, 1938, 1857, 4503, 3973, 2892, 2893, + 2559, 1649, 2475, 731, 1330, 2886, 2561, 2562, 2563, 2397, + 2566, 1622, 1650, 3745, 2345, 1330, 1330, 1330, 1927, 1926, + 2405, 3880, 2462, 2464, 2465, 2466, 971, 2468, 1927, 1926, + 4284, 1647, 1229, 1225, 1226, 1227, 1228, 4470, 2891, 1622, + 2890, 2889, 2887, 3974, 3478, 1569, 2629, 2401, 1132, 3743, + 1132, 2366, 1601, 730, 4257, 4210, 2623, 1554, 4164, 3746, + 1775, 1555, 829, 839, 1157, 1158, 1159, 1162, 2502, 1161, + 2504, 732, 830, 4144, 831, 835, 838, 834, 832, 833, + 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1347, 1129, 1350, + 1351, 1352, 1353, 1354, 1347, 3744, 2081, 4088, 2807, 4039, + 2548, 4003, 4002, 2560, 4165, 1332, 1333, 1334, 1331, 3988, + 3946, 2888, 1170, 1171, 3721, 3575, 3610, 1175, 716, 2126, + 3566, 3558, 2480, 2294, 3551, 3479, 3454, 2710, 2710, 2221, + 2710, 2630, 3190, 3189, 1970, 1646, 1863, 4356, 997, 836, + 3023, 2963, 1131, 2868, 1963, 2493, 2840, 3879, 2330, 2497, + 686, 686, 1860, 1862, 1859, 1554, 1861, 2729, 1258, 1555, + 2496, 2339, 2338, 2337, 1659, 716, 1570, 2583, 1538, 2578, + 837, 3480, 1537, 1260, 2518, 2580, 3607, 2582, 2878, 2801, + 716, 3403, 3400, 2593, 1132, 1880, 1258, 2789, 705, 1880, + 2592, 2398, 1407, 3403, 1704, 1699, 2294, 2221, 3261, 2044, + 2797, 2552, 2799, 1334, 1331, 235, 4114, 2669, 2733, 2551, + 2549, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1336, 2568, + 2569, 4113, 2793, 1331, 1129, 2567, 4018, 4017, 3481, 2571, + 2572, 3123, 3121, 2724, 3100, 2725, 3098, 2714, 2586, 2712, + 3994, 2716, 2570, 1332, 1333, 1334, 1331, 2576, 4499, 2844, + 2577, 3022, 3608, 4419, 2730, 2731, 4324, 4325, 2851, 3400, + 4381, 2355, 4200, 4201, 2606, 2607, 2420, 2612, 1659, 3402, + 1659, 2718, 1659, 2740, 3947, 3948, 2745, 1258, 1131, 4380, + 2575, 1408, 2945, 2579, 2946, 2870, 1346, 1345, 1355, 1356, + 1357, 1358, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1347, + 1332, 1333, 1334, 1331, 4327, 2796, 1386, 4326, 3714, 2746, + 2802, 2811, 4323, 4498, 2861, 1659, 1258, 2431, 3940, 1385, + 2899, 4322, 3334, 2685, 2679, 1332, 1333, 1334, 1331, 1572, + 1332, 1333, 1334, 1331, 2880, 2906, 2419, 3708, 2719, 2803, + 1659, 2269, 1332, 1333, 1334, 1331, 4444, 2894, 3174, 4321, + 3172, 1705, 4319, 2279, 1332, 1333, 1334, 1331, 4318, 1657, + 4391, 1764, 1704, 1332, 1333, 1334, 1331, 2734, 2832, 2833, + 3170, 1942, 2907, 1332, 1333, 1334, 1331, 4285, 3941, 2737, + 1638, 1640, 2989, 4186, 1657, 3333, 1943, 1332, 1333, 1334, + 1331, 2790, 4304, 4176, 3159, 4166, 2795, 3709, 4138, 4111, + 2865, 2794, 2965, 2828, 2912, 2913, 3320, 2969, 3173, 2971, + 3171, 4079, 1332, 1333, 1334, 1331, 716, 716, 716, 1332, + 1333, 1334, 1331, 3897, 4012, 3976, 2341, 2881, 3894, 2883, + 3169, 1258, 4495, 3975, 2867, 3761, 3747, 2826, 2908, 1659, + 2862, 2876, 1622, 2897, 1332, 1333, 1334, 1331, 1622, 2201, + 1332, 1333, 1334, 1331, 3158, 1332, 1333, 1334, 1331, 2852, + 2854, 3893, 3707, 2859, 3443, 3301, 3057, 3060, 3273, 3272, + 3883, 3157, 3720, 3156, 3065, 3155, 1814, 3147, 2949, 3141, + 2219, 2872, 2873, 3140, 1332, 1333, 1334, 1331, 1332, 1333, + 1334, 1331, 3075, 3139, 2905, 3138, 2875, 1332, 1333, 1334, + 1331, 2895, 1258, 2959, 2823, 2885, 1132, 2937, 2726, 2938, + 3097, 2940, 2482, 2942, 2943, 3882, 2313, 1258, 1258, 1258, + 2126, 2745, 2312, 1258, 2311, 3107, 3108, 3109, 3110, 1258, + 3117, 2307, 3118, 3119, 2402, 3120, 2306, 3122, 3881, 3035, + 2260, 2027, 1332, 1333, 1334, 1331, 3052, 2024, 3117, 3038, + 3812, 715, 3041, 3429, 2746, 3641, 718, 1766, 1476, 4493, + 2710, 4136, 4137, 1241, 2950, 1332, 1333, 1334, 1331, 2412, + 3019, 3869, 4468, 4434, 3175, 4368, 3036, 1332, 1333, 1334, + 1331, 4366, 1332, 1333, 1334, 1331, 3078, 686, 4119, 4342, + 2148, 1332, 1333, 1334, 1331, 2201, 4328, 4269, 3951, 1258, + 2221, 2221, 2221, 2221, 2221, 2221, 1332, 1333, 1334, 1331, + 4263, 3066, 1332, 1333, 1334, 1331, 1258, 2221, 2999, 4254, + 2710, 3017, 1240, 4240, 3180, 3092, 3000, 4231, 3002, 4205, + 4204, 4190, 4185, 3076, 3372, 3095, 3239, 2400, 1659, 3095, + 3092, 3103, 3104, 4184, 1641, 4141, 3106, 2059, 3044, 716, + 716, 3059, 3113, 8, 4126, 3091, 7, 4124, 4110, 715, + 3056, 1332, 1333, 1334, 1331, 4080, 1332, 1333, 1334, 1331, + 3102, 3343, 3077, 3996, 2918, 2919, 3090, 1335, 3955, 3944, + 2924, 3928, 3093, 3182, 3080, 1368, 3927, 3099, 3068, 3923, + 3096, 3921, 3105, 3071, 1378, 3900, 3227, 3899, 1332, 1333, + 1334, 1331, 3337, 3257, 3896, 3895, 3137, 4316, 3336, 3871, + 3867, 3074, 3865, 4501, 235, 1332, 1333, 1334, 1331, 235, + 1387, 3836, 3207, 3240, 3195, 3833, 718, 3828, 3335, 1332, + 1333, 1334, 1331, 3067, 3149, 1332, 1333, 1334, 1331, 3207, + 3179, 3702, 3072, 3073, 3682, 3668, 3647, 3256, 1938, 3645, + 1938, 3639, 3624, 3294, 3185, 1332, 1333, 1334, 1331, 3586, + 3300, 3191, 3564, 3563, 3561, 3560, 1659, 3552, 3547, 3307, + 3546, 2635, 3455, 3415, 2638, 2639, 2640, 2641, 2642, 2643, + 2644, 2934, 3224, 2647, 2648, 2649, 2650, 2651, 2652, 2653, + 2654, 2655, 2656, 2657, 3230, 2659, 2660, 2661, 2662, 2663, + 3228, 2664, 1132, 3414, 3404, 1724, 3244, 3247, 1332, 1333, + 1334, 1331, 3229, 3394, 2933, 1725, 1726, 3188, 3389, 3262, + 3387, 3248, 2487, 3315, 3266, 3312, 1731, 1732, 3208, 3209, + 3210, 3211, 3212, 3213, 3299, 1998, 3271, 3246, 3183, 3168, + 3293, 1332, 1333, 1334, 1331, 3160, 3150, 3148, 3289, 3144, + 1739, 3143, 3142, 2978, 1736, 2968, 2960, 1740, 3291, 1346, + 1345, 1355, 1356, 1357, 1358, 1348, 1349, 1350, 1351, 1352, + 1353, 1354, 1347, 3264, 2848, 3388, 907, 906, 3391, 2827, + 3263, 2791, 2513, 716, 1622, 2500, 2932, 2499, 2316, 2309, + 2124, 4455, 3405, 3407, 3408, 3410, 2056, 3412, 3413, 3309, + 2026, 3285, 3304, 3290, 3292, 3282, 1258, 2023, 3287, 2931, + 3278, 2009, 1258, 1332, 1333, 1334, 1331, 2008, 3432, 3434, + 1767, 1415, 1411, 1410, 1244, 3303, 3317, 975, 4456, 3447, + 179, 218, 3316, 4302, 3332, 716, 1332, 1333, 1334, 1331, + 2930, 4298, 4116, 3323, 3324, 3328, 3329, 4107, 3462, 2929, + 3466, 1258, 3326, 4106, 716, 4093, 716, 2201, 1258, 1258, + 2928, 3325, 4089, 3327, 3898, 179, 218, 1332, 1333, 1334, + 1331, 2927, 2221, 2559, 3877, 3491, 1332, 1333, 1334, 1331, + 3482, 3846, 3738, 3381, 3737, 3734, 3699, 1332, 1333, 1334, + 1331, 3664, 3662, 2623, 2926, 3661, 3658, 3657, 1332, 1333, + 1334, 1331, 3646, 3644, 214, 3516, 1132, 3519, 1132, 3519, + 3519, 3628, 3396, 3451, 1258, 1132, 3613, 3386, 3458, 3385, + 1132, 1332, 1333, 1334, 1331, 3612, 3597, 3596, 3485, 3418, + 3419, 3416, 3542, 3379, 1698, 3092, 3035, 3339, 3538, 214, + 1659, 1659, 3330, 3322, 3321, 1132, 1129, 3319, 3254, 2925, + 2818, 2814, 3435, 2813, 3469, 3503, 3505, 3038, 2450, 2443, + 2435, 3475, 2434, 2433, 2432, 2430, 3483, 2426, 218, 178, + 209, 180, 3543, 3544, 3092, 3484, 1332, 1333, 1334, 1331, + 3489, 3092, 3092, 2425, 1657, 1657, 3461, 716, 3468, 3457, + 2423, 3499, 2414, 3514, 2411, 3473, 3474, 3432, 2410, 2922, + 1131, 2315, 1987, 1985, 1984, 1983, 2921, 1982, 1941, 1940, + 1622, 1931, 1671, 2201, 2201, 3515, 3490, 3524, 1669, 3486, + 218, 3494, 3498, 4418, 4335, 2593, 1332, 1333, 1334, 1331, + 4303, 1405, 2592, 1332, 1333, 1334, 1331, 3092, 4297, 3520, + 3521, 214, 4226, 3007, 3348, 3349, 4223, 4214, 4194, 3540, + 3350, 3351, 3352, 3353, 4187, 3354, 3355, 3356, 3357, 3358, + 3359, 3360, 3361, 3362, 3363, 3364, 1258, 3525, 4448, 2920, + 4074, 2899, 4073, 4446, 2914, 4034, 841, 151, 2902, 3611, + 3548, 4016, 151, 179, 218, 3493, 4014, 4400, 2898, 4009, + 3495, 3496, 3522, 214, 3987, 1251, 1332, 1333, 1334, 1331, + 1256, 1332, 1333, 1334, 1331, 1332, 1333, 1334, 1331, 3970, + 1826, 1827, 1828, 1829, 1830, 1332, 1333, 1334, 1331, 3847, + 3844, 3557, 3810, 1285, 716, 3571, 3572, 3556, 3809, 3565, + 3806, 3805, 3768, 3288, 3562, 3765, 3763, 3559, 3569, 3723, + 3497, 3582, 3681, 3583, 3677, 3331, 712, 1719, 3129, 3130, + 3581, 2877, 1730, 151, 1721, 1877, 2745, 214, 1735, 1881, + 1882, 1883, 1884, 3145, 3146, 3590, 2474, 1738, 1727, 1922, + 2473, 1545, 179, 218, 3593, 3594, 3595, 1932, 1332, 1333, + 1334, 1331, 2467, 3218, 3176, 3600, 1875, 3101, 3048, 2746, + 3047, 3039, 3186, 1332, 1333, 1334, 1331, 1332, 1333, 1334, + 1331, 3670, 3001, 2936, 2835, 2288, 3621, 2728, 3629, 1332, + 1333, 1334, 1331, 1332, 1333, 1334, 1331, 3683, 2665, 3685, + 2553, 2520, 149, 3573, 3691, 2519, 2481, 1858, 214, 1986, + 3648, 1988, 1989, 1990, 1991, 1992, 3679, 2275, 2688, 2005, + 1999, 3632, 179, 218, 1799, 3589, 214, 3637, 3631, 1758, + 1728, 179, 218, 1475, 3692, 1460, 1456, 1455, 1454, 1453, + 716, 2201, 2083, 1452, 1451, 3686, 1450, 3688, 1449, 1448, + 1447, 1757, 1446, 1445, 3729, 2695, 2699, 2700, 2701, 2696, + 2704, 2697, 2702, 3736, 1444, 2698, 1132, 2703, 1443, 1442, + 1441, 1130, 2080, 1132, 1440, 1439, 151, 2710, 2221, 3753, + 1438, 1754, 1437, 1436, 1435, 1434, 1433, 3665, 3650, 1432, + 3652, 151, 3654, 151, 3669, 3718, 2082, 1431, 1430, 3696, + 3671, 3771, 1429, 1428, 1258, 1756, 1427, 1426, 1425, 1424, + 1423, 1422, 3698, 3516, 1421, 1418, 1417, 1258, 2094, 3701, + 1416, 3695, 1414, 1413, 1412, 1409, 3674, 1402, 1401, 1399, + 1258, 1398, 3823, 3715, 1397, 1396, 1659, 1395, 1394, 3727, + 1393, 1392, 1391, 1390, 2113, 1389, 3831, 1388, 1383, 3735, + 1382, 1381, 1380, 3717, 1379, 1296, 3755, 1242, 4314, 716, + 4312, 2201, 3578, 3579, 4310, 1258, 3807, 3804, 3825, 2695, + 2699, 2700, 2701, 2696, 2704, 2697, 2702, 2565, 2535, 2698, + 1657, 2703, 3750, 1284, 3554, 3184, 3752, 3024, 3751, 3762, + 2739, 3764, 715, 3853, 2547, 1552, 3758, 3795, 1295, 235, + 3226, 3216, 3221, 3223, 3219, 2700, 2701, 3222, 1999, 3220, + 3588, 3837, 3215, 1999, 1999, 3587, 3584, 3225, 3840, 3214, + 3813, 3816, 3849, 3811, 134, 4355, 3852, 3772, 72, 3822, + 71, 4242, 3850, 3992, 3055, 68, 2838, 1539, 2077, 2078, + 3814, 2072, 2073, 2074, 3834, 3832, 3829, 3827, 3453, 3512, + 3284, 3513, 3838, 3113, 3835, 3842, 3841, 1615, 2633, 3855, + 3817, 3839, 3626, 3627, 2295, 1628, 3601, 2298, 2088, 3125, + 2301, 3912, 2185, 2303, 1713, 3919, 3126, 3127, 3128, 3872, + 3053, 3925, 3848, 2832, 2833, 2514, 1665, 3754, 3207, 1750, + 2866, 1258, 2507, 2506, 707, 3757, 1747, 3875, 708, 2277, + 709, 3870, 2194, 3892, 3860, 710, 1290, 4191, 3427, 3420, + 3079, 3049, 2323, 2585, 1258, 1659, 1659, 2545, 2086, 3956, + 2047, 4459, 3466, 3922, 4189, 3924, 3545, 1132, 2682, 3908, + 1927, 1926, 1471, 1472, 3964, 3914, 1469, 1470, 3964, 1258, + 1467, 1468, 1465, 1466, 2675, 2202, 1612, 3953, 1611, 1323, + 2340, 3599, 3902, 3592, 1258, 3981, 1258, 3958, 3959, 1657, + 1873, 2515, 2343, 3952, 1561, 1560, 1530, 3915, 3984, 1584, + 3986, 4425, 3937, 1659, 2864, 3933, 3935, 3934, 3930, 4423, + 1132, 3936, 4374, 2863, 3954, 4352, 4351, 4349, 3945, 4273, + 4227, 4069, 4068, 3982, 716, 3866, 1258, 1258, 3649, 3620, + 1258, 1258, 3619, 3605, 3969, 3957, 2320, 3968, 2618, 2588, + 1752, 3604, 3259, 1558, 3092, 4450, 4449, 1873, 3755, 3977, + 4036, 4060, 3980, 3920, 3684, 4031, 3961, 3804, 3302, 2973, + 2972, 3990, 2966, 2792, 3993, 2088, 2394, 2413, 4066, 4449, + 2399, 3997, 1281, 1255, 4450, 4020, 4021, 4011, 2408, 4032, + 4033, 3851, 4075, 4076, 4429, 3989, 3932, 3795, 966, 967, + 968, 969, 3207, 1248, 1576, 3995, 1659, 3740, 4038, 3281, + 2539, 1743, 1248, 222, 3, 80, 2, 1820, 4472, 1820, + 4473, 1, 2951, 2336, 2003, 2415, 1473, 970, 4063, 965, + 4062, 1635, 4108, 2422, 716, 2720, 4064, 2255, 4087, 1663, + 2007, 4099, 4037, 972, 3232, 3233, 3591, 3235, 2979, 4120, + 1657, 4122, 2362, 3196, 2673, 2524, 3446, 1546, 1037, 4082, + 1933, 2441, 1779, 1272, 1776, 4086, 2446, 2447, 2448, 1271, + 1269, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, + 2460, 4123, 1878, 4125, 4094, 4098, 1954, 843, 2326, 3978, + 3979, 3177, 3151, 4065, 3884, 4458, 3885, 4153, 4487, 4417, + 4461, 4158, 4128, 4151, 1345, 1355, 1356, 1357, 1358, 1348, + 1349, 1350, 1351, 1352, 1353, 1354, 1347, 1797, 1258, 4177, + 827, 151, 151, 151, 1130, 4343, 3622, 3279, 4232, 4140, + 4421, 4181, 4175, 4234, 4146, 1355, 1356, 1357, 1358, 1348, + 1349, 1350, 1351, 1352, 1353, 1354, 1347, 4085, 1132, 2367, + 1328, 3286, 4155, 4104, 4105, 4154, 1061, 886, 854, 1400, + 1753, 3346, 3344, 4167, 4171, 1258, 853, 3712, 4152, 3013, + 4070, 3875, 3251, 1346, 1345, 1355, 1356, 1357, 1358, 1348, + 1349, 1350, 1351, 1352, 1353, 1354, 1347, 4160, 1062, 1659, + 4188, 2304, 4218, 4229, 4149, 4083, 1714, 1718, 2584, 2032, + 2033, 2034, 1367, 4168, 4293, 3991, 3508, 3087, 1742, 4288, + 3766, 3888, 3886, 3887, 4199, 3985, 754, 2234, 684, 1114, + 4035, 4215, 2546, 2564, 4040, 4193, 1011, 3693, 2534, 1012, + 1004, 2065, 3033, 1657, 3032, 1837, 2070, 1337, 1856, 3365, + 3366, 1820, 1377, 798, 4253, 2396, 3010, 3789, 4248, 3245, + 79, 78, 4258, 77, 76, 243, 845, 242, 4117, 4228, + 4265, 3949, 4338, 4463, 824, 823, 822, 4224, 4225, 1346, + 1345, 1355, 1356, 1357, 1358, 1348, 1349, 1350, 1351, 1352, + 1353, 1354, 1347, 821, 4260, 820, 4261, 819, 2693, 2694, + 4274, 2692, 2690, 2689, 2216, 2215, 3724, 3725, 3726, 3258, + 3603, 2283, 2285, 4262, 3732, 3733, 3464, 3116, 3818, 3111, + 2137, 2135, 1626, 2613, 2132, 2133, 4268, 2620, 2134, 4292, + 4397, 3638, 3878, 4305, 4306, 1258, 4277, 4008, 1999, 3161, + 1999, 4276, 3874, 2071, 2609, 4270, 2154, 4320, 3132, 2151, + 2150, 3124, 4004, 3998, 2182, 1258, 4156, 1659, 4331, 1999, + 1999, 3963, 4332, 4291, 3773, 4286, 3774, 4339, 3780, 4329, + 4300, 1464, 1210, 2544, 1184, 1180, 1182, 1183, 1181, 2884, + 3567, 4340, 2590, 3422, 4308, 2264, 2995, 2994, 2992, 4330, + 2991, 2264, 2264, 2264, 1698, 4309, 4311, 4313, 4315, 1514, + 4367, 1657, 4264, 4370, 3929, 2744, 2742, 1239, 4341, 3580, + 4348, 3576, 4346, 3397, 1481, 1479, 1659, 2334, 4360, 4362, + 4158, 3585, 3217, 2321, 3283, 4364, 2217, 2213, 2212, 1155, + 4365, 4361, 4363, 4369, 1154, 3983, 4384, 1695, 3675, 1360, + 48, 1364, 4392, 3198, 2683, 4130, 2076, 2843, 4376, 2846, + 4375, 4377, 1005, 2532, 116, 4378, 4379, 1361, 1363, 1359, + 1657, 1362, 1346, 1345, 1355, 1356, 1357, 1358, 1348, 1349, + 1350, 1351, 1352, 1353, 1354, 1347, 42, 4405, 1820, 4406, + 130, 4407, 115, 4408, 4413, 197, 63, 196, 4409, 1346, + 1345, 1355, 1356, 1357, 1358, 1348, 1349, 1350, 1351, 1352, + 1353, 1354, 1347, 4424, 62, 4426, 4427, 18, 2879, 128, + 4416, 2882, 4422, 4420, 194, 1258, 61, 47, 46, 4248, + 4430, 192, 2900, 2901, 110, 109, 4431, 108, 4432, 107, + 2903, 2904, 127, 191, 4181, 1668, 4437, 60, 4433, 712, + 227, 226, 229, 4440, 4439, 4438, 2909, 2910, 2911, 4443, + 228, 225, 2804, 2805, 224, 4447, 4457, 4445, 1702, 4465, + 223, 4353, 4464, 3967, 4334, 960, 45, 44, 198, 43, + 117, 64, 41, 40, 39, 35, 151, 1258, 13, 4469, + 2939, 12, 2941, 36, 23, 2944, 22, 1826, 1999, 4292, + 4476, 4475, 1784, 1049, 4478, 4479, 21, 27, 4485, 33, + 32, 4489, 144, 143, 4486, 4451, 4452, 4453, 4454, 31, + 142, 141, 140, 139, 138, 137, 136, 30, 20, 55, + 54, 53, 4497, 52, 51, 50, 9, 179, 218, 178, + 209, 180, 4465, 4505, 132, 4464, 4504, 131, 4435, 126, + 124, 29, 125, 122, 4489, 4506, 123, 210, 3340, 120, + 4510, 119, 118, 113, 201, 111, 151, 91, 211, 90, + 89, 104, 103, 102, 101, 1045, 1046, 100, 99, 97, + 98, 151, 4058, 1060, 151, 151, 1091, 149, 88, 87, + 86, 85, 84, 3069, 3070, 121, 106, 114, 151, 112, + 95, 105, 135, 2874, 96, 94, 93, 92, 83, 82, + 1820, 214, 1346, 1345, 1355, 1356, 1357, 1358, 1348, 1349, + 1350, 1351, 1352, 1353, 1354, 1347, 81, 1346, 1345, 1355, + 1356, 1357, 1358, 1348, 1349, 1350, 1351, 1352, 1353, 1354, + 1347, 176, 175, 174, 173, 172, 170, 171, 169, 2501, + 168, 2503, 167, 166, 165, 164, 56, 57, 58, 59, + 187, 186, 188, 190, 193, 189, 195, 184, 182, 185, + 183, 2521, 2522, 2523, 181, 73, 11, 129, 19, 3799, + 1093, 4, 0, 1092, 0, 3778, 0, 2540, 2541, 2542, + 2543, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 158, 159, 0, 160, 161, 0, 0, 0, 162, 0, + 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1077, 0, 0, 0, 3790, 0, 0, 0, + 0, 0, 1050, 0, 0, 0, 0, 0, 1999, 3781, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3776, 0, 0, 0, 2389, 3801, 3802, 0, 0, 1052, + 0, 3777, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 207, 216, 208, 74, 133, 1346, 1345, + 1355, 1356, 1357, 1358, 1348, 1349, 1350, 1351, 1352, 1353, + 1354, 1347, 0, 0, 0, 0, 206, 200, 199, 4202, + 4203, 3782, 0, 75, 0, 0, 4207, 4208, 4209, 0, + 0, 0, 4211, 4212, 4213, 0, 0, 4216, 0, 0, + 0, 157, 0, 0, 0, 0, 0, 3265, 1628, 3267, + 0, 766, 765, 772, 762, 0, 1073, 0, 1075, 1072, + 0, 0, 0, 1076, 769, 770, 0, 771, 775, 0, + 2323, 756, 0, 0, 0, 1999, 0, 151, 0, 0, + 1999, 780, 0, 0, 202, 203, 204, 0, 0, 0, + 0, 0, 0, 1071, 0, 1665, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1044, 0, 0, 0, 0, + 2264, 0, 0, 0, 0, 0, 1051, 1086, 0, 0, + 3318, 0, 0, 0, 0, 0, 0, 3800, 0, 2599, + 4275, 0, 0, 0, 0, 0, 4280, 4281, 1082, 0, + 0, 0, 0, 0, 212, 3338, 0, 0, 0, 0, + 0, 0, 0, 0, 3786, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 145, 2220, 4301, 0, 205, + 0, 146, 0, 0, 1083, 1087, 3783, 3787, 3785, 3784, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1068, 1911, 1066, 1070, 1090, 0, + 0, 0, 1067, 1064, 1063, 0, 1069, 1054, 1055, 1053, + 0, 1043, 1056, 1057, 1058, 1059, 0, 1088, 0, 1089, + 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, + 1084, 1085, 0, 0, 3793, 3794, 0, 0, 0, 67, + 0, 0, 151, 0, 0, 151, 151, 0, 151, 766, + 765, 772, 762, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 769, 770, 0, 771, 775, 0, 1080, 756, + 0, 0, 0, 0, 1079, 0, 0, 0, 0, 780, + 0, 0, 0, 0, 0, 757, 759, 758, 1074, 0, + 70, 3803, 0, 1130, 0, 0, 0, 764, 0, 0, + 0, 0, 0, 0, 3779, 0, 0, 3792, 0, 768, + 0, 151, 0, 0, 0, 0, 783, 0, 0, 0, + 0, 0, 0, 761, 0, 784, 155, 215, 786, 156, + 0, 0, 0, 785, 0, 0, 0, 0, 65, 0, + 0, 3523, 0, 0, 0, 0, 2974, 2975, 2976, 0, + 0, 0, 766, 765, 772, 762, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 769, 770, 0, 771, 775, + 0, 0, 756, 0, 0, 0, 0, 0, 0, 0, + 1078, 0, 780, 0, 0, 0, 1047, 1048, 0, 1041, + 0, 1907, 0, 0, 1042, 1367, 0, 3058, 1904, 0, + 0, 0, 1906, 1903, 1905, 1909, 1910, 0, 0, 0, + 1908, 0, 0, 0, 0, 0, 0, 0, 148, 49, + 0, 0, 0, 0, 0, 66, 0, 0, 784, 0, + 0, 786, 0, 0, 0, 0, 785, 0, 0, 0, + 3797, 0, 0, 0, 0, 0, 0, 0, 152, 153, + 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 763, 767, 773, 0, 774, 776, 0, 0, + 777, 778, 779, 0, 0, 0, 781, 782, 0, 0, + 0, 0, 0, 757, 759, 758, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 764, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 768, 0, 0, + 0, 0, 0, 0, 783, 0, 0, 3791, 0, 1203, + 0, 761, 0, 0, 3796, 751, 0, 0, 0, 0, + 0, 0, 3798, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1892, 1893, 1894, 1895, 1896, 1897, + 1898, 1899, 1900, 1901, 1902, 1914, 1915, 1916, 1917, 1918, + 1919, 1912, 1913, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3640, 0, 0, 0, 0, 3249, + 3250, 3642, 3643, 0, 0, 0, 757, 759, 758, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 764, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3651, + 768, 3653, 0, 0, 0, 0, 0, 783, 0, 1130, + 3663, 151, 0, 0, 761, 0, 0, 0, 0, 0, + 0, 760, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1870, 1871, + 0, 0, 0, 1221, 1222, 1188, 0, 0, 0, 0, + 763, 767, 773, 0, 774, 776, 0, 0, 777, 778, + 779, 0, 0, 0, 781, 782, 1211, 1215, 1217, 1219, + 1224, 0, 1229, 1225, 1226, 1227, 1228, 0, 1206, 1207, + 1208, 1209, 1186, 1187, 1212, 0, 1189, 0, 1191, 1192, + 1193, 1194, 1190, 1195, 1196, 1197, 1198, 1199, 1202, 1204, + 1200, 1201, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, + 1214, 1216, 1218, 1220, 1223, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2183, 0, 0, 0, 0, + 2144, 0, 0, 2191, 0, 2713, 0, 0, 0, 0, + 0, 1205, 0, 763, 767, 773, 0, 774, 776, 0, + 1203, 777, 778, 779, 0, 0, 0, 781, 782, 0, + 0, 0, 0, 2185, 2153, 0, 0, 0, 0, 0, + 0, 0, 0, 2186, 2187, 0, 0, 0, 0, 1999, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3395, 0, 1999, 0, 0, 3843, 2152, + 0, 3845, 0, 2220, 0, 1332, 1333, 1334, 1331, 760, + 0, 151, 0, 0, 0, 0, 0, 2160, 0, 0, + 0, 0, 0, 0, 3854, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3456, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 787, 788, 789, + 790, 791, 0, 0, 3470, 0, 3471, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1221, 1222, 1188, 0, 0, 0, + 1178, 0, 0, 0, 0, 1911, 0, 2176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1211, 1215, 1217, + 1219, 1224, 760, 1229, 1225, 1226, 1227, 1228, 0, 1206, + 1207, 1208, 1209, 1186, 1187, 1212, 0, 1189, 0, 1191, + 1192, 1193, 1194, 1190, 1195, 1196, 1197, 1198, 1199, 1202, + 1204, 1200, 1201, 1230, 1231, 1232, 1233, 1234, 1235, 1236, + 1237, 1214, 1216, 1218, 1220, 1223, 0, 0, 0, 0, + 787, 788, 789, 790, 791, 0, 0, 0, 0, 2143, + 2145, 2142, 0, 0, 0, 2139, 0, 0, 0, 0, + 2164, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2170, 1205, 0, 0, 0, 0, 2264, 0, 2155, + 0, 2138, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2158, 2192, 0, 0, 2159, 2161, 2163, 0, 2165, + 2166, 2167, 2171, 2172, 2173, 2175, 2178, 2179, 2180, 0, + 0, 0, 0, 0, 0, 0, 2168, 2177, 2169, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2147, 0, + 0, 0, 0, 0, 1213, 0, 0, 151, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2184, 1907, 0, 0, 0, 0, 0, 0, 1904, 0, + 0, 0, 1906, 1903, 1905, 1909, 1910, 0, 0, 0, + 1908, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2140, 2141, 0, 0, + 0, 0, 0, 0, 3634, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2181, 0, 2183, 0, 0, 0, + 0, 2144, 0, 0, 2191, 0, 0, 0, 0, 0, + 0, 0, 2157, 0, 0, 0, 2156, 0, 0, 0, + 0, 0, 0, 0, 0, 1203, 0, 0, 0, 0, + 0, 0, 0, 0, 2185, 2153, 0, 0, 0, 0, + 2174, 0, 0, 0, 2186, 2187, 0, 0, 0, 2162, + 0, 0, 0, 0, 0, 0, 2220, 2220, 2220, 2220, + 2220, 2220, 2189, 2188, 0, 0, 0, 0, 0, 0, + 2152, 0, 0, 2220, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4192, 0, 2160, 0, + 0, 0, 0, 0, 1892, 1893, 1894, 1895, 1896, 1897, + 1898, 1899, 1900, 1901, 1902, 1914, 1915, 1916, 1917, 1918, + 1919, 1912, 1913, 0, 0, 0, 0, 2149, 0, 0, + 2264, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1213, 0, 0, 0, 1221, + 1222, 1188, 2190, 0, 0, 0, 0, 0, 2176, 0, + 151, 0, 0, 1387, 0, 151, 0, 0, 0, 0, + 0, 0, 1211, 1215, 1217, 1219, 1224, 0, 1229, 1225, + 1226, 1227, 1228, 0, 1206, 1207, 1208, 1209, 1186, 1187, + 1212, 0, 1189, 151, 1191, 1192, 1193, 1194, 1190, 1195, + 1196, 1197, 1198, 1199, 1202, 1204, 1200, 1201, 1230, 1231, + 1232, 1233, 1234, 1235, 1236, 1237, 1214, 1216, 1218, 1220, + 1223, 0, 0, 0, 0, 0, 0, 0, 0, 2264, + 2143, 3082, 2142, 0, 0, 0, 3081, 0, 0, 0, + 0, 2164, 0, 0, 0, 0, 0, 4299, 0, 0, + 0, 0, 2170, 0, 0, 0, 0, 1205, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2158, 2192, 0, 0, 2159, 2161, 2163, 0, + 2165, 2166, 2167, 2171, 2172, 2173, 2175, 2178, 2179, 2180, + 0, 0, 0, 2183, 0, 0, 0, 2168, 2177, 2169, + 0, 179, 218, 0, 0, 0, 0, 0, 0, 2147, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3962, 0, 0, 0, 0, + 0, 2185, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2183, 0, 0, 0, 0, 0, 0, 0, + 0, 2184, 0, 0, 0, 0, 0, 4389, 0, 0, + 0, 0, 0, 4393, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 214, 0, 0, 0, 0, + 2185, 0, 0, 0, 0, 2160, 0, 2140, 2141, 0, + 0, 0, 0, 0, 0, 0, 0, 1130, 0, 151, + 0, 0, 0, 0, 0, 2181, 151, 0, 0, 0, + 0, 151, 0, 0, 0, 0, 0, 0, 2220, 0, + 0, 0, 0, 2157, 4180, 0, 0, 2156, 0, 0, + 0, 0, 0, 0, 2160, 0, 151, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4389, 0, 0, 0, + 0, 2174, 0, 2183, 0, 0, 0, 0, 0, 0, + 2162, 0, 0, 0, 4019, 2176, 0, 0, 0, 0, + 0, 0, 0, 2189, 2188, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2185, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4389, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2176, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2149, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2160, 0, 0, 2164, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2170, + 0, 0, 0, 4508, 4109, 0, 0, 0, 0, 0, + 1213, 0, 0, 2190, 0, 0, 0, 0, 0, 2158, + 2192, 0, 0, 2159, 2161, 2163, 0, 2165, 2166, 2167, + 2171, 2172, 2173, 2175, 2178, 2179, 2180, 2164, 0, 0, + 0, 0, 0, 0, 2168, 2177, 2169, 0, 2170, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4150, 0, 0, 0, 2176, 0, 0, 2158, 2192, + 0, 0, 2159, 2161, 2163, 0, 2165, 2166, 2167, 2171, + 2172, 2173, 2175, 2178, 2179, 2180, 0, 0, 0, 0, + 0, 0, 0, 2168, 2177, 2169, 0, 0, 2184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2184, 2164, 0, + 0, 0, 2181, 0, 0, 0, 0, 0, 0, 2170, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2157, 0, 0, 0, 2156, 0, 0, 0, 0, 2158, + 2192, 0, 0, 2159, 2161, 2163, 0, 2165, 2166, 2167, + 2171, 2172, 2173, 2175, 2178, 2179, 2180, 0, 2174, 0, + 0, 2181, 0, 0, 2168, 2177, 2169, 2162, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 151, 0, 2157, + 0, 0, 0, 2156, 151, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2174, 0, 0, + 0, 0, 0, 0, 0, 0, 2162, 0, 2184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2220, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2157, 0, 0, 0, 2156, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2174, 0, + 0, 0, 0, 0, 0, 0, 0, 2162, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 861, 0, 0, 0, 0, 0, 0, 0, 0, 426, + 0, 0, 565, 599, 588, 671, 553, 0, 0, 0, + 0, 0, 0, 813, 0, 151, 0, 359, 0, 0, + 394, 603, 584, 595, 585, 570, 571, 572, 579, 371, + 573, 574, 575, 545, 576, 546, 577, 578, 852, 602, + 552, 463, 410, 0, 619, 0, 0, 931, 939, 0, + 0, 0, 0, 0, 0, 0, 0, 927, 0, 0, + 0, 0, 805, 0, 0, 842, 907, 906, 829, 839, + 0, 0, 328, 241, 547, 667, 549, 548, 830, 0, + 831, 835, 838, 834, 832, 833, 0, 922, 3916, 0, + 0, 0, 0, 0, 797, 809, 0, 814, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 806, 807, 0, 0, 0, 0, 862, + 0, 808, 0, 0, 0, 0, 0, 464, 494, 0, + 507, 151, 384, 385, 857, 836, 840, 0, 0, 0, + 0, 316, 471, 491, 329, 458, 505, 334, 466, 483, + 324, 425, 455, 0, 0, 318, 489, 465, 407, 317, + 0, 449, 357, 373, 354, 423, 837, 860, 864, 353, + 945, 858, 499, 320, 0, 498, 422, 485, 490, 408, + 401, 0, 319, 487, 406, 400, 388, 363, 946, 389, + 390, 378, 437, 398, 438, 379, 412, 411, 413, 0, + 0, 0, 0, 0, 529, 530, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 660, 855, 0, 664, 0, 501, 0, 0, 929, + 0, 0, 0, 469, 0, 0, 391, 0, 0, 0, + 859, 0, 452, 428, 942, 0, 0, 450, 396, 486, + 439, 492, 472, 500, 444, 440, 310, 473, 356, 409, + 325, 327, 688, 358, 360, 364, 365, 418, 419, 433, + 457, 476, 477, 478, 355, 339, 451, 340, 375, 341, + 311, 347, 345, 348, 459, 349, 313, 434, 482, 0, + 370, 447, 404, 314, 403, 435, 481, 480, 326, 509, + 516, 517, 607, 0, 522, 699, 700, 701, 531, 0, + 441, 322, 321, 0, 0, 0, 351, 436, 335, 337, + 338, 336, 431, 432, 536, 537, 538, 540, 0, 541, + 542, 0, 0, 0, 0, 543, 608, 624, 592, 561, + 524, 616, 558, 562, 563, 381, 627, 1935, 1934, 1936, + 515, 392, 393, 0, 362, 361, 405, 315, 0, 151, + 0, 382, 368, 306, 307, 694, 926, 424, 629, 662, + 663, 554, 0, 941, 921, 923, 924, 928, 932, 933, + 934, 935, 936, 938, 940, 944, 693, 0, 609, 623, + 697, 622, 690, 430, 0, 456, 620, 567, 0, 613, + 586, 587, 0, 614, 582, 618, 0, 556, 0, 525, + 528, 557, 642, 643, 644, 312, 527, 646, 647, 648, + 649, 650, 651, 652, 645, 943, 590, 566, 593, 506, + 569, 568, 0, 0, 604, 863, 605, 606, 414, 415, + 416, 417, 930, 630, 333, 526, 443, 0, 591, 0, + 0, 0, 0, 0, 0, 0, 0, 596, 597, 594, + 702, 0, 653, 654, 0, 0, 520, 521, 367, 374, + 539, 376, 332, 429, 369, 504, 386, 0, 532, 598, + 533, 445, 446, 656, 659, 657, 658, 421, 380, 383, + 460, 387, 397, 448, 503, 427, 453, 330, 493, 462, + 402, 583, 611, 952, 925, 951, 953, 954, 950, 955, + 956, 937, 818, 0, 870, 871, 948, 947, 949, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 638, 637, 636, 635, 634, 633, 632, 631, 0, 0, + 580, 479, 346, 300, 342, 343, 350, 691, 687, 484, + 692, 825, 308, 560, 395, 442, 366, 625, 626, 0, + 677, 914, 879, 880, 881, 815, 882, 876, 877, 816, + 878, 915, 868, 911, 912, 844, 873, 883, 910, 884, + 913, 916, 917, 957, 958, 890, 874, 270, 959, 887, + 918, 909, 908, 885, 869, 919, 920, 851, 846, 888, + 889, 875, 894, 895, 896, 899, 817, 900, 901, 902, + 903, 904, 898, 897, 865, 866, 867, 891, 892, 872, + 470, 847, 848, 849, 850, 0, 0, 510, 511, 512, + 535, 0, 513, 495, 559, 377, 309, 474, 502, 689, + 0, 0, 0, 0, 0, 0, 0, 610, 621, 655, + 0, 665, 666, 668, 670, 905, 672, 467, 468, 678, + 0, 893, 675, 676, 673, 399, 454, 475, 461, 0, + 695, 550, 551, 696, 661, 0, 810, 179, 218, 861, + 0, 0, 0, 0, 0, 0, 0, 0, 426, 0, + 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, + 0, 0, 813, 0, 0, 0, 359, 0, 0, 394, + 603, 584, 595, 585, 570, 571, 572, 579, 371, 573, + 574, 575, 545, 576, 546, 577, 578, 852, 602, 552, + 463, 410, 0, 619, 0, 0, 931, 939, 0, 0, + 0, 0, 0, 0, 0, 0, 927, 0, 0, 0, + 0, 805, 0, 0, 842, 907, 906, 829, 839, 0, + 0, 328, 241, 547, 667, 549, 548, 830, 0, 831, + 835, 838, 834, 832, 833, 0, 922, 0, 0, 0, + 0, 0, 0, 797, 809, 0, 814, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 806, 807, 0, 0, 0, 0, 862, 0, + 808, 0, 0, 0, 0, 0, 464, 494, 0, 507, + 0, 384, 385, 857, 836, 840, 0, 0, 0, 0, + 316, 471, 491, 329, 458, 505, 334, 466, 483, 324, + 425, 455, 0, 0, 318, 489, 465, 407, 317, 0, + 449, 357, 373, 354, 423, 837, 860, 864, 353, 945, + 858, 499, 320, 0, 498, 422, 485, 490, 408, 401, + 0, 319, 487, 406, 400, 388, 363, 946, 389, 390, + 378, 437, 398, 438, 379, 412, 411, 413, 0, 0, + 0, 0, 0, 529, 530, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 660, 855, 0, 664, 0, 501, 0, 0, 929, 0, + 0, 0, 469, 0, 0, 391, 0, 0, 0, 859, + 0, 452, 428, 942, 0, 0, 450, 396, 486, 439, + 492, 472, 500, 444, 440, 310, 473, 356, 409, 325, + 327, 688, 358, 360, 364, 365, 418, 419, 433, 457, + 476, 477, 478, 355, 339, 451, 340, 375, 341, 311, + 347, 345, 348, 459, 349, 313, 434, 482, 0, 370, + 447, 404, 314, 403, 435, 481, 480, 326, 509, 516, + 517, 607, 0, 522, 699, 700, 701, 531, 0, 441, + 322, 321, 0, 0, 0, 351, 436, 335, 337, 338, + 336, 431, 432, 536, 537, 538, 540, 0, 541, 542, + 0, 0, 0, 0, 543, 608, 624, 592, 561, 524, + 616, 558, 562, 563, 381, 627, 0, 0, 0, 515, + 392, 393, 0, 362, 361, 405, 315, 0, 0, 0, + 382, 368, 306, 307, 694, 926, 424, 629, 662, 663, + 554, 0, 941, 921, 923, 924, 928, 932, 933, 934, + 935, 936, 938, 940, 944, 693, 0, 609, 623, 697, + 622, 690, 430, 0, 456, 620, 567, 0, 613, 586, + 587, 0, 614, 582, 618, 0, 556, 0, 525, 528, + 557, 642, 643, 644, 312, 527, 646, 647, 648, 649, + 650, 651, 652, 645, 943, 590, 566, 593, 506, 569, + 568, 0, 0, 604, 863, 605, 606, 414, 415, 416, + 417, 930, 630, 333, 526, 443, 0, 591, 0, 0, + 0, 0, 0, 0, 0, 0, 596, 597, 594, 702, + 0, 653, 654, 0, 0, 520, 521, 367, 374, 539, + 376, 332, 429, 369, 504, 386, 0, 532, 598, 533, + 445, 446, 656, 659, 657, 658, 421, 380, 383, 460, + 387, 397, 448, 503, 427, 453, 330, 493, 462, 402, + 583, 611, 952, 925, 951, 953, 954, 950, 955, 956, + 937, 818, 0, 870, 871, 948, 947, 949, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, + 637, 636, 635, 634, 633, 632, 631, 0, 0, 580, + 479, 346, 300, 342, 343, 350, 691, 687, 484, 692, + 825, 308, 560, 395, 442, 366, 625, 626, 0, 677, + 914, 879, 880, 881, 815, 882, 876, 877, 816, 878, + 915, 868, 911, 912, 844, 873, 883, 910, 884, 913, + 916, 917, 957, 958, 890, 874, 270, 959, 887, 918, + 909, 908, 885, 869, 919, 920, 851, 846, 888, 889, + 875, 894, 895, 896, 899, 817, 900, 901, 902, 903, + 904, 898, 897, 865, 866, 867, 891, 892, 872, 470, + 847, 848, 849, 850, 0, 0, 510, 511, 512, 535, + 0, 513, 495, 559, 377, 309, 474, 502, 689, 0, + 0, 0, 0, 0, 0, 0, 610, 621, 655, 0, + 665, 666, 668, 670, 905, 672, 467, 468, 678, 0, + 893, 675, 676, 673, 399, 454, 475, 461, 861, 695, + 550, 551, 696, 661, 0, 810, 0, 426, 0, 0, + 565, 599, 588, 671, 553, 0, 0, 0, 0, 0, + 0, 813, 0, 0, 0, 359, 2000, 0, 394, 603, + 584, 595, 585, 570, 571, 572, 579, 371, 573, 574, + 575, 545, 576, 546, 577, 578, 852, 602, 552, 463, + 410, 0, 619, 0, 0, 931, 939, 0, 0, 0, + 0, 0, 0, 0, 0, 927, 0, 2246, 0, 0, + 805, 0, 0, 842, 907, 906, 829, 839, 0, 0, + 328, 241, 547, 667, 549, 548, 830, 0, 831, 835, + 838, 834, 832, 833, 0, 922, 0, 0, 0, 0, + 0, 0, 797, 809, 0, 814, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 806, 807, 0, 0, 0, 0, 862, 0, 808, + 0, 0, 0, 0, 0, 464, 494, 0, 507, 0, + 384, 385, 2247, 836, 840, 0, 0, 0, 0, 316, + 471, 491, 329, 458, 505, 334, 466, 483, 324, 425, + 455, 0, 0, 318, 489, 465, 407, 317, 0, 449, + 357, 373, 354, 423, 837, 860, 864, 353, 945, 858, + 499, 320, 0, 498, 422, 485, 490, 408, 401, 0, + 319, 487, 406, 400, 388, 363, 946, 389, 390, 378, + 437, 398, 438, 379, 412, 411, 413, 0, 0, 0, + 0, 0, 529, 530, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 660, + 855, 0, 664, 0, 501, 0, 0, 929, 0, 0, + 0, 469, 0, 0, 391, 0, 0, 0, 859, 0, + 452, 428, 942, 0, 0, 450, 396, 486, 439, 492, + 472, 500, 444, 440, 310, 473, 356, 409, 325, 327, + 688, 358, 360, 364, 365, 418, 419, 433, 457, 476, + 477, 478, 355, 339, 451, 340, 375, 341, 311, 347, + 345, 348, 459, 349, 313, 434, 482, 0, 370, 447, + 404, 314, 403, 435, 481, 480, 326, 509, 516, 517, + 607, 0, 522, 699, 700, 701, 531, 0, 441, 322, + 321, 0, 0, 0, 351, 436, 335, 337, 338, 336, + 431, 432, 536, 537, 538, 540, 0, 541, 542, 0, + 0, 0, 0, 543, 608, 624, 592, 561, 524, 616, + 558, 562, 563, 381, 627, 0, 0, 0, 515, 392, + 393, 0, 362, 361, 405, 315, 0, 0, 0, 382, + 368, 306, 307, 694, 926, 424, 629, 662, 663, 554, + 0, 941, 921, 923, 924, 928, 932, 933, 934, 935, + 936, 938, 940, 944, 693, 0, 609, 623, 697, 622, + 690, 430, 0, 456, 620, 567, 0, 613, 586, 587, + 0, 614, 582, 618, 0, 556, 0, 525, 528, 557, + 642, 643, 644, 312, 527, 646, 647, 648, 649, 650, + 651, 652, 645, 943, 590, 566, 593, 506, 569, 568, + 0, 0, 604, 863, 605, 606, 414, 415, 416, 417, + 930, 630, 333, 526, 443, 0, 591, 0, 0, 0, + 0, 0, 0, 0, 0, 596, 597, 594, 702, 0, + 653, 654, 0, 0, 520, 521, 367, 374, 539, 376, + 332, 429, 369, 504, 386, 0, 532, 598, 533, 445, + 446, 656, 659, 657, 658, 421, 380, 383, 460, 387, + 397, 448, 503, 427, 453, 330, 493, 462, 402, 583, + 611, 952, 925, 951, 953, 954, 950, 955, 956, 937, + 818, 0, 870, 871, 948, 947, 949, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 638, 637, + 636, 635, 634, 633, 632, 631, 0, 0, 580, 479, + 346, 300, 342, 343, 350, 691, 687, 484, 692, 825, + 308, 560, 395, 442, 366, 625, 626, 0, 677, 914, + 879, 880, 881, 815, 882, 876, 877, 816, 878, 915, + 868, 911, 912, 844, 873, 883, 910, 884, 913, 916, + 917, 957, 958, 890, 874, 270, 959, 887, 918, 909, + 908, 885, 869, 919, 920, 851, 846, 888, 889, 875, + 894, 895, 896, 899, 817, 900, 901, 902, 903, 904, + 898, 897, 865, 866, 867, 891, 892, 872, 470, 847, + 848, 849, 850, 0, 0, 510, 511, 512, 535, 0, + 513, 495, 559, 377, 309, 474, 502, 689, 0, 0, + 0, 0, 0, 0, 0, 610, 621, 655, 0, 665, + 666, 668, 670, 905, 672, 467, 468, 678, 0, 893, + 675, 676, 673, 399, 454, 475, 461, 0, 695, 550, + 551, 696, 661, 0, 810, 179, 218, 861, 0, 0, + 0, 0, 0, 0, 0, 0, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 813, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 1370, 602, 552, 463, 410, + 0, 619, 0, 0, 931, 939, 0, 0, 0, 0, + 0, 0, 0, 0, 927, 0, 0, 0, 0, 805, + 0, 0, 842, 907, 906, 829, 839, 0, 0, 328, + 241, 547, 667, 549, 548, 830, 0, 831, 835, 838, + 834, 832, 833, 0, 922, 0, 0, 0, 0, 0, + 0, 797, 809, 0, 814, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 806, 807, 0, 0, 0, 0, 862, 0, 808, 0, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 857, 836, 840, 0, 0, 0, 0, 316, 471, + 491, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 837, 860, 864, 353, 945, 858, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 946, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 855, + 0, 664, 0, 501, 0, 0, 929, 0, 0, 0, + 469, 0, 0, 391, 0, 0, 0, 859, 0, 452, + 428, 942, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 0, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 926, 424, 629, 662, 663, 554, 0, + 941, 921, 923, 924, 928, 932, 933, 934, 935, 936, + 938, 940, 944, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 943, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 863, 605, 606, 414, 415, 416, 417, 930, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, + 952, 925, 951, 953, 954, 950, 955, 956, 937, 818, + 0, 870, 871, 948, 947, 949, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 825, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 914, 879, + 880, 881, 815, 882, 876, 877, 816, 878, 915, 868, + 911, 912, 844, 873, 883, 910, 884, 913, 916, 917, + 957, 958, 890, 874, 270, 959, 887, 918, 909, 908, + 885, 869, 919, 920, 851, 846, 888, 889, 875, 894, + 895, 896, 899, 817, 900, 901, 902, 903, 904, 898, + 897, 865, 866, 867, 891, 892, 872, 470, 847, 848, + 849, 850, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 905, 672, 467, 468, 678, 0, 893, 675, + 676, 673, 399, 454, 475, 461, 861, 695, 550, 551, + 696, 661, 0, 810, 0, 426, 0, 0, 565, 599, + 588, 671, 553, 0, 0, 0, 0, 0, 0, 813, + 0, 0, 0, 359, 4507, 0, 394, 603, 584, 595, + 585, 570, 571, 572, 579, 371, 573, 574, 575, 545, + 576, 546, 577, 578, 852, 602, 552, 463, 410, 0, + 619, 0, 0, 931, 939, 0, 0, 0, 0, 0, + 0, 0, 0, 927, 0, 0, 0, 0, 805, 0, + 0, 842, 907, 906, 829, 839, 0, 0, 328, 241, + 547, 667, 549, 548, 830, 0, 831, 835, 838, 834, + 832, 833, 0, 922, 0, 0, 0, 0, 0, 0, + 797, 809, 0, 814, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 806, + 807, 0, 0, 0, 0, 862, 0, 808, 0, 0, + 0, 0, 0, 464, 494, 0, 507, 0, 384, 385, + 857, 836, 840, 0, 0, 0, 0, 316, 471, 491, + 329, 458, 505, 334, 466, 483, 324, 425, 455, 0, + 0, 318, 489, 465, 407, 317, 0, 449, 357, 373, + 354, 423, 837, 860, 864, 353, 945, 858, 499, 320, + 0, 498, 422, 485, 490, 408, 401, 0, 319, 487, + 406, 400, 388, 363, 946, 389, 390, 378, 437, 398, + 438, 379, 412, 411, 413, 0, 0, 0, 0, 0, + 529, 530, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 660, 855, 0, + 664, 0, 501, 0, 0, 929, 0, 0, 0, 469, + 0, 0, 391, 0, 0, 0, 859, 0, 452, 428, + 942, 0, 0, 450, 396, 486, 439, 492, 472, 500, + 444, 440, 310, 473, 356, 409, 325, 327, 688, 358, + 360, 364, 365, 418, 419, 433, 457, 476, 477, 478, + 355, 339, 451, 340, 375, 341, 311, 347, 345, 348, + 459, 349, 313, 434, 482, 0, 370, 447, 404, 314, + 403, 435, 481, 480, 326, 509, 516, 517, 607, 0, + 522, 699, 700, 701, 531, 0, 441, 322, 321, 0, + 0, 0, 351, 436, 335, 337, 338, 336, 431, 432, + 536, 537, 538, 540, 0, 541, 542, 0, 0, 0, + 0, 543, 608, 624, 592, 561, 524, 616, 558, 562, + 563, 381, 627, 0, 0, 0, 515, 392, 393, 0, + 362, 361, 405, 315, 0, 0, 0, 382, 368, 306, + 307, 694, 926, 424, 629, 662, 663, 554, 0, 941, + 921, 923, 924, 928, 932, 933, 934, 935, 936, 938, + 940, 944, 693, 0, 609, 623, 697, 622, 690, 430, + 0, 456, 620, 567, 0, 613, 586, 587, 0, 614, + 582, 618, 0, 556, 0, 525, 528, 557, 642, 643, + 644, 312, 527, 646, 647, 648, 649, 650, 651, 652, + 645, 943, 590, 566, 593, 506, 569, 568, 0, 0, + 604, 863, 605, 606, 414, 415, 416, 417, 930, 630, + 333, 526, 443, 0, 591, 0, 0, 0, 0, 0, + 0, 0, 0, 596, 597, 594, 702, 0, 653, 654, + 0, 0, 520, 521, 367, 374, 539, 376, 332, 429, + 369, 504, 386, 0, 532, 598, 533, 445, 446, 656, + 659, 657, 658, 421, 380, 383, 460, 387, 397, 448, + 503, 427, 453, 330, 493, 462, 402, 583, 611, 952, + 925, 951, 953, 954, 950, 955, 956, 937, 818, 0, + 870, 871, 948, 947, 949, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 638, 637, 636, 635, + 634, 633, 632, 631, 0, 0, 580, 479, 346, 300, + 342, 343, 350, 691, 687, 484, 692, 825, 308, 560, + 395, 442, 366, 625, 626, 0, 677, 914, 879, 880, + 881, 815, 882, 876, 877, 816, 878, 915, 868, 911, + 912, 844, 873, 883, 910, 884, 913, 916, 917, 957, + 958, 890, 874, 270, 959, 887, 918, 909, 908, 885, + 869, 919, 920, 851, 846, 888, 889, 875, 894, 895, + 896, 899, 817, 900, 901, 902, 903, 904, 898, 897, + 865, 866, 867, 891, 892, 872, 470, 847, 848, 849, + 850, 0, 0, 510, 511, 512, 535, 0, 513, 495, + 559, 377, 309, 474, 502, 689, 0, 0, 0, 0, + 0, 0, 0, 610, 621, 655, 0, 665, 666, 668, + 670, 905, 672, 467, 468, 678, 0, 893, 675, 676, + 673, 399, 454, 475, 461, 861, 695, 550, 551, 696, + 661, 0, 810, 0, 426, 0, 0, 565, 599, 588, + 671, 553, 0, 0, 0, 0, 0, 0, 813, 0, + 0, 0, 359, 0, 0, 394, 603, 584, 595, 585, + 570, 571, 572, 579, 371, 573, 574, 575, 545, 576, + 546, 577, 578, 852, 602, 552, 463, 410, 0, 619, + 0, 0, 931, 939, 0, 0, 0, 0, 0, 0, + 0, 0, 927, 0, 0, 0, 0, 805, 0, 0, + 842, 907, 906, 829, 839, 0, 0, 328, 241, 547, + 667, 549, 548, 830, 0, 831, 835, 838, 834, 832, + 833, 0, 922, 0, 0, 0, 0, 0, 0, 797, + 809, 0, 814, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 806, 807, + 0, 0, 0, 0, 862, 0, 808, 0, 0, 0, + 0, 0, 464, 494, 0, 507, 0, 384, 385, 857, + 836, 840, 0, 0, 0, 0, 316, 471, 491, 329, + 458, 505, 334, 466, 483, 324, 425, 455, 0, 0, + 318, 489, 465, 407, 317, 0, 449, 357, 373, 354, + 423, 837, 860, 864, 353, 945, 858, 499, 320, 0, + 498, 422, 485, 490, 408, 401, 0, 319, 487, 406, + 400, 388, 363, 946, 389, 390, 378, 437, 398, 438, + 379, 412, 411, 413, 0, 0, 0, 0, 0, 529, + 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 855, 0, 664, + 0, 501, 0, 0, 929, 0, 0, 0, 469, 0, + 0, 391, 0, 0, 0, 859, 0, 452, 428, 942, + 4390, 0, 450, 396, 486, 439, 492, 472, 500, 444, + 440, 310, 473, 356, 409, 325, 327, 688, 358, 360, + 364, 365, 418, 419, 433, 457, 476, 477, 478, 355, + 339, 451, 340, 375, 341, 311, 347, 345, 348, 459, + 349, 313, 434, 482, 0, 370, 447, 404, 314, 403, + 435, 481, 480, 326, 509, 516, 517, 607, 0, 522, + 699, 700, 701, 531, 0, 441, 322, 321, 0, 0, + 0, 351, 436, 335, 337, 338, 336, 431, 432, 536, + 537, 538, 540, 0, 541, 542, 0, 0, 0, 0, + 543, 608, 624, 592, 561, 524, 616, 558, 562, 563, + 381, 627, 0, 0, 0, 515, 392, 393, 0, 362, + 361, 405, 315, 0, 0, 0, 382, 368, 306, 307, + 694, 926, 424, 629, 662, 663, 554, 0, 941, 921, + 923, 924, 928, 932, 933, 934, 935, 936, 938, 940, + 944, 693, 0, 609, 623, 697, 622, 690, 430, 0, + 456, 620, 567, 0, 613, 586, 587, 0, 614, 582, + 618, 0, 556, 0, 525, 528, 557, 642, 643, 644, + 312, 527, 646, 647, 648, 649, 650, 651, 652, 645, + 943, 590, 566, 593, 506, 569, 568, 0, 0, 604, + 863, 605, 606, 414, 415, 416, 417, 930, 630, 333, + 526, 443, 0, 591, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 597, 594, 702, 0, 653, 654, 0, + 0, 520, 521, 367, 374, 539, 376, 332, 429, 369, + 504, 386, 0, 532, 598, 533, 445, 446, 656, 659, + 657, 658, 421, 380, 383, 460, 387, 397, 448, 503, + 427, 453, 330, 493, 462, 402, 583, 611, 952, 925, + 951, 953, 954, 950, 955, 956, 937, 818, 0, 870, + 871, 948, 947, 949, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 638, 637, 636, 635, 634, + 633, 632, 631, 0, 0, 580, 479, 346, 300, 342, + 343, 350, 691, 687, 484, 692, 825, 308, 560, 395, + 442, 366, 625, 626, 0, 677, 914, 879, 880, 881, + 815, 882, 876, 877, 816, 878, 915, 868, 911, 912, + 844, 873, 883, 910, 884, 913, 916, 917, 957, 958, + 890, 874, 270, 959, 887, 918, 909, 908, 885, 869, + 919, 920, 851, 846, 888, 889, 875, 894, 895, 896, + 899, 817, 900, 901, 902, 903, 904, 898, 897, 865, + 866, 867, 891, 892, 872, 470, 847, 848, 849, 850, + 0, 0, 510, 511, 512, 535, 0, 513, 495, 559, + 377, 309, 474, 502, 689, 0, 0, 0, 0, 0, + 0, 0, 610, 621, 655, 0, 665, 666, 668, 670, + 905, 672, 467, 468, 678, 0, 893, 675, 676, 673, + 399, 454, 475, 461, 861, 695, 550, 551, 696, 661, + 0, 810, 0, 426, 0, 0, 565, 599, 588, 671, + 553, 0, 0, 0, 0, 0, 0, 813, 0, 0, + 0, 359, 2000, 0, 394, 603, 584, 595, 585, 570, + 571, 572, 579, 371, 573, 574, 575, 545, 576, 546, + 577, 578, 852, 602, 552, 463, 410, 0, 619, 0, + 0, 931, 939, 0, 0, 0, 0, 0, 0, 0, + 0, 927, 0, 0, 0, 0, 805, 0, 0, 842, + 907, 906, 829, 839, 0, 0, 328, 241, 547, 667, + 549, 548, 830, 0, 831, 835, 838, 834, 832, 833, + 0, 922, 0, 0, 0, 0, 0, 0, 797, 809, + 0, 814, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 806, 807, 0, + 0, 0, 0, 862, 0, 808, 0, 0, 0, 0, + 0, 464, 494, 0, 507, 0, 384, 385, 857, 836, + 840, 0, 0, 0, 0, 316, 471, 491, 329, 458, + 505, 334, 466, 483, 324, 425, 455, 0, 0, 318, + 489, 465, 407, 317, 0, 449, 357, 373, 354, 423, + 837, 860, 864, 353, 945, 858, 499, 320, 0, 498, + 422, 485, 490, 408, 401, 0, 319, 487, 406, 400, + 388, 363, 946, 389, 390, 378, 437, 398, 438, 379, + 412, 411, 413, 0, 0, 0, 0, 0, 529, 530, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 660, 855, 0, 664, 0, + 501, 0, 0, 929, 0, 0, 0, 469, 0, 0, + 391, 0, 0, 0, 859, 0, 452, 428, 942, 0, + 0, 450, 396, 486, 439, 492, 472, 500, 444, 440, + 310, 473, 356, 409, 325, 327, 688, 358, 360, 364, + 365, 418, 419, 433, 457, 476, 477, 478, 355, 339, + 451, 340, 375, 341, 311, 347, 345, 348, 459, 349, + 313, 434, 482, 0, 370, 447, 404, 314, 403, 435, + 481, 480, 326, 509, 516, 517, 607, 0, 522, 699, + 700, 701, 531, 0, 441, 322, 321, 0, 0, 0, + 351, 436, 335, 337, 338, 336, 431, 432, 536, 537, + 538, 540, 0, 541, 542, 0, 0, 0, 0, 543, + 608, 624, 592, 561, 524, 616, 558, 562, 563, 381, + 627, 0, 0, 0, 515, 392, 393, 0, 362, 361, + 405, 315, 0, 0, 0, 382, 368, 306, 307, 694, + 926, 424, 629, 662, 663, 554, 0, 941, 921, 923, + 924, 928, 932, 933, 934, 935, 936, 938, 940, 944, + 693, 0, 609, 623, 697, 622, 690, 430, 0, 456, + 620, 567, 0, 613, 586, 587, 0, 614, 582, 618, + 0, 556, 0, 525, 528, 557, 642, 643, 644, 312, + 527, 646, 647, 648, 649, 650, 651, 652, 645, 943, + 590, 566, 593, 506, 569, 568, 0, 0, 604, 863, + 605, 606, 414, 415, 416, 417, 930, 630, 333, 526, + 443, 0, 591, 0, 0, 0, 0, 0, 0, 0, + 0, 596, 597, 594, 702, 0, 653, 654, 0, 0, + 520, 521, 367, 374, 539, 376, 332, 429, 369, 504, + 386, 0, 532, 598, 533, 445, 446, 656, 659, 657, + 658, 421, 380, 383, 460, 387, 397, 448, 503, 427, + 453, 330, 493, 462, 402, 583, 611, 952, 925, 951, + 953, 954, 950, 955, 956, 937, 818, 0, 870, 871, + 948, 947, 949, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 638, 637, 636, 635, 634, 633, + 632, 631, 0, 0, 580, 479, 346, 300, 342, 343, + 350, 691, 687, 484, 692, 825, 308, 560, 395, 442, + 366, 625, 626, 0, 677, 914, 879, 880, 881, 815, + 882, 876, 877, 816, 878, 915, 868, 911, 912, 844, + 873, 883, 910, 884, 913, 916, 917, 957, 958, 890, + 874, 270, 959, 887, 918, 909, 908, 885, 869, 919, + 920, 851, 846, 888, 889, 875, 894, 895, 896, 899, + 817, 900, 901, 902, 903, 904, 898, 897, 865, 866, + 867, 891, 892, 872, 470, 847, 848, 849, 850, 0, + 0, 510, 511, 512, 535, 0, 513, 495, 559, 377, + 309, 474, 502, 689, 0, 0, 0, 0, 0, 0, + 0, 610, 621, 655, 0, 665, 666, 668, 670, 905, + 672, 467, 468, 678, 0, 893, 675, 676, 673, 399, + 454, 475, 461, 861, 695, 550, 551, 696, 661, 0, + 810, 0, 426, 0, 0, 565, 599, 588, 671, 553, + 0, 0, 0, 0, 0, 0, 813, 0, 0, 0, + 359, 0, 0, 394, 603, 584, 595, 585, 570, 571, + 572, 579, 371, 573, 574, 575, 545, 576, 546, 577, + 578, 852, 602, 552, 463, 410, 0, 619, 0, 0, + 931, 939, 0, 0, 0, 0, 0, 0, 0, 0, + 927, 0, 0, 0, 0, 805, 0, 0, 842, 907, + 906, 829, 839, 0, 0, 328, 241, 547, 667, 549, + 548, 830, 0, 831, 835, 838, 834, 832, 833, 0, + 922, 0, 0, 0, 0, 0, 0, 797, 809, 0, + 814, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 806, 807, 1697, 0, + 0, 0, 862, 0, 808, 0, 0, 0, 0, 0, + 464, 494, 0, 507, 0, 384, 385, 857, 836, 840, + 0, 0, 0, 0, 316, 471, 491, 329, 458, 505, + 334, 466, 483, 324, 425, 455, 0, 0, 318, 489, + 465, 407, 317, 0, 449, 357, 373, 354, 423, 837, + 860, 864, 353, 945, 858, 499, 320, 0, 498, 422, + 485, 490, 408, 401, 0, 319, 487, 406, 400, 388, + 363, 946, 389, 390, 378, 437, 398, 438, 379, 412, + 411, 413, 0, 0, 0, 0, 0, 529, 530, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 660, 855, 0, 664, 0, 501, + 0, 0, 929, 0, 0, 0, 469, 0, 0, 391, + 0, 0, 0, 859, 0, 452, 428, 942, 0, 0, + 450, 396, 486, 439, 492, 472, 500, 444, 440, 310, + 473, 356, 409, 325, 327, 688, 358, 360, 364, 365, + 418, 419, 433, 457, 476, 477, 478, 355, 339, 451, + 340, 375, 341, 311, 347, 345, 348, 459, 349, 313, + 434, 482, 0, 370, 447, 404, 314, 403, 435, 481, + 480, 326, 509, 516, 517, 607, 0, 522, 699, 700, + 701, 531, 0, 441, 322, 321, 0, 0, 0, 351, + 436, 335, 337, 338, 336, 431, 432, 536, 537, 538, + 540, 0, 541, 542, 0, 0, 0, 0, 543, 608, + 624, 592, 561, 524, 616, 558, 562, 563, 381, 627, + 0, 0, 0, 515, 392, 393, 0, 362, 361, 405, + 315, 0, 0, 0, 382, 368, 306, 307, 694, 926, + 424, 629, 662, 663, 554, 0, 941, 921, 923, 924, + 928, 932, 933, 934, 935, 936, 938, 940, 944, 693, + 0, 609, 623, 697, 622, 690, 430, 0, 456, 620, + 567, 0, 613, 586, 587, 0, 614, 582, 618, 0, + 556, 0, 525, 528, 557, 642, 643, 644, 312, 527, + 646, 647, 648, 649, 650, 651, 652, 645, 943, 590, + 566, 593, 506, 569, 568, 0, 0, 604, 863, 605, + 606, 414, 415, 416, 417, 930, 630, 333, 526, 443, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 597, 594, 702, 0, 653, 654, 0, 0, 520, + 521, 367, 374, 539, 376, 332, 429, 369, 504, 386, + 0, 532, 598, 533, 445, 446, 656, 659, 657, 658, + 421, 380, 383, 460, 387, 397, 448, 503, 427, 453, + 330, 493, 462, 402, 583, 611, 952, 925, 951, 953, + 954, 950, 955, 956, 937, 818, 0, 870, 871, 948, + 947, 949, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 637, 636, 635, 634, 633, 632, + 631, 0, 0, 580, 479, 346, 300, 342, 343, 350, + 691, 687, 484, 692, 825, 308, 560, 395, 442, 366, + 625, 626, 0, 677, 914, 879, 880, 881, 815, 882, + 876, 877, 816, 878, 915, 868, 911, 912, 844, 873, + 883, 910, 884, 913, 916, 917, 957, 958, 890, 874, + 270, 959, 887, 918, 909, 908, 885, 869, 919, 920, + 851, 846, 888, 889, 875, 894, 895, 896, 899, 817, + 900, 901, 902, 903, 904, 898, 897, 865, 866, 867, + 891, 892, 872, 470, 847, 848, 849, 850, 0, 0, + 510, 511, 512, 535, 0, 513, 495, 559, 377, 309, + 474, 502, 689, 0, 0, 0, 0, 0, 0, 0, + 610, 621, 655, 0, 665, 666, 668, 670, 905, 672, + 467, 468, 678, 0, 893, 675, 676, 673, 399, 454, + 475, 461, 0, 695, 550, 551, 696, 661, 861, 810, + 0, 2421, 0, 0, 0, 0, 0, 426, 0, 0, + 565, 599, 588, 671, 553, 0, 0, 0, 0, 0, + 0, 813, 0, 0, 0, 359, 0, 0, 394, 603, + 584, 595, 585, 570, 571, 572, 579, 371, 573, 574, + 575, 545, 576, 546, 577, 578, 852, 602, 552, 463, + 410, 0, 619, 0, 0, 931, 939, 0, 0, 0, + 0, 0, 0, 0, 0, 927, 0, 0, 0, 0, + 805, 0, 0, 842, 907, 906, 829, 839, 0, 0, + 328, 241, 547, 667, 549, 548, 830, 0, 831, 835, + 838, 834, 832, 833, 0, 922, 0, 0, 0, 0, + 0, 0, 797, 809, 0, 814, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 806, 807, 0, 0, 0, 0, 862, 0, 808, + 0, 0, 0, 0, 0, 464, 494, 0, 507, 0, + 384, 385, 857, 836, 840, 0, 0, 0, 0, 316, + 471, 491, 329, 458, 505, 334, 466, 483, 324, 425, + 455, 0, 0, 318, 489, 465, 407, 317, 0, 449, + 357, 373, 354, 423, 837, 860, 864, 353, 945, 858, + 499, 320, 0, 498, 422, 485, 490, 408, 401, 0, + 319, 487, 406, 400, 388, 363, 946, 389, 390, 378, + 437, 398, 438, 379, 412, 411, 413, 0, 0, 0, + 0, 0, 529, 530, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 660, + 855, 0, 664, 0, 501, 0, 0, 929, 0, 0, + 0, 469, 0, 0, 391, 0, 0, 0, 859, 0, + 452, 428, 942, 0, 0, 450, 396, 486, 439, 492, + 472, 500, 444, 440, 310, 473, 356, 409, 325, 327, + 688, 358, 360, 364, 365, 418, 419, 433, 457, 476, + 477, 478, 355, 339, 451, 340, 375, 341, 311, 347, + 345, 348, 459, 349, 313, 434, 482, 0, 370, 447, + 404, 314, 403, 435, 481, 480, 326, 509, 516, 517, + 607, 0, 522, 699, 700, 701, 531, 0, 441, 322, + 321, 0, 0, 0, 351, 436, 335, 337, 338, 336, + 431, 432, 536, 537, 538, 540, 0, 541, 542, 0, + 0, 0, 0, 543, 608, 624, 592, 561, 524, 616, + 558, 562, 563, 381, 627, 0, 0, 0, 515, 392, + 393, 0, 362, 361, 405, 315, 0, 0, 0, 382, + 368, 306, 307, 694, 926, 424, 629, 662, 663, 554, + 0, 941, 921, 923, 924, 928, 932, 933, 934, 935, + 936, 938, 940, 944, 693, 0, 609, 623, 697, 622, + 690, 430, 0, 456, 620, 567, 0, 613, 586, 587, + 0, 614, 582, 618, 0, 556, 0, 525, 528, 557, + 642, 643, 644, 312, 527, 646, 647, 648, 649, 650, + 651, 652, 645, 943, 590, 566, 593, 506, 569, 568, + 0, 0, 604, 863, 605, 606, 414, 415, 416, 417, + 930, 630, 333, 526, 443, 0, 591, 0, 0, 0, + 0, 0, 0, 0, 0, 596, 597, 594, 702, 0, + 653, 654, 0, 0, 520, 521, 367, 374, 539, 376, + 332, 429, 369, 504, 386, 0, 532, 598, 533, 445, + 446, 656, 659, 657, 658, 421, 380, 383, 460, 387, + 397, 448, 503, 427, 453, 330, 493, 462, 402, 583, + 611, 952, 925, 951, 953, 954, 950, 955, 956, 937, + 818, 0, 870, 871, 948, 947, 949, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 638, 637, + 636, 635, 634, 633, 632, 631, 0, 0, 580, 479, + 346, 300, 342, 343, 350, 691, 687, 484, 692, 825, + 308, 560, 395, 442, 366, 625, 626, 0, 677, 914, + 879, 880, 881, 815, 882, 876, 877, 816, 878, 915, + 868, 911, 912, 844, 873, 883, 910, 884, 913, 916, + 917, 957, 958, 890, 874, 270, 959, 887, 918, 909, + 908, 885, 869, 919, 920, 851, 846, 888, 889, 875, + 894, 895, 896, 899, 817, 900, 901, 902, 903, 904, + 898, 897, 865, 866, 867, 891, 892, 872, 470, 847, + 848, 849, 850, 0, 0, 510, 511, 512, 535, 0, + 513, 495, 559, 377, 309, 474, 502, 689, 0, 0, + 0, 0, 0, 0, 0, 610, 621, 655, 0, 665, + 666, 668, 670, 905, 672, 467, 468, 678, 0, 893, + 675, 676, 673, 399, 454, 475, 461, 861, 695, 550, + 551, 696, 661, 0, 810, 0, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 813, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 852, 602, 552, 463, 410, + 0, 619, 0, 0, 931, 939, 0, 0, 0, 0, + 0, 0, 0, 0, 927, 0, 0, 0, 0, 805, + 0, 0, 842, 907, 906, 829, 839, 0, 0, 328, + 241, 547, 667, 549, 548, 830, 0, 831, 835, 838, + 834, 832, 833, 0, 922, 0, 0, 0, 0, 0, + 0, 797, 809, 0, 814, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 806, 807, 1993, 0, 0, 0, 862, 0, 808, 0, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 857, 836, 840, 0, 0, 0, 0, 316, 471, + 491, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 837, 860, 864, 353, 945, 858, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 946, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 855, + 0, 664, 0, 501, 0, 0, 929, 0, 0, 0, + 469, 0, 0, 391, 0, 0, 0, 859, 0, 452, + 428, 942, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 0, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 926, 424, 629, 662, 663, 554, 0, + 941, 921, 923, 924, 928, 932, 933, 934, 935, 936, + 938, 940, 944, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 943, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 863, 605, 606, 414, 415, 416, 417, 930, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, + 952, 925, 951, 953, 954, 950, 955, 956, 937, 818, + 0, 870, 871, 948, 947, 949, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 825, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 914, 879, + 880, 881, 815, 882, 876, 877, 816, 878, 915, 868, + 911, 912, 844, 873, 883, 910, 884, 913, 916, 917, + 957, 958, 890, 874, 270, 959, 887, 918, 909, 908, + 885, 869, 919, 920, 851, 846, 888, 889, 875, 894, + 895, 896, 899, 817, 900, 901, 902, 903, 904, 898, + 897, 865, 866, 867, 891, 892, 872, 470, 847, 848, + 849, 850, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 905, 672, 467, 468, 678, 0, 893, 675, + 676, 673, 399, 454, 475, 461, 861, 695, 550, 551, + 696, 661, 0, 810, 0, 426, 0, 0, 565, 599, + 588, 671, 553, 0, 0, 0, 0, 0, 0, 813, + 0, 0, 0, 359, 0, 0, 394, 603, 584, 595, + 585, 570, 571, 572, 579, 371, 573, 574, 575, 545, + 576, 546, 577, 578, 852, 602, 552, 463, 410, 0, + 619, 0, 0, 931, 939, 0, 0, 0, 0, 0, + 0, 0, 0, 927, 0, 0, 0, 0, 805, 0, + 0, 842, 907, 906, 829, 839, 0, 0, 328, 241, + 547, 667, 549, 548, 830, 0, 831, 835, 838, 834, + 832, 833, 0, 922, 0, 0, 0, 0, 0, 0, + 797, 809, 0, 814, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 806, + 807, 0, 0, 0, 0, 862, 0, 808, 0, 0, + 0, 0, 0, 464, 494, 0, 507, 0, 384, 385, + 857, 836, 840, 0, 0, 0, 0, 316, 471, 491, + 329, 458, 505, 334, 466, 483, 324, 425, 455, 0, + 0, 318, 489, 465, 407, 317, 0, 449, 357, 373, + 354, 423, 837, 860, 864, 353, 945, 858, 499, 320, + 0, 498, 422, 485, 490, 408, 401, 0, 319, 487, + 406, 400, 388, 363, 946, 389, 390, 378, 437, 398, + 438, 379, 412, 411, 413, 0, 0, 0, 0, 0, + 529, 530, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 660, 855, 0, + 664, 0, 501, 0, 0, 929, 0, 0, 0, 469, + 0, 0, 391, 0, 0, 0, 859, 0, 452, 428, + 942, 0, 0, 450, 396, 486, 439, 492, 472, 500, + 444, 440, 310, 473, 356, 409, 325, 327, 688, 358, + 360, 364, 365, 418, 419, 433, 457, 476, 477, 478, + 355, 339, 451, 340, 375, 341, 311, 347, 345, 348, + 459, 349, 313, 434, 482, 0, 370, 447, 404, 314, + 403, 435, 481, 480, 326, 509, 516, 517, 607, 0, + 522, 699, 700, 701, 531, 0, 441, 322, 321, 0, + 0, 0, 351, 436, 335, 337, 338, 336, 431, 432, + 536, 537, 538, 540, 0, 541, 542, 0, 0, 0, + 0, 543, 608, 624, 592, 561, 524, 616, 558, 562, + 563, 381, 627, 0, 0, 0, 515, 392, 393, 0, + 362, 361, 405, 315, 0, 0, 0, 382, 368, 306, + 307, 694, 926, 424, 629, 662, 663, 554, 0, 941, + 921, 923, 924, 928, 932, 933, 934, 935, 936, 938, + 940, 944, 693, 0, 609, 623, 697, 622, 690, 430, + 0, 456, 620, 567, 0, 613, 586, 587, 0, 614, + 582, 618, 0, 556, 0, 525, 528, 557, 642, 643, + 644, 312, 527, 646, 647, 648, 649, 650, 651, 652, + 645, 943, 590, 566, 593, 506, 569, 568, 0, 0, + 604, 863, 605, 606, 414, 415, 416, 417, 930, 630, + 333, 526, 443, 0, 591, 0, 0, 0, 0, 0, + 0, 0, 0, 596, 597, 594, 702, 0, 653, 654, + 0, 0, 520, 521, 367, 374, 539, 376, 332, 429, + 369, 504, 386, 0, 532, 598, 533, 445, 446, 656, + 659, 657, 658, 421, 380, 383, 460, 387, 397, 448, + 503, 427, 453, 330, 493, 462, 402, 583, 611, 952, + 925, 951, 953, 954, 950, 955, 956, 937, 818, 0, + 870, 871, 948, 947, 949, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 638, 637, 636, 635, + 634, 633, 632, 631, 0, 0, 580, 479, 346, 300, + 342, 343, 350, 691, 687, 484, 692, 825, 308, 560, + 395, 442, 366, 625, 626, 0, 677, 914, 879, 880, + 881, 815, 882, 876, 877, 816, 878, 915, 868, 911, + 912, 844, 873, 883, 910, 884, 913, 916, 917, 957, + 958, 890, 874, 270, 959, 887, 918, 909, 908, 885, + 869, 919, 920, 851, 846, 888, 889, 875, 894, 895, + 896, 899, 817, 900, 901, 902, 903, 904, 898, 897, + 865, 866, 867, 891, 892, 872, 470, 847, 848, 849, + 850, 0, 0, 510, 511, 512, 535, 0, 513, 495, + 559, 377, 309, 474, 502, 689, 0, 0, 0, 0, + 0, 0, 0, 610, 621, 655, 0, 665, 666, 668, + 670, 905, 672, 467, 468, 678, 0, 893, 675, 676, + 673, 399, 454, 475, 461, 861, 695, 550, 551, 696, + 661, 0, 810, 0, 426, 0, 0, 565, 599, 588, + 671, 553, 0, 0, 0, 0, 0, 0, 813, 0, + 0, 0, 359, 0, 0, 394, 603, 584, 595, 585, + 570, 571, 572, 579, 371, 573, 574, 575, 545, 576, + 546, 577, 578, 852, 602, 552, 463, 410, 0, 619, + 0, 0, 931, 939, 0, 0, 0, 0, 0, 0, + 0, 0, 927, 0, 0, 0, 0, 805, 0, 0, + 842, 907, 906, 829, 839, 0, 0, 328, 241, 547, + 667, 549, 548, 830, 0, 831, 835, 838, 834, 832, + 833, 0, 922, 0, 0, 0, 0, 0, 0, 797, + 809, 0, 814, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 806, 807, + 0, 0, 0, 0, 862, 0, 808, 0, 0, 0, + 0, 0, 464, 494, 0, 507, 0, 384, 385, 857, + 836, 840, 0, 0, 0, 0, 316, 471, 491, 329, + 458, 505, 334, 466, 483, 324, 425, 455, 0, 0, + 318, 489, 465, 407, 317, 0, 449, 357, 373, 354, + 423, 837, 860, 864, 353, 945, 858, 499, 320, 0, + 498, 422, 485, 490, 408, 401, 0, 319, 487, 406, + 400, 388, 363, 946, 389, 390, 378, 437, 398, 438, + 379, 412, 411, 413, 0, 0, 0, 0, 0, 529, + 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 855, 0, 664, + 0, 501, 0, 0, 929, 0, 0, 0, 469, 0, + 0, 391, 0, 0, 0, 859, 0, 452, 428, 942, + 0, 0, 450, 396, 486, 439, 492, 472, 500, 444, + 440, 310, 473, 356, 409, 325, 327, 688, 358, 360, + 364, 365, 418, 419, 433, 457, 476, 477, 478, 355, + 339, 451, 340, 375, 341, 311, 347, 345, 348, 459, + 349, 313, 434, 482, 0, 370, 447, 404, 314, 403, + 435, 481, 480, 326, 509, 516, 517, 607, 0, 522, + 699, 700, 701, 531, 0, 441, 322, 321, 0, 0, + 0, 351, 436, 335, 337, 338, 336, 431, 432, 536, + 537, 538, 540, 0, 541, 542, 0, 0, 0, 0, + 543, 608, 624, 592, 561, 524, 616, 558, 562, 563, + 381, 627, 0, 0, 0, 515, 392, 393, 0, 362, + 361, 405, 315, 0, 0, 0, 382, 368, 306, 307, + 694, 926, 424, 629, 662, 663, 554, 0, 941, 921, + 923, 924, 928, 932, 933, 934, 935, 936, 938, 940, + 944, 693, 0, 609, 623, 697, 622, 690, 430, 0, + 456, 620, 567, 0, 613, 586, 587, 0, 614, 582, + 618, 0, 556, 0, 525, 528, 557, 642, 643, 644, + 312, 527, 646, 647, 648, 649, 650, 651, 652, 645, + 943, 590, 566, 593, 506, 569, 568, 0, 0, 604, + 863, 605, 606, 414, 415, 416, 417, 930, 630, 333, + 526, 443, 0, 591, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 597, 594, 702, 0, 653, 654, 0, + 0, 520, 521, 367, 374, 539, 376, 332, 429, 369, + 504, 386, 0, 532, 598, 533, 445, 446, 656, 659, + 657, 658, 421, 380, 383, 460, 387, 397, 448, 503, + 427, 453, 330, 493, 462, 402, 583, 611, 952, 925, + 951, 953, 954, 950, 955, 956, 937, 818, 0, 870, + 871, 948, 947, 949, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 638, 637, 636, 635, 634, + 633, 632, 631, 0, 0, 580, 479, 346, 300, 342, + 343, 350, 691, 687, 484, 692, 825, 308, 560, 395, + 442, 366, 625, 626, 0, 677, 914, 879, 880, 881, + 815, 882, 876, 877, 816, 878, 915, 868, 911, 912, + 844, 873, 883, 910, 884, 913, 916, 917, 957, 958, + 890, 874, 270, 959, 887, 918, 909, 908, 885, 869, + 919, 920, 851, 846, 888, 889, 875, 894, 895, 896, + 899, 817, 900, 901, 902, 903, 904, 898, 897, 865, + 866, 867, 891, 892, 872, 470, 847, 848, 849, 850, + 0, 0, 510, 511, 512, 535, 0, 513, 495, 559, + 377, 309, 474, 502, 689, 0, 0, 0, 0, 0, + 0, 0, 610, 621, 655, 0, 665, 666, 668, 670, + 905, 672, 467, 468, 678, 0, 3856, 675, 3857, 3858, + 399, 454, 475, 461, 861, 695, 550, 551, 696, 661, + 0, 810, 0, 426, 0, 0, 565, 599, 588, 671, + 553, 0, 0, 0, 0, 0, 0, 813, 0, 0, + 0, 359, 0, 0, 394, 603, 584, 595, 585, 570, + 571, 572, 579, 371, 573, 574, 575, 545, 576, 546, + 577, 578, 852, 602, 552, 463, 410, 0, 619, 0, + 0, 931, 939, 0, 0, 0, 0, 0, 0, 0, + 0, 927, 0, 0, 0, 0, 805, 0, 0, 842, + 907, 906, 829, 839, 0, 0, 328, 241, 547, 667, + 549, 548, 2947, 0, 2948, 835, 838, 834, 832, 833, + 0, 922, 0, 0, 0, 0, 0, 0, 797, 809, + 0, 814, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 806, 807, 0, + 0, 0, 0, 862, 0, 808, 0, 0, 0, 0, + 0, 464, 494, 0, 507, 0, 384, 385, 857, 836, + 840, 0, 0, 0, 0, 316, 471, 491, 329, 458, + 505, 334, 466, 483, 324, 425, 455, 0, 0, 318, + 489, 465, 407, 317, 0, 449, 357, 373, 354, 423, + 837, 860, 864, 353, 945, 858, 499, 320, 0, 498, + 422, 485, 490, 408, 401, 0, 319, 487, 406, 400, + 388, 363, 946, 389, 390, 378, 437, 398, 438, 379, + 412, 411, 413, 0, 0, 0, 0, 0, 529, 530, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 660, 855, 0, 664, 0, + 501, 0, 0, 929, 0, 0, 0, 469, 0, 0, + 391, 0, 0, 0, 859, 0, 452, 428, 942, 0, + 0, 450, 396, 486, 439, 492, 472, 500, 444, 440, + 310, 473, 356, 409, 325, 327, 688, 358, 360, 364, + 365, 418, 419, 433, 457, 476, 477, 478, 355, 339, + 451, 340, 375, 341, 311, 347, 345, 348, 459, 349, + 313, 434, 482, 0, 370, 447, 404, 314, 403, 435, + 481, 480, 326, 509, 516, 517, 607, 0, 522, 699, + 700, 701, 531, 0, 441, 322, 321, 0, 0, 0, + 351, 436, 335, 337, 338, 336, 431, 432, 536, 537, + 538, 540, 0, 541, 542, 0, 0, 0, 0, 543, + 608, 624, 592, 561, 524, 616, 558, 562, 563, 381, + 627, 0, 0, 0, 515, 392, 393, 0, 362, 361, + 405, 315, 0, 0, 0, 382, 368, 306, 307, 694, + 926, 424, 629, 662, 663, 554, 0, 941, 921, 923, + 924, 928, 932, 933, 934, 935, 936, 938, 940, 944, + 693, 0, 609, 623, 697, 622, 690, 430, 0, 456, + 620, 567, 0, 613, 586, 587, 0, 614, 582, 618, + 0, 556, 0, 525, 528, 557, 642, 643, 644, 312, + 527, 646, 647, 648, 649, 650, 651, 652, 645, 943, + 590, 566, 593, 506, 569, 568, 0, 0, 604, 863, + 605, 606, 414, 415, 416, 417, 930, 630, 333, 526, + 443, 0, 591, 0, 0, 0, 0, 0, 0, 0, + 0, 596, 597, 594, 702, 0, 653, 654, 0, 0, + 520, 521, 367, 374, 539, 376, 332, 429, 369, 504, + 386, 0, 532, 598, 533, 445, 446, 656, 659, 657, + 658, 421, 380, 383, 460, 387, 397, 448, 503, 427, + 453, 330, 493, 462, 402, 583, 611, 952, 925, 951, + 953, 954, 950, 955, 956, 937, 818, 0, 870, 871, + 948, 947, 949, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 638, 637, 636, 635, 634, 633, + 632, 631, 0, 0, 580, 479, 346, 300, 342, 343, + 350, 691, 687, 484, 692, 825, 308, 560, 395, 442, + 366, 625, 626, 0, 677, 914, 879, 880, 881, 815, + 882, 876, 877, 816, 878, 915, 868, 911, 912, 844, + 873, 883, 910, 884, 913, 916, 917, 957, 958, 890, + 874, 270, 959, 887, 918, 909, 908, 885, 869, 919, + 920, 851, 846, 888, 889, 875, 894, 895, 896, 899, + 817, 900, 901, 902, 903, 904, 898, 897, 865, 866, + 867, 891, 892, 872, 470, 847, 848, 849, 850, 0, + 0, 510, 511, 512, 535, 0, 513, 495, 559, 377, + 309, 474, 502, 689, 0, 0, 0, 0, 0, 0, + 0, 610, 621, 655, 0, 665, 666, 668, 670, 905, + 672, 467, 468, 678, 0, 893, 675, 676, 673, 399, + 454, 475, 461, 861, 695, 550, 551, 696, 661, 0, + 810, 0, 426, 0, 0, 565, 599, 588, 671, 553, + 0, 0, 1838, 0, 0, 0, 813, 0, 0, 0, + 359, 0, 0, 394, 603, 584, 595, 585, 570, 571, + 572, 579, 371, 573, 574, 575, 545, 576, 546, 577, + 578, 852, 602, 552, 463, 410, 0, 619, 0, 0, + 931, 939, 0, 0, 0, 0, 0, 0, 0, 0, + 927, 0, 0, 0, 0, 805, 0, 0, 842, 907, + 906, 829, 839, 0, 0, 328, 241, 547, 667, 549, + 548, 830, 0, 831, 835, 838, 834, 832, 833, 0, + 922, 0, 0, 0, 0, 0, 0, 0, 809, 0, + 814, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 806, 807, 0, 0, + 0, 0, 862, 0, 808, 0, 0, 0, 0, 0, + 464, 494, 0, 507, 0, 384, 385, 857, 836, 840, + 0, 0, 0, 0, 316, 471, 491, 329, 458, 505, + 334, 466, 483, 324, 425, 455, 0, 0, 318, 489, + 465, 407, 317, 0, 449, 357, 373, 354, 423, 837, + 860, 864, 353, 945, 858, 499, 320, 0, 498, 422, + 485, 490, 408, 401, 0, 319, 487, 406, 400, 388, + 363, 946, 389, 390, 378, 437, 398, 438, 379, 412, + 411, 413, 0, 0, 0, 0, 0, 529, 530, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 660, 855, 0, 664, 0, 501, + 0, 0, 929, 0, 0, 0, 469, 0, 0, 391, + 0, 0, 0, 859, 0, 452, 428, 942, 0, 0, + 450, 396, 486, 439, 492, 472, 500, 444, 440, 310, + 473, 356, 409, 325, 327, 688, 358, 360, 364, 365, + 418, 419, 433, 457, 476, 477, 478, 355, 339, 451, + 340, 375, 341, 311, 347, 345, 348, 459, 349, 313, + 434, 482, 0, 370, 447, 404, 314, 403, 435, 481, + 480, 326, 509, 1839, 1840, 607, 0, 522, 699, 700, + 701, 531, 0, 441, 322, 321, 0, 0, 0, 351, + 436, 335, 337, 338, 336, 431, 432, 536, 537, 538, + 540, 0, 541, 542, 0, 0, 0, 0, 543, 608, + 624, 592, 561, 524, 616, 558, 562, 563, 381, 627, + 0, 0, 0, 515, 392, 393, 0, 362, 361, 405, + 315, 0, 0, 0, 382, 368, 306, 307, 694, 926, + 424, 629, 662, 663, 554, 0, 941, 921, 923, 924, + 928, 932, 933, 934, 935, 936, 938, 940, 944, 693, + 0, 609, 623, 697, 622, 690, 430, 0, 456, 620, + 567, 0, 613, 586, 587, 0, 614, 582, 618, 0, + 556, 0, 525, 528, 557, 642, 643, 644, 312, 527, + 646, 647, 648, 649, 650, 651, 652, 645, 943, 590, + 566, 593, 506, 569, 568, 0, 0, 604, 863, 605, + 606, 414, 415, 416, 417, 930, 630, 333, 526, 443, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 597, 594, 702, 0, 653, 654, 0, 0, 520, + 521, 367, 374, 539, 376, 332, 429, 369, 504, 386, + 0, 532, 598, 533, 445, 446, 656, 659, 657, 658, + 421, 380, 383, 460, 387, 397, 448, 503, 427, 453, + 330, 493, 462, 402, 583, 611, 952, 925, 951, 953, + 954, 950, 955, 956, 937, 818, 0, 870, 871, 948, + 947, 949, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 637, 636, 635, 634, 633, 632, + 631, 0, 0, 580, 479, 346, 300, 342, 343, 350, + 691, 687, 484, 692, 825, 308, 560, 395, 442, 366, + 625, 626, 0, 677, 914, 879, 880, 881, 815, 882, + 876, 877, 816, 878, 915, 868, 911, 912, 844, 873, + 883, 910, 884, 913, 916, 917, 957, 958, 890, 874, + 270, 959, 887, 918, 909, 908, 885, 869, 919, 920, + 851, 846, 888, 889, 875, 894, 895, 896, 899, 817, + 900, 901, 902, 903, 904, 898, 897, 865, 866, 867, + 891, 892, 872, 470, 847, 848, 849, 850, 0, 0, + 510, 511, 512, 535, 0, 513, 495, 559, 377, 309, + 474, 502, 689, 0, 0, 0, 0, 0, 0, 0, + 610, 621, 655, 0, 665, 666, 668, 670, 905, 672, + 467, 468, 678, 0, 893, 675, 676, 673, 399, 454, + 475, 461, 861, 695, 550, 551, 696, 661, 0, 810, + 0, 426, 0, 0, 565, 599, 588, 671, 553, 0, + 0, 0, 0, 0, 0, 813, 0, 0, 0, 359, + 0, 0, 394, 603, 584, 595, 585, 570, 571, 572, + 579, 371, 573, 574, 575, 545, 576, 546, 577, 578, + 852, 602, 552, 463, 410, 0, 619, 0, 0, 931, + 939, 0, 0, 0, 0, 0, 0, 0, 0, 927, + 0, 0, 0, 0, 805, 0, 0, 842, 907, 906, + 829, 839, 0, 0, 328, 241, 547, 667, 549, 548, + 830, 0, 831, 835, 838, 834, 832, 833, 0, 922, + 0, 0, 0, 0, 0, 0, 0, 809, 0, 814, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 806, 807, 0, 0, 0, + 0, 862, 0, 808, 0, 0, 0, 0, 0, 464, + 494, 0, 507, 0, 384, 385, 857, 836, 840, 0, + 0, 0, 0, 316, 471, 491, 329, 458, 505, 334, + 466, 483, 324, 425, 455, 0, 0, 318, 489, 465, + 407, 317, 0, 449, 357, 373, 354, 423, 837, 860, + 864, 353, 945, 858, 499, 320, 0, 498, 422, 485, + 490, 408, 401, 0, 319, 487, 406, 400, 388, 363, + 946, 389, 390, 378, 437, 398, 438, 379, 412, 411, + 413, 0, 0, 0, 0, 0, 529, 530, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 660, 855, 0, 664, 0, 501, 0, + 0, 929, 0, 0, 0, 469, 0, 0, 391, 0, + 0, 0, 859, 0, 452, 428, 942, 0, 0, 450, + 396, 486, 439, 492, 472, 500, 444, 440, 310, 473, + 356, 409, 325, 327, 688, 358, 360, 364, 365, 418, + 419, 433, 457, 476, 477, 478, 355, 339, 451, 340, + 375, 341, 311, 347, 345, 348, 459, 349, 313, 434, + 482, 0, 370, 447, 404, 314, 403, 435, 481, 480, + 326, 509, 516, 517, 607, 0, 522, 699, 700, 701, + 531, 0, 441, 322, 321, 0, 0, 0, 351, 436, + 335, 337, 338, 336, 431, 432, 536, 537, 538, 540, + 0, 541, 542, 0, 0, 0, 0, 543, 608, 624, + 592, 561, 524, 616, 558, 562, 563, 381, 627, 0, + 0, 0, 515, 392, 393, 0, 362, 361, 405, 315, + 0, 0, 0, 382, 368, 306, 307, 694, 926, 424, + 629, 662, 663, 554, 0, 941, 921, 923, 924, 928, + 932, 933, 934, 935, 936, 938, 940, 944, 693, 0, + 609, 623, 697, 622, 690, 430, 0, 456, 620, 567, + 0, 613, 586, 587, 0, 614, 582, 618, 0, 556, + 0, 525, 528, 557, 642, 643, 644, 312, 527, 646, + 647, 648, 649, 650, 651, 652, 645, 943, 590, 566, + 593, 506, 569, 568, 0, 0, 604, 863, 605, 606, + 414, 415, 416, 417, 930, 630, 333, 526, 443, 0, + 591, 0, 0, 0, 0, 0, 0, 0, 0, 596, + 597, 594, 702, 0, 653, 654, 0, 0, 520, 521, + 367, 374, 539, 376, 332, 429, 369, 504, 386, 0, + 532, 598, 533, 445, 446, 656, 659, 657, 658, 421, + 380, 383, 460, 387, 397, 448, 503, 427, 453, 330, + 493, 462, 402, 583, 611, 952, 925, 951, 953, 954, + 950, 955, 956, 937, 818, 0, 870, 871, 948, 947, + 949, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 638, 637, 636, 635, 634, 633, 632, 631, + 0, 0, 580, 479, 346, 300, 342, 343, 350, 691, + 687, 484, 692, 825, 308, 560, 395, 442, 366, 625, + 626, 0, 677, 914, 879, 880, 881, 815, 882, 876, + 877, 816, 878, 915, 868, 911, 912, 844, 873, 883, + 910, 884, 913, 916, 917, 957, 958, 890, 874, 270, + 959, 887, 918, 909, 908, 885, 869, 919, 920, 851, + 846, 888, 889, 875, 894, 895, 896, 899, 817, 900, + 901, 902, 903, 904, 898, 897, 865, 866, 867, 891, + 892, 872, 470, 847, 848, 849, 850, 0, 0, 510, + 511, 512, 535, 0, 513, 495, 559, 377, 309, 474, + 502, 689, 0, 0, 0, 0, 0, 0, 0, 610, + 621, 655, 0, 665, 666, 668, 670, 905, 672, 467, + 468, 678, 0, 893, 675, 676, 673, 399, 454, 475, + 461, 861, 695, 550, 551, 696, 661, 0, 810, 0, + 426, 0, 0, 565, 599, 588, 671, 553, 0, 0, + 0, 0, 0, 0, 813, 0, 0, 0, 359, 0, + 0, 394, 603, 584, 595, 585, 570, 571, 572, 579, + 371, 573, 574, 575, 545, 576, 546, 577, 578, 852, + 602, 552, 463, 410, 0, 619, 0, 0, 931, 939, + 0, 0, 0, 0, 0, 0, 0, 0, 927, 0, + 0, 0, 0, 0, 0, 0, 842, 907, 906, 829, + 839, 0, 0, 328, 241, 547, 667, 549, 548, 830, + 0, 831, 835, 838, 834, 832, 833, 0, 922, 0, + 0, 0, 0, 0, 0, 797, 809, 0, 814, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 806, 807, 0, 0, 0, 0, + 862, 0, 808, 0, 0, 0, 0, 0, 464, 494, + 0, 507, 0, 384, 385, 857, 836, 840, 0, 0, + 0, 0, 316, 471, 491, 329, 458, 505, 334, 466, + 483, 324, 425, 455, 0, 0, 318, 489, 465, 407, + 317, 0, 449, 357, 373, 354, 423, 837, 860, 864, + 353, 945, 858, 499, 320, 0, 498, 422, 485, 490, + 408, 401, 0, 319, 487, 406, 400, 388, 363, 946, + 389, 390, 378, 437, 398, 438, 379, 412, 411, 413, + 0, 0, 0, 0, 0, 529, 530, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 855, 0, 664, 0, 501, 0, 0, + 929, 0, 0, 0, 469, 0, 0, 391, 0, 0, + 0, 859, 0, 452, 428, 942, 0, 0, 450, 396, + 486, 439, 492, 472, 500, 444, 440, 310, 473, 356, + 409, 325, 327, 688, 358, 360, 364, 365, 418, 419, + 433, 457, 476, 477, 478, 355, 339, 451, 340, 375, + 341, 311, 347, 345, 348, 459, 349, 313, 434, 482, + 0, 370, 447, 404, 314, 403, 435, 481, 480, 326, + 509, 516, 517, 607, 0, 522, 699, 700, 701, 531, + 0, 441, 322, 321, 0, 0, 0, 351, 436, 335, + 337, 338, 336, 431, 432, 536, 537, 538, 540, 0, + 541, 542, 0, 0, 0, 0, 543, 608, 624, 592, + 561, 524, 616, 558, 562, 563, 381, 627, 0, 0, + 0, 515, 392, 393, 0, 362, 361, 405, 315, 0, + 0, 0, 382, 368, 306, 307, 694, 926, 424, 629, + 662, 663, 554, 0, 941, 921, 923, 924, 928, 932, + 933, 934, 935, 936, 938, 940, 944, 693, 0, 609, + 623, 697, 622, 690, 430, 0, 456, 620, 567, 0, + 613, 586, 587, 0, 614, 582, 618, 0, 556, 0, + 525, 528, 557, 642, 643, 644, 312, 527, 646, 647, + 648, 649, 650, 651, 652, 645, 943, 590, 566, 593, + 506, 569, 568, 0, 0, 604, 863, 605, 606, 414, + 415, 416, 417, 930, 630, 333, 526, 443, 0, 591, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 597, + 594, 702, 0, 653, 654, 0, 0, 520, 521, 367, + 374, 539, 376, 332, 429, 369, 504, 386, 0, 532, + 598, 533, 445, 446, 656, 659, 657, 658, 421, 380, + 383, 460, 387, 397, 448, 503, 427, 453, 330, 493, + 462, 402, 583, 611, 952, 925, 951, 953, 954, 950, + 955, 956, 937, 818, 0, 870, 871, 948, 947, 949, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 638, 637, 636, 635, 634, 633, 632, 631, 0, + 0, 580, 479, 346, 300, 342, 343, 350, 691, 687, + 484, 692, 825, 308, 560, 395, 442, 366, 625, 626, + 0, 677, 914, 879, 880, 881, 815, 882, 876, 877, + 816, 878, 915, 868, 911, 912, 844, 873, 883, 910, + 884, 913, 916, 917, 957, 958, 890, 874, 270, 959, + 887, 918, 909, 908, 885, 869, 919, 920, 851, 846, + 888, 889, 875, 894, 895, 896, 899, 817, 900, 901, + 902, 903, 904, 898, 897, 865, 866, 867, 891, 892, + 872, 470, 847, 848, 849, 850, 0, 0, 510, 511, + 512, 535, 0, 513, 495, 559, 377, 309, 474, 502, + 689, 0, 0, 0, 0, 0, 0, 0, 610, 621, + 655, 0, 665, 666, 668, 670, 905, 672, 467, 468, + 678, 0, 893, 675, 676, 673, 399, 454, 475, 461, + 0, 695, 550, 551, 696, 661, 0, 810, 179, 218, + 178, 209, 180, 0, 0, 0, 0, 0, 0, 426, + 0, 0, 565, 599, 588, 671, 553, 0, 210, 0, + 0, 0, 0, 0, 0, 201, 0, 359, 0, 211, + 394, 603, 584, 595, 585, 570, 571, 572, 579, 371, + 573, 574, 575, 545, 576, 546, 577, 578, 149, 602, + 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, + 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, + 0, 0, 214, 0, 0, 240, 0, 0, 0, 0, + 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 232, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 464, 494, 0, + 507, 0, 384, 385, 0, 0, 0, 0, 0, 0, + 0, 316, 471, 491, 329, 458, 505, 334, 466, 483, + 324, 425, 455, 0, 0, 318, 489, 465, 407, 317, + 0, 449, 357, 373, 354, 423, 0, 488, 518, 353, + 508, 0, 499, 320, 0, 498, 422, 485, 490, 408, + 401, 0, 319, 487, 406, 400, 388, 363, 534, 389, + 390, 378, 437, 398, 438, 379, 412, 411, 413, 0, + 0, 0, 0, 0, 529, 530, 0, 0, 0, 0, + 0, 0, 0, 177, 207, 216, 208, 74, 133, 0, + 0, 660, 0, 0, 664, 0, 501, 0, 0, 233, + 0, 0, 0, 469, 0, 0, 391, 206, 200, 199, + 519, 0, 452, 428, 245, 0, 0, 450, 396, 486, + 439, 492, 472, 500, 444, 440, 310, 473, 356, 409, + 325, 327, 253, 358, 360, 364, 365, 418, 419, 433, + 457, 476, 477, 478, 355, 339, 451, 340, 375, 341, + 311, 347, 345, 348, 459, 349, 313, 434, 482, 0, + 370, 447, 404, 314, 403, 435, 481, 480, 326, 509, + 516, 517, 607, 0, 522, 639, 640, 641, 531, 0, + 441, 322, 321, 0, 0, 0, 351, 436, 335, 337, + 338, 336, 431, 432, 536, 537, 538, 540, 0, 541, + 542, 0, 0, 0, 0, 543, 608, 624, 592, 561, + 524, 616, 558, 562, 563, 381, 627, 0, 0, 0, + 515, 392, 393, 0, 362, 361, 405, 315, 0, 0, + 0, 382, 368, 306, 307, 496, 352, 424, 629, 662, + 663, 554, 0, 617, 555, 564, 344, 589, 601, 600, + 420, 514, 236, 612, 615, 544, 246, 0, 609, 623, + 581, 622, 247, 430, 0, 456, 620, 567, 0, 613, + 586, 587, 0, 614, 582, 618, 0, 556, 0, 525, + 528, 557, 642, 643, 644, 312, 527, 646, 647, 648, + 649, 650, 651, 652, 645, 497, 590, 566, 593, 506, + 569, 568, 0, 0, 604, 523, 605, 606, 414, 415, + 416, 417, 372, 630, 333, 526, 443, 147, 591, 0, + 0, 0, 0, 0, 0, 0, 0, 596, 597, 594, + 244, 0, 653, 654, 0, 0, 520, 521, 367, 374, + 539, 376, 332, 429, 369, 504, 386, 0, 532, 598, + 533, 445, 446, 656, 659, 657, 658, 421, 380, 383, + 460, 387, 397, 448, 503, 427, 453, 330, 493, 462, + 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, + 0, 70, 0, 0, 293, 294, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 638, 637, 636, 635, 634, 633, 632, 631, 0, 0, + 580, 479, 346, 300, 342, 343, 350, 251, 323, 484, + 252, 0, 308, 560, 395, 442, 366, 625, 626, 65, + 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, + 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, + 274, 275, 276, 277, 278, 628, 269, 270, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 0, 0, 0, 302, 679, 680, 681, + 682, 683, 0, 0, 303, 304, 305, 0, 0, 295, + 470, 296, 297, 298, 299, 0, 0, 510, 511, 512, + 535, 0, 513, 495, 559, 377, 309, 474, 502, 248, + 49, 234, 237, 239, 238, 0, 66, 610, 621, 655, + 5, 665, 666, 668, 670, 669, 672, 467, 468, 678, + 0, 674, 675, 676, 673, 399, 454, 475, 461, 152, + 249, 550, 551, 250, 661, 179, 218, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 149, 602, 552, 463, 410, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 214, + 0, 0, 240, 0, 0, 0, 0, 0, 0, 328, + 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 331, 2601, 2604, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 0, 0, 0, 0, 0, 0, 0, 316, 471, + 491, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 0, 488, 518, 353, 508, 0, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 534, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 0, + 0, 664, 2605, 501, 0, 0, 0, 2600, 0, 2599, + 469, 2597, 2602, 391, 0, 0, 0, 519, 0, 452, + 428, 698, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 2603, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 352, 424, 629, 662, 663, 554, 0, + 617, 555, 564, 344, 589, 601, 600, 420, 514, 0, + 612, 615, 544, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 497, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 523, 605, 606, 414, 415, 416, 417, 372, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 0, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 254, 255, + 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, + 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, + 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 0, 0, 0, 302, 679, 680, 681, 682, 683, 0, + 0, 303, 304, 305, 0, 0, 295, 470, 296, 297, + 298, 299, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 669, 672, 467, 468, 678, 0, 674, 675, + 676, 673, 399, 454, 475, 461, 0, 695, 550, 551, + 696, 661, 426, 0, 0, 565, 599, 588, 671, 553, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 359, 0, 0, 394, 603, 584, 595, 585, 570, 571, + 572, 579, 371, 573, 574, 575, 545, 576, 546, 577, + 578, 0, 602, 552, 463, 410, 0, 619, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1406, 0, 0, 240, 0, + 0, 829, 839, 0, 0, 328, 241, 547, 667, 549, + 548, 830, 0, 831, 835, 838, 834, 832, 833, 0, + 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 464, 494, 0, 507, 0, 384, 385, 0, 836, 0, + 0, 0, 0, 0, 316, 471, 491, 329, 458, 505, + 334, 466, 483, 324, 425, 455, 0, 0, 318, 489, + 465, 407, 317, 0, 449, 357, 373, 354, 423, 837, + 488, 518, 353, 508, 0, 499, 320, 0, 498, 422, + 485, 490, 408, 401, 0, 319, 487, 406, 400, 388, + 363, 534, 389, 390, 378, 437, 398, 438, 379, 412, + 411, 413, 0, 0, 0, 0, 0, 529, 530, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 660, 0, 0, 664, 0, 501, + 0, 0, 0, 0, 0, 0, 469, 0, 0, 391, + 0, 0, 0, 519, 0, 452, 428, 698, 0, 0, + 450, 396, 486, 439, 492, 472, 500, 444, 440, 310, + 473, 356, 409, 325, 327, 688, 358, 360, 364, 365, + 418, 419, 433, 457, 476, 477, 478, 355, 339, 451, + 340, 375, 341, 311, 347, 345, 348, 459, 349, 313, + 434, 482, 0, 370, 447, 404, 314, 403, 435, 481, + 480, 326, 509, 516, 517, 607, 0, 522, 699, 700, + 701, 531, 0, 441, 322, 321, 0, 0, 0, 351, + 436, 335, 337, 338, 336, 431, 432, 536, 537, 538, + 540, 0, 541, 542, 0, 0, 0, 0, 543, 608, + 624, 592, 561, 524, 616, 558, 562, 563, 381, 627, + 0, 0, 0, 515, 392, 393, 0, 362, 361, 405, + 315, 0, 0, 0, 382, 368, 306, 307, 694, 352, + 424, 629, 662, 663, 554, 0, 617, 555, 564, 344, + 589, 601, 600, 420, 514, 0, 612, 615, 544, 693, + 0, 609, 623, 697, 622, 690, 430, 0, 456, 620, + 567, 0, 613, 586, 587, 0, 614, 582, 618, 0, + 556, 0, 525, 528, 557, 642, 643, 644, 312, 527, + 646, 647, 648, 649, 650, 651, 652, 645, 497, 590, + 566, 593, 506, 569, 568, 0, 0, 604, 523, 605, + 606, 414, 415, 416, 417, 372, 630, 333, 526, 443, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 597, 594, 702, 0, 653, 654, 0, 0, 520, + 521, 367, 374, 539, 376, 332, 429, 369, 504, 386, + 0, 532, 598, 533, 445, 446, 656, 659, 657, 658, + 421, 380, 383, 460, 387, 397, 448, 503, 427, 453, + 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 0, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 254, 255, 256, 257, 258, 259, + 0, 0, 0, 638, 637, 636, 635, 634, 633, 632, + 631, 0, 0, 580, 479, 346, 300, 342, 343, 350, + 691, 687, 484, 692, 0, 308, 560, 395, 442, 366, + 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, - 271, 272, 273, 274, 275, 276, 277, 278, 627, 269, + 271, 272, 273, 274, 275, 276, 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, - 678, 679, 680, 681, 682, 0, 0, 303, 304, 305, - 0, 0, 295, 469, 296, 297, 298, 299, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 668, 671, - 466, 467, 677, 0, 673, 674, 675, 672, 398, 453, - 474, 460, 0, 694, 549, 550, 695, 660, 179, 218, - 178, 209, 180, 0, 0, 0, 0, 0, 0, 425, - 720, 0, 564, 598, 587, 670, 552, 0, 0, 0, + 679, 680, 681, 682, 683, 0, 0, 303, 304, 305, + 0, 0, 295, 470, 296, 297, 298, 299, 0, 0, + 510, 511, 512, 535, 0, 513, 495, 559, 377, 309, + 474, 502, 689, 0, 0, 0, 0, 0, 0, 0, + 610, 621, 655, 0, 665, 666, 668, 670, 669, 672, + 467, 468, 678, 0, 674, 675, 676, 673, 399, 454, + 475, 461, 0, 695, 550, 551, 696, 661, 179, 218, + 178, 209, 180, 0, 0, 0, 0, 0, 0, 426, + 721, 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, 0, - 393, 602, 583, 594, 584, 569, 570, 571, 578, 371, - 572, 573, 574, 544, 575, 545, 576, 577, 0, 601, - 551, 462, 409, 0, 618, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 727, 0, 0, 0, 0, 0, - 0, 0, 726, 0, 0, 240, 0, 0, 0, 0, - 0, 0, 328, 241, 546, 666, 548, 547, 0, 0, + 394, 603, 584, 595, 585, 570, 571, 572, 579, 371, + 573, 574, 575, 545, 576, 546, 577, 578, 0, 602, + 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 728, 0, 0, 0, 0, 0, + 0, 0, 727, 0, 0, 240, 0, 0, 0, 0, + 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 463, 493, 0, - 506, 0, 383, 384, 0, 0, 0, 0, 0, 0, - 0, 316, 470, 490, 329, 457, 504, 334, 465, 482, - 324, 424, 454, 0, 0, 318, 488, 464, 406, 317, - 0, 448, 357, 373, 354, 422, 0, 487, 517, 353, - 507, 0, 498, 320, 0, 497, 421, 484, 489, 407, - 400, 0, 319, 486, 405, 399, 387, 363, 533, 388, - 389, 378, 436, 397, 437, 379, 411, 410, 412, 0, - 0, 0, 0, 0, 528, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 724, 725, - 0, 659, 0, 0, 663, 0, 500, 0, 0, 0, - 0, 0, 0, 468, 0, 0, 390, 0, 0, 0, - 518, 0, 451, 427, 697, 0, 0, 449, 395, 485, - 438, 491, 471, 499, 443, 439, 310, 472, 356, 408, - 325, 327, 687, 358, 360, 364, 365, 417, 418, 432, - 456, 475, 476, 477, 355, 339, 450, 340, 375, 341, - 311, 347, 345, 348, 458, 349, 313, 433, 481, 0, - 370, 446, 403, 314, 402, 434, 480, 479, 326, 508, - 515, 516, 606, 0, 521, 698, 699, 700, 530, 0, - 440, 322, 321, 0, 0, 0, 351, 435, 335, 337, - 338, 336, 430, 431, 535, 536, 537, 539, 0, 540, - 541, 0, 0, 0, 0, 542, 607, 623, 591, 560, - 523, 615, 557, 561, 562, 381, 626, 0, 0, 0, - 514, 391, 392, 0, 362, 361, 404, 315, 0, 0, - 368, 306, 307, 693, 352, 423, 628, 661, 662, 553, - 0, 616, 554, 563, 344, 588, 600, 599, 419, 513, - 0, 611, 614, 543, 692, 0, 608, 622, 696, 621, - 689, 429, 0, 455, 619, 566, 0, 612, 585, 586, - 0, 613, 581, 617, 0, 555, 0, 524, 527, 556, - 641, 642, 643, 312, 526, 645, 646, 647, 648, 649, - 650, 651, 644, 496, 589, 565, 592, 505, 568, 567, - 0, 0, 603, 522, 604, 605, 413, 414, 415, 416, - 721, 723, 333, 525, 442, 735, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 595, 596, 593, 701, 0, - 652, 653, 0, 0, 519, 520, 367, 374, 538, 376, - 332, 428, 369, 503, 385, 0, 531, 597, 532, 444, - 445, 655, 658, 656, 657, 420, 380, 382, 459, 386, - 396, 447, 502, 426, 452, 330, 492, 461, 401, 582, - 610, 0, 0, 0, 0, 0, 0, 0, 0, 70, - 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 637, 636, - 635, 634, 633, 632, 631, 630, 0, 0, 579, 478, - 346, 300, 342, 343, 350, 690, 686, 483, 691, 0, - 308, 559, 394, 441, 366, 624, 625, 0, 676, 254, - 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, - 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, - 276, 277, 278, 627, 269, 270, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 0, 0, 0, 0, 302, 678, 679, 680, 681, 682, - 0, 0, 303, 304, 305, 0, 0, 295, 469, 296, - 297, 298, 299, 0, 0, 509, 510, 511, 534, 0, - 512, 494, 558, 377, 309, 473, 501, 688, 0, 0, - 0, 0, 0, 0, 0, 609, 620, 654, 0, 664, - 665, 667, 669, 668, 671, 466, 467, 677, 0, 673, - 674, 675, 672, 398, 453, 474, 460, 0, 694, 549, - 550, 695, 660, 425, 0, 0, 564, 598, 587, 670, - 552, 0, 1202, 0, 0, 0, 0, 0, 0, 0, - 0, 359, 0, 0, 393, 602, 583, 594, 584, 569, - 570, 571, 578, 371, 572, 573, 574, 544, 575, 545, - 576, 577, 0, 601, 551, 462, 409, 0, 618, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, - 0, 0, 0, 0, 0, 0, 328, 241, 546, 666, - 548, 547, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 464, 494, 0, + 507, 0, 384, 385, 0, 0, 0, 0, 0, 0, + 0, 316, 471, 491, 329, 458, 505, 334, 466, 483, + 324, 425, 455, 0, 0, 318, 489, 465, 407, 317, + 0, 449, 357, 373, 354, 423, 0, 488, 518, 353, + 508, 0, 499, 320, 0, 498, 422, 485, 490, 408, + 401, 0, 319, 487, 406, 400, 388, 363, 534, 389, + 390, 378, 437, 398, 438, 379, 412, 411, 413, 0, + 0, 0, 0, 0, 529, 530, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 725, 726, + 0, 660, 0, 0, 664, 0, 501, 0, 0, 0, + 0, 0, 0, 469, 0, 0, 391, 0, 0, 0, + 519, 0, 452, 428, 698, 0, 0, 450, 396, 486, + 439, 492, 472, 500, 444, 440, 310, 473, 356, 409, + 325, 327, 688, 358, 360, 364, 365, 418, 419, 433, + 457, 476, 477, 478, 355, 339, 451, 340, 375, 341, + 311, 347, 345, 348, 459, 349, 313, 434, 482, 0, + 370, 447, 404, 314, 403, 435, 481, 480, 326, 509, + 516, 517, 607, 0, 522, 699, 700, 701, 531, 0, + 441, 322, 321, 0, 0, 0, 351, 436, 335, 337, + 338, 336, 431, 432, 536, 537, 538, 540, 0, 541, + 542, 0, 0, 0, 0, 543, 608, 624, 592, 561, + 524, 616, 558, 562, 563, 381, 627, 0, 0, 0, + 515, 392, 393, 0, 362, 361, 405, 315, 0, 0, + 0, 382, 368, 306, 307, 694, 352, 424, 629, 662, + 663, 554, 0, 617, 555, 564, 344, 589, 601, 600, + 420, 514, 0, 612, 615, 544, 693, 0, 609, 623, + 697, 622, 690, 430, 0, 456, 620, 567, 0, 613, + 586, 587, 0, 614, 582, 618, 0, 556, 0, 525, + 528, 557, 642, 643, 644, 312, 527, 646, 647, 648, + 649, 650, 651, 652, 645, 497, 590, 566, 593, 506, + 569, 568, 0, 0, 604, 523, 605, 606, 414, 415, + 416, 417, 722, 724, 333, 526, 443, 736, 591, 0, + 0, 0, 0, 0, 0, 0, 0, 596, 597, 594, + 702, 0, 653, 654, 0, 0, 520, 521, 367, 374, + 539, 376, 332, 429, 369, 504, 386, 0, 532, 598, + 533, 445, 446, 656, 659, 657, 658, 421, 380, 383, + 460, 387, 397, 448, 503, 427, 453, 330, 493, 462, + 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, + 0, 70, 0, 0, 293, 294, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 638, 637, 636, 635, 634, 633, 632, 631, 0, 0, + 580, 479, 346, 300, 342, 343, 350, 691, 687, 484, + 692, 0, 308, 560, 395, 442, 366, 625, 626, 0, + 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, + 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, + 274, 275, 276, 277, 278, 628, 269, 270, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 0, 0, 0, 302, 679, 680, 681, + 682, 683, 0, 0, 303, 304, 305, 0, 0, 295, + 470, 296, 297, 298, 299, 0, 0, 510, 511, 512, + 535, 0, 513, 495, 559, 377, 309, 474, 502, 689, + 0, 0, 0, 0, 0, 0, 0, 610, 621, 655, + 0, 665, 666, 668, 670, 669, 672, 467, 468, 678, + 0, 674, 675, 676, 673, 399, 454, 475, 461, 0, + 695, 550, 551, 696, 661, 426, 0, 0, 565, 599, + 588, 671, 553, 0, 1203, 0, 0, 0, 0, 0, + 0, 0, 0, 359, 0, 0, 394, 603, 584, 595, + 585, 570, 571, 572, 579, 371, 573, 574, 575, 545, + 576, 546, 577, 578, 0, 602, 552, 463, 410, 0, + 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 0, 0, 0, 0, 328, 241, + 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 463, 493, 0, 506, 0, 2772, 2773, 1187, 0, - 0, 0, 0, 0, 0, 316, 470, 490, 329, 457, - 504, 334, 465, 482, 324, 424, 454, 0, 0, 2766, - 2769, 2770, 2771, 2774, 0, 2779, 2775, 2776, 2777, 2778, - 0, 2762, 2763, 2764, 2765, 1185, 2746, 2767, 0, 2747, - 421, 2748, 2749, 2750, 2751, 1189, 2752, 2753, 2754, 2755, - 2756, 2759, 2760, 2757, 2758, 2780, 2781, 2782, 2783, 2784, - 2785, 2786, 2787, 1213, 1215, 1217, 1219, 1222, 528, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 659, 0, 0, 663, 0, - 500, 0, 0, 0, 0, 0, 0, 468, 0, 0, - 390, 0, 0, 0, 2761, 0, 451, 427, 697, 0, - 0, 449, 395, 485, 438, 491, 471, 499, 443, 439, - 310, 472, 356, 408, 325, 327, 687, 358, 360, 364, - 365, 417, 418, 432, 456, 475, 476, 477, 355, 339, - 450, 340, 375, 341, 311, 347, 345, 348, 458, 349, - 313, 433, 481, 0, 370, 446, 403, 314, 402, 434, - 480, 479, 326, 508, 515, 516, 606, 0, 521, 698, - 699, 700, 530, 0, 440, 322, 321, 0, 0, 0, - 351, 435, 335, 337, 338, 336, 430, 431, 535, 536, - 537, 539, 0, 540, 541, 0, 0, 0, 0, 542, - 607, 623, 591, 560, 523, 615, 557, 561, 562, 381, - 626, 0, 0, 0, 514, 391, 392, 0, 362, 361, - 404, 315, 0, 0, 368, 306, 307, 693, 352, 423, - 628, 661, 662, 553, 0, 616, 554, 563, 344, 588, - 600, 599, 419, 513, 0, 611, 614, 543, 692, 0, - 608, 622, 696, 621, 689, 429, 0, 455, 619, 566, - 0, 612, 585, 586, 0, 613, 581, 617, 0, 555, - 0, 524, 527, 556, 641, 642, 643, 312, 526, 645, - 646, 647, 648, 649, 650, 651, 644, 496, 589, 565, - 592, 505, 568, 567, 0, 0, 603, 522, 604, 605, - 413, 414, 415, 416, 372, 629, 333, 525, 442, 0, - 590, 0, 0, 0, 0, 0, 0, 0, 0, 595, - 596, 593, 701, 0, 652, 653, 0, 0, 519, 520, - 367, 374, 538, 376, 332, 428, 369, 503, 385, 0, - 531, 597, 532, 444, 445, 655, 658, 656, 657, 420, - 380, 382, 459, 386, 396, 447, 502, 426, 452, 330, - 492, 461, 401, 582, 610, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 637, 636, 635, 634, 633, 632, 631, 630, - 0, 0, 579, 478, 346, 300, 342, 343, 350, 690, - 686, 483, 691, 0, 308, 2768, 394, 441, 366, 624, - 625, 0, 676, 254, 255, 256, 257, 258, 259, 260, - 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, - 272, 273, 274, 275, 276, 277, 278, 627, 269, 270, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 0, 0, 0, 0, 302, 678, - 679, 680, 681, 682, 0, 0, 303, 304, 305, 0, - 0, 295, 469, 296, 297, 298, 299, 0, 0, 509, - 510, 511, 534, 0, 512, 494, 558, 377, 309, 473, - 501, 688, 0, 0, 0, 0, 0, 0, 0, 609, - 620, 654, 0, 664, 665, 667, 669, 668, 671, 466, - 467, 677, 0, 673, 674, 675, 672, 398, 453, 474, - 460, 0, 694, 549, 550, 695, 660, 425, 0, 0, - 564, 598, 587, 670, 552, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 359, 0, 0, 393, 602, - 583, 594, 584, 569, 570, 571, 578, 371, 572, 573, - 574, 544, 575, 545, 576, 577, 0, 601, 551, 462, - 409, 0, 618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, - 328, 241, 546, 666, 548, 547, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 331, 2600, 2603, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 463, 493, 0, 506, 0, - 383, 384, 0, 0, 0, 0, 0, 0, 0, 316, - 470, 490, 329, 457, 504, 334, 465, 482, 324, 424, - 454, 0, 0, 318, 488, 464, 406, 317, 0, 448, - 357, 373, 354, 422, 0, 487, 517, 353, 507, 0, - 498, 320, 0, 497, 421, 484, 489, 407, 400, 0, - 319, 486, 405, 399, 387, 363, 533, 388, 389, 378, - 436, 397, 437, 379, 411, 410, 412, 0, 0, 0, - 0, 0, 528, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 659, - 0, 0, 663, 2604, 500, 0, 0, 0, 2599, 0, - 2598, 468, 2596, 2601, 390, 0, 0, 0, 518, 0, - 451, 427, 697, 0, 0, 449, 395, 485, 438, 491, - 471, 499, 443, 439, 310, 472, 356, 408, 325, 327, - 687, 358, 360, 364, 365, 417, 418, 432, 456, 475, - 476, 477, 355, 339, 450, 340, 375, 341, 311, 347, - 345, 348, 458, 349, 313, 433, 481, 2602, 370, 446, - 403, 314, 402, 434, 480, 479, 326, 508, 515, 516, - 606, 0, 521, 698, 699, 700, 530, 0, 440, 322, - 321, 0, 0, 0, 351, 435, 335, 337, 338, 336, - 430, 431, 535, 536, 537, 539, 0, 540, 541, 0, - 0, 0, 0, 542, 607, 623, 591, 560, 523, 615, - 557, 561, 562, 381, 626, 0, 0, 0, 514, 391, - 392, 0, 362, 361, 404, 315, 0, 0, 368, 306, - 307, 693, 352, 423, 628, 661, 662, 553, 0, 616, - 554, 563, 344, 588, 600, 599, 419, 513, 0, 611, - 614, 543, 692, 0, 608, 622, 696, 621, 689, 429, - 0, 455, 619, 566, 0, 612, 585, 586, 0, 613, - 581, 617, 0, 555, 0, 524, 527, 556, 641, 642, - 643, 312, 526, 645, 646, 647, 648, 649, 650, 651, - 644, 496, 589, 565, 592, 505, 568, 567, 0, 0, - 603, 522, 604, 605, 413, 414, 415, 416, 372, 629, - 333, 525, 442, 0, 590, 0, 0, 0, 0, 0, - 0, 0, 0, 595, 596, 593, 701, 0, 652, 653, - 0, 0, 519, 520, 367, 374, 538, 376, 332, 428, - 369, 503, 385, 0, 531, 597, 532, 444, 445, 655, - 658, 656, 657, 420, 380, 382, 459, 386, 396, 447, - 502, 426, 452, 330, 492, 461, 401, 582, 610, 0, + 0, 0, 0, 464, 494, 0, 507, 0, 2773, 2774, + 1188, 0, 0, 0, 0, 0, 0, 316, 471, 491, + 329, 458, 505, 334, 466, 483, 324, 425, 455, 0, + 0, 2767, 2770, 2771, 2772, 2775, 0, 2780, 2776, 2777, + 2778, 2779, 0, 2763, 2764, 2765, 2766, 1186, 2747, 2768, + 0, 2748, 422, 2749, 2750, 2751, 2752, 1190, 2753, 2754, + 2755, 2756, 2757, 2760, 2761, 2758, 2759, 2781, 2782, 2783, + 2784, 2785, 2786, 2787, 2788, 1214, 1216, 1218, 1220, 1223, + 529, 530, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 660, 0, 0, + 664, 0, 501, 0, 0, 0, 0, 0, 0, 469, + 0, 0, 391, 0, 0, 0, 2762, 0, 452, 428, + 698, 0, 0, 450, 396, 486, 439, 492, 472, 500, + 444, 440, 310, 473, 356, 409, 325, 327, 688, 358, + 360, 364, 365, 418, 419, 433, 457, 476, 477, 478, + 355, 339, 451, 340, 375, 341, 311, 347, 345, 348, + 459, 349, 313, 434, 482, 0, 370, 447, 404, 314, + 403, 435, 481, 480, 326, 509, 516, 517, 607, 0, + 522, 699, 700, 701, 531, 0, 441, 322, 321, 0, + 0, 0, 351, 436, 335, 337, 338, 336, 431, 432, + 536, 537, 538, 540, 0, 541, 542, 0, 0, 0, + 0, 543, 608, 624, 592, 561, 524, 616, 558, 562, + 563, 381, 627, 0, 0, 0, 515, 392, 393, 0, + 362, 361, 405, 315, 0, 0, 0, 382, 368, 306, + 307, 694, 352, 424, 629, 662, 663, 554, 0, 617, + 555, 564, 344, 589, 601, 600, 420, 514, 0, 612, + 615, 544, 693, 0, 609, 623, 697, 622, 690, 430, + 0, 456, 620, 567, 0, 613, 586, 587, 0, 614, + 582, 618, 0, 556, 0, 525, 528, 557, 642, 643, + 644, 312, 527, 646, 647, 648, 649, 650, 651, 652, + 645, 497, 590, 566, 593, 506, 569, 568, 0, 0, + 604, 523, 605, 606, 414, 415, 416, 417, 372, 630, + 333, 526, 443, 0, 591, 0, 0, 0, 0, 0, + 0, 0, 0, 596, 597, 594, 702, 0, 653, 654, + 0, 0, 520, 521, 367, 374, 539, 376, 332, 429, + 369, 504, 386, 0, 532, 598, 533, 445, 446, 656, + 659, 657, 658, 421, 380, 383, 460, 387, 397, 448, + 503, 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 637, 636, 635, 634, - 633, 632, 631, 630, 0, 0, 579, 478, 346, 300, - 342, 343, 350, 690, 686, 483, 691, 0, 308, 559, - 394, 441, 366, 624, 625, 0, 676, 254, 255, 256, + 0, 0, 0, 0, 0, 0, 638, 637, 636, 635, + 634, 633, 632, 631, 0, 0, 580, 479, 346, 300, + 342, 343, 350, 691, 687, 484, 692, 0, 308, 2769, + 395, 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, 277, - 278, 627, 269, 270, 279, 280, 281, 282, 283, 284, + 278, 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, 0, - 0, 0, 302, 678, 679, 680, 681, 682, 0, 0, - 303, 304, 305, 0, 0, 295, 469, 296, 297, 298, - 299, 0, 0, 509, 510, 511, 534, 0, 512, 494, - 558, 377, 309, 473, 501, 688, 0, 0, 0, 0, - 0, 0, 0, 609, 620, 654, 0, 664, 665, 667, - 669, 668, 671, 466, 467, 677, 0, 673, 674, 675, - 672, 398, 453, 474, 460, 0, 694, 549, 550, 695, - 660, 425, 0, 0, 564, 598, 587, 670, 552, 0, + 0, 0, 302, 679, 680, 681, 682, 683, 0, 0, + 303, 304, 305, 0, 0, 295, 470, 296, 297, 298, + 299, 0, 0, 510, 511, 512, 535, 0, 513, 495, + 559, 377, 309, 474, 502, 689, 0, 0, 0, 0, + 0, 0, 0, 610, 621, 655, 0, 665, 666, 668, + 670, 669, 672, 467, 468, 678, 0, 674, 675, 676, + 673, 399, 454, 475, 461, 0, 695, 550, 551, 696, + 661, 426, 0, 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, - 0, 0, 393, 602, 583, 594, 584, 569, 570, 571, - 578, 371, 572, 573, 574, 544, 575, 545, 576, 577, - 0, 601, 551, 462, 409, 0, 618, 0, 0, 0, + 0, 0, 394, 603, 584, 595, 585, 570, 571, 572, + 579, 371, 573, 574, 575, 545, 576, 546, 577, 578, + 0, 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, - 0, 0, 0, 0, 328, 241, 546, 666, 548, 547, + 0, 0, 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, - 0, 2621, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 463, - 493, 0, 506, 0, 383, 384, 0, 0, 0, 0, - 0, 0, 0, 316, 470, 490, 329, 457, 504, 334, - 465, 482, 324, 424, 454, 0, 0, 318, 488, 464, - 406, 317, 0, 448, 357, 373, 354, 422, 0, 487, - 517, 353, 507, 0, 498, 320, 0, 497, 421, 484, - 489, 407, 400, 0, 319, 486, 405, 399, 387, 363, - 533, 388, 389, 378, 436, 397, 437, 379, 411, 410, - 412, 0, 0, 0, 0, 0, 528, 529, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 659, 0, 0, 663, 2620, 500, 0, - 0, 0, 2626, 2623, 2625, 468, 0, 2624, 390, 0, - 0, 0, 518, 0, 451, 427, 697, 0, 2618, 449, - 395, 485, 438, 491, 471, 499, 443, 439, 310, 472, - 356, 408, 325, 327, 687, 358, 360, 364, 365, 417, - 418, 432, 456, 475, 476, 477, 355, 339, 450, 340, - 375, 341, 311, 347, 345, 348, 458, 349, 313, 433, - 481, 0, 370, 446, 403, 314, 402, 434, 480, 479, - 326, 508, 515, 516, 606, 0, 521, 698, 699, 700, - 530, 0, 440, 322, 321, 0, 0, 0, 351, 435, - 335, 337, 338, 336, 430, 431, 535, 536, 537, 539, - 0, 540, 541, 0, 0, 0, 0, 542, 607, 623, - 591, 560, 523, 615, 557, 561, 562, 381, 626, 0, - 0, 0, 514, 391, 392, 0, 362, 361, 404, 315, - 0, 0, 368, 306, 307, 693, 352, 423, 628, 661, - 662, 553, 0, 616, 554, 563, 344, 588, 600, 599, - 419, 513, 0, 611, 614, 543, 692, 0, 608, 622, - 696, 621, 689, 429, 0, 455, 619, 566, 0, 612, - 585, 586, 0, 613, 581, 617, 0, 555, 0, 524, - 527, 556, 641, 642, 643, 312, 526, 645, 646, 647, - 648, 649, 650, 651, 644, 496, 589, 565, 592, 505, - 568, 567, 0, 0, 603, 522, 604, 605, 413, 414, - 415, 416, 372, 629, 333, 525, 442, 0, 590, 0, - 0, 0, 0, 0, 0, 0, 0, 595, 596, 593, - 701, 0, 652, 653, 0, 0, 519, 520, 367, 374, - 538, 376, 332, 428, 369, 503, 385, 0, 531, 597, - 532, 444, 445, 655, 658, 656, 657, 420, 380, 382, - 459, 386, 396, 447, 502, 426, 452, 330, 492, 461, - 401, 582, 610, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, + 2601, 2604, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 464, + 494, 0, 507, 0, 384, 385, 0, 0, 0, 0, + 0, 0, 0, 316, 471, 491, 329, 458, 505, 334, + 466, 483, 324, 425, 455, 0, 0, 318, 489, 465, + 407, 317, 0, 449, 357, 373, 354, 423, 0, 488, + 518, 353, 508, 0, 499, 320, 0, 498, 422, 485, + 490, 408, 401, 0, 319, 487, 406, 400, 388, 363, + 534, 389, 390, 378, 437, 398, 438, 379, 412, 411, + 413, 0, 0, 0, 0, 0, 529, 530, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 660, 0, 0, 664, 2605, 501, 0, + 0, 0, 2600, 0, 2599, 469, 2597, 2602, 391, 0, + 0, 0, 519, 0, 452, 428, 698, 0, 0, 450, + 396, 486, 439, 492, 472, 500, 444, 440, 310, 473, + 356, 409, 325, 327, 688, 358, 360, 364, 365, 418, + 419, 433, 457, 476, 477, 478, 355, 339, 451, 340, + 375, 341, 311, 347, 345, 348, 459, 349, 313, 434, + 482, 2603, 370, 447, 404, 314, 403, 435, 481, 480, + 326, 509, 516, 517, 607, 0, 522, 699, 700, 701, + 531, 0, 441, 322, 321, 0, 0, 0, 351, 436, + 335, 337, 338, 336, 431, 432, 536, 537, 538, 540, + 0, 541, 542, 0, 0, 0, 0, 543, 608, 624, + 592, 561, 524, 616, 558, 562, 563, 381, 627, 0, + 0, 0, 515, 392, 393, 0, 362, 361, 405, 315, + 0, 0, 0, 382, 368, 306, 307, 694, 352, 424, + 629, 662, 663, 554, 0, 617, 555, 564, 344, 589, + 601, 600, 420, 514, 0, 612, 615, 544, 693, 0, + 609, 623, 697, 622, 690, 430, 0, 456, 620, 567, + 0, 613, 586, 587, 0, 614, 582, 618, 0, 556, + 0, 525, 528, 557, 642, 643, 644, 312, 527, 646, + 647, 648, 649, 650, 651, 652, 645, 497, 590, 566, + 593, 506, 569, 568, 0, 0, 604, 523, 605, 606, + 414, 415, 416, 417, 372, 630, 333, 526, 443, 0, + 591, 0, 0, 0, 0, 0, 0, 0, 0, 596, + 597, 594, 702, 0, 653, 654, 0, 0, 520, 521, + 367, 374, 539, 376, 332, 429, 369, 504, 386, 0, + 532, 598, 533, 445, 446, 656, 659, 657, 658, 421, + 380, 383, 460, 387, 397, 448, 503, 427, 453, 330, + 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 637, 636, 635, 634, 633, 632, 631, 630, 0, 0, - 579, 478, 346, 300, 342, 343, 350, 690, 686, 483, - 691, 0, 308, 559, 394, 441, 366, 624, 625, 0, - 676, 254, 255, 256, 257, 258, 259, 260, 261, 301, - 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, - 274, 275, 276, 277, 278, 627, 269, 270, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 0, 0, 0, 0, 302, 678, 679, 680, - 681, 682, 0, 0, 303, 304, 305, 0, 0, 295, - 469, 296, 297, 298, 299, 0, 0, 509, 510, 511, - 534, 0, 512, 494, 558, 377, 309, 473, 501, 688, - 0, 0, 0, 0, 0, 0, 0, 609, 620, 654, - 0, 664, 665, 667, 669, 668, 671, 466, 467, 677, - 0, 673, 674, 675, 672, 398, 453, 474, 460, 0, - 694, 549, 550, 695, 660, 425, 0, 0, 564, 598, - 587, 670, 552, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 359, 0, 0, 393, 602, 583, 594, - 584, 569, 570, 571, 578, 371, 572, 573, 574, 544, - 575, 545, 576, 577, 0, 601, 551, 462, 409, 0, - 618, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 638, 637, 636, 635, 634, 633, 632, 631, + 0, 0, 580, 479, 346, 300, 342, 343, 350, 691, + 687, 484, 692, 0, 308, 560, 395, 442, 366, 625, + 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, + 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, + 272, 273, 274, 275, 276, 277, 278, 628, 269, 270, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 0, 0, 0, 302, 679, + 680, 681, 682, 683, 0, 0, 303, 304, 305, 0, + 0, 295, 470, 296, 297, 298, 299, 0, 0, 510, + 511, 512, 535, 0, 513, 495, 559, 377, 309, 474, + 502, 689, 0, 0, 0, 0, 0, 0, 0, 610, + 621, 655, 0, 665, 666, 668, 670, 669, 672, 467, + 468, 678, 0, 674, 675, 676, 673, 399, 454, 475, + 461, 0, 695, 550, 551, 696, 661, 426, 0, 0, + 565, 599, 588, 671, 553, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 359, 0, 0, 394, 603, + 584, 595, 585, 570, 571, 572, 579, 371, 573, 574, + 575, 545, 576, 546, 577, 578, 0, 602, 552, 463, + 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 240, 0, 0, 0, 0, 0, 0, 328, 241, - 546, 666, 548, 547, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 331, 0, 2621, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 463, 493, 0, 506, 0, 383, 384, - 0, 0, 0, 0, 0, 0, 0, 316, 470, 490, - 329, 457, 504, 334, 465, 482, 324, 424, 454, 0, - 0, 318, 488, 464, 406, 317, 0, 448, 357, 373, - 354, 422, 0, 487, 517, 353, 507, 0, 498, 320, - 0, 497, 421, 484, 489, 407, 400, 0, 319, 486, - 405, 399, 387, 363, 533, 388, 389, 378, 436, 397, - 437, 379, 411, 410, 412, 0, 0, 0, 0, 0, - 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 659, 0, 0, - 663, 2620, 500, 0, 0, 0, 2626, 2623, 2625, 468, - 0, 2624, 390, 0, 0, 0, 518, 0, 451, 427, - 697, 0, 0, 449, 395, 485, 438, 491, 471, 499, - 443, 439, 310, 472, 356, 408, 325, 327, 687, 358, - 360, 364, 365, 417, 418, 432, 456, 475, 476, 477, - 355, 339, 450, 340, 375, 341, 311, 347, 345, 348, - 458, 349, 313, 433, 481, 0, 370, 446, 403, 314, - 402, 434, 480, 479, 326, 508, 515, 516, 606, 0, - 521, 698, 699, 700, 530, 0, 440, 322, 321, 0, - 0, 0, 351, 435, 335, 337, 338, 336, 430, 431, - 535, 536, 537, 539, 0, 540, 541, 0, 0, 0, - 0, 542, 607, 623, 591, 560, 523, 615, 557, 561, - 562, 381, 626, 0, 0, 0, 514, 391, 392, 0, - 362, 361, 404, 315, 0, 0, 368, 306, 307, 693, - 352, 423, 628, 661, 662, 553, 0, 616, 554, 563, - 344, 588, 600, 599, 419, 513, 0, 611, 614, 543, - 692, 0, 608, 622, 696, 621, 689, 429, 0, 455, - 619, 566, 0, 612, 585, 586, 0, 613, 581, 617, - 0, 555, 0, 524, 527, 556, 641, 642, 643, 312, - 526, 645, 646, 647, 648, 649, 650, 651, 644, 496, - 589, 565, 592, 505, 568, 567, 0, 0, 603, 522, - 604, 605, 413, 414, 415, 416, 372, 629, 333, 525, - 442, 0, 590, 0, 0, 0, 0, 0, 0, 0, - 0, 595, 596, 593, 701, 0, 652, 653, 0, 0, - 519, 520, 367, 374, 538, 376, 332, 428, 369, 503, - 385, 0, 531, 597, 532, 444, 445, 655, 658, 656, - 657, 420, 380, 382, 459, 386, 396, 447, 502, 426, - 452, 330, 492, 461, 401, 582, 610, 0, 0, 0, + 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, + 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 331, 0, 2622, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 464, 494, 0, 507, 0, + 384, 385, 0, 0, 0, 0, 0, 0, 0, 316, + 471, 491, 329, 458, 505, 334, 466, 483, 324, 425, + 455, 0, 0, 318, 489, 465, 407, 317, 0, 449, + 357, 373, 354, 423, 0, 488, 518, 353, 508, 0, + 499, 320, 0, 498, 422, 485, 490, 408, 401, 0, + 319, 487, 406, 400, 388, 363, 534, 389, 390, 378, + 437, 398, 438, 379, 412, 411, 413, 0, 0, 0, + 0, 0, 529, 530, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 660, + 0, 0, 664, 2621, 501, 0, 0, 0, 2627, 2624, + 2626, 469, 0, 2625, 391, 0, 0, 0, 519, 0, + 452, 428, 698, 0, 2619, 450, 396, 486, 439, 492, + 472, 500, 444, 440, 310, 473, 356, 409, 325, 327, + 688, 358, 360, 364, 365, 418, 419, 433, 457, 476, + 477, 478, 355, 339, 451, 340, 375, 341, 311, 347, + 345, 348, 459, 349, 313, 434, 482, 0, 370, 447, + 404, 314, 403, 435, 481, 480, 326, 509, 516, 517, + 607, 0, 522, 699, 700, 701, 531, 0, 441, 322, + 321, 0, 0, 0, 351, 436, 335, 337, 338, 336, + 431, 432, 536, 537, 538, 540, 0, 541, 542, 0, + 0, 0, 0, 543, 608, 624, 592, 561, 524, 616, + 558, 562, 563, 381, 627, 0, 0, 0, 515, 392, + 393, 0, 362, 361, 405, 315, 0, 0, 0, 382, + 368, 306, 307, 694, 352, 424, 629, 662, 663, 554, + 0, 617, 555, 564, 344, 589, 601, 600, 420, 514, + 0, 612, 615, 544, 693, 0, 609, 623, 697, 622, + 690, 430, 0, 456, 620, 567, 0, 613, 586, 587, + 0, 614, 582, 618, 0, 556, 0, 525, 528, 557, + 642, 643, 644, 312, 527, 646, 647, 648, 649, 650, + 651, 652, 645, 497, 590, 566, 593, 506, 569, 568, + 0, 0, 604, 523, 605, 606, 414, 415, 416, 417, + 372, 630, 333, 526, 443, 0, 591, 0, 0, 0, + 0, 0, 0, 0, 0, 596, 597, 594, 702, 0, + 653, 654, 0, 0, 520, 521, 367, 374, 539, 376, + 332, 429, 369, 504, 386, 0, 532, 598, 533, 445, + 446, 656, 659, 657, 658, 421, 380, 383, 460, 387, + 397, 448, 503, 427, 453, 330, 493, 462, 402, 583, + 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 638, 637, + 636, 635, 634, 633, 632, 631, 0, 0, 580, 479, + 346, 300, 342, 343, 350, 691, 687, 484, 692, 0, + 308, 560, 395, 442, 366, 625, 626, 0, 677, 254, + 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, + 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, + 276, 277, 278, 628, 269, 270, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 0, 0, 0, 302, 679, 680, 681, 682, 683, + 0, 0, 303, 304, 305, 0, 0, 295, 470, 296, + 297, 298, 299, 0, 0, 510, 511, 512, 535, 0, + 513, 495, 559, 377, 309, 474, 502, 689, 0, 0, + 0, 0, 0, 0, 0, 610, 621, 655, 0, 665, + 666, 668, 670, 669, 672, 467, 468, 678, 0, 674, + 675, 676, 673, 399, 454, 475, 461, 0, 695, 550, + 551, 696, 661, 426, 0, 0, 565, 599, 588, 671, + 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 359, 0, 0, 394, 603, 584, 595, 585, 570, + 571, 572, 579, 371, 573, 574, 575, 545, 576, 546, + 577, 578, 0, 602, 552, 463, 410, 0, 619, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 0, 0, 0, 0, 328, 241, 547, 667, + 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 331, 0, 2622, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 464, 494, 0, 507, 0, 384, 385, 0, 0, + 0, 0, 0, 0, 0, 316, 471, 491, 329, 458, + 505, 334, 466, 483, 324, 425, 455, 0, 0, 318, + 489, 465, 407, 317, 0, 449, 357, 373, 354, 423, + 0, 488, 518, 353, 508, 0, 499, 320, 0, 498, + 422, 485, 490, 408, 401, 0, 319, 487, 406, 400, + 388, 363, 534, 389, 390, 378, 437, 398, 438, 379, + 412, 411, 413, 0, 0, 0, 0, 0, 529, 530, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 660, 0, 0, 664, 2621, + 501, 0, 0, 0, 2627, 2624, 2626, 469, 0, 2625, + 391, 0, 0, 0, 519, 0, 452, 428, 698, 0, + 0, 450, 396, 486, 439, 492, 472, 500, 444, 440, + 310, 473, 356, 409, 325, 327, 688, 358, 360, 364, + 365, 418, 419, 433, 457, 476, 477, 478, 355, 339, + 451, 340, 375, 341, 311, 347, 345, 348, 459, 349, + 313, 434, 482, 0, 370, 447, 404, 314, 403, 435, + 481, 480, 326, 509, 516, 517, 607, 0, 522, 699, + 700, 701, 531, 0, 441, 322, 321, 0, 0, 0, + 351, 436, 335, 337, 338, 336, 431, 432, 536, 537, + 538, 540, 0, 541, 542, 0, 0, 0, 0, 543, + 608, 624, 592, 561, 524, 616, 558, 562, 563, 381, + 627, 0, 0, 0, 515, 392, 393, 0, 362, 361, + 405, 315, 0, 0, 0, 382, 368, 306, 307, 694, + 352, 424, 629, 662, 663, 554, 0, 617, 555, 564, + 344, 589, 601, 600, 420, 514, 0, 612, 615, 544, + 693, 0, 609, 623, 697, 622, 690, 430, 0, 456, + 620, 567, 0, 613, 586, 587, 0, 614, 582, 618, + 0, 556, 0, 525, 528, 557, 642, 643, 644, 312, + 527, 646, 647, 648, 649, 650, 651, 652, 645, 497, + 590, 566, 593, 506, 569, 568, 0, 0, 604, 523, + 605, 606, 414, 415, 416, 417, 372, 630, 333, 526, + 443, 0, 591, 0, 0, 0, 0, 0, 0, 0, + 0, 596, 597, 594, 702, 0, 653, 654, 0, 0, + 520, 521, 367, 374, 539, 376, 332, 429, 369, 504, + 386, 0, 532, 598, 533, 445, 446, 656, 659, 657, + 658, 421, 380, 383, 460, 387, 397, 448, 503, 427, + 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 637, 636, 635, 634, 633, 632, - 631, 630, 0, 0, 579, 478, 346, 300, 342, 343, - 350, 690, 686, 483, 691, 0, 308, 559, 394, 441, - 366, 624, 625, 0, 676, 254, 255, 256, 257, 258, + 0, 0, 0, 0, 638, 637, 636, 635, 634, 633, + 632, 631, 0, 0, 580, 479, 346, 300, 342, 343, + 350, 691, 687, 484, 692, 0, 308, 560, 395, 442, + 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, - 268, 271, 272, 273, 274, 275, 276, 277, 278, 627, + 268, 271, 272, 273, 274, 275, 276, 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, 0, 0, 0, - 302, 678, 679, 680, 681, 682, 0, 0, 303, 304, - 305, 0, 0, 295, 469, 296, 297, 298, 299, 0, - 0, 509, 510, 511, 534, 0, 512, 494, 558, 377, - 309, 473, 501, 688, 0, 0, 0, 0, 0, 0, - 0, 609, 620, 654, 0, 664, 665, 667, 669, 668, - 671, 466, 467, 677, 0, 673, 674, 675, 672, 398, - 453, 474, 460, 0, 694, 549, 550, 695, 660, 425, - 0, 0, 564, 598, 587, 670, 552, 0, 0, 0, - 0, 0, 2288, 0, 0, 0, 0, 359, 0, 0, - 393, 602, 583, 594, 584, 569, 570, 571, 578, 371, - 572, 573, 574, 544, 575, 545, 576, 577, 0, 601, - 551, 462, 409, 0, 618, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 240, 0, 0, 2289, 0, - 0, 0, 328, 241, 546, 666, 548, 547, 0, 0, + 302, 679, 680, 681, 682, 683, 0, 0, 303, 304, + 305, 0, 0, 295, 470, 296, 297, 298, 299, 0, + 0, 510, 511, 512, 535, 0, 513, 495, 559, 377, + 309, 474, 502, 689, 0, 0, 0, 0, 0, 0, + 0, 610, 621, 655, 0, 665, 666, 668, 670, 669, + 672, 467, 468, 678, 0, 674, 675, 676, 673, 399, + 454, 475, 461, 0, 695, 550, 551, 696, 661, 426, + 0, 0, 565, 599, 588, 671, 553, 0, 0, 0, + 0, 0, 2289, 0, 0, 0, 0, 359, 0, 0, + 394, 603, 584, 595, 585, 570, 571, 572, 579, 371, + 573, 574, 575, 545, 576, 546, 577, 578, 0, 602, + 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 2290, 0, + 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, - 1331, 1332, 1333, 1330, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 463, 493, 0, - 506, 0, 383, 384, 0, 0, 0, 0, 0, 0, - 0, 316, 470, 490, 329, 457, 504, 334, 465, 482, - 324, 424, 454, 0, 0, 318, 488, 464, 406, 317, - 0, 448, 357, 373, 354, 422, 0, 487, 517, 353, - 507, 0, 498, 320, 0, 497, 421, 484, 489, 407, - 400, 0, 319, 486, 405, 399, 387, 363, 533, 388, - 389, 378, 436, 397, 437, 379, 411, 410, 412, 0, - 0, 0, 0, 0, 528, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 659, 0, 0, 663, 0, 500, 0, 0, 0, - 0, 0, 0, 468, 0, 0, 390, 0, 0, 0, - 518, 0, 451, 427, 697, 0, 0, 449, 395, 485, - 438, 491, 471, 499, 443, 439, 310, 472, 356, 408, - 325, 327, 687, 358, 360, 364, 365, 417, 418, 432, - 456, 475, 476, 477, 355, 339, 450, 340, 375, 341, - 311, 347, 345, 348, 458, 349, 313, 433, 481, 0, - 370, 446, 403, 314, 402, 434, 480, 479, 326, 508, - 515, 516, 606, 0, 521, 698, 699, 700, 530, 0, - 440, 322, 321, 0, 0, 0, 351, 435, 335, 337, - 338, 336, 430, 431, 535, 536, 537, 539, 0, 540, - 541, 0, 0, 0, 0, 542, 607, 623, 591, 560, - 523, 615, 557, 561, 562, 381, 626, 0, 0, 0, - 514, 391, 392, 0, 362, 361, 404, 315, 0, 0, - 368, 306, 307, 693, 352, 423, 628, 661, 662, 553, - 0, 616, 554, 563, 344, 588, 600, 599, 419, 513, - 0, 611, 614, 543, 692, 0, 608, 622, 696, 621, - 689, 429, 0, 455, 619, 566, 0, 612, 585, 586, - 0, 613, 581, 617, 0, 555, 0, 524, 527, 556, - 641, 642, 643, 312, 526, 645, 646, 647, 648, 649, - 650, 651, 644, 496, 589, 565, 592, 505, 568, 567, - 0, 0, 603, 522, 604, 605, 413, 414, 415, 416, - 372, 629, 333, 525, 442, 0, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 595, 596, 593, 701, 0, - 652, 653, 0, 0, 519, 520, 367, 374, 538, 376, - 332, 428, 369, 503, 385, 0, 531, 597, 532, 444, - 445, 655, 658, 656, 657, 420, 380, 382, 459, 386, - 396, 447, 502, 426, 452, 330, 492, 461, 401, 582, - 610, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 637, 636, - 635, 634, 633, 632, 631, 630, 0, 0, 579, 478, - 346, 300, 342, 343, 350, 690, 686, 483, 691, 0, - 308, 559, 394, 441, 366, 624, 625, 0, 676, 254, - 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, - 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, - 276, 277, 278, 627, 269, 270, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 0, 0, 0, 0, 302, 678, 679, 680, 681, 682, - 0, 0, 303, 304, 305, 0, 0, 295, 469, 296, - 297, 298, 299, 0, 0, 509, 510, 511, 534, 0, - 512, 494, 558, 377, 309, 473, 501, 688, 0, 0, - 0, 0, 0, 0, 0, 609, 620, 654, 0, 664, - 665, 667, 669, 668, 671, 466, 467, 677, 0, 673, - 674, 675, 672, 398, 453, 474, 460, 0, 694, 549, - 550, 695, 660, 179, 218, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 359, 0, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 149, 601, 551, 462, 409, 0, 618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 214, 2549, 0, - 240, 0, 0, 0, 0, 0, 0, 328, 241, 546, - 666, 548, 547, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, + 1332, 1333, 1334, 1331, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 464, 494, 0, + 507, 0, 384, 385, 0, 0, 0, 0, 0, 0, + 0, 316, 471, 491, 329, 458, 505, 334, 466, 483, + 324, 425, 455, 0, 0, 318, 489, 465, 407, 317, + 0, 449, 357, 373, 354, 423, 0, 488, 518, 353, + 508, 0, 499, 320, 0, 498, 422, 485, 490, 408, + 401, 0, 319, 487, 406, 400, 388, 363, 534, 389, + 390, 378, 437, 398, 438, 379, 412, 411, 413, 0, + 0, 0, 0, 0, 529, 530, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 660, 0, 0, 664, 0, 501, 0, 0, 0, + 0, 0, 0, 469, 0, 0, 391, 0, 0, 0, + 519, 0, 452, 428, 698, 0, 0, 450, 396, 486, + 439, 492, 472, 500, 444, 440, 310, 473, 356, 409, + 325, 327, 688, 358, 360, 364, 365, 418, 419, 433, + 457, 476, 477, 478, 355, 339, 451, 340, 375, 341, + 311, 347, 345, 348, 459, 349, 313, 434, 482, 0, + 370, 447, 404, 314, 403, 435, 481, 480, 326, 509, + 516, 517, 607, 0, 522, 699, 700, 701, 531, 0, + 441, 322, 321, 0, 0, 0, 351, 436, 335, 337, + 338, 336, 431, 432, 536, 537, 538, 540, 0, 541, + 542, 0, 0, 0, 0, 543, 608, 624, 592, 561, + 524, 616, 558, 562, 563, 381, 627, 0, 0, 0, + 515, 392, 393, 0, 362, 361, 405, 315, 0, 0, + 0, 382, 368, 306, 307, 694, 352, 424, 629, 662, + 663, 554, 0, 617, 555, 564, 344, 589, 601, 600, + 420, 514, 0, 612, 615, 544, 693, 0, 609, 623, + 697, 622, 690, 430, 0, 456, 620, 567, 0, 613, + 586, 587, 0, 614, 582, 618, 0, 556, 0, 525, + 528, 557, 642, 643, 644, 312, 527, 646, 647, 648, + 649, 650, 651, 652, 645, 497, 590, 566, 593, 506, + 569, 568, 0, 0, 604, 523, 605, 606, 414, 415, + 416, 417, 372, 630, 333, 526, 443, 0, 591, 0, + 0, 0, 0, 0, 0, 0, 0, 596, 597, 594, + 702, 0, 653, 654, 0, 0, 520, 521, 367, 374, + 539, 376, 332, 429, 369, 504, 386, 0, 532, 598, + 533, 445, 446, 656, 659, 657, 658, 421, 380, 383, + 460, 387, 397, 448, 503, 427, 453, 330, 493, 462, + 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 638, 637, 636, 635, 634, 633, 632, 631, 0, 0, + 580, 479, 346, 300, 342, 343, 350, 691, 687, 484, + 692, 0, 308, 560, 395, 442, 366, 625, 626, 0, + 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, + 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, + 274, 275, 276, 277, 278, 628, 269, 270, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 0, 0, 0, 302, 679, 680, 681, + 682, 683, 0, 0, 303, 304, 305, 0, 0, 295, + 470, 296, 297, 298, 299, 0, 0, 510, 511, 512, + 535, 0, 513, 495, 559, 377, 309, 474, 502, 689, + 0, 0, 0, 0, 0, 0, 0, 610, 621, 655, + 0, 665, 666, 668, 670, 669, 672, 467, 468, 678, + 0, 674, 675, 676, 673, 399, 454, 475, 461, 0, + 695, 550, 551, 696, 661, 179, 218, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 149, 602, 552, 463, 410, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 214, + 2550, 0, 240, 0, 0, 0, 0, 0, 0, 328, + 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 0, - 0, 0, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 482, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 0, 487, 517, 353, 507, 0, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 533, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 0, 0, 663, - 0, 500, 0, 0, 0, 0, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 518, 0, 451, 427, 697, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 443, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 515, 516, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 352, - 423, 628, 661, 662, 553, 0, 616, 554, 563, 344, - 588, 600, 599, 419, 513, 0, 611, 614, 543, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 651, 644, 496, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 522, 604, - 605, 413, 414, 415, 416, 372, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 0, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 254, 255, 256, 257, 258, 259, - 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, - 271, 272, 273, 274, 275, 276, 277, 278, 627, 269, - 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, - 678, 679, 680, 681, 682, 0, 0, 303, 304, 305, - 0, 0, 295, 469, 296, 297, 298, 299, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 668, 671, - 466, 467, 677, 0, 673, 674, 675, 672, 398, 453, - 474, 460, 0, 694, 549, 550, 695, 660, 179, 218, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 425, - 0, 0, 564, 598, 587, 670, 552, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 359, 0, 0, - 393, 602, 583, 594, 584, 569, 570, 571, 578, 371, - 572, 573, 574, 544, 575, 545, 576, 577, 149, 601, - 551, 462, 409, 0, 618, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 0, 0, 0, 0, 0, 0, 0, 316, 471, + 491, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 0, 488, 518, 353, 508, 0, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 534, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 0, + 0, 664, 0, 501, 0, 0, 0, 0, 0, 0, + 469, 0, 0, 391, 0, 0, 0, 519, 0, 452, + 428, 698, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 0, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 352, 424, 629, 662, 663, 554, 0, + 617, 555, 564, 344, 589, 601, 600, 420, 514, 0, + 612, 615, 544, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 497, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 523, 605, 606, 414, 415, 416, 417, 372, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 214, 2328, 0, 240, 0, 0, 0, 0, - 0, 0, 328, 241, 546, 666, 548, 547, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, + 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 0, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 254, 255, + 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, + 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, + 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 0, 0, 0, 302, 679, 680, 681, 682, 683, 0, + 0, 303, 304, 305, 0, 0, 295, 470, 296, 297, + 298, 299, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 669, 672, 467, 468, 678, 0, 674, 675, + 676, 673, 399, 454, 475, 461, 0, 695, 550, 551, + 696, 661, 179, 218, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 426, 0, 0, 565, 599, 588, 671, + 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 359, 0, 0, 394, 603, 584, 595, 585, 570, + 571, 572, 579, 371, 573, 574, 575, 545, 576, 546, + 577, 578, 149, 602, 552, 463, 410, 0, 619, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 214, 2329, 0, 240, + 0, 0, 0, 0, 0, 0, 328, 241, 547, 667, + 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 463, 493, 0, - 506, 0, 383, 384, 0, 0, 0, 0, 0, 0, - 0, 316, 470, 490, 329, 457, 504, 334, 465, 482, - 324, 424, 454, 0, 0, 318, 488, 464, 406, 317, - 0, 448, 357, 373, 354, 422, 0, 487, 517, 353, - 507, 0, 498, 320, 0, 497, 421, 484, 489, 407, - 400, 0, 319, 486, 405, 399, 387, 363, 533, 388, - 389, 378, 436, 397, 437, 379, 411, 410, 412, 0, - 0, 0, 0, 0, 528, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 659, 0, 0, 663, 0, 500, 0, 0, 0, - 0, 0, 0, 468, 0, 0, 390, 0, 0, 0, - 518, 0, 451, 427, 697, 0, 0, 449, 395, 485, - 438, 491, 471, 499, 443, 439, 310, 472, 356, 408, - 325, 327, 687, 358, 360, 364, 365, 417, 418, 432, - 456, 475, 476, 477, 355, 339, 450, 340, 375, 341, - 311, 347, 345, 348, 458, 349, 313, 433, 481, 0, - 370, 446, 403, 314, 402, 434, 480, 479, 326, 508, - 515, 516, 606, 0, 521, 698, 699, 700, 530, 0, - 440, 322, 321, 0, 0, 0, 351, 435, 335, 337, - 338, 336, 430, 431, 535, 536, 537, 539, 0, 540, - 541, 0, 0, 0, 0, 542, 607, 623, 591, 560, - 523, 615, 557, 561, 562, 381, 626, 0, 0, 0, - 514, 391, 392, 0, 362, 361, 404, 315, 0, 0, - 368, 306, 307, 693, 352, 423, 628, 661, 662, 553, - 0, 616, 554, 563, 344, 588, 600, 599, 419, 513, - 0, 611, 614, 543, 692, 0, 608, 622, 696, 621, - 689, 429, 0, 455, 619, 566, 0, 612, 585, 586, - 0, 613, 581, 617, 0, 555, 0, 524, 527, 556, - 641, 642, 643, 312, 526, 645, 646, 647, 648, 649, - 650, 651, 644, 496, 589, 565, 592, 505, 568, 567, - 0, 0, 603, 522, 604, 605, 413, 414, 415, 416, - 372, 629, 333, 525, 442, 0, 590, 0, 0, 0, - 0, 0, 0, 0, 0, 595, 596, 593, 701, 0, - 652, 653, 0, 0, 519, 520, 367, 374, 538, 376, - 332, 428, 369, 503, 385, 0, 531, 597, 532, 444, - 445, 655, 658, 656, 657, 420, 380, 382, 459, 386, - 396, 447, 502, 426, 452, 330, 492, 461, 401, 582, - 610, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 637, 636, - 635, 634, 633, 632, 631, 630, 0, 0, 579, 478, - 346, 300, 342, 343, 350, 690, 686, 483, 691, 0, - 308, 559, 394, 441, 366, 624, 625, 0, 676, 254, - 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, - 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, - 276, 277, 278, 627, 269, 270, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 0, 0, 0, 0, 302, 678, 679, 680, 681, 682, - 0, 0, 303, 304, 305, 0, 0, 295, 469, 296, - 297, 298, 299, 0, 0, 509, 510, 511, 534, 0, - 512, 494, 558, 377, 309, 473, 501, 688, 0, 0, - 0, 0, 0, 0, 0, 609, 620, 654, 0, 664, - 665, 667, 669, 668, 671, 466, 467, 677, 0, 673, - 674, 675, 672, 398, 453, 474, 460, 0, 694, 549, - 550, 695, 660, 425, 0, 0, 564, 598, 587, 670, - 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 359, 1112, 0, 393, 602, 583, 594, 584, 569, - 570, 571, 578, 371, 572, 573, 574, 544, 575, 545, - 576, 577, 0, 601, 551, 462, 409, 0, 618, 0, + 0, 464, 494, 0, 507, 0, 384, 385, 0, 0, + 0, 0, 0, 0, 0, 316, 471, 491, 329, 458, + 505, 334, 466, 483, 324, 425, 455, 0, 0, 318, + 489, 465, 407, 317, 0, 449, 357, 373, 354, 423, + 0, 488, 518, 353, 508, 0, 499, 320, 0, 498, + 422, 485, 490, 408, 401, 0, 319, 487, 406, 400, + 388, 363, 534, 389, 390, 378, 437, 398, 438, 379, + 412, 411, 413, 0, 0, 0, 0, 0, 529, 530, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 660, 0, 0, 664, 0, + 501, 0, 0, 0, 0, 0, 0, 469, 0, 0, + 391, 0, 0, 0, 519, 0, 452, 428, 698, 0, + 0, 450, 396, 486, 439, 492, 472, 500, 444, 440, + 310, 473, 356, 409, 325, 327, 688, 358, 360, 364, + 365, 418, 419, 433, 457, 476, 477, 478, 355, 339, + 451, 340, 375, 341, 311, 347, 345, 348, 459, 349, + 313, 434, 482, 0, 370, 447, 404, 314, 403, 435, + 481, 480, 326, 509, 516, 517, 607, 0, 522, 699, + 700, 701, 531, 0, 441, 322, 321, 0, 0, 0, + 351, 436, 335, 337, 338, 336, 431, 432, 536, 537, + 538, 540, 0, 541, 542, 0, 0, 0, 0, 543, + 608, 624, 592, 561, 524, 616, 558, 562, 563, 381, + 627, 0, 0, 0, 515, 392, 393, 0, 362, 361, + 405, 315, 0, 0, 0, 382, 368, 306, 307, 694, + 352, 424, 629, 662, 663, 554, 0, 617, 555, 564, + 344, 589, 601, 600, 420, 514, 0, 612, 615, 544, + 693, 0, 609, 623, 697, 622, 690, 430, 0, 456, + 620, 567, 0, 613, 586, 587, 0, 614, 582, 618, + 0, 556, 0, 525, 528, 557, 642, 643, 644, 312, + 527, 646, 647, 648, 649, 650, 651, 652, 645, 497, + 590, 566, 593, 506, 569, 568, 0, 0, 604, 523, + 605, 606, 414, 415, 416, 417, 372, 630, 333, 526, + 443, 0, 591, 0, 0, 0, 0, 0, 0, 0, + 0, 596, 597, 594, 702, 0, 653, 654, 0, 0, + 520, 521, 367, 374, 539, 376, 332, 429, 369, 504, + 386, 0, 532, 598, 533, 445, 446, 656, 659, 657, + 658, 421, 380, 383, 460, 387, 397, 448, 503, 427, + 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, - 1119, 1120, 0, 0, 0, 0, 328, 241, 546, 666, - 548, 547, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1123, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 463, 493, 0, 506, 0, 383, 384, 0, 0, - 0, 0, 0, 0, 0, 316, 470, 1106, 329, 457, - 504, 334, 465, 482, 324, 424, 454, 0, 0, 318, - 488, 464, 406, 317, 0, 448, 357, 373, 354, 422, - 0, 487, 517, 353, 507, 1092, 498, 320, 1091, 497, - 421, 484, 489, 407, 400, 0, 319, 486, 405, 399, - 387, 363, 533, 388, 389, 378, 436, 397, 437, 379, - 411, 410, 412, 0, 0, 0, 0, 0, 528, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 659, 0, 0, 663, 0, - 500, 0, 0, 0, 0, 0, 0, 468, 0, 0, - 390, 0, 0, 0, 518, 0, 451, 427, 697, 0, - 0, 449, 395, 485, 438, 491, 471, 499, 1110, 439, - 310, 472, 356, 408, 325, 327, 687, 358, 360, 364, - 365, 417, 418, 432, 456, 475, 476, 477, 355, 339, - 450, 340, 375, 341, 311, 347, 345, 348, 458, 349, - 313, 433, 481, 0, 370, 446, 403, 314, 402, 434, - 480, 479, 326, 508, 515, 516, 606, 0, 521, 698, - 699, 700, 530, 0, 440, 322, 321, 0, 0, 0, - 351, 435, 335, 337, 338, 336, 430, 431, 535, 536, - 537, 539, 0, 540, 541, 0, 0, 0, 0, 542, - 607, 623, 591, 560, 523, 615, 557, 561, 562, 381, - 626, 0, 0, 0, 514, 391, 392, 0, 362, 361, - 404, 315, 0, 0, 368, 306, 307, 693, 352, 423, - 628, 661, 662, 553, 0, 616, 554, 563, 344, 588, - 600, 599, 419, 513, 0, 611, 614, 543, 692, 0, - 608, 622, 696, 621, 689, 429, 0, 455, 619, 566, - 0, 612, 585, 586, 0, 613, 581, 617, 0, 555, - 0, 524, 527, 556, 641, 642, 643, 312, 526, 645, - 646, 647, 648, 649, 650, 1111, 644, 496, 589, 565, - 592, 505, 568, 567, 0, 0, 603, 1114, 604, 605, - 413, 414, 415, 416, 372, 629, 1109, 525, 442, 0, - 590, 0, 0, 0, 0, 0, 0, 0, 0, 595, - 596, 593, 701, 0, 652, 653, 0, 0, 519, 520, - 367, 374, 538, 376, 332, 428, 369, 503, 385, 0, - 531, 597, 532, 444, 445, 655, 658, 656, 657, 1121, - 1107, 1117, 1108, 386, 396, 447, 502, 426, 452, 330, - 492, 461, 1118, 582, 610, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, + 0, 0, 0, 0, 638, 637, 636, 635, 634, 633, + 632, 631, 0, 0, 580, 479, 346, 300, 342, 343, + 350, 691, 687, 484, 692, 0, 308, 560, 395, 442, + 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, + 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, + 268, 271, 272, 273, 274, 275, 276, 277, 278, 628, + 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 0, 0, 0, + 302, 679, 680, 681, 682, 683, 0, 0, 303, 304, + 305, 0, 0, 295, 470, 296, 297, 298, 299, 0, + 0, 510, 511, 512, 535, 0, 513, 495, 559, 377, + 309, 474, 502, 689, 0, 0, 0, 0, 0, 0, + 0, 610, 621, 655, 0, 665, 666, 668, 670, 669, + 672, 467, 468, 678, 0, 674, 675, 676, 673, 399, + 454, 475, 461, 0, 695, 550, 551, 696, 661, 426, + 0, 0, 565, 599, 588, 671, 553, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 359, 1113, 0, + 394, 603, 584, 595, 585, 570, 571, 572, 579, 371, + 573, 574, 575, 545, 576, 546, 577, 578, 0, 602, + 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 1120, 1121, 0, 0, + 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1124, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 464, 494, 0, + 507, 0, 384, 385, 0, 0, 0, 0, 0, 0, + 0, 316, 471, 1107, 329, 458, 505, 334, 466, 483, + 324, 425, 455, 0, 0, 318, 489, 465, 407, 317, + 0, 449, 357, 373, 354, 423, 0, 488, 518, 353, + 508, 1093, 499, 320, 1092, 498, 422, 485, 490, 408, + 401, 0, 319, 487, 406, 400, 388, 363, 534, 389, + 390, 378, 437, 398, 438, 379, 412, 411, 413, 0, + 0, 0, 0, 0, 529, 530, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 660, 0, 0, 664, 0, 501, 0, 0, 0, + 0, 0, 0, 469, 0, 0, 391, 0, 0, 0, + 519, 0, 452, 428, 698, 0, 0, 450, 396, 486, + 439, 492, 472, 500, 1111, 440, 310, 473, 356, 409, + 325, 327, 688, 358, 360, 364, 365, 418, 419, 433, + 457, 476, 477, 478, 355, 339, 451, 340, 375, 341, + 311, 347, 345, 348, 459, 349, 313, 434, 482, 0, + 370, 447, 404, 314, 403, 435, 481, 480, 326, 509, + 516, 517, 607, 0, 522, 699, 700, 701, 531, 0, + 441, 322, 321, 0, 0, 0, 351, 436, 335, 337, + 338, 336, 431, 432, 536, 537, 538, 540, 0, 541, + 542, 0, 0, 0, 0, 543, 608, 624, 592, 561, + 524, 616, 558, 562, 563, 381, 627, 0, 0, 0, + 515, 392, 393, 0, 362, 361, 405, 315, 0, 0, + 0, 382, 368, 306, 307, 694, 352, 424, 629, 662, + 663, 554, 0, 617, 555, 564, 344, 589, 601, 600, + 420, 514, 0, 612, 615, 544, 693, 0, 609, 623, + 697, 622, 690, 430, 0, 456, 620, 567, 0, 613, + 586, 587, 0, 614, 582, 618, 0, 556, 0, 525, + 528, 557, 642, 643, 644, 312, 527, 646, 647, 648, + 649, 650, 651, 1112, 645, 497, 590, 566, 593, 506, + 569, 568, 0, 0, 604, 1115, 605, 606, 414, 415, + 416, 417, 372, 630, 1110, 526, 443, 0, 591, 0, + 0, 0, 0, 0, 0, 0, 0, 596, 597, 594, + 702, 0, 653, 654, 0, 0, 520, 521, 367, 374, + 539, 376, 332, 429, 369, 504, 386, 0, 532, 598, + 533, 445, 446, 656, 659, 657, 658, 1122, 1108, 1118, + 1109, 387, 397, 448, 503, 427, 453, 330, 493, 462, + 1119, 583, 611, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 637, 636, 635, 634, 633, 632, 631, 630, - 0, 0, 579, 478, 346, 300, 342, 343, 350, 690, - 686, 483, 691, 0, 308, 559, 394, 441, 366, 624, - 625, 0, 676, 254, 255, 256, 257, 258, 259, 260, - 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, - 272, 273, 274, 275, 276, 277, 278, 627, 269, 270, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 0, 0, 0, 0, 302, 678, - 679, 680, 681, 682, 0, 0, 303, 304, 305, 0, - 0, 295, 469, 296, 297, 298, 299, 0, 0, 509, - 510, 511, 534, 0, 512, 494, 558, 377, 309, 473, - 501, 688, 0, 0, 0, 0, 0, 0, 0, 609, - 620, 654, 0, 664, 665, 667, 669, 668, 671, 466, - 467, 677, 0, 673, 674, 675, 672, 1105, 453, 474, - 460, 0, 694, 549, 550, 695, 660, 179, 218, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 425, 0, - 0, 564, 598, 587, 670, 552, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 359, 0, 0, 393, - 602, 583, 594, 584, 569, 570, 571, 578, 371, 572, - 573, 574, 544, 575, 545, 576, 577, 149, 601, 551, - 462, 409, 0, 618, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2217, 0, 0, 240, 0, 0, 0, 0, 0, - 0, 328, 241, 546, 666, 548, 547, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 638, 637, 636, 635, 634, 633, 632, 631, 0, 0, + 580, 479, 346, 300, 342, 343, 350, 691, 687, 484, + 692, 0, 308, 560, 395, 442, 366, 625, 626, 0, + 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, + 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, + 274, 275, 276, 277, 278, 628, 269, 270, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 0, 0, 0, 302, 679, 680, 681, + 682, 683, 0, 0, 303, 304, 305, 0, 0, 295, + 470, 296, 297, 298, 299, 0, 0, 510, 511, 512, + 535, 0, 513, 495, 559, 377, 309, 474, 502, 689, + 0, 0, 0, 0, 0, 0, 0, 610, 621, 655, + 0, 665, 666, 668, 670, 669, 672, 467, 468, 678, + 0, 674, 675, 676, 673, 1106, 454, 475, 461, 0, + 695, 550, 551, 696, 661, 179, 218, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 149, 602, 552, 463, 410, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2218, + 0, 0, 240, 0, 0, 0, 0, 0, 0, 328, + 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 463, 493, 0, 506, - 0, 383, 384, 0, 0, 0, 0, 0, 0, 0, - 316, 470, 490, 329, 457, 504, 334, 465, 482, 324, - 424, 454, 0, 0, 318, 488, 464, 406, 317, 0, - 448, 357, 373, 354, 422, 0, 487, 517, 353, 507, - 0, 498, 320, 0, 497, 421, 484, 489, 407, 400, - 0, 319, 486, 405, 399, 387, 363, 533, 388, 389, - 378, 436, 397, 437, 379, 411, 410, 412, 0, 0, - 0, 0, 0, 528, 529, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 659, 0, 0, 663, 0, 500, 0, 0, 0, 0, - 0, 0, 468, 0, 0, 390, 0, 0, 0, 518, - 0, 451, 427, 697, 0, 0, 449, 395, 485, 438, - 491, 471, 499, 443, 439, 310, 472, 356, 408, 325, - 327, 687, 358, 360, 364, 365, 417, 418, 432, 456, - 475, 476, 477, 355, 339, 450, 340, 375, 341, 311, - 347, 345, 348, 458, 349, 313, 433, 481, 0, 370, - 446, 403, 314, 402, 434, 480, 479, 326, 508, 515, - 516, 606, 0, 521, 698, 699, 700, 530, 0, 440, - 322, 321, 0, 0, 0, 351, 435, 335, 337, 338, - 336, 430, 431, 535, 536, 537, 539, 0, 540, 541, - 0, 0, 0, 0, 542, 607, 623, 591, 560, 523, - 615, 557, 561, 562, 381, 626, 0, 0, 0, 514, - 391, 392, 0, 362, 361, 404, 315, 0, 0, 368, - 306, 307, 693, 352, 423, 628, 661, 662, 553, 0, - 616, 554, 563, 344, 588, 600, 599, 419, 513, 0, - 611, 614, 543, 692, 0, 608, 622, 696, 621, 689, - 429, 0, 455, 619, 566, 0, 612, 585, 586, 0, - 613, 581, 617, 0, 555, 0, 524, 527, 556, 641, - 642, 643, 312, 526, 645, 646, 647, 648, 649, 650, - 651, 644, 496, 589, 565, 592, 505, 568, 567, 0, - 0, 603, 522, 604, 605, 413, 414, 415, 416, 372, - 629, 333, 525, 442, 0, 590, 0, 0, 0, 0, - 0, 0, 0, 0, 595, 596, 593, 701, 0, 652, - 653, 0, 0, 519, 520, 367, 374, 538, 376, 332, - 428, 369, 503, 385, 0, 531, 597, 532, 444, 445, - 655, 658, 656, 657, 420, 380, 382, 459, 386, 396, - 447, 502, 426, 452, 330, 492, 461, 401, 582, 610, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 0, 0, 0, 0, 0, 0, 0, 316, 471, + 491, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 0, 488, 518, 353, 508, 0, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 534, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 0, + 0, 664, 0, 501, 0, 0, 0, 0, 0, 0, + 469, 0, 0, 391, 0, 0, 0, 519, 0, 452, + 428, 698, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 0, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 352, 424, 629, 662, 663, 554, 0, + 617, 555, 564, 344, 589, 601, 600, 420, 514, 0, + 612, 615, 544, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 497, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 523, 605, 606, 414, 415, 416, 417, 372, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 636, 635, - 634, 633, 632, 631, 630, 0, 0, 579, 478, 346, - 300, 342, 343, 350, 690, 686, 483, 691, 0, 308, - 559, 394, 441, 366, 624, 625, 0, 676, 254, 255, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 0, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, - 277, 278, 627, 269, 270, 279, 280, 281, 282, 283, + 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, - 0, 0, 0, 302, 678, 679, 680, 681, 682, 0, - 0, 303, 304, 305, 0, 0, 295, 469, 296, 297, - 298, 299, 0, 0, 509, 510, 511, 534, 0, 512, - 494, 558, 377, 309, 473, 501, 688, 0, 0, 0, - 0, 0, 0, 0, 609, 620, 654, 0, 664, 665, - 667, 669, 668, 671, 466, 467, 677, 0, 673, 674, - 675, 672, 398, 453, 474, 460, 0, 694, 549, 550, - 695, 660, 425, 0, 0, 564, 598, 587, 670, 552, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 359, 0, 0, 393, 602, 583, 594, 584, 569, 570, - 571, 578, 371, 572, 573, 574, 544, 575, 545, 576, - 577, 0, 601, 551, 462, 409, 0, 618, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 240, 1119, - 1120, 0, 0, 0, 0, 328, 241, 546, 666, 548, - 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 463, 493, 0, 506, 0, 383, 384, 0, 0, 0, - 0, 0, 0, 0, 316, 470, 490, 329, 457, 504, - 334, 465, 482, 324, 424, 454, 0, 0, 318, 488, - 464, 406, 317, 0, 448, 357, 373, 354, 422, 0, - 487, 517, 353, 507, 1092, 498, 320, 1091, 497, 421, - 484, 489, 407, 400, 0, 319, 486, 405, 399, 387, - 363, 533, 388, 389, 378, 436, 397, 437, 379, 411, - 410, 412, 0, 0, 0, 0, 0, 528, 529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 659, 0, 0, 663, 0, 500, - 0, 0, 0, 0, 0, 0, 468, 0, 0, 390, - 0, 0, 0, 518, 0, 451, 427, 697, 0, 0, - 449, 395, 485, 438, 491, 471, 499, 443, 439, 310, - 472, 356, 408, 325, 327, 687, 358, 360, 364, 365, - 417, 418, 432, 456, 475, 476, 477, 355, 339, 450, - 340, 375, 341, 311, 347, 345, 348, 458, 349, 313, - 433, 481, 0, 370, 446, 403, 314, 402, 434, 480, - 479, 326, 508, 515, 516, 606, 0, 521, 698, 699, - 700, 530, 0, 440, 322, 321, 0, 0, 0, 351, - 435, 335, 337, 338, 336, 430, 431, 535, 536, 537, - 539, 0, 540, 541, 0, 0, 0, 0, 542, 607, - 623, 591, 560, 523, 615, 557, 561, 562, 381, 626, - 0, 0, 0, 514, 391, 392, 0, 362, 361, 404, - 315, 0, 0, 368, 306, 307, 693, 352, 423, 628, - 661, 662, 553, 0, 616, 554, 563, 344, 588, 600, - 599, 419, 513, 0, 611, 614, 543, 692, 0, 608, - 622, 696, 621, 689, 429, 0, 455, 619, 566, 0, - 612, 585, 586, 0, 613, 581, 617, 0, 555, 0, - 524, 527, 556, 641, 642, 643, 312, 526, 645, 646, - 647, 648, 649, 650, 651, 644, 496, 589, 565, 592, - 505, 568, 567, 0, 0, 603, 522, 604, 605, 413, - 414, 415, 416, 372, 629, 333, 525, 442, 0, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 595, 596, - 593, 701, 0, 652, 653, 0, 0, 519, 520, 367, - 374, 538, 376, 332, 428, 369, 503, 385, 0, 531, - 597, 532, 444, 445, 655, 658, 656, 657, 1121, 2238, - 1117, 2239, 386, 396, 447, 502, 426, 452, 330, 492, - 461, 1118, 582, 610, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, + 0, 0, 0, 302, 679, 680, 681, 682, 683, 0, + 0, 303, 304, 305, 0, 0, 295, 470, 296, 297, + 298, 299, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 669, 672, 467, 468, 678, 0, 674, 675, + 676, 673, 399, 454, 475, 461, 0, 695, 550, 551, + 696, 661, 426, 0, 0, 565, 599, 588, 671, 553, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 359, 0, 0, 394, 603, 584, 595, 585, 570, 571, + 572, 579, 371, 573, 574, 575, 545, 576, 546, 577, + 578, 0, 602, 552, 463, 410, 0, 619, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 240, 1120, + 1121, 0, 0, 0, 0, 328, 241, 547, 667, 549, + 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1124, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 464, 494, 0, 507, 0, 384, 385, 0, 0, 0, + 0, 0, 0, 0, 316, 471, 491, 329, 458, 505, + 334, 466, 483, 324, 425, 455, 0, 0, 318, 489, + 465, 407, 317, 0, 449, 357, 373, 354, 423, 0, + 488, 518, 353, 508, 1093, 499, 320, 1092, 498, 422, + 485, 490, 408, 401, 0, 319, 487, 406, 400, 388, + 363, 534, 389, 390, 378, 437, 398, 438, 379, 412, + 411, 413, 0, 0, 0, 0, 0, 529, 530, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 660, 0, 0, 664, 0, 501, + 0, 0, 0, 0, 0, 0, 469, 0, 0, 391, + 0, 0, 0, 519, 0, 452, 428, 698, 0, 0, + 450, 396, 486, 439, 492, 472, 500, 444, 440, 310, + 473, 356, 409, 325, 327, 688, 358, 360, 364, 365, + 418, 419, 433, 457, 476, 477, 478, 355, 339, 451, + 340, 375, 341, 311, 347, 345, 348, 459, 349, 313, + 434, 482, 0, 370, 447, 404, 314, 403, 435, 481, + 480, 326, 509, 516, 517, 607, 0, 522, 699, 700, + 701, 531, 0, 441, 322, 321, 0, 0, 0, 351, + 436, 335, 337, 338, 336, 431, 432, 536, 537, 538, + 540, 0, 541, 542, 0, 0, 0, 0, 543, 608, + 624, 592, 561, 524, 616, 558, 562, 563, 381, 627, + 0, 0, 0, 515, 392, 393, 0, 362, 361, 405, + 315, 0, 0, 0, 382, 368, 306, 307, 694, 352, + 424, 629, 662, 663, 554, 0, 617, 555, 564, 344, + 589, 601, 600, 420, 514, 0, 612, 615, 544, 693, + 0, 609, 623, 697, 622, 690, 430, 0, 456, 620, + 567, 0, 613, 586, 587, 0, 614, 582, 618, 0, + 556, 0, 525, 528, 557, 642, 643, 644, 312, 527, + 646, 647, 648, 649, 650, 651, 652, 645, 497, 590, + 566, 593, 506, 569, 568, 0, 0, 604, 523, 605, + 606, 414, 415, 416, 417, 372, 630, 333, 526, 443, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 597, 594, 702, 0, 653, 654, 0, 0, 520, + 521, 367, 374, 539, 376, 332, 429, 369, 504, 386, + 0, 532, 598, 533, 445, 446, 656, 659, 657, 658, + 1122, 2239, 1118, 2240, 387, 397, 448, 503, 427, 453, + 330, 493, 462, 1119, 583, 611, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 636, 635, 634, 633, 632, 631, 630, 0, - 0, 579, 478, 346, 300, 342, 343, 350, 690, 686, - 483, 691, 0, 308, 559, 394, 441, 366, 624, 625, - 0, 676, 254, 255, 256, 257, 258, 259, 260, 261, - 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, - 273, 274, 275, 276, 277, 278, 627, 269, 270, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 0, 0, 0, 0, 302, 678, 679, - 680, 681, 682, 0, 0, 303, 304, 305, 0, 0, - 295, 469, 296, 297, 298, 299, 0, 0, 509, 510, - 511, 534, 0, 512, 494, 558, 377, 309, 473, 501, - 688, 0, 0, 0, 0, 0, 0, 0, 609, 620, - 654, 0, 664, 665, 667, 669, 668, 671, 466, 467, - 677, 0, 673, 674, 675, 672, 398, 453, 474, 460, - 0, 694, 549, 550, 695, 660, 425, 0, 0, 564, - 598, 587, 670, 552, 0, 0, 3199, 0, 0, 0, - 0, 0, 0, 0, 359, 0, 0, 393, 602, 583, - 594, 584, 569, 570, 571, 578, 371, 572, 573, 574, - 544, 575, 545, 576, 577, 0, 601, 551, 462, 409, - 0, 618, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 637, 636, 635, 634, 633, 632, + 631, 0, 0, 580, 479, 346, 300, 342, 343, 350, + 691, 687, 484, 692, 0, 308, 560, 395, 442, 366, + 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, + 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, + 271, 272, 273, 274, 275, 276, 277, 278, 628, 269, + 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, + 679, 680, 681, 682, 683, 0, 0, 303, 304, 305, + 0, 0, 295, 470, 296, 297, 298, 299, 0, 0, + 510, 511, 512, 535, 0, 513, 495, 559, 377, 309, + 474, 502, 689, 0, 0, 0, 0, 0, 0, 0, + 610, 621, 655, 0, 665, 666, 668, 670, 669, 672, + 467, 468, 678, 0, 674, 675, 676, 673, 399, 454, + 475, 461, 0, 695, 550, 551, 696, 661, 426, 0, + 0, 565, 599, 588, 671, 553, 0, 0, 3200, 0, + 0, 0, 0, 0, 0, 0, 359, 0, 0, 394, + 603, 584, 595, 585, 570, 571, 572, 579, 371, 573, + 574, 575, 545, 576, 546, 577, 578, 0, 602, 552, + 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 0, 0, 0, 0, 328, - 241, 546, 666, 548, 547, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, + 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 464, 494, 0, 507, + 0, 384, 385, 0, 0, 0, 0, 0, 0, 0, + 316, 471, 491, 329, 458, 505, 334, 466, 483, 324, + 425, 455, 0, 0, 318, 489, 465, 407, 317, 0, + 449, 357, 373, 354, 423, 0, 488, 518, 353, 508, + 0, 499, 320, 0, 498, 422, 485, 490, 408, 401, + 0, 319, 487, 406, 400, 388, 363, 534, 389, 390, + 378, 437, 398, 438, 379, 412, 411, 413, 0, 0, + 0, 0, 0, 529, 530, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3203, 0, 0, 0, 0, 3202, + 660, 0, 0, 664, 0, 501, 0, 0, 0, 0, + 0, 0, 469, 0, 0, 391, 0, 0, 0, 519, + 0, 452, 428, 698, 0, 0, 450, 396, 486, 439, + 492, 472, 500, 444, 440, 310, 473, 356, 409, 325, + 327, 688, 358, 360, 364, 365, 418, 419, 433, 457, + 476, 477, 478, 355, 339, 451, 340, 375, 341, 311, + 347, 345, 348, 459, 349, 313, 434, 482, 0, 370, + 447, 404, 314, 403, 435, 481, 480, 326, 509, 516, + 517, 607, 0, 522, 699, 700, 701, 531, 0, 441, + 322, 321, 0, 0, 0, 351, 436, 335, 337, 338, + 336, 431, 432, 536, 537, 538, 540, 0, 541, 542, + 0, 0, 0, 0, 543, 608, 624, 592, 561, 524, + 616, 558, 562, 563, 381, 627, 0, 0, 0, 515, + 392, 393, 0, 362, 361, 405, 315, 0, 0, 0, + 382, 368, 306, 307, 694, 352, 424, 629, 662, 663, + 554, 0, 617, 555, 564, 344, 589, 601, 600, 420, + 514, 0, 612, 615, 544, 693, 0, 609, 623, 697, + 622, 690, 430, 0, 456, 620, 567, 0, 613, 586, + 587, 0, 614, 582, 618, 0, 556, 0, 525, 528, + 557, 642, 643, 644, 312, 527, 646, 647, 648, 649, + 650, 651, 652, 645, 497, 590, 566, 593, 506, 569, + 568, 0, 0, 604, 523, 605, 606, 414, 415, 416, + 417, 372, 630, 333, 526, 443, 0, 591, 0, 0, + 0, 0, 0, 0, 0, 0, 596, 597, 594, 702, + 0, 653, 654, 0, 0, 520, 521, 367, 374, 539, + 376, 332, 429, 369, 504, 386, 0, 532, 598, 533, + 445, 446, 656, 659, 657, 658, 421, 380, 383, 460, + 387, 397, 448, 503, 427, 453, 330, 493, 462, 402, + 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, + 637, 636, 635, 634, 633, 632, 631, 0, 0, 580, + 479, 346, 300, 342, 343, 350, 691, 687, 484, 692, + 0, 308, 560, 395, 442, 366, 625, 626, 0, 677, + 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, + 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, + 275, 276, 277, 278, 628, 269, 270, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 0, 0, 0, 302, 679, 680, 681, 682, + 683, 0, 0, 303, 304, 305, 0, 0, 295, 470, + 296, 297, 298, 299, 0, 0, 510, 511, 512, 535, + 0, 513, 495, 559, 377, 309, 474, 502, 689, 0, + 0, 0, 0, 0, 0, 0, 610, 621, 655, 0, + 665, 666, 668, 670, 669, 672, 467, 468, 678, 0, + 674, 675, 676, 673, 399, 454, 475, 461, 0, 695, + 550, 551, 696, 661, 426, 0, 0, 565, 599, 588, + 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 359, 1662, 0, 394, 603, 584, 595, 585, + 570, 571, 572, 579, 371, 573, 574, 575, 545, 576, + 546, 577, 578, 0, 602, 552, 463, 410, 0, 619, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 1660, 0, 0, 0, 328, 241, 547, + 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 463, 493, 0, 506, 0, 383, - 384, 0, 0, 0, 0, 0, 0, 0, 316, 470, - 490, 329, 457, 504, 334, 465, 482, 324, 424, 454, - 0, 0, 318, 488, 464, 406, 317, 0, 448, 357, - 373, 354, 422, 0, 487, 517, 353, 507, 0, 498, - 320, 0, 497, 421, 484, 489, 407, 400, 0, 319, - 486, 405, 399, 387, 363, 533, 388, 389, 378, 436, - 397, 437, 379, 411, 410, 412, 0, 0, 0, 0, - 0, 528, 529, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3202, 0, 0, 0, 0, 3201, 659, 0, - 0, 663, 0, 500, 0, 0, 0, 0, 0, 0, - 468, 0, 0, 390, 0, 0, 0, 518, 0, 451, - 427, 697, 0, 0, 449, 395, 485, 438, 491, 471, - 499, 443, 439, 310, 472, 356, 408, 325, 327, 687, - 358, 360, 364, 365, 417, 418, 432, 456, 475, 476, - 477, 355, 339, 450, 340, 375, 341, 311, 347, 345, - 348, 458, 349, 313, 433, 481, 0, 370, 446, 403, - 314, 402, 434, 480, 479, 326, 508, 515, 516, 606, - 0, 521, 698, 699, 700, 530, 0, 440, 322, 321, - 0, 0, 0, 351, 435, 335, 337, 338, 336, 430, - 431, 535, 536, 537, 539, 0, 540, 541, 0, 0, - 0, 0, 542, 607, 623, 591, 560, 523, 615, 557, - 561, 562, 381, 626, 0, 0, 0, 514, 391, 392, - 0, 362, 361, 404, 315, 0, 0, 368, 306, 307, - 693, 352, 423, 628, 661, 662, 553, 0, 616, 554, - 563, 344, 588, 600, 599, 419, 513, 0, 611, 614, - 543, 692, 0, 608, 622, 696, 621, 689, 429, 0, - 455, 619, 566, 0, 612, 585, 586, 0, 613, 581, - 617, 0, 555, 0, 524, 527, 556, 641, 642, 643, - 312, 526, 645, 646, 647, 648, 649, 650, 651, 644, - 496, 589, 565, 592, 505, 568, 567, 0, 0, 603, - 522, 604, 605, 413, 414, 415, 416, 372, 629, 333, - 525, 442, 0, 590, 0, 0, 0, 0, 0, 0, - 0, 0, 595, 596, 593, 701, 0, 652, 653, 0, - 0, 519, 520, 367, 374, 538, 376, 332, 428, 369, - 503, 385, 0, 531, 597, 532, 444, 445, 655, 658, - 656, 657, 420, 380, 382, 459, 386, 396, 447, 502, - 426, 452, 330, 492, 461, 401, 582, 610, 0, 0, + 0, 0, 464, 494, 0, 507, 0, 384, 385, 1658, + 0, 0, 0, 0, 0, 0, 316, 471, 491, 329, + 458, 505, 334, 466, 483, 324, 425, 455, 0, 0, + 318, 489, 465, 407, 317, 0, 449, 357, 373, 354, + 423, 0, 488, 518, 353, 508, 0, 499, 320, 0, + 498, 422, 485, 490, 408, 401, 0, 319, 487, 406, + 400, 388, 363, 534, 389, 390, 378, 437, 398, 438, + 379, 412, 411, 413, 0, 0, 0, 0, 0, 529, + 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 0, 0, 664, + 0, 501, 0, 0, 0, 0, 0, 0, 469, 0, + 0, 391, 0, 0, 0, 519, 0, 452, 428, 698, + 0, 0, 450, 396, 486, 439, 492, 472, 500, 444, + 440, 310, 473, 356, 409, 325, 327, 688, 358, 360, + 364, 365, 418, 419, 433, 457, 476, 477, 478, 355, + 339, 451, 340, 375, 341, 311, 347, 345, 348, 459, + 349, 313, 434, 482, 0, 370, 447, 404, 314, 403, + 435, 481, 480, 326, 509, 516, 517, 607, 0, 522, + 699, 700, 701, 531, 0, 441, 322, 321, 0, 0, + 0, 351, 436, 335, 337, 338, 336, 431, 432, 536, + 537, 538, 540, 0, 541, 542, 0, 0, 0, 0, + 543, 608, 624, 592, 561, 524, 616, 558, 562, 563, + 381, 627, 0, 0, 0, 515, 392, 393, 0, 362, + 361, 405, 315, 0, 0, 0, 382, 368, 306, 307, + 694, 352, 424, 629, 662, 663, 554, 0, 617, 555, + 564, 344, 589, 601, 600, 420, 514, 0, 612, 615, + 544, 693, 0, 609, 623, 697, 622, 690, 430, 0, + 456, 620, 567, 0, 613, 586, 587, 0, 614, 582, + 618, 0, 556, 0, 525, 528, 557, 642, 643, 644, + 312, 527, 646, 647, 648, 649, 650, 651, 652, 645, + 497, 590, 566, 593, 506, 569, 568, 0, 0, 604, + 523, 605, 606, 414, 415, 416, 417, 372, 630, 333, + 526, 443, 0, 591, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 597, 594, 702, 0, 653, 654, 0, + 0, 520, 521, 367, 374, 539, 376, 332, 429, 369, + 504, 386, 0, 532, 598, 533, 445, 446, 656, 659, + 657, 658, 421, 380, 383, 460, 387, 397, 448, 503, + 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 636, 635, 634, 633, - 632, 631, 630, 0, 0, 579, 478, 346, 300, 342, - 343, 350, 690, 686, 483, 691, 0, 308, 559, 394, - 441, 366, 624, 625, 0, 676, 254, 255, 256, 257, + 0, 0, 0, 0, 0, 638, 637, 636, 635, 634, + 633, 632, 631, 0, 0, 580, 479, 346, 300, 342, + 343, 350, 691, 687, 484, 692, 0, 308, 560, 395, + 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, 277, 278, - 627, 269, 270, 279, 280, 281, 282, 283, 284, 285, + 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, 0, 0, - 0, 302, 678, 679, 680, 681, 682, 0, 0, 303, - 304, 305, 0, 0, 295, 469, 296, 297, 298, 299, - 0, 0, 509, 510, 511, 534, 0, 512, 494, 558, - 377, 309, 473, 501, 688, 0, 0, 0, 0, 0, - 0, 0, 609, 620, 654, 0, 664, 665, 667, 669, - 668, 671, 466, 467, 677, 0, 673, 674, 675, 672, - 398, 453, 474, 460, 0, 694, 549, 550, 695, 660, - 425, 0, 0, 564, 598, 587, 670, 552, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 359, 1661, - 0, 393, 602, 583, 594, 584, 569, 570, 571, 578, - 371, 572, 573, 574, 544, 575, 545, 576, 577, 0, - 601, 551, 462, 409, 0, 618, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 1659, - 0, 0, 0, 328, 241, 546, 666, 548, 547, 0, + 0, 302, 679, 680, 681, 682, 683, 0, 0, 303, + 304, 305, 0, 0, 295, 470, 296, 297, 298, 299, + 0, 0, 510, 511, 512, 535, 0, 513, 495, 559, + 377, 309, 474, 502, 689, 0, 0, 0, 0, 0, + 0, 0, 610, 621, 655, 0, 665, 666, 668, 670, + 669, 672, 467, 468, 678, 0, 674, 675, 676, 673, + 399, 454, 475, 461, 0, 695, 550, 551, 696, 661, + 426, 0, 0, 565, 599, 588, 671, 553, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 359, 1656, + 0, 394, 603, 584, 595, 585, 570, 571, 572, 579, + 371, 573, 574, 575, 545, 576, 546, 577, 578, 0, + 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 1660, + 0, 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 463, 493, - 0, 506, 0, 383, 384, 1657, 0, 0, 0, 0, - 0, 0, 316, 470, 490, 329, 457, 504, 334, 465, - 482, 324, 424, 454, 0, 0, 318, 488, 464, 406, - 317, 0, 448, 357, 373, 354, 422, 0, 487, 517, - 353, 507, 0, 498, 320, 0, 497, 421, 484, 489, - 407, 400, 0, 319, 486, 405, 399, 387, 363, 533, - 388, 389, 378, 436, 397, 437, 379, 411, 410, 412, - 0, 0, 0, 0, 0, 528, 529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 659, 0, 0, 663, 0, 500, 0, 0, - 0, 0, 0, 0, 468, 0, 0, 390, 0, 0, - 0, 518, 0, 451, 427, 697, 0, 0, 449, 395, - 485, 438, 491, 471, 499, 443, 439, 310, 472, 356, - 408, 325, 327, 687, 358, 360, 364, 365, 417, 418, - 432, 456, 475, 476, 477, 355, 339, 450, 340, 375, - 341, 311, 347, 345, 348, 458, 349, 313, 433, 481, - 0, 370, 446, 403, 314, 402, 434, 480, 479, 326, - 508, 515, 516, 606, 0, 521, 698, 699, 700, 530, - 0, 440, 322, 321, 0, 0, 0, 351, 435, 335, - 337, 338, 336, 430, 431, 535, 536, 537, 539, 0, - 540, 541, 0, 0, 0, 0, 542, 607, 623, 591, - 560, 523, 615, 557, 561, 562, 381, 626, 0, 0, - 0, 514, 391, 392, 0, 362, 361, 404, 315, 0, - 0, 368, 306, 307, 693, 352, 423, 628, 661, 662, - 553, 0, 616, 554, 563, 344, 588, 600, 599, 419, - 513, 0, 611, 614, 543, 692, 0, 608, 622, 696, - 621, 689, 429, 0, 455, 619, 566, 0, 612, 585, - 586, 0, 613, 581, 617, 0, 555, 0, 524, 527, - 556, 641, 642, 643, 312, 526, 645, 646, 647, 648, - 649, 650, 651, 644, 496, 589, 565, 592, 505, 568, - 567, 0, 0, 603, 522, 604, 605, 413, 414, 415, - 416, 372, 629, 333, 525, 442, 0, 590, 0, 0, - 0, 0, 0, 0, 0, 0, 595, 596, 593, 701, - 0, 652, 653, 0, 0, 519, 520, 367, 374, 538, - 376, 332, 428, 369, 503, 385, 0, 531, 597, 532, - 444, 445, 655, 658, 656, 657, 420, 380, 382, 459, - 386, 396, 447, 502, 426, 452, 330, 492, 461, 401, - 582, 610, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 636, 635, 634, 633, 632, 631, 630, 0, 0, 579, - 478, 346, 300, 342, 343, 350, 690, 686, 483, 691, - 0, 308, 559, 394, 441, 366, 624, 625, 0, 676, - 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, - 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, - 275, 276, 277, 278, 627, 269, 270, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 0, 0, 0, 0, 302, 678, 679, 680, 681, - 682, 0, 0, 303, 304, 305, 0, 0, 295, 469, - 296, 297, 298, 299, 0, 0, 509, 510, 511, 534, - 0, 512, 494, 558, 377, 309, 473, 501, 688, 0, - 0, 0, 0, 0, 0, 0, 609, 620, 654, 0, - 664, 665, 667, 669, 668, 671, 466, 467, 677, 0, - 673, 674, 675, 672, 398, 453, 474, 460, 0, 694, - 549, 550, 695, 660, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 359, 1655, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 0, 601, 551, 462, 409, 0, 618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 1659, 0, 0, 0, 328, 241, 546, - 666, 548, 547, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 1657, - 0, 0, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 482, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 0, 487, 517, 353, 507, 0, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 533, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 0, 0, 663, - 0, 500, 0, 0, 0, 0, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 518, 0, 451, 427, 697, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 443, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 515, 516, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 352, - 423, 628, 661, 662, 553, 0, 616, 554, 563, 344, - 588, 600, 599, 419, 513, 0, 611, 614, 543, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 651, 644, 496, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 522, 604, - 605, 413, 414, 415, 416, 372, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 464, 494, + 0, 507, 0, 384, 385, 1658, 0, 0, 0, 0, + 0, 0, 316, 471, 491, 329, 458, 505, 334, 466, + 483, 324, 425, 455, 0, 0, 318, 489, 465, 407, + 317, 0, 449, 357, 373, 354, 423, 0, 488, 518, + 353, 508, 0, 499, 320, 0, 498, 422, 485, 490, + 408, 401, 0, 319, 487, 406, 400, 388, 363, 534, + 389, 390, 378, 437, 398, 438, 379, 412, 411, 413, + 0, 0, 0, 0, 0, 529, 530, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 0, 0, 664, 0, 501, 0, 0, + 0, 0, 0, 0, 469, 0, 0, 391, 0, 0, + 0, 519, 0, 452, 428, 698, 0, 0, 450, 396, + 486, 439, 492, 472, 500, 444, 440, 310, 473, 356, + 409, 325, 327, 688, 358, 360, 364, 365, 418, 419, + 433, 457, 476, 477, 478, 355, 339, 451, 340, 375, + 341, 311, 347, 345, 348, 459, 349, 313, 434, 482, + 0, 370, 447, 404, 314, 403, 435, 481, 480, 326, + 509, 516, 517, 607, 0, 522, 699, 700, 701, 531, + 0, 441, 322, 321, 0, 0, 0, 351, 436, 335, + 337, 338, 336, 431, 432, 536, 537, 538, 540, 0, + 541, 542, 0, 0, 0, 0, 543, 608, 624, 592, + 561, 524, 616, 558, 562, 563, 381, 627, 0, 0, + 0, 515, 392, 393, 0, 362, 361, 405, 315, 0, + 0, 0, 382, 368, 306, 307, 694, 352, 424, 629, + 662, 663, 554, 0, 617, 555, 564, 344, 589, 601, + 600, 420, 514, 0, 612, 615, 544, 693, 0, 609, + 623, 697, 622, 690, 430, 0, 456, 620, 567, 0, + 613, 586, 587, 0, 614, 582, 618, 0, 556, 0, + 525, 528, 557, 642, 643, 644, 312, 527, 646, 647, + 648, 649, 650, 651, 652, 645, 497, 590, 566, 593, + 506, 569, 568, 0, 0, 604, 523, 605, 606, 414, + 415, 416, 417, 372, 630, 333, 526, 443, 0, 591, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 597, + 594, 702, 0, 653, 654, 0, 0, 520, 521, 367, + 374, 539, 376, 332, 429, 369, 504, 386, 0, 532, + 598, 533, 445, 446, 656, 659, 657, 658, 421, 380, + 383, 460, 387, 397, 448, 503, 427, 453, 330, 493, + 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 0, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 254, 255, 256, 257, 258, 259, - 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, - 271, 272, 273, 274, 275, 276, 277, 278, 627, 269, - 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, - 678, 679, 680, 681, 682, 0, 0, 303, 304, 305, - 0, 0, 295, 469, 296, 297, 298, 299, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 668, 671, - 466, 467, 677, 0, 673, 674, 675, 672, 398, 453, - 474, 460, 0, 694, 549, 550, 695, 660, 425, 0, - 0, 564, 598, 587, 670, 552, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 359, 0, 0, 393, - 602, 583, 594, 584, 569, 570, 571, 578, 371, 572, - 573, 574, 544, 575, 545, 576, 577, 0, 601, 551, - 462, 409, 0, 618, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4452, 0, 240, 906, 0, 0, 0, 0, - 0, 328, 241, 546, 666, 548, 547, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 638, 637, 636, 635, 634, 633, 632, 631, 0, + 0, 580, 479, 346, 300, 342, 343, 350, 691, 687, + 484, 692, 0, 308, 560, 395, 442, 366, 625, 626, + 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, + 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, + 273, 274, 275, 276, 277, 278, 628, 269, 270, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 0, 0, 0, 302, 679, 680, + 681, 682, 683, 0, 0, 303, 304, 305, 0, 0, + 295, 470, 296, 297, 298, 299, 0, 0, 510, 511, + 512, 535, 0, 513, 495, 559, 377, 309, 474, 502, + 689, 0, 0, 0, 0, 0, 0, 0, 610, 621, + 655, 0, 665, 666, 668, 670, 669, 672, 467, 468, + 678, 0, 674, 675, 676, 673, 399, 454, 475, 461, + 0, 695, 550, 551, 696, 661, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 0, 602, 552, 463, 410, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4460, 0, 240, 907, 0, 0, 0, 0, 0, 328, + 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 463, 493, 0, 506, - 0, 383, 384, 0, 0, 0, 0, 0, 0, 0, - 316, 470, 490, 329, 457, 504, 334, 465, 482, 324, - 424, 454, 0, 0, 318, 488, 464, 406, 317, 0, - 448, 357, 373, 354, 422, 0, 487, 517, 353, 507, - 0, 498, 320, 0, 497, 421, 484, 489, 407, 400, - 0, 319, 486, 405, 399, 387, 363, 533, 388, 389, - 378, 436, 397, 437, 379, 411, 410, 412, 0, 0, - 0, 0, 0, 528, 529, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 659, 0, 0, 663, 0, 500, 0, 0, 0, 0, - 0, 0, 468, 0, 0, 390, 0, 0, 0, 518, - 0, 451, 427, 697, 0, 0, 449, 395, 485, 438, - 491, 471, 499, 443, 439, 310, 472, 356, 408, 325, - 327, 687, 358, 360, 364, 365, 417, 418, 432, 456, - 475, 476, 477, 355, 339, 450, 340, 375, 341, 311, - 347, 345, 348, 458, 349, 313, 433, 481, 0, 370, - 446, 403, 314, 402, 434, 480, 479, 326, 508, 515, - 516, 606, 0, 521, 698, 699, 700, 530, 0, 440, - 322, 321, 0, 0, 0, 351, 435, 335, 337, 338, - 336, 430, 431, 535, 536, 537, 539, 0, 540, 541, - 0, 0, 0, 0, 542, 607, 623, 591, 560, 523, - 615, 557, 561, 562, 381, 626, 0, 0, 0, 514, - 391, 392, 0, 362, 361, 404, 315, 0, 0, 368, - 306, 307, 693, 352, 423, 628, 661, 662, 553, 0, - 616, 554, 563, 344, 588, 600, 599, 419, 513, 0, - 611, 614, 543, 692, 0, 608, 622, 696, 621, 689, - 429, 0, 455, 619, 566, 0, 612, 585, 586, 0, - 613, 581, 617, 0, 555, 0, 524, 527, 556, 641, - 642, 643, 312, 526, 645, 646, 647, 648, 649, 650, - 651, 644, 496, 589, 565, 592, 505, 568, 567, 0, - 0, 603, 522, 604, 605, 413, 414, 415, 416, 372, - 629, 333, 525, 442, 0, 590, 0, 0, 0, 0, - 0, 0, 0, 0, 595, 596, 593, 701, 0, 652, - 653, 0, 0, 519, 520, 367, 374, 538, 376, 332, - 428, 369, 503, 385, 0, 531, 597, 532, 444, 445, - 655, 658, 656, 657, 420, 380, 382, 459, 386, 396, - 447, 502, 426, 452, 330, 492, 461, 401, 582, 610, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 0, 0, 0, 0, 0, 0, 0, 316, 471, + 491, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 0, 488, 518, 353, 508, 0, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 534, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 0, + 0, 664, 0, 501, 0, 0, 0, 0, 0, 0, + 469, 0, 0, 391, 0, 0, 0, 519, 0, 452, + 428, 698, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 0, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 352, 424, 629, 662, 663, 554, 0, + 617, 555, 564, 344, 589, 601, 600, 420, 514, 0, + 612, 615, 544, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 497, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 523, 605, 606, 414, 415, 416, 417, 372, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 636, 635, - 634, 633, 632, 631, 630, 0, 0, 579, 478, 346, - 300, 342, 343, 350, 690, 686, 483, 691, 0, 308, - 559, 394, 441, 366, 624, 625, 0, 676, 254, 255, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 0, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, - 277, 278, 627, 269, 270, 279, 280, 281, 282, 283, + 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, - 0, 0, 0, 302, 678, 679, 680, 681, 682, 0, - 0, 303, 304, 305, 0, 0, 295, 469, 296, 297, - 298, 299, 0, 0, 509, 510, 511, 534, 0, 512, - 494, 558, 377, 309, 473, 501, 688, 0, 0, 0, - 0, 0, 0, 0, 609, 620, 654, 0, 664, 665, - 667, 669, 668, 671, 466, 467, 677, 0, 673, 674, - 675, 672, 398, 453, 474, 460, 0, 694, 549, 550, - 695, 660, 425, 0, 0, 564, 598, 587, 670, 552, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 359, 0, 0, 393, 602, 583, 594, 584, 569, 570, - 571, 578, 371, 572, 573, 574, 544, 575, 545, 576, - 577, 0, 601, 551, 462, 409, 0, 618, 0, 0, + 0, 0, 0, 302, 679, 680, 681, 682, 683, 0, + 0, 303, 304, 305, 0, 0, 295, 470, 296, 297, + 298, 299, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 669, 672, 467, 468, 678, 0, 674, 675, + 676, 673, 399, 454, 475, 461, 0, 695, 550, 551, + 696, 661, 426, 0, 0, 565, 599, 588, 671, 553, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 359, 0, 0, 394, 603, 584, 595, 585, 570, 571, + 572, 579, 371, 573, 574, 575, 545, 576, 546, 577, + 578, 0, 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 1659, 0, 0, 0, 328, 241, 546, 666, 548, - 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1660, 0, 0, 0, 328, 241, 547, 667, 549, + 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 463, 493, 0, 506, 0, 383, 384, 1657, 0, 0, - 0, 0, 0, 0, 316, 470, 490, 329, 457, 504, - 334, 465, 482, 324, 424, 454, 0, 0, 318, 488, - 464, 406, 317, 0, 448, 357, 373, 354, 422, 0, - 487, 517, 353, 507, 0, 498, 320, 0, 497, 421, - 484, 489, 407, 400, 0, 319, 486, 405, 399, 387, - 363, 533, 388, 389, 378, 436, 397, 437, 379, 411, - 410, 412, 0, 0, 0, 0, 0, 528, 529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 659, 0, 0, 663, 0, 500, - 0, 0, 0, 0, 0, 0, 468, 0, 0, 390, - 0, 0, 0, 518, 0, 451, 427, 697, 0, 0, - 449, 395, 485, 438, 491, 471, 499, 443, 439, 310, - 472, 356, 408, 325, 327, 687, 358, 360, 364, 365, - 417, 418, 432, 456, 475, 476, 477, 355, 339, 450, - 340, 375, 341, 311, 347, 345, 348, 458, 349, 313, - 433, 481, 0, 370, 446, 403, 314, 402, 434, 480, - 479, 326, 508, 515, 516, 606, 0, 521, 698, 699, - 700, 530, 0, 440, 322, 321, 0, 0, 0, 351, - 435, 335, 337, 338, 336, 430, 431, 535, 536, 537, - 539, 0, 540, 541, 0, 0, 0, 0, 542, 607, - 623, 591, 560, 523, 615, 557, 561, 562, 381, 626, - 0, 0, 0, 514, 391, 392, 0, 362, 361, 404, - 315, 0, 0, 368, 306, 307, 693, 352, 423, 628, - 661, 662, 553, 0, 616, 554, 563, 344, 588, 600, - 599, 419, 513, 0, 611, 614, 543, 692, 0, 608, - 622, 696, 621, 689, 429, 0, 455, 619, 566, 0, - 612, 585, 586, 0, 613, 581, 617, 0, 555, 0, - 524, 527, 556, 641, 642, 643, 312, 526, 645, 646, - 647, 648, 649, 650, 651, 644, 496, 589, 565, 592, - 505, 568, 567, 0, 0, 603, 522, 604, 605, 413, - 414, 415, 416, 372, 629, 333, 525, 442, 0, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 595, 596, - 593, 701, 0, 652, 653, 0, 0, 519, 520, 367, - 374, 538, 376, 332, 428, 369, 503, 385, 0, 531, - 597, 532, 444, 445, 655, 658, 656, 657, 420, 380, - 382, 459, 386, 396, 447, 502, 426, 452, 330, 492, - 461, 401, 582, 610, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, + 464, 494, 0, 507, 0, 384, 385, 1658, 0, 0, + 0, 0, 0, 0, 316, 471, 491, 329, 458, 505, + 334, 466, 483, 324, 425, 455, 0, 0, 318, 489, + 465, 407, 317, 0, 449, 357, 373, 354, 423, 0, + 488, 518, 353, 508, 0, 499, 320, 0, 498, 422, + 485, 490, 408, 401, 0, 319, 487, 406, 400, 388, + 363, 534, 389, 390, 378, 437, 398, 438, 379, 412, + 411, 413, 0, 0, 0, 0, 0, 529, 530, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 660, 0, 0, 664, 0, 501, + 0, 0, 0, 0, 0, 0, 469, 0, 0, 391, + 0, 0, 0, 519, 0, 452, 428, 698, 0, 0, + 450, 396, 486, 439, 492, 472, 500, 444, 440, 310, + 473, 356, 409, 325, 327, 688, 358, 360, 364, 365, + 418, 419, 433, 457, 476, 477, 478, 355, 339, 451, + 340, 375, 341, 311, 347, 345, 348, 459, 349, 313, + 434, 482, 0, 370, 447, 404, 314, 403, 435, 481, + 480, 326, 509, 516, 517, 607, 0, 522, 699, 700, + 701, 531, 0, 441, 322, 321, 0, 0, 0, 351, + 436, 335, 337, 338, 336, 431, 432, 536, 537, 538, + 540, 0, 541, 542, 0, 0, 0, 0, 543, 608, + 624, 592, 561, 524, 616, 558, 562, 563, 381, 627, + 0, 0, 0, 515, 392, 393, 0, 362, 361, 405, + 315, 0, 0, 0, 382, 368, 306, 307, 694, 352, + 424, 629, 662, 663, 554, 0, 617, 555, 564, 344, + 589, 601, 600, 420, 514, 0, 612, 615, 544, 693, + 0, 609, 623, 697, 622, 690, 430, 0, 456, 620, + 567, 0, 613, 586, 587, 0, 614, 582, 618, 0, + 556, 0, 525, 528, 557, 642, 643, 644, 312, 527, + 646, 647, 648, 649, 650, 651, 652, 645, 497, 590, + 566, 593, 506, 569, 568, 0, 0, 604, 523, 605, + 606, 414, 415, 416, 417, 372, 630, 333, 526, 443, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 597, 594, 702, 0, 653, 654, 0, 0, 520, + 521, 367, 374, 539, 376, 332, 429, 369, 504, 386, + 0, 532, 598, 533, 445, 446, 656, 659, 657, 658, + 421, 380, 383, 460, 387, 397, 448, 503, 427, 453, + 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 636, 635, 634, 633, 632, 631, 630, 0, - 0, 579, 478, 346, 300, 342, 343, 350, 690, 686, - 483, 691, 0, 308, 559, 394, 441, 366, 624, 625, - 0, 676, 254, 255, 256, 257, 258, 259, 260, 261, - 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, - 273, 274, 275, 276, 277, 278, 627, 269, 270, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 0, 0, 0, 0, 302, 678, 679, - 680, 681, 682, 0, 0, 303, 304, 305, 0, 0, - 295, 469, 296, 297, 298, 299, 0, 0, 509, 510, - 511, 534, 0, 512, 494, 558, 377, 309, 473, 501, - 688, 0, 0, 0, 0, 0, 0, 0, 609, 620, - 654, 0, 664, 665, 667, 669, 668, 671, 466, 467, - 677, 0, 673, 674, 675, 672, 398, 453, 474, 460, - 0, 694, 549, 550, 695, 660, 425, 0, 0, 564, - 598, 587, 670, 552, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 359, 0, 0, 393, 602, 583, - 594, 584, 569, 570, 571, 578, 371, 572, 573, 574, - 544, 575, 545, 576, 577, 0, 601, 551, 462, 409, - 0, 618, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 1659, 0, 0, 0, 328, - 241, 546, 666, 548, 547, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 637, 636, 635, 634, 633, 632, + 631, 0, 0, 580, 479, 346, 300, 342, 343, 350, + 691, 687, 484, 692, 0, 308, 560, 395, 442, 366, + 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, + 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, + 271, 272, 273, 274, 275, 276, 277, 278, 628, 269, + 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, + 679, 680, 681, 682, 683, 0, 0, 303, 304, 305, + 0, 0, 295, 470, 296, 297, 298, 299, 0, 0, + 510, 511, 512, 535, 0, 513, 495, 559, 377, 309, + 474, 502, 689, 0, 0, 0, 0, 0, 0, 0, + 610, 621, 655, 0, 665, 666, 668, 670, 669, 672, + 467, 468, 678, 0, 674, 675, 676, 673, 399, 454, + 475, 461, 0, 695, 550, 551, 696, 661, 426, 0, + 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 359, 0, 0, 394, + 603, 584, 595, 585, 570, 571, 572, 579, 371, 573, + 574, 575, 545, 576, 546, 577, 578, 0, 602, 552, + 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 1660, 0, 0, + 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 463, 493, 0, 506, 0, 383, - 384, 1873, 0, 0, 0, 0, 0, 0, 316, 470, - 490, 329, 457, 504, 334, 465, 482, 324, 424, 454, - 0, 0, 318, 488, 464, 406, 317, 0, 448, 357, - 373, 354, 422, 0, 487, 517, 353, 507, 0, 498, - 320, 0, 497, 421, 484, 489, 407, 400, 0, 319, - 486, 405, 399, 387, 363, 533, 388, 389, 378, 436, - 397, 437, 379, 411, 410, 412, 0, 0, 0, 0, - 0, 528, 529, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 659, 0, - 0, 663, 0, 500, 0, 0, 0, 0, 0, 0, - 468, 0, 0, 390, 0, 0, 0, 518, 0, 451, - 427, 697, 0, 0, 449, 395, 485, 438, 491, 471, - 499, 443, 439, 310, 472, 356, 408, 325, 327, 687, - 358, 360, 364, 365, 417, 418, 432, 456, 475, 476, - 477, 355, 339, 450, 340, 375, 341, 311, 347, 345, - 348, 458, 349, 313, 433, 481, 0, 370, 446, 403, - 314, 402, 434, 480, 479, 326, 508, 515, 516, 606, - 0, 521, 698, 699, 700, 530, 0, 440, 322, 321, - 0, 0, 0, 351, 435, 335, 337, 338, 336, 430, - 431, 535, 536, 537, 539, 0, 540, 541, 0, 0, - 0, 0, 542, 607, 623, 591, 560, 523, 615, 557, - 561, 562, 381, 626, 0, 0, 0, 514, 391, 392, - 0, 362, 361, 404, 315, 0, 0, 368, 306, 307, - 693, 352, 423, 628, 661, 662, 553, 0, 616, 554, - 563, 344, 588, 600, 599, 419, 513, 0, 611, 614, - 543, 692, 0, 608, 622, 696, 621, 689, 429, 0, - 455, 619, 566, 0, 612, 585, 586, 0, 613, 581, - 617, 0, 555, 0, 524, 527, 556, 641, 642, 643, - 312, 526, 645, 646, 647, 648, 649, 650, 651, 644, - 496, 589, 565, 592, 505, 568, 567, 0, 0, 603, - 522, 604, 605, 413, 414, 415, 416, 372, 629, 333, - 525, 442, 0, 590, 0, 0, 0, 0, 0, 0, - 0, 0, 595, 596, 593, 701, 0, 652, 653, 0, - 0, 519, 520, 367, 374, 538, 376, 332, 428, 369, - 503, 385, 0, 531, 597, 532, 444, 445, 655, 658, - 656, 657, 420, 380, 382, 459, 386, 396, 447, 502, - 426, 452, 330, 492, 461, 401, 582, 610, 0, 0, + 0, 0, 0, 0, 0, 0, 464, 494, 0, 507, + 0, 384, 385, 1874, 0, 0, 0, 0, 0, 0, + 316, 471, 491, 329, 458, 505, 334, 466, 483, 324, + 425, 455, 0, 0, 318, 489, 465, 407, 317, 0, + 449, 357, 373, 354, 423, 0, 488, 518, 353, 508, + 0, 499, 320, 0, 498, 422, 485, 490, 408, 401, + 0, 319, 487, 406, 400, 388, 363, 534, 389, 390, + 378, 437, 398, 438, 379, 412, 411, 413, 0, 0, + 0, 0, 0, 529, 530, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 660, 0, 0, 664, 0, 501, 0, 0, 0, 0, + 0, 0, 469, 0, 0, 391, 0, 0, 0, 519, + 0, 452, 428, 698, 0, 0, 450, 396, 486, 439, + 492, 472, 500, 444, 440, 310, 473, 356, 409, 325, + 327, 688, 358, 360, 364, 365, 418, 419, 433, 457, + 476, 477, 478, 355, 339, 451, 340, 375, 341, 311, + 347, 345, 348, 459, 349, 313, 434, 482, 0, 370, + 447, 404, 314, 403, 435, 481, 480, 326, 509, 516, + 517, 607, 0, 522, 699, 700, 701, 531, 0, 441, + 322, 321, 0, 0, 0, 351, 436, 335, 337, 338, + 336, 431, 432, 536, 537, 538, 540, 0, 541, 542, + 0, 0, 0, 0, 543, 608, 624, 592, 561, 524, + 616, 558, 562, 563, 381, 627, 0, 0, 0, 515, + 392, 393, 0, 362, 361, 405, 315, 0, 0, 0, + 382, 368, 306, 307, 694, 352, 424, 629, 662, 663, + 554, 0, 617, 555, 564, 344, 589, 601, 600, 420, + 514, 0, 612, 615, 544, 693, 0, 609, 623, 697, + 622, 690, 430, 0, 456, 620, 567, 0, 613, 586, + 587, 0, 614, 582, 618, 0, 556, 0, 525, 528, + 557, 642, 643, 644, 312, 527, 646, 647, 648, 649, + 650, 651, 652, 645, 497, 590, 566, 593, 506, 569, + 568, 0, 0, 604, 523, 605, 606, 414, 415, 416, + 417, 372, 630, 333, 526, 443, 0, 591, 0, 0, + 0, 0, 0, 0, 0, 0, 596, 597, 594, 702, + 0, 653, 654, 0, 0, 520, 521, 367, 374, 539, + 376, 332, 429, 369, 504, 386, 0, 532, 598, 533, + 445, 446, 656, 659, 657, 658, 421, 380, 383, 460, + 387, 397, 448, 503, 427, 453, 330, 493, 462, 402, + 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, + 637, 636, 635, 634, 633, 632, 631, 0, 0, 580, + 479, 346, 300, 342, 343, 350, 691, 687, 484, 692, + 0, 308, 560, 395, 442, 366, 625, 626, 0, 677, + 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, + 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, + 275, 276, 277, 278, 628, 269, 270, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 0, 0, 0, 302, 679, 680, 681, 682, + 683, 0, 0, 303, 304, 305, 0, 0, 295, 470, + 296, 297, 298, 299, 0, 0, 510, 511, 512, 535, + 0, 513, 495, 559, 377, 309, 474, 502, 689, 0, + 0, 0, 0, 0, 0, 0, 610, 621, 655, 0, + 665, 666, 668, 670, 669, 672, 467, 468, 678, 0, + 674, 675, 676, 673, 399, 454, 475, 461, 0, 695, + 550, 551, 696, 661, 426, 0, 0, 565, 599, 588, + 671, 553, 0, 0, 0, 0, 0, 2709, 0, 0, + 0, 0, 359, 0, 0, 394, 603, 584, 595, 585, + 570, 571, 572, 579, 371, 573, 574, 575, 545, 576, + 546, 577, 578, 0, 602, 552, 463, 410, 0, 619, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 2711, 0, 0, 0, 328, 241, 547, + 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 464, 494, 0, 507, 0, 384, 385, 0, + 0, 0, 0, 0, 0, 0, 316, 471, 491, 329, + 458, 505, 334, 466, 483, 324, 425, 455, 0, 0, + 318, 489, 465, 407, 317, 0, 449, 357, 373, 354, + 423, 0, 488, 518, 353, 508, 0, 499, 320, 0, + 498, 422, 485, 490, 408, 401, 0, 319, 487, 406, + 400, 388, 363, 534, 389, 390, 378, 437, 398, 438, + 379, 412, 411, 413, 0, 0, 0, 0, 0, 529, + 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 0, 0, 664, + 0, 501, 0, 0, 0, 0, 0, 0, 469, 0, + 0, 391, 0, 0, 0, 519, 0, 452, 428, 698, + 0, 0, 450, 396, 486, 439, 492, 472, 500, 444, + 440, 310, 473, 356, 409, 325, 327, 688, 358, 360, + 364, 365, 418, 419, 433, 457, 476, 477, 478, 355, + 339, 451, 340, 375, 341, 311, 347, 345, 348, 459, + 349, 313, 434, 482, 0, 370, 447, 404, 314, 403, + 435, 481, 480, 326, 509, 516, 517, 607, 0, 522, + 699, 700, 701, 531, 0, 441, 322, 321, 0, 0, + 0, 351, 436, 335, 337, 338, 336, 431, 432, 536, + 537, 538, 540, 0, 541, 542, 0, 0, 0, 0, + 543, 608, 624, 592, 561, 524, 616, 558, 562, 563, + 381, 627, 0, 0, 0, 515, 392, 393, 0, 362, + 361, 405, 315, 0, 0, 0, 382, 368, 306, 307, + 694, 352, 424, 629, 662, 663, 554, 0, 617, 555, + 564, 344, 589, 601, 600, 420, 514, 0, 612, 615, + 544, 693, 0, 609, 623, 697, 622, 690, 430, 0, + 456, 620, 567, 0, 613, 586, 587, 0, 614, 582, + 618, 0, 556, 0, 525, 528, 557, 642, 643, 644, + 312, 527, 646, 647, 648, 649, 650, 651, 652, 645, + 497, 590, 566, 593, 506, 569, 568, 0, 0, 604, + 523, 605, 606, 414, 415, 416, 417, 372, 630, 333, + 526, 443, 0, 591, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 597, 594, 702, 0, 653, 654, 0, + 0, 520, 521, 367, 374, 539, 376, 332, 429, 369, + 504, 386, 0, 532, 598, 533, 445, 446, 656, 659, + 657, 658, 421, 380, 383, 460, 387, 397, 448, 503, + 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 636, 635, 634, 633, - 632, 631, 630, 0, 0, 579, 478, 346, 300, 342, - 343, 350, 690, 686, 483, 691, 0, 308, 559, 394, - 441, 366, 624, 625, 0, 676, 254, 255, 256, 257, + 0, 0, 0, 0, 0, 638, 637, 636, 635, 634, + 633, 632, 631, 0, 0, 580, 479, 346, 300, 342, + 343, 350, 691, 687, 484, 692, 0, 308, 560, 395, + 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, 277, 278, - 627, 269, 270, 279, 280, 281, 282, 283, 284, 285, + 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, 0, 0, - 0, 302, 678, 679, 680, 681, 682, 0, 0, 303, - 304, 305, 0, 0, 295, 469, 296, 297, 298, 299, - 0, 0, 509, 510, 511, 534, 0, 512, 494, 558, - 377, 309, 473, 501, 688, 0, 0, 0, 0, 0, - 0, 0, 609, 620, 654, 0, 664, 665, 667, 669, - 668, 671, 466, 467, 677, 0, 673, 674, 675, 672, - 398, 453, 474, 460, 0, 694, 549, 550, 695, 660, - 425, 0, 0, 564, 598, 587, 670, 552, 0, 0, - 0, 0, 0, 2708, 0, 0, 0, 0, 359, 0, - 0, 393, 602, 583, 594, 584, 569, 570, 571, 578, - 371, 572, 573, 574, 544, 575, 545, 576, 577, 0, - 601, 551, 462, 409, 0, 618, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 2710, - 0, 0, 0, 328, 241, 546, 666, 548, 547, 0, + 0, 302, 679, 680, 681, 682, 683, 0, 0, 303, + 304, 305, 0, 0, 295, 470, 296, 297, 298, 299, + 0, 0, 510, 511, 512, 535, 0, 513, 495, 559, + 377, 309, 474, 502, 689, 0, 0, 0, 0, 0, + 0, 0, 610, 621, 655, 0, 665, 666, 668, 670, + 669, 672, 467, 468, 678, 0, 674, 675, 676, 673, + 399, 454, 475, 461, 0, 695, 550, 551, 696, 661, + 426, 0, 0, 565, 599, 588, 671, 553, 0, 0, + 0, 0, 0, 2289, 0, 0, 0, 0, 359, 0, + 0, 394, 603, 584, 595, 585, 570, 571, 572, 579, + 371, 573, 574, 575, 545, 576, 546, 577, 578, 0, + 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 2290, + 0, 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 463, 493, - 0, 506, 0, 383, 384, 0, 0, 0, 0, 0, - 0, 0, 316, 470, 490, 329, 457, 504, 334, 465, - 482, 324, 424, 454, 0, 0, 318, 488, 464, 406, - 317, 0, 448, 357, 373, 354, 422, 0, 487, 517, - 353, 507, 0, 498, 320, 0, 497, 421, 484, 489, - 407, 400, 0, 319, 486, 405, 399, 387, 363, 533, - 388, 389, 378, 436, 397, 437, 379, 411, 410, 412, - 0, 0, 0, 0, 0, 528, 529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 659, 0, 0, 663, 0, 500, 0, 0, - 0, 0, 0, 0, 468, 0, 0, 390, 0, 0, - 0, 518, 0, 451, 427, 697, 0, 0, 449, 395, - 485, 438, 491, 471, 499, 443, 439, 310, 472, 356, - 408, 325, 327, 687, 358, 360, 364, 365, 417, 418, - 432, 456, 475, 476, 477, 355, 339, 450, 340, 375, - 341, 311, 347, 345, 348, 458, 349, 313, 433, 481, - 0, 370, 446, 403, 314, 402, 434, 480, 479, 326, - 508, 515, 516, 606, 0, 521, 698, 699, 700, 530, - 0, 440, 322, 321, 0, 0, 0, 351, 435, 335, - 337, 338, 336, 430, 431, 535, 536, 537, 539, 0, - 540, 541, 0, 0, 0, 0, 542, 607, 623, 591, - 560, 523, 615, 557, 561, 562, 381, 626, 0, 0, - 0, 514, 391, 392, 0, 362, 361, 404, 315, 0, - 0, 368, 306, 307, 693, 352, 423, 628, 661, 662, - 553, 0, 616, 554, 563, 344, 588, 600, 599, 419, - 513, 0, 611, 614, 543, 692, 0, 608, 622, 696, - 621, 689, 429, 0, 455, 619, 566, 0, 612, 585, - 586, 0, 613, 581, 617, 0, 555, 0, 524, 527, - 556, 641, 642, 643, 312, 526, 645, 646, 647, 648, - 649, 650, 651, 644, 496, 589, 565, 592, 505, 568, - 567, 0, 0, 603, 522, 604, 605, 413, 414, 415, - 416, 372, 629, 333, 525, 442, 0, 590, 0, 0, - 0, 0, 0, 0, 0, 0, 595, 596, 593, 701, - 0, 652, 653, 0, 0, 519, 520, 367, 374, 538, - 376, 332, 428, 369, 503, 385, 0, 531, 597, 532, - 444, 445, 655, 658, 656, 657, 420, 380, 382, 459, - 386, 396, 447, 502, 426, 452, 330, 492, 461, 401, - 582, 610, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 636, 635, 634, 633, 632, 631, 630, 0, 0, 579, - 478, 346, 300, 342, 343, 350, 690, 686, 483, 691, - 0, 308, 559, 394, 441, 366, 624, 625, 0, 676, - 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, - 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, - 275, 276, 277, 278, 627, 269, 270, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 0, 0, 0, 0, 302, 678, 679, 680, 681, - 682, 0, 0, 303, 304, 305, 0, 0, 295, 469, - 296, 297, 298, 299, 0, 0, 509, 510, 511, 534, - 0, 512, 494, 558, 377, 309, 473, 501, 688, 0, - 0, 0, 0, 0, 0, 0, 609, 620, 654, 0, - 664, 665, 667, 669, 668, 671, 466, 467, 677, 0, - 673, 674, 675, 672, 398, 453, 474, 460, 0, 694, - 549, 550, 695, 660, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 0, 0, 0, 2288, 0, 0, - 0, 0, 359, 0, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 0, 601, 551, 462, 409, 0, 618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 2289, 0, 0, 0, 328, 241, 546, - 666, 548, 547, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 0, - 0, 0, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 482, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 0, 487, 517, 353, 507, 0, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 533, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 0, 0, 663, - 0, 500, 0, 0, 0, 0, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 518, 0, 451, 427, 697, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 443, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 515, 516, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 352, - 423, 628, 661, 662, 553, 0, 616, 554, 563, 344, - 588, 600, 599, 419, 513, 0, 611, 614, 543, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 651, 644, 496, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 522, 604, - 605, 413, 414, 415, 416, 372, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 464, 494, + 0, 507, 0, 384, 385, 0, 0, 0, 0, 0, + 0, 0, 316, 471, 491, 329, 458, 505, 334, 466, + 483, 324, 425, 455, 0, 0, 318, 489, 465, 407, + 317, 0, 449, 357, 373, 354, 423, 0, 488, 518, + 353, 508, 0, 499, 320, 0, 498, 422, 485, 490, + 408, 401, 0, 319, 487, 406, 400, 388, 363, 534, + 389, 390, 378, 437, 398, 438, 379, 412, 411, 413, + 0, 0, 0, 0, 0, 529, 530, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 0, 0, 664, 0, 501, 0, 0, + 0, 0, 0, 0, 469, 0, 0, 391, 0, 0, + 0, 519, 0, 452, 428, 698, 0, 0, 450, 396, + 486, 439, 492, 472, 500, 444, 440, 310, 473, 356, + 409, 325, 327, 688, 358, 360, 364, 365, 418, 419, + 433, 457, 476, 477, 478, 355, 339, 451, 340, 375, + 341, 311, 347, 345, 348, 459, 349, 313, 434, 482, + 0, 370, 447, 404, 314, 403, 435, 481, 480, 326, + 509, 516, 517, 607, 0, 522, 699, 700, 701, 531, + 0, 441, 322, 321, 0, 0, 0, 351, 436, 335, + 337, 338, 336, 431, 432, 536, 537, 538, 540, 0, + 541, 542, 0, 0, 0, 0, 543, 608, 624, 592, + 561, 524, 616, 558, 562, 563, 381, 627, 0, 0, + 0, 515, 392, 393, 0, 362, 361, 405, 315, 0, + 0, 0, 382, 368, 306, 307, 694, 352, 424, 629, + 662, 663, 554, 0, 617, 555, 564, 344, 589, 601, + 600, 420, 514, 0, 612, 615, 544, 693, 0, 609, + 623, 697, 622, 690, 430, 0, 456, 620, 567, 0, + 613, 586, 587, 0, 614, 582, 618, 0, 556, 0, + 525, 528, 557, 642, 643, 644, 312, 527, 646, 647, + 648, 649, 650, 651, 652, 645, 497, 590, 566, 593, + 506, 569, 568, 0, 0, 604, 523, 605, 606, 414, + 415, 416, 417, 372, 630, 333, 526, 443, 0, 591, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 597, + 594, 702, 0, 653, 654, 0, 0, 520, 521, 367, + 374, 539, 376, 332, 429, 369, 504, 386, 0, 532, + 598, 533, 445, 446, 656, 659, 657, 658, 421, 380, + 383, 460, 387, 397, 448, 503, 427, 453, 330, 493, + 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 0, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 254, 255, 256, 257, 258, 259, - 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, - 271, 272, 273, 274, 275, 276, 277, 278, 627, 269, - 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, - 678, 679, 680, 681, 682, 0, 0, 303, 304, 305, - 0, 0, 295, 469, 296, 297, 298, 299, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 668, 671, - 466, 467, 677, 0, 673, 674, 675, 672, 398, 453, - 474, 460, 0, 694, 549, 550, 695, 660, 425, 0, - 0, 564, 598, 587, 670, 552, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 359, 0, 0, 393, - 602, 583, 594, 584, 569, 570, 571, 578, 371, 572, - 573, 574, 544, 575, 545, 576, 577, 0, 601, 551, - 462, 409, 0, 618, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 3430, 3432, 0, - 0, 328, 241, 546, 666, 548, 547, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 638, 637, 636, 635, 634, 633, 632, 631, 0, + 0, 580, 479, 346, 300, 342, 343, 350, 691, 687, + 484, 692, 0, 308, 560, 395, 442, 366, 625, 626, + 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, + 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, + 273, 274, 275, 276, 277, 278, 628, 269, 270, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 0, 0, 0, 302, 679, 680, + 681, 682, 683, 0, 0, 303, 304, 305, 0, 0, + 295, 470, 296, 297, 298, 299, 0, 0, 510, 511, + 512, 535, 0, 513, 495, 559, 377, 309, 474, 502, + 689, 0, 0, 0, 0, 0, 0, 0, 610, 621, + 655, 0, 665, 666, 668, 670, 669, 672, 467, 468, + 678, 0, 674, 675, 676, 673, 399, 454, 475, 461, + 0, 695, 550, 551, 696, 661, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 0, 602, 552, 463, 410, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 3431, 3433, 0, 0, 328, + 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 463, 493, 0, 506, - 0, 383, 384, 0, 0, 0, 0, 0, 0, 0, - 316, 470, 490, 329, 457, 504, 334, 465, 482, 324, - 424, 454, 0, 0, 318, 488, 464, 406, 317, 0, - 448, 357, 373, 354, 422, 0, 487, 517, 353, 507, - 0, 498, 320, 0, 497, 421, 484, 489, 407, 400, - 0, 319, 486, 405, 399, 387, 363, 533, 388, 389, - 378, 436, 397, 437, 379, 411, 410, 412, 0, 0, - 0, 0, 0, 528, 529, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 659, 0, 0, 663, 0, 500, 0, 0, 0, 0, - 0, 0, 468, 0, 0, 390, 0, 0, 0, 518, - 0, 451, 427, 697, 0, 0, 449, 395, 485, 438, - 491, 471, 499, 443, 439, 310, 472, 356, 408, 325, - 327, 687, 358, 360, 364, 365, 417, 418, 432, 456, - 475, 476, 477, 355, 339, 450, 340, 375, 341, 311, - 347, 345, 348, 458, 349, 313, 433, 481, 0, 370, - 446, 403, 314, 402, 434, 480, 479, 326, 508, 515, - 516, 606, 0, 521, 698, 699, 700, 530, 0, 440, - 322, 321, 0, 0, 0, 351, 435, 335, 337, 338, - 336, 430, 431, 535, 536, 537, 539, 0, 540, 541, - 0, 0, 0, 0, 542, 607, 623, 591, 560, 523, - 615, 557, 561, 562, 381, 626, 0, 0, 0, 514, - 391, 392, 0, 362, 361, 404, 315, 0, 0, 368, - 306, 307, 693, 352, 423, 628, 661, 662, 553, 0, - 616, 554, 563, 344, 588, 600, 599, 419, 513, 0, - 611, 614, 543, 692, 0, 608, 622, 696, 621, 689, - 429, 0, 455, 619, 566, 0, 612, 585, 586, 0, - 613, 581, 617, 0, 555, 0, 524, 527, 556, 641, - 642, 643, 312, 526, 645, 646, 647, 648, 649, 650, - 651, 644, 496, 589, 565, 592, 505, 568, 567, 0, - 0, 603, 522, 604, 605, 413, 414, 415, 416, 372, - 629, 333, 525, 442, 0, 590, 0, 0, 0, 0, - 0, 0, 0, 0, 595, 596, 593, 701, 0, 652, - 653, 0, 0, 519, 520, 367, 374, 538, 376, 332, - 428, 369, 503, 385, 0, 531, 597, 532, 444, 445, - 655, 658, 656, 657, 420, 380, 382, 459, 386, 396, - 447, 502, 426, 452, 330, 492, 461, 401, 582, 610, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 0, 0, 0, 0, 0, 0, 0, 316, 471, + 491, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 0, 488, 518, 353, 508, 0, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 534, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 0, + 0, 664, 0, 501, 0, 0, 0, 0, 0, 0, + 469, 0, 0, 391, 0, 0, 0, 519, 0, 452, + 428, 698, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 0, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 352, 424, 629, 662, 663, 554, 0, + 617, 555, 564, 344, 589, 601, 600, 420, 514, 0, + 612, 615, 544, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 497, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 523, 605, 606, 414, 415, 416, 417, 372, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 636, 635, - 634, 633, 632, 631, 630, 0, 0, 579, 478, 346, - 300, 342, 343, 350, 690, 686, 483, 691, 0, 308, - 559, 394, 441, 366, 624, 625, 0, 676, 254, 255, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 0, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, - 277, 278, 627, 269, 270, 279, 280, 281, 282, 283, + 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, - 0, 0, 0, 302, 678, 679, 680, 681, 682, 0, - 0, 303, 304, 305, 0, 0, 295, 469, 296, 297, - 298, 299, 0, 0, 509, 510, 511, 534, 0, 512, - 494, 558, 377, 309, 473, 501, 688, 0, 0, 0, - 0, 0, 0, 0, 609, 620, 654, 0, 664, 665, - 667, 669, 668, 671, 466, 467, 677, 0, 673, 674, - 675, 672, 398, 453, 474, 460, 0, 694, 549, 550, - 695, 660, 425, 0, 0, 564, 598, 587, 670, 552, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 359, 2731, 0, 393, 602, 583, 594, 584, 569, 570, - 571, 578, 371, 572, 573, 574, 544, 575, 545, 576, - 577, 0, 601, 551, 462, 409, 0, 618, 0, 0, + 0, 0, 0, 302, 679, 680, 681, 682, 683, 0, + 0, 303, 304, 305, 0, 0, 295, 470, 296, 297, + 298, 299, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 669, 672, 467, 468, 678, 0, 674, 675, + 676, 673, 399, 454, 475, 461, 0, 695, 550, 551, + 696, 661, 426, 0, 0, 565, 599, 588, 671, 553, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 359, 2732, 0, 394, 603, 584, 595, 585, 570, 571, + 572, 579, 371, 573, 574, 575, 545, 576, 546, 577, + 578, 0, 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 1659, 0, 0, 0, 328, 241, 546, 666, 548, - 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1660, 0, 0, 0, 328, 241, 547, 667, 549, + 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 463, 493, 0, 506, 0, 383, 384, 0, 0, 0, - 0, 0, 0, 0, 316, 470, 490, 329, 457, 504, - 334, 465, 482, 324, 424, 454, 0, 0, 318, 488, - 464, 406, 317, 0, 448, 357, 373, 354, 422, 0, - 487, 517, 353, 507, 0, 498, 320, 0, 497, 421, - 484, 489, 407, 400, 0, 319, 486, 405, 399, 387, - 363, 533, 388, 389, 378, 436, 397, 437, 379, 411, - 410, 412, 0, 0, 0, 0, 0, 528, 529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 659, 0, 0, 663, 0, 500, - 0, 0, 0, 0, 0, 0, 468, 0, 0, 390, - 0, 0, 0, 518, 0, 451, 427, 697, 0, 0, - 449, 395, 485, 438, 491, 471, 499, 443, 439, 310, - 472, 356, 408, 325, 327, 687, 358, 360, 364, 365, - 417, 418, 432, 456, 475, 476, 477, 355, 339, 450, - 340, 375, 341, 311, 347, 345, 348, 458, 349, 313, - 433, 481, 0, 370, 446, 403, 314, 402, 434, 480, - 479, 326, 508, 515, 516, 606, 0, 521, 698, 699, - 700, 530, 0, 440, 322, 321, 0, 0, 0, 351, - 435, 335, 337, 338, 336, 430, 431, 535, 536, 537, - 539, 0, 540, 541, 0, 0, 0, 0, 542, 607, - 623, 591, 560, 523, 615, 557, 561, 562, 381, 626, - 0, 0, 0, 514, 391, 392, 0, 362, 361, 404, - 315, 0, 0, 368, 306, 307, 693, 352, 423, 628, - 661, 662, 553, 0, 616, 554, 563, 344, 588, 600, - 599, 419, 513, 0, 611, 614, 543, 692, 0, 608, - 622, 696, 621, 689, 429, 0, 455, 619, 566, 0, - 612, 585, 586, 0, 613, 581, 617, 0, 555, 0, - 524, 527, 556, 641, 642, 643, 312, 526, 645, 646, - 647, 648, 649, 650, 651, 644, 496, 589, 565, 592, - 505, 568, 567, 0, 0, 603, 522, 604, 605, 413, - 414, 415, 416, 372, 629, 333, 525, 442, 0, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 595, 596, - 593, 701, 0, 652, 653, 0, 0, 519, 520, 367, - 374, 538, 376, 332, 428, 369, 503, 385, 0, 531, - 597, 532, 444, 445, 655, 658, 656, 657, 420, 380, - 382, 459, 386, 396, 447, 502, 426, 452, 330, 492, - 461, 401, 582, 610, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, + 464, 494, 0, 507, 0, 384, 385, 0, 0, 0, + 0, 0, 0, 0, 316, 471, 491, 329, 458, 505, + 334, 466, 483, 324, 425, 455, 0, 0, 318, 489, + 465, 407, 317, 0, 449, 357, 373, 354, 423, 0, + 488, 518, 353, 508, 0, 499, 320, 0, 498, 422, + 485, 490, 408, 401, 0, 319, 487, 406, 400, 388, + 363, 534, 389, 390, 378, 437, 398, 438, 379, 412, + 411, 413, 0, 0, 0, 0, 0, 529, 530, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 660, 0, 0, 664, 0, 501, + 0, 0, 0, 0, 0, 0, 469, 0, 0, 391, + 0, 0, 0, 519, 0, 452, 428, 698, 0, 0, + 450, 396, 486, 439, 492, 472, 500, 444, 440, 310, + 473, 356, 409, 325, 327, 688, 358, 360, 364, 365, + 418, 419, 433, 457, 476, 477, 478, 355, 339, 451, + 340, 375, 341, 311, 347, 345, 348, 459, 349, 313, + 434, 482, 0, 370, 447, 404, 314, 403, 435, 481, + 480, 326, 509, 516, 517, 607, 0, 522, 699, 700, + 701, 531, 0, 441, 322, 321, 0, 0, 0, 351, + 436, 335, 337, 338, 336, 431, 432, 536, 537, 538, + 540, 0, 541, 542, 0, 0, 0, 0, 543, 608, + 624, 592, 561, 524, 616, 558, 562, 563, 381, 627, + 0, 0, 0, 515, 392, 393, 0, 362, 361, 405, + 315, 0, 0, 0, 382, 368, 306, 307, 694, 352, + 424, 629, 662, 663, 554, 0, 617, 555, 564, 344, + 589, 601, 600, 420, 514, 0, 612, 615, 544, 693, + 0, 609, 623, 697, 622, 690, 430, 0, 456, 620, + 567, 0, 613, 586, 587, 0, 614, 582, 618, 0, + 556, 0, 525, 528, 557, 642, 643, 644, 312, 527, + 646, 647, 648, 649, 650, 651, 652, 645, 497, 590, + 566, 593, 506, 569, 568, 0, 0, 604, 523, 605, + 606, 414, 415, 416, 417, 372, 630, 333, 526, 443, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 597, 594, 702, 0, 653, 654, 0, 0, 520, + 521, 367, 374, 539, 376, 332, 429, 369, 504, 386, + 0, 532, 598, 533, 445, 446, 656, 659, 657, 658, + 421, 380, 383, 460, 387, 397, 448, 503, 427, 453, + 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 636, 635, 634, 633, 632, 631, 630, 0, - 0, 579, 478, 346, 300, 342, 343, 350, 690, 686, - 483, 691, 0, 308, 559, 394, 441, 366, 624, 625, - 0, 676, 254, 255, 256, 257, 258, 259, 260, 261, - 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, - 273, 274, 275, 276, 277, 278, 627, 269, 270, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 0, 0, 0, 0, 302, 678, 679, - 680, 681, 682, 0, 0, 303, 304, 305, 0, 0, - 295, 469, 296, 297, 298, 299, 0, 0, 509, 510, - 511, 534, 0, 512, 494, 558, 377, 309, 473, 501, - 688, 0, 0, 0, 0, 0, 0, 0, 609, 620, - 654, 0, 664, 665, 667, 669, 668, 671, 466, 467, - 677, 0, 673, 674, 675, 672, 398, 453, 474, 460, - 0, 694, 549, 550, 695, 660, 425, 0, 0, 564, - 598, 587, 670, 552, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 713, 359, 0, 0, 393, 602, 583, - 594, 584, 569, 570, 571, 578, 371, 572, 573, 574, - 544, 575, 545, 576, 577, 0, 601, 551, 462, 409, - 0, 618, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 637, 636, 635, 634, 633, 632, + 631, 0, 0, 580, 479, 346, 300, 342, 343, 350, + 691, 687, 484, 692, 0, 308, 560, 395, 442, 366, + 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, + 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, + 271, 272, 273, 274, 275, 276, 277, 278, 628, 269, + 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, + 679, 680, 681, 682, 683, 0, 0, 303, 304, 305, + 0, 0, 295, 470, 296, 297, 298, 299, 0, 0, + 510, 511, 512, 535, 0, 513, 495, 559, 377, 309, + 474, 502, 689, 0, 0, 0, 0, 0, 0, 0, + 610, 621, 655, 0, 665, 666, 668, 670, 669, 672, + 467, 468, 678, 0, 674, 675, 676, 673, 399, 454, + 475, 461, 0, 695, 550, 551, 696, 661, 426, 0, + 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 714, 359, 0, 0, 394, + 603, 584, 595, 585, 570, 571, 572, 579, 371, 573, + 574, 575, 545, 576, 546, 577, 578, 0, 602, 552, + 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 0, 0, 0, 0, 328, - 241, 546, 666, 548, 547, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, + 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 464, 494, 0, 507, + 0, 384, 385, 0, 0, 0, 0, 0, 0, 0, + 316, 471, 491, 329, 458, 505, 334, 466, 483, 324, + 425, 455, 0, 0, 318, 489, 465, 407, 317, 0, + 449, 357, 373, 354, 423, 0, 488, 518, 353, 508, + 0, 499, 320, 0, 498, 422, 485, 490, 408, 401, + 0, 319, 487, 406, 400, 388, 363, 534, 389, 390, + 378, 437, 398, 438, 379, 412, 411, 413, 0, 0, + 0, 0, 0, 529, 530, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 660, 0, 0, 664, 0, 501, 0, 1031, 0, 0, + 0, 0, 469, 0, 0, 391, 0, 0, 0, 519, + 0, 452, 428, 698, 0, 0, 450, 396, 486, 439, + 492, 472, 500, 444, 440, 310, 473, 356, 409, 325, + 327, 688, 358, 360, 364, 365, 418, 419, 433, 457, + 476, 477, 478, 355, 339, 451, 340, 375, 341, 311, + 347, 345, 348, 459, 349, 313, 434, 482, 0, 370, + 447, 404, 314, 403, 435, 481, 480, 326, 509, 516, + 517, 607, 0, 522, 699, 700, 701, 531, 0, 441, + 322, 321, 0, 0, 0, 351, 436, 335, 337, 338, + 336, 431, 432, 536, 537, 538, 540, 0, 541, 542, + 0, 0, 0, 0, 543, 608, 624, 592, 561, 524, + 616, 558, 562, 563, 381, 627, 0, 0, 0, 515, + 392, 393, 0, 362, 361, 405, 315, 0, 0, 0, + 382, 368, 306, 307, 694, 352, 424, 629, 662, 663, + 554, 0, 617, 555, 564, 344, 589, 601, 600, 420, + 514, 0, 612, 615, 544, 693, 0, 609, 623, 697, + 622, 690, 430, 0, 456, 620, 567, 0, 613, 586, + 587, 0, 614, 582, 618, 0, 556, 0, 525, 528, + 557, 642, 643, 644, 312, 527, 646, 647, 648, 649, + 650, 651, 652, 645, 497, 590, 566, 593, 506, 569, + 568, 0, 0, 604, 523, 605, 606, 414, 415, 416, + 417, 372, 630, 333, 526, 443, 0, 591, 0, 0, + 0, 0, 0, 0, 0, 0, 596, 597, 594, 702, + 0, 653, 654, 0, 0, 520, 521, 367, 374, 539, + 376, 332, 429, 369, 504, 386, 0, 532, 598, 533, + 445, 446, 656, 659, 657, 658, 421, 380, 383, 460, + 387, 397, 448, 503, 427, 453, 330, 493, 462, 402, + 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, + 637, 636, 635, 634, 633, 632, 631, 0, 0, 580, + 479, 346, 300, 342, 343, 350, 691, 687, 484, 692, + 0, 308, 560, 395, 442, 366, 625, 626, 0, 677, + 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, + 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, + 275, 276, 277, 278, 628, 269, 270, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 0, 0, 0, 302, 679, 680, 681, 682, + 683, 0, 0, 303, 304, 305, 0, 0, 295, 470, + 296, 297, 298, 299, 0, 0, 510, 511, 512, 535, + 0, 513, 495, 559, 377, 309, 474, 502, 689, 0, + 0, 0, 0, 0, 0, 0, 610, 621, 655, 0, + 665, 666, 668, 670, 669, 672, 467, 468, 678, 0, + 674, 675, 676, 673, 399, 454, 475, 461, 0, 695, + 550, 551, 696, 661, 426, 0, 0, 565, 599, 588, + 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 359, 0, 0, 394, 603, 584, 595, 585, + 570, 571, 572, 579, 371, 573, 574, 575, 545, 576, + 546, 577, 578, 0, 602, 552, 463, 410, 0, 619, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 907, 0, 0, 0, 0, 0, 328, 241, 547, + 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 463, 493, 0, 506, 0, 383, - 384, 0, 0, 0, 0, 0, 0, 0, 316, 470, - 490, 329, 457, 504, 334, 465, 482, 324, 424, 454, - 0, 0, 318, 488, 464, 406, 317, 0, 448, 357, - 373, 354, 422, 0, 487, 517, 353, 507, 0, 498, - 320, 0, 497, 421, 484, 489, 407, 400, 0, 319, - 486, 405, 399, 387, 363, 533, 388, 389, 378, 436, - 397, 437, 379, 411, 410, 412, 0, 0, 0, 0, - 0, 528, 529, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 659, 0, - 0, 663, 0, 500, 0, 1030, 0, 0, 0, 0, - 468, 0, 0, 390, 0, 0, 0, 518, 0, 451, - 427, 697, 0, 0, 449, 395, 485, 438, 491, 471, - 499, 443, 439, 310, 472, 356, 408, 325, 327, 687, - 358, 360, 364, 365, 417, 418, 432, 456, 475, 476, - 477, 355, 339, 450, 340, 375, 341, 311, 347, 345, - 348, 458, 349, 313, 433, 481, 0, 370, 446, 403, - 314, 402, 434, 480, 479, 326, 508, 515, 516, 606, - 0, 521, 698, 699, 700, 530, 0, 440, 322, 321, - 0, 0, 0, 351, 435, 335, 337, 338, 336, 430, - 431, 535, 536, 537, 539, 0, 540, 541, 0, 0, - 0, 0, 542, 607, 623, 591, 560, 523, 615, 557, - 561, 562, 381, 626, 0, 0, 0, 514, 391, 392, - 0, 362, 361, 404, 315, 0, 0, 368, 306, 307, - 693, 352, 423, 628, 661, 662, 553, 0, 616, 554, - 563, 344, 588, 600, 599, 419, 513, 0, 611, 614, - 543, 692, 0, 608, 622, 696, 621, 689, 429, 0, - 455, 619, 566, 0, 612, 585, 586, 0, 613, 581, - 617, 0, 555, 0, 524, 527, 556, 641, 642, 643, - 312, 526, 645, 646, 647, 648, 649, 650, 651, 644, - 496, 589, 565, 592, 505, 568, 567, 0, 0, 603, - 522, 604, 605, 413, 414, 415, 416, 372, 629, 333, - 525, 442, 0, 590, 0, 0, 0, 0, 0, 0, - 0, 0, 595, 596, 593, 701, 0, 652, 653, 0, - 0, 519, 520, 367, 374, 538, 376, 332, 428, 369, - 503, 385, 0, 531, 597, 532, 444, 445, 655, 658, - 656, 657, 420, 380, 382, 459, 386, 396, 447, 502, - 426, 452, 330, 492, 461, 401, 582, 610, 0, 0, + 0, 0, 464, 494, 0, 507, 0, 384, 385, 0, + 0, 0, 0, 0, 0, 0, 316, 471, 491, 329, + 458, 505, 334, 466, 483, 324, 425, 455, 0, 0, + 318, 489, 465, 407, 317, 0, 449, 357, 373, 354, + 423, 0, 488, 518, 353, 508, 0, 499, 320, 0, + 498, 422, 485, 490, 408, 401, 0, 319, 487, 406, + 400, 388, 363, 534, 389, 390, 378, 437, 398, 438, + 379, 412, 411, 413, 0, 0, 0, 0, 0, 529, + 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 0, 0, 664, + 0, 501, 0, 0, 0, 0, 0, 0, 469, 0, + 0, 391, 0, 0, 0, 519, 0, 452, 428, 698, + 0, 0, 450, 396, 486, 439, 492, 472, 500, 444, + 440, 310, 473, 356, 409, 325, 327, 688, 358, 360, + 364, 365, 418, 419, 433, 457, 476, 477, 478, 355, + 339, 451, 340, 375, 341, 311, 347, 345, 348, 459, + 349, 313, 434, 482, 0, 370, 447, 404, 314, 403, + 435, 481, 480, 326, 509, 516, 517, 607, 0, 522, + 699, 700, 701, 531, 0, 441, 322, 321, 0, 0, + 0, 351, 436, 335, 337, 338, 336, 431, 432, 536, + 537, 538, 540, 0, 541, 542, 0, 0, 0, 0, + 543, 608, 624, 592, 561, 524, 616, 558, 562, 563, + 381, 627, 0, 0, 0, 515, 392, 393, 0, 362, + 361, 405, 315, 0, 0, 0, 382, 368, 306, 307, + 694, 352, 424, 629, 662, 663, 554, 0, 617, 555, + 564, 344, 589, 601, 600, 420, 514, 0, 612, 615, + 544, 693, 0, 609, 623, 697, 622, 690, 430, 0, + 456, 620, 567, 0, 613, 586, 587, 0, 614, 582, + 618, 0, 556, 0, 525, 528, 557, 642, 643, 644, + 312, 527, 646, 647, 648, 649, 650, 651, 652, 645, + 497, 590, 566, 593, 506, 569, 568, 0, 0, 604, + 523, 605, 606, 414, 415, 416, 417, 372, 630, 333, + 526, 443, 0, 591, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 597, 594, 702, 0, 653, 654, 0, + 0, 520, 521, 367, 374, 539, 376, 332, 429, 369, + 504, 386, 0, 532, 598, 533, 445, 446, 656, 659, + 657, 658, 421, 380, 383, 460, 387, 397, 448, 503, + 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 636, 635, 634, 633, - 632, 631, 630, 0, 0, 579, 478, 346, 300, 342, - 343, 350, 690, 686, 483, 691, 0, 308, 559, 394, - 441, 366, 624, 625, 0, 676, 254, 255, 256, 257, + 0, 0, 0, 0, 0, 638, 637, 636, 635, 634, + 633, 632, 631, 0, 0, 580, 479, 346, 300, 342, + 343, 350, 691, 687, 484, 692, 0, 308, 560, 395, + 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, 277, 278, - 627, 269, 270, 279, 280, 281, 282, 283, 284, 285, + 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, 0, 0, - 0, 302, 678, 679, 680, 681, 682, 0, 0, 303, - 304, 305, 0, 0, 295, 469, 296, 297, 298, 299, - 0, 0, 509, 510, 511, 534, 0, 512, 494, 558, - 377, 309, 473, 501, 688, 0, 0, 0, 0, 0, - 0, 0, 609, 620, 654, 0, 664, 665, 667, 669, - 668, 671, 466, 467, 677, 0, 673, 674, 675, 672, - 398, 453, 474, 460, 0, 694, 549, 550, 695, 660, - 425, 0, 0, 564, 598, 587, 670, 552, 0, 0, + 0, 302, 679, 680, 681, 682, 683, 0, 0, 303, + 304, 305, 0, 0, 295, 470, 296, 297, 298, 299, + 0, 0, 510, 511, 512, 535, 0, 513, 495, 559, + 377, 309, 474, 502, 689, 0, 0, 0, 0, 0, + 0, 0, 610, 621, 655, 0, 665, 666, 668, 670, + 669, 672, 467, 468, 678, 0, 674, 675, 676, 673, + 399, 454, 475, 461, 0, 695, 550, 551, 696, 661, + 426, 0, 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, - 0, 393, 602, 583, 594, 584, 569, 570, 571, 578, - 371, 572, 573, 574, 544, 575, 545, 576, 577, 0, - 601, 551, 462, 409, 0, 618, 0, 0, 0, 0, + 0, 394, 603, 584, 595, 585, 570, 571, 572, 579, + 371, 573, 574, 575, 545, 576, 546, 577, 578, 0, + 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 906, 0, 0, - 0, 0, 0, 328, 241, 546, 666, 548, 547, 0, + 0, 0, 0, 4436, 0, 0, 240, 0, 0, 0, + 0, 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 463, 493, - 0, 506, 0, 383, 384, 0, 0, 0, 0, 0, - 0, 0, 316, 470, 490, 329, 457, 504, 334, 465, - 482, 324, 424, 454, 0, 0, 318, 488, 464, 406, - 317, 0, 448, 357, 373, 354, 422, 0, 487, 517, - 353, 507, 0, 498, 320, 0, 497, 421, 484, 489, - 407, 400, 0, 319, 486, 405, 399, 387, 363, 533, - 388, 389, 378, 436, 397, 437, 379, 411, 410, 412, - 0, 0, 0, 0, 0, 528, 529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 659, 0, 0, 663, 0, 500, 0, 0, - 0, 0, 0, 0, 468, 0, 0, 390, 0, 0, - 0, 518, 0, 451, 427, 697, 0, 0, 449, 395, - 485, 438, 491, 471, 499, 443, 439, 310, 472, 356, - 408, 325, 327, 687, 358, 360, 364, 365, 417, 418, - 432, 456, 475, 476, 477, 355, 339, 450, 340, 375, - 341, 311, 347, 345, 348, 458, 349, 313, 433, 481, - 0, 370, 446, 403, 314, 402, 434, 480, 479, 326, - 508, 515, 516, 606, 0, 521, 698, 699, 700, 530, - 0, 440, 322, 321, 0, 0, 0, 351, 435, 335, - 337, 338, 336, 430, 431, 535, 536, 537, 539, 0, - 540, 541, 0, 0, 0, 0, 542, 607, 623, 591, - 560, 523, 615, 557, 561, 562, 381, 626, 0, 0, - 0, 514, 391, 392, 0, 362, 361, 404, 315, 0, - 0, 368, 306, 307, 693, 352, 423, 628, 661, 662, - 553, 0, 616, 554, 563, 344, 588, 600, 599, 419, - 513, 0, 611, 614, 543, 692, 0, 608, 622, 696, - 621, 689, 429, 0, 455, 619, 566, 0, 612, 585, - 586, 0, 613, 581, 617, 0, 555, 0, 524, 527, - 556, 641, 642, 643, 312, 526, 645, 646, 647, 648, - 649, 650, 651, 644, 496, 589, 565, 592, 505, 568, - 567, 0, 0, 603, 522, 604, 605, 413, 414, 415, - 416, 372, 629, 333, 525, 442, 0, 590, 0, 0, - 0, 0, 0, 0, 0, 0, 595, 596, 593, 701, - 0, 652, 653, 0, 0, 519, 520, 367, 374, 538, - 376, 332, 428, 369, 503, 385, 0, 531, 597, 532, - 444, 445, 655, 658, 656, 657, 420, 380, 382, 459, - 386, 396, 447, 502, 426, 452, 330, 492, 461, 401, - 582, 610, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 636, 635, 634, 633, 632, 631, 630, 0, 0, 579, - 478, 346, 300, 342, 343, 350, 690, 686, 483, 691, - 0, 308, 559, 394, 441, 366, 624, 625, 0, 676, - 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, - 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, - 275, 276, 277, 278, 627, 269, 270, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 0, 0, 0, 0, 302, 678, 679, 680, 681, - 682, 0, 0, 303, 304, 305, 0, 0, 295, 469, - 296, 297, 298, 299, 0, 0, 509, 510, 511, 534, - 0, 512, 494, 558, 377, 309, 473, 501, 688, 0, - 0, 0, 0, 0, 0, 0, 609, 620, 654, 0, - 664, 665, 667, 669, 668, 671, 466, 467, 677, 0, - 673, 674, 675, 672, 398, 453, 474, 460, 0, 694, - 549, 550, 695, 660, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 359, 0, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 0, 601, 551, 462, 409, 0, 618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4428, 0, 0, - 240, 0, 0, 0, 0, 0, 0, 328, 241, 546, - 666, 548, 547, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 0, - 0, 0, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 482, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 0, 487, 517, 353, 507, 0, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 533, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 0, 0, 663, - 0, 500, 0, 0, 0, 0, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 518, 0, 451, 427, 697, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 443, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 515, 516, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 352, - 423, 628, 661, 662, 553, 0, 616, 554, 563, 344, - 588, 600, 599, 419, 513, 0, 611, 614, 543, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 651, 644, 496, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 522, 604, - 605, 413, 414, 415, 416, 372, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 464, 494, + 0, 507, 0, 384, 385, 0, 0, 0, 0, 0, + 0, 0, 316, 471, 491, 329, 458, 505, 334, 466, + 483, 324, 425, 455, 0, 0, 318, 489, 465, 407, + 317, 0, 449, 357, 373, 354, 423, 0, 488, 518, + 353, 508, 0, 499, 320, 0, 498, 422, 485, 490, + 408, 401, 0, 319, 487, 406, 400, 388, 363, 534, + 389, 390, 378, 437, 398, 438, 379, 412, 411, 413, + 0, 0, 0, 0, 0, 529, 530, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 0, 0, 664, 0, 501, 0, 0, + 0, 0, 0, 0, 469, 0, 0, 391, 0, 0, + 0, 519, 0, 452, 428, 698, 0, 0, 450, 396, + 486, 439, 492, 472, 500, 444, 440, 310, 473, 356, + 409, 325, 327, 688, 358, 360, 364, 365, 418, 419, + 433, 457, 476, 477, 478, 355, 339, 451, 340, 375, + 341, 311, 347, 345, 348, 459, 349, 313, 434, 482, + 0, 370, 447, 404, 314, 403, 435, 481, 480, 326, + 509, 516, 517, 607, 0, 522, 699, 700, 701, 531, + 0, 441, 322, 321, 0, 0, 0, 351, 436, 335, + 337, 338, 336, 431, 432, 536, 537, 538, 540, 0, + 541, 542, 0, 0, 0, 0, 543, 608, 624, 592, + 561, 524, 616, 558, 562, 563, 381, 627, 0, 0, + 0, 515, 392, 393, 0, 362, 361, 405, 315, 0, + 0, 0, 382, 368, 306, 307, 694, 352, 424, 629, + 662, 663, 554, 0, 617, 555, 564, 344, 589, 601, + 600, 420, 514, 0, 612, 615, 544, 693, 0, 609, + 623, 697, 622, 690, 430, 0, 456, 620, 567, 0, + 613, 586, 587, 0, 614, 582, 618, 0, 556, 0, + 525, 528, 557, 642, 643, 644, 312, 527, 646, 647, + 648, 649, 650, 651, 652, 645, 497, 590, 566, 593, + 506, 569, 568, 0, 0, 604, 523, 605, 606, 414, + 415, 416, 417, 372, 630, 333, 526, 443, 0, 591, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 597, + 594, 702, 0, 653, 654, 0, 0, 520, 521, 367, + 374, 539, 376, 332, 429, 369, 504, 386, 0, 532, + 598, 533, 445, 446, 656, 659, 657, 658, 421, 380, + 383, 460, 387, 397, 448, 503, 427, 453, 330, 493, + 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 0, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 254, 255, 256, 257, 258, 259, - 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, - 271, 272, 273, 274, 275, 276, 277, 278, 627, 269, - 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, - 678, 679, 680, 681, 682, 0, 0, 303, 304, 305, - 0, 0, 295, 469, 296, 297, 298, 299, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 668, 671, - 466, 467, 677, 0, 673, 674, 675, 672, 398, 453, - 474, 460, 0, 694, 549, 550, 695, 660, 425, 0, - 0, 564, 598, 587, 670, 552, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 359, 0, 0, 393, - 602, 583, 594, 584, 569, 570, 571, 578, 371, 572, - 573, 574, 544, 575, 545, 576, 577, 0, 601, 551, - 462, 409, 0, 618, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 4156, 0, 0, - 0, 328, 241, 546, 666, 548, 547, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 638, 637, 636, 635, 634, 633, 632, 631, 0, + 0, 580, 479, 346, 300, 342, 343, 350, 691, 687, + 484, 692, 0, 308, 560, 395, 442, 366, 625, 626, + 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, + 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, + 273, 274, 275, 276, 277, 278, 628, 269, 270, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 0, 0, 0, 302, 679, 680, + 681, 682, 683, 0, 0, 303, 304, 305, 0, 0, + 295, 470, 296, 297, 298, 299, 0, 0, 510, 511, + 512, 535, 0, 513, 495, 559, 377, 309, 474, 502, + 689, 0, 0, 0, 0, 0, 0, 0, 610, 621, + 655, 0, 665, 666, 668, 670, 669, 672, 467, 468, + 678, 0, 674, 675, 676, 673, 399, 454, 475, 461, + 0, 695, 550, 551, 696, 661, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 0, 602, 552, 463, 410, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 4159, 0, 0, 0, 328, + 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 463, 493, 0, 506, - 0, 383, 384, 0, 0, 0, 0, 0, 0, 0, - 316, 470, 490, 329, 457, 504, 334, 465, 482, 324, - 424, 454, 0, 0, 318, 488, 464, 406, 317, 0, - 448, 357, 373, 354, 422, 0, 487, 517, 353, 507, - 0, 498, 320, 0, 497, 421, 484, 489, 407, 400, - 0, 319, 486, 405, 399, 387, 363, 533, 388, 389, - 378, 436, 397, 437, 379, 411, 410, 412, 0, 0, - 0, 0, 0, 528, 529, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 659, 0, 0, 663, 0, 500, 0, 0, 0, 0, - 0, 0, 468, 0, 0, 390, 0, 0, 0, 518, - 0, 451, 427, 697, 0, 0, 449, 395, 485, 438, - 491, 471, 499, 443, 439, 310, 472, 356, 408, 325, - 327, 687, 358, 360, 364, 365, 417, 418, 432, 456, - 475, 476, 477, 355, 339, 450, 340, 375, 341, 311, - 347, 345, 348, 458, 349, 313, 433, 481, 0, 370, - 446, 403, 314, 402, 434, 480, 479, 326, 508, 515, - 516, 606, 0, 521, 698, 699, 700, 530, 0, 440, - 322, 321, 0, 0, 0, 351, 435, 335, 337, 338, - 336, 430, 431, 535, 536, 537, 539, 0, 540, 541, - 0, 0, 0, 0, 542, 607, 623, 591, 560, 523, - 615, 557, 561, 562, 381, 626, 0, 0, 0, 514, - 391, 392, 0, 362, 361, 404, 315, 0, 0, 368, - 306, 307, 693, 352, 423, 628, 661, 662, 553, 0, - 616, 554, 563, 344, 588, 600, 599, 419, 513, 0, - 611, 614, 543, 692, 0, 608, 622, 696, 621, 689, - 429, 0, 455, 619, 566, 0, 612, 585, 586, 0, - 613, 581, 617, 0, 555, 0, 524, 527, 556, 641, - 642, 643, 312, 526, 645, 646, 647, 648, 649, 650, - 651, 644, 496, 589, 565, 592, 505, 568, 567, 0, - 0, 603, 522, 604, 605, 413, 414, 415, 416, 372, - 629, 333, 525, 442, 0, 590, 0, 0, 0, 0, - 0, 0, 0, 0, 595, 596, 593, 701, 0, 652, - 653, 0, 0, 519, 520, 367, 374, 538, 376, 332, - 428, 369, 503, 385, 0, 531, 597, 532, 444, 445, - 655, 658, 656, 657, 420, 380, 382, 459, 386, 396, - 447, 502, 426, 452, 330, 492, 461, 401, 582, 610, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 0, 0, 0, 0, 0, 0, 0, 316, 471, + 491, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 0, 488, 518, 353, 508, 0, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 534, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 0, + 0, 664, 0, 501, 0, 0, 0, 0, 0, 0, + 469, 0, 0, 391, 0, 0, 0, 519, 0, 452, + 428, 698, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 0, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 352, 424, 629, 662, 663, 554, 0, + 617, 555, 564, 344, 589, 601, 600, 420, 514, 0, + 612, 615, 544, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 497, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 523, 605, 606, 414, 415, 416, 417, 372, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 636, 635, - 634, 633, 632, 631, 630, 0, 0, 579, 478, 346, - 300, 342, 343, 350, 690, 686, 483, 691, 0, 308, - 559, 394, 441, 366, 624, 625, 0, 676, 254, 255, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 0, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, - 277, 278, 627, 269, 270, 279, 280, 281, 282, 283, + 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, - 0, 0, 0, 302, 678, 679, 680, 681, 682, 0, - 0, 303, 304, 305, 0, 0, 295, 469, 296, 297, - 298, 299, 0, 0, 509, 510, 511, 534, 0, 512, - 494, 558, 377, 309, 473, 501, 688, 0, 0, 0, - 0, 0, 0, 0, 609, 620, 654, 0, 664, 665, - 667, 669, 668, 671, 466, 467, 677, 0, 673, 674, - 675, 672, 398, 453, 474, 460, 0, 694, 549, 550, - 695, 660, 425, 0, 0, 564, 598, 587, 670, 552, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 359, 0, 0, 393, 602, 583, 594, 584, 569, 570, - 571, 578, 371, 572, 573, 574, 544, 575, 545, 576, - 577, 0, 601, 551, 462, 409, 0, 618, 0, 0, + 0, 0, 0, 302, 679, 680, 681, 682, 683, 0, + 0, 303, 304, 305, 0, 0, 295, 470, 296, 297, + 298, 299, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 669, 672, 467, 468, 678, 0, 674, 675, + 676, 673, 399, 454, 475, 461, 0, 695, 550, 551, + 696, 661, 426, 0, 0, 565, 599, 588, 671, 553, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 359, 0, 0, 394, 603, 584, 595, 585, 570, 571, + 572, 579, 371, 573, 574, 575, 545, 576, 546, 577, + 578, 0, 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 0, 0, 0, 0, 328, 241, 546, 666, 548, - 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 328, 241, 547, 667, 549, + 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 463, 493, 0, 506, 0, 383, 384, 0, 0, 0, - 0, 0, 0, 0, 316, 470, 490, 329, 457, 504, - 334, 465, 482, 324, 424, 454, 0, 0, 318, 488, - 464, 406, 317, 0, 448, 357, 373, 354, 422, 0, - 487, 517, 353, 507, 0, 498, 320, 0, 497, 421, - 484, 489, 407, 400, 0, 319, 486, 405, 399, 387, - 363, 533, 388, 389, 378, 436, 397, 437, 379, 411, - 410, 412, 0, 0, 0, 0, 0, 528, 529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 659, 0, 0, 663, 0, 500, - 0, 0, 0, 4326, 0, 0, 468, 0, 0, 390, - 0, 0, 0, 518, 0, 451, 427, 697, 0, 0, - 449, 395, 485, 438, 491, 471, 499, 443, 439, 310, - 472, 356, 408, 325, 327, 687, 358, 360, 364, 365, - 417, 418, 432, 456, 475, 476, 477, 355, 339, 450, - 340, 375, 341, 311, 347, 345, 348, 458, 349, 313, - 433, 481, 0, 370, 446, 403, 314, 402, 434, 480, - 479, 326, 508, 515, 516, 606, 0, 521, 698, 699, - 700, 530, 0, 440, 322, 321, 0, 0, 0, 351, - 435, 335, 337, 338, 336, 430, 431, 535, 536, 537, - 539, 0, 540, 541, 0, 0, 0, 0, 542, 607, - 623, 591, 560, 523, 615, 557, 561, 562, 381, 626, - 0, 0, 0, 514, 391, 392, 0, 362, 361, 404, - 315, 0, 0, 368, 306, 307, 693, 352, 423, 628, - 661, 662, 553, 0, 616, 554, 563, 344, 588, 600, - 599, 419, 513, 0, 611, 614, 543, 692, 0, 608, - 622, 696, 621, 689, 429, 0, 455, 619, 566, 0, - 612, 585, 586, 0, 613, 581, 617, 0, 555, 0, - 524, 527, 556, 641, 642, 643, 312, 526, 645, 646, - 647, 648, 649, 650, 651, 644, 496, 589, 565, 592, - 505, 568, 567, 0, 0, 603, 522, 604, 605, 413, - 414, 415, 416, 372, 629, 333, 525, 442, 0, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 595, 596, - 593, 701, 0, 652, 653, 0, 0, 519, 520, 367, - 374, 538, 376, 332, 428, 369, 503, 385, 0, 531, - 597, 532, 444, 445, 655, 658, 656, 657, 420, 380, - 382, 459, 386, 396, 447, 502, 426, 452, 330, 492, - 461, 401, 582, 610, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, + 464, 494, 0, 507, 0, 384, 385, 0, 0, 0, + 0, 0, 0, 0, 316, 471, 491, 329, 458, 505, + 334, 466, 483, 324, 425, 455, 0, 0, 318, 489, + 465, 407, 317, 0, 449, 357, 373, 354, 423, 0, + 488, 518, 353, 508, 0, 499, 320, 0, 498, 422, + 485, 490, 408, 401, 0, 319, 487, 406, 400, 388, + 363, 534, 389, 390, 378, 437, 398, 438, 379, 412, + 411, 413, 0, 0, 0, 0, 0, 529, 530, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 660, 0, 0, 664, 0, 501, + 0, 0, 0, 4333, 0, 0, 469, 0, 0, 391, + 0, 0, 0, 519, 0, 452, 428, 698, 0, 0, + 450, 396, 486, 439, 492, 472, 500, 444, 440, 310, + 473, 356, 409, 325, 327, 688, 358, 360, 364, 365, + 418, 419, 433, 457, 476, 477, 478, 355, 339, 451, + 340, 375, 341, 311, 347, 345, 348, 459, 349, 313, + 434, 482, 0, 370, 447, 404, 314, 403, 435, 481, + 480, 326, 509, 516, 517, 607, 0, 522, 699, 700, + 701, 531, 0, 441, 322, 321, 0, 0, 0, 351, + 436, 335, 337, 338, 336, 431, 432, 536, 537, 538, + 540, 0, 541, 542, 0, 0, 0, 0, 543, 608, + 624, 592, 561, 524, 616, 558, 562, 563, 381, 627, + 0, 0, 0, 515, 392, 393, 0, 362, 361, 405, + 315, 0, 0, 0, 382, 368, 306, 307, 694, 352, + 424, 629, 662, 663, 554, 0, 617, 555, 564, 344, + 589, 601, 600, 420, 514, 0, 612, 615, 544, 693, + 0, 609, 623, 697, 622, 690, 430, 0, 456, 620, + 567, 0, 613, 586, 587, 0, 614, 582, 618, 0, + 556, 0, 525, 528, 557, 642, 643, 644, 312, 527, + 646, 647, 648, 649, 650, 651, 652, 645, 497, 590, + 566, 593, 506, 569, 568, 0, 0, 604, 523, 605, + 606, 414, 415, 416, 417, 372, 630, 333, 526, 443, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 597, 594, 702, 0, 653, 654, 0, 0, 520, + 521, 367, 374, 539, 376, 332, 429, 369, 504, 386, + 0, 532, 598, 533, 445, 446, 656, 659, 657, 658, + 421, 380, 383, 460, 387, 397, 448, 503, 427, 453, + 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 636, 635, 634, 633, 632, 631, 630, 0, - 0, 579, 478, 346, 300, 342, 343, 350, 690, 686, - 483, 691, 0, 308, 559, 394, 441, 366, 624, 625, - 0, 676, 254, 255, 256, 257, 258, 259, 260, 261, - 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, - 273, 274, 275, 276, 277, 278, 627, 269, 270, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 0, 0, 0, 0, 302, 678, 679, - 680, 681, 682, 0, 0, 303, 304, 305, 0, 0, - 295, 469, 296, 297, 298, 299, 0, 0, 509, 510, - 511, 534, 0, 512, 494, 558, 377, 309, 473, 501, - 688, 0, 0, 0, 0, 0, 0, 0, 609, 620, - 654, 0, 664, 665, 667, 669, 668, 671, 466, 467, - 677, 0, 673, 674, 675, 672, 398, 453, 474, 460, - 0, 694, 549, 550, 695, 660, 425, 0, 0, 564, - 598, 587, 670, 552, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 359, 0, 0, 393, 602, 583, - 594, 584, 569, 570, 571, 578, 371, 572, 573, 574, - 544, 575, 545, 576, 577, 0, 601, 551, 462, 409, - 0, 618, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1887, - 0, 0, 240, 0, 0, 0, 0, 0, 0, 328, - 241, 546, 666, 548, 547, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 637, 636, 635, 634, 633, 632, + 631, 0, 0, 580, 479, 346, 300, 342, 343, 350, + 691, 687, 484, 692, 0, 308, 560, 395, 442, 366, + 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, + 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, + 271, 272, 273, 274, 275, 276, 277, 278, 628, 269, + 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, + 679, 680, 681, 682, 683, 0, 0, 303, 304, 305, + 0, 0, 295, 470, 296, 297, 298, 299, 0, 0, + 510, 511, 512, 535, 0, 513, 495, 559, 377, 309, + 474, 502, 689, 0, 0, 0, 0, 0, 0, 0, + 610, 621, 655, 0, 665, 666, 668, 670, 669, 672, + 467, 468, 678, 0, 674, 675, 676, 673, 399, 454, + 475, 461, 0, 695, 550, 551, 696, 661, 426, 0, + 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 359, 0, 0, 394, + 603, 584, 595, 585, 570, 571, 572, 579, 371, 573, + 574, 575, 545, 576, 546, 577, 578, 0, 602, 552, + 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1888, 0, 0, 240, 0, 0, 0, 0, 0, + 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 464, 494, 0, 507, + 0, 384, 385, 0, 0, 0, 0, 0, 0, 0, + 316, 471, 491, 329, 458, 505, 334, 466, 483, 324, + 425, 455, 0, 0, 318, 489, 465, 407, 317, 0, + 449, 357, 373, 354, 423, 0, 488, 518, 353, 508, + 0, 499, 320, 0, 498, 422, 485, 490, 408, 401, + 0, 319, 487, 406, 400, 388, 363, 534, 389, 390, + 378, 437, 398, 438, 379, 412, 411, 413, 0, 0, + 0, 0, 0, 529, 530, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 660, 0, 0, 664, 0, 501, 0, 0, 0, 0, + 0, 0, 469, 0, 0, 391, 0, 0, 0, 519, + 0, 452, 428, 698, 0, 0, 450, 396, 486, 439, + 492, 472, 500, 444, 440, 310, 473, 356, 409, 325, + 327, 688, 358, 360, 364, 365, 418, 419, 433, 457, + 476, 477, 478, 355, 339, 451, 340, 375, 341, 311, + 347, 345, 348, 459, 349, 313, 434, 482, 0, 370, + 447, 404, 314, 403, 435, 481, 480, 326, 509, 516, + 517, 607, 0, 522, 699, 700, 701, 531, 0, 441, + 322, 321, 0, 0, 0, 351, 436, 335, 337, 338, + 336, 431, 432, 536, 537, 538, 540, 0, 541, 542, + 0, 0, 0, 0, 543, 608, 624, 592, 561, 524, + 616, 558, 562, 563, 381, 627, 0, 0, 0, 515, + 392, 393, 0, 362, 361, 405, 315, 0, 0, 0, + 382, 368, 306, 307, 694, 352, 424, 629, 662, 663, + 554, 0, 617, 555, 564, 344, 589, 601, 600, 420, + 514, 0, 612, 615, 544, 693, 0, 609, 623, 697, + 622, 690, 430, 0, 456, 620, 567, 0, 613, 586, + 587, 0, 614, 582, 618, 0, 556, 0, 525, 528, + 557, 642, 643, 644, 312, 527, 646, 647, 648, 649, + 650, 651, 652, 645, 497, 590, 566, 593, 506, 569, + 568, 0, 0, 604, 523, 605, 606, 414, 415, 416, + 417, 372, 630, 333, 526, 443, 0, 591, 0, 0, + 0, 0, 0, 0, 0, 0, 596, 597, 594, 702, + 0, 653, 654, 0, 0, 520, 521, 367, 374, 539, + 376, 332, 429, 369, 504, 386, 0, 532, 598, 533, + 445, 446, 656, 659, 657, 658, 421, 380, 383, 460, + 387, 397, 448, 503, 427, 453, 330, 493, 462, 402, + 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, + 637, 636, 635, 634, 633, 632, 631, 0, 0, 580, + 479, 346, 300, 342, 343, 350, 691, 687, 484, 692, + 0, 308, 560, 395, 442, 366, 625, 626, 0, 677, + 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, + 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, + 275, 276, 277, 278, 628, 269, 270, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 0, 0, 0, 302, 679, 680, 681, 682, + 683, 0, 0, 303, 304, 305, 0, 0, 295, 470, + 296, 297, 298, 299, 0, 0, 510, 511, 512, 535, + 0, 513, 495, 559, 377, 309, 474, 502, 689, 0, + 0, 0, 0, 0, 0, 0, 610, 621, 655, 0, + 665, 666, 668, 670, 669, 672, 467, 468, 678, 0, + 674, 675, 676, 673, 399, 454, 475, 461, 0, 695, + 550, 551, 696, 661, 426, 0, 0, 565, 599, 588, + 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 359, 0, 0, 394, 603, 584, 595, 585, + 570, 571, 572, 579, 371, 573, 574, 575, 545, 576, + 546, 577, 578, 0, 602, 552, 463, 410, 0, 619, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4174, 0, + 240, 0, 0, 0, 0, 0, 0, 328, 241, 547, + 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 463, 493, 0, 506, 0, 383, - 384, 0, 0, 0, 0, 0, 0, 0, 316, 470, - 490, 329, 457, 504, 334, 465, 482, 324, 424, 454, - 0, 0, 318, 488, 464, 406, 317, 0, 448, 357, - 373, 354, 422, 0, 487, 517, 353, 507, 0, 498, - 320, 0, 497, 421, 484, 489, 407, 400, 0, 319, - 486, 405, 399, 387, 363, 533, 388, 389, 378, 436, - 397, 437, 379, 411, 410, 412, 0, 0, 0, 0, - 0, 528, 529, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 659, 0, - 0, 663, 0, 500, 0, 0, 0, 0, 0, 0, - 468, 0, 0, 390, 0, 0, 0, 518, 0, 451, - 427, 697, 0, 0, 449, 395, 485, 438, 491, 471, - 499, 443, 439, 310, 472, 356, 408, 325, 327, 687, - 358, 360, 364, 365, 417, 418, 432, 456, 475, 476, - 477, 355, 339, 450, 340, 375, 341, 311, 347, 345, - 348, 458, 349, 313, 433, 481, 0, 370, 446, 403, - 314, 402, 434, 480, 479, 326, 508, 515, 516, 606, - 0, 521, 698, 699, 700, 530, 0, 440, 322, 321, - 0, 0, 0, 351, 435, 335, 337, 338, 336, 430, - 431, 535, 536, 537, 539, 0, 540, 541, 0, 0, - 0, 0, 542, 607, 623, 591, 560, 523, 615, 557, - 561, 562, 381, 626, 0, 0, 0, 514, 391, 392, - 0, 362, 361, 404, 315, 0, 0, 368, 306, 307, - 693, 352, 423, 628, 661, 662, 553, 0, 616, 554, - 563, 344, 588, 600, 599, 419, 513, 0, 611, 614, - 543, 692, 0, 608, 622, 696, 621, 689, 429, 0, - 455, 619, 566, 0, 612, 585, 586, 0, 613, 581, - 617, 0, 555, 0, 524, 527, 556, 641, 642, 643, - 312, 526, 645, 646, 647, 648, 649, 650, 651, 644, - 496, 589, 565, 592, 505, 568, 567, 0, 0, 603, - 522, 604, 605, 413, 414, 415, 416, 372, 629, 333, - 525, 442, 0, 590, 0, 0, 0, 0, 0, 0, - 0, 0, 595, 596, 593, 701, 0, 652, 653, 0, - 0, 519, 520, 367, 374, 538, 376, 332, 428, 369, - 503, 385, 0, 531, 597, 532, 444, 445, 655, 658, - 656, 657, 420, 380, 382, 459, 386, 396, 447, 502, - 426, 452, 330, 492, 461, 401, 582, 610, 0, 0, + 0, 0, 464, 494, 0, 507, 0, 384, 385, 0, + 0, 0, 0, 0, 0, 0, 316, 471, 491, 329, + 458, 505, 334, 466, 483, 324, 425, 455, 0, 0, + 318, 489, 465, 407, 317, 0, 449, 357, 373, 354, + 423, 0, 488, 518, 353, 508, 0, 499, 320, 0, + 498, 422, 485, 490, 408, 401, 0, 319, 487, 406, + 400, 388, 363, 534, 389, 390, 378, 437, 398, 438, + 379, 412, 411, 413, 0, 0, 0, 0, 0, 529, + 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 0, 0, 664, + 0, 501, 0, 0, 0, 0, 0, 0, 469, 0, + 0, 391, 0, 0, 0, 519, 0, 452, 428, 698, + 0, 0, 450, 396, 486, 439, 492, 472, 500, 444, + 440, 310, 473, 356, 409, 325, 327, 688, 358, 360, + 364, 365, 418, 419, 433, 457, 476, 477, 478, 355, + 339, 451, 340, 375, 341, 311, 347, 345, 348, 459, + 349, 313, 434, 482, 0, 370, 447, 404, 314, 403, + 435, 481, 480, 326, 509, 516, 517, 607, 0, 522, + 699, 700, 701, 531, 0, 441, 322, 321, 0, 0, + 0, 351, 436, 335, 337, 338, 336, 431, 432, 536, + 537, 538, 540, 0, 541, 542, 0, 0, 0, 0, + 543, 608, 624, 592, 561, 524, 616, 558, 562, 563, + 381, 627, 0, 0, 0, 515, 392, 393, 0, 362, + 361, 405, 315, 0, 0, 0, 382, 368, 306, 307, + 694, 352, 424, 629, 662, 663, 554, 0, 617, 555, + 564, 344, 589, 601, 600, 420, 514, 0, 612, 615, + 544, 693, 0, 609, 623, 697, 622, 690, 430, 0, + 456, 620, 567, 0, 613, 586, 587, 0, 614, 582, + 618, 0, 556, 0, 525, 528, 557, 642, 643, 644, + 312, 527, 646, 647, 648, 649, 650, 651, 652, 645, + 497, 590, 566, 593, 506, 569, 568, 0, 0, 604, + 523, 605, 606, 414, 415, 416, 417, 372, 630, 333, + 526, 443, 0, 591, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 597, 594, 702, 0, 653, 654, 0, + 0, 520, 521, 367, 374, 539, 376, 332, 429, 369, + 504, 386, 0, 532, 598, 533, 445, 446, 656, 659, + 657, 658, 421, 380, 383, 460, 387, 397, 448, 503, + 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 636, 635, 634, 633, - 632, 631, 630, 0, 0, 579, 478, 346, 300, 342, - 343, 350, 690, 686, 483, 691, 0, 308, 559, 394, - 441, 366, 624, 625, 0, 676, 254, 255, 256, 257, + 0, 0, 0, 0, 0, 638, 637, 636, 635, 634, + 633, 632, 631, 0, 0, 580, 479, 346, 300, 342, + 343, 350, 691, 687, 484, 692, 0, 308, 560, 395, + 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, 277, 278, - 627, 269, 270, 279, 280, 281, 282, 283, 284, 285, + 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, 0, 0, - 0, 302, 678, 679, 680, 681, 682, 0, 0, 303, - 304, 305, 0, 0, 295, 469, 296, 297, 298, 299, - 0, 0, 509, 510, 511, 534, 0, 512, 494, 558, - 377, 309, 473, 501, 688, 0, 0, 0, 0, 0, - 0, 0, 609, 620, 654, 0, 664, 665, 667, 669, - 668, 671, 466, 467, 677, 0, 673, 674, 675, 672, - 398, 453, 474, 460, 0, 694, 549, 550, 695, 660, - 425, 0, 0, 564, 598, 587, 670, 552, 0, 0, + 0, 302, 679, 680, 681, 682, 683, 0, 0, 303, + 304, 305, 0, 0, 295, 470, 296, 297, 298, 299, + 0, 0, 510, 511, 512, 535, 0, 513, 495, 559, + 377, 309, 474, 502, 689, 0, 0, 0, 0, 0, + 0, 0, 610, 621, 655, 0, 665, 666, 668, 670, + 669, 672, 467, 468, 678, 0, 674, 675, 676, 673, + 399, 454, 475, 461, 0, 695, 550, 551, 696, 661, + 426, 0, 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, - 0, 393, 602, 583, 594, 584, 569, 570, 571, 578, - 371, 572, 573, 574, 544, 575, 545, 576, 577, 0, - 601, 551, 462, 409, 0, 618, 0, 0, 0, 0, + 0, 394, 603, 584, 595, 585, 570, 571, 572, 579, + 371, 573, 574, 575, 545, 576, 546, 577, 578, 0, + 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4171, 0, 240, 0, 0, 0, - 0, 0, 0, 328, 241, 546, 666, 548, 547, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, + 0, 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 463, 493, - 0, 506, 0, 383, 384, 0, 0, 0, 0, 0, - 0, 0, 316, 470, 490, 329, 457, 504, 334, 465, - 482, 324, 424, 454, 0, 0, 318, 488, 464, 406, - 317, 0, 448, 357, 373, 354, 422, 0, 487, 517, - 353, 507, 0, 498, 320, 0, 497, 421, 484, 489, - 407, 400, 0, 319, 486, 405, 399, 387, 363, 533, - 388, 389, 378, 436, 397, 437, 379, 411, 410, 412, - 0, 0, 0, 0, 0, 528, 529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 659, 0, 0, 663, 0, 500, 0, 0, - 0, 0, 0, 0, 468, 0, 0, 390, 0, 0, - 0, 518, 0, 451, 427, 697, 0, 0, 449, 395, - 485, 438, 491, 471, 499, 443, 439, 310, 472, 356, - 408, 325, 327, 687, 358, 360, 364, 365, 417, 418, - 432, 456, 475, 476, 477, 355, 339, 450, 340, 375, - 341, 311, 347, 345, 348, 458, 349, 313, 433, 481, - 0, 370, 446, 403, 314, 402, 434, 480, 479, 326, - 508, 515, 516, 606, 0, 521, 698, 699, 700, 530, - 0, 440, 322, 321, 0, 0, 0, 351, 435, 335, - 337, 338, 336, 430, 431, 535, 536, 537, 539, 0, - 540, 541, 0, 0, 0, 0, 542, 607, 623, 591, - 560, 523, 615, 557, 561, 562, 381, 626, 0, 0, - 0, 514, 391, 392, 0, 362, 361, 404, 315, 0, - 0, 368, 306, 307, 693, 352, 423, 628, 661, 662, - 553, 0, 616, 554, 563, 344, 588, 600, 599, 419, - 513, 0, 611, 614, 543, 692, 0, 608, 622, 696, - 621, 689, 429, 0, 455, 619, 566, 0, 612, 585, - 586, 0, 613, 581, 617, 0, 555, 0, 524, 527, - 556, 641, 642, 643, 312, 526, 645, 646, 647, 648, - 649, 650, 651, 644, 496, 589, 565, 592, 505, 568, - 567, 0, 0, 603, 522, 604, 605, 413, 414, 415, - 416, 372, 629, 333, 525, 442, 0, 590, 0, 0, - 0, 0, 0, 0, 0, 0, 595, 596, 593, 701, - 0, 652, 653, 0, 0, 519, 520, 367, 374, 538, - 376, 332, 428, 369, 503, 385, 0, 531, 597, 532, - 444, 445, 655, 658, 656, 657, 420, 380, 382, 459, - 386, 396, 447, 502, 426, 452, 330, 492, 461, 401, - 582, 610, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 636, 635, 634, 633, 632, 631, 630, 0, 0, 579, - 478, 346, 300, 342, 343, 350, 690, 686, 483, 691, - 0, 308, 559, 394, 441, 366, 624, 625, 0, 676, - 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, - 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, - 275, 276, 277, 278, 627, 269, 270, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 0, 0, 0, 0, 302, 678, 679, 680, 681, - 682, 0, 0, 303, 304, 305, 0, 0, 295, 469, - 296, 297, 298, 299, 0, 0, 509, 510, 511, 534, - 0, 512, 494, 558, 377, 309, 473, 501, 688, 0, - 0, 0, 0, 0, 0, 0, 609, 620, 654, 0, - 664, 665, 667, 669, 668, 671, 466, 467, 677, 0, - 673, 674, 675, 672, 398, 453, 474, 460, 0, 694, - 549, 550, 695, 660, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 359, 0, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 0, 601, 551, 462, 409, 0, 618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 0, 0, 0, 0, 328, 241, 546, - 666, 548, 547, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 0, - 0, 0, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 482, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 0, 487, 517, 353, 507, 0, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 533, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 0, 0, 663, - 0, 500, 0, 0, 0, 4064, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 518, 0, 451, 427, 697, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 443, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 515, 516, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 352, - 423, 628, 661, 662, 553, 0, 616, 554, 563, 344, - 588, 600, 599, 419, 513, 0, 611, 614, 543, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 651, 644, 496, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 522, 604, - 605, 413, 414, 415, 416, 372, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 464, 494, + 0, 507, 0, 384, 385, 0, 0, 0, 0, 0, + 0, 0, 316, 471, 491, 329, 458, 505, 334, 466, + 483, 324, 425, 455, 0, 0, 318, 489, 465, 407, + 317, 0, 449, 357, 373, 354, 423, 0, 488, 518, + 353, 508, 0, 499, 320, 0, 498, 422, 485, 490, + 408, 401, 0, 319, 487, 406, 400, 388, 363, 534, + 389, 390, 378, 437, 398, 438, 379, 412, 411, 413, + 0, 0, 0, 0, 0, 529, 530, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 0, 0, 664, 0, 501, 0, 0, + 0, 4067, 0, 0, 469, 0, 0, 391, 0, 0, + 0, 519, 0, 452, 428, 698, 0, 0, 450, 396, + 486, 439, 492, 472, 500, 444, 440, 310, 473, 356, + 409, 325, 327, 688, 358, 360, 364, 365, 418, 419, + 433, 457, 476, 477, 478, 355, 339, 451, 340, 375, + 341, 311, 347, 345, 348, 459, 349, 313, 434, 482, + 0, 370, 447, 404, 314, 403, 435, 481, 480, 326, + 509, 516, 517, 607, 0, 522, 699, 700, 701, 531, + 0, 441, 322, 321, 0, 0, 0, 351, 436, 335, + 337, 338, 336, 431, 432, 536, 537, 538, 540, 0, + 541, 542, 0, 0, 0, 0, 543, 608, 624, 592, + 561, 524, 616, 558, 562, 563, 381, 627, 0, 0, + 0, 515, 392, 393, 0, 362, 361, 405, 315, 0, + 0, 0, 382, 368, 306, 307, 694, 352, 424, 629, + 662, 663, 554, 0, 617, 555, 564, 344, 589, 601, + 600, 420, 514, 0, 612, 615, 544, 693, 0, 609, + 623, 697, 622, 690, 430, 0, 456, 620, 567, 0, + 613, 586, 587, 0, 614, 582, 618, 0, 556, 0, + 525, 528, 557, 642, 643, 644, 312, 527, 646, 647, + 648, 649, 650, 651, 652, 645, 497, 590, 566, 593, + 506, 569, 568, 0, 0, 604, 523, 605, 606, 414, + 415, 416, 417, 372, 630, 333, 526, 443, 0, 591, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 597, + 594, 702, 0, 653, 654, 0, 0, 520, 521, 367, + 374, 539, 376, 332, 429, 369, 504, 386, 0, 532, + 598, 533, 445, 446, 656, 659, 657, 658, 421, 380, + 383, 460, 387, 397, 448, 503, 427, 453, 330, 493, + 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 0, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 254, 255, 256, 257, 258, 259, - 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, - 271, 272, 273, 274, 275, 276, 277, 278, 627, 269, - 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, - 678, 679, 680, 681, 682, 0, 0, 303, 304, 305, - 0, 0, 295, 469, 296, 297, 298, 299, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 668, 671, - 466, 467, 677, 0, 673, 674, 675, 672, 398, 453, - 474, 460, 0, 694, 549, 550, 695, 660, 425, 0, - 0, 564, 598, 587, 670, 552, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 359, 0, 0, 393, - 602, 583, 594, 584, 569, 570, 571, 578, 371, 572, - 573, 574, 544, 575, 545, 576, 577, 0, 601, 551, - 462, 409, 0, 618, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 3466, 0, 0, - 0, 328, 241, 546, 666, 548, 547, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 638, 637, 636, 635, 634, 633, 632, 631, 0, + 0, 580, 479, 346, 300, 342, 343, 350, 691, 687, + 484, 692, 0, 308, 560, 395, 442, 366, 625, 626, + 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, + 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, + 273, 274, 275, 276, 277, 278, 628, 269, 270, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 0, 0, 0, 302, 679, 680, + 681, 682, 683, 0, 0, 303, 304, 305, 0, 0, + 295, 470, 296, 297, 298, 299, 0, 0, 510, 511, + 512, 535, 0, 513, 495, 559, 377, 309, 474, 502, + 689, 0, 0, 0, 0, 0, 0, 0, 610, 621, + 655, 0, 665, 666, 668, 670, 669, 672, 467, 468, + 678, 0, 674, 675, 676, 673, 399, 454, 475, 461, + 0, 695, 550, 551, 696, 661, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 0, 602, 552, 463, 410, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 3467, 0, 0, 0, 328, + 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 463, 493, 0, 506, - 0, 383, 384, 0, 0, 0, 0, 0, 0, 0, - 316, 470, 490, 329, 457, 504, 334, 465, 482, 324, - 424, 454, 0, 0, 318, 488, 464, 406, 317, 0, - 448, 357, 373, 354, 422, 0, 487, 517, 353, 507, - 0, 498, 320, 0, 497, 421, 484, 489, 407, 400, - 0, 319, 486, 405, 399, 387, 363, 533, 388, 389, - 378, 436, 397, 437, 379, 411, 410, 412, 0, 0, - 0, 0, 0, 528, 529, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 659, 0, 0, 663, 0, 500, 0, 0, 0, 0, - 0, 0, 468, 0, 0, 390, 0, 0, 0, 518, - 0, 451, 427, 697, 0, 0, 449, 395, 485, 438, - 491, 471, 499, 443, 439, 310, 472, 356, 408, 325, - 327, 687, 358, 360, 364, 365, 417, 418, 432, 456, - 475, 476, 477, 355, 339, 450, 340, 375, 341, 311, - 347, 345, 348, 458, 349, 313, 433, 481, 0, 370, - 446, 403, 314, 402, 434, 480, 479, 326, 508, 515, - 516, 606, 0, 521, 698, 699, 700, 530, 0, 440, - 322, 321, 0, 0, 0, 351, 435, 335, 337, 338, - 336, 430, 431, 535, 536, 537, 539, 0, 540, 541, - 0, 0, 0, 0, 542, 607, 623, 591, 560, 523, - 615, 557, 561, 562, 381, 626, 0, 0, 0, 514, - 391, 392, 0, 362, 361, 404, 315, 0, 0, 368, - 306, 307, 693, 352, 423, 628, 661, 662, 553, 0, - 616, 554, 563, 344, 588, 600, 599, 419, 513, 0, - 611, 614, 543, 692, 0, 608, 622, 696, 621, 689, - 429, 0, 455, 619, 566, 0, 612, 585, 586, 0, - 613, 581, 617, 0, 555, 0, 524, 527, 556, 641, - 642, 643, 312, 526, 645, 646, 647, 648, 649, 650, - 651, 644, 496, 589, 565, 592, 505, 568, 567, 0, - 0, 603, 522, 604, 605, 413, 414, 415, 416, 372, - 629, 333, 525, 442, 0, 590, 0, 0, 0, 0, - 0, 0, 0, 0, 595, 596, 593, 701, 0, 652, - 653, 0, 0, 519, 520, 367, 374, 538, 376, 332, - 428, 369, 503, 385, 0, 531, 597, 532, 444, 445, - 655, 658, 656, 657, 420, 380, 382, 459, 386, 396, - 447, 502, 426, 452, 330, 492, 461, 401, 582, 610, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 0, 0, 0, 0, 0, 0, 0, 316, 471, + 491, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 0, 488, 518, 353, 508, 0, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 534, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 0, + 0, 664, 0, 501, 0, 0, 0, 0, 0, 0, + 469, 0, 0, 391, 0, 0, 0, 519, 0, 452, + 428, 698, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 0, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 352, 424, 629, 662, 663, 554, 0, + 617, 555, 564, 344, 589, 601, 600, 420, 514, 0, + 612, 615, 544, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 497, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 523, 605, 606, 414, 415, 416, 417, 372, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 636, 635, - 634, 633, 632, 631, 630, 0, 0, 579, 478, 346, - 300, 342, 343, 350, 690, 686, 483, 691, 0, 308, - 559, 394, 441, 366, 624, 625, 0, 676, 254, 255, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 0, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, - 277, 278, 627, 269, 270, 279, 280, 281, 282, 283, + 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, - 0, 0, 0, 302, 678, 679, 680, 681, 682, 0, - 0, 303, 304, 305, 0, 0, 295, 469, 296, 297, - 298, 299, 0, 0, 509, 510, 511, 534, 0, 512, - 494, 558, 377, 309, 473, 501, 688, 0, 0, 0, - 0, 0, 0, 0, 609, 620, 654, 0, 664, 665, - 667, 669, 668, 671, 466, 467, 677, 0, 673, 674, - 675, 672, 398, 453, 474, 460, 0, 694, 549, 550, - 695, 660, 425, 0, 0, 564, 598, 587, 670, 552, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 359, 0, 0, 393, 602, 583, 594, 584, 569, 570, - 571, 578, 371, 572, 573, 574, 544, 575, 545, 576, - 577, 0, 601, 551, 462, 409, 0, 618, 0, 0, + 0, 0, 0, 302, 679, 680, 681, 682, 683, 0, + 0, 303, 304, 305, 0, 0, 295, 470, 296, 297, + 298, 299, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 669, 672, 467, 468, 678, 0, 674, 675, + 676, 673, 399, 454, 475, 461, 0, 695, 550, 551, + 696, 661, 426, 0, 0, 565, 599, 588, 671, 553, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 359, 0, 0, 394, 603, 584, 595, 585, 570, 571, + 572, 579, 371, 573, 574, 575, 545, 576, 546, 577, + 578, 0, 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 3912, 0, 0, 0, 328, 241, 546, 666, 548, - 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3913, 0, 0, 0, 328, 241, 547, 667, 549, + 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 463, 493, 0, 506, 0, 383, 384, 0, 0, 0, - 0, 0, 0, 0, 316, 470, 490, 329, 457, 504, - 334, 465, 482, 324, 424, 454, 0, 0, 318, 488, - 464, 406, 317, 0, 448, 357, 373, 354, 422, 0, - 487, 517, 353, 507, 0, 498, 320, 0, 497, 421, - 484, 489, 407, 400, 0, 319, 486, 405, 399, 387, - 363, 533, 388, 389, 378, 436, 397, 437, 379, 411, - 410, 412, 0, 0, 0, 0, 0, 528, 529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 659, 0, 0, 663, 0, 500, - 0, 0, 0, 0, 0, 0, 468, 0, 0, 390, - 0, 0, 0, 518, 0, 451, 427, 697, 0, 0, - 449, 395, 485, 438, 491, 471, 499, 443, 439, 310, - 472, 356, 408, 325, 327, 687, 358, 360, 364, 365, - 417, 418, 432, 456, 475, 476, 477, 355, 339, 450, - 340, 375, 341, 311, 347, 345, 348, 458, 349, 313, - 433, 481, 0, 370, 446, 403, 314, 402, 434, 480, - 479, 326, 508, 515, 516, 606, 0, 521, 698, 699, - 700, 530, 0, 440, 322, 321, 0, 0, 0, 351, - 435, 335, 337, 338, 336, 430, 431, 535, 536, 537, - 539, 0, 540, 541, 0, 0, 0, 0, 542, 607, - 623, 591, 560, 523, 615, 557, 561, 562, 381, 626, - 0, 0, 0, 514, 391, 392, 0, 362, 361, 404, - 315, 0, 0, 368, 306, 307, 693, 352, 423, 628, - 661, 662, 553, 0, 616, 554, 563, 344, 588, 600, - 599, 419, 513, 0, 611, 614, 543, 692, 0, 608, - 622, 696, 621, 689, 429, 0, 455, 619, 566, 0, - 612, 585, 586, 0, 613, 581, 617, 0, 555, 0, - 524, 527, 556, 641, 642, 643, 312, 526, 645, 646, - 647, 648, 649, 650, 651, 644, 496, 589, 565, 592, - 505, 568, 567, 0, 0, 603, 522, 604, 605, 413, - 414, 415, 416, 372, 629, 333, 525, 442, 0, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 595, 596, - 593, 701, 0, 652, 653, 0, 0, 519, 520, 367, - 374, 538, 376, 332, 428, 369, 503, 385, 0, 531, - 597, 532, 444, 445, 655, 658, 656, 657, 420, 380, - 382, 459, 386, 396, 447, 502, 426, 452, 330, 492, - 461, 401, 582, 610, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, + 464, 494, 0, 507, 0, 384, 385, 0, 0, 0, + 0, 0, 0, 0, 316, 471, 491, 329, 458, 505, + 334, 466, 483, 324, 425, 455, 0, 0, 318, 489, + 465, 407, 317, 0, 449, 357, 373, 354, 423, 0, + 488, 518, 353, 508, 0, 499, 320, 0, 498, 422, + 485, 490, 408, 401, 0, 319, 487, 406, 400, 388, + 363, 534, 389, 390, 378, 437, 398, 438, 379, 412, + 411, 413, 0, 0, 0, 0, 0, 529, 530, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 660, 0, 0, 664, 0, 501, + 0, 0, 0, 0, 0, 0, 469, 0, 0, 391, + 0, 0, 0, 519, 0, 452, 428, 698, 0, 0, + 450, 396, 486, 439, 492, 472, 500, 444, 440, 310, + 473, 356, 409, 325, 327, 688, 358, 360, 364, 365, + 418, 419, 433, 457, 476, 477, 478, 355, 339, 451, + 340, 375, 341, 311, 347, 345, 348, 459, 349, 313, + 434, 482, 0, 370, 447, 404, 314, 403, 435, 481, + 480, 326, 509, 516, 517, 607, 0, 522, 699, 700, + 701, 531, 0, 441, 322, 321, 0, 0, 0, 351, + 436, 335, 337, 338, 336, 431, 432, 536, 537, 538, + 540, 0, 541, 542, 0, 0, 0, 0, 543, 608, + 624, 592, 561, 524, 616, 558, 562, 563, 381, 627, + 0, 0, 0, 515, 392, 393, 0, 362, 361, 405, + 315, 0, 0, 0, 382, 368, 306, 307, 694, 352, + 424, 629, 662, 663, 554, 0, 617, 555, 564, 344, + 589, 601, 600, 420, 514, 0, 612, 615, 544, 693, + 0, 609, 623, 697, 622, 690, 430, 0, 456, 620, + 567, 0, 613, 586, 587, 0, 614, 582, 618, 0, + 556, 0, 525, 528, 557, 642, 643, 644, 312, 527, + 646, 647, 648, 649, 650, 651, 652, 645, 497, 590, + 566, 593, 506, 569, 568, 0, 0, 604, 523, 605, + 606, 414, 415, 416, 417, 372, 630, 333, 526, 443, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 597, 594, 702, 0, 653, 654, 0, 0, 520, + 521, 367, 374, 539, 376, 332, 429, 369, 504, 386, + 0, 532, 598, 533, 445, 446, 656, 659, 657, 658, + 421, 380, 383, 460, 387, 397, 448, 503, 427, 453, + 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 636, 635, 634, 633, 632, 631, 630, 0, - 0, 579, 478, 346, 300, 342, 343, 350, 690, 686, - 483, 691, 0, 308, 559, 394, 441, 366, 624, 625, - 0, 676, 254, 255, 256, 257, 258, 259, 260, 261, - 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, - 273, 274, 275, 276, 277, 278, 627, 269, 270, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 0, 0, 0, 0, 302, 678, 679, - 680, 681, 682, 0, 0, 303, 304, 305, 0, 0, - 295, 469, 296, 297, 298, 299, 0, 0, 509, 510, - 511, 534, 0, 512, 494, 558, 377, 309, 473, 501, - 688, 0, 0, 0, 0, 0, 0, 0, 609, 620, - 654, 0, 664, 665, 667, 669, 668, 671, 466, 467, - 677, 0, 673, 674, 675, 672, 398, 453, 474, 460, - 0, 694, 549, 550, 695, 660, 425, 0, 0, 564, - 598, 587, 670, 552, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 359, 0, 0, 393, 602, 583, - 594, 584, 569, 570, 571, 578, 371, 572, 573, 574, - 544, 575, 545, 576, 577, 0, 601, 551, 462, 409, - 0, 618, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 637, 636, 635, 634, 633, 632, + 631, 0, 0, 580, 479, 346, 300, 342, 343, 350, + 691, 687, 484, 692, 0, 308, 560, 395, 442, 366, + 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, + 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, + 271, 272, 273, 274, 275, 276, 277, 278, 628, 269, + 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, + 679, 680, 681, 682, 683, 0, 0, 303, 304, 305, + 0, 0, 295, 470, 296, 297, 298, 299, 0, 0, + 510, 511, 512, 535, 0, 513, 495, 559, 377, 309, + 474, 502, 689, 0, 0, 0, 0, 0, 0, 0, + 610, 621, 655, 0, 665, 666, 668, 670, 669, 672, + 467, 468, 678, 0, 674, 675, 676, 673, 399, 454, + 475, 461, 0, 695, 550, 551, 696, 661, 426, 0, + 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 359, 0, 0, 394, + 603, 584, 595, 585, 570, 571, 572, 579, 371, 573, + 574, 575, 545, 576, 546, 577, 578, 0, 602, 552, + 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, + 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3492, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 464, 494, 0, 507, + 0, 384, 385, 0, 0, 0, 0, 0, 0, 0, + 316, 471, 491, 329, 458, 505, 334, 466, 483, 324, + 425, 455, 0, 0, 318, 489, 465, 407, 317, 0, + 449, 357, 373, 354, 423, 0, 488, 518, 353, 508, + 0, 499, 320, 0, 498, 422, 485, 490, 408, 401, + 0, 319, 487, 406, 400, 388, 363, 534, 389, 390, + 378, 437, 398, 438, 379, 412, 411, 413, 0, 0, + 0, 0, 0, 529, 530, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 660, 0, 0, 664, 0, 501, 0, 0, 0, 0, + 0, 0, 469, 0, 0, 391, 0, 0, 0, 519, + 0, 452, 428, 698, 0, 0, 450, 396, 486, 439, + 492, 472, 500, 444, 440, 310, 473, 356, 409, 325, + 327, 688, 358, 360, 364, 365, 418, 419, 433, 457, + 476, 477, 478, 355, 339, 451, 340, 375, 341, 311, + 347, 345, 348, 459, 349, 313, 434, 482, 0, 370, + 447, 404, 314, 403, 435, 481, 480, 326, 509, 516, + 517, 607, 0, 522, 699, 700, 701, 531, 0, 441, + 322, 321, 0, 0, 0, 351, 436, 335, 337, 338, + 336, 431, 432, 536, 537, 538, 540, 0, 541, 542, + 0, 0, 0, 0, 543, 608, 624, 592, 561, 524, + 616, 558, 562, 563, 381, 627, 0, 0, 0, 515, + 392, 393, 0, 362, 361, 405, 315, 0, 0, 0, + 382, 368, 306, 307, 694, 352, 424, 629, 662, 663, + 554, 0, 617, 555, 564, 344, 589, 601, 600, 420, + 514, 0, 612, 615, 544, 693, 0, 609, 623, 697, + 622, 690, 430, 0, 456, 620, 567, 0, 613, 586, + 587, 0, 614, 582, 618, 0, 556, 0, 525, 528, + 557, 642, 643, 644, 312, 527, 646, 647, 648, 649, + 650, 651, 652, 645, 497, 590, 566, 593, 506, 569, + 568, 0, 0, 604, 523, 605, 606, 414, 415, 416, + 417, 372, 630, 333, 526, 443, 0, 591, 0, 0, + 0, 0, 0, 0, 0, 0, 596, 597, 594, 702, + 0, 653, 654, 0, 0, 520, 521, 367, 374, 539, + 376, 332, 429, 369, 504, 386, 0, 532, 598, 533, + 445, 446, 656, 659, 657, 658, 421, 380, 383, 460, + 387, 397, 448, 503, 427, 453, 330, 493, 462, 402, + 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, + 637, 636, 635, 634, 633, 632, 631, 0, 0, 580, + 479, 346, 300, 342, 343, 350, 691, 687, 484, 692, + 0, 308, 560, 395, 442, 366, 625, 626, 0, 677, + 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, + 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, + 275, 276, 277, 278, 628, 269, 270, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 0, 0, 0, 302, 679, 680, 681, 682, + 683, 0, 0, 303, 304, 305, 0, 0, 295, 470, + 296, 297, 298, 299, 0, 0, 510, 511, 512, 535, + 0, 513, 495, 559, 377, 309, 474, 502, 689, 0, + 0, 0, 0, 0, 0, 0, 610, 621, 655, 0, + 665, 666, 668, 670, 669, 672, 467, 468, 678, 0, + 674, 675, 676, 673, 399, 454, 475, 461, 0, 695, + 550, 551, 696, 661, 426, 0, 0, 565, 599, 588, + 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 359, 0, 0, 394, 603, 584, 595, 585, + 570, 571, 572, 579, 371, 573, 574, 575, 545, 576, + 546, 577, 578, 0, 602, 552, 463, 410, 0, 619, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2218, 0, 0, + 240, 0, 0, 0, 0, 0, 0, 328, 241, 547, + 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 0, 0, 0, 0, 328, - 241, 546, 666, 548, 547, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3491, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 463, 493, 0, 506, 0, 383, - 384, 0, 0, 0, 0, 0, 0, 0, 316, 470, - 490, 329, 457, 504, 334, 465, 482, 324, 424, 454, - 0, 0, 318, 488, 464, 406, 317, 0, 448, 357, - 373, 354, 422, 0, 487, 517, 353, 507, 0, 498, - 320, 0, 497, 421, 484, 489, 407, 400, 0, 319, - 486, 405, 399, 387, 363, 533, 388, 389, 378, 436, - 397, 437, 379, 411, 410, 412, 0, 0, 0, 0, - 0, 528, 529, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 659, 0, - 0, 663, 0, 500, 0, 0, 0, 0, 0, 0, - 468, 0, 0, 390, 0, 0, 0, 518, 0, 451, - 427, 697, 0, 0, 449, 395, 485, 438, 491, 471, - 499, 443, 439, 310, 472, 356, 408, 325, 327, 687, - 358, 360, 364, 365, 417, 418, 432, 456, 475, 476, - 477, 355, 339, 450, 340, 375, 341, 311, 347, 345, - 348, 458, 349, 313, 433, 481, 0, 370, 446, 403, - 314, 402, 434, 480, 479, 326, 508, 515, 516, 606, - 0, 521, 698, 699, 700, 530, 0, 440, 322, 321, - 0, 0, 0, 351, 435, 335, 337, 338, 336, 430, - 431, 535, 536, 537, 539, 0, 540, 541, 0, 0, - 0, 0, 542, 607, 623, 591, 560, 523, 615, 557, - 561, 562, 381, 626, 0, 0, 0, 514, 391, 392, - 0, 362, 361, 404, 315, 0, 0, 368, 306, 307, - 693, 352, 423, 628, 661, 662, 553, 0, 616, 554, - 563, 344, 588, 600, 599, 419, 513, 0, 611, 614, - 543, 692, 0, 608, 622, 696, 621, 689, 429, 0, - 455, 619, 566, 0, 612, 585, 586, 0, 613, 581, - 617, 0, 555, 0, 524, 527, 556, 641, 642, 643, - 312, 526, 645, 646, 647, 648, 649, 650, 651, 644, - 496, 589, 565, 592, 505, 568, 567, 0, 0, 603, - 522, 604, 605, 413, 414, 415, 416, 372, 629, 333, - 525, 442, 0, 590, 0, 0, 0, 0, 0, 0, - 0, 0, 595, 596, 593, 701, 0, 652, 653, 0, - 0, 519, 520, 367, 374, 538, 376, 332, 428, 369, - 503, 385, 0, 531, 597, 532, 444, 445, 655, 658, - 656, 657, 420, 380, 382, 459, 386, 396, 447, 502, - 426, 452, 330, 492, 461, 401, 582, 610, 0, 0, + 0, 0, 464, 494, 0, 507, 0, 384, 385, 0, + 0, 0, 0, 0, 0, 0, 316, 471, 491, 329, + 458, 505, 334, 466, 483, 324, 425, 455, 0, 0, + 318, 489, 465, 407, 317, 0, 449, 357, 373, 354, + 423, 0, 488, 518, 353, 508, 0, 499, 320, 0, + 498, 422, 485, 490, 408, 401, 0, 319, 487, 406, + 400, 388, 363, 534, 389, 390, 378, 437, 398, 438, + 379, 412, 411, 413, 0, 0, 0, 0, 0, 529, + 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 0, 0, 664, + 0, 501, 0, 0, 0, 0, 0, 0, 469, 0, + 0, 391, 0, 0, 0, 519, 0, 452, 428, 698, + 0, 0, 450, 396, 486, 439, 492, 472, 500, 444, + 440, 310, 473, 356, 409, 325, 327, 688, 358, 360, + 364, 365, 418, 419, 433, 457, 476, 477, 478, 355, + 339, 451, 340, 375, 341, 311, 347, 345, 348, 459, + 349, 313, 434, 482, 0, 370, 447, 404, 314, 403, + 435, 481, 480, 326, 509, 516, 517, 607, 0, 522, + 699, 700, 701, 531, 0, 441, 322, 321, 0, 0, + 0, 351, 436, 335, 337, 338, 336, 431, 432, 536, + 537, 538, 540, 0, 541, 542, 0, 0, 0, 0, + 543, 608, 624, 592, 561, 524, 616, 558, 562, 563, + 381, 627, 0, 0, 0, 515, 392, 393, 0, 362, + 361, 405, 315, 0, 0, 0, 382, 368, 306, 307, + 694, 352, 424, 629, 662, 663, 554, 0, 617, 555, + 564, 344, 589, 601, 600, 420, 514, 0, 612, 615, + 544, 693, 0, 609, 623, 697, 622, 690, 430, 0, + 456, 620, 567, 0, 613, 586, 587, 0, 614, 582, + 618, 0, 556, 0, 525, 528, 557, 642, 643, 644, + 312, 527, 646, 647, 648, 649, 650, 651, 652, 645, + 497, 590, 566, 593, 506, 569, 568, 0, 0, 604, + 523, 605, 606, 414, 415, 416, 417, 372, 630, 333, + 526, 443, 0, 591, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 597, 594, 702, 0, 653, 654, 0, + 0, 520, 521, 367, 374, 539, 376, 332, 429, 369, + 504, 386, 0, 532, 598, 533, 445, 446, 656, 659, + 657, 658, 421, 380, 383, 460, 387, 397, 448, 503, + 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 636, 635, 634, 633, - 632, 631, 630, 0, 0, 579, 478, 346, 300, 342, - 343, 350, 690, 686, 483, 691, 0, 308, 559, 394, - 441, 366, 624, 625, 0, 676, 254, 255, 256, 257, + 0, 0, 0, 0, 0, 638, 637, 636, 635, 634, + 633, 632, 631, 0, 0, 580, 479, 346, 300, 342, + 343, 350, 691, 687, 484, 692, 0, 308, 560, 395, + 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, 277, 278, - 627, 269, 270, 279, 280, 281, 282, 283, 284, 285, + 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, 0, 0, - 0, 302, 678, 679, 680, 681, 682, 0, 0, 303, - 304, 305, 0, 0, 295, 469, 296, 297, 298, 299, - 0, 0, 509, 510, 511, 534, 0, 512, 494, 558, - 377, 309, 473, 501, 688, 0, 0, 0, 0, 0, - 0, 0, 609, 620, 654, 0, 664, 665, 667, 669, - 668, 671, 466, 467, 677, 0, 673, 674, 675, 672, - 398, 453, 474, 460, 0, 694, 549, 550, 695, 660, - 425, 0, 0, 564, 598, 587, 670, 552, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, - 0, 393, 602, 583, 594, 584, 569, 570, 571, 578, - 371, 572, 573, 574, 544, 575, 545, 576, 577, 0, - 601, 551, 462, 409, 0, 618, 0, 0, 0, 0, + 0, 302, 679, 680, 681, 682, 683, 0, 0, 303, + 304, 305, 0, 0, 295, 470, 296, 297, 298, 299, + 0, 0, 510, 511, 512, 535, 0, 513, 495, 559, + 377, 309, 474, 502, 689, 0, 0, 0, 0, 0, + 0, 0, 610, 621, 655, 0, 665, 666, 668, 670, + 669, 672, 467, 468, 678, 0, 674, 675, 676, 673, + 399, 454, 475, 461, 0, 695, 550, 551, 696, 661, + 426, 0, 0, 565, 599, 588, 671, 553, 0, 0, + 3716, 0, 0, 0, 0, 0, 0, 0, 359, 0, + 0, 394, 603, 584, 595, 585, 570, 571, 572, 579, + 371, 573, 574, 575, 545, 576, 546, 577, 578, 0, + 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2217, 0, 0, 240, 0, 0, 0, - 0, 0, 0, 328, 241, 546, 666, 548, 547, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, + 0, 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 463, 493, - 0, 506, 0, 383, 384, 0, 0, 0, 0, 0, - 0, 0, 316, 470, 490, 329, 457, 504, 334, 465, - 482, 324, 424, 454, 0, 0, 318, 488, 464, 406, - 317, 0, 448, 357, 373, 354, 422, 0, 487, 517, - 353, 507, 0, 498, 320, 0, 497, 421, 484, 489, - 407, 400, 0, 319, 486, 405, 399, 387, 363, 533, - 388, 389, 378, 436, 397, 437, 379, 411, 410, 412, - 0, 0, 0, 0, 0, 528, 529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 659, 0, 0, 663, 0, 500, 0, 0, - 0, 0, 0, 0, 468, 0, 0, 390, 0, 0, - 0, 518, 0, 451, 427, 697, 0, 0, 449, 395, - 485, 438, 491, 471, 499, 443, 439, 310, 472, 356, - 408, 325, 327, 687, 358, 360, 364, 365, 417, 418, - 432, 456, 475, 476, 477, 355, 339, 450, 340, 375, - 341, 311, 347, 345, 348, 458, 349, 313, 433, 481, - 0, 370, 446, 403, 314, 402, 434, 480, 479, 326, - 508, 515, 516, 606, 0, 521, 698, 699, 700, 530, - 0, 440, 322, 321, 0, 0, 0, 351, 435, 335, - 337, 338, 336, 430, 431, 535, 536, 537, 539, 0, - 540, 541, 0, 0, 0, 0, 542, 607, 623, 591, - 560, 523, 615, 557, 561, 562, 381, 626, 0, 0, - 0, 514, 391, 392, 0, 362, 361, 404, 315, 0, - 0, 368, 306, 307, 693, 352, 423, 628, 661, 662, - 553, 0, 616, 554, 563, 344, 588, 600, 599, 419, - 513, 0, 611, 614, 543, 692, 0, 608, 622, 696, - 621, 689, 429, 0, 455, 619, 566, 0, 612, 585, - 586, 0, 613, 581, 617, 0, 555, 0, 524, 527, - 556, 641, 642, 643, 312, 526, 645, 646, 647, 648, - 649, 650, 651, 644, 496, 589, 565, 592, 505, 568, - 567, 0, 0, 603, 522, 604, 605, 413, 414, 415, - 416, 372, 629, 333, 525, 442, 0, 590, 0, 0, - 0, 0, 0, 0, 0, 0, 595, 596, 593, 701, - 0, 652, 653, 0, 0, 519, 520, 367, 374, 538, - 376, 332, 428, 369, 503, 385, 0, 531, 597, 532, - 444, 445, 655, 658, 656, 657, 420, 380, 382, 459, - 386, 396, 447, 502, 426, 452, 330, 492, 461, 401, - 582, 610, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 636, 635, 634, 633, 632, 631, 630, 0, 0, 579, - 478, 346, 300, 342, 343, 350, 690, 686, 483, 691, - 0, 308, 559, 394, 441, 366, 624, 625, 0, 676, - 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, - 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, - 275, 276, 277, 278, 627, 269, 270, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 0, 0, 0, 0, 302, 678, 679, 680, 681, - 682, 0, 0, 303, 304, 305, 0, 0, 295, 469, - 296, 297, 298, 299, 0, 0, 509, 510, 511, 534, - 0, 512, 494, 558, 377, 309, 473, 501, 688, 0, - 0, 0, 0, 0, 0, 0, 609, 620, 654, 0, - 664, 665, 667, 669, 668, 671, 466, 467, 677, 0, - 673, 674, 675, 672, 398, 453, 474, 460, 0, 694, - 549, 550, 695, 660, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 3715, 0, 0, 0, 0, 0, - 0, 0, 359, 0, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 0, 601, 551, 462, 409, 0, 618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 0, 0, 0, 0, 328, 241, 546, - 666, 548, 547, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 0, - 0, 0, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 482, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 0, 487, 517, 353, 507, 0, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 533, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 0, 0, 663, - 0, 500, 0, 0, 0, 0, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 518, 0, 451, 427, 697, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 443, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 515, 516, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 352, - 423, 628, 661, 662, 553, 0, 616, 554, 563, 344, - 588, 600, 599, 419, 513, 0, 611, 614, 543, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 651, 644, 496, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 522, 604, - 605, 413, 414, 415, 416, 372, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 464, 494, + 0, 507, 0, 384, 385, 0, 0, 0, 0, 0, + 0, 0, 316, 471, 491, 329, 458, 505, 334, 466, + 483, 324, 425, 455, 0, 0, 318, 489, 465, 407, + 317, 0, 449, 357, 373, 354, 423, 0, 488, 518, + 353, 508, 0, 499, 320, 0, 498, 422, 485, 490, + 408, 401, 0, 319, 487, 406, 400, 388, 363, 534, + 389, 390, 378, 437, 398, 438, 379, 412, 411, 413, + 0, 0, 0, 0, 0, 529, 530, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 0, 0, 664, 0, 501, 0, 0, + 0, 0, 0, 0, 469, 0, 0, 391, 0, 0, + 0, 519, 0, 452, 428, 698, 0, 0, 450, 396, + 486, 439, 492, 472, 500, 444, 440, 310, 473, 356, + 409, 325, 327, 688, 358, 360, 364, 365, 418, 419, + 433, 457, 476, 477, 478, 355, 339, 451, 340, 375, + 341, 311, 347, 345, 348, 459, 349, 313, 434, 482, + 0, 370, 447, 404, 314, 403, 435, 481, 480, 326, + 509, 516, 517, 607, 0, 522, 699, 700, 701, 531, + 0, 441, 322, 321, 0, 0, 0, 351, 436, 335, + 337, 338, 336, 431, 432, 536, 537, 538, 540, 0, + 541, 542, 0, 0, 0, 0, 543, 608, 624, 592, + 561, 524, 616, 558, 562, 563, 381, 627, 0, 0, + 0, 515, 392, 393, 0, 362, 361, 405, 315, 0, + 0, 0, 382, 368, 306, 307, 694, 352, 424, 629, + 662, 663, 554, 0, 617, 555, 564, 344, 589, 601, + 600, 420, 514, 0, 612, 615, 544, 693, 0, 609, + 623, 697, 622, 690, 430, 0, 456, 620, 567, 0, + 613, 586, 587, 0, 614, 582, 618, 0, 556, 0, + 525, 528, 557, 642, 643, 644, 312, 527, 646, 647, + 648, 649, 650, 651, 652, 645, 497, 590, 566, 593, + 506, 569, 568, 0, 0, 604, 523, 605, 606, 414, + 415, 416, 417, 372, 630, 333, 526, 443, 0, 591, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 597, + 594, 702, 0, 653, 654, 0, 0, 520, 521, 367, + 374, 539, 376, 332, 429, 369, 504, 386, 0, 532, + 598, 533, 445, 446, 656, 659, 657, 658, 421, 380, + 383, 460, 387, 397, 448, 503, 427, 453, 330, 493, + 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 0, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 254, 255, 256, 257, 258, 259, - 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, - 271, 272, 273, 274, 275, 276, 277, 278, 627, 269, - 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, - 678, 679, 680, 681, 682, 0, 0, 303, 304, 305, - 0, 0, 295, 469, 296, 297, 298, 299, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 668, 671, - 466, 467, 677, 0, 673, 674, 675, 672, 398, 453, - 474, 460, 0, 694, 549, 550, 695, 660, 425, 0, - 0, 564, 598, 587, 670, 552, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 359, 0, 0, 393, - 602, 583, 594, 584, 569, 570, 571, 578, 371, 572, - 573, 574, 544, 575, 545, 576, 577, 0, 601, 551, - 462, 409, 0, 618, 0, 0, 0, 0, 0, 0, + 0, 638, 637, 636, 635, 634, 633, 632, 631, 0, + 0, 580, 479, 346, 300, 342, 343, 350, 691, 687, + 484, 692, 0, 308, 560, 395, 442, 366, 625, 626, + 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, + 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, + 273, 274, 275, 276, 277, 278, 628, 269, 270, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 0, 0, 0, 302, 679, 680, + 681, 682, 683, 0, 0, 303, 304, 305, 0, 0, + 295, 470, 296, 297, 298, 299, 0, 0, 510, 511, + 512, 535, 0, 513, 495, 559, 377, 309, 474, 502, + 689, 0, 0, 0, 0, 0, 0, 0, 610, 621, + 655, 0, 665, 666, 668, 670, 669, 672, 467, 468, + 678, 0, 674, 675, 676, 673, 399, 454, 475, 461, + 0, 695, 550, 551, 696, 661, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 0, 602, 552, 463, 410, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, - 0, 328, 241, 546, 666, 548, 547, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 0, 240, 0, 0, 0, 0, 0, 0, 328, + 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3605, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 463, 493, 0, 506, - 0, 383, 384, 0, 0, 0, 0, 0, 0, 0, - 316, 470, 490, 329, 457, 504, 334, 465, 482, 324, - 424, 454, 0, 0, 318, 488, 464, 406, 317, 0, - 448, 357, 373, 354, 422, 0, 487, 517, 353, 507, - 0, 498, 320, 0, 497, 421, 484, 489, 407, 400, - 0, 319, 486, 405, 399, 387, 363, 533, 388, 389, - 378, 436, 397, 437, 379, 411, 410, 412, 0, 0, - 0, 0, 0, 528, 529, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 659, 0, 0, 663, 0, 500, 0, 0, 0, 0, - 0, 0, 468, 0, 0, 390, 0, 0, 0, 518, - 0, 451, 427, 697, 0, 0, 449, 395, 485, 438, - 491, 471, 499, 443, 439, 310, 472, 356, 408, 325, - 327, 687, 358, 360, 364, 365, 417, 418, 432, 456, - 475, 476, 477, 355, 339, 450, 340, 375, 341, 311, - 347, 345, 348, 458, 349, 313, 433, 481, 0, 370, - 446, 403, 314, 402, 434, 480, 479, 326, 508, 515, - 516, 606, 0, 521, 698, 699, 700, 530, 0, 440, - 322, 321, 0, 0, 0, 351, 435, 335, 337, 338, - 336, 430, 431, 535, 536, 537, 539, 0, 540, 541, - 0, 0, 0, 0, 542, 607, 623, 591, 560, 523, - 615, 557, 561, 562, 381, 626, 0, 0, 0, 514, - 391, 392, 0, 362, 361, 404, 315, 0, 0, 368, - 306, 307, 693, 352, 423, 628, 661, 662, 553, 0, - 616, 554, 563, 344, 588, 600, 599, 419, 513, 0, - 611, 614, 543, 692, 0, 608, 622, 696, 621, 689, - 429, 0, 455, 619, 566, 0, 612, 585, 586, 0, - 613, 581, 617, 0, 555, 0, 524, 527, 556, 641, - 642, 643, 312, 526, 645, 646, 647, 648, 649, 650, - 651, 644, 496, 589, 565, 592, 505, 568, 567, 0, - 0, 603, 522, 604, 605, 413, 414, 415, 416, 372, - 629, 333, 525, 442, 0, 590, 0, 0, 0, 0, - 0, 0, 0, 0, 595, 596, 593, 701, 0, 652, - 653, 0, 0, 519, 520, 367, 374, 538, 376, 332, - 428, 369, 503, 385, 0, 531, 597, 532, 444, 445, - 655, 658, 656, 657, 420, 380, 382, 459, 386, 396, - 447, 502, 426, 452, 330, 492, 461, 401, 582, 610, + 0, 0, 3606, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 0, 0, 0, 0, 0, 0, 0, 316, 471, + 491, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 0, 488, 518, 353, 508, 0, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 534, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 0, + 0, 664, 0, 501, 0, 0, 0, 0, 0, 0, + 469, 0, 0, 391, 0, 0, 0, 519, 0, 452, + 428, 698, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 0, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 352, 424, 629, 662, 663, 554, 0, + 617, 555, 564, 344, 589, 601, 600, 420, 514, 0, + 612, 615, 544, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 497, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 523, 605, 606, 414, 415, 416, 417, 372, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 636, 635, - 634, 633, 632, 631, 630, 0, 0, 579, 478, 346, - 300, 342, 343, 350, 690, 686, 483, 691, 0, 308, - 559, 394, 441, 366, 624, 625, 0, 676, 254, 255, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 0, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, - 277, 278, 627, 269, 270, 279, 280, 281, 282, 283, + 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, - 0, 0, 0, 302, 678, 679, 680, 681, 682, 0, - 0, 303, 304, 305, 0, 0, 295, 469, 296, 297, - 298, 299, 0, 0, 509, 510, 511, 534, 0, 512, - 494, 558, 377, 309, 473, 501, 688, 0, 0, 0, - 0, 0, 0, 0, 609, 620, 654, 0, 664, 665, - 667, 669, 668, 671, 466, 467, 677, 0, 673, 674, - 675, 672, 398, 453, 474, 460, 0, 694, 549, 550, - 695, 660, 425, 0, 0, 564, 598, 587, 670, 552, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 359, 0, 0, 393, 602, 583, 594, 584, 569, 570, - 571, 578, 371, 572, 573, 574, 544, 575, 545, 576, - 577, 0, 601, 551, 462, 409, 0, 618, 0, 0, + 0, 0, 0, 302, 679, 680, 681, 682, 683, 0, + 0, 303, 304, 305, 0, 0, 295, 470, 296, 297, + 298, 299, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 669, 672, 467, 468, 678, 0, 674, 675, + 676, 673, 399, 454, 475, 461, 0, 695, 550, 551, + 696, 661, 426, 0, 0, 565, 599, 588, 671, 553, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 359, 0, 0, 394, 603, 584, 595, 585, 570, 571, + 572, 579, 371, 573, 574, 575, 545, 576, 546, 577, + 578, 0, 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 3471, 0, 0, 0, 328, 241, 546, 666, 548, - 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3472, 0, 0, 0, 328, 241, 547, 667, 549, + 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 463, 493, 0, 506, 0, 383, 384, 0, 0, 0, - 0, 0, 0, 0, 316, 470, 490, 329, 457, 504, - 334, 465, 482, 324, 424, 454, 0, 0, 318, 488, - 464, 406, 317, 0, 448, 357, 373, 354, 422, 0, - 487, 517, 353, 507, 0, 498, 320, 0, 497, 421, - 484, 489, 407, 400, 0, 319, 486, 405, 399, 387, - 363, 533, 388, 389, 378, 436, 397, 437, 379, 411, - 410, 412, 0, 0, 0, 0, 0, 528, 529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 659, 0, 0, 663, 0, 500, - 0, 0, 0, 0, 0, 0, 468, 0, 0, 390, - 0, 0, 0, 518, 0, 451, 427, 697, 0, 0, - 449, 395, 485, 438, 491, 471, 499, 443, 439, 310, - 472, 356, 408, 325, 327, 687, 358, 360, 364, 365, - 417, 418, 432, 456, 475, 476, 477, 355, 339, 450, - 340, 375, 341, 311, 347, 345, 348, 458, 349, 313, - 433, 481, 0, 370, 446, 403, 314, 402, 434, 480, - 479, 326, 508, 515, 516, 606, 0, 521, 698, 699, - 700, 530, 0, 440, 322, 321, 0, 0, 0, 351, - 435, 335, 337, 338, 336, 430, 431, 535, 536, 537, - 539, 0, 540, 541, 0, 0, 0, 0, 542, 607, - 623, 591, 560, 523, 615, 557, 561, 562, 381, 626, - 0, 0, 0, 514, 391, 392, 0, 362, 361, 404, - 315, 0, 0, 368, 306, 307, 693, 352, 423, 628, - 661, 662, 553, 0, 616, 554, 563, 344, 588, 600, - 599, 419, 513, 0, 611, 614, 543, 692, 0, 608, - 622, 696, 621, 689, 429, 0, 455, 619, 566, 0, - 612, 585, 586, 0, 613, 581, 617, 0, 555, 0, - 524, 527, 556, 641, 642, 643, 312, 526, 645, 646, - 647, 648, 649, 650, 651, 644, 496, 589, 565, 592, - 505, 568, 567, 0, 0, 603, 522, 604, 605, 413, - 414, 415, 416, 372, 629, 333, 525, 442, 0, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 595, 596, - 593, 701, 0, 652, 653, 0, 0, 519, 520, 367, - 374, 538, 376, 332, 428, 369, 503, 385, 0, 531, - 597, 532, 444, 445, 655, 658, 656, 657, 420, 380, - 382, 459, 386, 396, 447, 502, 426, 452, 330, 492, - 461, 401, 582, 610, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, + 464, 494, 0, 507, 0, 384, 385, 0, 0, 0, + 0, 0, 0, 0, 316, 471, 491, 329, 458, 505, + 334, 466, 483, 324, 425, 455, 0, 0, 318, 489, + 465, 407, 317, 0, 449, 357, 373, 354, 423, 0, + 488, 518, 353, 508, 0, 499, 320, 0, 498, 422, + 485, 490, 408, 401, 0, 319, 487, 406, 400, 388, + 363, 534, 389, 390, 378, 437, 398, 438, 379, 412, + 411, 413, 0, 0, 0, 0, 0, 529, 530, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 660, 0, 0, 664, 0, 501, + 0, 0, 0, 0, 0, 0, 469, 0, 0, 391, + 0, 0, 0, 519, 0, 452, 428, 698, 0, 0, + 450, 396, 486, 439, 492, 472, 500, 444, 440, 310, + 473, 356, 409, 325, 327, 688, 358, 360, 364, 365, + 418, 419, 433, 457, 476, 477, 478, 355, 339, 451, + 340, 375, 341, 311, 347, 345, 348, 459, 349, 313, + 434, 482, 0, 370, 447, 404, 314, 403, 435, 481, + 480, 326, 509, 516, 517, 607, 0, 522, 699, 700, + 701, 531, 0, 441, 322, 321, 0, 0, 0, 351, + 436, 335, 337, 338, 336, 431, 432, 536, 537, 538, + 540, 0, 541, 542, 0, 0, 0, 0, 543, 608, + 624, 592, 561, 524, 616, 558, 562, 563, 381, 627, + 0, 0, 0, 515, 392, 393, 0, 362, 361, 405, + 315, 0, 0, 0, 382, 368, 306, 307, 694, 352, + 424, 629, 662, 663, 554, 0, 617, 555, 564, 344, + 589, 601, 600, 420, 514, 0, 612, 615, 544, 693, + 0, 609, 623, 697, 622, 690, 430, 0, 456, 620, + 567, 0, 613, 586, 587, 0, 614, 582, 618, 0, + 556, 0, 525, 528, 557, 642, 643, 644, 312, 527, + 646, 647, 648, 649, 650, 651, 652, 645, 497, 590, + 566, 593, 506, 569, 568, 0, 0, 604, 523, 605, + 606, 414, 415, 416, 417, 372, 630, 333, 526, 443, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 597, 594, 702, 0, 653, 654, 0, 0, 520, + 521, 367, 374, 539, 376, 332, 429, 369, 504, 386, + 0, 532, 598, 533, 445, 446, 656, 659, 657, 658, + 421, 380, 383, 460, 387, 397, 448, 503, 427, 453, + 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 636, 635, 634, 633, 632, 631, 630, 0, - 0, 579, 478, 346, 300, 342, 343, 350, 690, 686, - 483, 691, 0, 308, 559, 394, 441, 366, 624, 625, - 0, 676, 254, 255, 256, 257, 258, 259, 260, 261, - 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, - 273, 274, 275, 276, 277, 278, 627, 269, 270, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 0, 0, 0, 0, 302, 678, 679, - 680, 681, 682, 0, 0, 303, 304, 305, 0, 0, - 295, 469, 296, 297, 298, 299, 0, 0, 509, 510, - 511, 534, 0, 512, 494, 558, 377, 309, 473, 501, - 688, 0, 0, 0, 0, 0, 0, 0, 609, 620, - 654, 0, 664, 665, 667, 669, 668, 671, 466, 467, - 677, 0, 673, 674, 675, 672, 398, 453, 474, 460, - 3405, 694, 549, 550, 695, 660, 425, 0, 0, 564, - 598, 587, 670, 552, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 359, 0, 0, 393, 602, 583, - 594, 584, 569, 570, 571, 578, 371, 572, 573, 574, - 544, 575, 545, 576, 577, 0, 601, 551, 462, 409, - 0, 618, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 637, 636, 635, 634, 633, 632, + 631, 0, 0, 580, 479, 346, 300, 342, 343, 350, + 691, 687, 484, 692, 0, 308, 560, 395, 442, 366, + 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, + 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, + 271, 272, 273, 274, 275, 276, 277, 278, 628, 269, + 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, + 679, 680, 681, 682, 683, 0, 0, 303, 304, 305, + 0, 0, 295, 470, 296, 297, 298, 299, 0, 0, + 510, 511, 512, 535, 0, 513, 495, 559, 377, 309, + 474, 502, 689, 0, 0, 0, 0, 0, 0, 0, + 610, 621, 655, 0, 665, 666, 668, 670, 669, 672, + 467, 468, 678, 0, 674, 675, 676, 673, 399, 454, + 475, 461, 3406, 695, 550, 551, 696, 661, 426, 0, + 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 359, 0, 0, 394, + 603, 584, 595, 585, 570, 571, 572, 579, 371, 573, + 574, 575, 545, 576, 546, 577, 578, 0, 602, 552, + 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, + 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 0, 0, 0, 0, 328, - 241, 546, 666, 548, 547, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 464, 494, 0, 507, + 0, 384, 385, 0, 0, 0, 0, 0, 0, 0, + 316, 471, 491, 329, 458, 505, 334, 466, 483, 324, + 425, 455, 0, 0, 318, 489, 465, 407, 317, 0, + 449, 357, 373, 354, 423, 0, 488, 518, 353, 508, + 0, 499, 320, 0, 498, 422, 485, 490, 408, 401, + 0, 319, 487, 406, 400, 388, 363, 534, 389, 390, + 378, 437, 398, 438, 379, 412, 411, 413, 0, 0, + 0, 0, 0, 529, 530, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 660, 0, 0, 664, 0, 501, 0, 0, 0, 0, + 0, 0, 469, 0, 0, 391, 0, 0, 0, 519, + 0, 452, 428, 698, 0, 0, 450, 396, 486, 439, + 492, 472, 500, 444, 440, 310, 473, 356, 409, 325, + 327, 688, 358, 360, 364, 365, 418, 419, 433, 457, + 476, 477, 478, 355, 339, 451, 340, 375, 341, 311, + 347, 345, 348, 459, 349, 313, 434, 482, 0, 370, + 447, 404, 314, 403, 435, 481, 480, 326, 509, 516, + 517, 607, 0, 522, 699, 700, 701, 531, 0, 441, + 322, 321, 0, 0, 0, 351, 436, 335, 337, 338, + 336, 431, 432, 536, 537, 538, 540, 0, 541, 542, + 0, 0, 0, 0, 543, 608, 624, 592, 561, 524, + 616, 558, 562, 563, 381, 627, 0, 0, 0, 515, + 392, 393, 0, 362, 361, 405, 315, 0, 0, 0, + 382, 368, 306, 307, 694, 352, 424, 629, 662, 663, + 554, 0, 617, 555, 564, 344, 589, 601, 600, 420, + 514, 0, 612, 615, 544, 693, 0, 609, 623, 697, + 622, 690, 430, 0, 456, 620, 567, 0, 613, 586, + 587, 0, 614, 582, 618, 0, 556, 0, 525, 528, + 557, 642, 643, 644, 312, 527, 646, 647, 648, 649, + 650, 651, 652, 645, 497, 590, 566, 593, 506, 569, + 568, 0, 0, 604, 523, 605, 606, 414, 415, 416, + 417, 372, 630, 333, 526, 443, 0, 591, 0, 0, + 0, 0, 0, 0, 0, 0, 596, 597, 594, 702, + 0, 653, 654, 0, 0, 520, 521, 367, 374, 539, + 376, 332, 429, 369, 504, 386, 0, 532, 598, 533, + 445, 446, 656, 659, 657, 658, 421, 380, 383, 460, + 387, 397, 448, 503, 427, 453, 330, 493, 462, 402, + 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, + 637, 636, 635, 634, 633, 632, 631, 0, 0, 580, + 479, 346, 300, 342, 343, 350, 691, 687, 484, 692, + 0, 308, 560, 395, 442, 366, 625, 626, 0, 677, + 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, + 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, + 275, 276, 277, 278, 628, 269, 270, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 0, 0, 0, 302, 679, 680, 681, 682, + 683, 0, 0, 303, 304, 305, 0, 0, 295, 470, + 296, 297, 298, 299, 0, 0, 510, 511, 512, 535, + 0, 513, 495, 559, 377, 309, 474, 502, 689, 0, + 0, 0, 0, 0, 0, 0, 610, 621, 655, 0, + 665, 666, 668, 670, 669, 672, 467, 468, 678, 0, + 674, 675, 676, 673, 399, 454, 475, 461, 0, 695, + 550, 551, 696, 661, 426, 0, 0, 565, 599, 588, + 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 359, 0, 0, 394, 603, 584, 595, 585, + 570, 571, 572, 579, 371, 573, 574, 575, 545, 576, + 546, 577, 578, 0, 602, 552, 463, 410, 0, 619, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 0, 0, 0, 0, 328, 241, 547, + 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 463, 493, 0, 506, 0, 383, - 384, 0, 0, 0, 0, 0, 0, 0, 316, 470, - 490, 329, 457, 504, 334, 465, 482, 324, 424, 454, - 0, 0, 318, 488, 464, 406, 317, 0, 448, 357, - 373, 354, 422, 0, 487, 517, 353, 507, 0, 498, - 320, 0, 497, 421, 484, 489, 407, 400, 0, 319, - 486, 405, 399, 387, 363, 533, 388, 389, 378, 436, - 397, 437, 379, 411, 410, 412, 0, 0, 0, 0, - 0, 528, 529, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 659, 0, - 0, 663, 0, 500, 0, 0, 0, 0, 0, 0, - 468, 0, 0, 390, 0, 0, 0, 518, 0, 451, - 427, 697, 0, 0, 449, 395, 485, 438, 491, 471, - 499, 443, 439, 310, 472, 356, 408, 325, 327, 687, - 358, 360, 364, 365, 417, 418, 432, 456, 475, 476, - 477, 355, 339, 450, 340, 375, 341, 311, 347, 345, - 348, 458, 349, 313, 433, 481, 0, 370, 446, 403, - 314, 402, 434, 480, 479, 326, 508, 515, 516, 606, - 0, 521, 698, 699, 700, 530, 0, 440, 322, 321, - 0, 0, 0, 351, 435, 335, 337, 338, 336, 430, - 431, 535, 536, 537, 539, 0, 540, 541, 0, 0, - 0, 0, 542, 607, 623, 591, 560, 523, 615, 557, - 561, 562, 381, 626, 0, 0, 0, 514, 391, 392, - 0, 362, 361, 404, 315, 0, 0, 368, 306, 307, - 693, 352, 423, 628, 661, 662, 553, 0, 616, 554, - 563, 344, 588, 600, 599, 419, 513, 0, 611, 614, - 543, 692, 0, 608, 622, 696, 621, 689, 429, 0, - 455, 619, 566, 0, 612, 585, 586, 0, 613, 581, - 617, 0, 555, 0, 524, 527, 556, 641, 642, 643, - 312, 526, 645, 646, 647, 648, 649, 650, 651, 644, - 496, 589, 565, 592, 505, 568, 567, 0, 0, 603, - 522, 604, 605, 413, 414, 415, 416, 372, 629, 333, - 525, 442, 0, 590, 0, 0, 0, 0, 0, 0, - 0, 0, 595, 596, 593, 701, 0, 652, 653, 0, - 0, 519, 520, 367, 374, 538, 376, 332, 428, 369, - 503, 385, 0, 531, 597, 532, 444, 445, 655, 658, - 656, 657, 420, 380, 382, 459, 386, 396, 447, 502, - 426, 452, 330, 492, 461, 401, 582, 610, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3306, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 464, 494, 0, 507, 0, 384, 385, 0, + 0, 0, 0, 0, 0, 0, 316, 471, 491, 329, + 458, 505, 334, 466, 483, 324, 425, 455, 0, 0, + 318, 489, 465, 407, 317, 0, 449, 357, 373, 354, + 423, 0, 488, 518, 353, 508, 0, 499, 320, 0, + 498, 422, 485, 490, 408, 401, 0, 319, 487, 406, + 400, 388, 363, 534, 389, 390, 378, 437, 398, 438, + 379, 412, 411, 413, 0, 0, 0, 0, 0, 529, + 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 0, 0, 664, + 0, 501, 0, 0, 0, 0, 0, 0, 469, 0, + 0, 391, 0, 0, 0, 519, 0, 452, 428, 698, + 0, 0, 450, 396, 486, 439, 492, 472, 500, 444, + 440, 310, 473, 356, 409, 325, 327, 688, 358, 360, + 364, 365, 418, 419, 433, 457, 476, 477, 478, 355, + 339, 451, 340, 375, 341, 311, 347, 345, 348, 459, + 349, 313, 434, 482, 0, 370, 447, 404, 314, 403, + 435, 481, 480, 326, 509, 516, 517, 607, 0, 522, + 699, 700, 701, 531, 0, 441, 322, 321, 0, 0, + 0, 351, 436, 335, 337, 338, 336, 431, 432, 536, + 537, 538, 540, 0, 541, 542, 0, 0, 0, 0, + 543, 608, 624, 592, 561, 524, 616, 558, 562, 563, + 381, 627, 0, 0, 0, 515, 392, 393, 0, 362, + 361, 405, 315, 0, 0, 0, 382, 368, 306, 307, + 694, 352, 424, 629, 662, 663, 554, 0, 617, 555, + 564, 344, 589, 601, 600, 420, 514, 0, 612, 615, + 544, 693, 0, 609, 623, 697, 622, 690, 430, 0, + 456, 620, 567, 0, 613, 586, 587, 0, 614, 582, + 618, 0, 556, 0, 525, 528, 557, 642, 643, 644, + 312, 527, 646, 647, 648, 649, 650, 651, 652, 645, + 497, 590, 566, 593, 506, 569, 568, 0, 0, 604, + 523, 605, 606, 414, 415, 416, 417, 372, 630, 333, + 526, 443, 0, 591, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 597, 594, 702, 0, 653, 654, 0, + 0, 520, 521, 367, 374, 539, 376, 332, 429, 369, + 504, 386, 0, 532, 598, 533, 445, 446, 656, 659, + 657, 658, 421, 380, 383, 460, 387, 397, 448, 503, + 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 636, 635, 634, 633, - 632, 631, 630, 0, 0, 579, 478, 346, 300, 342, - 343, 350, 690, 686, 483, 691, 0, 308, 559, 394, - 441, 366, 624, 625, 0, 676, 254, 255, 256, 257, + 0, 0, 0, 0, 0, 638, 637, 636, 635, 634, + 633, 632, 631, 0, 0, 580, 479, 346, 300, 342, + 343, 350, 691, 687, 484, 692, 0, 308, 560, 395, + 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, 277, 278, - 627, 269, 270, 279, 280, 281, 282, 283, 284, 285, + 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, 0, 0, - 0, 302, 678, 679, 680, 681, 682, 0, 0, 303, - 304, 305, 0, 0, 295, 469, 296, 297, 298, 299, - 0, 0, 509, 510, 511, 534, 0, 512, 494, 558, - 377, 309, 473, 501, 688, 0, 0, 0, 0, 0, - 0, 0, 609, 620, 654, 0, 664, 665, 667, 669, - 668, 671, 466, 467, 677, 0, 673, 674, 675, 672, - 398, 453, 474, 460, 0, 694, 549, 550, 695, 660, - 425, 0, 0, 564, 598, 587, 670, 552, 0, 0, + 0, 302, 679, 680, 681, 682, 683, 0, 0, 303, + 304, 305, 0, 0, 295, 470, 296, 297, 298, 299, + 0, 0, 510, 511, 512, 535, 0, 513, 495, 559, + 377, 309, 474, 502, 689, 0, 0, 0, 0, 0, + 0, 0, 610, 621, 655, 0, 665, 666, 668, 670, + 669, 672, 467, 468, 678, 0, 674, 675, 676, 673, + 399, 454, 475, 461, 0, 695, 550, 551, 696, 661, + 426, 0, 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, - 0, 393, 602, 583, 594, 584, 569, 570, 571, 578, - 371, 572, 573, 574, 544, 575, 545, 576, 577, 0, - 601, 551, 462, 409, 0, 618, 0, 0, 0, 0, + 0, 394, 603, 584, 595, 585, 570, 571, 572, 579, + 371, 573, 574, 575, 545, 576, 546, 577, 578, 0, + 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, - 0, 0, 0, 328, 241, 546, 666, 548, 547, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 1660, + 0, 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3305, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 463, 493, - 0, 506, 0, 383, 384, 0, 0, 0, 0, 0, - 0, 0, 316, 470, 490, 329, 457, 504, 334, 465, - 482, 324, 424, 454, 0, 0, 318, 488, 464, 406, - 317, 0, 448, 357, 373, 354, 422, 0, 487, 517, - 353, 507, 0, 498, 320, 0, 497, 421, 484, 489, - 407, 400, 0, 319, 486, 405, 399, 387, 363, 533, - 388, 389, 378, 436, 397, 437, 379, 411, 410, 412, - 0, 0, 0, 0, 0, 528, 529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 659, 0, 0, 663, 0, 500, 0, 0, - 0, 0, 0, 0, 468, 0, 0, 390, 0, 0, - 0, 518, 0, 451, 427, 697, 0, 0, 449, 395, - 485, 438, 491, 471, 499, 443, 439, 310, 472, 356, - 408, 325, 327, 687, 358, 360, 364, 365, 417, 418, - 432, 456, 475, 476, 477, 355, 339, 450, 340, 375, - 341, 311, 347, 345, 348, 458, 349, 313, 433, 481, - 0, 370, 446, 403, 314, 402, 434, 480, 479, 326, - 508, 515, 516, 606, 0, 521, 698, 699, 700, 530, - 0, 440, 322, 321, 0, 0, 0, 351, 435, 335, - 337, 338, 336, 430, 431, 535, 536, 537, 539, 0, - 540, 541, 0, 0, 0, 0, 542, 607, 623, 591, - 560, 523, 615, 557, 561, 562, 381, 626, 0, 0, - 0, 514, 391, 392, 0, 362, 361, 404, 315, 0, - 0, 368, 306, 307, 693, 352, 423, 628, 661, 662, - 553, 0, 616, 554, 563, 344, 588, 600, 599, 419, - 513, 0, 611, 614, 543, 692, 0, 608, 622, 696, - 621, 689, 429, 0, 455, 619, 566, 0, 612, 585, - 586, 0, 613, 581, 617, 0, 555, 0, 524, 527, - 556, 641, 642, 643, 312, 526, 645, 646, 647, 648, - 649, 650, 651, 644, 496, 589, 565, 592, 505, 568, - 567, 0, 0, 603, 522, 604, 605, 413, 414, 415, - 416, 372, 629, 333, 525, 442, 0, 590, 0, 0, - 0, 0, 0, 0, 0, 0, 595, 596, 593, 701, - 0, 652, 653, 0, 0, 519, 520, 367, 374, 538, - 376, 332, 428, 369, 503, 385, 0, 531, 597, 532, - 444, 445, 655, 658, 656, 657, 420, 380, 382, 459, - 386, 396, 447, 502, 426, 452, 330, 492, 461, 401, - 582, 610, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 636, 635, 634, 633, 632, 631, 630, 0, 0, 579, - 478, 346, 300, 342, 343, 350, 690, 686, 483, 691, - 0, 308, 559, 394, 441, 366, 624, 625, 0, 676, - 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, - 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, - 275, 276, 277, 278, 627, 269, 270, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 0, 0, 0, 0, 302, 678, 679, 680, 681, - 682, 0, 0, 303, 304, 305, 0, 0, 295, 469, - 296, 297, 298, 299, 0, 0, 509, 510, 511, 534, - 0, 512, 494, 558, 377, 309, 473, 501, 688, 0, - 0, 0, 0, 0, 0, 0, 609, 620, 654, 0, - 664, 665, 667, 669, 668, 671, 466, 467, 677, 0, - 673, 674, 675, 672, 398, 453, 474, 460, 0, 694, - 549, 550, 695, 660, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 359, 0, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 0, 601, 551, 462, 409, 0, 618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 1659, 0, 0, 0, 328, 241, 546, - 666, 548, 547, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 0, - 0, 0, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 482, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 0, 487, 517, 353, 507, 0, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 533, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 0, 0, 663, - 0, 500, 0, 0, 0, 0, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 518, 0, 451, 427, 697, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 443, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 515, 516, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 352, - 423, 628, 661, 662, 553, 0, 616, 554, 563, 344, - 588, 600, 599, 419, 513, 0, 611, 614, 543, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 651, 644, 496, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 522, 604, - 605, 413, 414, 415, 416, 372, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 464, 494, + 0, 507, 0, 384, 385, 0, 0, 0, 0, 0, + 0, 0, 316, 471, 491, 329, 458, 505, 334, 466, + 483, 324, 425, 455, 0, 0, 318, 489, 465, 407, + 317, 0, 449, 357, 373, 354, 423, 0, 488, 518, + 353, 508, 0, 499, 320, 0, 498, 422, 485, 490, + 408, 401, 0, 319, 487, 406, 400, 388, 363, 534, + 389, 390, 378, 437, 398, 438, 379, 412, 411, 413, + 0, 0, 0, 0, 0, 529, 530, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 0, 0, 664, 0, 501, 0, 0, + 0, 0, 0, 0, 469, 0, 0, 391, 0, 0, + 0, 519, 0, 452, 428, 698, 0, 0, 450, 396, + 486, 439, 492, 472, 500, 444, 440, 310, 473, 356, + 409, 325, 327, 688, 358, 360, 364, 365, 418, 419, + 433, 457, 476, 477, 478, 355, 339, 451, 340, 375, + 341, 311, 347, 345, 348, 459, 349, 313, 434, 482, + 0, 370, 447, 404, 314, 403, 435, 481, 480, 326, + 509, 516, 517, 607, 0, 522, 699, 700, 701, 531, + 0, 441, 322, 321, 0, 0, 0, 351, 436, 335, + 337, 338, 336, 431, 432, 536, 537, 538, 540, 0, + 541, 542, 0, 0, 0, 0, 543, 608, 624, 592, + 561, 524, 616, 558, 562, 563, 381, 627, 0, 0, + 0, 515, 392, 393, 0, 362, 361, 405, 315, 0, + 0, 0, 382, 368, 306, 307, 694, 352, 424, 629, + 662, 663, 554, 0, 617, 555, 564, 344, 589, 601, + 600, 420, 514, 0, 612, 615, 544, 693, 0, 609, + 623, 697, 622, 690, 430, 0, 456, 620, 567, 0, + 613, 586, 587, 0, 614, 582, 618, 0, 556, 0, + 525, 528, 557, 642, 643, 644, 312, 527, 646, 647, + 648, 649, 650, 651, 652, 645, 497, 590, 566, 593, + 506, 569, 568, 0, 0, 604, 523, 605, 606, 414, + 415, 416, 417, 372, 630, 333, 526, 443, 0, 591, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 597, + 594, 702, 0, 653, 654, 0, 0, 520, 521, 367, + 374, 539, 376, 332, 429, 369, 504, 386, 0, 532, + 598, 533, 445, 446, 656, 659, 657, 658, 421, 380, + 383, 460, 387, 397, 448, 503, 427, 453, 330, 493, + 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 0, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 254, 255, 256, 257, 258, 259, - 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, - 271, 272, 273, 274, 275, 276, 277, 278, 627, 269, - 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, - 678, 679, 680, 681, 682, 0, 0, 303, 304, 305, - 0, 0, 295, 469, 296, 297, 298, 299, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 668, 671, - 466, 467, 677, 0, 673, 674, 675, 672, 398, 453, - 474, 460, 0, 694, 549, 550, 695, 660, 425, 0, - 0, 564, 598, 587, 670, 552, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 359, 0, 0, 393, - 602, 583, 594, 584, 569, 570, 571, 578, 371, 572, - 573, 574, 544, 575, 545, 576, 577, 0, 601, 551, - 462, 409, 0, 618, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 2710, 0, 0, - 0, 328, 241, 546, 666, 548, 547, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 638, 637, 636, 635, 634, 633, 632, 631, 0, + 0, 580, 479, 346, 300, 342, 343, 350, 691, 687, + 484, 692, 0, 308, 560, 395, 442, 366, 625, 626, + 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, + 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, + 273, 274, 275, 276, 277, 278, 628, 269, 270, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 0, 0, 0, 302, 679, 680, + 681, 682, 683, 0, 0, 303, 304, 305, 0, 0, + 295, 470, 296, 297, 298, 299, 0, 0, 510, 511, + 512, 535, 0, 513, 495, 559, 377, 309, 474, 502, + 689, 0, 0, 0, 0, 0, 0, 0, 610, 621, + 655, 0, 665, 666, 668, 670, 669, 672, 467, 468, + 678, 0, 674, 675, 676, 673, 399, 454, 475, 461, + 0, 695, 550, 551, 696, 661, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 0, 602, 552, 463, 410, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 2711, 0, 0, 0, 328, + 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 463, 493, 0, 506, - 0, 383, 384, 0, 0, 0, 0, 0, 0, 0, - 316, 470, 490, 329, 457, 504, 334, 465, 482, 324, - 424, 454, 0, 0, 318, 488, 464, 406, 317, 0, - 448, 357, 373, 354, 422, 0, 487, 517, 353, 507, - 0, 498, 320, 0, 497, 421, 484, 489, 407, 400, - 0, 319, 486, 405, 399, 387, 363, 533, 388, 389, - 378, 436, 397, 437, 379, 411, 410, 412, 0, 0, - 0, 0, 0, 528, 529, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 659, 0, 0, 663, 0, 500, 0, 0, 0, 0, - 0, 0, 468, 0, 0, 390, 0, 0, 0, 518, - 0, 451, 427, 697, 0, 0, 449, 395, 485, 438, - 491, 471, 499, 443, 439, 310, 472, 356, 408, 325, - 327, 687, 358, 360, 364, 365, 417, 418, 432, 456, - 475, 476, 477, 355, 339, 450, 340, 375, 341, 311, - 347, 345, 348, 458, 349, 313, 433, 481, 0, 370, - 446, 403, 314, 402, 434, 480, 479, 326, 508, 515, - 516, 606, 0, 521, 698, 699, 700, 530, 0, 440, - 322, 321, 0, 0, 0, 351, 435, 335, 337, 338, - 336, 430, 431, 535, 536, 537, 539, 0, 540, 541, - 0, 0, 0, 0, 542, 607, 623, 591, 560, 523, - 615, 557, 561, 562, 381, 626, 0, 0, 0, 514, - 391, 392, 0, 362, 361, 404, 315, 0, 0, 368, - 306, 307, 693, 352, 423, 628, 661, 662, 553, 0, - 616, 554, 563, 344, 588, 600, 599, 419, 513, 0, - 611, 614, 543, 692, 0, 608, 622, 696, 621, 689, - 429, 0, 455, 619, 566, 0, 612, 585, 586, 0, - 613, 581, 617, 0, 555, 0, 524, 527, 556, 641, - 642, 643, 312, 526, 645, 646, 647, 648, 649, 650, - 651, 644, 496, 589, 565, 592, 505, 568, 567, 0, - 0, 603, 522, 604, 605, 413, 414, 415, 416, 372, - 629, 333, 525, 442, 0, 590, 0, 0, 0, 0, - 0, 0, 0, 0, 595, 596, 593, 701, 0, 652, - 653, 0, 0, 519, 520, 367, 374, 538, 376, 332, - 428, 369, 503, 385, 0, 531, 597, 532, 444, 445, - 655, 658, 656, 657, 420, 380, 382, 459, 386, 396, - 447, 502, 426, 452, 330, 492, 461, 401, 582, 610, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 0, 0, 0, 0, 0, 0, 0, 316, 471, + 491, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 0, 488, 518, 353, 508, 0, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 534, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 0, + 0, 664, 0, 501, 0, 0, 0, 0, 0, 0, + 469, 0, 0, 391, 0, 0, 0, 519, 0, 452, + 428, 698, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 0, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 352, 424, 629, 662, 663, 554, 0, + 617, 555, 564, 344, 589, 601, 600, 420, 514, 0, + 612, 615, 544, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 497, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 523, 605, 606, 414, 415, 416, 417, 372, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 636, 635, - 634, 633, 632, 631, 630, 0, 0, 579, 478, 346, - 300, 342, 343, 350, 690, 686, 483, 691, 0, 308, - 559, 394, 441, 366, 624, 625, 0, 676, 254, 255, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 0, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, - 277, 278, 627, 269, 270, 279, 280, 281, 282, 283, + 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, - 0, 0, 0, 302, 678, 679, 680, 681, 682, 0, - 0, 303, 304, 305, 0, 0, 295, 469, 296, 297, - 298, 299, 0, 0, 509, 510, 511, 534, 0, 512, - 494, 558, 377, 309, 473, 501, 688, 0, 0, 0, - 0, 0, 0, 0, 609, 620, 654, 0, 664, 665, - 667, 669, 668, 671, 466, 467, 677, 0, 673, 674, - 675, 672, 398, 453, 474, 460, 0, 694, 549, 550, - 695, 660, 425, 0, 0, 564, 598, 587, 670, 552, - 0, 0, 3114, 0, 0, 0, 0, 0, 0, 0, - 359, 0, 0, 393, 602, 583, 594, 584, 569, 570, - 571, 578, 371, 572, 573, 574, 544, 575, 545, 576, - 577, 0, 601, 551, 462, 409, 0, 618, 0, 0, + 0, 0, 0, 302, 679, 680, 681, 682, 683, 0, + 0, 303, 304, 305, 0, 0, 295, 470, 296, 297, + 298, 299, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 669, 672, 467, 468, 678, 0, 674, 675, + 676, 673, 399, 454, 475, 461, 0, 695, 550, 551, + 696, 661, 426, 0, 0, 565, 599, 588, 671, 553, + 0, 0, 3115, 0, 0, 0, 0, 0, 0, 0, + 359, 0, 0, 394, 603, 584, 595, 585, 570, 571, + 572, 579, 371, 573, 574, 575, 545, 576, 546, 577, + 578, 0, 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 0, 0, 0, 0, 328, 241, 546, 666, 548, - 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 328, 241, 547, 667, 549, + 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 463, 493, 0, 506, 0, 383, 384, 0, 0, 0, - 0, 0, 0, 0, 316, 470, 490, 329, 457, 504, - 334, 465, 482, 324, 424, 454, 0, 0, 318, 488, - 464, 406, 317, 0, 448, 357, 373, 354, 422, 0, - 487, 517, 353, 507, 0, 498, 320, 0, 497, 421, - 484, 489, 407, 400, 0, 319, 486, 405, 399, 387, - 363, 533, 388, 389, 378, 436, 397, 437, 379, 411, - 410, 412, 0, 0, 0, 0, 0, 528, 529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 659, 0, 0, 663, 0, 500, - 0, 0, 0, 0, 0, 0, 468, 0, 0, 390, - 0, 0, 0, 518, 0, 451, 427, 697, 0, 0, - 449, 395, 485, 438, 491, 471, 499, 443, 439, 310, - 472, 356, 408, 325, 327, 687, 358, 360, 364, 365, - 417, 418, 432, 456, 475, 476, 477, 355, 339, 450, - 340, 375, 341, 311, 347, 345, 348, 458, 349, 313, - 433, 481, 0, 370, 446, 403, 314, 402, 434, 480, - 479, 326, 508, 515, 516, 606, 0, 521, 698, 699, - 700, 530, 0, 440, 322, 321, 0, 0, 0, 351, - 435, 335, 337, 338, 336, 430, 431, 535, 536, 537, - 539, 0, 540, 541, 0, 0, 0, 0, 542, 607, - 623, 591, 560, 523, 615, 557, 561, 562, 381, 626, - 0, 0, 0, 514, 391, 392, 0, 362, 361, 404, - 315, 0, 0, 368, 306, 307, 693, 352, 423, 628, - 661, 662, 553, 0, 616, 554, 563, 344, 588, 600, - 599, 419, 513, 0, 611, 614, 543, 692, 0, 608, - 622, 696, 621, 689, 429, 0, 455, 619, 566, 0, - 612, 585, 586, 0, 613, 581, 617, 0, 555, 0, - 524, 527, 556, 641, 642, 643, 312, 526, 645, 646, - 647, 648, 649, 650, 651, 644, 496, 589, 565, 592, - 505, 568, 567, 0, 0, 603, 522, 604, 605, 413, - 414, 415, 416, 372, 629, 333, 525, 442, 0, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 595, 596, - 593, 701, 0, 652, 653, 0, 0, 519, 520, 367, - 374, 538, 376, 332, 428, 369, 503, 385, 0, 531, - 597, 532, 444, 445, 655, 658, 656, 657, 420, 380, - 382, 459, 386, 396, 447, 502, 426, 452, 330, 492, - 461, 401, 582, 610, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, + 464, 494, 0, 507, 0, 384, 385, 0, 0, 0, + 0, 0, 0, 0, 316, 471, 491, 329, 458, 505, + 334, 466, 483, 324, 425, 455, 0, 0, 318, 489, + 465, 407, 317, 0, 449, 357, 373, 354, 423, 0, + 488, 518, 353, 508, 0, 499, 320, 0, 498, 422, + 485, 490, 408, 401, 0, 319, 487, 406, 400, 388, + 363, 534, 389, 390, 378, 437, 398, 438, 379, 412, + 411, 413, 0, 0, 0, 0, 0, 529, 530, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 660, 0, 0, 664, 0, 501, + 0, 0, 0, 0, 0, 0, 469, 0, 0, 391, + 0, 0, 0, 519, 0, 452, 428, 698, 0, 0, + 450, 396, 486, 439, 492, 472, 500, 444, 440, 310, + 473, 356, 409, 325, 327, 688, 358, 360, 364, 365, + 418, 419, 433, 457, 476, 477, 478, 355, 339, 451, + 340, 375, 341, 311, 347, 345, 348, 459, 349, 313, + 434, 482, 0, 370, 447, 404, 314, 403, 435, 481, + 480, 326, 509, 516, 517, 607, 0, 522, 699, 700, + 701, 531, 0, 441, 322, 321, 0, 0, 0, 351, + 436, 335, 337, 338, 336, 431, 432, 536, 537, 538, + 540, 0, 541, 542, 0, 0, 0, 0, 543, 608, + 624, 592, 561, 524, 616, 558, 562, 563, 381, 627, + 0, 0, 0, 515, 392, 393, 0, 362, 361, 405, + 315, 0, 0, 0, 382, 368, 306, 307, 694, 352, + 424, 629, 662, 663, 554, 0, 617, 555, 564, 344, + 589, 601, 600, 420, 514, 0, 612, 615, 544, 693, + 0, 609, 623, 697, 622, 690, 430, 0, 456, 620, + 567, 0, 613, 586, 587, 0, 614, 582, 618, 0, + 556, 0, 525, 528, 557, 642, 643, 644, 312, 527, + 646, 647, 648, 649, 650, 651, 652, 645, 497, 590, + 566, 593, 506, 569, 568, 0, 0, 604, 523, 605, + 606, 414, 415, 416, 417, 372, 630, 333, 526, 443, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 597, 594, 702, 0, 653, 654, 0, 0, 520, + 521, 367, 374, 539, 376, 332, 429, 369, 504, 386, + 0, 532, 598, 533, 445, 446, 656, 659, 657, 658, + 421, 380, 383, 460, 387, 397, 448, 503, 427, 453, + 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 637, 636, 635, 634, 633, 632, + 631, 0, 0, 580, 479, 346, 300, 342, 343, 350, + 691, 687, 484, 692, 0, 308, 560, 395, 442, 366, + 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, + 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, + 271, 272, 273, 274, 275, 276, 277, 278, 628, 269, + 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, + 679, 680, 681, 682, 683, 0, 0, 303, 304, 305, + 0, 0, 295, 470, 296, 297, 298, 299, 0, 0, + 510, 511, 512, 535, 0, 513, 495, 559, 377, 309, + 474, 502, 689, 0, 0, 0, 0, 0, 0, 0, + 610, 621, 655, 0, 665, 666, 668, 670, 669, 672, + 467, 468, 678, 0, 674, 675, 676, 673, 399, 454, + 475, 461, 0, 695, 550, 551, 696, 661, 426, 0, + 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 359, 0, 0, 394, + 603, 584, 595, 585, 570, 571, 572, 579, 371, 573, + 574, 575, 545, 576, 546, 577, 578, 0, 602, 552, + 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 3037, 0, 0, + 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 636, 635, 634, 633, 632, 631, 630, 0, - 0, 579, 478, 346, 300, 342, 343, 350, 690, 686, - 483, 691, 0, 308, 559, 394, 441, 366, 624, 625, - 0, 676, 254, 255, 256, 257, 258, 259, 260, 261, - 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, - 273, 274, 275, 276, 277, 278, 627, 269, 270, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 0, 0, 0, 0, 302, 678, 679, - 680, 681, 682, 0, 0, 303, 304, 305, 0, 0, - 295, 469, 296, 297, 298, 299, 0, 0, 509, 510, - 511, 534, 0, 512, 494, 558, 377, 309, 473, 501, - 688, 0, 0, 0, 0, 0, 0, 0, 609, 620, - 654, 0, 664, 665, 667, 669, 668, 671, 466, 467, - 677, 0, 673, 674, 675, 672, 398, 453, 474, 460, - 0, 694, 549, 550, 695, 660, 425, 0, 0, 564, - 598, 587, 670, 552, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 359, 0, 0, 393, 602, 583, - 594, 584, 569, 570, 571, 578, 371, 572, 573, 574, - 544, 575, 545, 576, 577, 0, 601, 551, 462, 409, - 0, 618, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 3036, 0, 0, 0, 328, - 241, 546, 666, 548, 547, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 464, 494, 0, 507, + 0, 384, 385, 0, 0, 0, 0, 0, 0, 0, + 316, 471, 491, 329, 458, 505, 334, 466, 483, 324, + 425, 455, 0, 0, 318, 489, 465, 407, 317, 0, + 449, 357, 373, 354, 423, 0, 488, 518, 353, 508, + 0, 499, 320, 0, 498, 422, 485, 490, 408, 401, + 0, 319, 487, 406, 400, 388, 363, 534, 389, 390, + 378, 437, 398, 438, 379, 412, 411, 413, 0, 0, + 0, 0, 0, 529, 530, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 660, 0, 0, 664, 0, 501, 0, 0, 0, 0, + 0, 0, 469, 0, 0, 391, 0, 0, 0, 519, + 0, 452, 428, 698, 0, 0, 450, 396, 486, 439, + 492, 472, 500, 444, 440, 310, 473, 356, 409, 325, + 327, 688, 358, 360, 364, 365, 418, 419, 433, 457, + 476, 477, 478, 355, 339, 451, 340, 375, 341, 311, + 347, 345, 348, 459, 349, 313, 434, 482, 0, 370, + 447, 404, 314, 403, 435, 481, 480, 326, 509, 516, + 517, 607, 0, 522, 699, 700, 701, 531, 0, 441, + 322, 321, 0, 0, 0, 351, 436, 335, 337, 338, + 336, 431, 432, 536, 537, 538, 540, 0, 541, 542, + 0, 0, 0, 0, 543, 608, 624, 592, 561, 524, + 616, 558, 562, 563, 381, 627, 0, 0, 0, 515, + 392, 393, 0, 362, 361, 405, 315, 0, 0, 0, + 382, 368, 306, 307, 694, 352, 424, 629, 662, 663, + 554, 0, 617, 555, 564, 344, 589, 601, 600, 420, + 514, 0, 612, 615, 544, 693, 0, 609, 623, 697, + 622, 690, 430, 0, 456, 620, 567, 0, 613, 586, + 587, 0, 614, 582, 618, 0, 556, 0, 525, 528, + 557, 642, 643, 644, 312, 527, 646, 647, 648, 649, + 650, 651, 652, 645, 497, 590, 566, 593, 506, 569, + 568, 0, 0, 604, 523, 605, 606, 414, 415, 416, + 417, 372, 630, 333, 526, 443, 0, 591, 0, 0, + 0, 0, 0, 0, 0, 0, 596, 597, 594, 702, + 0, 653, 654, 0, 0, 520, 521, 367, 374, 539, + 376, 332, 429, 369, 504, 386, 0, 532, 598, 533, + 445, 446, 656, 659, 657, 658, 421, 380, 383, 460, + 387, 397, 448, 503, 427, 453, 330, 493, 462, 402, + 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, + 637, 636, 635, 634, 633, 632, 631, 0, 0, 580, + 479, 346, 300, 342, 343, 350, 691, 687, 484, 692, + 0, 308, 560, 395, 442, 366, 625, 626, 0, 677, + 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, + 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, + 275, 276, 277, 278, 628, 269, 270, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 0, 0, 0, 302, 679, 680, 681, 682, + 683, 0, 0, 303, 304, 305, 0, 0, 295, 470, + 296, 297, 298, 299, 0, 0, 510, 511, 512, 535, + 0, 513, 495, 559, 377, 309, 474, 502, 689, 0, + 0, 0, 0, 0, 0, 0, 610, 621, 655, 0, + 665, 666, 668, 670, 669, 672, 467, 468, 678, 0, + 674, 675, 676, 673, 399, 454, 475, 461, 0, 695, + 550, 551, 696, 661, 426, 0, 0, 565, 599, 588, + 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 359, 0, 0, 394, 603, 584, 595, 585, + 570, 571, 572, 579, 371, 573, 574, 575, 545, 576, + 546, 577, 578, 0, 602, 552, 463, 410, 0, 619, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 0, 0, 0, 0, 328, 241, 547, + 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 463, 493, 0, 506, 0, 383, - 384, 0, 0, 0, 0, 0, 0, 0, 316, 470, - 490, 329, 457, 504, 334, 465, 482, 324, 424, 454, - 0, 0, 318, 488, 464, 406, 317, 0, 448, 357, - 373, 354, 422, 0, 487, 517, 353, 507, 0, 498, - 320, 0, 497, 421, 484, 489, 407, 400, 0, 319, - 486, 405, 399, 387, 363, 533, 388, 389, 378, 436, - 397, 437, 379, 411, 410, 412, 0, 0, 0, 0, - 0, 528, 529, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 659, 0, - 0, 663, 0, 500, 0, 0, 0, 0, 0, 0, - 468, 0, 0, 390, 0, 0, 0, 518, 0, 451, - 427, 697, 0, 0, 449, 395, 485, 438, 491, 471, - 499, 443, 439, 310, 472, 356, 408, 325, 327, 687, - 358, 360, 364, 365, 417, 418, 432, 456, 475, 476, - 477, 355, 339, 450, 340, 375, 341, 311, 347, 345, - 348, 458, 349, 313, 433, 481, 0, 370, 446, 403, - 314, 402, 434, 480, 479, 326, 508, 515, 516, 606, - 0, 521, 698, 699, 700, 530, 0, 440, 322, 321, - 0, 0, 0, 351, 435, 335, 337, 338, 336, 430, - 431, 535, 536, 537, 539, 0, 540, 541, 0, 0, - 0, 0, 542, 607, 623, 591, 560, 523, 615, 557, - 561, 562, 381, 626, 0, 0, 0, 514, 391, 392, - 0, 362, 361, 404, 315, 0, 0, 368, 306, 307, - 693, 352, 423, 628, 661, 662, 553, 0, 616, 554, - 563, 344, 588, 600, 599, 419, 513, 0, 611, 614, - 543, 692, 0, 608, 622, 696, 621, 689, 429, 0, - 455, 619, 566, 0, 612, 585, 586, 0, 613, 581, - 617, 0, 555, 0, 524, 527, 556, 641, 642, 643, - 312, 526, 645, 646, 647, 648, 649, 650, 651, 644, - 496, 589, 565, 592, 505, 568, 567, 0, 0, 603, - 522, 604, 605, 413, 414, 415, 416, 372, 629, 333, - 525, 442, 0, 590, 0, 0, 0, 0, 0, 0, - 0, 0, 595, 596, 593, 701, 0, 652, 653, 0, - 0, 519, 520, 367, 374, 538, 376, 332, 428, 369, - 503, 385, 0, 531, 597, 532, 444, 445, 655, 658, - 656, 657, 420, 380, 382, 459, 386, 396, 447, 502, - 426, 452, 330, 492, 461, 401, 582, 610, 0, 0, + 3020, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 464, 494, 0, 507, 0, 384, 385, 0, + 0, 0, 0, 0, 0, 0, 316, 471, 491, 329, + 458, 505, 334, 466, 483, 324, 425, 455, 0, 0, + 318, 489, 465, 407, 317, 0, 449, 357, 373, 354, + 423, 0, 488, 518, 353, 508, 0, 499, 320, 0, + 498, 422, 485, 490, 408, 401, 0, 319, 487, 406, + 400, 388, 363, 534, 389, 390, 378, 437, 398, 438, + 379, 412, 411, 413, 0, 0, 0, 0, 0, 529, + 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 0, 0, 664, + 0, 501, 0, 0, 0, 0, 0, 0, 469, 0, + 0, 391, 0, 0, 0, 519, 0, 452, 428, 698, + 0, 0, 450, 396, 486, 439, 492, 472, 500, 444, + 440, 310, 473, 356, 409, 325, 327, 688, 358, 360, + 364, 365, 418, 419, 433, 457, 476, 477, 478, 355, + 339, 451, 340, 375, 341, 311, 347, 345, 348, 459, + 349, 313, 434, 482, 0, 370, 447, 404, 314, 403, + 435, 481, 480, 326, 509, 516, 517, 607, 0, 522, + 699, 700, 701, 531, 0, 441, 322, 321, 0, 0, + 0, 351, 436, 335, 337, 338, 336, 431, 432, 536, + 537, 538, 540, 0, 541, 542, 0, 0, 0, 0, + 543, 608, 624, 592, 561, 524, 616, 558, 562, 563, + 381, 627, 0, 0, 0, 515, 392, 393, 0, 362, + 361, 405, 315, 0, 0, 0, 382, 368, 306, 307, + 694, 352, 424, 629, 662, 663, 554, 0, 617, 555, + 564, 344, 589, 601, 600, 420, 514, 0, 612, 615, + 544, 693, 0, 609, 623, 697, 622, 690, 430, 0, + 456, 620, 567, 0, 613, 586, 587, 0, 614, 582, + 618, 0, 556, 0, 525, 528, 557, 642, 643, 644, + 312, 527, 646, 647, 648, 649, 650, 651, 652, 645, + 497, 590, 566, 593, 506, 569, 568, 0, 0, 604, + 523, 605, 606, 414, 415, 416, 417, 372, 630, 333, + 526, 443, 0, 591, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 597, 594, 702, 0, 653, 654, 0, + 0, 520, 521, 367, 374, 539, 376, 332, 429, 369, + 504, 386, 0, 532, 598, 533, 445, 446, 656, 659, + 657, 658, 421, 380, 383, 460, 387, 397, 448, 503, + 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 636, 635, 634, 633, - 632, 631, 630, 0, 0, 579, 478, 346, 300, 342, - 343, 350, 690, 686, 483, 691, 0, 308, 559, 394, - 441, 366, 624, 625, 0, 676, 254, 255, 256, 257, + 0, 0, 0, 0, 0, 638, 637, 636, 635, 634, + 633, 632, 631, 0, 0, 580, 479, 346, 300, 342, + 343, 350, 691, 687, 484, 692, 0, 308, 560, 395, + 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, 277, 278, - 627, 269, 270, 279, 280, 281, 282, 283, 284, 285, + 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, 0, 0, - 0, 302, 678, 679, 680, 681, 682, 0, 0, 303, - 304, 305, 0, 0, 295, 469, 296, 297, 298, 299, - 0, 0, 509, 510, 511, 534, 0, 512, 494, 558, - 377, 309, 473, 501, 688, 0, 0, 0, 0, 0, - 0, 0, 609, 620, 654, 0, 664, 665, 667, 669, - 668, 671, 466, 467, 677, 0, 673, 674, 675, 672, - 398, 453, 474, 460, 0, 694, 549, 550, 695, 660, - 425, 0, 0, 564, 598, 587, 670, 552, 0, 0, + 0, 302, 679, 680, 681, 682, 683, 0, 0, 303, + 304, 305, 0, 0, 295, 470, 296, 297, 298, 299, + 0, 0, 510, 511, 512, 535, 0, 513, 495, 559, + 377, 309, 474, 502, 689, 0, 0, 0, 0, 0, + 0, 0, 610, 621, 655, 0, 665, 666, 668, 670, + 669, 672, 467, 468, 678, 0, 674, 675, 676, 673, + 399, 454, 475, 461, 0, 695, 550, 551, 696, 661, + 426, 0, 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, - 0, 393, 602, 583, 594, 584, 569, 570, 571, 578, - 371, 572, 573, 574, 544, 575, 545, 576, 577, 0, - 601, 551, 462, 409, 0, 618, 0, 0, 0, 0, + 0, 394, 603, 584, 595, 585, 570, 571, 572, 579, + 371, 573, 574, 575, 545, 576, 546, 577, 578, 0, + 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, - 0, 0, 0, 328, 241, 546, 666, 548, 547, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 2970, + 0, 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3019, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 463, 493, - 0, 506, 0, 383, 384, 0, 0, 0, 0, 0, - 0, 0, 316, 470, 490, 329, 457, 504, 334, 465, - 482, 324, 424, 454, 0, 0, 318, 488, 464, 406, - 317, 0, 448, 357, 373, 354, 422, 0, 487, 517, - 353, 507, 0, 498, 320, 0, 497, 421, 484, 489, - 407, 400, 0, 319, 486, 405, 399, 387, 363, 533, - 388, 389, 378, 436, 397, 437, 379, 411, 410, 412, - 0, 0, 0, 0, 0, 528, 529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 659, 0, 0, 663, 0, 500, 0, 0, - 0, 0, 0, 0, 468, 0, 0, 390, 0, 0, - 0, 518, 0, 451, 427, 697, 0, 0, 449, 395, - 485, 438, 491, 471, 499, 443, 439, 310, 472, 356, - 408, 325, 327, 687, 358, 360, 364, 365, 417, 418, - 432, 456, 475, 476, 477, 355, 339, 450, 340, 375, - 341, 311, 347, 345, 348, 458, 349, 313, 433, 481, - 0, 370, 446, 403, 314, 402, 434, 480, 479, 326, - 508, 515, 516, 606, 0, 521, 698, 699, 700, 530, - 0, 440, 322, 321, 0, 0, 0, 351, 435, 335, - 337, 338, 336, 430, 431, 535, 536, 537, 539, 0, - 540, 541, 0, 0, 0, 0, 542, 607, 623, 591, - 560, 523, 615, 557, 561, 562, 381, 626, 0, 0, - 0, 514, 391, 392, 0, 362, 361, 404, 315, 0, - 0, 368, 306, 307, 693, 352, 423, 628, 661, 662, - 553, 0, 616, 554, 563, 344, 588, 600, 599, 419, - 513, 0, 611, 614, 543, 692, 0, 608, 622, 696, - 621, 689, 429, 0, 455, 619, 566, 0, 612, 585, - 586, 0, 613, 581, 617, 0, 555, 0, 524, 527, - 556, 641, 642, 643, 312, 526, 645, 646, 647, 648, - 649, 650, 651, 644, 496, 589, 565, 592, 505, 568, - 567, 0, 0, 603, 522, 604, 605, 413, 414, 415, - 416, 372, 629, 333, 525, 442, 0, 590, 0, 0, - 0, 0, 0, 0, 0, 0, 595, 596, 593, 701, - 0, 652, 653, 0, 0, 519, 520, 367, 374, 538, - 376, 332, 428, 369, 503, 385, 0, 531, 597, 532, - 444, 445, 655, 658, 656, 657, 420, 380, 382, 459, - 386, 396, 447, 502, 426, 452, 330, 492, 461, 401, - 582, 610, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 636, 635, 634, 633, 632, 631, 630, 0, 0, 579, - 478, 346, 300, 342, 343, 350, 690, 686, 483, 691, - 0, 308, 559, 394, 441, 366, 624, 625, 0, 676, - 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, - 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, - 275, 276, 277, 278, 627, 269, 270, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 0, 0, 0, 0, 302, 678, 679, 680, 681, - 682, 0, 0, 303, 304, 305, 0, 0, 295, 469, - 296, 297, 298, 299, 0, 0, 509, 510, 511, 534, - 0, 512, 494, 558, 377, 309, 473, 501, 688, 0, - 0, 0, 0, 0, 0, 0, 609, 620, 654, 0, - 664, 665, 667, 669, 668, 671, 466, 467, 677, 0, - 673, 674, 675, 672, 398, 453, 474, 460, 0, 694, - 549, 550, 695, 660, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 359, 0, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 0, 601, 551, 462, 409, 0, 618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 2969, 0, 0, 0, 328, 241, 546, - 666, 548, 547, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 464, 494, + 0, 507, 0, 384, 385, 0, 0, 0, 0, 0, + 0, 0, 316, 471, 491, 329, 458, 505, 334, 466, + 483, 324, 425, 455, 0, 0, 318, 489, 465, 407, + 317, 0, 449, 357, 373, 354, 423, 0, 488, 518, + 353, 508, 0, 499, 320, 0, 498, 422, 485, 490, + 408, 401, 0, 319, 487, 406, 400, 388, 363, 534, + 389, 390, 378, 437, 398, 438, 379, 412, 411, 413, + 0, 0, 0, 0, 0, 529, 530, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 0, 0, 664, 0, 501, 0, 0, + 0, 0, 0, 0, 469, 0, 0, 391, 0, 0, + 0, 519, 0, 452, 428, 698, 0, 0, 450, 396, + 486, 439, 492, 472, 500, 444, 440, 310, 473, 356, + 409, 325, 327, 688, 358, 360, 364, 365, 418, 419, + 433, 457, 476, 477, 478, 355, 339, 451, 340, 375, + 341, 311, 347, 345, 348, 459, 349, 313, 434, 482, + 0, 370, 447, 404, 314, 403, 435, 481, 480, 326, + 509, 516, 517, 607, 0, 522, 699, 700, 701, 531, + 0, 441, 322, 321, 0, 0, 0, 351, 436, 335, + 337, 338, 336, 431, 432, 536, 537, 538, 540, 0, + 541, 542, 0, 0, 0, 0, 543, 608, 624, 592, + 561, 524, 616, 558, 562, 563, 381, 627, 0, 0, + 0, 515, 392, 393, 0, 362, 361, 405, 315, 0, + 0, 0, 382, 368, 306, 307, 694, 352, 424, 629, + 662, 663, 554, 0, 617, 555, 564, 344, 589, 601, + 600, 420, 514, 0, 612, 615, 544, 693, 0, 609, + 623, 697, 622, 690, 430, 0, 456, 620, 567, 0, + 613, 586, 587, 0, 614, 582, 618, 0, 556, 0, + 525, 528, 557, 642, 643, 644, 312, 527, 646, 647, + 648, 649, 650, 651, 652, 645, 497, 590, 566, 593, + 506, 569, 568, 0, 0, 604, 523, 605, 606, 414, + 415, 416, 417, 372, 630, 333, 526, 443, 0, 591, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 597, + 594, 702, 0, 653, 654, 0, 0, 520, 521, 367, + 374, 539, 376, 332, 429, 369, 504, 386, 0, 532, + 598, 533, 445, 446, 656, 659, 657, 658, 421, 380, + 383, 460, 387, 397, 448, 503, 427, 453, 330, 493, + 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 0, - 0, 0, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 482, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 0, 487, 517, 353, 507, 0, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 533, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 0, 0, 663, - 0, 500, 0, 0, 0, 0, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 518, 0, 451, 427, 697, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 443, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 515, 516, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 352, - 423, 628, 661, 662, 553, 0, 616, 554, 563, 344, - 588, 600, 599, 419, 513, 0, 611, 614, 543, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 651, 644, 496, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 522, 604, - 605, 413, 414, 415, 416, 372, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 0, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 254, 255, 256, 257, 258, 259, - 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, - 271, 272, 273, 274, 275, 276, 277, 278, 627, 269, - 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, - 678, 679, 680, 681, 682, 0, 0, 303, 304, 305, - 0, 0, 295, 469, 296, 297, 298, 299, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 668, 671, - 466, 467, 677, 0, 673, 674, 675, 672, 398, 453, - 474, 460, 0, 694, 549, 550, 695, 660, 425, 0, - 0, 564, 598, 587, 670, 552, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 359, 0, 0, 393, - 602, 583, 594, 584, 569, 570, 571, 578, 371, 572, - 573, 574, 544, 575, 545, 576, 577, 0, 601, 551, - 462, 409, 0, 618, 0, 0, 0, 0, 0, 0, + 0, 638, 637, 636, 635, 634, 633, 632, 631, 0, + 0, 580, 479, 346, 300, 342, 343, 350, 691, 687, + 484, 692, 0, 308, 560, 395, 442, 366, 625, 626, + 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, + 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, + 273, 274, 275, 276, 277, 278, 628, 269, 270, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 0, 0, 0, 302, 679, 680, + 681, 682, 683, 0, 0, 303, 304, 305, 0, 0, + 295, 470, 296, 297, 298, 299, 0, 0, 510, 511, + 512, 535, 0, 513, 495, 559, 377, 309, 474, 502, + 689, 0, 0, 0, 0, 0, 0, 0, 610, 621, + 655, 0, 665, 666, 668, 670, 669, 672, 467, 468, + 678, 0, 674, 675, 676, 673, 399, 454, 475, 461, + 0, 695, 550, 551, 696, 661, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 0, 602, 552, 463, 410, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, - 0, 328, 241, 546, 666, 548, 547, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 0, 240, 0, 0, 0, 0, 0, 0, 328, + 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2353, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 463, 493, 0, 506, - 0, 383, 384, 0, 0, 0, 0, 0, 0, 0, - 316, 470, 490, 329, 457, 504, 334, 465, 482, 324, - 424, 454, 0, 0, 318, 488, 464, 406, 317, 0, - 448, 357, 373, 354, 422, 0, 487, 517, 353, 507, - 0, 498, 320, 0, 497, 421, 484, 489, 407, 400, - 0, 319, 486, 405, 399, 387, 363, 533, 388, 389, - 378, 436, 397, 437, 379, 411, 410, 412, 0, 0, - 0, 0, 0, 528, 529, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 659, 0, 0, 663, 0, 500, 0, 0, 0, 0, - 0, 0, 468, 0, 0, 390, 0, 0, 0, 518, - 0, 451, 427, 697, 0, 0, 449, 395, 485, 438, - 491, 471, 499, 443, 439, 310, 472, 356, 408, 325, - 327, 687, 358, 360, 364, 365, 417, 418, 432, 456, - 475, 476, 477, 355, 339, 450, 340, 375, 341, 311, - 347, 345, 348, 458, 349, 313, 433, 481, 0, 370, - 446, 403, 314, 402, 434, 480, 479, 326, 508, 515, - 516, 606, 0, 521, 698, 699, 700, 530, 0, 440, - 322, 321, 0, 0, 0, 351, 435, 335, 337, 338, - 336, 430, 431, 535, 536, 537, 539, 0, 540, 541, - 0, 0, 0, 0, 542, 607, 623, 591, 560, 523, - 615, 557, 561, 562, 381, 626, 0, 0, 0, 514, - 391, 392, 0, 362, 361, 404, 315, 0, 0, 368, - 306, 307, 693, 352, 423, 628, 661, 662, 553, 0, - 616, 554, 563, 344, 588, 600, 599, 419, 513, 0, - 611, 614, 543, 692, 0, 608, 622, 696, 621, 689, - 429, 0, 455, 619, 566, 0, 612, 585, 586, 0, - 613, 581, 617, 0, 555, 0, 524, 527, 556, 641, - 642, 643, 312, 526, 645, 646, 647, 648, 649, 650, - 651, 644, 496, 589, 565, 592, 505, 568, 567, 0, - 0, 603, 522, 604, 605, 413, 414, 415, 416, 372, - 629, 333, 525, 442, 0, 590, 0, 0, 0, 0, - 0, 0, 0, 0, 595, 596, 593, 701, 0, 652, - 653, 0, 0, 519, 520, 367, 374, 538, 376, 332, - 428, 369, 503, 385, 0, 531, 597, 532, 444, 445, - 655, 658, 656, 657, 420, 380, 382, 459, 386, 396, - 447, 502, 426, 452, 330, 492, 461, 401, 582, 610, + 0, 0, 2354, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 0, 0, 0, 0, 0, 0, 0, 316, 471, + 491, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 0, 488, 518, 353, 508, 0, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 534, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 0, + 0, 664, 0, 501, 0, 0, 0, 0, 0, 0, + 469, 0, 0, 391, 0, 0, 0, 519, 0, 452, + 428, 698, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 0, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 352, 424, 629, 662, 663, 554, 0, + 617, 555, 564, 344, 589, 601, 600, 420, 514, 0, + 612, 615, 544, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 497, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 523, 605, 606, 414, 415, 416, 417, 372, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 636, 635, - 634, 633, 632, 631, 630, 0, 0, 579, 478, 346, - 300, 342, 343, 350, 690, 686, 483, 691, 0, 308, - 559, 394, 441, 366, 624, 625, 0, 676, 254, 255, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 0, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, - 277, 278, 627, 269, 270, 279, 280, 281, 282, 283, + 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, - 0, 0, 0, 302, 678, 679, 680, 681, 682, 0, - 0, 303, 304, 305, 0, 0, 295, 469, 296, 297, - 298, 299, 0, 0, 509, 510, 511, 534, 0, 512, - 494, 558, 377, 309, 473, 501, 688, 0, 0, 0, - 0, 0, 0, 0, 609, 620, 654, 0, 664, 665, - 667, 669, 668, 671, 466, 467, 677, 0, 673, 674, - 675, 672, 398, 453, 474, 460, 0, 694, 549, 550, - 695, 660, 425, 0, 0, 564, 598, 587, 670, 552, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 359, 0, 0, 393, 602, 583, 594, 584, 569, 570, - 571, 578, 371, 572, 573, 574, 544, 575, 545, 576, - 577, 0, 601, 551, 462, 409, 0, 618, 0, 0, + 0, 0, 0, 302, 679, 680, 681, 682, 683, 0, + 0, 303, 304, 305, 0, 0, 295, 470, 296, 297, + 298, 299, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 669, 672, 467, 468, 678, 0, 674, 675, + 676, 673, 399, 454, 475, 461, 0, 695, 550, 551, + 696, 661, 426, 0, 0, 565, 599, 588, 671, 553, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 359, 0, 0, 394, 603, 584, 595, 585, 570, 571, + 572, 579, 371, 573, 574, 575, 545, 576, 546, 577, + 578, 0, 602, 552, 463, 410, 0, 619, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, + 0, 2845, 0, 0, 0, 328, 241, 547, 667, 549, + 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 2844, 0, 0, 0, 328, 241, 546, 666, 548, - 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 464, 494, 0, 507, 0, 384, 385, 0, 0, 0, + 0, 0, 0, 0, 316, 471, 491, 329, 458, 505, + 334, 466, 483, 324, 425, 455, 0, 0, 318, 489, + 465, 407, 317, 0, 449, 357, 373, 354, 423, 0, + 488, 518, 353, 508, 0, 499, 320, 0, 498, 422, + 485, 490, 408, 401, 0, 319, 487, 406, 400, 388, + 363, 534, 389, 390, 378, 437, 398, 438, 379, 412, + 411, 413, 0, 0, 0, 0, 0, 529, 530, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 660, 0, 0, 664, 0, 501, + 0, 0, 0, 0, 0, 0, 469, 0, 0, 391, + 0, 0, 0, 519, 0, 452, 428, 698, 0, 0, + 450, 396, 486, 439, 492, 472, 500, 444, 440, 310, + 473, 356, 409, 325, 327, 688, 358, 360, 364, 365, + 418, 419, 433, 457, 476, 477, 478, 355, 339, 451, + 340, 375, 341, 311, 347, 345, 348, 459, 349, 313, + 434, 482, 0, 370, 447, 404, 314, 403, 435, 481, + 480, 326, 509, 516, 517, 607, 0, 522, 699, 700, + 701, 531, 0, 441, 322, 321, 0, 0, 0, 351, + 436, 335, 337, 338, 336, 431, 432, 536, 537, 538, + 540, 0, 541, 542, 0, 0, 0, 0, 543, 608, + 624, 592, 561, 524, 616, 558, 562, 563, 381, 627, + 0, 0, 0, 515, 392, 393, 0, 362, 361, 405, + 315, 0, 0, 0, 382, 368, 306, 307, 694, 352, + 424, 629, 662, 663, 554, 0, 617, 555, 564, 344, + 589, 601, 600, 420, 514, 0, 612, 615, 544, 693, + 0, 609, 623, 697, 622, 690, 430, 0, 456, 620, + 567, 0, 613, 586, 587, 0, 614, 582, 618, 0, + 556, 0, 525, 528, 557, 642, 643, 644, 312, 527, + 646, 647, 648, 649, 650, 651, 652, 645, 497, 590, + 566, 593, 506, 569, 568, 0, 0, 604, 523, 605, + 606, 414, 415, 416, 417, 372, 630, 333, 526, 443, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 597, 594, 702, 0, 653, 654, 0, 0, 520, + 521, 367, 374, 539, 376, 332, 429, 369, 504, 386, + 0, 532, 598, 533, 445, 446, 656, 659, 657, 658, + 421, 380, 383, 460, 387, 397, 448, 503, 427, 453, + 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 637, 636, 635, 634, 633, 632, + 631, 0, 0, 580, 479, 346, 300, 342, 343, 350, + 691, 687, 484, 692, 0, 308, 560, 395, 442, 366, + 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, + 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, + 271, 272, 273, 274, 275, 276, 277, 278, 628, 269, + 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, + 679, 680, 681, 682, 683, 0, 0, 303, 304, 305, + 0, 0, 295, 470, 296, 297, 298, 299, 0, 0, + 510, 511, 512, 535, 0, 513, 495, 559, 377, 309, + 474, 502, 689, 0, 0, 0, 0, 0, 0, 0, + 610, 621, 655, 0, 665, 666, 668, 670, 669, 672, + 467, 468, 678, 0, 674, 675, 676, 673, 399, 454, + 475, 461, 0, 695, 550, 551, 696, 661, 426, 0, + 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 359, 0, 0, 394, + 603, 584, 595, 585, 570, 571, 572, 579, 371, 573, + 574, 575, 545, 576, 546, 577, 578, 0, 602, 552, + 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, + 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 463, 493, 0, 506, 0, 383, 384, 0, 0, 0, - 0, 0, 0, 0, 316, 470, 490, 329, 457, 504, - 334, 465, 482, 324, 424, 454, 0, 0, 318, 488, - 464, 406, 317, 0, 448, 357, 373, 354, 422, 0, - 487, 517, 353, 507, 0, 498, 320, 0, 497, 421, - 484, 489, 407, 400, 0, 319, 486, 405, 399, 387, - 363, 533, 388, 389, 378, 436, 397, 437, 379, 411, - 410, 412, 0, 0, 0, 0, 0, 528, 529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 659, 0, 0, 663, 0, 500, - 0, 0, 0, 0, 0, 0, 468, 0, 0, 390, - 0, 0, 0, 518, 0, 451, 427, 697, 0, 0, - 449, 395, 485, 438, 491, 471, 499, 443, 439, 310, - 472, 356, 408, 325, 327, 687, 358, 360, 364, 365, - 417, 418, 432, 456, 475, 476, 477, 355, 339, 450, - 340, 375, 341, 311, 347, 345, 348, 458, 349, 313, - 433, 481, 0, 370, 446, 403, 314, 402, 434, 480, - 479, 326, 508, 515, 516, 606, 0, 521, 698, 699, - 700, 530, 0, 440, 322, 321, 0, 0, 0, 351, - 435, 335, 337, 338, 336, 430, 431, 535, 536, 537, - 539, 0, 540, 541, 0, 0, 0, 0, 542, 607, - 623, 591, 560, 523, 615, 557, 561, 562, 381, 626, - 0, 0, 0, 514, 391, 392, 0, 362, 361, 404, - 315, 0, 0, 368, 306, 307, 693, 352, 423, 628, - 661, 662, 553, 0, 616, 554, 563, 344, 588, 600, - 599, 419, 513, 0, 611, 614, 543, 692, 0, 608, - 622, 696, 621, 689, 429, 0, 455, 619, 566, 0, - 612, 585, 586, 0, 613, 581, 617, 0, 555, 0, - 524, 527, 556, 641, 642, 643, 312, 526, 645, 646, - 647, 648, 649, 650, 651, 644, 496, 589, 565, 592, - 505, 568, 567, 0, 0, 603, 522, 604, 605, 413, - 414, 415, 416, 372, 629, 333, 525, 442, 0, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 595, 596, - 593, 701, 0, 652, 653, 0, 0, 519, 520, 367, - 374, 538, 376, 332, 428, 369, 503, 385, 0, 531, - 597, 532, 444, 445, 655, 658, 656, 657, 420, 380, - 382, 459, 386, 396, 447, 502, 426, 452, 330, 492, - 461, 401, 582, 610, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 636, 635, 634, 633, 632, 631, 630, 0, - 0, 579, 478, 346, 300, 342, 343, 350, 690, 686, - 483, 691, 0, 308, 559, 394, 441, 366, 624, 625, - 0, 676, 254, 255, 256, 257, 258, 259, 260, 261, - 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, - 273, 274, 275, 276, 277, 278, 627, 269, 270, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 0, 0, 0, 0, 302, 678, 679, - 680, 681, 682, 0, 0, 303, 304, 305, 0, 0, - 295, 469, 296, 297, 298, 299, 0, 0, 509, 510, - 511, 534, 0, 512, 494, 558, 377, 309, 473, 501, - 688, 0, 0, 0, 0, 0, 0, 0, 609, 620, - 654, 0, 664, 665, 667, 669, 668, 671, 466, 467, - 677, 0, 673, 674, 675, 672, 398, 453, 474, 460, - 0, 694, 549, 550, 695, 660, 425, 0, 0, 564, - 598, 587, 670, 552, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 359, 0, 0, 393, 602, 583, - 594, 584, 569, 570, 571, 578, 371, 572, 573, 574, - 544, 575, 545, 576, 577, 0, 601, 551, 462, 409, - 0, 618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 0, 0, 0, 0, 328, - 241, 546, 666, 548, 547, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2800, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 464, 494, 0, 507, + 0, 384, 385, 0, 0, 0, 0, 0, 0, 0, + 316, 471, 491, 329, 458, 505, 334, 466, 483, 324, + 425, 455, 0, 0, 318, 489, 465, 407, 317, 0, + 449, 357, 373, 354, 423, 0, 488, 518, 353, 508, + 0, 499, 320, 0, 498, 422, 485, 490, 408, 401, + 0, 319, 487, 406, 400, 388, 363, 534, 389, 390, + 378, 437, 398, 438, 379, 412, 411, 413, 0, 0, + 0, 0, 0, 529, 530, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 660, 0, 0, 664, 0, 501, 0, 0, 0, 0, + 0, 0, 469, 0, 0, 391, 0, 0, 0, 519, + 0, 452, 428, 698, 0, 0, 450, 396, 486, 439, + 492, 472, 500, 444, 440, 310, 473, 356, 409, 325, + 327, 688, 358, 360, 364, 365, 418, 419, 433, 457, + 476, 477, 478, 355, 339, 451, 340, 375, 341, 311, + 347, 345, 348, 459, 349, 313, 434, 482, 0, 370, + 447, 404, 314, 403, 435, 481, 480, 326, 509, 516, + 517, 607, 0, 522, 699, 700, 701, 531, 0, 441, + 322, 321, 0, 0, 0, 351, 436, 335, 337, 338, + 336, 431, 432, 536, 537, 538, 540, 0, 541, 542, + 0, 0, 0, 0, 543, 608, 624, 592, 561, 524, + 616, 558, 562, 563, 381, 627, 0, 0, 0, 515, + 392, 393, 0, 362, 361, 405, 315, 0, 0, 0, + 382, 368, 306, 307, 694, 352, 424, 629, 662, 663, + 554, 0, 617, 555, 564, 344, 589, 601, 600, 420, + 514, 0, 612, 615, 544, 693, 0, 609, 623, 697, + 622, 690, 430, 0, 456, 620, 567, 0, 613, 586, + 587, 0, 614, 582, 618, 0, 556, 0, 525, 528, + 557, 642, 643, 644, 312, 527, 646, 647, 648, 649, + 650, 651, 652, 645, 497, 590, 566, 593, 506, 569, + 568, 0, 0, 604, 523, 605, 606, 414, 415, 416, + 417, 372, 630, 333, 526, 443, 0, 591, 0, 0, + 0, 0, 0, 0, 0, 0, 596, 597, 594, 702, + 0, 653, 654, 0, 0, 520, 521, 367, 374, 539, + 376, 332, 429, 369, 504, 386, 0, 532, 598, 533, + 445, 446, 656, 659, 657, 658, 421, 380, 383, 460, + 387, 397, 448, 503, 427, 453, 330, 493, 462, 402, + 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, + 637, 636, 635, 634, 633, 632, 631, 0, 0, 580, + 479, 346, 300, 342, 343, 350, 691, 687, 484, 692, + 0, 308, 560, 395, 442, 366, 625, 626, 0, 677, + 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, + 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, + 275, 276, 277, 278, 628, 269, 270, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 0, 0, 0, 302, 679, 680, 681, 682, + 683, 0, 0, 303, 304, 305, 0, 0, 295, 470, + 296, 297, 298, 299, 0, 0, 510, 511, 512, 535, + 0, 513, 495, 559, 377, 309, 474, 502, 689, 0, + 0, 0, 0, 0, 0, 0, 610, 621, 655, 0, + 665, 666, 668, 670, 669, 672, 467, 468, 678, 0, + 674, 675, 676, 673, 399, 454, 475, 461, 0, 695, + 550, 551, 696, 661, 426, 0, 0, 565, 599, 588, + 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 359, 0, 0, 394, 603, 584, 595, 585, + 570, 571, 572, 579, 371, 573, 574, 575, 545, 576, + 546, 577, 578, 0, 602, 552, 463, 410, 0, 619, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 2798, 0, 0, 0, 328, 241, 547, + 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2799, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 463, 493, 0, 506, 0, 383, - 384, 0, 0, 0, 0, 0, 0, 0, 316, 470, - 490, 329, 457, 504, 334, 465, 482, 324, 424, 454, - 0, 0, 318, 488, 464, 406, 317, 0, 448, 357, - 373, 354, 422, 0, 487, 517, 353, 507, 0, 498, - 320, 0, 497, 421, 484, 489, 407, 400, 0, 319, - 486, 405, 399, 387, 363, 533, 388, 389, 378, 436, - 397, 437, 379, 411, 410, 412, 0, 0, 0, 0, - 0, 528, 529, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 659, 0, - 0, 663, 0, 500, 0, 0, 0, 0, 0, 0, - 468, 0, 0, 390, 0, 0, 0, 518, 0, 451, - 427, 697, 0, 0, 449, 395, 485, 438, 491, 471, - 499, 443, 439, 310, 472, 356, 408, 325, 327, 687, - 358, 360, 364, 365, 417, 418, 432, 456, 475, 476, - 477, 355, 339, 450, 340, 375, 341, 311, 347, 345, - 348, 458, 349, 313, 433, 481, 0, 370, 446, 403, - 314, 402, 434, 480, 479, 326, 508, 515, 516, 606, - 0, 521, 698, 699, 700, 530, 0, 440, 322, 321, - 0, 0, 0, 351, 435, 335, 337, 338, 336, 430, - 431, 535, 536, 537, 539, 0, 540, 541, 0, 0, - 0, 0, 542, 607, 623, 591, 560, 523, 615, 557, - 561, 562, 381, 626, 0, 0, 0, 514, 391, 392, - 0, 362, 361, 404, 315, 0, 0, 368, 306, 307, - 693, 352, 423, 628, 661, 662, 553, 0, 616, 554, - 563, 344, 588, 600, 599, 419, 513, 0, 611, 614, - 543, 692, 0, 608, 622, 696, 621, 689, 429, 0, - 455, 619, 566, 0, 612, 585, 586, 0, 613, 581, - 617, 0, 555, 0, 524, 527, 556, 641, 642, 643, - 312, 526, 645, 646, 647, 648, 649, 650, 651, 644, - 496, 589, 565, 592, 505, 568, 567, 0, 0, 603, - 522, 604, 605, 413, 414, 415, 416, 372, 629, 333, - 525, 442, 0, 590, 0, 0, 0, 0, 0, 0, - 0, 0, 595, 596, 593, 701, 0, 652, 653, 0, - 0, 519, 520, 367, 374, 538, 376, 332, 428, 369, - 503, 385, 0, 531, 597, 532, 444, 445, 655, 658, - 656, 657, 420, 380, 382, 459, 386, 396, 447, 502, - 426, 452, 330, 492, 461, 401, 582, 610, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 464, 494, 0, 507, 0, 384, 385, 0, + 0, 0, 0, 0, 0, 0, 316, 471, 491, 329, + 458, 505, 334, 466, 483, 324, 425, 455, 0, 0, + 318, 489, 465, 407, 317, 0, 449, 357, 373, 354, + 423, 0, 488, 518, 353, 508, 0, 499, 320, 0, + 498, 422, 485, 490, 408, 401, 0, 319, 487, 406, + 400, 388, 363, 534, 389, 390, 378, 437, 398, 438, + 379, 412, 411, 413, 0, 0, 0, 0, 0, 529, + 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 0, 0, 664, + 0, 501, 0, 0, 0, 0, 0, 0, 469, 0, + 0, 391, 0, 0, 0, 519, 0, 452, 428, 698, + 0, 0, 450, 396, 486, 439, 492, 472, 500, 444, + 440, 310, 473, 356, 409, 325, 327, 688, 358, 360, + 364, 365, 418, 419, 433, 457, 476, 477, 478, 355, + 339, 451, 340, 375, 341, 311, 347, 345, 348, 459, + 349, 313, 434, 482, 0, 370, 447, 404, 314, 403, + 435, 481, 480, 326, 509, 516, 517, 607, 0, 522, + 699, 700, 701, 531, 0, 441, 322, 321, 0, 0, + 0, 351, 436, 335, 337, 338, 336, 431, 432, 536, + 537, 538, 540, 0, 541, 542, 0, 0, 0, 0, + 543, 608, 624, 592, 561, 524, 616, 558, 562, 563, + 381, 627, 0, 0, 0, 515, 392, 393, 0, 362, + 361, 405, 315, 0, 0, 0, 382, 368, 306, 307, + 694, 352, 424, 629, 662, 663, 554, 0, 617, 555, + 564, 344, 589, 601, 600, 420, 514, 0, 612, 615, + 544, 693, 0, 609, 623, 697, 622, 690, 430, 0, + 456, 620, 567, 0, 613, 586, 587, 0, 614, 582, + 618, 0, 556, 0, 525, 528, 557, 642, 643, 644, + 312, 527, 646, 647, 648, 649, 650, 651, 652, 645, + 497, 590, 566, 593, 506, 569, 568, 0, 0, 604, + 523, 605, 606, 414, 415, 416, 417, 372, 630, 333, + 526, 443, 0, 591, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 597, 594, 702, 0, 653, 654, 0, + 0, 520, 521, 367, 374, 539, 376, 332, 429, 369, + 504, 386, 0, 532, 598, 533, 445, 446, 656, 659, + 657, 658, 421, 380, 383, 460, 387, 397, 448, 503, + 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 636, 635, 634, 633, - 632, 631, 630, 0, 0, 579, 478, 346, 300, 342, - 343, 350, 690, 686, 483, 691, 0, 308, 559, 394, - 441, 366, 624, 625, 0, 676, 254, 255, 256, 257, + 0, 0, 0, 0, 0, 638, 637, 636, 635, 634, + 633, 632, 631, 0, 0, 580, 479, 346, 300, 342, + 343, 350, 691, 687, 484, 692, 0, 308, 560, 395, + 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, 277, 278, - 627, 269, 270, 279, 280, 281, 282, 283, 284, 285, + 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, 0, 0, - 0, 302, 678, 679, 680, 681, 682, 0, 0, 303, - 304, 305, 0, 0, 295, 469, 296, 297, 298, 299, - 0, 0, 509, 510, 511, 534, 0, 512, 494, 558, - 377, 309, 473, 501, 688, 0, 0, 0, 0, 0, - 0, 0, 609, 620, 654, 0, 664, 665, 667, 669, - 668, 671, 466, 467, 677, 0, 673, 674, 675, 672, - 398, 453, 474, 460, 0, 694, 549, 550, 695, 660, - 425, 0, 0, 564, 598, 587, 670, 552, 0, 0, + 0, 302, 679, 680, 681, 682, 683, 0, 0, 303, + 304, 305, 0, 0, 295, 470, 296, 297, 298, 299, + 0, 0, 510, 511, 512, 535, 0, 513, 495, 559, + 377, 309, 474, 502, 689, 0, 0, 0, 0, 0, + 0, 0, 610, 621, 655, 0, 665, 666, 668, 670, + 669, 672, 467, 468, 678, 0, 674, 675, 676, 673, + 399, 454, 475, 461, 2556, 695, 550, 551, 696, 661, + 426, 0, 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, - 0, 393, 602, 583, 594, 584, 569, 570, 571, 578, - 371, 572, 573, 574, 544, 575, 545, 576, 577, 0, - 601, 551, 462, 409, 0, 618, 0, 0, 0, 0, + 0, 394, 603, 584, 595, 585, 570, 571, 572, 579, + 371, 573, 574, 575, 545, 576, 546, 577, 578, 0, + 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 2797, - 0, 0, 0, 328, 241, 546, 666, 548, 547, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, + 0, 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 463, 493, - 0, 506, 0, 383, 384, 0, 0, 0, 0, 0, - 0, 0, 316, 470, 490, 329, 457, 504, 334, 465, - 482, 324, 424, 454, 0, 0, 318, 488, 464, 406, - 317, 0, 448, 357, 373, 354, 422, 0, 487, 517, - 353, 507, 0, 498, 320, 0, 497, 421, 484, 489, - 407, 400, 0, 319, 486, 405, 399, 387, 363, 533, - 388, 389, 378, 436, 397, 437, 379, 411, 410, 412, - 0, 0, 0, 0, 0, 528, 529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 659, 0, 0, 663, 0, 500, 0, 0, - 0, 0, 0, 0, 468, 0, 0, 390, 0, 0, - 0, 518, 0, 451, 427, 697, 0, 0, 449, 395, - 485, 438, 491, 471, 499, 443, 439, 310, 472, 356, - 408, 325, 327, 687, 358, 360, 364, 365, 417, 418, - 432, 456, 475, 476, 477, 355, 339, 450, 340, 375, - 341, 311, 347, 345, 348, 458, 349, 313, 433, 481, - 0, 370, 446, 403, 314, 402, 434, 480, 479, 326, - 508, 515, 516, 606, 0, 521, 698, 699, 700, 530, - 0, 440, 322, 321, 0, 0, 0, 351, 435, 335, - 337, 338, 336, 430, 431, 535, 536, 537, 539, 0, - 540, 541, 0, 0, 0, 0, 542, 607, 623, 591, - 560, 523, 615, 557, 561, 562, 381, 626, 0, 0, - 0, 514, 391, 392, 0, 362, 361, 404, 315, 0, - 0, 368, 306, 307, 693, 352, 423, 628, 661, 662, - 553, 0, 616, 554, 563, 344, 588, 600, 599, 419, - 513, 0, 611, 614, 543, 692, 0, 608, 622, 696, - 621, 689, 429, 0, 455, 619, 566, 0, 612, 585, - 586, 0, 613, 581, 617, 0, 555, 0, 524, 527, - 556, 641, 642, 643, 312, 526, 645, 646, 647, 648, - 649, 650, 651, 644, 496, 589, 565, 592, 505, 568, - 567, 0, 0, 603, 522, 604, 605, 413, 414, 415, - 416, 372, 629, 333, 525, 442, 0, 590, 0, 0, - 0, 0, 0, 0, 0, 0, 595, 596, 593, 701, - 0, 652, 653, 0, 0, 519, 520, 367, 374, 538, - 376, 332, 428, 369, 503, 385, 0, 531, 597, 532, - 444, 445, 655, 658, 656, 657, 420, 380, 382, 459, - 386, 396, 447, 502, 426, 452, 330, 492, 461, 401, - 582, 610, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 636, 635, 634, 633, 632, 631, 630, 0, 0, 579, - 478, 346, 300, 342, 343, 350, 690, 686, 483, 691, - 0, 308, 559, 394, 441, 366, 624, 625, 0, 676, - 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, - 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, - 275, 276, 277, 278, 627, 269, 270, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 0, 0, 0, 0, 302, 678, 679, 680, 681, - 682, 0, 0, 303, 304, 305, 0, 0, 295, 469, - 296, 297, 298, 299, 0, 0, 509, 510, 511, 534, - 0, 512, 494, 558, 377, 309, 473, 501, 688, 0, - 0, 0, 0, 0, 0, 0, 609, 620, 654, 0, - 664, 665, 667, 669, 668, 671, 466, 467, 677, 0, - 673, 674, 675, 672, 398, 453, 474, 460, 2555, 694, - 549, 550, 695, 660, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 359, 0, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 0, 601, 551, 462, 409, 0, 618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 0, 0, 0, 0, 328, 241, 546, - 666, 548, 547, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 0, - 0, 0, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 482, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 0, 487, 517, 353, 507, 0, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 533, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 0, 0, 663, - 0, 500, 0, 0, 0, 0, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 518, 0, 451, 427, 697, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 443, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 515, 516, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 352, - 423, 628, 661, 662, 553, 0, 616, 554, 563, 344, - 588, 600, 599, 419, 513, 0, 611, 614, 543, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 651, 644, 496, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 522, 604, - 605, 413, 414, 415, 416, 372, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 464, 494, + 0, 507, 0, 384, 385, 0, 0, 0, 0, 0, + 0, 0, 316, 471, 491, 329, 458, 505, 334, 466, + 483, 324, 425, 455, 0, 0, 318, 489, 465, 407, + 317, 0, 449, 357, 373, 354, 423, 0, 488, 518, + 353, 508, 0, 499, 320, 0, 498, 422, 485, 490, + 408, 401, 0, 319, 487, 406, 400, 388, 363, 534, + 389, 390, 378, 437, 398, 438, 379, 412, 411, 413, + 0, 0, 0, 0, 0, 529, 530, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 0, 0, 664, 0, 501, 0, 0, + 0, 0, 0, 0, 469, 0, 0, 391, 0, 0, + 0, 519, 0, 452, 428, 698, 0, 0, 450, 396, + 486, 439, 492, 472, 500, 444, 440, 310, 473, 356, + 409, 325, 327, 688, 358, 360, 364, 365, 418, 419, + 433, 457, 476, 477, 478, 355, 339, 451, 340, 375, + 341, 311, 347, 345, 348, 459, 349, 313, 434, 482, + 0, 370, 447, 404, 314, 403, 435, 481, 480, 326, + 509, 516, 517, 607, 0, 522, 699, 700, 701, 531, + 0, 441, 322, 321, 0, 0, 0, 351, 436, 335, + 337, 338, 336, 431, 432, 536, 537, 538, 540, 0, + 541, 542, 0, 0, 0, 0, 543, 608, 624, 592, + 561, 524, 616, 558, 562, 563, 381, 627, 0, 0, + 0, 515, 392, 393, 0, 362, 361, 405, 315, 0, + 0, 0, 382, 368, 306, 307, 694, 352, 424, 629, + 662, 663, 554, 0, 617, 555, 564, 344, 589, 601, + 600, 420, 514, 0, 612, 615, 544, 693, 0, 609, + 623, 697, 622, 690, 430, 0, 456, 620, 567, 0, + 613, 586, 587, 0, 614, 582, 618, 0, 556, 0, + 525, 528, 557, 642, 643, 644, 312, 527, 646, 647, + 648, 649, 650, 651, 652, 645, 497, 590, 566, 593, + 506, 569, 568, 0, 0, 604, 523, 605, 606, 414, + 415, 416, 417, 372, 630, 333, 526, 443, 0, 591, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 597, + 594, 702, 0, 653, 654, 0, 0, 520, 521, 367, + 374, 539, 376, 332, 429, 369, 504, 386, 0, 532, + 598, 533, 445, 446, 656, 659, 657, 658, 421, 380, + 383, 460, 387, 397, 448, 503, 427, 453, 330, 493, + 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 0, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 254, 255, 256, 257, 258, 259, - 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, - 271, 272, 273, 274, 275, 276, 277, 278, 627, 269, - 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, - 678, 679, 680, 681, 682, 0, 0, 303, 304, 305, - 0, 0, 295, 469, 296, 297, 298, 299, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 668, 671, - 466, 467, 677, 0, 673, 674, 675, 672, 398, 453, - 474, 460, 0, 694, 549, 550, 695, 660, 425, 0, - 0, 564, 598, 587, 670, 552, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 359, 0, 0, 393, - 602, 583, 594, 584, 569, 570, 571, 578, 371, 572, - 573, 574, 544, 575, 545, 576, 577, 0, 601, 551, - 462, 409, 0, 618, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 0, 2054, 0, - 0, 328, 241, 546, 666, 548, 547, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 638, 637, 636, 635, 634, 633, 632, 631, 0, + 0, 580, 479, 346, 300, 342, 343, 350, 691, 687, + 484, 692, 0, 308, 560, 395, 442, 366, 625, 626, + 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, + 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, + 273, 274, 275, 276, 277, 278, 628, 269, 270, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 0, 0, 0, 302, 679, 680, + 681, 682, 683, 0, 0, 303, 304, 305, 0, 0, + 295, 470, 296, 297, 298, 299, 0, 0, 510, 511, + 512, 535, 0, 513, 495, 559, 377, 309, 474, 502, + 689, 0, 0, 0, 0, 0, 0, 0, 610, 621, + 655, 0, 665, 666, 668, 670, 669, 672, 467, 468, + 678, 0, 674, 675, 676, 673, 399, 454, 475, 461, + 0, 695, 550, 551, 696, 661, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 0, 602, 552, 463, 410, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 0, 2055, 0, 0, 328, + 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 463, 493, 0, 506, - 0, 383, 384, 0, 0, 0, 0, 0, 0, 0, - 316, 470, 490, 329, 457, 504, 334, 465, 482, 324, - 424, 454, 0, 0, 318, 488, 464, 406, 317, 0, - 448, 357, 373, 354, 422, 0, 487, 517, 353, 507, - 0, 498, 320, 0, 497, 421, 484, 489, 407, 400, - 0, 319, 486, 405, 399, 387, 363, 533, 388, 389, - 378, 436, 397, 437, 379, 411, 410, 412, 0, 0, - 0, 0, 0, 528, 529, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 659, 0, 0, 663, 0, 500, 0, 0, 0, 0, - 0, 0, 468, 0, 0, 390, 0, 0, 0, 518, - 0, 451, 427, 697, 0, 0, 449, 395, 485, 438, - 491, 471, 499, 443, 439, 310, 472, 356, 408, 325, - 327, 687, 358, 360, 364, 365, 417, 418, 432, 456, - 475, 476, 477, 355, 339, 450, 340, 375, 341, 311, - 347, 345, 348, 458, 349, 313, 433, 481, 0, 370, - 446, 403, 314, 402, 434, 480, 479, 326, 508, 515, - 516, 606, 0, 521, 698, 699, 700, 530, 0, 440, - 322, 321, 0, 0, 0, 351, 435, 335, 337, 338, - 336, 430, 431, 535, 536, 537, 539, 0, 540, 541, - 0, 0, 0, 0, 542, 607, 623, 591, 560, 523, - 615, 557, 561, 562, 381, 626, 0, 0, 0, 514, - 391, 392, 0, 362, 361, 404, 315, 0, 0, 368, - 306, 307, 693, 352, 423, 628, 661, 662, 553, 0, - 616, 554, 563, 344, 588, 600, 599, 419, 513, 0, - 611, 614, 543, 692, 0, 608, 622, 696, 621, 689, - 429, 0, 455, 619, 566, 0, 612, 585, 586, 0, - 613, 581, 617, 0, 555, 0, 524, 527, 556, 641, - 642, 643, 312, 526, 645, 646, 647, 648, 649, 650, - 651, 644, 496, 589, 565, 592, 505, 568, 567, 0, - 0, 603, 522, 604, 605, 413, 414, 415, 416, 372, - 629, 333, 525, 442, 0, 590, 0, 0, 0, 0, - 0, 0, 0, 0, 595, 596, 593, 701, 0, 652, - 653, 0, 0, 519, 520, 367, 374, 538, 376, 332, - 428, 369, 503, 385, 0, 531, 597, 532, 444, 445, - 655, 658, 656, 657, 420, 380, 382, 459, 386, 396, - 447, 502, 426, 452, 330, 492, 461, 401, 582, 610, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 0, 0, 0, 0, 0, 0, 0, 316, 471, + 491, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 0, 488, 518, 353, 508, 0, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 534, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 0, + 0, 664, 0, 501, 0, 0, 0, 0, 0, 0, + 469, 0, 0, 391, 0, 0, 0, 519, 0, 452, + 428, 698, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 0, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 352, 424, 629, 662, 663, 554, 0, + 617, 555, 564, 344, 589, 601, 600, 420, 514, 0, + 612, 615, 544, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 497, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 523, 605, 606, 414, 415, 416, 417, 372, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 636, 635, - 634, 633, 632, 631, 630, 0, 0, 579, 478, 346, - 300, 342, 343, 350, 690, 686, 483, 691, 0, 308, - 559, 394, 441, 366, 624, 625, 0, 676, 254, 255, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 0, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, - 277, 278, 627, 269, 270, 279, 280, 281, 282, 283, + 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, - 0, 0, 0, 302, 678, 679, 680, 681, 682, 0, - 0, 303, 304, 305, 0, 0, 295, 469, 296, 297, - 298, 299, 0, 0, 509, 510, 511, 534, 0, 512, - 494, 558, 377, 309, 473, 501, 688, 0, 0, 0, - 0, 0, 0, 0, 609, 620, 654, 0, 664, 665, - 667, 669, 668, 671, 466, 467, 677, 0, 673, 674, - 675, 672, 398, 453, 474, 460, 0, 694, 549, 550, - 695, 660, 425, 0, 0, 564, 598, 587, 670, 552, - 0, 2199, 0, 0, 0, 0, 0, 0, 0, 0, - 359, 0, 0, 393, 602, 583, 594, 584, 569, 570, - 571, 578, 371, 572, 573, 574, 544, 575, 545, 576, - 577, 0, 601, 551, 462, 409, 0, 618, 0, 0, + 0, 0, 0, 302, 679, 680, 681, 682, 683, 0, + 0, 303, 304, 305, 0, 0, 295, 470, 296, 297, + 298, 299, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 669, 672, 467, 468, 678, 0, 674, 675, + 676, 673, 399, 454, 475, 461, 0, 695, 550, 551, + 696, 661, 426, 0, 0, 565, 599, 588, 671, 553, + 0, 2200, 0, 0, 0, 0, 0, 0, 0, 0, + 359, 0, 0, 394, 603, 584, 595, 585, 570, 571, + 572, 579, 371, 573, 574, 575, 545, 576, 546, 577, + 578, 0, 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 0, 0, 0, 0, 328, 241, 546, 666, 548, - 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 328, 241, 547, 667, 549, + 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 463, 493, 0, 506, 0, 383, 384, 0, 0, 0, - 0, 0, 0, 0, 316, 470, 490, 329, 457, 504, - 334, 465, 482, 324, 424, 454, 0, 0, 318, 488, - 464, 406, 317, 0, 448, 357, 373, 354, 422, 0, - 487, 517, 353, 507, 0, 498, 320, 0, 497, 421, - 484, 489, 407, 400, 0, 319, 486, 405, 399, 387, - 363, 533, 388, 389, 378, 436, 397, 437, 379, 411, - 410, 412, 0, 0, 0, 0, 0, 528, 529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 659, 0, 0, 663, 0, 500, - 0, 0, 0, 0, 0, 0, 468, 0, 0, 390, - 0, 0, 0, 518, 0, 451, 427, 697, 0, 0, - 449, 395, 485, 438, 491, 471, 499, 443, 439, 310, - 472, 356, 408, 325, 327, 687, 358, 360, 364, 365, - 417, 418, 432, 456, 475, 476, 477, 355, 339, 450, - 340, 375, 341, 311, 347, 345, 348, 458, 349, 313, - 433, 481, 0, 370, 446, 403, 314, 402, 434, 480, - 479, 326, 508, 515, 516, 606, 0, 521, 698, 699, - 700, 530, 0, 440, 322, 321, 0, 0, 0, 351, - 435, 335, 337, 338, 336, 430, 431, 535, 536, 537, - 539, 0, 540, 541, 0, 0, 0, 0, 542, 607, - 623, 591, 560, 523, 615, 557, 561, 562, 381, 626, - 0, 0, 0, 514, 391, 392, 0, 362, 361, 404, - 315, 0, 0, 368, 306, 307, 693, 352, 423, 628, - 661, 662, 553, 0, 616, 554, 563, 344, 588, 600, - 599, 419, 513, 0, 611, 614, 543, 692, 0, 608, - 622, 696, 621, 689, 429, 0, 455, 619, 566, 0, - 612, 585, 586, 0, 613, 581, 617, 0, 555, 0, - 524, 527, 556, 641, 642, 643, 312, 526, 645, 646, - 647, 648, 649, 650, 651, 644, 496, 589, 565, 592, - 505, 568, 567, 0, 0, 603, 522, 604, 605, 413, - 414, 415, 416, 372, 629, 333, 525, 442, 0, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 595, 596, - 593, 701, 0, 652, 653, 0, 0, 519, 520, 367, - 374, 538, 376, 332, 428, 369, 503, 385, 0, 531, - 597, 532, 444, 445, 655, 658, 656, 657, 420, 380, - 382, 459, 386, 396, 447, 502, 426, 452, 330, 492, - 461, 401, 582, 610, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, + 464, 494, 0, 507, 0, 384, 385, 0, 0, 0, + 0, 0, 0, 0, 316, 471, 491, 329, 458, 505, + 334, 466, 483, 324, 425, 455, 0, 0, 318, 489, + 465, 407, 317, 0, 449, 357, 373, 354, 423, 0, + 488, 518, 353, 508, 0, 499, 320, 0, 498, 422, + 485, 490, 408, 401, 0, 319, 487, 406, 400, 388, + 363, 534, 389, 390, 378, 437, 398, 438, 379, 412, + 411, 413, 0, 0, 0, 0, 0, 529, 530, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 660, 0, 0, 664, 0, 501, + 0, 0, 0, 0, 0, 0, 469, 0, 0, 391, + 0, 0, 0, 519, 0, 452, 428, 698, 0, 0, + 450, 396, 486, 439, 492, 472, 500, 444, 440, 310, + 473, 356, 409, 325, 327, 688, 358, 360, 364, 365, + 418, 419, 433, 457, 476, 477, 478, 355, 339, 451, + 340, 375, 341, 311, 347, 345, 348, 459, 349, 313, + 434, 482, 0, 370, 447, 404, 314, 403, 435, 481, + 480, 326, 509, 516, 517, 607, 0, 522, 699, 700, + 701, 531, 0, 441, 322, 321, 0, 0, 0, 351, + 436, 335, 337, 338, 336, 431, 432, 536, 537, 538, + 540, 0, 541, 542, 0, 0, 0, 0, 543, 608, + 624, 592, 561, 524, 616, 558, 562, 563, 381, 627, + 0, 0, 0, 515, 392, 393, 0, 362, 361, 405, + 315, 0, 0, 0, 382, 368, 306, 307, 694, 352, + 424, 629, 662, 663, 554, 0, 617, 555, 564, 344, + 589, 601, 600, 420, 514, 0, 612, 615, 544, 693, + 0, 609, 623, 697, 622, 690, 430, 0, 456, 620, + 567, 0, 613, 586, 587, 0, 614, 582, 618, 0, + 556, 0, 525, 528, 557, 642, 643, 644, 312, 527, + 646, 647, 648, 649, 650, 651, 652, 645, 497, 590, + 566, 593, 506, 569, 568, 0, 0, 604, 523, 605, + 606, 414, 415, 416, 417, 372, 630, 333, 526, 443, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 597, 594, 702, 0, 653, 654, 0, 0, 520, + 521, 367, 374, 539, 376, 332, 429, 369, 504, 386, + 0, 532, 598, 533, 445, 446, 656, 659, 657, 658, + 421, 380, 383, 460, 387, 397, 448, 503, 427, 453, + 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 637, 636, 635, 634, 633, 632, + 631, 0, 0, 580, 479, 346, 300, 342, 343, 350, + 691, 687, 484, 692, 0, 308, 560, 395, 442, 366, + 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, + 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, + 271, 272, 273, 274, 275, 276, 277, 278, 628, 269, + 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, + 679, 680, 681, 682, 683, 0, 0, 303, 304, 305, + 0, 0, 295, 470, 296, 297, 298, 299, 0, 0, + 510, 511, 512, 535, 0, 513, 495, 559, 377, 309, + 474, 502, 689, 0, 0, 0, 0, 0, 0, 0, + 610, 621, 655, 0, 665, 666, 668, 670, 669, 672, + 467, 468, 678, 0, 674, 675, 676, 673, 399, 454, + 475, 461, 0, 695, 550, 551, 696, 661, 426, 0, + 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 359, 0, 0, 394, + 603, 584, 595, 585, 570, 571, 572, 579, 371, 573, + 574, 575, 545, 576, 546, 577, 578, 0, 602, 552, + 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 1660, 0, 0, + 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 636, 635, 634, 633, 632, 631, 630, 0, - 0, 579, 478, 346, 300, 342, 343, 350, 690, 686, - 483, 691, 0, 308, 559, 394, 441, 366, 624, 625, - 0, 676, 254, 255, 256, 257, 258, 259, 260, 261, - 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, - 273, 274, 275, 276, 277, 278, 627, 269, 270, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 0, 0, 0, 0, 302, 678, 679, - 680, 681, 682, 0, 0, 303, 304, 305, 0, 0, - 295, 469, 296, 297, 298, 299, 0, 0, 509, 510, - 511, 534, 0, 512, 494, 558, 377, 309, 473, 501, - 688, 0, 0, 0, 0, 0, 0, 0, 609, 620, - 654, 0, 664, 665, 667, 669, 668, 671, 466, 467, - 677, 0, 673, 674, 675, 672, 398, 453, 474, 460, - 0, 694, 549, 550, 695, 660, 425, 0, 0, 564, - 598, 587, 670, 552, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 359, 0, 0, 393, 602, 583, - 594, 584, 569, 570, 571, 578, 371, 572, 573, 574, - 544, 575, 545, 576, 577, 0, 601, 551, 462, 409, - 0, 618, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 1659, 0, 0, 0, 328, - 241, 546, 666, 548, 547, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 464, 494, 0, 507, + 0, 384, 385, 0, 0, 0, 0, 0, 0, 0, + 316, 471, 491, 329, 458, 505, 334, 466, 483, 324, + 425, 455, 0, 0, 318, 489, 465, 407, 317, 0, + 449, 357, 373, 354, 423, 0, 488, 518, 353, 508, + 0, 499, 320, 0, 498, 422, 485, 490, 408, 401, + 0, 319, 487, 406, 400, 388, 363, 534, 389, 390, + 378, 437, 398, 438, 379, 412, 411, 413, 0, 0, + 0, 0, 0, 529, 530, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 660, 0, 0, 664, 0, 501, 0, 0, 0, 0, + 0, 0, 469, 0, 0, 391, 0, 0, 0, 519, + 0, 452, 428, 698, 0, 0, 450, 396, 486, 439, + 492, 472, 500, 2099, 440, 310, 473, 356, 409, 325, + 327, 688, 358, 360, 364, 365, 418, 419, 433, 457, + 476, 477, 478, 355, 339, 451, 340, 375, 341, 311, + 347, 345, 348, 459, 349, 313, 434, 482, 0, 370, + 447, 404, 314, 403, 435, 481, 480, 326, 509, 516, + 517, 607, 0, 522, 699, 700, 701, 531, 0, 441, + 322, 321, 0, 0, 0, 351, 436, 335, 337, 338, + 336, 431, 432, 536, 537, 538, 540, 0, 541, 542, + 0, 0, 0, 0, 543, 608, 624, 592, 561, 524, + 616, 558, 562, 563, 381, 627, 0, 0, 0, 515, + 392, 393, 0, 362, 361, 405, 315, 0, 0, 0, + 382, 368, 306, 307, 694, 352, 424, 629, 662, 663, + 554, 0, 617, 555, 564, 344, 589, 601, 600, 420, + 514, 0, 612, 615, 544, 693, 0, 609, 623, 697, + 622, 690, 430, 0, 456, 620, 567, 0, 613, 586, + 587, 0, 614, 582, 618, 0, 556, 0, 525, 528, + 557, 642, 643, 644, 312, 527, 646, 647, 648, 649, + 650, 651, 652, 645, 497, 590, 566, 593, 506, 569, + 568, 0, 0, 604, 523, 605, 606, 414, 415, 416, + 417, 372, 630, 333, 526, 443, 0, 591, 0, 0, + 0, 0, 0, 0, 0, 0, 596, 597, 594, 702, + 0, 653, 654, 0, 0, 520, 521, 367, 374, 539, + 376, 332, 429, 369, 504, 386, 0, 532, 598, 533, + 445, 446, 656, 659, 657, 658, 421, 380, 383, 460, + 387, 397, 448, 503, 427, 453, 330, 493, 462, 402, + 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, + 637, 636, 635, 634, 633, 632, 631, 0, 0, 580, + 479, 346, 300, 342, 343, 350, 691, 687, 484, 692, + 0, 308, 560, 395, 442, 366, 625, 626, 0, 677, + 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, + 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, + 275, 276, 277, 278, 628, 269, 270, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 0, 0, 0, 302, 679, 680, 681, 682, + 683, 0, 0, 303, 304, 305, 0, 0, 295, 470, + 296, 297, 298, 299, 0, 0, 510, 511, 512, 535, + 0, 513, 495, 559, 377, 309, 474, 502, 689, 0, + 0, 0, 0, 0, 0, 0, 610, 621, 655, 0, + 665, 666, 668, 670, 669, 672, 467, 468, 678, 0, + 674, 675, 676, 673, 399, 454, 475, 461, 0, 695, + 550, 551, 696, 661, 426, 0, 0, 565, 599, 588, + 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 359, 0, 0, 394, 603, 584, 595, 585, + 570, 571, 572, 579, 371, 573, 574, 575, 545, 576, + 546, 577, 578, 0, 602, 552, 463, 410, 0, 619, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 0, 0, 0, 0, 328, 241, 547, + 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 463, 493, 0, 506, 0, 383, - 384, 0, 0, 0, 0, 0, 0, 0, 316, 470, - 490, 329, 457, 504, 334, 465, 482, 324, 424, 454, - 0, 0, 318, 488, 464, 406, 317, 0, 448, 357, - 373, 354, 422, 0, 487, 517, 353, 507, 0, 498, - 320, 0, 497, 421, 484, 489, 407, 400, 0, 319, - 486, 405, 399, 387, 363, 533, 388, 389, 378, 436, - 397, 437, 379, 411, 410, 412, 0, 0, 0, 0, - 0, 528, 529, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 659, 0, - 0, 663, 0, 500, 0, 0, 0, 0, 0, 0, - 468, 0, 0, 390, 0, 0, 0, 518, 0, 451, - 427, 697, 0, 0, 449, 395, 485, 438, 491, 471, - 499, 2098, 439, 310, 472, 356, 408, 325, 327, 687, - 358, 360, 364, 365, 417, 418, 432, 456, 475, 476, - 477, 355, 339, 450, 340, 375, 341, 311, 347, 345, - 348, 458, 349, 313, 433, 481, 0, 370, 446, 403, - 314, 402, 434, 480, 479, 326, 508, 515, 516, 606, - 0, 521, 698, 699, 700, 530, 0, 440, 322, 321, - 0, 0, 0, 351, 435, 335, 337, 338, 336, 430, - 431, 535, 536, 537, 539, 0, 540, 541, 0, 0, - 0, 0, 542, 607, 623, 591, 560, 523, 615, 557, - 561, 562, 381, 626, 0, 0, 0, 514, 391, 392, - 0, 362, 361, 404, 315, 0, 0, 368, 306, 307, - 693, 352, 423, 628, 661, 662, 553, 0, 616, 554, - 563, 344, 588, 600, 599, 419, 513, 0, 611, 614, - 543, 692, 0, 608, 622, 696, 621, 689, 429, 0, - 455, 619, 566, 0, 612, 585, 586, 0, 613, 581, - 617, 0, 555, 0, 524, 527, 556, 641, 642, 643, - 312, 526, 645, 646, 647, 648, 649, 650, 651, 644, - 496, 589, 565, 592, 505, 568, 567, 0, 0, 603, - 522, 604, 605, 413, 414, 415, 416, 372, 629, 333, - 525, 442, 0, 590, 0, 0, 0, 0, 0, 0, - 0, 0, 595, 596, 593, 701, 0, 652, 653, 0, - 0, 519, 520, 367, 374, 538, 376, 332, 428, 369, - 503, 385, 0, 531, 597, 532, 444, 445, 655, 658, - 656, 657, 420, 380, 382, 459, 386, 396, 447, 502, - 426, 452, 330, 492, 461, 401, 582, 610, 0, 0, + 0, 0, 464, 494, 0, 507, 0, 384, 385, 0, + 0, 0, 0, 0, 0, 0, 316, 471, 491, 329, + 458, 505, 334, 466, 483, 324, 425, 455, 0, 0, + 318, 489, 465, 407, 317, 0, 449, 357, 373, 354, + 423, 0, 488, 518, 353, 508, 0, 499, 320, 0, + 498, 422, 485, 490, 408, 401, 0, 319, 487, 406, + 400, 388, 363, 534, 389, 390, 378, 437, 398, 438, + 379, 412, 411, 413, 0, 0, 0, 0, 0, 529, + 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 0, 0, 664, + 0, 501, 0, 0, 1689, 0, 0, 0, 469, 0, + 0, 391, 0, 0, 0, 519, 0, 452, 428, 698, + 0, 0, 450, 396, 486, 439, 492, 472, 500, 444, + 440, 310, 473, 356, 409, 325, 327, 688, 358, 360, + 364, 365, 418, 419, 433, 457, 476, 477, 478, 355, + 339, 451, 340, 375, 341, 311, 347, 345, 348, 459, + 349, 313, 434, 482, 0, 370, 447, 404, 314, 403, + 435, 481, 480, 326, 509, 516, 517, 607, 0, 522, + 699, 700, 701, 531, 0, 441, 322, 321, 0, 0, + 0, 351, 436, 335, 337, 338, 336, 431, 432, 536, + 537, 538, 540, 0, 541, 542, 0, 0, 0, 0, + 543, 608, 624, 592, 561, 524, 616, 558, 562, 563, + 381, 627, 0, 0, 0, 515, 392, 393, 0, 362, + 361, 405, 315, 0, 0, 0, 382, 368, 306, 307, + 694, 352, 424, 629, 662, 663, 554, 0, 617, 555, + 564, 344, 589, 601, 600, 420, 514, 0, 612, 615, + 544, 693, 0, 609, 623, 697, 622, 690, 430, 0, + 456, 620, 567, 0, 613, 586, 587, 0, 614, 582, + 618, 0, 556, 0, 525, 528, 557, 642, 643, 644, + 312, 527, 646, 647, 648, 649, 650, 651, 652, 645, + 497, 590, 566, 593, 506, 569, 568, 0, 0, 604, + 523, 605, 606, 414, 415, 416, 417, 372, 630, 333, + 526, 443, 0, 591, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 597, 594, 702, 0, 653, 654, 0, + 0, 520, 521, 367, 374, 539, 376, 332, 429, 369, + 504, 386, 0, 532, 598, 533, 445, 446, 656, 659, + 657, 658, 421, 380, 383, 460, 387, 397, 448, 503, + 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 636, 635, 634, 633, - 632, 631, 630, 0, 0, 579, 478, 346, 300, 342, - 343, 350, 690, 686, 483, 691, 0, 308, 559, 394, - 441, 366, 624, 625, 0, 676, 254, 255, 256, 257, + 0, 0, 0, 0, 0, 638, 637, 636, 635, 634, + 633, 632, 631, 0, 0, 580, 479, 346, 300, 342, + 343, 350, 691, 687, 484, 692, 0, 308, 560, 395, + 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, 277, 278, - 627, 269, 270, 279, 280, 281, 282, 283, 284, 285, + 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, 0, 0, - 0, 302, 678, 679, 680, 681, 682, 0, 0, 303, - 304, 305, 0, 0, 295, 469, 296, 297, 298, 299, - 0, 0, 509, 510, 511, 534, 0, 512, 494, 558, - 377, 309, 473, 501, 688, 0, 0, 0, 0, 0, - 0, 0, 609, 620, 654, 0, 664, 665, 667, 669, - 668, 671, 466, 467, 677, 0, 673, 674, 675, 672, - 398, 453, 474, 460, 0, 694, 549, 550, 695, 660, - 425, 0, 0, 564, 598, 587, 670, 552, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, - 0, 393, 602, 583, 594, 584, 569, 570, 571, 578, - 371, 572, 573, 574, 544, 575, 545, 576, 577, 0, - 601, 551, 462, 409, 0, 618, 0, 0, 0, 0, + 0, 302, 679, 680, 681, 682, 683, 0, 0, 303, + 304, 305, 0, 0, 295, 470, 296, 297, 298, 299, + 0, 0, 510, 511, 512, 535, 0, 513, 495, 559, + 377, 309, 474, 502, 689, 0, 0, 0, 0, 0, + 0, 0, 610, 621, 655, 0, 665, 666, 668, 670, + 669, 672, 467, 468, 678, 0, 674, 675, 676, 673, + 399, 454, 475, 461, 0, 695, 550, 551, 696, 661, + 426, 0, 0, 565, 599, 588, 671, 553, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 714, 359, 0, + 0, 394, 603, 584, 595, 585, 570, 571, 572, 579, + 371, 573, 574, 575, 545, 576, 546, 577, 578, 0, + 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, - 0, 0, 0, 328, 241, 546, 666, 548, 547, 0, + 0, 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 463, 493, - 0, 506, 0, 383, 384, 0, 0, 0, 0, 0, - 0, 0, 316, 470, 490, 329, 457, 504, 334, 465, - 482, 324, 424, 454, 0, 0, 318, 488, 464, 406, - 317, 0, 448, 357, 373, 354, 422, 0, 487, 517, - 353, 507, 0, 498, 320, 0, 497, 421, 484, 489, - 407, 400, 0, 319, 486, 405, 399, 387, 363, 533, - 388, 389, 378, 436, 397, 437, 379, 411, 410, 412, - 0, 0, 0, 0, 0, 528, 529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 659, 0, 0, 663, 0, 500, 0, 0, - 1688, 0, 0, 0, 468, 0, 0, 390, 0, 0, - 0, 518, 0, 451, 427, 697, 0, 0, 449, 395, - 485, 438, 491, 471, 499, 443, 439, 310, 472, 356, - 408, 325, 327, 687, 358, 360, 364, 365, 417, 418, - 432, 456, 475, 476, 477, 355, 339, 450, 340, 375, - 341, 311, 347, 345, 348, 458, 349, 313, 433, 481, - 0, 370, 446, 403, 314, 402, 434, 480, 479, 326, - 508, 515, 516, 606, 0, 521, 698, 699, 700, 530, - 0, 440, 322, 321, 0, 0, 0, 351, 435, 335, - 337, 338, 336, 430, 431, 535, 536, 537, 539, 0, - 540, 541, 0, 0, 0, 0, 542, 607, 623, 591, - 560, 523, 615, 557, 561, 562, 381, 626, 0, 0, - 0, 514, 391, 392, 0, 362, 361, 404, 315, 0, - 0, 368, 306, 307, 693, 352, 423, 628, 661, 662, - 553, 0, 616, 554, 563, 344, 588, 600, 599, 419, - 513, 0, 611, 614, 543, 692, 0, 608, 622, 696, - 621, 689, 429, 0, 455, 619, 566, 0, 612, 585, - 586, 0, 613, 581, 617, 0, 555, 0, 524, 527, - 556, 641, 642, 643, 312, 526, 645, 646, 647, 648, - 649, 650, 651, 644, 496, 589, 565, 592, 505, 568, - 567, 0, 0, 603, 522, 604, 605, 413, 414, 415, - 416, 372, 629, 333, 525, 442, 0, 590, 0, 0, - 0, 0, 0, 0, 0, 0, 595, 596, 593, 701, - 0, 652, 653, 0, 0, 519, 520, 367, 374, 538, - 376, 332, 428, 369, 503, 385, 0, 531, 597, 532, - 444, 445, 655, 658, 656, 657, 420, 380, 382, 459, - 386, 396, 447, 502, 426, 452, 330, 492, 461, 401, - 582, 610, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 636, 635, 634, 633, 632, 631, 630, 0, 0, 579, - 478, 346, 300, 342, 343, 350, 690, 686, 483, 691, - 0, 308, 559, 394, 441, 366, 624, 625, 0, 676, - 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, - 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, - 275, 276, 277, 278, 627, 269, 270, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 0, 0, 0, 0, 302, 678, 679, 680, 681, - 682, 0, 0, 303, 304, 305, 0, 0, 295, 469, - 296, 297, 298, 299, 0, 0, 509, 510, 511, 534, - 0, 512, 494, 558, 377, 309, 473, 501, 688, 0, - 0, 0, 0, 0, 0, 0, 609, 620, 654, 0, - 664, 665, 667, 669, 668, 671, 466, 467, 677, 0, - 673, 674, 675, 672, 398, 453, 474, 460, 0, 694, - 549, 550, 695, 660, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 713, 359, 0, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 0, 601, 551, 462, 409, 0, 618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 0, 0, 0, 0, 328, 241, 546, - 666, 548, 547, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 0, - 0, 0, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 482, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 0, 487, 517, 353, 507, 0, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 533, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 0, 0, 663, - 0, 500, 0, 0, 0, 0, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 518, 0, 451, 427, 697, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 443, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 515, 516, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 352, - 423, 628, 661, 662, 553, 0, 616, 554, 563, 344, - 588, 600, 599, 419, 513, 0, 611, 614, 543, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 651, 644, 496, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 522, 604, - 605, 413, 414, 415, 416, 372, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 464, 494, + 0, 507, 0, 384, 385, 0, 0, 0, 0, 0, + 0, 0, 316, 471, 491, 329, 458, 505, 334, 466, + 483, 324, 425, 455, 0, 0, 318, 489, 465, 407, + 317, 0, 449, 357, 373, 354, 423, 0, 488, 518, + 353, 508, 0, 499, 320, 0, 498, 422, 485, 490, + 408, 401, 0, 319, 487, 406, 400, 388, 363, 534, + 389, 390, 378, 437, 398, 438, 379, 412, 411, 413, + 0, 0, 0, 0, 0, 529, 530, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 0, 0, 664, 0, 501, 0, 0, + 0, 0, 0, 0, 469, 0, 0, 391, 0, 0, + 0, 519, 0, 452, 428, 698, 0, 0, 450, 396, + 486, 439, 492, 472, 500, 444, 440, 310, 473, 356, + 409, 325, 327, 688, 358, 360, 364, 365, 418, 419, + 433, 457, 476, 477, 478, 355, 339, 451, 340, 375, + 341, 311, 347, 345, 348, 459, 349, 313, 434, 482, + 0, 370, 447, 404, 314, 403, 435, 481, 480, 326, + 509, 516, 517, 607, 0, 522, 699, 700, 701, 531, + 0, 441, 322, 321, 0, 0, 0, 351, 436, 335, + 337, 338, 336, 431, 432, 536, 537, 538, 540, 0, + 541, 542, 0, 0, 0, 0, 543, 608, 624, 592, + 561, 524, 616, 558, 562, 563, 381, 627, 0, 0, + 0, 515, 392, 393, 0, 362, 361, 405, 315, 0, + 0, 0, 382, 368, 306, 307, 694, 352, 424, 629, + 662, 663, 554, 0, 617, 555, 564, 344, 589, 601, + 600, 420, 514, 0, 612, 615, 544, 693, 0, 609, + 623, 697, 622, 690, 430, 0, 456, 620, 567, 0, + 613, 586, 587, 0, 614, 582, 618, 0, 556, 0, + 525, 528, 557, 642, 643, 644, 312, 527, 646, 647, + 648, 649, 650, 651, 652, 645, 497, 590, 566, 593, + 506, 569, 568, 0, 0, 604, 523, 605, 606, 414, + 415, 416, 417, 372, 630, 333, 526, 443, 0, 591, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 597, + 594, 702, 0, 653, 654, 0, 0, 520, 521, 367, + 374, 539, 376, 332, 429, 369, 504, 386, 0, 532, + 598, 533, 445, 446, 656, 659, 657, 658, 421, 380, + 383, 460, 387, 397, 448, 503, 427, 453, 330, 493, + 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 0, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 254, 255, 256, 257, 258, 259, - 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, - 271, 272, 273, 274, 275, 276, 277, 278, 627, 269, - 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, - 678, 679, 680, 681, 682, 0, 0, 303, 304, 305, - 0, 0, 295, 469, 296, 297, 298, 299, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 668, 671, - 466, 467, 677, 0, 673, 674, 675, 672, 398, 453, - 474, 460, 0, 694, 549, 550, 695, 660, 425, 0, - 0, 564, 598, 587, 670, 552, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 359, 0, 0, 393, - 602, 583, 594, 584, 569, 570, 571, 578, 371, 572, - 573, 574, 544, 575, 545, 576, 577, 0, 601, 551, - 462, 409, 0, 618, 0, 0, 0, 0, 0, 0, + 0, 638, 637, 636, 635, 634, 633, 632, 631, 0, + 0, 580, 479, 346, 300, 342, 343, 350, 691, 687, + 484, 692, 0, 308, 560, 395, 442, 366, 625, 626, + 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, + 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, + 273, 274, 275, 276, 277, 278, 628, 269, 270, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 0, 0, 0, 302, 679, 680, + 681, 682, 683, 0, 0, 303, 304, 305, 0, 0, + 295, 470, 296, 297, 298, 299, 0, 0, 510, 511, + 512, 535, 0, 513, 495, 559, 377, 309, 474, 502, + 689, 0, 0, 0, 0, 0, 0, 0, 610, 621, + 655, 0, 665, 666, 668, 670, 669, 672, 467, 468, + 678, 0, 674, 675, 676, 673, 399, 454, 475, 461, + 0, 695, 550, 551, 696, 661, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 0, 602, 552, 463, 410, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, - 0, 328, 241, 546, 666, 548, 547, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 0, 240, 0, 0, 0, 0, 0, 0, 328, + 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 463, 493, 0, 506, - 0, 383, 384, 0, 0, 0, 0, 0, 0, 0, - 316, 470, 490, 329, 457, 504, 334, 465, 482, 324, - 424, 454, 0, 0, 318, 488, 464, 406, 317, 0, - 448, 357, 373, 354, 422, 0, 487, 517, 353, 507, - 0, 498, 320, 0, 497, 421, 484, 489, 407, 400, - 0, 319, 486, 405, 399, 387, 363, 533, 388, 389, - 378, 436, 397, 437, 379, 411, 410, 412, 0, 0, - 0, 0, 0, 528, 529, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 659, 0, 718, 663, 0, 500, 0, 0, 0, 0, - 0, 0, 468, 0, 0, 390, 0, 0, 0, 518, - 0, 451, 427, 697, 0, 0, 449, 395, 485, 438, - 491, 471, 499, 443, 439, 310, 472, 356, 408, 325, - 327, 687, 358, 360, 364, 365, 417, 418, 432, 456, - 475, 476, 477, 355, 339, 450, 340, 375, 341, 311, - 347, 345, 348, 458, 349, 313, 433, 481, 0, 370, - 446, 403, 314, 402, 434, 480, 479, 326, 508, 515, - 516, 606, 0, 521, 698, 699, 700, 530, 0, 440, - 322, 321, 0, 0, 0, 351, 435, 335, 337, 338, - 336, 430, 431, 535, 536, 537, 539, 0, 540, 541, - 0, 0, 0, 0, 542, 607, 623, 591, 560, 523, - 615, 557, 561, 562, 381, 626, 0, 0, 0, 514, - 391, 392, 0, 362, 361, 404, 315, 0, 0, 368, - 306, 307, 693, 352, 423, 628, 661, 662, 553, 0, - 616, 554, 563, 344, 588, 600, 599, 419, 513, 0, - 611, 614, 543, 692, 0, 608, 622, 696, 621, 689, - 429, 0, 455, 619, 566, 0, 612, 585, 586, 0, - 613, 581, 617, 0, 555, 0, 524, 527, 556, 641, - 642, 643, 312, 526, 645, 646, 647, 648, 649, 650, - 651, 644, 496, 589, 565, 592, 505, 568, 567, 0, - 0, 603, 522, 604, 605, 413, 414, 415, 416, 372, - 629, 333, 525, 442, 0, 590, 0, 0, 0, 0, - 0, 0, 0, 0, 595, 596, 593, 701, 0, 652, - 653, 0, 0, 519, 520, 367, 374, 538, 376, 332, - 428, 369, 503, 385, 0, 531, 597, 532, 444, 445, - 655, 658, 656, 657, 420, 380, 382, 459, 386, 396, - 447, 502, 426, 452, 330, 492, 461, 401, 582, 610, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 0, 0, 0, 0, 0, 0, 0, 316, 471, + 491, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 0, 488, 518, 353, 508, 0, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 534, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 0, + 719, 664, 0, 501, 0, 0, 0, 0, 0, 0, + 469, 0, 0, 391, 0, 0, 0, 519, 0, 452, + 428, 698, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 0, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 352, 424, 629, 662, 663, 554, 0, + 617, 555, 564, 344, 589, 601, 600, 420, 514, 0, + 612, 615, 544, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 497, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 523, 605, 606, 414, 415, 416, 417, 372, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 636, 635, - 634, 633, 632, 631, 630, 0, 0, 579, 478, 346, - 300, 342, 343, 350, 690, 686, 483, 691, 0, 308, - 559, 394, 441, 366, 624, 625, 0, 676, 254, 255, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 0, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, - 277, 278, 627, 269, 270, 279, 280, 281, 282, 283, + 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, - 0, 0, 0, 302, 678, 679, 680, 681, 682, 0, - 0, 303, 304, 305, 0, 0, 295, 469, 296, 297, - 298, 299, 0, 0, 509, 510, 511, 534, 0, 512, - 494, 558, 377, 309, 473, 501, 688, 0, 0, 0, - 0, 0, 0, 0, 609, 620, 654, 0, 664, 665, - 667, 669, 668, 671, 466, 467, 677, 0, 673, 674, - 675, 672, 398, 453, 474, 460, 0, 694, 549, 550, - 695, 660, 425, 0, 0, 564, 598, 587, 670, 552, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 359, 0, 0, 393, 602, 583, 594, 584, 569, 570, - 571, 578, 371, 572, 573, 574, 544, 575, 545, 576, - 577, 0, 601, 551, 462, 409, 0, 618, 0, 0, + 0, 0, 0, 302, 679, 680, 681, 682, 683, 0, + 0, 303, 304, 305, 0, 0, 295, 470, 296, 297, + 298, 299, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 669, 672, 467, 468, 678, 0, 674, 675, + 676, 673, 399, 454, 475, 461, 0, 695, 550, 551, + 696, 661, 426, 0, 0, 565, 599, 588, 671, 553, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 359, 0, 0, 394, 603, 584, 595, 585, 570, 571, + 572, 579, 371, 573, 574, 575, 545, 576, 546, 577, + 578, 0, 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 0, 0, 0, 0, 328, 241, 546, 666, 548, - 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 328, 241, 547, 667, 549, + 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 463, 493, 0, 506, 0, 383, 384, 0, 0, 0, - 0, 0, 0, 0, 316, 470, 490, 329, 457, 504, - 334, 465, 482, 324, 424, 454, 0, 0, 318, 488, - 464, 406, 317, 0, 448, 357, 373, 354, 422, 0, - 487, 517, 353, 507, 0, 498, 320, 0, 497, 421, - 484, 489, 407, 400, 0, 319, 486, 405, 399, 387, - 363, 533, 388, 389, 378, 436, 397, 437, 379, 411, - 410, 412, 0, 0, 0, 0, 0, 528, 529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 659, 0, 0, 663, 0, 500, - 0, 0, 0, 0, 0, 0, 468, 0, 0, 390, - 0, 0, 0, 518, 0, 451, 427, 697, 0, 0, - 449, 395, 485, 438, 491, 471, 499, 443, 439, 310, - 472, 356, 408, 325, 327, 687, 358, 360, 364, 365, - 417, 418, 432, 456, 475, 476, 477, 355, 339, 450, - 340, 375, 341, 311, 347, 345, 348, 458, 349, 313, - 433, 481, 0, 370, 446, 403, 314, 402, 434, 480, - 479, 326, 508, 515, 516, 606, 0, 521, 698, 699, - 700, 530, 0, 440, 322, 321, 0, 0, 0, 351, - 435, 335, 337, 338, 336, 430, 431, 535, 536, 537, - 539, 0, 540, 541, 0, 0, 0, 0, 542, 607, - 623, 591, 560, 523, 615, 557, 561, 562, 381, 626, - 0, 0, 0, 514, 391, 392, 0, 362, 361, 404, - 315, 0, 0, 368, 306, 307, 693, 352, 423, 628, - 661, 662, 553, 0, 616, 554, 563, 344, 588, 600, - 599, 419, 513, 0, 611, 614, 543, 692, 0, 608, - 622, 696, 621, 689, 429, 0, 455, 619, 566, 0, - 612, 585, 586, 0, 613, 581, 617, 0, 555, 0, - 524, 527, 556, 641, 642, 643, 312, 526, 645, 646, - 647, 648, 649, 650, 651, 644, 496, 589, 565, 592, - 505, 568, 567, 0, 0, 603, 522, 604, 605, 413, - 414, 415, 416, 372, 629, 333, 525, 442, 0, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 595, 596, - 593, 701, 0, 652, 653, 0, 0, 519, 520, 367, - 374, 538, 376, 332, 428, 369, 503, 385, 0, 531, - 597, 532, 444, 445, 655, 658, 656, 657, 420, 380, - 382, 459, 386, 396, 447, 502, 426, 452, 330, 492, - 461, 401, 582, 610, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, + 464, 494, 0, 507, 0, 384, 385, 0, 0, 0, + 0, 0, 0, 0, 316, 471, 491, 329, 458, 505, + 334, 466, 483, 324, 425, 455, 0, 0, 318, 489, + 465, 407, 317, 0, 449, 357, 373, 354, 423, 0, + 488, 518, 353, 508, 0, 499, 320, 0, 498, 422, + 485, 490, 408, 401, 0, 319, 487, 406, 400, 388, + 363, 534, 389, 390, 378, 437, 398, 438, 379, 412, + 411, 413, 0, 0, 0, 0, 0, 529, 530, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 660, 0, 0, 664, 0, 501, + 0, 0, 0, 0, 0, 0, 469, 0, 0, 391, + 0, 0, 0, 519, 0, 452, 428, 698, 0, 0, + 450, 396, 486, 439, 492, 472, 500, 444, 440, 310, + 473, 356, 409, 325, 327, 688, 358, 360, 364, 365, + 418, 419, 433, 457, 476, 477, 478, 355, 339, 451, + 340, 375, 341, 311, 347, 345, 348, 459, 349, 313, + 434, 482, 0, 370, 447, 404, 314, 403, 435, 481, + 480, 326, 509, 516, 517, 607, 0, 522, 699, 700, + 701, 531, 0, 441, 322, 321, 0, 0, 0, 351, + 436, 335, 337, 338, 336, 431, 432, 536, 537, 538, + 540, 0, 541, 542, 0, 0, 0, 0, 543, 608, + 624, 592, 561, 524, 616, 558, 562, 563, 381, 627, + 0, 0, 0, 515, 392, 393, 0, 362, 361, 405, + 315, 0, 0, 0, 382, 368, 306, 307, 694, 352, + 424, 629, 662, 663, 554, 0, 617, 555, 564, 344, + 589, 601, 600, 420, 514, 0, 612, 615, 544, 693, + 0, 609, 623, 697, 622, 690, 430, 0, 456, 620, + 567, 0, 613, 586, 587, 0, 614, 582, 618, 0, + 556, 0, 525, 528, 557, 642, 643, 644, 312, 527, + 646, 647, 648, 649, 650, 651, 652, 645, 497, 590, + 566, 593, 506, 569, 568, 0, 0, 604, 523, 605, + 606, 414, 415, 416, 417, 372, 630, 333, 526, 443, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 597, 594, 702, 0, 653, 654, 0, 0, 520, + 521, 367, 374, 539, 376, 332, 429, 369, 504, 386, + 0, 532, 598, 533, 445, 446, 656, 659, 657, 658, + 421, 380, 383, 460, 387, 397, 448, 503, 427, 453, + 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 636, 635, 634, 633, 632, 631, 630, 1032, - 0, 579, 478, 346, 300, 342, 343, 350, 690, 686, - 483, 691, 0, 308, 559, 394, 441, 366, 624, 625, - 0, 676, 254, 255, 256, 257, 258, 259, 260, 261, - 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, - 273, 274, 275, 276, 277, 278, 627, 269, 270, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 0, 0, 0, 0, 302, 678, 679, - 680, 681, 682, 0, 0, 303, 304, 305, 0, 0, - 295, 469, 296, 297, 298, 299, 0, 0, 509, 510, - 511, 534, 0, 512, 494, 558, 377, 309, 473, 501, - 688, 0, 0, 0, 0, 0, 0, 0, 609, 620, - 654, 0, 664, 665, 667, 669, 668, 671, 466, 467, - 677, 0, 673, 674, 675, 672, 398, 453, 474, 460, - 0, 694, 549, 550, 695, 660, 425, 0, 0, 564, - 598, 587, 670, 552, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 359, 0, 0, 393, 602, 583, - 594, 584, 569, 570, 571, 578, 371, 572, 573, 574, - 544, 575, 545, 576, 577, 0, 601, 551, 462, 409, - 0, 618, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 637, 636, 635, 634, 633, 632, + 631, 1033, 0, 580, 479, 346, 300, 342, 343, 350, + 691, 687, 484, 692, 0, 308, 560, 395, 442, 366, + 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, + 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, + 271, 272, 273, 274, 275, 276, 277, 278, 628, 269, + 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, + 679, 680, 681, 682, 683, 0, 0, 303, 304, 305, + 0, 0, 295, 470, 296, 297, 298, 299, 0, 0, + 510, 511, 512, 535, 0, 513, 495, 559, 377, 309, + 474, 502, 689, 0, 0, 0, 0, 0, 0, 0, + 610, 621, 655, 0, 665, 666, 668, 670, 669, 672, + 467, 468, 678, 0, 674, 675, 676, 673, 399, 454, + 475, 461, 0, 695, 550, 551, 696, 661, 426, 0, + 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 359, 0, 0, 394, + 603, 584, 595, 585, 570, 571, 572, 579, 371, 573, + 574, 575, 545, 576, 546, 577, 578, 0, 602, 552, + 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 0, 0, 0, 0, 328, - 241, 546, 666, 548, 547, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, + 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 464, 494, 0, 507, + 0, 384, 385, 0, 0, 0, 0, 0, 0, 0, + 316, 471, 491, 329, 458, 505, 334, 466, 483, 324, + 425, 455, 0, 0, 318, 489, 465, 407, 317, 0, + 449, 357, 373, 354, 423, 0, 488, 518, 353, 508, + 0, 499, 320, 0, 498, 422, 485, 490, 408, 401, + 0, 319, 487, 406, 400, 388, 363, 534, 389, 390, + 378, 437, 398, 438, 379, 412, 411, 413, 0, 0, + 0, 0, 0, 529, 530, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 660, 0, 0, 664, 0, 501, 0, 0, 0, 0, + 0, 0, 469, 0, 0, 391, 0, 0, 0, 519, + 0, 452, 428, 698, 0, 0, 450, 396, 486, 439, + 492, 472, 500, 444, 440, 310, 473, 356, 409, 325, + 327, 688, 358, 360, 364, 365, 418, 419, 433, 457, + 476, 477, 478, 355, 339, 451, 340, 375, 341, 311, + 347, 345, 348, 459, 349, 313, 434, 482, 0, 370, + 447, 404, 314, 403, 435, 481, 480, 326, 509, 516, + 517, 607, 0, 522, 699, 700, 701, 531, 0, 441, + 322, 321, 0, 0, 0, 351, 436, 335, 337, 338, + 336, 431, 432, 536, 537, 538, 540, 0, 541, 542, + 0, 0, 0, 0, 543, 608, 624, 592, 561, 524, + 616, 558, 562, 563, 381, 627, 0, 0, 0, 515, + 392, 393, 0, 362, 361, 405, 315, 0, 0, 0, + 382, 368, 306, 307, 694, 352, 424, 629, 662, 663, + 554, 0, 617, 555, 564, 344, 589, 601, 600, 420, + 514, 0, 612, 615, 544, 693, 0, 609, 623, 697, + 622, 690, 430, 0, 456, 620, 567, 0, 613, 586, + 587, 0, 614, 582, 618, 0, 556, 0, 525, 528, + 557, 642, 643, 644, 312, 527, 646, 647, 648, 649, + 650, 651, 652, 645, 497, 590, 566, 593, 506, 569, + 568, 0, 0, 604, 523, 605, 606, 414, 415, 416, + 417, 372, 630, 333, 526, 443, 0, 591, 0, 0, + 0, 0, 0, 0, 0, 0, 596, 597, 594, 702, + 0, 653, 654, 0, 0, 520, 521, 367, 374, 539, + 376, 332, 429, 369, 504, 386, 0, 532, 598, 533, + 445, 446, 656, 659, 657, 658, 421, 380, 383, 460, + 387, 397, 448, 503, 427, 453, 330, 493, 462, 402, + 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, + 637, 636, 635, 634, 633, 632, 631, 0, 0, 580, + 479, 346, 300, 342, 343, 350, 691, 687, 484, 692, + 0, 308, 560, 395, 442, 366, 625, 626, 0, 677, + 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, + 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, + 275, 276, 277, 278, 628, 269, 270, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 0, 0, 0, 302, 679, 680, 681, 682, + 683, 0, 0, 303, 304, 305, 0, 0, 295, 470, + 296, 297, 298, 299, 0, 0, 510, 511, 512, 535, + 0, 513, 495, 559, 377, 309, 474, 502, 689, 0, + 0, 0, 0, 0, 0, 0, 610, 621, 655, 0, + 665, 666, 668, 670, 669, 672, 467, 468, 678, 0, + 674, 675, 676, 673, 399, 454, 475, 461, 0, 695, + 550, 551, 696, 661, 426, 0, 0, 565, 599, 588, + 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 359, 0, 0, 394, 603, 584, 595, 585, + 570, 571, 572, 579, 371, 573, 574, 575, 545, 576, + 546, 577, 578, 0, 602, 552, 463, 410, 0, 619, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 0, 0, 0, 0, 328, 241, 547, + 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 463, 493, 0, 506, 0, 383, - 384, 0, 0, 0, 0, 0, 0, 0, 316, 470, - 490, 329, 457, 504, 334, 465, 482, 324, 424, 454, - 0, 0, 318, 488, 464, 406, 317, 0, 448, 357, - 373, 354, 422, 0, 487, 517, 353, 507, 0, 498, - 320, 0, 497, 421, 484, 489, 407, 400, 0, 319, - 486, 405, 399, 387, 363, 533, 388, 389, 378, 436, - 397, 437, 379, 411, 410, 412, 0, 0, 0, 0, - 0, 528, 529, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 659, 0, - 0, 663, 0, 500, 0, 0, 0, 0, 0, 0, - 468, 0, 0, 390, 0, 0, 0, 518, 0, 451, - 427, 697, 0, 0, 449, 395, 485, 438, 491, 471, - 499, 443, 439, 310, 472, 356, 408, 325, 327, 687, - 358, 360, 364, 365, 417, 418, 432, 456, 475, 476, - 477, 355, 339, 450, 340, 375, 341, 311, 347, 345, - 348, 458, 349, 313, 433, 481, 0, 370, 446, 403, - 314, 402, 434, 480, 479, 326, 508, 515, 516, 606, - 0, 521, 698, 699, 700, 530, 0, 440, 322, 321, - 0, 0, 0, 351, 435, 335, 337, 338, 336, 430, - 431, 535, 536, 537, 539, 0, 540, 541, 0, 0, - 0, 0, 542, 607, 623, 591, 560, 523, 615, 557, - 561, 562, 381, 626, 0, 0, 0, 514, 391, 392, - 0, 362, 361, 404, 315, 0, 0, 368, 306, 307, - 693, 352, 423, 628, 661, 662, 553, 0, 616, 554, - 563, 344, 588, 600, 599, 419, 513, 0, 611, 614, - 543, 692, 0, 608, 622, 696, 621, 689, 429, 0, - 455, 619, 566, 0, 612, 585, 586, 0, 613, 581, - 617, 0, 555, 0, 524, 527, 556, 641, 642, 643, - 312, 526, 645, 646, 647, 648, 649, 650, 651, 644, - 496, 589, 565, 592, 505, 568, 567, 0, 0, 603, - 522, 604, 605, 413, 414, 415, 416, 372, 629, 333, - 525, 442, 0, 590, 0, 0, 0, 0, 0, 0, - 0, 0, 595, 596, 593, 701, 0, 652, 653, 0, - 0, 519, 520, 367, 374, 538, 376, 332, 428, 369, - 503, 385, 0, 531, 597, 532, 444, 445, 655, 658, - 656, 657, 420, 380, 382, 459, 386, 396, 447, 502, - 426, 452, 330, 492, 461, 401, 582, 610, 0, 0, + 0, 0, 464, 494, 0, 507, 0, 384, 385, 0, + 0, 0, 0, 0, 0, 0, 316, 471, 491, 329, + 458, 505, 334, 466, 483, 324, 425, 455, 0, 0, + 318, 489, 465, 407, 317, 0, 449, 357, 373, 354, + 423, 0, 488, 518, 353, 508, 0, 499, 320, 0, + 498, 422, 485, 490, 408, 401, 0, 319, 487, 406, + 400, 388, 363, 534, 389, 390, 378, 437, 398, 438, + 379, 412, 411, 413, 0, 0, 0, 0, 0, 529, + 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 0, 0, 664, + 0, 501, 0, 0, 0, 0, 0, 0, 469, 0, + 0, 391, 0, 0, 0, 519, 0, 452, 428, 698, + 0, 0, 450, 396, 486, 439, 492, 472, 500, 444, + 440, 310, 473, 356, 409, 325, 327, 688, 358, 360, + 364, 365, 418, 419, 433, 457, 476, 477, 478, 355, + 339, 451, 340, 375, 341, 311, 347, 345, 348, 459, + 349, 313, 434, 482, 0, 370, 3409, 404, 314, 403, + 435, 481, 480, 326, 509, 516, 517, 607, 0, 522, + 699, 700, 701, 531, 0, 441, 322, 321, 0, 0, + 0, 351, 436, 335, 337, 338, 336, 431, 432, 536, + 537, 538, 540, 0, 541, 542, 0, 0, 0, 0, + 543, 608, 624, 592, 561, 524, 616, 558, 562, 563, + 381, 627, 0, 0, 0, 515, 392, 393, 0, 362, + 361, 405, 315, 0, 0, 0, 382, 368, 306, 307, + 694, 352, 424, 629, 662, 663, 554, 0, 617, 555, + 564, 344, 589, 601, 600, 420, 514, 0, 612, 615, + 544, 693, 0, 609, 623, 697, 622, 690, 430, 0, + 456, 620, 567, 0, 613, 586, 587, 0, 614, 582, + 618, 0, 556, 0, 525, 528, 557, 642, 643, 644, + 312, 527, 646, 647, 648, 649, 650, 651, 652, 645, + 497, 590, 566, 593, 506, 569, 568, 0, 0, 604, + 523, 605, 606, 414, 415, 416, 417, 372, 630, 333, + 526, 443, 0, 591, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 597, 594, 702, 0, 653, 654, 0, + 0, 520, 521, 367, 374, 539, 376, 332, 429, 369, + 504, 386, 0, 532, 598, 533, 445, 446, 656, 659, + 657, 658, 421, 380, 383, 460, 387, 397, 448, 503, + 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 636, 635, 634, 633, - 632, 631, 630, 0, 0, 579, 478, 346, 300, 342, - 343, 350, 690, 686, 483, 691, 0, 308, 559, 394, - 441, 366, 624, 625, 0, 676, 254, 255, 256, 257, + 0, 0, 0, 0, 0, 638, 637, 636, 635, 634, + 633, 632, 631, 0, 0, 580, 479, 346, 300, 342, + 343, 350, 691, 687, 484, 692, 0, 308, 560, 395, + 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, 277, 278, - 627, 269, 270, 279, 280, 281, 282, 283, 284, 285, + 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, 0, 0, - 0, 302, 678, 679, 680, 681, 682, 0, 0, 303, - 304, 305, 0, 0, 295, 469, 296, 297, 298, 299, - 0, 0, 509, 510, 511, 534, 0, 512, 494, 558, - 377, 309, 473, 501, 688, 0, 0, 0, 0, 0, - 0, 0, 609, 620, 654, 0, 664, 665, 667, 669, - 668, 671, 466, 467, 677, 0, 673, 674, 675, 672, - 398, 453, 474, 460, 0, 694, 549, 550, 695, 660, - 425, 0, 0, 564, 598, 587, 670, 552, 0, 0, + 0, 302, 679, 680, 681, 682, 683, 0, 0, 303, + 304, 305, 0, 0, 295, 470, 296, 297, 298, 299, + 0, 0, 510, 511, 512, 535, 0, 513, 495, 559, + 377, 309, 474, 502, 689, 0, 0, 0, 0, 0, + 0, 0, 610, 621, 655, 0, 665, 666, 668, 670, + 669, 672, 467, 468, 678, 0, 674, 675, 676, 673, + 399, 454, 475, 461, 0, 695, 550, 551, 696, 661, + 426, 0, 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, - 0, 393, 602, 583, 594, 584, 569, 570, 571, 578, - 371, 572, 573, 574, 544, 575, 545, 576, 577, 0, - 601, 551, 462, 409, 0, 618, 0, 0, 0, 0, + 0, 394, 603, 584, 595, 585, 570, 571, 572, 579, + 371, 573, 574, 575, 545, 576, 546, 577, 578, 0, + 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, - 0, 0, 0, 328, 241, 546, 666, 548, 547, 0, + 0, 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 463, 493, - 0, 506, 0, 383, 384, 0, 0, 0, 0, 0, - 0, 0, 316, 470, 490, 329, 457, 504, 334, 465, - 482, 324, 424, 454, 0, 0, 318, 488, 464, 406, - 317, 0, 448, 357, 373, 354, 422, 0, 487, 517, - 353, 507, 0, 498, 320, 0, 497, 421, 484, 489, - 407, 400, 0, 319, 486, 405, 399, 387, 363, 533, - 388, 389, 378, 436, 397, 437, 379, 411, 410, 412, - 0, 0, 0, 0, 0, 528, 529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 659, 0, 0, 663, 0, 500, 0, 0, - 0, 0, 0, 0, 468, 0, 0, 390, 0, 0, - 0, 518, 0, 451, 427, 697, 0, 0, 449, 395, - 485, 438, 491, 471, 499, 443, 439, 310, 472, 356, - 408, 325, 327, 687, 358, 360, 364, 365, 417, 418, - 432, 456, 475, 476, 477, 355, 339, 450, 340, 375, - 341, 311, 347, 345, 348, 458, 349, 313, 433, 481, - 0, 370, 3408, 403, 314, 402, 434, 480, 479, 326, - 508, 515, 516, 606, 0, 521, 698, 699, 700, 530, - 0, 440, 322, 321, 0, 0, 0, 351, 435, 335, - 337, 338, 336, 430, 431, 535, 536, 537, 539, 0, - 540, 541, 0, 0, 0, 0, 542, 607, 623, 591, - 560, 523, 615, 557, 561, 562, 381, 626, 0, 0, - 0, 514, 391, 392, 0, 362, 361, 404, 315, 0, - 0, 368, 306, 307, 693, 352, 423, 628, 661, 662, - 553, 0, 616, 554, 563, 344, 588, 600, 599, 419, - 513, 0, 611, 614, 543, 692, 0, 608, 622, 696, - 621, 689, 429, 0, 455, 619, 566, 0, 612, 585, - 586, 0, 613, 581, 617, 0, 555, 0, 524, 527, - 556, 641, 642, 643, 312, 526, 645, 646, 647, 648, - 649, 650, 651, 644, 496, 589, 565, 592, 505, 568, - 567, 0, 0, 603, 522, 604, 605, 413, 414, 415, - 416, 372, 629, 333, 525, 442, 0, 590, 0, 0, - 0, 0, 0, 0, 0, 0, 595, 596, 593, 701, - 0, 652, 653, 0, 0, 519, 520, 367, 374, 538, - 376, 332, 428, 369, 503, 385, 0, 531, 597, 532, - 444, 445, 655, 658, 656, 657, 420, 380, 382, 459, - 386, 396, 447, 502, 426, 452, 330, 492, 461, 401, - 582, 610, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 636, 635, 634, 633, 632, 631, 630, 0, 0, 579, - 478, 346, 300, 342, 343, 350, 690, 686, 483, 691, - 0, 308, 559, 394, 441, 366, 624, 625, 0, 676, - 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, - 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, - 275, 276, 277, 278, 627, 269, 270, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 0, 0, 0, 0, 302, 678, 679, 680, 681, - 682, 0, 0, 303, 304, 305, 0, 0, 295, 469, - 296, 297, 298, 299, 0, 0, 509, 510, 511, 534, - 0, 512, 494, 558, 377, 309, 473, 501, 688, 0, - 0, 0, 0, 0, 0, 0, 609, 620, 654, 0, - 664, 665, 667, 669, 668, 671, 466, 467, 677, 0, - 673, 674, 675, 672, 398, 453, 474, 460, 0, 694, - 549, 550, 695, 660, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 359, 0, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 0, 601, 551, 462, 409, 0, 618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 0, 0, 0, 0, 328, 241, 546, - 666, 548, 547, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 0, - 0, 0, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 2040, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 0, 487, 517, 353, 507, 0, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 533, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 0, 0, 663, - 0, 500, 0, 0, 0, 0, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 518, 0, 451, 427, 697, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 443, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 515, 516, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 352, - 423, 628, 661, 662, 553, 0, 616, 554, 563, 344, - 588, 600, 599, 419, 513, 0, 611, 614, 543, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 651, 644, 496, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 522, 604, - 605, 413, 414, 415, 416, 372, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 464, 494, + 0, 507, 0, 384, 385, 0, 0, 0, 0, 0, + 0, 0, 316, 471, 491, 329, 458, 505, 334, 466, + 2041, 324, 425, 455, 0, 0, 318, 489, 465, 407, + 317, 0, 449, 357, 373, 354, 423, 0, 488, 518, + 353, 508, 0, 499, 320, 0, 498, 422, 485, 490, + 408, 401, 0, 319, 487, 406, 400, 388, 363, 534, + 389, 390, 378, 437, 398, 438, 379, 412, 411, 413, + 0, 0, 0, 0, 0, 529, 530, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 0, 0, 664, 0, 501, 0, 0, + 0, 0, 0, 0, 469, 0, 0, 391, 0, 0, + 0, 519, 0, 452, 428, 698, 0, 0, 450, 396, + 486, 439, 492, 472, 500, 444, 440, 310, 473, 356, + 409, 325, 327, 688, 358, 360, 364, 365, 418, 419, + 433, 457, 476, 477, 478, 355, 339, 451, 340, 375, + 341, 311, 347, 345, 348, 459, 349, 313, 434, 482, + 0, 370, 447, 404, 314, 403, 435, 481, 480, 326, + 509, 516, 517, 607, 0, 522, 699, 700, 701, 531, + 0, 441, 322, 321, 0, 0, 0, 351, 436, 335, + 337, 338, 336, 431, 432, 536, 537, 538, 540, 0, + 541, 542, 0, 0, 0, 0, 543, 608, 624, 592, + 561, 524, 616, 558, 562, 563, 381, 627, 0, 0, + 0, 515, 392, 393, 0, 362, 361, 405, 315, 0, + 0, 0, 382, 368, 306, 307, 694, 352, 424, 629, + 662, 663, 554, 0, 617, 555, 564, 344, 589, 601, + 600, 420, 514, 0, 612, 615, 544, 693, 0, 609, + 623, 697, 622, 690, 430, 0, 456, 620, 567, 0, + 613, 586, 587, 0, 614, 582, 618, 0, 556, 0, + 525, 528, 557, 642, 643, 644, 312, 527, 646, 647, + 648, 649, 650, 651, 652, 645, 497, 590, 566, 593, + 506, 569, 568, 0, 0, 604, 523, 605, 606, 414, + 415, 416, 417, 372, 630, 333, 526, 443, 0, 591, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 597, + 594, 702, 0, 653, 654, 0, 0, 520, 521, 367, + 374, 539, 376, 332, 429, 369, 504, 386, 0, 532, + 598, 533, 445, 446, 656, 659, 657, 658, 421, 380, + 383, 460, 387, 397, 448, 503, 427, 453, 330, 493, + 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 0, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 254, 255, 256, 257, 258, 259, - 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, - 271, 272, 273, 274, 275, 276, 277, 278, 627, 269, - 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, - 678, 679, 680, 681, 682, 0, 0, 303, 304, 305, - 0, 0, 295, 469, 296, 297, 298, 299, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 668, 671, - 466, 467, 677, 0, 673, 674, 675, 672, 398, 453, - 474, 460, 0, 694, 549, 550, 695, 660, 425, 0, - 0, 564, 598, 587, 670, 552, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 359, 0, 0, 393, - 602, 583, 594, 584, 569, 570, 571, 578, 371, 572, - 573, 574, 544, 575, 545, 576, 577, 0, 601, 551, - 462, 409, 0, 618, 0, 0, 0, 0, 0, 0, + 0, 638, 637, 636, 635, 634, 633, 632, 631, 0, + 0, 580, 479, 346, 300, 342, 343, 350, 691, 687, + 484, 692, 0, 308, 560, 395, 442, 366, 625, 626, + 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, + 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, + 273, 274, 275, 276, 277, 278, 628, 269, 270, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 0, 0, 0, 302, 679, 680, + 681, 682, 683, 0, 0, 303, 304, 305, 0, 0, + 295, 470, 296, 297, 298, 299, 0, 0, 510, 511, + 512, 535, 0, 513, 495, 559, 377, 309, 474, 502, + 689, 0, 0, 0, 0, 0, 0, 0, 610, 621, + 655, 0, 665, 666, 668, 670, 669, 672, 467, 468, + 678, 0, 674, 675, 676, 673, 399, 454, 475, 461, + 0, 695, 550, 551, 696, 661, 426, 0, 0, 565, + 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 359, 0, 0, 394, 603, 584, + 595, 585, 570, 571, 572, 579, 371, 573, 574, 575, + 545, 576, 546, 577, 578, 0, 602, 552, 463, 410, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, - 0, 328, 241, 546, 666, 548, 547, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, + 0, 0, 240, 0, 0, 0, 0, 0, 0, 328, + 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 463, 493, 0, 506, - 0, 383, 384, 0, 0, 0, 0, 0, 0, 0, - 316, 470, 1638, 329, 457, 504, 334, 465, 482, 324, - 424, 454, 0, 0, 318, 488, 464, 406, 317, 0, - 448, 357, 373, 354, 422, 0, 487, 517, 353, 507, - 0, 498, 320, 0, 497, 421, 484, 489, 407, 400, - 0, 319, 486, 405, 399, 387, 363, 533, 388, 389, - 378, 436, 397, 437, 379, 411, 410, 412, 0, 0, - 0, 0, 0, 528, 529, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 659, 0, 0, 663, 0, 500, 0, 0, 0, 0, - 0, 0, 468, 0, 0, 390, 0, 0, 0, 518, - 0, 451, 427, 697, 0, 0, 449, 395, 485, 438, - 491, 471, 499, 443, 439, 310, 472, 356, 408, 325, - 327, 687, 358, 360, 364, 365, 417, 418, 432, 456, - 475, 476, 477, 355, 339, 450, 340, 375, 341, 311, - 347, 345, 348, 458, 349, 313, 433, 481, 0, 370, - 446, 403, 314, 402, 434, 480, 479, 326, 508, 515, - 516, 606, 0, 521, 698, 699, 700, 530, 0, 440, - 322, 321, 0, 0, 0, 351, 435, 335, 337, 338, - 336, 430, 431, 535, 536, 537, 539, 0, 540, 541, - 0, 0, 0, 0, 542, 607, 623, 591, 560, 523, - 615, 557, 561, 562, 381, 626, 0, 0, 0, 514, - 391, 392, 0, 362, 361, 404, 315, 0, 0, 368, - 306, 307, 693, 352, 423, 628, 661, 662, 553, 0, - 616, 554, 563, 344, 588, 600, 599, 419, 513, 0, - 611, 614, 543, 692, 0, 608, 622, 696, 621, 689, - 429, 0, 455, 619, 566, 0, 612, 585, 586, 0, - 613, 581, 617, 0, 555, 0, 524, 527, 556, 641, - 642, 643, 312, 526, 645, 646, 647, 648, 649, 650, - 651, 644, 496, 589, 565, 592, 505, 568, 567, 0, - 0, 603, 522, 604, 605, 413, 414, 415, 416, 372, - 629, 333, 525, 442, 0, 590, 0, 0, 0, 0, - 0, 0, 0, 0, 595, 596, 593, 701, 0, 652, - 653, 0, 0, 519, 520, 367, 374, 538, 376, 332, - 428, 369, 503, 385, 0, 531, 597, 532, 444, 445, - 655, 658, 656, 657, 420, 380, 382, 459, 386, 396, - 447, 502, 426, 452, 330, 492, 461, 401, 582, 610, + 0, 0, 0, 0, 464, 494, 0, 507, 0, 384, + 385, 0, 0, 0, 0, 0, 0, 0, 316, 471, + 1639, 329, 458, 505, 334, 466, 483, 324, 425, 455, + 0, 0, 318, 489, 465, 407, 317, 0, 449, 357, + 373, 354, 423, 0, 488, 518, 353, 508, 0, 499, + 320, 0, 498, 422, 485, 490, 408, 401, 0, 319, + 487, 406, 400, 388, 363, 534, 389, 390, 378, 437, + 398, 438, 379, 412, 411, 413, 0, 0, 0, 0, + 0, 529, 530, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 660, 0, + 0, 664, 0, 501, 0, 0, 0, 0, 0, 0, + 469, 0, 0, 391, 0, 0, 0, 519, 0, 452, + 428, 698, 0, 0, 450, 396, 486, 439, 492, 472, + 500, 444, 440, 310, 473, 356, 409, 325, 327, 688, + 358, 360, 364, 365, 418, 419, 433, 457, 476, 477, + 478, 355, 339, 451, 340, 375, 341, 311, 347, 345, + 348, 459, 349, 313, 434, 482, 0, 370, 447, 404, + 314, 403, 435, 481, 480, 326, 509, 516, 517, 607, + 0, 522, 699, 700, 701, 531, 0, 441, 322, 321, + 0, 0, 0, 351, 436, 335, 337, 338, 336, 431, + 432, 536, 537, 538, 540, 0, 541, 542, 0, 0, + 0, 0, 543, 608, 624, 592, 561, 524, 616, 558, + 562, 563, 381, 627, 0, 0, 0, 515, 392, 393, + 0, 362, 361, 405, 315, 0, 0, 0, 382, 368, + 306, 307, 694, 352, 424, 629, 662, 663, 554, 0, + 617, 555, 564, 344, 589, 601, 600, 420, 514, 0, + 612, 615, 544, 693, 0, 609, 623, 697, 622, 690, + 430, 0, 456, 620, 567, 0, 613, 586, 587, 0, + 614, 582, 618, 0, 556, 0, 525, 528, 557, 642, + 643, 644, 312, 527, 646, 647, 648, 649, 650, 651, + 652, 645, 497, 590, 566, 593, 506, 569, 568, 0, + 0, 604, 523, 605, 606, 414, 415, 416, 417, 372, + 630, 333, 526, 443, 0, 591, 0, 0, 0, 0, + 0, 0, 0, 0, 596, 597, 594, 702, 0, 653, + 654, 0, 0, 520, 521, 367, 374, 539, 376, 332, + 429, 369, 504, 386, 0, 532, 598, 533, 445, 446, + 656, 659, 657, 658, 421, 380, 383, 460, 387, 397, + 448, 503, 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 637, 636, 635, - 634, 633, 632, 631, 630, 0, 0, 579, 478, 346, - 300, 342, 343, 350, 690, 686, 483, 691, 0, 308, - 559, 394, 441, 366, 624, 625, 0, 676, 254, 255, + 0, 0, 0, 0, 0, 0, 0, 638, 637, 636, + 635, 634, 633, 632, 631, 0, 0, 580, 479, 346, + 300, 342, 343, 350, 691, 687, 484, 692, 0, 308, + 560, 395, 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, - 277, 278, 627, 269, 270, 279, 280, 281, 282, 283, + 277, 278, 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, - 0, 0, 0, 302, 678, 679, 680, 681, 682, 0, - 0, 303, 304, 305, 0, 0, 295, 469, 296, 297, - 298, 299, 0, 0, 509, 510, 511, 534, 0, 512, - 494, 558, 377, 309, 473, 501, 688, 0, 0, 0, - 0, 0, 0, 0, 609, 620, 654, 0, 664, 665, - 667, 669, 668, 671, 466, 467, 677, 0, 673, 674, - 675, 672, 398, 453, 474, 460, 0, 694, 549, 550, - 695, 660, 425, 0, 0, 564, 598, 587, 670, 552, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 359, 0, 0, 393, 602, 583, 594, 584, 569, 570, - 571, 578, 371, 572, 573, 574, 544, 575, 545, 576, - 577, 0, 601, 551, 462, 409, 0, 618, 0, 0, + 0, 0, 0, 302, 679, 680, 681, 682, 683, 0, + 0, 303, 304, 305, 0, 0, 295, 470, 296, 297, + 298, 299, 0, 0, 510, 511, 512, 535, 0, 513, + 495, 559, 377, 309, 474, 502, 689, 0, 0, 0, + 0, 0, 0, 0, 610, 621, 655, 0, 665, 666, + 668, 670, 669, 672, 467, 468, 678, 0, 674, 675, + 676, 673, 399, 454, 475, 461, 0, 695, 550, 551, + 696, 661, 426, 0, 0, 565, 599, 588, 671, 553, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 359, 0, 0, 394, 603, 584, 595, 585, 570, 571, + 572, 579, 371, 573, 574, 575, 545, 576, 546, 577, + 578, 0, 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, - 0, 0, 0, 0, 0, 328, 241, 546, 666, 548, - 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 328, 241, 547, 667, 549, + 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 463, 493, 0, 506, 0, 383, 384, 0, 0, 0, - 0, 0, 0, 0, 316, 470, 1636, 329, 457, 504, - 334, 465, 482, 324, 424, 454, 0, 0, 318, 488, - 464, 406, 317, 0, 448, 357, 373, 354, 422, 0, - 487, 517, 353, 507, 0, 498, 320, 0, 497, 421, - 484, 489, 407, 400, 0, 319, 486, 405, 399, 387, - 363, 533, 388, 389, 378, 436, 397, 437, 379, 411, - 410, 412, 0, 0, 0, 0, 0, 528, 529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 659, 0, 0, 663, 0, 500, - 0, 0, 0, 0, 0, 0, 468, 0, 0, 390, - 0, 0, 0, 518, 0, 451, 427, 697, 0, 0, - 449, 395, 485, 438, 491, 471, 499, 443, 439, 310, - 472, 356, 408, 325, 327, 687, 358, 360, 364, 365, - 417, 418, 432, 456, 475, 476, 477, 355, 339, 450, - 340, 375, 341, 311, 347, 345, 348, 458, 349, 313, - 433, 481, 0, 370, 446, 403, 314, 402, 434, 480, - 479, 326, 508, 515, 516, 606, 0, 521, 698, 699, - 700, 530, 0, 440, 322, 321, 0, 0, 0, 351, - 435, 335, 337, 338, 336, 430, 431, 535, 536, 537, - 539, 0, 540, 541, 0, 0, 0, 0, 542, 607, - 623, 591, 560, 523, 615, 557, 561, 562, 381, 626, - 0, 0, 0, 514, 391, 392, 0, 362, 361, 404, - 315, 0, 0, 368, 306, 307, 693, 352, 423, 628, - 661, 662, 553, 0, 616, 554, 563, 344, 588, 600, - 599, 419, 513, 0, 611, 614, 543, 692, 0, 608, - 622, 696, 621, 689, 429, 0, 455, 619, 566, 0, - 612, 585, 586, 0, 613, 581, 617, 0, 555, 0, - 524, 527, 556, 641, 642, 643, 312, 526, 645, 646, - 647, 648, 649, 650, 651, 644, 496, 589, 565, 592, - 505, 568, 567, 0, 0, 603, 522, 604, 605, 413, - 414, 415, 416, 372, 629, 333, 525, 442, 0, 590, - 0, 0, 0, 0, 0, 0, 0, 0, 595, 596, - 593, 701, 0, 652, 653, 0, 0, 519, 520, 367, - 374, 538, 376, 332, 428, 369, 503, 385, 0, 531, - 597, 532, 444, 445, 655, 658, 656, 657, 420, 380, - 382, 459, 386, 396, 447, 502, 426, 452, 330, 492, - 461, 401, 582, 610, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, + 464, 494, 0, 507, 0, 384, 385, 0, 0, 0, + 0, 0, 0, 0, 316, 471, 1637, 329, 458, 505, + 334, 466, 483, 324, 425, 455, 0, 0, 318, 489, + 465, 407, 317, 0, 449, 357, 373, 354, 423, 0, + 488, 518, 353, 508, 0, 499, 320, 0, 498, 422, + 485, 490, 408, 401, 0, 319, 487, 406, 400, 388, + 363, 534, 389, 390, 378, 437, 398, 438, 379, 412, + 411, 413, 0, 0, 0, 0, 0, 529, 530, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 660, 0, 0, 664, 0, 501, + 0, 0, 0, 0, 0, 0, 469, 0, 0, 391, + 0, 0, 0, 519, 0, 452, 428, 698, 0, 0, + 450, 396, 486, 439, 492, 472, 500, 444, 440, 310, + 473, 356, 409, 325, 327, 688, 358, 360, 364, 365, + 418, 419, 433, 457, 476, 477, 478, 355, 339, 451, + 340, 375, 341, 311, 347, 345, 348, 459, 349, 313, + 434, 482, 0, 370, 447, 404, 314, 403, 435, 481, + 480, 326, 509, 516, 517, 607, 0, 522, 699, 700, + 701, 531, 0, 441, 322, 321, 0, 0, 0, 351, + 436, 335, 337, 338, 336, 431, 432, 536, 537, 538, + 540, 0, 541, 542, 0, 0, 0, 0, 543, 608, + 624, 592, 561, 524, 616, 558, 562, 563, 381, 627, + 0, 0, 0, 515, 392, 393, 0, 362, 361, 405, + 315, 0, 0, 0, 382, 368, 306, 307, 694, 352, + 424, 629, 662, 663, 554, 0, 617, 555, 564, 344, + 589, 601, 600, 420, 514, 0, 612, 615, 544, 693, + 0, 609, 623, 697, 622, 690, 430, 0, 456, 620, + 567, 0, 613, 586, 587, 0, 614, 582, 618, 0, + 556, 0, 525, 528, 557, 642, 643, 644, 312, 527, + 646, 647, 648, 649, 650, 651, 652, 645, 497, 590, + 566, 593, 506, 569, 568, 0, 0, 604, 523, 605, + 606, 414, 415, 416, 417, 372, 630, 333, 526, 443, + 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 597, 594, 702, 0, 653, 654, 0, 0, 520, + 521, 367, 374, 539, 376, 332, 429, 369, 504, 386, + 0, 532, 598, 533, 445, 446, 656, 659, 657, 658, + 421, 380, 383, 460, 387, 397, 448, 503, 427, 453, + 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 637, 636, 635, 634, 633, 632, 631, 630, 0, - 0, 579, 478, 346, 300, 342, 343, 350, 690, 686, - 483, 691, 0, 308, 559, 394, 441, 366, 624, 625, - 0, 676, 254, 255, 256, 257, 258, 259, 260, 261, - 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, - 273, 274, 275, 276, 277, 278, 627, 269, 270, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 0, 0, 0, 0, 302, 678, 679, - 680, 681, 682, 0, 0, 303, 304, 305, 0, 0, - 295, 469, 296, 297, 298, 299, 0, 0, 509, 510, - 511, 534, 0, 512, 494, 558, 377, 309, 473, 501, - 688, 0, 0, 0, 0, 0, 0, 0, 609, 620, - 654, 0, 664, 665, 667, 669, 668, 671, 466, 467, - 677, 0, 673, 674, 675, 672, 398, 453, 474, 460, - 0, 694, 549, 550, 695, 660, 425, 0, 0, 564, - 598, 587, 670, 552, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 359, 0, 0, 393, 602, 583, - 594, 584, 569, 570, 571, 578, 371, 572, 573, 574, - 544, 575, 545, 576, 577, 0, 601, 551, 462, 409, - 0, 618, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 638, 637, 636, 635, 634, 633, 632, + 631, 0, 0, 580, 479, 346, 300, 342, 343, 350, + 691, 687, 484, 692, 0, 308, 560, 395, 442, 366, + 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, + 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, + 271, 272, 273, 274, 275, 276, 277, 278, 628, 269, + 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 0, 0, 0, 302, + 679, 680, 681, 682, 683, 0, 0, 303, 304, 305, + 0, 0, 295, 470, 296, 297, 298, 299, 0, 0, + 510, 511, 512, 535, 0, 513, 495, 559, 377, 309, + 474, 502, 689, 0, 0, 0, 0, 0, 0, 0, + 610, 621, 655, 0, 665, 666, 668, 670, 669, 672, + 467, 468, 678, 0, 674, 675, 676, 673, 399, 454, + 475, 461, 0, 695, 550, 551, 696, 661, 426, 0, + 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 359, 0, 0, 394, + 603, 584, 595, 585, 570, 571, 572, 579, 371, 573, + 574, 575, 545, 576, 546, 577, 578, 0, 602, 552, + 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 0, 0, 0, 0, 328, - 241, 546, 666, 548, 547, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, + 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 463, 493, 0, 506, 0, 383, - 384, 0, 0, 0, 0, 0, 0, 0, 316, 470, - 490, 329, 457, 504, 334, 465, 1506, 324, 424, 454, - 0, 0, 318, 488, 464, 406, 317, 0, 448, 357, - 373, 354, 422, 0, 487, 517, 353, 507, 0, 498, - 320, 0, 497, 421, 484, 489, 407, 400, 0, 319, - 486, 405, 399, 387, 363, 533, 388, 389, 378, 436, - 397, 437, 379, 411, 410, 412, 0, 0, 0, 0, - 0, 528, 529, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 659, 0, - 0, 663, 0, 500, 0, 0, 0, 0, 0, 0, - 468, 0, 0, 390, 0, 0, 0, 518, 0, 451, - 427, 697, 0, 0, 449, 395, 485, 438, 491, 471, - 499, 443, 439, 310, 472, 356, 408, 325, 327, 687, - 358, 360, 364, 365, 417, 418, 432, 456, 475, 476, - 477, 355, 339, 450, 340, 375, 341, 311, 347, 345, - 348, 458, 349, 313, 433, 481, 0, 370, 446, 403, - 314, 402, 434, 480, 479, 326, 508, 515, 516, 606, - 0, 521, 698, 699, 700, 530, 0, 440, 322, 321, - 0, 0, 0, 351, 435, 335, 337, 338, 336, 430, - 431, 535, 536, 537, 539, 0, 540, 541, 0, 0, - 0, 0, 542, 607, 623, 591, 560, 523, 615, 557, - 561, 562, 381, 626, 0, 0, 0, 514, 391, 392, - 0, 362, 361, 404, 315, 0, 0, 368, 306, 307, - 693, 352, 423, 628, 661, 662, 553, 0, 616, 554, - 563, 344, 588, 600, 599, 419, 513, 0, 611, 614, - 543, 692, 0, 608, 622, 696, 621, 689, 429, 0, - 455, 619, 566, 0, 612, 585, 586, 0, 613, 581, - 617, 0, 555, 0, 524, 527, 556, 641, 642, 643, - 312, 526, 645, 646, 647, 648, 649, 650, 651, 644, - 496, 589, 565, 592, 505, 568, 567, 0, 0, 603, - 522, 604, 605, 413, 414, 415, 416, 372, 629, 333, - 525, 442, 0, 590, 0, 0, 0, 0, 0, 0, - 0, 0, 595, 596, 593, 701, 0, 652, 653, 0, - 0, 519, 520, 367, 374, 538, 376, 332, 428, 369, - 503, 385, 0, 531, 597, 532, 444, 445, 655, 658, - 656, 657, 420, 380, 382, 459, 386, 396, 447, 502, - 426, 452, 330, 492, 461, 401, 582, 610, 0, 0, + 0, 0, 0, 0, 0, 0, 464, 494, 0, 507, + 0, 384, 385, 0, 0, 0, 0, 0, 0, 0, + 316, 471, 491, 329, 458, 505, 334, 466, 1507, 324, + 425, 455, 0, 0, 318, 489, 465, 407, 317, 0, + 449, 357, 373, 354, 423, 0, 488, 518, 353, 508, + 0, 499, 320, 0, 498, 422, 485, 490, 408, 401, + 0, 319, 487, 406, 400, 388, 363, 534, 389, 390, + 378, 437, 398, 438, 379, 412, 411, 413, 0, 0, + 0, 0, 0, 529, 530, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 660, 0, 0, 664, 0, 501, 0, 0, 0, 0, + 0, 0, 469, 0, 0, 391, 0, 0, 0, 519, + 0, 452, 428, 698, 0, 0, 450, 396, 486, 439, + 492, 472, 500, 444, 440, 310, 473, 356, 409, 325, + 327, 688, 358, 360, 364, 365, 418, 419, 433, 457, + 476, 477, 478, 355, 339, 451, 340, 375, 341, 311, + 347, 345, 348, 459, 349, 313, 434, 482, 0, 370, + 447, 404, 314, 403, 435, 481, 480, 326, 509, 516, + 517, 607, 0, 522, 699, 700, 701, 531, 0, 441, + 322, 321, 0, 0, 0, 351, 436, 335, 337, 338, + 336, 431, 432, 536, 537, 538, 540, 0, 541, 542, + 0, 0, 0, 0, 543, 608, 624, 592, 561, 524, + 616, 558, 562, 563, 381, 627, 0, 0, 0, 515, + 392, 393, 0, 362, 361, 405, 315, 0, 0, 0, + 382, 368, 306, 307, 694, 352, 424, 629, 662, 663, + 554, 0, 617, 555, 564, 344, 589, 601, 600, 420, + 514, 0, 612, 615, 544, 693, 0, 609, 623, 697, + 622, 690, 430, 0, 456, 620, 567, 0, 613, 586, + 587, 0, 614, 582, 618, 0, 556, 0, 525, 528, + 557, 642, 643, 644, 312, 527, 646, 647, 648, 649, + 650, 651, 652, 645, 497, 590, 566, 593, 506, 569, + 568, 0, 0, 604, 523, 605, 606, 414, 415, 416, + 417, 372, 630, 333, 526, 443, 0, 591, 0, 0, + 0, 0, 0, 0, 0, 0, 596, 597, 594, 702, + 0, 653, 654, 0, 0, 520, 521, 367, 374, 539, + 376, 332, 429, 369, 504, 386, 0, 532, 598, 533, + 445, 446, 656, 659, 657, 658, 421, 380, 383, 460, + 387, 397, 448, 503, 427, 453, 330, 493, 462, 402, + 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, + 637, 636, 635, 634, 633, 632, 631, 0, 0, 580, + 479, 346, 300, 342, 343, 350, 691, 687, 484, 692, + 0, 308, 560, 395, 442, 366, 625, 626, 0, 677, + 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, + 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, + 275, 276, 277, 278, 628, 269, 270, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 0, 0, 0, 302, 679, 680, 681, 682, + 683, 0, 0, 303, 304, 305, 0, 0, 295, 470, + 296, 297, 298, 299, 0, 0, 510, 511, 512, 535, + 0, 513, 495, 559, 377, 309, 474, 502, 689, 0, + 0, 0, 0, 0, 0, 0, 610, 621, 655, 0, + 665, 666, 668, 670, 669, 672, 467, 468, 678, 0, + 674, 675, 676, 673, 399, 454, 475, 461, 0, 695, + 550, 551, 696, 661, 426, 0, 0, 565, 599, 588, + 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 359, 0, 0, 394, 603, 584, 595, 585, + 570, 571, 572, 579, 371, 573, 574, 575, 545, 576, + 546, 577, 578, 0, 602, 552, 463, 410, 0, 619, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 0, 0, 0, 0, 328, 241, 547, + 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 464, 494, 0, 507, 0, 384, 385, 0, + 0, 0, 0, 0, 0, 0, 316, 471, 491, 329, + 458, 505, 334, 466, 483, 324, 425, 455, 0, 0, + 318, 489, 465, 407, 317, 0, 449, 357, 373, 354, + 423, 0, 488, 518, 353, 508, 0, 499, 320, 0, + 498, 422, 485, 490, 408, 401, 0, 319, 487, 406, + 400, 388, 363, 534, 389, 390, 378, 437, 398, 438, + 379, 412, 411, 413, 0, 0, 0, 0, 0, 529, + 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 660, 0, 0, 664, + 0, 501, 0, 0, 0, 0, 0, 0, 469, 0, + 0, 391, 0, 0, 0, 519, 0, 452, 428, 698, + 0, 0, 450, 396, 486, 439, 492, 472, 500, 444, + 440, 310, 473, 356, 409, 325, 327, 792, 358, 360, + 364, 365, 418, 419, 433, 457, 476, 477, 478, 355, + 339, 451, 340, 375, 341, 311, 347, 345, 348, 459, + 349, 313, 434, 482, 0, 370, 447, 404, 314, 403, + 435, 481, 480, 326, 509, 516, 517, 607, 0, 522, + 699, 700, 701, 531, 0, 441, 322, 321, 0, 0, + 0, 351, 436, 335, 337, 338, 336, 431, 432, 536, + 537, 538, 540, 0, 541, 542, 0, 0, 0, 0, + 543, 608, 624, 592, 561, 524, 616, 558, 562, 563, + 381, 627, 0, 0, 0, 515, 392, 393, 0, 362, + 361, 405, 315, 0, 0, 0, 382, 368, 306, 307, + 694, 352, 424, 629, 662, 663, 554, 0, 617, 555, + 564, 344, 589, 601, 600, 420, 514, 0, 612, 615, + 544, 693, 0, 609, 623, 697, 622, 690, 430, 0, + 456, 620, 567, 0, 613, 586, 587, 0, 614, 582, + 618, 0, 556, 0, 525, 528, 557, 642, 643, 644, + 312, 527, 646, 647, 648, 649, 650, 651, 652, 645, + 497, 590, 566, 593, 506, 569, 568, 0, 0, 604, + 523, 605, 606, 414, 415, 416, 417, 372, 630, 333, + 526, 443, 0, 591, 0, 0, 0, 0, 0, 0, + 0, 0, 596, 597, 594, 702, 0, 653, 654, 0, + 0, 520, 521, 367, 374, 539, 376, 332, 429, 369, + 504, 386, 0, 532, 598, 533, 445, 446, 656, 659, + 657, 658, 421, 380, 383, 460, 387, 397, 448, 503, + 427, 453, 330, 493, 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 637, 636, 635, 634, 633, - 632, 631, 630, 0, 0, 579, 478, 346, 300, 342, - 343, 350, 690, 686, 483, 691, 0, 308, 559, 394, - 441, 366, 624, 625, 0, 676, 254, 255, 256, 257, + 0, 0, 0, 0, 0, 638, 637, 636, 635, 634, + 633, 632, 631, 0, 0, 580, 479, 346, 300, 342, + 343, 350, 691, 687, 484, 692, 0, 308, 560, 395, + 442, 366, 625, 626, 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, 275, 276, 277, 278, - 627, 269, 270, 279, 280, 281, 282, 283, 284, 285, + 628, 269, 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 0, 0, 0, - 0, 302, 678, 679, 680, 681, 682, 0, 0, 303, - 304, 305, 0, 0, 295, 469, 296, 297, 298, 299, - 0, 0, 509, 510, 511, 534, 0, 512, 494, 558, - 377, 309, 473, 501, 688, 0, 0, 0, 0, 0, - 0, 0, 609, 620, 654, 0, 664, 665, 667, 669, - 668, 671, 466, 467, 677, 0, 673, 674, 675, 672, - 398, 453, 474, 460, 0, 694, 549, 550, 695, 660, - 425, 0, 0, 564, 598, 587, 670, 552, 0, 0, + 0, 302, 679, 680, 681, 682, 683, 0, 0, 303, + 304, 305, 0, 0, 295, 470, 296, 297, 298, 299, + 0, 0, 510, 511, 512, 535, 0, 513, 495, 559, + 377, 309, 474, 502, 689, 0, 0, 0, 0, 0, + 0, 0, 610, 621, 655, 0, 665, 666, 668, 670, + 669, 672, 467, 468, 678, 0, 674, 675, 676, 673, + 399, 454, 475, 461, 0, 695, 550, 551, 696, 661, + 426, 0, 0, 565, 599, 588, 671, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, - 0, 393, 602, 583, 594, 584, 569, 570, 571, 578, - 371, 572, 573, 574, 544, 575, 545, 576, 577, 0, - 601, 551, 462, 409, 0, 618, 0, 0, 0, 0, + 0, 394, 603, 584, 595, 585, 570, 571, 572, 579, + 371, 573, 574, 575, 545, 576, 546, 577, 578, 0, + 602, 552, 463, 410, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, - 0, 0, 0, 328, 241, 546, 666, 548, 547, 0, + 0, 0, 0, 328, 241, 547, 667, 549, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 463, 493, - 0, 506, 0, 383, 384, 0, 0, 0, 0, 0, - 0, 0, 316, 470, 490, 329, 457, 504, 334, 465, - 482, 324, 424, 454, 0, 0, 318, 488, 464, 406, - 317, 0, 448, 357, 373, 354, 422, 0, 487, 517, - 353, 507, 0, 498, 320, 0, 497, 421, 484, 489, - 407, 400, 0, 319, 486, 405, 399, 387, 363, 533, - 388, 389, 378, 436, 397, 437, 379, 411, 410, 412, - 0, 0, 0, 0, 0, 528, 529, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 659, 0, 0, 663, 0, 500, 0, 0, - 0, 0, 0, 0, 468, 0, 0, 390, 0, 0, - 0, 518, 0, 451, 427, 697, 0, 0, 449, 395, - 485, 438, 491, 471, 499, 443, 439, 310, 472, 356, - 408, 325, 327, 791, 358, 360, 364, 365, 417, 418, - 432, 456, 475, 476, 477, 355, 339, 450, 340, 375, - 341, 311, 347, 345, 348, 458, 349, 313, 433, 481, - 0, 370, 446, 403, 314, 402, 434, 480, 479, 326, - 508, 515, 516, 606, 0, 521, 698, 699, 700, 530, - 0, 440, 322, 321, 0, 0, 0, 351, 435, 335, - 337, 338, 336, 430, 431, 535, 536, 537, 539, 0, - 540, 541, 0, 0, 0, 0, 542, 607, 623, 591, - 560, 523, 615, 557, 561, 562, 381, 626, 0, 0, - 0, 514, 391, 392, 0, 362, 361, 404, 315, 0, - 0, 368, 306, 307, 693, 352, 423, 628, 661, 662, - 553, 0, 616, 554, 563, 344, 588, 600, 599, 419, - 513, 0, 611, 614, 543, 692, 0, 608, 622, 696, - 621, 689, 429, 0, 455, 619, 566, 0, 612, 585, - 586, 0, 613, 581, 617, 0, 555, 0, 524, 527, - 556, 641, 642, 643, 312, 526, 645, 646, 647, 648, - 649, 650, 651, 644, 496, 589, 565, 592, 505, 568, - 567, 0, 0, 603, 522, 604, 605, 413, 414, 415, - 416, 372, 629, 333, 525, 442, 0, 590, 0, 0, - 0, 0, 0, 0, 0, 0, 595, 596, 593, 701, - 0, 652, 653, 0, 0, 519, 520, 367, 374, 538, - 376, 332, 428, 369, 503, 385, 0, 531, 597, 532, - 444, 445, 655, 658, 656, 657, 420, 380, 382, 459, - 386, 396, 447, 502, 426, 452, 330, 492, 461, 401, - 582, 610, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 293, 294, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, - 636, 635, 634, 633, 632, 631, 630, 0, 0, 579, - 478, 346, 300, 342, 343, 350, 690, 686, 483, 691, - 0, 308, 559, 394, 441, 366, 624, 625, 0, 676, - 254, 255, 256, 257, 258, 259, 260, 261, 301, 262, - 263, 264, 265, 266, 267, 268, 271, 272, 273, 274, - 275, 276, 277, 278, 627, 269, 270, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 0, 0, 0, 0, 302, 678, 679, 680, 681, - 682, 0, 0, 303, 304, 305, 0, 0, 295, 469, - 296, 297, 298, 299, 0, 0, 509, 510, 511, 534, - 0, 512, 494, 558, 377, 309, 473, 501, 688, 0, - 0, 0, 0, 0, 0, 0, 609, 620, 654, 0, - 664, 665, 667, 669, 668, 671, 466, 467, 677, 0, - 673, 674, 675, 672, 398, 453, 474, 460, 0, 694, - 549, 550, 695, 660, 425, 0, 0, 564, 598, 587, - 670, 552, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 359, 0, 0, 393, 602, 583, 594, 584, - 569, 570, 571, 578, 371, 572, 573, 574, 544, 575, - 545, 576, 577, 0, 601, 551, 462, 409, 0, 618, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 0, 0, 0, 0, 328, 241, 546, - 666, 548, 547, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 464, 494, + 0, 507, 0, 384, 385, 0, 0, 0, 0, 0, + 0, 0, 316, 471, 491, 329, 458, 505, 334, 466, + 483, 324, 425, 455, 0, 0, 318, 489, 465, 407, + 317, 0, 449, 357, 373, 354, 423, 0, 488, 518, + 353, 508, 0, 499, 320, 0, 498, 422, 485, 490, + 408, 401, 0, 319, 487, 406, 400, 388, 363, 534, + 389, 390, 378, 437, 398, 438, 379, 412, 411, 413, + 0, 0, 0, 0, 0, 529, 530, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 660, 0, 0, 664, 0, 501, 0, 0, + 0, 0, 0, 0, 469, 0, 0, 391, 0, 0, + 0, 519, 0, 452, 428, 698, 0, 0, 450, 396, + 486, 439, 492, 472, 500, 744, 440, 310, 473, 356, + 409, 325, 327, 688, 358, 360, 364, 365, 418, 419, + 433, 457, 476, 477, 478, 355, 339, 451, 340, 375, + 341, 311, 347, 345, 348, 459, 349, 313, 434, 482, + 0, 370, 447, 404, 314, 403, 435, 481, 480, 326, + 509, 516, 517, 607, 0, 522, 699, 700, 701, 531, + 0, 441, 322, 321, 0, 0, 0, 351, 436, 335, + 337, 338, 336, 431, 432, 536, 537, 538, 540, 0, + 541, 542, 0, 0, 0, 0, 543, 608, 624, 592, + 561, 524, 616, 558, 562, 563, 381, 627, 0, 0, + 0, 515, 392, 393, 0, 362, 361, 405, 315, 0, + 0, 0, 382, 368, 306, 307, 694, 352, 424, 629, + 662, 663, 554, 0, 617, 555, 564, 344, 589, 601, + 600, 420, 514, 0, 612, 615, 544, 693, 0, 609, + 623, 697, 622, 690, 430, 0, 456, 620, 567, 0, + 613, 586, 587, 0, 614, 582, 618, 0, 556, 0, + 525, 528, 557, 642, 643, 644, 312, 527, 646, 647, + 648, 649, 650, 651, 745, 645, 497, 590, 566, 593, + 506, 569, 568, 0, 0, 604, 523, 605, 606, 414, + 415, 416, 417, 372, 630, 333, 526, 443, 0, 591, + 0, 0, 0, 0, 0, 0, 0, 0, 596, 597, + 594, 702, 0, 653, 654, 0, 0, 520, 521, 367, + 374, 539, 376, 332, 429, 369, 504, 386, 0, 532, + 598, 533, 445, 446, 656, 659, 657, 658, 421, 380, + 383, 460, 387, 397, 448, 503, 427, 453, 330, 493, + 462, 402, 583, 611, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2183, 293, 294, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 638, 637, 636, 635, 634, 633, 632, 631, 0, + 0, 580, 479, 346, 300, 342, 343, 350, 691, 687, + 484, 692, 2185, 308, 560, 395, 442, 366, 625, 626, + 0, 677, 254, 255, 256, 257, 258, 259, 260, 261, + 301, 262, 263, 264, 265, 266, 267, 268, 271, 272, + 273, 274, 275, 276, 277, 278, 628, 269, 270, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 0, 0, 2160, 302, 679, 680, + 681, 682, 683, 0, 0, 303, 304, 305, 0, 0, + 295, 470, 296, 297, 298, 299, 0, 0, 510, 511, + 512, 535, 0, 513, 495, 559, 377, 309, 474, 502, + 689, 0, 0, 0, 0, 0, 0, 0, 610, 621, + 655, 0, 665, 666, 668, 670, 669, 672, 467, 468, + 678, 0, 674, 675, 676, 673, 399, 454, 475, 461, + 0, 695, 550, 551, 696, 661, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 463, 493, 0, 506, 0, 383, 384, 0, - 0, 0, 0, 0, 0, 0, 316, 470, 490, 329, - 457, 504, 334, 465, 482, 324, 424, 454, 0, 0, - 318, 488, 464, 406, 317, 0, 448, 357, 373, 354, - 422, 0, 487, 517, 353, 507, 0, 498, 320, 0, - 497, 421, 484, 489, 407, 400, 0, 319, 486, 405, - 399, 387, 363, 533, 388, 389, 378, 436, 397, 437, - 379, 411, 410, 412, 0, 0, 0, 0, 0, 528, - 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 659, 0, 0, 663, - 0, 500, 0, 0, 0, 0, 0, 0, 468, 0, - 0, 390, 0, 0, 0, 518, 0, 451, 427, 697, - 0, 0, 449, 395, 485, 438, 491, 471, 499, 743, - 439, 310, 472, 356, 408, 325, 327, 687, 358, 360, - 364, 365, 417, 418, 432, 456, 475, 476, 477, 355, - 339, 450, 340, 375, 341, 311, 347, 345, 348, 458, - 349, 313, 433, 481, 0, 370, 446, 403, 314, 402, - 434, 480, 479, 326, 508, 515, 516, 606, 0, 521, - 698, 699, 700, 530, 0, 440, 322, 321, 0, 0, - 0, 351, 435, 335, 337, 338, 336, 430, 431, 535, - 536, 537, 539, 0, 540, 541, 0, 0, 0, 0, - 542, 607, 623, 591, 560, 523, 615, 557, 561, 562, - 381, 626, 0, 0, 0, 514, 391, 392, 0, 362, - 361, 404, 315, 0, 0, 368, 306, 307, 693, 352, - 423, 628, 661, 662, 553, 0, 616, 554, 563, 344, - 588, 600, 599, 419, 513, 0, 611, 614, 543, 692, - 0, 608, 622, 696, 621, 689, 429, 0, 455, 619, - 566, 0, 612, 585, 586, 0, 613, 581, 617, 0, - 555, 0, 524, 527, 556, 641, 642, 643, 312, 526, - 645, 646, 647, 648, 649, 650, 744, 644, 496, 589, - 565, 592, 505, 568, 567, 0, 0, 603, 522, 604, - 605, 413, 414, 415, 416, 372, 629, 333, 525, 442, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 595, 596, 593, 701, 0, 652, 653, 0, 0, 519, - 520, 367, 374, 538, 376, 332, 428, 369, 503, 385, - 0, 531, 597, 532, 444, 445, 655, 658, 656, 657, - 420, 380, 382, 459, 386, 396, 447, 502, 426, 452, - 330, 492, 461, 401, 582, 610, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2182, 293, 294, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 637, 636, 635, 634, 633, 632, 631, - 630, 0, 0, 579, 478, 346, 300, 342, 343, 350, - 690, 686, 483, 691, 2184, 308, 559, 394, 441, 366, - 624, 625, 0, 676, 254, 255, 256, 257, 258, 259, - 260, 261, 301, 262, 263, 264, 265, 266, 267, 268, - 271, 272, 273, 274, 275, 276, 277, 278, 627, 269, - 270, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 0, 0, 0, 2159, 302, - 678, 679, 680, 681, 682, 0, 0, 303, 304, 305, - 0, 0, 295, 469, 296, 297, 298, 299, 0, 0, - 509, 510, 511, 534, 0, 512, 494, 558, 377, 309, - 473, 501, 688, 0, 0, 0, 0, 0, 0, 0, - 609, 620, 654, 0, 664, 665, 667, 669, 668, 671, - 466, 467, 677, 0, 673, 674, 675, 672, 398, 453, - 474, 460, 2182, 694, 549, 550, 695, 660, 0, 0, - 179, 218, 0, 0, 4147, 0, 0, 0, 2175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3961, 0, 0, 0, 0, 0, - 2184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 214, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2159, 0, 0, 0, 0, 2184, - 0, 2163, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2157, 2191, 0, 0, 2158, 2160, 2162, 0, - 2164, 2165, 2166, 2170, 2171, 2172, 2174, 2177, 2178, 2179, - 0, 0, 0, 2159, 0, 0, 0, 2167, 2176, 2168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2175, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2158, 2192, 0, 0, 2159, 2161, 2163, 0, 2165, 2166, + 2167, 2171, 2172, 2173, 2175, 2178, 2179, 2180, 0, 0, + 0, 0, 0, 0, 0, 2168, 2177, 2169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2163, 0, 0, - 0, 0, 0, 2180, 0, 0, 0, 0, 2169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2156, 0, 0, 0, 2155, 0, 0, 2157, 2191, - 0, 0, 2158, 2160, 2162, 0, 2164, 2165, 2166, 2170, - 2171, 2172, 2174, 2177, 2178, 2179, 0, 0, 0, 2173, - 0, 0, 0, 2167, 2176, 2168, 2163, 0, 2161, 0, - 0, 0, 0, 0, 0, 0, 0, 2169, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2157, 2191, 0, - 0, 2158, 2160, 2162, 0, 2164, 2165, 2166, 2170, 2171, - 2172, 2174, 2177, 2178, 2179, 0, 0, 2183, 0, 0, - 0, 0, 2167, 2176, 2168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2180, - 0, 0, 0, 0, 0, 0, 2183, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2156, 0, 0, - 0, 2155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2173, 0, 0, 0, 0, - 0, 0, 0, 0, 2161, 0, 0, 0, 2180, 0, + 0, 0, 0, 2181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2156, 0, 0, 0, - 2155, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2157, 0, 0, 0, 2156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2173, 0, 0, 0, 0, 0, - 0, 0, 0, 2161, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2174, + 0, 0, 0, 0, 0, 0, 0, 0, 2162, } var yyPact = [...]int{ - 385, -1000, -1000, -1000, -371, 17350, -1000, -1000, -1000, -1000, + 376, -1000, -1000, -1000, -374, 17894, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 57761, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 58423, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 445, 57761, -368, -1000, 3287, - 55709, -1000, -1000, -1000, 237, 56393, 19424, 57761, 602, 599, - 57761, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 396, 58423, -372, -1000, 3143, + 56365, -1000, -1000, -1000, 285, 57051, 19974, 58423, 559, 556, + 58423, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 1099, -1000, 62549, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 985, 4574, 61865, 13218, -239, - -1000, 1661, -40, 2975, 479, -2, -21, 589, 1271, 1277, - 1439, 1141, 57761, 1229, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 248, 33821, 57077, - 1189, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 998, -1000, 63225, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 856, 4964, 62539, 13750, -242, + -1000, 1944, -49, 2923, 620, -16, -19, 546, 1156, 1166, + 1284, 1295, 58423, 1136, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 245, 34413, 57737, + 1115, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 4213, 270, 1083, 1189, - 24918, 79, 76, 1661, 3500, -122, 226, -1000, 1742, 425, - 212, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 13218, 13218, 17350, -431, 17350, 13218, 57761, 57761, - -1000, -1000, -1000, -1000, -368, 56393, 985, 4574, 13218, 2975, - 479, -2, -21, 589, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 4423, 277, 997, 1115, + 25484, 88, 86, 1944, 3348, -126, 236, -1000, 1912, 4473, + 207, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 13750, 13750, 17894, -437, 17894, 13750, 58423, 58423, + -1000, -1000, -1000, -1000, -372, 57051, 856, 4964, 13750, 2923, + 620, -16, -19, 546, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -122, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -126, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -8339,7 +8389,7 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 76, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 86, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -8358,461 +8408,462 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 5403, -1000, 1912, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 5466, -1000, 1838, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 2708, 3561, 1906, 2966, -1000, -1000, -1000, -1000, - 1661, 3969, 907, 57761, -1000, 145, 3933, -1000, 57761, 57761, - 173, 2204, -1000, 732, 672, 614, 1072, 292, 1905, -1000, - -1000, -1000, -1000, -1000, -1000, 808, 3931, -1000, 57761, 57761, - 3578, 57761, -1000, 440, 840, -1000, 4840, 3757, 1758, 1092, - 3602, -1000, -1000, 3560, -1000, 341, 451, 453, 770, 444, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 293, -1000, 3830, - -1000, -1000, 295, -1000, -1000, 278, -1000, -1000, -1000, 74, + -1000, -1000, -1000, 2618, 3479, 1837, 2920, -1000, -1000, -1000, + -1000, 1944, 3862, 804, 58423, -1000, 138, 3834, -1000, 58423, + 58423, 185, 2133, -1000, 646, 578, 470, 834, 318, 1827, + -1000, -1000, -1000, -1000, -1000, -1000, 678, 3833, -1000, 58423, + 58423, 3507, 58423, -1000, 487, 750, -1000, 5067, 3677, 1655, + 989, 3523, -1000, -1000, 3477, -1000, 321, 353, 217, 675, + 395, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 307, -1000, + 3729, -1000, -1000, 313, -1000, -1000, 297, -1000, -1000, -1000, + 83, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -43, -1000, -1000, 1261, 2580, 13750, 2171, -1000, + 4179, 1911, -1000, -1000, -1000, 8921, 16506, 16506, 16506, 16506, + 58423, -1000, -1000, 3330, 13750, 3476, 3474, 3473, 3472, -1000, + -1000, -1000, -1000, -1000, -1000, 3470, 1824, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 2302, -1000, -1000, -1000, + 17195, -1000, 3469, 3467, 3465, 3464, 3463, 3462, 3460, 3459, + 3457, 3456, 3453, 3451, 3450, 3449, 3133, 19277, 3447, 2919, + 2918, 3446, 3445, 3444, 2917, 3442, 3438, 3437, 3133, 3133, + 3436, 3433, 3432, 3431, 3430, 3429, 3428, 3425, 3424, 3420, + 3419, 3411, 3408, 3407, 3406, 3405, 3404, 3402, 3397, 3396, + 3392, 3391, 3390, 3386, 3375, 3374, 3372, 3371, 3370, 3368, + 3366, 3365, 3361, 3360, 3359, 3358, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -55, -1000, -1000, 1388, 2467, 13218, 2378, -1000, 4498, - 2017, -1000, -1000, -1000, 8403, 15966, 15966, 15966, 15966, 57761, - -1000, -1000, 3412, 13218, 3559, 3558, 3557, 3556, -1000, -1000, - -1000, -1000, -1000, -1000, 3555, 1880, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 2386, -1000, -1000, -1000, 16653, - -1000, 3554, 3553, 3552, 3550, 3548, 3545, 3544, 3543, 3539, - 3538, 3537, 3535, 3534, 3529, 3237, 18729, 3528, 2965, 2964, - 3527, 3526, 3524, 2941, 3523, 3522, 3521, 3237, 3237, 3519, - 3518, 3516, 3509, 3507, 3506, 3504, 3503, 3501, 3499, 3498, - 3497, 3496, 3493, 3491, 3490, 3489, 3488, 3487, 3484, 3483, - 3481, 3479, 3475, 3474, 3471, 3469, 3468, 3462, 3456, 3454, - 3452, 3450, 3445, 3440, 3433, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1662, - -1000, 3429, 3972, 3291, -1000, 3821, 3799, 3793, 3789, -307, - 3428, 2600, -1000, -1000, 102, 57761, 57761, 300, 57761, -331, - 417, 513, -128, -129, 511, -130, 1168, -1000, 493, -1000, - -1000, 1252, -1000, 1205, 61181, 1019, -1000, -1000, 57761, 984, - 984, 984, 57761, 247, 1084, 1214, 984, 984, 984, 984, - 1022, 984, 3846, 1063, 1061, 1060, 1055, 984, -84, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 2203, 2200, 3667, 907, - 55709, 1667, 57761, -1000, 3354, 1182, -1000, -1000, -1000, -1000, - 417, -350, 3601, 2110, 2110, 3896, 3896, 3844, 3842, 868, - 849, 839, 2110, 656, -1000, 2143, 2143, 2143, 2143, 2110, - 529, 906, 3849, 3849, 149, 2143, 50, 2110, 2110, 50, - 2110, 2110, 487, -1000, 2233, 508, 235, -313, -1000, -1000, - -1000, -1000, 2143, 2143, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 3815, 3806, 985, 985, 57761, 985, 429, 197, 57761, - 985, 985, 985, 57761, 997, -358, 10, 60497, 59813, 2807, - 440, 834, 831, 1688, 2188, -1000, 2028, 57761, 57761, 2028, - 2028, 28349, 27665, -1000, 57761, -1000, 3972, 3291, 3198, 1465, - 3197, 3291, -132, 417, 985, 985, 985, 985, 985, 257, - 985, 985, 985, 985, 985, 57761, 57761, 55025, 985, 503, - 985, 985, 985, 11151, 1742, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 17350, 2371, - 2455, 209, -35, -344, 289, -1000, -1000, 57761, 3726, 2011, - -1000, -1000, -1000, 3340, -1000, 3346, 3346, 3346, 3346, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3346, - 3346, 3353, 3423, -1000, -1000, 3341, 3341, 3341, 3340, -1000, + 1577, -1000, 3357, 3871, 3195, -1000, 3717, 3715, 3711, 3707, + -308, 3355, 2544, -1000, -1000, 103, 58423, 58423, 302, 58423, + -327, 417, 477, -134, -135, 475, -136, 1042, -1000, 502, + -1000, -1000, 1143, -1000, 1127, 61853, 949, -1000, -1000, 58423, + 837, 837, 837, 58423, 195, 934, 1088, 837, 837, 837, + 837, 950, 837, 3750, 994, 992, 987, 981, 837, -87, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2132, 2128, 3585, + 804, 56365, 1669, 58423, -1000, 3273, 1102, -1000, -1000, -1000, + -1000, 417, -356, 3520, 2009, 2009, 3803, 3803, 3749, 3748, + 761, 758, 754, 2009, 607, -1000, 2116, 2116, 2116, 2116, + 2009, 525, 776, 3755, 3755, 95, 2116, 40, 2009, 2009, + 40, 2009, 2009, 431, -1000, 2107, 492, 221, -315, -1000, + -1000, -1000, -1000, 2116, 2116, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 3724, 3722, 856, 856, 58423, 856, 339, 193, + 58423, 856, 856, 856, 58423, 879, -360, -6, 61167, 60481, + 2643, 487, 740, 739, 1691, 2095, -1000, 1961, 58423, 58423, + 1961, 1961, 28925, 28239, -1000, 58423, -1000, 3871, 3195, 3119, + 1737, 3113, 3195, -137, 417, 856, 856, 856, 856, 856, + 275, 856, 856, 856, 856, 856, 58423, 58423, 55679, 856, + 472, 856, 856, 856, 11677, 1912, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 17894, + 2328, 2316, 206, -40, -349, 281, -1000, -1000, 58423, 3640, + 1882, -1000, -1000, -1000, 3249, -1000, 3256, 3256, 3256, 3256, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 3347, 3347, 3351, 3351, 3347, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 57761, 3974, -1000, - -1000, 13218, 57761, 3750, 3972, 3732, 3849, 3891, 3532, 3421, - -1000, -1000, 57761, 338, 2490, -1000, -1000, 1873, 2599, 2940, - -1000, 292, -1000, 718, 292, -1000, 740, 740, 2063, -1000, - 1330, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 57761, -55, - 530, -1000, -1000, 2885, 3420, -1000, 635, 1616, 1849, -1000, - 309, 4529, 45449, 440, 45449, 57761, -1000, -1000, -1000, -1000, - -1000, -1000, 72, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 3256, 3256, 3270, 3352, -1000, -1000, 3254, 3254, 3254, 3249, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 312, -1000, 13218, - 13218, 13218, 13218, 13218, -1000, 815, 15279, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 15966, 15966, 15966, 15966, 15966, 15966, - 15966, 15966, 15966, 15966, 15966, 15966, 15966, 15966, 3411, 2165, - 15966, 15966, 15966, 15966, 5149, 30401, 1465, 3435, 1683, 328, - 2017, 2017, 2017, 2017, 13218, -1000, 2218, 2467, 13218, 13218, - 13218, 13218, 37241, 57761, -1000, -1000, 4578, 13218, 13218, 4643, - 13218, 3780, 13218, 13218, 13218, 3196, 6322, 57761, 13218, -1000, - 3191, 3190, -1000, -1000, 2393, 13218, -1000, -1000, 13218, -1000, - -1000, 13218, 15966, 13218, -1000, 13218, 13218, 13218, -1000, -1000, - 1694, 1694, 1227, 3780, 3780, 3780, 2236, 13218, 13218, 3780, - 3780, 3780, 2170, 3780, 3780, 3780, 3780, 3780, 3780, 3780, - 3780, 3780, 3780, 3780, 3180, 3175, 3174, 3165, 13218, 3164, - 13218, 13218, 13218, 13218, 13218, 12531, 3849, -239, -1000, 10464, - 3732, 3849, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -309, 3416, 57761, 2939, 2935, -377, -379, 1273, - -379, 1862, -1000, -332, 1266, 298, 57761, -1000, -1000, 57761, - 2934, 2597, 57761, 2929, 2595, 231, 224, 57761, 57761, 57761, - -4, 1269, 1219, 1226, -1000, -1000, 57761, 59129, -1000, 57761, - 2256, 57761, 57761, 3776, -1000, 57761, 57761, 984, 984, 984, - -1000, 52973, 2927, 45449, 57761, 57761, 440, 57761, 57761, 57761, - 984, 984, 984, 984, 57761, -1000, 3688, 45449, 3679, 3324, - 907, 57761, 1667, 3775, 57761, 997, -1000, -1000, -1000, -1000, - -1000, 830, 3896, 15966, 15966, -1000, -1000, 13218, -1000, 215, - 54341, 2143, 2110, 2110, -1000, -1000, 57761, -1000, -1000, -1000, - 2143, 57761, 2143, 2143, 3896, 2143, -1000, -1000, -1000, 2110, - 2110, -1000, -1000, 13218, -1000, -1000, 2143, 2143, -1000, -1000, - 3896, 57761, 64, 3896, 3896, 21, -1000, -1000, 57761, -1000, - 2110, 2926, -1000, 57761, 57761, 984, 57761, -1000, 57761, 57761, - -1000, -1000, 57761, 57761, 5396, 57761, 3756, 1113, 52973, 53657, - 3804, -1000, 45449, 57761, 57761, 1658, -1000, 1018, 41345, -1000, - 57761, 1611, -1000, -15, -1000, -37, 10, 2028, 10, 2028, - 1017, -1000, 629, 402, 26297, 568, 45449, 7706, -1000, -1000, - 2028, 2028, 7706, 7706, 1984, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 1657, -1000, 249, 3849, -1000, -1000, -1000, -1000, - -1000, 2583, -340, 57761, 52973, 45449, 440, 57761, 985, 57761, - 57761, 57761, 57761, 57761, -1000, 3415, 1860, -1000, 3755, 57761, - 985, 57761, 57761, 57761, 1823, -1000, -1000, 22844, 1859, -1000, - -1000, 2227, -1000, 13218, 17350, -292, 13218, 17350, 17350, 13218, - 17350, -1000, 13218, 1769, -1000, -1000, -1000, -1000, 2582, -1000, - 2581, -1000, -1000, -1000, -1000, -1000, 2922, 2922, -1000, 2578, - -1000, -1000, -1000, -1000, 2577, -1000, -1000, 2570, -1000, -1000, - -1000, -1000, -171, 3157, 1388, -1000, 2917, 3849, -1000, -245, - 3886, 13218, -1000, -241, -1000, 24234, 57761, 57761, -388, 2193, - 2192, 2187, 3836, 985, 57761, -1000, 3841, -1000, -1000, 292, - -1000, -1000, -1000, 740, 575, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 1851, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -123, -124, 1656, -1000, 57761, -1000, - -1000, 309, 45449, 49553, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1821, -1000, -1000, 182, -1000, 1015, 220, 2062, -1000, - -1000, 199, 221, 181, 1147, 2467, -1000, 2270, 2270, 2271, - -1000, 823, -1000, -1000, -1000, -1000, 3412, -1000, -1000, -1000, - 2267, 4796, -1000, 2295, 2295, 1866, 1866, 1866, 1866, 1866, - 2282, 2282, 2017, 2017, -1000, -1000, -1000, 8403, 3411, 15966, - 15966, 15966, 15966, 1059, 1059, 4924, 4370, -1000, -1000, 1985, - 1985, -1000, -1000, -1000, -1000, 13218, 174, 2213, -1000, 13218, - 2962, 2020, 2956, 1707, 2059, -1000, 3340, 13218, 1842, -1000, + -1000, -1000, -1000, -1000, -1000, 3260, 3260, 3269, 3269, 3260, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 58423, 3867, + -1000, -1000, 13750, 58423, 3664, 3871, 3657, 3755, 3797, 3427, + 3351, -1000, -1000, 58423, 320, 2351, -1000, -1000, 1815, 2543, + 2916, -1000, 318, -1000, 533, 318, -1000, 670, 670, 1976, + -1000, 1528, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 58423, + -43, 452, -1000, -1000, 2874, 3346, -1000, 658, 1306, 1685, + -1000, 247, 4766, 46075, 487, 46075, 58423, -1000, -1000, -1000, + -1000, -1000, -1000, 78, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 305, -1000, + 13750, 13750, 13750, 13750, 13750, -1000, 755, 15817, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 16506, 16506, 16506, 16506, 16506, + 16506, 16506, 16506, 16506, 16506, 16506, 16506, 16506, 16506, 3329, + 2104, 16506, 16506, 16506, 16506, 5215, 30983, 1737, 3287, 1674, + 327, 1911, 1911, 1911, 1911, 13750, -1000, 2151, 2580, 13750, + 13750, 13750, 13750, 37843, 58423, -1000, -1000, 5439, 13750, 13750, + 4719, 13750, 3705, 13750, 13750, 13750, 3112, 6834, 58423, 13750, + -1000, 3110, 3109, -1000, -1000, 2372, 13750, -1000, -1000, 13750, + -1000, -1000, 13750, 16506, 13750, -1000, 13750, 13750, 13750, -1000, + -1000, 805, 805, 1001, 3705, 3705, 3705, 2083, 13750, 13750, + 3705, 3705, 3705, 2073, 3705, 3705, 3705, 3705, 3705, 3705, + 3705, 3705, 3705, 3705, 3705, 3108, 3106, 3105, 3104, 13750, + 3103, 13750, 13750, 13750, 13750, 13750, 13061, 3755, -242, -1000, + 10988, 3657, 3755, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -311, 3341, 58423, 2913, 2907, -381, -382, + 1206, -382, 1805, -1000, -328, 1150, 301, 58423, -1000, -1000, + 58423, 2903, 2533, 58423, 2896, 2527, 230, 213, 58423, 58423, + 58423, 29, 1154, 1130, 1120, -1000, -1000, 58423, 59795, -1000, + 58423, 2169, 58423, 58423, 3692, -1000, 58423, 58423, 837, 837, + 837, -1000, 53621, 2892, 46075, 58423, 58423, 487, 58423, 58423, + 58423, 837, 837, 837, 837, 58423, -1000, 3595, 46075, 3589, + 3418, 804, 58423, 1669, 3690, 58423, 879, -1000, -1000, -1000, + -1000, -1000, 701, 3803, 16506, 16506, -1000, -1000, 13750, -1000, + 223, 54993, 2116, 2009, 2009, -1000, -1000, 58423, -1000, -1000, + -1000, 2116, 58423, 2116, 2116, 3803, 2116, -1000, -1000, -1000, + 2009, 2009, -1000, -1000, 13750, -1000, -1000, 2116, 2116, -1000, + -1000, 3803, 58423, 73, 3803, 3803, 65, -1000, -1000, 58423, + -1000, 2009, 2886, -1000, 58423, 58423, 837, 58423, -1000, 58423, + 58423, -1000, -1000, 58423, 58423, 5469, 58423, 3673, 1023, 53621, + 54307, 3721, -1000, 46075, 58423, 58423, 1657, -1000, 947, 41959, + -1000, 58423, 1581, -1000, -20, -1000, -12, -6, 1961, -6, + 1961, 946, -1000, 647, 426, 26867, 579, 46075, 8222, -1000, + -1000, 1961, 1961, 8222, 8222, 1880, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1656, -1000, 267, 3755, -1000, -1000, -1000, + -1000, -1000, 2526, -340, 58423, 53621, 46075, 487, 58423, 856, + 58423, 58423, 58423, 58423, 58423, -1000, 3339, 1802, -1000, 3670, + 58423, 856, 58423, 58423, 58423, 1471, -1000, -1000, 23404, 1801, + -1000, -1000, 2160, -1000, 13750, 17894, -289, 13750, 17894, 17894, + 13750, 17894, -1000, 13750, 1790, -1000, -1000, -1000, -1000, 2522, + -1000, 2517, -1000, -1000, -1000, -1000, -1000, 2885, 2885, -1000, + 2510, -1000, -1000, -1000, -1000, 2508, -1000, -1000, 2502, -1000, + -1000, -1000, -1000, -172, 3102, 1261, -1000, 2884, 3755, -1000, + -249, 3793, 13750, -1000, -243, -1000, 24798, 58423, 58423, -390, + 2123, 2122, 2121, 3733, 856, 58423, -1000, 3746, -1000, -1000, + 318, -1000, -1000, -1000, 670, 441, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1795, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -128, -129, 1611, -1000, 58423, + -1000, -1000, 247, 46075, 50191, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 1684, -1000, -1000, 184, -1000, 945, 237, 1967, + -1000, -1000, 201, 219, 194, 1043, 2580, -1000, 2175, 2175, + 2194, -1000, 720, -1000, -1000, -1000, -1000, 3330, -1000, -1000, + -1000, 3860, 3830, -1000, 2028, 2028, 1899, 1899, 1899, 1899, + 1899, 2021, 2021, 1911, 1911, -1000, -1000, -1000, 8921, 3329, + 16506, 16506, 16506, 16506, 1004, 1004, 2806, 4585, -1000, -1000, + 1870, 1870, -1000, -1000, -1000, -1000, 13750, 173, 2155, -1000, + 13750, 2689, 1963, 2586, 1473, 1936, -1000, 3249, 13750, 1794, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3148, - 3144, 2949, 3916, 3142, 13218, -1000, -1000, 2054, 2053, 2046, - -1000, 2551, 11844, -1000, -1000, -1000, 3141, 1833, 3134, -1000, - -1000, -1000, 3124, 2041, 1381, 3123, 1741, 3116, 3115, 3109, - 3105, 1641, 1638, 1633, -1000, -1000, -1000, -1000, 13218, 13218, - 13218, 13218, 3104, 2037, 2030, 13218, 13218, 13218, 13218, 3103, - 13218, 13218, 13218, 13218, 13218, 13218, 13218, 13218, 13218, 13218, - 57761, 105, 105, 105, 105, 3418, 105, 1875, 1836, 3413, - 3373, 2015, 1627, 1626, -1000, -1000, 2013, -1000, 2467, -1000, - -1000, 3886, -1000, 3409, 2569, 1624, -1000, -1000, -365, 2836, - 1013, 57761, -335, 57761, 1013, 57761, 57761, 2185, 1013, -336, - 2916, -1000, -1000, -1000, 2915, -1000, -1000, 57761, 57761, 57761, - 57761, -139, 3748, 3747, -1000, -1000, 1236, 1197, 1231, -1000, - 57761, -1000, 2908, 3754, 3840, 967, 57761, 3408, 3407, 57761, - 57761, 57761, 245, -1000, -1000, 57761, 1470, -1000, 220, -62, - 609, 1416, 3577, 910, 3971, 57761, 57761, 57761, 57761, 3770, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3598, -241, - -1000, 23539, 57761, 3324, -1000, 3406, 1997, -1000, 52289, 440, - -1000, 2017, 2017, 2467, 57761, 57761, 57761, 3575, 57761, 57761, - 3896, 3896, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2143, - 3896, 3896, 1824, 2110, 2143, -1000, -1000, 2143, -388, -1000, - 2143, -1000, -1000, -1000, -388, 1829, -388, 57761, -1000, -1000, - -1000, 3769, 3354, 1618, -1000, -1000, -1000, 3889, 1109, 951, - 951, 1184, 597, 3888, 21476, -1000, 2060, 1446, 1012, 3695, - 322, -1000, 2060, -168, 934, 2060, 2060, 2060, 2060, 2060, - 2060, 2060, 777, 769, 2060, 2060, 2060, 2060, 2060, 2060, - 2060, 2060, 2060, 2060, 2060, 1275, 2060, 2060, 2060, 2060, - 2060, -1000, 2060, 3405, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 822, 692, 440, 1010, 6, 0, 236, 3802, 384, - -1000, 393, 1470, 650, 3797, 438, 57761, 57761, 4032, 1472, - -1000, -1000, -1000, -1000, -1000, 31085, 31085, 25613, 31085, -1000, - 206, 2028, 10, -28, -1000, -1000, 1611, 7706, 1611, 7706, - 2568, -1000, -1000, 1008, -1000, -1000, 1416, -1000, 57761, 57761, - -1000, -1000, 3397, 2184, -1000, -1000, 18729, -1000, 7706, 7706, - -1000, -1000, 33137, 57761, -1000, -56, -1000, -25, 3886, -1000, - -1000, -1000, 1392, -1000, -1000, 1596, 1416, 3597, 57761, 1392, - 1392, 1392, -1000, -1000, 20108, 57761, 57761, -1000, 2904, -1000, - 3915, -340, 3896, 11151, -1000, 41345, -1000, -1000, 51605, -1000, - 50921, 2208, -1000, 17350, 2441, 202, -1000, 272, -351, 200, - 2344, 198, 2467, -1000, -1000, 3101, 3098, 1981, -1000, 1976, - 3096, 1975, 1966, 2562, -1000, 38, 3886, 2903, 3732, -215, - 1595, -1000, 2527, 1397, -1000, 3395, -1000, 1953, 3663, -1000, - 1574, -1000, 2180, 1951, -1000, -1000, 13218, 50237, 13218, 1178, - 2886, 1826, 168, -1000, -1000, -1000, 57761, 2885, 1947, 49553, - 1429, -1000, 1007, 1810, 1809, -1000, 45449, 311, 45449, -1000, - 45449, -1000, -1000, 3866, -1000, 57761, 3735, -1000, -1000, -1000, - 2836, 2172, -386, 57761, -1000, -1000, -1000, -1000, -1000, 1938, - -1000, 1059, 1059, 4924, 2804, -1000, 15966, -1000, 15966, -1000, - -1000, -1000, -1000, 3357, -1000, 2173, -1000, 13218, 2416, 5149, - 13218, 5149, 1917, 29717, 37241, -140, 3746, 3348, 57761, -1000, - -1000, 13218, 13218, -1000, 3335, -1000, -1000, -1000, -1000, 13218, - 13218, 2579, -1000, 57761, -1000, -1000, -1000, -1000, 29717, -1000, - 15966, -1000, -1000, -1000, -1000, 13218, 13218, 13218, 1597, 1597, - 3314, 1937, 105, 105, 105, 3283, 3267, 3252, 1936, 105, - 3234, 3212, 3173, 3159, 3155, 3140, 3133, 3122, 3108, 3102, - 1930, -1000, 3389, -1000, -1000, -1000, 105, -1000, 105, 13218, - 105, 13218, 105, 105, 13218, 2321, 14592, 10464, -1000, 3732, - 320, 1590, 2560, 2880, 123, -1000, 2162, -1000, 430, -1000, - 57761, 3911, -1000, 1760, 2877, 48869, -1000, 57761, -1000, -1000, - 3909, 3908, -1000, -1000, 57761, 57761, 57761, -1000, -1000, -1000, - 1186, -1000, 2875, -1000, 251, 223, 2457, 267, 1460, 20108, - 3354, 3383, 3354, 92, 2060, 545, 624, 45449, 817, -1000, - 48185, 2444, 2152, 3596, 804, 3714, 57761, 47501, 3380, 1216, - 3372, 3370, 3764, 555, 5698, -1000, 3729, 1397, 1924, 3651, - 1574, -1000, 425, -1000, 57761, 57761, 1517, -1000, 1750, -1000, - -1000, -1000, 57761, -1000, 440, -1000, 2110, -1000, -1000, 3896, - -1000, -1000, 13218, 13218, 3896, 2110, 2110, -1000, 2143, -1000, - 57761, -1000, -388, 555, 5698, 3763, 5716, 835, 3200, -1000, - 57761, -1000, -1000, -1000, 980, -1000, 1172, 984, 57761, 2292, - 1172, 2288, 3368, -1000, -1000, 57761, 57761, 57761, 57761, -1000, - -1000, 57761, -1000, 57761, 57761, 57761, 57761, 57761, 46817, -1000, - 57761, 57761, -1000, 57761, 2287, 57761, 2286, 3698, -1000, 2060, - 2060, 1158, -1000, -1000, 734, -1000, 46817, 2558, 2557, 2556, - 2554, 2872, 2871, 2869, 2060, 2060, 2548, 2851, 46133, 2850, - 1414, 2547, 2537, 2535, 2544, 2848, 1170, -1000, 2847, 2532, - 2509, 2460, 57761, 3367, 2750, -1000, -1000, 2457, 1065, 440, - 2845, 3591, 92, 2060, 382, 57761, 2150, 2149, 624, 613, - 613, 606, -63, 26981, -1000, -1000, -1000, 57761, 41345, 41345, - 41345, 41345, 41345, 41345, -1000, 3636, 3620, 3356, -1000, 3621, - 3618, 3622, 3635, 3606, 57761, 41345, 3354, -1000, 46133, -1000, - -1000, -1000, 1465, 1918, 3884, 1185, 13218, 7706, -1000, -1000, - -27, -51, -1000, -1000, -1000, -1000, 45449, 2844, 568, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 3732, 57761, 57761, 916, - 3095, 1563, -1000, -1000, -1000, 5698, 3346, 3346, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3346, 3346, 3353, - -1000, -1000, 3341, 3341, 3341, 3340, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 3347, 3347, 3351, 3351, 3347, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 57761, -1000, 3864, -1000, 1562, -1000, -1000, 1736, -1000, - 2247, -372, 17350, 2210, 2167, -1000, 13218, 17350, 13218, -293, - 356, -296, -1000, -1000, -1000, 2842, -1000, -1000, -1000, 2531, - -1000, 2530, -1000, 120, 158, 3732, 180, -1000, 3970, 13218, - 3687, -1000, -1000, -241, 10464, 3293, 57761, -241, 57761, 10464, - -1000, 57761, 169, -397, -399, 160, 2841, -1000, 57761, 2529, - -1000, -1000, -1000, 3906, 45449, 440, 2005, 44765, -1000, 294, - -1000, 1580, 603, 2839, -1000, 1052, 122, 2838, 2836, -1000, - -1000, -1000, -1000, 15966, 2017, -1000, -1000, -1000, 2467, 13218, - 3094, 2406, 3090, 3083, -1000, 3346, 3346, -1000, 3340, 3341, - 3340, 1985, 1985, 3081, -1000, 3339, -1000, 3746, -1000, 2476, - 3091, -1000, 3026, 3006, 13218, -1000, 3080, 4876, 1955, 1831, - 2974, -87, -199, 105, 105, -1000, -1000, -1000, -1000, 105, - 105, 105, 105, -1000, 105, 105, 105, 105, 105, 105, - 105, 105, 105, 105, 105, 915, -1000, -1000, 1570, -1000, - 1523, -1000, -1000, 2968, -119, -319, -127, -327, -1000, -1000, - 3077, 1550, -1000, -1000, -1000, -1000, -1000, 4643, 1521, 619, - 619, 2836, 2835, 57761, 2833, -337, 57761, -1000, -400, -403, - 2831, 57761, 57761, 35, 2217, 2306, -1000, 2830, -1000, -1000, - 44081, 57761, 57761, 58445, 675, 57761, 57761, 2828, -1000, 2827, - 3072, 1480, -1000, -1000, 57761, -1000, -1000, -1000, 3068, 3761, - 20792, 3760, 2613, -1000, -1000, -1000, 32453, 57761, 613, -1000, - -1000, -1000, 730, 387, 2526, 592, -1000, 57761, 541, 426, - 3681, 2140, 2823, 57761, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 3714, -1000, 1114, -388, 57761, 538, 39293, 18045, - -1000, 3074, 57761, -1000, 57761, 43397, 20792, 20792, 3074, 542, - 2163, -1000, 2284, 3279, -241, 3067, -1000, 907, 1411, 133, - 41345, 57761, -1000, 40661, -1000, 1416, 3896, -1000, 2467, 2467, - -388, 3896, 3896, 2110, -1000, -1000, 542, -1000, 3074, -1000, - 1198, 22160, 634, 468, 466, -1000, 737, -1000, -1000, 905, - 3704, 5698, -1000, 57761, -1000, 57761, -1000, 57761, 57761, 984, - 13218, 3704, 57761, 1006, -1000, 1309, 510, 480, 870, 870, - 1459, -1000, 3746, -1000, -1000, 1454, -1000, -1000, -1000, -1000, - 57761, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 29717, 29717, - 3788, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 2815, 2814, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 3099, 3095, 2640, 3828, 3093, 13750, -1000, -1000, 1933, 1932, + 1931, -1000, 2337, 12372, -1000, -1000, -1000, 3091, 1793, 3084, + -1000, -1000, -1000, 3068, 1920, 1378, 3066, 2233, 3065, 3064, + 3063, 3061, 1604, 1598, 1595, -1000, -1000, -1000, -1000, 13750, + 13750, 13750, 13750, 3060, 1902, 1890, 13750, 13750, 13750, 13750, + 3059, 13750, 13750, 13750, 13750, 13750, 13750, 13750, 13750, 13750, + 13750, 58423, 110, 110, 110, 110, 3283, 110, 1888, 1876, + 3271, 3267, 1918, 1594, 1590, -1000, -1000, 1887, -1000, 2580, + -1000, -1000, 3793, -1000, 3328, 2498, 1588, -1000, -1000, -369, + 2818, 940, 58423, -330, 58423, 940, 58423, 58423, 2120, 940, + -333, 2883, -1000, -1000, -1000, 2881, -1000, -1000, 58423, 58423, + 58423, 58423, -144, 3661, 3660, -1000, -1000, 1148, 1126, 1116, + -1000, 58423, -1000, 2878, 3656, 3745, 901, 58423, 3327, 3323, + 58423, 58423, 58423, 268, -1000, -1000, 58423, 1488, -1000, 237, + -50, 563, 1280, 3502, 876, 3866, 58423, 58423, 58423, 58423, + 3689, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3519, + -243, -1000, 24101, 58423, 3418, -1000, 3322, 1828, -1000, 52935, + 487, -1000, 1911, 1911, 2580, 58423, 58423, 58423, 3501, 58423, + 58423, 3803, 3803, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 2116, 3803, 3803, 1845, 2009, 2116, -1000, -1000, 2116, -390, + -1000, 2116, -1000, -1000, -1000, -390, 1773, -390, 58423, -1000, + -1000, -1000, 3685, 3273, 1582, -1000, -1000, -1000, 3796, 1719, + 810, 810, 1123, 551, 3795, 22032, -1000, 2006, 1279, 939, + 3622, 306, -1000, 2006, -168, 814, 2006, 2006, 2006, 2006, + 2006, 2006, 2006, 669, 668, 2006, 2006, 2006, 2006, 2006, + 2006, 2006, 2006, 2006, 2006, 2006, 1163, 2006, 2006, 2006, + 2006, 2006, -1000, 2006, 3320, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 727, 624, 487, 935, 15, 10, 266, 3720, + 357, -1000, 368, 1488, 690, 3704, 389, 58423, 58423, 3394, + 1453, -1000, -1000, -1000, -1000, -1000, 31669, 31669, 26181, 31669, + -1000, 212, 1961, -6, -1, -1000, -1000, 1581, 8222, 1581, + 8222, 2494, -1000, -1000, 924, -1000, -1000, 1280, -1000, 58423, + 58423, -1000, -1000, 3309, 2117, -1000, -1000, 19277, -1000, 8222, + 8222, -1000, -1000, 33727, 58423, -1000, -44, -1000, -31, 3793, + -1000, -1000, -1000, 1264, -1000, -1000, 1560, 1280, 3515, 58423, + 1264, 1264, 1264, -1000, -1000, 20660, 58423, 58423, -1000, 2877, + -1000, 3824, -340, 3803, 11677, -1000, 41959, -1000, -1000, 52249, + -1000, 51563, 2142, -1000, 17894, 2304, 200, -1000, 264, -354, + 199, 2274, 198, 2580, -1000, -1000, 3054, 3052, 1822, -1000, + 1809, 3051, 1784, 1783, 2490, -1000, 36, 3793, 2875, 3657, + -216, 1553, -1000, 2418, 1266, -1000, 3306, -1000, 1755, 3582, + -1000, 1544, -1000, 2106, 1750, -1000, -1000, 13750, 50877, 13750, + 1086, 2870, 1748, 175, -1000, -1000, -1000, 58423, 2874, 1749, + 50191, 1379, -1000, 922, 1745, 1740, -1000, 46075, 304, 46075, + -1000, 46075, -1000, -1000, 3770, -1000, 58423, 3658, -1000, -1000, + -1000, 2818, 2103, -388, 58423, -1000, -1000, -1000, -1000, -1000, + 1746, -1000, 1004, 1004, 2806, 4434, -1000, 16506, -1000, 16506, + -1000, -1000, -1000, -1000, 3252, -1000, 2141, -1000, 13750, 2299, + 5215, 13750, 5215, 1925, 30297, 37843, -145, 3653, 3189, 58423, + -1000, -1000, 13750, 13750, -1000, 3179, -1000, -1000, -1000, -1000, + 13750, 13750, 2565, -1000, 58423, -1000, -1000, -1000, -1000, 30297, + -1000, 16506, -1000, -1000, -1000, -1000, 13750, 13750, 13750, 1395, + 1395, 3175, 1734, 110, 110, 110, 3170, 3107, 3100, 1733, + 110, 3050, 2995, 2972, 2961, 2950, 2941, 2910, 2887, 2815, + 2782, 1709, -1000, 3305, -1000, -1000, -1000, 110, -1000, 110, + 13750, 110, 13750, 110, 110, 13750, 2268, 15128, 10988, -1000, + 3657, 337, 1548, 2489, 2852, 125, -1000, 2101, -1000, 385, + -1000, 58423, 3823, -1000, 1729, 2851, 49505, -1000, 58423, -1000, + -1000, 3821, 3820, -1000, -1000, 58423, 58423, 58423, -1000, -1000, + -1000, 1119, -1000, 2849, -1000, 253, 242, 2368, 287, 1293, + 20660, 3273, 3304, 3273, 102, 2006, 505, 683, 46075, 689, + -1000, 48819, 2240, 2100, 3512, 855, 3638, 58423, 48133, 3293, + 1651, 3292, 3290, 3683, 521, 5891, -1000, 3647, 1266, 1708, + 3580, 1544, -1000, 4473, -1000, 58423, 58423, 1345, -1000, 1727, + -1000, -1000, -1000, 58423, -1000, 487, -1000, 2009, -1000, -1000, + 3803, -1000, -1000, 13750, 13750, 3803, 2009, 2009, -1000, 2116, + -1000, 58423, -1000, -390, 521, 5891, 3682, 5890, 598, 2678, + -1000, 58423, -1000, -1000, -1000, 832, -1000, 1082, 837, 58423, + 2211, 1082, 2209, 3289, -1000, -1000, 58423, 58423, 58423, 58423, + -1000, -1000, 58423, -1000, 58423, 58423, 58423, 58423, 58423, 47447, + -1000, 58423, 58423, -1000, 58423, 2207, 58423, 2206, 3635, -1000, + 2006, 2006, 1078, -1000, -1000, 665, -1000, 47447, 2481, 2479, + 2469, 2465, 2848, 2847, 2845, 2006, 2006, 2463, 2843, 46761, + 2842, 1250, 2461, 2459, 2457, 2440, 2841, 1118, -1000, 2835, + 2416, 2396, 2394, 58423, 3286, 2736, -1000, -1000, 2368, 1030, + 487, 2834, 3510, 102, 2006, 345, 58423, 2093, 2092, 683, + 602, 602, 562, -78, 27553, -1000, -1000, -1000, 58423, 41959, + 41959, 41959, 41959, 41959, 41959, -1000, 3558, 3540, 3285, -1000, + 3543, 3541, 3542, 3556, 3528, 58423, 41959, 3273, -1000, 46761, + -1000, -1000, -1000, 1737, 1697, 3508, 1170, 13750, 8222, -1000, + -1000, -27, -23, -1000, -1000, -1000, -1000, 46075, 2833, 579, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3657, 58423, 58423, + 795, 3049, 1531, -1000, -1000, -1000, 5891, 3256, 3256, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3256, 3256, + 3270, -1000, -1000, 3254, 3254, 3254, 3249, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 3260, 3260, 3269, 3269, + 3260, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 58423, -1000, 3801, -1000, 1529, -1000, -1000, 1711, + -1000, 2165, -376, 17894, 2087, 2060, -1000, 13750, 17894, 13750, + -290, 331, -294, -1000, -1000, -1000, 2832, -1000, -1000, -1000, + 2455, -1000, 2454, -1000, 126, 183, 3657, 190, -1000, 3865, + 13750, 3613, -1000, -1000, -243, 10988, 3259, 58423, -243, 58423, + 10988, -1000, 58423, 169, -404, -405, 165, 2830, -1000, 58423, + 2451, -1000, -1000, -1000, 3819, 46075, 487, 1926, 45389, -1000, + 310, -1000, 1647, 614, 2821, -1000, 978, 122, 2819, 2818, + -1000, -1000, -1000, -1000, 16506, 1911, -1000, -1000, -1000, 2580, + 13750, 3048, 2458, 3045, 3044, -1000, 3256, 3256, -1000, 3249, + 3254, 3249, 1870, 1870, 3043, -1000, 3247, -1000, 3653, -1000, + 2386, 2729, -1000, 2709, 2703, 13750, -1000, 3038, 4419, 1854, + 1485, 2672, -90, -200, 110, 110, -1000, -1000, -1000, -1000, + 110, 110, 110, 110, -1000, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 808, -1000, -1000, 1555, + -1000, 1460, -1000, -1000, 2635, -122, -319, -125, -321, -1000, + -1000, 3034, 1516, -1000, -1000, -1000, -1000, -1000, 4719, 1486, + 570, 570, 2818, 2816, 58423, 2814, -337, 58423, -1000, -406, + -408, 2809, 58423, 58423, 33, 2148, 2237, -1000, 2800, -1000, + -1000, 44703, 58423, 58423, 59109, 623, 58423, 58423, 2799, -1000, + 2769, 3032, 1482, -1000, -1000, 58423, -1000, -1000, -1000, 3031, + 3681, 21346, 3680, 2545, -1000, -1000, -1000, 33041, 58423, 602, + -1000, -1000, -1000, 715, 312, 2450, 601, -1000, 58423, 522, + 380, 3603, 2086, 2768, 58423, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 3638, -1000, 1205, -390, 58423, 504, 39901, + 18591, -1000, 3041, 58423, -1000, 58423, 44017, 21346, 21346, 3041, + 508, 2111, -1000, 2203, 3006, -243, 3029, -1000, 804, 1545, + 130, 41959, 58423, -1000, 41273, -1000, 1280, 3803, -1000, 2580, + 2580, -390, 3803, 3803, 2009, -1000, -1000, 508, -1000, 3041, + -1000, 1304, 22718, 584, 482, 450, -1000, 691, -1000, -1000, + 794, 3611, 5891, -1000, 58423, -1000, 58423, -1000, 58423, 58423, + 837, 13750, 3611, 58423, 917, -1000, 1224, 481, 424, 816, + 816, 1478, -1000, 3653, -1000, -1000, 1469, -1000, -1000, -1000, + -1000, 58423, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 30297, + 30297, 3702, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 2766, 2764, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 57761, 1914, -1000, 2136, 2813, - 1005, -1000, 3588, 1044, 2613, 32453, 2127, 2028, 2810, 2805, - 613, -1000, 2797, 2796, -1000, 2444, 2120, 1039, 57761, -1000, - 1405, 57761, 57761, -1000, 1469, -1000, 2111, 3571, 3586, 3571, - -1000, 3571, -1000, -1000, -1000, -1000, 3633, 2794, -1000, 3632, - -1000, 3630, -1000, -1000, -1000, -1000, 1469, -1000, -1000, -1000, - -1000, -1000, 1185, -1000, 3839, 1172, 1172, 1172, 3065, -1000, - -1000, -1000, -1000, 1429, 3064, -1000, -1000, 3838, -1000, -1000, - -1000, -1000, -1000, -1000, 20108, 3713, 536, 3893, 3885, 42713, - -1000, -372, 2166, -1000, 2356, 196, 2279, 57761, -1000, -1000, - -1000, 3061, 3060, -247, 159, 3883, 3882, 3838, -270, 2773, - 291, -1000, -1000, 3707, -1000, 3059, 1428, -241, -1000, -1000, - 1397, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -409, -1000, - -1000, 440, -1000, 1530, -1000, -1000, -1000, -1000, -1000, -1000, - 194, -1000, 57761, -1000, 1424, 121, -1000, 2467, -1000, 5149, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 2772, -1000, -1000, 13218, -1000, -1000, -1000, 2937, -1000, -1000, - 13218, 13218, -1000, 3048, 2763, 3047, 2760, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 58423, 1695, -1000, 2084, + 2763, 906, -1000, 3509, 957, 2545, 33041, 2081, 1961, 2761, + 2760, 602, -1000, 2759, 2758, -1000, 2240, 2080, 956, 58423, + -1000, 1267, 58423, 58423, -1000, 1561, -1000, 2075, 3487, 3255, + 3487, -1000, 3487, -1000, -1000, -1000, -1000, 3555, 2755, -1000, + 3554, -1000, 3549, -1000, -1000, -1000, -1000, 1561, -1000, -1000, + -1000, -1000, -1000, 1170, -1000, 3737, 1082, 1082, 1082, 3028, + -1000, -1000, -1000, -1000, 1379, 3027, -1000, -1000, 3735, -1000, + -1000, -1000, -1000, -1000, -1000, 20660, 3632, 499, 3799, 3790, + 43331, -1000, -376, 2139, -1000, 2217, 196, 2079, 58423, -1000, + -1000, -1000, 3026, 3017, -252, 168, 3789, 3786, 3735, -272, + 2748, 308, -1000, -1000, 3624, -1000, 3012, 1342, -243, -1000, + -1000, 1266, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -411, + -1000, -1000, 487, -1000, 1490, -1000, -1000, -1000, -1000, -1000, + -1000, 208, -1000, 58423, -1000, 1338, 121, -1000, 2580, -1000, + 5215, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 2747, -1000, -1000, 13750, -1000, -1000, -1000, 2556, -1000, + -1000, 13750, 13750, -1000, 3004, 2745, 3003, 2742, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 3972, -1000, 3881, 105, 13218, 105, - 13218, 105, 1870, 3046, 3044, 1869, 3043, 3038, -1000, 13218, - 3037, 4643, 1177, 2754, 1177, -1000, -1000, -1000, -1000, 57761, - -1000, -1000, -1000, 31769, 1004, -388, 569, 3327, -1000, 582, - 2217, 1232, 3323, 2753, -1000, 57761, 3900, 57761, 2457, 671, - 2457, 729, 57761, -340, -1000, -144, 1460, 5698, 1068, 3074, - 3031, 1421, -1000, -1000, -1000, -1000, 3074, -1000, 2751, 211, - -1000, -1000, -1000, 495, -1000, 2525, -1000, -1000, 2450, 1759, - 229, -1000, -1000, -1000, -1000, -1000, -1000, 2585, 57761, 42029, - 2585, 2612, 2108, -389, -1000, 3321, -1000, 2060, 2060, 2060, - 1004, 534, 57761, 1816, -1000, 2060, 2060, 3029, -1000, -1000, - 1004, 57761, 3027, 3025, 3968, 917, 2128, 2092, -1000, 2524, - 1228, -241, -1000, 1397, -1000, 31085, 41345, 40661, 1456, -1000, - 1726, -1000, -1000, -1000, -1000, -1000, 3896, 917, -1000, 628, - 2521, 15966, 3319, 15966, 3317, 627, 3316, 1814, -1000, 57761, - -1000, -1000, 57761, 4392, 3309, -1000, 3307, 3573, 615, 3305, - 3304, 57761, 2933, -1000, 3704, 57761, 837, 3709, -1000, 419, - -1000, -1000, -1000, -1000, -1000, -1000, 712, -1000, 57761, -1000, - 57761, -1000, 1931, -1000, 29717, -1000, -1000, 1771, -1000, 2750, - 2749, -1000, 440, 1030, 57761, -1000, 211, 2746, 7706, -1000, - -1000, -1000, -1000, -1000, 3681, 2744, 2585, 57761, -1000, 57761, - 1405, 1405, 3972, 57761, 10464, -1000, -1000, 13218, 3303, -1000, - 13218, -1000, -1000, -1000, 3024, -1000, -1000, -1000, -1000, -1000, - 3301, 3705, -1000, -1000, -1000, -1000, -1000, -1000, 3956, -1000, - 2274, 57761, -1000, 13218, 13905, -1000, 974, 17350, -299, 349, - -1000, -1000, -1000, -250, 2737, -1000, -1000, 3874, 2736, 2641, - -1000, 38, 2733, -1000, 13218, -1000, -1000, -1000, 1397, -1000, - 1416, -1000, -1000, 1238, 782, -1000, 3022, 2169, -1000, 2896, - -1000, 2887, 2734, 105, -1000, 105, -1000, 261, 13218, -1000, - 2717, -1000, 2677, -1000, -1000, 2732, -1000, -1000, -1000, 2730, - -1000, -1000, 2669, -1000, 3021, -1000, 2728, -1000, -1000, 2727, - -1000, -1000, 405, 1004, -1000, 412, 57761, 625, -1000, 39977, - 7019, -390, 531, 57761, 3898, 2726, 2457, 2721, 2457, 57761, - 665, -1000, 2720, 2718, -1000, -1000, 5698, 3967, 3968, 20792, - 3967, -1000, -1000, 3865, -1000, 1708, 399, -1000, -1000, 2399, - 622, -1000, -1000, 2716, 666, -1000, 1405, -1000, -1000, 2105, - 2346, 2671, 37241, 29717, 30401, 2713, -1000, 57761, -1000, -1000, - 39293, 2274, 2274, 63246, -1000, 527, 312, 63305, -1000, 3299, - 1282, 2081, -1000, 2519, -1000, 2507, -1000, 57761, -1000, 1397, - 3896, 1456, 126, -1000, -1000, 1990, -1000, 1282, 3200, 3873, - -1000, 4773, 57761, 3897, 57761, 3294, 2093, 15966, -1000, 905, - 3649, -1000, -1000, 4392, -1000, -1000, 2301, 15966, -1000, -1000, - 2710, 30401, 1057, 2091, 2082, 1058, 3292, -1000, 739, 3954, - 2506, -1000, -1000, -1000, 1108, 3290, -1000, -278, 3288, 2278, - 2277, -1000, 57761, -1000, 37241, 37241, 795, 795, 37241, 37241, - 3286, 870, -1000, -1000, 15966, -1000, -1000, -1000, 2079, 1773, - -1000, -1000, -1000, 2060, 1844, -1000, -1000, -1000, -1000, 57761, - 1709, -1000, -1000, -1000, 2612, -1000, -1000, 1392, -1000, 3849, - -1000, -1000, 2467, 57761, 2467, -1000, 38609, -1000, 3872, 3871, - -1000, -1000, -1000, 2467, 1487, 259, 3277, 3276, -1000, -372, - 57761, 57761, -259, 2497, -1000, 2707, 141, -1000, -1000, 120, - -1000, 1388, -266, 21, 29717, 2071, -1000, 3020, 357, -158, - -1000, -1000, -1000, -1000, -1000, 3018, -1000, 756, -1000, -1000, - -1000, 1388, 105, 105, 3013, 3008, -1000, -1000, -1000, -1000, - 57761, -1000, 57761, 2706, 2493, -1000, -1000, 1770, -1000, -1000, - -1000, 2260, 2254, 1763, 2994, 1661, 2658, 57761, 523, 57761, - -340, 2703, -340, 2697, 658, 2457, -1000, -1000, -154, -1000, - -1000, 414, -1000, -1000, -1000, 630, 2637, 2492, -1000, -1000, - 391, -1000, -1000, -1000, 2585, 2696, -1000, -1000, 110, -1000, - 2070, 1762, -1000, -1000, -1000, 495, -1000, -1000, -1000, 884, - -1000, 3074, 63090, -1000, 1446, 57761, -1000, 1238, 884, 35873, - 754, 2181, -1000, 2483, -1000, -1000, 1353, 3972, -1000, 705, - -1000, 645, -1000, 1730, -1000, 1693, 37925, 2473, 3862, -1000, - 5996, 1066, -1000, -1000, 4924, -1000, -1000, -1000, -1000, -1000, - -1000, 2689, 2688, -1000, -1000, -1000, -1000, -1000, 2458, 3275, - -72, -1000, 3786, 2687, 3759, 13218, -1000, -1000, 3254, 1671, - 1666, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1654, 1621, 37241, -1000, -1000, 4924, 1773, 2342, -1000, - 2060, 2060, 2684, 2683, 472, -1000, -1000, 2060, 2060, 2060, - -1000, -1000, 2067, 2060, 2060, 29717, 2060, 1692, 57761, -1000, - -1000, 1588, 1573, -1000, -1000, -1000, -1000, -1000, -353, 3248, - 13218, 13218, -1000, -1000, -1000, 3244, -1000, -1000, 3870, -247, - -268, 2682, 112, 130, -1000, 2680, -1000, -155, 3643, -163, - -1000, -1000, 792, -242, 98, 97, 91, -1000, -1000, -1000, - 13218, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 57761, 2674, -1000, -1000, 108, -1000, 2061, -1000, 57761, 519, - -1000, -340, -1000, -340, 2457, 2673, 57761, 736, -1000, -1000, - -1000, -1000, 192, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 2671, 2666, -1000, -1000, 623, 3869, -1000, 63305, -1000, 2060, - 495, -1000, 623, 1566, -1000, 2060, 2060, -1000, 553, -1000, - 2075, -1000, 2448, -1000, 3849, -1000, 552, -1000, 626, -1000, - -1000, -1000, 1559, -1000, -1000, -1000, 5996, 631, -1000, 879, - 3238, -1000, -1000, 2987, 13218, 3237, 2060, 2982, 3236, 2561, - -137, 37241, 3566, 3375, 3337, 3214, 1533, -1000, -1000, 2439, - 2425, -1000, -1000, 57761, 2415, 2395, 2381, 2330, 2380, 2375, - -1000, 29717, 57761, -1000, -1000, -1000, 36557, -1000, 3232, 1528, - 1526, 57761, 2641, -250, -1000, 2663, -1000, 988, 137, 130, - -1000, 3868, 140, 3863, 3861, 1341, 3641, -1000, -1000, 2237, - -1000, 94, 87, 84, -1000, -1000, -1000, -1000, 2253, 2253, - -340, 2658, 2657, -1000, 57761, -1000, -1000, 2655, -340, 566, - -1000, 290, -1000, -1000, -1000, 1773, -1000, 3859, 835, -1000, - 29717, -1000, -1000, -1000, 35873, 2274, 2274, -1000, -1000, 2374, - -1000, -1000, -1000, -1000, 2364, -1000, -1000, -1000, 1522, -1000, - 57761, 1115, 9777, -1000, 2538, -1000, 57761, -1000, 13218, -277, - 3585, -1000, 228, 1486, 1773, 795, 1773, 795, 1773, 795, - 1773, 795, 276, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1484, 13218, -1000, - -1000, 1475, -1000, -1000, -259, -1000, 3226, 2354, 159, 131, - 3858, -1000, 2641, 3855, 2641, 2641, -1000, 104, 3965, 792, - -1000, -1000, -1000, -1000, 2217, -1000, 2217, -1000, -1000, -1000, - -1000, -340, -1000, 2654, -1000, -1000, -1000, 35189, 634, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 631, 63305, -1000, 9777, - 1444, -1000, 2467, -1000, 870, -1000, 2486, -1000, -1000, -1000, - -1000, 3583, 3580, 3904, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 3223, 2981, -1000, 57761, -1000, 3784, - 29033, 118, -1000, -1000, -1000, 2653, -1000, 2641, -1000, -1000, - 2051, -161, -1000, -1000, -1000, -1000, -315, -1000, 57761, 628, - -1000, 63305, 1415, -1000, 9777, -1000, -277, -1000, 3947, -1000, - 3905, 1101, 1101, 1773, 1773, 1773, 1773, 13218, -1000, -1000, - -1000, 57761, -1000, 1413, -1000, -1000, -1000, 1691, -1000, -1000, - -1000, -1000, 2632, -165, -1000, -1000, 2627, 1407, 3200, -1000, - -1000, -1000, -1000, -1000, -1000, 2421, 745, -1000, 2553, 1311, - -1000, 2042, -1000, 34505, 57761, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 57761, 9090, -1000, 1690, -1000, -1000, - 2467, 57761, -1000, + -1000, -1000, -1000, -1000, -1000, 3871, -1000, 3785, 110, 13750, + 110, 13750, 110, 1693, 2998, 2997, 1682, 2996, 2993, -1000, + 13750, 2992, 4719, 1085, 2741, 1085, -1000, -1000, -1000, -1000, + 58423, -1000, -1000, -1000, 32355, 903, -390, 526, 3246, -1000, + 531, 2148, 1142, 3244, 2740, -1000, 58423, 3815, 58423, 2368, + 618, 2368, 714, 58423, -340, -1000, -149, 1293, 5891, 1021, + 3041, 2987, 1288, -1000, -1000, -1000, -1000, 3041, -1000, 2737, + 232, -1000, -1000, -1000, 456, -1000, 2448, -1000, -1000, 2383, + 1720, 244, -1000, -1000, -1000, -1000, -1000, -1000, 2300, 58423, + 42645, 2300, 2464, 2074, -395, -1000, 3241, -1000, 2006, 2006, + 2006, 903, 490, 58423, 1676, -1000, 2006, 2006, 2986, -1000, + -1000, 903, 58423, 2985, 2983, 3863, 806, 2035, 1999, -1000, + 2422, 1141, -243, -1000, 1266, -1000, 31669, 41959, 41273, 1454, + -1000, 1707, -1000, -1000, -1000, -1000, -1000, 3803, 806, -1000, + 580, 2421, 16506, 3238, 16506, 3237, 604, 3234, 1671, -1000, + 58423, -1000, -1000, 58423, 4591, 3233, -1000, 3232, 3490, 569, + 3230, 3224, 58423, 2551, -1000, 3611, 58423, 777, 3626, -1000, + 404, -1000, -1000, -1000, -1000, -1000, -1000, 621, -1000, 58423, + -1000, 58423, -1000, 1856, -1000, 30297, -1000, -1000, 1653, -1000, + 2736, 2723, -1000, 487, 954, 58423, -1000, 232, 2721, 8222, + -1000, -1000, -1000, -1000, -1000, 3603, 2717, 2300, 58423, -1000, + 58423, 1267, 1267, 3871, 58423, 10988, -1000, -1000, 13750, 3222, + -1000, 13750, -1000, -1000, -1000, 2982, -1000, -1000, -1000, -1000, + -1000, 3221, 3621, -1000, -1000, -1000, -1000, -1000, -1000, 3844, + -1000, 2058, 58423, -1000, 13750, 14439, -1000, 835, 17894, -299, + 328, -1000, -1000, -1000, -256, 2708, -1000, -1000, 3782, 2706, + 2567, -1000, 36, 2705, -1000, 13750, -1000, -1000, -1000, 1266, + -1000, 1280, -1000, -1000, 1274, 676, -1000, 2975, 2097, -1000, + 2539, -1000, 2516, 2471, 110, -1000, 110, -1000, 255, 13750, + -1000, 2462, -1000, 2429, -1000, -1000, 2701, -1000, -1000, -1000, + 2700, -1000, -1000, 2424, -1000, 2965, -1000, 2693, -1000, -1000, + 2691, -1000, -1000, 372, 903, -1000, 401, 58423, 534, -1000, + 40587, 7533, -398, 488, 58423, 3814, 2687, 2368, 2685, 2368, + 58423, 615, -1000, 2682, 2677, -1000, -1000, 5891, 3852, 3863, + 21346, 3852, -1000, -1000, 3768, -1000, 1696, 365, -1000, -1000, + 2364, 637, -1000, -1000, 2675, 595, -1000, 1267, -1000, -1000, + 2070, 2254, 2594, 37843, 30297, 30983, 2674, -1000, 58423, -1000, + -1000, 39901, 2058, 2058, 6197, -1000, 483, 305, 63768, -1000, + 3211, 1180, 1983, -1000, 2419, -1000, 2411, -1000, 58423, -1000, + 1266, 3803, 1454, 128, -1000, -1000, 1924, -1000, 1180, 2678, + 3780, -1000, 4206, 58423, 3996, 58423, 3196, 2069, 16506, -1000, + 794, 3579, -1000, -1000, 4591, -1000, -1000, 2221, 16506, -1000, + -1000, 2669, 30983, 931, 2062, 2061, 948, 3191, -1000, 627, + 3840, 2410, -1000, -1000, -1000, 1076, 3188, -1000, -283, 3183, + 2202, 2201, -1000, 58423, -1000, 37843, 37843, 796, 796, 37843, + 37843, 3177, 816, -1000, -1000, 16506, -1000, -1000, -1000, 2059, + 874, -1000, -1000, -1000, 2006, 1852, -1000, -1000, -1000, -1000, + 58423, 1705, -1000, -1000, -1000, 2464, -1000, -1000, 1264, -1000, + 3755, -1000, -1000, 2580, 58423, 2580, -1000, 39215, -1000, 3779, + 3778, -1000, -1000, -1000, 2580, 1442, 265, 3174, 3172, -1000, + -376, 58423, 58423, -258, 2397, -1000, 2661, 154, -1000, -1000, + 126, -1000, 1261, -260, 65, 30297, 2057, -1000, 2963, 359, + -157, -1000, -1000, -1000, -1000, -1000, 2956, -1000, 741, -1000, + -1000, -1000, 1261, 110, 110, 2954, 2948, -1000, -1000, -1000, + -1000, 58423, -1000, 58423, 2654, 2385, -1000, -1000, 1642, -1000, + -1000, -1000, 2192, 2177, 1636, 2943, 1944, 2584, 58423, 480, + 58423, -340, 2653, -340, 2650, 603, 2368, -1000, -1000, -154, + -1000, -1000, 428, -1000, -1000, -1000, 617, 2557, 2384, -1000, + -1000, 334, -1000, -1000, -1000, 2300, 2641, -1000, -1000, 120, + -1000, 2033, 1634, -1000, -1000, -1000, 456, -1000, -1000, -1000, + 793, -1000, 3041, 6357, -1000, 1279, 58423, -1000, 1274, 793, + 36471, 687, 2044, -1000, 2381, -1000, -1000, 1243, 3871, -1000, + 686, -1000, 586, -1000, 1618, -1000, 1607, 38529, 2379, 3900, + -1000, 6246, 943, -1000, -1000, 2806, -1000, -1000, -1000, -1000, + -1000, -1000, 2639, 2628, -1000, -1000, -1000, -1000, -1000, 2369, + 3156, -68, -1000, 3700, 2627, 3679, 13750, -1000, -1000, 3150, + 1599, 1589, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 1578, 1564, 37843, -1000, -1000, 2806, 874, 2242, + -1000, 2006, 2006, 2626, 2625, 443, -1000, -1000, 2006, 2006, + 2006, -1000, -1000, 2015, 2006, 2006, 2006, 3149, 30297, 2006, + 1704, 58423, -1000, -1000, 1552, 1523, -1000, -1000, -1000, -1000, + -1000, -348, 3148, 13750, 13750, -1000, -1000, -1000, 3144, -1000, + -1000, 3777, -252, -266, 2623, 123, 203, -1000, 2619, -1000, + -155, 3573, -164, -1000, -1000, 650, -247, 107, 100, 93, + -1000, -1000, -1000, 13750, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 58423, 2615, -1000, -1000, 119, -1000, 2014, + -1000, 58423, 457, -1000, -340, -1000, -340, 2368, 2606, 58423, + 619, -1000, -1000, -1000, -1000, 204, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 2594, 2593, -1000, -1000, 572, 3776, -1000, + 63768, -1000, 2006, 456, -1000, 572, 1506, -1000, 2006, 2006, + -1000, 519, -1000, 1970, -1000, 2363, -1000, 3755, -1000, 510, + -1000, 575, -1000, -1000, -1000, 1495, -1000, -1000, -1000, 6246, + 582, -1000, 783, 3140, -1000, -1000, 2942, 13750, 3133, 2006, + 2934, 3132, 2393, -140, 37843, 3488, 3484, 3482, 2711, 1475, + -1000, -1000, 2344, 2338, -1000, -1000, 58423, 2335, 2307, 2298, + 2236, 2293, 2290, 2592, 58423, -1000, 30297, 58423, -1000, -1000, + -1000, 37157, -1000, 3126, 1466, 1449, 58423, 2567, -256, -1000, + 2585, -1000, 863, 167, 203, -1000, 3774, 148, 3773, 3772, + 1236, 3567, -1000, -1000, 2108, -1000, 135, 133, 111, -1000, + -1000, -1000, -1000, 2225, 2225, -340, 2584, 2577, -1000, 58423, + -1000, -1000, 2571, -340, 585, -1000, 298, -1000, -1000, -1000, + 874, -1000, 3769, 598, -1000, 30297, -1000, -1000, -1000, 36471, + 2058, 2058, -1000, -1000, 2265, -1000, -1000, -1000, -1000, 2246, + -1000, -1000, -1000, 1445, -1000, 58423, 991, 10299, -1000, 2361, + -1000, 58423, -1000, 13750, -269, 3192, -1000, 296, 1444, 874, + 796, 874, 796, 874, 796, 874, 796, 303, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1439, + -1000, -1000, -1000, -1000, 1435, 13750, -1000, -1000, 1433, -1000, + -1000, -258, -1000, 3125, 2239, 168, 134, 3766, -1000, 2567, + 3758, 2567, 2567, -1000, 105, 3850, 650, -1000, -1000, -1000, + -1000, 2148, -1000, 2148, -1000, -1000, -1000, -1000, -340, -1000, + 2569, -1000, -1000, -1000, 35785, 584, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 582, 63768, -1000, 10299, 1408, -1000, 2580, + -1000, 816, -1000, 2347, -1000, -1000, -1000, -1000, 3178, 3173, + 3808, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 2893, 2929, -1000, 58423, -1000, 3697, 29611, 156, + -1000, -1000, -1000, 2568, -1000, 2567, -1000, -1000, 1997, -159, + -1000, -1000, -1000, -1000, -317, -1000, 58423, 580, -1000, 63768, + 1374, -1000, 10299, -1000, -269, -1000, 3837, -1000, 3831, 999, + 999, 874, 874, 874, 874, 13750, -1000, -1000, -1000, 58423, + -1000, 1347, -1000, -1000, -1000, 1305, -1000, -1000, -1000, -1000, + 2555, -165, -1000, -1000, 2428, 1333, 2678, -1000, -1000, -1000, + -1000, -1000, -1000, 2294, 644, -1000, 2714, 1233, -1000, 1956, + -1000, 35099, 58423, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 58423, 9610, -1000, 1207, -1000, -1000, 2580, 58423, + -1000, } var yyPgo = [...]int{ - 0, 193, 3989, 257, 191, 4698, 97, 260, 310, 3718, - 301, 259, 258, 4691, 4690, 4689, 3714, 3710, 4688, 4687, - 4686, 4684, 4682, 4681, 4680, 4679, 4678, 4677, 4676, 4675, - 4674, 4672, 4671, 4670, 4669, 4667, 4666, 4663, 4662, 4661, - 4659, 4657, 4655, 4639, 4633, 4632, 4631, 4630, 256, 4629, - 4628, 4627, 4626, 4625, 4624, 4622, 4621, 4617, 4616, 4615, - 4614, 4612, 4610, 4608, 4607, 4604, 4601, 4600, 4599, 4598, - 4597, 4596, 4595, 4594, 4593, 4588, 4587, 4586, 4585, 4584, - 4582, 4581, 4580, 4577, 4575, 4573, 4572, 289, 4571, 3708, - 4570, 4569, 4568, 4567, 4566, 4565, 4563, 4562, 4559, 4556, - 4555, 4554, 329, 4553, 4551, 4550, 4549, 4548, 4543, 4542, - 4541, 4537, 4536, 4535, 4534, 4533, 316, 4532, 4531, 4530, - 4510, 269, 4509, 227, 4508, 189, 142, 4505, 4504, 4503, - 4500, 4498, 4495, 4494, 4493, 4492, 4491, 4486, 4483, 4482, - 4481, 248, 173, 82, 4480, 57, 4478, 253, 207, 4476, - 228, 4475, 158, 4473, 156, 4471, 4470, 4469, 4468, 4467, - 4465, 4461, 4458, 4457, 4456, 4455, 4454, 4452, 4451, 4449, - 4448, 4446, 4438, 4434, 4433, 4432, 4428, 4422, 4421, 4419, - 4418, 4417, 4416, 4415, 4413, 54, 4412, 267, 4410, 80, - 4405, 185, 4404, 85, 4400, 4398, 87, 37, 33, 4395, - 92, 88, 273, 2755, 262, 4393, 199, 4390, 4383, 254, - 177, 4382, 4381, 266, 4380, 222, 229, 181, 114, 129, - 4379, 161, 4376, 271, 61, 62, 264, 200, 152, 4375, - 4374, 56, 213, 138, 4372, 216, 115, 4371, 4370, 4365, - 125, 4361, 4360, 120, 4357, 249, 188, 4355, 118, 4354, - 4353, 4352, 26, 4351, 4350, 208, 209, 4349, 4348, 110, - 4347, 4346, 124, 141, 4345, 83, 135, 178, 134, 4344, - 1215, 139, 94, 4342, 131, 116, 4338, 155, 4336, 4334, - 4333, 4332, 186, 4331, 4330, 149, 4329, 72, 4328, 4327, - 4325, 74, 4324, 86, 4323, 38, 4322, 66, 4321, 4320, - 4319, 4318, 4317, 4314, 4313, 4312, 4308, 4305, 4303, 4301, - 40, 4299, 4298, 4296, 4294, 7, 16, 15, 4293, 30, - 4292, 182, 4290, 4289, 171, 4284, 204, 4281, 4280, 104, - 100, 4279, 103, 4278, 172, 4276, 9, 32, 73, 4274, - 4273, 4272, 243, 4268, 4267, 4266, 305, 4265, 4263, 4262, - 183, 4261, 4259, 4257, 536, 4256, 4254, 4253, 4252, 4251, - 4248, 111, 4246, 1, 223, 27, 4245, 146, 150, 4244, - 44, 36, 4242, 65, 128, 212, 143, 113, 4241, 4240, - 4238, 703, 224, 107, 35, 0, 112, 238, 170, 4235, - 4234, 4233, 265, 4232, 244, 241, 242, 187, 270, 210, - 4231, 4230, 68, 4229, 167, 34, 60, 151, 367, 19, - 384, 4226, 1965, 12, 196, 4225, 218, 4224, 11, 17, - 49, 159, 4216, 4211, 42, 283, 4210, 4209, 4208, 145, - 4207, 4206, 132, 84, 4205, 4203, 4202, 4201, 4200, 45, - 4199, 195, 25, 4197, 176, 4194, 252, 102, 225, 162, - 194, 184, 166, 226, 233, 93, 79, 4191, 2048, 165, - 117, 21, 4190, 8, 234, 4189, 230, 121, 4188, 99, - 4184, 255, 275, 219, 4183, 197, 10, 55, 43, 31, - 53, 14, 1155, 75, 4181, 4180, 23, 58, 4179, 89, - 4178, 20, 4177, 4176, 48, 47, 4175, 69, 5, 4174, - 4172, 18, 22, 4171, 46, 217, 175, 140, 105, 63, - 4167, 4166, 147, 144, 4165, 154, 160, 164, 4164, 51, - 4160, 4159, 4158, 4156, 775, 263, 4155, 4154, 4153, 4152, - 4151, 4149, 4147, 4146, 206, 4144, 108, 52, 4143, 4142, - 4141, 4140, 91, 153, 4139, 4138, 4137, 4136, 39, 90, - 4134, 13, 4133, 28, 24, 41, 4132, 59, 4130, 4129, - 4128, 3, 202, 4126, 4125, 4, 4124, 4123, 2, 4122, - 4118, 137, 4117, 106, 29, 174, 123, 4116, 4114, 101, - 214, 157, 4102, 4101, 119, 250, 4100, 215, 4099, 98, - 247, 268, 4097, 221, 4096, 4095, 4093, 4092, 4074, 1378, - 4073, 4072, 245, 70, 109, 4071, 231, 133, 4068, 4067, - 96, 168, 127, 130, 64, 95, 4065, 126, 220, 4064, - 205, 4062, 261, 4061, 4058, 122, 4057, 4055, 4038, 4037, - 201, 4032, 4031, 203, 236, 4029, 4028, 300, 4027, 4026, - 4021, 4020, 4002, 4001, 3998, 3996, 3993, 3992, 232, 251, - 3991, + 0, 196, 3883, 254, 192, 4631, 105, 265, 386, 3645, + 368, 262, 260, 4628, 4627, 4626, 3640, 3638, 4625, 4624, + 4620, 4619, 4618, 4617, 4616, 4615, 4614, 4613, 4612, 4611, + 4610, 4609, 4608, 4607, 4606, 4605, 4604, 4603, 4602, 4600, + 4598, 4597, 4596, 4595, 4594, 4593, 4592, 4591, 253, 4576, + 4559, 4558, 4557, 4556, 4555, 4554, 4551, 4550, 4549, 4547, + 4546, 4545, 4542, 4541, 4540, 4539, 4538, 4533, 4530, 4529, + 4528, 4527, 4524, 4523, 4522, 4521, 4520, 4519, 4517, 4515, + 4513, 4512, 4511, 4509, 4506, 4503, 4502, 298, 4501, 3634, + 4500, 4499, 4497, 4494, 4486, 4485, 4484, 4483, 4481, 4480, + 4479, 4478, 329, 4477, 4476, 4475, 4474, 4473, 4472, 4471, + 4470, 4469, 4463, 4462, 4460, 4459, 318, 4457, 4456, 4452, + 4446, 232, 4444, 272, 4443, 189, 149, 4441, 4438, 4435, + 4434, 4433, 4432, 4431, 4430, 4429, 4428, 4427, 4426, 4425, + 4424, 258, 173, 79, 4423, 56, 4421, 250, 219, 4420, + 227, 4418, 165, 4414, 157, 4413, 4412, 4411, 4410, 4402, + 4401, 4400, 4397, 4393, 4392, 4389, 4387, 4385, 4384, 4381, + 4378, 4377, 4376, 4374, 4369, 4367, 4364, 4347, 4346, 4345, + 4342, 4340, 4336, 4314, 4313, 53, 4312, 267, 4306, 84, + 4305, 197, 4304, 82, 4303, 4300, 87, 24, 37, 4298, + 101, 95, 271, 3266, 259, 4297, 201, 4294, 4289, 257, + 184, 4288, 4287, 263, 4286, 228, 234, 183, 108, 125, + 4284, 164, 4283, 274, 54, 57, 248, 209, 155, 4282, + 4281, 61, 194, 150, 4277, 217, 112, 4275, 4274, 4273, + 120, 4271, 4269, 117, 4267, 249, 187, 4266, 119, 4265, + 4264, 4263, 29, 4262, 4259, 216, 203, 4250, 4248, 113, + 4247, 4246, 139, 137, 4243, 86, 140, 176, 133, 4242, + 2570, 143, 93, 4240, 153, 116, 4239, 90, 4238, 4237, + 4236, 4235, 191, 4234, 4233, 142, 4232, 69, 4228, 4226, + 4224, 75, 4221, 85, 4216, 32, 4214, 68, 4213, 4212, + 4211, 4210, 4209, 4208, 4206, 4204, 4203, 4202, 4199, 4197, + 39, 4194, 4193, 4192, 4191, 7, 15, 18, 4190, 30, + 4188, 186, 4187, 4183, 172, 4182, 205, 4181, 4180, 104, + 99, 4179, 103, 4178, 158, 4177, 9, 31, 83, 4176, + 4172, 4171, 207, 4170, 4169, 4165, 316, 4164, 4163, 4162, + 169, 4161, 4159, 4158, 500, 4157, 4155, 4153, 4136, 4135, + 4134, 123, 4133, 1, 226, 28, 4132, 144, 152, 4131, + 42, 33, 4128, 72, 128, 214, 147, 118, 4127, 4126, + 4125, 707, 213, 111, 44, 0, 115, 231, 174, 4124, + 4123, 4121, 269, 4120, 245, 251, 236, 255, 273, 221, + 4119, 4117, 62, 4116, 171, 34, 66, 141, 96, 22, + 198, 4115, 1969, 11, 188, 4113, 218, 4112, 8, 16, + 63, 156, 4110, 4109, 41, 275, 4108, 4107, 4105, 145, + 4104, 4102, 181, 92, 4100, 4099, 4098, 4097, 4096, 49, + 4095, 185, 59, 4094, 135, 4093, 256, 102, 208, 159, + 195, 182, 168, 233, 242, 91, 80, 4092, 2066, 167, + 126, 17, 4090, 10, 229, 4089, 230, 138, 4088, 94, + 4087, 252, 278, 224, 4086, 199, 14, 52, 40, 36, + 51, 12, 319, 129, 4083, 4082, 23, 65, 4081, 60, + 4080, 20, 4079, 4078, 45, 47, 4077, 70, 5, 4076, + 4075, 19, 21, 4074, 43, 225, 177, 134, 107, 73, + 4073, 4068, 161, 146, 4067, 151, 166, 160, 4066, 46, + 4065, 4063, 4061, 4058, 751, 261, 4057, 4042, 4040, 4039, + 4037, 4036, 4032, 4031, 206, 4030, 109, 48, 4029, 4028, + 4027, 4026, 89, 162, 4021, 4020, 4019, 4017, 35, 88, + 4003, 13, 4000, 27, 25, 38, 3998, 58, 3997, 3996, + 3995, 3, 200, 3990, 3987, 4, 3970, 3969, 2, 3968, + 3965, 130, 3963, 110, 26, 175, 127, 3962, 3961, 106, + 215, 154, 3958, 3957, 114, 264, 3956, 220, 3952, 55, + 244, 268, 3940, 223, 3939, 3934, 3933, 3932, 3930, 1293, + 3928, 3927, 247, 74, 100, 3926, 243, 124, 3925, 3924, + 97, 170, 131, 132, 64, 98, 3923, 122, 222, 3922, + 210, 3918, 266, 3917, 3916, 121, 3915, 3914, 3913, 3910, + 202, 3909, 3907, 204, 241, 3905, 3901, 315, 3899, 3897, + 3896, 3894, 3892, 3891, 3890, 3888, 3886, 3885, 238, 297, + 3874, } -//line mysql_sql.y:13942 +//line mysql_sql.y:13958 type yySymType struct { union interface{} id int @@ -10004,86 +10055,86 @@ var yyR1 = [...]int{ 447, 447, 447, 447, 447, 447, 447, 438, 438, 438, 438, 37, 442, 442, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, - 439, 439, 441, 441, 436, 436, 436, 436, 436, 436, - 436, 436, 36, 36, 36, 191, 191, 435, 435, 432, - 432, 252, 252, 430, 430, 431, 431, 429, 429, 429, - 433, 433, 44, 80, 45, 46, 47, 43, 434, 434, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 239, 239, 199, 199, 199, 199, 199, 199, 197, - 197, 197, 197, 198, 198, 196, 196, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 144, - 143, 143, 143, 143, 143, 146, 146, 368, 368, 367, - 367, 145, 307, 307, 42, 284, 284, 511, 511, 506, - 506, 506, 506, 506, 526, 526, 526, 507, 507, 507, - 508, 508, 508, 510, 510, 510, 509, 509, 509, 509, - 509, 525, 525, 527, 527, 527, 477, 477, 478, 478, - 478, 481, 481, 498, 498, 499, 499, 497, 497, 504, - 504, 503, 503, 502, 502, 501, 501, 500, 500, 500, - 500, 492, 492, 491, 491, 479, 479, 479, 479, 479, - 480, 480, 480, 490, 490, 496, 496, 339, 339, 338, - 338, 293, 293, 294, 294, 337, 337, 291, 291, 292, - 292, 292, 336, 336, 336, 336, 336, 336, 336, 336, + 443, 443, 439, 439, 441, 441, 436, 436, 436, 436, + 436, 436, 436, 436, 36, 36, 36, 191, 191, 435, + 435, 432, 432, 252, 252, 430, 430, 431, 431, 429, + 429, 429, 433, 433, 44, 80, 45, 46, 47, 43, + 434, 434, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 239, 239, 199, 199, 199, 199, 199, + 199, 197, 197, 197, 197, 198, 198, 196, 196, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 144, 143, 143, 143, 143, 143, 146, 146, 368, + 368, 367, 367, 145, 307, 307, 42, 284, 284, 511, + 511, 506, 506, 506, 506, 506, 526, 526, 526, 507, + 507, 507, 508, 508, 508, 510, 510, 510, 509, 509, + 509, 509, 509, 525, 525, 527, 527, 527, 477, 477, + 478, 478, 478, 481, 481, 498, 498, 499, 499, 497, + 497, 504, 504, 503, 503, 502, 502, 501, 501, 500, + 500, 500, 500, 492, 492, 491, 491, 479, 479, 479, + 479, 479, 480, 480, 480, 490, 490, 496, 496, 339, + 339, 338, 338, 293, 293, 294, 294, 337, 337, 291, + 291, 292, 292, 292, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 578, 578, 579, - 296, 296, 308, 308, 308, 308, 308, 308, 295, 295, - 297, 297, 272, 272, 270, 270, 262, 262, 262, 262, - 262, 262, 263, 263, 264, 264, 265, 265, 265, 269, - 269, 268, 268, 268, 268, 266, 266, 267, 267, 267, - 267, 267, 267, 462, 462, 575, 575, 576, 576, 571, - 571, 571, 574, 574, 574, 574, 574, 574, 574, 574, - 577, 577, 577, 573, 573, 274, 362, 362, 362, 385, - 385, 385, 385, 387, 361, 361, 361, 290, 290, 289, - 289, 287, 287, 287, 287, 287, 287, 287, 287, 287, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 578, + 578, 579, 296, 296, 308, 308, 308, 308, 308, 308, + 295, 295, 297, 297, 272, 272, 270, 270, 262, 262, + 262, 262, 262, 262, 263, 263, 264, 264, 265, 265, + 265, 269, 269, 268, 268, 268, 268, 266, 266, 267, + 267, 267, 267, 267, 267, 462, 462, 575, 575, 576, + 576, 571, 571, 571, 574, 574, 574, 574, 574, 574, + 574, 574, 577, 577, 577, 573, 573, 274, 362, 362, + 362, 385, 385, 385, 385, 387, 361, 361, 361, 290, + 290, 289, 289, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, - 287, 287, 287, 287, 287, 287, 463, 463, 463, 461, - 461, 401, 401, 402, 402, 319, 318, 318, 318, 318, - 318, 316, 317, 315, 315, 315, 315, 315, 312, 312, - 311, 311, 311, 313, 313, 313, 313, 313, 440, 440, - 309, 309, 299, 299, 299, 298, 298, 298, 505, 408, - 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, - 408, 408, 408, 408, 410, 410, 410, 410, 410, 410, + 287, 287, 287, 287, 287, 287, 287, 287, 463, 463, + 463, 461, 461, 401, 401, 402, 402, 319, 318, 318, + 318, 318, 318, 316, 317, 315, 315, 315, 315, 315, + 312, 312, 311, 311, 311, 313, 313, 313, 313, 313, + 440, 440, 309, 309, 299, 299, 299, 298, 298, 298, + 505, 408, 408, 408, 408, 408, 408, 408, 408, 408, + 408, 408, 408, 408, 408, 408, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, - 410, 410, 314, 359, 359, 359, 359, 359, 359, 359, - 359, 359, 359, 359, 359, 359, 359, 359, 360, 360, - 360, 360, 360, 360, 360, 360, 411, 411, 417, 417, - 588, 588, 587, 275, 275, 275, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 285, 285, 285, 486, 486, - 486, 486, 487, 487, 487, 487, 488, 488, 488, 484, - 484, 485, 485, 422, 423, 423, 532, 532, 533, 533, - 482, 482, 483, 358, 358, 358, 358, 358, 358, 358, + 410, 410, 410, 410, 314, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, + 360, 360, 360, 360, 360, 360, 360, 360, 411, 411, + 417, 417, 588, 588, 587, 275, 275, 275, 276, 276, + 276, 276, 276, 276, 276, 276, 276, 285, 285, 285, + 486, 486, 486, 486, 487, 487, 487, 487, 488, 488, + 488, 484, 484, 485, 485, 422, 423, 423, 532, 532, + 533, 533, 482, 482, 483, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, - 358, 358, 358, 358, 358, 358, 540, 540, 540, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 598, 598, 598, 583, 583, - 583, 584, 584, 584, 584, 584, 584, 584, 584, 584, - 584, 584, 584, 585, 585, 585, 585, 585, 585, 585, + 358, 358, 358, 358, 358, 358, 358, 358, 540, 540, + 540, 355, 355, 355, 355, 355, 355, 355, 355, 355, + 355, 355, 355, 355, 355, 355, 355, 598, 598, 598, + 583, 583, 583, 584, 584, 584, 584, 584, 584, 584, + 584, 584, 584, 584, 584, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, - 586, 586, 586, 586, 357, 357, 357, 357, 357, 356, - 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, - 356, 356, 356, 356, 356, 356, 356, 424, 424, 425, - 425, 537, 537, 537, 537, 537, 537, 538, 538, 539, - 539, 539, 539, 531, 531, 531, 531, 531, 531, 531, + 585, 585, 586, 586, 586, 586, 357, 357, 357, 357, + 357, 356, 356, 356, 356, 356, 356, 356, 356, 356, + 356, 356, 356, 356, 356, 356, 356, 356, 356, 424, + 424, 425, 425, 537, 537, 537, 537, 537, 537, 538, + 538, 539, 539, 539, 539, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, - 531, 531, 531, 409, 354, 354, 354, 426, 418, 418, - 419, 419, 420, 420, 412, 412, 412, 412, 412, 412, - 413, 413, 415, 415, 415, 415, 415, 415, 415, 415, - 415, 415, 415, 407, 407, 407, 407, 407, 407, 407, - 407, 407, 407, 407, 414, 414, 416, 416, 428, 428, - 428, 427, 427, 427, 427, 427, 427, 427, 288, 288, - 288, 288, 406, 406, 406, 405, 405, 405, 405, 405, - 405, 405, 405, 405, 405, 405, 405, 277, 277, 277, - 277, 281, 281, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 282, 282, 282, - 282, 282, 280, 280, 280, 280, 280, 278, 278, 278, + 531, 531, 531, 531, 531, 409, 354, 354, 354, 426, + 418, 418, 419, 419, 420, 420, 412, 412, 412, 412, + 412, 412, 413, 413, 415, 415, 415, 415, 415, 415, + 415, 415, 415, 415, 415, 407, 407, 407, 407, 407, + 407, 407, 407, 407, 407, 407, 414, 414, 416, 416, + 428, 428, 428, 427, 427, 427, 427, 427, 427, 427, + 288, 288, 288, 288, 406, 406, 406, 405, 405, 405, + 405, 405, 405, 405, 405, 405, 405, 405, 405, 277, + 277, 277, 277, 281, 281, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, 283, 282, + 282, 282, 282, 282, 280, 280, 280, 280, 280, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 124, 125, 125, 279, - 286, 286, 286, 286, 286, 286, 286, 286, 364, 364, - 512, 512, 515, 515, 513, 513, 514, 516, 516, 516, - 517, 517, 517, 518, 518, 518, 522, 522, 373, 373, - 373, 381, 381, 380, 380, 380, 380, 380, 380, 380, + 278, 278, 278, 278, 278, 278, 278, 278, 124, 125, + 125, 279, 286, 286, 286, 286, 286, 286, 286, 286, + 364, 364, 512, 512, 515, 515, 513, 513, 514, 516, + 516, 516, 517, 517, 517, 518, 518, 518, 522, 522, + 373, 373, 373, 381, 381, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, @@ -10122,13 +10173,13 @@ var yyR1 = [...]int{ 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, - 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, + 380, 380, 380, 379, 379, 379, 379, 379, 379, 379, + 379, 379, 379, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, - 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, - 378, 378, + 378, 378, 378, 378, 378, } var yyR2 = [...]int{ @@ -10254,86 +10305,86 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 11, 0, 2, 3, 3, 2, 2, 3, 1, 1, 3, 3, 3, 1, 1, 3, 3, 3, 3, - 1, 3, 3, 4, 0, 2, 2, 2, 2, 2, - 2, 2, 6, 8, 10, 0, 4, 1, 1, 0, - 3, 0, 1, 0, 1, 1, 2, 4, 4, 4, - 0, 1, 8, 2, 4, 4, 4, 9, 0, 2, - 8, 9, 5, 5, 8, 7, 8, 12, 12, 13, - 13, 0, 4, 0, 3, 3, 3, 2, 2, 0, - 3, 3, 3, 4, 4, 0, 3, 11, 9, 11, - 8, 6, 9, 7, 10, 7, 6, 8, 11, 2, - 2, 9, 4, 5, 3, 0, 4, 1, 3, 0, - 3, 6, 0, 2, 10, 0, 2, 0, 2, 0, - 3, 2, 4, 3, 0, 2, 1, 0, 2, 3, - 0, 2, 3, 0, 2, 1, 0, 3, 2, 4, - 3, 0, 1, 0, 1, 1, 0, 6, 0, 3, - 5, 0, 4, 0, 3, 1, 3, 4, 5, 0, - 3, 1, 3, 2, 3, 1, 2, 0, 4, 6, - 5, 0, 2, 0, 2, 4, 5, 4, 5, 1, - 5, 6, 5, 0, 3, 0, 1, 1, 3, 3, - 3, 0, 4, 1, 3, 3, 3, 0, 1, 1, - 3, 2, 3, 3, 3, 4, 4, 3, 3, 3, - 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, - 3, 3, 3, 3, 1, 5, 4, 1, 3, 3, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 2, 4, 0, 5, 5, 5, - 5, 6, 0, 1, 1, 3, 1, 1, 1, 1, - 1, 7, 9, 7, 9, 2, 1, 7, 9, 7, - 9, 8, 5, 0, 1, 0, 1, 1, 1, 1, - 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 3, 1, 3, 5, 1, - 1, 1, 1, 1, 1, 3, 5, 0, 1, 1, - 2, 1, 2, 2, 1, 1, 2, 2, 2, 3, - 3, 2, 2, 1, 5, 6, 4, 2, 1, 1, - 1, 5, 4, 1, 7, 5, 0, 1, 1, 1, - 2, 0, 1, 1, 2, 5, 0, 1, 1, 2, - 2, 3, 3, 1, 1, 2, 2, 2, 0, 1, - 2, 2, 2, 0, 4, 7, 3, 3, 0, 3, - 0, 3, 1, 1, 1, 1, 1, 1, 1, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 1, 1, 1, 1, 3, 5, 2, - 2, 2, 2, 4, 1, 1, 2, 5, 6, 8, - 6, 3, 6, 6, 1, 1, 1, 1, 1, 1, - 3, 9, 1, 4, 4, 4, 4, 5, 4, 5, - 7, 9, 5, 7, 9, 5, 5, 7, 7, 9, - 7, 7, 7, 9, 7, 7, 0, 2, 0, 1, - 1, 2, 4, 1, 2, 2, 1, 2, 2, 1, - 2, 2, 2, 2, 2, 0, 1, 1, 1, 2, - 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, - 5, 0, 1, 3, 0, 1, 0, 2, 0, 2, - 0, 1, 6, 8, 8, 6, 6, 5, 5, 5, - 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 1, 1, 1, 4, - 4, 6, 8, 6, 4, 5, 4, 4, 4, 3, - 4, 6, 6, 7, 4, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 4, 1, 3, 3, 4, 0, 2, 2, 2, + 2, 2, 2, 2, 6, 8, 10, 0, 4, 1, + 1, 0, 3, 0, 1, 0, 1, 1, 2, 4, + 4, 4, 0, 1, 8, 2, 4, 4, 4, 9, + 0, 2, 8, 9, 5, 5, 8, 7, 8, 12, + 12, 13, 13, 0, 4, 0, 3, 3, 3, 2, + 2, 0, 3, 3, 3, 4, 4, 0, 3, 11, + 9, 11, 8, 6, 9, 7, 10, 7, 6, 8, + 11, 2, 2, 9, 4, 5, 3, 0, 4, 1, + 3, 0, 3, 6, 0, 2, 10, 0, 2, 0, + 2, 0, 3, 2, 4, 3, 0, 2, 1, 0, + 2, 3, 0, 2, 3, 0, 2, 1, 0, 3, + 2, 4, 3, 0, 1, 0, 1, 1, 0, 6, + 0, 3, 5, 0, 4, 0, 3, 1, 3, 4, + 5, 0, 3, 1, 3, 2, 3, 1, 2, 0, + 4, 6, 5, 0, 2, 0, 2, 4, 5, 4, + 5, 1, 5, 6, 5, 0, 3, 0, 1, 1, + 3, 3, 3, 0, 4, 1, 3, 3, 3, 0, + 1, 1, 3, 2, 3, 3, 3, 4, 4, 3, + 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, + 3, 3, 3, 3, 3, 3, 1, 5, 4, 1, + 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 2, 4, 0, 5, + 5, 5, 5, 6, 0, 1, 1, 3, 1, 1, + 1, 1, 1, 7, 9, 7, 9, 2, 1, 7, + 9, 7, 9, 8, 5, 0, 1, 0, 1, 1, + 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 3, 1, 3, + 5, 1, 1, 1, 1, 1, 1, 3, 5, 0, + 1, 1, 2, 1, 2, 2, 1, 1, 2, 2, + 2, 3, 3, 2, 2, 1, 5, 6, 4, 2, + 1, 1, 1, 5, 4, 1, 7, 5, 0, 1, + 1, 1, 2, 0, 1, 1, 2, 5, 0, 1, + 1, 2, 2, 3, 3, 1, 1, 2, 2, 2, + 0, 1, 2, 2, 2, 0, 4, 7, 3, 3, + 0, 3, 0, 3, 1, 1, 1, 1, 1, 1, + 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 1, 1, 1, 1, 3, + 5, 2, 2, 2, 2, 4, 1, 1, 2, 5, + 6, 8, 6, 3, 6, 6, 1, 1, 1, 1, + 1, 1, 3, 9, 1, 4, 4, 4, 4, 5, + 4, 5, 7, 9, 5, 7, 9, 5, 5, 7, + 7, 9, 7, 7, 7, 9, 7, 7, 0, 2, + 0, 1, 1, 2, 4, 1, 2, 2, 1, 2, + 2, 1, 2, 2, 2, 2, 2, 0, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 2, 5, 0, 1, 3, 0, 1, 0, 2, + 0, 2, 0, 1, 6, 8, 8, 6, 6, 5, + 5, 5, 6, 6, 6, 6, 5, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, + 1, 4, 4, 6, 8, 6, 4, 5, 4, 4, + 4, 3, 4, 6, 6, 7, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 8, 8, 6, 4, - 2, 3, 2, 4, 2, 2, 4, 6, 2, 2, - 4, 6, 4, 2, 4, 4, 4, 0, 1, 2, - 3, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 2, 8, 8, + 6, 4, 2, 3, 2, 4, 2, 2, 4, 6, + 2, 2, 4, 6, 4, 2, 4, 4, 4, 0, + 1, 2, 3, 1, 1, 1, 1, 1, 1, 0, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 0, 1, 1, 3, 0, 1, - 1, 3, 1, 3, 3, 3, 3, 3, 2, 1, - 1, 1, 3, 4, 3, 4, 3, 4, 3, 4, - 3, 4, 1, 3, 4, 4, 5, 4, 5, 3, - 4, 5, 6, 1, 0, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, + 1, 1, 1, 1, 1, 3, 0, 1, 1, 3, + 0, 1, 1, 3, 1, 3, 3, 3, 3, 3, + 2, 1, 1, 1, 3, 4, 3, 4, 3, 4, + 3, 4, 3, 4, 1, 3, 4, 4, 5, 4, + 5, 3, 4, 5, 6, 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 2, 3, 1, 1, - 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, - 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 2, 4, 4, 1, 2, 3, 5, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 0, 1, 0, 3, 0, 3, 3, 0, 3, 5, - 0, 3, 5, 0, 1, 1, 0, 1, 1, 2, - 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 1, 2, 3, + 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 4, 4, 1, 2, 3, + 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 0, 1, 0, 3, 0, 3, 3, 0, + 3, 5, 0, 3, 5, 0, 1, 1, 0, 1, + 1, 2, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -10378,461 +10429,462 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, + 1, 1, 1, 1, 1, } var yyChk = [...]int{ - -1000, -643, -646, -2, -5, 684, -1, -4, -125, -94, + -1000, -643, -646, -2, -5, 686, -1, -4, -125, -94, -7, -15, -127, -128, -8, -123, -10, -11, -175, -13, -101, -118, -120, -122, -121, -48, -12, -117, -87, -88, -103, -111, -114, -115, -116, -129, -124, -126, -200, -130, - -131, -132, -182, -135, -137, -138, -170, -171, -195, 674, + -131, -132, -182, -135, -137, -138, -170, -171, -195, 676, -95, -96, -97, -98, -99, -100, -34, -33, -32, -31, - -162, -172, -176, -178, -133, 593, 680, 494, -9, -589, - 545, -16, -17, -18, 253, 280, -389, -390, -391, -393, + -162, -172, -176, -178, -133, 595, 682, 496, -9, -589, + 547, -16, -17, -18, 253, 280, -389, -390, -391, -393, -647, -49, -50, -51, -62, -63, -64, -65, -66, -76, -77, -78, -52, -53, -54, -57, -55, -69, -68, -70, -71, -72, -73, -74, -75, -56, -60, -165, -166, -167, -168, -79, -58, -80, -59, -180, -183, -134, -81, -82, -83, -61, -85, -84, -90, -86, -91, -164, -174, -14, -181, -92, -93, 254, -89, 79, -104, -105, -106, -107, - -108, -109, -110, -112, -113, 420, 426, 481, 673, 64, - -201, -203, 703, 704, 707, 581, 584, 298, 177, 178, + -108, -109, -110, -112, -113, 422, 428, 483, 675, 64, + -201, -203, 705, 706, 709, 583, 586, 298, 177, 178, 180, 181, 185, 188, -35, -36, -37, -38, -39, -40, -42, -41, -43, -44, -45, -46, -47, 249, 16, 14, 18, -19, -22, -20, -23, -21, -29, -30, -28, -25, -27, -163, -169, -26, -173, -24, -177, -179, -136, 275, - 274, 41, 341, 342, 343, 424, 273, 250, 252, 17, - 34, 45, 399, -202, 88, 582, 251, -204, 15, 709, + 274, 41, 341, 342, 343, 426, 273, 250, 252, 17, + 34, 45, 401, -202, 88, 584, 251, -204, 15, 711, -6, -3, -2, -149, -153, -157, -160, -161, -158, -159, - -4, -125, 123, 265, 675, -385, 416, 676, 678, 677, - 91, 99, -378, -380, 494, 280, 420, 426, 673, 704, - 707, 581, 584, 298, 595, 596, 597, 598, 599, 600, - 601, 602, 604, 605, 606, 607, 608, 609, 610, 620, - 621, 611, 612, 613, 614, 615, 616, 617, 618, 622, - 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, - 633, 634, 635, 548, 549, 653, 655, 656, 657, 658, - 577, 603, 640, 648, 649, 650, 397, 398, 586, 670, - 292, 316, 449, 322, 329, 393, 177, 195, 191, 218, - 209, 348, 347, 582, 186, 296, 334, 297, 98, 180, - 531, 113, 506, 478, 183, 354, 357, 355, 356, 311, - 313, 315, 578, 579, 410, 318, 576, 317, 319, 321, - 580, 352, 400, 205, 200, 310, 294, 198, 299, 43, - 300, 391, 390, 223, 301, 302, 590, 502, 396, 508, - 326, 55, 476, 199, 503, 314, 505, 669, 227, 231, - 522, 381, 523, 168, 169, 510, 525, 222, 225, 226, - 272, 387, 388, 46, 588, 284, 526, 229, 699, 221, - 216, 534, 330, 328, 392, 220, 194, 215, 295, 68, - 233, 232, 234, 472, 473, 474, 475, 303, 304, 414, - 521, 212, 201, 401, 187, 25, 529, 279, 507, 427, - 358, 359, 305, 323, 331, 353, 228, 230, 286, 291, - 346, 589, 480, 290, 515, 516, 327, 527, 197, 283, - 312, 278, 530, 700, 188, 429, 306, 181, 320, 524, - 702, 533, 67, 163, 193, 184, 691, 692, 269, 654, - 178, 288, 293, 671, 701, 307, 308, 309, 575, 333, - 332, 324, 185, 583, 213, 285, 219, 203, 192, 214, - 179, 287, 532, 164, 667, 399, 459, 211, 208, 289, - 262, 672, 528, 509, 182, 463, 166, 206, 335, 661, - 662, 663, 666, 415, 386, 336, 337, 204, 276, 500, - 501, 340, 469, 376, 443, 479, 450, 444, 240, 241, - 344, 512, 514, 224, 664, 360, 361, 362, 504, 363, - 365, 366, 371, 419, 59, 61, 100, 103, 102, 705, - 706, 66, 32, 405, 408, 441, 445, 378, 668, 587, - 375, 379, 380, 409, 28, 461, 431, 465, 464, 51, - 52, 53, 56, 57, 58, 60, 62, 63, 54, 574, - 424, 438, 535, 48, 50, 434, 435, 30, 411, 460, - 482, 374, 462, 493, 49, 491, 492, 513, 29, 413, - 412, 65, 47, 468, 470, 471, 338, 372, 422, 681, - 536, 417, 433, 437, 418, 377, 407, 439, 70, 430, - 682, 425, 423, 373, 591, 592, 382, 619, 402, 477, - 571, 570, 569, 568, 567, 566, 565, 564, 341, 342, - 343, 446, 447, 448, 458, 451, 452, 453, 454, 455, - 456, 457, 496, 497, 683, 517, 519, 520, 518, 257, - 708, 403, 404, 260, 685, 686, 101, 687, 689, 688, - 31, 690, 698, 695, 696, 697, 594, 693, 641, 642, - 643, 644, 645, -468, -466, -385, 582, 298, 673, 426, - 581, 584, 420, 399, 704, 707, 424, 280, 341, 342, - 343, 494, 397, -256, -385, 708, -89, -17, -16, -9, - -202, -203, -213, 42, -270, -385, 435, -270, 259, -394, - 26, 476, -102, 477, 254, 255, 88, 80, -385, -10, - -116, -8, -123, -87, -200, 481, -392, -385, 341, 341, - -392, 259, -387, 290, 457, -385, -524, 265, -472, -444, - 291, -471, -446, -474, -447, 35, 249, 251, 250, 593, - 287, 18, 424, 261, 16, 15, 425, 273, 28, 29, - 31, 17, 426, 428, 32, 429, 432, 433, 434, 45, - 438, 439, 280, 91, 99, 94, 641, 642, 643, 644, - 645, 298, -255, -385, -420, -412, 120, -415, -407, -408, - -410, -363, -562, -405, 88, 149, 150, 157, 121, 710, - -409, -505, 39, 123, 599, 603, 640, 546, -355, -356, - -357, -358, -359, -360, 585, -385, -563, -561, 94, 104, - 106, 110, 111, 109, 107, 171, 202, 108, 95, 172, - -203, 91, -583, 609, -379, 632, 655, 656, 657, 658, - 631, 64, -531, -539, 258, -537, 170, 207, 276, 203, - 16, 155, 469, 204, 648, 649, 650, 606, 628, 548, - 549, 653, 610, 620, 635, 601, 602, 604, 596, 597, - 598, 600, 611, 613, 627, -540, 623, 633, 634, 619, - 651, 652, 695, 636, 637, 638, 647, 646, 639, 641, - 642, 643, 644, 645, 689, 93, 92, 626, 625, 612, - 607, 608, 614, 595, 605, 615, 616, 624, 629, 630, - 408, 113, 409, 410, 538, 400, 83, 411, 265, 476, - 73, 412, 413, 414, 415, 416, 545, 417, 74, 418, - 407, 280, 459, 419, 206, 224, 551, 550, 552, 542, - 539, 537, 540, 541, 543, 544, 617, 618, 622, -139, - -141, 659, -637, -346, -638, 6, 7, 8, 9, -639, - 172, -628, 478, 589, 94, 538, 259, 334, 397, 19, - 694, 370, 580, 694, 370, 580, 348, 182, 179, -458, - 182, 119, 188, 187, 263, 182, -458, -385, 185, 694, - 184, 691, 344, -434, -186, 397, 459, 363, 100, 290, - -438, -435, 578, -525, 338, 334, 310, 260, 116, -187, - 270, 269, 114, 538, 258, 436, 329, 59, 61, -213, - 264, -591, 572, -590, -385, -599, -600, 246, 247, 248, - 694, 699, 516, 410, 102, 103, 691, 692, 30, 259, - 421, 286, 514, 512, 513, 517, 518, 519, 520, -67, - -541, -523, 509, 508, -398, 501, 507, 499, 511, 502, - 398, 366, 363, 593, 365, 370, 249, 685, 579, 573, - -373, 443, 479, 535, 536, 422, 480, 522, 524, 503, - 113, 210, 207, 260, 262, 259, 691, 290, 397, 538, - 459, 100, 363, 259, -599, 699, 179, 522, 524, 478, - 290, 457, 44, -465, 469, -464, -466, 523, 534, 92, - 93, 521, -373, 113, 500, 500, -637, -346, -201, -203, - -126, -589, 580, 694, 260, 397, 459, 290, 261, 259, - 575, 578, 262, 538, 258, 341, 421, 286, 363, 370, - 100, 184, 691, -207, -208, -209, 242, 243, 244, 72, - 247, 245, 69, 35, 36, 37, -1, 127, 709, -412, - -412, -6, 712, -6, -412, -385, -385, 174, -277, -281, - -278, -280, -279, -283, -282, 207, 208, 170, 211, 217, - 213, 214, 215, 216, 218, 219, 220, 221, 222, 225, - 226, 223, 34, 224, 276, 203, 204, 205, 206, -286, - 191, 209, 587, 235, 192, 236, 193, 237, 194, 238, - 168, 169, 239, 195, 198, 199, 200, 201, 197, 227, - 228, 229, 230, 231, 232, 233, 234, 173, -244, 94, - 35, 88, 173, 94, -637, -223, -224, 11, -233, 282, - -270, -262, 173, 710, 19, -270, -361, -385, 478, 130, - -102, 80, -102, 477, 80, -102, 477, 254, -592, -593, - -594, -596, 254, 477, 476, 255, 325, -121, 173, 298, - 19, -392, -392, 86, -270, -446, 290, -472, -444, 39, - 85, 174, 263, 174, 85, 88, 422, 397, 459, 423, - 538, 259, 436, 262, 290, 437, 397, 459, 259, 262, - 538, 290, 397, 259, 262, 459, 290, 437, 397, 499, - 500, 262, 30, 427, 430, 431, 500, -545, 534, 174, - 119, 116, 117, 118, -412, 137, -427, 130, 131, 132, - 133, 134, 135, 136, 144, 143, 156, 149, 150, 151, - 152, 153, 154, 155, 145, 146, 147, 148, 140, 120, - 138, 142, 139, 122, 161, 160, -203, -412, -420, 64, - -410, -410, -410, -410, -385, -505, -417, -412, 88, 88, - 88, 88, 88, 173, 107, 94, -412, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, -538, - 88, 88, -424, -425, 88, 88, -405, -361, 88, 94, - 94, 88, 88, 88, 94, 88, 88, 88, -425, -425, + -4, -125, 123, 265, 677, -385, 418, 678, 680, 679, + 91, 99, -378, -380, 496, 280, 422, 428, 675, 706, + 709, 583, 586, 298, 597, 598, 599, 600, 601, 602, + 603, 604, 606, 607, 608, 609, 610, 611, 612, 622, + 623, 613, 614, 615, 616, 617, 618, 619, 620, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 550, 551, 655, 657, 658, 659, 660, + 579, 605, 642, 650, 651, 652, 399, 400, 588, 672, + 292, 316, 451, 322, 329, 393, 177, 195, 191, 218, + 209, 348, 347, 584, 186, 296, 334, 297, 98, 180, + 533, 113, 508, 480, 183, 354, 357, 355, 356, 311, + 313, 315, 580, 581, 412, 318, 578, 317, 319, 321, + 582, 352, 402, 205, 200, 310, 294, 198, 299, 43, + 300, 391, 390, 223, 301, 302, 592, 504, 398, 510, + 326, 55, 478, 199, 505, 314, 507, 671, 227, 231, + 524, 381, 397, 525, 168, 169, 512, 527, 222, 225, + 226, 272, 387, 388, 46, 590, 284, 528, 229, 701, + 221, 216, 536, 330, 328, 392, 220, 194, 215, 295, + 68, 233, 232, 234, 474, 475, 476, 477, 303, 304, + 416, 523, 212, 201, 403, 187, 25, 531, 279, 509, + 429, 358, 359, 305, 323, 331, 353, 228, 230, 286, + 291, 346, 591, 482, 290, 517, 518, 327, 529, 197, + 283, 312, 278, 532, 702, 188, 431, 306, 181, 320, + 526, 704, 535, 67, 163, 193, 184, 693, 694, 269, + 656, 178, 288, 293, 673, 703, 307, 308, 309, 577, + 333, 332, 324, 185, 585, 213, 285, 219, 203, 192, + 214, 179, 287, 534, 164, 669, 401, 461, 211, 208, + 289, 262, 674, 530, 511, 182, 465, 166, 206, 335, + 663, 664, 665, 668, 417, 386, 336, 337, 204, 276, + 502, 503, 340, 471, 376, 445, 481, 452, 446, 240, + 241, 344, 514, 516, 224, 666, 360, 361, 362, 506, + 363, 365, 366, 371, 421, 59, 61, 100, 103, 102, + 707, 708, 66, 32, 407, 410, 443, 447, 378, 670, + 589, 375, 379, 380, 411, 28, 463, 433, 467, 466, + 51, 52, 53, 56, 57, 58, 60, 62, 63, 54, + 576, 426, 440, 537, 48, 50, 436, 437, 30, 413, + 462, 484, 374, 464, 495, 49, 493, 494, 515, 29, + 415, 414, 65, 47, 470, 472, 473, 338, 372, 424, + 683, 538, 419, 435, 439, 420, 377, 409, 441, 70, + 432, 684, 427, 425, 373, 593, 594, 382, 621, 404, + 479, 573, 572, 571, 570, 569, 568, 567, 566, 341, + 342, 343, 448, 449, 450, 460, 453, 454, 455, 456, + 457, 458, 459, 498, 499, 685, 519, 521, 522, 520, + 257, 710, 405, 406, 260, 687, 688, 101, 689, 691, + 690, 31, 692, 700, 697, 698, 699, 596, 695, 643, + 644, 645, 646, 647, -468, -466, -385, 584, 298, 675, + 428, 583, 586, 422, 401, 706, 709, 426, 280, 341, + 342, 343, 496, 399, -256, -385, 710, -89, -17, -16, + -9, -202, -203, -213, 42, -270, -385, 437, -270, 259, + -394, 26, 478, -102, 479, 254, 255, 88, 80, -385, + -10, -116, -8, -123, -87, -200, 483, -392, -385, 341, + 341, -392, 259, -387, 290, 459, -385, -524, 265, -472, + -444, 291, -471, -446, -474, -447, 35, 249, 251, 250, + 595, 287, 18, 426, 261, 16, 15, 427, 273, 28, + 29, 31, 17, 428, 430, 32, 431, 434, 435, 436, + 45, 440, 441, 280, 91, 99, 94, 643, 644, 645, + 646, 647, 298, -255, -385, -420, -412, 120, -415, -407, + -408, -410, -363, -562, -405, 88, 149, 150, 157, 121, + 712, -409, -505, 39, 123, 601, 605, 642, 548, -355, + -356, -357, -358, -359, -360, 587, -385, -563, -561, 94, + 104, 106, 110, 111, 109, 107, 171, 202, 108, 95, + 172, -203, 91, -583, 611, -379, 634, 657, 658, 659, + 660, 633, 64, -531, -539, 258, -537, 170, 207, 276, + 203, 16, 155, 471, 204, 650, 651, 652, 608, 630, + 550, 551, 655, 612, 622, 637, 603, 604, 606, 598, + 599, 600, 602, 613, 615, 629, -540, 625, 635, 636, + 621, 653, 654, 697, 638, 639, 640, 649, 648, 641, + 643, 644, 645, 646, 647, 691, 93, 92, 628, 627, + 614, 609, 610, 616, 597, 607, 617, 618, 626, 631, + 632, 410, 113, 411, 412, 540, 402, 83, 413, 265, + 478, 73, 414, 415, 416, 417, 418, 547, 419, 74, + 420, 409, 280, 461, 421, 206, 224, 553, 552, 554, + 544, 541, 539, 542, 543, 545, 546, 619, 620, 624, + -139, -141, 661, -637, -346, -638, 6, 7, 8, 9, + -639, 172, -628, 480, 591, 94, 540, 259, 334, 399, + 19, 696, 370, 582, 696, 370, 582, 348, 182, 179, + -458, 182, 119, 188, 187, 263, 182, -458, -385, 185, + 696, 184, 693, 344, -434, -186, 399, 461, 363, 100, + 290, -438, -435, 580, -525, 338, 334, 310, 260, 116, + -187, 270, 269, 114, 540, 258, 438, 329, 59, 61, + -213, 264, -591, 574, -590, -385, -599, -600, 246, 247, + 248, 696, 701, 518, 412, 102, 103, 693, 694, 30, + 259, 423, 286, 516, 514, 515, 519, 520, 521, 522, + -67, -541, -523, 511, 510, -398, 503, 509, 501, 513, + 504, 400, 366, 363, 595, 365, 370, 249, 687, 581, + 575, -373, 445, 481, 537, 538, 424, 482, 524, 526, + 505, 113, 210, 207, 260, 262, 259, 693, 290, 399, + 540, 461, 100, 363, 259, -599, 701, 179, 524, 526, + 480, 290, 459, 44, -465, 471, -464, -466, 525, 536, + 92, 93, 523, -373, 113, 502, 502, -637, -346, -201, + -203, -126, -589, 582, 696, 260, 399, 461, 290, 261, + 259, 577, 580, 262, 540, 258, 341, 423, 286, 363, + 370, 100, 184, 693, -207, -208, -209, 242, 243, 244, + 72, 247, 245, 69, 35, 36, 37, -1, 127, 711, + -412, -412, -6, 714, -6, -412, -385, -385, 174, -277, + -281, -278, -280, -279, -283, -282, 207, 208, 170, 211, + 217, 213, 214, 215, 216, 218, 219, 220, 221, 222, + 225, 226, 223, 34, 224, 276, 203, 204, 205, 206, + -286, 191, 209, 589, 235, 192, 236, 193, 237, 194, + 238, 168, 169, 239, 195, 198, 199, 200, 201, 197, + 227, 228, 229, 230, 231, 232, 233, 234, 173, -244, + 94, 35, 88, 173, 94, -637, -223, -224, 11, -233, + 282, -270, -262, 173, 712, 19, -270, -361, -385, 480, + 130, -102, 80, -102, 479, 80, -102, 479, 254, -592, + -593, -594, -596, 254, 479, 478, 255, 325, -121, 173, + 298, 19, -392, -392, 86, -270, -446, 290, -472, -444, + 39, 85, 174, 263, 174, 85, 88, 424, 399, 461, + 425, 540, 259, 438, 262, 290, 439, 399, 461, 259, + 262, 540, 290, 399, 259, 262, 461, 290, 439, 399, + 501, 502, 262, 30, 429, 432, 433, 502, -545, 536, + 174, 119, 116, 117, 118, -412, 137, -427, 130, 131, + 132, 133, 134, 135, 136, 144, 143, 156, 149, 150, + 151, 152, 153, 154, 155, 145, 146, 147, 148, 140, + 120, 138, 142, 139, 122, 161, 160, -203, -412, -420, + 64, -410, -410, -410, -410, -385, -505, -417, -412, 88, + 88, 88, 88, 88, 173, 107, 94, -412, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + -538, 88, 88, -424, -425, 88, 88, -405, -361, 88, + 94, 94, 88, 88, 88, 94, 88, 88, 88, -425, + -425, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, -224, 174, -223, 88, - -223, -224, -204, -203, 35, 36, 35, 36, 35, 36, - 35, 36, -640, 682, 88, 104, 705, 240, -237, -385, - -238, -385, -147, 19, 710, -385, 691, -622, 35, 583, - 364, 583, 583, 364, 583, 249, 18, 352, 57, 353, - 527, 14, 186, 187, 188, -385, 185, 263, -385, -432, - 265, -432, -432, -254, -385, 286, 421, 262, 575, 262, - -187, -432, 19, -432, -432, -432, -432, 261, -432, 26, - 259, 259, 259, 259, -432, 545, 130, 130, 62, -233, - -213, 174, -591, -232, 88, -601, 190, -622, 700, 701, - 702, 85, -397, 138, 142, -397, -342, 20, -342, 26, - 26, 288, 288, 288, -397, 328, -648, -649, 19, 140, - -395, -649, -395, -395, -397, -650, 261, 510, 46, 289, - 288, -225, -226, 24, -225, 504, 500, -489, 505, 506, - -399, -649, -398, -397, -397, -398, -397, -397, 369, -397, - 35, 364, 365, 259, 262, 538, 363, 686, -648, -648, - 34, 34, -524, -524, -270, -524, 265, -447, -524, 573, - -374, -385, -524, -524, -524, -325, -326, -270, -602, 264, - 702, -634, -633, 525, -636, 527, 179, -466, 179, -466, - 91, -446, 290, 290, 174, 130, 26, -467, 130, 141, - -466, -466, -467, -467, -295, 44, -384, 170, -385, 94, - -295, 44, -631, -630, -270, -224, -204, -203, 89, 89, - 89, 583, -622, -524, -524, -524, -524, -524, -525, -524, - -524, -524, -524, -524, -392, -245, -385, -256, 265, -524, - 364, -524, -524, -524, -205, -206, 151, -412, -385, -209, - -3, -151, -150, 124, 125, 127, 676, 416, 675, 679, - 673, -466, 44, -518, 164, 163, -512, -514, 88, -513, - 88, -513, -513, -513, -513, -513, 88, 88, -515, 88, - -515, -515, -512, -516, 88, -516, -517, 88, -517, -516, - -385, -493, 14, -418, -420, -385, 42, -224, -142, 42, - -226, 23, -535, 64, -200, 88, 34, 88, -385, 204, - 184, 690, 38, 100, 173, 104, 94, -121, -102, 80, - -121, -102, -102, 89, 174, -595, 110, 111, -597, 94, - 222, 213, -385, -119, 94, -561, -7, -12, -8, -10, - -11, -48, -87, -200, 581, 584, -564, -562, 88, 35, - 468, 85, 19, -473, 259, 538, 421, 286, 262, 397, - -471, -453, -450, -448, -384, -446, -449, -448, -476, -361, - 500, -143, 483, 482, 340, -412, -412, -412, -412, -412, - 109, 120, 386, 110, 111, -407, -428, 35, 336, 337, - -408, -408, -408, -408, -408, -408, -408, -408, -408, -408, - -408, -408, -410, -410, -416, -426, -505, 88, 140, 138, - 142, 139, 122, -410, -410, -408, -408, -275, -277, 163, - 164, -297, -384, 170, 89, 174, -412, -588, -587, 124, - -412, -412, -412, -412, -439, -441, -361, 88, -385, -584, - -585, 553, 554, 555, 556, 557, 558, 559, 560, 561, - 562, 563, 412, 407, 413, 411, 400, 419, 414, 415, - 206, 570, 571, 564, 565, 566, 567, 568, 569, -418, - -418, -412, -584, -418, -354, 36, 35, -420, -420, -420, - 89, -412, -598, 384, 383, 385, -228, -385, -418, 89, - 89, 89, 104, -420, -420, -418, -408, -418, -418, -418, - -418, -585, -585, -586, 276, 203, 205, 204, -354, -354, - -354, -354, 151, -420, -420, -354, -354, -354, -354, 151, - -354, -354, -354, -354, -354, -354, -354, -354, -354, -354, - -354, 89, 89, 89, 89, -412, 89, -412, -412, -412, - -412, -412, 151, -420, -225, -141, -543, -542, -412, 44, - -142, -226, -641, 683, 88, -361, -629, 94, 94, 710, - -147, 173, 19, 259, -147, 173, 691, 184, -147, 19, - -385, -385, 94, 104, -385, 94, 104, 259, 538, 259, - 538, -270, -270, -270, 528, 529, 183, 187, 186, -385, - 185, -385, -385, 120, -385, -385, 38, -256, -245, -432, - -432, -432, -606, -385, 95, 94, -454, -451, -448, -385, - -385, -444, -385, -374, -270, -432, -432, -432, -432, -270, - -306, 56, 57, 58, -448, -188, 59, 60, -534, 64, - -200, 88, 34, -233, -590, 38, -231, -385, -602, 290, - -342, -410, -410, -412, 397, 538, 259, -448, 290, -648, - -397, -397, -375, -374, -399, -394, -399, -399, -342, -395, - -397, -397, -412, -399, -395, -342, -385, 500, -342, -342, - -489, -374, -397, 94, -396, -385, -396, -432, -374, -375, - -375, -270, -270, -320, -327, -321, -328, 282, 256, 405, - 406, 252, 250, 11, 251, -336, 329, -433, 546, -301, - -302, 80, 45, -304, 280, 445, 441, 292, 296, 98, - 297, 478, 298, 261, 300, 301, 302, 317, 319, 272, - 303, 304, 305, 469, 306, 178, 318, 307, 308, 309, - 423, -296, 6, 371, 44, 54, 55, 492, 491, 591, - 14, 293, -385, 39, 252, 256, 251, -606, -604, 34, - -385, 34, -454, -448, -385, -385, 174, 263, -216, -218, - -215, -211, -212, -217, -345, -347, -214, 88, -270, -203, - -385, -466, 174, 526, 528, 529, -634, -467, -634, -467, - 263, 35, 468, -470, 468, 35, -444, -464, 522, 524, - -459, 94, 469, -449, -469, 85, 170, -542, -467, -467, - -469, -469, 160, 174, -632, 527, 528, 246, -225, 104, - -252, 693, -272, -270, -606, -453, -444, -385, -524, -272, - -272, -272, -387, -387, 88, 173, 39, -385, -524, -385, - -385, -385, -341, 174, -340, 19, -386, -385, 38, 94, - 173, -152, -150, 126, -412, -6, 675, -412, -6, -6, - -412, -6, -412, -522, 166, 104, 104, -364, 94, -364, - 104, 104, 104, 594, 89, 94, -225, 660, -227, 23, - -222, -221, -412, -536, -421, -582, 659, -235, 89, -228, - -580, -581, -228, -234, -385, -262, 130, 130, 130, 27, - -524, -385, 26, -121, -102, -593, 173, 174, -231, -473, - -452, -449, -475, 151, -385, -460, 174, 14, 713, 92, - 263, -619, -618, 460, 89, 174, -546, 264, 545, 94, - 710, 476, 240, 241, 109, 386, 110, 111, -505, -420, - -416, -410, -410, -408, -408, -414, 277, -414, 119, -285, - 169, 168, -285, -412, 711, -411, -587, 126, -412, 38, - 174, 38, 174, 86, 174, 89, -512, -412, 173, 89, - 89, 19, 19, 89, -412, 89, 89, 89, 89, 19, - 19, -412, 89, 173, 89, 89, 89, 89, 86, 89, - 174, 89, 89, 89, 89, 174, 174, 174, -420, -420, - -412, -420, 89, 89, 89, -412, -412, -412, -420, 89, - -412, -412, -412, -412, -412, -412, -412, -412, -412, -412, - -231, -483, 495, -483, -483, -483, 89, -483, 89, 174, - 89, 174, 89, 89, 174, 174, 174, 174, 89, -227, - 88, 104, 174, 706, -368, -367, 94, -148, 263, -385, - 691, -385, -148, -385, -385, 130, -148, 691, 94, 94, - -270, -374, -270, -374, 586, 42, 42, 184, 188, 188, - 187, -385, 94, 39, 26, 26, 327, -255, 88, 88, - -270, -270, -270, -608, 446, -385, -620, 174, 44, -618, - 538, -184, 340, -436, 86, -191, 347, 19, 14, -270, - -270, -270, -270, -284, 38, -457, 85, -536, -235, 89, - -580, -534, 88, 89, 174, 19, -210, -271, -385, -447, - -385, -385, -385, -445, 86, -385, -375, -342, -342, -399, - -342, -342, 174, 25, -397, -399, -399, -262, -395, -262, - 173, -262, -374, -511, 38, -232, 174, 23, 282, -269, - -382, -266, -268, 267, -402, -267, 270, -576, 268, 266, - 114, 271, 325, 115, 261, -382, -382, 267, -305, 263, - 38, -382, -323, 261, 389, 325, 268, 23, 282, -322, - 261, 115, -385, 267, 271, 268, 266, -381, 130, -373, - 160, 263, 46, 423, -381, 592, 282, -381, -381, -381, - -381, -381, -381, -381, 299, 299, -381, -381, -381, -381, - -381, -381, -381, -381, -381, -381, -381, 179, -381, -381, - -381, -381, -381, -381, 88, 294, 295, 327, -447, 263, - 515, 515, -609, 446, 34, 403, 403, 404, -620, 399, - 45, 34, -192, 397, -326, -324, -396, 34, -348, -349, - -350, -351, -353, -352, 71, 75, 77, 81, 72, 73, - 74, 78, 83, 76, 34, 174, -383, -388, 38, -385, - 94, -383, -203, -218, -216, -383, 88, -467, -633, -635, - 530, 527, 533, -469, -469, 104, 263, 88, 130, -469, - -469, 44, -384, -630, 534, 528, -227, 174, 85, -272, - -246, -247, -248, -249, -277, -361, 208, 211, 213, 214, - 215, 216, 218, 219, 220, 221, 222, 225, 226, 223, - 224, 276, 203, 204, 205, 206, 191, 209, 587, 192, - 193, 194, 168, 169, 195, 198, 199, 200, 201, 197, - 227, 228, 229, 230, 231, 232, 233, 234, -385, -256, - 94, 19, -252, -342, -206, -218, -385, 94, -385, 151, - 127, -6, 125, -156, -155, -154, 128, 673, 679, 127, - 127, 127, 89, 89, 89, 174, 89, 89, 89, 174, - 89, 174, 104, -549, 505, -227, 94, -142, 636, 174, - -219, 40, 41, 174, 88, 89, 174, 64, 174, 130, - 89, 174, -412, -385, 94, -412, 204, 94, 173, 478, - -385, -562, 89, -475, 174, 263, 173, 173, -450, 426, - -384, -452, 23, 14, -361, 42, -368, 130, 710, -385, - 89, -414, -414, 119, -410, -407, 89, 127, -412, 125, - -275, -412, -275, -276, -282, 170, 207, 276, 206, 205, - 203, 163, 164, -295, -441, 586, -219, 89, -385, -412, - -412, 89, -412, -412, 19, -385, -295, -408, -412, -412, - -412, -224, -224, 89, 89, -482, -483, -482, -482, 89, - 89, 89, 89, -482, 89, 89, 89, 89, 89, 89, - 89, 89, 89, 89, 89, 88, -483, -483, -412, -483, - -412, -483, -483, -412, 104, 106, 104, 106, -542, -142, - -642, 66, 681, 65, 468, 109, 330, 174, 104, 94, - 711, 174, 130, 397, -385, 19, 173, 94, -385, 94, - -385, 19, 19, -270, -270, -270, 188, 94, -621, 334, - 397, 538, 259, 397, 334, 538, 259, -494, 104, 434, - -257, -258, -259, -260, -261, 140, 175, 176, -246, -232, - 88, -232, -611, 507, 448, 458, -381, 363, -404, -403, - 399, 45, -529, 469, 454, 455, -451, 290, -374, 151, - -617, 101, 130, 85, 375, 379, 381, 380, 376, 377, - 378, -430, -431, -429, -433, -374, 94, -604, 88, 88, - -200, 38, 138, -191, 347, 19, 88, 88, 38, -506, - 360, -277, 43, 89, 64, -1, -385, -270, -210, -385, - 19, 174, -603, 173, -385, -444, -397, -342, -412, -412, - -342, -397, -397, -399, -385, -262, -506, -277, 38, -321, - 256, 251, -479, 327, 328, -480, -496, 330, -498, 88, - -274, -361, -267, -575, -576, -432, -385, 115, -575, 115, - 88, -274, -361, -361, -324, -361, -385, -385, -385, -385, - -331, -330, -361, -334, 35, -335, -385, -385, -385, -385, - 115, -385, 115, -300, 44, 51, 52, 53, -381, -381, - 210, -303, 44, 468, 470, 471, -334, 104, 104, 104, - 104, 94, 94, 94, -381, -381, 104, 94, -388, 94, - -577, 187, 48, 49, 104, 104, 104, 104, 44, 94, - -308, 44, 310, 314, 311, 312, 313, 94, 104, 44, - 104, 44, 104, 44, -385, 88, -578, -579, 94, -494, - 252, -447, 94, 85, -611, -381, 403, -466, 130, 130, - -404, -613, 98, 449, -613, -616, 340, -194, 538, 35, - -236, 256, 251, -604, -456, -455, -361, -215, -215, -215, - -215, -215, -215, 71, 82, 71, -229, 88, 71, 76, - 71, 76, 71, -350, 71, 82, -456, -217, -232, -388, - 89, -627, -626, -625, -623, 79, 264, 80, -418, -469, - 527, 531, 532, -452, -400, 94, -459, -142, -270, -270, - -527, 320, 321, 89, 174, -277, -385, -344, 21, 173, - 123, -6, -152, -154, -412, -6, -412, 675, 416, 676, - 94, 104, 104, -557, 489, 484, 486, -142, -558, 476, - 14, -221, -220, 47, -421, -544, -543, 64, -200, -228, - -536, -581, -542, -385, 711, 711, 711, 711, 94, -385, - 104, 19, -449, -444, 151, 151, -385, 427, -460, 94, - 447, 94, 259, 711, 94, -368, -407, -412, 89, 38, - 89, 89, -513, -513, -512, -515, -512, -285, -285, 89, - 88, -219, 89, 26, 89, 89, 89, -412, 89, 89, - 174, 174, 89, -532, 547, -533, 621, -482, -482, -482, + 88, 88, 88, 88, 88, 88, 88, -224, 174, -223, + 88, -223, -224, -204, -203, 35, 36, 35, 36, 35, + 36, 35, 36, -640, 684, 88, 104, 707, 240, -237, + -385, -238, -385, -147, 19, 712, -385, 693, -622, 35, + 585, 364, 585, 585, 364, 585, 249, 18, 352, 57, + 353, 529, 14, 186, 187, 188, -385, 185, 263, -385, + -432, 265, -432, -432, -254, -385, 286, 423, 262, 577, + 262, -187, -432, 19, -432, -432, -432, -432, 261, -432, + 26, 259, 259, 259, 259, -432, 547, 130, 130, 62, + -233, -213, 174, -591, -232, 88, -601, 190, -622, 702, + 703, 704, 85, -397, 138, 142, -397, -342, 20, -342, + 26, 26, 288, 288, 288, -397, 328, -648, -649, 19, + 140, -395, -649, -395, -395, -397, -650, 261, 512, 46, + 289, 288, -225, -226, 24, -225, 506, 502, -489, 507, + 508, -399, -649, -398, -397, -397, -398, -397, -397, 369, + -397, 35, 364, 365, 259, 262, 540, 363, 688, -648, + -648, 34, 34, -524, -524, -270, -524, 265, -447, -524, + 575, -374, -385, -524, -524, -524, -325, -326, -270, -602, + 264, 704, -634, -633, 527, -636, 529, 179, -466, 179, + -466, 91, -446, 290, 290, 174, 130, 26, -467, 130, + 141, -466, -466, -467, -467, -295, 44, -384, 170, -385, + 94, -295, 44, -631, -630, -270, -224, -204, -203, 89, + 89, 89, 585, -622, -524, -524, -524, -524, -524, -525, + -524, -524, -524, -524, -524, -392, -245, -385, -256, 265, + -524, 364, -524, -524, -524, -205, -206, 151, -412, -385, + -209, -3, -151, -150, 124, 125, 127, 678, 418, 677, + 681, 675, -466, 44, -518, 164, 163, -512, -514, 88, + -513, 88, -513, -513, -513, -513, -513, 88, 88, -515, + 88, -515, -515, -512, -516, 88, -516, -517, 88, -517, + -516, -385, -493, 14, -418, -420, -385, 42, -224, -142, + 42, -226, 23, -535, 64, -200, 88, 34, 88, -385, + 204, 184, 692, 38, 100, 173, 104, 94, -121, -102, + 80, -121, -102, -102, 89, 174, -595, 110, 111, -597, + 94, 222, 213, -385, -119, 94, -561, -7, -12, -8, + -10, -11, -48, -87, -200, 583, 586, -564, -562, 88, + 35, 470, 85, 19, -473, 259, 540, 423, 286, 262, + 399, -471, -453, -450, -448, -384, -446, -449, -448, -476, + -361, 502, -143, 485, 484, 340, -412, -412, -412, -412, + -412, 109, 120, 386, 110, 111, -407, -428, 35, 336, + 337, -408, -408, -408, -408, -408, -408, -408, -408, -408, + -408, -408, -408, -410, -410, -416, -426, -505, 88, 140, + 138, 142, 139, 122, -410, -410, -408, -408, -275, -277, + 163, 164, -297, -384, 170, 89, 174, -412, -588, -587, + 124, -412, -412, -412, -412, -439, -441, -361, 88, -385, + -584, -585, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 414, 409, 415, 413, 402, 421, 416, + 417, 206, 572, 573, 566, 567, 568, 569, 570, 571, + -418, -418, -412, -584, -418, -354, 36, 35, -420, -420, + -420, 89, -412, -598, 384, 383, 385, -228, -385, -418, + 89, 89, 89, 104, -420, -420, -418, -408, -418, -418, + -418, -418, -585, -585, -586, 276, 203, 205, 204, -354, + -354, -354, -354, 151, -420, -420, -354, -354, -354, -354, + 151, -354, -354, -354, -354, -354, -354, -354, -354, -354, + -354, -354, 89, 89, 89, 89, -412, 89, -412, -412, + -412, -412, -412, 151, -420, -225, -141, -543, -542, -412, + 44, -142, -226, -641, 685, 88, -361, -629, 94, 94, + 712, -147, 173, 19, 259, -147, 173, 693, 184, -147, + 19, -385, -385, 94, 104, -385, 94, 104, 259, 540, + 259, 540, -270, -270, -270, 530, 531, 183, 187, 186, + -385, 185, -385, -385, 120, -385, -385, 38, -256, -245, + -432, -432, -432, -606, -385, 95, 94, -454, -451, -448, + -385, -385, -444, -385, -374, -270, -432, -432, -432, -432, + -270, -306, 56, 57, 58, -448, -188, 59, 60, -534, + 64, -200, 88, 34, -233, -590, 38, -231, -385, -602, + 290, -342, -410, -410, -412, 399, 540, 259, -448, 290, + -648, -397, -397, -375, -374, -399, -394, -399, -399, -342, + -395, -397, -397, -412, -399, -395, -342, -385, 502, -342, + -342, -489, -374, -397, 94, -396, -385, -396, -432, -374, + -375, -375, -270, -270, -320, -327, -321, -328, 282, 256, + 407, 408, 252, 250, 11, 251, -336, 329, -433, 548, + -301, -302, 80, 45, -304, 280, 447, 443, 292, 296, + 98, 297, 480, 298, 261, 300, 301, 302, 317, 319, + 272, 303, 304, 305, 471, 306, 178, 318, 307, 308, + 309, 425, -296, 6, 371, 44, 54, 55, 494, 493, + 593, 14, 293, -385, 39, 252, 256, 251, -606, -604, + 34, -385, 34, -454, -448, -385, -385, 174, 263, -216, + -218, -215, -211, -212, -217, -345, -347, -214, 88, -270, + -203, -385, -466, 174, 528, 530, 531, -634, -467, -634, + -467, 263, 35, 470, -470, 470, 35, -444, -464, 524, + 526, -459, 94, 471, -449, -469, 85, 170, -542, -467, + -467, -469, -469, 160, 174, -632, 529, 530, 246, -225, + 104, -252, 695, -272, -270, -606, -453, -444, -385, -524, + -272, -272, -272, -387, -387, 88, 173, 39, -385, -524, + -385, -385, -385, -341, 174, -340, 19, -386, -385, 38, + 94, 173, -152, -150, 126, -412, -6, 677, -412, -6, + -6, -412, -6, -412, -522, 166, 104, 104, -364, 94, + -364, 104, 104, 104, 596, 89, 94, -225, 662, -227, + 23, -222, -221, -412, -536, -421, -582, 661, -235, 89, + -228, -580, -581, -228, -234, -385, -262, 130, 130, 130, + 27, -524, -385, 26, -121, -102, -593, 173, 174, -231, + -473, -452, -449, -475, 151, -385, -460, 174, 14, 715, + 92, 263, -619, -618, 462, 89, 174, -546, 264, 547, + 94, 712, 478, 240, 241, 109, 386, 110, 111, -505, + -420, -416, -410, -410, -408, -408, -414, 277, -414, 119, + -285, 169, 168, -285, -412, 713, -411, -587, 126, -412, + 38, 174, 38, 174, 86, 174, 89, -512, -412, 173, + 89, 89, 19, 19, 89, -412, 89, 89, 89, 89, + 19, 19, -412, 89, 173, 89, 89, 89, 89, 86, + 89, 174, 89, 89, 89, 89, 174, 174, 174, -420, + -420, -412, -420, 89, 89, 89, -412, -412, -412, -420, + 89, -412, -412, -412, -412, -412, -412, -412, -412, -412, + -412, -231, -483, 497, -483, -483, -483, 89, -483, 89, + 174, 89, 174, 89, 89, 174, 174, 174, 174, 89, + -227, 88, 104, 174, 708, -368, -367, 94, -148, 263, + -385, 693, -385, -148, -385, -385, 130, -148, 693, 94, + 94, -270, -374, -270, -374, 588, 42, 42, 184, 188, + 188, 187, -385, 94, 39, 26, 26, 327, -255, 88, + 88, -270, -270, -270, -608, 448, -385, -620, 174, 44, + -618, 540, -184, 340, -436, 86, -191, 347, 19, 14, + -270, -270, -270, -270, -284, 38, -457, 85, -536, -235, + 89, -580, -534, 88, 89, 174, 19, -210, -271, -385, + -447, -385, -385, -385, -445, 86, -385, -375, -342, -342, + -399, -342, -342, 174, 25, -397, -399, -399, -262, -395, + -262, 173, -262, -374, -511, 38, -232, 174, 23, 282, + -269, -382, -266, -268, 267, -402, -267, 270, -576, 268, + 266, 114, 271, 325, 115, 261, -382, -382, 267, -305, + 263, 38, -382, -323, 261, 389, 325, 268, 23, 282, + -322, 261, 115, -385, 267, 271, 268, 266, -381, 130, + -373, 160, 263, 46, 425, -381, 594, 282, -381, -381, + -381, -381, -381, -381, -381, 299, 299, -381, -381, -381, + -381, -381, -381, -381, -381, -381, -381, -381, 179, -381, + -381, -381, -381, -381, -381, 88, 294, 295, 327, -447, + 263, 517, 517, -609, 448, 34, 405, 405, 406, -620, + 401, 45, 34, -192, 399, -326, -324, -396, 34, -348, + -349, -350, -351, -353, -352, 71, 75, 77, 81, 72, + 73, 74, 78, 83, 76, 34, 174, -383, -388, 38, + -385, 94, -383, -203, -218, -216, -383, 88, -467, -633, + -635, 532, 529, 535, -469, -469, 104, 263, 88, 130, + -469, -469, 44, -384, -630, 536, 530, -227, 174, 85, + -272, -246, -247, -248, -249, -277, -361, 208, 211, 213, + 214, 215, 216, 218, 219, 220, 221, 222, 225, 226, + 223, 224, 276, 203, 204, 205, 206, 191, 209, 589, + 192, 193, 194, 168, 169, 195, 198, 199, 200, 201, + 197, 227, 228, 229, 230, 231, 232, 233, 234, -385, + -256, 94, 19, -252, -342, -206, -218, -385, 94, -385, + 151, 127, -6, 125, -156, -155, -154, 128, 675, 681, + 127, 127, 127, 89, 89, 89, 174, 89, 89, 89, + 174, 89, 174, 104, -549, 507, -227, 94, -142, 638, + 174, -219, 40, 41, 174, 88, 89, 174, 64, 174, + 130, 89, 174, -412, -385, 94, -412, 204, 94, 173, + 480, -385, -562, 89, -475, 174, 263, 173, 173, -450, + 428, -384, -452, 23, 14, -361, 42, -368, 130, 712, + -385, 89, -414, -414, 119, -410, -407, 89, 127, -412, + 125, -275, -412, -275, -276, -282, 170, 207, 276, 206, + 205, 203, 163, 164, -295, -441, 588, -219, 89, -385, + -412, -412, 89, -412, -412, 19, -385, -295, -408, -412, + -412, -412, -224, -224, 89, 89, -482, -483, -482, -482, + 89, 89, 89, 89, -482, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 88, -483, -483, -412, + -483, -412, -483, -483, -412, 104, 106, 104, 106, -542, + -142, -642, 66, 683, 65, 470, 109, 330, 174, 104, + 94, 713, 174, 130, 399, -385, 19, 173, 94, -385, + 94, -385, 19, 19, -270, -270, -270, 188, 94, -621, + 334, 399, 540, 259, 399, 334, 540, 259, -494, 104, + 436, -257, -258, -259, -260, -261, 140, 175, 176, -246, + -232, 88, -232, -611, 509, 450, 460, -381, 363, -404, + -403, 401, 45, -529, 471, 456, 457, -451, 290, -374, + 151, -617, 101, 130, 85, 375, 379, 381, 380, 376, + 377, 378, -430, -431, -429, -433, -374, 94, -604, 88, + 88, -200, 38, 138, -191, 347, 19, 88, 88, 38, + -506, 360, -277, 43, 89, 64, -1, -385, -270, -210, + -385, 19, 174, -603, 173, -385, -444, -397, -342, -412, + -412, -342, -397, -397, -399, -385, -262, -506, -277, 38, + -321, 256, 251, -479, 327, 328, -480, -496, 330, -498, + 88, -274, -361, -267, -575, -576, -432, -385, 115, -575, + 115, 88, -274, -361, -361, -324, -361, -385, -385, -385, + -385, -331, -330, -361, -334, 35, -335, -385, -385, -385, + -385, 115, -385, 115, -300, 44, 51, 52, 53, -381, + -381, 210, -303, 44, 470, 472, 473, -334, 104, 104, + 104, 104, 94, 94, 94, -381, -381, 104, 94, -388, + 94, -577, 187, 48, 49, 104, 104, 104, 104, 44, + 94, -308, 44, 310, 314, 311, 312, 313, 94, 104, + 44, 104, 44, 104, 44, -385, 88, -578, -579, 94, + -494, 252, -447, 94, 85, -611, -381, 405, -466, 130, + 130, -404, -613, 98, 451, -613, -616, 340, -194, 540, + 35, -236, 256, 251, -604, -456, -455, -361, -215, -215, + -215, -215, -215, -215, 71, 82, 71, -229, 88, 71, + 76, 71, 76, 71, -350, 71, 82, -456, -217, -232, + -388, 89, -627, -626, -625, -623, 79, 264, 80, -418, + -469, 529, 533, 534, -452, -400, 94, -459, -142, -270, + -270, -527, 320, 321, 89, 174, -277, -385, -344, 21, + 173, 123, -6, -152, -154, -412, -6, -412, 677, 418, + 678, 94, 104, 104, -557, 491, 486, 488, -142, -558, + 478, 14, -221, -220, 47, -421, -544, -543, 64, -200, + -228, -536, -581, -542, -385, 713, 713, 713, 713, 94, + -385, 104, 19, -449, -444, 151, 151, -385, 429, -460, + 94, 449, 94, 259, 713, 94, -368, -407, -412, 89, + 38, 89, 89, -513, -513, -512, -515, -512, -285, -285, + 89, 88, -219, 89, 26, 89, 89, 89, -412, 89, + 89, 174, 174, 89, -532, 549, -533, 623, -482, -482, -482, -482, -482, -482, -482, -482, -482, -482, -482, -482, - -482, -482, -482, -482, -423, -422, 282, 89, 174, 89, - 174, 89, 490, 688, 688, 490, 688, 688, 89, 174, - -584, 174, -376, 335, -376, -367, 94, -385, 94, 691, - -385, 711, 711, 94, -270, -374, -239, 506, -197, 124, - -198, 122, 46, 94, -385, 19, -385, -385, 327, -385, - 327, -385, -385, 94, 94, 89, 174, -361, 89, 38, - -263, -264, -265, -274, -266, -268, 38, -612, 98, -607, - 94, -385, 95, -385, -613, 172, 401, 44, 450, 451, - 466, 396, 104, 104, 456, -605, -385, -193, 259, 397, - -193, -615, 55, 130, 94, -270, -429, -373, 160, 301, - -262, -385, 363, -339, -338, -385, 94, -263, -200, -270, - -270, 94, -263, -263, -200, -507, 362, 23, 104, 150, - 115, 64, -200, -536, 89, -233, 86, 173, -218, -271, - -385, 151, -342, -262, -342, -342, -397, -507, -200, -491, - 331, 88, -489, 88, -489, 115, 376, -499, -497, 282, - -329, 48, 50, -277, -573, -385, -571, -573, -385, -571, - -571, -432, -412, -329, -274, 263, 34, 251, -332, 379, - 373, 374, 379, 381, -461, 326, 120, -461, 174, -219, - 174, -385, -295, -295, 34, 94, 94, -272, 89, 174, - 130, 94, 263, 85, 259, -612, -607, 130, -467, 94, - 94, -613, 94, 94, -617, 130, -273, 259, -374, 174, - -236, -236, -342, 174, 130, -241, -240, 85, 86, -242, - 85, -240, -240, 71, -230, 94, 71, 71, -342, -625, - -624, 26, -576, -576, -576, 89, 89, -243, 26, -248, - 44, 363, -343, 22, 23, 151, 127, 125, 127, 127, - -385, 89, 89, -519, 661, -553, -555, 484, 23, 23, - -243, -559, 666, 94, 427, 48, 49, 89, -536, 711, - -444, -460, 469, -270, 174, 711, -275, -314, 94, -412, - 89, -412, -412, 89, 94, 89, 94, -224, 23, -483, - -412, -483, -412, -483, 89, 174, 89, 89, 89, 174, - 89, 89, -412, 89, -584, -377, 204, 94, -377, -385, - -386, -196, 263, -262, -199, 358, 88, 354, -197, 184, - 88, 94, -385, 19, -385, -494, 327, -494, 327, 259, - -385, -252, -437, 588, -259, -277, 257, -200, 89, 174, - -200, 94, -610, 460, -495, 368, 104, 44, 104, 172, - 452, -530, -185, 98, -272, 35, -236, -185, -614, 98, - 130, 710, 88, -381, -381, -381, -196, 363, -385, 89, - 174, -381, -381, 89, -196, -385, 89, 89, -293, 14, - -508, 281, 104, 150, 104, 150, 104, 17, 264, -536, - -383, -218, -385, -342, -603, 173, -342, -508, -481, 332, - 104, -408, 88, -408, 88, -490, 329, 88, 89, 174, - -385, -361, -290, -289, -287, 109, 120, 44, 441, -288, - 98, 160, 315, 318, 317, 293, 316, -319, -401, 85, - 654, 444, 373, 374, -433, 661, 577, 669, 38, 266, - 114, 115, 428, -402, 88, 88, 86, 335, 88, 88, - -573, 89, -329, -361, 44, -332, 44, -333, 395, -442, - 326, -330, -385, 160, -295, 89, -579, 94, -447, 259, - -385, -610, 94, -469, -615, 94, -185, -272, -604, -224, - -455, -542, -412, 88, -412, 89, 88, 71, 11, 21, - 17, -405, -385, -412, -420, 695, 697, 698, 265, -6, - 676, 416, -310, 662, 94, 23, 94, -551, 94, -549, - 94, -420, -145, -307, -373, 298, 89, -313, 140, 14, - 89, 89, 89, -482, -482, -485, -484, -488, 490, 327, - 498, -420, 89, 89, 94, 94, 89, 89, 94, 94, - 397, -196, 38, 434, 24, 600, 359, -231, 355, 356, - 357, -385, 94, -420, -201, -203, 710, 363, -385, 19, - 94, -494, 94, -494, -385, 327, 94, 94, -250, -277, - -189, 14, -293, -265, -189, 23, 14, 172, 400, 44, - 104, 44, 453, 94, -193, 130, 110, 111, -369, -370, - 94, -439, -295, -297, 94, -385, -338, -405, -405, -291, - -200, 38, -292, -336, -433, 363, -144, -143, -291, 88, - -509, 178, 104, 150, 104, 104, -456, -342, -342, -509, - -498, 23, 89, -476, 89, -476, 88, 130, -408, -497, - -500, 64, -287, 109, -408, 94, -297, -298, 44, 314, - 310, 130, 130, -299, 44, 294, 295, -309, 88, 325, - 17, 104, 210, 88, 670, 88, 115, 115, -270, -439, - -439, -574, 375, 376, 377, 382, 379, 380, 378, 381, - -574, -439, -439, 88, -462, -461, -408, -442, 130, -443, - 272, 387, 388, 98, 14, 373, 374, 392, 391, 390, - 393, 394, 395, 400, 411, -381, 160, -385, 173, -614, - -225, -231, -572, -385, 266, 23, 23, -528, 14, 696, - 88, 88, -385, -385, -365, 663, 104, 94, 486, -557, - -520, 664, -547, -489, -295, 130, 89, 78, 587, 589, - 89, -487, 122, 452, 456, -406, -409, 104, 106, 202, - 172, -483, -483, 89, 89, -385, -270, 94, 104, 89, - 119, 119, 89, 89, -372, -371, 94, -385, 363, -385, - -252, 94, -252, 94, 327, -494, 588, -190, 63, 534, - 94, 95, 447, 94, 95, 104, 400, -185, 94, 711, - 174, 130, 89, -495, -477, 282, -200, 174, -336, -373, - -385, -145, -477, -294, -337, -385, 94, -526, 187, 361, - 14, 104, 150, 104, -224, -510, 187, 361, -480, 89, - 89, 89, -476, 104, 89, -504, -501, 88, -336, 284, - 140, 94, 94, 104, 88, -537, 34, 94, 38, -412, - -440, 88, 89, 89, 89, 89, -439, 110, 111, -381, - -381, 94, 94, 372, -381, -381, -381, 130, -381, -381, - -295, -381, 173, -385, 89, 89, 174, 698, 88, -420, - -420, 88, 23, -519, -521, 665, 94, -556, 489, -550, - -548, 484, 485, 486, 487, 94, 588, 68, 590, -486, - -487, 456, -406, -409, 659, 496, 496, 496, -385, 94, - 711, 174, 130, -385, 363, -252, -252, -494, 94, -253, - -385, 325, 469, -370, 94, -442, -478, 334, 23, -336, - -381, -495, -478, 89, 174, -381, -381, 361, 104, 150, - 104, -225, 361, -492, 333, 89, -504, -336, -503, -502, - 332, 285, 88, 89, -412, -424, -381, 89, 88, 89, - -312, -311, 585, -439, -442, 86, -442, 86, -442, 86, - -442, 86, 89, 104, 104, -385, 104, 104, 104, 110, - 111, 104, 104, -295, -385, -385, 266, -140, 88, 89, - 89, -366, -385, -551, -310, 94, -560, 264, -554, -555, - 488, -548, 23, 486, 23, 23, -146, 174, 68, 119, - 497, 497, 497, -197, -198, -197, -198, -252, -371, 94, - -385, 94, -252, -251, 38, 491, 427, 23, -479, -295, - -337, -405, -405, 104, 104, 89, 174, -385, 281, 88, - -419, -413, -412, 281, 89, -385, -412, -463, 672, 671, - -318, -316, -317, 85, 503, 323, 324, 89, -574, -574, - -574, -574, -319, 89, 174, -418, 89, 174, -365, -567, - 88, 104, -553, -552, -554, 23, -551, 23, -551, -551, - 493, 14, -486, -197, -197, -252, 94, -361, 88, -491, - -502, -501, -419, 89, 174, -461, 89, -317, 85, -316, - 85, 18, 17, -442, -442, -442, -442, 88, 89, -385, - -570, 34, 89, -566, -565, -362, -561, -385, 489, 490, - 94, -551, 130, 589, -645, -644, 687, -476, -481, 89, - -413, -463, -315, 320, 321, 34, 187, -315, -418, -569, - -568, -363, 89, 174, 173, 94, 590, 94, 89, -498, - 109, 44, 322, 89, 174, 130, -565, -385, -568, 44, - -412, 173, -385, + -482, -482, -482, -482, -482, -423, -422, 282, 89, 174, + 89, 174, 89, 492, 690, 690, 492, 690, 690, 89, + 174, -584, 174, -376, 335, -376, -367, 94, -385, 94, + 693, -385, 713, 713, 94, -270, -374, -239, 508, -197, + 124, -198, 122, 46, 94, -385, 19, -385, -385, 327, + -385, 327, -385, -385, 94, 94, 89, 174, -361, 89, + 38, -263, -264, -265, -274, -266, -268, 38, -612, 98, + -607, 94, -385, 95, -385, -613, 172, 403, 44, 452, + 453, 468, 398, 104, 104, 458, -605, -385, -193, 259, + 399, -193, -615, 55, 130, 94, -270, -429, -373, 160, + 301, -262, -385, 363, -339, -338, -385, 94, -263, -200, + -270, -270, 94, -263, -263, -200, -507, 362, 23, 104, + 150, 115, 64, -200, -536, 89, -233, 86, 173, -218, + -271, -385, 151, -342, -262, -342, -342, -397, -507, -200, + -491, 331, 88, -489, 88, -489, 115, 376, -499, -497, + 282, -329, 48, 50, -277, -573, -385, -571, -573, -385, + -571, -571, -432, -412, -329, -274, 263, 34, 251, -332, + 379, 373, 374, 379, 381, -461, 326, 120, -461, 174, + -219, 174, -385, -295, -295, 34, 94, 94, -272, 89, + 174, 130, 94, 263, 85, 259, -612, -607, 130, -467, + 94, 94, -613, 94, 94, -617, 130, -273, 259, -374, + 174, -236, -236, -342, 174, 130, -241, -240, 85, 86, + -242, 85, -240, -240, 71, -230, 94, 71, 71, -342, + -625, -624, 26, -576, -576, -576, 89, 89, -243, 26, + -248, 44, 363, -343, 22, 23, 151, 127, 125, 127, + 127, -385, 89, 89, -519, 663, -553, -555, 486, 23, + 23, -243, -559, 668, 94, 429, 48, 49, 89, -536, + 713, -444, -460, 471, -270, 174, 713, -275, -314, 94, + -412, 89, -412, -412, 89, 94, 89, 94, -224, 23, + -483, -412, -483, -412, -483, 89, 174, 89, 89, 89, + 174, 89, 89, -412, 89, -584, -377, 204, 94, -377, + -385, -386, -196, 263, -262, -199, 358, 88, 354, -197, + 184, 88, 94, -385, 19, -385, -494, 327, -494, 327, + 259, -385, -252, -437, 590, -259, -277, 257, -200, 89, + 174, -200, 94, -610, 462, -495, 368, 104, 44, 104, + 172, 454, -530, -185, 98, -272, 35, -236, -185, -614, + 98, 130, 712, 88, -381, -381, -381, -196, 363, -385, + 89, 174, -381, -381, 89, -196, -385, 89, 89, -293, + 14, -508, 281, 104, 150, 104, 150, 104, 17, 264, + -536, -383, -218, -385, -342, -603, 173, -342, -508, -481, + 332, 104, -408, 88, -408, 88, -490, 329, 88, 89, + 174, -385, -361, -290, -289, -287, 109, 120, 44, 443, + -288, 98, 160, 315, 318, 317, 293, 316, -319, -401, + 85, 656, 446, 373, 374, -433, 663, 579, 671, 38, + 266, 114, 115, 430, -402, 88, 88, 86, 335, 88, + 88, -573, 89, -329, -361, 44, -332, 44, -333, 395, + -442, 326, -330, -385, 160, -295, 89, -579, 94, -447, + 259, -385, -610, 94, -469, -615, 94, -185, -272, -604, + -224, -455, -542, -412, 88, -412, 89, 88, 71, 11, + 21, 17, -405, -385, -412, -420, 697, 699, 700, 265, + -6, 678, 418, -310, 664, 94, 23, 94, -551, 94, + -549, 94, -420, -145, -307, -373, 298, 89, -313, 140, + 14, 89, 89, 89, -482, -482, -485, -484, -488, 492, + 327, 500, -420, 89, 89, 94, 94, 89, 89, 94, + 94, 399, -196, 38, 436, 24, 602, 359, -231, 355, + 356, 357, -385, 94, -420, -201, -203, 712, 363, -385, + 19, 94, -494, 94, -494, -385, 327, 94, 94, -250, + -277, -189, 14, -293, -265, -189, 23, 14, 172, 402, + 44, 104, 44, 455, 94, -193, 130, 110, 111, -369, + -370, 94, -439, -295, -297, 94, -385, -338, -405, -405, + -291, -200, 38, -292, -336, -433, 363, -144, -143, -291, + 88, -509, 178, 104, 150, 104, 104, -456, -342, -342, + -509, -498, 23, 89, -476, 89, -476, 88, 130, -408, + -497, -500, 64, -287, 109, -408, 94, -297, -298, 44, + 314, 310, 130, 130, -299, 44, 294, 295, -309, 88, + 325, 17, 104, 210, 88, 672, 88, 115, 115, -270, + -439, -439, -574, 375, 376, 377, 382, 379, 380, 378, + 381, -574, -439, -439, 88, -462, -461, -408, -442, 130, + -443, 272, 387, 388, 98, 14, 373, 374, 392, 391, + 390, 393, 394, 395, 402, 413, 396, 397, -381, 160, + -385, 173, -614, -225, -231, -572, -385, 266, 23, 23, + -528, 14, 698, 88, 88, -385, -385, -365, 665, 104, + 94, 488, -557, -520, 666, -547, -489, -295, 130, 89, + 78, 589, 591, 89, -487, 122, 454, 458, -406, -409, + 104, 106, 202, 172, -483, -483, 89, 89, -385, -270, + 94, 104, 89, 119, 119, 89, 89, -372, -371, 94, + -385, 363, -385, -252, 94, -252, 94, 327, -494, 590, + -190, 63, 536, 94, 95, 449, 94, 95, 104, 402, + -185, 94, 713, 174, 130, 89, -495, -477, 282, -200, + 174, -336, -373, -385, -145, -477, -294, -337, -385, 94, + -526, 187, 361, 14, 104, 150, 104, -224, -510, 187, + 361, -480, 89, 89, 89, -476, 104, 89, -504, -501, + 88, -336, 284, 140, 94, 94, 104, 88, -537, 34, + 94, 38, -412, -440, 88, 89, 89, 89, 89, -439, + 110, 111, -381, -381, 94, 94, 372, -381, -381, -381, + 130, -381, -381, -381, 88, -295, -381, 173, -385, 89, + 89, 174, 700, 88, -420, -420, 88, 23, -519, -521, + 667, 94, -556, 491, -550, -548, 486, 487, 488, 489, + 94, 590, 68, 592, -486, -487, 458, -406, -409, 661, + 498, 498, 498, -385, 94, 713, 174, 130, -385, 363, + -252, -252, -494, 94, -253, -385, 325, 471, -370, 94, + -442, -478, 334, 23, -336, -381, -495, -478, 89, 174, + -381, -381, 361, 104, 150, 104, -225, 361, -492, 333, + 89, -504, -336, -503, -502, 332, 285, 88, 89, -412, + -424, -381, 89, 88, 89, -312, -311, 587, -439, -442, + 86, -442, 86, -442, 86, -442, 86, 89, 104, 104, + -385, 104, 104, 104, 110, 111, 104, 104, 94, -476, + -295, -385, -385, 266, -140, 88, 89, 89, -366, -385, + -551, -310, 94, -560, 264, -554, -555, 490, -548, 23, + 488, 23, 23, -146, 174, 68, 119, 499, 499, 499, + -197, -198, -197, -198, -252, -371, 94, -385, 94, -252, + -251, 38, 493, 429, 23, -479, -295, -337, -405, -405, + 104, 104, 89, 174, -385, 281, 88, -419, -413, -412, + 281, 89, -385, -412, -463, 674, 673, -318, -316, -317, + 85, 505, 323, 324, 89, -574, -574, -574, -574, -319, + 89, 89, 174, -418, 89, 174, -365, -567, 88, 104, + -553, -552, -554, 23, -551, 23, -551, -551, 495, 14, + -486, -197, -197, -252, 94, -361, 88, -491, -502, -501, + -419, 89, 174, -461, 89, -317, 85, -316, 85, 18, + 17, -442, -442, -442, -442, 88, 89, -385, -570, 34, + 89, -566, -565, -362, -561, -385, 491, 492, 94, -551, + 130, 591, -645, -644, 689, -476, -481, 89, -413, -463, + -315, 320, 321, 34, 187, -315, -418, -569, -568, -363, + 89, 174, 173, 94, 592, 94, 89, -498, 109, 44, + 322, 89, 174, 130, -565, -385, -568, 44, -412, 173, + -385, } var yyDef = [...]int{ @@ -10860,433 +10912,434 @@ var yyDef = [...]int{ 0, 0, 0, 851, 0, 0, 0, 896, 914, 23, 0, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 0, 0, 19, 0, 19, 0, 0, 0, - 1509, 1510, 1511, 1512, 2368, 2338, -2, 2092, 2065, 2262, - 2263, 2152, 2166, 2058, 2410, 2411, 2412, 2413, 2414, 2415, - 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, - 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, - 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, - 2446, 2447, 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, - 2456, 2457, 2458, 2459, 2460, 2461, 2013, 2014, 2015, 2016, - 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, - 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, - 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, - 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, - 2057, 2059, 2060, 2061, 2062, 2063, 2064, 2066, 2067, 2068, - 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, - 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, - 2089, 2090, 2091, 2093, 2094, 2095, 2096, 2097, 2098, 2099, - 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, - 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, - 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, - 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, - 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, - 2150, 2151, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, - 2161, 2162, 2163, 2164, 2165, 2168, 2169, 2170, 2171, 2172, - 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, - 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, - 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, - 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, - 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, - 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, - 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, - 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, - 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2264, - 2265, 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, - 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, - 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, - -2, 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, - 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, - 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, - 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, - 2335, 2336, 2337, 2339, 2340, 2341, 2342, 2343, 2344, 2345, - 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, -2, -2, - -2, 2357, 2358, 2359, 2360, 2361, 2362, 2363, 2364, 2365, - 2366, 2367, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, - 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, - 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, - 2397, 2398, 2399, 0, 328, 326, 2030, 2058, 2065, 2092, - 2152, 2166, 2167, 2208, 2262, 2263, 2295, 2338, 2354, 2355, - 2356, 2368, 0, 0, 1051, 0, 365, 756, 757, 784, - 851, 879, 817, 0, 822, 1456, 0, 715, 0, 403, - 0, 2081, 407, 2345, 0, 0, 0, 0, 712, 397, - 398, 399, 400, 401, 402, 0, 0, 1024, 0, 0, - 393, 0, 359, 2154, 2367, 1513, 0, 0, 0, 0, - 0, 215, 1186, 217, 1188, 221, 229, 0, 0, 0, - 234, 235, 238, 239, 240, 241, 242, 0, 246, 0, - 248, 251, 0, 253, 254, 0, 257, 258, 259, 0, - 269, 270, 271, 1189, 1190, 1191, 1192, 1193, 1194, 1195, - 1196, -2, 144, 1049, 1976, 1862, 0, 1869, 1882, 1893, - 1603, 1604, 1605, 1606, 0, 0, 0, 0, 0, 0, - 1614, 1615, 0, 1658, 2414, 2457, 2458, 0, 1624, 1625, - 1626, 1627, 1628, 1629, 0, 155, 167, 168, 1915, 1916, - 1917, 1918, 1919, 1920, 1921, 0, 1923, 1924, 1925, 1833, - 1588, 1509, 0, 2423, 0, 2445, 2452, 2453, 2454, 2455, - 2444, 0, 0, 1817, 0, 1807, 0, 0, -2, -2, - 0, 0, 2235, -2, 2459, 2460, 2461, 2420, 2441, 2449, - 2450, 2451, 2424, 2425, 2448, 2416, 2417, 2418, 2411, 2412, - 2413, 2415, 2427, 2429, 2440, 0, 2436, 2446, 2447, 2343, - 0, 0, 2390, 0, 0, 0, 0, 0, 0, 2395, - 2396, 2397, 2398, 2399, 2385, 169, 170, -2, -2, -2, + 1511, 1512, 1513, 1514, 2371, 2341, -2, 2095, 2067, 2265, + 2266, 2155, 2169, 2060, 2413, 2414, 2415, 2416, 2417, 2418, + 2419, 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, + 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, + 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, + 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, + 2459, 2460, 2461, 2462, 2463, 2464, 2015, 2016, 2017, 2018, + 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, + 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, + 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, + 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, + 2059, 2061, 2062, 2063, 2064, 2065, 2066, 2068, 2069, 2070, + 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, + 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, + 2091, 2092, 2093, 2094, 2096, 2097, 2098, 2099, 2100, 2101, + 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, + 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, + 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, + 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, + 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, + 2152, 2153, 2154, 2156, 2157, 2158, 2159, 2160, 2161, 2162, + 2163, 2164, 2165, 2166, 2167, 2168, 2171, 2172, 2173, 2174, + 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, + 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, + 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, + 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, + 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, + 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, + 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, + 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, + 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, + 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, + 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, + 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, + 2297, -2, 2299, 2300, 2301, 2302, 2303, 2304, 2305, 2306, + 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, + 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, + 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, + 2337, 2338, 2339, 2340, 2342, 2343, 2344, 2345, 2346, 2347, + 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, -2, + -2, -2, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, + 2368, 2369, 2370, 2372, 2373, 2374, 2375, 2376, 2377, 2378, + 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, + 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, + 2399, 2400, 2401, 2402, 0, 328, 326, 2032, 2060, 2067, + 2095, 2155, 2169, 2170, 2211, 2265, 2266, 2298, 2341, 2357, + 2358, 2359, 2371, 0, 0, 1051, 0, 365, 756, 757, + 784, 851, 879, 817, 0, 822, 1458, 0, 715, 0, + 403, 0, 2083, 407, 2348, 0, 0, 0, 0, 712, + 397, 398, 399, 400, 401, 402, 0, 0, 1024, 0, + 0, 393, 0, 359, 2157, 2370, 1515, 0, 0, 0, + 0, 0, 215, 1186, 217, 1188, 221, 229, 0, 0, + 0, 234, 235, 238, 239, 240, 241, 242, 0, 246, + 0, 248, 251, 0, 253, 254, 0, 257, 258, 259, + 0, 269, 270, 271, 1189, 1190, 1191, 1192, 1193, 1194, + 1195, 1196, -2, 144, 1049, 1978, 1864, 0, 1871, 1884, + 1895, 1605, 1606, 1607, 1608, 0, 0, 0, 0, 0, + 0, 1616, 1617, 0, 1660, 2417, 2460, 2461, 0, 1626, + 1627, 1628, 1629, 1630, 1631, 0, 155, 167, 168, 1917, + 1918, 1919, 1920, 1921, 1922, 1923, 0, 1925, 1926, 1927, + 1835, 1590, 1511, 0, 2426, 0, 2448, 2455, 2456, 2457, + 2458, 2447, 0, 0, 1819, 0, 1809, 0, 0, -2, + -2, 0, 0, 2238, -2, 2462, 2463, 2464, 2423, 2444, + 2452, 2453, 2454, 2427, 2428, 2451, 2419, 2420, 2421, 2414, + 2415, 2416, 2418, 2430, 2432, 2443, 0, 2439, 2449, 2450, + 2346, 0, 0, 2393, 0, 0, 0, 0, 0, 0, + 2398, 2399, 2400, 2401, 2402, 2388, 169, 170, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, - -2, -2, -2, -2, 1828, -2, 1830, -2, 1832, -2, - 1835, -2, -2, -2, -2, 1840, 1841, -2, 1843, -2, - -2, -2, -2, -2, -2, -2, 1819, 1820, 1821, 1822, - 1811, 1812, 1813, 1814, 1815, 1816, -2, -2, -2, 879, - 972, 0, 879, 0, 852, 901, 904, 907, 910, 855, - 0, 0, 117, 118, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 354, 355, 343, - 345, 0, 349, 0, 0, 345, 342, 336, 0, 1239, - 1239, 1239, 0, 0, 0, 1239, 1239, 1239, 1239, 1239, - 0, 1239, 0, 0, 0, 0, 0, 1239, 0, 1087, - 1198, 1199, 1200, 1237, 1238, 1342, 0, 0, 0, 817, - 0, 865, 0, 867, 870, 772, 768, 769, 770, 771, - 0, 0, 0, 692, 692, 939, 939, 0, 635, 0, - 0, 0, 692, 0, 649, 641, 0, 0, 0, 692, - 0, 0, 872, 872, 0, 695, 702, 692, 692, -2, - 692, 692, 0, 687, 692, 0, 0, 0, 1253, 655, - 656, 657, 641, 641, 660, 661, 662, 672, 673, 703, - 2008, 0, 0, 559, 559, 0, 559, 0, 559, 0, - 559, 559, 559, 0, 774, 2108, 2203, 2089, 2172, 2040, - 2154, 2367, 0, 301, 2235, 306, 0, 2091, 2111, 0, - 0, 2130, 0, -2, 0, 381, 879, 0, 0, 851, - 0, 0, 0, 0, 559, 559, 559, 559, 559, 1341, - 559, 559, 559, 559, 559, 0, 0, 0, 559, 0, - 559, 559, 559, 0, 915, 916, 918, 919, 920, 921, - 922, 923, 924, 925, 926, 927, 5, 6, 19, 0, - 0, 0, 0, 0, 0, 123, 122, 0, 1977, 2003, - 1928, 1929, 1930, 1990, 1932, 1994, 1994, 1994, 1994, 1961, - 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1994, - 1994, 0, 0, 1975, 1952, 1992, 1992, 1992, 1990, 1979, - 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, - 1943, 1944, 1945, 1946, 1997, 1997, 2000, 2000, 1997, 1980, - 1981, 1982, 1983, 1984, 1985, 1986, 1987, 0, 445, 443, - 444, 1858, 0, 0, 879, -2, 0, 0, 0, 0, - 821, 1454, 0, 0, 0, 716, 404, 1514, 0, 0, - 408, 0, 409, 0, 0, 411, 0, 0, 0, 433, - 0, 436, 419, 420, 421, 422, 423, 415, 0, 195, - 0, 395, 396, 0, 0, 361, 0, 0, 0, 560, - 0, 0, 0, 0, 0, 0, 226, 222, 230, 233, - 243, 250, 0, 262, 264, 267, 223, 231, 236, 237, - 244, 265, 224, 227, 228, 232, 266, 268, 225, 245, - 249, 263, 247, 252, 255, 256, 261, 0, 196, 0, - 0, 0, 0, 0, 1868, 0, 0, 1901, 1902, 1903, - 1904, 1905, 1906, 1907, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2, 1862, 0, 0, - 1609, 1610, 1611, 1612, 0, 1616, 0, 1659, 0, 0, - 0, 0, 0, 0, 1922, 1926, 0, 1858, 1858, 0, - 1858, 1854, 0, 0, 0, 0, 0, 0, 1858, 1790, - 0, 0, 1792, 1808, 0, 0, 1794, 1795, 0, 1798, - 1799, 1858, 0, 1858, 1803, 1858, 1858, 1858, 1784, 1785, - 0, 0, 0, 1854, 1854, 1854, 1854, 0, 0, 1854, - 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, - 1854, 1854, 1854, 1854, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 872, 0, 880, 0, - -2, 0, 898, 900, 902, 903, 905, 906, 908, 909, - 911, 912, 857, 0, 0, 119, 0, 0, 0, 102, - 0, 0, 100, 0, 0, 0, 0, 75, 77, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 347, 0, 352, 338, 2195, 0, 337, 0, - 0, 0, 0, 0, 1048, 0, 0, 1239, 1239, 1239, - 1088, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1239, 1239, 1239, 1239, 0, 1259, 0, 0, 0, 0, - 817, 0, 866, 0, 0, 774, 773, 74, 623, 624, - 625, 0, 939, 0, 0, 628, 629, 0, 630, 0, - 0, 641, 692, 692, 647, 648, 643, 642, 698, 699, - 695, 0, 695, 695, 939, 0, 666, 667, 668, 692, - 692, 674, 873, 0, 675, 676, 695, 0, 700, 701, - 939, 0, 0, 939, 939, 0, 684, 685, 0, 688, - 692, 0, 691, 0, 0, 1239, 0, 708, 643, 643, - 2009, 2010, 0, 0, 1250, 0, 0, 0, 0, 0, - 0, 711, 0, 0, 0, 462, 463, 0, 0, 775, - 0, 280, 284, 0, 287, 0, 2203, 0, 2203, 0, - 0, 294, 0, 0, 0, 0, 0, 0, 324, 325, - 0, 0, 0, 0, 315, 318, 1448, 1449, 1183, 1184, - 319, 320, 373, 374, 0, 872, 897, 899, 893, 894, - 895, 0, 1241, 0, 0, 0, 0, 0, 559, 0, - 0, 0, 0, 0, 750, 0, 1066, 752, 0, 0, - 559, 0, 0, 0, 947, 941, 943, 1019, 155, 917, - 8, 140, 137, 0, 19, 0, 0, 19, 19, 0, - 19, 329, 0, 2006, 2004, 2005, 1931, 1991, 0, 1957, - 0, 1958, 1959, 1960, 1971, 1972, 0, 0, 1953, 0, - 1954, 1955, 1956, 1947, 0, 1948, 1949, 0, 1950, 1951, - 327, 442, 0, 0, 1859, 1052, 0, 872, 849, 0, - 877, 0, 776, 809, 778, 0, 798, 0, 1456, 0, - 0, 0, 0, 559, 0, 405, 0, 416, 410, 0, - 417, 412, 413, 0, 0, 435, 437, 438, 439, 440, - 424, 425, 713, 390, 391, 392, 382, 383, 384, 385, - 386, 387, 388, 389, 0, 0, 394, 165, 0, 362, - 363, 0, 0, 0, 209, 210, 211, 212, 213, 214, - 216, 200, 739, 741, 1175, 1187, 0, 1178, 0, 219, - 260, 192, 0, 0, 0, 1863, 1864, 1865, 1866, 1867, - 1872, 0, 1874, 1876, 1878, 1880, 0, 1898, -2, -2, - 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, - 1599, 1600, 1601, 1602, 1883, 1896, 1897, 0, 0, 0, - 0, 0, 0, 1894, 1894, 1889, 0, 1621, 1663, 1675, - 1675, 1630, 1450, 1451, 1607, 0, 0, 1656, 1660, 0, - 0, 0, 0, 0, 0, 1220, 1990, 0, 156, 1853, - 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, - 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, - 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 0, - 0, 1862, 0, 0, 0, 1855, 1856, 0, 0, 0, - 1739, 0, 0, 1745, 1746, 1747, 0, 804, 0, 1818, - 1791, 1809, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1780, 1781, 1782, 1783, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 971, 973, 0, 813, 815, 816, - 846, 877, 853, 0, 0, 0, 115, 120, 0, 1309, - 108, 0, 0, 0, 108, 0, 0, 0, 108, 0, - 0, 78, 1159, 1254, 79, 1158, 1256, 0, 0, 0, - 0, 0, 0, 0, 356, 357, 0, 0, 351, 339, - 2195, 341, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1103, 1104, 0, 557, 1169, 0, 0, - 0, 1185, 1224, 1235, 0, 0, 0, 0, 0, 1315, - 1089, 1094, 1095, 1096, 1090, 1091, 1097, 1098, 795, 809, - 790, 0, 798, 0, 868, 0, 0, 988, 0, 0, - 627, 693, 694, 940, 631, 0, 0, 638, 2154, 643, - 939, 939, 650, 644, 651, 697, 652, 653, 654, 695, - 939, 939, 874, 692, 695, 677, 696, 695, 1456, 681, - 0, 686, 689, 690, 1456, 709, 1456, 0, 707, 658, - 659, 1317, 870, 460, 461, 466, 468, 0, 521, 521, - 521, 504, 521, 0, 0, 492, 2011, 0, 0, 0, - 0, 501, 2011, 0, 0, 2011, 2011, 2011, 2011, 2011, - 2011, 2011, 0, 0, 2011, 2011, 2011, 2011, 2011, 2011, - 2011, 2011, 2011, 2011, 2011, 0, 2011, 2011, 2011, 2011, - 2011, 1434, 2011, 0, 1251, 511, 512, 513, 514, 519, - 520, 0, 0, 0, 0, 0, 0, 552, 0, 0, - 1102, 0, 557, 0, 0, 1147, 0, 0, 952, 0, - 953, 954, 955, 950, 990, 1014, 1014, 0, 1014, 994, - 1456, 0, 0, 0, 292, 293, 281, 0, 282, 0, - 0, 295, 296, 0, 298, 299, 300, 307, 2089, 2172, - 302, 304, 0, 0, 308, 321, 322, 323, 0, 0, - 313, 314, 0, 0, 376, 377, 379, 0, 877, 1255, - 76, 1242, 736, 1452, 737, 738, 742, 0, 0, 745, - 746, 747, 748, 749, 1068, 0, 0, 1156, 0, 1160, - 1162, 1241, 939, 0, 948, 0, 944, 1020, 0, 1022, - 0, 0, 138, 19, 0, 131, 128, 0, 0, 0, - 0, 0, 1978, 1927, 2007, 0, 0, 0, 1988, 0, - 0, 0, 0, 0, 121, 829, 877, 0, 823, 0, - 881, 882, 885, 777, 806, 0, 810, 0, 0, 802, - 782, 799, 0, 0, 819, 1455, 0, 0, 0, 0, - 0, 1515, 0, 418, 414, 434, 0, 0, 0, 0, - 203, 1172, 0, 204, 208, 198, 0, 0, 0, 1177, - 0, 1174, 1179, 0, 218, 0, 0, 193, 194, 1300, - 1309, 0, 0, 0, 1873, 1875, 1877, 1879, 1881, 0, - 1884, 1894, 1894, 1890, 0, 1885, 0, 1887, 0, 1664, - 1676, 1677, 1665, 1863, 1613, 0, 1661, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 885, 0, 0, 1729, - 1730, 0, 0, 1734, 0, 1736, 1737, 1738, 1740, 0, - 0, 0, 1744, 0, 1789, 1810, 1793, 1796, 0, 1800, - 0, 1802, 1804, 1805, 1806, 0, 0, 0, 879, 879, - 0, 0, 1700, 1700, 1700, 0, 0, 0, 0, 1700, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1633, 0, 1634, 1635, 1636, 0, 1638, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 974, 823, - 0, 0, 0, 0, 0, 1307, 0, 98, 0, 103, - 0, 0, 99, 104, 0, 0, 101, 0, 110, 80, - 0, 0, 1262, 1263, 0, 0, 0, 358, 346, 348, - 0, 340, 0, 1240, 0, 0, 0, 0, -2, 1068, - 870, 0, 870, 1114, 2011, 0, 561, 0, 0, 1171, - 0, 1136, 0, 0, 0, -2, 0, 0, 0, 1235, - 0, 0, 0, 1319, 0, 785, 0, 789, 0, 0, - 794, 786, 23, 871, 0, 0, 0, 761, 765, 626, - 634, 632, 0, 636, 0, 637, 692, 645, 646, 939, - 669, 670, 0, 0, 939, 692, 692, 680, 695, 704, - 0, 705, 1456, 1319, 0, 0, 1250, 1385, 1353, 482, - 0, 1469, 1470, 522, 0, 1476, 1485, 1239, 1553, 0, - 1485, 0, 0, 1487, 1488, 0, 0, 0, 0, 505, - 506, 0, 491, 0, 0, 0, 0, 0, 0, 490, - 0, 0, 532, 0, 0, 0, 0, 0, 2012, 2011, - 2011, 0, 499, 500, 0, 503, 0, 0, 0, 0, - 0, 0, 0, 0, 2011, 2011, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1425, 0, 0, - 0, 0, 0, 0, 0, 1440, 1441, 0, 0, 0, - 0, 0, 1114, 2011, 0, 0, 0, 0, 561, 1166, - 1166, 1134, 1152, 0, 464, 465, 529, 0, 0, 0, - 0, 0, 0, 0, 980, 0, 0, 0, 979, 0, - 0, 0, 0, 0, 0, 0, 870, 1015, 0, 1017, - 1018, 992, -2, 0, 952, 997, 1858, 0, 285, 286, - 0, 0, 291, 309, 311, 283, 0, 0, 0, 310, - 312, 316, 317, 375, 378, 380, 823, 0, 0, 1343, - 0, 1069, 1070, 1072, 1073, 0, -2, -2, -2, -2, - -2, -2, -2, -2, -2, -2, -2, -2, -2, 2072, + -2, -2, -2, -2, -2, 1830, -2, 1832, -2, 1834, + -2, 1837, -2, -2, -2, -2, 1842, 1843, -2, 1845, + -2, -2, -2, -2, -2, -2, -2, 1821, 1822, 1823, + 1824, 1813, 1814, 1815, 1816, 1817, 1818, -2, -2, -2, + 879, 972, 0, 879, 0, 852, 901, 904, 907, 910, + 855, 0, 0, 117, 118, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 354, 355, + 343, 345, 0, 349, 0, 0, 345, 342, 336, 0, + 1241, 1241, 1241, 0, 0, 0, 1241, 1241, 1241, 1241, + 1241, 0, 1241, 0, 0, 0, 0, 0, 1241, 0, + 1087, 1198, 1199, 1200, 1239, 1240, 1344, 0, 0, 0, + 817, 0, 865, 0, 867, 870, 772, 768, 769, 770, + 771, 0, 0, 0, 692, 692, 939, 939, 0, 635, + 0, 0, 0, 692, 0, 649, 641, 0, 0, 0, + 692, 0, 0, 872, 872, 0, 695, 702, 692, 692, + -2, 692, 692, 0, 687, 692, 0, 0, 0, 1255, + 655, 656, 657, 641, 641, 660, 661, 662, 672, 673, + 703, 2010, 0, 0, 559, 559, 0, 559, 0, 559, + 0, 559, 559, 559, 0, 774, 2111, 2206, 2091, 2175, + 2042, 2157, 2370, 0, 301, 2238, 306, 0, 2094, 2114, + 0, 0, 2133, 0, -2, 0, 381, 879, 0, 0, + 851, 0, 0, 0, 0, 559, 559, 559, 559, 559, + 1343, 559, 559, 559, 559, 559, 0, 0, 0, 559, + 0, 559, 559, 559, 0, 915, 916, 918, 919, 920, + 921, 922, 923, 924, 925, 926, 927, 5, 6, 19, + 0, 0, 0, 0, 0, 0, 123, 122, 0, 1979, + 2005, 1930, 1931, 1932, 1992, 1934, 1996, 1996, 1996, 1996, + 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, + 1996, 1996, 0, 0, 1977, 1954, 1994, 1994, 1994, 1992, + 1981, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, + 1944, 1945, 1946, 1947, 1948, 1999, 1999, 2002, 2002, 1999, + 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 0, 445, + 443, 444, 1860, 0, 0, 879, -2, 0, 0, 0, + 0, 821, 1456, 0, 0, 0, 716, 404, 1516, 0, + 0, 408, 0, 409, 0, 0, 411, 0, 0, 0, + 433, 0, 436, 419, 420, 421, 422, 423, 415, 0, + 195, 0, 395, 396, 0, 0, 361, 0, 0, 0, + 560, 0, 0, 0, 0, 0, 0, 226, 222, 230, + 233, 243, 250, 0, 262, 264, 267, 223, 231, 236, + 237, 244, 265, 224, 227, 228, 232, 266, 268, 225, + 245, 249, 263, 247, 252, 255, 256, 261, 0, 196, + 0, 0, 0, 0, 0, 1870, 0, 0, 1903, 1904, + 1905, 1906, 1907, 1908, 1909, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, 1864, 0, + 0, 1611, 1612, 1613, 1614, 0, 1618, 0, 1661, 0, + 0, 0, 0, 0, 0, 1924, 1928, 0, 1860, 1860, + 0, 1860, 1856, 0, 0, 0, 0, 0, 0, 1860, + 1792, 0, 0, 1794, 1810, 0, 0, 1796, 1797, 0, + 1800, 1801, 1860, 0, 1860, 1805, 1860, 1860, 1860, 1786, + 1787, 0, 0, 0, 1856, 1856, 1856, 1856, 0, 0, + 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, + 1856, 1856, 1856, 1856, 1856, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 872, 0, 880, + 0, -2, 0, 898, 900, 902, 903, 905, 906, 908, + 909, 911, 912, 857, 0, 0, 119, 0, 0, 0, + 102, 0, 0, 100, 0, 0, 0, 0, 75, 77, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 347, 0, 352, 338, 2198, 0, 337, + 0, 0, 0, 0, 0, 1048, 0, 0, 1241, 1241, + 1241, 1088, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1241, 1241, 1241, 1241, 0, 1261, 0, 0, 0, + 0, 817, 0, 866, 0, 0, 774, 773, 74, 623, + 624, 625, 0, 939, 0, 0, 628, 629, 0, 630, + 0, 0, 641, 692, 692, 647, 648, 643, 642, 698, + 699, 695, 0, 695, 695, 939, 0, 666, 667, 668, + 692, 692, 674, 873, 0, 675, 676, 695, 0, 700, + 701, 939, 0, 0, 939, 939, 0, 684, 685, 0, + 688, 692, 0, 691, 0, 0, 1241, 0, 708, 643, + 643, 2011, 2012, 0, 0, 1252, 0, 0, 0, 0, + 0, 0, 711, 0, 0, 0, 462, 463, 0, 0, + 775, 0, 280, 284, 0, 287, 0, 2206, 0, 2206, + 0, 0, 294, 0, 0, 0, 0, 0, 0, 324, + 325, 0, 0, 0, 0, 315, 318, 1450, 1451, 1183, + 1184, 319, 320, 373, 374, 0, 872, 897, 899, 893, + 894, 895, 0, 1243, 0, 0, 0, 0, 0, 559, + 0, 0, 0, 0, 0, 750, 0, 1066, 752, 0, + 0, 559, 0, 0, 0, 947, 941, 943, 1019, 155, + 917, 8, 140, 137, 0, 19, 0, 0, 19, 19, + 0, 19, 329, 0, 2008, 2006, 2007, 1933, 1993, 0, + 1959, 0, 1960, 1961, 1962, 1973, 1974, 0, 0, 1955, + 0, 1956, 1957, 1958, 1949, 0, 1950, 1951, 0, 1952, + 1953, 327, 442, 0, 0, 1861, 1052, 0, 872, 849, + 0, 877, 0, 776, 809, 778, 0, 798, 0, 1458, + 0, 0, 0, 0, 559, 0, 405, 0, 416, 410, + 0, 417, 412, 413, 0, 0, 435, 437, 438, 439, + 440, 424, 425, 713, 390, 391, 392, 382, 383, 384, + 385, 386, 387, 388, 389, 0, 0, 394, 165, 0, + 362, 363, 0, 0, 0, 209, 210, 211, 212, 213, + 214, 216, 200, 739, 741, 1175, 1187, 0, 1178, 0, + 219, 260, 192, 0, 0, 0, 1865, 1866, 1867, 1868, + 1869, 1874, 0, 1876, 1878, 1880, 1882, 0, 1900, -2, + -2, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, + 1600, 1601, 1602, 1603, 1604, 1885, 1898, 1899, 0, 0, + 0, 0, 0, 0, 1896, 1896, 1891, 0, 1623, 1665, + 1677, 1677, 1632, 1452, 1453, 1609, 0, 0, 1658, 1662, + 0, 0, 0, 0, 0, 0, 1222, 1992, 0, 156, + 1855, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, + 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, + 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, + 0, 0, 1864, 0, 0, 0, 1857, 1858, 0, 0, + 0, 1741, 0, 0, 1747, 1748, 1749, 0, 804, 0, + 1820, 1793, 1811, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1782, 1783, 1784, 1785, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 971, 973, 0, 813, 815, + 816, 846, 877, 853, 0, 0, 0, 115, 120, 0, + 1311, 108, 0, 0, 0, 108, 0, 0, 0, 108, + 0, 0, 78, 1159, 1256, 79, 1158, 1258, 0, 0, + 0, 0, 0, 0, 0, 356, 357, 0, 0, 351, + 339, 2198, 341, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1103, 1104, 0, 557, 1169, 0, + 0, 0, 1185, 1226, 1237, 0, 0, 0, 0, 0, + 1317, 1089, 1094, 1095, 1096, 1090, 1091, 1097, 1098, 795, + 809, 790, 0, 798, 0, 868, 0, 0, 988, 0, + 0, 627, 693, 694, 940, 631, 0, 0, 638, 2157, + 643, 939, 939, 650, 644, 651, 697, 652, 653, 654, + 695, 939, 939, 874, 692, 695, 677, 696, 695, 1458, + 681, 0, 686, 689, 690, 1458, 709, 1458, 0, 707, + 658, 659, 1319, 870, 460, 461, 466, 468, 0, 521, + 521, 521, 504, 521, 0, 0, 492, 2013, 0, 0, + 0, 0, 501, 2013, 0, 0, 2013, 2013, 2013, 2013, + 2013, 2013, 2013, 0, 0, 2013, 2013, 2013, 2013, 2013, + 2013, 2013, 2013, 2013, 2013, 2013, 0, 2013, 2013, 2013, + 2013, 2013, 1436, 2013, 0, 1253, 511, 512, 513, 514, + 519, 520, 0, 0, 0, 0, 0, 0, 552, 0, + 0, 1102, 0, 557, 0, 0, 1147, 0, 0, 952, + 0, 953, 954, 955, 950, 990, 1014, 1014, 0, 1014, + 994, 1458, 0, 0, 0, 292, 293, 281, 0, 282, + 0, 0, 295, 296, 0, 298, 299, 300, 307, 2091, + 2175, 302, 304, 0, 0, 308, 321, 322, 323, 0, + 0, 313, 314, 0, 0, 376, 377, 379, 0, 877, + 1257, 76, 1244, 736, 1454, 737, 738, 742, 0, 0, + 745, 746, 747, 748, 749, 1068, 0, 0, 1156, 0, + 1160, 1162, 1243, 939, 0, 948, 0, 944, 1020, 0, + 1022, 0, 0, 138, 19, 0, 131, 128, 0, 0, + 0, 0, 0, 1980, 1929, 2009, 0, 0, 0, 1990, + 0, 0, 0, 0, 0, 121, 829, 877, 0, 823, + 0, 881, 882, 885, 777, 806, 0, 810, 0, 0, + 802, 782, 799, 0, 0, 819, 1457, 0, 0, 0, + 0, 0, 1517, 0, 418, 414, 434, 0, 0, 0, + 0, 203, 1172, 0, 204, 208, 198, 0, 0, 0, + 1177, 0, 1174, 1179, 0, 218, 0, 0, 193, 194, + 1302, 1311, 0, 0, 0, 1875, 1877, 1879, 1881, 1883, + 0, 1886, 1896, 1896, 1892, 0, 1887, 0, 1889, 0, + 1666, 1678, 1679, 1667, 1865, 1615, 0, 1663, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 885, 0, 0, + 1731, 1732, 0, 0, 1736, 0, 1738, 1739, 1740, 1742, + 0, 0, 0, 1746, 0, 1791, 1812, 1795, 1798, 0, + 1802, 0, 1804, 1806, 1807, 1808, 0, 0, 0, 879, + 879, 0, 0, 1702, 1702, 1702, 0, 0, 0, 0, + 1702, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1635, 0, 1636, 1637, 1638, 0, 1640, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 974, + 823, 0, 0, 0, 0, 0, 1309, 0, 98, 0, + 103, 0, 0, 99, 104, 0, 0, 101, 0, 110, + 80, 0, 0, 1264, 1265, 0, 0, 0, 358, 346, + 348, 0, 340, 0, 1242, 0, 0, 0, 0, -2, + 1068, 870, 0, 870, 1114, 2013, 0, 561, 0, 0, + 1171, 0, 1136, 0, 0, 0, -2, 0, 0, 0, + 1237, 0, 0, 0, 1321, 0, 785, 0, 789, 0, + 0, 794, 786, 23, 871, 0, 0, 0, 761, 765, + 626, 634, 632, 0, 636, 0, 637, 692, 645, 646, + 939, 669, 670, 0, 0, 939, 692, 692, 680, 695, + 704, 0, 705, 1458, 1321, 0, 0, 1252, 1387, 1355, + 482, 0, 1471, 1472, 522, 0, 1478, 1487, 1241, 1555, + 0, 1487, 0, 0, 1489, 1490, 0, 0, 0, 0, + 505, 506, 0, 491, 0, 0, 0, 0, 0, 0, + 490, 0, 0, 532, 0, 0, 0, 0, 0, 2014, + 2013, 2013, 0, 499, 500, 0, 503, 0, 0, 0, + 0, 0, 0, 0, 0, 2013, 2013, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1427, 0, + 0, 0, 0, 0, 0, 0, 1442, 1443, 0, 0, + 0, 0, 0, 1114, 2013, 0, 0, 0, 0, 561, + 1166, 1166, 1134, 1152, 0, 464, 465, 529, 0, 0, + 0, 0, 0, 0, 0, 980, 0, 0, 0, 979, + 0, 0, 0, 0, 0, 0, 0, 870, 1015, 0, + 1017, 1018, 992, -2, 0, 952, 997, 1860, 0, 285, + 286, 0, 0, 291, 309, 311, 283, 0, 0, 0, + 310, 312, 316, 317, 375, 378, 380, 823, 0, 0, + 1345, 0, 1069, 1070, 1072, 1073, 0, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, + 2074, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, - -2, -2, -2, -2, -2, -2, -2, -2, 1067, 753, - 1157, 0, 1164, 930, 942, 949, 1021, 1023, 156, 945, - 0, 141, 19, 140, 132, 133, 0, 19, 0, 0, - 0, 0, 1996, 1995, 1973, 0, 1974, 1993, 1998, 0, - 2001, 0, 446, 833, 0, 823, 825, 850, 0, 0, - 888, 886, 887, 809, 811, 0, 0, 809, 0, 0, - 818, 0, 0, 0, 0, 0, 0, 1161, 0, 0, - 714, 166, 441, 0, 0, 0, 0, 0, 740, 0, - 1176, 200, 0, 0, 220, 0, 0, 0, 1309, 1304, - 1857, 1886, 1888, 0, 1895, 1891, 1608, 1617, 1657, 0, - 0, 0, 0, 0, 1666, 1994, 1994, 1669, 1990, 1992, - 1990, 1675, 1675, 0, 1221, 0, 1222, 885, 157, 0, - 0, 1735, 0, 0, 0, 805, 0, 0, 0, 0, - 0, 1696, 1698, 1700, 1700, 1707, 1701, 1708, 1709, 1700, - 1700, 1700, 1700, 1714, 1700, 1700, 1700, 1700, 1700, 1700, - 1700, 1700, 1700, 1700, 1700, 1694, 1637, 1639, 0, 1642, - 0, 1645, 1646, 0, 0, 0, 1916, 1917, 814, 847, - 0, 0, 860, 861, 862, 863, 864, 0, 0, 65, - 65, 1309, 0, 0, 0, 0, 0, 114, 0, 0, - 0, 0, 0, 1271, 1279, 0, 350, 0, 81, 82, - 84, 0, 0, 0, 0, 0, 0, 0, 97, 0, - 0, 1054, 1055, 1057, 0, 1060, 1061, 1062, 0, 0, - 1462, 0, 1118, 1115, 1116, 1117, 0, 0, 1166, 562, - 563, 564, 565, 0, 0, 0, 1170, 0, 0, 0, - 1127, 0, 0, 0, 1225, 1226, 1227, 1228, 1229, 1230, - 1231, 1232, -2, 1245, 0, 1456, 0, 0, 0, 1462, - 1291, 0, 0, 1296, 0, 0, 1462, 1462, 0, 1327, - 0, 1316, 0, 0, 809, 0, 989, 817, 0, -2, - 0, 0, 763, 0, 633, 639, 939, 663, 875, 876, - 1456, 939, 939, 692, 710, 706, 1327, 1318, 0, 467, - 521, 0, 1373, 0, 0, 1379, 0, 1386, 475, 0, - 523, 0, 1475, 1503, 1486, 1503, 1554, 1503, 1503, 1239, - 0, 523, 0, 0, 493, 0, 0, 0, 0, 0, - 489, 526, 885, 476, 478, 479, 480, 530, 531, 533, - 0, 535, 536, 495, 507, 508, 509, 510, 0, 0, - 0, 502, 515, 516, 517, 518, 477, 1402, 1403, 1404, - 1407, 1408, 1409, 1410, 0, 0, 1413, 1414, 1415, 1416, - 1417, 1500, 1501, 1502, 1418, 1419, 1420, 1421, 1422, 1423, - 1424, 1442, 1443, 1444, 1445, 1446, 1447, 1426, 1427, 1428, - 1429, 1430, 1431, 1432, 1433, 0, 0, 1437, 0, 0, - 0, 472, 0, 0, 1118, 0, 0, 0, 0, 0, - 1166, 555, 0, 0, 556, 1136, 0, 1154, 0, 1148, - 1149, 0, 0, 787, 939, 368, 0, 984, 975, 0, - 959, 0, 961, 981, 962, 982, 0, 0, 966, 0, - 968, 0, 964, 965, 970, 963, 939, 951, 991, 1016, - 993, 996, 998, 999, 1005, 0, 0, 0, 0, 279, - 288, 289, 290, 297, 0, 581, 303, 891, 1453, 743, - 744, 1344, 1345, 751, 0, 1074, 0, 928, 0, 0, - 136, 139, 0, 134, 0, 0, 0, 0, 126, 124, - 1989, 0, 0, 835, 180, 0, 0, 891, 827, 0, - 0, 883, 884, 0, 807, 0, 812, 809, 781, 803, - 780, 800, 801, 820, 1457, 1458, 1459, 1460, 0, 1516, - 406, 0, 1173, 200, 205, 206, 207, 201, 199, 1180, - 0, 1182, 0, 1302, 0, 0, 1892, 1662, 1618, 0, - 1620, 1622, 1667, 1668, 1670, 1671, 1672, 1673, 1674, 1623, - 0, 1223, 1731, 0, 1733, 1741, 1742, 0, 1797, 1801, - 0, 0, 1788, 0, 0, 0, 0, 1705, 1706, 1710, - 1711, 1712, 1713, 1715, 1716, 1717, 1718, 1719, 1720, 1721, - 1722, 1723, 1724, 1725, 879, 1695, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 858, 0, - 0, 0, 67, 0, 67, 1308, 1310, 109, 111, 0, - 105, 106, 107, 1019, 1285, 1456, 1273, 0, 1265, 0, - 1279, 0, 0, 0, 83, 0, 85, 0, 2157, 0, - 0, 0, 0, 1241, 1047, 1063, 1059, 0, 0, 0, - 0, 1463, 1464, 1466, 1467, 1468, 0, 1085, 0, 0, - 1106, 1107, 1108, 1132, 1120, 0, 567, 568, 0, 0, - 0, 580, 576, 577, 578, 558, 1165, 1143, 0, 0, - 1143, 1130, 0, 0, 1142, 0, 1246, 2011, 2011, 2011, - 1285, 0, 0, 0, 1387, 2011, 2011, 0, 1293, 1295, - 1285, 0, 0, 0, 1391, 1330, 0, 0, 1321, 0, - 0, 809, 793, 792, 869, 1014, 0, 0, 939, 762, - 765, 766, 640, 678, 682, 679, 939, 1330, 459, 1351, - 0, 0, 0, 0, 0, 1383, 0, 0, 1355, 0, - 494, 524, 0, -2, 0, 1504, 0, 1489, 1504, 0, - 0, 1503, 0, 483, 523, 0, 0, 0, 537, 0, - 543, 544, 1202, 540, 541, 1549, 0, 542, 0, 528, - 0, 534, 1405, 1406, 0, 1411, 1412, 0, 1436, 0, - 0, 470, 0, 0, 0, 547, 0, 0, 0, 548, - 549, 554, 1167, 1168, 1127, 0, 1143, 0, 1153, 0, - 1150, 1151, 879, 0, 0, 956, 985, 0, 0, 957, - 0, 958, 960, 983, 0, 977, 967, 969, 367, 1000, - 0, 0, 1002, 1003, 1004, 995, 305, 845, 0, 1071, - 0, 0, 913, 0, 0, 946, 0, 19, 0, 0, - 129, 1999, 2002, 837, 0, 834, 181, 0, 0, 0, - 848, 829, 0, 826, 0, 889, 890, 808, 779, 1461, - 202, 197, 1181, 1312, 0, 1303, 0, 1573, 1632, 0, - 1743, 0, 0, 1700, 1697, 1700, 1699, 1691, 0, 1640, - 0, 1643, 0, 1647, 1648, 0, 1650, 1651, 1652, 0, - 1654, 1655, 0, 856, 0, 63, 0, 66, 64, 0, - 113, 1260, 0, 1285, 1264, 0, 0, 0, 1266, 0, - 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, - 0, 95, 0, 0, 1056, 1058, 0, 1092, 1391, 0, - 1092, 1119, 1105, 0, 1086, 0, 0, 569, 570, 0, - 573, 579, 1121, 0, 0, 1124, 1125, 1123, 1126, 0, - 0, 1140, 0, 0, 0, 0, 1233, 0, 1236, 1252, - 0, 0, 0, -2, 1297, 0, 0, -2, 1290, 0, - 1336, 0, 1328, 0, 1320, 0, 1323, 0, 797, 791, - 939, 939, -2, 759, 764, 0, 683, 1336, 1353, 0, - 1374, 0, 0, 0, 0, 0, 0, 0, 1354, 0, - 1367, 525, 1505, -2, 1519, 1521, 0, 1251, 1524, 1525, - 0, 0, 0, 0, 0, 0, 1580, 1533, 0, 0, - 0, 1538, 1539, 1540, 0, 0, 1543, 0, 0, 0, - 1910, 1911, 0, 1552, 0, 0, 0, 0, 0, 0, - 0, 1483, 484, 485, 0, 487, 488, 1202, 0, 539, - 1550, 527, 481, 2011, 497, 1435, 1438, 1439, 471, 0, - 0, 553, 550, 551, 1130, 1135, 1146, 1155, 788, 872, - 369, 370, 986, 0, 976, 978, 1009, 1006, 0, 0, - 892, 1075, 1163, 929, 937, 2390, 2392, 2389, 130, 135, - 0, 0, 839, 0, 836, 0, 830, 832, 191, 833, - 828, 878, 151, 183, 0, 0, 1619, 0, 0, 0, - 1732, 1786, 1787, 1703, 1704, 0, 1692, 0, 1686, 1687, - 1688, 1693, 0, 0, 0, 0, 859, 854, 68, 112, - 0, 1261, 0, 0, 0, 1277, 1278, 0, 1280, 1281, - 1282, 0, 0, 0, 0, -2, 72, 0, 0, 0, - 1241, 0, 1241, 0, 0, 0, 1050, 1064, 0, 1077, - 1084, 1099, 1257, 1465, 1083, 0, 0, 0, 566, 571, - 0, 574, 575, 1144, 1143, 0, 1128, 1129, 0, 1138, - 0, 0, 1247, 1248, 1249, 1132, 1388, 1389, 1390, 1346, - 1292, 0, -2, 1399, 0, 0, 1288, 1312, 1346, 0, - 1324, 0, 1331, 0, 1329, 1322, 796, 879, 760, 1333, - 469, 1385, 1375, 0, 1377, 0, 0, 0, 0, 1356, - -2, 0, 1520, 1522, 1523, 1526, 1527, 1528, 1585, 1586, - 1587, 0, 0, 1531, 1582, 1583, 1584, 1532, 0, 0, - 0, 1537, 0, 0, 0, 0, 1908, 1909, 1578, 0, - 0, 1490, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, - 1491, 0, 0, 0, 1482, 1484, 486, 538, 0, 1203, - 2011, 2011, 0, 0, 0, 1209, 1210, 2011, 2011, 2011, - 1214, 1215, 0, 2011, 2011, 0, 2011, 0, 0, 1145, - 366, 0, 0, 1010, 1012, 1007, 1008, 931, 0, 0, - 0, 0, 125, 127, 142, 0, 838, 182, 0, 835, - 153, 0, 174, 0, 1313, 0, 1631, 0, 0, 0, - 1702, 1689, 0, 0, 0, 0, 0, 1912, 1913, 1914, - 0, 1641, 1644, 1649, 1653, 1286, 1274, 1275, 1276, 1272, - 0, 0, 1283, 1284, 0, 70, 0, 89, 0, 0, - 90, 1241, 91, 1241, 0, 0, 0, 0, 1100, 1101, - 1109, 1110, 0, 1112, 1113, 1133, 572, 1122, 1131, 1137, - 1140, 0, 1202, 1234, 1348, 0, 1294, 1250, 1401, 2011, - 1132, 1299, 1348, 0, 1393, 2011, 2011, 1314, 0, 1326, - 0, 1338, 0, 1332, 872, 458, 0, 1335, 1371, 1376, - 1378, 1380, 0, 1384, 1382, 1357, -2, 0, 1365, 0, - 0, 1529, 1530, 0, 0, 1807, 2011, 0, 0, 0, - 1568, 0, 1202, 1202, 1202, 1202, 0, 545, 546, 0, - 0, 1206, 1207, 0, 0, 0, 0, 0, 0, 0, - 496, 0, 0, 474, 987, 1001, 0, 938, 0, 0, - 0, 0, 0, 837, 143, 0, 152, 171, 0, 184, - 185, 0, 0, 0, 0, 1305, 0, 1576, 1577, 0, - 1678, 0, 0, 0, 1682, 1683, 1684, 1685, 1279, 1279, - 1241, 72, 0, 88, 0, 92, 93, 0, 1241, 0, - 1076, 0, 1111, 1139, 1141, 1201, 1287, 0, 1385, 1400, - 0, 1298, 1289, 1392, 0, 0, 0, 1325, 1337, 0, - 1340, 758, 1334, 1352, 0, 1381, 1358, 1366, 0, 1361, - 0, 0, 0, 1581, 0, 1536, 0, 1542, 0, 1546, - 1556, 1569, 0, 0, 1471, 0, 1473, 0, 1477, 0, - 1479, 0, 0, 1204, 1205, 1208, 1211, 1212, 1213, 1216, - 1217, 1218, 1219, 498, 473, 1011, 1013, 0, 1858, 933, - 934, 0, 841, 831, 839, 154, 158, 0, 180, 177, - 0, 186, 0, 0, 0, 0, 1301, 0, 1574, 0, - 1679, 1680, 1681, 1267, 1279, 1268, 1279, 69, 71, 73, - 87, 1241, 94, 0, 1078, 1079, 1093, 0, 1373, 1405, - 1394, 1395, 1396, 1339, 1372, 1360, 0, -2, 1368, 0, - 0, 1860, 1870, 1871, 1534, 1541, 0, 1545, 1547, 1548, - 1555, 1557, 1558, 0, 1570, 1571, 1572, 1579, 1202, 1202, - 1202, 1202, 1481, 932, 0, 0, 840, 0, 824, 145, - 0, 0, 175, 176, 178, 0, 187, 0, 189, 190, - 0, 0, 1690, 1269, 1270, 96, 1080, 1349, 0, 1351, - 1362, -2, 0, 1370, 0, 1535, 1546, 1559, 0, 1560, - 0, 0, 0, 1472, 1474, 1478, 1480, 1858, 935, 842, - 1311, 0, 159, 0, 161, 163, 164, 1506, 172, 173, - 179, 188, 0, 0, 1065, 1081, 0, 0, 1353, 1369, - 1861, 1544, 1561, 1563, 1564, 0, 0, 1562, 0, 146, - 147, 0, 160, 0, 0, 1306, 1575, 1082, 1350, 1347, - 1565, 1567, 1566, 936, 0, 0, 162, 1507, 148, 149, - 150, 0, 1508, + -2, -2, -2, -2, -2, -2, -2, -2, -2, 1067, + 753, 1157, 0, 1164, 930, 942, 949, 1021, 1023, 156, + 945, 0, 141, 19, 140, 132, 133, 0, 19, 0, + 0, 0, 0, 1998, 1997, 1975, 0, 1976, 1995, 2000, + 0, 2003, 0, 446, 833, 0, 823, 825, 850, 0, + 0, 888, 886, 887, 809, 811, 0, 0, 809, 0, + 0, 818, 0, 0, 0, 0, 0, 0, 1161, 0, + 0, 714, 166, 441, 0, 0, 0, 0, 0, 740, + 0, 1176, 200, 0, 0, 220, 0, 0, 0, 1311, + 1306, 1859, 1888, 1890, 0, 1897, 1893, 1610, 1619, 1659, + 0, 0, 0, 0, 0, 1668, 1996, 1996, 1671, 1992, + 1994, 1992, 1677, 1677, 0, 1223, 0, 1224, 885, 157, + 0, 0, 1737, 0, 0, 0, 805, 0, 0, 0, + 0, 0, 1698, 1700, 1702, 1702, 1709, 1703, 1710, 1711, + 1702, 1702, 1702, 1702, 1716, 1702, 1702, 1702, 1702, 1702, + 1702, 1702, 1702, 1702, 1702, 1702, 1696, 1639, 1641, 0, + 1644, 0, 1647, 1648, 0, 0, 0, 1918, 1919, 814, + 847, 0, 0, 860, 861, 862, 863, 864, 0, 0, + 65, 65, 1311, 0, 0, 0, 0, 0, 114, 0, + 0, 0, 0, 0, 1273, 1281, 0, 350, 0, 81, + 82, 84, 0, 0, 0, 0, 0, 0, 0, 97, + 0, 0, 1054, 1055, 1057, 0, 1060, 1061, 1062, 0, + 0, 1464, 0, 1118, 1115, 1116, 1117, 0, 0, 1166, + 562, 563, 564, 565, 0, 0, 0, 1170, 0, 0, + 0, 1127, 0, 0, 0, 1227, 1228, 1229, 1230, 1231, + 1232, 1233, 1234, -2, 1247, 0, 1458, 0, 0, 0, + 1464, 1293, 0, 0, 1298, 0, 0, 1464, 1464, 0, + 1329, 0, 1318, 0, 0, 809, 0, 989, 817, 0, + -2, 0, 0, 763, 0, 633, 639, 939, 663, 875, + 876, 1458, 939, 939, 692, 710, 706, 1329, 1320, 0, + 467, 521, 0, 1375, 0, 0, 1381, 0, 1388, 475, + 0, 523, 0, 1477, 1505, 1488, 1505, 1556, 1505, 1505, + 1241, 0, 523, 0, 0, 493, 0, 0, 0, 0, + 0, 489, 526, 885, 476, 478, 479, 480, 530, 531, + 533, 0, 535, 536, 495, 507, 508, 509, 510, 0, + 0, 0, 502, 515, 516, 517, 518, 477, 1404, 1405, + 1406, 1409, 1410, 1411, 1412, 0, 0, 1415, 1416, 1417, + 1418, 1419, 1502, 1503, 1504, 1420, 1421, 1422, 1423, 1424, + 1425, 1426, 1444, 1445, 1446, 1447, 1448, 1449, 1428, 1429, + 1430, 1431, 1432, 1433, 1434, 1435, 0, 0, 1439, 0, + 0, 0, 472, 0, 0, 1118, 0, 0, 0, 0, + 0, 1166, 555, 0, 0, 556, 1136, 0, 1154, 0, + 1148, 1149, 0, 0, 787, 939, 368, 0, 984, 975, + 0, 959, 0, 961, 981, 962, 982, 0, 0, 966, + 0, 968, 0, 964, 965, 970, 963, 939, 951, 991, + 1016, 993, 996, 998, 999, 1005, 0, 0, 0, 0, + 279, 288, 289, 290, 297, 0, 581, 303, 891, 1455, + 743, 744, 1346, 1347, 751, 0, 1074, 0, 928, 0, + 0, 136, 139, 0, 134, 0, 0, 0, 0, 126, + 124, 1991, 0, 0, 835, 180, 0, 0, 891, 827, + 0, 0, 883, 884, 0, 807, 0, 812, 809, 781, + 803, 780, 800, 801, 820, 1459, 1460, 1461, 1462, 0, + 1518, 406, 0, 1173, 200, 205, 206, 207, 201, 199, + 1180, 0, 1182, 0, 1304, 0, 0, 1894, 1664, 1620, + 0, 1622, 1624, 1669, 1670, 1672, 1673, 1674, 1675, 1676, + 1625, 0, 1225, 1733, 0, 1735, 1743, 1744, 0, 1799, + 1803, 0, 0, 1790, 0, 0, 0, 0, 1707, 1708, + 1712, 1713, 1714, 1715, 1717, 1718, 1719, 1720, 1721, 1722, + 1723, 1724, 1725, 1726, 1727, 879, 1697, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 858, + 0, 0, 0, 67, 0, 67, 1310, 1312, 109, 111, + 0, 105, 106, 107, 1019, 1287, 1458, 1275, 0, 1267, + 0, 1281, 0, 0, 0, 83, 0, 85, 0, 2160, + 0, 0, 0, 0, 1243, 1047, 1063, 1059, 0, 0, + 0, 0, 1465, 1466, 1468, 1469, 1470, 0, 1085, 0, + 0, 1106, 1107, 1108, 1132, 1120, 0, 567, 568, 0, + 0, 0, 580, 576, 577, 578, 558, 1165, 1143, 0, + 0, 1143, 1130, 0, 0, 1142, 0, 1248, 2013, 2013, + 2013, 1287, 0, 0, 0, 1389, 2013, 2013, 0, 1295, + 1297, 1287, 0, 0, 0, 1393, 1332, 0, 0, 1323, + 0, 0, 809, 793, 792, 869, 1014, 0, 0, 939, + 762, 765, 766, 640, 678, 682, 679, 939, 1332, 459, + 1353, 0, 0, 0, 0, 0, 1385, 0, 0, 1357, + 0, 494, 524, 0, -2, 0, 1506, 0, 1491, 1506, + 0, 0, 1505, 0, 483, 523, 0, 0, 0, 537, + 0, 543, 544, 1202, 540, 541, 1551, 0, 542, 0, + 528, 0, 534, 1407, 1408, 0, 1413, 1414, 0, 1438, + 0, 0, 470, 0, 0, 0, 547, 0, 0, 0, + 548, 549, 554, 1167, 1168, 1127, 0, 1143, 0, 1153, + 0, 1150, 1151, 879, 0, 0, 956, 985, 0, 0, + 957, 0, 958, 960, 983, 0, 977, 967, 969, 367, + 1000, 0, 0, 1002, 1003, 1004, 995, 305, 845, 0, + 1071, 0, 0, 913, 0, 0, 946, 0, 19, 0, + 0, 129, 2001, 2004, 837, 0, 834, 181, 0, 0, + 0, 848, 829, 0, 826, 0, 889, 890, 808, 779, + 1463, 202, 197, 1181, 1314, 0, 1305, 0, 1575, 1634, + 0, 1745, 0, 0, 1702, 1699, 1702, 1701, 1693, 0, + 1642, 0, 1645, 0, 1649, 1650, 0, 1652, 1653, 1654, + 0, 1656, 1657, 0, 856, 0, 63, 0, 66, 64, + 0, 113, 1262, 0, 1287, 1266, 0, 0, 0, 1268, + 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, + 0, 0, 95, 0, 0, 1056, 1058, 0, 1092, 1393, + 0, 1092, 1119, 1105, 0, 1086, 0, 0, 569, 570, + 0, 573, 579, 1121, 0, 0, 1124, 1125, 1123, 1126, + 0, 0, 1140, 0, 0, 0, 0, 1235, 0, 1238, + 1254, 0, 0, 0, -2, 1299, 0, 0, -2, 1292, + 0, 1338, 0, 1330, 0, 1322, 0, 1325, 0, 797, + 791, 939, 939, -2, 759, 764, 0, 683, 1338, 1355, + 0, 1376, 0, 0, 0, 0, 0, 0, 0, 1356, + 0, 1369, 525, 1507, -2, 1521, 1523, 0, 1253, 1526, + 1527, 0, 0, 0, 0, 0, 0, 1582, 1535, 0, + 0, 0, 1540, 1541, 1542, 0, 0, 1545, 0, 0, + 0, 1912, 1913, 0, 1554, 0, 0, 0, 0, 0, + 0, 0, 1485, 484, 485, 0, 487, 488, 1202, 0, + 539, 1552, 527, 481, 2013, 497, 1437, 1440, 1441, 471, + 0, 0, 553, 550, 551, 1130, 1135, 1146, 1155, 788, + 872, 369, 370, 986, 0, 976, 978, 1009, 1006, 0, + 0, 892, 1075, 1163, 929, 937, 2393, 2395, 2392, 130, + 135, 0, 0, 839, 0, 836, 0, 830, 832, 191, + 833, 828, 878, 151, 183, 0, 0, 1621, 0, 0, + 0, 1734, 1788, 1789, 1705, 1706, 0, 1694, 0, 1688, + 1689, 1690, 1695, 0, 0, 0, 0, 859, 854, 68, + 112, 0, 1263, 0, 0, 0, 1279, 1280, 0, 1282, + 1283, 1284, 0, 0, 0, 0, -2, 72, 0, 0, + 0, 1243, 0, 1243, 0, 0, 0, 1050, 1064, 0, + 1077, 1084, 1099, 1259, 1467, 1083, 0, 0, 0, 566, + 571, 0, 574, 575, 1144, 1143, 0, 1128, 1129, 0, + 1138, 0, 0, 1249, 1250, 1251, 1132, 1390, 1391, 1392, + 1348, 1294, 0, -2, 1401, 0, 0, 1290, 1314, 1348, + 0, 1326, 0, 1333, 0, 1331, 1324, 796, 879, 760, + 1335, 469, 1387, 1377, 0, 1379, 0, 0, 0, 0, + 1358, -2, 0, 1522, 1524, 1525, 1528, 1529, 1530, 1587, + 1588, 1589, 0, 0, 1533, 1584, 1585, 1586, 1534, 0, + 0, 0, 1539, 0, 0, 0, 0, 1910, 1911, 1580, + 0, 0, 1492, 1494, 1495, 1496, 1497, 1498, 1499, 1500, + 1501, 1493, 0, 0, 0, 1484, 1486, 486, 538, 0, + 1203, 2013, 2013, 0, 0, 0, 1209, 1210, 2013, 2013, + 2013, 1214, 1215, 0, 2013, 2013, 2013, 0, 0, 2013, + 0, 0, 1145, 366, 0, 0, 1010, 1012, 1007, 1008, + 931, 0, 0, 0, 0, 125, 127, 142, 0, 838, + 182, 0, 835, 153, 0, 174, 0, 1315, 0, 1633, + 0, 0, 0, 1704, 1691, 0, 0, 0, 0, 0, + 1914, 1915, 1916, 0, 1643, 1646, 1651, 1655, 1288, 1276, + 1277, 1278, 1274, 0, 0, 1285, 1286, 0, 70, 0, + 89, 0, 0, 90, 1243, 91, 1243, 0, 0, 0, + 0, 1100, 1101, 1109, 1110, 0, 1112, 1113, 1133, 572, + 1122, 1131, 1137, 1140, 0, 1202, 1236, 1350, 0, 1296, + 1252, 1403, 2013, 1132, 1301, 1350, 0, 1395, 2013, 2013, + 1316, 0, 1328, 0, 1340, 0, 1334, 872, 458, 0, + 1337, 1373, 1378, 1380, 1382, 0, 1386, 1384, 1359, -2, + 0, 1367, 0, 0, 1531, 1532, 0, 0, 1809, 2013, + 0, 0, 0, 1570, 0, 1202, 1202, 1202, 1202, 0, + 545, 546, 0, 0, 1206, 1207, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 496, 0, 0, 474, 987, + 1001, 0, 938, 0, 0, 0, 0, 0, 837, 143, + 0, 152, 171, 0, 184, 185, 0, 0, 0, 0, + 1307, 0, 1578, 1579, 0, 1680, 0, 0, 0, 1684, + 1685, 1686, 1687, 1281, 1281, 1243, 72, 0, 88, 0, + 92, 93, 0, 1243, 0, 1076, 0, 1111, 1139, 1141, + 1201, 1289, 0, 1387, 1402, 0, 1300, 1291, 1394, 0, + 0, 0, 1327, 1339, 0, 1342, 758, 1336, 1354, 0, + 1383, 1360, 1368, 0, 1363, 0, 0, 0, 1583, 0, + 1538, 0, 1544, 0, 1548, 1558, 1571, 0, 0, 1473, + 0, 1475, 0, 1479, 0, 1481, 0, 0, 1204, 1205, + 1208, 1211, 1212, 1213, 1216, 1217, 1218, 1219, 1220, 0, + 498, 473, 1011, 1013, 0, 1860, 933, 934, 0, 841, + 831, 839, 154, 158, 0, 180, 177, 0, 186, 0, + 0, 0, 0, 1303, 0, 1576, 0, 1681, 1682, 1683, + 1269, 1281, 1270, 1281, 69, 71, 73, 87, 1243, 94, + 0, 1078, 1079, 1093, 0, 1375, 1407, 1396, 1397, 1398, + 1341, 1374, 1362, 0, -2, 1370, 0, 0, 1862, 1872, + 1873, 1536, 1543, 0, 1547, 1549, 1550, 1557, 1559, 1560, + 0, 1572, 1573, 1574, 1581, 1202, 1202, 1202, 1202, 1483, + 1221, 932, 0, 0, 840, 0, 824, 145, 0, 0, + 175, 176, 178, 0, 187, 0, 189, 190, 0, 0, + 1692, 1271, 1272, 96, 1080, 1351, 0, 1353, 1364, -2, + 0, 1372, 0, 1537, 1548, 1561, 0, 1562, 0, 0, + 0, 1474, 1476, 1480, 1482, 1860, 935, 842, 1313, 0, + 159, 0, 161, 163, 164, 1508, 172, 173, 179, 188, + 0, 0, 1065, 1081, 0, 0, 1355, 1371, 1863, 1546, + 1563, 1565, 1566, 0, 0, 1564, 0, 146, 147, 0, + 160, 0, 0, 1308, 1577, 1082, 1352, 1349, 1567, 1569, + 1568, 936, 0, 0, 162, 1509, 148, 149, 150, 0, + 1510, } var yyTok1 = [...]int{ @@ -11295,14 +11348,14 @@ var yyTok1 = [...]int{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 121, 3, 3, 3, 154, 144, 3, 88, 89, 151, 149, 174, 150, 173, 152, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 712, 709, - 131, 130, 132, 3, 713, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 714, 711, + 131, 130, 132, 3, 715, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 156, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 710, 143, 711, 157, + 3, 3, 3, 712, 143, 713, 157, } var yyTok2 = [...]int{ @@ -11421,7 +11474,8 @@ var yyTok3 = [...]int{ 58015, 690, 58016, 691, 58017, 692, 58018, 693, 58019, 694, 58020, 695, 58021, 696, 58022, 697, 58023, 698, 58024, 699, 58025, 700, 58026, 701, 58027, 702, 58028, 703, 58029, 704, - 58030, 705, 58031, 706, 58032, 707, 58033, 708, 0, + 58030, 705, 58031, 706, 58032, 707, 58033, 708, 58034, 709, + 58035, 710, 0, } var yyErrorMessages = [...]struct { @@ -21310,8 +21364,12 @@ yydefault: opt1.HnswM = opt2.HnswM } else if opt2.HnswEfConstruction > 0 { opt1.HnswEfConstruction = opt2.HnswEfConstruction + } else if len(opt2.HnswQuantization) > 0 { + opt1.HnswQuantization = opt2.HnswQuantization } else if opt2.HnswEfSearch > 0 { opt1.HnswEfSearch = opt2.HnswEfSearch + } else if len(opt2.IncludeColumns) > 0 { + opt1.IncludeColumns = opt2.IncludeColumns } else if opt2.Async { opt1.Async = opt2.Async } else if opt2.ForceSync { @@ -21330,7 +21388,7 @@ yydefault: case 1204: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:7965 +//line mysql_sql.y:7969 { io := tree.NewIndexOption() io.KeyBlockSize = uint64(yyDollar[3].item.(int64)) @@ -21340,7 +21398,7 @@ yydefault: case 1205: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:7971 +//line mysql_sql.y:7975 { val := int64(yyDollar[3].item.(int64)) if val <= 0 { @@ -21356,7 +21414,7 @@ yydefault: case 1206: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:7983 +//line mysql_sql.y:7987 { io := tree.NewIndexOption() io.AlgoParamVectorOpType = yyDollar[2].str @@ -21366,7 +21424,7 @@ yydefault: case 1207: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:7989 +//line mysql_sql.y:7993 { io := tree.NewIndexOption() io.Comment = yyDollar[2].str @@ -21376,7 +21434,7 @@ yydefault: case 1208: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:7995 +//line mysql_sql.y:7999 { io := tree.NewIndexOption() io.ParserName = yyDollar[3].cstrUnion().Compare() @@ -21386,7 +21444,7 @@ yydefault: case 1209: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:8001 +//line mysql_sql.y:8005 { io := tree.NewIndexOption() io.Visible = tree.VISIBLE_TYPE_VISIBLE @@ -21396,7 +21454,7 @@ yydefault: case 1210: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:8007 +//line mysql_sql.y:8011 { io := tree.NewIndexOption() io.Visible = tree.VISIBLE_TYPE_INVISIBLE @@ -21406,7 +21464,7 @@ yydefault: case 1211: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:8013 +//line mysql_sql.y:8017 { val := int64(yyDollar[3].item.(int64)) if val <= 0 { @@ -21421,7 +21479,7 @@ yydefault: case 1212: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:8024 +//line mysql_sql.y:8028 { val := int64(yyDollar[3].item.(int64)) if val <= 0 { @@ -21436,7 +21494,7 @@ yydefault: case 1213: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:8035 +//line mysql_sql.y:8039 { val := int64(yyDollar[3].item.(int64)) if val <= 0 { @@ -21451,7 +21509,7 @@ yydefault: case 1214: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:8046 +//line mysql_sql.y:8050 { io := tree.NewIndexOption() io.Async = true @@ -21461,7 +21519,7 @@ yydefault: case 1215: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:8052 +//line mysql_sql.y:8056 { io := tree.NewIndexOption() io.ForceSync = true @@ -21471,7 +21529,7 @@ yydefault: case 1216: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:8058 +//line mysql_sql.y:8062 { io := tree.NewIndexOption() io.AutoUpdate = true @@ -21481,7 +21539,7 @@ yydefault: case 1217: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:8064 +//line mysql_sql.y:8068 { io := tree.NewIndexOption() io.AutoUpdate = false @@ -21491,7 +21549,7 @@ yydefault: case 1218: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:8070 +//line mysql_sql.y:8074 { val := int64(yyDollar[3].item.(int64)) if val < 0 { @@ -21506,7 +21564,7 @@ yydefault: case 1219: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:8081 +//line mysql_sql.y:8085 { val := int64(yyDollar[3].item.(int64)) if val < 0 || val > 23 { @@ -21519,25 +21577,45 @@ yydefault: } yyVAL.union = yyLOCAL case 1220: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL *tree.IndexOption +//line mysql_sql.y:8096 + { + io := tree.NewIndexOption() + io.HnswQuantization = yyDollar[3].str + yyLOCAL = io + } + yyVAL.union = yyLOCAL + case 1221: + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL *tree.IndexOption +//line mysql_sql.y:8102 + { + io := tree.NewIndexOption() + io.IncludeColumns = yyDollar[3].unresolveNamesUnion() + yyLOCAL = io + } + yyVAL.union = yyLOCAL + case 1222: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.KeyPart -//line mysql_sql.y:8095 +//line mysql_sql.y:8110 { yyLOCAL = []*tree.KeyPart{yyDollar[1].keyPartUnion()} } yyVAL.union = yyLOCAL - case 1221: + case 1223: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.KeyPart -//line mysql_sql.y:8099 +//line mysql_sql.y:8114 { yyLOCAL = append(yyDollar[1].keyPartsUnion(), yyDollar[3].keyPartUnion()) } yyVAL.union = yyLOCAL - case 1222: + case 1224: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.KeyPart -//line mysql_sql.y:8105 +//line mysql_sql.y:8120 { // Order is parsed but just ignored as MySQL dtree. var ColName = yyDollar[1].unresolvedNameUnion() @@ -21552,10 +21630,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1223: + case 1225: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.KeyPart -//line mysql_sql.y:8119 +//line mysql_sql.y:8134 { var ColName *tree.UnresolvedName var Length int @@ -21569,74 +21647,74 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1224: + case 1226: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:8133 +//line mysql_sql.y:8148 { yyLOCAL = tree.INDEX_TYPE_INVALID } yyVAL.union = yyLOCAL - case 1225: + case 1227: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:8137 +//line mysql_sql.y:8152 { yyLOCAL = tree.INDEX_TYPE_BTREE } yyVAL.union = yyLOCAL - case 1226: + case 1228: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:8141 +//line mysql_sql.y:8156 { yyLOCAL = tree.INDEX_TYPE_IVFFLAT } yyVAL.union = yyLOCAL - case 1227: + case 1229: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:8145 +//line mysql_sql.y:8160 { yyLOCAL = tree.INDEX_TYPE_HNSW } yyVAL.union = yyLOCAL - case 1228: + case 1230: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:8149 +//line mysql_sql.y:8164 { yyLOCAL = tree.INDEX_TYPE_MASTER } yyVAL.union = yyLOCAL - case 1229: + case 1231: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:8153 +//line mysql_sql.y:8168 { yyLOCAL = tree.INDEX_TYPE_HASH } yyVAL.union = yyLOCAL - case 1230: + case 1232: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:8157 +//line mysql_sql.y:8172 { yyLOCAL = tree.INDEX_TYPE_RTREE } yyVAL.union = yyLOCAL - case 1231: + case 1233: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:8161 +//line mysql_sql.y:8176 { yyLOCAL = tree.INDEX_TYPE_BSI } yyVAL.union = yyLOCAL - case 1232: + case 1234: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8167 +//line mysql_sql.y:8182 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Name = tree.Identifier(yyDollar[4].str) @@ -21650,10 +21728,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1233: + case 1235: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8181 +//line mysql_sql.y:8196 { var t = tree.NewCloneDatabase() t.DstDatabase = tree.Identifier(yyDollar[4].str) @@ -21663,10 +21741,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1234: + case 1236: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8190 +//line mysql_sql.y:8205 { var DbName = tree.Identifier(yyDollar[4].str) var FromUri = yyDollar[6].str @@ -21684,92 +21762,92 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1235: + case 1237: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.SubscriptionOption -//line mysql_sql.y:8208 +//line mysql_sql.y:8223 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1236: + case 1238: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.SubscriptionOption -//line mysql_sql.y:8212 +//line mysql_sql.y:8227 { var From = tree.Identifier(yyDollar[2].str) var Publication = tree.Identifier(yyDollar[4].cstrUnion().Compare()) yyLOCAL = tree.NewSubscriptionOption(From, Publication) } yyVAL.union = yyLOCAL - case 1239: + case 1241: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8223 +//line mysql_sql.y:8238 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1240: + case 1242: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8227 +//line mysql_sql.y:8242 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1241: + case 1243: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8232 +//line mysql_sql.y:8247 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1242: + case 1244: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8236 +//line mysql_sql.y:8251 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1243: + case 1245: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:8241 +//line mysql_sql.y:8256 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1244: + case 1246: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:8245 +//line mysql_sql.y:8260 { yyLOCAL = yyDollar[1].createOptionsUnion() } yyVAL.union = yyLOCAL - case 1245: + case 1247: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:8251 +//line mysql_sql.y:8266 { yyLOCAL = []tree.CreateOption{yyDollar[1].createOptionUnion()} } yyVAL.union = yyLOCAL - case 1246: + case 1248: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:8255 +//line mysql_sql.y:8270 { yyLOCAL = append(yyDollar[1].createOptionsUnion(), yyDollar[2].createOptionUnion()) } yyVAL.union = yyLOCAL - case 1247: + case 1249: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:8261 +//line mysql_sql.y:8276 { var IsDefault = yyDollar[1].defaultOptionalUnion() var Charset = yyDollar[4].str @@ -21779,10 +21857,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1248: + case 1250: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:8270 +//line mysql_sql.y:8285 { var IsDefault = yyDollar[1].defaultOptionalUnion() var Collate = yyDollar[4].str @@ -21792,35 +21870,35 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1249: + case 1251: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:8279 +//line mysql_sql.y:8294 { var Encrypt = yyDollar[4].str yyLOCAL = tree.NewCreateOptionEncryption(Encrypt) } yyVAL.union = yyLOCAL - case 1250: + case 1252: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8285 +//line mysql_sql.y:8300 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1251: + case 1253: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8289 +//line mysql_sql.y:8304 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1252: + case 1254: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8295 +//line mysql_sql.y:8310 { var TableName = yyDollar[4].tableNameUnion() var Options = yyDollar[7].connectorOptionsUnion() @@ -21830,18 +21908,18 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1253: + case 1255: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8306 +//line mysql_sql.y:8321 { yyLOCAL = &tree.ShowConnectors{} } yyVAL.union = yyLOCAL - case 1254: + case 1256: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8312 +//line mysql_sql.y:8327 { var taskID uint64 switch v := yyDollar[4].item.(type) { @@ -21858,10 +21936,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1255: + case 1257: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8330 +//line mysql_sql.y:8345 { var taskID uint64 switch v := yyDollar[4].item.(type) { @@ -21878,10 +21956,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1256: + case 1258: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8348 +//line mysql_sql.y:8363 { var taskID uint64 switch v := yyDollar[4].item.(type) { @@ -21898,10 +21976,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1257: + case 1259: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8366 +//line mysql_sql.y:8381 { var Replace = yyDollar[2].sourceOptionalUnion() var IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -21917,26 +21995,26 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1258: + case 1260: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8382 +//line mysql_sql.y:8397 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1259: + case 1261: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8386 +//line mysql_sql.y:8401 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1260: + case 1262: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8392 +//line mysql_sql.y:8407 { t := tree.NewDataBranchCreateTable() t.CreateTable.Table = *yyDollar[5].tableNameUnion() @@ -21947,10 +22025,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1261: + case 1263: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8402 +//line mysql_sql.y:8417 { t := tree.NewDataBranchCreateDatabase() t.DstDatabase = tree.Identifier(yyDollar[5].str) @@ -21960,30 +22038,30 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1262: + case 1264: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8411 +//line mysql_sql.y:8426 { t := tree.NewDataBranchDeleteTable() t.TableName = *yyDollar[5].tableNameUnion() yyLOCAL = t } yyVAL.union = yyLOCAL - case 1263: + case 1265: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8417 +//line mysql_sql.y:8432 { t := tree.NewDataBranchDeleteDatabase() t.DatabaseName = tree.Identifier(yyDollar[5].str) yyLOCAL = t } yyVAL.union = yyLOCAL - case 1264: + case 1266: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8423 +//line mysql_sql.y:8438 { t := tree.NewDataBranchDiff() t.TargetTable = *yyDollar[4].tableNameUnion() @@ -21993,10 +22071,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1265: + case 1267: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8432 +//line mysql_sql.y:8447 { t := tree.NewDataBranchMerge() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -22005,10 +22083,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1266: + case 1268: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8440 +//line mysql_sql.y:8455 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -22018,10 +22096,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1267: + case 1269: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8449 +//line mysql_sql.y:8464 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -22032,10 +22110,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1268: + case 1270: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8459 +//line mysql_sql.y:8474 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -22046,10 +22124,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1269: + case 1271: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8469 +//line mysql_sql.y:8484 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -22061,10 +22139,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1270: + case 1272: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8480 +//line mysql_sql.y:8495 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -22076,54 +22154,54 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1271: + case 1273: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:8492 +//line mysql_sql.y:8507 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1272: + case 1274: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:8496 +//line mysql_sql.y:8511 { yyLOCAL = yyDollar[3].identifierListUnion() } yyVAL.union = yyLOCAL - case 1273: + case 1275: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:8501 +//line mysql_sql.y:8516 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1274: + case 1276: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:8505 +//line mysql_sql.y:8520 { yyLOCAL = &tree.DiffOutputOpt{ As: *yyDollar[3].tableNameUnion(), } } yyVAL.union = yyLOCAL - case 1275: + case 1277: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:8511 +//line mysql_sql.y:8526 { yyLOCAL = &tree.DiffOutputOpt{ DirPath: yyDollar[3].str, } } yyVAL.union = yyLOCAL - case 1276: + case 1278: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:8517 +//line mysql_sql.y:8532 { x := yyDollar[3].item.(int64) yyLOCAL = &tree.DiffOutputOpt{ @@ -22131,68 +22209,68 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1277: + case 1279: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:8524 +//line mysql_sql.y:8539 { yyLOCAL = &tree.DiffOutputOpt{ Count: true, } } yyVAL.union = yyLOCAL - case 1278: + case 1280: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:8530 +//line mysql_sql.y:8545 { yyLOCAL = &tree.DiffOutputOpt{ Summary: true, } } yyVAL.union = yyLOCAL - case 1279: + case 1281: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ConflictOpt -//line mysql_sql.y:8538 +//line mysql_sql.y:8553 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1280: + case 1282: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ConflictOpt -//line mysql_sql.y:8542 +//line mysql_sql.y:8557 { yyLOCAL = &tree.ConflictOpt{ Opt: tree.CONFLICT_FAIL, } } yyVAL.union = yyLOCAL - case 1281: + case 1283: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ConflictOpt -//line mysql_sql.y:8548 +//line mysql_sql.y:8563 { yyLOCAL = &tree.ConflictOpt{ Opt: tree.CONFLICT_SKIP, } } yyVAL.union = yyLOCAL - case 1282: + case 1284: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ConflictOpt -//line mysql_sql.y:8554 +//line mysql_sql.y:8569 { yyLOCAL = &tree.ConflictOpt{ Opt: tree.CONFLICT_ACCEPT, } } yyVAL.union = yyLOCAL - case 1283: + case 1285: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PickKeys -//line mysql_sql.y:8562 +//line mysql_sql.y:8577 { yyLOCAL = &tree.PickKeys{ Type: tree.PickKeysValues, @@ -22200,10 +22278,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1284: + case 1286: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PickKeys -//line mysql_sql.y:8569 +//line mysql_sql.y:8584 { yyLOCAL = &tree.PickKeys{ Type: tree.PickKeysSubquery, @@ -22211,28 +22289,28 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1285: + case 1287: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ToAccountOpt -//line mysql_sql.y:8578 +//line mysql_sql.y:8593 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1286: + case 1288: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ToAccountOpt -//line mysql_sql.y:8582 +//line mysql_sql.y:8597 { yyLOCAL = &tree.ToAccountOpt{ AccountName: tree.Identifier(yyDollar[3].cstrUnion().Compare()), } } yyVAL.union = yyLOCAL - case 1287: + case 1289: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8590 +//line mysql_sql.y:8605 { t := tree.NewCreateTable() t.Temporary = yyDollar[2].boolValUnion() @@ -22245,10 +22323,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1288: + case 1290: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8602 +//line mysql_sql.y:8617 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -22258,10 +22336,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1289: + case 1291: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8611 +//line mysql_sql.y:8626 { t := tree.NewCreateTable() t.IsClusterTable = true @@ -22274,10 +22352,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1290: + case 1292: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8623 +//line mysql_sql.y:8638 { t := tree.NewCreateTable() t.IsDynamicTable = true @@ -22288,10 +22366,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1291: + case 1293: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8633 +//line mysql_sql.y:8648 { t := tree.NewCreateTable() t.IsAsSelect = true @@ -22302,10 +22380,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1292: + case 1294: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8643 +//line mysql_sql.y:8658 { t := tree.NewCreateTable() t.IsAsSelect = true @@ -22317,10 +22395,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1293: + case 1295: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8654 +//line mysql_sql.y:8669 { t := tree.NewCreateTable() t.IsAsSelect = true @@ -22331,10 +22409,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1294: + case 1296: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8664 +//line mysql_sql.y:8679 { t := tree.NewCreateTable() t.IsAsSelect = true @@ -22346,10 +22424,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1295: + case 1297: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8675 +//line mysql_sql.y:8690 { t := tree.NewCreateTable() t.IsAsLike = true @@ -22358,10 +22436,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1296: + case 1298: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8683 +//line mysql_sql.y:8698 { t := tree.NewCreateTable() t.Temporary = yyDollar[2].boolValUnion() @@ -22371,10 +22449,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1297: + case 1299: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8692 +//line mysql_sql.y:8707 { t := tree.NewCloneTable() t.CreateTable.Table = *yyDollar[5].tableNameUnion() @@ -22385,10 +22463,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1298: + case 1300: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8702 +//line mysql_sql.y:8717 { var TableName = yyDollar[5].tableNameUnion() var FromUri = yyDollar[7].str @@ -22412,19 +22490,19 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1299: + case 1301: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:8727 +//line mysql_sql.y:8742 { yyLOCAL = yyDollar[1].loadParamUnion() yyLOCAL.Tail = yyDollar[2].tailParamUnion() } yyVAL.union = yyLOCAL - case 1300: + case 1302: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:8734 +//line mysql_sql.y:8749 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -22435,10 +22513,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1301: + case 1303: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:8744 +//line mysql_sql.y:8759 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -22452,10 +22530,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1302: + case 1304: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:8757 +//line mysql_sql.y:8772 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -22464,10 +22542,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1303: + case 1305: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:8765 +//line mysql_sql.y:8780 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -22477,10 +22555,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1304: + case 1306: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:8774 +//line mysql_sql.y:8789 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -22489,55 +22567,55 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1305: + case 1307: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:8783 +//line mysql_sql.y:8798 { yyVAL.str = "" } - case 1306: + case 1308: yyDollar = yyS[yypt-4 : yypt+1] -//line mysql_sql.y:8787 +//line mysql_sql.y:8802 { yyVAL.str = yyDollar[4].str } - case 1307: + case 1309: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:8793 +//line mysql_sql.y:8808 { yyLOCAL = yyDollar[1].strsUnion() } yyVAL.union = yyLOCAL - case 1308: + case 1310: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:8797 +//line mysql_sql.y:8812 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].strsUnion()...) } yyVAL.union = yyLOCAL - case 1309: + case 1311: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:8802 +//line mysql_sql.y:8817 { yyLOCAL = []string{} } yyVAL.union = yyLOCAL - case 1310: + case 1312: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:8806 +//line mysql_sql.y:8821 { yyLOCAL = append(yyLOCAL, yyDollar[1].str) yyLOCAL = append(yyLOCAL, yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1311: + case 1313: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.TailParameter -//line mysql_sql.y:8813 +//line mysql_sql.y:8828 { yyLOCAL = &tree.TailParameter{ Charset: yyDollar[1].str, @@ -22549,22 +22627,22 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1312: + case 1314: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:8825 +//line mysql_sql.y:8840 { yyVAL.str = "" } - case 1313: + case 1315: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8829 +//line mysql_sql.y:8844 { yyVAL.str = yyDollar[2].str } - case 1314: + case 1316: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8835 +//line mysql_sql.y:8850 { var Name = yyDollar[4].tableNameUnion() var Type = yyDollar[5].columnTypeUnion() @@ -22586,10 +22664,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1315: + case 1317: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:8856 +//line mysql_sql.y:8871 { locale := "" fstr := "bigint" @@ -22604,44 +22682,44 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1316: + case 1318: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:8870 +//line mysql_sql.y:8885 { yyLOCAL = yyDollar[2].columnTypeUnion() } yyVAL.union = yyLOCAL - case 1317: + case 1319: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.TypeOption -//line mysql_sql.y:8874 +//line mysql_sql.y:8889 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1318: + case 1320: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.TypeOption -//line mysql_sql.y:8878 +//line mysql_sql.y:8893 { yyLOCAL = &tree.TypeOption{ Type: yyDollar[2].columnTypeUnion(), } } yyVAL.union = yyLOCAL - case 1319: + case 1321: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:8884 +//line mysql_sql.y:8899 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1320: + case 1322: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:8888 +//line mysql_sql.y:8903 { yyLOCAL = &tree.IncrementByOption{ Minus: false, @@ -22649,10 +22727,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1321: + case 1323: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:8895 +//line mysql_sql.y:8910 { yyLOCAL = &tree.IncrementByOption{ Minus: false, @@ -22660,10 +22738,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1322: + case 1324: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:8902 +//line mysql_sql.y:8917 { yyLOCAL = &tree.IncrementByOption{ Minus: true, @@ -22671,10 +22749,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1323: + case 1325: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:8909 +//line mysql_sql.y:8924 { yyLOCAL = &tree.IncrementByOption{ Minus: true, @@ -22682,42 +22760,42 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1324: + case 1326: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8916 +//line mysql_sql.y:8931 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1325: + case 1327: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8920 +//line mysql_sql.y:8935 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1326: + case 1328: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8924 +//line mysql_sql.y:8939 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1327: + case 1329: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.MinValueOption -//line mysql_sql.y:8928 +//line mysql_sql.y:8943 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1328: + case 1330: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.MinValueOption -//line mysql_sql.y:8932 +//line mysql_sql.y:8947 { yyLOCAL = &tree.MinValueOption{ Minus: false, @@ -22725,10 +22803,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1329: + case 1331: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.MinValueOption -//line mysql_sql.y:8939 +//line mysql_sql.y:8954 { yyLOCAL = &tree.MinValueOption{ Minus: true, @@ -22736,18 +22814,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1330: + case 1332: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.MaxValueOption -//line mysql_sql.y:8946 +//line mysql_sql.y:8961 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1331: + case 1333: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.MaxValueOption -//line mysql_sql.y:8950 +//line mysql_sql.y:8965 { yyLOCAL = &tree.MaxValueOption{ Minus: false, @@ -22755,10 +22833,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1332: + case 1334: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.MaxValueOption -//line mysql_sql.y:8957 +//line mysql_sql.y:8972 { yyLOCAL = &tree.MaxValueOption{ Minus: true, @@ -22766,46 +22844,46 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1333: + case 1335: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.CycleOption -//line mysql_sql.y:8964 +//line mysql_sql.y:8979 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1334: + case 1336: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.CycleOption -//line mysql_sql.y:8968 +//line mysql_sql.y:8983 { yyLOCAL = &tree.CycleOption{ Cycle: false, } } yyVAL.union = yyLOCAL - case 1335: + case 1337: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CycleOption -//line mysql_sql.y:8974 +//line mysql_sql.y:8989 { yyLOCAL = &tree.CycleOption{ Cycle: true, } } yyVAL.union = yyLOCAL - case 1336: + case 1338: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:8980 +//line mysql_sql.y:8995 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1337: + case 1339: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:8984 +//line mysql_sql.y:8999 { yyLOCAL = &tree.StartWithOption{ Minus: false, @@ -22813,10 +22891,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1338: + case 1340: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:8991 +//line mysql_sql.y:9006 { yyLOCAL = &tree.StartWithOption{ Minus: false, @@ -22824,10 +22902,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1339: + case 1341: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:8998 +//line mysql_sql.y:9013 { yyLOCAL = &tree.StartWithOption{ Minus: true, @@ -22835,10 +22913,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1340: + case 1342: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:9005 +//line mysql_sql.y:9020 { yyLOCAL = &tree.StartWithOption{ Minus: true, @@ -22846,58 +22924,58 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1341: + case 1343: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:9012 +//line mysql_sql.y:9027 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1342: + case 1344: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:9016 +//line mysql_sql.y:9031 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1343: + case 1345: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:9021 +//line mysql_sql.y:9036 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1344: + case 1346: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:9025 +//line mysql_sql.y:9040 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1345: + case 1347: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:9029 +//line mysql_sql.y:9044 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1346: + case 1348: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.PartitionOption -//line mysql_sql.y:9034 +//line mysql_sql.y:9049 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1347: + case 1349: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.PartitionOption -//line mysql_sql.y:9038 +//line mysql_sql.y:9053 { yyDollar[3].partitionByUnion().Num = uint64(yyDollar[4].int64ValUnion()) var PartBy = yyDollar[3].partitionByUnion() @@ -22910,18 +22988,18 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1348: + case 1350: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ClusterByOption -//line mysql_sql.y:9051 +//line mysql_sql.y:9066 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1349: + case 1351: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ClusterByOption -//line mysql_sql.y:9055 +//line mysql_sql.y:9070 { var ColumnList = []*tree.UnresolvedName{yyDollar[3].unresolvedNameUnion()} yyLOCAL = tree.NewClusterByOption( @@ -22930,10 +23008,10 @@ yydefault: } yyVAL.union = yyLOCAL - case 1350: + case 1352: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.ClusterByOption -//line mysql_sql.y:9063 +//line mysql_sql.y:9078 { var ColumnList = yyDollar[4].unresolveNamesUnion() yyLOCAL = tree.NewClusterByOption( @@ -22941,18 +23019,18 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1351: + case 1353: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:9071 +//line mysql_sql.y:9086 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1352: + case 1354: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:9075 +//line mysql_sql.y:9090 { var IsSubPartition = true var PType = yyDollar[3].partitionByUnion().PType @@ -22966,42 +23044,42 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1353: + case 1355: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.Partition -//line mysql_sql.y:9089 +//line mysql_sql.y:9104 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1354: + case 1356: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.Partition -//line mysql_sql.y:9093 +//line mysql_sql.y:9108 { yyLOCAL = yyDollar[2].partitionsUnion() } yyVAL.union = yyLOCAL - case 1355: + case 1357: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.Partition -//line mysql_sql.y:9099 +//line mysql_sql.y:9114 { yyLOCAL = []*tree.Partition{yyDollar[1].partitionUnion()} } yyVAL.union = yyLOCAL - case 1356: + case 1358: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.Partition -//line mysql_sql.y:9103 +//line mysql_sql.y:9118 { yyLOCAL = append(yyDollar[1].partitionsUnion(), yyDollar[3].partitionUnion()) } yyVAL.union = yyLOCAL - case 1357: + case 1359: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Partition -//line mysql_sql.y:9109 +//line mysql_sql.y:9124 { var Name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) var Values = yyDollar[3].valuesUnion() @@ -23015,10 +23093,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1358: + case 1360: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.Partition -//line mysql_sql.y:9122 +//line mysql_sql.y:9137 { var Name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) var Values = yyDollar[3].valuesUnion() @@ -23032,42 +23110,42 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1359: + case 1361: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.SubPartition -//line mysql_sql.y:9136 +//line mysql_sql.y:9151 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1360: + case 1362: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.SubPartition -//line mysql_sql.y:9140 +//line mysql_sql.y:9155 { yyLOCAL = yyDollar[2].subPartitionsUnion() } yyVAL.union = yyLOCAL - case 1361: + case 1363: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.SubPartition -//line mysql_sql.y:9146 +//line mysql_sql.y:9161 { yyLOCAL = []*tree.SubPartition{yyDollar[1].subPartitionUnion()} } yyVAL.union = yyLOCAL - case 1362: + case 1364: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.SubPartition -//line mysql_sql.y:9150 +//line mysql_sql.y:9165 { yyLOCAL = append(yyDollar[1].subPartitionsUnion(), yyDollar[3].subPartitionUnion()) } yyVAL.union = yyLOCAL - case 1363: + case 1365: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.SubPartition -//line mysql_sql.y:9156 +//line mysql_sql.y:9171 { var Name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) var Options []tree.TableOption @@ -23077,10 +23155,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1364: + case 1366: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.SubPartition -//line mysql_sql.y:9165 +//line mysql_sql.y:9180 { var Name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) var Options = yyDollar[3].tableOptionsUnion() @@ -23090,53 +23168,53 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1365: + case 1367: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:9176 +//line mysql_sql.y:9191 { yyLOCAL = []tree.TableOption{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL - case 1366: + case 1368: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:9180 +//line mysql_sql.y:9195 { yyLOCAL = append(yyDollar[1].tableOptionsUnion(), yyDollar[2].tableOptionUnion()) } yyVAL.union = yyLOCAL - case 1367: + case 1369: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Values -//line mysql_sql.y:9185 +//line mysql_sql.y:9200 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1368: + case 1370: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Values -//line mysql_sql.y:9189 +//line mysql_sql.y:9204 { expr := tree.NewMaxValue() var valueList = tree.Exprs{expr} yyLOCAL = tree.NewValuesLessThan(valueList) } yyVAL.union = yyLOCAL - case 1369: + case 1371: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Values -//line mysql_sql.y:9195 +//line mysql_sql.y:9210 { var valueList = yyDollar[5].exprsUnion() yyLOCAL = tree.NewValuesLessThan(valueList) } yyVAL.union = yyLOCAL - case 1370: + case 1372: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Values -//line mysql_sql.y:9200 +//line mysql_sql.y:9215 { var valueList = yyDollar[4].exprsUnion() yyLOCAL = tree.NewValuesIn( @@ -23144,18 +23222,18 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1371: + case 1373: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:9208 +//line mysql_sql.y:9223 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1372: + case 1374: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:9212 +//line mysql_sql.y:9227 { res := yyDollar[2].item.(int64) if res == 0 { @@ -23165,18 +23243,18 @@ yydefault: yyLOCAL = res } yyVAL.union = yyLOCAL - case 1373: + case 1375: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:9222 +//line mysql_sql.y:9237 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1374: + case 1376: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:9226 +//line mysql_sql.y:9241 { res := yyDollar[2].item.(int64) if res == 0 { @@ -23186,10 +23264,10 @@ yydefault: yyLOCAL = res } yyVAL.union = yyLOCAL - case 1375: + case 1377: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:9237 +//line mysql_sql.y:9252 { rangeTyp := tree.NewRangeType() rangeTyp.Expr = yyDollar[3].exprUnion() @@ -23198,10 +23276,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1376: + case 1378: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:9245 +//line mysql_sql.y:9260 { rangeTyp := tree.NewRangeType() rangeTyp.ColumnList = yyDollar[4].unresolveNamesUnion() @@ -23210,10 +23288,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1377: + case 1379: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:9253 +//line mysql_sql.y:9268 { listTyp := tree.NewListType() listTyp.Expr = yyDollar[3].exprUnion() @@ -23222,10 +23300,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1378: + case 1380: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:9261 +//line mysql_sql.y:9276 { listTyp := tree.NewListType() listTyp.ColumnList = yyDollar[4].unresolveNamesUnion() @@ -23234,10 +23312,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1380: + case 1382: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:9272 +//line mysql_sql.y:9287 { keyTyp := tree.NewKeyType() keyTyp.Linear = yyDollar[1].boolValUnion() @@ -23247,10 +23325,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1381: + case 1383: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:9281 +//line mysql_sql.y:9296 { keyTyp := tree.NewKeyType() keyTyp.Linear = yyDollar[1].boolValUnion() @@ -23261,10 +23339,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1382: + case 1384: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:9291 +//line mysql_sql.y:9306 { Linear := yyDollar[1].boolValUnion() Expr := yyDollar[4].exprUnion() @@ -23274,58 +23352,58 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1383: + case 1385: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:9301 +//line mysql_sql.y:9316 { yyLOCAL = 2 } yyVAL.union = yyLOCAL - case 1384: + case 1386: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:9305 +//line mysql_sql.y:9320 { yyLOCAL = yyDollar[3].item.(int64) } yyVAL.union = yyLOCAL - case 1385: + case 1387: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:9310 +//line mysql_sql.y:9325 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1386: + case 1388: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:9314 +//line mysql_sql.y:9329 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1387: + case 1389: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.ConnectorOption -//line mysql_sql.y:9320 +//line mysql_sql.y:9335 { yyLOCAL = []*tree.ConnectorOption{yyDollar[1].connectorOptionUnion()} } yyVAL.union = yyLOCAL - case 1388: + case 1390: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.ConnectorOption -//line mysql_sql.y:9324 +//line mysql_sql.y:9339 { yyLOCAL = append(yyDollar[1].connectorOptionsUnion(), yyDollar[3].connectorOptionUnion()) } yyVAL.union = yyLOCAL - case 1389: + case 1391: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ConnectorOption -//line mysql_sql.y:9330 +//line mysql_sql.y:9345 { var Key = tree.Identifier(yyDollar[1].cstrUnion().Compare()) var Val = yyDollar[3].exprUnion() @@ -23335,10 +23413,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1390: + case 1392: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ConnectorOption -//line mysql_sql.y:9339 +//line mysql_sql.y:9354 { var Key = tree.Identifier(yyDollar[1].str) var Val = yyDollar[3].exprUnion() @@ -23348,42 +23426,42 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1391: + case 1393: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:9349 +//line mysql_sql.y:9364 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1392: + case 1394: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:9353 +//line mysql_sql.y:9368 { yyLOCAL = yyDollar[3].tableOptionsUnion() } yyVAL.union = yyLOCAL - case 1393: + case 1395: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:9359 +//line mysql_sql.y:9374 { yyLOCAL = []tree.TableOption{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL - case 1394: + case 1396: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:9363 +//line mysql_sql.y:9378 { yyLOCAL = append(yyDollar[1].tableOptionsUnion(), yyDollar[3].tableOptionUnion()) } yyVAL.union = yyLOCAL - case 1395: + case 1397: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9369 +//line mysql_sql.y:9384 { var Key = tree.Identifier(yyDollar[1].cstrUnion().Compare()) var Val = yyDollar[3].exprUnion() @@ -23393,10 +23471,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1396: + case 1398: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9378 +//line mysql_sql.y:9393 { var Key = tree.Identifier(yyDollar[1].str) var Val = yyDollar[3].exprUnion() @@ -23406,364 +23484,364 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1397: + case 1399: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:9388 +//line mysql_sql.y:9403 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1398: + case 1400: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:9392 +//line mysql_sql.y:9407 { yyLOCAL = yyDollar[1].tableOptionsUnion() } yyVAL.union = yyLOCAL - case 1399: + case 1401: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:9398 +//line mysql_sql.y:9413 { yyLOCAL = []tree.TableOption{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL - case 1400: + case 1402: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:9402 +//line mysql_sql.y:9417 { yyLOCAL = append(yyDollar[1].tableOptionsUnion(), yyDollar[3].tableOptionUnion()) } yyVAL.union = yyLOCAL - case 1401: + case 1403: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:9406 +//line mysql_sql.y:9421 { yyLOCAL = append(yyDollar[1].tableOptionsUnion(), yyDollar[2].tableOptionUnion()) } yyVAL.union = yyLOCAL - case 1402: + case 1404: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9412 +//line mysql_sql.y:9427 { yyLOCAL = tree.NewTableOptionAUTOEXTEND_SIZE(uint64(yyDollar[3].item.(int64))) } yyVAL.union = yyLOCAL - case 1403: + case 1405: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9416 +//line mysql_sql.y:9431 { yyLOCAL = tree.NewTableOptionAutoIncrement(uint64(yyDollar[3].item.(int64))) } yyVAL.union = yyLOCAL - case 1404: + case 1406: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9420 +//line mysql_sql.y:9435 { yyLOCAL = tree.NewTableOptionAvgRowLength(uint64(yyDollar[3].item.(int64))) } yyVAL.union = yyLOCAL - case 1405: + case 1407: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9424 +//line mysql_sql.y:9439 { yyLOCAL = tree.NewTableOptionCharset(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 1406: + case 1408: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9428 +//line mysql_sql.y:9443 { yyLOCAL = tree.NewTableOptionCollate(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 1407: + case 1409: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9432 +//line mysql_sql.y:9447 { yyLOCAL = tree.NewTableOptionChecksum(uint64(yyDollar[3].item.(int64))) } yyVAL.union = yyLOCAL - case 1408: + case 1410: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9436 +//line mysql_sql.y:9451 { str := util.DealCommentString(yyDollar[3].str) yyLOCAL = tree.NewTableOptionComment(str) } yyVAL.union = yyLOCAL - case 1409: + case 1411: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9441 +//line mysql_sql.y:9456 { yyLOCAL = tree.NewTableOptionCompression(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1410: + case 1412: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9445 +//line mysql_sql.y:9460 { yyLOCAL = tree.NewTableOptionConnection(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1411: + case 1413: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9449 +//line mysql_sql.y:9464 { yyLOCAL = tree.NewTableOptionDataDirectory(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 1412: + case 1414: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9453 +//line mysql_sql.y:9468 { yyLOCAL = tree.NewTableOptionIndexDirectory(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 1413: + case 1415: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9457 +//line mysql_sql.y:9472 { yyLOCAL = tree.NewTableOptionDelayKeyWrite(uint64(yyDollar[3].item.(int64))) } yyVAL.union = yyLOCAL - case 1414: + case 1416: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9461 +//line mysql_sql.y:9476 { yyLOCAL = tree.NewTableOptionEncryption(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1415: + case 1417: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9465 +//line mysql_sql.y:9480 { yyLOCAL = tree.NewTableOptionEngine(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1416: + case 1418: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9469 +//line mysql_sql.y:9484 { yyLOCAL = tree.NewTableOptionEngineAttr(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1417: + case 1419: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9473 +//line mysql_sql.y:9488 { yyLOCAL = tree.NewTableOptionInsertMethod(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1418: + case 1420: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9477 +//line mysql_sql.y:9492 { yyLOCAL = tree.NewTableOptionKeyBlockSize(uint64(yyDollar[3].item.(int64))) } yyVAL.union = yyLOCAL - case 1419: + case 1421: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9481 +//line mysql_sql.y:9496 { yyLOCAL = tree.NewTableOptionMaxRows(uint64(yyDollar[3].item.(int64))) } yyVAL.union = yyLOCAL - case 1420: + case 1422: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9485 +//line mysql_sql.y:9500 { yyLOCAL = tree.NewTableOptionMinRows(uint64(yyDollar[3].item.(int64))) } yyVAL.union = yyLOCAL - case 1421: + case 1423: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9489 +//line mysql_sql.y:9504 { t := tree.NewTableOptionPackKeys() t.Value = yyDollar[3].item.(int64) yyLOCAL = t } yyVAL.union = yyLOCAL - case 1422: + case 1424: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9495 +//line mysql_sql.y:9510 { t := tree.NewTableOptionPackKeys() t.Default = true yyLOCAL = t } yyVAL.union = yyLOCAL - case 1423: + case 1425: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9501 +//line mysql_sql.y:9516 { yyLOCAL = tree.NewTableOptionPassword(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1424: + case 1426: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9505 +//line mysql_sql.y:9520 { yyLOCAL = tree.NewTableOptionRowFormat(yyDollar[3].rowFormatTypeUnion()) } yyVAL.union = yyLOCAL - case 1425: + case 1427: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9509 +//line mysql_sql.y:9524 { yyLOCAL = tree.NewTTableOptionStartTrans(true) } yyVAL.union = yyLOCAL - case 1426: + case 1428: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9513 +//line mysql_sql.y:9528 { yyLOCAL = tree.NewTTableOptionSecondaryEngineAttr(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1427: + case 1429: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9517 +//line mysql_sql.y:9532 { t := tree.NewTableOptionStatsAutoRecalc() t.Value = uint64(yyDollar[3].item.(int64)) yyLOCAL = t } yyVAL.union = yyLOCAL - case 1428: + case 1430: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9523 +//line mysql_sql.y:9538 { t := tree.NewTableOptionStatsAutoRecalc() t.Default = true yyLOCAL = t } yyVAL.union = yyLOCAL - case 1429: + case 1431: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9529 +//line mysql_sql.y:9544 { t := tree.NewTableOptionStatsPersistent() t.Value = uint64(yyDollar[3].item.(int64)) yyLOCAL = t } yyVAL.union = yyLOCAL - case 1430: + case 1432: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9535 +//line mysql_sql.y:9550 { t := tree.NewTableOptionStatsPersistent() t.Default = true yyLOCAL = t } yyVAL.union = yyLOCAL - case 1431: + case 1433: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9541 +//line mysql_sql.y:9556 { t := tree.NewTableOptionStatsSamplePages() t.Value = uint64(yyDollar[3].item.(int64)) yyLOCAL = t } yyVAL.union = yyLOCAL - case 1432: + case 1434: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9547 +//line mysql_sql.y:9562 { t := tree.NewTableOptionStatsSamplePages() t.Default = true yyLOCAL = t } yyVAL.union = yyLOCAL - case 1433: + case 1435: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9553 +//line mysql_sql.y:9568 { yyLOCAL = tree.NewTableOptionTablespace(yyDollar[3].cstrUnion().Compare(), "") } yyVAL.union = yyLOCAL - case 1434: + case 1436: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9557 +//line mysql_sql.y:9572 { yyLOCAL = tree.NewTableOptionTablespace("", yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1435: + case 1437: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9561 +//line mysql_sql.y:9576 { yyLOCAL = tree.NewTableOptionUnion(yyDollar[4].tableNamesUnion()) } yyVAL.union = yyLOCAL - case 1436: + case 1438: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:9565 +//line mysql_sql.y:9580 { var Preperties = yyDollar[3].propertiesUnion() yyLOCAL = tree.NewTableOptionProperties(Preperties) } yyVAL.union = yyLOCAL - case 1437: + case 1439: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.Property -//line mysql_sql.y:9572 +//line mysql_sql.y:9587 { yyLOCAL = []tree.Property{yyDollar[1].propertyUnion()} } yyVAL.union = yyLOCAL - case 1438: + case 1440: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.Property -//line mysql_sql.y:9576 +//line mysql_sql.y:9591 { yyLOCAL = append(yyDollar[1].propertiesUnion(), yyDollar[3].propertyUnion()) } yyVAL.union = yyLOCAL - case 1439: + case 1441: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Property -//line mysql_sql.y:9582 +//line mysql_sql.y:9597 { var Key = yyDollar[1].str var Value = yyDollar[3].str @@ -23773,96 +23851,96 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1440: + case 1442: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:9593 +//line mysql_sql.y:9608 { yyVAL.str = " " + yyDollar[1].str + " " + yyDollar[2].str } - case 1441: + case 1443: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:9597 +//line mysql_sql.y:9612 { yyVAL.str = " " + yyDollar[1].str + " " + yyDollar[2].str } - case 1442: + case 1444: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:9603 +//line mysql_sql.y:9618 { yyLOCAL = tree.ROW_FORMAT_DEFAULT } yyVAL.union = yyLOCAL - case 1443: + case 1445: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:9607 +//line mysql_sql.y:9622 { yyLOCAL = tree.ROW_FORMAT_DYNAMIC } yyVAL.union = yyLOCAL - case 1444: + case 1446: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:9611 +//line mysql_sql.y:9626 { yyLOCAL = tree.ROW_FORMAT_FIXED } yyVAL.union = yyLOCAL - case 1445: + case 1447: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:9615 +//line mysql_sql.y:9630 { yyLOCAL = tree.ROW_FORMAT_COMPRESSED } yyVAL.union = yyLOCAL - case 1446: + case 1448: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:9619 +//line mysql_sql.y:9634 { yyLOCAL = tree.ROW_FORMAT_REDUNDANT } yyVAL.union = yyLOCAL - case 1447: + case 1449: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:9623 +//line mysql_sql.y:9638 { yyLOCAL = tree.ROW_FORMAT_COMPACT } yyVAL.union = yyLOCAL - case 1452: + case 1454: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableNames -//line mysql_sql.y:9637 +//line mysql_sql.y:9652 { yyLOCAL = tree.TableNames{yyDollar[1].tableNameUnion()} } yyVAL.union = yyLOCAL - case 1453: + case 1455: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableNames -//line mysql_sql.y:9641 +//line mysql_sql.y:9656 { yyLOCAL = append(yyDollar[1].tableNamesUnion(), yyDollar[3].tableNameUnion()) } yyVAL.union = yyLOCAL - case 1454: + case 1456: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.TableName -//line mysql_sql.y:9650 +//line mysql_sql.y:9665 { tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) prefix := tree.ObjectNamePrefix{ExplicitSchema: false} yyLOCAL = tree.NewTableName(tree.Identifier(tblName), prefix, yyDollar[2].atTimeStampUnion()) } yyVAL.union = yyLOCAL - case 1455: + case 1457: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.TableName -//line mysql_sql.y:9656 +//line mysql_sql.y:9671 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[3].cstrUnion().Origin()) @@ -23870,18 +23948,18 @@ yydefault: yyLOCAL = tree.NewTableName(tree.Identifier(tblName), prefix, yyDollar[4].atTimeStampUnion()) } yyVAL.union = yyLOCAL - case 1456: + case 1458: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:9664 +//line mysql_sql.y:9679 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1457: + case 1459: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:9668 +//line mysql_sql.y:9683 { yyLOCAL = &tree.AtTimeStamp{ Type: tree.ATTIMESTAMPTIME, @@ -23889,10 +23967,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1458: + case 1460: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:9675 +//line mysql_sql.y:9690 { var str = yyDollar[4].cstrUnion().Compare() yyLOCAL = &tree.AtTimeStamp{ @@ -23902,10 +23980,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1459: + case 1461: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:9684 +//line mysql_sql.y:9699 { yyLOCAL = &tree.AtTimeStamp{ Type: tree.ATTIMESTAMPSNAPSHOT, @@ -23914,10 +23992,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1460: + case 1462: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:9692 +//line mysql_sql.y:9707 { yyLOCAL = &tree.AtTimeStamp{ Type: tree.ATMOTIMESTAMP, @@ -23925,10 +24003,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1461: + case 1463: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:9699 +//line mysql_sql.y:9714 { yyLOCAL = &tree.AtTimeStamp{ Type: tree.ASOFTIMESTAMP, @@ -23936,74 +24014,74 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1462: + case 1464: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.TableDefs -//line mysql_sql.y:9707 +//line mysql_sql.y:9722 { yyLOCAL = tree.TableDefs(nil) } yyVAL.union = yyLOCAL - case 1464: + case 1466: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDefs -//line mysql_sql.y:9714 +//line mysql_sql.y:9729 { yyLOCAL = tree.TableDefs{yyDollar[1].tableDefUnion()} } yyVAL.union = yyLOCAL - case 1465: + case 1467: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableDefs -//line mysql_sql.y:9718 +//line mysql_sql.y:9733 { yyLOCAL = append(yyDollar[1].tableDefsUnion(), yyDollar[3].tableDefUnion()) } yyVAL.union = yyLOCAL - case 1466: + case 1468: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9724 +//line mysql_sql.y:9739 { yyLOCAL = tree.TableDef(yyDollar[1].columnTableDefUnion()) } yyVAL.union = yyLOCAL - case 1467: + case 1469: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9728 +//line mysql_sql.y:9743 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1468: + case 1470: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9732 +//line mysql_sql.y:9747 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1469: + case 1471: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9738 +//line mysql_sql.y:9753 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1470: + case 1472: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9742 +//line mysql_sql.y:9757 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1471: + case 1473: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9748 +//line mysql_sql.y:9763 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].str @@ -24017,10 +24095,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1472: + case 1474: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9761 +//line mysql_sql.y:9776 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].str @@ -24034,10 +24112,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1473: + case 1475: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9774 +//line mysql_sql.y:9789 { keyTyp := tree.INDEX_TYPE_INVALID if yyDollar[3].strsUnion()[1] != "" { @@ -24079,10 +24157,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1474: + case 1476: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9815 +//line mysql_sql.y:9830 { keyTyp := tree.INDEX_TYPE_INVALID if yyDollar[3].strsUnion()[1] != "" { @@ -24123,10 +24201,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1475: + case 1477: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9857 +//line mysql_sql.y:9872 { if yyDollar[1].str != "" { switch v := yyDollar[2].tableDefUnion().(type) { @@ -24141,18 +24219,18 @@ yydefault: yyLOCAL = yyDollar[2].tableDefUnion() } yyVAL.union = yyLOCAL - case 1476: + case 1478: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9871 +//line mysql_sql.y:9886 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1477: + case 1479: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9877 +//line mysql_sql.y:9892 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].strsUnion()[0] @@ -24166,10 +24244,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1478: + case 1480: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9890 +//line mysql_sql.y:9905 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].strsUnion()[0] @@ -24183,10 +24261,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1479: + case 1481: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9903 +//line mysql_sql.y:9918 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].strsUnion()[0] @@ -24200,10 +24278,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1480: + case 1482: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9916 +//line mysql_sql.y:9931 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].strsUnion()[0] @@ -24217,10 +24295,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1481: + case 1483: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9929 +//line mysql_sql.y:9944 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var KeyParts = yyDollar[6].keyPartsUnion() @@ -24236,10 +24314,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1482: + case 1484: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:9944 +//line mysql_sql.y:9959 { var Expr = yyDollar[3].exprUnion() var Enforced = yyDollar[5].boolValUnion() @@ -24249,327 +24327,327 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1483: + case 1485: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:9954 +//line mysql_sql.y:9969 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1485: + case 1487: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:9960 +//line mysql_sql.y:9975 { yyVAL.str = "" } - case 1486: + case 1488: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:9964 +//line mysql_sql.y:9979 { yyVAL.str = yyDollar[1].str } - case 1489: + case 1491: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:9974 +//line mysql_sql.y:9989 { yyLOCAL = make([]string, 2) yyLOCAL[0] = yyDollar[1].str yyLOCAL[1] = "" } yyVAL.union = yyLOCAL - case 1490: + case 1492: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:9980 +//line mysql_sql.y:9995 { yyLOCAL = make([]string, 2) yyLOCAL[0] = yyDollar[1].str yyLOCAL[1] = yyDollar[3].str } yyVAL.union = yyLOCAL - case 1491: + case 1493: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:9986 +//line mysql_sql.y:10001 { yyLOCAL = make([]string, 2) yyLOCAL[0] = yyDollar[1].cstrUnion().Compare() yyLOCAL[1] = yyDollar[3].str } yyVAL.union = yyLOCAL - case 1503: + case 1505: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:10008 +//line mysql_sql.y:10023 { yyVAL.str = "" } - case 1504: + case 1506: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:10012 +//line mysql_sql.y:10027 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1505: + case 1507: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ColumnTableDef -//line mysql_sql.y:10018 +//line mysql_sql.y:10033 { yyLOCAL = tree.NewColumnTableDef(yyDollar[1].unresolvedNameUnion(), yyDollar[2].columnTypeUnion(), yyDollar[3].columnAttributesUnion()) } yyVAL.union = yyLOCAL - case 1506: + case 1508: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:10024 +//line mysql_sql.y:10039 { yyLOCAL = tree.NewUnresolvedName(yyDollar[1].cstrUnion()) } yyVAL.union = yyLOCAL - case 1507: + case 1509: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:10028 +//line mysql_sql.y:10043 { tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(tblNameCStr, yyDollar[3].cstrUnion()) } yyVAL.union = yyLOCAL - case 1508: + case 1510: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:10033 +//line mysql_sql.y:10048 { dbNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[3].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(dbNameCStr, tblNameCStr, yyDollar[5].cstrUnion()) } yyVAL.union = yyLOCAL - case 1509: + case 1511: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:10041 +//line mysql_sql.y:10056 { yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1510: + case 1512: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:10045 +//line mysql_sql.y:10060 { yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1511: + case 1513: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:10049 +//line mysql_sql.y:10064 { yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1512: + case 1514: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:10053 +//line mysql_sql.y:10068 { yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1513: + case 1515: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:10059 +//line mysql_sql.y:10074 { yyLOCAL = yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) } yyVAL.union = yyLOCAL - case 1514: + case 1516: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:10065 +//line mysql_sql.y:10080 { yyLOCAL = tree.NewUnresolvedName(yyDollar[1].cstrUnion()) } yyVAL.union = yyLOCAL - case 1515: + case 1517: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:10069 +//line mysql_sql.y:10084 { tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(tblNameCStr, yyDollar[3].cstrUnion()) } yyVAL.union = yyLOCAL - case 1516: + case 1518: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:10074 +//line mysql_sql.y:10089 { dbNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[3].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(dbNameCStr, tblNameCStr, yyDollar[5].cstrUnion()) } yyVAL.union = yyLOCAL - case 1517: + case 1519: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []tree.ColumnAttribute -//line mysql_sql.y:10081 +//line mysql_sql.y:10096 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1518: + case 1520: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.ColumnAttribute -//line mysql_sql.y:10085 +//line mysql_sql.y:10100 { yyLOCAL = yyDollar[1].columnAttributesUnion() } yyVAL.union = yyLOCAL - case 1519: + case 1521: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.ColumnAttribute -//line mysql_sql.y:10091 +//line mysql_sql.y:10106 { yyLOCAL = []tree.ColumnAttribute{yyDollar[1].columnAttributeUnion()} } yyVAL.union = yyLOCAL - case 1520: + case 1522: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.ColumnAttribute -//line mysql_sql.y:10095 +//line mysql_sql.y:10110 { yyLOCAL = append(yyDollar[1].columnAttributesUnion(), yyDollar[2].columnAttributeUnion()) } yyVAL.union = yyLOCAL - case 1521: + case 1523: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10101 +//line mysql_sql.y:10116 { yyLOCAL = tree.NewAttributeNull(true) } yyVAL.union = yyLOCAL - case 1522: + case 1524: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10105 +//line mysql_sql.y:10120 { yyLOCAL = tree.NewAttributeNull(false) } yyVAL.union = yyLOCAL - case 1523: + case 1525: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10109 +//line mysql_sql.y:10124 { yyLOCAL = tree.NewAttributeDefault(yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1524: + case 1526: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10113 +//line mysql_sql.y:10128 { yyLOCAL = tree.NewAttributeAutoIncrement() } yyVAL.union = yyLOCAL - case 1525: + case 1527: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10117 +//line mysql_sql.y:10132 { yyLOCAL = yyDollar[1].columnAttributeUnion() } yyVAL.union = yyLOCAL - case 1526: + case 1528: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10121 +//line mysql_sql.y:10136 { str := util.DealCommentString(yyDollar[2].str) yyLOCAL = tree.NewAttributeComment(tree.NewNumVal(str, str, false, tree.P_char)) } yyVAL.union = yyLOCAL - case 1527: + case 1529: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10126 +//line mysql_sql.y:10141 { yyLOCAL = tree.NewAttributeCollate(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1528: + case 1530: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10130 +//line mysql_sql.y:10145 { yyLOCAL = tree.NewAttributeColumnFormat(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1529: + case 1531: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10134 +//line mysql_sql.y:10149 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1530: + case 1532: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10138 +//line mysql_sql.y:10153 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1531: + case 1533: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10142 +//line mysql_sql.y:10157 { yyLOCAL = tree.NewAttributeStorage(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1532: + case 1534: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10146 +//line mysql_sql.y:10161 { yyLOCAL = tree.NewAttributeAutoRandom(int(yyDollar[2].int64ValUnion())) } yyVAL.union = yyLOCAL - case 1533: + case 1535: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10150 +//line mysql_sql.y:10165 { yyLOCAL = yyDollar[1].attributeReferenceUnion() } yyVAL.union = yyLOCAL - case 1534: + case 1536: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10154 +//line mysql_sql.y:10169 { yyLOCAL = tree.NewAttributeCheckConstraint(yyDollar[4].exprUnion(), false, yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1535: + case 1537: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10158 +//line mysql_sql.y:10173 { yyLOCAL = tree.NewAttributeCheckConstraint(yyDollar[4].exprUnion(), yyDollar[6].boolValUnion(), yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1536: + case 1538: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10162 +//line mysql_sql.y:10177 { name := tree.NewUnresolvedColName(yyDollar[3].str) var es tree.Exprs = nil @@ -24584,10 +24662,10 @@ yydefault: yyLOCAL = tree.NewAttributeOnUpdate(expr) } yyVAL.union = yyLOCAL - case 1537: + case 1539: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10176 +//line mysql_sql.y:10191 { v, errStr := util.GetInt64(yyDollar[2].item) if errStr != "" { @@ -24601,138 +24679,138 @@ yydefault: yyLOCAL = tree.NewAttributeSRID(uint32(v)) } yyVAL.union = yyLOCAL - case 1538: + case 1540: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10189 +//line mysql_sql.y:10204 { yyLOCAL = tree.NewAttributeLowCardinality() } yyVAL.union = yyLOCAL - case 1539: + case 1541: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10193 +//line mysql_sql.y:10208 { yyLOCAL = tree.NewAttributeVisable(true) } yyVAL.union = yyLOCAL - case 1540: + case 1542: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10197 +//line mysql_sql.y:10212 { yyLOCAL = tree.NewAttributeVisable(false) } yyVAL.union = yyLOCAL - case 1541: + case 1543: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10201 +//line mysql_sql.y:10216 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1542: + case 1544: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10205 +//line mysql_sql.y:10220 { yyLOCAL = tree.NewAttributeHeader(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1543: + case 1545: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10209 +//line mysql_sql.y:10224 { yyLOCAL = tree.NewAttributeHeaders() } yyVAL.union = yyLOCAL - case 1544: + case 1546: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10213 +//line mysql_sql.y:10228 { yyLOCAL = tree.NewAttributeGeneratedAlways(yyDollar[5].exprUnion(), yyDollar[7].boolValUnion()) } yyVAL.union = yyLOCAL - case 1545: + case 1547: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:10217 +//line mysql_sql.y:10232 { yyLOCAL = tree.NewAttributeGeneratedAlways(yyDollar[3].exprUnion(), yyDollar[5].boolValUnion()) } yyVAL.union = yyLOCAL - case 1546: + case 1548: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10222 +//line mysql_sql.y:10237 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1547: + case 1549: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10226 +//line mysql_sql.y:10241 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1548: + case 1550: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10230 +//line mysql_sql.y:10245 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1549: + case 1551: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10236 +//line mysql_sql.y:10251 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1550: + case 1552: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10240 +//line mysql_sql.y:10255 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1551: + case 1553: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:10245 +//line mysql_sql.y:10260 { yyVAL.str = "" } - case 1552: + case 1554: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:10249 +//line mysql_sql.y:10264 { yyVAL.str = yyDollar[1].str } - case 1553: + case 1555: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:10255 +//line mysql_sql.y:10270 { yyVAL.str = "" } - case 1554: + case 1556: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:10259 +//line mysql_sql.y:10274 { yyVAL.str = yyDollar[2].cstrUnion().Compare() } - case 1555: + case 1557: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AttributeReference -//line mysql_sql.y:10265 +//line mysql_sql.y:10280 { var TableName = yyDollar[2].tableNameUnion() var KeyParts = yyDollar[3].keyPartsUnion() @@ -24748,10 +24826,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1556: + case 1558: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:10282 +//line mysql_sql.y:10297 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: tree.REFERENCE_OPTION_INVALID, @@ -24759,10 +24837,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1557: + case 1559: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:10289 +//line mysql_sql.y:10304 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: yyDollar[1].referenceOptionTypeUnion(), @@ -24770,10 +24848,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1558: + case 1560: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:10296 +//line mysql_sql.y:10311 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: tree.REFERENCE_OPTION_INVALID, @@ -24781,10 +24859,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1559: + case 1561: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:10303 +//line mysql_sql.y:10318 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: yyDollar[1].referenceOptionTypeUnion(), @@ -24792,10 +24870,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1560: + case 1562: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:10310 +//line mysql_sql.y:10325 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: yyDollar[2].referenceOptionTypeUnion(), @@ -24803,274 +24881,274 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1561: + case 1563: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:10319 +//line mysql_sql.y:10334 { yyLOCAL = yyDollar[3].referenceOptionTypeUnion() } yyVAL.union = yyLOCAL - case 1562: + case 1564: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:10325 +//line mysql_sql.y:10340 { yyLOCAL = yyDollar[3].referenceOptionTypeUnion() } yyVAL.union = yyLOCAL - case 1563: + case 1565: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:10331 +//line mysql_sql.y:10346 { yyLOCAL = tree.REFERENCE_OPTION_RESTRICT } yyVAL.union = yyLOCAL - case 1564: + case 1566: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:10335 +//line mysql_sql.y:10350 { yyLOCAL = tree.REFERENCE_OPTION_CASCADE } yyVAL.union = yyLOCAL - case 1565: + case 1567: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:10339 +//line mysql_sql.y:10354 { yyLOCAL = tree.REFERENCE_OPTION_SET_NULL } yyVAL.union = yyLOCAL - case 1566: + case 1568: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:10343 +//line mysql_sql.y:10358 { yyLOCAL = tree.REFERENCE_OPTION_NO_ACTION } yyVAL.union = yyLOCAL - case 1567: + case 1569: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:10347 +//line mysql_sql.y:10362 { yyLOCAL = tree.REFERENCE_OPTION_SET_DEFAULT } yyVAL.union = yyLOCAL - case 1568: + case 1570: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.MatchType -//line mysql_sql.y:10352 +//line mysql_sql.y:10367 { yyLOCAL = tree.MATCH_INVALID } yyVAL.union = yyLOCAL - case 1570: + case 1572: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.MatchType -//line mysql_sql.y:10359 +//line mysql_sql.y:10374 { yyLOCAL = tree.MATCH_FULL } yyVAL.union = yyLOCAL - case 1571: + case 1573: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.MatchType -//line mysql_sql.y:10363 +//line mysql_sql.y:10378 { yyLOCAL = tree.MATCH_PARTIAL } yyVAL.union = yyLOCAL - case 1572: + case 1574: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.MatchType -//line mysql_sql.y:10367 +//line mysql_sql.y:10382 { yyLOCAL = tree.MATCH_SIMPLE } yyVAL.union = yyLOCAL - case 1573: + case 1575: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:10372 +//line mysql_sql.y:10387 { yyLOCAL = tree.FULLTEXT_DEFAULT } yyVAL.union = yyLOCAL - case 1574: + case 1576: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:10376 +//line mysql_sql.y:10391 { yyLOCAL = tree.FULLTEXT_NL } yyVAL.union = yyLOCAL - case 1575: + case 1577: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:10380 +//line mysql_sql.y:10395 { yyLOCAL = tree.FULLTEXT_NL_QUERY_EXPANSION } yyVAL.union = yyLOCAL - case 1576: + case 1578: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:10384 +//line mysql_sql.y:10399 { yyLOCAL = tree.FULLTEXT_BOOLEAN } yyVAL.union = yyLOCAL - case 1577: + case 1579: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:10388 +//line mysql_sql.y:10403 { yyLOCAL = tree.FULLTEXT_QUERY_EXPANSION } yyVAL.union = yyLOCAL - case 1578: + case 1580: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.KeyPart -//line mysql_sql.y:10393 +//line mysql_sql.y:10408 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1579: + case 1581: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.KeyPart -//line mysql_sql.y:10397 +//line mysql_sql.y:10412 { yyLOCAL = yyDollar[2].keyPartsUnion() } yyVAL.union = yyLOCAL - case 1580: + case 1582: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:10402 +//line mysql_sql.y:10417 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 1581: + case 1583: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:10406 +//line mysql_sql.y:10421 { yyLOCAL = yyDollar[2].item.(int64) } yyVAL.union = yyLOCAL - case 1588: + case 1590: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Subquery -//line mysql_sql.y:10422 +//line mysql_sql.y:10437 { yyLOCAL = &tree.Subquery{Select: yyDollar[1].selectStatementUnion(), Exists: false} } yyVAL.union = yyLOCAL - case 1589: + case 1591: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10428 +//line mysql_sql.y:10443 { yyLOCAL = tree.NewBinaryExpr(tree.BIT_AND, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1590: + case 1592: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10432 +//line mysql_sql.y:10447 { yyLOCAL = tree.NewBinaryExpr(tree.BIT_OR, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1591: + case 1593: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10436 +//line mysql_sql.y:10451 { yyLOCAL = tree.NewBinaryExpr(tree.BIT_XOR, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1592: + case 1594: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10440 +//line mysql_sql.y:10455 { yyLOCAL = tree.NewBinaryExpr(tree.PLUS, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1593: + case 1595: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10444 +//line mysql_sql.y:10459 { yyLOCAL = tree.NewBinaryExpr(tree.MINUS, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1594: + case 1596: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10448 +//line mysql_sql.y:10463 { yyLOCAL = tree.NewBinaryExpr(tree.MULTI, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1595: + case 1597: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10452 +//line mysql_sql.y:10467 { yyLOCAL = tree.NewBinaryExpr(tree.DIV, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1596: + case 1598: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10456 +//line mysql_sql.y:10471 { yyLOCAL = tree.NewBinaryExpr(tree.INTEGER_DIV, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1597: + case 1599: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10460 +//line mysql_sql.y:10475 { yyLOCAL = tree.NewBinaryExpr(tree.MOD, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1598: + case 1600: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10464 +//line mysql_sql.y:10479 { yyLOCAL = tree.NewBinaryExpr(tree.MOD, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1599: + case 1601: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10468 +//line mysql_sql.y:10483 { yyLOCAL = tree.NewBinaryExpr(tree.LEFT_SHIFT, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1600: + case 1602: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10472 +//line mysql_sql.y:10487 { yyLOCAL = tree.NewBinaryExpr(tree.RIGHT_SHIFT, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1601: + case 1603: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10476 +//line mysql_sql.y:10491 { name := tree.NewUnresolvedColName("json_extract") yyLOCAL = &tree.FuncExpr{ @@ -25080,10 +25158,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1602: + case 1604: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10485 +//line mysql_sql.y:10500 { extractName := tree.NewUnresolvedColName("json_extract") inner := &tree.FuncExpr{ @@ -25099,90 +25177,90 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1603: + case 1605: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10500 +//line mysql_sql.y:10515 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1604: + case 1606: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10506 +//line mysql_sql.y:10521 { yyLOCAL = yyDollar[1].unresolvedNameUnion() } yyVAL.union = yyLOCAL - case 1605: + case 1607: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10510 +//line mysql_sql.y:10525 { yyLOCAL = yyDollar[1].varExprUnion() } yyVAL.union = yyLOCAL - case 1606: + case 1608: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10514 +//line mysql_sql.y:10529 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1607: + case 1609: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10518 +//line mysql_sql.y:10533 { yyLOCAL = tree.NewParentExpr(yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1608: + case 1610: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10522 +//line mysql_sql.y:10537 { yyLOCAL = tree.NewTuple(append(yyDollar[2].exprsUnion(), yyDollar[4].exprUnion())) } yyVAL.union = yyLOCAL - case 1609: + case 1611: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10526 +//line mysql_sql.y:10541 { yyLOCAL = tree.NewUnaryExpr(tree.UNARY_PLUS, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1610: + case 1612: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10530 +//line mysql_sql.y:10545 { yyLOCAL = tree.NewUnaryExpr(tree.UNARY_MINUS, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1611: + case 1613: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10534 +//line mysql_sql.y:10549 { yyLOCAL = tree.NewUnaryExpr(tree.UNARY_TILDE, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1612: + case 1614: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10538 +//line mysql_sql.y:10553 { yyLOCAL = tree.NewUnaryExpr(tree.UNARY_MARK, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1613: + case 1615: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10542 +//line mysql_sql.y:10557 { hint := strings.ToLower(yyDollar[2].cstrUnion().Compare()) switch hint { @@ -25225,35 +25303,35 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1614: + case 1616: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10584 +//line mysql_sql.y:10599 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1615: + case 1617: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10588 +//line mysql_sql.y:10603 { yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL - case 1616: + case 1618: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10592 +//line mysql_sql.y:10607 { yyDollar[2].subqueryUnion().Exists = true yyLOCAL = yyDollar[2].subqueryUnion() } yyVAL.union = yyLOCAL - case 1617: + case 1619: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10597 +//line mysql_sql.y:10612 { yyLOCAL = &tree.CaseExpr{ Expr: yyDollar[2].exprUnion(), @@ -25262,50 +25340,50 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1618: + case 1620: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10605 +//line mysql_sql.y:10620 { yyLOCAL = tree.NewCastExpr(yyDollar[3].exprUnion(), yyDollar[5].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1619: + case 1621: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10609 +//line mysql_sql.y:10624 { yyLOCAL = tree.NewSerialExtractExpr(yyDollar[3].exprUnion(), yyDollar[5].exprUnion(), yyDollar[7].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1620: + case 1622: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10613 +//line mysql_sql.y:10628 { yyLOCAL = tree.NewBitCastExpr(yyDollar[3].exprUnion(), yyDollar[5].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1621: + case 1623: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10617 +//line mysql_sql.y:10632 { yyLOCAL = tree.NewCastExpr(yyDollar[1].exprUnion(), yyDollar[3].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1622: + case 1624: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10621 +//line mysql_sql.y:10636 { yyLOCAL = tree.NewCastExpr(yyDollar[3].exprUnion(), yyDollar[5].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1623: + case 1625: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10625 +//line mysql_sql.y:10640 { name := tree.NewUnresolvedColName(yyDollar[1].str) es := tree.NewNumVal(yyDollar[5].str, yyDollar[5].str, false, tree.P_char) @@ -25316,66 +25394,66 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1624: + case 1626: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10635 +//line mysql_sql.y:10650 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1625: + case 1627: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10639 +//line mysql_sql.y:10654 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1626: + case 1628: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10643 +//line mysql_sql.y:10658 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1627: + case 1629: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10647 +//line mysql_sql.y:10662 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1628: + case 1630: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10651 +//line mysql_sql.y:10666 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1629: + case 1631: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10655 +//line mysql_sql.y:10670 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1630: + case 1632: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10659 +//line mysql_sql.y:10674 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1631: + case 1633: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10663 +//line mysql_sql.y:10678 { val, err := tree.NewFullTextMatchFuncExpression(yyDollar[3].keyPartsUnion(), yyDollar[7].str, yyDollar[8].fullTextSearchTypeUnion()) if err != nil { @@ -25385,16 +25463,16 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1632: + case 1634: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:10674 +//line mysql_sql.y:10689 { yyVAL.str = yyDollar[1].str } - case 1633: + case 1635: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10680 +//line mysql_sql.y:10695 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25404,10 +25482,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1634: + case 1636: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10689 +//line mysql_sql.y:10704 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25417,10 +25495,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1635: + case 1637: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10698 +//line mysql_sql.y:10713 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25430,10 +25508,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1636: + case 1638: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10707 +//line mysql_sql.y:10722 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25443,10 +25521,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1637: + case 1639: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10716 +//line mysql_sql.y:10731 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25457,10 +25535,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1638: + case 1640: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10726 +//line mysql_sql.y:10741 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25470,10 +25548,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1639: + case 1641: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10735 +//line mysql_sql.y:10750 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25484,10 +25562,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1640: + case 1642: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10745 +//line mysql_sql.y:10760 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25498,10 +25576,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1641: + case 1643: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10755 +//line mysql_sql.y:10770 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25512,10 +25590,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1642: + case 1644: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10765 +//line mysql_sql.y:10780 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25526,10 +25604,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1643: + case 1645: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10775 +//line mysql_sql.y:10790 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25540,10 +25618,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1644: + case 1646: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10785 +//line mysql_sql.y:10800 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25554,10 +25632,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1645: + case 1647: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10795 +//line mysql_sql.y:10810 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25568,10 +25646,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1646: + case 1648: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10805 +//line mysql_sql.y:10820 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25582,10 +25660,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1647: + case 1649: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:10815 +//line mysql_sql.y:10830 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -25596,10 +25674,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1648: + case 1650: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10827 +//line mysql_sql.y:10842 { v := int(yyDollar[5].item.(int64)) val, err := tree.NewSampleRowsFuncExpression(v, true, nil, "block") @@ -25610,10 +25688,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1649: + case 1651: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10837 +//line mysql_sql.y:10852 { v := int(yyDollar[5].item.(int64)) val, err := tree.NewSampleRowsFuncExpression(v, true, nil, yyDollar[8].str) @@ -25624,10 +25702,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1650: + case 1652: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10847 +//line mysql_sql.y:10862 { val, err := tree.NewSamplePercentFuncExpression1(yyDollar[5].item.(int64), true, nil) if err != nil { @@ -25637,10 +25715,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1651: + case 1653: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10856 +//line mysql_sql.y:10871 { val, err := tree.NewSamplePercentFuncExpression2(yyDollar[5].item.(float64), true, nil) if err != nil { @@ -25650,10 +25728,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1652: + case 1654: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10866 +//line mysql_sql.y:10881 { v := int(yyDollar[5].item.(int64)) val, err := tree.NewSampleRowsFuncExpression(v, false, yyDollar[3].exprsUnion(), "block") @@ -25664,10 +25742,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1653: + case 1655: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10876 +//line mysql_sql.y:10891 { v := int(yyDollar[5].item.(int64)) val, err := tree.NewSampleRowsFuncExpression(v, false, yyDollar[3].exprsUnion(), yyDollar[8].str) @@ -25678,10 +25756,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1654: + case 1656: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10886 +//line mysql_sql.y:10901 { val, err := tree.NewSamplePercentFuncExpression1(yyDollar[5].item.(int64), false, yyDollar[3].exprsUnion()) if err != nil { @@ -25691,10 +25769,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1655: + case 1657: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10895 +//line mysql_sql.y:10910 { val, err := tree.NewSamplePercentFuncExpression2(yyDollar[5].item.(float64), false, yyDollar[3].exprsUnion()) if err != nil { @@ -25704,58 +25782,58 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1656: + case 1658: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10905 +//line mysql_sql.y:10920 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1657: + case 1659: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10909 +//line mysql_sql.y:10924 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1658: + case 1660: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10914 +//line mysql_sql.y:10929 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1659: + case 1661: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:10918 +//line mysql_sql.y:10933 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1660: + case 1662: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.When -//line mysql_sql.y:10924 +//line mysql_sql.y:10939 { yyLOCAL = []*tree.When{yyDollar[1].whenClauseUnion()} } yyVAL.union = yyLOCAL - case 1661: + case 1663: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.When -//line mysql_sql.y:10928 +//line mysql_sql.y:10943 { yyLOCAL = append(yyDollar[1].whenClauseListUnion(), yyDollar[2].whenClauseUnion()) } yyVAL.union = yyLOCAL - case 1662: + case 1664: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.When -//line mysql_sql.y:10934 +//line mysql_sql.y:10949 { yyLOCAL = &tree.When{ Cond: yyDollar[2].exprUnion(), @@ -25763,9 +25841,9 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1663: + case 1665: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:10943 +//line mysql_sql.y:10958 { t := yyVAL.columnTypeUnion() str := strings.ToLower(t.InternalType.FamilyString) @@ -25778,10 +25856,10 @@ yydefault: } } } - case 1664: + case 1666: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:10955 +//line mysql_sql.y:10970 { name := yyDollar[1].str if yyDollar[2].str != "" { @@ -25799,10 +25877,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1665: + case 1667: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:10972 +//line mysql_sql.y:10987 { locale := "" yyLOCAL = &tree.T{ @@ -25817,10 +25895,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1667: + case 1669: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:10989 +//line mysql_sql.y:11004 { locale := "" yyLOCAL = &tree.T{ @@ -25834,10 +25912,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1668: + case 1670: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:11002 +//line mysql_sql.y:11017 { locale := "" yyLOCAL = &tree.T{ @@ -25851,10 +25929,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1669: + case 1671: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:11015 +//line mysql_sql.y:11030 { locale := "" yyLOCAL = &tree.T{ @@ -25867,10 +25945,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1670: + case 1672: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:11027 +//line mysql_sql.y:11042 { locale := "" yyLOCAL = &tree.T{ @@ -25885,10 +25963,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1671: + case 1673: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:11041 +//line mysql_sql.y:11056 { locale := "" yyLOCAL = &tree.T{ @@ -25904,10 +25982,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1672: + case 1674: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:11056 +//line mysql_sql.y:11071 { locale := "" yyLOCAL = &tree.T{ @@ -25923,10 +26001,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1673: + case 1675: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:11071 +//line mysql_sql.y:11086 { name := yyDollar[1].str if yyDollar[2].str != "" { @@ -25944,10 +26022,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1674: + case 1676: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:11088 +//line mysql_sql.y:11103 { locale := "" yyLOCAL = &tree.T{ @@ -25962,95 +26040,95 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1675: + case 1677: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:11104 +//line mysql_sql.y:11119 { } - case 1679: + case 1681: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:11111 +//line mysql_sql.y:11126 { yyLOCAL = &tree.FrameBound{Type: tree.Following, UnBounded: true} } yyVAL.union = yyLOCAL - case 1680: + case 1682: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:11115 +//line mysql_sql.y:11130 { yyLOCAL = &tree.FrameBound{Type: tree.Following, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1681: + case 1683: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:11119 +//line mysql_sql.y:11134 { yyLOCAL = &tree.FrameBound{Type: tree.Following, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1682: + case 1684: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:11125 +//line mysql_sql.y:11140 { yyLOCAL = &tree.FrameBound{Type: tree.CurrentRow} } yyVAL.union = yyLOCAL - case 1683: + case 1685: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:11129 +//line mysql_sql.y:11144 { yyLOCAL = &tree.FrameBound{Type: tree.Preceding, UnBounded: true} } yyVAL.union = yyLOCAL - case 1684: + case 1686: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:11133 +//line mysql_sql.y:11148 { yyLOCAL = &tree.FrameBound{Type: tree.Preceding, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1685: + case 1687: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:11137 +//line mysql_sql.y:11152 { yyLOCAL = &tree.FrameBound{Type: tree.Preceding, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1686: + case 1688: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FrameType -//line mysql_sql.y:11143 +//line mysql_sql.y:11158 { yyLOCAL = tree.Rows } yyVAL.union = yyLOCAL - case 1687: + case 1689: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FrameType -//line mysql_sql.y:11147 +//line mysql_sql.y:11162 { yyLOCAL = tree.Range } yyVAL.union = yyLOCAL - case 1688: + case 1690: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FrameType -//line mysql_sql.y:11151 +//line mysql_sql.y:11166 { yyLOCAL = tree.Groups } yyVAL.union = yyLOCAL - case 1689: + case 1691: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameClause -//line mysql_sql.y:11157 +//line mysql_sql.y:11172 { yyLOCAL = &tree.FrameClause{ Type: yyDollar[1].frameTypeUnion(), @@ -26059,10 +26137,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1690: + case 1692: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FrameClause -//line mysql_sql.y:11165 +//line mysql_sql.y:11180 { yyLOCAL = &tree.FrameClause{ Type: yyDollar[1].frameTypeUnion(), @@ -26072,82 +26150,82 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1691: + case 1693: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.FrameClause -//line mysql_sql.y:11175 +//line mysql_sql.y:11190 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1692: + case 1694: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.FrameClause -//line mysql_sql.y:11179 +//line mysql_sql.y:11194 { yyLOCAL = yyDollar[1].frameClauseUnion() } yyVAL.union = yyLOCAL - case 1693: + case 1695: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:11185 +//line mysql_sql.y:11200 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1694: + case 1696: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:11190 +//line mysql_sql.y:11205 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1695: + case 1697: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:11194 +//line mysql_sql.y:11209 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 1696: + case 1698: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:11199 +//line mysql_sql.y:11214 { yyVAL.str = "," } - case 1697: + case 1699: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:11203 +//line mysql_sql.y:11218 { yyVAL.str = yyDollar[2].str } - case 1698: + case 1700: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:11208 +//line mysql_sql.y:11223 { yyVAL.str = "1,vector_l2_ops,random,false" } - case 1699: + case 1701: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:11212 +//line mysql_sql.y:11227 { yyVAL.str = yyDollar[2].str } - case 1700: + case 1702: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.WindowSpec -//line mysql_sql.y:11217 +//line mysql_sql.y:11232 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1702: + case 1704: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.WindowSpec -//line mysql_sql.y:11224 +//line mysql_sql.y:11239 { hasFrame := true var f *tree.FrameClause @@ -26172,10 +26250,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1703: + case 1705: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11250 +//line mysql_sql.y:11265 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26188,10 +26266,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1704: + case 1706: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11262 +//line mysql_sql.y:11277 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26204,10 +26282,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1705: + case 1707: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11274 +//line mysql_sql.y:11289 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26219,10 +26297,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1706: + case 1708: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11285 +//line mysql_sql.y:11300 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26234,10 +26312,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1707: + case 1709: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11296 +//line mysql_sql.y:11311 { name := tree.NewUnresolvedColName(yyDollar[1].str) es := tree.NewNumVal("*", "*", false, tree.P_star) @@ -26249,10 +26327,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1708: + case 1710: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11307 +//line mysql_sql.y:11322 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26263,10 +26341,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1709: + case 1711: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11317 +//line mysql_sql.y:11332 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26277,10 +26355,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1710: + case 1712: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11327 +//line mysql_sql.y:11342 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26292,10 +26370,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1711: + case 1713: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11338 +//line mysql_sql.y:11353 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26307,10 +26385,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1712: + case 1714: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11349 +//line mysql_sql.y:11364 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26322,10 +26400,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1713: + case 1715: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11360 +//line mysql_sql.y:11375 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26337,10 +26415,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1714: + case 1716: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11371 +//line mysql_sql.y:11386 { name := tree.NewUnresolvedColName(yyDollar[1].str) es := tree.NewNumVal("*", "*", false, tree.P_star) @@ -26352,10 +26430,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1715: + case 1717: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11382 +//line mysql_sql.y:11397 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26367,10 +26445,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1716: + case 1718: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11393 +//line mysql_sql.y:11408 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26382,10 +26460,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1717: + case 1719: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11404 +//line mysql_sql.y:11419 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26397,10 +26475,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1718: + case 1720: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11415 +//line mysql_sql.y:11430 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26412,10 +26490,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1719: + case 1721: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11426 +//line mysql_sql.y:11441 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26427,10 +26505,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1720: + case 1722: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11437 +//line mysql_sql.y:11452 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26442,10 +26520,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1721: + case 1723: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11448 +//line mysql_sql.y:11463 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26457,10 +26535,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1722: + case 1724: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11459 +//line mysql_sql.y:11474 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26472,10 +26550,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1723: + case 1725: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11470 +//line mysql_sql.y:11485 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26487,10 +26565,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1724: + case 1726: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11481 +//line mysql_sql.y:11496 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26502,10 +26580,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1725: + case 1727: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11492 +//line mysql_sql.y:11507 { name := tree.NewUnresolvedColName(yyDollar[1].str) var columnList tree.Exprs @@ -26523,10 +26601,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1729: + case 1731: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11516 +//line mysql_sql.y:11531 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26536,10 +26614,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1730: + case 1732: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11525 +//line mysql_sql.y:11540 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26549,10 +26627,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1731: + case 1733: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11534 +//line mysql_sql.y:11549 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26562,10 +26640,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1732: + case 1734: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11543 +//line mysql_sql.y:11558 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26575,10 +26653,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1733: + case 1735: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11552 +//line mysql_sql.y:11567 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToLower(yyDollar[3].str) @@ -26590,10 +26668,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1734: + case 1736: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11563 +//line mysql_sql.y:11578 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26603,10 +26681,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1735: + case 1737: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11572 +//line mysql_sql.y:11587 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26617,10 +26695,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1736: + case 1738: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11582 +//line mysql_sql.y:11597 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26630,10 +26708,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1737: + case 1739: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11591 +//line mysql_sql.y:11606 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26643,10 +26721,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1738: + case 1740: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11600 +//line mysql_sql.y:11615 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26656,10 +26734,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1739: + case 1741: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11609 +//line mysql_sql.y:11624 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26669,10 +26747,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1740: + case 1742: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11618 +//line mysql_sql.y:11633 { name := tree.NewUnresolvedColName(yyDollar[1].str) arg0 := tree.NewNumVal(int64(0), "0", false, tree.P_int64) @@ -26685,10 +26763,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1741: + case 1743: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11630 +//line mysql_sql.y:11645 { name := tree.NewUnresolvedColName(yyDollar[1].str) arg0 := tree.NewNumVal(int64(1), "1", false, tree.P_int64) @@ -26700,10 +26778,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1742: + case 1744: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11641 +//line mysql_sql.y:11656 { name := tree.NewUnresolvedColName(yyDollar[1].str) arg0 := tree.NewNumVal(int64(2), "2", false, tree.P_int64) @@ -26717,10 +26795,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1743: + case 1745: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11654 +//line mysql_sql.y:11669 { name := tree.NewUnresolvedColName(yyDollar[1].str) arg0 := tree.NewNumVal(int64(3), "3", false, tree.P_int64) @@ -26733,10 +26811,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1744: + case 1746: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11666 +//line mysql_sql.y:11681 { column := tree.NewUnresolvedColName(yyDollar[3].str) name := tree.NewUnresolvedColName(yyDollar[1].str) @@ -26747,16 +26825,16 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1751: + case 1753: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11688 +//line mysql_sql.y:11703 { yyVAL.str = yyDollar[1].str } - case 1784: + case 1786: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11730 +//line mysql_sql.y:11745 { name := tree.NewUnresolvedColName(yyDollar[1].str) var es tree.Exprs = nil @@ -26770,10 +26848,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1785: + case 1787: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11743 +//line mysql_sql.y:11758 { name := tree.NewUnresolvedColName(yyDollar[1].str) var es tree.Exprs = nil @@ -26787,10 +26865,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1786: + case 1788: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11756 +//line mysql_sql.y:11771 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToLower(yyDollar[3].str) @@ -26802,10 +26880,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1787: + case 1789: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11767 +//line mysql_sql.y:11782 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToLower(yyDollar[3].str) @@ -26817,10 +26895,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1788: + case 1790: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11778 +//line mysql_sql.y:11793 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToUpper(yyDollar[3].str) @@ -26832,10 +26910,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1789: + case 1791: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11790 +//line mysql_sql.y:11805 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26845,10 +26923,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1790: + case 1792: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11799 +//line mysql_sql.y:11814 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26857,10 +26935,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1791: + case 1793: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11807 +//line mysql_sql.y:11822 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26869,10 +26947,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1792: + case 1794: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11815 +//line mysql_sql.y:11830 { name := tree.NewUnresolvedColName(yyDollar[1].str) var es tree.Exprs = nil @@ -26886,10 +26964,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1793: + case 1795: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11828 +//line mysql_sql.y:11843 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26899,10 +26977,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1794: + case 1796: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11837 +//line mysql_sql.y:11852 { name := tree.NewUnresolvedColName(yyDollar[1].str) exprs := make([]tree.Expr, 1) @@ -26914,10 +26992,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1795: + case 1797: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11848 +//line mysql_sql.y:11863 { name := tree.NewUnresolvedColName(yyDollar[1].str) exprs := make([]tree.Expr, 1) @@ -26929,10 +27007,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1796: + case 1798: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11859 +//line mysql_sql.y:11874 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26942,10 +27020,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1797: + case 1799: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11868 +//line mysql_sql.y:11883 { cn := tree.NewNumVal(yyDollar[5].str, yyDollar[5].str, false, tree.P_char) es := yyDollar[3].exprsUnion() @@ -26958,10 +27036,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1798: + case 1800: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11880 +//line mysql_sql.y:11895 { val := tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_char) name := tree.NewUnresolvedColName(yyDollar[1].str) @@ -26972,10 +27050,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1799: + case 1801: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11890 +//line mysql_sql.y:11905 { val := tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_char) name := tree.NewUnresolvedColName(yyDollar[1].str) @@ -26986,10 +27064,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1800: + case 1802: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11900 +//line mysql_sql.y:11915 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -26999,10 +27077,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1801: + case 1803: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11909 +//line mysql_sql.y:11924 { es := tree.Exprs{yyDollar[3].exprUnion()} es = append(es, yyDollar[5].exprUnion()) @@ -27014,10 +27092,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1802: + case 1804: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11920 +//line mysql_sql.y:11935 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -27027,10 +27105,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1803: + case 1805: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11929 +//line mysql_sql.y:11944 { val := tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_char) name := tree.NewUnresolvedColName(yyDollar[1].str) @@ -27041,10 +27119,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1804: + case 1806: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11939 +//line mysql_sql.y:11954 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -27054,10 +27132,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1805: + case 1807: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11948 +//line mysql_sql.y:11963 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -27067,10 +27145,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1806: + case 1808: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:11957 +//line mysql_sql.y:11972 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -27080,34 +27158,34 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1807: + case 1809: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:11967 +//line mysql_sql.y:11982 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1808: + case 1810: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:11971 +//line mysql_sql.y:11986 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1809: + case 1811: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:11977 +//line mysql_sql.y:11992 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1810: + case 1812: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:11981 +//line mysql_sql.y:11996 { ival, errStr := util.GetInt64(yyDollar[2].item) if errStr != "" { @@ -27118,20 +27196,20 @@ yydefault: yyLOCAL = tree.NewNumVal(ival, str, false, tree.P_int64) } yyVAL.union = yyLOCAL - case 1817: + case 1819: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:12000 +//line mysql_sql.y:12015 { } - case 1818: + case 1820: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:12002 +//line mysql_sql.y:12017 { } - case 1853: + case 1855: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12044 +//line mysql_sql.y:12059 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToLower(yyDollar[3].str) @@ -27143,106 +27221,106 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1854: + case 1856: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.FuncType -//line mysql_sql.y:12056 +//line mysql_sql.y:12071 { yyLOCAL = tree.FUNC_TYPE_DEFAULT } yyVAL.union = yyLOCAL - case 1855: + case 1857: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FuncType -//line mysql_sql.y:12060 +//line mysql_sql.y:12075 { yyLOCAL = tree.FUNC_TYPE_DISTINCT } yyVAL.union = yyLOCAL - case 1856: + case 1858: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FuncType -//line mysql_sql.y:12064 +//line mysql_sql.y:12079 { yyLOCAL = tree.FUNC_TYPE_ALL } yyVAL.union = yyLOCAL - case 1857: + case 1859: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Tuple -//line mysql_sql.y:12070 +//line mysql_sql.y:12085 { yyLOCAL = tree.NewTuple(yyDollar[2].exprsUnion()) } yyVAL.union = yyLOCAL - case 1858: + case 1860: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:12075 +//line mysql_sql.y:12090 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1859: + case 1861: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:12079 +//line mysql_sql.y:12094 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 1860: + case 1862: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:12085 +//line mysql_sql.y:12100 { yyLOCAL = tree.Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1861: + case 1863: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:12089 +//line mysql_sql.y:12104 { yyLOCAL = append(yyDollar[1].exprsUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1862: + case 1864: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:12095 +//line mysql_sql.y:12110 { yyLOCAL = tree.Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1863: + case 1865: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:12099 +//line mysql_sql.y:12114 { yyLOCAL = append(yyDollar[1].exprsUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1864: + case 1866: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12106 +//line mysql_sql.y:12121 { yyLOCAL = tree.NewAndExpr(yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1865: + case 1867: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12110 +//line mysql_sql.y:12125 { yyLOCAL = tree.NewOrExpr(yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1866: + case 1868: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12114 +//line mysql_sql.y:12129 { name := tree.NewUnresolvedColName("concat") yyLOCAL = &tree.FuncExpr{ @@ -27252,355 +27330,355 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1867: + case 1869: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12123 +//line mysql_sql.y:12138 { yyLOCAL = tree.NewXorExpr(yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1868: + case 1870: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12127 +//line mysql_sql.y:12142 { yyLOCAL = tree.NewNotExpr(yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1869: + case 1871: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12131 +//line mysql_sql.y:12146 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1870: + case 1872: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12136 +//line mysql_sql.y:12151 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1871: + case 1873: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12140 +//line mysql_sql.y:12155 { yyLOCAL = tree.NewMaxValue() } yyVAL.union = yyLOCAL - case 1872: + case 1874: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12146 +//line mysql_sql.y:12161 { yyLOCAL = tree.NewIsNullExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 1873: + case 1875: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12150 +//line mysql_sql.y:12165 { yyLOCAL = tree.NewIsNotNullExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 1874: + case 1876: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12154 +//line mysql_sql.y:12169 { yyLOCAL = tree.NewIsUnknownExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 1875: + case 1877: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12158 +//line mysql_sql.y:12173 { yyLOCAL = tree.NewIsNotUnknownExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 1876: + case 1878: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12162 +//line mysql_sql.y:12177 { yyLOCAL = tree.NewIsTrueExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 1877: + case 1879: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12166 +//line mysql_sql.y:12181 { yyLOCAL = tree.NewIsNotTrueExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 1878: + case 1880: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12170 +//line mysql_sql.y:12185 { yyLOCAL = tree.NewIsFalseExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 1879: + case 1881: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12174 +//line mysql_sql.y:12189 { yyLOCAL = tree.NewIsNotFalseExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 1880: + case 1882: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12178 +//line mysql_sql.y:12193 { yyLOCAL = tree.NewComparisonExpr(yyDollar[2].comparisonOpUnion(), yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1881: + case 1883: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12182 +//line mysql_sql.y:12197 { yyLOCAL = tree.NewSubqueryComparisonExpr(yyDollar[2].comparisonOpUnion(), yyDollar[3].comparisonOpUnion(), yyDollar[1].exprUnion(), yyDollar[4].subqueryUnion()) yyLOCAL = tree.NewSubqueryComparisonExpr(yyDollar[2].comparisonOpUnion(), yyDollar[3].comparisonOpUnion(), yyDollar[1].exprUnion(), yyDollar[4].subqueryUnion()) } yyVAL.union = yyLOCAL - case 1883: + case 1885: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12190 +//line mysql_sql.y:12205 { yyLOCAL = tree.NewComparisonExpr(tree.IN, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1884: + case 1886: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12194 +//line mysql_sql.y:12209 { yyLOCAL = tree.NewComparisonExpr(tree.NOT_IN, yyDollar[1].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 1885: + case 1887: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12198 +//line mysql_sql.y:12213 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.LIKE, yyDollar[1].exprUnion(), yyDollar[3].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 1886: + case 1888: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12202 +//line mysql_sql.y:12217 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.NOT_LIKE, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 1887: + case 1889: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12206 +//line mysql_sql.y:12221 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.ILIKE, yyDollar[1].exprUnion(), yyDollar[3].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 1888: + case 1890: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12210 +//line mysql_sql.y:12225 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.NOT_ILIKE, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 1889: + case 1891: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12214 +//line mysql_sql.y:12229 { yyLOCAL = tree.NewComparisonExpr(tree.REG_MATCH, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1890: + case 1892: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12218 +//line mysql_sql.y:12233 { yyLOCAL = tree.NewComparisonExpr(tree.NOT_REG_MATCH, yyDollar[1].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 1891: + case 1893: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12222 +//line mysql_sql.y:12237 { yyLOCAL = tree.NewRangeCond(false, yyDollar[1].exprUnion(), yyDollar[3].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 1892: + case 1894: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12226 +//line mysql_sql.y:12241 { yyLOCAL = tree.NewRangeCond(true, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[6].exprUnion()) } yyVAL.union = yyLOCAL - case 1894: + case 1896: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12232 +//line mysql_sql.y:12247 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1895: + case 1897: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12236 +//line mysql_sql.y:12251 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1896: + case 1898: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12242 +//line mysql_sql.y:12257 { yyLOCAL = yyDollar[1].tupleUnion() } yyVAL.union = yyLOCAL - case 1897: + case 1899: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12246 +//line mysql_sql.y:12261 { yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL - case 1898: + case 1900: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:12253 +//line mysql_sql.y:12268 { yyLOCAL = tree.ALL } yyVAL.union = yyLOCAL - case 1899: + case 1901: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:12257 +//line mysql_sql.y:12272 { yyLOCAL = tree.ANY } yyVAL.union = yyLOCAL - case 1900: + case 1902: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:12261 +//line mysql_sql.y:12276 { yyLOCAL = tree.SOME } yyVAL.union = yyLOCAL - case 1901: + case 1903: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:12267 +//line mysql_sql.y:12282 { yyLOCAL = tree.EQUAL } yyVAL.union = yyLOCAL - case 1902: + case 1904: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:12271 +//line mysql_sql.y:12286 { yyLOCAL = tree.LESS_THAN } yyVAL.union = yyLOCAL - case 1903: + case 1905: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:12275 +//line mysql_sql.y:12290 { yyLOCAL = tree.GREAT_THAN } yyVAL.union = yyLOCAL - case 1904: + case 1906: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:12279 +//line mysql_sql.y:12294 { yyLOCAL = tree.LESS_THAN_EQUAL } yyVAL.union = yyLOCAL - case 1905: + case 1907: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:12283 +//line mysql_sql.y:12298 { yyLOCAL = tree.GREAT_THAN_EQUAL } yyVAL.union = yyLOCAL - case 1906: + case 1908: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:12287 +//line mysql_sql.y:12302 { yyLOCAL = tree.NOT_EQUAL } yyVAL.union = yyLOCAL - case 1907: + case 1909: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:12291 +//line mysql_sql.y:12306 { yyLOCAL = tree.NULL_SAFE_EQUAL } yyVAL.union = yyLOCAL - case 1908: + case 1910: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12297 +//line mysql_sql.y:12312 { yyLOCAL = tree.NewAttributePrimaryKey() } yyVAL.union = yyLOCAL - case 1909: + case 1911: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12301 +//line mysql_sql.y:12316 { yyLOCAL = tree.NewAttributeUniqueKey() } yyVAL.union = yyLOCAL - case 1910: + case 1912: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12305 +//line mysql_sql.y:12320 { yyLOCAL = tree.NewAttributeUnique() } yyVAL.union = yyLOCAL - case 1911: + case 1913: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12309 +//line mysql_sql.y:12324 { yyLOCAL = tree.NewAttributeKey() } yyVAL.union = yyLOCAL - case 1912: + case 1914: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12315 +//line mysql_sql.y:12330 { str := fmt.Sprintf("%v", yyDollar[1].item) switch v := yyDollar[1].item.(type) { @@ -27614,35 +27692,35 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1913: + case 1915: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12328 +//line mysql_sql.y:12343 { fval := yyDollar[1].item.(float64) yyLOCAL = tree.NewNumVal(fval, yylex.(*Lexer).scanner.LastToken, false, tree.P_float64) } yyVAL.union = yyLOCAL - case 1914: + case 1916: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12333 +//line mysql_sql.y:12348 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_decimal) } yyVAL.union = yyLOCAL - case 1915: + case 1917: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12339 +//line mysql_sql.y:12354 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 1916: + case 1918: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12343 +//line mysql_sql.y:12358 { str := fmt.Sprintf("%v", yyDollar[1].item) switch v := yyDollar[1].item.(type) { @@ -27656,51 +27734,51 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1917: + case 1919: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12356 +//line mysql_sql.y:12371 { fval := yyDollar[1].item.(float64) yyLOCAL = tree.NewNumVal(fval, yylex.(*Lexer).scanner.LastToken, false, tree.P_float64) } yyVAL.union = yyLOCAL - case 1918: + case 1920: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12361 +//line mysql_sql.y:12376 { yyLOCAL = tree.NewNumVal(true, "true", false, tree.P_bool) } yyVAL.union = yyLOCAL - case 1919: + case 1921: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12365 +//line mysql_sql.y:12380 { yyLOCAL = tree.NewNumVal(false, "false", false, tree.P_bool) } yyVAL.union = yyLOCAL - case 1920: + case 1922: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12369 +//line mysql_sql.y:12384 { yyLOCAL = tree.NewNumVal("null", "null", false, tree.P_null) } yyVAL.union = yyLOCAL - case 1921: + case 1923: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12373 +//line mysql_sql.y:12388 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_hexnum) } yyVAL.union = yyLOCAL - case 1922: + case 1924: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12377 +//line mysql_sql.y:12392 { if strings.HasPrefix(yyDollar[2].str, "0x") { yyDollar[2].str = yyDollar[2].str[2:] @@ -27708,69 +27786,69 @@ yydefault: yyLOCAL = tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_bit) } yyVAL.union = yyLOCAL - case 1923: + case 1925: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12384 +//line mysql_sql.y:12399 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_decimal) } yyVAL.union = yyLOCAL - case 1924: + case 1926: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12388 +//line mysql_sql.y:12403 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_bit) } yyVAL.union = yyLOCAL - case 1925: + case 1927: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12392 +//line mysql_sql.y:12407 { yyLOCAL = tree.NewParamExpr(yylex.(*Lexer).GetParamIndex()) } yyVAL.union = yyLOCAL - case 1926: + case 1928: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12396 +//line mysql_sql.y:12411 { yyLOCAL = tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_ScoreBinary) } yyVAL.union = yyLOCAL - case 1927: + case 1929: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12402 +//line mysql_sql.y:12417 { yyLOCAL = yyDollar[1].columnTypeUnion() yyLOCAL.InternalType.Unsigned = yyDollar[2].unsignedOptUnion() yyLOCAL.InternalType.Zerofill = yyDollar[3].zeroFillOptUnion() } yyVAL.union = yyLOCAL - case 1931: + case 1933: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12413 +//line mysql_sql.y:12428 { yyLOCAL = yyDollar[1].columnTypeUnion() yyLOCAL.InternalType.DisplayWith = yyDollar[2].lengthOptUnion() } yyVAL.union = yyLOCAL - case 1932: + case 1934: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12418 +//line mysql_sql.y:12433 { yyLOCAL = yyDollar[1].columnTypeUnion() } yyVAL.union = yyLOCAL - case 1933: + case 1935: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12424 +//line mysql_sql.y:12439 { locale := "" yyLOCAL = &tree.T{ @@ -27783,10 +27861,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1934: + case 1936: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12436 +//line mysql_sql.y:12451 { locale := "" yyLOCAL = &tree.T{ @@ -27799,10 +27877,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1935: + case 1937: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12448 +//line mysql_sql.y:12463 { locale := "" yyLOCAL = &tree.T{ @@ -27815,10 +27893,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1936: + case 1938: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12460 +//line mysql_sql.y:12475 { locale := "" yyLOCAL = &tree.T{ @@ -27832,10 +27910,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1937: + case 1939: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12473 +//line mysql_sql.y:12488 { locale := "" yyLOCAL = &tree.T{ @@ -27849,10 +27927,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1938: + case 1940: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12486 +//line mysql_sql.y:12501 { locale := "" yyLOCAL = &tree.T{ @@ -27866,10 +27944,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1939: + case 1941: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12499 +//line mysql_sql.y:12514 { locale := "" yyLOCAL = &tree.T{ @@ -27883,10 +27961,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1940: + case 1942: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12512 +//line mysql_sql.y:12527 { locale := "" yyLOCAL = &tree.T{ @@ -27900,10 +27978,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1941: + case 1943: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12525 +//line mysql_sql.y:12540 { locale := "" yyLOCAL = &tree.T{ @@ -27917,10 +27995,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1942: + case 1944: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12538 +//line mysql_sql.y:12553 { locale := "" yyLOCAL = &tree.T{ @@ -27934,10 +28012,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1943: + case 1945: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12551 +//line mysql_sql.y:12566 { locale := "" yyLOCAL = &tree.T{ @@ -27951,10 +28029,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1944: + case 1946: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12564 +//line mysql_sql.y:12579 { locale := "" yyLOCAL = &tree.T{ @@ -27968,10 +28046,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1945: + case 1947: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12577 +//line mysql_sql.y:12592 { locale := "" yyLOCAL = &tree.T{ @@ -27985,10 +28063,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1946: + case 1948: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12590 +//line mysql_sql.y:12605 { locale := "" yyLOCAL = &tree.T{ @@ -28002,10 +28080,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1947: + case 1949: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12605 +//line mysql_sql.y:12620 { locale := "" if yyDollar[2].lengthScaleOptUnion().DisplayWith > 255 { @@ -28033,10 +28111,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1948: + case 1950: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12632 +//line mysql_sql.y:12647 { locale := "" if yyDollar[2].lengthScaleOptUnion().DisplayWith > 255 { @@ -28078,10 +28156,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1949: + case 1951: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12674 +//line mysql_sql.y:12689 { locale := "" if yyDollar[2].lengthScaleOptUnion().Scale != tree.NotDefineDec && yyDollar[2].lengthScaleOptUnion().Scale > yyDollar[2].lengthScaleOptUnion().DisplayWith { @@ -28130,10 +28208,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1950: + case 1952: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12722 +//line mysql_sql.y:12737 { locale := "" if yyDollar[2].lengthScaleOptUnion().Scale != tree.NotDefineDec && yyDollar[2].lengthScaleOptUnion().Scale > yyDollar[2].lengthScaleOptUnion().DisplayWith { @@ -28182,10 +28260,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1951: + case 1953: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12770 +//line mysql_sql.y:12785 { locale := "" yyLOCAL = &tree.T{ @@ -28201,10 +28279,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1952: + case 1954: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12787 +//line mysql_sql.y:12802 { locale := "" yyLOCAL = &tree.T{ @@ -28217,10 +28295,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1953: + case 1955: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12799 +//line mysql_sql.y:12814 { locale := "" if yyDollar[2].lengthOptUnion() < 0 || yyDollar[2].lengthOptUnion() > 6 { @@ -28241,10 +28319,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1954: + case 1956: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12819 +//line mysql_sql.y:12834 { locale := "" if yyDollar[2].lengthOptUnion() < 0 || yyDollar[2].lengthOptUnion() > 6 { @@ -28265,10 +28343,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1955: + case 1957: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12839 +//line mysql_sql.y:12854 { locale := "" if yyDollar[2].lengthOptUnion() < 0 || yyDollar[2].lengthOptUnion() > 6 { @@ -28289,10 +28367,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1956: + case 1958: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12859 +//line mysql_sql.y:12874 { locale := "" yyLOCAL = &tree.T{ @@ -28307,10 +28385,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1957: + case 1959: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12875 +//line mysql_sql.y:12890 { locale := "" yyLOCAL = &tree.T{ @@ -28324,10 +28402,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1958: + case 1960: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12888 +//line mysql_sql.y:12903 { locale := "" yyLOCAL = &tree.T{ @@ -28341,10 +28419,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1959: + case 1961: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12901 +//line mysql_sql.y:12916 { locale := "" yyLOCAL = &tree.T{ @@ -28358,10 +28436,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1960: + case 1962: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12914 +//line mysql_sql.y:12929 { locale := "" yyLOCAL = &tree.T{ @@ -28375,10 +28453,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1961: + case 1963: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12927 +//line mysql_sql.y:12942 { locale := "" yyLOCAL = &tree.T{ @@ -28391,10 +28469,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1962: + case 1964: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12939 +//line mysql_sql.y:12954 { locale := "" yyLOCAL = &tree.T{ @@ -28407,10 +28485,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1963: + case 1965: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12951 +//line mysql_sql.y:12966 { locale := "" yyLOCAL = &tree.T{ @@ -28423,10 +28501,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1964: + case 1966: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12963 +//line mysql_sql.y:12978 { locale := "" yyLOCAL = &tree.T{ @@ -28439,10 +28517,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1965: + case 1967: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12975 +//line mysql_sql.y:12990 { locale := "" yyLOCAL = &tree.T{ @@ -28455,10 +28533,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1966: + case 1968: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12987 +//line mysql_sql.y:13002 { locale := "" yyLOCAL = &tree.T{ @@ -28471,10 +28549,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1967: + case 1969: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12999 +//line mysql_sql.y:13014 { locale := "" yyLOCAL = &tree.T{ @@ -28487,10 +28565,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1968: + case 1970: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13011 +//line mysql_sql.y:13026 { locale := "" yyLOCAL = &tree.T{ @@ -28503,10 +28581,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1969: + case 1971: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13023 +//line mysql_sql.y:13038 { locale := "" yyLOCAL = &tree.T{ @@ -28519,10 +28597,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1970: + case 1972: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13035 +//line mysql_sql.y:13050 { locale := "" yyLOCAL = &tree.T{ @@ -28535,10 +28613,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1971: + case 1973: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13047 +//line mysql_sql.y:13062 { locale := "" yyLOCAL = &tree.T{ @@ -28552,10 +28630,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1972: + case 1974: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13060 +//line mysql_sql.y:13075 { locale := "" yyLOCAL = &tree.T{ @@ -28569,10 +28647,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1973: + case 1975: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13073 +//line mysql_sql.y:13088 { locale := "" yyLOCAL = &tree.T{ @@ -28586,10 +28664,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1974: + case 1976: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13086 +//line mysql_sql.y:13101 { locale := "" yyLOCAL = &tree.T{ @@ -28603,10 +28681,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1975: + case 1977: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13099 +//line mysql_sql.y:13114 { locale := "" yyLOCAL = &tree.T{ @@ -28620,20 +28698,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1976: + case 1978: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:13114 +//line mysql_sql.y:13129 { yyLOCAL = &tree.Do{ Exprs: yyDollar[2].exprsUnion(), } } yyVAL.union = yyLOCAL - case 1977: + case 1979: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:13122 +//line mysql_sql.y:13137 { yyLOCAL = &tree.Declare{ Variables: yyDollar[2].strsUnion(), @@ -28642,10 +28720,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1978: + case 1980: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:13131 +//line mysql_sql.y:13146 { yyLOCAL = &tree.Declare{ Variables: yyDollar[2].strsUnion(), @@ -28654,10 +28732,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1979: + case 1981: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13141 +//line mysql_sql.y:13156 { locale := "" yyLOCAL = &tree.T{ @@ -28670,75 +28748,75 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1988: + case 1990: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:13167 +//line mysql_sql.y:13182 { yyLOCAL = make([]string, 0, 4) yyLOCAL = append(yyLOCAL, yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1989: + case 1991: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:13172 +//line mysql_sql.y:13187 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1990: + case 1992: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:13178 +//line mysql_sql.y:13193 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1992: + case 1994: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:13185 +//line mysql_sql.y:13200 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1993: + case 1995: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:13189 +//line mysql_sql.y:13204 { yyLOCAL = int32(yyDollar[2].item.(int64)) } yyVAL.union = yyLOCAL - case 1994: + case 1996: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:13194 +//line mysql_sql.y:13209 { yyLOCAL = int32(-1) } yyVAL.union = yyLOCAL - case 1995: + case 1997: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:13198 +//line mysql_sql.y:13213 { yyLOCAL = int32(yyDollar[2].item.(int64)) } yyVAL.union = yyLOCAL - case 1996: + case 1998: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:13204 +//line mysql_sql.y:13219 { yyLOCAL = tree.GetDisplayWith(int32(yyDollar[2].item.(int64))) } yyVAL.union = yyLOCAL - case 1997: + case 1999: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:13210 +//line mysql_sql.y:13225 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: tree.NotDefineDisplayWidth, @@ -28746,10 +28824,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1998: + case 2000: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:13217 +//line mysql_sql.y:13232 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: tree.GetDisplayWith(int32(yyDollar[2].item.(int64))), @@ -28757,10 +28835,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1999: + case 2001: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:13224 +//line mysql_sql.y:13239 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: tree.GetDisplayWith(int32(yyDollar[2].item.(int64))), @@ -28768,10 +28846,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2000: + case 2002: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:13233 +//line mysql_sql.y:13248 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: 38, // this is the default precision for decimal @@ -28779,10 +28857,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2001: + case 2003: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:13240 +//line mysql_sql.y:13255 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: tree.GetDisplayWith(int32(yyDollar[2].item.(int64))), @@ -28790,10 +28868,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2002: + case 2004: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:13247 +//line mysql_sql.y:13262 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: tree.GetDisplayWith(int32(yyDollar[2].item.(int64))), @@ -28801,52 +28879,52 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2003: + case 2005: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:13256 +//line mysql_sql.y:13271 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 2004: + case 2006: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:13260 +//line mysql_sql.y:13275 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 2005: + case 2007: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:13264 +//line mysql_sql.y:13279 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 2006: + case 2008: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:13270 +//line mysql_sql.y:13285 { } - case 2007: + case 2009: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:13272 +//line mysql_sql.y:13287 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 2011: + case 2013: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:13282 +//line mysql_sql.y:13297 { yyVAL.str = "" } - case 2012: + case 2014: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:13286 +//line mysql_sql.y:13301 { yyVAL.str = string(yyDollar[1].str) } diff --git a/pkg/sql/parsers/dialect/mysql/mysql_sql.y b/pkg/sql/parsers/dialect/mysql/mysql_sql.y index 55357d641a544..ee938090d1960 100644 --- a/pkg/sql/parsers/dialect/mysql/mysql_sql.y +++ b/pkg/sql/parsers/dialect/mysql/mysql_sql.y @@ -378,7 +378,7 @@ import ( // Secondary Index %token PARSER VISIBLE INVISIBLE BTREE HASH RTREE BSI IVFFLAT MASTER HNSW -%token ZONEMAP LEADING BOTH TRAILING UNKNOWN LISTS OP_TYPE REINDEX EF_SEARCH EF_CONSTRUCTION M ASYNC FORCE_SYNC AUTO_UPDATE +%token ZONEMAP LEADING BOTH TRAILING UNKNOWN LISTS OP_TYPE REINDEX EF_SEARCH EF_CONSTRUCTION M ASYNC FORCE_SYNC AUTO_UPDATE QUANTIZATION INCLUDE // Alter %token EXPIRE ACCOUNT ACCOUNTS UNLOCK DAY NEVER PUMP MYSQL_COMPATIBILITY_MODE UNIQUE_CHECK_ON_AUTOINCR @@ -7942,18 +7942,22 @@ index_option_list: } else if opt2.HnswM > 0 { opt1.HnswM = opt2.HnswM } else if opt2.HnswEfConstruction > 0 { - opt1.HnswEfConstruction = opt2.HnswEfConstruction - } else if opt2.HnswEfSearch > 0 { + opt1.HnswEfConstruction = opt2.HnswEfConstruction + } else if len(opt2.HnswQuantization) > 0 { + opt1.HnswQuantization = opt2.HnswQuantization + } else if opt2.HnswEfSearch > 0 { opt1.HnswEfSearch = opt2.HnswEfSearch - } else if opt2.Async { + } else if len(opt2.IncludeColumns) > 0 { + opt1.IncludeColumns = opt2.IncludeColumns + } else if opt2.Async { opt1.Async = opt2.Async - } else if opt2.ForceSync { + } else if opt2.ForceSync { opt1.ForceSync = opt2.ForceSync - } else if opt2.AutoUpdate { + } else if opt2.AutoUpdate { opt1.AutoUpdate = opt2.AutoUpdate - } else if opt2.Day > 0 { + } else if opt2.Day > 0 { opt1.Day = opt2.Day - } else if opt2.Hour > 0 { + } else if opt2.Hour > 0 { opt1.Hour = opt2.Hour } $$ = opt1 @@ -8088,7 +8092,18 @@ index_option: io.Hour = val $$ = io } - +| QUANTIZATION equal_opt STRING + { + io := tree.NewIndexOption() + io.HnswQuantization = $3 + $$ = io + } +| INCLUDE '(' column_name_list ')' + { + io := tree.NewIndexOption() + io.IncludeColumns = $3 + $$ = io + } index_column_list: index_column @@ -13559,6 +13574,7 @@ non_reserved_keyword: | GEOMETRYCOLLECTION | GLOBAL | HNSW +| INCLUDE | PERSIST | GRANT | INT diff --git a/pkg/sql/parsers/dialect/mysql/mysql_sql_test.go b/pkg/sql/parsers/dialect/mysql/mysql_sql_test.go index def6fb83574b1..ba1b222c35eeb 100644 --- a/pkg/sql/parsers/dialect/mysql/mysql_sql_test.go +++ b/pkg/sql/parsers/dialect/mysql/mysql_sql_test.go @@ -1710,6 +1710,12 @@ var ( }, { input: "create index idx using ivfflat on A (a) LISTS 10 op_type 'vector_l2_ops'", output: "create index idx using ivfflat on a (a) LISTS 10 OP_TYPE vector_l2_ops ", + }, { + input: "create index idx using ivfflat on A (a) LISTS 10 INCLUDE (b, c)", + output: "create index idx using ivfflat on a (a) LISTS 10 INCLUDE (b, c) ", + }, { + input: "create index idx using ivfflat on A (a) LISTS 10 op_type 'vector_l2_ops' INCLUDE (b, c)", + output: "create index idx using ivfflat on a (a) LISTS 10 OP_TYPE vector_l2_ops INCLUDE (b, c) ", }, { input: "create index idx using ivfflat on A (a) LISTS 10 op_type 'vector_l2_ops' async", output: "create index idx using ivfflat on a (a) LISTS 10 OP_TYPE vector_l2_ops ASYNC ", diff --git a/pkg/sql/parsers/tree/create.go b/pkg/sql/parsers/tree/create.go index 1cbce03157649..b67abde913951 100644 --- a/pkg/sql/parsers/tree/create.go +++ b/pkg/sql/parsers/tree/create.go @@ -2121,6 +2121,8 @@ type IndexOption struct { AutoUpdate bool Day int64 Hour int64 + HnswQuantization string + IncludeColumns []*UnresolvedName } // Must follow the following sequence when test @@ -2129,7 +2131,8 @@ func (node *IndexOption) Format(ctx *FmtCtx) { node.Comment != "" || node.Visible != VISIBLE_TYPE_INVALID || node.AlgoParamList != 0 || node.AlgoParamVectorOpType != "" || node.HnswM != 0 || node.HnswEfConstruction != 0 || - node.HnswEfSearch != 0 || node.AutoUpdate || node.Day != 0 || + node.HnswEfSearch != 0 || node.HnswQuantization != "" || + len(node.IncludeColumns) > 0 || node.AutoUpdate || node.Day != 0 || node.Hour != 0 { ctx.WriteByte(' ') } @@ -2168,11 +2171,26 @@ func (node *IndexOption) Format(ctx *FmtCtx) { ctx.WriteString(strconv.FormatInt(node.HnswEfSearch, 10)) ctx.WriteByte(' ') } + if node.HnswQuantization != "" { + ctx.WriteString("QUANTIZATION ") + ctx.WriteString(node.HnswQuantization) + ctx.WriteByte(' ') + } if node.AlgoParamVectorOpType != "" { ctx.WriteString("OP_TYPE ") ctx.WriteString(node.AlgoParamVectorOpType) ctx.WriteByte(' ') } + if len(node.IncludeColumns) > 0 { + ctx.WriteString("INCLUDE (") + for i, col := range node.IncludeColumns { + if i > 0 { + ctx.WriteString(", ") + } + col.Format(ctx) + } + ctx.WriteString(") ") + } if node.Visible != VISIBLE_TYPE_INVALID { ctx.WriteString(node.Visible.ToString()) } diff --git a/pkg/sql/plan/apply_indices.go b/pkg/sql/plan/apply_indices.go index 6b97c6f15647e..fb17174e5a672 100644 --- a/pkg/sql/plan/apply_indices.go +++ b/pkg/sql/plan/apply_indices.go @@ -602,7 +602,7 @@ func (builder *QueryBuilder) applyIndicesForProject(nodeID int32, projNode *plan for _, multiTableIndexKey := range multiTableIndexKeys { multiTableIndex := multiTableIndexes[multiTableIndexKey] - switch multiTableIndex.IndexAlgo { + switch getVectorIndexLogicalAlgo(multiTableIndex) { case catalog.MoIndexIvfFlatAlgo.ToString(): newNodeID, err := builder.applyIndicesForSortUsingIvfflat(nodeID, vecCtx, multiTableIndex, colRefCnt, idxColMap) if err != nil || newNodeID != nodeID { @@ -808,7 +808,7 @@ func (builder *QueryBuilder) detectVectorGuard(projNode *plan.Node) []int32 { } for _, multi := range multiTableIndexes { - switch multi.IndexAlgo { + switch getVectorIndexLogicalAlgo(multi) { case catalog.MoIndexIvfFlatAlgo.ToString(): if ctx, err := builder.prepareIvfIndexContext(vecCtx, multi); err == nil && ctx != nil { return []int32{vecCtx.scanNode.NodeId} @@ -843,9 +843,107 @@ func (builder *QueryBuilder) collectVectorIndexes(scanNode *plan.Node) map[strin multiTableIndexes[indexDef.IndexName].IndexDefs[catalog.ToLower(indexDef.IndexAlgoTableType)] = indexDef } } + + for name, multiTableIndex := range multiTableIndexes { + logicalDef, ok := constructVectorIndexLogicalDef(multiTableIndex) + if !ok { + delete(multiTableIndexes, name) + continue + } + multiTableIndex.LogicalDef = logicalDef + multiTableIndex.IndexAlgo = catalog.ToLower(logicalDef.IndexAlgo) + } return multiTableIndexes } +func constructVectorIndexLogicalDef(multiTableIndex *MultiTableIndex) (*plan.IndexDef, bool) { + if multiTableIndex == nil || len(multiTableIndex.IndexDefs) == 0 { + return nil, false + } + + var logicalDef *plan.IndexDef + for _, indexDef := range multiTableIndex.IndexDefs { + if indexDef == nil { + return nil, false + } + if logicalDef == nil { + logicalDef = &plan.IndexDef{ + IndexName: indexDef.IndexName, + IndexAlgo: catalog.ToLower(indexDef.IndexAlgo), + Parts: slices.Clone(indexDef.Parts), + IncludedColumns: slices.Clone(indexDef.IncludedColumns), + Comment: indexDef.Comment, + Visible: indexDef.Visible, + } + continue + } + if !vectorIndexLogicalDefMatches(logicalDef, indexDef) { + return nil, false + } + } + + if logicalDef == nil || logicalDef.IndexName == "" || logicalDef.IndexAlgo == "" || len(logicalDef.Parts) == 0 { + return nil, false + } + return logicalDef, true +} + +func ensureVectorIndexLogicalDef(multiTableIndex *MultiTableIndex) *plan.IndexDef { + if multiTableIndex == nil { + return nil + } + if multiTableIndex.LogicalDef != nil { + return multiTableIndex.LogicalDef + } + logicalDef, ok := constructVectorIndexLogicalDef(multiTableIndex) + if !ok { + return nil + } + multiTableIndex.LogicalDef = logicalDef + multiTableIndex.IndexAlgo = catalog.ToLower(logicalDef.IndexAlgo) + return logicalDef +} + +func vectorIndexLogicalDefMatches(logicalDef *plan.IndexDef, indexDef *plan.IndexDef) bool { + if logicalDef == nil || indexDef == nil { + return false + } + return logicalDef.IndexName == indexDef.IndexName && + // The constructed logical view stores a normalized lowercase algo name, so + // each physical def is compared after the same normalization. + logicalDef.IndexAlgo == catalog.ToLower(indexDef.IndexAlgo) && + slices.Equal(logicalDef.Parts, indexDef.Parts) && + slices.Equal(logicalDef.IncludedColumns, indexDef.IncludedColumns) && + logicalDef.Comment == indexDef.Comment && + logicalDef.Visible == indexDef.Visible +} + +func getVectorIndexIncludedColumns(multiTableIndex *MultiTableIndex) []string { + logicalDef := ensureVectorIndexLogicalDef(multiTableIndex) + if logicalDef == nil { + return nil + } + return slices.Clone(logicalDef.IncludedColumns) +} + +func getVectorIndexLogicalParts(multiTableIndex *MultiTableIndex) []string { + logicalDef := ensureVectorIndexLogicalDef(multiTableIndex) + if logicalDef == nil { + return nil + } + return slices.Clone(logicalDef.Parts) +} + +func getVectorIndexLogicalAlgo(multiTableIndex *MultiTableIndex) string { + if multiTableIndex == nil { + return "" + } + if logicalDef := ensureVectorIndexLogicalDef(multiTableIndex); logicalDef != nil { + return catalog.ToLower(logicalDef.IndexAlgo) + } + return catalog.ToLower(multiTableIndex.IndexAlgo) +} + func (builder *QueryBuilder) applyIndicesForFiltersRegularIndex(nodeID int32, node *plan.Node, colRefCnt map[[2]int32]int, idxColMap map[[2]int32]*plan.Expr) int32 { if len(node.FilterList) == 0 || len(node.TableDef.Indexes) == 0 { return nodeID diff --git a/pkg/sql/plan/apply_indices_hnsw.go b/pkg/sql/plan/apply_indices_hnsw.go index 4176970df7d66..140495d018c12 100644 --- a/pkg/sql/plan/apply_indices_hnsw.go +++ b/pkg/sql/plan/apply_indices_hnsw.go @@ -40,6 +40,29 @@ type hnswIndexContext struct { nThread int64 } +func buildHnswTableFuncArgs(tblCfgStr string, vecLitArg *plan.Expr, filterPayload string) []*plan.Expr { + args := []*plan.Expr{ + { + Typ: plan.Type{ + Id: int32(types.T_varchar), + }, + Expr: &plan.Expr_Lit{ + Lit: &plan.Literal{ + Value: &plan.Literal_Sval{ + Sval: tblCfgStr, + }, + }, + }, + }, + DeepCopyExpr(vecLitArg), + } + + if filterPayload != "" { + args = append(args, makePlan2StringConstExprWithType(filterPayload)) + } + return args +} + func (builder *QueryBuilder) prepareHnswIndexContext(vecCtx *vectorSortContext, multiTableIndex *MultiTableIndex) (*hnswIndexContext, error) { if vecCtx == nil || multiTableIndex == nil { return nil, nil @@ -80,7 +103,11 @@ func (builder *QueryBuilder) prepareHnswIndexContext(vecCtx *vectorSortContext, return nil, nil } - keyPart := idxDef.Parts[0] + keyParts := getVectorIndexLogicalParts(multiTableIndex) + if len(keyParts) == 0 { + return nil, nil + } + keyPart := keyParts[0] partPos := vecCtx.scanNode.TableDef.Name2ColIndex[keyPart] _, vecLitArg, found := builder.getArgsFromDistFn(vecCtx.distFnExpr, partPos) if !found { @@ -136,6 +163,31 @@ func (builder *QueryBuilder) applyIndicesForSortUsingHnsw(nodeID int32, vecCtx * hnswCtx.nThread, hnswCtx.origFuncName) + filterPayload := "" + if len(scanNode.FilterList) > 0 { + includeColumns := getVectorIndexIncludedColumns(multiTableIndex) + coveragePushdownFilters, coverageResidualFilters := splitFiltersByVectorIndexCoverage( + scanNode.FilterList, + scanNode, + includeColumns, + hnswCtx.partPos, + ) + var loweredPushdownFilters, loweringResidualFilters []*plan.Expr + filterPayload, loweredPushdownFilters, loweringResidualFilters, err = lowerFiltersToHnswPayload( + coveragePushdownFilters, + scanNode, + hnswCtx.partPos, + ) + if err != nil { + return 0, err + } + // TODO(vector-index phase 2): once the HNSW runtime enforces predicate + // filtering, rebuild scanNode.FilterList from coverageResidualFilters and + // loweringResidualFilters so loweredPushdownFilters no longer execute on + // the outer scan. + _, _, _ = coverageResidualFilters, loweredPushdownFilters, loweringResidualFilters + } + // JOIN between source table and hnsw_search table function tableFuncTag := builder.genNewBindTag() tableFuncNode := &plan.Node{ @@ -150,22 +202,8 @@ func (builder *QueryBuilder) applyIndicesForSortUsingHnsw(nodeID int32, vecCtx * }, Cols: DeepCopyColDefList(kHNSWSearchColDefs), }, - BindingTags: []int32{tableFuncTag}, - TblFuncExprList: []*plan.Expr{ - { - Typ: plan.Type{ - Id: int32(types.T_varchar), - }, - Expr: &plan.Expr_Lit{ - Lit: &plan.Literal{ - Value: &plan.Literal_Sval{ - Sval: tblCfgStr, - }, - }, - }, - }, - DeepCopyExpr(hnswCtx.vecLitArg), - }, + BindingTags: []int32{tableFuncTag}, + TblFuncExprList: buildHnswTableFuncArgs(tblCfgStr, hnswCtx.vecLitArg, filterPayload), } tableFuncNodeID := builder.appendNode(tableFuncNode, ctx) diff --git a/pkg/sql/plan/apply_indices_hnsw_test.go b/pkg/sql/plan/apply_indices_hnsw_test.go index af51f787cb267..c1ab049ba82da 100644 --- a/pkg/sql/plan/apply_indices_hnsw_test.go +++ b/pkg/sql/plan/apply_indices_hnsw_test.go @@ -40,6 +40,29 @@ func (c *customMockCompilerContext) ResolveVariable(varName string, isSystemVar, return c.MockCompilerContext.ResolveVariable(varName, isSystemVar, isGlobalVar) } +func makeConsistentHnswMultiTableIndexForTest(indexName, idxAlgoParams string, parts []string) *MultiTableIndex { + clonedParts := append([]string(nil), parts...) + return &MultiTableIndex{ + IndexAlgo: catalog.MoIndexHnswAlgo.ToString(), + IndexDefs: map[string]*plan.IndexDef{ + catalog.Hnsw_TblType_Metadata: { + IndexName: indexName, + IndexAlgo: catalog.MoIndexHnswAlgo.ToString(), + IndexAlgoTableType: catalog.Hnsw_TblType_Metadata, + Parts: append([]string(nil), clonedParts...), + IndexAlgoParams: idxAlgoParams, + }, + catalog.Hnsw_TblType_Storage: { + IndexName: indexName, + IndexAlgo: catalog.MoIndexHnswAlgo.ToString(), + IndexAlgoTableType: catalog.Hnsw_TblType_Storage, + Parts: append([]string(nil), clonedParts...), + IndexAlgoParams: idxAlgoParams, + }, + }, + } +} + // TestPrepareHnswIndexContext_NilVecCtx tests the case where vecCtx is nil func TestPrepareHnswIndexContext_NilVecCtx(t *testing.T) { builder := NewQueryBuilder(plan.Query_SELECT, NewMockCompilerContext(true), false, true) @@ -325,16 +348,11 @@ func TestPrepareHnswIndexContext_ArgsNotFound(t *testing.T) { scanNode: scanNode, } - multiTableIndex := &MultiTableIndex{ - IndexDefs: map[string]*plan.IndexDef{ - catalog.Hnsw_TblType_Metadata: { - IndexAlgoParams: `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `"}`, - }, - catalog.Hnsw_TblType_Storage: { - Parts: []string{"vec_col"}, - }, - }, - } + multiTableIndex := makeConsistentHnswMultiTableIndexForTest( + "idx_hnsw_args_not_found", + `{"op_type": "`+metric.DistFuncOpTypes["l2_distance"]+`"}`, + []string{"vec_col"}, + ) result, err := builder.prepareHnswIndexContext(vecCtx, multiTableIndex) assert.NoError(t, err) @@ -409,16 +427,11 @@ func TestPrepareHnswIndexContext_ResolveVariableError(t *testing.T) { scanNode: scanNode, } - multiTableIndex := &MultiTableIndex{ - IndexDefs: map[string]*plan.IndexDef{ - catalog.Hnsw_TblType_Metadata: { - IndexAlgoParams: `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `"}`, - }, - catalog.Hnsw_TblType_Storage: { - Parts: []string{"vec_col"}, - }, - }, - } + multiTableIndex := makeConsistentHnswMultiTableIndexForTest( + "idx_hnsw_resolve_variable", + `{"op_type": "`+metric.DistFuncOpTypes["l2_distance"]+`"}`, + []string{"vec_col"}, + ) result, err := builder.prepareHnswIndexContext(vecCtx, multiTableIndex) assert.Error(t, err) @@ -496,17 +509,11 @@ func TestPrepareHnswIndexContext_Success(t *testing.T) { } idxAlgoParams := `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `", "m": 16, "ef_construction": 200}` - multiTableIndex := &MultiTableIndex{ - IndexDefs: map[string]*plan.IndexDef{ - catalog.Hnsw_TblType_Metadata: { - IndexAlgoParams: idxAlgoParams, - }, - catalog.Hnsw_TblType_Storage: { - Parts: []string{"vec_col"}, - IndexAlgoParams: idxAlgoParams, - }, - }, - } + multiTableIndex := makeConsistentHnswMultiTableIndexForTest( + "idx_hnsw_success", + idxAlgoParams, + []string{"vec_col"}, + ) result, err := builder.prepareHnswIndexContext(vecCtx, multiTableIndex) require.NoError(t, err) @@ -524,6 +531,159 @@ func TestPrepareHnswIndexContext_Success(t *testing.T) { assert.NotNil(t, result.vecLitArg) } +func TestApplyIndicesForSortUsingHnswPassesCoveredFilterPayload(t *testing.T) { + baseMockCtx := NewMockCompilerContext(true) + mockCtx := &customMockCompilerContext{ + MockCompilerContext: baseMockCtx, + resolveVarFunc: func(varName string, isSystem, isGlobal bool) (interface{}, error) { + if varName == "hnsw_threads_search" { + return int64(4), nil + } + return baseMockCtx.ResolveVariable(varName, isSystem, isGlobal) + }, + } + + builder := NewQueryBuilder(plan.Query_SELECT, mockCtx, false, true) + ctx := NewBindContext(builder, nil) + scanTag := builder.genNewBindTag() + tableDef := &plan.TableDef{ + Name: "t_hnsw_payload", + Cols: []*plan.ColDef{ + {Name: "id", Typ: plan.Type{Id: int32(types.T_int64), Width: 64}}, + {Name: "embedding", Typ: plan.Type{Id: int32(types.T_array_float32), Width: 3}}, + {Name: "category", Typ: plan.Type{Id: int32(types.T_int32)}}, + {Name: "note", Typ: plan.Type{Id: int32(types.T_varchar)}}, + }, + Pkey: &plan.PrimaryKeyDef{ + PkeyColName: "id", + Names: []string{"id"}, + }, + Name2ColIndex: map[string]int32{ + "id": 0, + "embedding": 1, + "category": 2, + "note": 3, + }, + } + scanNode := &plan.Node{ + NodeType: plan.Node_TABLE_SCAN, + TableDef: tableDef, + ObjRef: &plan.ObjectRef{SchemaName: "db", ObjName: "t_hnsw_payload"}, + BindingTags: []int32{scanTag}, + } + scanNodeID := builder.appendNode(scanNode, ctx) + + scanNode.FilterList = []*plan.Expr{ + { + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: ">="}, + Args: []*plan.Expr{ + {Typ: tableDef.Cols[2].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 2, Name: "category"}}}, + MakePlan2Int32ConstExprWithType(20), + }, + }, + }, + }, + { + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: "="}, + Args: []*plan.Expr{ + {Typ: tableDef.Cols[3].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 3, Name: "note"}}}, + makePlan2StringConstExprWithType("cold"), + }, + }, + }, + }, + } + + vecTyp := plan.Type{Id: int32(types.T_array_float32), Width: 3} + vecCtx := &vectorSortContext{ + scanNode: scanNode, + sortNode: &plan.Node{NodeType: plan.Node_SORT}, + projNode: &plan.Node{ + NodeType: plan.Node_PROJECT, + Children: []int32{scanNodeID}, + ProjectList: []*plan.Expr{ + {Typ: tableDef.Cols[0].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 0, Name: "id"}}}, + {Typ: tableDef.Cols[2].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 2, Name: "category"}}}, + }, + }, + distFnExpr: &plan.Function{ + Func: &plan.ObjectRef{ObjName: "l2_distance"}, + Args: []*plan.Expr{ + {Typ: vecTyp, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 1, Name: "embedding"}}}, + {Typ: vecTyp, Expr: &plan.Expr_Lit{Lit: &plan.Literal{Value: &plan.Literal_VecVal{VecVal: "[0,1,0]"}}}}, + }, + }, + limit: makePlan2Uint64ConstExprWithType(2), + } + + idxAlgoParams := `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `"}` + multiTableIndex := &MultiTableIndex{ + IndexAlgo: catalog.MoIndexHnswAlgo.ToString(), + IndexDefs: map[string]*plan.IndexDef{ + catalog.Hnsw_TblType_Metadata: { + IndexName: "idx_hnsw_payload", + IndexAlgo: catalog.MoIndexHnswAlgo.ToString(), + IndexAlgoTableType: catalog.Hnsw_TblType_Metadata, + IndexTableName: "hnsw_meta", + Parts: []string{"embedding"}, + IncludedColumns: []string{"category"}, + IndexAlgoParams: idxAlgoParams, + }, + catalog.Hnsw_TblType_Storage: { + IndexName: "idx_hnsw_payload", + IndexAlgo: catalog.MoIndexHnswAlgo.ToString(), + IndexAlgoTableType: catalog.Hnsw_TblType_Storage, + IndexTableName: "hnsw_index", + Parts: []string{"embedding"}, + IncludedColumns: []string{"category"}, + IndexAlgoParams: idxAlgoParams, + }, + }, + } + + _, err := builder.applyIndicesForSortUsingHnsw(scanNodeID, vecCtx, multiTableIndex) + require.NoError(t, err) + + sortNode := builder.qry.Nodes[vecCtx.projNode.Children[0]] + require.Equal(t, plan.Node_SORT, sortNode.NodeType) + tableFuncNode := findHnswTableFunctionNode(builder, sortNode.Children[0]) + require.NotNil(t, tableFuncNode) + require.Len(t, tableFuncNode.TblFuncExprList, 3) + + payload := tableFuncNode.TblFuncExprList[2].GetLit().GetSval() + require.NotEmpty(t, payload) + assert.Contains(t, payload, `"column":"category"`) + assert.NotContains(t, payload, `"column":"note"`) + assert.NotContains(t, payload, "RelPos") + assert.NotContains(t, payload, "ColPos") + require.Len(t, scanNode.FilterList, 2) +} + +func findHnswTableFunctionNode(builder *QueryBuilder, nodeID int32) *plan.Node { + if int(nodeID) >= len(builder.qry.Nodes) || builder.qry.Nodes[nodeID] == nil { + return nil + } + node := builder.qry.Nodes[nodeID] + if node.NodeType == plan.Node_FUNCTION_SCAN && + node.TableDef != nil && + node.TableDef.TblFunc != nil && + node.TableDef.TblFunc.Name == kHNSWSearchFuncName { + return node + } + for _, childID := range node.Children { + if found := findHnswTableFunctionNode(builder, childID); found != nil { + return found + } + } + return nil +} + // TestPrepareHnswIndexContext_DifferentDistanceFunctions tests success with different distance functions func TestPrepareHnswIndexContext_DifferentDistanceFunctions(t *testing.T) { testCases := []struct { @@ -629,17 +789,11 @@ func TestPrepareHnswIndexContext_DifferentDistanceFunctions(t *testing.T) { } idxAlgoParams := `{"op_type": "` + opType + `"}` - multiTableIndex := &MultiTableIndex{ - IndexDefs: map[string]*plan.IndexDef{ - catalog.Hnsw_TblType_Metadata: { - IndexAlgoParams: idxAlgoParams, - }, - catalog.Hnsw_TblType_Storage: { - Parts: []string{"vec_col"}, - IndexAlgoParams: idxAlgoParams, - }, - }, - } + multiTableIndex := makeConsistentHnswMultiTableIndexForTest( + "idx_hnsw_distance_fn", + idxAlgoParams, + []string{"vec_col"}, + ) result, err := builder.prepareHnswIndexContext(vecCtx, multiTableIndex) require.NoError(t, err) diff --git a/pkg/sql/plan/apply_indices_ivfflat.go b/pkg/sql/plan/apply_indices_ivfflat.go index 289ef3ab8cba0..60f89331cb425 100644 --- a/pkg/sql/plan/apply_indices_ivfflat.go +++ b/pkg/sql/plan/apply_indices_ivfflat.go @@ -15,16 +15,22 @@ package plan import ( + "encoding/json" "fmt" "math" + "strings" + "time" "github.com/bytedance/sonic" "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/defines" "github.com/matrixorigin/matrixone/pkg/logutil" "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect" "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/matrixorigin/matrixone/pkg/vectorindex" "github.com/matrixorigin/matrixone/pkg/vectorindex/metric" ) @@ -44,7 +50,7 @@ type ivfIndexContext struct { nProbe int64 pushdownEnabled bool - // Phase 1: Auto mode support + // Auto mode support. isAutoMode bool // Whether in auto mode initialStrategy string // Initial strategy selected in auto mode ("pre" or "post") } @@ -139,7 +145,7 @@ func (builder *QueryBuilder) resolveVectorSearchMode( if userMode == "auto" || (userMode == "" && enableVectorAutoModeByDefault) { isAutoMode = true - // Phase 2: Check if this is a very small dataset + // Check if this is a very small dataset. if builder.shouldUseForceMode(vecCtx) { logutil.Debugf("Auto mode: small dataset, selected 'force'") return "force", isAutoMode, true @@ -186,6 +192,865 @@ func (builder *QueryBuilder) calculateAdaptiveNprobe(baseNprobe int64, stats *pl return adaptiveNprobe } +var ivfTreeEmptyLocale = "" + +func buildIvfTableFuncArgs(tblCfgStr string, vecLitArg *plan.Expr, pushdownFilterSQL string, searchRoundLimit uint64, bucketExpandStep uint64) []*plan.Expr { + args := []*plan.Expr{ + { + Typ: plan.Type{ + Id: int32(types.T_varchar), + }, + Expr: &plan.Expr_Lit{ + Lit: &plan.Literal{ + Value: &plan.Literal_Sval{ + Sval: tblCfgStr, + }, + }, + }, + }, + DeepCopyExpr(vecLitArg), + } + + if pushdownFilterSQL == "" && searchRoundLimit == 0 && bucketExpandStep == 0 { + return args + } + + args = append(args, + makePlan2StringConstExprWithType(pushdownFilterSQL), + makePlan2Uint64ConstExprWithType(searchRoundLimit), + makePlan2Uint64ConstExprWithType(bucketExpandStep), + ) + return args +} + +func buildIvfChildProjectionMap(childNode *plan.Node) map[[2]int32]*plan.Expr { + if childNode == nil || len(childNode.BindingTags) == 0 { + return nil + } + + childMap := make(map[[2]int32]*plan.Expr, len(childNode.ProjectList)) + for i, expr := range childNode.ProjectList { + childMap[[2]int32{childNode.BindingTags[0], int32(i)}] = DeepCopyExpr(expr) + } + return childMap +} + +func collectRequiredColumns( + projNode, childNode, scanNode *plan.Node, + orderExpr *plan.Expr, + partPos int32, +) map[string]struct{} { + required := make(map[string]struct{}) + if scanNode == nil || scanNode.TableDef == nil || len(scanNode.BindingTags) == 0 { + return required + } + + scanTag := scanNode.BindingTags[0] + childMap := buildIvfChildProjectionMap(childNode) + + if projNode != nil { + for _, expr := range projNode.ProjectList { + resolved := replaceColumnsForExpr(DeepCopyExpr(expr), childMap) + collectScanColumnsFromExpr(resolved, scanTag, partPos, scanNode.TableDef, required) + } + } + + if orderExpr != nil { + resolved := replaceColumnsForExpr(DeepCopyExpr(orderExpr), childMap) + collectScanColumnsFromExpr(resolved, scanTag, partPos, scanNode.TableDef, required) + } + + for _, expr := range scanNode.FilterList { + collectScanColumnsFromExpr(DeepCopyExpr(expr), scanTag, partPos, scanNode.TableDef, required) + } + + return required +} + +func collectProjectedColumns( + projNode, childNode, scanNode *plan.Node, + partPos int32, +) map[string]struct{} { + projected := make(map[string]struct{}) + if projNode == nil || scanNode == nil || scanNode.TableDef == nil || len(scanNode.BindingTags) == 0 { + return projected + } + + scanTag := scanNode.BindingTags[0] + childMap := buildIvfChildProjectionMap(childNode) + for _, expr := range projNode.ProjectList { + resolved := replaceColumnsForExpr(DeepCopyExpr(expr), childMap) + collectScanColumnsFromExpr(resolved, scanTag, partPos, scanNode.TableDef, projected) + } + return projected +} + +func collectScanColumnsFromExpr(expr *plan.Expr, scanTag, partPos int32, tableDef *plan.TableDef, out map[string]struct{}) { + if expr == nil || tableDef == nil { + return + } + + switch impl := expr.Expr.(type) { + case *plan.Expr_Col: + if colName, ok := vectorIndexColumnNameFromTableDef(impl.Col, tableDef, scanTag); ok { + out[colName] = struct{}{} + } + case *plan.Expr_F: + if isVectorDistanceExpr(expr, scanTag, partPos) { + return + } + for _, arg := range impl.F.Args { + collectScanColumnsFromExpr(arg, scanTag, partPos, tableDef, out) + } + case *plan.Expr_List: + for _, sub := range impl.List.List { + collectScanColumnsFromExpr(sub, scanTag, partPos, tableDef, out) + } + } +} + +func canDoIndexOnlyScan(requiredCols map[string]struct{}, tableDef *plan.TableDef, includeColumns []string) bool { + if tableDef == nil || tableDef.Pkey == nil { + return false + } + + covered := buildVectorIndexCoveredColumns(tableDef, includeColumns) + for col := range requiredCols { + if _, ok := covered[col]; !ok { + return false + } + } + return true +} + +func serializeFiltersToSQL(filters []*plan.Expr, scanNode *plan.Node, includeColumns []string, partPos int32) (string, []*plan.Expr, []*plan.Expr, error) { + if scanNode == nil || scanNode.TableDef == nil || len(scanNode.BindingTags) == 0 { + return "", nil, filters, nil + } + + covered := buildVectorIndexCoveredColumns(scanNode.TableDef, includeColumns) + scanTag := scanNode.BindingTags[0] + sqlParts := make([]string, 0, len(filters)) + pushdownFilters := make([]*plan.Expr, 0, len(filters)) + remainingFilters := make([]*plan.Expr, 0, len(filters)) + for _, expr := range filters { + astExpr, ok, err := serializeFilterExprToAST(expr, scanNode, scanTag, partPos, covered) + if err != nil { + return "", nil, nil, err + } + if !ok { + remainingFilters = append(remainingFilters, expr) + continue + } + sql := tree.StringWithOpts(astExpr, dialect.MYSQL, tree.WithQuoteString(true)) + sqlParts = append(sqlParts, "("+sql+")") + pushdownFilters = append(pushdownFilters, expr) + } + + return strings.Join(sqlParts, " AND "), pushdownFilters, remainingFilters, nil +} + +func serializeFilterExprToAST(expr *plan.Expr, scanNode *plan.Node, scanTag, partPos int32, covered map[string]struct{}) (tree.Expr, bool, error) { + if !vectorIndexExprRefsOnlyCoveredColumns(expr, scanTag, partPos, scanNode.TableDef, covered) { + return nil, false, nil + } + + switch impl := expr.Expr.(type) { + case *plan.Expr_Col: + colExpr, err := ivfFilterColumnToAST(impl.Col, scanNode) + if err != nil { + return nil, false, err + } + return colExpr, true, nil + case *plan.Expr_Lit: + litExpr, err := ivfLiteralToAST(impl.Lit, expr.Typ) + if err != nil { + return nil, false, err + } + return litExpr, true, nil + case *plan.Expr_List: + items, ok, err := serializeFilterExprListToAST(impl.List.List, scanNode, scanTag, partPos, covered) + if err != nil { + return nil, false, err + } + if !ok { + return nil, false, nil + } + return tree.NewTuple(items), true, nil + case *plan.Expr_F: + return serializeFilterFuncToAST(expr, impl.F, scanNode, scanTag, partPos, covered) + default: + return nil, false, nil + } +} + +func serializeFilterExprListToAST(exprs []*plan.Expr, scanNode *plan.Node, scanTag, partPos int32, covered map[string]struct{}) (tree.Exprs, bool, error) { + items := make(tree.Exprs, 0, len(exprs)) + for _, expr := range exprs { + item, ok, err := serializeFilterExprToAST(expr, scanNode, scanTag, partPos, covered) + if err != nil { + return nil, false, err + } + if !ok { + return nil, false, nil + } + items = append(items, item) + } + return items, true, nil +} + +func serializeFilterFuncToAST(parentExpr *plan.Expr, fn *plan.Function, scanNode *plan.Node, scanTag, partPos int32, covered map[string]struct{}) (tree.Expr, bool, error) { + if fn == nil || fn.Func == nil || fn.Func.ObjName == "" { + return nil, false, nil + } + + fnName := strings.ToLower(fn.Func.ObjName) + args := fn.Args + + switch fnName { + case "and", "or", "xor": + if len(args) != 2 { + return nil, false, nil + } + left, ok, err := serializeFilterExprToAST(args[0], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + right, ok, err := serializeFilterExprToAST(args[1], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + switch fnName { + case "and": + return tree.NewAndExpr(left, right), true, nil + case "or": + return tree.NewOrExpr(left, right), true, nil + default: + return tree.NewXorExpr(left, right), true, nil + } + case "not": + if len(args) != 1 { + return nil, false, nil + } + subExpr, ok, err := serializeFilterExprToAST(args[0], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + return tree.NewNotExpr(subExpr), true, nil + case "=", "!=", "<>", "<", "<=", ">", ">=", "like", "not_like", "ilike", "not_ilike", "reg_match", "not_reg_match", "<=>": + if len(args) != 2 { + return nil, false, nil + } + left, ok, err := serializeFilterExprToAST(args[0], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + right, ok, err := serializeFilterExprToAST(args[1], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + op, ok := ivfComparisonOpForFunc(fnName) + if !ok { + return nil, false, nil + } + return tree.NewComparisonExpr(op, left, right), true, nil + case "between": + if len(args) != 3 { + return nil, false, nil + } + target, ok, err := serializeFilterExprToAST(args[0], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + fromExpr, ok, err := serializeFilterExprToAST(args[1], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + toExpr, ok, err := serializeFilterExprToAST(args[2], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + return tree.NewRangeCond(false, target, fromExpr, toExpr), true, nil + case "in", "not_in", "partition_in": + if len(args) < 2 { + return nil, false, nil + } + target, ok, err := serializeFilterExprToAST(args[0], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + listExpr, ok, err := serializeInListToAST(args[1:], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + op := tree.IN + if fnName == "not_in" { + op = tree.NOT_IN + } + return tree.NewComparisonExpr(op, target, listExpr), true, nil + case "isnull", "is_null": + return serializeFilterIsExprToAST(args, scanNode, scanTag, partPos, covered, func(expr tree.Expr) tree.Expr { + return tree.NewIsNullExpr(expr) + }) + case "isnotnull", "is_not_null": + return serializeFilterIsExprToAST(args, scanNode, scanTag, partPos, covered, func(expr tree.Expr) tree.Expr { + return tree.NewIsNotNullExpr(expr) + }) + case "isunknown", "is_unknown": + return serializeFilterIsExprToAST(args, scanNode, scanTag, partPos, covered, func(expr tree.Expr) tree.Expr { + return tree.NewIsUnknownExpr(expr) + }) + case "isnotunknown", "is_not_unknown": + return serializeFilterIsExprToAST(args, scanNode, scanTag, partPos, covered, func(expr tree.Expr) tree.Expr { + return tree.NewIsNotUnknownExpr(expr) + }) + case "istrue", "is_true": + return serializeFilterIsExprToAST(args, scanNode, scanTag, partPos, covered, func(expr tree.Expr) tree.Expr { + return tree.NewIsTrueExpr(expr) + }) + case "isnottrue", "is_not_true": + return serializeFilterIsExprToAST(args, scanNode, scanTag, partPos, covered, func(expr tree.Expr) tree.Expr { + return tree.NewIsNotTrueExpr(expr) + }) + case "isfalse", "is_false": + return serializeFilterIsExprToAST(args, scanNode, scanTag, partPos, covered, func(expr tree.Expr) tree.Expr { + return tree.NewIsFalseExpr(expr) + }) + case "isnotfalse", "is_not_false": + return serializeFilterIsExprToAST(args, scanNode, scanTag, partPos, covered, func(expr tree.Expr) tree.Expr { + return tree.NewIsNotFalseExpr(expr) + }) + case "+", "-", "*", "/", "div", "%", "&", "|", "^", "<<", ">>": + if len(args) != 2 { + return nil, false, nil + } + left, ok, err := serializeFilterExprToAST(args[0], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + right, ok, err := serializeFilterExprToAST(args[1], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + op, ok := ivfBinaryOpForFunc(fnName) + if !ok { + return nil, false, nil + } + return tree.NewBinaryExpr(op, left, right), true, nil + case "unary_minus", "unary_plus", "unary_tilde", "unary_mark": + if len(args) != 1 { + return nil, false, nil + } + child, ok, err := serializeFilterExprToAST(args[0], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + op, ok := ivfUnaryOpForFunc(fnName) + if !ok { + return nil, false, nil + } + return tree.NewUnaryExpr(op, child), true, nil + case "cast": + if len(args) < 1 { + return nil, false, nil + } + child, ok, err := serializeFilterExprToAST(args[0], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + targetType := parentExpr.Typ + if len(args) > 1 && !args[1].Typ.IsEmpty() { + targetType = args[1].Typ + } + treeType, err := ivfPlanTypeToTreeType(targetType) + if err != nil { + return nil, false, err + } + return tree.NewCastExpr(child, treeType), true, nil + case "case": + return serializeFilterCaseExprToAST(args, scanNode, scanTag, partPos, covered) + default: + if !ivfCanFormatAsFunctionName(fn.Func.ObjName) { + return nil, false, nil + } + astArgs, ok, err := serializeFilterExprListToAST(args, scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + return &tree.FuncExpr{ + Func: tree.FuncName2ResolvableFunctionReference(tree.NewUnresolvedColName(fn.Func.ObjName)), + Type: tree.FUNC_TYPE_DEFAULT, + Exprs: astArgs, + }, true, nil + } +} + +func serializeFilterIsExprToAST(args []*plan.Expr, scanNode *plan.Node, scanTag, partPos int32, covered map[string]struct{}, build func(tree.Expr) tree.Expr) (tree.Expr, bool, error) { + if len(args) != 1 { + return nil, false, nil + } + target, ok, err := serializeFilterExprToAST(args[0], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + return build(target), true, nil +} + +func serializeInListToAST(args []*plan.Expr, scanNode *plan.Node, scanTag, partPos int32, covered map[string]struct{}) (tree.Expr, bool, error) { + if len(args) == 1 { + listExpr, ok, err := serializeFilterExprToAST(args[0], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + if _, ok := listExpr.(*tree.Tuple); !ok { + return nil, false, nil + } + return listExpr, true, nil + } + + items, ok, err := serializeFilterExprListToAST(args, scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + return tree.NewTuple(items), true, nil +} + +func serializeFilterCaseExprToAST(args []*plan.Expr, scanNode *plan.Node, scanTag, partPos int32, covered map[string]struct{}) (tree.Expr, bool, error) { + if len(args) == 0 || len(args)%2 == 0 { + return nil, false, nil + } + + whens := make([]*tree.When, 0, len(args)/2) + for i := 0; i < len(args)-1; i += 2 { + cond, ok, err := serializeFilterExprToAST(args[i], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + val, ok, err := serializeFilterExprToAST(args[i+1], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + whens = append(whens, tree.NewWhen(cond, val)) + } + + elseExpr, ok, err := serializeFilterExprToAST(args[len(args)-1], scanNode, scanTag, partPos, covered) + if err != nil || !ok { + return nil, ok, err + } + return tree.NewCaseExpr(nil, whens, elseExpr), true, nil +} + +func ivfComparisonOpForFunc(fnName string) (tree.ComparisonOp, bool) { + switch fnName { + case "=": + return tree.EQUAL, true + case "!=", "<>": + return tree.NOT_EQUAL, true + case "<": + return tree.LESS_THAN, true + case "<=": + return tree.LESS_THAN_EQUAL, true + case ">": + return tree.GREAT_THAN, true + case ">=": + return tree.GREAT_THAN_EQUAL, true + case "like": + return tree.LIKE, true + case "not_like": + return tree.NOT_LIKE, true + case "ilike": + return tree.ILIKE, true + case "not_ilike": + return tree.NOT_ILIKE, true + case "reg_match": + return tree.REG_MATCH, true + case "not_reg_match": + return tree.NOT_REG_MATCH, true + case "<=>": + return tree.NULL_SAFE_EQUAL, true + default: + return tree.ComparisonOp(0), false + } +} + +func ivfBinaryOpForFunc(fnName string) (tree.BinaryOp, bool) { + switch fnName { + case "+": + return tree.PLUS, true + case "-": + return tree.MINUS, true + case "*": + return tree.MULTI, true + case "/": + return tree.DIV, true + case "div": + return tree.INTEGER_DIV, true + case "%": + return tree.MOD, true + case "&": + return tree.BIT_AND, true + case "|": + return tree.BIT_OR, true + case "^": + return tree.BIT_XOR, true + case "<<": + return tree.LEFT_SHIFT, true + case ">>": + return tree.RIGHT_SHIFT, true + default: + return tree.BinaryOp(0), false + } +} + +func ivfUnaryOpForFunc(fnName string) (tree.UnaryOp, bool) { + switch fnName { + case "unary_minus": + return tree.UNARY_MINUS, true + case "unary_plus": + return tree.UNARY_PLUS, true + case "unary_tilde": + return tree.UNARY_TILDE, true + case "unary_mark": + return tree.UNARY_MARK, true + default: + return tree.UnaryOp(0), false + } +} + +func ivfCanFormatAsFunctionName(name string) bool { + if name == "" { + return false + } + for i, r := range name { + if r == '_' || (r >= '0' && r <= '9' && i > 0) || (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') { + continue + } + return false + } + return true +} + +// ivfFilterColumnToAST is the IVF lowering boundary. It converts the planner's +// bound ColRef coordinates to a logical column name before building the SQL +// string payload, so the payload never depends on outer scan binding positions. +func ivfFilterColumnToAST(col *plan.ColRef, scanNode *plan.Node) (tree.Expr, error) { + if scanNode == nil || scanNode.TableDef == nil || scanNode.TableDef.Pkey == nil || len(scanNode.BindingTags) == 0 { + return nil, moerr.NewInternalErrorNoCtx("invalid ivf filter scan node") + } + colName, ok := vectorIndexColumnNameFromColRef(col, scanNode, scanNode.BindingTags[0]) + if !ok { + return nil, moerr.NewInternalErrorNoCtx("invalid ivf filter column position") + } + + mappedName := catalog.SystemSI_IVFFLAT_IncludeColPrefix + colName + if len(scanNode.TableDef.Pkey.Names) == 1 && colName == scanNode.TableDef.Pkey.PkeyColName { + mappedName = catalog.SystemSI_IVFFLAT_TblCol_Entries_pk + } + + colExpr := tree.NewUnresolvedColName(mappedName) + colExpr.CStrParts[0] = tree.NewCStr("`"+mappedName+"`", 0) + return colExpr, nil +} + +func ivfLiteralToAST(lit *plan.Literal, typ plan.Type) (tree.Expr, error) { + if lit == nil || lit.Isnull { + return tree.NewNumVal("", "", false, tree.P_null), nil + } + + switch v := lit.Value.(type) { + case *plan.Literal_I8Val: + val := int64(int8(v.I8Val)) + return tree.NewNumVal(val, fmt.Sprintf("%d", val), false, tree.P_int64), nil + case *plan.Literal_I16Val: + val := int64(int16(v.I16Val)) + return tree.NewNumVal(val, fmt.Sprintf("%d", val), false, tree.P_int64), nil + case *plan.Literal_I32Val: + val := int64(v.I32Val) + return tree.NewNumVal(val, fmt.Sprintf("%d", val), false, tree.P_int64), nil + case *plan.Literal_I64Val: + return tree.NewNumVal(v.I64Val, fmt.Sprintf("%d", v.I64Val), false, tree.P_int64), nil + case *plan.Literal_U8Val: + val := uint64(uint8(v.U8Val)) + return tree.NewNumVal(val, fmt.Sprintf("%d", val), false, tree.P_uint64), nil + case *plan.Literal_U16Val: + val := uint64(uint16(v.U16Val)) + return tree.NewNumVal(val, fmt.Sprintf("%d", val), false, tree.P_uint64), nil + case *plan.Literal_U32Val: + val := uint64(v.U32Val) + return tree.NewNumVal(val, fmt.Sprintf("%d", val), false, tree.P_uint64), nil + case *plan.Literal_U64Val: + return tree.NewNumVal(v.U64Val, fmt.Sprintf("%d", v.U64Val), false, tree.P_uint64), nil + case *plan.Literal_Fval: + val := float64(v.Fval) + return tree.NewNumVal(val, fmt.Sprintf("%g", val), false, tree.P_float64), nil + case *plan.Literal_Dval: + return tree.NewNumVal(v.Dval, fmt.Sprintf("%g", v.Dval), false, tree.P_float64), nil + case *plan.Literal_Sval: + return tree.NewNumVal(v.Sval, v.Sval, false, tree.P_char), nil + case *plan.Literal_Bval: + return tree.NewNumVal(v.Bval, "", false, tree.P_bool), nil + case *plan.Literal_Dateval: + str := types.Date(v.Dateval).String() + return tree.NewNumVal(str, str, false, tree.P_char), nil + case *plan.Literal_Timeval: + str := types.Time(v.Timeval).String2(typ.Scale) + return tree.NewNumVal(str, str, false, tree.P_char), nil + case *plan.Literal_Datetimeval: + str := types.Datetime(v.Datetimeval).String2(typ.Scale) + return tree.NewNumVal(str, str, false, tree.P_char), nil + case *plan.Literal_Timestampval: + str := types.Timestamp(v.Timestampval).String2(time.UTC, typ.Scale) + return tree.NewNumVal(str, str, false, tree.P_char), nil + case *plan.Literal_Decimal64Val: + str := types.Decimal64(v.Decimal64Val.A).Format(typ.Scale) + return tree.NewNumVal(str, str, false, tree.P_decimal), nil + case *plan.Literal_Decimal128Val: + str := types.Decimal128{ + B0_63: uint64(v.Decimal128Val.A), + B64_127: uint64(v.Decimal128Val.B), + }.Format(typ.Scale) + return tree.NewNumVal(str, str, false, tree.P_decimal), nil + case *plan.Literal_Jsonval: + str := string(v.Jsonval) + return tree.NewNumVal(str, str, false, tree.P_char), nil + case *plan.Literal_EnumVal: + val := uint64(v.EnumVal) + return tree.NewNumVal(val, fmt.Sprintf("%d", val), false, tree.P_uint64), nil + case *plan.Literal_VecVal: + return tree.NewNumVal(v.VecVal, v.VecVal, false, tree.P_char), nil + default: + return nil, moerr.NewNotSupportedNoCtx("unsupported ivf filter literal") + } +} + +func ivfPlanTypeToTreeType(typ plan.Type) (*tree.T, error) { + treeType := &tree.T{ + InternalType: tree.InternalType{ + Locale: &ivfTreeEmptyLocale, + }, + } + + switch types.T(typ.Id) { + case types.T_bool: + treeType.InternalType.Family = tree.BoolFamily + treeType.InternalType.FamilyString = "bool" + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_BOOL) + case types.T_bit: + treeType.InternalType.Family = tree.BitFamily + treeType.InternalType.FamilyString = "bit" + treeType.InternalType.DisplayWith = max(typ.Width, int32(1)) + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_BIT) + case types.T_int8: + treeType.InternalType.Family = tree.IntFamily + treeType.InternalType.FamilyString = "tinyint" + treeType.InternalType.Width = 8 + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_TINY) + case types.T_uint8: + treeType.InternalType.Family = tree.IntFamily + treeType.InternalType.FamilyString = "tinyint" + treeType.InternalType.Width = 8 + treeType.InternalType.Unsigned = true + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_TINY) + case types.T_int16: + treeType.InternalType.Family = tree.IntFamily + treeType.InternalType.FamilyString = "smallint" + treeType.InternalType.Width = 16 + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_SHORT) + case types.T_uint16: + treeType.InternalType.Family = tree.IntFamily + treeType.InternalType.FamilyString = "smallint" + treeType.InternalType.Width = 16 + treeType.InternalType.Unsigned = true + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_SHORT) + case types.T_int32: + treeType.InternalType.Family = tree.IntFamily + treeType.InternalType.FamilyString = "int" + treeType.InternalType.Width = 32 + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_LONG) + case types.T_uint32: + treeType.InternalType.Family = tree.IntFamily + treeType.InternalType.FamilyString = "int" + treeType.InternalType.Width = 32 + treeType.InternalType.Unsigned = true + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_LONG) + case types.T_int64: + treeType.InternalType.Family = tree.IntFamily + treeType.InternalType.FamilyString = "bigint" + treeType.InternalType.Width = 64 + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_LONGLONG) + case types.T_uint64: + treeType.InternalType.Family = tree.IntFamily + treeType.InternalType.FamilyString = "bigint" + treeType.InternalType.Width = 64 + treeType.InternalType.Unsigned = true + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_LONGLONG) + case types.T_float32: + treeType.InternalType.Family = tree.FloatFamily + treeType.InternalType.FamilyString = "float" + treeType.InternalType.Width = 32 + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_FLOAT) + case types.T_float64: + treeType.InternalType.Family = tree.FloatFamily + treeType.InternalType.FamilyString = "double" + treeType.InternalType.Width = 64 + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_DOUBLE) + case types.T_decimal64, types.T_decimal128: + treeType.InternalType.Family = tree.FloatFamily + treeType.InternalType.FamilyString = "decimal" + treeType.InternalType.DisplayWith = max(typ.Width, int32(0)) + treeType.InternalType.Scale = max(typ.Scale, int32(0)) + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_NEWDECIMAL) + case types.T_date: + treeType.InternalType.Family = tree.DateFamily + treeType.InternalType.FamilyString = "date" + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_DATE) + case types.T_time: + treeType.InternalType.Family = tree.TimeFamily + treeType.InternalType.FamilyString = "time" + treeType.InternalType.DisplayWith = max(typ.Scale, int32(0)) + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_TIME) + case types.T_datetime: + treeType.InternalType.Family = tree.TimestampFamily + treeType.InternalType.FamilyString = "datetime" + treeType.InternalType.DisplayWith = max(typ.Scale, int32(0)) + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_DATETIME) + case types.T_timestamp: + treeType.InternalType.Family = tree.TimestampFamily + treeType.InternalType.FamilyString = "timestamp" + treeType.InternalType.DisplayWith = max(typ.Scale, int32(0)) + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_TIMESTAMP) + case types.T_char: + treeType.InternalType.Family = tree.StringFamily + treeType.InternalType.FamilyString = "char" + treeType.InternalType.DisplayWith = ivfStringTypeDisplayWidth(typ.Width) + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_STRING) + case types.T_varchar: + treeType.InternalType.Family = tree.StringFamily + treeType.InternalType.FamilyString = "varchar" + treeType.InternalType.DisplayWith = ivfStringTypeDisplayWidth(typ.Width) + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_VARCHAR) + case types.T_binary: + treeType.InternalType.Family = tree.StringFamily + treeType.InternalType.FamilyString = "binary" + treeType.InternalType.Binary = true + treeType.InternalType.DisplayWith = ivfStringTypeDisplayWidth(typ.Width) + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_VARCHAR) + case types.T_varbinary: + treeType.InternalType.Family = tree.StringFamily + treeType.InternalType.FamilyString = "varbinary" + treeType.InternalType.Binary = true + treeType.InternalType.DisplayWith = ivfStringTypeDisplayWidth(typ.Width) + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_VARCHAR) + case types.T_text: + treeType.InternalType.Family = tree.BlobFamily + treeType.InternalType.FamilyString = "text" + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_TEXT) + case types.T_blob: + treeType.InternalType.Family = tree.BlobFamily + treeType.InternalType.FamilyString = "blob" + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_BLOB) + case types.T_json: + treeType.InternalType.Family = tree.JsonFamily + treeType.InternalType.FamilyString = "json" + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_JSON) + case types.T_uuid: + treeType.InternalType.Family = tree.UuidFamily + treeType.InternalType.FamilyString = "uuid" + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_UUID) + case types.T_enum: + treeType.InternalType.Family = tree.EnumFamily + treeType.InternalType.FamilyString = "enum" + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_ENUM) + if typ.Enumvalues != "" { + treeType.InternalType.EnumValues = strings.Split(typ.Enumvalues, ",") + } + case types.T_array_float32: + treeType.InternalType.Family = tree.ArrayFamily + treeType.InternalType.FamilyString = "vecf32" + treeType.InternalType.DisplayWith = ivfStringTypeDisplayWidth(typ.Width) + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_VARCHAR) + case types.T_array_float64: + treeType.InternalType.Family = tree.ArrayFamily + treeType.InternalType.FamilyString = "vecf64" + treeType.InternalType.DisplayWith = ivfStringTypeDisplayWidth(typ.Width) + treeType.InternalType.Oid = uint32(defines.MYSQL_TYPE_VARCHAR) + default: + return nil, moerr.NewNotSupportedNoCtxf("unsupported ivf filter cast target type %s", types.T(typ.Id).String()) + } + + return treeType, nil +} + +func ivfStringTypeDisplayWidth(width int32) int32 { + if width > 0 { + return width + } + return -1 +} + +func buildIvfScanToTableFuncMap(tableFuncTag int32, tableFuncIncludeColumns []string, scanNode *plan.Node) map[[2]int32]*plan.Expr { + if scanNode == nil || scanNode.TableDef == nil || len(scanNode.BindingTags) == 0 { + return nil + } + + scanTag := scanNode.BindingTags[0] + projMap := make(map[[2]int32]*plan.Expr, len(tableFuncIncludeColumns)+1) + if scanNode.TableDef.Pkey != nil && len(scanNode.TableDef.Pkey.Names) == 1 { + pkPos := scanNode.TableDef.Name2ColIndex[scanNode.TableDef.Pkey.PkeyColName] + projMap[[2]int32{scanTag, pkPos}] = &plan.Expr{ + Typ: scanNode.TableDef.Cols[pkPos].Typ, + Expr: &plan.Expr_Col{ + Col: &plan.ColRef{ + RelPos: tableFuncTag, + ColPos: 0, + Name: "pkid", + }, + }, + } + } + + for i, colName := range tableFuncIncludeColumns { + colPos, ok := scanNode.TableDef.Name2ColIndex[colName] + if !ok { + continue + } + projMap[[2]int32{scanTag, colPos}] = &plan.Expr{ + Typ: scanNode.TableDef.Cols[colPos].Typ, + Expr: &plan.Expr_Col{ + Col: &plan.ColRef{ + RelPos: tableFuncTag, + ColPos: int32(2 + i), + Name: catalog.SystemSI_IVFFLAT_IncludeColPrefix + colName, + }, + }, + } + } + return projMap +} + +const maxSafeIvfSearchRoundLimit = uint64(1<<63 - 1) + +func firstIvfSearchRoundLimit(limit *plan.Expr, hasFilterPressure bool) uint64 { + if limit == nil || limit.GetLit() == nil { + return 0 + } + + originalLimit := limit.GetLit().GetU64Val() + if !hasFilterPressure { + return originalLimit + } + + overFetchFactor := calculateFilteredPostModeOverFetchFactor(originalLimit) + return max(uint64(float64(originalLimit)*overFetchFactor), originalLimit+10) +} + +func firstIvfIncludeSearchRoundLimit(limit *plan.Expr, hasPushdownFilters bool, hasResidualFilters bool) uint64 { + if hasResidualFilters { + return maxSafeIvfSearchRoundLimit + } + return firstIvfSearchRoundLimit(limit, hasPushdownFilters) +} + func (builder *QueryBuilder) prepareIvfIndexContext(vecCtx *vectorSortContext, multiTableIndex *MultiTableIndex) (*ivfIndexContext, error) { if vecCtx == nil || multiTableIndex == nil { return nil, nil @@ -265,7 +1130,11 @@ func (builder *QueryBuilder) prepareIvfIndexContext(vecCtx *vectorSortContext, m return nil, nil } - keyPart := idxDef.Parts[0] + keyParts := getVectorIndexLogicalParts(multiTableIndex) + if len(keyParts) == 0 { + return nil, nil + } + keyPart := keyParts[0] partPos := vecCtx.scanNode.TableDef.Name2ColIndex[keyPart] _, vecLitArg, found := builder.getArgsFromDistFn(vecCtx.distFnExpr, partPos) if !found { @@ -288,7 +1157,7 @@ func (builder *QueryBuilder) prepareIvfIndexContext(vecCtx *vectorSortContext, m nProbe = val } - // Phase 4: Dynamic nprobe amplification for auto mode + // Dynamically amplify nprobe for auto mode. // Only applied if mode is "post" (pushdown disabled) and totalLists is available if isAutoMode && mode == "post" && totalLists > 0 { oldNProbe := nProbe @@ -323,7 +1192,7 @@ func (builder *QueryBuilder) prepareIvfIndexContext(vecCtx *vectorSortContext, m nProbe: nProbe, pushdownEnabled: (mode == "pre"), - // Phase 1: Auto mode fields + // Auto mode fields. isAutoMode: isAutoMode, initialStrategy: mode, }, nil @@ -424,8 +1293,8 @@ func (builder *QueryBuilder) applyIndicesForSortUsingIvfflat(nodeID int32, vecCt return nodeID, err } - // Phase 1: Explicitly set Mode to "auto" if it was chosen by default - // This ensures isAdaptiveVectorSearch returns true + // Persist the inferred auto mode back to the plan nodes so downstream + // adaptive-vector-search checks see the same mode consistently. if ivfCtx.isAutoMode && (vecCtx.rankOption == nil || vecCtx.rankOption.Mode == "") { if vecCtx.rankOption == nil { vecCtx.rankOption = &plan.RankOption{} @@ -444,20 +1313,87 @@ func (builder *QueryBuilder) applyIndicesForSortUsingIvfflat(nodeID int32, vecCt } } - tableConfigStr := fmt.Sprintf(`{"db": "%s", "src": "%s", "metadata":"%s", "index":"%s", "threads_search": %d, - "entries": "%s", "nprobe" : %d, "pktype" : %d, "pkey" : "%s", "part" : "%s", "parttype" : %d, "orig_func_name": "%s"}`, - scanNode.ObjRef.SchemaName, - scanNode.TableDef.Name, - ivfCtx.metaDef.IndexTableName, - ivfCtx.idxDef.IndexTableName, - ivfCtx.nThread, - ivfCtx.entriesDef.IndexTableName, - uint(ivfCtx.nProbe), - ivfCtx.pkType.Id, - scanNode.TableDef.Pkey.PkeyColName, - ivfCtx.idxDef.Parts[0], - ivfCtx.partType.Id, - ivfCtx.origFuncName) + newFilterList, distRange := builder.getDistRangeFromFilters(scanNode.FilterList, ivfCtx) + includeColumns := getVectorIndexIncludedColumns(multiTableIndex) + includeAwareColumns := includeColumns + if vecCtx.rankOption != nil { + switch vecCtx.rankOption.Mode { + case "", "include", "auto": + default: + includeAwareColumns = nil + } + } + requiredCols := collectRequiredColumns(projNode, childNode, scanNode, orderExpr, ivfCtx.partPos) + projectedCols := collectProjectedColumns(projNode, childNode, scanNode, ivfCtx.partPos) + coveragePushdown, _ := splitFiltersByVectorIndexCoverage(newFilterList, scanNode, includeAwareColumns, ivfCtx.partPos) + pushdownFilterSQL, serializedPushdownFilters, _, err := serializeFiltersToSQL(coveragePushdown, scanNode, includeAwareColumns, ivfCtx.partPos) + if err != nil { + return nodeID, err + } + remainingFilters := make([]*plan.Expr, 0, len(newFilterList)-len(serializedPushdownFilters)) + serializedSet := make(map[*plan.Expr]struct{}, len(serializedPushdownFilters)) + for _, expr := range serializedPushdownFilters { + serializedSet[expr] = struct{}{} + } + for _, expr := range newFilterList { + if _, ok := serializedSet[expr]; ok { + continue + } + remainingFilters = append(remainingFilters, expr) + } + canIndexOnly := canDoIndexOnlyScan(requiredCols, scanNode.TableDef, includeAwareColumns) && len(remainingFilters) == 0 + needsOffsetCompensation := len(newFilterList) > 0 + tableFuncIncludeColumns := make([]string, 0, len(includeAwareColumns)) + if canIndexOnly { + for _, col := range includeAwareColumns { + if _, ok := projectedCols[col]; ok { + tableFuncIncludeColumns = append(tableFuncIncludeColumns, col) + } + } + } + + includeColumnTypes := make([]int32, 0, len(includeColumns)) + for _, colName := range includeColumns { + colIdx, ok := scanNode.TableDef.Name2ColIndex[colName] + if !ok { + continue + } + includeColumnTypes = append(includeColumnTypes, scanNode.TableDef.Cols[colIdx].Typ.Id) + } + + tblCfg := vectorindex.IndexTableConfig{ + DbName: scanNode.ObjRef.SchemaName, + SrcTable: scanNode.TableDef.Name, + MetadataTable: ivfCtx.metaDef.IndexTableName, + IndexTable: ivfCtx.idxDef.IndexTableName, + ThreadsSearch: ivfCtx.nThread, + EntriesTable: ivfCtx.entriesDef.IndexTableName, + Nprobe: uint(ivfCtx.nProbe), + PKeyType: ivfCtx.pkType.Id, + PKey: scanNode.TableDef.Pkey.PkeyColName, + KeyPart: ivfCtx.idxDef.Parts[0], + KeyPartType: ivfCtx.partType.Id, + OrigFuncName: ivfCtx.origFuncName, + IncludeColumns: includeColumns, + IncludeColumnTypes: includeColumnTypes, + } + tblCfgBytes, err := json.Marshal(tblCfg) + if err != nil { + return nodeID, err + } + tblCfgStr := string(tblCfgBytes) + firstRoundLimit := uint64(0) + bucketExpandStep := uint64(0) + if vecCtx.rankOption != nil && vecCtx.rankOption.Mode == "include" { + firstRoundLimit = firstIvfIncludeSearchRoundLimit(limit, len(serializedPushdownFilters) > 0, len(remainingFilters) > 0) + if firstRoundLimit == 0 && limit != nil { + firstRoundLimit = 1 + } + bucketExpandStep = uint64(ivfCtx.nProbe) + if bucketExpandStep == 0 { + bucketExpandStep = 1 + } + } // build ivf_search table function node tableFuncTag := builder.genNewBindTag() @@ -471,24 +1407,10 @@ func (builder *QueryBuilder) applyIndicesForSortUsingIvfflat(nodeID int32, vecCt Name: kIVFSearchFuncName, Param: []byte(ivfCtx.params), }, - Cols: DeepCopyColDefList(kIVFSearchColDefs), - }, - BindingTags: []int32{tableFuncTag}, - TblFuncExprList: []*plan.Expr{ - { - Typ: plan.Type{ - Id: int32(types.T_varchar), - }, - Expr: &plan.Expr_Lit{ - Lit: &plan.Literal{ - Value: &plan.Literal_Sval{ - Sval: tableConfigStr, - }, - }, - }, - }, - DeepCopyExpr(ivfCtx.vecLitArg), + Cols: buildIvfSearchColDefs(tableFuncIncludeColumns, scanNode.TableDef), }, + BindingTags: []int32{tableFuncTag}, + TblFuncExprList: buildIvfTableFuncArgs(tblCfgStr, ivfCtx.vecLitArg, pushdownFilterSQL, firstRoundLimit, bucketExpandStep), } tableFuncNodeID := builder.appendNode(tableFuncNode, ctx) @@ -500,17 +1422,33 @@ func (builder *QueryBuilder) applyIndicesForSortUsingIvfflat(nodeID int32, vecCt // change doc_id type to the primary type here tableFuncNode.TableDef.Cols[0].Typ = ivfCtx.pkType - newFilterList, distRange := builder.getDistRangeFromFilters(scanNode.FilterList, ivfCtx) - scanNode.FilterList = newFilterList - - // pushdown limit to Table Function - // When there are filters, over-fetch to get more candidates - // This ensures we have enough candidates after filtering + // push down the candidate limit to the table function. + // If the outer sort has OFFSET, the index reader must fetch limit+offset + // candidates so the final sort can still return the requested window. limitExpr := DeepCopyExpr(limit) - if len(scanNode.FilterList) > 0 && !ivfCtx.pushdownEnabled { + if limitExpr != nil && sortNode.Offset != nil && needsOffsetCompensation { + limitExpr, err = bindFuncExprAndConstFold( + builder.GetContext(), + builder.compCtx.GetProcess(), + "+", + []*Expr{limitExpr, DeepCopyExpr(sortNode.Offset)}, + ) + if err != nil { + return 0, err + } + } + + includeModeHasResidualFilters := vecCtx.rankOption != nil && vecCtx.rankOption.Mode == "include" && len(remainingFilters) > 0 + if includeModeHasResidualFilters { + // Residual filters are applied outside ivf_search, so the table function + // must not stop after the usual over-fetch budget rejects all candidates. + limitExpr = makePlan2Uint64ConstExprWithType(maxSafeIvfSearchRoundLimit) + } else if len(remainingFilters) > 0 && !ivfCtx.pushdownEnabled { + // When there are filters, over-fetch to get more candidates. + // This ensures we have enough candidates after filtering. // Over-fetch strategy: dynamically adjust factor based on limit size // Smaller limits need more over-fetching due to higher variance - if limitConst := limit.GetLit(); limitConst != nil { + if limitConst := limitExpr.GetLit(); limitConst != nil { originalLimit := limitConst.GetU64Val() // Filtered post mode needs a larger candidate budget than the historical @@ -522,7 +1460,7 @@ func (builder *QueryBuilder) applyIndicesForSortUsingIvfflat(nodeID int32, vecCt if ivfCtx.isAutoMode { logutil.Debugf( "Auto mode over-fetch: original_limit=%d, factor=%.2f, filter_count=%d", - originalLimit, overFetchFactor, len(scanNode.FilterList), + originalLimit, overFetchFactor, len(remainingFilters), ) logutil.Debugf( "Auto mode over-fetch result: original_limit=%d, new_limit=%d", @@ -531,7 +1469,7 @@ func (builder *QueryBuilder) applyIndicesForSortUsingIvfflat(nodeID int32, vecCt } else { logutil.Debugf( "Vector mode over-fetch: mode=post, original_limit=%d, factor=%.2f, filter_count=%d, new_limit=%d", - originalLimit, overFetchFactor, len(scanNode.FilterList), newLimit, + originalLimit, overFetchFactor, len(remainingFilters), newLimit, ) } @@ -554,15 +1492,19 @@ func (builder *QueryBuilder) applyIndicesForSortUsingIvfflat(nodeID int32, vecCt OrigFuncName: ivfCtx.origFuncName, DistRange: distRange, } + tableFuncNode.Limit = DeepCopyExpr(limitExpr) // Determine join structure based on rankOption.mode: // mode != "pre": JOIN( scanNode, ivf_search ) // mode == "pre": JOIN( scanNode, JOIN(ivf_search, secondScan) ) var joinRootID int32 - pushdownEnabled := ivfCtx.pushdownEnabled && len(scanNode.FilterList) > 0 + pushdownEnabled := ivfCtx.pushdownEnabled && len(remainingFilters) > 0 + scanNode.FilterList = remainingFilters - if pushdownEnabled { + if canIndexOnly { + joinRootID = tableFuncNodeID + } else if pushdownEnabled { // secondScanNode: copy original scanNode for JOIN(ivf, table) secondScanNodeID := builder.copyNode(ctx, scanNode.NodeId) secondScanNode := builder.qry.Nodes[secondScanNodeID] @@ -809,10 +1751,11 @@ func (builder *QueryBuilder) applyIndicesForSortUsingIvfflat(nodeID int32, vecCt joinRootID = joinNodeID } - // Keep FilterList on scanNode so filters are applied during table scan - // Clear Limit/Offset from scanNode since they should be applied after SORT - scanNode.Limit = nil - scanNode.Offset = nil + if !canIndexOnly { + // Keep residual filters on scanNode so they are applied during table scan. + scanNode.Limit = nil + scanNode.Offset = nil + } // Create SortBy, still sort directly by table function's score, let remap map ColRef to corresponding output column orderByScore := []*OrderBySpec{ @@ -841,7 +1784,23 @@ func (builder *QueryBuilder) applyIndicesForSortUsingIvfflat(nodeID int32, vecCt projNode.Children[0] = sortByID - if childNode != nil { + if canIndexOnly { + scanToTFMap := buildIvfScanToTableFuncMap(tableFuncTag, tableFuncIncludeColumns, scanNode) + if childNode != nil { + sortIdx := orderExpr.GetCol().ColPos + projMap := make(map[[2]int32]*plan.Expr) + for i, proj := range childNode.ProjectList { + if i == int(sortIdx) { + projMap[[2]int32{childNode.BindingTags[0], int32(i)}] = DeepCopyExpr(orderByScore[0].Expr) + continue + } + projMap[[2]int32{childNode.BindingTags[0], int32(i)}] = replaceColumnsForExpr(DeepCopyExpr(proj), scanToTFMap) + } + replaceColumnsForNode(projNode, projMap) + } else { + replaceColumnsForNode(projNode, scanToTFMap) + } + } else if childNode != nil { sortIdx := orderExpr.GetCol().ColPos projMap := make(map[[2]int32]*plan.Expr) for i, proj := range childNode.ProjectList { diff --git a/pkg/sql/plan/apply_indices_ivfflat_helpers_test.go b/pkg/sql/plan/apply_indices_ivfflat_helpers_test.go new file mode 100644 index 0000000000000..df609295d9e38 --- /dev/null +++ b/pkg/sql/plan/apply_indices_ivfflat_helpers_test.go @@ -0,0 +1,841 @@ +// Copyright 2026 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 plan + +import ( + "testing" + "time" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/container/types" + planpb "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func makeIvfHelperColExpr(relPos, colPos int32, tableDef *TableDef) *Expr { + colDef := tableDef.Cols[colPos] + return &Expr{ + Typ: colDef.Typ, + Expr: &planpb.Expr_Col{ + Col: &ColRef{ + RelPos: relPos, + ColPos: colPos, + Name: colDef.Name, + }, + }, + } +} + +func makeIvfHelperFnExpr(name string, typ Type, args ...*Expr) *Expr { + return &Expr{ + Typ: typ, + Expr: &planpb.Expr_F{ + F: &planpb.Function{ + Func: &ObjectRef{ObjName: name}, + Args: args, + }, + }, + } +} + +func TestIvfIncludeHelperColumnCollection(t *testing.T) { + _, _, scanNode, _, _ := newIvfIncludeModeTestBuilder(t) + scanTag := scanNode.BindingTags[0] + childTag := int32(777) + + childNode := &Node{ + BindingTags: []int32{childTag}, + ProjectList: []*Expr{ + makeIvfHelperColExpr(scanTag, 2, scanNode.TableDef), + makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), + }, + } + projNode := &Node{ + ProjectList: []*Expr{ + makeIvfHelperColExpr(childTag, 0, scanNode.TableDef), + makeIvfHelperColExpr(childTag, 1, scanNode.TableDef), + }, + } + orderExpr := makeIvfHelperColExpr(childTag, 1, scanNode.TableDef) + scanNode.FilterList = []*Expr{ + makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 4, scanNode.TableDef), + makePlan2StringConstExprWithType("memo"), + ), + makeIvfHelperFnExpr( + "<=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperFnExpr( + "l2_distance", + Type{Id: int32(types.T_float64)}, + makeIvfHelperColExpr(scanTag, 1, scanNode.TableDef), + &Expr{ + Typ: Type{Id: int32(types.T_array_float32)}, + Expr: &planpb.Expr_Lit{ + Lit: &planpb.Literal{Value: &planpb.Literal_VecVal{VecVal: "[1,1,1]"}}, + }, + }, + ), + MakePlan2Float64ConstExprWithType(0.5), + ), + } + + childMap := buildIvfChildProjectionMap(childNode) + require.Len(t, childMap, 2) + require.NotSame(t, childNode.ProjectList[0], childMap[[2]int32{childTag, 0}]) + require.Nil(t, buildIvfChildProjectionMap(nil)) + + required := collectRequiredColumns(projNode, childNode, scanNode, orderExpr, 1) + assert.Contains(t, required, "title") + assert.Contains(t, required, "category") + assert.Contains(t, required, "note") + assert.NotContains(t, required, "embedding") + + projected := collectProjectedColumns(projNode, childNode, scanNode, 1) + assert.Equal(t, map[string]struct{}{ + "title": {}, + "category": {}, + }, projected) +} + +func TestIvfIncludeHelperFilterCoverageAndSerialization(t *testing.T) { + _, _, scanNode, _, _ := newIvfIncludeModeTestBuilder(t) + scanTag := scanNode.BindingTags[0] + covered := map[string]struct{}{ + "id": {}, + "title": {}, + "category": {}, + } + + categoryEq := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), + MakePlan2Int32ConstExprWithType(20), + ) + noteEq := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 4, scanNode.TableDef), + makePlan2StringConstExprWithType("memo"), + ) + distFilter := makeIvfHelperFnExpr( + "<", + Type{Id: int32(types.T_bool)}, + makeIvfHelperFnExpr( + "l2_distance", + Type{Id: int32(types.T_float64)}, + makeIvfHelperColExpr(scanTag, 1, scanNode.TableDef), + &Expr{ + Typ: Type{Id: int32(types.T_array_float32)}, + Expr: &planpb.Expr_Lit{ + Lit: &planpb.Literal{Value: &planpb.Literal_VecVal{VecVal: "[1,1,1]"}}, + }, + }, + ), + MakePlan2Float64ConstExprWithType(0.5), + ) + + assert.True(t, vectorIndexExprRefsOnlyCoveredColumns(categoryEq, scanTag, 1, scanNode.TableDef, covered)) + assert.False(t, vectorIndexExprRefsOnlyCoveredColumns(noteEq, scanTag, 1, scanNode.TableDef, covered)) + assert.False(t, vectorIndexExprRefsOnlyCoveredColumns(distFilter, scanTag, 1, scanNode.TableDef, covered)) + assert.True(t, vectorIndexExprRefsOnlyCoveredColumns(&Expr{Expr: &planpb.Expr_T{T: &planpb.TargetType{}}}, scanTag, 1, scanNode.TableDef, covered)) + assert.True(t, vectorIndexExprRefsOnlyCoveredColumns( + &Expr{ + Expr: &planpb.Expr_List{ + List: &planpb.ExprList{List: []*Expr{MakePlan2Int32ConstExprWithType(1), MakePlan2Int32ConstExprWithType(2)}}, + }, + }, + scanTag, 1, scanNode.TableDef, covered, + )) + assert.False(t, vectorIndexExprRefsOnlyCoveredColumns( + &Expr{ + Typ: scanNode.TableDef.Cols[0].Typ, + Expr: &planpb.Expr_Col{ + Col: &ColRef{RelPos: scanTag, ColPos: 99, Name: "unknown"}, + }, + }, + scanTag, 1, scanNode.TableDef, covered, + )) + + pushdown, remaining := splitFiltersByVectorIndexCoverage([]*Expr{categoryEq, noteEq, distFilter}, scanNode, []string{"title", "category"}, 1) + require.Len(t, pushdown, 1) + require.Len(t, remaining, 2) + assert.Same(t, categoryEq, pushdown[0]) + + betweenFilter := makeIvfHelperFnExpr( + "between", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), + MakePlan2Int32ConstExprWithType(10), + MakePlan2Int32ConstExprWithType(30), + ) + inFilter := makeIvfHelperFnExpr( + "in", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), + MakePlan2Int32ConstExprWithType(10), + MakePlan2Int32ConstExprWithType(20), + ) + isNotNullFilter := makeIvfHelperFnExpr( + "is_not_null", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 2, scanNode.TableDef), + ) + bitAndFilter := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperFnExpr( + "&", + Type{Id: int32(types.T_int32)}, + makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), + MakePlan2Int32ConstExprWithType(1), + ), + MakePlan2Int32ConstExprWithType(0), + ) + unaryFilter := makeIvfHelperFnExpr( + "<", + Type{Id: int32(types.T_bool)}, + makeIvfHelperFnExpr( + "unary_minus", + Type{Id: int32(types.T_int32)}, + makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), + ), + &Expr{ + Typ: Type{Id: int32(types.T_int64)}, + Expr: &planpb.Expr_Lit{ + Lit: &planpb.Literal{Value: &planpb.Literal_I64Val{I64Val: -5}}, + }, + }, + ) + caseFilter := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperFnExpr( + "case", + Type{Id: int32(types.T_varchar)}, + categoryEq, + makeIvfHelperColExpr(scanTag, 2, scanNode.TableDef), + makePlan2StringConstExprWithType("fallback"), + ), + makePlan2StringConstExprWithType("beta"), + ) + defaultFnFilter := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperFnExpr( + "lower", + Type{Id: int32(types.T_varchar)}, + makeIvfHelperColExpr(scanTag, 2, scanNode.TableDef), + ), + makePlan2StringConstExprWithType("beta"), + ) + + sql, serializedPushdown, serializedRemaining, err := serializeFiltersToSQL( + []*Expr{betweenFilter, inFilter, isNotNullFilter, bitAndFilter, unaryFilter, caseFilter, defaultFnFilter}, + scanNode, + []string{"title", "category"}, + 1, + ) + require.NoError(t, err) + require.Len(t, serializedPushdown, 7) + require.Empty(t, serializedRemaining) + assert.Contains(t, sql, "between 10 and 30") + assert.Contains(t, sql, "in (10, 20)") + assert.Contains(t, sql, "is not null") + assert.Contains(t, sql, "& 1") + assert.Contains(t, sql, "-`"+catalog.SystemSI_IVFFLAT_IncludeColPrefix+"category`") + assert.Contains(t, sql, "case when") + assert.Contains(t, sql, "lower(") +} + +func TestIvfOperatorAndTypeMappingHelpers(t *testing.T) { + for _, fnName := range []string{"=", "!=", "<>", "<", "<=", ">", ">=", "like", "not_like", "ilike", "not_ilike", "reg_match", "not_reg_match", "<=>"} { + _, ok := ivfComparisonOpForFunc(fnName) + assert.True(t, ok, fnName) + } + _, ok := ivfComparisonOpForFunc("bad_cmp") + assert.False(t, ok) + + for _, fnName := range []string{"+", "-", "*", "/", "div", "%", "&", "|", "^", "<<", ">>"} { + _, ok := ivfBinaryOpForFunc(fnName) + assert.True(t, ok, fnName) + } + _, ok = ivfBinaryOpForFunc("bad_bin") + assert.False(t, ok) + + for _, fnName := range []string{"unary_minus", "unary_plus", "unary_tilde", "unary_mark"} { + _, ok := ivfUnaryOpForFunc(fnName) + assert.True(t, ok, fnName) + } + _, ok = ivfUnaryOpForFunc("bad_unary") + assert.False(t, ok) + + assert.True(t, ivfCanFormatAsFunctionName("lower")) + assert.True(t, ivfCanFormatAsFunctionName("fn_1")) + assert.False(t, ivfCanFormatAsFunctionName("")) + assert.False(t, ivfCanFormatAsFunctionName("1bad")) + assert.False(t, ivfCanFormatAsFunctionName("bad-name")) + + assert.Equal(t, int32(12), ivfStringTypeDisplayWidth(12)) + assert.Equal(t, int32(-1), ivfStringTypeDisplayWidth(0)) +} + +func TestIvfSerializeFilterAdditionalBranches(t *testing.T) { + _, _, scanNode, _, _ := newIvfIncludeModeTestBuilder(t) + scanTag := scanNode.BindingTags[0] + covered := map[string]struct{}{ + "id": {}, + "title": {}, + "category": {}, + } + + categoryEq := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), + MakePlan2Int32ConstExprWithType(20), + ) + titleEq := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 2, scanNode.TableDef), + makePlan2StringConstExprWithType("beta"), + ) + + tests := []struct { + name string + expr *Expr + contains string + }{ + { + name: "and", + expr: makeIvfHelperFnExpr("and", Type{Id: int32(types.T_bool)}, categoryEq, titleEq), + contains: " and ", + }, + { + name: "or", + expr: makeIvfHelperFnExpr("or", Type{Id: int32(types.T_bool)}, categoryEq, titleEq), + contains: " or ", + }, + { + name: "xor", + expr: makeIvfHelperFnExpr("xor", Type{Id: int32(types.T_bool)}, categoryEq, titleEq), + contains: " xor ", + }, + { + name: "not", + expr: makeIvfHelperFnExpr("not", Type{Id: int32(types.T_bool)}, categoryEq), + contains: "not ", + }, + { + name: "not_in_tuple_arg", + expr: makeIvfHelperFnExpr( + "not_in", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), + &Expr{ + Expr: &planpb.Expr_List{ + List: &planpb.ExprList{ + List: []*Expr{MakePlan2Int32ConstExprWithType(10), MakePlan2Int32ConstExprWithType(20)}, + }, + }, + }, + ), + contains: "not in", + }, + { + name: "is_null", + expr: makeIvfHelperFnExpr("is_null", Type{Id: int32(types.T_bool)}, makeIvfHelperColExpr(scanTag, 2, scanNode.TableDef)), + contains: "is null", + }, + { + name: "is_unknown", + expr: makeIvfHelperFnExpr("is_unknown", Type{Id: int32(types.T_bool)}, categoryEq), + contains: "is unknown", + }, + { + name: "is_not_unknown", + expr: makeIvfHelperFnExpr("is_not_unknown", Type{Id: int32(types.T_bool)}, categoryEq), + contains: "is not unknown", + }, + { + name: "is_true", + expr: makeIvfHelperFnExpr("is_true", Type{Id: int32(types.T_bool)}, categoryEq), + contains: "is true", + }, + { + name: "is_not_true", + expr: makeIvfHelperFnExpr("is_not_true", Type{Id: int32(types.T_bool)}, categoryEq), + contains: "is not true", + }, + { + name: "is_false", + expr: makeIvfHelperFnExpr("is_false", Type{Id: int32(types.T_bool)}, categoryEq), + contains: "is false", + }, + { + name: "is_not_false", + expr: makeIvfHelperFnExpr("is_not_false", Type{Id: int32(types.T_bool)}, categoryEq), + contains: "is not false", + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + ast, ok, err := serializeFilterExprToAST(tc.expr, scanNode, scanTag, 1, covered) + require.NoError(t, err) + require.True(t, ok) + sql := tree.StringWithOpts(ast, dialect.MYSQL, tree.WithQuoteString(true)) + assert.Contains(t, sql, tc.contains) + }) + } + + ast, ok, err := serializeFilterExprToAST( + makeIvfHelperFnExpr("bad-name", Type{Id: int32(types.T_varchar)}, makeIvfHelperColExpr(scanTag, 2, scanNode.TableDef)), + scanNode, scanTag, 1, covered, + ) + require.NoError(t, err) + assert.False(t, ok) + assert.Nil(t, ast) + + caseAst, ok, err := serializeFilterCaseExprToAST([]*Expr{categoryEq, makePlan2StringConstExprWithType("beta")}, scanNode, scanTag, 1, covered) + require.NoError(t, err) + assert.False(t, ok) + assert.Nil(t, caseAst) +} + +func TestIvfSerializeFilterInvalidShapes(t *testing.T) { + _, _, scanNode, _, _ := newIvfIncludeModeTestBuilder(t) + scanTag := scanNode.BindingTags[0] + covered := map[string]struct{}{ + "id": {}, + "title": {}, + "category": {}, + } + + ast, ok, err := serializeFilterExprToAST(&Expr{}, scanNode, scanTag, 1, covered) + require.NoError(t, err) + assert.False(t, ok) + assert.Nil(t, ast) + + ast, ok, err = serializeFilterExprToAST(makeIvfHelperColExpr(scanTag, 2, scanNode.TableDef), scanNode, scanTag, 1, covered) + require.NoError(t, err) + require.True(t, ok) + assert.Contains(t, tree.StringWithOpts(ast, dialect.MYSQL, tree.WithQuoteString(true)), catalog.SystemSI_IVFFLAT_IncludeColPrefix+"title") + + ast, ok, err = serializeFilterExprToAST(makePlan2StringConstExprWithType("beta"), scanNode, scanTag, 1, covered) + require.NoError(t, err) + require.True(t, ok) + assert.Contains(t, tree.StringWithOpts(ast, dialect.MYSQL, tree.WithQuoteString(true)), "beta") + + ast, ok, err = serializeFilterExprToAST( + &Expr{ + Expr: &planpb.Expr_List{ + List: &planpb.ExprList{List: []*Expr{MakePlan2Int32ConstExprWithType(1), MakePlan2Int32ConstExprWithType(2)}}, + }, + }, + scanNode, scanTag, 1, covered, + ) + require.NoError(t, err) + require.True(t, ok) + assert.Contains(t, tree.StringWithOpts(ast, dialect.MYSQL, tree.WithQuoteString(true)), "(1, 2)") + + ast, ok, err = serializeFilterFuncToAST(nil, nil, scanNode, scanTag, 1, covered) + require.NoError(t, err) + assert.False(t, ok) + assert.Nil(t, ast) + + ast, ok, err = serializeFilterFuncToAST( + nil, + &planpb.Function{Func: &ObjectRef{ObjName: "and"}, Args: []*Expr{makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef)}}, + scanNode, scanTag, 1, covered, + ) + require.NoError(t, err) + assert.False(t, ok) + assert.Nil(t, ast) + + ast, ok, err = serializeFilterIsExprToAST(nil, scanNode, scanTag, 1, covered, func(expr tree.Expr) tree.Expr { + return tree.NewIsNullExpr(expr) + }) + require.NoError(t, err) + assert.False(t, ok) + assert.Nil(t, ast) + + ast, ok, err = serializeInListToAST([]*Expr{MakePlan2Int32ConstExprWithType(1)}, scanNode, scanTag, 1, covered) + require.NoError(t, err) + assert.False(t, ok) + assert.Nil(t, ast) + + invalidFns := []struct { + name string + fn *planpb.Function + }{ + {name: "not_bad_arity", fn: &planpb.Function{Func: &ObjectRef{ObjName: "not"}}}, + {name: "compare_bad_arity", fn: &planpb.Function{Func: &ObjectRef{ObjName: "="}, Args: []*Expr{makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef)}}}, + {name: "between_bad_arity", fn: &planpb.Function{Func: &ObjectRef{ObjName: "between"}, Args: []*Expr{makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), MakePlan2Int32ConstExprWithType(1)}}}, + {name: "in_bad_arity", fn: &planpb.Function{Func: &ObjectRef{ObjName: "in"}, Args: []*Expr{makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef)}}}, + {name: "binary_bad_arity", fn: &planpb.Function{Func: &ObjectRef{ObjName: "+"}, Args: []*Expr{makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef)}}}, + {name: "unary_bad_arity", fn: &planpb.Function{Func: &ObjectRef{ObjName: "unary_minus"}}}, + {name: "cast_bad_arity", fn: &planpb.Function{Func: &ObjectRef{ObjName: "cast"}}}, + } + + for _, tc := range invalidFns { + t.Run(tc.name, func(t *testing.T) { + ast, ok, err := serializeFilterFuncToAST(&Expr{Typ: Type{Id: int32(types.T_int64)}}, tc.fn, scanNode, scanTag, 1, covered) + require.NoError(t, err) + assert.False(t, ok) + assert.Nil(t, ast) + }) + } + + cols := map[string]struct{}{} + collectScanColumnsFromExpr(nil, scanTag, 1, scanNode.TableDef, cols) + collectScanColumnsFromExpr(makeIvfHelperColExpr(scanTag+1, 2, scanNode.TableDef), scanTag, 1, scanNode.TableDef, cols) + collectScanColumnsFromExpr( + &Expr{Typ: Type{Id: int32(types.T_varchar)}, Expr: &planpb.Expr_Col{Col: &ColRef{RelPos: scanTag, ColPos: 99, Name: "missing"}}}, + scanTag, 1, scanNode.TableDef, cols, + ) + collectScanColumnsFromExpr( + &Expr{Expr: &planpb.Expr_List{List: &planpb.ExprList{List: []*Expr{ + makeIvfHelperColExpr(scanTag, 2, scanNode.TableDef), + makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), + }}}}, + scanTag, 1, scanNode.TableDef, cols, + ) + assert.Equal(t, map[string]struct{}{ + "title": {}, + "category": {}, + }, cols) +} + +func TestIvfLiteralAndPlanTypeConversionHelpers(t *testing.T) { + literalCases := []struct { + name string + lit *planpb.Literal + typ Type + contains string + }{ + { + name: "i8", + lit: &planpb.Literal{Value: &planpb.Literal_I8Val{I8Val: 8}}, + typ: Type{Id: int32(types.T_int8)}, + contains: "8", + }, + { + name: "i16", + lit: &planpb.Literal{Value: &planpb.Literal_I16Val{I16Val: 16}}, + typ: Type{Id: int32(types.T_int16)}, + contains: "16", + }, + { + name: "i32", + lit: &planpb.Literal{Value: &planpb.Literal_I32Val{I32Val: 32}}, + typ: Type{Id: int32(types.T_int32)}, + contains: "32", + }, + { + name: "i64", + lit: &planpb.Literal{Value: &planpb.Literal_I64Val{I64Val: 64}}, + typ: Type{Id: int32(types.T_int64)}, + contains: "64", + }, + { + name: "u8", + lit: &planpb.Literal{Value: &planpb.Literal_U8Val{U8Val: 8}}, + typ: Type{Id: int32(types.T_uint8)}, + contains: "8", + }, + { + name: "u16", + lit: &planpb.Literal{Value: &planpb.Literal_U16Val{U16Val: 16}}, + typ: Type{Id: int32(types.T_uint16)}, + contains: "16", + }, + { + name: "u32", + lit: &planpb.Literal{Value: &planpb.Literal_U32Val{U32Val: 32}}, + typ: Type{Id: int32(types.T_uint32)}, + contains: "32", + }, + { + name: "u64", + lit: &planpb.Literal{Value: &planpb.Literal_U64Val{U64Val: 64}}, + typ: Type{Id: int32(types.T_uint64)}, + contains: "64", + }, + { + name: "f32", + lit: &planpb.Literal{Value: &planpb.Literal_Fval{Fval: 1.25}}, + typ: Type{Id: int32(types.T_float32)}, + contains: "1.25", + }, + { + name: "f64", + lit: &planpb.Literal{Value: &planpb.Literal_Dval{Dval: 2.5}}, + typ: Type{Id: int32(types.T_float64)}, + contains: "2.5", + }, + { + name: "bool", + lit: &planpb.Literal{Value: &planpb.Literal_Bval{Bval: true}}, + typ: Type{Id: int32(types.T_bool)}, + contains: "true", + }, + { + name: "date", + lit: &planpb.Literal{Value: &planpb.Literal_Dateval{Dateval: int32(types.Date(1))}}, + typ: Type{Id: int32(types.T_date)}, + contains: types.Date(1).String(), + }, + { + name: "time", + lit: &planpb.Literal{Value: &planpb.Literal_Timeval{Timeval: int64(types.Time(0))}}, + typ: Type{Id: int32(types.T_time), Scale: 3}, + contains: types.Time(0).String2(3), + }, + { + name: "datetime", + lit: &planpb.Literal{Value: &planpb.Literal_Datetimeval{Datetimeval: int64(types.Datetime(0))}}, + typ: Type{Id: int32(types.T_datetime), Scale: 3}, + contains: types.Datetime(0).String2(3), + }, + { + name: "timestamp", + lit: &planpb.Literal{Value: &planpb.Literal_Timestampval{Timestampval: int64(types.Timestamp(0))}}, + typ: Type{Id: int32(types.T_timestamp), Scale: 3}, + contains: types.Timestamp(0).String2(time.UTC, 3), + }, + { + name: "decimal64", + lit: &planpb.Literal{Value: &planpb.Literal_Decimal64Val{Decimal64Val: &planpb.Decimal64{A: 1234}}}, + typ: Type{Id: int32(types.T_decimal64), Scale: 2}, + contains: types.Decimal64(1234).Format(2), + }, + { + name: "decimal128", + lit: &planpb.Literal{Value: &planpb.Literal_Decimal128Val{ + Decimal128Val: &planpb.Decimal128{A: 1234, B: 0}, + }}, + typ: Type{Id: int32(types.T_decimal128), Scale: 2}, + contains: (types.Decimal128{B0_63: 1234, B64_127: 0}).Format(2), + }, + { + name: "json", + lit: &planpb.Literal{Value: &planpb.Literal_Jsonval{Jsonval: `{"k":1}`}}, + typ: Type{Id: int32(types.T_json)}, + contains: `\"k\"`, + }, + { + name: "enum", + lit: &planpb.Literal{Value: &planpb.Literal_EnumVal{EnumVal: 7}}, + typ: Type{Id: int32(types.T_enum)}, + contains: "7", + }, + { + name: "vec", + lit: &planpb.Literal{Value: &planpb.Literal_VecVal{VecVal: "[1,2,3]"}}, + typ: Type{Id: int32(types.T_array_float32)}, + contains: "[1,2,3]", + }, + } + + for _, tc := range literalCases { + t.Run("literal_"+tc.name, func(t *testing.T) { + ast, err := ivfLiteralToAST(tc.lit, tc.typ) + require.NoError(t, err) + sql := tree.StringWithOpts(ast, dialect.MYSQL, tree.WithQuoteString(true)) + assert.Contains(t, sql, tc.contains) + }) + } + + typeCases := []struct { + name string + typ Type + family string + unsigned bool + binary bool + display int32 + enumVals []string + }{ + {name: "bool", typ: Type{Id: int32(types.T_bool)}, family: "bool"}, + {name: "bit", typ: Type{Id: int32(types.T_bit)}, family: "bit", display: 1}, + {name: "int8", typ: Type{Id: int32(types.T_int8)}, family: "tinyint"}, + {name: "uint8", typ: Type{Id: int32(types.T_uint8)}, family: "tinyint", unsigned: true}, + {name: "int16", typ: Type{Id: int32(types.T_int16)}, family: "smallint"}, + {name: "uint16", typ: Type{Id: int32(types.T_uint16)}, family: "smallint", unsigned: true}, + {name: "int32", typ: Type{Id: int32(types.T_int32)}, family: "int"}, + {name: "uint32", typ: Type{Id: int32(types.T_uint32)}, family: "int", unsigned: true}, + {name: "int64", typ: Type{Id: int32(types.T_int64)}, family: "bigint"}, + {name: "float32", typ: Type{Id: int32(types.T_float32)}, family: "float"}, + {name: "uint64", typ: Type{Id: int32(types.T_uint64)}, family: "bigint", unsigned: true}, + {name: "float64", typ: Type{Id: int32(types.T_float64)}, family: "double"}, + {name: "decimal64", typ: Type{Id: int32(types.T_decimal64), Width: 12, Scale: 3}, family: "decimal", display: 12}, + {name: "date", typ: Type{Id: int32(types.T_date)}, family: "date"}, + {name: "time", typ: Type{Id: int32(types.T_time), Scale: 4}, family: "time", display: 4}, + {name: "datetime", typ: Type{Id: int32(types.T_datetime), Scale: 6}, family: "datetime", display: 6}, + {name: "timestamp", typ: Type{Id: int32(types.T_timestamp), Scale: 2}, family: "timestamp", display: 2}, + {name: "char", typ: Type{Id: int32(types.T_char), Width: 8}, family: "char", display: 8}, + {name: "varchar_default_width", typ: Type{Id: int32(types.T_varchar)}, family: "varchar", display: -1}, + {name: "binary", typ: Type{Id: int32(types.T_binary), Width: 16}, family: "binary", binary: true, display: 16}, + {name: "varbinary", typ: Type{Id: int32(types.T_varbinary), Width: 16}, family: "varbinary", binary: true, display: 16}, + {name: "text", typ: Type{Id: int32(types.T_text)}, family: "text"}, + {name: "blob", typ: Type{Id: int32(types.T_blob)}, family: "blob"}, + {name: "json", typ: Type{Id: int32(types.T_json)}, family: "json"}, + {name: "uuid", typ: Type{Id: int32(types.T_uuid)}, family: "uuid"}, + {name: "enum", typ: Type{Id: int32(types.T_enum), Enumvalues: "a,b"}, family: "enum", enumVals: []string{"a", "b"}}, + {name: "vecf32", typ: Type{Id: int32(types.T_array_float32), Width: 64}, family: "vecf32", display: 64}, + {name: "vecf64", typ: Type{Id: int32(types.T_array_float64), Width: 32}, family: "vecf64", display: 32}, + } + + for _, tc := range typeCases { + t.Run("type_"+tc.name, func(t *testing.T) { + treeType, err := ivfPlanTypeToTreeType(tc.typ) + require.NoError(t, err) + require.NotNil(t, treeType) + assert.Equal(t, tc.family, treeType.InternalType.FamilyString) + assert.Equal(t, tc.unsigned, treeType.InternalType.Unsigned) + assert.Equal(t, tc.binary, treeType.InternalType.Binary) + if tc.display != 0 { + assert.Equal(t, tc.display, treeType.InternalType.DisplayWith) + } + if tc.enumVals != nil { + assert.Equal(t, tc.enumVals, treeType.InternalType.EnumValues) + } + }) + } + + _, err := ivfPlanTypeToTreeType(Type{Id: int32(types.T_any)}) + require.Error(t, err) +} + +func TestIvfFilterColumnAndDistanceRangeHelpers(t *testing.T) { + builder, _, scanNode, _, _ := newIvfIncludeModeTestBuilder(t) + scanTag := scanNode.BindingTags[0] + + _, err := ivfFilterColumnToAST(&ColRef{ColPos: 0}, nil) + require.Error(t, err) + _, err = ivfFilterColumnToAST(&ColRef{ColPos: 99}, scanNode) + require.Error(t, err) + _, err = ivfFilterColumnToAST(&ColRef{RelPos: scanTag + 1, ColPos: 2, Name: "title"}, scanNode) + require.Error(t, err) + + pkExpr, err := ivfFilterColumnToAST(&ColRef{RelPos: scanTag, ColPos: 0, Name: "id"}, scanNode) + require.NoError(t, err) + assert.Contains(t, tree.StringWithOpts(pkExpr, dialect.MYSQL, tree.WithQuoteString(true)), catalog.SystemSI_IVFFLAT_TblCol_Entries_pk) + + includeExpr, err := ivfFilterColumnToAST(&ColRef{RelPos: scanTag, ColPos: 2, Name: "title"}, scanNode) + require.NoError(t, err) + assert.Contains(t, tree.StringWithOpts(includeExpr, dialect.MYSQL, tree.WithQuoteString(true)), catalog.SystemSI_IVFFLAT_IncludeColPrefix+"title") + + ivfCtx := &ivfIndexContext{ + partPos: 1, + origFuncName: "l2_distance", + vecLitArg: &Expr{Typ: Type{Id: int32(types.T_array_float32)}, Expr: &planpb.Expr_Lit{Lit: &planpb.Literal{Value: &planpb.Literal_VecVal{VecVal: "[1,1,1]"}}}}, + pushdownEnabled: false, + } + validVecExpr := makeIvfHelperFnExpr( + "l2_distance", + Type{Id: int32(types.T_float64)}, + makeIvfHelperColExpr(scanTag, 1, scanNode.TableDef), + &Expr{Typ: Type{Id: int32(types.T_array_float32)}, Expr: &planpb.Expr_Lit{Lit: &planpb.Literal{Value: &planpb.Literal_VecVal{VecVal: "[1,1,1]"}}}}, + ) + invalidVecExpr := makeIvfHelperFnExpr( + "l2_distance", + Type{Id: int32(types.T_float64)}, + makeIvfHelperColExpr(scanTag, 1, scanNode.TableDef), + &Expr{Typ: Type{Id: int32(types.T_array_float32)}, Expr: &planpb.Expr_Lit{Lit: &planpb.Literal{Value: &planpb.Literal_VecVal{VecVal: "[9,9,9]"}}}}, + ) + remaining, distRange := builder.getDistRangeFromFilters( + []*Expr{ + makeIvfHelperFnExpr(">=", Type{Id: int32(types.T_bool)}, validVecExpr, MakePlan2Float64ConstExprWithType(0.1)), + makeIvfHelperFnExpr("<", Type{Id: int32(types.T_bool)}, validVecExpr, MakePlan2Float64ConstExprWithType(0.9)), + makeIvfHelperFnExpr("<=", Type{Id: int32(types.T_bool)}, invalidVecExpr, MakePlan2Float64ConstExprWithType(0.3)), + makeIvfHelperFnExpr("=", Type{Id: int32(types.T_bool)}, makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), MakePlan2Int32ConstExprWithType(20)), + }, + ivfCtx, + ) + require.NotNil(t, distRange) + assert.Equal(t, planpb.BoundType_INCLUSIVE, distRange.LowerBoundType) + assert.Equal(t, planpb.BoundType_EXCLUSIVE, distRange.UpperBoundType) + require.Len(t, remaining, 2) + assert.Equal(t, "<=", remaining[0].GetF().Func.ObjName) + assert.Equal(t, "=", remaining[1].GetF().Func.ObjName) +} + +func TestSkipPkDedupCoverage(t *testing.T) { + tests := []struct { + name string + old *TableDef + new *TableDef + want bool + }{ + { + name: "new table without primary key skips", + old: &TableDef{Pkey: &PrimaryKeyDef{PkeyColName: "id", Names: []string{"id"}}}, + new: &TableDef{Pkey: nil}, + want: true, + }, + { + name: "adding a new primary key requires dedup", + old: &TableDef{Pkey: &PrimaryKeyDef{PkeyColName: catalog.FakePrimaryKeyColName}}, + new: &TableDef{Pkey: &PrimaryKeyDef{PkeyColName: "id", Names: []string{"id"}}}, + want: false, + }, + { + name: "same primary key names skip dedup", + old: &TableDef{Pkey: &PrimaryKeyDef{PkeyColName: "id", Names: []string{"id"}}}, + new: &TableDef{Pkey: &PrimaryKeyDef{PkeyColName: "id", Names: []string{"id"}}}, + want: true, + }, + { + name: "changed primary key names do not skip", + old: &TableDef{Pkey: &PrimaryKeyDef{PkeyColName: "id", Names: []string{"id"}}}, + new: &TableDef{Pkey: &PrimaryKeyDef{PkeyColName: "headline", Names: []string{"headline"}}}, + want: false, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + assert.Equal(t, tc.want, skipPkDedup(tc.old, tc.new)) + }) + } +} + +func TestOrderByColumnAllowsKnownColumns(t *testing.T) { + mock := NewMockOptimizer(false) + origin := makeAlterCoverageTableDef() + copyTable := DeepCopyTableDef(origin, true) + alterCtx := initAlterTableContext(origin, copyTable, origin.DbName) + alterPlan := &planpb.AlterTable{ + Database: origin.DbName, + TableDef: origin, + CopyTableDef: copyTable, + } + spec := mustParseOrderByClause( + t, + mock.CurrentContext(), + "alter table t1 order by id, title", + ) + + err := OrderByColumn(mock.CurrentContext(), alterPlan, spec, alterCtx) + require.NoError(t, err) +} diff --git a/pkg/sql/plan/apply_indices_ivfflat_optimize_test.go b/pkg/sql/plan/apply_indices_ivfflat_optimize_test.go index 97dc48d165688..3d73182a89555 100644 --- a/pkg/sql/plan/apply_indices_ivfflat_optimize_test.go +++ b/pkg/sql/plan/apply_indices_ivfflat_optimize_test.go @@ -25,6 +25,65 @@ import ( "github.com/stretchr/testify/require" ) +func newIvfLogicalTestIndexDefs(part string) []*plan.IndexDef { + idxAlgoParams := `{"op_type":"` + metric.DistFuncOpTypes["l2_distance"] + `"}` + return []*plan.IndexDef{ + { + IndexName: "idx_vec", + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Metadata, + IndexAlgoParams: idxAlgoParams, + Parts: []string{part}, + }, + { + IndexName: "idx_vec", + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Centroids, + IndexAlgoParams: idxAlgoParams, + Parts: []string{part}, + }, + { + IndexName: "idx_vec", + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Entries, + IndexAlgoParams: idxAlgoParams, + Parts: []string{part}, + }, + } +} + +func makeConsistentIvfMultiTableIndexForOptimizeTest(part, idxAlgoParams string) *MultiTableIndex { + return &MultiTableIndex{ + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexDefs: map[string]*plan.IndexDef{ + catalog.SystemSI_IVFFLAT_TblType_Metadata: { + IndexName: "idx_vec", + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Metadata, + IndexTableName: "meta", + IndexAlgoParams: idxAlgoParams, + Parts: []string{part}, + }, + catalog.SystemSI_IVFFLAT_TblType_Centroids: { + IndexName: "idx_vec", + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Centroids, + IndexTableName: "centroids", + IndexAlgoParams: idxAlgoParams, + Parts: []string{part}, + }, + catalog.SystemSI_IVFFLAT_TblType_Entries: { + IndexName: "idx_vec", + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Entries, + IndexTableName: "entries", + IndexAlgoParams: idxAlgoParams, + Parts: []string{part}, + }, + }, + } +} + func TestApplyIndicesForSortUsingIvfflat_PushdownOptimization(t *testing.T) { // Setup Compiler Context with mocked variables baseMockCtx := NewMockCompilerContext(false) @@ -56,23 +115,7 @@ func TestApplyIndicesForSortUsingIvfflat_PushdownOptimization(t *testing.T) { // Setup MultiTableIndex idxAlgoParams := `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `"}` - multiTableIndex := &MultiTableIndex{ - IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), - IndexDefs: map[string]*plan.IndexDef{ - catalog.SystemSI_IVFFLAT_TblType_Metadata: { - IndexTableName: "meta", - IndexAlgoParams: idxAlgoParams, - }, - catalog.SystemSI_IVFFLAT_TblType_Centroids: { - IndexTableName: "centroids", - Parts: []string{"v"}, - IndexAlgoParams: idxAlgoParams, - }, - catalog.SystemSI_IVFFLAT_TblType_Entries: { - IndexTableName: "entries", - }, - }, - } + multiTableIndex := makeConsistentIvfMultiTableIndexForOptimizeTest("v", idxAlgoParams) float32Typ := plan.Type{Id: int32(types.T_array_float32)} @@ -127,21 +170,13 @@ func TestApplyIndicesForSortUsingIvfflat_PushdownOptimization(t *testing.T) { _, err := builder.applyIndicesForSortUsingIvfflat(scanNodeID, vecCtx, multiTableIndex, nil, nil) require.NoError(t, err) - // Verification: - // PROJECT -> SORT -> JOIN(SCAN, FUNCTION_SCAN) + // A fully covered query can collapse directly to the table function. sortNodeID := vecCtx.projNode.Children[0] sortNode := builder.qry.Nodes[sortNodeID] require.Equal(t, plan.Node_SORT, sortNode.NodeType) - joinNodeID := sortNode.Children[0] - joinNode := builder.qry.Nodes[joinNodeID] - require.Equal(t, plan.Node_JOIN, joinNode.NodeType) - - // In "No Filter" case, it should NOT be the nested join structure - // Right child should be FUNCTION_SCAN, not another JOIN - rightChildID := joinNode.Children[1] - rightChild := builder.qry.Nodes[rightChildID] - assert.Equal(t, plan.Node_FUNCTION_SCAN, rightChild.NodeType) + childNode := builder.qry.Nodes[sortNode.Children[0]] + assert.Equal(t, plan.Node_FUNCTION_SCAN, childNode.NodeType) }) // 2. Case: With filters. Should ENABLE pushdown (nested join) @@ -173,17 +208,11 @@ func TestApplyIndicesForSortUsingIvfflat_PushdownOptimization(t *testing.T) { _, err := builder.applyIndicesForSortUsingIvfflat(scanNodeID, vecCtx, multiTableIndex, nil, nil) require.NoError(t, err) - // Verification: - // PROJECT -> SORT -> JOIN(SCAN, JOIN(FUNCTION_SCAN, PROJECT(SCAN))) + // A fully pushdownable covered filter can also collapse to the table function. sortNodeID := vecCtx.projNode.Children[0] sortNode := builder.qry.Nodes[sortNodeID] - outerJoinNodeID := sortNode.Children[0] - outerJoinNode := builder.qry.Nodes[outerJoinNodeID] - require.Equal(t, plan.Node_JOIN, outerJoinNode.NodeType) - - innerJoinNodeID := outerJoinNode.Children[1] - innerJoinNode := builder.qry.Nodes[innerJoinNodeID] - assert.Equal(t, plan.Node_JOIN, innerJoinNode.NodeType, "With filter, right child should be nested JOIN") + childNode := builder.qry.Nodes[sortNode.Children[0]] + assert.Equal(t, plan.Node_FUNCTION_SCAN, childNode.NodeType) }) } @@ -253,23 +282,7 @@ func TestApplyIndicesForSortUsingIvfflat_OuterScanRegularIndexPreservesProtectio mockCtx.objects[indexTable] = &plan.ObjectRef{SchemaName: schemaName, ObjName: indexTable} idxAlgoParams := `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `"}` - multiTableIndex := &MultiTableIndex{ - IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), - IndexDefs: map[string]*plan.IndexDef{ - catalog.SystemSI_IVFFLAT_TblType_Metadata: { - IndexTableName: "meta", - IndexAlgoParams: idxAlgoParams, - }, - catalog.SystemSI_IVFFLAT_TblType_Centroids: { - IndexTableName: "centroids", - Parts: []string{"v"}, - IndexAlgoParams: idxAlgoParams, - }, - catalog.SystemSI_IVFFLAT_TblType_Entries: { - IndexTableName: "entries", - }, - }, - } + multiTableIndex := makeConsistentIvfMultiTableIndexForOptimizeTest("v", idxAlgoParams) builder := NewQueryBuilder(plan.Query_SELECT, mockCtx, false, true) ctx := NewBindContext(builder, nil) @@ -425,23 +438,7 @@ func TestApplyIndicesForSortUsingIvfflat_OuterScanIndexOnlyUsesOptimizedPk(t *te mockCtx.objects[indexTable] = &plan.ObjectRef{SchemaName: schemaName, ObjName: indexTable} idxAlgoParams := `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `"}` - multiTableIndex := &MultiTableIndex{ - IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), - IndexDefs: map[string]*plan.IndexDef{ - catalog.SystemSI_IVFFLAT_TblType_Metadata: { - IndexTableName: "meta", - IndexAlgoParams: idxAlgoParams, - }, - catalog.SystemSI_IVFFLAT_TblType_Centroids: { - IndexTableName: "centroids", - Parts: []string{"v"}, - IndexAlgoParams: idxAlgoParams, - }, - catalog.SystemSI_IVFFLAT_TblType_Entries: { - IndexTableName: "entries", - }, - }, - } + multiTableIndex := makeConsistentIvfMultiTableIndexForOptimizeTest("v", idxAlgoParams) builder := NewQueryBuilder(plan.Query_SELECT, mockCtx, false, true) ctx := NewBindContext(builder, nil) @@ -706,23 +703,7 @@ func newExactVectorFallbackApplyIndicesCase(t *testing.T, sortFlag plan.OrderByS }, Pkey: &plan.PrimaryKeyDef{PkeyColName: "id"}, Name2ColIndex: map[string]int32{"id": 0, "vec": 1}, - Indexes: []*plan.IndexDef{ - { - IndexName: "idx_vec", - IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), - IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Metadata, - }, - { - IndexName: "idx_vec", - IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), - IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Centroids, - }, - { - IndexName: "idx_vec", - IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), - IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Entries, - }, - }, + Indexes: newIvfLogicalTestIndexDefs("vec"), } scanTag := builder.genNewBindTag() @@ -800,23 +781,7 @@ func newProjectedExactVectorFallbackApplyIndicesCase(t *testing.T) (*QueryBuilde }, Pkey: &plan.PrimaryKeyDef{PkeyColName: "id"}, Name2ColIndex: map[string]int32{"id": 0, "vec": 1}, - Indexes: []*plan.IndexDef{ - { - IndexName: "idx_vec", - IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), - IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Metadata, - }, - { - IndexName: "idx_vec", - IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), - IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Centroids, - }, - { - IndexName: "idx_vec", - IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), - IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Entries, - }, - }, + Indexes: newIvfLogicalTestIndexDefs("vec"), } scanTag := builder.genNewBindTag() @@ -920,23 +885,7 @@ func newProjectedHiddenPkExactVectorFallbackApplyIndicesCase(t *testing.T) (*Que }, Pkey: &plan.PrimaryKeyDef{PkeyColName: catalog.CPrimaryKeyColName}, Name2ColIndex: map[string]int32{catalog.CPrimaryKeyColName: 0, "file_id": 1, "vec": 2}, - Indexes: []*plan.IndexDef{ - { - IndexName: "idx_vec", - IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), - IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Metadata, - }, - { - IndexName: "idx_vec", - IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), - IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Centroids, - }, - { - IndexName: "idx_vec", - IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), - IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Entries, - }, - }, + Indexes: newIvfLogicalTestIndexDefs("vec"), } scanTag := builder.genNewBindTag() diff --git a/pkg/sql/plan/apply_indices_ivfflat_test.go b/pkg/sql/plan/apply_indices_ivfflat_test.go index 55417dbca3982..29fbee3e82667 100644 --- a/pkg/sql/plan/apply_indices_ivfflat_test.go +++ b/pkg/sql/plan/apply_indices_ivfflat_test.go @@ -31,6 +31,36 @@ import ( // Tests for prepareIvfIndexContext // ============================================================================ +func makeConsistentIvfMultiTableIndexForTest(indexName, idxAlgoParams string, parts []string) *MultiTableIndex { + clonedParts := append([]string(nil), parts...) + return &MultiTableIndex{ + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexDefs: map[string]*plan.IndexDef{ + catalog.SystemSI_IVFFLAT_TblType_Metadata: { + IndexName: indexName, + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Metadata, + IndexAlgoParams: idxAlgoParams, + Parts: append([]string(nil), clonedParts...), + }, + catalog.SystemSI_IVFFLAT_TblType_Centroids: { + IndexName: indexName, + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Centroids, + IndexAlgoParams: idxAlgoParams, + Parts: append([]string(nil), clonedParts...), + }, + catalog.SystemSI_IVFFLAT_TblType_Entries: { + IndexName: indexName, + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Entries, + IndexAlgoParams: idxAlgoParams, + Parts: append([]string(nil), clonedParts...), + }, + }, + } +} + // TestPrepareIvfIndexContext_NilVecCtx tests the case where vecCtx is nil func TestPrepareIvfIndexContext_NilVecCtx(t *testing.T) { builder := NewQueryBuilder(plan.Query_SELECT, NewMockCompilerContext(true), false, true) @@ -257,17 +287,11 @@ func TestPrepareIvfIndexContext_ArgsNotFound(t *testing.T) { scanNode: scanNode, } - multiTableIndex := &MultiTableIndex{ - IndexDefs: map[string]*plan.IndexDef{ - catalog.SystemSI_IVFFLAT_TblType_Metadata: { - IndexAlgoParams: `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `"}`, - }, - catalog.SystemSI_IVFFLAT_TblType_Centroids: { - Parts: []string{"vec_col"}, - }, - catalog.SystemSI_IVFFLAT_TblType_Entries: {}, - }, - } + multiTableIndex := makeConsistentIvfMultiTableIndexForTest( + "idx_ivf_args_not_found", + `{"op_type": "`+metric.DistFuncOpTypes["l2_distance"]+`"}`, + []string{"vec_col"}, + ) result, err := builder.prepareIvfIndexContext(vecCtx, multiTableIndex) assert.NoError(t, err) @@ -342,17 +366,11 @@ func TestPrepareIvfIndexContext_ResolveVariableError_IvfThreads(t *testing.T) { scanNode: scanNode, } - multiTableIndex := &MultiTableIndex{ - IndexDefs: map[string]*plan.IndexDef{ - catalog.SystemSI_IVFFLAT_TblType_Metadata: { - IndexAlgoParams: `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `"}`, - }, - catalog.SystemSI_IVFFLAT_TblType_Centroids: { - Parts: []string{"vec_col"}, - }, - catalog.SystemSI_IVFFLAT_TblType_Entries: {}, - }, - } + multiTableIndex := makeConsistentIvfMultiTableIndexForTest( + "idx_ivf_resolve_threads", + `{"op_type": "`+metric.DistFuncOpTypes["l2_distance"]+`"}`, + []string{"vec_col"}, + ) result, err := builder.prepareIvfIndexContext(vecCtx, multiTableIndex) assert.Error(t, err) @@ -431,17 +449,11 @@ func TestPrepareIvfIndexContext_ResolveVariableError_ProbeLimit(t *testing.T) { scanNode: scanNode, } - multiTableIndex := &MultiTableIndex{ - IndexDefs: map[string]*plan.IndexDef{ - catalog.SystemSI_IVFFLAT_TblType_Metadata: { - IndexAlgoParams: `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `"}`, - }, - catalog.SystemSI_IVFFLAT_TblType_Centroids: { - Parts: []string{"vec_col"}, - }, - catalog.SystemSI_IVFFLAT_TblType_Entries: {}, - }, - } + multiTableIndex := makeConsistentIvfMultiTableIndexForTest( + "idx_ivf_resolve_probe", + `{"op_type": "`+metric.DistFuncOpTypes["l2_distance"]+`"}`, + []string{"vec_col"}, + ) result, err := builder.prepareIvfIndexContext(vecCtx, multiTableIndex) assert.Error(t, err) @@ -520,17 +532,11 @@ func TestPrepareIvfIndexContext_ProbeLimitNotInt64(t *testing.T) { scanNode: scanNode, } - multiTableIndex := &MultiTableIndex{ - IndexDefs: map[string]*plan.IndexDef{ - catalog.SystemSI_IVFFLAT_TblType_Metadata: { - IndexAlgoParams: `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `"}`, - }, - catalog.SystemSI_IVFFLAT_TblType_Centroids: { - Parts: []string{"vec_col"}, - }, - catalog.SystemSI_IVFFLAT_TblType_Entries: {}, - }, - } + multiTableIndex := makeConsistentIvfMultiTableIndexForTest( + "idx_ivf_probe_type", + `{"op_type": "`+metric.DistFuncOpTypes["l2_distance"]+`"}`, + []string{"vec_col"}, + ) result, err := builder.prepareIvfIndexContext(vecCtx, multiTableIndex) assert.Error(t, err) @@ -610,18 +616,11 @@ func TestPrepareIvfIndexContext_Success(t *testing.T) { } idxAlgoParams := `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `", "lists": 100}` - multiTableIndex := &MultiTableIndex{ - IndexDefs: map[string]*plan.IndexDef{ - catalog.SystemSI_IVFFLAT_TblType_Metadata: { - IndexAlgoParams: idxAlgoParams, - }, - catalog.SystemSI_IVFFLAT_TblType_Centroids: { - Parts: []string{"vec_col"}, - IndexAlgoParams: idxAlgoParams, - }, - catalog.SystemSI_IVFFLAT_TblType_Entries: {}, - }, - } + multiTableIndex := makeConsistentIvfMultiTableIndexForTest( + "idx_ivf_success", + idxAlgoParams, + []string{"vec_col"}, + ) result, err := builder.prepareIvfIndexContext(vecCtx, multiTableIndex) require.NoError(t, err) @@ -784,18 +783,11 @@ func TestPrepareIvfIndexContext_AdaptiveNprobe(t *testing.T) { // 1. Adaptive nprobe enabled (auto mode, selectivity 0.25, totalLists 100) idxAlgoParams := `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `", "lists": 100}` - multiTableIndex := &MultiTableIndex{ - IndexDefs: map[string]*plan.IndexDef{ - catalog.SystemSI_IVFFLAT_TblType_Metadata: { - IndexAlgoParams: idxAlgoParams, - }, - catalog.SystemSI_IVFFLAT_TblType_Centroids: { - Parts: []string{"vec_col"}, - IndexAlgoParams: idxAlgoParams, - }, - catalog.SystemSI_IVFFLAT_TblType_Entries: {}, - }, - } + multiTableIndex := makeConsistentIvfMultiTableIndexForTest( + "idx_ivf_auto_adaptive", + idxAlgoParams, + []string{"vec_col"}, + ) // Case 1: Adaptive mode enabled, compensation applied result, err := builder.prepareIvfIndexContext(vecCtx, multiTableIndex) @@ -806,18 +798,11 @@ func TestPrepareIvfIndexContext_AdaptiveNprobe(t *testing.T) { // Case 2: Adaptive mode disabled because totalLists is missing idxAlgoParamsNoLists := `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `"}` - multiTableIndexNoLists := &MultiTableIndex{ - IndexDefs: map[string]*plan.IndexDef{ - catalog.SystemSI_IVFFLAT_TblType_Metadata: { - IndexAlgoParams: idxAlgoParamsNoLists, - }, - catalog.SystemSI_IVFFLAT_TblType_Centroids: { - Parts: []string{"vec_col"}, - IndexAlgoParams: idxAlgoParamsNoLists, - }, - catalog.SystemSI_IVFFLAT_TblType_Entries: {}, - }, - } + multiTableIndexNoLists := makeConsistentIvfMultiTableIndexForTest( + "idx_ivf_auto_no_lists", + idxAlgoParamsNoLists, + []string{"vec_col"}, + ) result, err = builder.prepareIvfIndexContext(vecCtx, multiTableIndexNoLists) require.NoError(t, err) require.NotNil(t, result) @@ -901,18 +886,11 @@ func TestPrepareIvfIndexContext_ImplicitDescendingOrderDisablesIvfRewrite(t *tes } idxAlgoParams := `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `", "lists": 100}` - multiTableIndex := &MultiTableIndex{ - IndexDefs: map[string]*plan.IndexDef{ - catalog.SystemSI_IVFFLAT_TblType_Metadata: { - IndexAlgoParams: idxAlgoParams, - }, - catalog.SystemSI_IVFFLAT_TblType_Centroids: { - Parts: []string{"vec_col"}, - IndexAlgoParams: idxAlgoParams, - }, - catalog.SystemSI_IVFFLAT_TblType_Entries: {}, - }, - } + multiTableIndex := makeConsistentIvfMultiTableIndexForTest( + "idx_ivf_desc_implicit", + idxAlgoParams, + []string{"vec_col"}, + ) result, err := builder.prepareIvfIndexContext(vecCtx, multiTableIndex) require.NoError(t, err) @@ -985,18 +963,11 @@ func TestPrepareIvfIndexContext_ExplicitDescendingOrderFallsBackToOriginalSearch } idxAlgoParams := `{"op_type": "` + metric.DistFuncOpTypes["l2_distance"] + `", "lists": 100}` - multiTableIndex := &MultiTableIndex{ - IndexDefs: map[string]*plan.IndexDef{ - catalog.SystemSI_IVFFLAT_TblType_Metadata: { - IndexAlgoParams: idxAlgoParams, - }, - catalog.SystemSI_IVFFLAT_TblType_Centroids: { - Parts: []string{"vec_col"}, - IndexAlgoParams: idxAlgoParams, - }, - catalog.SystemSI_IVFFLAT_TblType_Entries: {}, - }, - } + multiTableIndex := makeConsistentIvfMultiTableIndexForTest( + "idx_ivf_desc_explicit", + idxAlgoParams, + []string{"vec_col"}, + ) result, err := builder.prepareIvfIndexContext(vecCtx, multiTableIndex) require.NoError(t, err) diff --git a/pkg/sql/plan/bind_update.go b/pkg/sql/plan/bind_update.go index b4e0016c93950..9d70d3a811469 100644 --- a/pkg/sql/plan/bind_update.go +++ b/pkg/sql/plan/bind_update.go @@ -67,6 +67,14 @@ func (builder *QueryBuilder) bindUpdate(stmt *tree.Update, bindCtx *BindContext) resolvedColName := catalog.ResolveAlias(part) irregularIndexCols[resolvedColName] = true } + for _, colName := range idxDef.IncludedColumns { + irregularIndexCols[catalog.ResolveAlias(colName)] = true + } + } + } + if hasIrregularIndex && tableDef.Pkey != nil { + for _, colName := range tableDef.Pkey.Names { + irregularIndexCols[catalog.ResolveAlias(colName)] = true } } diff --git a/pkg/sql/plan/build_alter_add_column.go b/pkg/sql/plan/build_alter_add_column.go index dfdcd7b8c5004..0253ec269b100 100644 --- a/pkg/sql/plan/build_alter_add_column.go +++ b/pkg/sql/plan/build_alter_add_column.go @@ -427,6 +427,7 @@ func checkVisibleColumnCnt(ctx context.Context, tblInfo *TableDef, addCount, dro func handleDropColumnWithIndex(ctx context.Context, colName string, tbInfo *TableDef) error { for i := 0; i < len(tbInfo.Indexes); i++ { indexInfo := tbInfo.Indexes[i] + includeAffected := indexIncludesColumn(indexInfo, colName) indexInfo.Parts = RemoveIf[string](indexInfo.Parts, func(t string) bool { return catalog.ResolveAlias(t) == colName }) @@ -455,9 +456,11 @@ func handleDropColumnWithIndex(ctx context.Context, colName string, tbInfo *Tabl } case catalog.MoIndexIvfFlatAlgo.ToString(): // ivf index - if len(indexInfo.Parts) == 0 { - // remove 3 index records: metadata, centroids, entries - tbInfo.Indexes = append(tbInfo.Indexes[:i], tbInfo.Indexes[i+3:]...) + if len(indexInfo.Parts) == 0 || includeAffected { + tbInfo.Indexes = RemoveIf[*IndexDef](tbInfo.Indexes, func(def *IndexDef) bool { + return def.IndexName == indexInfo.IndexName + }) + i-- } case catalog.MOIndexMasterAlgo.ToString(): if len(indexInfo.Parts) == 0 { @@ -469,9 +472,11 @@ func handleDropColumnWithIndex(ctx context.Context, colName string, tbInfo *Tabl tbInfo.Indexes = append(tbInfo.Indexes[:i], tbInfo.Indexes[i+1:]...) } case catalog.MoIndexHnswAlgo.ToString(): - if len(indexInfo.Parts) == 0 { - // remove 2 index records: metadata, storage - tbInfo.Indexes = append(tbInfo.Indexes[:i], tbInfo.Indexes[i+2:]...) + if len(indexInfo.Parts) == 0 || includeAffected { + tbInfo.Indexes = RemoveIf[*IndexDef](tbInfo.Indexes, func(def *IndexDef) bool { + return def.IndexName == indexInfo.IndexName + }) + i-- } } } diff --git a/pkg/sql/plan/build_alter_change_column.go b/pkg/sql/plan/build_alter_change_column.go index 5888b3d955dfb..449adabaf8b62 100644 --- a/pkg/sql/plan/build_alter_change_column.go +++ b/pkg/sql/plan/build_alter_change_column.go @@ -88,6 +88,14 @@ func ChangeColumn( return false, err } + if oldColName != newColName { + sqls, err := renameColumnInVectorIndexIncludedColumns(tableDef, oldColName, newColName) + if err != nil { + return false, err + } + alterCtx.UpdateSqls = append(alterCtx.UpdateSqls, sqls...) + } + updateClusterByInTableDef(ctx, tableDef, newColName, oldColName) delete(alterCtx.alterColMap, oldColName) diff --git a/pkg/sql/plan/build_alter_rename_column.go b/pkg/sql/plan/build_alter_rename_column.go index 39059ba35e575..49bd897d9105d 100644 --- a/pkg/sql/plan/build_alter_rename_column.go +++ b/pkg/sql/plan/build_alter_rename_column.go @@ -127,6 +127,12 @@ func updateRenameColumnInTableDef( )) } + ivfAlgoParamSQLs, err := renameColumnInVectorIndexIncludedColumns(tableDef, oldColName, newColName) + if err != nil { + return nil, err + } + sqls = append(sqls, ivfAlgoParamSQLs...) + // update primary key primaryKeyDef := tableDef.Pkey primaryKeyAffected := false diff --git a/pkg/sql/plan/build_alter_table.go b/pkg/sql/plan/build_alter_table.go index 5a6efd230f2fd..d678d52dcb9c4 100644 --- a/pkg/sql/plan/build_alter_table.go +++ b/pkg/sql/plan/build_alter_table.go @@ -189,7 +189,11 @@ func buildAlterTableCopy(stmt *tree.AlterTable, cctx CompilerContext) (*Plan, er affectedCols = append(affectedCols, option.NewColumn.Name.ColName()) case *tree.AlterTableChangeColumnClause: pkAffected, err = ChangeColumn(cctx, alterTablePlan, option, alterTableCtx) - affectedCols = append(affectedCols, option.NewColumn.Name.ColName()) + affectedCols = appendAffectedAlterColumnNames( + affectedCols, + option.OldColumnName.ColName(), + option.NewColumn.Name.ColName(), + ) case *tree.AlterTableRenameColumnClause: err = RenameColumn(cctx, alterTablePlan, option, alterTableCtx) affectedCols = append(affectedCols, option.OldColumnName.ColName()) @@ -210,17 +214,21 @@ func buildAlterTableCopy(stmt *tree.AlterTable, cctx CompilerContext) (*Plan, er } } + if pkAffected { + affectedAllIdxCols() + } else { + affectedCols, err = collectAffectedIndexNamesForAlter(tableDef.Indexes, affectedCols) + if err != nil { + return nil, err + } + } + createTmpDdl, _, err := ConstructCreateTableSQL(cctx, copyTableDef, snapshot, true, nil) if err != nil { return nil, err } alterTablePlan.CreateTmpTableSql = createTmpDdl - - if pkAffected { - affectedAllIdxCols() - } - alterTablePlan.AffectedCols = affectedCols opt := &plan.AlterCopyOpt{ @@ -274,6 +282,14 @@ func buildAlterTableCopy(stmt *tree.AlterTable, cctx CompilerContext) (*Plan, er }, nil } +func appendAffectedAlterColumnNames(affectedCols []string, oldColName, newColName string) []string { + affectedCols = append(affectedCols, oldColName) + if newColName != oldColName { + affectedCols = append(affectedCols, newColName) + } + return affectedCols +} + var ID atomic.Int64 func buildAlterInsertDataSQL( diff --git a/pkg/sql/plan/build_ddl.go b/pkg/sql/plan/build_ddl.go index 45ced634ca55d..3f9646d71d4ca 100644 --- a/pkg/sql/plan/build_ddl.go +++ b/pkg/sql/plan/build_ddl.go @@ -29,6 +29,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/container/types" "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/logutil" "github.com/matrixorigin/matrixone/pkg/pb/plan" "github.com/matrixorigin/matrixone/pkg/pb/timestamp" "github.com/matrixorigin/matrixone/pkg/sql/features" @@ -2462,6 +2463,66 @@ func buildRegularSecondaryIndexDef(ctx CompilerContext, indexInfo *tree.Index, c // primary key (__mo_index_centriod_fk_version, __mo_index_centroid_fk_id, __mo_index_pri_col) // ) +const maxVectorIndexIncludeColumns = 10 + +func getVectorIndexIncludeColumnNames(indexInfo *tree.Index) []string { + if indexInfo == nil || indexInfo.IndexOption == nil || len(indexInfo.IndexOption.IncludeColumns) == 0 { + return nil + } + + names := make([]string, 0, len(indexInfo.IndexOption.IncludeColumns)) + for _, col := range indexInfo.IndexOption.IncludeColumns { + names = append(names, col.ColName()) + } + return names +} + +func vectorIndexIncludeAlgoName(indexInfo *tree.Index) string { + if indexInfo == nil { + return "VECTOR INDEX" + } + return strings.ToUpper(indexInfo.KeyType.ToString()) +} + +func validateVectorIndexIncludeColumns(ctx CompilerContext, indexInfo *tree.Index, colMap map[string]*ColDef, vecColName string, pkeyName string) error { + includeColNames := getVectorIndexIncludeColumnNames(indexInfo) + if len(includeColNames) == 0 { + return nil + } + + algoName := vectorIndexIncludeAlgoName(indexInfo) + if len(includeColNames) > maxVectorIndexIncludeColumns { + return moerr.NewInvalidInputf(ctx.GetContext(), "%s INCLUDE supports at most %d columns", algoName, maxVectorIndexIncludeColumns) + } + + includeSeen := make(map[string]struct{}, len(includeColNames)) + for _, col := range indexInfo.IndexOption.IncludeColumns { + name := col.ColName() + nameOrigin := col.ColNameOrigin() + + if _, ok := colMap[name]; !ok { + return moerr.NewInvalidInputf(ctx.GetContext(), "column '%s' is not exist", nameOrigin) + } + if name == vecColName { + return moerr.NewInvalidInputf(ctx.GetContext(), "column '%s' cannot be both %s key and INCLUDE column", nameOrigin, algoName) + } + if name == pkeyName { + return moerr.NewInvalidInputf(ctx.GetContext(), "primary key column '%s' cannot be in %s INCLUDE", nameOrigin, algoName) + } + if _, ok := includeSeen[name]; ok { + return moerr.NewInvalidInputf(ctx.GetContext(), "duplicate include column '%s'", nameOrigin) + } + includeSeen[name] = struct{}{} + + switch colMap[name].Typ.Id { + case int32(types.T_blob), int32(types.T_text): + logutil.Warnf("%s INCLUDE column %q uses large type %s; index storage size may increase significantly", algoName, nameOrigin, types.T(colMap[name].Typ.Id).String()) + } + } + + return nil +} + func buildIvfFlatSecondaryIndexDef(ctx CompilerContext, indexInfo *tree.Index, colMap map[string]*ColDef, existedIndexes []*plan.IndexDef, pkeyName string) ([]*plan.IndexDef, []*TableDef, error) { indexParts := make([]string, 1) @@ -2490,6 +2551,10 @@ func buildIvfFlatSecondaryIndexDef(ctx CompilerContext, indexInfo *tree.Index, c } } + if err := validateVectorIndexIncludeColumns(ctx, indexInfo, colMap, name, pkeyName); err != nil { + return nil, nil, err + } + } indexDefs := make([]*plan.IndexDef, 3) @@ -2656,6 +2721,10 @@ func buildIvfFlatSecondaryIndexDef(ctx CompilerContext, indexInfo *tree.Index, c // 3. create ivf-flat `entries` table { + includeColNames := getVectorIndexIncludeColumnNames(indexInfo) + nIncludeCols := len(includeColNames) + cpkeyPos := 4 + nIncludeCols + // 3.a tableDefs[2] init indexTableName, err := util.BuildIndexTableName(ctx.GetContext(), false) if err != nil { @@ -2664,7 +2733,7 @@ func buildIvfFlatSecondaryIndexDef(ctx CompilerContext, indexInfo *tree.Index, c tableDefs[2] = &TableDef{ Name: indexTableName, TableType: catalog.SystemSI_IVFFLAT_TblType_Entries, - Cols: make([]*ColDef, 5), + Cols: make([]*ColDef, 5+nIncludeCols), } // 3.b indexDefs[2] init @@ -2735,9 +2804,27 @@ func buildIvfFlatSecondaryIndexDef(ctx CompilerContext, indexInfo *tree.Index, c }, } - tableDefs[2].Cols[4] = MakeHiddenColDefByName(catalog.CPrimaryKeyColName) - tableDefs[2].Cols[4].Alg = plan.CompressType_Lz4 - tableDefs[2].Cols[4].Primary = true + for i, includeColName := range includeColNames { + srcCol := colMap[includeColName] + tableDefs[2].Cols[4+i] = &ColDef{ + Name: catalog.SystemSI_IVFFLAT_IncludeColPrefix + includeColName, + Alg: plan.CompressType_Lz4, + Typ: Type{ + Id: srcCol.Typ.Id, + Width: srcCol.Typ.Width, + Scale: srcCol.Typ.Scale, + }, + Default: &plan.Default{ + NullAbility: true, + Expr: nil, + OriginString: "", + }, + } + } + + tableDefs[2].Cols[cpkeyPos] = MakeHiddenColDefByName(catalog.CPrimaryKeyColName) + tableDefs[2].Cols[cpkeyPos].Alg = plan.CompressType_Lz4 + tableDefs[2].Cols[cpkeyPos].Primary = true // 3.d PK def tableDefs[2].Pkey = &PrimaryKeyDef{ @@ -2747,7 +2834,7 @@ func buildIvfFlatSecondaryIndexDef(ctx CompilerContext, indexInfo *tree.Index, c catalog.SystemSI_IVFFLAT_TblCol_Entries_pk, // added to make this unique }, PkeyColName: catalog.CPrimaryKeyColName, - CompPkeyCol: tableDefs[2].Cols[4], + CompPkeyCol: tableDefs[2].Cols[cpkeyPos], } properties := []*plan.Property{ @@ -2826,6 +2913,9 @@ func buildHnswSecondaryIndexDef(ctx CompilerContext, indexInfo *tree.Index, colM } } + if err := validateVectorIndexIncludeColumns(ctx, indexInfo, colMap, name, pkeyName); err != nil { + return nil, nil, err + } } indexDefs := make([]*plan.IndexDef, 2) @@ -3043,6 +3133,8 @@ func CreateIndexDef(indexInfo *tree.Index, indexDef.IndexTableName = indexTableName indexDef.Parts = indexParts + // INCLUDE is logical index metadata shared by vector backends, not an algorithm param. + indexDef.IncludedColumns = getVectorIndexIncludeColumnNames(indexInfo) indexDef.Unique = isUnique indexDef.TableExist = true diff --git a/pkg/sql/plan/build_ddl_ivfflat_include_test.go b/pkg/sql/plan/build_ddl_ivfflat_include_test.go new file mode 100644 index 0000000000000..b1780b7bcd055 --- /dev/null +++ b/pkg/sql/plan/build_ddl_ivfflat_include_test.go @@ -0,0 +1,156 @@ +// Copyright 2022 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 plan + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" +) + +func makeTestColDef(name string, oid types.T) *ColDef { + return &ColDef{ + Name: name, + Typ: Type{ + Id: int32(oid), + }, + } +} + +func makeIncludeIndexOption(names ...string) *tree.IndexOption { + cols := make([]*tree.UnresolvedName, len(names)) + for i, name := range names { + cols[i] = tree.NewUnresolvedName(tree.NewCStr(name, 1)) + } + return &tree.IndexOption{ + AlgoParamList: 10, + IncludeColumns: cols, + } +} + +func makeIvfIndexWithInclude(vecCol string, includeCols ...string) *tree.Index { + return tree.NewIndex( + false, + []*tree.KeyPart{tree.NewKeyPart(tree.NewUnresolvedName(tree.NewCStr(vecCol, 1)), -1, tree.DefaultDirection, nil)}, + "idx_ivf", + tree.INDEX_TYPE_IVFFLAT, + makeIncludeIndexOption(includeCols...), + ) +} + +func makeHnswIndexWithInclude(vecCol string, includeCols ...string) *tree.Index { + return tree.NewIndex( + false, + []*tree.KeyPart{tree.NewKeyPart(tree.NewUnresolvedName(tree.NewCStr(vecCol, 1)), -1, tree.DefaultDirection, nil)}, + "idx_hnsw", + tree.INDEX_TYPE_HNSW, + makeIncludeIndexOption(includeCols...), + ) +} + +func TestBuildIvfFlatSecondaryIndexDef_StoresIncludeColumnsInIndexDef(t *testing.T) { + ctx := NewMockOptimizer(false).CurrentContext() + indexInfo := makeIvfIndexWithInclude("embedding", "title", "category") + colMap := map[string]*ColDef{ + "id": makeTestColDef("id", types.T_int64), + "embedding": makeTestColDef("embedding", types.T_array_float32), + "title": makeTestColDef("title", types.T_varchar), + "category": makeTestColDef("category", types.T_varchar), + } + + indexDefs, _, err := buildIvfFlatSecondaryIndexDef(ctx, indexInfo, colMap, nil, "id") + require.NoError(t, err) + require.Len(t, indexDefs, 3) + + for _, indexDef := range indexDefs { + require.Equal(t, []string{"title", "category"}, indexDef.IncludedColumns) + paramMap, err := catalog.IndexParamsStringToMap(indexDef.IndexAlgoParams) + require.NoError(t, err) + _, ok := paramMap[catalog.IndexAlgoParamIncludeColumns] + require.False(t, ok) + } +} + +func TestBuildHnswSecondaryIndexDef_StoresIncludeColumnsInIndexDef(t *testing.T) { + ctx := NewMockOptimizer(false).CurrentContext() + indexInfo := makeHnswIndexWithInclude("embedding", "title", "category") + colMap := map[string]*ColDef{ + "id": makeTestColDef("id", types.T_int64), + "embedding": makeTestColDef("embedding", types.T_array_float32), + "title": makeTestColDef("title", types.T_varchar), + "category": makeTestColDef("category", types.T_varchar), + } + + indexDefs, _, err := buildHnswSecondaryIndexDef(ctx, indexInfo, colMap, nil, "id") + require.NoError(t, err) + require.Len(t, indexDefs, 2) + + for _, indexDef := range indexDefs { + require.Equal(t, []string{"title", "category"}, indexDef.IncludedColumns) + paramMap, err := catalog.IndexParamsStringToMap(indexDef.IndexAlgoParams) + require.NoError(t, err) + _, ok := paramMap[catalog.IndexAlgoParamIncludeColumns] + require.False(t, ok) + } +} + +func TestBuildIvfFlatSecondaryIndexDef_ExtendsEntriesTableWithIncludeColumns(t *testing.T) { + ctx := NewMockOptimizer(false).CurrentContext() + indexInfo := makeIvfIndexWithInclude("embedding", "title", "category") + colMap := map[string]*ColDef{ + "id": makeTestColDef("id", types.T_int64), + "embedding": makeTestColDef("embedding", types.T_array_float32), + "title": makeTestColDef("title", types.T_varchar), + "category": makeTestColDef("category", types.T_int32), + } + + _, tableDefs, err := buildIvfFlatSecondaryIndexDef(ctx, indexInfo, colMap, nil, "id") + require.NoError(t, err) + require.Len(t, tableDefs, 3) + + entriesTable := tableDefs[2] + require.Len(t, entriesTable.Cols, 7) + require.Equal(t, catalog.SystemSI_IVFFLAT_TblCol_Entries_version, entriesTable.Cols[0].Name) + require.Equal(t, catalog.SystemSI_IVFFLAT_TblCol_Entries_id, entriesTable.Cols[1].Name) + require.Equal(t, catalog.SystemSI_IVFFLAT_TblCol_Entries_pk, entriesTable.Cols[2].Name) + require.Equal(t, catalog.SystemSI_IVFFLAT_TblCol_Entries_entry, entriesTable.Cols[3].Name) + require.Equal(t, catalog.SystemSI_IVFFLAT_IncludeColPrefix+"title", entriesTable.Cols[4].Name) + require.Equal(t, catalog.SystemSI_IVFFLAT_IncludeColPrefix+"category", entriesTable.Cols[5].Name) + require.Equal(t, catalog.CPrimaryKeyColName, entriesTable.Cols[6].Name) + require.Same(t, entriesTable.Cols[6], entriesTable.Pkey.CompPkeyCol) +} + +func TestBuildIvfFlatSecondaryIndexDef_RejectsTooManyIncludeColumns(t *testing.T) { + ctx := NewMockOptimizer(false).CurrentContext() + + includeCols := make([]string, 11) + colMap := map[string]*ColDef{ + "id": makeTestColDef("id", types.T_int64), + "embedding": makeTestColDef("embedding", types.T_array_float32), + } + for i := range includeCols { + name := string(rune('a' + i)) + includeCols[i] = "c_" + name + colMap[includeCols[i]] = makeTestColDef(includeCols[i], types.T_varchar) + } + + _, _, err := buildIvfFlatSecondaryIndexDef(ctx, makeIvfIndexWithInclude("embedding", includeCols...), colMap, nil, "id") + require.Error(t, err) + require.Contains(t, err.Error(), "supports at most 10 columns") +} diff --git a/pkg/sql/plan/build_dml_util.go b/pkg/sql/plan/build_dml_util.go index 596aca4919eb7..2d45ea2d594de 100644 --- a/pkg/sql/plan/build_dml_util.go +++ b/pkg/sql/plan/build_dml_util.go @@ -115,6 +115,12 @@ type deleteNodeInfo struct { lockTable bool } +type ivfIncludeSourceCol struct { + name string + pos int + typ Type +} + // buildInsertPlans build insert plan. func buildInsertPlans( ctx CompilerContext, builder *QueryBuilder, bindCtx *BindContext, stmt *tree.Insert, @@ -960,7 +966,6 @@ func buildInsertPlansWithRelatedHiddenTable( return err } } - } // TODO: choose either PostInsertFullTextIndex or PreInsertFullTextIndex @@ -972,7 +977,9 @@ func buildInsertPlansWithRelatedHiddenTable( } } - buildPreInsertMultiTableIndexes(ctx, builder, bindCtx, objRef, tableDef, sourceStep, multiTableIndexes) + if err = buildPreInsertMultiTableIndexes(ctx, builder, bindCtx, objRef, tableDef, sourceStep, multiTableIndexes); err != nil { + return err + } ifInsertFromUnique := false if tableDef.Pkey != nil && ifInsertFromUniqueColMap != nil { @@ -2024,6 +2031,7 @@ func appendPreInsertSkVectorPlan(builder *QueryBuilder, bindCtx *BindContext, ta //1.a get vector & pk column details var posOriginPk, posOriginVecColumn int var typeOriginPk, typeOriginVecColumn Type + var includeSourceCols []ivfIncludeSourceCol { colsMap := make(map[string]int) colTypes := make([]Type, len(tableDef.Cols)) @@ -2041,6 +2049,25 @@ func appendPreInsertSkVectorPlan(builder *QueryBuilder, bindCtx *BindContext, ta } posOriginPk, typeOriginPk = getPkPos(tableDef, false) + + includeSourceCols = make([]ivfIncludeSourceCol, 0) + for _, col := range indexTableDefs[2].Cols { + if !strings.HasPrefix(col.Name, catalog.SystemSI_IVFFLAT_IncludeColPrefix) { + continue + } + + originColName := strings.TrimPrefix(col.Name, catalog.SystemSI_IVFFLAT_IncludeColPrefix) + pos, ok := colsMap[originColName] + if !ok { + return -1, moerr.NewInvalidInputf(builder.GetContext(), "IVFFLAT INCLUDE column %q not found in origin table", originColName) + } + + includeSourceCols = append(includeSourceCols, ivfIncludeSourceCol{ + name: originColName, + pos: pos, + typ: tableDef.Cols[pos].Typ, + }) + } } // get optype @@ -2072,7 +2099,7 @@ func appendPreInsertSkVectorPlan(builder *QueryBuilder, bindCtx *BindContext, ta } // 4. create "CrossJoinL2" on tbl x centroids - joinTblAndCentroidsUsingCrossL2Join := makeTblCrossJoinL2Centroids(builder, bindCtx, tableDef, lastNodeId, currVersionCentroids, typeOriginPk, posOriginPk, typeOriginVecColumn, posOriginVecColumn, optype) + joinTblAndCentroidsUsingCrossL2Join := makeTblCrossJoinL2Centroids(builder, bindCtx, tableDef, lastNodeId, currVersionCentroids, typeOriginPk, posOriginPk, typeOriginVecColumn, posOriginVecColumn, includeSourceCols, optype) // 5. Create a Project with CP Key for LockNode projectWithCpKey, err := makeFinalProject(builder, bindCtx, joinTblAndCentroidsUsingCrossL2Join) @@ -3672,6 +3699,37 @@ func buildPreInsertMultiTableIndexes(ctx CompilerContext, builder *QueryBuilder, } +func appendProjectUpdatedRowsForRebuild(builder *QueryBuilder, bindCtx *BindContext, tableDef *TableDef, lastNodeId int32, updateColPosMap map[string]int, rowIDSourcePos int) int32 { + lastProject := builder.qry.Nodes[lastNodeId].ProjectList + projectProjection := make([]*Expr, len(tableDef.Cols)) + for j, col := range tableDef.Cols { + sourcePos := j + if nIdx, ok := updateColPosMap[col.Name]; ok { + sourcePos = nIdx + } else if col.Name == catalog.Row_ID && rowIDSourcePos >= 0 { + sourcePos = rowIDSourcePos + } + + projectProjection[j] = &plan.Expr{ + Typ: lastProject[sourcePos].Typ, + Expr: &plan.Expr_Col{ + Col: &plan.ColRef{ + RelPos: 0, + ColPos: int32(sourcePos), + Name: col.Name, + }, + }, + } + } + + projectNode := &Node{ + NodeType: plan.Node_PROJECT, + Children: []int32{lastNodeId}, + ProjectList: projectProjection, + } + return builder.appendNode(projectNode, bindCtx) +} + func buildDeleteMultiTableIndexes(ctx CompilerContext, builder *QueryBuilder, bindCtx *BindContext, delCtx *dmlPlanCtx, multiTableIndexes map[string]*MultiTableIndex) error { isUpdate := delCtx.updateColLength > 0 var err error @@ -3729,8 +3787,8 @@ func buildDeleteMultiTableIndexes(ctx CompilerContext, builder *QueryBuilder, bi lastNodeId = appendSinkScanNode(builder, bindCtx, delCtx.sourceStep) lastNodeId, err = appendDeleteIvfTablePlan(builder, bindCtx, entriesObjRef, entriesTableDef, lastNodeId, delCtx.tableDef) entriesDeleteIdx = len(delCtx.tableDef.Cols) + delCtx.updateColLength // eg:- > + 0/1 - entriesTblPkPos = entriesDeleteIdx + 1 // this is the compound primary key of the entries table - entriesTblPkTyp = entriesTableDef.Cols[4].Typ // 4'th column is the compound primary key + entriesTblPkPos = entriesDeleteIdx + 1 // appendDeleteIvfTablePlan appends row_id first, then hidden entries cpkey + _, entriesTblPkTyp = getPkPos(entriesTableDef, false) // use the actual entries table pk type instead of a hard-coded column index } if err != nil { @@ -3753,41 +3811,12 @@ func buildDeleteMultiTableIndexes(ctx CompilerContext, builder *QueryBuilder, bi } builder.appendStep(lastNodeId) } - // insert ivf_sk plan + // insert ivf entries using the updated row image { - //TODO: verify with ouyuanning, if this is correct lastNodeId = appendSinkScanNode(builder, bindCtx, newSourceStep) - lastNodeIdForTblJoinCentroids := appendSinkScanNode(builder, bindCtx, newSourceStep) - - lastProject := builder.qry.Nodes[lastNodeId].ProjectList - lastProjectForTblJoinCentroids := builder.qry.Nodes[lastNodeIdForTblJoinCentroids].ProjectList - - projectProjection := make([]*Expr, len(delCtx.tableDef.Cols)) - projectProjectionForTblJoinCentroids := make([]*Expr, len(delCtx.tableDef.Cols)) - for j, uCols := range delCtx.tableDef.Cols { - if nIdx, ok := delCtx.updateColPosMap[uCols.Name]; ok { - projectProjection[j] = lastProject[nIdx] - projectProjectionForTblJoinCentroids[j] = lastProjectForTblJoinCentroids[nIdx] - } else { - if uCols.Name == catalog.Row_ID { - // replace the origin table's row_id with entry table's row_id - // it is the 2nd last column in the entry table join - projectProjection[j] = lastProject[len(lastProject)-2] - projectProjectionForTblJoinCentroids[j] = lastProjectForTblJoinCentroids[len(lastProjectForTblJoinCentroids)-2] - } else { - projectProjection[j] = lastProject[j] - projectProjectionForTblJoinCentroids[j] = lastProjectForTblJoinCentroids[j] - } - } - } - projectNode := &Node{ - NodeType: plan.Node_PROJECT, - Children: []int32{lastNodeId}, - ProjectList: projectProjection, - } - lastNodeId = builder.appendNode(projectNode, bindCtx) + lastNodeId = appendProjectUpdatedRowsForRebuild(builder, bindCtx, delCtx.tableDef, lastNodeId, delCtx.updateColPosMap, len(builder.qry.Nodes[lastNodeId].ProjectList)-2) - preUKStep, err := appendPreInsertSkVectorPlan(builder, bindCtx, delCtx.tableDef, lastNodeId, multiTableIndex, true, idxRefs, idxTableDefs) + preEntriesStep, err := appendPreInsertSkVectorPlan(builder, bindCtx, delCtx.tableDef, lastNodeId, multiTableIndex, true, idxRefs, idxTableDefs) if err != nil { return err } @@ -3810,10 +3839,9 @@ func buildDeleteMultiTableIndexes(ctx CompilerContext, builder *QueryBuilder, bi var indexSourceColTypes []*Type var fuzzymessage *OriginTableMessageForFuzzy err = makeOneInsertPlan(ctx, builder, bindCtx, entriesObjRef, insertEntriesTableDef, - updateColLength, preUKStep, addAffectedRows, isFkRecursionCall, updatePkCol, + updateColLength, preEntriesStep, addAffectedRows, isFkRecursionCall, updatePkCol, pkFilterExprs, partitionExpr, ifExistAutoPkCol, ifCheckPkDup, ifInsertFromUnique, indexSourceColTypes, fuzzymessage) - if err != nil { return err } @@ -4250,6 +4278,49 @@ func buildDeleteMasterIndex(ctx CompilerContext, builder *QueryBuilder, bindCtx return nil } +func indexNeedsRewriteForUpdate(tableDef *TableDef, indexdef *IndexDef, updateColPosMap map[string]int, posMap map[string]int, colMap map[string]*ColDef) (bool, error) { + columnUpdated := func(colName string) bool { + if _, exists := updateColPosMap[colName]; exists { + return true + } + col := colMap[colName] + return col != nil && col.OnUpdate != nil + } + + if tableDef.Pkey != nil { + pkeyName := tableDef.Pkey.PkeyColName + if pkeyName == catalog.CPrimaryKeyColName { + for _, pkPartColName := range tableDef.Pkey.Names { + if columnUpdated(pkPartColName) { + return true, nil + } + } + } else if columnUpdated(pkeyName) { + return true, nil + } + } + + for _, colName := range indexdef.Parts { + resolvedColName := catalog.ResolveAlias(colName) + if _, ok := posMap[resolvedColName]; ok && columnUpdated(resolvedColName) { + return true, nil + } + } + + if !catalog.IsIvfIndexAlgo(indexdef.IndexAlgo) { + return false, nil + } + + for _, colName := range indexdef.IncludedColumns { + resolvedColName := catalog.ResolveAlias(colName) + if _, ok := posMap[resolvedColName]; ok && columnUpdated(resolvedColName) { + return true, nil + } + } + + return false, nil +} + // make delete index plans here func buildDeleteIndexPlans(ctx CompilerContext, builder *QueryBuilder, bindCtx *BindContext, delCtx *dmlPlanCtx) error { @@ -4293,46 +4364,11 @@ func buildDeleteIndexPlans(ctx CompilerContext, builder *QueryBuilder, bindCtx * for idx, indexdef := range delCtx.tableDef.Indexes { if isUpdate { - pkeyName := delCtx.tableDef.Pkey.PkeyColName - - // Check if primary key is being updated. - isPrimaryKeyUpdated := func() bool { - if pkeyName == catalog.CPrimaryKeyColName { - // Handle compound primary key. - for _, pkPartColName := range delCtx.tableDef.Pkey.Names { - if _, exists := delCtx.updateColPosMap[pkPartColName]; exists || colMap[pkPartColName].OnUpdate != nil { - return true - } - } - } else if pkeyName == catalog.FakePrimaryKeyColName { - // Handle programmatically generated primary key. - if _, exists := delCtx.updateColPosMap[pkeyName]; exists || colMap[pkeyName].OnUpdate != nil { - return true - } - } else { - // Handle single primary key. - if _, exists := delCtx.updateColPosMap[pkeyName]; exists || colMap[pkeyName].OnUpdate != nil { - return true - } - } - return false - } - - // Check if secondary key is being updated. - isSecondaryKeyUpdated := func() bool { - for _, colName := range indexdef.Parts { - resolvedColName := catalog.ResolveAlias(colName) - if colIdx, ok := posMap[resolvedColName]; ok { - col := delCtx.tableDef.Cols[colIdx] - if _, exists := delCtx.updateColPosMap[resolvedColName]; exists || col.OnUpdate != nil { - return true - } - } - } - return false + needsRewrite, err := indexNeedsRewriteForUpdate(delCtx.tableDef, indexdef, delCtx.updateColPosMap, posMap, colMap) + if err != nil { + return err } - - if !isPrimaryKeyUpdated() && !isSecondaryKeyUpdated() { + if !needsRewrite { continue } } @@ -4372,7 +4408,9 @@ func buildDeleteIndexPlans(ctx CompilerContext, builder *QueryBuilder, bindCtx * } } - buildDeleteMultiTableIndexes(ctx, builder, bindCtx, delCtx, multiTableIndexes) + if err = buildDeleteMultiTableIndexes(ctx, builder, bindCtx, delCtx, multiTableIndexes); err != nil { + return err + } } return nil diff --git a/pkg/sql/plan/build_dml_util_test.go b/pkg/sql/plan/build_dml_util_test.go index f4b8e516f9635..1141f8f1202f8 100644 --- a/pkg/sql/plan/build_dml_util_test.go +++ b/pkg/sql/plan/build_dml_util_test.go @@ -19,6 +19,7 @@ import ( "testing" "github.com/golang/mock/gomock" + "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/container/types" "github.com/stretchr/testify/require" @@ -30,6 +31,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" "github.com/matrixorigin/matrixone/pkg/testutil" "github.com/matrixorigin/matrixone/pkg/util/executor" + "github.com/matrixorigin/matrixone/pkg/vectorindex/metric" ) func Test_runSql(t *testing.T) { @@ -192,3 +194,56 @@ func TestMakeInsertValueConstExprGeometry(t *testing.T) { require.Equal(t, "POINT(1 1)", fn.Args[0].GetLit().GetSval()) require.Equal(t, int32(types.T_geometry), fn.Args[1].Typ.Id) } + +func TestIndexNeedsRewriteForUpdateIvfColumns(t *testing.T) { + tableDef := &plan.TableDef{ + Cols: []*plan.ColDef{ + {Name: "id", Typ: plan.Type{Id: int32(types.T_int64)}}, + {Name: "embedding", Typ: plan.Type{Id: int32(types.T_array_float32)}}, + {Name: "title", Typ: plan.Type{Id: int32(types.T_varchar)}}, + {Name: "category", Typ: plan.Type{Id: int32(types.T_int32)}}, + {Name: "note", Typ: plan.Type{Id: int32(types.T_varchar)}}, + }, + Pkey: &plan.PrimaryKeyDef{ + PkeyColName: "id", + Names: []string{"id"}, + }, + } + posMap := map[string]int{ + "id": 0, + "embedding": 1, + "title": 2, + "category": 3, + "note": 4, + } + colMap := make(map[string]*plan.ColDef, len(tableDef.Cols)) + for _, col := range tableDef.Cols { + colMap[col.Name] = col + } + indexDef := &plan.IndexDef{ + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + Parts: []string{"embedding"}, + IndexAlgoParams: `{"lists":"2","op_type":"` + metric.DistFuncOpTypes["l2_distance"] + `"}`, + IncludedColumns: []string{"title", "category"}, + } + + tests := []struct { + name string + updateCols map[string]int + want bool + }{ + {name: "unrelated column does not rewrite ivf", updateCols: map[string]int{"note": 4}, want: false}, + {name: "vector key rewrites ivf", updateCols: map[string]int{"embedding": 1}, want: true}, + {name: "primary key rewrites ivf", updateCols: map[string]int{"id": 0}, want: true}, + {name: "first include column rewrites ivf", updateCols: map[string]int{"title": 2}, want: true}, + {name: "second include column rewrites ivf", updateCols: map[string]int{"category": 3}, want: true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := indexNeedsRewriteForUpdate(tableDef, indexDef, tt.updateCols, posMap, colMap) + require.NoError(t, err) + require.Equal(t, tt.want, got) + }) + } +} diff --git a/pkg/sql/plan/build_show_util.go b/pkg/sql/plan/build_show_util.go index 84ece374f1f05..cb8e301ac75a7 100644 --- a/pkg/sql/plan/build_show_util.go +++ b/pkg/sql/plan/build_show_util.go @@ -301,6 +301,9 @@ func ConstructCreateTableSQL( indexStr += paramList rewriteIndexStr += paramList } + includeList := indexIncludeColumnsToString(indexdef.IncludedColumns, colNameToOriginName) + indexStr += includeList + rewriteIndexStr += includeList if indexStr != rewriteIndexStr { rewritePairs = append(rewritePairs, struct { display string @@ -648,6 +651,22 @@ func ConstructCreateTableSQL( return createStr, stmt, err } +func indexIncludeColumnsToString(includedColumns []string, colNameToOriginName map[string]string) string { + if len(includedColumns) == 0 { + return "" + } + + names := make([]string, 0, len(includedColumns)) + for _, colName := range includedColumns { + resolvedName := catalog.ResolveAlias(colName) + if originName := colNameToOriginName[resolvedName]; originName != "" { + resolvedName = originName + } + names = append(names, fmt.Sprintf("`%s`", formatStr(resolvedName))) + } + return fmt.Sprintf(" INCLUDE (%s)", strings.Join(names, ", ")) +} + func extractTopLevelCheckDefs(tableDef *plan.TableDef) []string { if tableDef == nil || tableDef.Createsql == "" || tableDef.TableType == catalog.SystemExternalRel { return nil diff --git a/pkg/sql/plan/build_show_util_test.go b/pkg/sql/plan/build_show_util_test.go index 5598e71ca3345..78b34f8db53d6 100644 --- a/pkg/sql/plan/build_show_util_test.go +++ b/pkg/sql/plan/build_show_util_test.go @@ -169,6 +169,53 @@ func Test_buildShowCreateTableSpatialIndex(t *testing.T) { require.Equal(t, "CREATE TABLE `spatial_src` (\n `id` int NOT NULL,\n `g` point NOT NULL,\n PRIMARY KEY (`id`),\n SPATIAL KEY `idx_g` (`g`)\n)", got) } +func Test_ShowCreateTableUsesIncludedColumnsFromIndexDef(t *testing.T) { + mock := NewMockOptimizer(false) + tableDef, err := buildTestCreateTableStmt(mock, `CREATE TABLE vector_src ( + id INT NOT NULL, + embedding VECF32(3), + title VARCHAR(20), + category INT, + PRIMARY KEY (id) + )`) + require.NoError(t, err) + + tableDef.Indexes = append(tableDef.Indexes, &plan.IndexDef{ + IndexName: "idx_vec", + Parts: []string{"embedding"}, + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoParams: `{"lists":"2","op_type":"vector_l2_ops"}`, + IncludedColumns: []string{"title", "category"}, + }) + + got, _, err := ConstructCreateTableSQL(&mock.ctxt, tableDef, nil, false, nil) + require.NoError(t, err) + require.Contains(t, got, "KEY `idx_vec` USING ivfflat (`embedding`) lists = 2 op_type 'vector_l2_ops' INCLUDE (`title`, `category`)") +} + +func Test_ShowCreateTableQuotesIncludedColumns(t *testing.T) { + mock := NewMockOptimizer(false) + tableDef, err := buildTestCreateTableStmt(mock, `CREATE TABLE vector_src_reserved ( + id INT NOT NULL, + embedding VECF32(3), + status INT, + PRIMARY KEY (id) + )`) + require.NoError(t, err) + + tableDef.Indexes = append(tableDef.Indexes, &plan.IndexDef{ + IndexName: "idx_vec_reserved", + Parts: []string{"embedding"}, + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoParams: `{"lists":"2","op_type":"vector_l2_ops"}`, + IncludedColumns: []string{"status"}, + }) + + got, _, err := ConstructCreateTableSQL(&mock.ctxt, tableDef, nil, false, nil) + require.NoError(t, err) + require.Contains(t, got, "INCLUDE (`status`)") +} + func Test_ShowCreateTableUsesStoredDDLForChecks(t *testing.T) { const sql = `CREATE TABLE t_numeric_types ( id BIGINT NOT NULL AUTO_INCREMENT, diff --git a/pkg/sql/plan/build_vector_index_util.go b/pkg/sql/plan/build_vector_index_util.go index 6be7547385e7d..bccbeab7f78c3 100644 --- a/pkg/sql/plan/build_vector_index_util.go +++ b/pkg/sql/plan/build_vector_index_util.go @@ -102,54 +102,68 @@ func makeCrossJoinCentroidsMetaForCurrVersion(builder *QueryBuilder, bindCtx *Bi return joinMetaAndCentroidsId, nil } -func makeTblCrossJoinL2Centroids(builder *QueryBuilder, bindCtx *BindContext, tableDef *TableDef, lastNodeId int32, currVersionCentroids int32, typeOriginPk Type, posOriginPk int, typeOriginVecColumn Type, posOriginVecColumn int, optype string) int32 { - joinTblAndCentroidsUsingCrossL2Join := builder.appendNode(&plan.Node{ - NodeType: plan.Node_JOIN, - JoinType: plan.Node_L2, - ExtraOptions: optype, - Children: []int32{lastNodeId, currVersionCentroids}, - ProjectList: []*Expr{ - { // centroids.version - Typ: makePlan2TypeValue(&bigIntType), - Expr: &plan.Expr_Col{ - Col: &plan.ColRef{ - RelPos: 1, - ColPos: 0, - Name: catalog.SystemSI_IVFFLAT_TblCol_Centroids_version, - }, +func makeTblCrossJoinL2Centroids(builder *QueryBuilder, bindCtx *BindContext, tableDef *TableDef, lastNodeId int32, currVersionCentroids int32, typeOriginPk Type, posOriginPk int, typeOriginVecColumn Type, posOriginVecColumn int, includeSourceCols []ivfIncludeSourceCol, optype string) int32 { + projectList := []*Expr{ + { // centroids.version + Typ: makePlan2TypeValue(&bigIntType), + Expr: &plan.Expr_Col{ + Col: &plan.ColRef{ + RelPos: 1, + ColPos: 0, + Name: catalog.SystemSI_IVFFLAT_TblCol_Centroids_version, }, }, - { // centroids.centroid_id - Typ: makePlan2TypeValue(&bigIntType), - Expr: &plan.Expr_Col{ - Col: &plan.ColRef{ - RelPos: 1, - ColPos: 1, - Name: catalog.SystemSI_IVFFLAT_TblCol_Centroids_id, - }, + }, + { // centroids.centroid_id + Typ: makePlan2TypeValue(&bigIntType), + Expr: &plan.Expr_Col{ + Col: &plan.ColRef{ + RelPos: 1, + ColPos: 1, + Name: catalog.SystemSI_IVFFLAT_TblCol_Centroids_id, }, }, - { // tbl.pk - Typ: *DeepCopyType(&typeOriginPk), - Expr: &plan.Expr_Col{ - Col: &plan.ColRef{ - RelPos: 0, - ColPos: int32(posOriginPk), - Name: tableDef.Cols[posOriginPk].Name, - }, + }, + { // tbl.pk + Typ: *DeepCopyType(&typeOriginPk), + Expr: &plan.Expr_Col{ + Col: &plan.ColRef{ + RelPos: 0, + ColPos: int32(posOriginPk), + Name: tableDef.Cols[posOriginPk].Name, }, }, - { // tbl.embedding - Typ: *DeepCopyType(&typeOriginVecColumn), - Expr: &plan.Expr_Col{ - Col: &plan.ColRef{ - RelPos: 0, - ColPos: int32(posOriginVecColumn), - Name: tableDef.Cols[posOriginVecColumn].Name, - }, + }, + { // tbl.embedding + Typ: *DeepCopyType(&typeOriginVecColumn), + Expr: &plan.Expr_Col{ + Col: &plan.ColRef{ + RelPos: 0, + ColPos: int32(posOriginVecColumn), + Name: tableDef.Cols[posOriginVecColumn].Name, }, }, }, + } + for _, includeCol := range includeSourceCols { + projectList = append(projectList, &plan.Expr{ + Typ: *DeepCopyType(&includeCol.typ), + Expr: &plan.Expr_Col{ + Col: &plan.ColRef{ + RelPos: 0, + ColPos: int32(includeCol.pos), + Name: includeCol.name, + }, + }, + }) + } + + joinTblAndCentroidsUsingCrossL2Join := builder.appendNode(&plan.Node{ + NodeType: plan.Node_JOIN, + JoinType: plan.Node_L2, + ExtraOptions: optype, + Children: []int32{lastNodeId, currVersionCentroids}, + ProjectList: projectList, OnList: []*Expr{ { // centroids.centroid Typ: *DeepCopyType(&typeOriginVecColumn), @@ -179,10 +193,6 @@ func makeTblCrossJoinL2Centroids(builder *QueryBuilder, bindCtx *BindContext, ta func makeFinalProject(builder *QueryBuilder, bindCtx *BindContext, joinTblAndCentroidsUsingCrossL2Join int32) (int32, error) { var finalProjections = getProjectionByLastNode(builder, joinTblAndCentroidsUsingCrossL2Join) - centroidsVersion := DeepCopyExpr(finalProjections[0]) - centroidsId := DeepCopyExpr(finalProjections[1]) - tblPk := DeepCopyExpr(finalProjections[2]) - tblEmbedding := DeepCopyExpr(finalProjections[3]) cpKey, err := BindFuncExprImplByPlanExpr(builder.GetContext(), "serial", []*plan.Expr{ DeepCopyExpr(finalProjections[0]), DeepCopyExpr(finalProjections[1]), @@ -192,11 +202,17 @@ func makeFinalProject(builder *QueryBuilder, bindCtx *BindContext, joinTblAndCen return -1, err } + projectList := make([]*Expr, 0, len(finalProjections)+1) + for _, projection := range finalProjections { + projectList = append(projectList, DeepCopyExpr(projection)) + } + projectList = append(projectList, cpKey) + projectWithCpKey := builder.appendNode( &plan.Node{ NodeType: plan.Node_PROJECT, Children: []int32{joinTblAndCentroidsUsingCrossL2Join}, - ProjectList: []*Expr{centroidsVersion, centroidsId, tblPk, tblEmbedding, cpKey}, + ProjectList: projectList, }, bindCtx) return projectWithCpKey, nil diff --git a/pkg/sql/plan/coverage_regression_test.go b/pkg/sql/plan/coverage_regression_test.go new file mode 100644 index 0000000000000..d175ee38f95aa --- /dev/null +++ b/pkg/sql/plan/coverage_regression_test.go @@ -0,0 +1,407 @@ +// Copyright 2026 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 plan + +import ( + "strings" + "testing" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/container/types" + planpb "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect/mysql" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/stretchr/testify/require" +) + +func TestApplyIndicesForSortUsingIvfflat_PostModeOffsetCompensationUsesCompensatedLimit(t *testing.T) { + builder, _, scanNode, scanNodeID, multiTableIndex := newIvfIncludeModeTestBuilder(t) + + scanTag := scanNode.BindingTags[0] + scanNode.FilterList = []*planpb.Expr{ + { + Typ: planpb.Type{Id: int32(types.T_bool)}, + Expr: &planpb.Expr_F{ + F: &planpb.Function{ + Func: &planpb.ObjectRef{ObjName: "="}, + Args: []*planpb.Expr{ + {Typ: scanNode.TableDef.Cols[4].Typ, Expr: &planpb.Expr_Col{Col: &planpb.ColRef{RelPos: scanTag, ColPos: 4, Name: "note"}}}, + makePlan2StringConstExprWithType("n2"), + }, + }, + }, + }, + } + + vecCtx := newIvfIncludeModeVectorSortContext(scanNode, scanNodeID, "post", 0, 2, 4) + vecCtx.sortNode.Offset = makePlan2Uint64ConstExprWithType(1) + + _, err := builder.applyIndicesForSortUsingIvfflat(scanNodeID, vecCtx, multiTableIndex, nil, nil) + require.NoError(t, err) + + sortNode := builder.qry.Nodes[vecCtx.projNode.Children[0]] + tableFuncNode := findIvfTableFunctionNode(builder, sortNode.Children[0]) + require.NotNil(t, tableFuncNode) + require.Equal(t, uint64(15), tableFuncNode.Limit.GetLit().GetU64Val()) + require.Equal(t, uint64(15), tableFuncNode.IndexReaderParam.GetLimit().GetLit().GetU64Val()) +} + +func TestApplyIndicesForSortUsingIvfflat_DistRangeOnlyFilterDoesNotCompensateOffset(t *testing.T) { + builder, _, scanNode, scanNodeID, multiTableIndex := newIvfIncludeModeTestBuilder(t) + + vecCtx := newIvfIncludeModeVectorSortContext(scanNode, scanNodeID, "post", 0, 2, 4) + vecCtx.sortNode.Offset = makePlan2Uint64ConstExprWithType(1) + scanNode.FilterList = []*planpb.Expr{ + { + Typ: planpb.Type{Id: int32(types.T_bool)}, + Expr: &planpb.Expr_F{ + F: &planpb.Function{ + Func: &planpb.ObjectRef{ObjName: "<="}, + Args: []*planpb.Expr{ + { + Typ: planpb.Type{Id: int32(types.T_float64)}, + Expr: &planpb.Expr_F{F: vecCtx.distFnExpr}, + }, + MakePlan2Float64ConstExprWithType(0.5), + }, + }, + }, + }, + } + + _, err := builder.applyIndicesForSortUsingIvfflat(scanNodeID, vecCtx, multiTableIndex, nil, nil) + require.NoError(t, err) + + sortNode := builder.qry.Nodes[vecCtx.projNode.Children[0]] + tableFuncNode := findIvfTableFunctionNode(builder, sortNode.Children[0]) + require.NotNil(t, tableFuncNode) + require.Equal(t, uint64(2), tableFuncNode.Limit.GetLit().GetU64Val()) + require.Equal(t, uint64(2), tableFuncNode.IndexReaderParam.GetLimit().GetLit().GetU64Val()) + require.NotNil(t, tableFuncNode.IndexReaderParam.GetDistRange()) + require.NotNil(t, tableFuncNode.IndexReaderParam.GetDistRange().GetUpperBound()) +} + +func TestRenameColumnUpdatesAlterContextAndClusterMetadata(t *testing.T) { + mock := NewMockOptimizer(false) + origin := makeAlterCoverageTableDef() + copyTable := DeepCopyTableDef(origin, true) + alterCtx := initAlterTableContext(origin, copyTable, origin.DbName) + alterPlan := &planpb.AlterTable{ + Database: origin.DbName, + TableDef: origin, + CopyTableDef: copyTable, + } + + err := RenameColumn( + mock.CurrentContext(), + alterPlan, + &tree.AlterTableRenameColumnClause{ + OldColumnName: tree.NewUnresolvedColName("title"), + NewColumnName: tree.NewUnresolvedColName("headline"), + }, + alterCtx, + ) + require.NoError(t, err) + require.Equal(t, "headline", copyTable.Cols[2].Name) + require.Equal(t, "headline", copyTable.ClusterBy.Name) + require.Equal(t, "title", alterCtx.alterColMap["headline"].sexprStr) + require.Len(t, alterCtx.UpdateSqls, 2) + require.Equal(t, []string{"headline", "note"}, copyTable.Indexes[0].IncludedColumns) + require.NotContains(t, copyTable.Indexes[0].IndexAlgoParams, "include_columns") + require.Equal(t, "headline", alterCtx.changColDefMap[3].Name) +} + +func TestRenameColumnRejectsMissingColumn(t *testing.T) { + mock := NewMockOptimizer(false) + origin := makeAlterCoverageTableDef() + copyTable := DeepCopyTableDef(origin, true) + alterCtx := initAlterTableContext(origin, copyTable, origin.DbName) + alterPlan := &planpb.AlterTable{ + Database: origin.DbName, + TableDef: origin, + CopyTableDef: copyTable, + } + + err := RenameColumn( + mock.CurrentContext(), + alterPlan, + &tree.AlterTableRenameColumnClause{ + OldColumnName: tree.NewUnresolvedColName("missing"), + NewColumnName: tree.NewUnresolvedColName("headline"), + }, + alterCtx, + ) + require.Error(t, err) + require.Contains(t, err.Error(), "missing") +} + +func TestChangeColumnRenamesClusterByAndTracksIvfIncludeMetadata(t *testing.T) { + mock := NewMockOptimizer(false) + origin := makeAlterCoverageTableDef() + copyTable := DeepCopyTableDef(origin, true) + alterCtx := initAlterTableContext(origin, copyTable, origin.DbName) + alterPlan := &planpb.AlterTable{ + Database: origin.DbName, + TableDef: origin, + CopyTableDef: copyTable, + } + spec := mustParseAlterTableChangeColumnClause( + t, + mock.CurrentContext(), + "alter table t1 change column title headline varchar(128)", + ) + + pkAffected, err := ChangeColumn(mock.CurrentContext(), alterPlan, spec, alterCtx) + require.NoError(t, err) + require.False(t, pkAffected) + require.Equal(t, "headline", copyTable.ClusterBy.Name) + require.Equal(t, "title", alterCtx.alterColMap["headline"].sexprStr) + require.Equal(t, "headline", alterCtx.changColDefMap[3].Name) + require.Len(t, alterCtx.UpdateSqls, 3) + require.Contains(t, strings.Join(alterCtx.UpdateSqls, "\n"), "included_columns") + require.Equal(t, []string{"headline", "note"}, copyTable.Indexes[0].IncludedColumns) + require.NotContains(t, copyTable.Indexes[0].IndexAlgoParams, "include_columns") +} + +func TestAppendAffectedAlterColumnNamesKeepsOldNameForChangeColumn(t *testing.T) { + affectedCols := appendAffectedAlterColumnNames(nil, "title", "headline") + require.Equal(t, []string{"title", "headline"}, affectedCols) + + indexes := []*planpb.IndexDef{ + { + IndexName: "idx_title", + IndexAlgo: catalog.MoIndexDefaultAlgo.ToString(), + Parts: []string{"title"}, + }, + makeIvfIncludeAlterIndexDef("idx_ivf", []string{"title", "note"}), + } + + names, err := collectAffectedIndexNamesForAlter(indexes, affectedCols) + require.NoError(t, err) + require.Equal(t, []string{"idx_ivf", "idx_title"}, names) + + require.Equal(t, []string{"title"}, appendAffectedAlterColumnNames(nil, "title", "title")) +} + +func TestUpdateRenameColumnInTableDefRenamesPrimaryKeyAlias(t *testing.T) { + mock := NewMockOptimizer(false) + tableDef := makeAlterCoverageTableDef() + + sqls, err := updateRenameColumnInTableDef( + mock.CurrentContext(), + tableDef.Cols[0], + tableDef, + &tree.AlterTableRenameColumnClause{ + OldColumnName: tree.NewUnresolvedColName("id"), + NewColumnName: tree.NewUnresolvedColName("row_id"), + }, + ) + require.NoError(t, err) + require.Equal(t, "row_id", tableDef.Pkey.PkeyColName) + require.Equal(t, []string{"row_id"}, tableDef.Pkey.Names) + require.Len(t, sqls, 1) + require.Contains(t, sqls[0], catalog.CreateAlias("row_id")) +} + +func TestUpdateRenameColumnInTableDefRejectsDuplicateTargetName(t *testing.T) { + mock := NewMockOptimizer(false) + tableDef := makeAlterCoverageTableDef() + + _, err := updateRenameColumnInTableDef( + mock.CurrentContext(), + tableDef.Cols[2], + tableDef, + &tree.AlterTableRenameColumnClause{ + OldColumnName: tree.NewUnresolvedColName("title"), + NewColumnName: tree.NewUnresolvedColName("note"), + }, + ) + require.Error(t, err) + require.Contains(t, err.Error(), "Duplicate column name") +} + +func TestAlterColumnSetDefaultUpdatesCopiedColumn(t *testing.T) { + mock := NewMockOptimizer(false) + origin := makeAlterCoverageTableDef() + copyTable := DeepCopyTableDef(origin, true) + alterCtx := initAlterTableContext(origin, copyTable, origin.DbName) + alterPlan := &planpb.AlterTable{ + Database: origin.DbName, + TableDef: origin, + CopyTableDef: copyTable, + } + spec := mustParseAlterColumnClause( + t, + mock.CurrentContext(), + "alter table t1 alter column note set default 'memo'", + ) + + pkAffected, err := AlterColumn(mock.CurrentContext(), alterPlan, spec, alterCtx) + require.NoError(t, err) + require.False(t, pkAffected) + require.Contains(t, copyTable.Cols[3].Default.OriginString, "memo") +} + +func TestOrderByColumnRejectsUnknownColumn(t *testing.T) { + mock := NewMockOptimizer(false) + origin := makeAlterCoverageTableDef() + copyTable := DeepCopyTableDef(origin, true) + alterCtx := initAlterTableContext(origin, copyTable, origin.DbName) + alterPlan := &planpb.AlterTable{ + Database: origin.DbName, + TableDef: origin, + CopyTableDef: copyTable, + } + spec := mustParseOrderByClause( + t, + mock.CurrentContext(), + "alter table t1 order by missing", + ) + + err := OrderByColumn(mock.CurrentContext(), alterPlan, spec, alterCtx) + require.Error(t, err) + require.Contains(t, err.Error(), "missing") +} + +func TestSkipUniqueIdxDedupMatchesSameUniqueDefinition(t *testing.T) { + oldTable := &TableDef{ + Indexes: []*planpb.IndexDef{ + {IndexName: "uk_title", Unique: true, Parts: []string{"title"}}, + {IndexName: "idx_note", Unique: false, Parts: []string{"note"}}, + }, + } + newTable := &TableDef{ + Indexes: []*planpb.IndexDef{ + {IndexName: "uk_title", Unique: true, Parts: []string{"title"}}, + {IndexName: "uk_note", Unique: true, Parts: []string{"note"}}, + }, + } + + skip := skipUniqueIdxDedup(oldTable, newTable) + require.Equal(t, map[string]bool{"uk_title": true}, skip) +} + +func makeAlterCoverageTableDef() *TableDef { + return &TableDef{ + DbName: "db1", + Name: "t1", + TblId: 42, + Cols: []*ColDef{ + { + ColId: 1, + Name: "id", + OriginName: "id", + Typ: planpb.Type{Id: int32(types.T_int64)}, + Default: &planpb.Default{NullAbility: false}, + }, + { + ColId: 2, + Name: "embedding", + OriginName: "embedding", + Typ: planpb.Type{Id: int32(types.T_array_float32)}, + Default: &planpb.Default{NullAbility: true}, + }, + { + ColId: 3, + Name: "title", + OriginName: "title", + Typ: planpb.Type{Id: int32(types.T_varchar), Width: 64}, + Default: &planpb.Default{NullAbility: true}, + ClusterBy: true, + }, + { + ColId: 4, + Name: "note", + OriginName: "note", + Typ: planpb.Type{Id: int32(types.T_varchar), Width: 64}, + Default: &planpb.Default{NullAbility: true}, + }, + }, + Name2ColIndex: map[string]int32{ + "id": 0, + "embedding": 1, + "title": 2, + "note": 3, + }, + Pkey: &planpb.PrimaryKeyDef{ + Names: []string{"id"}, + PkeyColName: "id", + }, + ClusterBy: &planpb.ClusterByDef{Name: "title"}, + Indexes: []*planpb.IndexDef{ + { + IndexName: "idx_ivf", + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoParams: `{"lists":"2","op_type":"vector_l2_ops"}`, + IncludedColumns: []string{"title", "note"}, + Parts: []string{"embedding"}, + }, + }, + } +} + +func mustParseAlterTableChangeColumnClause( + t *testing.T, + ctx CompilerContext, + sql string, +) *tree.AlterTableChangeColumnClause { + t.Helper() + + stmts, err := mysql.Parse(ctx.GetContext(), sql, 1) + require.NoError(t, err) + + stmt, ok := stmts[0].(*tree.AlterTable) + require.True(t, ok) + + spec, ok := stmt.Options[0].(*tree.AlterTableChangeColumnClause) + require.True(t, ok) + return spec +} + +func mustParseAlterColumnClause( + t *testing.T, + ctx CompilerContext, + sql string, +) *tree.AlterTableAlterColumnClause { + t.Helper() + + stmts, err := mysql.Parse(ctx.GetContext(), sql, 1) + require.NoError(t, err) + + stmt, ok := stmts[0].(*tree.AlterTable) + require.True(t, ok) + + spec, ok := stmt.Options[0].(*tree.AlterTableAlterColumnClause) + require.True(t, ok) + return spec +} + +func mustParseOrderByClause( + t *testing.T, + ctx CompilerContext, + sql string, +) *tree.AlterTableOrderByColumnClause { + t.Helper() + + stmts, err := mysql.Parse(ctx.GetContext(), sql, 1) + require.NoError(t, err) + + stmt, ok := stmts[0].(*tree.AlterTable) + require.True(t, ok) + + spec, ok := stmt.Options[0].(*tree.AlterTableOrderByColumnClause) + require.True(t, ok) + return spec +} diff --git a/pkg/sql/plan/deepcopy.go b/pkg/sql/plan/deepcopy.go index 547ebe70cf17f..4fc5a96f2ed59 100644 --- a/pkg/sql/plan/deepcopy.go +++ b/pkg/sql/plan/deepcopy.go @@ -409,6 +409,7 @@ func DeepCopyIndexDef(indexDef *plan.IndexDef) *plan.IndexDef { IndexAlgoTableType: indexDef.IndexAlgoTableType, IndexAlgoParams: indexDef.IndexAlgoParams, Parts: slices.Clone(indexDef.Parts), + IncludedColumns: slices.Clone(indexDef.IncludedColumns), } newindexDef.Option = DeepCopyIndexOption(indexDef.Option) return newindexDef diff --git a/pkg/sql/plan/explain/coverage_regression_test.go b/pkg/sql/plan/explain/coverage_regression_test.go new file mode 100644 index 0000000000000..b71c2204443bc --- /dev/null +++ b/pkg/sql/plan/explain/coverage_regression_test.go @@ -0,0 +1,85 @@ +// Copyright 2026 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 explain + +import ( + "testing" + + "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/stretchr/testify/require" +) + +func TestExplainBackgroundQueryHelpersFallbackToNodeScan(t *testing.T) { + stepSQL := "SELECT * FROM t WHERE id IN (4,5) LIMIT 7" + fallbackSQL := "SELECT * FROM t WHERE id IN (1,2,3) LIMIT 9" + + query := &plan.Query{ + Steps: []int32{5, 1}, + Nodes: []*plan.Node{ + {NodeId: 0, Stats: &plan.Stats{Sql: fallbackSQL}}, + {NodeId: 1, Stats: &plan.Stats{Sql: stepSQL}, AnalyzeInfo: &plan.AnalyzeInfo{OutputRows: 11}}, + }, + } + + require.Equal(t, stepSQL, backgroundQuerySQL(query)) + + limit, ok := extractSQLLimit(stepSQL) + require.True(t, ok) + require.Equal(t, 7, limit) + + inCount, ok := extractSQLInListCount(stepSQL) + require.True(t, ok) + require.Equal(t, 2, inCount) + + require.EqualValues(t, 11, queryOutputRows(query)) + + fallbackQuery := &plan.Query{ + Steps: []int32{1}, + Nodes: []*plan.Node{ + {NodeId: 0, Stats: &plan.Stats{Sql: fallbackSQL}}, + {NodeId: 1, Stats: &plan.Stats{}}, + }, + } + require.Equal(t, fallbackSQL, backgroundQuerySQL(fallbackQuery)) +} + +func TestFindIvfSearchOutputRowsAndTruncateSummaryList(t *testing.T) { + query := &plan.Query{ + Nodes: []*plan.Node{ + { + NodeId: 0, + NodeType: plan.Node_FUNCTION_SCAN, + TableDef: &plan.TableDef{TblFunc: &plan.TableFunction{Name: "other_func"}}, + AnalyzeInfo: &plan.AnalyzeInfo{OutputRows: 1}, + }, + { + NodeId: 1, + NodeType: plan.Node_FUNCTION_SCAN, + TableDef: &plan.TableDef{TblFunc: &plan.TableFunction{Name: "ivf_search"}}, + AnalyzeInfo: &plan.AnalyzeInfo{OutputRows: 6}, + }, + }, + } + + rows, ok := findIvfSearchOutputRows(query) + require.True(t, ok) + require.EqualValues(t, 6, rows) + + _, ok = findIvfSearchOutputRows(nil) + require.False(t, ok) + + require.Equal(t, "1, 2, 3", truncateSummaryList([]string{"1", "2", "3"}, 4)) + require.Equal(t, "1, 2, 3, 4, ...", truncateSummaryList([]string{"1", "2", "3", "4", "5"}, 4)) +} diff --git a/pkg/sql/plan/explain/explain_node.go b/pkg/sql/plan/explain/explain_node.go index dfae6e8478272..b82742ee50c7a 100644 --- a/pkg/sql/plan/explain/explain_node.go +++ b/pkg/sql/plan/explain/explain_node.go @@ -20,6 +20,7 @@ import ( "fmt" "sort" "strconv" + "strings" "github.com/matrixorigin/matrixone/pkg/common" "github.com/matrixorigin/matrixone/pkg/common/moerr" @@ -472,18 +473,46 @@ func (ndesc *NodeDescribeImpl) GetExtraInfo(ctx context.Context, options *Explai if len(msg) > 0 { lines = append(lines, msg) } + msg, err = ndesc.GetIvfSearchInfo(ctx, options) + if err != nil { + return nil, err + } + if len(msg) > 0 { + lines = append(lines, msg) + } } return lines, nil } func (ndesc *NodeDescribeImpl) GetFullTextSql(ctx context.Context, options *ExplainOptions) (string, error) { - if options.Verbose && len(ndesc.Node.GetStats().Sql) > 0 { - result := "Sql: " + ndesc.Node.GetStats().Sql + if options.Verbose && ndesc.Node.Stats != nil && len(ndesc.Node.Stats.Sql) > 0 { + result := "Sql: " + ndesc.Node.Stats.Sql return result, nil } return "", nil } +func (ndesc *NodeDescribeImpl) GetIvfSearchInfo(ctx context.Context, options *ExplainOptions) (string, error) { + if ndesc.Node.NodeType != plan.Node_FUNCTION_SCAN || + ndesc.Node.TableDef == nil || + ndesc.Node.TableDef.TblFunc == nil || + ndesc.Node.TableDef.TblFunc.Name != "ivf_search" || + len(ndesc.Node.TblFuncExprList) < 3 { + return "", nil + } + + filterExpr := ndesc.Node.TblFuncExprList[2] + litExpr, ok := filterExpr.Expr.(*plan.Expr_Lit) + if !ok || litExpr.Lit == nil { + return "", nil + } + rawFilter := litExpr.Lit.GetSval() + if strings.TrimSpace(rawFilter) == "" { + return "", nil + } + return "Filter Cond: " + rawFilter, nil +} + func (ndesc *NodeDescribeImpl) GetProjectListInfo(ctx context.Context, options *ExplainOptions) (string, error) { buf := bytes.NewBuffer(make([]byte, 0, 400)) buf.WriteString("Output: ") diff --git a/pkg/sql/plan/explain/explain_query.go b/pkg/sql/plan/explain/explain_query.go index cfdb3daada727..cb908ce06368b 100644 --- a/pkg/sql/plan/explain/explain_query.go +++ b/pkg/sql/plan/explain/explain_query.go @@ -19,6 +19,8 @@ import ( "context" "fmt" "regexp" + "strconv" + "strings" "github.com/google/uuid" "github.com/matrixorigin/matrixone/pkg/common/moerr" @@ -85,9 +87,13 @@ const ( ) const ( - Statistic_Unit_ns = "ns" - Statistic_Unit_count = "count" - Statistic_Unit_byte = "byte" + maxDefaultExpandedBackgroundQueries = 2 + Statistic_Unit_ns = "ns" + Statistic_Unit_count = "count" + Statistic_Unit_byte = "byte" + + maxVerboseBackgroundQueryPrefix = 3 + maxVerboseBackgroundQuerySuffix = 2 ) var _ ExplainQuery = &ExplainQueryImpl{} @@ -143,16 +149,201 @@ func explainPlanTree(qry *plan.Query, ctx context.Context, buffer *ExplainDataBu return err } - for _, bq := range qry.BackgroundQueries { - err = explainPlanTree(bq, ctx, buffer, options) - if err != nil { + if len(qry.BackgroundQueries) == 0 { + return nil + } + + if !options.Verbose { + if len(qry.BackgroundQueries) <= maxDefaultExpandedBackgroundQueries { + return explainVerboseBackgroundQueries(qry.BackgroundQueries, ctx, buffer, options) + } + summary := summarizeBackgroundQueries(qry) + if summary != "" { + buffer.PushNewLine(summary, false, 0) + } + return nil + } + + return explainVerboseBackgroundQueries(qry.BackgroundQueries, ctx, buffer, options) +} + +func explainVerboseBackgroundQueries(backgroundQueries []*plan.Query, ctx context.Context, buffer *ExplainDataBuffer, options *ExplainOptions) error { + total := len(backgroundQueries) + if total == 0 { + return nil + } + + if total <= maxVerboseBackgroundQueryPrefix+maxVerboseBackgroundQuerySuffix { + for _, bq := range backgroundQueries { + if err := explainPlanTree(bq, ctx, buffer, options); err != nil { + return err + } + } + return nil + } + + for _, bq := range backgroundQueries[:maxVerboseBackgroundQueryPrefix] { + if err := explainPlanTree(bq, ctx, buffer, options); err != nil { return err } } + skipped := total - maxVerboseBackgroundQueryPrefix - maxVerboseBackgroundQuerySuffix + buffer.PushNewLine( + fmt.Sprintf("Background Queries: skipped %d middle plan(s); use fewer rounds to inspect every round plan", skipped), + false, + 0, + ) + + for _, bq := range backgroundQueries[total-maxVerboseBackgroundQuerySuffix:] { + if err := explainPlanTree(bq, ctx, buffer, options); err != nil { + return err + } + } return nil } +func summarizeBackgroundQueries(qry *plan.Query) string { + if len(qry.BackgroundQueries) == 0 { + return "" + } + + roundCount := len(qry.BackgroundQueries) + roundLimits := make([]string, 0, roundCount) + bucketWindows := make([]string, 0, roundCount) + nextWindowOffset := 0 + emptyRounds := 0 + + for _, bq := range qry.BackgroundQueries { + sql := backgroundQuerySQL(bq) + if limit, ok := extractSQLLimit(sql); ok { + roundLimits = append(roundLimits, strconv.FormatUint(uint64(limit), 10)) + } + if bucketCount, ok := extractSQLInListCount(sql); ok { + end := nextWindowOffset + bucketCount + bucketWindows = append(bucketWindows, fmt.Sprintf("%d:%d", nextWindowOffset, end)) + nextWindowOffset = end + } + if queryOutputRows(bq) == 0 { + emptyRounds++ + } + } + + parts := []string{fmt.Sprintf("Background Queries: round_count=%d", roundCount)} + if len(bucketWindows) > 0 { + parts = append(parts, "bucket_windows="+truncateSummaryList(bucketWindows, 4)) + } + if len(roundLimits) > 0 { + parts = append(parts, "round_limits="+truncateSummaryList(roundLimits, 4)) + } + parts = append(parts, fmt.Sprintf("empty_rounds=%d", emptyRounds)) + if dedupOutputRows, ok := findIvfSearchOutputRows(qry); ok { + parts = append(parts, fmt.Sprintf("dedup_output_rows=%d", dedupOutputRows)) + } + parts = append(parts, "use EXPLAIN VERBOSE ANALYZE to expand") + return strings.Join(parts, " ") +} + +func backgroundQuerySQL(qry *plan.Query) string { + if qry == nil { + return "" + } + for _, rootID := range qry.Steps { + if int(rootID) >= len(qry.Nodes) || qry.Nodes[rootID] == nil { + continue + } + if qry.Nodes[rootID].Stats != nil { + if sql := qry.Nodes[rootID].Stats.GetSql(); sql != "" { + return sql + } + } + } + for _, node := range qry.Nodes { + if node == nil || node.Stats == nil { + continue + } + if sql := node.Stats.GetSql(); sql != "" { + return sql + } + } + return "" +} + +func extractSQLLimit(sql string) (int, bool) { + upper := strings.ToUpper(sql) + idx := strings.LastIndex(upper, " LIMIT ") + if idx < 0 { + return 0, false + } + value := strings.TrimSpace(sql[idx+len(" LIMIT "):]) + if value == "" { + return 0, false + } + limit, err := strconv.Atoi(value) + if err != nil { + return 0, false + } + return limit, true +} + +func extractSQLInListCount(sql string) (int, bool) { + upper := strings.ToUpper(sql) + inIdx := strings.LastIndex(upper, " IN (") + if inIdx < 0 { + return 0, false + } + listStart := inIdx + len(" IN (") + listEnd := strings.Index(sql[listStart:], ")") + if listEnd < 0 { + return 0, false + } + content := strings.TrimSpace(sql[listStart : listStart+listEnd]) + if content == "" { + return 0, false + } + return strings.Count(content, ",") + 1, true +} + +func queryOutputRows(qry *plan.Query) int64 { + if qry == nil { + return 0 + } + for _, rootID := range qry.Steps { + if int(rootID) >= len(qry.Nodes) || qry.Nodes[rootID] == nil { + continue + } + if analyze := qry.Nodes[rootID].AnalyzeInfo; analyze != nil { + return analyze.OutputRows + } + } + return 0 +} + +func findIvfSearchOutputRows(qry *plan.Query) (int64, bool) { + if qry == nil { + return 0, false + } + for _, node := range qry.Nodes { + if node == nil || node.NodeType != plan.Node_FUNCTION_SCAN || node.TableDef == nil || node.TableDef.TblFunc == nil { + continue + } + if node.TableDef.TblFunc.Name != "ivf_search" || node.AnalyzeInfo == nil { + continue + } + return node.AnalyzeInfo.OutputRows, true + } + return 0, false +} + +func truncateSummaryList(items []string, maxItems int) string { + if len(items) <= maxItems { + return strings.Join(items, ", ") + } + visible := append([]string{}, items[:maxItems]...) + visible = append(visible, "...") + return strings.Join(visible, ", ") +} + func explainSinglePlan(qry *plan.Query, ctx context.Context, buffer *ExplainDataBuffer, options *ExplainOptions) error { nodes := qry.Nodes diff --git a/pkg/sql/plan/explain/ivf_test.go b/pkg/sql/plan/explain/ivf_test.go new file mode 100644 index 0000000000000..ae8c770834cd0 --- /dev/null +++ b/pkg/sql/plan/explain/ivf_test.go @@ -0,0 +1,149 @@ +// Copyright 2022 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 explain + +import ( + "context" + "strings" + "testing" + + "github.com/matrixorigin/matrixone/pkg/pb/plan" + plan2 "github.com/matrixorigin/matrixone/pkg/sql/plan" + "github.com/stretchr/testify/require" +) + +func TestIvfSearchFilterInfo(t *testing.T) { + node := &plan.Node{ + NodeType: plan.Node_FUNCTION_SCAN, + TableDef: &plan.TableDef{ + TblFunc: &plan.TableFunction{Name: "ivf_search"}, + }, + TblFuncExprList: []*plan.Expr{ + plan2.MakePlan2StringConstExprWithType("tblcfg"), + plan2.MakePlan2StringConstExprWithType("[1,2,3]"), + plan2.MakePlan2StringConstExprWithType("`__mo_index_include_category` >= 20"), + }, + } + nodedesc := &NodeDescribeImpl{Node: node} + lines, err := nodedesc.GetExtraInfo(context.TODO(), &ExplainOptions{}) + require.NoError(t, err) + require.Contains(t, lines, "Filter Cond: `__mo_index_include_category` >= 20") +} + +func TestExplainCollapsesIvfBackgroundQueriesByDefault(t *testing.T) { + query := &plan.Query{ + Steps: []int32{0}, + Nodes: []*plan.Node{ + { + NodeId: 0, + NodeType: plan.Node_FUNCTION_SCAN, + TableDef: &plan.TableDef{ + TblFunc: &plan.TableFunction{Name: "ivf_search"}, + }, + AnalyzeInfo: &plan.AnalyzeInfo{OutputRows: 7}, + }, + }, + BackgroundQueries: []*plan.Query{ + makeIvfBackgroundQuery("SELECT * FROM t WHERE id IN (1,2) LIMIT 40", 2), + makeIvfBackgroundQuery("SELECT * FROM t WHERE id IN (3,4) LIMIT 80", 0), + makeIvfBackgroundQuery("SELECT * FROM t WHERE id IN (5,6) LIMIT 160", 3), + }, + } + + buffer := NewExplainDataBuffer() + err := NewExplainQueryImpl(query).ExplainPlan(context.TODO(), buffer, &ExplainOptions{Analyze: true, Format: EXPLAIN_FORMAT_TEXT}) + require.NoError(t, err) + + planText := buffer.ToString() + require.Contains(t, planText, "Background Queries: round_count=3") + require.Contains(t, planText, "bucket_windows=0:2, 2:4, 4:6") + require.Contains(t, planText, "round_limits=40, 80, 160") + require.Contains(t, planText, "empty_rounds=1") + require.Contains(t, planText, "dedup_output_rows=7") +} + +func TestExplainExpandsSmallIvfBackgroundQueriesByDefault(t *testing.T) { + query := &plan.Query{ + Steps: []int32{0}, + Nodes: []*plan.Node{ + { + NodeId: 0, + NodeType: plan.Node_FUNCTION_SCAN, + TableDef: &plan.TableDef{ + TblFunc: &plan.TableFunction{Name: "ivf_search"}, + }, + AnalyzeInfo: &plan.AnalyzeInfo{OutputRows: 20}, + }, + }, + BackgroundQueries: []*plan.Query{ + makeIvfBackgroundQuery("SELECT * FROM t WHERE id IN (1,2) LIMIT 20", 11), + makeIvfBackgroundQuery("SELECT * FROM t WHERE id IN (3,4) LIMIT 20", 9), + }, + } + + buffer := NewExplainDataBuffer() + err := NewExplainQueryImpl(query).ExplainPlan(context.TODO(), buffer, &ExplainOptions{Analyze: true, Format: EXPLAIN_FORMAT_TEXT}) + require.NoError(t, err) + + planText := buffer.ToString() + require.NotContains(t, planText, "Background Queries: round_count=") + require.Contains(t, planText, "Project") + require.GreaterOrEqual(t, strings.Count(planText, "Project"), 2) +} + +func TestExplainVerboseCapsIvfBackgroundQueryExpansion(t *testing.T) { + query := &plan.Query{ + Steps: []int32{0}, + Nodes: []*plan.Node{ + { + NodeId: 0, + NodeType: plan.Node_FUNCTION_SCAN, + TableDef: &plan.TableDef{ + TblFunc: &plan.TableFunction{Name: "ivf_search"}, + }, + }, + }, + BackgroundQueries: []*plan.Query{ + makeIvfBackgroundQuery("SELECT * FROM t WHERE id IN (1,2) LIMIT 40", 1), + makeIvfBackgroundQuery("SELECT * FROM t WHERE id IN (3,4) LIMIT 80", 1), + makeIvfBackgroundQuery("SELECT * FROM t WHERE id IN (5,6) LIMIT 160", 1), + makeIvfBackgroundQuery("SELECT * FROM t WHERE id IN (7,8) LIMIT 320", 1), + makeIvfBackgroundQuery("SELECT * FROM t WHERE id IN (9,10) LIMIT 640", 1), + makeIvfBackgroundQuery("SELECT * FROM t WHERE id IN (11,12) LIMIT 1280", 1), + }, + } + + buffer := NewExplainDataBuffer() + err := NewExplainQueryImpl(query).ExplainPlan(context.TODO(), buffer, &ExplainOptions{Verbose: true, Analyze: true, Format: EXPLAIN_FORMAT_TEXT}) + require.NoError(t, err) + + planText := buffer.ToString() + require.Contains(t, planText, "Background Queries: skipped 1 middle plan(s)") + require.NotContains(t, planText, "round_count=") +} + +func makeIvfBackgroundQuery(sql string, outputRows int64) *plan.Query { + return &plan.Query{ + Steps: []int32{0}, + Nodes: []*plan.Node{ + { + NodeId: 0, + NodeType: plan.Node_PROJECT, + Stats: &plan.Stats{Sql: sql}, + AnalyzeInfo: &plan.AnalyzeInfo{OutputRows: outputRows}, + }, + }, + } +} diff --git a/pkg/sql/plan/hnsw.go b/pkg/sql/plan/hnsw.go index 2948153bdb1f6..4e647448a0963 100644 --- a/pkg/sql/plan/hnsw.go +++ b/pkg/sql/plan/hnsw.go @@ -99,10 +99,10 @@ func (builder *QueryBuilder) buildHnswCreate(tbl *tree.TableFunction, ctx *BindC return builder.appendNode(node, ctx), nil } -// arg list [param, hnsw.IndexTableconfig (JSON), search_vec] +// arg list [param, hnsw.IndexTableconfig (JSON), search_vec, filter_payload?] func (builder *QueryBuilder) buildHnswSearch(tbl *tree.TableFunction, ctx *BindContext, exprs []*plan.Expr, children []int32) (int32, error) { - if len(exprs) != 3 { - return 0, moerr.NewInvalidInput(builder.GetContext(), "Invalid number of arguments (NARGS != 3).") + if len(exprs) != 3 && len(exprs) != 4 { + return 0, moerr.NewInvalidInput(builder.GetContext(), "Invalid number of arguments (NARGS must be 3 or 4).") } colDefs := DeepCopyColDefList(kHNSWSearchColDefs) diff --git a/pkg/sql/plan/indexdef_metadata_test.go b/pkg/sql/plan/indexdef_metadata_test.go new file mode 100644 index 0000000000000..3badbddb1215f --- /dev/null +++ b/pkg/sql/plan/indexdef_metadata_test.go @@ -0,0 +1,45 @@ +// Copyright 2026 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 plan + +import ( + "testing" + + planpb "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/stretchr/testify/require" +) + +func TestIndexDefIncludedColumnsRoundTripAndDeepCopy(t *testing.T) { + indexDef := &planpb.IndexDef{ + IndexName: "idx_embedding", + Parts: []string{"embedding"}, + IndexAlgo: "ivfflat", + IndexAlgoParams: `{"lists":"2","op_type":"vector_l2_ops"}`, + IncludedColumns: []string{"title", "category"}, + } + + data, err := indexDef.Marshal() + require.NoError(t, err) + + var decoded planpb.IndexDef + require.NoError(t, decoded.Unmarshal(data)) + require.Equal(t, indexDef.IncludedColumns, decoded.IncludedColumns) + + copied := DeepCopyIndexDef(indexDef) + require.Equal(t, indexDef.IncludedColumns, copied.IncludedColumns) + + indexDef.IncludedColumns[0] = "headline" + require.Equal(t, []string{"title", "category"}, copied.IncludedColumns) +} diff --git a/pkg/sql/plan/ivfflat.go b/pkg/sql/plan/ivfflat.go index 514c9dc84e195..abfe2876b7e68 100644 --- a/pkg/sql/plan/ivfflat.go +++ b/pkg/sql/plan/ivfflat.go @@ -15,6 +15,7 @@ package plan import ( + "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/container/types" "github.com/matrixorigin/matrixone/pkg/pb/plan" @@ -56,6 +57,27 @@ var ( } ) +func buildIvfSearchColDefs(includeColumns []string, originalTableDef *plan.TableDef) []*plan.ColDef { + colDefs := DeepCopyColDefList(kIVFSearchColDefs) + if len(includeColumns) == 0 || originalTableDef == nil { + return colDefs + } + + for _, colName := range includeColumns { + colIdx, ok := originalTableDef.Name2ColIndex[colName] + if !ok { + continue + } + srcCol := originalTableDef.Cols[colIdx] + colDefs = append(colDefs, &plan.ColDef{ + Name: catalog.SystemSI_IVFFLAT_IncludeColPrefix + colName, + Typ: srcCol.Typ, + }) + } + + return colDefs +} + // arg list [param, ivf.IndexTableConfig (JSON), vec] func (builder *QueryBuilder) buildIvfCreate(tbl *tree.TableFunction, ctx *BindContext, exprs []*plan.Expr, children []int32) (int32, error) { if len(exprs) < 2 { diff --git a/pkg/sql/plan/ivfflat_include_alter.go b/pkg/sql/plan/ivfflat_include_alter.go new file mode 100644 index 0000000000000..f7d4e8ae136fe --- /dev/null +++ b/pkg/sql/plan/ivfflat_include_alter.go @@ -0,0 +1,139 @@ +// 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 plan + +import ( + "fmt" + "sort" + "strings" + + "github.com/matrixorigin/matrixone/pkg/catalog" + planpb "github.com/matrixorigin/matrixone/pkg/pb/plan" +) + +func indexIncludesColumn(indexDef *planpb.IndexDef, colName string) bool { + for _, includeCol := range indexDef.IncludedColumns { + if catalog.ResolveAlias(includeCol) == colName { + return true + } + } + return false +} + +func indexDependsOnColumn(indexDef *planpb.IndexDef, colName string) (bool, error) { + for _, part := range indexDef.Parts { + if catalog.ResolveAlias(part) == colName { + return true, nil + } + } + + return indexIncludesColumn(indexDef, colName), nil +} + +func collectAffectedIndexNamesForAlter(indexDefs []*planpb.IndexDef, affectedCols []string) ([]string, error) { + if len(indexDefs) == 0 || len(affectedCols) == 0 { + return nil, nil + } + + affectedIndexNames := make(map[string]struct{}, len(indexDefs)) + for _, colName := range affectedCols { + for _, idxDef := range indexDefs { + depends, err := indexDependsOnColumn(idxDef, colName) + if err != nil { + return nil, err + } + if depends { + affectedIndexNames[idxDef.IndexName] = struct{}{} + } + } + } + + if len(affectedIndexNames) == 0 { + return nil, nil + } + + names := make([]string, 0, len(affectedIndexNames)) + for name := range affectedIndexNames { + names = append(names, name) + } + sort.Strings(names) + return names, nil +} + +func rewriteIncludedColumnNames(includedColumns []string, oldColName, newColName string) ([]string, bool) { + if oldColName == newColName { + return includedColumns, false + } + if len(includedColumns) == 0 { + return includedColumns, false + } + + newIncludedColumns := append([]string(nil), includedColumns...) + changed := false + for i, includeCol := range newIncludedColumns { + if catalog.ResolveAlias(includeCol) == oldColName { + newIncludedColumns[i] = newColName + changed = true + } + } + return newIncludedColumns, changed +} + +func renameColumnInVectorIndexIncludedColumns(tableDef *planpb.TableDef, oldColName, newColName string) ([]string, error) { + if oldColName == newColName { + return nil, nil + } + + updatedByIndexName := make(map[string][]string) + for _, indexDef := range tableDef.Indexes { + newIncludedColumns, changed := rewriteIncludedColumnNames(indexDef.IncludedColumns, oldColName, newColName) + if !changed { + continue + } + + indexDef.IncludedColumns = newIncludedColumns + updatedByIndexName[indexDef.IndexName] = newIncludedColumns + } + + if len(updatedByIndexName) == 0 { + return nil, nil + } + + indexNames := make([]string, 0, len(updatedByIndexName)) + for indexName := range updatedByIndexName { + indexNames = append(indexNames, indexName) + } + sort.Strings(indexNames) + + sqls := make([]string, 0, len(indexNames)) + for _, indexName := range indexNames { + encoded, err := catalog.MarshalIncludeColumnsValue(updatedByIndexName[indexName]) + if err != nil { + return nil, err + } + sqls = append(sqls, fmt.Sprintf( + "update `mo_catalog`.`mo_indexes` set included_columns = '%s' where table_id = %d and name = '%s' ; ", + escapeSQLStringLiteral(encoded), + tableDef.TblId, + indexName, + )) + } + return sqls, nil +} + +func escapeSQLStringLiteral(s string) string { + s = strings.ReplaceAll(s, `\`, `\\`) + return strings.ReplaceAll(s, "'", "''") +} diff --git a/pkg/sql/plan/ivfflat_include_alter_test.go b/pkg/sql/plan/ivfflat_include_alter_test.go new file mode 100644 index 0000000000000..801b27149cc83 --- /dev/null +++ b/pkg/sql/plan/ivfflat_include_alter_test.go @@ -0,0 +1,107 @@ +// 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 plan + +import ( + "context" + "testing" + + "github.com/matrixorigin/matrixone/pkg/catalog" + planpb "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/stretchr/testify/require" +) + +func makeIvfIncludeAlterIndexDef(indexName string, includedColumns []string) *planpb.IndexDef { + return &planpb.IndexDef{ + IndexName: indexName, + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoParams: `{"lists":"2","op_type":"vector_l2_ops"}`, + Parts: []string{"embedding"}, + IncludedColumns: append([]string(nil), includedColumns...), + } +} + +func TestHandleDropColumnWithIndexRemovesIvfIndexForIncludeColumn(t *testing.T) { + def := TableDef{ + Indexes: []*IndexDef{ + makeIvfIncludeAlterIndexDef("idx_ivf", []string{"title", "category"}), + makeIvfIncludeAlterIndexDef("idx_ivf", []string{"title", "category"}), + makeIvfIncludeAlterIndexDef("idx_ivf", []string{"title", "category"}), + }, + } + + err := handleDropColumnWithIndex(context.Background(), "title", &def) + require.NoError(t, err) + require.Empty(t, def.Indexes) +} + +func TestUpdateRenameColumnInTableDefRenamesIvfIncludeMetadata(t *testing.T) { + mock := NewMockOptimizer(false) + tableDef := &planpb.TableDef{ + TblId: 42, + Cols: []*ColDef{ + {Name: "id", OriginName: "id"}, + {Name: "title", OriginName: "title"}, + {Name: "category", OriginName: "category"}, + }, + Pkey: &PrimaryKeyDef{ + Names: []string{"id"}, + PkeyColName: "id", + }, + Indexes: []*planpb.IndexDef{ + makeIvfIncludeAlterIndexDef("idx_ivf", []string{"title", "category"}), + makeIvfIncludeAlterIndexDef("idx_ivf", []string{"title", "category"}), + makeIvfIncludeAlterIndexDef("idx_ivf", []string{"title", "category"}), + }, + } + + sqls, err := updateRenameColumnInTableDef( + mock.CurrentContext(), + tableDef.Cols[1], + tableDef, + &tree.AlterTableRenameColumnClause{ + OldColumnName: tree.NewUnresolvedColName("title"), + NewColumnName: tree.NewUnresolvedColName("headline"), + }, + ) + require.NoError(t, err) + require.Len(t, sqls, 1) + require.Contains(t, sqls[0], `set included_columns = '["headline","category"]'`) + require.Contains(t, sqls[0], "name = 'idx_ivf'") + + for _, indexDef := range tableDef.Indexes { + require.Equal(t, []string{"headline", "category"}, indexDef.IncludedColumns) + require.NotContains(t, indexDef.IndexAlgoParams, "include_columns") + } + require.Equal(t, "headline", tableDef.Cols[1].Name) + require.Equal(t, "headline", tableDef.Cols[1].OriginName) +} + +func TestCollectAffectedIndexNamesForAlterIncludesIvfIncludeColumns(t *testing.T) { + indexes := []*planpb.IndexDef{ + makeIvfIncludeAlterIndexDef("idx_ivf", []string{"title", "category"}), + makeIvfIncludeAlterIndexDef("idx_ivf", []string{"title", "category"}), + { + IndexName: "idx_note", + IndexAlgo: catalog.MoIndexDefaultAlgo.ToString(), + Parts: []string{"note"}, + }, + } + + names, err := collectAffectedIndexNamesForAlter(indexes, []string{"title", "note"}) + require.NoError(t, err) + require.Equal(t, []string{"idx_ivf", "idx_note"}, names) +} diff --git a/pkg/sql/plan/ivfflat_include_covering_scan_test.go b/pkg/sql/plan/ivfflat_include_covering_scan_test.go new file mode 100644 index 0000000000000..27475940c5130 --- /dev/null +++ b/pkg/sql/plan/ivfflat_include_covering_scan_test.go @@ -0,0 +1,171 @@ +// 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 plan + +import ( + "testing" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/vectorindex/metric" + "github.com/stretchr/testify/require" +) + +func TestBuildIvfSearchColDefsIncludesCoveringColumnsWithoutMutatingBase(t *testing.T) { + original := &plan.TableDef{ + Name2ColIndex: map[string]int32{ + "title": 0, + "rank": 1, + "unused": 2, + }, + Cols: []*plan.ColDef{ + {Name: "title", Typ: plan.Type{Id: int32(types.T_varchar)}}, + {Name: "rank", Typ: plan.Type{Id: int32(types.T_int32)}}, + {Name: "unused", Typ: plan.Type{Id: int32(types.T_int64)}}, + }, + } + + colDefs := buildIvfSearchColDefs([]string{"title", "rank"}, original) + require.Len(t, kIVFSearchColDefs, 2) + require.Len(t, colDefs, 4) + require.Equal(t, "pkid", colDefs[0].Name) + require.Equal(t, "score", colDefs[1].Name) + require.Equal(t, catalog.SystemSI_IVFFLAT_IncludeColPrefix+"title", colDefs[2].Name) + require.Equal(t, int32(types.T_varchar), colDefs[2].Typ.Id) + require.Equal(t, catalog.SystemSI_IVFFLAT_IncludeColPrefix+"rank", colDefs[3].Name) + require.Equal(t, int32(types.T_int32), colDefs[3].Typ.Id) +} + +func TestApplyIndicesForSortUsingIvfflatBuildsDynamicColsForOptimizerPath(t *testing.T) { + baseMockCtx := NewMockCompilerContext(false) + mockCtx := &customMockCompilerContext{ + MockCompilerContext: baseMockCtx, + resolveVarFunc: func(varName string, isSystem, isGlobal bool) (interface{}, error) { + switch varName { + case "enable_vector_prefilter_by_default": + return int8(0), nil + case "ivf_threads_search": + return int64(4), nil + case "probe_limit": + return int64(10), nil + } + return baseMockCtx.ResolveVariable(varName, isSystem, isGlobal) + }, + } + + tableDef := &plan.TableDef{ + Name: "t1", + Cols: []*plan.ColDef{ + {Name: "id", Typ: plan.Type{Id: int32(types.T_int64)}}, + {Name: "v", Typ: plan.Type{Id: int32(types.T_array_float32)}}, + {Name: "title", Typ: plan.Type{Id: int32(types.T_varchar)}}, + }, + Pkey: &plan.PrimaryKeyDef{PkeyColName: "id"}, + Name2ColIndex: map[string]int32{"id": 0, "v": 1, "title": 2}, + } + + idxAlgoParams := `{"op_type":"` + metric.DistFuncOpTypes["l2_distance"] + `"}` + includedColumns := []string{"title"} + multiTableIndex := &MultiTableIndex{ + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexDefs: map[string]*plan.IndexDef{ + catalog.SystemSI_IVFFLAT_TblType_Metadata: { + IndexName: "idx_covering", + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Metadata, + IndexTableName: "meta", + IndexAlgoParams: idxAlgoParams, + Parts: []string{"v"}, + IncludedColumns: includedColumns, + }, + catalog.SystemSI_IVFFLAT_TblType_Centroids: { + IndexName: "idx_covering", + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Centroids, + IndexTableName: "centroids", + Parts: []string{"v"}, + IndexAlgoParams: idxAlgoParams, + IncludedColumns: includedColumns, + }, + catalog.SystemSI_IVFFLAT_TblType_Entries: { + IndexName: "idx_covering", + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Entries, + IndexTableName: "entries", + IndexAlgoParams: idxAlgoParams, + Parts: []string{"v"}, + IncludedColumns: includedColumns, + }, + }, + } + + builder := NewQueryBuilder(plan.Query_SELECT, mockCtx, false, true) + ctx := NewBindContext(builder, nil) + + scanNode := &plan.Node{ + NodeType: plan.Node_TABLE_SCAN, + TableDef: tableDef, + ObjRef: &plan.ObjectRef{SchemaName: "db"}, + BindingTags: []int32{builder.genNewBindTag()}, + } + scanNodeID := builder.appendNode(scanNode, ctx) + for int(scanNodeID) >= len(builder.ctxByNode) { + builder.ctxByNode = append(builder.ctxByNode, ctx) + } + for i := 0; i < 10; i++ { + builder.ctxByNode = append(builder.ctxByNode, ctx) + } + + float32Typ := plan.Type{Id: int32(types.T_array_float32)} + distFnExpr := &plan.Function{ + Func: &ObjectRef{ObjName: "l2_distance"}, + Args: []*plan.Expr{ + {Typ: float32Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanNode.BindingTags[0], ColPos: 1}}}, + {Typ: float32Typ, Expr: &plan.Expr_Lit{Lit: &plan.Literal{Value: &plan.Literal_VecVal{VecVal: "[1,1,1]"}}}}, + }, + } + + vecCtx := &vectorSortContext{ + scanNode: scanNode, + sortNode: &plan.Node{NodeType: plan.Node_SORT, Offset: &plan.Expr{}}, + projNode: &plan.Node{ + NodeType: plan.Node_PROJECT, + Children: []int32{scanNodeID}, + ProjectList: []*plan.Expr{ + { + Typ: tableDef.Cols[2].Typ, + Expr: &plan.Expr_Col{ + Col: &plan.ColRef{RelPos: scanNode.BindingTags[0], ColPos: 2, Name: "title"}, + }, + }, + }, + }, + distFnExpr: distFnExpr, + limit: &plan.Expr{Expr: &plan.Expr_Lit{Lit: &plan.Literal{Value: &plan.Literal_U64Val{U64Val: 10}}}}, + } + + _, err := builder.applyIndicesForSortUsingIvfflat(scanNodeID, vecCtx, multiTableIndex, nil, nil) + require.NoError(t, err) + + sortNode := builder.qry.Nodes[vecCtx.projNode.Children[0]] + tableFuncNode := builder.qry.Nodes[sortNode.Children[0]] + + require.Equal(t, plan.Node_FUNCTION_SCAN, tableFuncNode.NodeType) + require.Len(t, tableFuncNode.TableDef.Cols, 3) + require.Equal(t, "pkid", tableFuncNode.TableDef.Cols[0].Name) + require.Equal(t, "score", tableFuncNode.TableDef.Cols[1].Name) + require.Equal(t, catalog.SystemSI_IVFFLAT_IncludeColPrefix+"title", tableFuncNode.TableDef.Cols[2].Name) +} diff --git a/pkg/sql/plan/ivfflat_include_modes_test.go b/pkg/sql/plan/ivfflat_include_modes_test.go new file mode 100644 index 0000000000000..d99657147b402 --- /dev/null +++ b/pkg/sql/plan/ivfflat_include_modes_test.go @@ -0,0 +1,623 @@ +// 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 plan + +import ( + "testing" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/matrixorigin/matrixone/pkg/vectorindex/metric" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func newIvfIncludeModeTestBuilder(t *testing.T) (*QueryBuilder, *BindContext, *plan.Node, int32, *MultiTableIndex) { + baseMockCtx := NewMockCompilerContext(false) + mockCtx := &customMockCompilerContext{ + MockCompilerContext: baseMockCtx, + resolveVarFunc: func(varName string, isSystem, isGlobal bool) (interface{}, error) { + switch varName { + case "enable_vector_prefilter_by_default": + return int8(0), nil + case "ivf_threads_search": + return int64(4), nil + case "probe_limit": + return int64(10), nil + } + return baseMockCtx.ResolveVariable(varName, isSystem, isGlobal) + }, + } + + tableDef := &plan.TableDef{ + Name: "t_include_modes", + Cols: []*plan.ColDef{ + {Name: "id", Typ: plan.Type{Id: int32(types.T_int64)}}, + {Name: "embedding", Typ: plan.Type{Id: int32(types.T_array_float32)}}, + {Name: "title", Typ: plan.Type{Id: int32(types.T_varchar)}}, + {Name: "category", Typ: plan.Type{Id: int32(types.T_int32)}}, + {Name: "note", Typ: plan.Type{Id: int32(types.T_varchar)}}, + }, + Pkey: &plan.PrimaryKeyDef{ + PkeyColName: "id", + Names: []string{"id"}, + }, + Name2ColIndex: map[string]int32{ + "id": 0, + "embedding": 1, + "title": 2, + "category": 3, + "note": 4, + }, + } + + idxAlgoParams := `{"op_type":"` + metric.DistFuncOpTypes["l2_distance"] + `"}` + includedColumns := []string{"title", "category"} + multiTableIndex := &MultiTableIndex{ + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexDefs: map[string]*plan.IndexDef{ + catalog.SystemSI_IVFFLAT_TblType_Metadata: { + IndexName: "idx_include_modes", + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Metadata, + IndexTableName: "meta", + IndexAlgoParams: idxAlgoParams, + Parts: []string{"embedding"}, + IncludedColumns: includedColumns, + }, + catalog.SystemSI_IVFFLAT_TblType_Centroids: { + IndexName: "idx_include_modes", + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Centroids, + IndexTableName: "centroids", + Parts: []string{"embedding"}, + IndexAlgoParams: idxAlgoParams, + IncludedColumns: includedColumns, + }, + catalog.SystemSI_IVFFLAT_TblType_Entries: { + IndexName: "idx_include_modes", + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexAlgoTableType: catalog.SystemSI_IVFFLAT_TblType_Entries, + IndexTableName: "entries", + IndexAlgoParams: idxAlgoParams, + Parts: []string{"embedding"}, + IncludedColumns: includedColumns, + }, + }, + } + + builder := NewQueryBuilder(plan.Query_SELECT, mockCtx, false, true) + ctx := NewBindContext(builder, nil) + scanNode := &plan.Node{ + NodeType: plan.Node_TABLE_SCAN, + TableDef: tableDef, + ObjRef: &plan.ObjectRef{SchemaName: "db", ObjName: "t_include_modes"}, + BindingTags: []int32{builder.genNewBindTag()}, + } + scanNodeID := builder.appendNode(scanNode, ctx) + for int(scanNodeID) >= len(builder.ctxByNode) { + builder.ctxByNode = append(builder.ctxByNode, ctx) + } + for i := 0; i < 20; i++ { + builder.ctxByNode = append(builder.ctxByNode, ctx) + } + + return builder, ctx, scanNode, scanNodeID, multiTableIndex +} + +func newIvfIncludeModeVectorSortContext(scanNode *plan.Node, scanNodeID int32, mode string, projectColPoses ...int32) *vectorSortContext { + scanTag := scanNode.BindingTags[0] + projectList := make([]*plan.Expr, 0, len(projectColPoses)) + for _, colPos := range projectColPoses { + colDef := scanNode.TableDef.Cols[colPos] + projectList = append(projectList, &plan.Expr{ + Typ: colDef.Typ, + Expr: &plan.Expr_Col{ + Col: &plan.ColRef{RelPos: scanTag, ColPos: colPos, Name: colDef.Name}, + }, + }) + } + + float32Typ := plan.Type{Id: int32(types.T_array_float32)} + distFnExpr := &plan.Function{ + Func: &ObjectRef{ObjName: "l2_distance"}, + Args: []*plan.Expr{ + {Typ: float32Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 1, Name: "embedding"}}}, + {Typ: float32Typ, Expr: &plan.Expr_Lit{Lit: &plan.Literal{Value: &plan.Literal_VecVal{VecVal: "[1,1,1]"}}}}, + }, + } + + return &vectorSortContext{ + scanNode: scanNode, + sortNode: &plan.Node{NodeType: plan.Node_SORT}, + projNode: &plan.Node{ + NodeType: plan.Node_PROJECT, + Children: []int32{scanNodeID}, + ProjectList: projectList, + }, + distFnExpr: distFnExpr, + limit: makePlan2Uint64ConstExprWithType(2), + rankOption: &plan.RankOption{Mode: mode}, + } +} + +func findIvfTableFunctionNode(builder *QueryBuilder, nodeID int32) *plan.Node { + if int(nodeID) >= len(builder.qry.Nodes) || builder.qry.Nodes[nodeID] == nil { + return nil + } + node := builder.qry.Nodes[nodeID] + if node.NodeType == plan.Node_FUNCTION_SCAN { + return node + } + for _, childID := range node.Children { + if found := findIvfTableFunctionNode(builder, childID); found != nil { + return found + } + } + return nil +} + +func TestApplyIndicesForSortUsingIvfflat_PostModeDoesNotAutoUseIncludeOptimization(t *testing.T) { + builder, _, scanNode, scanNodeID, multiTableIndex := newIvfIncludeModeTestBuilder(t) + + scanTag := scanNode.BindingTags[0] + scanNode.FilterList = []*plan.Expr{ + { + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: ">="}, + Args: []*plan.Expr{ + {Typ: scanNode.TableDef.Cols[3].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 3, Name: "category"}}}, + MakePlan2Int32ConstExprWithType(20), + }, + }, + }, + }, + { + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: "="}, + Args: []*plan.Expr{ + {Typ: scanNode.TableDef.Cols[4].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 4, Name: "note"}}}, + makePlan2StringConstExprWithType("n2"), + }, + }, + }, + }, + } + + vecCtx := newIvfIncludeModeVectorSortContext(scanNode, scanNodeID, "post", 0, 2, 4) + + _, err := builder.applyIndicesForSortUsingIvfflat(scanNodeID, vecCtx, multiTableIndex, nil, nil) + require.NoError(t, err) + + sortNode := builder.qry.Nodes[vecCtx.projNode.Children[0]] + require.Equal(t, plan.Node_SORT, sortNode.NodeType) + joinNode := builder.qry.Nodes[sortNode.Children[0]] + require.Equal(t, plan.Node_JOIN, joinNode.NodeType) + + tableFuncNode := findIvfTableFunctionNode(builder, sortNode.Children[0]) + require.NotNil(t, tableFuncNode) + require.Equal(t, plan.Node_FUNCTION_SCAN, tableFuncNode.NodeType) + require.Len(t, tableFuncNode.TableDef.Cols, 2) + require.Equal(t, uint64(12), tableFuncNode.Limit.GetLit().GetU64Val()) + require.Equal(t, uint64(12), tableFuncNode.IndexReaderParam.GetLimit().GetLit().GetU64Val()) + require.Len(t, tableFuncNode.TblFuncExprList, 2) + + require.Len(t, scanNode.FilterList, 2) + require.Equal(t, "category", scanNode.FilterList[0].GetF().Args[0].GetCol().Name) + require.Equal(t, "note", scanNode.FilterList[1].GetF().Args[0].GetCol().Name) +} + +func TestApplyIndicesForSortUsingIvfflat_IncludeModePartialPushdownKeepsResidualFilter(t *testing.T) { + builder, _, scanNode, scanNodeID, multiTableIndex := newIvfIncludeModeTestBuilder(t) + + scanTag := scanNode.BindingTags[0] + scanNode.FilterList = []*plan.Expr{ + { + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: ">="}, + Args: []*plan.Expr{ + {Typ: scanNode.TableDef.Cols[3].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 3, Name: "category"}}}, + MakePlan2Int32ConstExprWithType(20), + }, + }, + }, + }, + { + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: "="}, + Args: []*plan.Expr{ + {Typ: scanNode.TableDef.Cols[4].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 4, Name: "note"}}}, + makePlan2StringConstExprWithType("n2"), + }, + }, + }, + }, + } + + vecCtx := newIvfIncludeModeVectorSortContext(scanNode, scanNodeID, "include", 0, 2, 4) + + _, err := builder.applyIndicesForSortUsingIvfflat(scanNodeID, vecCtx, multiTableIndex, nil, nil) + require.NoError(t, err) + + sortNode := builder.qry.Nodes[vecCtx.projNode.Children[0]] + require.Equal(t, plan.Node_SORT, sortNode.NodeType) + joinNode := builder.qry.Nodes[sortNode.Children[0]] + require.Equal(t, plan.Node_JOIN, joinNode.NodeType) + + tableFuncNode := findIvfTableFunctionNode(builder, sortNode.Children[0]) + require.NotNil(t, tableFuncNode) + require.Equal(t, plan.Node_FUNCTION_SCAN, tableFuncNode.NodeType) + require.Len(t, tableFuncNode.TableDef.Cols, 2) + require.Equal(t, maxSafeIvfSearchRoundLimit, tableFuncNode.Limit.GetLit().GetU64Val()) + require.Equal(t, maxSafeIvfSearchRoundLimit, tableFuncNode.IndexReaderParam.GetLimit().GetLit().GetU64Val()) + require.Len(t, tableFuncNode.TblFuncExprList, 5) + assert.Contains(t, tableFuncNode.TblFuncExprList[2].GetLit().GetSval(), catalog.SystemSI_IVFFLAT_IncludeColPrefix+"category") + assert.Equal(t, maxSafeIvfSearchRoundLimit, tableFuncNode.TblFuncExprList[3].GetLit().GetU64Val()) + + require.Len(t, scanNode.FilterList, 1) + require.Equal(t, "note", scanNode.FilterList[0].GetF().Args[0].GetCol().Name) +} + +func TestApplyIndicesForSortUsingIvfflat_PreModeDoesNotAutoUseIncludePushdown(t *testing.T) { + builder, _, scanNode, scanNodeID, multiTableIndex := newIvfIncludeModeTestBuilder(t) + + scanTag := scanNode.BindingTags[0] + scanNode.FilterList = []*plan.Expr{ + { + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: ">="}, + Args: []*plan.Expr{ + {Typ: scanNode.TableDef.Cols[3].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 3, Name: "category"}}}, + MakePlan2Int32ConstExprWithType(20), + }, + }, + }, + }, + } + + vecCtx := newIvfIncludeModeVectorSortContext(scanNode, scanNodeID, "pre", 0, 2, 3) + + _, err := builder.applyIndicesForSortUsingIvfflat(scanNodeID, vecCtx, multiTableIndex, nil, nil) + require.NoError(t, err) + + sortNode := builder.qry.Nodes[vecCtx.projNode.Children[0]] + require.Equal(t, plan.Node_SORT, sortNode.NodeType) + require.Equal(t, plan.Node_JOIN, builder.qry.Nodes[sortNode.Children[0]].NodeType) + + tableFuncNode := findIvfTableFunctionNode(builder, sortNode.Children[0]) + require.NotNil(t, tableFuncNode) + require.Len(t, tableFuncNode.TableDef.Cols, 2) + require.Equal(t, uint64(2), tableFuncNode.Limit.GetLit().GetU64Val()) + require.Equal(t, uint64(2), tableFuncNode.IndexReaderParam.GetLimit().GetLit().GetU64Val()) + require.Len(t, tableFuncNode.TblFuncExprList, 2) +} + +func TestApplyIndicesForSortUsingIvfflat_PreModeWithoutFiltersKeepsCandidateLimit(t *testing.T) { + builder, _, scanNode, scanNodeID, multiTableIndex := newIvfIncludeModeTestBuilder(t) + + vecCtx := newIvfIncludeModeVectorSortContext(scanNode, scanNodeID, "pre", 0, 2, 3) + vecCtx.sortNode.Offset = makePlan2Uint64ConstExprWithType(1) + + _, err := builder.applyIndicesForSortUsingIvfflat(scanNodeID, vecCtx, multiTableIndex, nil, nil) + require.NoError(t, err) + + sortNode := builder.qry.Nodes[vecCtx.projNode.Children[0]] + require.Equal(t, plan.Node_SORT, sortNode.NodeType) + require.Equal(t, plan.Node_JOIN, builder.qry.Nodes[sortNode.Children[0]].NodeType) + + tableFuncNode := findIvfTableFunctionNode(builder, sortNode.Children[0]) + require.NotNil(t, tableFuncNode) + require.Len(t, tableFuncNode.TableDef.Cols, 2) + require.Equal(t, uint64(2), tableFuncNode.Limit.GetLit().GetU64Val()) + require.Equal(t, uint64(2), tableFuncNode.IndexReaderParam.GetLimit().GetLit().GetU64Val()) + require.Len(t, tableFuncNode.TblFuncExprList, 2) +} + +func TestApplyIndicesForSortUsingIvfflat_PreModeWithFiltersAddsOffsetToCandidateLimit(t *testing.T) { + builder, _, scanNode, scanNodeID, multiTableIndex := newIvfIncludeModeTestBuilder(t) + + scanTag := scanNode.BindingTags[0] + scanNode.FilterList = []*plan.Expr{ + { + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: "="}, + Args: []*plan.Expr{ + {Typ: scanNode.TableDef.Cols[3].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 3, Name: "category"}}}, + MakePlan2Int32ConstExprWithType(20), + }, + }, + }, + }, + } + + vecCtx := newIvfIncludeModeVectorSortContext(scanNode, scanNodeID, "pre", 0, 2, 3) + vecCtx.sortNode.Offset = makePlan2Uint64ConstExprWithType(1) + + _, err := builder.applyIndicesForSortUsingIvfflat(scanNodeID, vecCtx, multiTableIndex, nil, nil) + require.NoError(t, err) + + sortNode := builder.qry.Nodes[vecCtx.projNode.Children[0]] + require.Equal(t, plan.Node_SORT, sortNode.NodeType) + require.Equal(t, plan.Node_JOIN, builder.qry.Nodes[sortNode.Children[0]].NodeType) + + tableFuncNode := findIvfTableFunctionNode(builder, sortNode.Children[0]) + require.NotNil(t, tableFuncNode) + require.Len(t, tableFuncNode.TableDef.Cols, 2) + require.Equal(t, uint64(3), tableFuncNode.Limit.GetLit().GetU64Val()) + require.Equal(t, uint64(3), tableFuncNode.IndexReaderParam.GetLimit().GetLit().GetU64Val()) + require.Len(t, tableFuncNode.TblFuncExprList, 2) +} + +func TestApplyIndicesForSortUsingIvfflat_IncludeModeWithoutMetadataFallsBackToPost(t *testing.T) { + builder, _, scanNode, scanNodeID, multiTableIndex := newIvfIncludeModeTestBuilder(t) + + idxAlgoParams := `{"op_type":"` + metric.DistFuncOpTypes["l2_distance"] + `"}` + multiTableIndex.IndexDefs[catalog.SystemSI_IVFFLAT_TblType_Metadata].IndexAlgoParams = idxAlgoParams + multiTableIndex.IndexDefs[catalog.SystemSI_IVFFLAT_TblType_Centroids].IndexAlgoParams = idxAlgoParams + multiTableIndex.IndexDefs[catalog.SystemSI_IVFFLAT_TblType_Entries].IndexAlgoParams = idxAlgoParams + multiTableIndex.IndexDefs[catalog.SystemSI_IVFFLAT_TblType_Metadata].IncludedColumns = nil + multiTableIndex.IndexDefs[catalog.SystemSI_IVFFLAT_TblType_Centroids].IncludedColumns = nil + multiTableIndex.IndexDefs[catalog.SystemSI_IVFFLAT_TblType_Entries].IncludedColumns = nil + + vecCtx := newIvfIncludeModeVectorSortContext(scanNode, scanNodeID, "include", 0, 2, 3) + + _, err := builder.applyIndicesForSortUsingIvfflat(scanNodeID, vecCtx, multiTableIndex, nil, nil) + require.NoError(t, err) + + sortNode := builder.qry.Nodes[vecCtx.projNode.Children[0]] + require.Equal(t, plan.Node_SORT, sortNode.NodeType) + require.Equal(t, plan.Node_JOIN, builder.qry.Nodes[sortNode.Children[0]].NodeType) + + tableFuncNode := findIvfTableFunctionNode(builder, sortNode.Children[0]) + require.NotNil(t, tableFuncNode) + require.Len(t, tableFuncNode.TableDef.Cols, 2) + require.Equal(t, uint64(2), tableFuncNode.Limit.GetLit().GetU64Val()) + require.Equal(t, uint64(2), tableFuncNode.IndexReaderParam.GetLimit().GetLit().GetU64Val()) + require.Len(t, tableFuncNode.TblFuncExprList, 5) + assert.Empty(t, tableFuncNode.TblFuncExprList[2].GetLit().GetSval()) +} + +func TestApplyIndicesForSortUsingIvfflat_IncludeModeIndexOnlyPushdownOverfetchesFirstRound(t *testing.T) { + builder, _, scanNode, scanNodeID, multiTableIndex := newIvfIncludeModeTestBuilder(t) + + scanTag := scanNode.BindingTags[0] + scanNode.FilterList = []*plan.Expr{ + { + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: ">="}, + Args: []*plan.Expr{ + {Typ: scanNode.TableDef.Cols[3].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 3, Name: "category"}}}, + MakePlan2Int32ConstExprWithType(20), + }, + }, + }, + }, + } + + vecCtx := newIvfIncludeModeVectorSortContext(scanNode, scanNodeID, "include", 0, 2, 3) + + _, err := builder.applyIndicesForSortUsingIvfflat(scanNodeID, vecCtx, multiTableIndex, nil, nil) + require.NoError(t, err) + + sortNode := builder.qry.Nodes[vecCtx.projNode.Children[0]] + require.Equal(t, plan.Node_SORT, sortNode.NodeType) + + tableFuncNode := builder.qry.Nodes[sortNode.Children[0]] + require.Equal(t, plan.Node_FUNCTION_SCAN, tableFuncNode.NodeType) + require.Equal(t, uint64(2), tableFuncNode.Limit.GetLit().GetU64Val()) + require.Equal(t, uint64(2), tableFuncNode.IndexReaderParam.GetLimit().GetLit().GetU64Val()) + require.Len(t, tableFuncNode.TblFuncExprList, 5) + assert.Contains(t, tableFuncNode.TblFuncExprList[2].GetLit().GetSval(), catalog.SystemSI_IVFFLAT_IncludeColPrefix+"category") + assert.Equal(t, uint64(12), tableFuncNode.TblFuncExprList[3].GetLit().GetU64Val()) +} + +func TestSerializeFiltersToSQL_DoesNotPushMixedOR(t *testing.T) { + _, _, scanNode, _, _ := newIvfIncludeModeTestBuilder(t) + scanTag := scanNode.BindingTags[0] + + orExpr := &plan.Expr{ + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: "or"}, + Args: []*plan.Expr{ + { + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: "="}, + Args: []*plan.Expr{ + {Typ: scanNode.TableDef.Cols[3].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 3, Name: "category"}}}, + MakePlan2Int32ConstExprWithType(20), + }, + }, + }, + }, + { + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: "="}, + Args: []*plan.Expr{ + {Typ: scanNode.TableDef.Cols[4].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 4, Name: "note"}}}, + makePlan2StringConstExprWithType("n2"), + }, + }, + }, + }, + }, + }, + }, + } + + sql, pushdown, remaining, err := serializeFiltersToSQL([]*plan.Expr{orExpr}, scanNode, []string{"title", "category"}, 1) + require.NoError(t, err) + assert.Empty(t, sql) + assert.Empty(t, pushdown) + require.Len(t, remaining, 1) +} + +func TestSerializeFiltersToSQL_FormatsFunctionsCastAndArithmetic(t *testing.T) { + _, _, scanNode, _, _ := newIvfIncludeModeTestBuilder(t) + scanTag := scanNode.BindingTags[0] + + lowerTitleFilter := &plan.Expr{ + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: "="}, + Args: []*plan.Expr{ + { + Typ: plan.Type{Id: int32(types.T_varchar)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: "lower"}, + Args: []*plan.Expr{ + {Typ: scanNode.TableDef.Cols[2].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 2, Name: "title"}}}, + }, + }, + }, + }, + makePlan2StringConstExprWithType("beta"), + }, + }, + }, + } + + castCategoryFilter := &plan.Expr{ + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: ">="}, + Args: []*plan.Expr{ + { + Typ: plan.Type{Id: int32(types.T_int64)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: "cast"}, + Args: []*plan.Expr{ + {Typ: scanNode.TableDef.Cols[3].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 3, Name: "category"}}}, + {Typ: plan.Type{Id: int32(types.T_int64)}, Expr: &plan.Expr_T{T: &plan.TargetType{}}}, + }, + }, + }, + }, + makePlan2Int64ConstExprWithType(20), + }, + }, + }, + } + + arithmeticFilter := &plan.Expr{ + Typ: plan.Type{Id: int32(types.T_bool)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: ">="}, + Args: []*plan.Expr{ + { + Typ: plan.Type{Id: int32(types.T_int32)}, + Expr: &plan.Expr_F{ + F: &plan.Function{ + Func: &plan.ObjectRef{ObjName: "+"}, + Args: []*plan.Expr{ + {Typ: scanNode.TableDef.Cols[3].Typ, Expr: &plan.Expr_Col{Col: &plan.ColRef{RelPos: scanTag, ColPos: 3, Name: "category"}}}, + MakePlan2Int32ConstExprWithType(1), + }, + }, + }, + }, + MakePlan2Int32ConstExprWithType(21), + }, + }, + }, + } + + sql, pushdown, remaining, err := serializeFiltersToSQL( + []*plan.Expr{lowerTitleFilter, castCategoryFilter, arithmeticFilter}, + scanNode, + []string{"title", "category"}, + 1, + ) + require.NoError(t, err) + require.Len(t, pushdown, 3) + assert.Empty(t, remaining) + assert.Contains(t, sql, `lower(`) + assert.Contains(t, sql, catalog.SystemSI_IVFFLAT_IncludeColPrefix+"title") + assert.Contains(t, sql, `"beta"`) + assert.Contains(t, sql, `cast(`) + assert.Contains(t, sql, `as bigint`) + assert.Contains(t, sql, catalog.SystemSI_IVFFLAT_IncludeColPrefix+"category") + assert.Contains(t, sql, `+ 1`) + assert.Contains(t, sql, `>= 21`) +} + +func TestIvfLiteralToAST_QuotesStringSafely(t *testing.T) { + cases := []struct { + name string + lit *plan.Literal + want string + }{ + { + name: "single quote and backslash", + lit: &plan.Literal{Value: &plan.Literal_Sval{Sval: `O'Reilly\docs`}}, + want: "\"O'Reilly\\\\\\\\docs\"", + }, + { + name: "empty string", + lit: &plan.Literal{Value: &plan.Literal_Sval{Sval: ""}}, + want: `""`, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + ast, err := ivfLiteralToAST(tc.lit, plan.Type{Id: int32(types.T_varchar)}) + require.NoError(t, err) + sql := tree.StringWithOpts(ast, dialect.MYSQL, tree.WithQuoteString(true)) + require.Equal(t, tc.want, sql) + }) + } +} + +func TestCanDoIndexOnlyScan_CompositePrimaryKeyIsConservative(t *testing.T) { + tableDef := &plan.TableDef{ + Pkey: &plan.PrimaryKeyDef{ + PkeyColName: catalog.CPrimaryKeyColName, + Names: []string{"id1", "id2"}, + }, + } + + requiredCols := map[string]struct{}{ + "id1": {}, + } + assert.False(t, canDoIndexOnlyScan(requiredCols, tableDef, []string{"title"})) +} diff --git a/pkg/sql/plan/mock.go b/pkg/sql/plan/mock.go index 19a0d9c42a7d5..d6d932330ed73 100644 --- a/pkg/sql/plan/mock.go +++ b/pkg/sql/plan/mock.go @@ -488,6 +488,7 @@ func NewMockCompilerContext(isDml bool) *MockCompilerContext { {"ordinal_position", types.T_uint32, false, 50, 0}, {"options", types.T_text, true, 50, 0}, {"index_table_name", types.T_varchar, true, 50, 0}, + {"included_columns", types.T_text, true, 50, 0}, {catalog.Row_ID, types.T_Rowid, false, 16, 0}, }, pks: []int{0}, diff --git a/pkg/sql/plan/query_builder.go b/pkg/sql/plan/query_builder.go index f379b3aa2d849..2b938183bb2b0 100644 --- a/pkg/sql/plan/query_builder.go +++ b/pkg/sql/plan/query_builder.go @@ -5476,7 +5476,7 @@ func (builder *QueryBuilder) GetContext() context.Context { // parseRankOption parses rank options from a map of option key-value pairs. // It extracts the "mode" option case-insensitively and validates it. // Returns a RankOption with the parsed mode if valid, or nil if no mode is specified. -// Returns an error if the mode value is invalid (must be "pre", "post", or "force"). +// Returns an error if the mode value is invalid (must be "pre", "post", "force", or "include"). func parseRankOption(options map[string]string, ctx context.Context) (*plan.RankOption, error) { if len(options) == 0 { return nil, nil @@ -5501,9 +5501,10 @@ func parseRankOption(options map[string]string, ctx context.Context) (*plan.Rank // - "pre": Enable vector index with BloomFilter pushdown // - "post": Enable vector index with standard behavior (post-filtering) // - "force": Force disable vector index, use full table scan + // - "include": Enable explicit include-aware IVF optimization // - "auto": Adaptive mode that automatically selects the best strategy - if modeLower != "pre" && modeLower != "post" && modeLower != "force" && modeLower != "auto" { - return nil, moerr.NewInvalidInputf(ctx, "mode must be 'pre', 'post', 'force', or 'auto', got '%s'", mode) + if modeLower != "pre" && modeLower != "post" && modeLower != "force" && modeLower != "include" && modeLower != "auto" { + return nil, moerr.NewInvalidInputf(ctx, "mode must be 'pre', 'post', 'force', 'auto', or 'include', got '%s'", mode) } rankOption.Mode = modeLower } diff --git a/pkg/sql/plan/query_builder_test.go b/pkg/sql/plan/query_builder_test.go index bd867007494e2..ffc87cf0ece43 100644 --- a/pkg/sql/plan/query_builder_test.go +++ b/pkg/sql/plan/query_builder_test.go @@ -1499,7 +1499,7 @@ func TestParseRankOption(t *testing.T) { rankOption, err := parseRankOption(options, ctx) require.Error(t, err) require.Nil(t, rankOption) - require.Contains(t, err.Error(), "mode must be 'pre', 'post', 'force', or 'auto'") + require.Contains(t, err.Error(), "mode must be 'pre', 'post', 'force', 'auto', or 'include'") require.Contains(t, err.Error(), "invalid") }) @@ -1513,6 +1513,26 @@ func TestParseRankOption(t *testing.T) { require.Equal(t, "force", rankOption.Mode) }) + t.Run("valid mode include", func(t *testing.T) { + options := map[string]string{ + "mode": "include", + } + rankOption, err := parseRankOption(options, ctx) + require.NoError(t, err) + require.NotNil(t, rankOption) + require.Equal(t, "include", rankOption.Mode) + }) + + t.Run("valid mode auto", func(t *testing.T) { + options := map[string]string{ + "mode": "auto", + } + rankOption, err := parseRankOption(options, ctx) + require.NoError(t, err) + require.NotNil(t, rankOption) + require.Equal(t, "auto", rankOption.Mode) + }) + t.Run("empty options map", func(t *testing.T) { options := map[string]string{} rankOption, err := parseRankOption(options, ctx) diff --git a/pkg/sql/plan/types.go b/pkg/sql/plan/types.go index ae215202ac012..e3e3ee7acc86e 100644 --- a/pkg/sql/plan/types.go +++ b/pkg/sql/plan/types.go @@ -510,6 +510,7 @@ type OriginTableMessageForFuzzy struct { type MultiTableIndex struct { IndexAlgo string IndexAlgoParams string + LogicalDef *plan.IndexDef IndexDefs map[string]*plan.IndexDef } diff --git a/pkg/sql/plan/vector_index_cagra.go b/pkg/sql/plan/vector_index_cagra.go new file mode 100644 index 0000000000000..e8154f9f5aaaa --- /dev/null +++ b/pkg/sql/plan/vector_index_cagra.go @@ -0,0 +1,87 @@ +// Copyright 2026 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 plan + +import ( + "github.com/matrixorigin/matrixone/pkg/container/types" + planpb "github.com/matrixorigin/matrixone/pkg/pb/plan" +) + +// buildCagraTableFuncArgs defines the planner-side positional contract for a +// future cagra_search table function: +// - arg 0: index table config JSON +// - arg 1: query vector +// - arg 2: optional filter JSON lowered from covered planner filters +func buildCagraTableFuncArgs(tblCfgStr string, vecLitArg *planpb.Expr, filterJSON string) []*planpb.Expr { + args := []*planpb.Expr{ + { + Typ: planpb.Type{ + Id: int32(types.T_varchar), + }, + Expr: &planpb.Expr_Lit{ + Lit: &planpb.Literal{ + Value: &planpb.Literal_Sval{ + Sval: tblCfgStr, + }, + }, + }, + }, + DeepCopyExpr(vecLitArg), + } + + if filterJSON != "" { + args = append(args, makePlan2StringConstExprWithType(filterJSON)) + } + return args +} + +// prepareCagraFilterPushdown is the planner-side handoff boundary for a future +// CAGRA runtime. It first selects filter-capable predicates using the logical +// IncludedColumns contract, then lowers only those covered predicates into the +// name-based JSON payload expected by cagra_search(cfg, vec, filter_json?). +func prepareCagraFilterPushdown( + filters []*planpb.Expr, + scanNode *planpb.Node, + multiTableIndex *MultiTableIndex, + partPos int32, +) (string, []*planpb.Expr, []*planpb.Expr, error) { + candidateFilters, _ := splitFiltersByVectorIndexCoverage( + filters, + scanNode, + getVectorIndexIncludedColumns(multiTableIndex), + partPos, + ) + + filterJSON, pushdownFilters, _, err := lowerFiltersToCagraJSON(candidateFilters, scanNode, partPos) + if err != nil { + return "", nil, nil, err + } + + pushdownCounts := make(map[*planpb.Expr]int, len(pushdownFilters)) + for _, filter := range pushdownFilters { + pushdownCounts[filter]++ + } + + residualFilters := make([]*planpb.Expr, 0, len(filters)-len(pushdownFilters)) + for _, filter := range filters { + if pushdownCounts[filter] > 0 { + pushdownCounts[filter]-- + continue + } + residualFilters = append(residualFilters, filter) + } + + return filterJSON, pushdownFilters, residualFilters, nil +} diff --git a/pkg/sql/plan/vector_index_filter_lowering.go b/pkg/sql/plan/vector_index_filter_lowering.go new file mode 100644 index 0000000000000..b77b087239330 --- /dev/null +++ b/pkg/sql/plan/vector_index_filter_lowering.go @@ -0,0 +1,366 @@ +// Copyright 2026 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 plan + +import ( + "encoding/json" + "strings" + + planpb "github.com/matrixorigin/matrixone/pkg/pb/plan" +) + +type hnswFilterPayload struct { + Version int `json:"version"` + Conj string `json:"conj"` + Exprs []*hnswFilterExpr `json:"exprs,omitempty"` + ColumnMode string `json:"column_mode"` +} + +type hnswFilterExpr struct { + Kind string `json:"kind"` + Op string `json:"op,omitempty"` + Column string `json:"column,omitempty"` + Value any `json:"value,omitempty"` + Args []*hnswFilterExpr `json:"args,omitempty"` +} + +type cagraFilterPredicate struct { + Column string `json:"col"` + Op string `json:"op"` + Val any `json:"val,omitempty"` + Vals []any `json:"vals,omitempty"` + Lo any `json:"lo,omitempty"` + Hi any `json:"hi,omitempty"` +} + +// lowerFiltersToHnswPayload defines HNSW's filter payload boundary. It keeps +// the backend payload as a named expression tree, never as planner binding +// coordinates. Runtime integration can consume this payload without exposing +// RelPos/ColPos outside planner lowering. +func lowerFiltersToHnswPayload(filters []*planpb.Expr, scanNode *planpb.Node, partPos int32) (string, []*planpb.Expr, []*planpb.Expr, error) { + if scanNode == nil || scanNode.TableDef == nil || len(scanNode.BindingTags) == 0 { + return "", nil, filters, nil + } + + scanTag := scanNode.BindingTags[0] + payload := hnswFilterPayload{ + Version: 1, + Conj: "and", + ColumnMode: "logical_name", + Exprs: make([]*hnswFilterExpr, 0, len(filters)), + } + pushdown := make([]*planpb.Expr, 0, len(filters)) + remaining := make([]*planpb.Expr, 0, len(filters)) + + for _, filter := range filters { + expr, ok := lowerExprToHnswFilterExpr(filter, scanNode, scanTag, partPos) + if !ok { + remaining = append(remaining, filter) + continue + } + payload.Exprs = append(payload.Exprs, expr) + pushdown = append(pushdown, filter) + } + if len(payload.Exprs) == 0 { + return "", nil, remaining, nil + } + + bytes, err := json.Marshal(payload) + if err != nil { + return "", nil, nil, err + } + return string(bytes), pushdown, remaining, nil +} + +func lowerExprToHnswFilterExpr(expr *planpb.Expr, scanNode *planpb.Node, scanTag, partPos int32) (*hnswFilterExpr, bool) { + if expr == nil { + return &hnswFilterExpr{Kind: "literal", Value: true}, true + } + + switch impl := expr.Expr.(type) { + case *planpb.Expr_Col: + colName, ok := vectorIndexColumnNameFromColRef(impl.Col, scanNode, scanTag) + if !ok { + return nil, false + } + return &hnswFilterExpr{Kind: "column", Column: colName}, true + case *planpb.Expr_Lit: + val, ok := vectorIndexLiteralPayloadValue(impl.Lit) + if !ok { + return nil, false + } + return &hnswFilterExpr{Kind: "literal", Value: val}, true + case *planpb.Expr_List: + args := make([]*hnswFilterExpr, 0, len(impl.List.List)) + for _, item := range impl.List.List { + lowered, ok := lowerExprToHnswFilterExpr(item, scanNode, scanTag, partPos) + if !ok { + return nil, false + } + args = append(args, lowered) + } + return &hnswFilterExpr{Kind: "list", Args: args}, true + case *planpb.Expr_F: + if isVectorDistanceExpr(expr, scanTag, partPos) || impl.F == nil || impl.F.Func == nil || impl.F.Func.ObjName == "" { + return nil, false + } + args := make([]*hnswFilterExpr, 0, len(impl.F.Args)) + for _, arg := range impl.F.Args { + lowered, ok := lowerExprToHnswFilterExpr(arg, scanNode, scanTag, partPos) + if !ok { + return nil, false + } + args = append(args, lowered) + } + return &hnswFilterExpr{Kind: "func", Op: strings.ToLower(impl.F.Func.ObjName), Args: args}, true + default: + return nil, false + } +} + +// lowerFiltersToCagraJSON defines the planner-side CAGRA JSON predicate +// contract. The JSON uses logical column names; a future CAGRA runtime can map +// names to include-column ordinals while keeping planner binding coordinates +// private to this lowering layer. +func lowerFiltersToCagraJSON(filters []*planpb.Expr, scanNode *planpb.Node, partPos int32) (string, []*planpb.Expr, []*planpb.Expr, error) { + if scanNode == nil || scanNode.TableDef == nil || len(scanNode.BindingTags) == 0 { + return "", nil, filters, nil + } + + scanTag := scanNode.BindingTags[0] + predicates := make([]cagraFilterPredicate, 0, len(filters)) + pushdown := make([]*planpb.Expr, 0, len(filters)) + remaining := make([]*planpb.Expr, 0, len(filters)) + + for _, filter := range filters { + start := len(predicates) + if !appendCagraPredicatesFromExpr(filter, scanNode, scanTag, partPos, &predicates) { + predicates = predicates[:start] + remaining = append(remaining, filter) + continue + } + pushdown = append(pushdown, filter) + } + if len(predicates) == 0 { + return "", nil, remaining, nil + } + + bytes, err := json.Marshal(predicates) + if err != nil { + return "", nil, nil, err + } + return string(bytes), pushdown, remaining, nil +} + +func appendCagraPredicatesFromExpr(expr *planpb.Expr, scanNode *planpb.Node, scanTag, partPos int32, out *[]cagraFilterPredicate) bool { + if expr == nil { + return false + } + fn := expr.GetF() + if fn == nil || fn.Func == nil || fn.Func.ObjName == "" || isVectorDistanceExpr(expr, scanTag, partPos) { + return false + } + + fnName := strings.ToLower(fn.Func.ObjName) + args := fn.Args + switch fnName { + case "and": + if len(args) != 2 { + return false + } + return appendCagraPredicatesFromExpr(args[0], scanNode, scanTag, partPos, out) && + appendCagraPredicatesFromExpr(args[1], scanNode, scanTag, partPos, out) + case "=", "!=", "<>", "<", "<=", ">", ">=": + if len(args) != 2 { + return false + } + column, val, op, ok := cagraComparisonArgs(fnName, args[0], args[1], scanNode, scanTag) + if !ok { + return false + } + *out = append(*out, cagraFilterPredicate{Column: column, Op: op, Val: val}) + return true + case "between": + if len(args) != 3 { + return false + } + column, ok := cagraColumnNameFromExpr(args[0], scanNode, scanTag) + if !ok { + return false + } + lo, ok := cagraLiteralValueFromExpr(args[1]) + if !ok { + return false + } + hi, ok := cagraLiteralValueFromExpr(args[2]) + if !ok { + return false + } + *out = append(*out, cagraFilterPredicate{Column: column, Op: "between", Lo: lo, Hi: hi}) + return true + case "in", "partition_in": + if len(args) < 2 { + return false + } + column, ok := cagraColumnNameFromExpr(args[0], scanNode, scanTag) + if !ok { + return false + } + vals, ok := cagraLiteralList(args[1:]) + if !ok { + return false + } + *out = append(*out, cagraFilterPredicate{Column: column, Op: "in", Vals: vals}) + return true + default: + return false + } +} + +func cagraComparisonArgs(fnName string, left, right *planpb.Expr, scanNode *planpb.Node, scanTag int32) (string, any, string, bool) { + if column, ok := cagraColumnNameFromExpr(left, scanNode, scanTag); ok { + val, ok := cagraLiteralValueFromExpr(right) + return column, val, normalizeCagraComparisonOp(fnName), ok + } + if column, ok := cagraColumnNameFromExpr(right, scanNode, scanTag); ok { + val, ok := cagraLiteralValueFromExpr(left) + return column, val, flipCagraComparisonOp(fnName), ok + } + return "", nil, "", false +} + +func cagraColumnNameFromExpr(expr *planpb.Expr, scanNode *planpb.Node, scanTag int32) (string, bool) { + if expr == nil { + return "", false + } + col := expr.GetCol() + if col == nil { + return "", false + } + return vectorIndexColumnNameFromColRef(col, scanNode, scanTag) +} + +func cagraLiteralValueFromExpr(expr *planpb.Expr) (any, bool) { + if expr == nil { + return nil, false + } + lit := expr.GetLit() + if lit == nil { + return nil, false + } + return vectorIndexLiteralPayloadValue(lit) +} + +func cagraLiteralList(exprs []*planpb.Expr) ([]any, bool) { + if len(exprs) == 1 { + if list := exprs[0].GetList(); list != nil { + return cagraLiteralList(list.List) + } + } + + vals := make([]any, 0, len(exprs)) + for _, expr := range exprs { + val, ok := cagraLiteralValueFromExpr(expr) + if !ok { + return nil, false + } + vals = append(vals, val) + } + return vals, true +} + +func normalizeCagraComparisonOp(op string) string { + if op == "<>" { + return "!=" + } + return op +} + +func flipCagraComparisonOp(op string) string { + switch op { + case "<": + return ">" + case "<=": + return ">=" + case ">": + return "<" + case ">=": + return "<=" + default: + return normalizeCagraComparisonOp(op) + } +} + +func vectorIndexLiteralPayloadValue(lit *planpb.Literal) (any, bool) { + if lit == nil { + return nil, false + } + if lit.Isnull { + return nil, true + } + + switch v := lit.Value.(type) { + case *planpb.Literal_I8Val: + return int64(int8(v.I8Val)), true + case *planpb.Literal_I16Val: + return int64(int16(v.I16Val)), true + case *planpb.Literal_I32Val: + return int64(v.I32Val), true + case *planpb.Literal_I64Val: + return v.I64Val, true + case *planpb.Literal_U8Val: + return uint64(uint8(v.U8Val)), true + case *planpb.Literal_U16Val: + return uint64(uint16(v.U16Val)), true + case *planpb.Literal_U32Val: + return uint64(v.U32Val), true + case *planpb.Literal_U64Val: + return v.U64Val, true + case *planpb.Literal_Fval: + return float64(v.Fval), true + case *planpb.Literal_Dval: + return v.Dval, true + case *planpb.Literal_Sval: + return v.Sval, true + case *planpb.Literal_Bval: + return v.Bval, true + case *planpb.Literal_Dateval: + return v.Dateval, true + case *planpb.Literal_Timeval: + return v.Timeval, true + case *planpb.Literal_Datetimeval: + return v.Datetimeval, true + case *planpb.Literal_Timestampval: + return v.Timestampval, true + case *planpb.Literal_Jsonval: + return v.Jsonval, true + case *planpb.Literal_EnumVal: + return v.EnumVal, true + case *planpb.Literal_VecVal: + return v.VecVal, true + case *planpb.Literal_Decimal64Val: + if v.Decimal64Val == nil { + return nil, false + } + return v.Decimal64Val.String(), true + case *planpb.Literal_Decimal128Val: + if v.Decimal128Val == nil { + return nil, false + } + return v.Decimal128Val.String(), true + default: + return nil, false + } +} diff --git a/pkg/sql/plan/vector_index_filter_lowering_test.go b/pkg/sql/plan/vector_index_filter_lowering_test.go new file mode 100644 index 0000000000000..9abaad41f5753 --- /dev/null +++ b/pkg/sql/plan/vector_index_filter_lowering_test.go @@ -0,0 +1,170 @@ +// Copyright 2026 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 plan + +import ( + "encoding/json" + "testing" + + "github.com/matrixorigin/matrixone/pkg/container/types" + planpb "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/stretchr/testify/require" +) + +func TestVectorIndexBackendLoweringUsesLogicalColumnNames(t *testing.T) { + _, _, scanNode, _, _ := newIvfIncludeModeTestBuilder(t) + scanTag := scanNode.BindingTags[0] + categoryGE := makeIvfHelperFnExpr( + ">=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), + MakePlan2Int32ConstExprWithType(20), + ) + + hnswPayload, hnswPushdown, hnswRemaining, err := lowerFiltersToHnswPayload([]*Expr{categoryGE}, scanNode, 1) + require.NoError(t, err) + require.Len(t, hnswPushdown, 1) + require.Empty(t, hnswRemaining) + require.NotContains(t, hnswPayload, "RelPos") + require.NotContains(t, hnswPayload, "ColPos") + require.NotContains(t, hnswPayload, "rel_pos") + require.NotContains(t, hnswPayload, "col_pos") + + var hnswPayloadObj hnswFilterPayload + require.NoError(t, json.Unmarshal([]byte(hnswPayload), &hnswPayloadObj)) + require.Equal(t, "logical_name", hnswPayloadObj.ColumnMode) + require.Equal(t, "category", hnswPayloadObj.Exprs[0].Args[0].Column) + + cagraJSON, cagraPushdown, cagraRemaining, err := lowerFiltersToCagraJSON([]*Expr{categoryGE}, scanNode, 1) + require.NoError(t, err) + require.Len(t, cagraPushdown, 1) + require.Empty(t, cagraRemaining) + require.JSONEq(t, `[{"col":"category","op":">=","val":20}]`, cagraJSON) + require.NotContains(t, cagraJSON, "RelPos") + require.NotContains(t, cagraJSON, "ColPos") + require.NotContains(t, cagraJSON, "rel_pos") + require.NotContains(t, cagraJSON, "col_pos") +} + +func TestCagraLoweringKeepsUnsupportedBooleanTreesResidual(t *testing.T) { + _, _, scanNode, _, _ := newIvfIncludeModeTestBuilder(t) + scanTag := scanNode.BindingTags[0] + categoryGE := makeIvfHelperFnExpr( + ">=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), + MakePlan2Int32ConstExprWithType(20), + ) + titleEq := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 2, scanNode.TableDef), + makePlan2StringConstExprWithType("alpha"), + ) + orExpr := makeIvfHelperFnExpr("or", Type{Id: int32(types.T_bool)}, categoryGE, titleEq) + + payload, pushdown, remaining, err := lowerFiltersToCagraJSON([]*planpb.Expr{orExpr}, scanNode, 1) + require.NoError(t, err) + require.Empty(t, payload) + require.Empty(t, pushdown) + require.Equal(t, []*planpb.Expr{orExpr}, remaining) +} + +func TestCagraLoweringSupportsAndBetweenAndIn(t *testing.T) { + _, _, scanNode, _, _ := newIvfIncludeModeTestBuilder(t) + scanTag := scanNode.BindingTags[0] + betweenExpr := makeIvfHelperFnExpr( + "between", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), + MakePlan2Int32ConstExprWithType(10), + MakePlan2Int32ConstExprWithType(30), + ) + inExpr := makeIvfHelperFnExpr( + "in", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 2, scanNode.TableDef), + makePlan2StringConstExprWithType("alpha"), + makePlan2StringConstExprWithType("beta"), + ) + andExpr := makeIvfHelperFnExpr("and", Type{Id: int32(types.T_bool)}, betweenExpr, inExpr) + + payload, pushdown, remaining, err := lowerFiltersToCagraJSON([]*planpb.Expr{andExpr}, scanNode, 1) + require.NoError(t, err) + require.Len(t, pushdown, 1) + require.Empty(t, remaining) + require.JSONEq(t, `[ + {"col":"category","op":"between","lo":10,"hi":30}, + {"col":"title","op":"in","vals":["alpha","beta"]} + ]`, payload) +} + +func TestPrepareCagraFilterPushdownUsesIncludedColumnsAndKeepsResiduals(t *testing.T) { + _, _, scanNode, _, multiTableIndex := newIvfIncludeModeTestBuilder(t) + scanTag := scanNode.BindingTags[0] + categoryGE := makeIvfHelperFnExpr( + ">=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), + MakePlan2Int32ConstExprWithType(20), + ) + titleEq := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 2, scanNode.TableDef), + makePlan2StringConstExprWithType("alpha"), + ) + noteEq := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 4, scanNode.TableDef), + makePlan2StringConstExprWithType("memo"), + ) + orCovered := makeIvfHelperFnExpr("or", Type{Id: int32(types.T_bool)}, titleEq, categoryGE) + filters := []*planpb.Expr{noteEq, orCovered, categoryGE} + + payload, pushdown, remaining, err := prepareCagraFilterPushdown(filters, scanNode, multiTableIndex, 1) + require.NoError(t, err) + require.Equal(t, []*planpb.Expr{categoryGE}, pushdown) + require.Equal(t, []*planpb.Expr{noteEq, orCovered}, remaining) + require.JSONEq(t, `[{"col":"category","op":">=","val":20}]`, payload) +} + +func TestBuildCagraTableFuncArgsMakesFilterJSONOptional(t *testing.T) { + vecLitArg := &planpb.Expr{ + Typ: Type{Id: int32(types.T_array_float32)}, + Expr: &planpb.Expr_Lit{ + Lit: &planpb.Literal{ + Value: &planpb.Literal_VecVal{ + VecVal: "[0,1,0]", + }, + }, + }, + } + + argsWithoutFilter := buildCagraTableFuncArgs(`{"index":"idx_products"}`, vecLitArg, "") + require.Len(t, argsWithoutFilter, 2) + require.Equal(t, `{"index":"idx_products"}`, argsWithoutFilter[0].GetLit().GetSval()) + require.Equal(t, "[0,1,0]", argsWithoutFilter[1].GetLit().GetVecVal()) + require.NotSame(t, vecLitArg, argsWithoutFilter[1]) + + argsWithFilter := buildCagraTableFuncArgs( + `{"index":"idx_products"}`, + vecLitArg, + `[{"col":"category","op":"=","val":2}]`, + ) + require.Len(t, argsWithFilter, 3) + require.Equal(t, `[{"col":"category","op":"=","val":2}]`, argsWithFilter[2].GetLit().GetSval()) +} diff --git a/pkg/sql/plan/vector_index_filter_split.go b/pkg/sql/plan/vector_index_filter_split.go new file mode 100644 index 0000000000000..f3841fa823297 --- /dev/null +++ b/pkg/sql/plan/vector_index_filter_split.go @@ -0,0 +1,140 @@ +// Copyright 2026 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 plan + +import ( + "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/vectorindex/metric" +) + +// Vector index filter pushdown uses bound plan.Expr as the planner-only public +// IR. Backend payloads must pass through a lowering function that resolves +// ColRef.RelPos/ColPos to a stable logical column name first. + +func buildVectorIndexCoveredColumns(tableDef *plan.TableDef, includeColumns []string) map[string]struct{} { + covered := make(map[string]struct{}, len(includeColumns)+1) + for _, col := range includeColumns { + covered[col] = struct{}{} + } + + // Only a real single-column primary key is naturally covered. Composite + // primary keys expose a hidden cpkey column, which must stay residual. + if tableDef != nil && tableDef.Pkey != nil && len(tableDef.Pkey.Names) == 1 { + covered[tableDef.Pkey.PkeyColName] = struct{}{} + } + return covered +} + +func splitFiltersByVectorIndexCoverage( + filters []*plan.Expr, + scanNode *plan.Node, + includeColumns []string, + partPos int32, +) (pushdownFilters, remainingFilters []*plan.Expr) { + if scanNode == nil || scanNode.TableDef == nil || len(scanNode.BindingTags) == 0 { + return nil, filters + } + + covered := buildVectorIndexCoveredColumns(scanNode.TableDef, includeColumns) + scanTag := scanNode.BindingTags[0] + for _, expr := range filters { + if vectorIndexExprRefsOnlyCoveredColumns(expr, scanTag, partPos, scanNode.TableDef, covered) { + pushdownFilters = append(pushdownFilters, expr) + } else { + remainingFilters = append(remainingFilters, expr) + } + } + return pushdownFilters, remainingFilters +} + +func vectorIndexColumnNameFromColRef(col *plan.ColRef, scanNode *plan.Node, scanTag int32) (string, bool) { + if col == nil || scanNode == nil || scanNode.TableDef == nil { + return "", false + } + return vectorIndexColumnNameFromTableDef(col, scanNode.TableDef, scanTag) +} + +func vectorIndexColumnNameFromTableDef(col *plan.ColRef, tableDef *plan.TableDef, scanTag int32) (string, bool) { + if col == nil || tableDef == nil { + return "", false + } + if col.RelPos != scanTag { + return "", false + } + if col.ColPos < 0 || int(col.ColPos) >= len(tableDef.Cols) { + return "", false + } + return tableDef.Cols[col.ColPos].Name, true +} + +func vectorIndexExprRefsOnlyCoveredColumns(expr *plan.Expr, scanTag, partPos int32, tableDef *plan.TableDef, covered map[string]struct{}) bool { + if expr == nil { + return true + } + + switch impl := expr.Expr.(type) { + case *plan.Expr_Col: + colName, ok := vectorIndexColumnNameFromTableDef(impl.Col, tableDef, scanTag) + if !ok { + return false + } + _, ok = covered[colName] + return ok + case *plan.Expr_F: + if isVectorDistanceExpr(expr, scanTag, partPos) { + return false + } + for _, arg := range impl.F.Args { + if !vectorIndexExprRefsOnlyCoveredColumns(arg, scanTag, partPos, tableDef, covered) { + return false + } + } + return true + case *plan.Expr_Lit: + return true + case *plan.Expr_List: + for _, sub := range impl.List.List { + if !vectorIndexExprRefsOnlyCoveredColumns(sub, scanTag, partPos, tableDef, covered) { + return false + } + } + return true + case *plan.Expr_T: + return true + default: + return false + } +} + +func isVectorDistanceExpr(expr *plan.Expr, scanTag, partPos int32) bool { + fn := expr.GetF() + if fn == nil { + return false + } + if _, ok := metric.DistFuncOpTypes[fn.Func.ObjName]; !ok { + return false + } + if len(fn.Args) != 2 { + return false + } + + for _, arg := range fn.Args { + col := arg.GetCol() + if col != nil && col.RelPos == scanTag && col.ColPos == partPos { + return true + } + } + return false +} diff --git a/pkg/sql/plan/vector_index_filter_split_test.go b/pkg/sql/plan/vector_index_filter_split_test.go new file mode 100644 index 0000000000000..2f131f20973e9 --- /dev/null +++ b/pkg/sql/plan/vector_index_filter_split_test.go @@ -0,0 +1,141 @@ +// Copyright 2026 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 plan + +import ( + "testing" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/container/types" + planpb "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/stretchr/testify/require" +) + +func TestSplitFiltersByVectorIndexCoverageBooleanTreesAndDistance(t *testing.T) { + _, _, scanNode, _, _ := newIvfIncludeModeTestBuilder(t) + scanTag := scanNode.BindingTags[0] + + idEq := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 0, scanNode.TableDef), + makePlan2Int64ConstExprWithType(1), + ) + titleEq := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 2, scanNode.TableDef), + makePlan2StringConstExprWithType("alpha"), + ) + categoryEq := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 3, scanNode.TableDef), + MakePlan2Int32ConstExprWithType(20), + ) + noteEq := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 4, scanNode.TableDef), + makePlan2StringConstExprWithType("memo"), + ) + crossRelTitleEq := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag+1, 2, scanNode.TableDef), + makePlan2StringConstExprWithType("alpha"), + ) + distanceFilter := makeIvfHelperFnExpr( + "<", + Type{Id: int32(types.T_bool)}, + makeIvfHelperFnExpr( + "l2_distance", + Type{Id: int32(types.T_float64)}, + makeIvfHelperColExpr(scanTag, 1, scanNode.TableDef), + &Expr{ + Typ: Type{Id: int32(types.T_array_float32)}, + Expr: &planpb.Expr_Lit{ + Lit: &planpb.Literal{Value: &planpb.Literal_VecVal{VecVal: "[1,1,1]"}}, + }, + }, + ), + MakePlan2Float64ConstExprWithType(0.5), + ) + + andCovered := makeIvfHelperFnExpr("and", Type{Id: int32(types.T_bool)}, titleEq, categoryEq) + andPartial := makeIvfHelperFnExpr("and", Type{Id: int32(types.T_bool)}, titleEq, noteEq) + orCovered := makeIvfHelperFnExpr("or", Type{Id: int32(types.T_bool)}, titleEq, categoryEq) + orPartial := makeIvfHelperFnExpr("or", Type{Id: int32(types.T_bool)}, titleEq, noteEq) + notCovered := makeIvfHelperFnExpr("not", Type{Id: int32(types.T_bool)}, categoryEq) + notPartial := makeIvfHelperFnExpr("not", Type{Id: int32(types.T_bool)}, noteEq) + + filters := []*Expr{ + idEq, + titleEq, + categoryEq, + andCovered, + orCovered, + notCovered, + noteEq, + crossRelTitleEq, + distanceFilter, + andPartial, + orPartial, + notPartial, + } + pushdown, remaining := splitFiltersByVectorIndexCoverage(filters, scanNode, []string{"title", "category"}, 1) + + require.Equal(t, []*Expr{idEq, titleEq, categoryEq, andCovered, orCovered, notCovered}, pushdown) + require.Equal(t, []*Expr{noteEq, crossRelTitleEq, distanceFilter, andPartial, orPartial, notPartial}, remaining) +} + +func TestVectorIndexCoverageDoesNotTreatCompositePkHiddenColumnAsCovered(t *testing.T) { + _, _, scanNode, _, _ := newIvfIncludeModeTestBuilder(t) + scanTag := scanNode.BindingTags[0] + tableDef := DeepCopyTableDef(scanNode.TableDef, true) + cpkeyPos := int32(len(tableDef.Cols)) + tableDef.Cols = append(tableDef.Cols, &ColDef{ + Name: catalog.CPrimaryKeyColName, + Typ: Type{Id: int32(types.T_varchar)}, + }) + tableDef.Name2ColIndex[catalog.CPrimaryKeyColName] = cpkeyPos + tableDef.Pkey = &PrimaryKeyDef{ + PkeyColName: catalog.CPrimaryKeyColName, + Names: []string{"id", "category"}, + } + + compositeScan := &Node{ + NodeType: planpb.Node_TABLE_SCAN, + TableDef: tableDef, + BindingTags: []int32{scanTag}, + } + cpkeyEq := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, cpkeyPos, tableDef), + makePlan2StringConstExprWithType("encoded"), + ) + categoryEq := makeIvfHelperFnExpr( + "=", + Type{Id: int32(types.T_bool)}, + makeIvfHelperColExpr(scanTag, 3, tableDef), + MakePlan2Int32ConstExprWithType(20), + ) + + pushdown, remaining := splitFiltersByVectorIndexCoverage([]*Expr{cpkeyEq, categoryEq}, compositeScan, []string{"title", "category"}, 1) + require.Equal(t, []*Expr{categoryEq}, pushdown) + require.Equal(t, []*Expr{cpkeyEq}, remaining) + require.False(t, canDoIndexOnlyScan(map[string]struct{}{catalog.CPrimaryKeyColName: {}}, tableDef, []string{"title", "category"})) +} diff --git a/pkg/sql/plan/vector_index_logical_test.go b/pkg/sql/plan/vector_index_logical_test.go new file mode 100644 index 0000000000000..ab72849418a7d --- /dev/null +++ b/pkg/sql/plan/vector_index_logical_test.go @@ -0,0 +1,112 @@ +// Copyright 2026 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 plan + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/matrixorigin/matrixone/pkg/catalog" + planpb "github.com/matrixorigin/matrixone/pkg/pb/plan" +) + +func makeVectorIndexDefForLogicalTest(name, algo, algoTableType string, parts, included []string) *planpb.IndexDef { + return &planpb.IndexDef{ + IndexName: name, + IndexAlgo: algo, + IndexAlgoTableType: algoTableType, + IndexAlgoParams: `{"op_type":"vector_l2_ops"}`, + Parts: append([]string(nil), parts...), + IncludedColumns: append([]string(nil), included...), + Comment: "logical-comment", + Visible: true, + } +} + +func TestCollectVectorIndexesConstructsLogicalDef(t *testing.T) { + builder := NewQueryBuilder(planpb.Query_SELECT, NewMockCompilerContext(true), false, true) + metaDef := makeVectorIndexDefForLogicalTest("idx_vec", catalog.MoIndexIvfFlatAlgo.ToString(), catalog.SystemSI_IVFFLAT_TblType_Metadata, []string{"embedding"}, []string{"title", "category"}) + centroidsDef := makeVectorIndexDefForLogicalTest("idx_vec", catalog.MoIndexIvfFlatAlgo.ToString(), catalog.SystemSI_IVFFLAT_TblType_Centroids, []string{"embedding"}, []string{"title", "category"}) + entriesDef := makeVectorIndexDefForLogicalTest("idx_vec", catalog.MoIndexIvfFlatAlgo.ToString(), catalog.SystemSI_IVFFLAT_TblType_Entries, []string{"embedding"}, []string{"title", "category"}) + + indexes := builder.collectVectorIndexes(&planpb.Node{ + TableDef: &planpb.TableDef{ + Indexes: []*planpb.IndexDef{metaDef, centroidsDef, entriesDef}, + }, + }) + + multi, ok := indexes["idx_vec"] + require.True(t, ok) + require.NotNil(t, multi.LogicalDef) + require.NotSame(t, metaDef, multi.LogicalDef) + require.NotSame(t, centroidsDef, multi.LogicalDef) + require.NotSame(t, entriesDef, multi.LogicalDef) + require.Equal(t, catalog.MoIndexIvfFlatAlgo.ToString(), getVectorIndexLogicalAlgo(multi)) + require.Equal(t, []string{"embedding"}, getVectorIndexLogicalParts(multi)) + require.Equal(t, []string{"title", "category"}, getVectorIndexIncludedColumns(multi)) + + entriesDef.IncludedColumns[0] = "mutated" + require.Equal(t, []string{"title", "category"}, multi.LogicalDef.IncludedColumns) + + included := getVectorIndexIncludedColumns(multi) + included[0] = "mutated-again" + require.Equal(t, []string{"title", "category"}, multi.LogicalDef.IncludedColumns) +} + +func TestCollectVectorIndexesRejectsInconsistentLogicalDef(t *testing.T) { + builder := NewQueryBuilder(planpb.Query_SELECT, NewMockCompilerContext(true), false, true) + metaDef := makeVectorIndexDefForLogicalTest("idx_vec", catalog.MoIndexIvfFlatAlgo.ToString(), catalog.SystemSI_IVFFLAT_TblType_Metadata, []string{"embedding"}, []string{"title", "category"}) + centroidsDef := makeVectorIndexDefForLogicalTest("idx_vec", catalog.MoIndexIvfFlatAlgo.ToString(), catalog.SystemSI_IVFFLAT_TblType_Centroids, []string{"embedding"}, []string{"title", "category"}) + entriesDef := makeVectorIndexDefForLogicalTest("idx_vec", catalog.MoIndexIvfFlatAlgo.ToString(), catalog.SystemSI_IVFFLAT_TblType_Entries, []string{"embedding"}, []string{"title"}) + + indexes := builder.collectVectorIndexes(&planpb.Node{ + TableDef: &planpb.TableDef{ + Indexes: []*planpb.IndexDef{metaDef, centroidsDef, entriesDef}, + }, + }) + + require.NotContains(t, indexes, "idx_vec") +} + +func TestVectorIndexLogicalHelpersConstructFromExistingGroup(t *testing.T) { + multi := &MultiTableIndex{ + IndexDefs: map[string]*planpb.IndexDef{ + catalog.Hnsw_TblType_Metadata: makeVectorIndexDefForLogicalTest("idx_hnsw", catalog.MoIndexHnswAlgo.ToString(), catalog.Hnsw_TblType_Metadata, []string{"embedding"}, []string{"title"}), + catalog.Hnsw_TblType_Storage: makeVectorIndexDefForLogicalTest("idx_hnsw", catalog.MoIndexHnswAlgo.ToString(), catalog.Hnsw_TblType_Storage, []string{"embedding"}, []string{"title"}), + }, + } + + require.Equal(t, catalog.MoIndexHnswAlgo.ToString(), getVectorIndexLogicalAlgo(multi)) + require.Equal(t, []string{"embedding"}, getVectorIndexLogicalParts(multi)) + require.Equal(t, []string{"title"}, getVectorIndexIncludedColumns(multi)) + require.NotNil(t, multi.LogicalDef) +} + +func TestVectorIndexLogicalHelpersDoNotFallBackToPhysicalDefs(t *testing.T) { + multi := &MultiTableIndex{ + IndexAlgo: catalog.MoIndexIvfFlatAlgo.ToString(), + IndexDefs: map[string]*planpb.IndexDef{ + catalog.SystemSI_IVFFLAT_TblType_Metadata: makeVectorIndexDefForLogicalTest("idx_vec", catalog.MoIndexIvfFlatAlgo.ToString(), catalog.SystemSI_IVFFLAT_TblType_Metadata, []string{"embedding"}, []string{"title"}), + catalog.SystemSI_IVFFLAT_TblType_Centroids: makeVectorIndexDefForLogicalTest("idx_vec", catalog.MoIndexIvfFlatAlgo.ToString(), catalog.SystemSI_IVFFLAT_TblType_Centroids, []string{"embedding"}, []string{"title"}), + catalog.SystemSI_IVFFLAT_TblType_Entries: makeVectorIndexDefForLogicalTest("idx_vec", catalog.MoIndexIvfFlatAlgo.ToString(), catalog.SystemSI_IVFFLAT_TblType_Entries, []string{"embedding"}, []string{"category"}), + }, + } + + require.Nil(t, ensureVectorIndexLogicalDef(multi)) + require.Nil(t, getVectorIndexLogicalParts(multi)) + require.Nil(t, getVectorIndexIncludedColumns(multi)) + require.Equal(t, catalog.MoIndexIvfFlatAlgo.ToString(), getVectorIndexLogicalAlgo(multi)) +} diff --git a/pkg/txn/rpc/sender.go b/pkg/txn/rpc/sender.go index 0cef59bd25b62..f0028258b55bc 100644 --- a/pkg/txn/rpc/sender.go +++ b/pkg/txn/rpc/sender.go @@ -39,6 +39,7 @@ var ( // Keep backend send retries bounded so rollback/catalog RPCs fail in finite // time instead of stretching broken explicit txns for hours. defaultMaxWaitTimeOnRetryBackendSend = 30 * time.Second + minBackendAutoCreateWaitTimeout = time.Millisecond ) // WithSenderLocalDispatch set options for dispatch request to local to avoid rpc call @@ -277,14 +278,14 @@ func getBackendRetryWaitDuration(retryState *backendRetryState) (time.Duration, } func getBackendAutoCreateWaitTimeout() time.Duration { - if defaultWaitTimeOnRetryBackendSend <= 0 { - if defaultMaxWaitTimeOnRetryBackendSend > 0 { - return defaultMaxWaitTimeOnRetryBackendSend - } - return time.Millisecond - } if defaultMaxWaitTimeOnRetryBackendSend <= 0 { - return defaultWaitTimeOnRetryBackendSend + // A non-positive sender retry budget means "fail fast". Do not borrow the + // regular retry interval here, or morpc's auto-create wait/backoff can add + // an extra retry tick before sender-side retry handling stops the request. + return minBackendAutoCreateWaitTimeout + } + if defaultWaitTimeOnRetryBackendSend <= 0 { + return defaultMaxWaitTimeOnRetryBackendSend } if defaultWaitTimeOnRetryBackendSend < defaultMaxWaitTimeOnRetryBackendSend { return defaultWaitTimeOnRetryBackendSend diff --git a/pkg/txn/rpc/sender_test.go b/pkg/txn/rpc/sender_test.go index a92a6a2f8a3d7..5d4b152c94051 100644 --- a/pkg/txn/rpc/sender_test.go +++ b/pkg/txn/rpc/sender_test.go @@ -455,6 +455,19 @@ func TestSendStopsWhenBackendRetryBudgetExceeded(t *testing.T) { assert.Less(t, time.Since(start), oldWait) } +func TestGetBackendAutoCreateWaitTimeoutFailsFastWhenRetryBudgetDisabled(t *testing.T) { + oldWait := defaultWaitTimeOnRetryBackendSend + oldBudget := defaultMaxWaitTimeOnRetryBackendSend + defaultWaitTimeOnRetryBackendSend = 50 * time.Millisecond + defaultMaxWaitTimeOnRetryBackendSend = 0 + defer func() { + defaultWaitTimeOnRetryBackendSend = oldWait + defaultMaxWaitTimeOnRetryBackendSend = oldBudget + }() + + assert.Equal(t, minBackendAutoCreateWaitTimeout, getBackendAutoCreateWaitTimeout()) +} + func TestSendFailsFastWhenBackendRetryBudgetDisabled(t *testing.T) { assert.NoError(t, os.RemoveAll(testTN5Addr[7:])) diff --git a/pkg/vectorindex/cache/cache_test.go b/pkg/vectorindex/cache/cache_test.go index ce6712b7b7996..0776360066e68 100644 --- a/pkg/vectorindex/cache/cache_test.go +++ b/pkg/vectorindex/cache/cache_test.go @@ -118,6 +118,40 @@ func (m *MockSearchSearchError) UpdateConfig(newalgo VectorIndexSearchIf) error return nil } +type runtimeSearchCall struct { + RequestedIncludeColumns []string + PushdownFilterSQL string + SearchCursor *vectorindex.IvfSearchCursor +} + +type MockRuntimeSearch struct { + loads int + searchCalls []runtimeSearchCall +} + +func (m *MockRuntimeSearch) Search(proc *sqlexec.SqlProcess, query any, rt vectorindex.RuntimeConfig) (keys any, distances []float64, err error) { + m.searchCalls = append(m.searchCalls, runtimeSearchCall{ + RequestedIncludeColumns: append([]string(nil), rt.RequestedIncludeColumns...), + PushdownFilterSQL: rt.PushdownFilterSQL, + SearchCursor: rt.SearchCursor, + }) + if rt.SearchCursor != nil { + rt.SearchCursor.Round = uint(len(m.searchCalls)) + } + return []int64{1}, []float64{2.0}, nil +} + +func (m *MockRuntimeSearch) Destroy() {} + +func (m *MockRuntimeSearch) Load(*sqlexec.SqlProcess) error { + m.loads++ + return nil +} + +func (m *MockRuntimeSearch) UpdateConfig(newalgo VectorIndexSearchIf) error { + return nil +} + func TestCacheServe(t *testing.T) { proc := testutil.NewProcessWithMPool(t, "", mpool.MustNewZero()) sqlproc := sqlexec.NewSqlProcess(proc) @@ -383,3 +417,43 @@ func TestCacheSearchError(t *testing.T) { os.Stderr.WriteString("cache.Destroy end\n") Cache = nil } + +func TestCacheReuseKeepsRuntimeConfigQueryScoped(t *testing.T) { + proc := testutil.NewProcessWithMPool(t, "", mpool.MustNewZero()) + sqlproc := sqlexec.NewSqlProcess(proc) + + Cache = NewVectorIndexCache() + Cache.Once() + defer func() { + Cache.Destroy() + Cache = nil + }() + + cachedAlgo := &MockRuntimeSearch{} + _, _, err := Cache.Search(sqlproc, "__ivf_entries", cachedAlgo, []float32{1, 2, 3}, vectorindex.RuntimeConfig{ + Limit: 4, + RequestedIncludeColumns: []string{"title"}, + PushdownFilterSQL: "`__mo_index_include_title` = 'alpha'", + SearchCursor: &vectorindex.IvfSearchCursor{}, + }) + require.NoError(t, err) + + freshAlgo := &MockRuntimeSearch{} + _, _, err = Cache.Search(sqlproc, "__ivf_entries", freshAlgo, []float32{1, 2, 3}, vectorindex.RuntimeConfig{ + Limit: 4, + RequestedIncludeColumns: []string{"category"}, + PushdownFilterSQL: "", + SearchCursor: &vectorindex.IvfSearchCursor{}, + }) + require.NoError(t, err) + + require.Equal(t, 1, cachedAlgo.loads) + require.Zero(t, freshAlgo.loads) + require.Len(t, cachedAlgo.searchCalls, 2) + require.Equal(t, []string{"title"}, cachedAlgo.searchCalls[0].RequestedIncludeColumns) + require.Equal(t, "`__mo_index_include_title` = 'alpha'", cachedAlgo.searchCalls[0].PushdownFilterSQL) + require.Equal(t, uint(1), cachedAlgo.searchCalls[0].SearchCursor.Round) + require.Equal(t, []string{"category"}, cachedAlgo.searchCalls[1].RequestedIncludeColumns) + require.Empty(t, cachedAlgo.searchCalls[1].PushdownFilterSQL) + require.Equal(t, uint(2), cachedAlgo.searchCalls[1].SearchCursor.Round) +} diff --git a/pkg/vectorindex/ivfflat/search.go b/pkg/vectorindex/ivfflat/search.go index 00d15da059a3e..988959dce4aad 100644 --- a/pkg/vectorindex/ivfflat/search.go +++ b/pkg/vectorindex/ivfflat/search.go @@ -17,7 +17,9 @@ package ivfflat import ( "fmt" "math/rand/v2" + "sort" "strconv" + "strings" "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/common/bloomfilter" @@ -26,6 +28,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/container/types" "github.com/matrixorigin/matrixone/pkg/container/vector" "github.com/matrixorigin/matrixone/pkg/logutil" + "github.com/matrixorigin/matrixone/pkg/pb/plan" "github.com/matrixorigin/matrixone/pkg/vectorindex" "github.com/matrixorigin/matrixone/pkg/vectorindex/brute_force" "github.com/matrixorigin/matrixone/pkg/vectorindex/cache" @@ -289,6 +292,30 @@ func (idx *IvfflatSearchIndex[T]) getCentroidsSum(centroids_ids []int64, nlists return uint64(idx.Meta.DataSize * int64(len(centroids_ids)) / int64(nlists)) } +func (idx *IvfflatSearchIndex[T]) rankCentroids(sqlproc *sqlexec.SqlProcess, query []T, idxcfg vectorindex.IndexConfig) ([]int64, error) { + if idx.Centroids == nil { + // empty index has id = 1 + return []int64{1}, nil + } + + limit := idxcfg.Ivfflat.Lists + if limit == 0 { + limit = 1 + } + queries := [][]T{query} + rt := vectorindex.RuntimeConfig{Limit: limit, NThreads: 1} + keys, _, err := idx.Centroids.Search(sqlproc, queries, rt) + if err != nil { + return nil, err + } + + ranked, ok := keys.([]int64) + if !ok { + return nil, moerr.NewInternalErrorNoCtx("ivfflat: ranked centroid ids are not []int64") + } + return ranked, nil +} + func (idx *IvfflatSearchIndex[T]) findCentroids(sqlproc *sqlexec.SqlProcess, query []T, distfn metric.DistanceFunction[T], idxcfg vectorindex.IndexConfig, probe uint, _ int64) ([]int64, error) { if idx.Centroids == nil { @@ -339,19 +366,29 @@ func (idx *IvfflatSearchIndex[T]) getBloomFilter( return } - if len(sqlproc.RuntimeFilterSpecs) == 0 { - return - } - spec := sqlproc.RuntimeFilterSpecs[0] - if !spec.UseBloomFilter { - return + if len(sqlproc.IvfRuntimeFilterData) == 0 { + if len(sqlproc.RuntimeFilterSpecs) == 0 { + return + } + spec := sqlproc.RuntimeFilterSpecs[0] + if !spec.UseBloomFilter { + return + } } - // Get raw unique join key bytes from the build side. - vecbytes, err := sqlexec.WaitBloomFilter(sqlproc) - if err != nil { - return + sqlproc.ExactPkFilter = "" + sqlproc.IvfBloomFilter = nil + + var vecbytes []byte + if len(sqlproc.IvfRuntimeFilterData) > 0 { + vecbytes = sqlproc.IvfRuntimeFilterData + } else { + vecbytes, err = sqlexec.WaitBloomFilter(sqlproc) + if err != nil { + return + } } + if len(vecbytes) == 0 { return } @@ -505,6 +542,254 @@ func (idx *IvfflatSearchIndex[T]) getBloomFilter( return } +func filterRequestedIncludeColumns(requested []string, configured []string) []string { + if len(requested) == 0 || len(configured) == 0 { + return nil + } + + allowed := make(map[string]struct{}, len(configured)) + for _, col := range configured { + allowed[col] = struct{}{} + } + + filtered := make([]string, 0, len(requested)) + for _, col := range requested { + if _, ok := allowed[col]; ok { + filtered = append(filtered, col) + } + } + return filtered +} + +func buildActiveCentroidIDs(cursor *vectorindex.IvfSearchCursor, probe uint) []int64 { + if cursor == nil { + return nil + } + + total := uint(len(cursor.RankedCentroidIDs)) + if total == 0 { + cursor.Exhausted = true + return nil + } + + if cursor.Round == 0 && cursor.CurrentBucketCount == 0 { + cursor.NextBucketOffset = 0 + cursor.CurrentBucketCount = probe + if cursor.CurrentBucketCount == 0 { + cursor.CurrentBucketCount = 1 + } + } + + start := cursor.NextBucketOffset + if start >= total || cursor.CurrentBucketCount == 0 { + cursor.Exhausted = true + return nil + } + + end := start + cursor.CurrentBucketCount + if end > total { + end = total + } + cursor.CurrentBucketCount = end - start + cursor.Exhausted = end >= total + + return cursor.RankedCentroidIDs[start:end] +} + +func buildSearchRoundSQL[T types.RealNumbers]( + idxcfg vectorindex.IndexConfig, + tblcfg vectorindex.IndexTableConfig, + query []T, + activeCentroidIDs []int64, + version int64, + includeCols []string, + pushdownFilterSQL string, + roundLimit uint, +) string { + inValues := make([]string, 0, len(activeCentroidIDs)) + for _, c := range activeCentroidIDs { + inValues = append(inValues, strconv.FormatInt(c, 10)) + } + + queryB64 := types.ArrayToBase64(query) + var distExpr string + switch any(query).(type) { + case []float32: + distExpr = fmt.Sprintf("%s(`%s`, vecf32_from_base64('%s')) as vec_dist", + metric.MetricTypeToDistFuncName[metric.MetricType(idxcfg.Ivfflat.Metric)], + catalog.SystemSI_IVFFLAT_TblCol_Entries_entry, + queryB64, + ) + case []float64: + distExpr = fmt.Sprintf("%s(`%s`, vecf64_from_base64('%s')) as vec_dist", + metric.MetricTypeToDistFuncName[metric.MetricType(idxcfg.Ivfflat.Metric)], + catalog.SystemSI_IVFFLAT_TblCol_Entries_entry, + queryB64, + ) + default: + distExpr = fmt.Sprintf("%s(`%s`, '%s') as vec_dist", + metric.MetricTypeToDistFuncName[metric.MetricType(idxcfg.Ivfflat.Metric)], + catalog.SystemSI_IVFFLAT_TblCol_Entries_entry, + types.ArrayToString(query), + ) + } + + selectCols := []string{ + fmt.Sprintf("`%s`", catalog.SystemSI_IVFFLAT_TblCol_Entries_pk), + distExpr, + } + for _, col := range includeCols { + selectCols = append(selectCols, fmt.Sprintf("`%s%s`", catalog.SystemSI_IVFFLAT_IncludeColPrefix, col)) + } + + sql := fmt.Sprintf( + "SELECT %s FROM `%s`.`%s` WHERE `%s` = %d AND `%s` IN (%s)", + strings.Join(selectCols, ", "), + tblcfg.DbName, + tblcfg.EntriesTable, + catalog.SystemSI_IVFFLAT_TblCol_Entries_version, + version, + catalog.SystemSI_IVFFLAT_TblCol_Entries_id, + strings.Join(inValues, ","), + ) + if pushdownFilterSQL != "" { + // pushdownFilterSQL is produced by the optimizer's AST deparse path after + // column remap and validation, so this concatenation only stitches in + // controlled SQL emitted from bound plan expressions. + sql += " AND " + pushdownFilterSQL + } + sql += fmt.Sprintf(" ORDER BY vec_dist LIMIT %d", roundLimit) + + return sql +} + +func buildExactSearchSQL[T types.RealNumbers]( + idxcfg vectorindex.IndexConfig, + tblcfg vectorindex.IndexTableConfig, + query []T, + version int64, + exactPkFilter string, + includeCols []string, + pushdownFilterSQL string, +) string { + queryB64 := types.ArrayToBase64(query) + var distExpr string + switch any(query).(type) { + case []float32: + distExpr = fmt.Sprintf("%s(`%s`, vecf32_from_base64('%s')) as vec_dist", + metric.MetricTypeToDistFuncName[metric.MetricType(idxcfg.Ivfflat.Metric)], + catalog.SystemSI_IVFFLAT_TblCol_Entries_entry, + queryB64, + ) + case []float64: + distExpr = fmt.Sprintf("%s(`%s`, vecf64_from_base64('%s')) as vec_dist", + metric.MetricTypeToDistFuncName[metric.MetricType(idxcfg.Ivfflat.Metric)], + catalog.SystemSI_IVFFLAT_TblCol_Entries_entry, + queryB64, + ) + default: + distExpr = fmt.Sprintf("%s(`%s`, '%s') as vec_dist", + metric.MetricTypeToDistFuncName[metric.MetricType(idxcfg.Ivfflat.Metric)], + catalog.SystemSI_IVFFLAT_TblCol_Entries_entry, + types.ArrayToString(query), + ) + } + + selectCols := []string{ + fmt.Sprintf("`%s`", catalog.SystemSI_IVFFLAT_TblCol_Entries_pk), + distExpr, + } + for _, col := range includeCols { + selectCols = append(selectCols, fmt.Sprintf("`%s%s`", catalog.SystemSI_IVFFLAT_IncludeColPrefix, col)) + } + + sql := fmt.Sprintf( + "SELECT %s FROM `%s`.`%s` WHERE `%s` = %d AND `%s` IN (%s)", + strings.Join(selectCols, ", "), + tblcfg.DbName, + tblcfg.EntriesTable, + catalog.SystemSI_IVFFLAT_TblCol_Entries_version, + version, + catalog.SystemSI_IVFFLAT_TblCol_Entries_pk, + exactPkFilter, + ) + if pushdownFilterSQL != "" { + sql += " AND " + pushdownFilterSQL + } + return sql +} + +func sortAndLimitExactResults( + keys []any, + distances []float64, + includeCols []string, + includeData map[string][]any, + limit uint, +) ([]any, []float64, map[string][]any) { + if len(keys) <= 1 { + if limit > 0 && len(keys) > int(limit) { + keys = keys[:limit] + distances = distances[:limit] + if includeData != nil { + for _, col := range includeCols { + includeData[col] = includeData[col][:limit] + } + } + } + return keys, distances, includeData + } + + order := make([]int, len(keys)) + for i := range order { + order[i] = i + } + sort.SliceStable(order, func(i, j int) bool { + return distances[order[i]] < distances[order[j]] + }) + + if limit == 0 || int(limit) > len(order) { + limit = uint(len(order)) + } + + sortedKeys := make([]any, 0, limit) + sortedDistances := make([]float64, 0, limit) + var sortedInclude map[string][]any + if includeData != nil { + sortedInclude = make(map[string][]any, len(includeCols)) + for _, col := range includeCols { + sortedInclude[col] = make([]any, 0, limit) + } + } + + for _, idx := range order[:limit] { + sortedKeys = append(sortedKeys, keys[idx]) + sortedDistances = append(sortedDistances, distances[idx]) + if sortedInclude != nil { + for _, col := range includeCols { + sortedInclude[col] = append(sortedInclude[col], includeData[col][idx]) + } + } + } + + return sortedKeys, sortedDistances, sortedInclude +} + +func exactResultLimit(sqlproc *sqlexec.SqlProcess, fallback uint) uint { + limit := fallback + if sqlproc == nil || sqlproc.IndexReaderParam == nil || sqlproc.IndexReaderParam.GetLimit() == nil { + return limit + } + lit := sqlproc.IndexReaderParam.GetLimit().GetLit() + if lit == nil { + return limit + } + readerLimit := uint(lit.GetU64Val()) + if readerLimit > limit { + limit = readerLimit + } + return limit +} + // Call usearch.Search func (idx *IvfflatSearchIndex[T]) Search( sqlproc *sqlexec.SqlProcess, @@ -512,7 +797,7 @@ func (idx *IvfflatSearchIndex[T]) Search( tblcfg vectorindex.IndexTableConfig, query []T, rt vectorindex.RuntimeConfig, - nthread int64, + _ int64, ) (keys any, distances []float64, err error) { distfn, err := metric.ResolveDistanceFn[T](metric.MetricType(idxcfg.Ivfflat.Metric)) @@ -520,28 +805,164 @@ func (idx *IvfflatSearchIndex[T]) Search( return } - centroids_ids, err := idx.findCentroids(sqlproc, query, distfn, idxcfg, rt.Probe, nthread) + if sqlproc != nil { + prevRuntimeFilterData := sqlproc.IvfRuntimeFilterData + prevBloomFilter := sqlproc.IvfBloomFilter + prevExactPkFilter := sqlproc.ExactPkFilter + sqlproc.IvfRuntimeFilterData = rt.BloomFilter + sqlproc.IvfBloomFilter = nil + sqlproc.ExactPkFilter = "" + defer func() { + sqlproc.IvfRuntimeFilterData = prevRuntimeFilterData + sqlproc.IvfBloomFilter = prevBloomFilter + sqlproc.ExactPkFilter = prevExactPkFilter + }() + } + + includeMode := rt.SearchCursor != nil || + rt.IncludeResult != nil || + len(rt.RequestedIncludeColumns) > 0 || + rt.PushdownFilterSQL != "" || + rt.SearchRoundLimit > 0 + + if includeMode { + cursor := rt.SearchCursor + if cursor == nil { + cursor = &vectorindex.IvfSearchCursor{} + } + if len(cursor.RankedCentroidIDs) == 0 { + cursor.RankedCentroidIDs, err = idx.rankCentroids(sqlproc, query, idxcfg) + if err != nil { + return nil, nil, err + } + } + + activeCentroidIDs := buildActiveCentroidIDs(cursor, rt.Probe) + if len(activeCentroidIDs) == 0 { + return []any{}, []float64{}, nil + } + cursor.Round++ + + roundLimit := rt.SearchRoundLimit + if roundLimit == 0 { + roundLimit = rt.Limit + } + if roundLimit == 0 { + roundLimit = 1 + } + + includeCols := filterRequestedIncludeColumns(rt.RequestedIncludeColumns, tblcfg.IncludeColumns) + if rt.IncludeResult != nil { + rt.IncludeResult.ColNames = append(rt.IncludeResult.ColNames[:0], includeCols...) + rt.IncludeResult.Data = make(map[string][]any, len(includeCols)) + for _, col := range includeCols { + rt.IncludeResult.Data[col] = make([]any, 0, roundLimit) + } + } + + if err = idx.getBloomFilter(sqlproc, idxcfg, tblcfg, activeCentroidIDs); err != nil { + return nil, nil, err + } + + sql := buildSearchRoundSQL(idxcfg, tblcfg, query, activeCentroidIDs, idx.Version, includeCols, rt.PushdownFilterSQL, roundLimit) + if sqlproc != nil && sqlproc.ExactPkFilter != "" { + sql = buildExactSearchSQL( + idxcfg, + tblcfg, + query, + idx.Version, + sqlproc.ExactPkFilter, + includeCols, + rt.PushdownFilterSQL, + ) + if cursor != nil { + cursor.Exhausted = true + } + } + + res, runErr := runSql(sqlproc, sql) + if runErr != nil { + return nil, nil, runErr + } + defer res.Close() + + if len(rt.BackgroundQueries) > 0 { + if len(res.LogicalPlan.Nodes) > 0 && len(res.LogicalPlan.Steps) > 0 { + rootID := res.LogicalPlan.Steps[0] + if int(rootID) < len(res.LogicalPlan.Nodes) && res.LogicalPlan.Nodes[rootID] != nil { + if res.LogicalPlan.Nodes[rootID].Stats == nil { + res.LogicalPlan.Nodes[rootID].Stats = &plan.Stats{} + } + res.LogicalPlan.Nodes[rootID].Stats.Sql = sql + } + } + rt.BackgroundQueries[0] = res.LogicalPlan + } + + if len(res.Batches) == 0 { + return []any{}, []float64{}, nil + } + + resultCap := 0 + for _, bat := range res.Batches { + resultCap += bat.RowCount() + } + distances = make([]float64, 0, resultCap) + resid := make([]any, 0, resultCap) + for _, bat := range res.Batches { + distVec := bat.Vecs[1] + pkVec := bat.Vecs[0] + for i := 0; i < bat.RowCount(); i++ { + if distVec.IsNull(uint64(i)) { + continue + } + + pk := vector.GetAny(pkVec, i, true) + resid = append(resid, pk) + + dist := vector.GetFixedAtNoTypeCheck[float64](distVec, i) + dist = metric.DistanceTransformIvfflat(dist, metric.DistFuncNameToMetricType[rt.OrigFuncName], metric.MetricType(idxcfg.Ivfflat.Metric)) + distances = append(distances, dist) + + if rt.IncludeResult != nil { + for j, col := range includeCols { + rt.IncludeResult.Data[col] = append(rt.IncludeResult.Data[col], vector.GetAny(bat.Vecs[2+j], i, true)) + } + } + } + } + + if sqlproc != nil && sqlproc.ExactPkFilter != "" { + var sortedInclude map[string][]any + exactLimit := exactResultLimit(sqlproc, roundLimit) + resid, distances, sortedInclude = sortAndLimitExactResults(resid, distances, includeCols, rt.IncludeResult.Data, exactLimit) + if rt.IncludeResult != nil { + rt.IncludeResult.Data = sortedInclude + } + } + + return resid, distances, nil + } + + centroidsIDs, err := idx.findCentroids(sqlproc, query, distfn, idxcfg, rt.Probe, 0) if err != nil { return } var instr string - for i, c := range centroids_ids { + for i, c := range centroidsIDs { if i > 0 { instr += "," } instr += strconv.FormatInt(c, 10) } - err = idx.getBloomFilter(sqlproc, idxcfg, tblcfg, centroids_ids) + err = idx.getBloomFilter(sqlproc, idxcfg, tblcfg, centroidsIDs) if err != nil { return } var sql string - // Encode query vector as base64 of raw bytes — ~22x faster and ~48% smaller - // than text format [0.123, ...]. Uses vecf32_from_base64/vecf64_from_base64 - // to decode back to the vector type inside the SQL engine. queryB64 := types.ArrayToBase64(query) var vecFromB64Fn string switch any(query).(type) { @@ -552,8 +973,6 @@ func (idx *IvfflatSearchIndex[T]) Search( } if sqlproc != nil && sqlproc.ExactPkFilter != "" { - // Exact PK path: WaitBloomFilter converted small key set into ExactPkFilter. - // Query entries directly by pk list, skip centroid-based filtering. sql = fmt.Sprintf( "SELECT `%s`, %s(`%s`, %s('%s')) as vec_dist FROM `%s`.`%s` WHERE `%s` = %d AND `%s` IN (%s)", catalog.SystemSI_IVFFLAT_TblCol_Entries_pk, @@ -568,7 +987,6 @@ func (idx *IvfflatSearchIndex[T]) Search( sqlproc.ExactPkFilter, ) } else { - // Standard centroid-based path with optional CBloomFilter pre-filtering. sql = fmt.Sprintf( "SELECT `%s`, %s(`%s`, %s('%s')) as vec_dist FROM `%s`.`%s` WHERE `%s` = %d AND `%s` IN (%s) ORDER BY vec_dist LIMIT %d", catalog.SystemSI_IVFFLAT_TblCol_Entries_pk, @@ -585,10 +1003,6 @@ func (idx *IvfflatSearchIndex[T]) Search( ) } - //fmt.Println("IVFFlat SQL: ", sql) - //os.Stderr.WriteString(sql) - //os.Stderr.WriteString("\n") - res, err := runSql(sqlproc, sql) if err != nil { return @@ -596,22 +1010,27 @@ func (idx *IvfflatSearchIndex[T]) Search( defer res.Close() if len(rt.BackgroundQueries) > 0 { + if len(res.LogicalPlan.Nodes) > 0 && len(res.LogicalPlan.Steps) > 0 { + rootID := res.LogicalPlan.Steps[0] + if int(rootID) < len(res.LogicalPlan.Nodes) && res.LogicalPlan.Nodes[rootID] != nil { + if res.LogicalPlan.Nodes[rootID].Stats == nil { + res.LogicalPlan.Nodes[rootID].Stats = &plan.Stats{} + } + res.LogicalPlan.Nodes[rootID].Stats.Sql = sql + } + } rt.BackgroundQueries[0] = res.LogicalPlan } distances = make([]float64, 0, rt.Limit) resid := make([]any, 0, rt.Limit) - if len(res.Batches) == 0 { return resid, distances, nil } - var rowCount int64 for _, bat := range res.Batches { - rowCount += int64(bat.RowCount()) distVec := bat.Vecs[1] pkVec := bat.Vecs[0] - for i := 0; i < bat.RowCount(); i++ { if distVec.IsNull(uint64(i)) { continue @@ -626,6 +1045,11 @@ func (idx *IvfflatSearchIndex[T]) Search( } } + if sqlproc != nil && sqlproc.ExactPkFilter != "" { + exactLimit := exactResultLimit(sqlproc, rt.Limit) + resid, distances, _ = sortAndLimitExactResults(resid, distances, nil, nil, exactLimit) + } + return resid, distances, nil } diff --git a/pkg/vectorindex/ivfflat/search_test.go b/pkg/vectorindex/ivfflat/search_test.go index 8fe7e1746408f..6488d7a89ee5f 100644 --- a/pkg/vectorindex/ivfflat/search_test.go +++ b/pkg/vectorindex/ivfflat/search_test.go @@ -17,8 +17,13 @@ package ivfflat import ( "testing" + "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/common/mpool" + "github.com/matrixorigin/matrixone/pkg/container/batch" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/pb/plan" "github.com/matrixorigin/matrixone/pkg/testutil" "github.com/matrixorigin/matrixone/pkg/util/executor" "github.com/matrixorigin/matrixone/pkg/vectorindex" @@ -86,3 +91,293 @@ func TestIvfSearchParserError(t *testing.T) { _, _, err := idx.Search(sqlproc, idxcfg, tblcfg, v, rt, 4) require.NotNil(t, err) } + +func TestIvfSearchSQLIncludesRequestedColumnsAndPushdown(t *testing.T) { + oldRunSQL := runSql + defer func() { + runSql = oldRunSQL + }() + + var capturedSQL string + runSql = func(sqlproc *sqlexec.SqlProcess, sql string) (executor.Result, error) { + capturedSQL = sql + require.Nil(t, sqlproc.IvfBloomFilter) + + bat := batch.NewWithSize(4) + bat.Vecs[0] = vector.NewVec(types.T_int64.ToType()) + bat.Vecs[1] = vector.NewVec(types.T_float64.ToType()) + bat.Vecs[2] = vector.NewVec(types.T_int32.ToType()) + bat.Vecs[3] = vector.NewVec(types.T_bool.ToType()) + + require.NoError(t, vector.AppendFixed(bat.Vecs[0], int64(42), false, sqlproc.Proc.Mp())) + require.NoError(t, vector.AppendFixed(bat.Vecs[1], float64(1.25), false, sqlproc.Proc.Mp())) + require.NoError(t, vector.AppendFixed(bat.Vecs[2], int32(7), false, sqlproc.Proc.Mp())) + require.NoError(t, vector.AppendFixed(bat.Vecs[3], true, false, sqlproc.Proc.Mp())) + bat.SetRowCount(1) + + return executor.Result{Mp: sqlproc.Proc.Mp(), Batches: []*batch.Batch{bat}}, nil + } + + m := mpool.MustNewZero() + proc := testutil.NewProcessWithMPool(t, "", m) + + idxcfg := vectorindex.IndexConfig{} + idxcfg.Ivfflat.Metric = uint16(metric.Metric_L2Distance) + + tblcfg := vectorindex.IndexTableConfig{ + DbName: "test_db", + EntriesTable: "test_entries", + IncludeColumns: []string{"rank", "flag"}, + IncludeColumnTypes: []int32{int32(types.T_int32), int32(types.T_bool)}, + } + + rt := vectorindex.RuntimeConfig{ + Limit: 5, + Probe: 1, + OrigFuncName: "l2_distance", + RequestedIncludeColumns: []string{"rank", "flag"}, + PushdownFilterSQL: "`__mo_index_include_flag` = true", + IncludeResult: &vectorindex.IvfIncludeResult{}, + SearchCursor: &vectorindex.IvfSearchCursor{}, + SearchRoundLimit: 3, + } + + idx := &IvfflatSearchIndex[float32]{Version: 7} + sqlproc := sqlexec.NewSqlProcess(proc) + + keys, distances, err := idx.Search(sqlproc, idxcfg, tblcfg, []float32{0, 0, 0}, rt, 4) + require.NoError(t, err) + + require.Contains(t, capturedSQL, "__mo_index_include_rank") + require.Contains(t, capturedSQL, "__mo_index_include_flag") + require.Contains(t, capturedSQL, "AND `__mo_index_include_flag` = true") + require.Contains(t, capturedSQL, "vecf32_from_base64") + require.Contains(t, capturedSQL, "LIMIT 3") + + require.Equal(t, []any{int64(42)}, keys.([]any)) + require.Equal(t, []float64{1.25}, distances) + require.Equal(t, []string{"rank", "flag"}, rt.IncludeResult.ColNames) + require.Equal(t, []any{int32(7)}, rt.IncludeResult.Data["rank"]) + require.Equal(t, []any{true}, rt.IncludeResult.Data["flag"]) + require.Equal(t, uint(0), rt.SearchCursor.NextBucketOffset) + require.Equal(t, uint(1), rt.SearchCursor.CurrentBucketCount) + require.Equal(t, uint(1), rt.SearchCursor.Round) +} + +func TestIvfSearchSequentialCallsDoNotLeakQueryScopedRuntimeState(t *testing.T) { + oldRunSQL := runSql + defer func() { + runSql = oldRunSQL + }() + + var capturedSQL []string + runSql = func(sqlproc *sqlexec.SqlProcess, sql string) (executor.Result, error) { + capturedSQL = append(capturedSQL, sql) + + switch len(capturedSQL) { + case 1: + bat := batch.NewWithSize(3) + bat.Vecs[0] = vector.NewVec(types.T_int64.ToType()) + bat.Vecs[1] = vector.NewVec(types.T_float64.ToType()) + bat.Vecs[2] = vector.NewVec(types.T_int32.ToType()) + + require.NoError(t, vector.AppendFixed(bat.Vecs[0], int64(7), false, sqlproc.Proc.Mp())) + require.NoError(t, vector.AppendFixed(bat.Vecs[1], float64(0.25), false, sqlproc.Proc.Mp())) + require.NoError(t, vector.AppendFixed(bat.Vecs[2], int32(9), false, sqlproc.Proc.Mp())) + bat.SetRowCount(1) + return executor.Result{Mp: sqlproc.Proc.Mp(), Batches: []*batch.Batch{bat}}, nil + case 2: + bat := batch.NewWithSize(2) + bat.Vecs[0] = vector.NewVec(types.T_int64.ToType()) + bat.Vecs[1] = vector.NewVec(types.T_float64.ToType()) + + require.NoError(t, vector.AppendFixed(bat.Vecs[0], int64(8), false, sqlproc.Proc.Mp())) + require.NoError(t, vector.AppendFixed(bat.Vecs[1], float64(0.5), false, sqlproc.Proc.Mp())) + bat.SetRowCount(1) + return executor.Result{Mp: sqlproc.Proc.Mp(), Batches: []*batch.Batch{bat}}, nil + default: + return executor.Result{}, moerr.NewInternalErrorNoCtx("unexpected extra Search call") + } + } + + m := mpool.MustNewZero() + proc := testutil.NewProcessWithMPool(t, "", m) + + idxcfg := vectorindex.IndexConfig{} + idxcfg.Ivfflat.Metric = uint16(metric.Metric_L2Distance) + + tblcfg := vectorindex.IndexTableConfig{ + DbName: "test_db", + EntriesTable: "test_entries", + IncludeColumns: []string{"rank"}, + IncludeColumnTypes: []int32{int32(types.T_int32)}, + } + + idx := &IvfflatSearchIndex[float32]{Version: 9} + sqlproc := sqlexec.NewSqlProcess(proc) + + rt1 := vectorindex.RuntimeConfig{ + Limit: 4, + Probe: 1, + OrigFuncName: "l2_distance", + RequestedIncludeColumns: []string{"rank"}, + PushdownFilterSQL: "`__mo_index_include_rank` > 3", + IncludeResult: &vectorindex.IvfIncludeResult{}, + SearchCursor: &vectorindex.IvfSearchCursor{}, + SearchRoundLimit: 2, + } + keys1, distances1, err := idx.Search(sqlproc, idxcfg, tblcfg, []float32{0, 0, 0}, rt1, 4) + require.NoError(t, err) + + rt2 := vectorindex.RuntimeConfig{ + Limit: 4, + Probe: 1, + OrigFuncName: "l2_distance", + IncludeResult: &vectorindex.IvfIncludeResult{}, + SearchCursor: &vectorindex.IvfSearchCursor{}, + } + keys2, distances2, err := idx.Search(sqlproc, idxcfg, tblcfg, []float32{0, 0, 0}, rt2, 4) + require.NoError(t, err) + + require.Len(t, capturedSQL, 2) + require.Contains(t, capturedSQL[0], "__mo_index_include_rank") + require.Contains(t, capturedSQL[0], "AND `__mo_index_include_rank` > 3") + require.NotContains(t, capturedSQL[1], "__mo_index_include_rank") + require.NotContains(t, capturedSQL[1], " > 3") + + require.Equal(t, []any{int64(7)}, keys1.([]any)) + require.Equal(t, []float64{0.25}, distances1) + require.Equal(t, []string{"rank"}, rt1.IncludeResult.ColNames) + require.Equal(t, []any{int32(9)}, rt1.IncludeResult.Data["rank"]) + require.Equal(t, uint(1), rt1.SearchCursor.Round) + + require.Equal(t, []any{int64(8)}, keys2.([]any)) + require.Equal(t, []float64{0.5}, distances2) + require.Empty(t, rt2.IncludeResult.ColNames) + require.Empty(t, rt2.IncludeResult.Data) + require.Equal(t, uint(1), rt2.SearchCursor.Round) +} + +func TestGetBloomFilterUsesRuntimeFilterPayloadForExactPk(t *testing.T) { + m := mpool.MustNewZero() + proc := testutil.NewProcessWithMPool(t, "", m) + sqlproc := sqlexec.NewSqlProcess(proc) + sqlproc.RuntimeFilterSpecs = []*plan.RuntimeFilterSpec{{UseBloomFilter: true}} + + keyVec := vector.NewVec(types.T_int64.ToType()) + require.NoError(t, vector.AppendFixed(keyVec, int64(11), false, proc.Mp())) + require.NoError(t, vector.AppendFixed(keyVec, int64(22), false, proc.Mp())) + + rawPayload, err := keyVec.MarshalBinary() + require.NoError(t, err) + sqlproc.IvfRuntimeFilterData = rawPayload + + idx := &IvfflatSearchIndex[float32]{Version: 3} + err = idx.getBloomFilter(sqlproc, vectorindex.IndexConfig{}, vectorindex.IndexTableConfig{}, []int64{7}) + require.NoError(t, err) + require.Equal(t, "11,22", sqlproc.ExactPkFilter) + require.Nil(t, sqlproc.IvfBloomFilter) +} + +func TestIvfSearchIncludeModeConvertsRuntimePayloadBeforeRunSql(t *testing.T) { + oldRunSQL := runSql + defer func() { + runSql = oldRunSQL + }() + + m := mpool.MustNewZero() + proc := testutil.NewProcessWithMPool(t, "", m) + sqlproc := sqlexec.NewSqlProcess(proc) + sqlproc.RuntimeFilterSpecs = []*plan.RuntimeFilterSpec{{UseBloomFilter: true}} + + keyVec := vector.NewVec(types.T_int64.ToType()) + require.NoError(t, vector.AppendFixed(keyVec, int64(42), false, proc.Mp())) + rawPayload, err := keyVec.MarshalBinary() + require.NoError(t, err) + + var capturedSQL string + runSql = func(sqlproc *sqlexec.SqlProcess, sql string) (executor.Result, error) { + capturedSQL = sql + require.Nil(t, sqlproc.IvfBloomFilter) + require.Equal(t, "42", sqlproc.ExactPkFilter) + + bat := batch.NewWithSize(3) + bat.Vecs[0] = vector.NewVec(types.T_int64.ToType()) + bat.Vecs[1] = vector.NewVec(types.T_float64.ToType()) + bat.Vecs[2] = vector.NewVec(types.T_int32.ToType()) + + require.NoError(t, vector.AppendFixed(bat.Vecs[0], int64(42), false, sqlproc.Proc.Mp())) + require.NoError(t, vector.AppendFixed(bat.Vecs[1], float64(0.125), false, sqlproc.Proc.Mp())) + require.NoError(t, vector.AppendFixed(bat.Vecs[2], int32(9), false, sqlproc.Proc.Mp())) + bat.SetRowCount(1) + + return executor.Result{Mp: sqlproc.Proc.Mp(), Batches: []*batch.Batch{bat}}, nil + } + + idxcfg := vectorindex.IndexConfig{} + idxcfg.Ivfflat.Metric = uint16(metric.Metric_L2Distance) + + tblcfg := vectorindex.IndexTableConfig{ + DbName: "test_db", + EntriesTable: "test_entries", + IncludeColumns: []string{"rank"}, + IncludeColumnTypes: []int32{int32(types.T_int32)}, + } + + rt := vectorindex.RuntimeConfig{ + Limit: 3, + Probe: 1, + OrigFuncName: "l2_distance", + RequestedIncludeColumns: []string{"rank"}, + IncludeResult: &vectorindex.IvfIncludeResult{}, + SearchCursor: &vectorindex.IvfSearchCursor{ + RankedCentroidIDs: []int64{101}, + }, + SearchRoundLimit: 3, + BloomFilter: rawPayload, + } + + idx := &IvfflatSearchIndex[float32]{Version: 7} + keys, distances, err := idx.Search(sqlproc, idxcfg, tblcfg, []float32{0, 0, 0}, rt, 4) + require.NoError(t, err) + require.Equal(t, []any{int64(42)}, keys.([]any)) + require.Equal(t, []float64{0.125}, distances) + require.Equal(t, []string{"rank"}, rt.IncludeResult.ColNames) + require.Equal(t, []any{int32(9)}, rt.IncludeResult.Data["rank"]) + require.Contains(t, capturedSQL, "`"+catalog.SystemSI_IVFFLAT_TblCol_Entries_pk+"`") + require.Contains(t, capturedSQL, "IN (42)") + require.NotContains(t, capturedSQL, "`"+catalog.SystemSI_IVFFLAT_TblCol_Entries_id+"` IN") + require.NotContains(t, capturedSQL, "ORDER BY vec_dist") + require.NotContains(t, capturedSQL, "LIMIT 3") + require.True(t, rt.SearchCursor.Exhausted) +} + +func TestBuildActiveCentroidIDsUsesNonOverlappingBucketSlices(t *testing.T) { + cursor := &vectorindex.IvfSearchCursor{ + RankedCentroidIDs: []int64{11, 22, 33, 44, 55}, + } + + first := buildActiveCentroidIDs(cursor, 2) + require.Equal(t, []int64{11, 22}, first) + require.Equal(t, uint(0), cursor.NextBucketOffset) + require.Equal(t, uint(2), cursor.CurrentBucketCount) + require.False(t, cursor.Exhausted) + + cursor.Round = 1 + cursor.NextBucketOffset = 2 + cursor.CurrentBucketCount = 2 + second := buildActiveCentroidIDs(cursor, 2) + require.Equal(t, []int64{33, 44}, second) + require.Equal(t, uint(2), cursor.NextBucketOffset) + require.Equal(t, uint(2), cursor.CurrentBucketCount) + require.False(t, cursor.Exhausted) + + cursor.Round = 2 + cursor.NextBucketOffset = 4 + cursor.CurrentBucketCount = 2 + third := buildActiveCentroidIDs(cursor, 2) + require.Equal(t, []int64{55}, third) + require.Equal(t, uint(4), cursor.NextBucketOffset) + require.Equal(t, uint(1), cursor.CurrentBucketCount) + require.True(t, cursor.Exhausted) +} diff --git a/pkg/vectorindex/sqlexec/sqlexec.go b/pkg/vectorindex/sqlexec/sqlexec.go index 384a28bba8783..f719251617ee4 100644 --- a/pkg/vectorindex/sqlexec/sqlexec.go +++ b/pkg/vectorindex/sqlexec/sqlexec.go @@ -76,6 +76,10 @@ type SqlProcess struct { // Optional RuntimeFilterSpec RuntimeFilterSpecs []*plan.RuntimeFilterSpec + // Optional raw runtime-filter payload from the build side for IVF probe path. + // This contains serialized unique join keys and must be converted by IVF code + // before it is exposed to entries table scans. + IvfRuntimeFilterData []byte // Optional BloomFilter bytes for ivf entries scan. IvfBloomFilter []byte // Optional BloomFilter bytes for fulltext index scan. diff --git a/pkg/vectorindex/types.go b/pkg/vectorindex/types.go index 7557b7ff249df..e64f7c4ce16a5 100644 --- a/pkg/vectorindex/types.go +++ b/pkg/vectorindex/types.go @@ -60,18 +60,20 @@ type IndexTableConfig struct { IndexCapacity int64 `json:"index_capacity"` // IVF related - EntriesTable string `json:"entries"` - DataSize int64 `json:"datasize"` - Nprobe uint `json:"nprobe"` - PKeyType int32 `json:"pktype"` - KeyPartType int32 `json:"parttype"` - KmeansTrainPercent float64 `json:"kmeans_train_percent"` - KmeansMaxIteration int64 `json:"kmeans_max_iteration"` - Limit uint64 `json:"limit"` - LowerBoundType int8 `json:"lower_bound_type"` - LowerBound float64 `json:"lower_bound"` - UpperBoundType int8 `json:"upper_bound_type"` - UpperBound float64 `json:"upper_bound"` + EntriesTable string `json:"entries"` + DataSize int64 `json:"datasize"` + Nprobe uint `json:"nprobe"` + PKeyType int32 `json:"pktype"` + KeyPartType int32 `json:"parttype"` + KmeansTrainPercent float64 `json:"kmeans_train_percent"` + KmeansMaxIteration int64 `json:"kmeans_max_iteration"` + Limit uint64 `json:"limit"` + LowerBoundType int8 `json:"lower_bound_type"` + LowerBound float64 `json:"lower_bound"` + UpperBoundType int8 `json:"upper_bound_type"` + UpperBound float64 `json:"upper_bound"` + IncludeColumns []string `json:"include_columns,omitempty"` + IncludeColumnTypes []int32 `json:"include_column_types,omitempty"` } // HNSW specified parameters @@ -109,16 +111,50 @@ type IndexConfig struct { } type RuntimeConfig struct { - Limit uint - Probe uint - OrigFuncName string + Limit uint + Probe uint + OrigFuncName string + // Optional name-based filter payload for backends that can consume planner + // filter lowering without depending on scan binding coordinates. + FilterPayload string BackgroundQueries []*plan.Query - NThreads uint // Brute Force Index + // Optional raw runtime-filter payload from the build side. IVF search turns + // this into either an exact-pk filter or a real entries-table bloom filter. + BloomFilter []byte + NThreads uint // Brute Force Index + + // Query-scoped IVF search state. These fields must not be cached on the + // shared index object because every query can ask for different output + // columns, push down different predicates, and advance through different + // search rounds. + // + // RuntimeConfig is passed to Search by value. Pointer fields such as + // IncludeResult and SearchCursor can be mutated by Search and observed by + // the caller. Value fields such as SearchRoundLimit and BucketExpandStep are + // copied into Search and do not propagate caller-visible mutations back out. + RequestedIncludeColumns []string + PushdownFilterSQL string + IncludeResult *IvfIncludeResult + TargetRows uint + SearchRoundLimit uint + BucketExpandStep uint + SearchCursor *IvfSearchCursor +} + +type IvfIncludeResult struct { + ColNames []string + Data map[string][]any +} + +type IvfSearchCursor struct { + RankedCentroidIDs []int64 + NextBucketOffset uint + CurrentBucketCount uint + Round uint + Exhausted bool } type VectorIndexCdc[T types.RealNumbers] struct { - // Start string `json:"start"` - // End string `json:"end"` Data []VectorIndexCdcEntry[T] `json:"cdc"` } @@ -170,7 +206,6 @@ func (h *VectorIndexCdc[T]) Delete(key int64) { } func (h *VectorIndexCdc[T]) ToJson() (string, error) { - b, err := sonic.Marshal(h) if err != nil { return "", err diff --git a/pkg/vm/engine/tae/blockio/read.go b/pkg/vm/engine/tae/blockio/read.go index 6a4fc4cc3ace7..b9151a82b7976 100644 --- a/pkg/vm/engine/tae/blockio/read.go +++ b/pkg/vm/engine/tae/blockio/read.go @@ -557,22 +557,52 @@ func fillOutputBatchBySelectedRows( // cacheVectors contains all loaded columns from storage, and excludes the // physical address column. Fill output columns by selected rows. + outputDataColumnCount := len(columns) + if phyAddrColumnPos >= 0 { + outputDataColumnCount-- + } + // Some callers load one extra vector column only for ORDER BY distance evaluation. + // In that shape the source vector is not part of the output schema, so we must skip + // it while mapping cacheVectors onto the output batch. When cacheVectors and the + // output schema have the same number of data columns, the ORDER BY source column is + // already part of the output and must be materialized like any other column. + skipHiddenOrderByColumn := orderByLimit != nil && len(cacheVectors) == outputDataColumnCount+1 loadedColumnPos := 0 for outputColPos := range columns { if outputColPos == phyAddrColumnPos { continue } - if orderByLimit != nil && loadedColumnPos == int(orderByLimit.ColPos) { + if skipHiddenOrderByColumn && loadedColumnPos == int(orderByLimit.ColPos) { loadedColumnPos++ - continue } if err = outputBat.Vecs[outputColPos].PreExtendWithArea( len(selectRows), 0, mp, ); err != nil { return err } + srcVec := &cacheVectors[loadedColumnPos] + if outputBat.Vecs[outputColPos].GetType().Oid != srcVec.GetType().Oid { + return moerr.NewInternalErrorf( + context.Background(), + "blockio fill output: type mismatch at outputColPos=%d seqnum=%d loadedColumnPos=%d skipHiddenOrderByColumn=%v dstType=%s srcType=%s cacheVectors=%d outputCols=%d orderByColPos=%d", + outputColPos, + columns[outputColPos], + loadedColumnPos, + skipHiddenOrderByColumn, + outputBat.Vecs[outputColPos].GetType().String(), + srcVec.GetType().String(), + len(cacheVectors), + len(columns), + func() int32 { + if orderByLimit == nil { + return -1 + } + return orderByLimit.ColPos + }(), + ) + } if err = outputBat.Vecs[outputColPos].Union( - &cacheVectors[loadedColumnPos], selectRows, mp, + srcVec, selectRows, mp, ); err != nil { return err } @@ -638,12 +668,18 @@ func BlockDataReadInner( defer release() defer deleteMask.Release() + loadedOutputColumnCount := len(columns) + if phyAddrColumnPos >= 0 { + loadedOutputColumnCount-- + } + loadedCacheVectors := cacheVectors[:loadedOutputColumnCount] + // len(selectRows) > 0 means it was already filtered by pk filter if len(selectRows) > 0 { var dists []float64 if orderByLimit != nil { - selectRows, dists, err = handleOrderByLimitOnSelectRows(ctx, selectRows, orderByLimit, phyAddrColumnPos, cacheVectors) + selectRows, dists, err = handleOrderByLimitOnSelectRows(ctx, selectRows, orderByLimit, phyAddrColumnPos, loadedCacheVectors) if err != nil { return err } @@ -654,7 +690,7 @@ func BlockDataReadInner( columns, phyAddrColumnPos, outputBat, - cacheVectors, + loadedCacheVectors, selectRows, orderByLimit, dists, @@ -691,7 +727,15 @@ func BlockDataReadInner( // No pre-filter rows, but vector TopN pushdown is requested: // apply TopN on live rows (exclude tombstones first), then materialize selected rows. if orderByLimit != nil { - topInputRows := buildTopInputRows(int(info.MetaLocation().Rows()), deleteMask) + vecColPos := orderByLimit.ColPos + if phyAddrColumnPos >= 0 && vecColPos > int32(phyAddrColumnPos) { + vecColPos-- + } + rowCount := int(info.MetaLocation().Rows()) + if vecColPos >= 0 && int(vecColPos) < len(loadedCacheVectors) { + rowCount = loadedCacheVectors[vecColPos].Length() + } + topInputRows := buildTopInputRows(rowCount, deleteMask) var dists []float64 selectRows, dists, err = handleOrderByLimitOnSelectRows(ctx, topInputRows, orderByLimit, phyAddrColumnPos, cacheVectors) @@ -704,7 +748,7 @@ func BlockDataReadInner( columns, phyAddrColumnPos, outputBat, - cacheVectors, + loadedCacheVectors, selectRows, orderByLimit, dists, @@ -724,7 +768,7 @@ func BlockDataReadInner( loadedColumnPos := 0 for outputColPos := range columns { if outputColPos != phyAddrColumnPos { - loadedCol := &cacheVectors[loadedColumnPos] + loadedCol := &loadedCacheVectors[loadedColumnPos] if err = outputBat.Vecs[outputColPos].UnionBatch( loadedCol, 0, diff --git a/pkg/vm/engine/tae/blockio/read_test.go b/pkg/vm/engine/tae/blockio/read_test.go index 3529da6cf4e18..075545fa0b6b6 100644 --- a/pkg/vm/engine/tae/blockio/read_test.go +++ b/pkg/vm/engine/tae/blockio/read_test.go @@ -94,6 +94,7 @@ func TestFillOutputBatchBySelectedRows(t *testing.T) { require.NoError(t, err) require.Equal(t, 2, outputBat.Vecs[0].Length()) + require.Equal(t, 2, outputBat.Vecs[1].Length()) require.Equal(t, 3, len(outputBat.Vecs)) require.Equal(t, 2, outputBat.Vecs[2].Length()) }) @@ -156,6 +157,7 @@ func TestFillOutputBatchBySelectedRows(t *testing.T) { require.NoError(t, err) require.Equal(t, 2, outputBat.Vecs[0].Length()) + require.Equal(t, 2, outputBat.Vecs[1].Length()) require.Equal(t, 3, len(outputBat.Vecs)) require.Equal(t, 2, outputBat.Vecs[2].Length()) }) @@ -187,6 +189,81 @@ func TestFillOutputBatchBySelectedRows(t *testing.T) { require.Equal(t, 3, outputBat.Vecs[0].Length()) require.Equal(t, 3, outputBat.Vecs[1].Length()) }) + // Test case 6: Middle phyAddr column and orderByLimit + t.Run("complex_mix", func(t *testing.T) { + vec0 := vector.NewVec(types.T_int32.ToType()) // col 0 in cache + vec1 := vector.NewVec(types.T_float32.ToType()) // col 1 in cache (skipped by orderByLimit) + vec2 := vector.NewVec(types.T_varchar.ToType()) // col 2 in cache + + for i := 0; i < 10; i++ { + vector.AppendFixed(vec0, int32(i), false, mp) + vector.AppendFixed(vec1, float32(i), false, mp) + vector.AppendBytes(vec2, []byte("val"), false, mp) + } + + cacheVectors := make(containers.Vectors, 3) + cacheVectors[0] = *vec0 + cacheVectors[1] = *vec1 + cacheVectors[2] = *vec2 + + outputBat := batch.NewWithSize(3) + outputBat.Vecs[0] = vector.NewVec(types.T_int32.ToType()) + outputBat.Vecs[1] = vector.NewVec(types.T_Rowid.ToType()) // phyAddr + outputBat.Vecs[2] = vector.NewVec(types.T_varchar.ToType()) + + selectRows := []int64{1, 2} + columns := []uint16{0, 1, 2} + dists := []float64{0.1, 0.2} + + // orderByLimit at ColPos 1 of cacheVectors (which is vec1) + orderByLimit := &objectio.IndexReaderTopOp{ColPos: 1, Limit: 2} + info := &objectio.BlockInfo{} + info.BlockID = *objectio.NewBlockid(objectio.NewSegmentid(), 0, 0) + + err := fillOutputBatchBySelectedRows( + info, columns, 1, outputBat, cacheVectors, selectRows, orderByLimit, dists, mp, + ) + + require.NoError(t, err) + require.Equal(t, 2, outputBat.Vecs[0].Length()) + require.Equal(t, 2, outputBat.Vecs[1].Length()) + require.Equal(t, 2, outputBat.Vecs[2].Length()) + require.Equal(t, 4, len(outputBat.Vecs)) // Added dist vec + require.Equal(t, 2, outputBat.Vecs[3].Length()) + + // Verify values for col 0 + require.Equal(t, int32(1), vector.MustFixedColWithTypeCheck[int32](outputBat.Vecs[0])[0]) + require.Equal(t, int32(2), vector.MustFixedColWithTypeCheck[int32](outputBat.Vecs[0])[1]) + require.Equal(t, []byte("val"), outputBat.Vecs[2].GetBytesAt(0)) + require.Equal(t, []byte("val"), outputBat.Vecs[2].GetBytesAt(1)) + }) + + // Test case 7: Repeated selectRows + t.Run("repeated_rows", func(t *testing.T) { + vec0 := vector.NewVec(types.T_int32.ToType()) + vector.AppendFixed(vec0, int32(10), false, mp) + vector.AppendFixed(vec0, int32(20), false, mp) + cacheVectors := make(containers.Vectors, 1) + cacheVectors[0] = *vec0 + + outputBat := batch.NewWithSize(1) + outputBat.Vecs[0] = vector.NewVec(types.T_int32.ToType()) + + selectRows := []int64{0, 0, 1, 1} + columns := []uint16{0} + info := &objectio.BlockInfo{} + + err := fillOutputBatchBySelectedRows( + info, columns, -1, outputBat, cacheVectors, selectRows, nil, nil, mp, + ) + + require.NoError(t, err) + require.Equal(t, 4, outputBat.Vecs[0].Length()) + require.Equal(t, int32(10), vector.MustFixedColWithTypeCheck[int32](outputBat.Vecs[0])[0]) + require.Equal(t, int32(10), vector.MustFixedColWithTypeCheck[int32](outputBat.Vecs[0])[1]) + require.Equal(t, int32(20), vector.MustFixedColWithTypeCheck[int32](outputBat.Vecs[0])[2]) + require.Equal(t, int32(20), vector.MustFixedColWithTypeCheck[int32](outputBat.Vecs[0])[3]) + }) } func TestHandleOrderByLimitOnSelectRows(t *testing.T) { diff --git a/pkg/vm/engine/test/cdc_testutil.go b/pkg/vm/engine/test/cdc_testutil.go index 9abd672c41fce..2c89cfaa0895e 100644 --- a/pkg/vm/engine/test/cdc_testutil.go +++ b/pkg/vm/engine/test/cdc_testutil.go @@ -198,6 +198,7 @@ func mock_mo_indexes( "`ordinal_position` int unsigned NOT NULL," + "`options` text DEFAULT NULL," + "`index_table_name` varchar(5000) DEFAULT NULL," + + "`included_columns` text DEFAULT NULL," + "PRIMARY KEY (`table_id`,`column_name`)" + // use table_id as primary key instead of id to avoid duplicate ")" diff --git a/proto/pipeline.proto b/proto/pipeline.proto index ebe80e85d9fe5..72c7ac68cadd7 100644 --- a/proto/pipeline.proto +++ b/proto/pipeline.proto @@ -338,6 +338,8 @@ message TableFunction { bytes params = 4; string name = 5; bool is_single = 6; + repeated plan.RuntimeFilterSpec runtime_filter_specs = 7; + plan.IndexReaderParam index_reader_param = 8; } message ExternalName2ColIndex { diff --git a/proto/plan.proto b/proto/plan.proto index 5c931a42e1de3..f84660870175b 100644 --- a/proto/plan.proto +++ b/proto/plan.proto @@ -346,6 +346,8 @@ message IndexDef { string index_algo = 10; string index_algo_table_type = 11; string index_algo_params = 12; + // Logical INCLUDE columns of the index, letter case: lower. + repeated string included_columns = 13; } message ForeignKeyDef { diff --git a/test/distributed/cases/dml/show/database_statistics.result b/test/distributed/cases/dml/show/database_statistics.result index 3b9daf61b2460..e0cf6272741e1 100644 --- a/test/distributed/cases/dml/show/database_statistics.result +++ b/test/distributed/cases/dml/show/database_statistics.result @@ -105,7 +105,7 @@ show column_number from mo_columns; 26 show column_number from mo_indexes; ➤ Number of columns in mo_indexes[-5,64,0] 𝄀 -15 +16 show column_number from mo_table_partitions; [unknown result because it is related to issue#16438] use system_metrics; diff --git a/test/distributed/cases/dml/show/show7.result b/test/distributed/cases/dml/show/show7.result index 551ad760c843b..5e9d1db1478a9 100644 --- a/test/distributed/cases/dml/show/show7.result +++ b/test/distributed/cases/dml/show/show7.result @@ -9,7 +9,13 @@ select 2; select 3; 3 3 -select case when count(*) > 0 then 0 else sleep(15) end as wait_for_statement_info_ready from system.statement_info; +select case when count(*) > 0 then 0 else sleep(5) end as wait_for_statement_info_ready from system.statement_info; +wait_for_statement_info_ready +0 +select case when count(*) > 0 then 0 else sleep(5) end as wait_for_statement_info_ready from system.statement_info; +wait_for_statement_info_ready +0 +select case when count(*) > 0 then 0 else sleep(5) end as wait_for_statement_info_ready from system.statement_info; wait_for_statement_info_ready 0 select count(*) > 0 as has_data from system.statement_info; diff --git a/test/distributed/cases/dml/show/show7.sql b/test/distributed/cases/dml/show/show7.sql index a19876912917a..e2a4c6ddfa919 100644 --- a/test/distributed/cases/dml/show/show7.sql +++ b/test/distributed/cases/dml/show/show7.sql @@ -5,7 +5,9 @@ create account show_table_status_acc_10163 admin_name = 'admin' identified by '1 select 1; select 2; select 3; -select case when count(*) > 0 then 0 else sleep(15) end as wait_for_statement_info_ready from system.statement_info; +select case when count(*) > 0 then 0 else sleep(5) end as wait_for_statement_info_ready from system.statement_info; +select case when count(*) > 0 then 0 else sleep(5) end as wait_for_statement_info_ready from system.statement_info; +select case when count(*) > 0 then 0 else sleep(5) end as wait_for_statement_info_ready from system.statement_info; select count(*) > 0 as has_data from system.statement_info; -- @ignore:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 diff --git a/test/distributed/cases/foreign_key/fk_show_columns.result b/test/distributed/cases/foreign_key/fk_show_columns.result index c2f090aef787c..b26655808f29a 100644 --- a/test/distributed/cases/foreign_key/fk_show_columns.result +++ b/test/distributed/cases/foreign_key/fk_show_columns.result @@ -191,7 +191,8 @@ comment ¦ VARCHAR(2048) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 column_name ¦ VARCHAR(256) ¦ NO ¦ PRI ¦ null ¦ ¦ 𝄀 ordinal_position ¦ INT UNSIGNED(32) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 options ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -index_table_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ +index_table_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +included_columns ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ desc mo_catalog.mo_table_partitions ; [unknown result because it is related to issue#16438] desc mo_catalog.mo_pubs ; @@ -510,7 +511,8 @@ comment ¦ VARCHAR(2048) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 column_name ¦ VARCHAR(256) ¦ NO ¦ PRI ¦ null ¦ ¦ 𝄀 ordinal_position ¦ INT UNSIGNED(32) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 options ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -index_table_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ +index_table_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +included_columns ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ show columns from mo_catalog.mo_table_partitions ; [unknown result because it is related to issue#16438] show columns from mo_catalog.mo_pubs ; @@ -820,7 +822,8 @@ comment ¦ VARCHAR(2048) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 column_name ¦ VARCHAR(256) ¦ NO ¦ PRI ¦ null ¦ ¦ 𝄀 ordinal_position ¦ INT UNSIGNED(32) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 options ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -index_table_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ +index_table_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +included_columns ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ desc mo_catalog.mo_table_partitions ; [unknown result because it is related to issue#16438] desc mo_catalog.mo_pubs ; @@ -1117,7 +1120,8 @@ comment ¦ VARCHAR(2048) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 column_name ¦ VARCHAR(256) ¦ NO ¦ PRI ¦ null ¦ ¦ 𝄀 ordinal_position ¦ INT UNSIGNED(32) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 options ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -index_table_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ +index_table_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +included_columns ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ show columns from mo_catalog.mo_table_partitions ; [unknown result because it is related to issue#16438] show columns from mo_catalog.mo_pubs ; diff --git a/test/distributed/cases/pessimistic_transaction/fulltext/fulltext_async.result b/test/distributed/cases/pessimistic_transaction/fulltext/fulltext_async.result index 04d6f2d4c3145..fcd7d47df5f08 100644 --- a/test/distributed/cases/pessimistic_transaction/fulltext/fulltext_async.result +++ b/test/distributed/cases/pessimistic_transaction/fulltext/fulltext_async.result @@ -10,8 +10,17 @@ insert into src values (0, 'color is red', 't1'), (1, 'car is yellow', 'crazy ca (10, NULL, NULL); create table src2 (id1 varchar, id2 bigint, body char(128), title text, primary key (id1, id2), FULLTEXT ftidx(body, title) ASYNC); insert into src2 values ('id0', 0, 'red', 't1'), ('id1', 1, 'yellow', 't2'), ('id2', 2, 'blue', 't3'), ('id3', 3, 'blue red', 't4'), ('id4', 4, 'bright red null', NULL); -select sleep(20); -sleep(20) +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_fulltext_sync from mo_catalog.mo_iscp_log where job_name = 'index_ftidx' and job_state in (1, 2); +wait_for_async_fulltext_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_fulltext_sync from mo_catalog.mo_iscp_log where job_name = 'index_ftidx' and job_state in (1, 2); +wait_for_async_fulltext_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_fulltext_sync from mo_catalog.mo_iscp_log where job_name = 'index_ftidx' and job_state in (1, 2); +wait_for_async_fulltext_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_fulltext_sync from mo_catalog.mo_iscp_log where job_name = 'index_ftidx' and job_state in (1, 2); +wait_for_async_fulltext_sync 0 select * from src where match(body, title) against('red'); id body title diff --git a/test/distributed/cases/pessimistic_transaction/fulltext/fulltext_async.sql b/test/distributed/cases/pessimistic_transaction/fulltext/fulltext_async.sql index 02abd10e7bb2f..7a2332ae3a995 100644 --- a/test/distributed/cases/pessimistic_transaction/fulltext/fulltext_async.sql +++ b/test/distributed/cases/pessimistic_transaction/fulltext/fulltext_async.sql @@ -20,7 +20,10 @@ create table src2 (id1 varchar, id2 bigint, body char(128), title text, primary insert into src2 values ('id0', 0, 'red', 't1'), ('id1', 1, 'yellow', 't2'), ('id2', 2, 'blue', 't3'), ('id3', 3, 'blue red', 't4'), ('id4', 4, 'bright red null', NULL); -- sleep and wait for src and src2 finish -select sleep(20); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_fulltext_sync from mo_catalog.mo_iscp_log where job_name = 'index_ftidx' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_fulltext_sync from mo_catalog.mo_iscp_log where job_name = 'index_ftidx' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_fulltext_sync from mo_catalog.mo_iscp_log where job_name = 'index_ftidx' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_fulltext_sync from mo_catalog.mo_iscp_log where job_name = 'index_ftidx' and job_state in (1, 2); -- select src select * from src where match(body, title) against('red'); diff --git a/test/distributed/cases/pessimistic_transaction/system_view.result b/test/distributed/cases/pessimistic_transaction/system_view.result index a0d4b97c6c683..02c06e914d20a 100644 --- a/test/distributed/cases/pessimistic_transaction/system_view.result +++ b/test/distributed/cases/pessimistic_transaction/system_view.result @@ -5,8 +5,20 @@ use sv_db1; create table t1(a int); begin; insert into t1 values (1); -select sleep(10); -sleep(10) +select case when count(*) > 0 then 0 else sleep(2) end as wait_for_mo_locks_ready from mo_locks() l; +wait_for_mo_locks_ready +0 +select case when count(*) > 0 then 0 else sleep(2) end as wait_for_mo_locks_ready from mo_locks() l; +wait_for_mo_locks_ready +0 +select case when count(*) > 0 then 0 else sleep(2) end as wait_for_mo_locks_ready from mo_locks() l; +wait_for_mo_locks_ready +0 +select case when count(*) > 0 then 0 else sleep(2) end as wait_for_mo_locks_ready from mo_locks() l; +wait_for_mo_locks_ready +0 +select case when count(*) > 0 then 0 else sleep(2) end as wait_for_mo_locks_ready from mo_locks() l; +wait_for_mo_locks_ready 0 select count(*) > 0 from mo_locks() l; count(*) > 0 diff --git a/test/distributed/cases/pessimistic_transaction/system_view.sql b/test/distributed/cases/pessimistic_transaction/system_view.sql index 047e9fffbe2bf..20b0d3388dcaa 100644 --- a/test/distributed/cases/pessimistic_transaction/system_view.sql +++ b/test/distributed/cases/pessimistic_transaction/system_view.sql @@ -9,9 +9,13 @@ use sv_db1; create table t1(a int); begin; insert into t1 values (1); -select sleep(10); -- @session} +select case when count(*) > 0 then 0 else sleep(2) end as wait_for_mo_locks_ready from mo_locks() l; +select case when count(*) > 0 then 0 else sleep(2) end as wait_for_mo_locks_ready from mo_locks() l; +select case when count(*) > 0 then 0 else sleep(2) end as wait_for_mo_locks_ready from mo_locks() l; +select case when count(*) > 0 then 0 else sleep(2) end as wait_for_mo_locks_ready from mo_locks() l; +select case when count(*) > 0 then 0 else sleep(2) end as wait_for_mo_locks_ready from mo_locks() l; select count(*) > 0 from mo_locks() l; select count(*) > 0 from mo_transactions() t join mo_locks() l where t.txn_id = l.txn_id; @@ -19,4 +23,4 @@ select count(*) > 0 from mo_transactions() t join mo_locks() l where t.txn_id = commit; -- @session} -drop database if exists sv_db1; \ No newline at end of file +drop database if exists sv_db1; diff --git a/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_async.result b/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_async.result index d8e1e090215d6..db6a76c1c6c78 100644 --- a/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_async.result +++ b/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_async.result @@ -8,8 +8,14 @@ insert into t1 values (0, "[1,2,3]", 1); UPDATE t1 set b = '[4,5,6]' where a = 0; insert into t1 values (1, "[2,3,4]", 1); DELETE FROM t1 WHERE a=1; -select sleep(15); -sleep(15) +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t1_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx01' and job_state in (1, 2); +wait_for_async_hnsw_t1_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t1_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx01' and job_state in (1, 2); +wait_for_async_hnsw_t1_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t1_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx01' and job_state in (1, 2); +wait_for_async_hnsw_t1_sync 0 select * from t1 order by L2_DISTANCE(b,"[1,2,3]") ASC LIMIT 10; a b c @@ -27,8 +33,17 @@ load data infile {'filepath'='$resources/vector/sift128_base_10k.csv.gz', 'compr select count(*) from t2; count(*) 10000 -select sleep(20); -sleep(20) +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); +wait_for_async_hnsw_t2_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); +wait_for_async_hnsw_t2_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); +wait_for_async_hnsw_t2_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); +wait_for_async_hnsw_t2_sync 0 select * from t2 order by L2_DISTANCE(b, "[14, 2, 0, 0, 0, 2, 42, 55, 9, 1, 0, 0, 18, 100, 77, 32, 89, 1, 0, 0, 19, 85, 15, 68, 52, 4, 0, 0, 0, 0, 2, 28, 34, 13, 5, 12, 49, 40, 39, 37, 24, 2, 0, 0, 34, 83, 88, 28, 119, 20, 0, 0, 41, 39, 13, 62, 119, 16, 2, 0, 0, 0, 10, 42, 9, 46, 82, 79, 64, 19, 2, 5, 10, 35, 26, 53, 84, 32, 34, 9, 119, 119, 21, 3, 3, 11, 17, 14, 119, 25, 8, 5, 0, 0, 11, 22, 23, 17, 42, 49, 17, 12, 5, 5, 12, 78, 119, 90, 27, 0, 4, 2, 48, 92, 112, 85, 15, 0, 2, 7, 50, 36, 15, 11, 1, 0, 0, 7]") ASC LIMIT 1; a b @@ -45,13 +60,29 @@ select count(*) from t3; create index idx3 using hnsw on t3(b) op_type "vector_l2_ops" M 64 EF_CONSTRUCTION 200 EF_SEARCH 200 ASYNC; -select sleep(10); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_seed_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +wait_for_async_hnsw_t3_seed_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_seed_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +wait_for_async_hnsw_t3_seed_sync +0 load data infile {'filepath'='$resources/vector/sift128_base_10k_2.csv.gz', 'compression'='gzip'} into table t3 fields terminated by ':' parallel 'true'; select count(*) from t3; -select sleep(20); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +wait_for_async_hnsw_t3_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +wait_for_async_hnsw_t3_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +wait_for_async_hnsw_t3_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +wait_for_async_hnsw_t3_sync +0 select * from t3 order by L2_DISTANCE(b, "[14, 2, 0, 0, 0, 2, 42, 55, 9, 1, 0, 0, 18, 100, 77, 32, 89, 1, 0, 0, 19, 85, 15, 68, 52, 4, 0, 0, 0, 0, 2, 28, 34, 13, 5, 12, 49, 40, 39, 37, 24, 2, 0, 0, 34, 83, 88, 28, 119, 20, 0, 0, 41, 39, 13, 62, 119, 16, 2, 0, 0, 0, 10, 42, 9, 46, 82, 79, 64, 19, 2, 5, 10, 35, 26, 53, 84, 32, 34, 9, 119, 119, 21, 3, 3, 11, 17, 14, 119, 25, 8, 5, 0, 0, 11, 22, 23, 17, 42, 49, 17, 12, 5, 5, 12, 78, 119, 90, 27, 0, 4, 2, 48, 92, 112, 85, 15, 0, 2, 7, 50, 36, 15, 11, 1, 0, 0, 7]") ASC LIMIT 1; diff --git a/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_async.sql b/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_async.sql index c77745a21d437..8fe944d92161e 100644 --- a/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_async.sql +++ b/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_async.sql @@ -24,7 +24,9 @@ insert into t1 values (1, "[2,3,4]", 1); DELETE FROM t1 WHERE a=1; -- select hnsw_cdc_update('hnsw_cdc', 't1', 3, '{"start":"", "end":"", "cdc":[{"t":"D", "pk":0}]}'); -select sleep(15); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t1_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx01' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t1_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx01' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t1_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx01' and job_state in (1, 2); -- test with multi-cn is tricky. since model is cached in memory, model may not be updated after CDC sync'd. The only way to test is to all INSERT/DELETE/UPDATE before SELECT. -- already update to [4,5,6], result is [4,5,6] @@ -47,7 +49,10 @@ load data infile {'filepath'='$resources/vector/sift128_base_10k.csv.gz', 'compr select count(*) from t2; -select sleep(20); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); select * from t2 order by L2_DISTANCE(b, "[14, 2, 0, 0, 0, 2, 42, 55, 9, 1, 0, 0, 18, 100, 77, 32, 89, 1, 0, 0, 19, 85, 15, 68, 52, 4, 0, 0, 0, 0, 2, 28, 34, 13, 5, 12, 49, 40, 39, 37, 24, 2, 0, 0, 34, 83, 88, 28, 119, 20, 0, 0, 41, 39, 13, 62, 119, 16, 2, 0, 0, 0, 10, 42, 9, 46, 82, 79, 64, 19, 2, 5, 10, 35, 26, 53, 84, 32, 34, 9, 119, 119, 21, 3, 3, 11, 17, 14, 119, 25, 8, 5, 0, 0, 11, 22, 23, 17, 42, 49, 17, 12, 5, 5, 12, 78, 119, 90, 27, 0, 4, 2, 48, 92, 112, 85, 15, 0, 2, 7, 50, 36, 15, 11, 1, 0, 0, 7]") ASC LIMIT 1; @@ -74,13 +79,17 @@ select count(*) from t3; create index idx3 using hnsw on t3(b) op_type "vector_l2_ops" M 64 EF_CONSTRUCTION 200 EF_SEARCH 200 ASYNC; -select sleep(10); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_seed_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_seed_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); load data infile {'filepath'='$resources/vector/sift128_base_10k_2.csv.gz', 'compression'='gzip'} into table t3 fields terminated by ':' parallel 'true'; select count(*) from t3; -select sleep(20); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); select * from t3 order by L2_DISTANCE(b, "[14, 2, 0, 0, 0, 2, 42, 55, 9, 1, 0, 0, 18, 100, 77, 32, 89, 1, 0, 0, 19, 85, 15, 68, 52, 4, 0, 0, 0, 0, 2, 28, 34, 13, 5, 12, 49, 40, 39, 37, 24, 2, 0, 0, 34, 83, 88, 28, 119, 20, 0, 0, 41, 39, 13, 62, 119, 16, 2, 0, 0, 0, 10, 42, 9, 46, 82, 79, 64, 19, 2, 5, 10, 35, 26, 53, 84, 32, 34, 9, 119, 119, 21, 3, 3, 11, 17, 14, 119, 25, 8, 5, 0, 0, 11, 22, 23, 17, 42, 49, 17, 12, 5, 5, 12, 78, 119, 90, 27, 0, 4, 2, 48, 92, 112, 85, 15, 0, 2, 7, 50, 36, 15, 11, 1, 0, 0, 7]") ASC LIMIT 1; @@ -98,4 +107,3 @@ drop table t3; -- @bvt:issue drop database hnsw_cdc; - diff --git a/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_f64_async.result b/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_f64_async.result index 479e163634175..d728a05287caa 100644 --- a/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_f64_async.result +++ b/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_f64_async.result @@ -8,8 +8,14 @@ insert into t1 values (0, "[1,2,3]", 1); UPDATE t1 set b = '[4,5,6]' where a = 0; insert into t1 values (1, "[2,3,4]", 1); DELETE FROM t1 WHERE a=1; -select sleep(15); -sleep(15) +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t1_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx01' and job_state in (1, 2); +wait_for_async_hnsw_t1_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t1_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx01' and job_state in (1, 2); +wait_for_async_hnsw_t1_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t1_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx01' and job_state in (1, 2); +wait_for_async_hnsw_t1_sync 0 select * from t1 order by L2_DISTANCE(b,"[1,2,3]") ASC LIMIT 10; a b c @@ -27,8 +33,17 @@ load data infile {'filepath'='$resources/vector/sift128_base_10k.csv.gz', 'compr select count(*) from t2; count(*) 10000 -select sleep(20); -sleep(20) +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); +wait_for_async_hnsw_t2_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); +wait_for_async_hnsw_t2_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); +wait_for_async_hnsw_t2_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); +wait_for_async_hnsw_t2_sync 0 select * from t2 order by L2_DISTANCE(b, "[14, 2, 0, 0, 0, 2, 42, 55, 9, 1, 0, 0, 18, 100, 77, 32, 89, 1, 0, 0, 19, 85, 15, 68, 52, 4, 0, 0, 0, 0, 2, 28, 34, 13, 5, 12, 49, 40, 39, 37, 24, 2, 0, 0, 34, 83, 88, 28, 119, 20, 0, 0, 41, 39, 13, 62, 119, 16, 2, 0, 0, 0, 10, 42, 9, 46, 82, 79, 64, 19, 2, 5, 10, 35, 26, 53, 84, 32, 34, 9, 119, 119, 21, 3, 3, 11, 17, 14, 119, 25, 8, 5, 0, 0, 11, 22, 23, 17, 42, 49, 17, 12, 5, 5, 12, 78, 119, 90, 27, 0, 4, 2, 48, 92, 112, 85, 15, 0, 2, 7, 50, 36, 15, 11, 1, 0, 0, 7]") ASC LIMIT 1; a b @@ -45,13 +60,29 @@ select count(*) from t3; create index idx3 using hnsw on t3(b) op_type "vector_l2_ops" M 64 EF_CONSTRUCTION 200 EF_SEARCH 200 ASYNC; -select sleep(10); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_seed_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +wait_for_async_hnsw_t3_seed_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_seed_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +wait_for_async_hnsw_t3_seed_sync +0 load data infile {'filepath'='$resources/vector/sift128_base_10k_2.csv.gz', 'compression'='gzip'} into table t3 fields terminated by ':' parallel 'true'; select count(*) from t3; -select sleep(20); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +wait_for_async_hnsw_t3_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +wait_for_async_hnsw_t3_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +wait_for_async_hnsw_t3_sync +0 +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +wait_for_async_hnsw_t3_sync +0 select * from t3 order by L2_DISTANCE(b, "[14, 2, 0, 0, 0, 2, 42, 55, 9, 1, 0, 0, 18, 100, 77, 32, 89, 1, 0, 0, 19, 85, 15, 68, 52, 4, 0, 0, 0, 0, 2, 28, 34, 13, 5, 12, 49, 40, 39, 37, 24, 2, 0, 0, 34, 83, 88, 28, 119, 20, 0, 0, 41, 39, 13, 62, 119, 16, 2, 0, 0, 0, 10, 42, 9, 46, 82, 79, 64, 19, 2, 5, 10, 35, 26, 53, 84, 32, 34, 9, 119, 119, 21, 3, 3, 11, 17, 14, 119, 25, 8, 5, 0, 0, 11, 22, 23, 17, 42, 49, 17, 12, 5, 5, 12, 78, 119, 90, 27, 0, 4, 2, 48, 92, 112, 85, 15, 0, 2, 7, 50, 36, 15, 11, 1, 0, 0, 7]") ASC LIMIT 1; diff --git a/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_f64_async.sql b/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_f64_async.sql index 7ad05cd9f250e..3734966aa1f53 100644 --- a/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_f64_async.sql +++ b/test/distributed/cases/pessimistic_transaction/vector/vector_hnsw_f64_async.sql @@ -24,7 +24,9 @@ insert into t1 values (1, "[2,3,4]", 1); DELETE FROM t1 WHERE a=1; -- select hnsw_cdc_update('hnsw_cdc', 't1', 3, '{"start":"", "end":"", "cdc":[{"t":"D", "pk":0}]}'); -select sleep(15); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t1_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx01' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t1_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx01' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t1_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx01' and job_state in (1, 2); -- test with multi-cn is tricky. since model is cached in memory, model may not be updated after CDC sync'd. The only way to test is to all INSERT/DELETE/UPDATE before SELECT. -- already update to [4,5,6], result is [4,5,6] @@ -47,7 +49,10 @@ load data infile {'filepath'='$resources/vector/sift128_base_10k.csv.gz', 'compr select count(*) from t2; -select sleep(20); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t2_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx2' and job_state in (1, 2); select * from t2 order by L2_DISTANCE(b, "[14, 2, 0, 0, 0, 2, 42, 55, 9, 1, 0, 0, 18, 100, 77, 32, 89, 1, 0, 0, 19, 85, 15, 68, 52, 4, 0, 0, 0, 0, 2, 28, 34, 13, 5, 12, 49, 40, 39, 37, 24, 2, 0, 0, 34, 83, 88, 28, 119, 20, 0, 0, 41, 39, 13, 62, 119, 16, 2, 0, 0, 0, 10, 42, 9, 46, 82, 79, 64, 19, 2, 5, 10, 35, 26, 53, 84, 32, 34, 9, 119, 119, 21, 3, 3, 11, 17, 14, 119, 25, 8, 5, 0, 0, 11, 22, 23, 17, 42, 49, 17, 12, 5, 5, 12, 78, 119, 90, 27, 0, 4, 2, 48, 92, 112, 85, 15, 0, 2, 7, 50, 36, 15, 11, 1, 0, 0, 7]") ASC LIMIT 1; @@ -74,13 +79,17 @@ select count(*) from t3; create index idx3 using hnsw on t3(b) op_type "vector_l2_ops" M 64 EF_CONSTRUCTION 200 EF_SEARCH 200 ASYNC; -select sleep(10); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_seed_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_seed_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); load data infile {'filepath'='$resources/vector/sift128_base_10k_2.csv.gz', 'compression'='gzip'} into table t3 fields terminated by ':' parallel 'true'; select count(*) from t3; -select sleep(20); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_hnsw_t3_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); select * from t3 order by L2_DISTANCE(b, "[14, 2, 0, 0, 0, 2, 42, 55, 9, 1, 0, 0, 18, 100, 77, 32, 89, 1, 0, 0, 19, 85, 15, 68, 52, 4, 0, 0, 0, 0, 2, 28, 34, 13, 5, 12, 49, 40, 39, 37, 24, 2, 0, 0, 34, 83, 88, 28, 119, 20, 0, 0, 41, 39, 13, 62, 119, 16, 2, 0, 0, 0, 10, 42, 9, 46, 82, 79, 64, 19, 2, 5, 10, 35, 26, 53, 84, 32, 34, 9, 119, 119, 21, 3, 3, 11, 17, 14, 119, 25, 8, 5, 0, 0, 11, 22, 23, 17, 42, 49, 17, 12, 5, 5, 12, 78, 119, 90, 27, 0, 4, 2, 48, 92, 112, 85, 15, 0, 2, 7, 50, 36, 15, 11, 1, 0, 0, 7]") ASC LIMIT 1; @@ -98,4 +107,3 @@ drop table t3; -- @bvt:issue drop database hnsw_cdc; - diff --git a/test/distributed/cases/pessimistic_transaction/vector/vector_ivf_async.result b/test/distributed/cases/pessimistic_transaction/vector/vector_ivf_async.result index 2656ad6dd86d9..83bbd4b54691f 100644 --- a/test/distributed/cases/pessimistic_transaction/vector/vector_ivf_async.result +++ b/test/distributed/cases/pessimistic_transaction/vector/vector_ivf_async.result @@ -18,8 +18,8 @@ select count(*) from ivf3; count(*) 10000 create index idx3 using ivfflat on ivf3(b) op_type "vector_l2_ops" LISTS=100 ASYNC; -select sleep(5); -sleep(5) +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_ivf3_seed_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); +wait_for_async_ivf3_seed_sync 0 load data infile {'filepath'='$resources/vector/sift128_base_10k_2.csv.gz', 'compression'='gzip'} into table ivf3 fields terminated by ':' parallel 'true'; select count(*) from ivf3; @@ -28,8 +28,23 @@ count(*) create table ivf4(a bigint, b int, c vecf32(3), primary key (a, b)); insert into ivf4 values (0, 1, "[1,2,3]"), (1, 2, "[2,2,3]"), (2, 3, "[1,3,3]"), (3, 4, "[1,2,4]"), (4, 5, "[1,2,5]"), (5,6, NULL); create index idx01 using ivfflat on ivf4(c) op_type "vector_l2_ops" LISTS=1 ASYNC; -select sleep(60); -sleep(60) +select case when count(*) > 0 then sleep(10) else 0 end as wait_for_async_ivf_index_sync from mo_catalog.mo_iscp_log where job_name in ('index_idx01', 'index_idx3') and job_state in (1, 2); +wait_for_async_ivf_index_sync +0 +select case when count(*) > 0 then sleep(10) else 0 end as wait_for_async_ivf_index_sync from mo_catalog.mo_iscp_log where job_name in ('index_idx01', 'index_idx3') and job_state in (1, 2); +wait_for_async_ivf_index_sync +0 +select case when count(*) > 0 then sleep(10) else 0 end as wait_for_async_ivf_index_sync from mo_catalog.mo_iscp_log where job_name in ('index_idx01', 'index_idx3') and job_state in (1, 2); +wait_for_async_ivf_index_sync +0 +select case when count(*) > 0 then sleep(10) else 0 end as wait_for_async_ivf_index_sync from mo_catalog.mo_iscp_log where job_name in ('index_idx01', 'index_idx3') and job_state in (1, 2); +wait_for_async_ivf_index_sync +0 +select case when count(*) > 0 then sleep(10) else 0 end as wait_for_async_ivf_index_sync from mo_catalog.mo_iscp_log where job_name in ('index_idx01', 'index_idx3') and job_state in (1, 2); +wait_for_async_ivf_index_sync +0 +select case when count(*) > 0 then sleep(10) else 0 end as wait_for_async_ivf_index_sync from mo_catalog.mo_iscp_log where job_name in ('index_idx01', 'index_idx3') and job_state in (1, 2); +wait_for_async_ivf_index_sync 0 select * from ivf1_async order by L2_DISTANCE(b, "[16, 15, 0, 0, 5, 46, 5, 5, 4, 0, 0, 0, 28, 118, 12, 5, 75, 44, 5, 0, 6, 32, 6, 49, 41, 74, 9, 1, 0, 0, 0, 9, 1, 9, 16, 41, 71, 80, 3, 0, 0, 4, 3, 5, 51, 106, 11, 3, 112, 28, 13, 1, 4, 8, 3, 104, 118, 14, 1, 1, 0, 0, 0, 88, 3, 27, 46, 118, 108, 49, 2, 0, 1, 46, 118, 118, 27, 12, 0, 0, 33, 118, 118, 8, 0, 0, 0, 4, 118, 95, 40, 0, 0, 0, 1, 11, 27, 38, 12, 12, 18, 29, 3, 2, 13, 30, 94, 78, 30, 19, 9, 3, 31, 45, 70, 42, 15, 1, 3, 12, 14, 22, 16, 2, 3, 17, 24, 13]") ASC LIMIT 2; a b c diff --git a/test/distributed/cases/pessimistic_transaction/vector/vector_ivf_async.sql b/test/distributed/cases/pessimistic_transaction/vector/vector_ivf_async.sql index 5e4354cbbb9ea..e07af8d8e99b9 100644 --- a/test/distributed/cases/pessimistic_transaction/vector/vector_ivf_async.sql +++ b/test/distributed/cases/pessimistic_transaction/vector/vector_ivf_async.sql @@ -25,7 +25,7 @@ select count(*) from ivf3; create index idx3 using ivfflat on ivf3(b) op_type "vector_l2_ops" LISTS=100 ASYNC; -select sleep(5); +select case when count(*) > 0 then sleep(5) else 0 end as wait_for_async_ivf3_seed_sync from mo_catalog.mo_iscp_log where job_name = 'index_idx3' and job_state in (1, 2); load data infile {'filepath'='$resources/vector/sift128_base_10k_2.csv.gz', 'compression'='gzip'} into table ivf3 fields terminated by ':' parallel 'true'; @@ -48,7 +48,12 @@ create index idx01 using ivfflat on ivf4(c) op_type "vector_l2_ops" LISTS=1 ASYN -- end create table -select sleep(60); +select case when count(*) > 0 then sleep(10) else 0 end as wait_for_async_ivf_index_sync from mo_catalog.mo_iscp_log where job_name in ('index_idx01', 'index_idx3') and job_state in (1, 2); +select case when count(*) > 0 then sleep(10) else 0 end as wait_for_async_ivf_index_sync from mo_catalog.mo_iscp_log where job_name in ('index_idx01', 'index_idx3') and job_state in (1, 2); +select case when count(*) > 0 then sleep(10) else 0 end as wait_for_async_ivf_index_sync from mo_catalog.mo_iscp_log where job_name in ('index_idx01', 'index_idx3') and job_state in (1, 2); +select case when count(*) > 0 then sleep(10) else 0 end as wait_for_async_ivf_index_sync from mo_catalog.mo_iscp_log where job_name in ('index_idx01', 'index_idx3') and job_state in (1, 2); +select case when count(*) > 0 then sleep(10) else 0 end as wait_for_async_ivf_index_sync from mo_catalog.mo_iscp_log where job_name in ('index_idx01', 'index_idx3') and job_state in (1, 2); +select case when count(*) > 0 then sleep(10) else 0 end as wait_for_async_ivf_index_sync from mo_catalog.mo_iscp_log where job_name in ('index_idx01', 'index_idx3') and job_state in (1, 2); -- start SELECT diff --git a/test/distributed/cases/statement_query_type/statement_query_type_3.result b/test/distributed/cases/statement_query_type/statement_query_type_3.result index dfc161eae5535..2b6192b4e9ca2 100644 --- a/test/distributed/cases/statement_query_type/statement_query_type_3.result +++ b/test/distributed/cases/statement_query_type/statement_query_type_3.result @@ -98,7 +98,13 @@ sleep(1) col seq key path index value this 0 UNNEST_DEFAULT 0 a $.a null 1 {"a": 1} /* cloud_nonuser */ use system; /* cloud_nonuser */ drop database test_db; -select sleep(15); -sleep(15) +select case when count(*) >= 59 then 0 else sleep(5) end as wait_for_statement_query_type_3_ready from system.statement_info where account="bvt_query_type" and sql_source_type="cloud_nonuser_sql" and status != "Running" and statement not like '%mo_ctl%' and aggr_count = 0; +wait_for_statement_query_type_3_ready +0 +select case when count(*) >= 59 then 0 else sleep(5) end as wait_for_statement_query_type_3_ready from system.statement_info where account="bvt_query_type" and sql_source_type="cloud_nonuser_sql" and status != "Running" and statement not like '%mo_ctl%' and aggr_count = 0; +wait_for_statement_query_type_3_ready +0 +select case when count(*) >= 59 then 0 else sleep(5) end as wait_for_statement_query_type_3_ready from system.statement_info where account="bvt_query_type" and sql_source_type="cloud_nonuser_sql" and status != "Running" and statement not like '%mo_ctl%' and aggr_count = 0; +wait_for_statement_query_type_3_ready 0 drop account if exists bvt_query_type; diff --git a/test/distributed/cases/statement_query_type/statement_query_type_3.sql b/test/distributed/cases/statement_query_type/statement_query_type_3.sql index 81c1837f5e7b2..95a816f5465a7 100644 --- a/test/distributed/cases/statement_query_type/statement_query_type_3.sql +++ b/test/distributed/cases/statement_query_type/statement_query_type_3.sql @@ -84,7 +84,9 @@ create database statement_query_type; -- -- TIPs: DO NOT run this case multiple times in 15s -- -select sleep(15); +select case when count(*) >= 59 then 0 else sleep(5) end as wait_for_statement_query_type_3_ready from system.statement_info where account="bvt_query_type" and sql_source_type="cloud_nonuser_sql" and status != "Running" and statement not like '%mo_ctl%' and aggr_count = 0; +select case when count(*) >= 59 then 0 else sleep(5) end as wait_for_statement_query_type_3_ready from system.statement_info where account="bvt_query_type" and sql_source_type="cloud_nonuser_sql" and status != "Running" and statement not like '%mo_ctl%' and aggr_count = 0; +select case when count(*) >= 59 then 0 else sleep(5) end as wait_for_statement_query_type_3_ready from system.statement_info where account="bvt_query_type" and sql_source_type="cloud_nonuser_sql" and status != "Running" and statement not like '%mo_ctl%' and aggr_count = 0; -- cleanup drop account if exists bvt_query_type; diff --git a/test/distributed/cases/vector/vector_index_edge_cases.result b/test/distributed/cases/vector/vector_index_edge_cases.result index 40927fe8d3831..7cc34ba3d1027 100644 --- a/test/distributed/cases/vector/vector_index_edge_cases.result +++ b/test/distributed/cases/vector/vector_index_edge_cases.result @@ -38,7 +38,7 @@ LIMIT 3; EXPLAIN SELECT id, name, score FROM test_vector_edge_cases ORDER BY l2_distance(embedding, '[0.863103449344635,0.6232981085777283,0.3308980166912079,0.06355834752321243,0.3109823167324066,0.32518333196640015,0.7296061515808105,0.6375574469566345,0.8872127532958984,0.472214937210083,0.11959424614906311,0.7132447957992554,0.7607850432395935,0.5612772107124329,0.7709671854972839,0.49379560351371765]') LIMIT 3; -➤ AP QUERY PLAN ON ONE CN(24 core)[12,0,0] 𝄀 +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 Project 𝄀 -> Sort 𝄀 Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 @@ -50,12 +50,13 @@ Project 𝄀 -> Table Scan on vector_index_edge_cases.test_vector_edge_cases 𝄀 Runtime Filter Probe: test_vector_edge_cases.id 𝄀 -> Table Function on ivf_search 𝄀 - Index Reader Param: Limit: 3 + Index Reader Param: Limit: 3 𝄀 + Limit: 3 EXPLAIN SELECT id, name, score FROM test_vector_edge_cases WHERE score >= 4.0 ORDER BY l2_distance(embedding, '[0.863103449344635,0.6232981085777283,0.3308980166912079,0.06355834752321243,0.3109823167324066,0.32518333196640015,0.7296061515808105,0.6375574469566345,0.8872127532958984,0.472214937210083,0.11959424614906311,0.7132447957992554,0.7607850432395935,0.5612772107124329,0.7709671854972839,0.49379560351371765]') LIMIT 3; -➤ AP QUERY PLAN ON ONE CN(24 core)[12,0,0] 𝄀 +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 Project 𝄀 -> Sort 𝄀 Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 @@ -66,7 +67,8 @@ Project 𝄀 -> Table Scan on vector_index_edge_cases.test_vector_edge_cases 𝄀 Filter Cond: (test_vector_edge_cases.score >= 4) 𝄀 -> Table Function on ivf_search 𝄀 - Index Reader Param: Limit: 15 + Index Reader Param: Limit: 15 𝄀 + Limit: 15 EXPLAIN WITH t AS ( SELECT id, name, score, l2_distance(embedding, '[0.863103449344635,0.6232981085777283,0.3308980166912079,0.06355834752321243,0.3109823167324066,0.32518333196640015,0.7296061515808105,0.6375574469566345,0.8872127532958984,0.472214937210083,0.11959424614906311,0.7132447957992554,0.7607850432395935,0.5612772107124329,0.7709671854972839,0.49379560351371765]') as vec_dist @@ -77,7 +79,7 @@ FROM t WHERE vec_dist < 0.8 ORDER BY vec_dist LIMIT 3; -➤ AP QUERY PLAN ON ONE CN(24 core)[12,0,0] 𝄀 +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 Project 𝄀 -> Sort 𝄀 Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 @@ -89,7 +91,8 @@ Project 𝄀 -> Table Scan on vector_index_edge_cases.test_vector_edge_cases 𝄀 Runtime Filter Probe: test_vector_edge_cases.id 𝄀 -> Table Function on ivf_search 𝄀 - Index Reader Param: Limit: 3 DistRange: (-Inf,0.8) + Index Reader Param: Limit: 3 DistRange: (-Inf,0.8) 𝄀 + Limit: 3 EXPLAIN WITH t AS ( SELECT id, name, score, l2_distance(embedding, '[0.863103449344635,0.6232981085777283,0.3308980166912079,0.06355834752321243,0.3109823167324066,0.32518333196640015,0.7296061515808105,0.6375574469566345,0.8872127532958984,0.472214937210083,0.11959424614906311,0.7132447957992554,0.7607850432395935,0.5612772107124329,0.7709671854972839,0.49379560351371765]') as vec_dist @@ -100,7 +103,7 @@ FROM t WHERE vec_dist >= 0.8 ORDER BY vec_dist LIMIT 3; -➤ AP QUERY PLAN ON ONE CN(24 core)[12,0,0] 𝄀 +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 Project 𝄀 -> Sort 𝄀 Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 @@ -112,7 +115,8 @@ Project 𝄀 -> Table Scan on vector_index_edge_cases.test_vector_edge_cases 𝄀 Runtime Filter Probe: test_vector_edge_cases.id 𝄀 -> Table Function on ivf_search 𝄀 - Index Reader Param: Limit: 3 DistRange: [0.8,Inf) + Index Reader Param: Limit: 3 DistRange: [0.8,Inf) 𝄀 + Limit: 3 EXPLAIN WITH t AS ( SELECT id, name, score, l2_distance(embedding, '[0.863103449344635,0.6232981085777283,0.3308980166912079,0.06355834752321243,0.3109823167324066,0.32518333196640015,0.7296061515808105,0.6375574469566345,0.8872127532958984,0.472214937210083,0.11959424614906311,0.7132447957992554,0.7607850432395935,0.5612772107124329,0.7709671854972839,0.49379560351371765]') as vec_dist @@ -123,7 +127,7 @@ FROM t WHERE vec_dist <= 1.0 AND vec_dist > 0.4 ORDER BY vec_dist LIMIT 3; -➤ AP QUERY PLAN ON ONE CN(24 core)[12,0,0] 𝄀 +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 Project 𝄀 -> Sort 𝄀 Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 @@ -135,5 +139,6 @@ Project 𝄀 -> Table Scan on vector_index_edge_cases.test_vector_edge_cases 𝄀 Runtime Filter Probe: test_vector_edge_cases.id 𝄀 -> Table Function on ivf_search 𝄀 - Index Reader Param: Limit: 3 DistRange: (0.4,1] + Index Reader Param: Limit: 3 DistRange: (0.4,1] 𝄀 + Limit: 3 drop table test_vector_edge_cases; diff --git a/test/distributed/cases/vector/vector_index_include_metadata.result b/test/distributed/cases/vector/vector_index_include_metadata.result new file mode 100644 index 0000000000000..54ded4bcfa9a3 --- /dev/null +++ b/test/distributed/cases/vector/vector_index_include_metadata.result @@ -0,0 +1,62 @@ +drop database if exists vector_index_include_metadata; +create database vector_index_include_metadata; +use vector_index_include_metadata; +create table t_ivf( +id int primary key, +embedding vecf32(3), +title varchar(20), +category int +); +create index idx_ivf_include_meta using ivfflat on t_ivf(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); +select algo_table_type, included_columns, case when algo_params like '%include_columns%' then 1 else 0 end as include_in_params +from mo_catalog.mo_indexes +where name = 'idx_ivf_include_meta' +and algo = 'ivfflat' +and table_id = ( +select rel_id +from mo_catalog.mo_tables +where reldatabase = database() +and relname = 't_ivf' +) +order by algo_table_type; +➤ algo_table_type[12,-1,0] ¦ included_columns[12,0,0] ¦ include_in_params[-5,64,0] 𝄀 +centroids ¦ ["title","category"] ¦ 0 𝄀 +entries ¦ ["title","category"] ¦ 0 𝄀 +metadata ¦ ["title","category"] ¦ 0 +set experimental_hnsw_index = 1; +create table t_hnsw( +id bigint primary key, +embedding vecf32(3), +title varchar(20), +category int +); +insert into t_hnsw values +(1, "[0,0,1]", "cold", 1), +(2, "[0,1,0]", "warm", 2), +(3, "[2,0,0]", "hot", 2); +create index idx_hnsw_include_meta using hnsw on t_hnsw(embedding) +op_type "vector_l2_ops" include(title, category); +select algo_table_type, included_columns, case when algo_params like '%include_columns%' then 1 else 0 end as include_in_params +from mo_catalog.mo_indexes +where name = 'idx_hnsw_include_meta' +and algo = 'hnsw' +and table_id = ( +select rel_id +from mo_catalog.mo_tables +where reldatabase = database() +and relname = 't_hnsw' +) +order by algo_table_type; +➤ algo_table_type[12,-1,0] ¦ included_columns[12,0,0] ¦ include_in_params[-5,64,0] 𝄀 +hnsw_index ¦ ["title","category"] ¦ 0 𝄀 +hnsw_meta ¦ ["title","category"] ¦ 0 +select id, title, category +from t_hnsw +where category = 2 +order by l2_distance(embedding, "[0,1,0]") +limit 1; +➤ id[-5,64,0] ¦ title[12,-1,0] ¦ category[4,32,0] 𝄀 +2 ¦ warm ¦ 2 +set experimental_hnsw_index = 0; +drop database vector_index_include_metadata; diff --git a/test/distributed/cases/vector/vector_index_include_metadata.sql b/test/distributed/cases/vector/vector_index_include_metadata.sql new file mode 100644 index 0000000000000..a50712d5e0961 --- /dev/null +++ b/test/distributed/cases/vector/vector_index_include_metadata.sql @@ -0,0 +1,64 @@ +drop database if exists vector_index_include_metadata; +create database vector_index_include_metadata; +use vector_index_include_metadata; + +create table t_ivf( + id int primary key, + embedding vecf32(3), + title varchar(20), + category int +); + +create index idx_ivf_include_meta using ivfflat on t_ivf(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); + +select algo_table_type, included_columns, case when algo_params like '%include_columns%' then 1 else 0 end as include_in_params +from mo_catalog.mo_indexes +where name = 'idx_ivf_include_meta' + and algo = 'ivfflat' + and table_id = ( + select rel_id + from mo_catalog.mo_tables + where reldatabase = database() + and relname = 't_ivf' + ) +order by algo_table_type; + +set experimental_hnsw_index = 1; + +create table t_hnsw( + id bigint primary key, + embedding vecf32(3), + title varchar(20), + category int +); + +insert into t_hnsw values + (1, "[0,0,1]", "cold", 1), + (2, "[0,1,0]", "warm", 2), + (3, "[2,0,0]", "hot", 2); + +create index idx_hnsw_include_meta using hnsw on t_hnsw(embedding) +op_type "vector_l2_ops" include(title, category); + +select algo_table_type, included_columns, case when algo_params like '%include_columns%' then 1 else 0 end as include_in_params +from mo_catalog.mo_indexes +where name = 'idx_hnsw_include_meta' + and algo = 'hnsw' + and table_id = ( + select rel_id + from mo_catalog.mo_tables + where reldatabase = database() + and relname = 't_hnsw' + ) +order by algo_table_type; + +select id, title, category +from t_hnsw +where category = 2 +order by l2_distance(embedding, "[0,1,0]") +limit 1; + +set experimental_hnsw_index = 0; + +drop database vector_index_include_metadata; diff --git a/test/distributed/cases/vector/vector_ivf_retry.result b/test/distributed/cases/vector/vector_ivf_retry.result index 05a4a05a132f6..c86e579b7a6ea 100644 --- a/test/distributed/cases/vector/vector_ivf_retry.result +++ b/test/distributed/cases/vector/vector_ivf_retry.result @@ -150,5 +150,6 @@ id set enable_vector_auto_mode_by_default = 0; select id from t_phase6 where filter_col = 1 order by l2_distance(vec, '[0,0,0]') limit 1; id +set probe_limit = 5; drop table t_phase6; drop database test_retry; diff --git a/test/distributed/cases/vector/vector_ivf_retry.sql b/test/distributed/cases/vector/vector_ivf_retry.sql index 598b909bf4dcc..08d307c074bef 100644 --- a/test/distributed/cases/vector/vector_ivf_retry.sql +++ b/test/distributed/cases/vector/vector_ivf_retry.sql @@ -252,5 +252,6 @@ set enable_vector_auto_mode_by_default = 0; -- Test 6.3: Back to default (post) select id from t_phase6 where filter_col = 1 order by l2_distance(vec, '[0,0,0]') limit 1; +set probe_limit = 5; drop table t_phase6; drop database test_retry; diff --git a/test/distributed/cases/vector/vector_ivfflat_entries_panic_repro.result b/test/distributed/cases/vector/vector_ivfflat_entries_panic_repro.result index a24f7529ed466..9422f2ddd70b7 100644 --- a/test/distributed/cases/vector/vector_ivfflat_entries_panic_repro.result +++ b/test/distributed/cases/vector/vector_ivfflat_entries_panic_repro.result @@ -151,6 +151,6 @@ SET @q = CONCAT( PREPARE s1 FROM @q; EXECUTE s1; cnt -4000 +20000 DEALLOCATE PREPARE s1; DROP TABLE IF EXISTS t_ivfflat_entries_panic; diff --git a/test/distributed/cases/vector/vector_ivfflat_entries_panic_repro.sql b/test/distributed/cases/vector/vector_ivfflat_entries_panic_repro.sql index faa03abc992b7..0b90fff9f6733 100644 --- a/test/distributed/cases/vector/vector_ivfflat_entries_panic_repro.sql +++ b/test/distributed/cases/vector/vector_ivfflat_entries_panic_repro.sql @@ -136,6 +136,7 @@ SET @entries = ( -- Direct entries query with large LIMIT to reproduce panic. -- Keep this query shape aligned with vector_search_panic_entries_stable.py. +-- After the panic fix, the top-20000 subquery should complete and return 20000 rows. SET @q = CONCAT( 'SELECT COUNT(*) AS cnt FROM (', 'SELECT __mo_index_pri_col, ', diff --git a/test/distributed/cases/vector/vector_ivfflat_include_alter_table.result b/test/distributed/cases/vector/vector_ivfflat_include_alter_table.result new file mode 100644 index 0000000000000..430ce711f69d7 --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_alter_table.result @@ -0,0 +1,135 @@ +drop database if exists vector_ivfflat_include_phase7; +create database vector_ivfflat_include_phase7; +use vector_ivfflat_include_phase7; +drop table if exists vector_ivfflat_include_phase7_include; +create table vector_ivfflat_include_phase7_include( +id int primary key, +embedding vecf32(3), +title varchar(20), +category int, +note varchar(20) +); +create index idx_ivf_include_phase7 using ivfflat on vector_ivfflat_include_phase7_include(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); +insert into vector_ivfflat_include_phase7_include values +(1, "[1,2,3]", "alpha", 10, "n1"), +(2, "[1,2,4]", "beta", 20, "n2"), +(3, "[9,9,9]", "gamma", 30, "n3"), +(4, "[2,2,2]", "delta", 40, "n4"); +show create table vector_ivfflat_include_phase7_include; +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +vector_ivfflat_include_phase7_include ¦ CREATE TABLE `vector_ivfflat_include_phase7_include` ( + `id` int NOT NULL, + `embedding` vecf32(3) DEFAULT NULL, + `title` varchar(20) DEFAULT NULL, + `category` int DEFAULT NULL, + `note` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_ivf_include_phase7` USING ivfflat (`embedding`) lists = 2 op_type 'vector_l2_ops' INCLUDE (`title`, `category`) +) +show index from vector_ivfflat_include_phase7_include; +➤ Table[12,-1,0] ¦ Non_unique[-5,64,0] ¦ Key_name[12,-1,0] ¦ Seq_in_index[4,32,0] ¦ Column_name[12,-1,0] ¦ Collation[12,-1,0] ¦ Cardinality[-5,64,0] ¦ Sub_part[12,-1,0] ¦ Packed[12,-1,0] ¦ Null[12,-1,0] ¦ Index_type[12,-1,0] ¦ Comment[1,0,0] ¦ Index_comment[12,-1,0] ¦ Index_params[12,-1,0] ¦ Visible[12,-1,0] ¦ Expression[12,-1,0] 𝄀 +vector_ivfflat_include_phase7_include ¦ 0 ¦ PRIMARY ¦ 1 ¦ id ¦ A ¦ 0 ¦ NULL ¦ NULL ¦ ¦ ¦ ¦ ¦ ¦ YES ¦ id 𝄀 +vector_ivfflat_include_phase7_include ¦ 1 ¦ idx_ivf_include_phase7 ¦ 1 ¦ embedding ¦ A ¦ 0 ¦ NULL ¦ NULL ¦ YES ¦ ivfflat ¦ ¦ ¦ {"lists":"2","op_type":"vector_l2_ops"} ¦ YES ¦ embedding +alter table vector_ivfflat_include_phase7_include rename column title to headline; +show create table vector_ivfflat_include_phase7_include; +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +vector_ivfflat_include_phase7_include ¦ CREATE TABLE `vector_ivfflat_include_phase7_include` ( + `id` int NOT NULL, + `embedding` vecf32(3) DEFAULT NULL, + `headline` varchar(20) DEFAULT NULL, + `category` int DEFAULT NULL, + `note` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_ivf_include_phase7` USING ivfflat (`embedding`) lists = 2 op_type 'vector_l2_ops' INCLUDE (`headline`, `category`) +) +show index from vector_ivfflat_include_phase7_include; +➤ Table[12,-1,0] ¦ Non_unique[-5,64,0] ¦ Key_name[12,-1,0] ¦ Seq_in_index[4,32,0] ¦ Column_name[12,-1,0] ¦ Collation[12,-1,0] ¦ Cardinality[-5,64,0] ¦ Sub_part[12,-1,0] ¦ Packed[12,-1,0] ¦ Null[12,-1,0] ¦ Index_type[12,-1,0] ¦ Comment[1,0,0] ¦ Index_comment[12,-1,0] ¦ Index_params[12,-1,0] ¦ Visible[12,-1,0] ¦ Expression[12,-1,0] 𝄀 +vector_ivfflat_include_phase7_include ¦ 0 ¦ PRIMARY ¦ 1 ¦ id ¦ A ¦ 0 ¦ NULL ¦ NULL ¦ ¦ ¦ ¦ ¦ ¦ YES ¦ id 𝄀 +vector_ivfflat_include_phase7_include ¦ 1 ¦ idx_ivf_include_phase7 ¦ 1 ¦ embedding ¦ A ¦ 0 ¦ NULL ¦ NULL ¦ YES ¦ ivfflat ¦ ¦ ¦ {"lists":"2","op_type":"vector_l2_ops"} ¦ YES ¦ embedding +explain select id, headline, category +from vector_ivfflat_include_phase7_include +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=force'; +➤ TP QUERY PLAN[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: l2_distance(vector_ivfflat_include_phase7_include.embedding, ) INTERNAL, vector_ivfflat_include_phase7_include.id INTERNAL 𝄀 + Limit: 2 𝄀 + -> Table Scan on vector_ivfflat_include_phase7.vector_ivfflat_include_phase7_include +select id, headline, category +from vector_ivfflat_include_phase7_include +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=force'; +➤ id[4,32,0] ¦ headline[12,-1,0] ¦ category[4,32,0] 𝄀 +1 ¦ alpha ¦ 10 𝄀 +2 ¦ beta ¦ 20 +alter table vector_ivfflat_include_phase7_include drop column category; +show create table vector_ivfflat_include_phase7_include; +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +vector_ivfflat_include_phase7_include ¦ CREATE TABLE `vector_ivfflat_include_phase7_include` ( + `id` int NOT NULL, + `embedding` vecf32(3) DEFAULT NULL, + `headline` varchar(20) DEFAULT NULL, + `note` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id`) +) +explain select id, headline +from vector_ivfflat_include_phase7_include +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; +➤ TP QUERY PLAN[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: l2_distance(vector_ivfflat_include_phase7_include.embedding, ) INTERNAL 𝄀 + Limit: 2 𝄀 + -> Table Scan on vector_ivfflat_include_phase7.vector_ivfflat_include_phase7_include +select id, headline +from vector_ivfflat_include_phase7_include +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; +➤ id[4,32,0] ¦ headline[12,-1,0] 𝄀 +1 ¦ alpha 𝄀 +2 ¦ beta +drop table vector_ivfflat_include_phase7_include; +drop table if exists vector_ivfflat_include_phase7_plain; +create table vector_ivfflat_include_phase7_plain( +id int primary key, +embedding vecf32(3), +note varchar(20) +); +create index idx_ivf_plain_phase7 using ivfflat on vector_ivfflat_include_phase7_plain(embedding) +lists=2 op_type "vector_l2_ops"; +insert into vector_ivfflat_include_phase7_plain values +(1, "[1,2,3]", "n1"), +(2, "[1,2,4]", "n2"), +(3, "[9,9,9]", "n3"), +(4, "[2,2,2]", "n4"); +explain select id, note +from vector_ivfflat_include_phase7_plain +where note in ("n2", "n4") +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 2 𝄀 + -> Join 𝄀 + Join Type: INNER 𝄀 + Join Cond: (vector_ivfflat_include_phase7_plain.id = mo_ivf_alias_0.pkid) 𝄀 + -> Table Scan on vector_ivfflat_include_phase7.vector_ivfflat_include_phase7_plain 𝄀 + Filter Cond: vector_ivfflat_include_phase7_plain.note in ([n2 n4]) 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 12 𝄀 + Limit: 12 +select id, note +from vector_ivfflat_include_phase7_plain +where note in ("n2", "n4") +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; +➤ id[4,32,0] ¦ note[12,-1,0] 𝄀 +2 ¦ n2 𝄀 +4 ¦ n4 +drop table vector_ivfflat_include_phase7_plain; +drop database vector_ivfflat_include_phase7; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_alter_table.sql b/test/distributed/cases/vector/vector_ivfflat_include_alter_table.sql new file mode 100644 index 0000000000000..a0fdc1d489577 --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_alter_table.sql @@ -0,0 +1,89 @@ +drop database if exists vector_ivfflat_include_phase7; +create database vector_ivfflat_include_phase7; +use vector_ivfflat_include_phase7; + +drop table if exists vector_ivfflat_include_phase7_include; +create table vector_ivfflat_include_phase7_include( + id int primary key, + embedding vecf32(3), + title varchar(20), + category int, + note varchar(20) +); + +create index idx_ivf_include_phase7 using ivfflat on vector_ivfflat_include_phase7_include(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); + +insert into vector_ivfflat_include_phase7_include values + (1, "[1,2,3]", "alpha", 10, "n1"), + (2, "[1,2,4]", "beta", 20, "n2"), + (3, "[9,9,9]", "gamma", 30, "n3"), + (4, "[2,2,2]", "delta", 40, "n4"); + +show create table vector_ivfflat_include_phase7_include; +show index from vector_ivfflat_include_phase7_include; + +alter table vector_ivfflat_include_phase7_include rename column title to headline; + +show create table vector_ivfflat_include_phase7_include; +show index from vector_ivfflat_include_phase7_include; + +-- @separator:table +explain select id, headline, category +from vector_ivfflat_include_phase7_include +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=force'; + +select id, headline, category +from vector_ivfflat_include_phase7_include +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=force'; + +alter table vector_ivfflat_include_phase7_include drop column category; + +show create table vector_ivfflat_include_phase7_include; + +-- @separator:table +explain select id, headline +from vector_ivfflat_include_phase7_include +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; + +select id, headline +from vector_ivfflat_include_phase7_include +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; + +drop table vector_ivfflat_include_phase7_include; + +drop table if exists vector_ivfflat_include_phase7_plain; +create table vector_ivfflat_include_phase7_plain( + id int primary key, + embedding vecf32(3), + note varchar(20) +); + +create index idx_ivf_plain_phase7 using ivfflat on vector_ivfflat_include_phase7_plain(embedding) +lists=2 op_type "vector_l2_ops"; + +insert into vector_ivfflat_include_phase7_plain values + (1, "[1,2,3]", "n1"), + (2, "[1,2,4]", "n2"), + (3, "[9,9,9]", "n3"), + (4, "[2,2,2]", "n4"); + +-- @separator:table +explain select id, note +from vector_ivfflat_include_phase7_plain +where note in ("n2", "n4") +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; + +select id, note +from vector_ivfflat_include_phase7_plain +where note in ("n2", "n4") +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; + +drop table vector_ivfflat_include_phase7_plain; +drop database vector_ivfflat_include_phase7; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_ddl_showcase.result b/test/distributed/cases/vector/vector_ivfflat_include_ddl_showcase.result new file mode 100644 index 0000000000000..8fe1752cd6d1c --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_ddl_showcase.result @@ -0,0 +1,28 @@ +drop table if exists vector_ivfflat_include_phase1; +create table vector_ivfflat_include_phase1( +id int primary key, +embedding vecf32(3), +title varchar(20), +category int +); +insert into vector_ivfflat_include_phase1 values +(1, "[1,2,3]", "alpha", 10), +(2, "[2,3,4]", "beta", 20), +(3, "[3,4,5]", "gamma", 30); +create index idx_ivf_include using ivfflat on vector_ivfflat_include_phase1(embedding) +lists=2 op_type "vector_l2_ops" include (title, category); +show create table vector_ivfflat_include_phase1; +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +vector_ivfflat_include_phase1 ¦ CREATE TABLE `vector_ivfflat_include_phase1` ( + `id` int NOT NULL, + `embedding` vecf32(3) DEFAULT NULL, + `title` varchar(20) DEFAULT NULL, + `category` int DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_ivf_include` USING ivfflat (`embedding`) lists = 2 op_type 'vector_l2_ops' INCLUDE (`title`, `category`) +) +show index from vector_ivfflat_include_phase1; +➤ Table[12,-1,0] ¦ Non_unique[-5,64,0] ¦ Key_name[12,-1,0] ¦ Seq_in_index[4,32,0] ¦ Column_name[12,-1,0] ¦ Collation[12,-1,0] ¦ Cardinality[-5,64,0] ¦ Sub_part[12,-1,0] ¦ Packed[12,-1,0] ¦ Null[12,-1,0] ¦ Index_type[12,-1,0] ¦ Comment[1,0,0] ¦ Index_comment[12,-1,0] ¦ Index_params[12,-1,0] ¦ Visible[12,-1,0] ¦ Expression[12,-1,0] 𝄀 +vector_ivfflat_include_phase1 ¦ 0 ¦ PRIMARY ¦ 1 ¦ id ¦ A ¦ 0 ¦ NULL ¦ NULL ¦ ¦ ¦ ¦ ¦ ¦ YES ¦ id 𝄀 +vector_ivfflat_include_phase1 ¦ 1 ¦ idx_ivf_include ¦ 1 ¦ embedding ¦ A ¦ 0 ¦ NULL ¦ NULL ¦ YES ¦ ivfflat ¦ ¦ ¦ {"lists":"2","op_type":"vector_l2_ops"} ¦ YES ¦ embedding +drop table vector_ivfflat_include_phase1; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_ddl_showcase.sql b/test/distributed/cases/vector/vector_ivfflat_include_ddl_showcase.sql new file mode 100644 index 0000000000000..fe8fc2e8e94c8 --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_ddl_showcase.sql @@ -0,0 +1,21 @@ +drop table if exists vector_ivfflat_include_phase1; + +create table vector_ivfflat_include_phase1( + id int primary key, + embedding vecf32(3), + title varchar(20), + category int +); + +insert into vector_ivfflat_include_phase1 values + (1, "[1,2,3]", "alpha", 10), + (2, "[2,3,4]", "beta", 20), + (3, "[3,4,5]", "gamma", 30); + +create index idx_ivf_include using ivfflat on vector_ivfflat_include_phase1(embedding) + lists=2 op_type "vector_l2_ops" include (title, category); + +show create table vector_ivfflat_include_phase1; +show index from vector_ivfflat_include_phase1; + +drop table vector_ivfflat_include_phase1; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_dml_sync.result b/test/distributed/cases/vector/vector_ivfflat_include_dml_sync.result new file mode 100644 index 0000000000000..d7cfb0fbd5954 --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_dml_sync.result @@ -0,0 +1,82 @@ +drop database if exists vector_ivfflat_include_phase3; +create database vector_ivfflat_include_phase3; +use vector_ivfflat_include_phase3; +drop table if exists vector_ivfflat_include_phase3; +create table vector_ivfflat_include_phase3( +id int primary key, +embedding vecf32(3), +title varchar(20), +category int, +note varchar(20) +); +create index idx_ivf_include_dml using ivfflat on vector_ivfflat_include_phase3(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); +insert into vector_ivfflat_include_phase3 values +(1, "[1,2,3]", "alpha", 10, "n1"), +(2, "[4,5,6]", "beta", 20, "n2"), +(3, "[7,8,9]", "gamma", 30, "n3"); +set @entries = ( +select index_table_name +from mo_catalog.mo_indexes +where name = 'idx_ivf_include_dml' +and algo = 'ivfflat' +and algo_table_type = 'entries' +and table_id in ( +select rel_id +from mo_catalog.mo_tables +where reldatabase = database() +and relname = 'vector_ivfflat_include_phase3' +) +limit 1 +); +set @q = concat( +'select `__mo_index_pri_col`, `__mo_index_centroid_fk_entry`, `__mo_index_include_title`, `__mo_index_include_category` ', +'from `', database(), '`.`', @entries, '` ', +'order by `__mo_index_pri_col`' +); +prepare s1 from @q; +execute s1; +➤ __mo_index_pri_col[4,32,0] ¦ __mo_index_centroid_fk_entry[12,3,0] ¦ __mo_index_include_title[12,-1,0] ¦ __mo_index_include_category[4,32,0] 𝄀 +1 ¦ [1, 2, 3] ¦ alpha ¦ 10 𝄀 +2 ¦ [4, 5, 6] ¦ beta ¦ 20 𝄀 +3 ¦ [7, 8, 9] ¦ gamma ¦ 30 +update vector_ivfflat_include_phase3 +set note = 'n2-only' +where id = 2; +execute s1; +➤ __mo_index_pri_col[4,32,0] ¦ __mo_index_centroid_fk_entry[12,3,0] ¦ __mo_index_include_title[12,-1,0] ¦ __mo_index_include_category[4,32,0] 𝄀 +1 ¦ [1, 2, 3] ¦ alpha ¦ 10 𝄀 +2 ¦ [4, 5, 6] ¦ beta ¦ 20 𝄀 +3 ¦ [7, 8, 9] ¦ gamma ¦ 30 +update vector_ivfflat_include_phase3 +set title = 'beta2', category = 200, note = 'n2b' +where id = 2; +execute s1; +➤ __mo_index_pri_col[4,32,0] ¦ __mo_index_centroid_fk_entry[12,3,0] ¦ __mo_index_include_title[12,-1,0] ¦ __mo_index_include_category[4,32,0] 𝄀 +1 ¦ [1, 2, 3] ¦ alpha ¦ 10 𝄀 +2 ¦ [4, 5, 6] ¦ beta2 ¦ 200 𝄀 +3 ¦ [7, 8, 9] ¦ gamma ¦ 30 +update vector_ivfflat_include_phase3 +set embedding = "[4,5,7]" +where id = 2; +execute s1; +➤ __mo_index_pri_col[4,32,0] ¦ __mo_index_centroid_fk_entry[12,3,0] ¦ __mo_index_include_title[12,-1,0] ¦ __mo_index_include_category[4,32,0] 𝄀 +1 ¦ [1, 2, 3] ¦ alpha ¦ 10 𝄀 +2 ¦ [4, 5, 7] ¦ beta2 ¦ 200 𝄀 +3 ¦ [7, 8, 9] ¦ gamma ¦ 30 +update vector_ivfflat_include_phase3 +set id = 20 +where id = 2; +execute s1; +➤ __mo_index_pri_col[4,32,0] ¦ __mo_index_centroid_fk_entry[12,3,0] ¦ __mo_index_include_title[12,-1,0] ¦ __mo_index_include_category[4,32,0] 𝄀 +1 ¦ [1, 2, 3] ¦ alpha ¦ 10 𝄀 +3 ¦ [7, 8, 9] ¦ gamma ¦ 30 𝄀 +20 ¦ [4, 5, 7] ¦ beta2 ¦ 200 +delete from vector_ivfflat_include_phase3 where id = 1; +execute s1; +➤ __mo_index_pri_col[4,32,0] ¦ __mo_index_centroid_fk_entry[12,3,0] ¦ __mo_index_include_title[12,-1,0] ¦ __mo_index_include_category[4,32,0] 𝄀 +3 ¦ [7, 8, 9] ¦ gamma ¦ 30 𝄀 +20 ¦ [4, 5, 7] ¦ beta2 ¦ 200 +deallocate prepare s1; +drop table vector_ivfflat_include_phase3; +drop database vector_ivfflat_include_phase3; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_dml_sync.sql b/test/distributed/cases/vector/vector_ivfflat_include_dml_sync.sql new file mode 100644 index 0000000000000..9843aa358b6f5 --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_dml_sync.sql @@ -0,0 +1,72 @@ +drop database if exists vector_ivfflat_include_phase3; +create database vector_ivfflat_include_phase3; +use vector_ivfflat_include_phase3; + +drop table if exists vector_ivfflat_include_phase3; +create table vector_ivfflat_include_phase3( + id int primary key, + embedding vecf32(3), + title varchar(20), + category int, + note varchar(20) +); + +create index idx_ivf_include_dml using ivfflat on vector_ivfflat_include_phase3(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); + +insert into vector_ivfflat_include_phase3 values + (1, "[1,2,3]", "alpha", 10, "n1"), + (2, "[4,5,6]", "beta", 20, "n2"), + (3, "[7,8,9]", "gamma", 30, "n3"); + +set @entries = ( + select index_table_name + from mo_catalog.mo_indexes + where name = 'idx_ivf_include_dml' + and algo = 'ivfflat' + and algo_table_type = 'entries' + and table_id in ( + select rel_id + from mo_catalog.mo_tables + where reldatabase = database() + and relname = 'vector_ivfflat_include_phase3' + ) + limit 1 +); + +set @q = concat( + 'select `__mo_index_pri_col`, `__mo_index_centroid_fk_entry`, `__mo_index_include_title`, `__mo_index_include_category` ', + 'from `', database(), '`.`', @entries, '` ', + 'order by `__mo_index_pri_col`' +); + +prepare s1 from @q; +execute s1; + +update vector_ivfflat_include_phase3 +set note = 'n2-only' +where id = 2; +execute s1; + +update vector_ivfflat_include_phase3 +set title = 'beta2', category = 200, note = 'n2b' +where id = 2; +execute s1; + +update vector_ivfflat_include_phase3 +set embedding = "[4,5,7]" +where id = 2; +execute s1; + +update vector_ivfflat_include_phase3 +set id = 20 +where id = 2; +execute s1; + +delete from vector_ivfflat_include_phase3 where id = 1; +execute s1; + +deallocate prepare s1; + +drop table vector_ivfflat_include_phase3; +drop database vector_ivfflat_include_phase3; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_end_to_end.result b/test/distributed/cases/vector/vector_ivfflat_include_end_to_end.result new file mode 100644 index 0000000000000..aa4907670ab97 --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_end_to_end.result @@ -0,0 +1,379 @@ +drop database if exists vector_ivfflat_include_phase8; +create database vector_ivfflat_include_phase8; +use vector_ivfflat_include_phase8; +drop table if exists phase8_main; +create table phase8_main( +id int primary key, +embedding vecf32(3), +title varchar(20), +category int, +note varchar(20) +); +insert into phase8_main values +(1, "[1,2,3]", "alpha", 10, "n1"), +(2, "[1,2,4]", "beta", 20, "n2"), +(3, "[9,9,9]", "gamma", 30, "n3"), +(4, "[2,2,2]", "delta", 40, "n4"), +(5, "[1,2,5]", "epsilon", 50, "n5"); +create index idx_ivf_include_phase8 using ivfflat on phase8_main(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); +show create table phase8_main; +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +phase8_main ¦ CREATE TABLE `phase8_main` ( + `id` int NOT NULL, + `embedding` vecf32(3) DEFAULT NULL, + `title` varchar(20) DEFAULT NULL, + `category` int DEFAULT NULL, + `note` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_ivf_include_phase8` USING ivfflat (`embedding`) lists = 2 op_type 'vector_l2_ops' INCLUDE (`title`, `category`) +) +explain select id, title, category +from phase8_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=include'; +➤ TP QUERY PLAN[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 3 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 3 𝄀 + Limit: 3 𝄀 + Filter Cond: (`__mo_index_include_category` >= 20) +select id, title, category +from phase8_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=include'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] 𝄀 +2 ¦ beta ¦ 20 𝄀 +4 ¦ delta ¦ 40 𝄀 +5 ¦ epsilon ¦ 50 +explain select id, title, note +from phase8_main +where category >= 20 and note in ("n2", "n5") +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=include'; +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 2 𝄀 + -> Join 𝄀 + Join Type: INNER 𝄀 + Join Cond: (phase8_main.id = mo_ivf_alias_0.pkid) 𝄀 + -> Table Scan on vector_ivfflat_include_phase8.phase8_main 𝄀 + Filter Cond: phase8_main.note in ([n2 n5]) 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 9223372036854775807 𝄀 + Limit: 9223372036854775807 𝄀 + Filter Cond: (`__mo_index_include_category` >= 20) +select id, title, note +from phase8_main +where category >= 20 and note in ("n2", "n5") +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=include'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ note[12,-1,0] 𝄀 +2 ¦ beta ¦ n2 𝄀 +5 ¦ epsilon ¦ n5 +set @entries = ( +select index_table_name +from mo_catalog.mo_indexes +where name = 'idx_ivf_include_phase8' +and algo = 'ivfflat' +and algo_table_type = 'entries' +and table_id in ( +select rel_id +from mo_catalog.mo_tables +where reldatabase = database() +and relname = 'phase8_main' +) +limit 1 +); +set @entries_sql = concat( +'select `__mo_index_pri_col`, `__mo_index_include_title`, `__mo_index_include_category` ', +'from `', database(), '`.`', @entries, '` ', +'order by `__mo_index_pri_col`' +); +prepare s_entries from @entries_sql; +execute s_entries; +➤ __mo_index_pri_col[4,32,0] ¦ __mo_index_include_title[12,-1,0] ¦ __mo_index_include_category[4,32,0] 𝄀 +1 ¦ alpha ¦ 10 𝄀 +2 ¦ beta ¦ 20 𝄀 +3 ¦ gamma ¦ 30 𝄀 +4 ¦ delta ¦ 40 𝄀 +5 ¦ epsilon ¦ 50 +update phase8_main +set title = 'beta2', category = 25, note = 'n2b' +where id = 2; +insert into phase8_main values +(6, "[1,2,3.5]", "zeta", 35, "n6"); +delete from phase8_main where id = 1; +execute s_entries; +➤ __mo_index_pri_col[4,32,0] ¦ __mo_index_include_title[12,-1,0] ¦ __mo_index_include_category[4,32,0] 𝄀 +2 ¦ beta2 ¦ 25 𝄀 +3 ¦ gamma ¦ 30 𝄀 +4 ¦ delta ¦ 40 𝄀 +5 ¦ epsilon ¦ 50 𝄀 +6 ¦ zeta ¦ 35 +deallocate prepare s_entries; +select id, title, category, note +from phase8_main +order by id; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] ¦ note[12,-1,0] 𝄀 +2 ¦ beta2 ¦ 25 ¦ n2b 𝄀 +3 ¦ gamma ¦ 30 ¦ n3 𝄀 +4 ¦ delta ¦ 40 ¦ n4 𝄀 +5 ¦ epsilon ¦ 50 ¦ n5 𝄀 +6 ¦ zeta ¦ 35 ¦ n6 +alter table phase8_main alter reindex idx_ivf_include_phase8 ivfflat lists=3; +show create table phase8_main; +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +phase8_main ¦ CREATE TABLE `phase8_main` ( + `id` int NOT NULL, + `embedding` vecf32(3) DEFAULT NULL, + `title` varchar(20) DEFAULT NULL, + `category` int DEFAULT NULL, + `note` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_ivf_include_phase8` USING ivfflat (`embedding`) lists = 3 op_type 'vector_l2_ops' INCLUDE (`title`, `category`) +) +show index from phase8_main; +➤ Table[12,-1,0] ¦ Non_unique[-5,64,0] ¦ Key_name[12,-1,0] ¦ Seq_in_index[4,32,0] ¦ Column_name[12,-1,0] ¦ Collation[12,-1,0] ¦ Cardinality[-5,64,0] ¦ Sub_part[12,-1,0] ¦ Packed[12,-1,0] ¦ Null[12,-1,0] ¦ Index_type[12,-1,0] ¦ Comment[1,0,0] ¦ Index_comment[12,-1,0] ¦ Index_params[12,-1,0] ¦ Visible[12,-1,0] ¦ Expression[12,-1,0] 𝄀 +phase8_main ¦ 0 ¦ PRIMARY ¦ 1 ¦ id ¦ A ¦ 0 ¦ NULL ¦ NULL ¦ ¦ ¦ ¦ ¦ ¦ YES ¦ id 𝄀 +phase8_main ¦ 1 ¦ idx_ivf_include_phase8 ¦ 1 ¦ embedding ¦ A ¦ 0 ¦ NULL ¦ NULL ¦ YES ¦ ivfflat ¦ ¦ ¦ {"lists":"3","op_type":"vector_l2_ops"} ¦ YES ¦ embedding +set @entries = ( +select index_table_name +from mo_catalog.mo_indexes +where name = 'idx_ivf_include_phase8' +and algo = 'ivfflat' +and algo_table_type = 'entries' +and table_id in ( +select rel_id +from mo_catalog.mo_tables +where reldatabase = database() +and relname = 'phase8_main' +) +limit 1 +); +set @entries_sql = concat( +'select `__mo_index_pri_col`, `__mo_index_include_title`, `__mo_index_include_category` ', +'from `', database(), '`.`', @entries, '` ', +'order by `__mo_index_pri_col`' +); +prepare s_entries from @entries_sql; +execute s_entries; +➤ __mo_index_pri_col[4,32,0] ¦ __mo_index_include_title[12,-1,0] ¦ __mo_index_include_category[4,32,0] 𝄀 +2 ¦ beta2 ¦ 25 𝄀 +3 ¦ gamma ¦ 30 𝄀 +4 ¦ delta ¦ 40 𝄀 +5 ¦ epsilon ¦ 50 𝄀 +6 ¦ zeta ¦ 35 +deallocate prepare s_entries; +explain select id, title, category +from phase8_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=include'; +➤ TP QUERY PLAN[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 3 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 3 𝄀 + Limit: 3 𝄀 + Filter Cond: (`__mo_index_include_category` >= 20) +select id, title, category +from phase8_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=include'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] 𝄀 +6 ¦ zeta ¦ 35 𝄀 +2 ¦ beta2 ¦ 25 𝄀 +4 ¦ delta ¦ 40 +drop table phase8_main; +drop table if exists phase8_empty; +create table phase8_empty( +id int primary key, +embedding vecf32(3), +title varchar(20), +category int +); +create index idx_ivf_include_phase8_empty using ivfflat on phase8_empty(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); +explain select id, title, category +from phase8_empty +order by l2_distance(embedding, "[1,1,1]") +limit 2 by rank with option 'mode=include'; +➤ TP QUERY PLAN[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 2 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 2 𝄀 + Limit: 2 +select id, title, category +from phase8_empty +order by l2_distance(embedding, "[1,1,1]") +limit 2 by rank with option 'mode=include'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] +drop table phase8_empty; +drop table if exists phase8_nulls; +create table phase8_nulls( +id int primary key, +embedding vecf32(3), +title varchar(20), +category int +); +insert into phase8_nulls values +(1, "[1,1,1]", null, 10), +(2, "[1,1,2]", "beta", null), +(3, "[2,2,2]", "gamma", 30); +create index idx_ivf_include_phase8_nulls using ivfflat on phase8_nulls(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); +select id, title, category +from phase8_nulls +order by l2_distance(embedding, "[1,1,1]") +limit 3 by rank with option 'mode=include'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] 𝄀 +1 ¦ ¦ 10 𝄀 +2 ¦ beta ¦ 0 𝄀 +3 ¦ gamma ¦ 30 +drop table phase8_nulls; +drop table if exists phase8_many_include; +create table phase8_many_include( +id int primary key, +embedding vecf32(3), +c1 varchar(10), +c2 varchar(10), +c3 int, +c4 int, +c5 varchar(10), +c6 varchar(10) +); +insert into phase8_many_include values +(1, "[1,0,0]", "a1", "b1", 11, 21, "e1", "f1"), +(2, "[2,0,0]", "a2", "b2", 12, 22, "e2", "f2"); +create index idx_ivf_include_phase8_many using ivfflat on phase8_many_include(embedding) +lists=2 op_type "vector_l2_ops" include(c1, c2, c3, c4, c5, c6); +show create table phase8_many_include; +➤ Table[12,-1,0] ¦ Create Table[12,-1,0] 𝄀 +phase8_many_include ¦ CREATE TABLE `phase8_many_include` ( + `id` int NOT NULL, + `embedding` vecf32(3) DEFAULT NULL, + `c1` varchar(10) DEFAULT NULL, + `c2` varchar(10) DEFAULT NULL, + `c3` int DEFAULT NULL, + `c4` int DEFAULT NULL, + `c5` varchar(10) DEFAULT NULL, + `c6` varchar(10) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_ivf_include_phase8_many` USING ivfflat (`embedding`) lists = 2 op_type 'vector_l2_ops' INCLUDE (`c1`, `c2`, `c3`, `c4`, `c5`, `c6`) +) +show index from phase8_many_include; +➤ Table[12,-1,0] ¦ Non_unique[-5,64,0] ¦ Key_name[12,-1,0] ¦ Seq_in_index[4,32,0] ¦ Column_name[12,-1,0] ¦ Collation[12,-1,0] ¦ Cardinality[-5,64,0] ¦ Sub_part[12,-1,0] ¦ Packed[12,-1,0] ¦ Null[12,-1,0] ¦ Index_type[12,-1,0] ¦ Comment[1,0,0] ¦ Index_comment[12,-1,0] ¦ Index_params[12,-1,0] ¦ Visible[12,-1,0] ¦ Expression[12,-1,0] 𝄀 +phase8_many_include ¦ 0 ¦ PRIMARY ¦ 1 ¦ id ¦ A ¦ 0 ¦ NULL ¦ NULL ¦ ¦ ¦ ¦ ¦ ¦ YES ¦ id 𝄀 +phase8_many_include ¦ 1 ¦ idx_ivf_include_phase8_many ¦ 1 ¦ embedding ¦ A ¦ 0 ¦ NULL ¦ NULL ¦ YES ¦ ivfflat ¦ ¦ ¦ {"lists":"2","op_type":"vector_l2_ops"} ¦ YES ¦ embedding +select id, c1, c2, c3, c4, c5, c6 +from phase8_many_include +order by l2_distance(embedding, "[1,0,0]") +limit 2 by rank with option 'mode=include'; +➤ id[4,32,0] ¦ c1[12,-1,0] ¦ c2[12,-1,0] ¦ c3[4,32,0] ¦ c4[4,32,0] ¦ c5[12,-1,0] ¦ c6[12,-1,0] 𝄀 +1 ¦ a1 ¦ b1 ¦ 11 ¦ 21 ¦ e1 ¦ f1 𝄀 +2 ¦ a2 ¦ b2 ¦ 12 ¦ 22 ¦ e2 ¦ f2 +drop table phase8_many_include; +drop table if exists phase8_perf_include; +create table phase8_perf_include( +id int primary key, +embedding vecf32(4), +title varchar(32), +category int, +note varchar(16) +); +drop table if exists phase8_perf_plain; +create table phase8_perf_plain( +id int primary key, +embedding vecf32(4), +title varchar(32), +category int, +note varchar(16) +); +insert into phase8_perf_include +select +result, +case result % 4 +when 0 then "[0.1,0.2,0.3,0.4]" +when 1 then "[0.1,0.2,0.3,0.5]" +when 2 then "[0.2,0.2,0.3,0.4]" +else "[0.3,0.2,0.3,0.4]" +end, +concat('title_', result), +result % 200, +case when result % 5 = 0 then 'keep' else 'skip' end +from generate_series(1, 8000) g; +insert into phase8_perf_plain +select * from phase8_perf_include; +create index idx_ivf_include_phase8_perf using ivfflat on phase8_perf_include(embedding) +lists=16 op_type "vector_l2_ops" include(title, category); +create index idx_ivf_plain_phase8_perf using ivfflat on phase8_perf_plain(embedding) +lists=16 op_type "vector_l2_ops"; +explain select id, title, category +from phase8_perf_include +where category between 20 and 120 +order by l2_distance(embedding, "[0.1,0.2,0.3,0.4]") +limit 20 by rank with option 'mode=include'; +➤ TP QUERY PLAN[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 20 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 20 𝄀 + Limit: 20 𝄀 + Filter Cond: (`__mo_index_include_category` between 20 and 120) +explain select id, title, category +from phase8_perf_plain +where category between 20 and 120 +order by l2_distance(embedding, "[0.1,0.2,0.3,0.4]") +limit 20 by rank with option 'mode=post'; +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 20 𝄀 + -> Join 𝄀 + Join Type: INNER 𝄀 + Join Cond: (phase8_perf_plain.id = mo_ivf_alias_0.pkid) 𝄀 + Runtime Filter Build: #[-1,0] 𝄀 + -> Table Scan on vector_ivfflat_include_phase8.phase8_perf_plain 𝄀 + Filter Cond: phase8_perf_plain.category BETWEEN 20 AND 120 𝄀 + Runtime Filter Probe: phase8_perf_plain.id 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 100 𝄀 + Limit: 100 +select count(*) from ( +select id, title, category +from phase8_perf_include +where category between 20 and 120 +order by l2_distance(embedding, "[0.1,0.2,0.3,0.4]") +limit 20 by rank with option 'mode=include' +) as t; +➤ count(*)[-5,64,0] 𝄀 +20 +select count(*) from ( +select id, title, category +from phase8_perf_plain +where category between 20 and 120 +order by l2_distance(embedding, "[0.1,0.2,0.3,0.4]") +limit 20 by rank with option 'mode=post' +) as t; +➤ count(*)[-5,64,0] 𝄀 +20 +drop table phase8_perf_include; +drop table phase8_perf_plain; +drop database vector_ivfflat_include_phase8; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_end_to_end.sql b/test/distributed/cases/vector/vector_ivfflat_include_end_to_end.sql new file mode 100644 index 0000000000000..6b547e6b86b8c --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_end_to_end.sql @@ -0,0 +1,283 @@ +drop database if exists vector_ivfflat_include_phase8; +create database vector_ivfflat_include_phase8; +use vector_ivfflat_include_phase8; + +drop table if exists phase8_main; +create table phase8_main( + id int primary key, + embedding vecf32(3), + title varchar(20), + category int, + note varchar(20) +); + +insert into phase8_main values + (1, "[1,2,3]", "alpha", 10, "n1"), + (2, "[1,2,4]", "beta", 20, "n2"), + (3, "[9,9,9]", "gamma", 30, "n3"), + (4, "[2,2,2]", "delta", 40, "n4"), + (5, "[1,2,5]", "epsilon", 50, "n5"); + +create index idx_ivf_include_phase8 using ivfflat on phase8_main(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); + +show create table phase8_main; + +-- @separator:table +explain select id, title, category +from phase8_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=include'; + +select id, title, category +from phase8_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=include'; + +-- @separator:table +explain select id, title, note +from phase8_main +where category >= 20 and note in ("n2", "n5") +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=include'; + +select id, title, note +from phase8_main +where category >= 20 and note in ("n2", "n5") +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=include'; + +set @entries = ( + select index_table_name + from mo_catalog.mo_indexes + where name = 'idx_ivf_include_phase8' + and algo = 'ivfflat' + and algo_table_type = 'entries' + and table_id in ( + select rel_id + from mo_catalog.mo_tables + where reldatabase = database() + and relname = 'phase8_main' + ) + limit 1 +); + +set @entries_sql = concat( + 'select `__mo_index_pri_col`, `__mo_index_include_title`, `__mo_index_include_category` ', + 'from `', database(), '`.`', @entries, '` ', + 'order by `__mo_index_pri_col`' +); +prepare s_entries from @entries_sql; +execute s_entries; + +update phase8_main +set title = 'beta2', category = 25, note = 'n2b' +where id = 2; +insert into phase8_main values + (6, "[1,2,3.5]", "zeta", 35, "n6"); +delete from phase8_main where id = 1; + +execute s_entries; +deallocate prepare s_entries; + +select id, title, category, note +from phase8_main +order by id; + +alter table phase8_main alter reindex idx_ivf_include_phase8 ivfflat lists=3; + +show create table phase8_main; +show index from phase8_main; + +set @entries = ( + select index_table_name + from mo_catalog.mo_indexes + where name = 'idx_ivf_include_phase8' + and algo = 'ivfflat' + and algo_table_type = 'entries' + and table_id in ( + select rel_id + from mo_catalog.mo_tables + where reldatabase = database() + and relname = 'phase8_main' + ) + limit 1 +); + +set @entries_sql = concat( + 'select `__mo_index_pri_col`, `__mo_index_include_title`, `__mo_index_include_category` ', + 'from `', database(), '`.`', @entries, '` ', + 'order by `__mo_index_pri_col`' +); +prepare s_entries from @entries_sql; +execute s_entries; +deallocate prepare s_entries; + +-- @separator:table +explain select id, title, category +from phase8_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=include'; + +select id, title, category +from phase8_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=include'; + +drop table phase8_main; + +drop table if exists phase8_empty; +create table phase8_empty( + id int primary key, + embedding vecf32(3), + title varchar(20), + category int +); + +create index idx_ivf_include_phase8_empty using ivfflat on phase8_empty(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); + +-- @separator:table +explain select id, title, category +from phase8_empty +order by l2_distance(embedding, "[1,1,1]") +limit 2 by rank with option 'mode=include'; + +select id, title, category +from phase8_empty +order by l2_distance(embedding, "[1,1,1]") +limit 2 by rank with option 'mode=include'; + +drop table phase8_empty; + +drop table if exists phase8_nulls; +create table phase8_nulls( + id int primary key, + embedding vecf32(3), + title varchar(20), + category int +); + +insert into phase8_nulls values + (1, "[1,1,1]", null, 10), + (2, "[1,1,2]", "beta", null), + (3, "[2,2,2]", "gamma", 30); + +create index idx_ivf_include_phase8_nulls using ivfflat on phase8_nulls(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); + +select id, title, category +from phase8_nulls +order by l2_distance(embedding, "[1,1,1]") +limit 3 by rank with option 'mode=include'; + +drop table phase8_nulls; + +drop table if exists phase8_many_include; +create table phase8_many_include( + id int primary key, + embedding vecf32(3), + c1 varchar(10), + c2 varchar(10), + c3 int, + c4 int, + c5 varchar(10), + c6 varchar(10) +); + +insert into phase8_many_include values + (1, "[1,0,0]", "a1", "b1", 11, 21, "e1", "f1"), + (2, "[2,0,0]", "a2", "b2", 12, 22, "e2", "f2"); + +create index idx_ivf_include_phase8_many using ivfflat on phase8_many_include(embedding) +lists=2 op_type "vector_l2_ops" include(c1, c2, c3, c4, c5, c6); + +show create table phase8_many_include; +show index from phase8_many_include; + +select id, c1, c2, c3, c4, c5, c6 +from phase8_many_include +order by l2_distance(embedding, "[1,0,0]") +limit 2 by rank with option 'mode=include'; + +drop table phase8_many_include; + +drop table if exists phase8_perf_include; +create table phase8_perf_include( + id int primary key, + embedding vecf32(4), + title varchar(32), + category int, + note varchar(16) +); + +drop table if exists phase8_perf_plain; +create table phase8_perf_plain( + id int primary key, + embedding vecf32(4), + title varchar(32), + category int, + note varchar(16) +); + +insert into phase8_perf_include +select + result, + case result % 4 + when 0 then "[0.1,0.2,0.3,0.4]" + when 1 then "[0.1,0.2,0.3,0.5]" + when 2 then "[0.2,0.2,0.3,0.4]" + else "[0.3,0.2,0.3,0.4]" + end, + concat('title_', result), + result % 200, + case when result % 5 = 0 then 'keep' else 'skip' end +from generate_series(1, 8000) g; + +insert into phase8_perf_plain +select * from phase8_perf_include; + +create index idx_ivf_include_phase8_perf using ivfflat on phase8_perf_include(embedding) +lists=16 op_type "vector_l2_ops" include(title, category); + +create index idx_ivf_plain_phase8_perf using ivfflat on phase8_perf_plain(embedding) +lists=16 op_type "vector_l2_ops"; + +-- @separator:table +explain select id, title, category +from phase8_perf_include +where category between 20 and 120 +order by l2_distance(embedding, "[0.1,0.2,0.3,0.4]") +limit 20 by rank with option 'mode=include'; + +-- @separator:table +explain select id, title, category +from phase8_perf_plain +where category between 20 and 120 +order by l2_distance(embedding, "[0.1,0.2,0.3,0.4]") +limit 20 by rank with option 'mode=post'; + +select count(*) from ( + select id, title, category + from phase8_perf_include + where category between 20 and 120 + order by l2_distance(embedding, "[0.1,0.2,0.3,0.4]") + limit 20 by rank with option 'mode=include' +) as t; + +select count(*) from ( + select id, title, category + from phase8_perf_plain + where category between 20 and 120 + order by l2_distance(embedding, "[0.1,0.2,0.3,0.4]") + limit 20 by rank with option 'mode=post' +) as t; + +drop table phase8_perf_include; +drop table phase8_perf_plain; + +drop database vector_ivfflat_include_phase8; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_entries_layout.result b/test/distributed/cases/vector/vector_ivfflat_include_entries_layout.result new file mode 100644 index 0000000000000..bc5d32e96f71c --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_entries_layout.result @@ -0,0 +1,61 @@ +drop database if exists vector_ivfflat_include_phase2; +create database vector_ivfflat_include_phase2; +use vector_ivfflat_include_phase2; +drop table if exists vector_ivfflat_include_phase2; +create table vector_ivfflat_include_phase2( +id int primary key, +embedding vecf32(3), +title varchar(20), +category int +); +insert into vector_ivfflat_include_phase2 values +(1, "[1,2,3]", "alpha", 10), +(2, "[4,5,6]", "beta", 20), +(3, "[7,8,9]", "gamma", 30); +create index idx_ivf_include using ivfflat on vector_ivfflat_include_phase2(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); +set @entries = ( +select index_table_name +from mo_catalog.mo_indexes +where name = 'idx_ivf_include' +and algo = 'ivfflat' +and algo_table_type = 'entries' +and table_id in ( +select rel_id +from mo_catalog.mo_tables +where reldatabase = database() +and relname = 'vector_ivfflat_include_phase2' +) +limit 1 +); +select @entries is not null; +@entries is not null +1 +select attname, attnum, att_is_hidden +from mo_catalog.mo_columns +where att_database = database() +and att_relname = @entries +order by attnum; +attname attnum att_is_hidden +__mo_index_centroid_fk_version 1 0 +__mo_index_centroid_fk_id 2 0 +__mo_index_pri_col 3 0 +__mo_index_centroid_fk_entry 4 0 +__mo_index_include_title 5 0 +__mo_index_include_category 6 0 +__mo_cpkey_col 7 1 +__mo_rowid 8 1 +set @q = concat( +'select `__mo_index_pri_col`, `__mo_index_include_title`, `__mo_index_include_category` ', +'from `', database(), '`.`', @entries, '` ', +'order by `__mo_index_pri_col`' +); +prepare s1 from @q; +execute s1; +__mo_index_pri_col __mo_index_include_title __mo_index_include_category +1 alpha 10 +2 beta 20 +3 gamma 30 +deallocate prepare s1; +drop table vector_ivfflat_include_phase2; +drop database vector_ivfflat_include_phase2; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_entries_layout.sql b/test/distributed/cases/vector/vector_ivfflat_include_entries_layout.sql new file mode 100644 index 0000000000000..11b3e9809023a --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_entries_layout.sql @@ -0,0 +1,54 @@ +drop database if exists vector_ivfflat_include_phase2; +create database vector_ivfflat_include_phase2; +use vector_ivfflat_include_phase2; + +drop table if exists vector_ivfflat_include_phase2; +create table vector_ivfflat_include_phase2( + id int primary key, + embedding vecf32(3), + title varchar(20), + category int +); + +insert into vector_ivfflat_include_phase2 values + (1, "[1,2,3]", "alpha", 10), + (2, "[4,5,6]", "beta", 20), + (3, "[7,8,9]", "gamma", 30); + +create index idx_ivf_include using ivfflat on vector_ivfflat_include_phase2(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); + +set @entries = ( + select index_table_name + from mo_catalog.mo_indexes + where name = 'idx_ivf_include' + and algo = 'ivfflat' + and algo_table_type = 'entries' + and table_id in ( + select rel_id + from mo_catalog.mo_tables + where reldatabase = database() + and relname = 'vector_ivfflat_include_phase2' + ) + limit 1 +); + +select @entries is not null; + +select attname, attnum, att_is_hidden +from mo_catalog.mo_columns +where att_database = database() + and att_relname = @entries +order by attnum; + +set @q = concat( + 'select `__mo_index_pri_col`, `__mo_index_include_title`, `__mo_index_include_category` ', + 'from `', database(), '`.`', @entries, '` ', + 'order by `__mo_index_pri_col`' +); +prepare s1 from @q; +execute s1; +deallocate prepare s1; + +drop table vector_ivfflat_include_phase2; +drop database vector_ivfflat_include_phase2; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_mode_comparison.result b/test/distributed/cases/vector/vector_ivfflat_include_mode_comparison.result new file mode 100644 index 0000000000000..5448120fdaef4 --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_mode_comparison.result @@ -0,0 +1,206 @@ +drop database if exists vector_ivfflat_include_phase9; +create database vector_ivfflat_include_phase9; +use vector_ivfflat_include_phase9; +drop table if exists phase9_main; +create table phase9_main( +id int primary key, +embedding vecf32(3), +title varchar(20), +category int, +note varchar(20) +); +insert into phase9_main values +(1, "[1,2,3]", "alpha", 10, "n1"), +(2, "[1,2,4]", "beta", 20, "n2"), +(3, "[1,2,5]", "gamma", 30, "n3"), +(4, "[2,2,2]", "delta", 40, "n4"), +(5, "[9,9,9]", "epsilon", 50, "n5"); +create index idx_ivf_include_phase9 using ivfflat on phase9_main(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); +explain analyze select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=include'; +➤ tp query plan[12,-1,0] 𝄀 +Project 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=3 outputRows=3 (min=3, max=3) InputSize=96 bytes OutputSize=96 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=96 bytes (min=96 bytes, max=96 bytes) 𝄀 + -> Sort 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=3 outputRows=3 (min=3, max=3) InputSize=120 bytes OutputSize=96 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=96 bytes (min=96 bytes, max=96 bytes) 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 3 𝄀 + -> Table Function on ivf_search 𝄀 + Analyze: timeConsumed=4ms waitTime=0ms inputRows=0 outputRows=3 (min=3, max=3) InputSize=0 bytes OutputSize=120 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=120 bytes (min=0 bytes, max=120 bytes) 𝄀 + Index Reader Param: Limit: 3 𝄀 + Limit: 3 𝄀 + Filter Cond: (`__mo_index_include_category` >= 20) 𝄀 +Project 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=4 outputRows=4 (min=4, max=4) InputSize=160 bytes OutputSize=160 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=160 bytes (min=160 bytes, max=160 bytes) 𝄀 + -> Sort 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=4 outputRows=4 (min=4, max=4) InputSize=160 bytes OutputSize=160 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=160 bytes (min=160 bytes, max=160 bytes) 𝄀 + Sort Key: __dist_func__ INTERNAL 𝄀 + Limit: 15 𝄀 + -> Table Scan on vector_ivfflat_include_phase9.__mo_index_secondary_019db0c7-1fe9-71ad-b376-945de6d3c0a7 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputBlocks=1 inputRows=5 outputRows=4 (min=4, max=4) InputSize=440 bytes OutputSize=160 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=609 bytes (min=609 bytes, max=609 bytes) 𝄀 + Index Reader Param: Sort Key: l2_distance_sq(__mo_index_centroid_fk_entry, ) INTERNAL Limit: 15 𝄀 + Filter Cond: (__mo_index_include_category >= 20), prefix_in(__mo_cpkey_col) +explain analyze select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=post'; +➤ ap query plan on one cn(10 core)[12,-1,0] 𝄀 +Project 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=3 outputRows=3 (min=3, max=3) InputSize=96 bytes OutputSize=96 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=96 bytes (min=96 bytes, max=96 bytes) 𝄀 + -> Sort 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=4 outputRows=3 (min=3, max=3) InputSize=160 bytes OutputSize=96 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=96 bytes (min=96 bytes, max=96 bytes) 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 3 𝄀 + -> Join 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=9 outputRows=4 (min=4, max=4) InputSize=188 bytes OutputSize=160 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=32.17 KiB (min=16.06 KiB, max=16.11 KiB) 𝄀 + Join Type: INNER 𝄀 + Join Cond: (phase9_main.id = mo_ivf_alias_0.pkid) 𝄀 + -> Table Scan on vector_ivfflat_include_phase9.phase9_main 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputBlocks=1 inputRows=5 outputRows=4 (min=4, max=4) InputSize=160 bytes OutputSize=128 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=293 bytes (min=293 bytes, max=293 bytes) 𝄀 + Filter Cond: (phase9_main.category >= 20) 𝄀 + -> Table Function on ivf_search 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=0 outputRows=5 (min=5, max=5) InputSize=0 bytes OutputSize=60 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=60 bytes (min=0 bytes, max=60 bytes) 𝄀 + Index Reader Param: Limit: 15 𝄀 + Limit: 15 𝄀 +Project 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=5 outputRows=5 (min=5, max=5) InputSize=60 bytes OutputSize=60 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=60 bytes (min=60 bytes, max=60 bytes) 𝄀 + -> Sort 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=5 outputRows=5 (min=5, max=5) InputSize=60 bytes OutputSize=60 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=60 bytes (min=60 bytes, max=60 bytes) 𝄀 + Sort Key: __dist_func__ INTERNAL 𝄀 + Limit: 15 𝄀 + -> Table Scan on vector_ivfflat_include_phase9.__mo_index_secondary_019db0e7-4960-7c38-bec3-55c638348417 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputBlocks=1 inputRows=5 outputRows=5 (min=5, max=5) InputSize=300 bytes OutputSize=60 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=365 bytes (min=365 bytes, max=365 bytes) 𝄀 + Index Reader Param: Sort Key: l2_distance_sq(__mo_index_centroid_fk_entry, ) INTERNAL Limit: 15 𝄀 + Filter Cond: prefix_in(__mo_cpkey_col) +explain analyze select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=pre'; +➤ ap query plan on one cn(10 core)[12,-1,0] 𝄀 +Project 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=3 outputRows=3 (min=3, max=3) InputSize=96 bytes OutputSize=96 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=96 bytes (min=96 bytes, max=96 bytes) 𝄀 + -> Sort 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=3 outputRows=3 (min=3, max=3) InputSize=120 bytes OutputSize=96 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=96 bytes (min=96 bytes, max=96 bytes) 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 3 𝄀 + -> Join 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=6 outputRows=3 (min=3, max=3) InputSize=132 bytes OutputSize=120 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=32.16 KiB (min=16.06 KiB, max=16.11 KiB) 𝄀 + Join Type: INNER 𝄀 + Join Cond: (phase9_main.id = mo_ivf_alias_0.pkid) 𝄀 + Runtime Filter Build: #[-1,0] 𝄀 + -> Table Scan on vector_ivfflat_include_phase9.phase9_main 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputBlocks=1 inputRows=3 outputRows=3 (min=3, max=3) InputSize=96 bytes OutputSize=96 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=195 bytes (min=195 bytes, max=195 bytes) 𝄀 + Filter Cond: (phase9_main.category >= 20) 𝄀 + Runtime Filter Probe: phase9_main.id 𝄀 + -> Join 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=7 outputRows=3 (min=3, max=3) InputSize=52 bytes OutputSize=36 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=32.14 KiB (min=16.06 KiB, max=16.09 KiB) 𝄀 + Join Type: INNER 𝄀 + Join Cond: (mo_ivf_alias_0.pkid = phase9_main.id) 𝄀 + Runtime Filter Build: #[10,0] 𝄀 + -> Table Function on ivf_search 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=0 outputRows=3 (min=3, max=3) InputSize=0 bytes OutputSize=36 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=36 bytes (min=0 bytes, max=36 bytes) 𝄀 + Index Reader Param: Limit: 3 𝄀 + Runtime Filter Probe: #[8,0] 𝄀 + Limit: 3 𝄀 + -> Table Scan on vector_ivfflat_include_phase9.phase9_main 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputBlocks=1 inputRows=5 outputRows=4 (min=4, max=4) InputSize=40 bytes OutputSize=16 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=61 bytes (min=61 bytes, max=61 bytes) 𝄀 + Filter Cond: (phase9_main.category >= 20) 𝄀 +Project 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=4 outputRows=4 (min=4, max=4) InputSize=112 bytes OutputSize=48 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=48 bytes (min=48 bytes, max=48 bytes) 𝄀 + -> Table Scan on vector_ivfflat_include_phase9.__mo_index_secondary_019db0c7-1fe9-71ad-b376-945de6d3c0a7 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputBlocks=1 inputRows=5 outputRows=4 (min=4, max=4) InputSize=260 bytes OutputSize=112 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=381 bytes (min=381 bytes, max=381 bytes) 𝄀 + Filter Cond: __mo_index_pri_col in ([2 3 4 5]), prefix_eq(__mo_cpkey_col) +explain select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=include'; +➤ TP QUERY PLAN[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 3 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 3 𝄀 + Limit: 3 𝄀 + Filter Cond: (`__mo_index_include_category` >= 20) +explain select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=post'; +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 3 𝄀 + -> Join 𝄀 + Join Type: INNER 𝄀 + Join Cond: (phase9_main.id = mo_ivf_alias_0.pkid) 𝄀 + -> Table Scan on vector_ivfflat_include_phase9.phase9_main 𝄀 + Filter Cond: (phase9_main.category >= 20) 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 15 𝄀 + Limit: 15 +explain select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=pre'; +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 3 𝄀 + -> Join 𝄀 + Join Type: INNER 𝄀 + Join Cond: (phase9_main.id = mo_ivf_alias_0.pkid) 𝄀 + Runtime Filter Build: #[-1,0] 𝄀 + -> Table Scan on vector_ivfflat_include_phase9.phase9_main 𝄀 + Filter Cond: (phase9_main.category >= 20) 𝄀 + Runtime Filter Probe: phase9_main.id 𝄀 + -> Join 𝄀 + Join Type: INNER 𝄀 + Join Cond: (mo_ivf_alias_0.pkid = phase9_main.id) 𝄀 + Runtime Filter Build: #[10,0] 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 3 𝄀 + Runtime Filter Probe: #[8,0] 𝄀 + Limit: 3 𝄀 + -> Table Scan on vector_ivfflat_include_phase9.phase9_main 𝄀 + Filter Cond: (phase9_main.category >= 20) +select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=include'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] 𝄀 +2 ¦ beta ¦ 20 𝄀 +4 ¦ delta ¦ 40 𝄀 +3 ¦ gamma ¦ 30 +select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=post'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] 𝄀 +2 ¦ beta ¦ 20 𝄀 +4 ¦ delta ¦ 40 𝄀 +3 ¦ gamma ¦ 30 +select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=pre'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] 𝄀 +2 ¦ beta ¦ 20 𝄀 +4 ¦ delta ¦ 40 𝄀 +3 ¦ gamma ¦ 30 +drop table phase9_main; +drop database vector_ivfflat_include_phase9; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_mode_comparison.sql b/test/distributed/cases/vector/vector_ivfflat_include_mode_comparison.sql new file mode 100644 index 0000000000000..7d729bda8e030 --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_mode_comparison.sql @@ -0,0 +1,99 @@ +drop database if exists vector_ivfflat_include_phase9; +create database vector_ivfflat_include_phase9; +use vector_ivfflat_include_phase9; + +drop table if exists phase9_main; +create table phase9_main( + id int primary key, + embedding vecf32(3), + title varchar(20), + category int, + note varchar(20) +); + +insert into phase9_main values + (1, "[1,2,3]", "alpha", 10, "n1"), + (2, "[1,2,4]", "beta", 20, "n2"), + (3, "[1,2,5]", "gamma", 30, "n3"), + (4, "[2,2,2]", "delta", 40, "n4"), + (5, "[9,9,9]", "epsilon", 50, "n5"); + +create index idx_ivf_include_phase9 using ivfflat on phase9_main(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); + +-- `EXPLAIN ANALYZE` is here to prevent regression of the mode=include panic path. +-- Ignore the single output column because timings and hidden entries-table names vary by run. +-- @separator:table +-- @ignore:0 +explain analyze select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=include'; + +-- Compare `mode=post` and `mode=pre` against `mode=include`. +-- @separator:table +-- @ignore:0 +explain analyze select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=post'; + +-- @separator:table +-- @ignore:0 +explain analyze select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=pre'; + +-- `EXPLAIN` keeps the case stable while still asserting the three plan shapes. +-- @separator:table +explain select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=include'; + +-- @separator:table +explain select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=post'; + +-- @separator:table +explain select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=pre'; + +-- All three modes should now recover the filtered top-k, but they do so through +-- different paths: include pushes the covered filter into the index, post keeps +-- the join path and over-fetches candidates, and pre still uses the extra +-- prefilter join. +-- @separator:table +select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=include'; + +-- @separator:table +select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=post'; + +-- @separator:table +select id, title, category +from phase9_main +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 3 by rank with option 'mode=pre'; + +drop table phase9_main; +drop database vector_ivfflat_include_phase9; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_mode_paths.result b/test/distributed/cases/vector/vector_ivfflat_include_mode_paths.result new file mode 100644 index 0000000000000..165db8806f4a3 --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_mode_paths.result @@ -0,0 +1,95 @@ +drop database if exists vector_ivfflat_include_phase6; +create database vector_ivfflat_include_phase6; +use vector_ivfflat_include_phase6; +drop table if exists vector_ivfflat_include_phase6; +create table vector_ivfflat_include_phase6( +id int primary key, +embedding vecf32(3), +title varchar(20), +category int, +note varchar(20) +); +create index idx_ivf_include_phase6 using ivfflat on vector_ivfflat_include_phase6(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); +insert into vector_ivfflat_include_phase6 values +(1, "[1,2,3]", "alpha", 10, "n1"), +(2, "[1,2,4]", "beta", 20, "n2"), +(3, "[9,9,9]", "gamma", 30, "n3"), +(4, "[2,2,2]", "delta", 40, "n4"); +explain select id, title, category +from vector_ivfflat_include_phase6 +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 2 𝄀 + -> Join 𝄀 + Join Type: INNER 𝄀 + Join Cond: (vector_ivfflat_include_phase6.id = mo_ivf_alias_0.pkid) 𝄀 + -> Table Scan on vector_ivfflat_include_phase6.vector_ivfflat_include_phase6 𝄀 + Filter Cond: (vector_ivfflat_include_phase6.category >= 20) 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 12 𝄀 + Limit: 12 +select id, title, category +from vector_ivfflat_include_phase6 +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] 𝄀 +2 ¦ beta ¦ 20 𝄀 +4 ¦ delta ¦ 40 +explain select id, title, category +from vector_ivfflat_include_phase6 +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=include'; +➤ TP QUERY PLAN[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 2 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 2 𝄀 + Limit: 2 𝄀 + Filter Cond: (`__mo_index_include_category` >= 20) +select id, title, category +from vector_ivfflat_include_phase6 +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=include'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] 𝄀 +2 ¦ beta ¦ 20 𝄀 +4 ¦ delta ¦ 40 +explain select id, title, note +from vector_ivfflat_include_phase6 +where category >= 20 and note in ("n2", "n4") +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=include'; +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 2 𝄀 + -> Join 𝄀 + Join Type: INNER 𝄀 + Join Cond: (vector_ivfflat_include_phase6.id = mo_ivf_alias_0.pkid) 𝄀 + -> Table Scan on vector_ivfflat_include_phase6.vector_ivfflat_include_phase6 𝄀 + Filter Cond: vector_ivfflat_include_phase6.note in ([n2 n4]) 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 9223372036854775807 𝄀 + Limit: 9223372036854775807 𝄀 + Filter Cond: (`__mo_index_include_category` >= 20) +select id, title, note +from vector_ivfflat_include_phase6 +where category >= 20 and note in ("n2", "n4") +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=include'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ note[12,-1,0] 𝄀 +2 ¦ beta ¦ n2 𝄀 +4 ¦ delta ¦ n4 +drop table vector_ivfflat_include_phase6; +drop database vector_ivfflat_include_phase6; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_mode_paths.sql b/test/distributed/cases/vector/vector_ivfflat_include_mode_paths.sql new file mode 100644 index 0000000000000..33fcd685bceac --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_mode_paths.sql @@ -0,0 +1,63 @@ +drop database if exists vector_ivfflat_include_phase6; +create database vector_ivfflat_include_phase6; +use vector_ivfflat_include_phase6; + +drop table if exists vector_ivfflat_include_phase6; +create table vector_ivfflat_include_phase6( + id int primary key, + embedding vecf32(3), + title varchar(20), + category int, + note varchar(20) +); + +create index idx_ivf_include_phase6 using ivfflat on vector_ivfflat_include_phase6(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); + +insert into vector_ivfflat_include_phase6 values + (1, "[1,2,3]", "alpha", 10, "n1"), + (2, "[1,2,4]", "beta", 20, "n2"), + (3, "[9,9,9]", "gamma", 30, "n3"), + (4, "[2,2,2]", "delta", 40, "n4"); + +-- @separator:table +explain select id, title, category +from vector_ivfflat_include_phase6 +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; + +select id, title, category +from vector_ivfflat_include_phase6 +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; + +-- @separator:table +explain select id, title, category +from vector_ivfflat_include_phase6 +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=include'; + +select id, title, category +from vector_ivfflat_include_phase6 +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=include'; + +-- @separator:table +explain select id, title, note +from vector_ivfflat_include_phase6 +where category >= 20 and note in ("n2", "n4") +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=include'; + +select id, title, note +from vector_ivfflat_include_phase6 +where category >= 20 and note in ("n2", "n4") +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=include'; + +drop table vector_ivfflat_include_phase6; +drop database vector_ivfflat_include_phase6; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_pre_post_modes.result b/test/distributed/cases/vector/vector_ivfflat_include_pre_post_modes.result new file mode 100644 index 0000000000000..1c1bcd23005ca --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_pre_post_modes.result @@ -0,0 +1,80 @@ +drop database if exists vector_ivfflat_include_phase5; +create database vector_ivfflat_include_phase5; +use vector_ivfflat_include_phase5; +drop table if exists vector_ivfflat_include_phase5; +create table vector_ivfflat_include_phase5( +id int primary key, +embedding vecf32(3), +title varchar(20), +category int, +note varchar(20) +); +create index idx_ivf_include_query using ivfflat on vector_ivfflat_include_phase5(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); +insert into vector_ivfflat_include_phase5 values +(1, "[1,2,3]", "alpha", 10, "n1"), +(2, "[1,2,4]", "beta", 20, "n2"), +(3, "[9,9,9]", "gamma", 30, "n3"), +(4, "[2,2,2]", "delta", 40, "n4"); +explain select id, title, category +from vector_ivfflat_include_phase5 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 2 𝄀 + -> Join 𝄀 + Join Type: INNER 𝄀 + Join Cond: (vector_ivfflat_include_phase5.id = mo_ivf_alias_0.pkid) 𝄀 + Runtime Filter Build: #[-1,0] 𝄀 + -> Table Scan on vector_ivfflat_include_phase5.vector_ivfflat_include_phase5 𝄀 + Runtime Filter Probe: vector_ivfflat_include_phase5.id 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 2 𝄀 + Limit: 2 +select id, title, category +from vector_ivfflat_include_phase5 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] 𝄀 +1 ¦ alpha ¦ 10 𝄀 +2 ¦ beta ¦ 20 +explain select id, title, category +from vector_ivfflat_include_phase5 +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=pre'; +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 2 𝄀 + -> Join 𝄀 + Join Type: INNER 𝄀 + Join Cond: (vector_ivfflat_include_phase5.id = mo_ivf_alias_0.pkid) 𝄀 + Runtime Filter Build: #[-1,0] 𝄀 + -> Table Scan on vector_ivfflat_include_phase5.vector_ivfflat_include_phase5 𝄀 + Filter Cond: (vector_ivfflat_include_phase5.category >= 20) 𝄀 + Runtime Filter Probe: vector_ivfflat_include_phase5.id 𝄀 + -> Join 𝄀 + Join Type: INNER 𝄀 + Join Cond: (mo_ivf_alias_0.pkid = vector_ivfflat_include_phase5.id) 𝄀 + Runtime Filter Build: #[10,0] 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 2 𝄀 + Runtime Filter Probe: #[8,0] 𝄀 + Limit: 2 𝄀 + -> Table Scan on vector_ivfflat_include_phase5.vector_ivfflat_include_phase5 𝄀 + Filter Cond: (vector_ivfflat_include_phase5.category >= 20) +select id, title, category +from vector_ivfflat_include_phase5 +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=pre'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] 𝄀 +2 ¦ beta ¦ 20 𝄀 +4 ¦ delta ¦ 40 +drop table vector_ivfflat_include_phase5; +drop database vector_ivfflat_include_phase5; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_pre_post_modes.sql b/test/distributed/cases/vector/vector_ivfflat_include_pre_post_modes.sql new file mode 100644 index 0000000000000..cf56980a3f91f --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_pre_post_modes.sql @@ -0,0 +1,48 @@ +drop database if exists vector_ivfflat_include_phase5; +create database vector_ivfflat_include_phase5; +use vector_ivfflat_include_phase5; + +drop table if exists vector_ivfflat_include_phase5; +create table vector_ivfflat_include_phase5( + id int primary key, + embedding vecf32(3), + title varchar(20), + category int, + note varchar(20) +); + +create index idx_ivf_include_query using ivfflat on vector_ivfflat_include_phase5(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); + +insert into vector_ivfflat_include_phase5 values + (1, "[1,2,3]", "alpha", 10, "n1"), + (2, "[1,2,4]", "beta", 20, "n2"), + (3, "[9,9,9]", "gamma", 30, "n3"), + (4, "[2,2,2]", "delta", 40, "n4"); + +-- @separator:table +explain select id, title, category +from vector_ivfflat_include_phase5 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; + +select id, title, category +from vector_ivfflat_include_phase5 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=post'; + +-- @separator:table +explain select id, title, category +from vector_ivfflat_include_phase5 +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=pre'; + +select id, title, category +from vector_ivfflat_include_phase5 +where category >= 20 +order by l2_distance(embedding, "[1,2,3]") +limit 2 by rank with option 'mode=pre'; + +drop table vector_ivfflat_include_phase5; +drop database vector_ivfflat_include_phase5; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_rounds.result b/test/distributed/cases/vector/vector_ivfflat_include_rounds.result new file mode 100644 index 0000000000000..88f3f9469c997 --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_rounds.result @@ -0,0 +1,236 @@ +drop database if exists vector_ivfflat_include_rounds; +create database vector_ivfflat_include_rounds; +use vector_ivfflat_include_rounds; +drop table if exists include_rounds_main; +create table include_rounds_main( +id int primary key, +embedding vecf32(3), +title varchar(20), +category int +); +insert into include_rounds_main values +(1, "[0,0,0]", "a0", 10), +(2, "[0,0,1]", "a1", 10), +(3, "[0,1,0]", "a2", 10), +(4, "[1,0,0]", "a3", 10), +(5, "[10,10,10]", "b0", 20), +(6, "[11,11,11]", "b1", 20), +(7, "[12,12,12]", "b2", 20), +(8, "[13,13,13]", "b3", 20); +create index idx_ivf_include_rounds using ivfflat on include_rounds_main(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); +explain analyze select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=include'; +➤ tp query plan[12,-1,0] 𝄀 +Project 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=2 outputRows=2 (min=2, max=2) InputSize=64 bytes OutputSize=64 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=64 bytes (min=64 bytes, max=64 bytes) 𝄀 + -> Sort 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=2 outputRows=2 (min=2, max=2) InputSize=80 bytes OutputSize=64 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=64 bytes (min=64 bytes, max=64 bytes) 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 2 𝄀 + -> Table Function on ivf_search 𝄀 + Analyze: timeConsumed=5ms waitTime=0ms inputRows=0 outputRows=2 (min=2, max=2) InputSize=0 bytes OutputSize=80 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=80 bytes (min=0 bytes, max=80 bytes) 𝄀 + Index Reader Param: Limit: 2 𝄀 + Limit: 2 𝄀 + Filter Cond: (`__mo_index_include_category` = 20) 𝄀 +Project 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=4 outputRows=4 (min=4, max=4) InputSize=160 bytes OutputSize=160 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=160 bytes (min=160 bytes, max=160 bytes) 𝄀 + -> Sort 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=4 outputRows=4 (min=4, max=4) InputSize=160 bytes OutputSize=160 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=160 bytes (min=160 bytes, max=160 bytes) 𝄀 + Sort Key: __dist_func__ INTERNAL 𝄀 + Limit: 12 𝄀 + -> Table Scan on vector_ivfflat_include_rounds.__mo_index_secondary_019db0d0-d320-7868-9540-0ab8276cfe37 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputBlocks=1 inputRows=8 outputRows=4 (min=4, max=4) InputSize=704 bytes OutputSize=160 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=876 bytes (min=876 bytes, max=876 bytes) 𝄀 + Index Reader Param: Sort Key: l2_distance_sq(__mo_index_centroid_fk_entry, ) INTERNAL Limit: 12 𝄀 + Filter Cond: (__mo_index_include_category = 20), prefix_in(__mo_cpkey_col) +explain analyze select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=post'; +➤ ap query plan on one cn(10 core)[12,-1,0] 𝄀 +Project 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=2 outputRows=2 (min=2, max=2) InputSize=64 bytes OutputSize=64 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=64 bytes (min=64 bytes, max=64 bytes) 𝄀 + -> Sort 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=4 outputRows=2 (min=2, max=2) InputSize=160 bytes OutputSize=64 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=64 bytes (min=64 bytes, max=64 bytes) 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 2 𝄀 + -> Join 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=12 outputRows=4 (min=4, max=4) InputSize=224 bytes OutputSize=160 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=32.21 KiB (min=16.06 KiB, max=16.15 KiB) 𝄀 + Join Type: INNER 𝄀 + Join Cond: (include_rounds_main.id = mo_ivf_alias_0.pkid) 𝄀 + -> Table Scan on vector_ivfflat_include_rounds.include_rounds_main 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputBlocks=1 inputRows=8 outputRows=4 (min=4, max=4) InputSize=256 bytes OutputSize=128 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=392 bytes (min=392 bytes, max=392 bytes) 𝄀 + Filter Cond: (include_rounds_main.category = 20) 𝄀 + -> Table Function on ivf_search 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=0 outputRows=8 (min=8, max=8) InputSize=0 bytes OutputSize=96 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=96 bytes (min=0 bytes, max=96 bytes) 𝄀 + Index Reader Param: Limit: 12 𝄀 + Limit: 12 𝄀 +Project 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=8 outputRows=8 (min=8, max=8) InputSize=96 bytes OutputSize=96 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=96 bytes (min=96 bytes, max=96 bytes) 𝄀 + -> Sort 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=8 outputRows=8 (min=8, max=8) InputSize=96 bytes OutputSize=96 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=96 bytes (min=96 bytes, max=96 bytes) 𝄀 + Sort Key: __dist_func__ INTERNAL 𝄀 + Limit: 12 𝄀 + -> Table Scan on vector_ivfflat_include_rounds.__mo_index_secondary_019db0e1-0e0e-7b2b-ab78-43b059553ad1 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputBlocks=1 inputRows=8 outputRows=8 (min=8, max=8) InputSize=480 bytes OutputSize=96 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=584 bytes (min=584 bytes, max=584 bytes) 𝄀 + Index Reader Param: Sort Key: l2_distance_sq(__mo_index_centroid_fk_entry, ) INTERNAL Limit: 12 𝄀 + Filter Cond: prefix_in(__mo_cpkey_col) +explain analyze select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=pre'; +➤ ap query plan on one cn(10 core)[12,-1,0] 𝄀 +Project 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=2 outputRows=2 (min=2, max=2) InputSize=64 bytes OutputSize=64 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=64 bytes (min=64 bytes, max=64 bytes) 𝄀 + -> Sort 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=2 outputRows=2 (min=2, max=2) InputSize=80 bytes OutputSize=64 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=64 bytes (min=64 bytes, max=64 bytes) 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 2 𝄀 + -> Join 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=4 outputRows=2 (min=2, max=2) InputSize=88 bytes OutputSize=80 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=32.14 KiB (min=16.06 KiB, max=16.09 KiB) 𝄀 + Join Type: INNER 𝄀 + Join Cond: (include_rounds_main.id = mo_ivf_alias_0.pkid) 𝄀 + Runtime Filter Build: #[-1,0] 𝄀 + -> Table Scan on vector_ivfflat_include_rounds.include_rounds_main 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputBlocks=1 inputRows=2 outputRows=2 (min=2, max=2) InputSize=64 bytes OutputSize=64 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=130 bytes (min=130 bytes, max=130 bytes) 𝄀 + Filter Cond: (include_rounds_main.category = 20) 𝄀 + Runtime Filter Probe: include_rounds_main.id 𝄀 + -> Join 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=6 outputRows=2 (min=2, max=2) InputSize=40 bytes OutputSize=24 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=32.14 KiB (min=16.06 KiB, max=16.09 KiB) 𝄀 + Join Type: INNER 𝄀 + Join Cond: (mo_ivf_alias_0.pkid = include_rounds_main.id) 𝄀 + Runtime Filter Build: #[10,0] 𝄀 + -> Table Function on ivf_search 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=0 outputRows=2 (min=2, max=2) InputSize=0 bytes OutputSize=24 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=24 bytes (min=0 bytes, max=24 bytes) 𝄀 + Index Reader Param: Limit: 2 𝄀 + Runtime Filter Probe: #[8,0] 𝄀 + Limit: 2 𝄀 + -> Table Scan on vector_ivfflat_include_rounds.include_rounds_main 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputBlocks=1 inputRows=8 outputRows=4 (min=4, max=4) InputSize=64 bytes OutputSize=16 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=88 bytes (min=88 bytes, max=88 bytes) 𝄀 + Filter Cond: (include_rounds_main.category = 20) 𝄀 +Project 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputRows=4 outputRows=4 (min=4, max=4) InputSize=112 bytes OutputSize=48 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=48 bytes (min=48 bytes, max=48 bytes) 𝄀 + -> Table Scan on vector_ivfflat_include_rounds.__mo_index_secondary_019db0d0-d320-7868-9540-0ab8276cfe37 𝄀 + Analyze: timeConsumed=0ms waitTime=0ms inputBlocks=1 inputRows=8 outputRows=4 (min=4, max=4) InputSize=416 bytes OutputSize=112 bytes ReadSize=0 bytes|0 bytes|0 bytes MemorySize=540 bytes (min=540 bytes, max=540 bytes) 𝄀 + Filter Cond: __mo_index_pri_col in ([5 6 7 8]), prefix_eq(__mo_cpkey_col) +explain select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=include'; +➤ TP QUERY PLAN[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 2 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 2 𝄀 + Limit: 2 𝄀 + Filter Cond: (`__mo_index_include_category` = 20) +explain select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=post'; +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 2 𝄀 + -> Join 𝄀 + Join Type: INNER 𝄀 + Join Cond: (include_rounds_main.id = mo_ivf_alias_0.pkid) 𝄀 + -> Table Scan on vector_ivfflat_include_rounds.include_rounds_main 𝄀 + Filter Cond: (include_rounds_main.category = 20) 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 12 𝄀 + Limit: 12 +explain select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=pre'; +➤ AP QUERY PLAN ON ONE CN(10 core)[12,0,0] 𝄀 +Project 𝄀 + -> Sort 𝄀 + Sort Key: mo_ivf_alias_0.score INTERNAL 𝄀 + Limit: 2 𝄀 + -> Join 𝄀 + Join Type: INNER 𝄀 + Join Cond: (include_rounds_main.id = mo_ivf_alias_0.pkid) 𝄀 + Runtime Filter Build: #[-1,0] 𝄀 + -> Table Scan on vector_ivfflat_include_rounds.include_rounds_main 𝄀 + Filter Cond: (include_rounds_main.category = 20) 𝄀 + Runtime Filter Probe: include_rounds_main.id 𝄀 + -> Join 𝄀 + Join Type: INNER 𝄀 + Join Cond: (mo_ivf_alias_0.pkid = include_rounds_main.id) 𝄀 + Runtime Filter Build: #[10,0] 𝄀 + -> Table Function on ivf_search 𝄀 + Index Reader Param: Limit: 2 𝄀 + Runtime Filter Probe: #[8,0] 𝄀 + Limit: 2 𝄀 + -> Table Scan on vector_ivfflat_include_rounds.include_rounds_main 𝄀 + Filter Cond: (include_rounds_main.category = 20) +select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=include'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] 𝄀 +5 ¦ b0 ¦ 20 𝄀 +6 ¦ b1 ¦ 20 +select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=post'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] 𝄀 +5 ¦ b0 ¦ 20 𝄀 +6 ¦ b1 ¦ 20 +select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=pre'; +➤ id[4,32,0] ¦ title[12,-1,0] ¦ category[4,32,0] 𝄀 +5 ¦ b0 ¦ 20 𝄀 +6 ¦ b1 ¦ 20 +drop table if exists include_rounds_residual; +create table include_rounds_residual( +id int primary key, +embedding vecf32(3), +note varchar(20), +category int +); +insert into include_rounds_residual values +(1, "[0,0,1]", "reject", 20), +(2, "[0,0,2]", "reject", 20), +(3, "[0,0,3]", "reject", 20), +(4, "[0,0,4]", "reject", 20), +(5, "[0,0,5]", "reject", 20), +(6, "[0,0,6]", "reject", 20), +(7, "[0,0,7]", "reject", 20), +(8, "[0,0,8]", "reject", 20), +(9, "[0,0,9]", "reject", 20), +(10, "[0,0,10]", "reject", 20), +(11, "[0,0,11]", "reject", 20), +(12, "[100,100,100]", "far", 20), +(13, "[0,0,12]", "target", 20); +create index idx_ivf_include_residual using ivfflat on include_rounds_residual(embedding) +lists=1 op_type "vector_l2_ops" include(category); +select id, note +from include_rounds_residual +where category = 20 and note = "target" +order by l2_distance(embedding, "[0,0,0]") +limit 1 by rank with option 'mode=include'; +➤ id[4,32,0] ¦ note[12,-1,0] 𝄀 +13 ¦ target +drop table include_rounds_residual; +drop table include_rounds_main; +drop database vector_ivfflat_include_rounds; diff --git a/test/distributed/cases/vector/vector_ivfflat_include_rounds.sql b/test/distributed/cases/vector/vector_ivfflat_include_rounds.sql new file mode 100644 index 0000000000000..201123ebd31b6 --- /dev/null +++ b/test/distributed/cases/vector/vector_ivfflat_include_rounds.sql @@ -0,0 +1,135 @@ +drop database if exists vector_ivfflat_include_rounds; +create database vector_ivfflat_include_rounds; +use vector_ivfflat_include_rounds; + +drop table if exists include_rounds_main; +create table include_rounds_main( + id int primary key, + embedding vecf32(3), + title varchar(20), + category int +); + +insert into include_rounds_main values + (1, "[0,0,0]", "a0", 10), + (2, "[0,0,1]", "a1", 10), + (3, "[0,1,0]", "a2", 10), + (4, "[1,0,0]", "a3", 10), + (5, "[10,10,10]", "b0", 20), + (6, "[11,11,11]", "b1", 20), + (7, "[12,12,12]", "b2", 20), + (8, "[13,13,13]", "b3", 20); + +create index idx_ivf_include_rounds using ivfflat on include_rounds_main(embedding) +lists=2 op_type "vector_l2_ops" include(title, category); + +-- `EXPLAIN ANALYZE` should stay stable across all three modes. +-- @separator:table +-- @ignore:0 +explain analyze select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=include'; + +-- @separator:table +-- @ignore:0 +explain analyze select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=post'; + +-- @separator:table +-- @ignore:0 +explain analyze select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=pre'; + +-- Stable `EXPLAIN` output still distinguishes the three plan shapes. +-- @separator:table +explain select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=include'; + +-- @separator:table +explain select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=post'; + +-- @separator:table +explain select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=pre'; + +-- Compare the final rows after the three execution paths diverge. +-- All three modes should now recover the filtered top-k, but they do so through +-- different plan shapes: include pushes the filter into the index, post over-fetches, +-- and pre uses the extra prefilter join. +-- @separator:table +select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=include'; + +-- @separator:table +select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=post'; + +-- @separator:table +select id, title, category +from include_rounds_main +where category = 20 +order by l2_distance(embedding, "[0,0,0]") +limit 2 by rank with option 'mode=pre'; + +drop table if exists include_rounds_residual; +create table include_rounds_residual( + id int primary key, + embedding vecf32(3), + note varchar(20), + category int +); + +insert into include_rounds_residual values + (1, "[0,0,1]", "reject", 20), + (2, "[0,0,2]", "reject", 20), + (3, "[0,0,3]", "reject", 20), + (4, "[0,0,4]", "reject", 20), + (5, "[0,0,5]", "reject", 20), + (6, "[0,0,6]", "reject", 20), + (7, "[0,0,7]", "reject", 20), + (8, "[0,0,8]", "reject", 20), + (9, "[0,0,9]", "reject", 20), + (10, "[0,0,10]", "reject", 20), + (11, "[0,0,11]", "reject", 20), + (12, "[100,100,100]", "far", 20), + (13, "[0,0,12]", "target", 20); + +create index idx_ivf_include_residual using ivfflat on include_rounds_residual(embedding) +lists=1 op_type "vector_l2_ops" include(category); + +-- Residual filters that are not included in the IVF payload must not cut off +-- the current centroid slice before a closer valid row is seen. +-- @separator:table +select id, note +from include_rounds_residual +where category = 20 and note = "target" +order by l2_distance(embedding, "[0,0,0]") +limit 1 by rank with option 'mode=include'; + +drop table include_rounds_residual; +drop table include_rounds_main; +drop database vector_ivfflat_include_rounds; diff --git a/test/distributed/cases/view/system_view.result b/test/distributed/cases/view/system_view.result index 0f5f70bd73511..fe3c9dbc4414a 100644 --- a/test/distributed/cases/view/system_view.result +++ b/test/distributed/cases/view/system_view.result @@ -1,6 +1,18 @@ begin; -select sleep(5); -sleep(5) +select case when count(*) > 0 then 0 else sleep(1) end as wait_for_mo_sessions_ready from mo_sessions() as t where txn_id != ''; +wait_for_mo_sessions_ready +0 +select case when count(*) > 0 then 0 else sleep(1) end as wait_for_mo_sessions_ready from mo_sessions() as t where txn_id != ''; +wait_for_mo_sessions_ready +0 +select case when count(*) > 0 then 0 else sleep(1) end as wait_for_mo_sessions_ready from mo_sessions() as t where txn_id != ''; +wait_for_mo_sessions_ready +0 +select case when count(*) > 0 then 0 else sleep(1) end as wait_for_mo_sessions_ready from mo_sessions() as t where txn_id != ''; +wait_for_mo_sessions_ready +0 +select case when count(*) > 0 then 0 else sleep(1) end as wait_for_mo_sessions_ready from mo_sessions() as t where txn_id != ''; +wait_for_mo_sessions_ready 0 select count(*) > 0 from mo_sessions() t; count(*) > 0 diff --git a/test/distributed/cases/view/system_view.sql b/test/distributed/cases/view/system_view.sql index 19411faa98357..57a93201f4d03 100644 --- a/test/distributed/cases/view/system_view.sql +++ b/test/distributed/cases/view/system_view.sql @@ -2,9 +2,13 @@ -- @session:id=1{ begin; -select sleep(5); -- @session} +select case when count(*) > 0 then 0 else sleep(1) end as wait_for_mo_sessions_ready from mo_sessions() as t where txn_id != ''; +select case when count(*) > 0 then 0 else sleep(1) end as wait_for_mo_sessions_ready from mo_sessions() as t where txn_id != ''; +select case when count(*) > 0 then 0 else sleep(1) end as wait_for_mo_sessions_ready from mo_sessions() as t where txn_id != ''; +select case when count(*) > 0 then 0 else sleep(1) end as wait_for_mo_sessions_ready from mo_sessions() as t where txn_id != ''; +select case when count(*) > 0 then 0 else sleep(1) end as wait_for_mo_sessions_ready from mo_sessions() as t where txn_id != ''; select count(*) > 0 from mo_sessions() t; select count(*) > 0 from mo_sessions() as t where txn_id != ''; select count(*) > 0 from mo_transactions() t join mo_sessions() s on t.txn_id = s.txn_id; diff --git a/test/distributed/cases/zz_accesscontrol/inner_object.result b/test/distributed/cases/zz_accesscontrol/inner_object.result index a33ba751a9a0c..fc31de25e217a 100644 --- a/test/distributed/cases/zz_accesscontrol/inner_object.result +++ b/test/distributed/cases/zz_accesscontrol/inner_object.result @@ -206,7 +206,8 @@ comment ¦ VARCHAR(2048) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 column_name ¦ VARCHAR(256) ¦ NO ¦ PRI ¦ null ¦ ¦ 𝄀 ordinal_position ¦ INT UNSIGNED(32) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 options ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -index_table_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ +index_table_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +included_columns ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ CREATE TABLE trp ( id INT NOT NULL, fname VARCHAR(30), @@ -248,7 +249,8 @@ comment ¦ VARCHAR(2048) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 column_name ¦ VARCHAR(256) ¦ NO ¦ PRI ¦ null ¦ ¦ 𝄀 ordinal_position ¦ INT UNSIGNED(32) ¦ NO ¦ ¦ null ¦ ¦ 𝄀 options ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 -index_table_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ +index_table_name ¦ VARCHAR(5000) ¦ YES ¦ ¦ null ¦ ¦ 𝄀 +included_columns ¦ TEXT(0) ¦ YES ¦ ¦ null ¦ ¦ drop account if exists account1; drop account if exists inner_account; drop account if exists accx11;