diff --git a/cmd/dbbenchmark/dbbenchmark.go b/cmd/dbbenchmark/dbbenchmark.go index 6f5aed8d2..25d344bae 100644 --- a/cmd/dbbenchmark/dbbenchmark.go +++ b/cmd/dbbenchmark/dbbenchmark.go @@ -174,9 +174,8 @@ func createObjects(store objectstore.ObjectStore, ids []string, detailsCount int i := float32(0) for _, id := range ids { details := genRandomDetails(ids, detailsCount) - relations := genRandomRelations(ids, relationsCount) start := time.Now() - err := store.CreateObject(id, details, relations, nil, "snippet") + err := store.CreateObject(id, details, nil, "snippet") if err != nil { fmt.Println("error occurred while updating object store:", err.Error()) return err @@ -192,21 +191,14 @@ func createObjects(store objectstore.ObjectStore, ids []string, detailsCount int func updateDetails(store objectstore.ObjectStore, ids []string, detailsCount int, relationsCount int) error { avg := float32(0) i := float32(0) - creatorId := genRandomIds(1, 60)[0] for _, id := range ids { details := genRandomDetails(ids, detailsCount) - relations := genRandomRelations(ids, relationsCount) start := time.Now() - err := store.UpdateObjectDetails(id, details, relations, false) + err := store.UpdateObjectDetails(id, details, false) if err != nil { fmt.Println("error occurred while updating object store:", err.Error()) return err } - err = store.UpdateRelationsInSetByObjectType(id, objectType, creatorId, relations.Relations) - if err != nil { - fmt.Println("updating relationships failed", err.Error()) - return err - } taken := float32(time.Now().Sub(start).Nanoseconds()) avg = (avg*i + taken) / (i + 1) i += 1.0 diff --git a/core/block/editor/basic/basic_test.go b/core/block/editor/basic/basic_test.go index 12a392cec..4a6fef302 100644 --- a/core/block/editor/basic/basic_test.go +++ b/core/block/editor/basic/basic_test.go @@ -238,9 +238,7 @@ func TestBasic_SetRelationKey(t *testing.T) { AddBlock(simple.New(&model.Block{Id: "2", Content: &model.BlockContentOfRelation{ Relation: &model.BlockContentRelation{}, }})) - sb.AddExtraRelations(nil, []*model.Relation{ - {Key: "key"}, - }) + sb.AddExtraRelations(nil, "testRelId") } t.Run("correct", func(t *testing.T) { sb := smarttest.New("test") @@ -248,7 +246,7 @@ func TestBasic_SetRelationKey(t *testing.T) { b := NewBasic(sb) err := b.SetRelationKey(nil, pb.RpcBlockRelationSetKeyRequest{ BlockId: "2", - Key: "key", + Key: "testRelId", }) require.NoError(t, err) var setRelationEvent *pb.EventBlockSetRelation diff --git a/core/block/editor/options.go b/core/block/editor/options.go index 4907bcf98..1f9e815cc 100644 --- a/core/block/editor/options.go +++ b/core/block/editor/options.go @@ -1,53 +1,64 @@ package editor import ( + "errors" + "fmt" + "github.com/anytypeio/go-anytype-middleware/app" "github.com/anytypeio/go-anytype-middleware/core/block/editor/smartblock" "github.com/anytypeio/go-anytype-middleware/core/block/editor/state" - "github.com/anytypeio/go-anytype-middleware/core/block/editor/subobject" + "github.com/anytypeio/go-anytype-middleware/core/block/source" "github.com/anytypeio/go-anytype-middleware/pkg/lib/bundle" + "github.com/anytypeio/go-anytype-middleware/pkg/lib/pb/model" "github.com/anytypeio/go-anytype-middleware/util/pbtypes" "github.com/anytypeio/go-anytype-middleware/util/slice" "github.com/globalsign/mgo/bson" "github.com/gogo/protobuf/types" + "strings" ) +var ErrOptionNotFound = errors.New("option not found") + const optionsCollName = "options" -type SubObjectCreator interface { - NewSubObject(subId string, parent subobject.ParentObject) (s *subobject.SubObject, err error) -} - -func NewOptions(sc SubObjectCreator) *Options { +func NewOptions(s source.Service) *Options { return &Options{ - SmartBlock: smartblock.New(), - sc: sc, + SmartBlock: smartblock.New(), + options: make(map[string]*Option), + sourceService: s, } } type Options struct { smartblock.SmartBlock - sc SubObjectCreator - openedCount int + options map[string]*Option + sourceService source.Service + app *app.App } func (o *Options) Init(ctx *smartblock.InitContext) (err error) { + o.AddHook(o.onAfterApply, smartblock.HookAfterApply) + o.app = ctx.App if err = o.SmartBlock.Init(ctx); err != nil { return } - o.AddHook(o.onAfterApply, smartblock.HookAfterApply) - return + data := ctx.State.GetCollection(optionsCollName) + if data != nil && data.Fields != nil { + for subId := range data.Fields { + if err = o.initOption(subId); err != nil { + return + } + } + } + return o.Apply(ctx.State, smartblock.NoHooks) } -func (o *Options) Open(id string) (sb smartblock.SmartBlock, err error) { - so, err := o.sc.NewSubObject(id, o) - if err != nil { - return nil, err +func (o *Options) Open(subId string) (sb smartblock.SmartBlock, err error) { + o.Lock() + defer o.Unlock() + if opt, ok := o.options[subId]; ok { + return opt, nil } - opt := &Option{ - parent: o, - SubObject: so, - } - return opt, nil + return nil, ErrOptionNotFound } func (o *Options) CreateOption(opt *types.Struct) (id string, err error) { @@ -60,59 +71,101 @@ func (o *Options) CreateOption(opt *types.Struct) (id string, err error) { ids := pbtypes.GetStringList(st.Details(), bundle.RelationKeyRelationDict.String()) ids = append(ids, id) st.SetDetail(bundle.RelationKeyRelationDict.String(), pbtypes.StringList(ids)) - if err = o.Apply(st); err != nil { + if err = o.initOption(subId); err != nil { + return + } + if err = o.Apply(st, smartblock.NoHooks); err != nil { return } return } -func (o *Options) Locked() bool { - return o.SmartBlock.Locked() || o.openedCount > 0 +func (o *Options) initOption(subId string) (err error) { + opt := NewOption() + st, err := o.subState(subId) + if err != nil { + return + } + if err = opt.Init(&smartblock.InitContext{ + Source: o.sourceService.NewStaticSource(o.Id()+"/"+subId, model.SmartBlockType_RelationOption, st, o.onOptionChange), + App: o.app, + }); err != nil { + return + } + o.options[subId] = opt + return } -func (o *Options) SubState(subId string) (*state.State, error) { +func (o *Options) Locked() bool { o.Lock() defer o.Unlock() + if o.IsLocked() { + return true + } + for _, opt := range o.options { + if opt.Locked() { + return true + } + } + return false +} + +func (o *Options) subState(subId string) (*state.State, error) { id := o.Id() + "/" + subId s := o.NewState() ids := pbtypes.GetStringList(s.Details(), bundle.RelationKeyRelationDict.String()) if slice.FindPos(ids, id) == -1 { - return nil, bundle.ErrNotFound + return nil, ErrOptionNotFound } optData := pbtypes.GetStruct(s.NewState().GetCollection(optionsCollName), subId) - o.openedCount++ return state.NewDoc(id, nil).(*state.State).SetDetails(optData), nil } -func (o *Options) SubStateApply(subId string, s *state.State) (err error) { +func (o *Options) onOptionChange(params source.PushChangeParams) (changeId string, err error) { o.Lock() defer o.Unlock() st := o.NewState() - st.SetInStore([]string{optionsCollName, subId}, pbtypes.Struct(s.CombinedDetails())) - return o.Apply(s, smartblock.NoHooks) + id := params.State.RootId() + var subId string + if idx := strings.Index(id, "/"); idx != -1 { + subId = id[idx+1:] + } + if _, ok := o.options[subId]; !ok { + return "", fmt.Errorf("onOptionChange: option not exists") + } + st.SetInStore([]string{optionsCollName, subId}, pbtypes.Struct(params.State.CombinedDetails())) + return "", o.Apply(st, smartblock.NoHooks) } func (o *Options) onAfterApply(info smartblock.ApplyInfo) (err error) { - var ids []string for _, ch := range info.Changes { if keySet := ch.GetStoreKeySet(); keySet != nil { if len(keySet.Path) >= 2 && keySet.Path[0] == optionsCollName { - id := o.Id() + "/" + keySet.Path[1] - ids = append(ids, id) + if opt, ok := o.options[keySet.Path[1]]; ok { + if e := opt.SetStruct(pbtypes.GetStruct(o.NewState().GetCollection(optionsCollName), keySet.Path[1])); e != nil { + log.With("threadId", o.Id()).Errorf("options: can't set struct: %v", e) + } + } } } } return } -type Option struct { - parent *Options - *subobject.SubObject +func NewOption() *Option { + return &Option{ + SmartBlock: smartblock.New(), + } } -func (o *Option) Close() (err error) { - o.parent.Lock() - o.parent.openedCount-- - o.parent.Unlock() - return o.SubObject.Close() +type Option struct { + smartblock.SmartBlock +} + +func (o *Option) SetStruct(st *types.Struct) error { + o.Lock() + defer o.Unlock() + s := o.NewState() + s.SetDetails(st) + return o.Apply(s) } diff --git a/core/block/editor/smartblock/smartblock.go b/core/block/editor/smartblock/smartblock.go index 687433a65..413043faa 100644 --- a/core/block/editor/smartblock/smartblock.go +++ b/core/block/editor/smartblock/smartblock.go @@ -109,6 +109,7 @@ type SmartBlock interface { SetLayout(ctx *state.Context, layout model.ObjectTypeLayout) error SetIsDeleted() IsDeleted() bool + IsLocked() bool SendEvent(msgs []*pb.EventMessage) ResetToVersion(s *state.State) (err error) @@ -612,6 +613,10 @@ func (sb *smartBlock) SetEventFunc(f func(e *pb.Event)) { func (sb *smartBlock) Locked() bool { sb.Lock() defer sb.Unlock() + return sb.IsLocked() +} + +func (sb *smartBlock) IsLocked() bool { return sb.sendEvent != nil } diff --git a/core/block/editor/smartblock/smartblock_test.go b/core/block/editor/smartblock/smartblock_test.go index 902cb527c..921136a63 100644 --- a/core/block/editor/smartblock/smartblock_test.go +++ b/core/block/editor/smartblock/smartblock_test.go @@ -1,10 +1,15 @@ package smartblock import ( + "github.com/anytypeio/go-anytype-middleware/app" + "github.com/anytypeio/go-anytype-middleware/app/testapp" + "github.com/anytypeio/go-anytype-middleware/core/block/restriction" + "github.com/anytypeio/go-anytype-middleware/pkg/lib/localstore/objectstore" + "github.com/anytypeio/go-anytype-middleware/util/testMock/mockDoc" + "github.com/gogo/protobuf/types" "testing" "github.com/anytypeio/go-anytype-middleware/core/block/editor/state" - "github.com/anytypeio/go-anytype-middleware/core/block/restriction" "github.com/anytypeio/go-anytype-middleware/core/block/simple" _ "github.com/anytypeio/go-anytype-middleware/core/block/simple/base" _ "github.com/anytypeio/go-anytype-middleware/core/block/simple/link" @@ -15,7 +20,6 @@ import ( "github.com/anytypeio/go-anytype-middleware/util/pbtypes" "github.com/anytypeio/go-anytype-middleware/util/testMock" "github.com/anytypeio/go-anytype-middleware/util/testMock/mockSource" - "github.com/gogo/protobuf/types" "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -87,25 +91,39 @@ func TestBasic_SetAlign(t *testing.T) { type fixture struct { t *testing.T ctrl *gomock.Controller + app *app.App source *mockSource.MockSource snapshot *testMock.MockSmartBlockSnapshot store *testMock.MockObjectStore + md *mockDoc.MockService SmartBlock } func newFixture(t *testing.T) *fixture { ctrl := gomock.NewController(t) + + at := testMock.NewMockService(ctrl) + at.EXPECT().ProfileID().Return("").AnyTimes() + at.EXPECT().Account().Return("").AnyTimes() + source := mockSource.NewMockSource(ctrl) source.EXPECT().Type().AnyTimes().Return(model.SmartBlockType_Page) - source.EXPECT().Anytype().AnyTimes().Return(nil) + source.EXPECT().Anytype().AnyTimes().Return(at) source.EXPECT().Virtual().AnyTimes().Return(false) store := testMock.NewMockObjectStore(ctrl) + store.EXPECT().Name().Return(objectstore.CName).AnyTimes() + a := testapp.New() + a.Register(store). + Register(restriction.New()) + md := mockDoc.RegisterMockDoc(ctrl, a) return &fixture{ SmartBlock: New(), t: t, ctrl: ctrl, store: store, + app: a.App, source: source, + md: md, } } @@ -122,13 +140,15 @@ func (fx *fixture) init(blocks []*model.Block) { doc := state.NewDoc(id, bm) fx.source.EXPECT().ReadDoc(gomock.Any(), false).Return(doc, nil) fx.source.EXPECT().Id().Return(id).AnyTimes() + fx.source.EXPECT().LogHeads().Return(nil).AnyTimes() fx.store.EXPECT().GetDetails(id).Return(&model.ObjectDetails{ Details: &types.Struct{Fields: map[string]*types.Value{}}, }, nil) + fx.md.EXPECT().ReportChange(gomock.Any(), gomock.Any()).AnyTimes() fx.store.EXPECT().GetPendingLocalDetails(id).Return(&model.ObjectDetails{ Details: &types.Struct{Fields: map[string]*types.Value{}}, }, nil) fx.store.EXPECT().UpdatePendingLocalDetails(id, nil).Return(nil) - err := fx.Init(&InitContext{Source: fx.source, Restriction: restriction.New(), ObjectStore: fx.store}) + err := fx.Init(&InitContext{Source: fx.source, App: fx.app}) require.NoError(fx.t, err) } diff --git a/core/block/editor/smartblock/smarttest/smarttest.go b/core/block/editor/smartblock/smarttest/smarttest.go index 474ce99b7..adc5bd10e 100644 --- a/core/block/editor/smartblock/smarttest/smarttest.go +++ b/core/block/editor/smartblock/smarttest/smarttest.go @@ -41,6 +41,10 @@ type SmartTest struct { os *testMock.MockObjectStore } +func (st *SmartTest) IsLocked() bool { + return false +} + func (st *SmartTest) RelationService() relation.Service { return st.App.Component(relation.CName).(relation.Service) } diff --git a/core/block/editor/state/change_test.go b/core/block/editor/state/change_test.go index 5e2de3eff..5e4db63e0 100644 --- a/core/block/editor/state/change_test.go +++ b/core/block/editor/state/change_test.go @@ -492,10 +492,10 @@ func Test_ApplyChange(t *testing.T) { func TestRelationChanges(t *testing.T) { a := NewDoc("root", nil).(*State) - a.relationLinks = []string{"1", "2", "3"} + a.relationLinks = []*model.RelationLink{{Id: "1"}, {Id: "2"}, {Id: "3"}} ac := a.Copy() b := a.NewState() - b.relationLinks = []string{"3", "4", "5"} + b.relationLinks = []*model.RelationLink{{Id: "3"}, {Id: "4"}, {Id: "5"}} _, _, err := ApplyState(b, false) require.NoError(t, err) chs := a.GetChanges() diff --git a/core/block/editor/state/relations_test.go b/core/block/editor/state/relations_test.go deleted file mode 100644 index 0bbf2c7d9..000000000 --- a/core/block/editor/state/relations_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package state - -import ( - "github.com/stretchr/testify/assert" - "testing" -) - -func TestRelationLinks_Diff(t *testing.T) { - before := RelationLinks{ - {Id: "1"}, - {Id: "2"}, - {Id: "3"}, - {Id: "4"}, - } - after := RelationLinks{ - {Id: "2"}, - {Id: "3"}, - {Id: "4"}, - {Id: "5"}, - } - added, removed := after.Diff(before) - assert.Equal(t, RelationLinks{{Id: "5"}}, added) - assert.Equal(t, []string{"1"}, removed) -} diff --git a/core/block/editor/stext/text_test.go b/core/block/editor/stext/text_test.go index a10d40789..8ba9e1425 100644 --- a/core/block/editor/stext/text_test.go +++ b/core/block/editor/stext/text_test.go @@ -1,6 +1,7 @@ package stext import ( + "github.com/anytypeio/go-anytype-middleware/core/block/editor/smartblock" "testing" "time" @@ -239,7 +240,7 @@ func TestTextImpl_SetText(t *testing.T) { Text: "12", })) assert.Equal(t, " ", sb.NewState().Pick("1").Model().GetText().Text) - tb.(*textImpl).flushSetTextState(nil) + tb.(*textImpl).flushSetTextState(smartblock.ApplyInfo{}) assert.Equal(t, "12", sb.NewState().Pick("1").Model().GetText().Text) time.Sleep(time.Second) assert.Equal(t, "12", sb.NewState().Pick("1").Model().GetText().Text) @@ -256,12 +257,12 @@ func TestTextImpl_SetText(t *testing.T) { BlockId: "1", Text: "1", })) - tb.(*textImpl).flushSetTextState(nil) + tb.(*textImpl).flushSetTextState(smartblock.ApplyInfo{}) require.NoError(t, tb.SetText(pb.RpcBlockSetTextTextRequest{ BlockId: "2", Text: "2", })) - tb.(*textImpl).flushSetTextState(nil) + tb.(*textImpl).flushSetTextState(smartblock.ApplyInfo{}) assert.Equal(t, "1", sb.NewState().Pick("1").Model().GetText().Text) assert.Equal(t, "2", sb.NewState().Pick("2").Model().GetText().Text) time.Sleep(time.Second) diff --git a/core/block/editor/subobject/subobject.go b/core/block/editor/subobject/subobject.go deleted file mode 100644 index 171d7ae97..000000000 --- a/core/block/editor/subobject/subobject.go +++ /dev/null @@ -1,40 +0,0 @@ -package subobject - -import ( - "github.com/anytypeio/go-anytype-middleware/core/block/editor/smartblock" - "github.com/anytypeio/go-anytype-middleware/core/block/editor/state" -) - -func NewSubObject(subId string, parent ParentObject) *SubObject { - return &SubObject{ - id: subId, - ParentObject: parent, - SmartBlock: smartblock.New(), - } -} - -type ParentObject interface { - Id() string - SubState(subId string) (s *state.State, err error) - SubStateApply(subId string, s *state.State) (err error) -} - -type SubObject struct { - id string - ParentObject ParentObject - smartblock.SmartBlock -} - -func (s *SubObject) Id() string { - return s.ParentObject.Id() + "/" + s.id -} - -func (s *SubObject) SubId() string { - return s.id -} - -func (s *SubObject) SubInit() { - s.AddHook(func(info smartblock.ApplyInfo) (err error) { - return s.ParentObject.SubStateApply(s.id, info.State) - }, smartblock.HookAfterApply) -} diff --git a/core/block/service.go b/core/block/service.go index 45bc0fa8c..1d03c9567 100644 --- a/core/block/service.go +++ b/core/block/service.go @@ -5,7 +5,6 @@ import ( "encoding/base64" "errors" "fmt" - "github.com/anytypeio/go-anytype-middleware/core/block/editor/subobject" "net/url" "strings" "time" @@ -1020,7 +1019,7 @@ func (s *service) newSmartBlock(id string, initCtx *smartblock.InitContext) (sb case model.SmartBlockType_AccountOld: sb = editor.NewThreadDB(s) case model.SmartBlockType_RelationOptionList: - sb = editor.NewOptions(s) + sb = editor.NewOptions(s.source) default: return nil, fmt.Errorf("unexpected smartblock type: %v", sc.Type()) } @@ -1385,22 +1384,3 @@ func (s *service) replaceLink(id, oldId, newId string) error { return b.ReplaceLink(oldId, newId) }) } - -func (s *service) NewSubObject(subId string, parent subobject.ParentObject) (so *subobject.SubObject, err error) { - so = subobject.NewSubObject(subId, parent) - st, err := parent.SubState(subId) - if err != nil { - return - } - ctx := &smartblock.InitContext{ - Source: s.source.NewStaticSource(so.Id(), model.SmartBlockType_Page, st), - ObjectTypeUrls: st.ObjectTypes(), - State: st, - App: s.app, - } - if err = so.Init(ctx); err != nil { - return - } - so.SubInit() - return -} diff --git a/core/block/source/service.go b/core/block/source/service.go index d178b9c43..3590c198c 100644 --- a/core/block/source/service.go +++ b/core/block/source/service.go @@ -24,7 +24,7 @@ func New() Service { type Service interface { NewSource(id string, listenToOwnChanges bool) (s Source, err error) RegisterStaticSource(id string, new func() Source) - NewStaticSource(id string, sbType model.SmartBlockType, doc *state.State) SourceWithType + NewStaticSource(id string, sbType model.SmartBlockType, doc *state.State, pushChange func(p PushChangeParams) (string, error)) SourceWithType GetDetailsFromIdBasedSource(id string) (*types.Struct, error) SourceTypeBySbType(blockType smartblock.SmartBlockType) (SourceType, error) app.Component diff --git a/core/block/source/source.go b/core/block/source/source.go index 3e689e67e..d518e69fa 100644 --- a/core/block/source/source.go +++ b/core/block/source/source.go @@ -86,7 +86,7 @@ func (s *service) SourceTypeBySbType(blockType smartblock.SmartBlockType) (Sourc case smartblock.SmartBlockTypeWorkspaceOld: return &threadDB{a: s.anytype}, nil case smartblock.SmartBlockTypeBundledTemplate: - return s.NewStaticSource("", model.SmartBlockType_BundledTemplate, nil), nil + return s.NewStaticSource("", model.SmartBlockType_BundledTemplate, nil, nil), nil default: if err := blockType.Valid(); err != nil { return nil, err diff --git a/core/block/source/static.go b/core/block/source/static.go index 7ad783b61..d6f3c5406 100644 --- a/core/block/source/static.go +++ b/core/block/source/static.go @@ -11,7 +11,7 @@ import ( "github.com/anytypeio/go-anytype-middleware/pkg/lib/pb/model" ) -func (s *service) NewStaticSource(id string, sbType model.SmartBlockType, doc *state.State) SourceWithType { +func (s *service) NewStaticSource(id string, sbType model.SmartBlockType, doc *state.State, pushChange func(p PushChangeParams) (string, error)) SourceWithType { return &static{ id: id, sbType: sbType, @@ -22,11 +22,12 @@ func (s *service) NewStaticSource(id string, sbType model.SmartBlockType, doc *s } type static struct { - id string - sbType model.SmartBlockType - doc *state.State - a core.Service - s *service + id string + sbType model.SmartBlockType + doc *state.State + pushChange func(p PushChangeParams) (string, error) + a core.Service + s *service } func (s *static) Id() string { @@ -58,6 +59,9 @@ func (s *static) ReadMeta(receiver ChangeReceiver) (doc state.Doc, err error) { } func (s *static) PushChange(params PushChangeParams) (id string, err error) { + if s.pushChange != nil { + return s.pushChange(params) + } return } diff --git a/core/indexer/indexer_test.go b/core/indexer/indexer_test.go index 3bc56aabf..f45def9d0 100644 --- a/core/indexer/indexer_test.go +++ b/core/indexer/indexer_test.go @@ -78,7 +78,7 @@ func newFixture(t *testing.T) *fixture { fx.objectStore.EXPECT().FTSearch().Return(nil).AnyTimes() fx.objectStore.EXPECT().IndexForEach(gomock.Any()).Times(1) fx.objectStore.EXPECT().UpdateObjectLinks(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - fx.objectStore.EXPECT().CreateObject(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + fx.objectStore.EXPECT().CreateObject(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() fx.anytype.EXPECT().ObjectStore().Return(fx.objectStore).AnyTimes() fx.objectStore.EXPECT().SaveChecksums(&model.ObjectStoreChecksums{ BundledObjectTypes: bundle.TypeChecksum, diff --git a/core/relations_test.go b/core/relations_test.go index 5377b8865..37dae4924 100644 --- a/core/relations_test.go +++ b/core/relations_test.go @@ -12,7 +12,6 @@ import ( "github.com/anytypeio/go-anytype-middleware/pkg/lib/bundle" "github.com/anytypeio/go-anytype-middleware/pkg/lib/pb/model" "github.com/anytypeio/go-anytype-middleware/util/pbtypes" - "github.com/globalsign/mgo/bson" types2 "github.com/gogo/protobuf/types" "github.com/stretchr/testify/require" ) @@ -26,15 +25,6 @@ func getBlockById(id string, blocks []*model.Block) *model.Block { return nil } -func getRelationByKey(relations []*model.Relation, key string) *model.Relation { - for _, relation := range relations { - if relation.Key == key { - return relation - } - } - return nil -} - func start(t *testing.T, eventSender event.Sender) (rootPath string, mw *Middleware, close func() error) { if debug, ok := os.LookupEnv("ANYPROF"); ok && debug != "" { go func() { @@ -63,24 +53,6 @@ func start(t *testing.T, eventSender event.Sender) (rootPath string, mw *Middlew return rootPath, mw, close } -func addRelation(t *testing.T, contextId string, mw *Middleware) (key string, name string) { - name = bson.NewObjectId().String() - respDataviewRelationAdd := mw.BlockDataviewRelationAdd(&pb.RpcBlockDataviewRelationAddRequest{ - ContextId: contextId, - BlockId: "dataview", - Relation: &model.Relation{ - Key: "", - Format: 0, - Name: name, - ReadOnly: false, - }, - }) - - require.Equal(t, 0, int(respDataviewRelationAdd.Error.Code), respDataviewRelationAdd.Error.Description) - key = respDataviewRelationAdd.RelationKey - return -} - func TestArchiveIndex(t *testing.T) { _, mw, close := start(t, nil) defer close() diff --git a/docs/proto.md b/docs/proto.md index d7a0077a3..d4e65efbb 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -16236,6 +16236,7 @@ RelationFormat describes how the underlying data is stored in the google.protobu | WorkspaceOld | 517 | deprecated thread-based workspace | | Workspace | 518 | | | RelationOptionList | 519 | | +| RelationOption | 520 | | diff --git a/pkg/lib/core/smartblock/smartblock.go b/pkg/lib/core/smartblock/smartblock.go index 0464d2925..1db3d4730 100644 --- a/pkg/lib/core/smartblock/smartblock.go +++ b/pkg/lib/core/smartblock/smartblock.go @@ -38,6 +38,7 @@ const ( SmartBlockTypeWorkspaceOld = SmartBlockType(model.SmartBlockType_WorkspaceOld) // deprecated thread-based workspaces SmartBlockTypeWorkspace = SmartBlockType(model.SmartBlockType_Workspace) SmartBlockTypeRelationOptionList = SmartBlockType(model.SmartBlockType_RelationOptionList) + SmartBlockTypeRelationOption = SmartBlockType(model.SmartBlockType_RelationOption) ) func SmartBlockTypeFromID(id string) (SmartBlockType, error) { diff --git a/pkg/lib/localstore/objectstore/objects_test.go b/pkg/lib/localstore/objectstore/objects_test.go index 99e997f6d..4b5d98516 100644 --- a/pkg/lib/localstore/objectstore/objects_test.go +++ b/pkg/lib/localstore/objectstore/objects_test.go @@ -48,7 +48,7 @@ func TestDsObjectStore_UpdateLocalDetails(t *testing.T) { // bundle.RelationKeyLastOpenedDate is local relation (not stored in the changes tree) err = ds.CreateObject(id.String(), &types.Struct{ Fields: map[string]*types.Value{bundle.RelationKeyLastOpenedDate.String(): pbtypes.Int64(4), "type": pbtypes.String("_otp1")}, - }, nil, nil, "") + }, nil, "") require.NoError(t, err) ot := &model.ObjectType{Url: "_otp1", Name: "otp1"} @@ -59,7 +59,7 @@ func TestDsObjectStore_UpdateLocalDetails(t *testing.T) { err = ds.UpdateObjectDetails(id.String(), &types.Struct{ Fields: map[string]*types.Value{"k1": pbtypes.String("1"), "k2": pbtypes.String("2"), "type": pbtypes.String("_otp1")}, - }, nil, true) + }, true) require.NoError(t, err) recs, _, err = ds.Query(schema.NewByType(ot, nil), database.Query{}) @@ -70,7 +70,7 @@ func TestDsObjectStore_UpdateLocalDetails(t *testing.T) { err = ds.UpdateObjectDetails(id.String(), &types.Struct{ Fields: map[string]*types.Value{"k1": pbtypes.String("1"), "k2": pbtypes.String("2"), "type": pbtypes.String("_otp1")}, - }, nil, false) + }, false) require.NoError(t, err) recs, _, err = ds.Query(schema.NewByType(ot, nil), database.Query{}) @@ -162,9 +162,9 @@ func TestDsObjectStore_Query(t *testing.T) { id1 := tid1.String() id2 := tid2.String() id3 := tid3.String() - require.NoError(t, ds.CreateObject(id1, newDet("one"), nil, nil, "s1")) - require.NoError(t, ds.CreateObject(id2, newDet("two"), nil, nil, "s2")) - require.NoError(t, ds.CreateObject(id3, newDet("three"), nil, nil, "s3")) + require.NoError(t, ds.CreateObject(id1, newDet("one"), nil, "s1")) + require.NoError(t, ds.CreateObject(id2, newDet("two"), nil, "s2")) + require.NoError(t, ds.CreateObject(id3, newDet("three"), nil, "s3")) require.NoError(t, fts.Index(ftsearch.SearchDoc{ Id: id1, Title: "one", @@ -254,103 +254,6 @@ func TestDsObjectStore_PrefixQuery(t *testing.T) { require.Equal(t, "/p1/abc/def/1", entries[0].Key) } -func TestDsObjectStore_RelationsIndex(t *testing.T) { - tmpDir, _ := ioutil.TempDir("", "") - defer os.RemoveAll(tmpDir) - - logging.ApplyLevelsFromEnv() - app := testapp.New() - defer app.Close() - ds := New() - err := app.With(&config.DefaultConfig).With(wallet.NewWithRepoPathAndKeys(tmpDir, nil, nil)).With(clientds.New()).With(ftsearch.New()).With(ds).Start() - require.NoError(t, err) - - newDet := func(name, objtype string) *types.Struct { - return &types.Struct{ - Fields: map[string]*types.Value{ - "name": pbtypes.String(name), - "type": pbtypes.StringList([]string{objtype}), - }, - } - } - id1 := getId() - id2 := getId() - id3 := getId() - require.NoError(t, ds.CreateObject(id1, newDet("one", "_ota1"), &model.Relations{Relations: []*model.Relation{ - { - Key: "rel1", - Format: model.RelationFormat_status, - Name: "rel 1", - DefaultValue: nil, - SelectDict: []*model.RelationOption{ - {"id1", "option1", "red", model.RelationOption_local}, - {"id2", "option2", "red", model.RelationOption_local}, - {"id3", "option3", "red", model.RelationOption_local}, - }, - }, - { - Key: "rel2", - Format: model.RelationFormat_shorttext, - Name: "rel 2", - DefaultValue: nil, - }, - }}, nil, "s1")) - - require.NoError(t, ds.CreateObject(id2, newDet("two", "_ota2"), &model.Relations{Relations: []*model.Relation{ - { - Key: "rel1", - Format: model.RelationFormat_status, - Name: "rel 1", - DefaultValue: nil, - SelectDict: []*model.RelationOption{ - {"id3", "option3", "yellow", model.RelationOption_local}, - {"id4", "option4", "red", model.RelationOption_local}, - {"id5", "option5", "red", model.RelationOption_local}, - }, - }, - { - Key: "rel3", - Format: model.RelationFormat_status, - Name: "rel 3", - DefaultValue: nil, - SelectDict: []*model.RelationOption{ - {"id5", "option5", "red", model.RelationOption_local}, - {"id6", "option6", "red", model.RelationOption_local}, - }, - }, - { - Key: "rel4", - Format: model.RelationFormat_tag, - Name: "rel 4", - DefaultValue: nil, - SelectDict: []*model.RelationOption{ - {"id7", "option7", "red", model.RelationOption_local}, - }, - }, - }}, nil, "s2")) - require.NoError(t, ds.CreateObject(id3, newDet("three", "_ota2"), nil, nil, "s3")) - - restOpts, err := ds.GetAggregatedOptions("rel1", "_otffff") - require.NoError(t, err) - require.Len(t, restOpts, 5) - - time.Sleep(time.Millisecond * 50) - rels, err := ds.AggregateRelationsFromObjectsOfType("_ota1") - require.NoError(t, err) - require.Len(t, rels, 2) - - require.Equal(t, "rel1", rels[0].Key) - require.Equal(t, "rel2", rels[1].Key) - - rels, err = ds.ListRelations("_ota1") - require.NoError(t, err) - require.Len(t, rels, len(bundle.ListRelationsKeys())+4) - - require.Equal(t, "rel1", rels[0].Key) - require.Equal(t, "rel2", rels[1].Key) - require.Equal(t, "rel3", rels[2].Key) - require.Equal(t, "rel4", rels[3].Key) -} func Test_removeByPrefix(t *testing.T) { tmpDir, _ := ioutil.TempDir("", "") @@ -377,7 +280,7 @@ func Test_removeByPrefix(t *testing.T) { rand.Read(key) links = append(links, fmt.Sprintf("%x", key)) } - require.NoError(t, ds.CreateObject(objId, nil, nil, links, "")) + require.NoError(t, ds.CreateObject(objId, nil, links, "")) } tx, err := ds2.ds.NewTransaction(false) _, err = removeByPrefixInTx(tx, pagesInboundLinksBase.String()) diff --git a/pkg/lib/pb/model/models.pb.go b/pkg/lib/pb/model/models.pb.go index a6026a404..7746e442b 100644 --- a/pkg/lib/pb/model/models.pb.go +++ b/pkg/lib/pb/model/models.pb.go @@ -49,6 +49,7 @@ const ( SmartBlockType_WorkspaceOld SmartBlockType = 517 SmartBlockType_Workspace SmartBlockType = 518 SmartBlockType_RelationOptionList SmartBlockType = 519 + SmartBlockType_RelationOption SmartBlockType = 520 ) var SmartBlockType_name = map[int32]string{ @@ -75,6 +76,7 @@ var SmartBlockType_name = map[int32]string{ 517: "WorkspaceOld", 518: "Workspace", 519: "RelationOptionList", + 520: "RelationOption", } var SmartBlockType_value = map[string]int32{ @@ -101,6 +103,7 @@ var SmartBlockType_value = map[string]int32{ "WorkspaceOld": 517, "Workspace": 518, "RelationOptionList": 519, + "RelationOption": 520, } func (x SmartBlockType) String() string { @@ -3987,240 +3990,240 @@ func init() { } var fileDescriptor_98a910b73321e591 = []byte{ - // 3721 bytes of a gzipped FileDescriptorProto + // 3723 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x3a, 0x4d, 0x73, 0x1c, 0xc7, 0x75, 0x98, 0xdd, 0xd9, 0xaf, 0x87, 0x0f, 0x36, 0x9a, 0x10, 0xb4, 0x5e, 0xc9, 0x34, 0x33, 0x51, 0x64, 0x86, 0xa2, 0x97, 0x14, 0x28, 0xd9, 0x91, 0x12, 0x7d, 0x00, 0x58, 0xd2, 0x40, 0x91, 0x14, 0xa8, 0x59, 0x10, 0x4e, 0x5c, 0xa9, 0x94, 0x7a, 0x67, 0x1a, 0xbb, 0x23, 0xcc, 0x4e, 0xaf, 0x7b, - 0x7a, 0x41, 0xac, 0x2b, 0x07, 0x3b, 0x8e, 0xed, 0x1c, 0x9d, 0xa4, 0x52, 0xc9, 0xd1, 0xb9, 0xe4, - 0xe4, 0x5b, 0xca, 0x55, 0x49, 0x55, 0xce, 0xa9, 0xa4, 0x2a, 0x07, 0x1d, 0x9d, 0x5b, 0x4a, 0x2a, - 0xfd, 0x8b, 0x1c, 0x52, 0xaf, 0xbb, 0x67, 0x76, 0x76, 0x01, 0x82, 0x4b, 0xc5, 0xb7, 0xe9, 0xd7, - 0xef, 0xbd, 0x7e, 0xfd, 0xba, 0xdf, 0x67, 0x0f, 0xbc, 0x36, 0x3a, 0xe9, 0xdf, 0x8e, 0xa3, 0xde, - 0xed, 0x51, 0xef, 0xf6, 0x50, 0x84, 0x3c, 0xbe, 0x3d, 0x92, 0x42, 0x89, 0xd4, 0x0c, 0xd2, 0xb6, - 0x1e, 0xd1, 0x55, 0x96, 0x4c, 0xd4, 0x64, 0xc4, 0xdb, 0x1a, 0xda, 0x7a, 0xb5, 0x2f, 0x44, 0x3f, - 0xe6, 0x06, 0xb5, 0x37, 0x3e, 0xbe, 0x9d, 0x2a, 0x39, 0x0e, 0x94, 0x41, 0xf6, 0xfe, 0xab, 0x04, - 0x9b, 0xdd, 0x21, 0x93, 0x6a, 0x27, 0x16, 0xc1, 0x49, 0x37, 0x61, 0xa3, 0x74, 0x20, 0xd4, 0x0e, - 0x4b, 0x39, 0xbd, 0x05, 0xd5, 0x1e, 0x02, 0xd3, 0xa6, 0x73, 0xbd, 0x7c, 0x63, 0x79, 0x6b, 0xa3, - 0x3d, 0xc3, 0xb8, 0xad, 0x29, 0x7c, 0x8b, 0x43, 0xdf, 0x84, 0x5a, 0xc8, 0x15, 0x8b, 0xe2, 0xb4, - 0x59, 0xba, 0xee, 0xdc, 0x58, 0xde, 0x7a, 0xb9, 0x6d, 0x16, 0x6e, 0x67, 0x0b, 0xb7, 0xbb, 0x7a, - 0x61, 0x3f, 0xc3, 0xa3, 0x77, 0xa1, 0x7e, 0x1c, 0xc5, 0xfc, 0x01, 0x9f, 0xa4, 0xcd, 0xf2, 0xe5, - 0x34, 0x39, 0x22, 0xfd, 0x00, 0xd6, 0xf8, 0x99, 0x92, 0xcc, 0xe7, 0x31, 0x53, 0x91, 0x48, 0xd2, - 0xa6, 0xab, 0xa5, 0x7b, 0x79, 0x4e, 0xba, 0x6c, 0xde, 0x9f, 0x43, 0xa7, 0xd7, 0x61, 0x59, 0xf4, - 0x3e, 0xe5, 0x81, 0x3a, 0x9c, 0x8c, 0x78, 0xda, 0xac, 0x5c, 0x2f, 0xdf, 0x68, 0xf8, 0x45, 0x10, - 0x7d, 0x07, 0x96, 0x03, 0x11, 0xc7, 0x3c, 0x30, 0xfc, 0xab, 0x97, 0x8b, 0x56, 0xc4, 0xf5, 0x7e, - 0xf6, 0x06, 0x54, 0xb4, 0x5e, 0xe8, 0x1a, 0x94, 0xa2, 0xb0, 0xe9, 0x5c, 0x77, 0x6e, 0x34, 0xfc, - 0x52, 0x14, 0xd2, 0xdb, 0x50, 0x3d, 0x8e, 0x78, 0x1c, 0x3e, 0x57, 0x3d, 0x16, 0x8d, 0xde, 0x83, - 0x15, 0xc9, 0x53, 0x25, 0x23, 0x2b, 0x86, 0xd1, 0xd0, 0xef, 0x5c, 0x74, 0x08, 0x6d, 0xbf, 0x80, - 0xe8, 0xcf, 0x90, 0xe1, 0x76, 0x83, 0x41, 0x14, 0x87, 0x92, 0x27, 0xfb, 0xa1, 0x51, 0x56, 0xc3, - 0x2f, 0x82, 0xe8, 0x0d, 0xb8, 0xd2, 0x63, 0xc1, 0x49, 0x5f, 0x8a, 0x71, 0x12, 0xee, 0x8a, 0x58, - 0xc8, 0x66, 0x45, 0x8b, 0x3d, 0x0f, 0xa6, 0x77, 0xa0, 0xc2, 0xe2, 0xa8, 0x9f, 0x68, 0x95, 0xac, - 0x6d, 0xb5, 0x2e, 0x94, 0x65, 0x1b, 0x31, 0x7c, 0x83, 0x48, 0xf7, 0x01, 0x52, 0xbc, 0x5d, 0xfa, - 0x92, 0x34, 0x97, 0xf5, 0x16, 0xbe, 0x79, 0x21, 0xd9, 0xae, 0x48, 0x14, 0x4f, 0x54, 0xbb, 0x9b, - 0xa3, 0xef, 0x2d, 0xf9, 0x05, 0x62, 0xfa, 0x1d, 0x70, 0x15, 0x3f, 0x53, 0xcd, 0xb5, 0x4b, 0xf4, - 0x90, 0x31, 0x39, 0xe4, 0x67, 0x6a, 0x6f, 0xc9, 0xd7, 0x04, 0x48, 0x88, 0xb7, 0xa7, 0x79, 0x65, - 0x01, 0xc2, 0xfb, 0x51, 0xcc, 0x91, 0x10, 0x09, 0xe8, 0x7b, 0x50, 0x8d, 0xd9, 0x44, 0x8c, 0x55, - 0x93, 0x68, 0xd2, 0xdf, 0xbd, 0x94, 0xf4, 0xa1, 0x46, 0xdd, 0x5b, 0xf2, 0x2d, 0x11, 0x7d, 0x0b, - 0xca, 0x61, 0x74, 0xda, 0x5c, 0xd7, 0xb4, 0xd7, 0x2f, 0xa5, 0xed, 0x44, 0xa7, 0x7b, 0x4b, 0x3e, - 0xa2, 0xd3, 0x5d, 0xa8, 0xf7, 0x84, 0x38, 0x19, 0x32, 0x79, 0xd2, 0xa4, 0x9a, 0xf4, 0xf7, 0x2e, - 0x25, 0xdd, 0xb1, 0xc8, 0x7b, 0x4b, 0x7e, 0x4e, 0x88, 0x5b, 0x8e, 0x02, 0x91, 0x34, 0xaf, 0x2e, - 0xb0, 0xe5, 0xfd, 0x40, 0x24, 0xb8, 0x65, 0x24, 0x40, 0xc2, 0x38, 0x4a, 0x4e, 0x9a, 0x1b, 0x0b, - 0x10, 0x3e, 0x8c, 0x12, 0x5c, 0x55, 0x13, 0xa0, 0xd8, 0x21, 0x53, 0xec, 0x34, 0xe2, 0x4f, 0x9b, - 0x2f, 0x2d, 0x20, 0x76, 0xc7, 0x22, 0xa3, 0xd8, 0x19, 0x21, 0x32, 0x91, 0xd6, 0x4e, 0x9b, 0x9b, - 0x0b, 0x30, 0xc9, 0x8c, 0x1a, 0x99, 0x64, 0x84, 0xf4, 0xcf, 0x60, 0xfd, 0x98, 0x33, 0x35, 0x96, - 0x3c, 0x9c, 0xfa, 0x88, 0x97, 0x35, 0xb7, 0xf6, 0xe5, 0x67, 0x3f, 0x4f, 0xb5, 0xb7, 0xe4, 0x9f, - 0x67, 0x45, 0xdf, 0x85, 0x4a, 0xcc, 0x14, 0x3f, 0x6b, 0x36, 0x35, 0x4f, 0xef, 0x39, 0x97, 0x42, - 0xf1, 0xb3, 0xbd, 0x25, 0xdf, 0x90, 0xd0, 0x3f, 0x86, 0x2b, 0x8a, 0xf5, 0x62, 0x7e, 0x70, 0x6c, - 0x11, 0xd2, 0xe6, 0xd7, 0x34, 0x97, 0x5b, 0x97, 0x5f, 0xe7, 0x59, 0x9a, 0xbd, 0x25, 0x7f, 0x9e, - 0x4d, 0xeb, 0x87, 0xb0, 0x52, 0x74, 0x02, 0x94, 0x82, 0x2b, 0x39, 0x33, 0x0e, 0xa8, 0xee, 0xeb, - 0x6f, 0x84, 0xf1, 0x30, 0x52, 0xda, 0x01, 0xd5, 0x7d, 0xfd, 0x4d, 0x37, 0xa1, 0x2a, 0xf9, 0x50, - 0x9c, 0x72, 0xed, 0x5f, 0xea, 0xbe, 0x1d, 0x21, 0x6e, 0x28, 0x59, 0xbf, 0xe9, 0x1a, 0x5c, 0xfc, - 0x46, 0xdc, 0x50, 0x8a, 0xd1, 0x41, 0xa2, 0xfd, 0x43, 0xdd, 0xb7, 0xa3, 0xd6, 0x97, 0xdf, 0x80, - 0x9a, 0x15, 0xa4, 0xf5, 0xe7, 0x50, 0x35, 0x86, 0x40, 0x3f, 0x80, 0x4a, 0xaa, 0x26, 0x31, 0xd7, - 0x22, 0xac, 0x6d, 0xfd, 0xfe, 0x02, 0xc6, 0xd3, 0xee, 0x22, 0x81, 0x6f, 0xe8, 0xbc, 0x37, 0xa1, - 0xa2, 0xc7, 0xb4, 0x06, 0x65, 0x5f, 0x3c, 0x25, 0x4b, 0x14, 0xa0, 0xba, 0x2b, 0xe2, 0xf1, 0x30, - 0x21, 0x0e, 0x02, 0x3b, 0xd1, 0x29, 0x29, 0x21, 0x70, 0x8f, 0xb3, 0x90, 0x4b, 0x52, 0x6e, 0xfd, - 0xb7, 0x03, 0x2e, 0x5e, 0x4b, 0xfa, 0x1a, 0xac, 0x2a, 0x26, 0xfb, 0xdc, 0x84, 0xb5, 0xfd, 0xcc, - 0x11, 0xcf, 0x02, 0xe9, 0x7b, 0x99, 0x88, 0x25, 0x2d, 0xe2, 0x37, 0x9f, 0x7b, 0xdd, 0x67, 0x04, - 0x2c, 0xb8, 0xf4, 0xf2, 0x42, 0x2e, 0xdd, 0xfb, 0xc3, 0x6c, 0x47, 0x75, 0x70, 0x1f, 0xb3, 0x3e, - 0x27, 0x4b, 0x74, 0x05, 0xea, 0x99, 0x29, 0x10, 0x87, 0xae, 0x42, 0xa3, 0xc3, 0xd2, 0x41, 0x4f, - 0x30, 0x19, 0x92, 0x12, 0x5d, 0x86, 0xda, 0xb6, 0x0c, 0x06, 0xd1, 0x29, 0x27, 0xe5, 0xd6, 0x27, - 0x7a, 0xc3, 0xf4, 0x8f, 0x66, 0xd5, 0xfa, 0xfa, 0xf3, 0xfc, 0xca, 0xac, 0x4e, 0x5f, 0x29, 0x48, - 0xf0, 0x30, 0x4a, 0x50, 0x82, 0x3a, 0xb8, 0x1d, 0xa1, 0x52, 0xe2, 0xb4, 0xfe, 0xd3, 0x81, 0x7a, - 0xe6, 0x4e, 0x28, 0x81, 0xf2, 0x58, 0xc6, 0x56, 0x6f, 0xf8, 0x49, 0x37, 0xa0, 0xa2, 0x22, 0x65, - 0xb5, 0xd5, 0xf0, 0xcd, 0x00, 0xe3, 0x4b, 0xc8, 0xd3, 0x40, 0x46, 0x23, 0x6d, 0xb6, 0x65, 0x3d, - 0x57, 0x04, 0xd1, 0x57, 0xa1, 0x11, 0x0d, 0x59, 0x9f, 0xef, 0xb1, 0x74, 0xa0, 0xef, 0x53, 0xc3, - 0x9f, 0x02, 0x90, 0xfe, 0x98, 0x9d, 0xa2, 0xf3, 0xd1, 0xf3, 0x26, 0xf2, 0x14, 0x41, 0xf4, 0x2e, - 0xb8, 0xb8, 0x41, 0x1b, 0x74, 0xbe, 0x31, 0xb7, 0x61, 0x3c, 0x96, 0xc7, 0x92, 0xa3, 0x02, 0xdb, - 0x18, 0xbe, 0x7d, 0x8d, 0xdc, 0x6a, 0x81, 0x8b, 0x8e, 0x0d, 0xef, 0x71, 0xc2, 0x86, 0xdc, 0xee, - 0x43, 0x7f, 0xb7, 0xae, 0xc2, 0xfa, 0x39, 0x5b, 0x6f, 0xfd, 0x6b, 0x15, 0x5c, 0x0c, 0x1b, 0x48, - 0xa1, 0xe3, 0x8c, 0xa5, 0xd0, 0x21, 0xe4, 0x85, 0x2e, 0x0a, 0x72, 0x99, 0xbd, 0x28, 0xef, 0x41, - 0x05, 0x75, 0x9a, 0xdd, 0x93, 0x05, 0xc8, 0x1f, 0x21, 0xba, 0x6f, 0xa8, 0x68, 0x13, 0x6a, 0xc1, - 0x80, 0x07, 0x27, 0x3c, 0xb4, 0xe6, 0x98, 0x0d, 0xf1, 0x48, 0x82, 0x42, 0xc0, 0x36, 0x03, 0xad, - 0xf0, 0x40, 0x24, 0xf7, 0x86, 0xe2, 0xd3, 0x48, 0x6b, 0x0d, 0x15, 0x9e, 0x01, 0xb2, 0xd9, 0x7d, - 0x3c, 0x81, 0x66, 0x6d, 0x3a, 0xab, 0x01, 0xad, 0x7b, 0x50, 0xd1, 0x6b, 0xe3, 0x3d, 0x33, 0x32, - 0x9b, 0xe4, 0xef, 0xf5, 0xc5, 0x64, 0xb6, 0x22, 0xb7, 0x7e, 0x55, 0x02, 0x17, 0xc7, 0xf4, 0x26, - 0x54, 0x24, 0x4b, 0xfa, 0xe6, 0x00, 0xce, 0xe7, 0x90, 0x3e, 0xce, 0xf9, 0x06, 0x85, 0x7e, 0x60, - 0x0f, 0xda, 0x28, 0xf9, 0x8d, 0xc5, 0x56, 0x2c, 0x1c, 0x3a, 0xaa, 0x63, 0xc4, 0x24, 0x1b, 0xda, - 0x5b, 0x68, 0x06, 0xde, 0x2f, 0x1d, 0x70, 0x11, 0x89, 0xae, 0xc3, 0x6a, 0x57, 0xc9, 0xe8, 0x84, - 0xab, 0x81, 0x14, 0xe3, 0xfe, 0xc0, 0x98, 0xdf, 0x03, 0x3e, 0x31, 0xf6, 0xe6, 0xa0, 0x2b, 0xd9, - 0x57, 0x2c, 0x8e, 0x02, 0x52, 0x42, 0xb3, 0xd8, 0x11, 0x71, 0x48, 0xca, 0xf4, 0x0a, 0x2c, 0x3f, - 0x49, 0x42, 0x2e, 0xd3, 0x40, 0x48, 0x1e, 0x12, 0xd7, 0xda, 0xce, 0x09, 0xa9, 0xa0, 0xbd, 0xa2, - 0x20, 0x3a, 0x3b, 0x22, 0x55, 0x7a, 0x15, 0xae, 0xec, 0xcc, 0xa6, 0x4c, 0xa4, 0x86, 0x46, 0xfc, - 0x88, 0x27, 0x78, 0xc9, 0x48, 0x9d, 0x36, 0xa0, 0xa2, 0x4f, 0x81, 0x34, 0x70, 0xb1, 0x03, 0x9d, - 0x74, 0x12, 0xf0, 0xfe, 0xcd, 0xc9, 0xec, 0x72, 0x15, 0x1a, 0x8f, 0x99, 0x64, 0x7d, 0xc9, 0x46, - 0x28, 0xdf, 0x32, 0xd4, 0x8c, 0x73, 0x7b, 0x93, 0x38, 0xd3, 0xc1, 0x96, 0xf1, 0x0d, 0x66, 0x70, - 0x97, 0x94, 0xa7, 0x83, 0xb7, 0x88, 0x8b, 0x6b, 0x7c, 0x3c, 0x16, 0x8a, 0x93, 0x0a, 0x4a, 0xba, - 0x2b, 0x42, 0x4e, 0xaa, 0x08, 0x3c, 0x44, 0x7b, 0x25, 0x35, 0xdc, 0xf3, 0x2e, 0xde, 0x9f, 0x9e, - 0x38, 0x23, 0x75, 0x14, 0x03, 0xd5, 0xc8, 0x43, 0xd2, 0xc0, 0x99, 0x8f, 0xc6, 0xc3, 0x1e, 0xc7, - 0x6d, 0x02, 0xce, 0x1c, 0x8a, 0x7e, 0x3f, 0xe6, 0x64, 0x19, 0x75, 0xd0, 0x99, 0x9a, 0x34, 0x59, - 0xc1, 0x15, 0x77, 0x59, 0x1c, 0x8b, 0xb1, 0x22, 0xab, 0xad, 0xcf, 0xca, 0xe0, 0x62, 0xe6, 0x84, - 0xb6, 0x33, 0x40, 0x2b, 0xb6, 0xb6, 0x83, 0xdf, 0xb9, 0x05, 0x96, 0xa6, 0x16, 0x48, 0xdf, 0xb5, - 0x27, 0x5d, 0x5e, 0xc0, 0x87, 0x21, 0xe3, 0xe2, 0x21, 0x53, 0x70, 0x87, 0xd1, 0x90, 0x5b, 0x4f, - 0xa2, 0xbf, 0x11, 0x96, 0x46, 0x3f, 0xe4, 0xda, 0x0c, 0xca, 0xbe, 0xfe, 0x46, 0xab, 0x61, 0x61, - 0xc8, 0xc3, 0x6d, 0xa5, 0x6d, 0xa0, 0xec, 0x67, 0x43, 0x63, 0xcd, 0x4c, 0x99, 0xdb, 0xff, 0x3c, - 0x6b, 0xd6, 0xcb, 0x77, 0x11, 0xdd, 0x37, 0x54, 0x53, 0x67, 0x50, 0x5f, 0x9c, 0xbc, 0xe0, 0x82, - 0x3b, 0xf6, 0x36, 0xd6, 0xc1, 0xfd, 0x48, 0x64, 0x1e, 0x18, 0xd1, 0x88, 0x83, 0xa7, 0xa4, 0xcd, - 0x90, 0x94, 0xf0, 0xf3, 0x28, 0x0a, 0xb9, 0x20, 0x65, 0xfc, 0xdc, 0x1e, 0x87, 0x91, 0x20, 0x2e, - 0x46, 0xbd, 0xc7, 0x9d, 0xfb, 0xa4, 0xe2, 0xbd, 0x5e, 0x70, 0xe4, 0xdb, 0x63, 0x25, 0x0c, 0x1b, - 0x7d, 0x2d, 0x1d, 0x73, 0xcb, 0x7a, 0x3c, 0x24, 0x25, 0xef, 0xdb, 0x88, 0x87, 0x52, 0x6b, 0xd8, - 0x48, 0x4d, 0xc8, 0x12, 0xde, 0xb1, 0x27, 0xa3, 0x58, 0xb0, 0x30, 0x4a, 0xfa, 0xc4, 0x31, 0x01, - 0x20, 0xb1, 0x6b, 0xde, 0x93, 0x52, 0x60, 0x24, 0x5d, 0x01, 0x98, 0x66, 0xe2, 0xad, 0x5f, 0x5f, - 0x99, 0x86, 0x29, 0x4c, 0x03, 0x52, 0x31, 0x96, 0x01, 0xd7, 0xae, 0xa1, 0xe1, 0xdb, 0x11, 0xfd, - 0x10, 0x2a, 0x38, 0x8f, 0x05, 0x0e, 0x7a, 0x8c, 0x9b, 0x0b, 0xe5, 0x7f, 0xed, 0xa3, 0x88, 0x3f, - 0xf5, 0x0d, 0x21, 0x7d, 0x1b, 0x1a, 0x72, 0xd1, 0xb2, 0x6e, 0x8a, 0x49, 0xaf, 0x01, 0xb0, 0x40, - 0x45, 0xa7, 0x1c, 0x79, 0x59, 0xdb, 0x2f, 0x40, 0xe8, 0x36, 0xac, 0x66, 0xc8, 0xa8, 0x20, 0x53, - 0xf3, 0x2d, 0x6f, 0xbd, 0xf2, 0x0c, 0xd6, 0x88, 0xe3, 0xcf, 0x52, 0xb4, 0x7e, 0xe3, 0x82, 0xab, - 0x79, 0xcd, 0x97, 0x75, 0xbb, 0x33, 0x3e, 0xeb, 0xf6, 0xe2, 0x7b, 0x9e, 0xbb, 0xd2, 0xda, 0x44, - 0xca, 0x05, 0x13, 0xf9, 0x10, 0x2a, 0xa9, 0x90, 0x2a, 0xd3, 0xc3, 0x82, 0xda, 0xec, 0x0a, 0xa9, - 0x7c, 0x43, 0x48, 0xef, 0x43, 0xed, 0x38, 0x8a, 0x15, 0x97, 0xd9, 0x86, 0x6f, 0x2d, 0xc6, 0xe3, - 0xbe, 0x26, 0xf2, 0x33, 0x62, 0xfa, 0xb0, 0x78, 0x2a, 0x55, 0xcd, 0xa9, 0xbd, 0x18, 0xa7, 0x8b, - 0x0e, 0xeb, 0x26, 0x90, 0x40, 0x9c, 0x72, 0x99, 0xcd, 0x3d, 0xe0, 0x13, 0x1b, 0x85, 0xce, 0xc1, - 0x69, 0x0b, 0xea, 0x83, 0x28, 0xe4, 0x18, 0xc8, 0xb5, 0xb1, 0xd5, 0xfd, 0x7c, 0x4c, 0x1f, 0x40, - 0x3d, 0x60, 0x32, 0xec, 0xa2, 0xd9, 0x37, 0x5e, 0x58, 0xf9, 0x48, 0xe6, 0xe7, 0x0c, 0x70, 0x21, - 0xbd, 0xf8, 0xfd, 0x48, 0x35, 0xc1, 0x2c, 0x94, 0x8d, 0xbd, 0xb7, 0xac, 0xbd, 0xa2, 0x07, 0xc5, - 0xa4, 0x3b, 0xb3, 0xb4, 0x54, 0x19, 0x97, 0xfc, 0x5d, 0x16, 0xc7, 0x5c, 0x4e, 0x4c, 0x26, 0xfa, - 0x80, 0x25, 0x3d, 0x96, 0x90, 0xb2, 0x77, 0x03, 0x5c, 0xcd, 0xb9, 0x01, 0x95, 0xee, 0x90, 0xc5, - 0xb1, 0xc9, 0x5e, 0x1f, 0xf1, 0x30, 0x1a, 0x0f, 0x8d, 0x85, 0x3e, 0xc4, 0x54, 0x94, 0x94, 0x5a, - 0xff, 0x52, 0x86, 0x7a, 0xb6, 0x69, 0xcc, 0xba, 0x4e, 0xf8, 0x24, 0xcb, 0xba, 0x4e, 0xf8, 0x44, - 0x87, 0xeb, 0xf4, 0x28, 0x4a, 0xa3, 0x9e, 0x4d, 0x3f, 0xea, 0xfe, 0x14, 0x80, 0x11, 0xef, 0x69, - 0x14, 0xaa, 0x81, 0xbe, 0x3a, 0x15, 0xdf, 0x0c, 0xb0, 0xa2, 0x0f, 0x99, 0xe2, 0xfb, 0x49, 0x10, - 0x8f, 0x43, 0x7e, 0x88, 0xde, 0xd2, 0x64, 0xec, 0xf3, 0x60, 0xfa, 0x27, 0x00, 0x2a, 0x1a, 0xf2, - 0xfb, 0x42, 0x0e, 0x99, 0xb2, 0x19, 0xd6, 0x3b, 0x2f, 0x76, 0xb8, 0xed, 0xc3, 0x9c, 0x81, 0x5f, - 0x60, 0x86, 0xac, 0x71, 0x35, 0xcb, 0xba, 0xf6, 0x95, 0x58, 0x77, 0x72, 0x06, 0x7e, 0x81, 0x99, - 0xf7, 0xa7, 0x00, 0xd3, 0x19, 0xba, 0x09, 0xf4, 0x91, 0x48, 0xd4, 0x60, 0xbb, 0xd7, 0x93, 0x3b, - 0xfc, 0x58, 0x48, 0xde, 0x61, 0xe8, 0xe6, 0x5e, 0x82, 0xf5, 0x1c, 0xbe, 0x7d, 0xac, 0xb8, 0x44, - 0xb0, 0x56, 0x7d, 0x77, 0x20, 0xa4, 0x32, 0x31, 0x54, 0x7f, 0x3e, 0xe9, 0x92, 0x32, 0xba, 0xd6, - 0xfd, 0xee, 0x01, 0x71, 0xbd, 0x1b, 0x00, 0xd3, 0x2d, 0x61, 0x4c, 0x34, 0x5f, 0x6f, 0x6e, 0x99, - 0x7c, 0xc1, 0x8c, 0xb6, 0xde, 0x22, 0x4e, 0xeb, 0xaf, 0x1c, 0x70, 0xd1, 0xe2, 0x30, 0x89, 0x2d, - 0xde, 0x67, 0x73, 0x7c, 0x45, 0xd0, 0x57, 0xf3, 0x13, 0xc8, 0xbb, 0xe0, 0x27, 0xbc, 0xaf, 0xd9, - 0xab, 0x58, 0x83, 0xf2, 0x76, 0x1a, 0xd8, 0xdc, 0x9d, 0xa7, 0x01, 0x71, 0x5a, 0x7f, 0xeb, 0x42, - 0xd5, 0x18, 0x2e, 0xfd, 0x18, 0xea, 0x62, 0xc4, 0x25, 0x53, 0x42, 0xda, 0x22, 0xe1, 0xed, 0x17, - 0x31, 0xfc, 0xf6, 0x81, 0x25, 0xf6, 0x73, 0x36, 0xf3, 0xfb, 0x2b, 0x9d, 0xdf, 0xdf, 0x4d, 0x20, - 0x99, 0x8d, 0x3f, 0x96, 0x48, 0xa7, 0x26, 0x36, 0x29, 0x3d, 0x07, 0xa7, 0x87, 0xd0, 0x08, 0x44, - 0x12, 0x46, 0x79, 0xc1, 0xb0, 0xb6, 0xf5, 0xed, 0x17, 0x92, 0x70, 0x37, 0xa3, 0xf6, 0xa7, 0x8c, - 0xe8, 0x2d, 0xa8, 0x9c, 0xb2, 0x78, 0x6c, 0x12, 0x83, 0xe5, 0xad, 0xcd, 0x73, 0xc5, 0xd8, 0x11, - 0xce, 0xfa, 0x06, 0xc9, 0x7b, 0x05, 0xea, 0xd9, 0x3e, 0xb5, 0x3a, 0x93, 0x90, 0x2c, 0xd1, 0x2a, - 0x94, 0x0e, 0x24, 0x71, 0xbc, 0x7f, 0x77, 0xa0, 0x91, 0xaf, 0x51, 0x08, 0xd4, 0x18, 0x1f, 0x7f, - 0x30, 0x66, 0x31, 0x71, 0x74, 0xaa, 0x24, 0x94, 0x19, 0xe9, 0x8b, 0xf4, 0x5d, 0xc9, 0x99, 0xc2, - 0x22, 0x54, 0x7b, 0x07, 0x9e, 0xa6, 0xc4, 0xa5, 0x14, 0xd6, 0x2c, 0xf8, 0x40, 0x1a, 0xd4, 0x0a, - 0x66, 0x52, 0x38, 0x9b, 0x01, 0xaa, 0xc6, 0x99, 0x9c, 0x70, 0x93, 0x29, 0x7e, 0x24, 0x94, 0x1e, - 0xd4, 0x51, 0x96, 0xfd, 0x84, 0x34, 0x70, 0xcd, 0x8f, 0x84, 0xda, 0x4f, 0x08, 0x4c, 0x43, 0xf8, - 0x72, 0xb6, 0xbc, 0x1e, 0xad, 0xe8, 0x04, 0x21, 0x8e, 0xf7, 0x13, 0xb2, 0x6a, 0x27, 0xcc, 0x68, - 0xad, 0xf5, 0xea, 0x65, 0xae, 0xa5, 0xf5, 0x0a, 0x3a, 0x21, 0xc5, 0xcf, 0x2e, 0x2a, 0x79, 0x5a, - 0xeb, 0x70, 0x65, 0xae, 0xed, 0xe0, 0x1d, 0x43, 0xfd, 0xb1, 0x48, 0xe7, 0x95, 0x52, 0x83, 0xf2, - 0xa1, 0x18, 0x99, 0xec, 0x79, 0x47, 0x28, 0x25, 0x86, 0x26, 0x7b, 0x7e, 0xc8, 0x8f, 0x95, 0x49, - 0x5e, 0xfc, 0xa8, 0x3f, 0x50, 0x26, 0x31, 0xdd, 0x4f, 0x12, 0x2e, 0x49, 0x05, 0xb7, 0xea, 0xf3, - 0x51, 0xcc, 0x02, 0xcc, 0x4d, 0xd7, 0x00, 0x34, 0xfc, 0x7e, 0x24, 0x53, 0x45, 0x6a, 0xde, 0x77, - 0x70, 0x3b, 0x51, 0x3f, 0xc1, 0x44, 0x45, 0x7f, 0x68, 0x56, 0x4b, 0xa8, 0x3a, 0x3d, 0xdc, 0xe5, - 0x09, 0x6a, 0xda, 0x41, 0x42, 0xd3, 0x6d, 0xd4, 0x0b, 0x94, 0x76, 0x1a, 0x50, 0x0b, 0x8c, 0xb0, - 0xde, 0x63, 0x58, 0xd5, 0x77, 0xe8, 0x11, 0x57, 0xec, 0x20, 0x89, 0x27, 0xff, 0xef, 0x7e, 0xac, - 0xf7, 0x06, 0x54, 0x74, 0xb5, 0x82, 0xda, 0x3a, 0x96, 0x62, 0xa8, 0x79, 0x55, 0x7c, 0xfd, 0x8d, - 0xdc, 0x95, 0xd0, 0x9c, 0x2a, 0x7e, 0x49, 0x09, 0xef, 0x9f, 0xcb, 0x50, 0xdb, 0x0e, 0x02, 0x31, - 0x4e, 0xd4, 0xb9, 0x95, 0x2f, 0x4a, 0x88, 0xdf, 0x86, 0x2a, 0x3b, 0x65, 0x8a, 0x49, 0x5b, 0x22, - 0x7e, 0x7d, 0xce, 0x1e, 0x2c, 0xaf, 0xf6, 0xb6, 0x46, 0xf2, 0x2d, 0x72, 0x8b, 0x43, 0xd5, 0x40, - 0xe8, 0x3b, 0x50, 0xd1, 0x35, 0xb5, 0xad, 0xb3, 0x16, 0xea, 0x72, 0x1a, 0x0a, 0xba, 0x99, 0x15, - 0x91, 0x5a, 0x20, 0x84, 0xeb, 0xe1, 0x4e, 0x3d, 0x93, 0xa9, 0xf5, 0xa5, 0x03, 0xd5, 0x5d, 0x91, - 0x1c, 0x47, 0x7d, 0xfa, 0x3a, 0xac, 0xf1, 0x04, 0xef, 0x45, 0x66, 0x93, 0xb6, 0xc3, 0x34, 0x07, - 0x45, 0x8f, 0x61, 0x21, 0xbc, 0x37, 0xee, 0xdb, 0xc0, 0x55, 0x04, 0xd1, 0xf7, 0xa1, 0x65, 0x86, - 0x3e, 0x8f, 0x39, 0x4b, 0xf9, 0xee, 0x80, 0x25, 0x09, 0x8f, 0xbb, 0x4f, 0x23, 0x15, 0x0c, 0x6c, - 0x37, 0xea, 0x12, 0x0c, 0xea, 0xc1, 0x8a, 0x99, 0xed, 0x8e, 0x58, 0xc0, 0x53, 0x5b, 0x1a, 0xcf, - 0xc0, 0xe8, 0xb7, 0xa0, 0xa2, 0xbb, 0xff, 0xcd, 0xf0, 0xf2, 0x33, 0x36, 0x58, 0xde, 0xff, 0x3a, - 0xb0, 0x5c, 0xe8, 0x27, 0xfc, 0x16, 0x7b, 0x20, 0x2d, 0xa8, 0x6b, 0x65, 0x3f, 0x91, 0xb1, 0x2d, - 0x5c, 0xf2, 0x31, 0xa6, 0xaf, 0xb6, 0xdd, 0x81, 0xb3, 0xc6, 0x69, 0x16, 0x20, 0x5f, 0xa9, 0xff, - 0xe1, 0x6d, 0xd9, 0x50, 0xb1, 0x0c, 0xb5, 0x27, 0xc9, 0x49, 0x22, 0x9e, 0x26, 0x26, 0x5c, 0xe8, - 0xb6, 0xd3, 0x4c, 0xa1, 0x51, 0x37, 0x7d, 0x0f, 0x52, 0xf6, 0x7e, 0xe2, 0xce, 0x35, 0x11, 0xef, - 0x41, 0xd5, 0xbc, 0x8b, 0xe8, 0x4c, 0x7f, 0x6d, 0xeb, 0x5b, 0xe7, 0x32, 0xe6, 0x29, 0x72, 0xdb, - 0x14, 0xb3, 0x05, 0x90, 0x6f, 0x89, 0xe9, 0xc3, 0x42, 0x6f, 0xd8, 0xd4, 0x06, 0x77, 0x2e, 0x63, - 0x94, 0xdd, 0xa1, 0x99, 0x47, 0x8d, 0x9c, 0x43, 0xeb, 0xa7, 0x0e, 0x6c, 0x5c, 0x84, 0x82, 0x05, - 0x5f, 0x6f, 0xa6, 0xdb, 0x97, 0x0d, 0x69, 0x77, 0xee, 0x29, 0xa5, 0xa4, 0x77, 0x73, 0xfb, 0x05, - 0x85, 0x98, 0x7d, 0x58, 0xf1, 0x7e, 0xec, 0xc0, 0xfa, 0xb9, 0x3d, 0x17, 0xfc, 0x22, 0x40, 0xb5, - 0xc3, 0x63, 0xae, 0xb8, 0xe9, 0xeb, 0xe5, 0x9d, 0x26, 0x93, 0x28, 0x6a, 0x83, 0x4c, 0x4d, 0xe9, - 0xde, 0x31, 0xef, 0x61, 0xc4, 0x45, 0x87, 0x86, 0xa7, 0x86, 0x17, 0xbd, 0x8f, 0xf5, 0x3b, 0x81, - 0x15, 0xd3, 0x19, 0xb5, 0x90, 0x2a, 0xfa, 0xf7, 0x43, 0x3e, 0x1c, 0xc5, 0x4c, 0x71, 0x52, 0xf3, - 0x7c, 0xb8, 0x7a, 0x81, 0xa0, 0x7a, 0xe9, 0x23, 0x2b, 0xc6, 0x1a, 0x40, 0xe7, 0x28, 0x5b, 0x9c, - 0x38, 0x18, 0x93, 0x3a, 0x47, 0xbb, 0x3a, 0x2a, 0xd9, 0xf6, 0x83, 0x0e, 0x5f, 0x9d, 0x23, 0xcc, - 0x8b, 0x53, 0x52, 0xf6, 0x3e, 0x80, 0x97, 0x0e, 0x07, 0x92, 0xb3, 0xb0, 0xc3, 0xf9, 0x28, 0xc6, - 0xdb, 0xc5, 0x26, 0x58, 0x2c, 0x5e, 0x90, 0x9b, 0x6e, 0x40, 0x85, 0x85, 0xa1, 0x34, 0x0a, 0x6d, - 0xf8, 0x66, 0xe0, 0x7d, 0x02, 0x9b, 0x86, 0x81, 0x59, 0xe5, 0xe3, 0x31, 0x1f, 0xf3, 0x7b, 0x89, - 0x92, 0x13, 0x93, 0xfb, 0x67, 0x8f, 0x65, 0x06, 0xc7, 0xb2, 0x3b, 0x07, 0x47, 0x8b, 0x51, 0xfa, - 0x6b, 0x3f, 0xb4, 0xc6, 0x96, 0x8f, 0xbd, 0x9f, 0xbb, 0x00, 0x07, 0xf9, 0x83, 0xdd, 0x05, 0x66, - 0x7a, 0xb1, 0x8b, 0x2d, 0x94, 0x31, 0xe5, 0x85, 0x8b, 0xcb, 0x3f, 0xc8, 0x1f, 0x81, 0x5c, 0x6d, - 0x7f, 0xf3, 0x0f, 0x39, 0x53, 0x39, 0x6c, 0x13, 0x3b, 0x7f, 0xff, 0x99, 0x69, 0xc3, 0x55, 0xe6, - 0xdb, 0x70, 0x73, 0x3e, 0xa3, 0x7a, 0xde, 0x67, 0x6c, 0x42, 0x75, 0x10, 0x85, 0x21, 0x4f, 0x74, - 0xf2, 0x5c, 0xf7, 0xed, 0x08, 0x35, 0x83, 0x7a, 0x10, 0x49, 0x3c, 0xc9, 0x8a, 0x95, 0x6c, 0x4c, - 0xef, 0x42, 0x45, 0xe9, 0x67, 0xcd, 0xba, 0xbe, 0xe2, 0xf3, 0x61, 0x64, 0xfa, 0xd2, 0xab, 0x5d, - 0x85, 0xc1, 0x45, 0x07, 0x14, 0xa5, 0xb6, 0xd1, 0x1c, 0xea, 0x62, 0xaa, 0xee, 0x17, 0x20, 0xde, - 0x3f, 0x38, 0x79, 0x53, 0xbf, 0x01, 0x95, 0x1e, 0x4b, 0xa3, 0xc0, 0xb4, 0xa6, 0x46, 0x52, 0x1c, - 0x9b, 0xc6, 0x45, 0x1d, 0x5c, 0x25, 0x42, 0x41, 0x4a, 0x98, 0x0e, 0xa4, 0x1c, 0x03, 0xff, 0x1a, - 0xc0, 0xf4, 0x51, 0x95, 0xb8, 0x78, 0x73, 0x33, 0xad, 0x9a, 0xce, 0x94, 0x26, 0xad, 0xa2, 0x6d, - 0x84, 0x79, 0xcf, 0xbb, 0x86, 0x2b, 0x68, 0xcf, 0x48, 0xea, 0x88, 0x93, 0x08, 0xc5, 0x4d, 0x12, - 0x94, 0xa2, 0x47, 0x27, 0x80, 0x6c, 0xd0, 0x15, 0xf4, 0x58, 0xca, 0xc9, 0x86, 0xf7, 0x77, 0x53, - 0xd1, 0xee, 0xe4, 0x61, 0x76, 0x91, 0x43, 0x7a, 0x56, 0x20, 0xbe, 0x07, 0xeb, 0x92, 0xff, 0x60, - 0x1c, 0xcd, 0xbc, 0x1e, 0x3d, 0xe7, 0xb6, 0x9c, 0xa7, 0xf0, 0x4e, 0x61, 0x3d, 0x1b, 0x7c, 0x2f, - 0x52, 0x03, 0x9d, 0x7a, 0xd2, 0xbb, 0x85, 0xe7, 0x2d, 0xc7, 0x06, 0xa4, 0x67, 0xb0, 0x9c, 0x3e, - 0x67, 0xe5, 0x69, 0x6d, 0x69, 0x91, 0xb4, 0xf6, 0xef, 0x6b, 0x97, 0x16, 0x93, 0x6f, 0x43, 0xf5, - 0xd8, 0xd4, 0x63, 0xa6, 0x0e, 0xf9, 0xfa, 0x33, 0xd6, 0xb7, 0x35, 0x97, 0x45, 0xbe, 0xb0, 0x3f, - 0xf1, 0x2e, 0xac, 0x84, 0xfc, 0x98, 0x8d, 0x63, 0x75, 0xb4, 0x40, 0xd6, 0x3d, 0x83, 0x4b, 0x77, - 0x74, 0x69, 0xc8, 0xba, 0xa6, 0x8b, 0x54, 0xd1, 0xa2, 0x78, 0xcf, 0x10, 0x45, 0x7b, 0x62, 0x83, - 0xe9, 0x17, 0xa8, 0x0a, 0xd6, 0x51, 0xbd, 0xc8, 0x3a, 0x30, 0xe7, 0xb3, 0x76, 0x93, 0x8f, 0x4d, - 0x91, 0x62, 0xbe, 0x33, 0xf6, 0xfa, 0x55, 0xb8, 0xee, 0x9f, 0x83, 0xa3, 0x6f, 0x1b, 0x8e, 0x63, - 0x15, 0xd9, 0xc6, 0x83, 0x19, 0xcc, 0xff, 0x3c, 0xd0, 0x38, 0xff, 0xf3, 0xc0, 0xfb, 0x00, 0x29, - 0x47, 0x57, 0xd6, 0x89, 0x02, 0xd5, 0x5c, 0xd1, 0x37, 0xe7, 0xda, 0xb3, 0xf6, 0x76, 0xa0, 0x2d, - 0xdd, 0x2f, 0x50, 0xa0, 0xfc, 0x43, 0x76, 0xb6, 0x8b, 0xd9, 0x5e, 0x73, 0x55, 0xe7, 0x93, 0xf9, - 0x78, 0xde, 0x67, 0xac, 0x9d, 0xf7, 0x19, 0x77, 0xa1, 0x92, 0x06, 0x62, 0xc4, 0xf5, 0x03, 0xee, - 0xb3, 0xcf, 0xb7, 0xdd, 0x45, 0x24, 0xdf, 0xe0, 0xea, 0xf7, 0x05, 0x74, 0xd5, 0x42, 0xea, 0xa7, - 0xdb, 0x86, 0x9f, 0x0d, 0x5b, 0xbf, 0x72, 0xa0, 0x6a, 0x64, 0xbc, 0x28, 0x8b, 0xd5, 0x35, 0x43, - 0xa9, 0xf0, 0x4c, 0x92, 0x3f, 0x47, 0x94, 0x8b, 0xcf, 0x11, 0xef, 0x66, 0x32, 0x19, 0x07, 0xfa, - 0xda, 0xe5, 0xca, 0x98, 0x11, 0xcd, 0xbb, 0x05, 0x15, 0x3d, 0x46, 0x0f, 0x10, 0x8b, 0x80, 0xc5, - 0xa6, 0x06, 0x97, 0xd3, 0x78, 0x06, 0xd9, 0x95, 0x26, 0x25, 0xef, 0xfb, 0x19, 0x36, 0x64, 0x89, - 0x8b, 0x49, 0x7a, 0x70, 0x35, 0xe2, 0xd0, 0x0d, 0x20, 0x29, 0x57, 0x07, 0xc7, 0x87, 0x03, 0xde, - 0x65, 0x43, 0xae, 0xfd, 0x52, 0x89, 0x36, 0x61, 0xc3, 0xe0, 0xa6, 0xb3, 0x33, 0x3a, 0x34, 0xc7, - 0x51, 0x4f, 0x32, 0x39, 0x21, 0xae, 0xf7, 0xbe, 0xee, 0x39, 0x64, 0xb7, 0x6f, 0x39, 0xff, 0xdb, - 0xc5, 0x78, 0xc2, 0x90, 0x4b, 0x74, 0x95, 0xa6, 0x23, 0xc4, 0x4c, 0xb2, 0x6e, 0x1a, 0xaa, 0x46, - 0xea, 0xb2, 0x77, 0x07, 0x73, 0xab, 0x69, 0x4b, 0xf1, 0x9c, 0x3e, 0xad, 0xb1, 0x96, 0x72, 0x63, - 0xf5, 0x76, 0x0a, 0x49, 0xc3, 0x6c, 0xf4, 0x72, 0x16, 0x8d, 0x5e, 0xde, 0x03, 0xb8, 0x92, 0x81, - 0x8d, 0x7a, 0x31, 0xa0, 0xd5, 0xc4, 0xa8, 0xc8, 0xe7, 0x79, 0xb7, 0x33, 0x43, 0xbf, 0xf9, 0x4f, - 0x65, 0x58, 0x9b, 0x8d, 0x20, 0xba, 0x02, 0x33, 0xbb, 0x3d, 0x88, 0x43, 0x53, 0xa2, 0xed, 0xa0, - 0x29, 0x05, 0x72, 0x3c, 0xec, 0xa5, 0x26, 0x30, 0xe8, 0x94, 0x93, 0xe0, 0xd4, 0x63, 0x13, 0x2f, - 0x34, 0x60, 0x1d, 0xa7, 0xf6, 0xc4, 0x90, 0x93, 0xeb, 0xc5, 0x77, 0xce, 0x3b, 0xd9, 0x8b, 0xa8, - 0x76, 0xf0, 0x1f, 0x62, 0x38, 0xe9, 0x72, 0x45, 0xb6, 0x31, 0x15, 0xea, 0x1e, 0x4e, 0xfd, 0x38, - 0xf9, 0x84, 0x36, 0x6c, 0xdb, 0xfc, 0x47, 0x25, 0xba, 0x5a, 0xc8, 0x8a, 0x7e, 0x59, 0xa2, 0x1b, - 0x70, 0x65, 0x67, 0x9c, 0x84, 0x31, 0x0f, 0x73, 0xe8, 0x3f, 0x6a, 0xa8, 0x7e, 0xe9, 0x50, 0xba, - 0xee, 0xd4, 0x4c, 0x7e, 0x81, 0xc7, 0x7f, 0xb5, 0x00, 0xcd, 0x13, 0xa5, 0xbf, 0x9e, 0x9f, 0xc9, - 0x39, 0xfd, 0x4d, 0x91, 0x7f, 0x8e, 0xff, 0x23, 0x17, 0xa1, 0xfb, 0x49, 0xc8, 0xcf, 0x0a, 0xd0, - 0x1f, 0xbb, 0x74, 0x13, 0xd6, 0x2d, 0x6e, 0x41, 0xf8, 0xbf, 0x70, 0xe9, 0x55, 0x58, 0xdb, 0x36, - 0x6a, 0xb7, 0x5a, 0x21, 0x3f, 0xc1, 0x0a, 0xd9, 0xed, 0xe0, 0x1a, 0x7f, 0xe9, 0xd2, 0x75, 0x58, - 0xf9, 0x9e, 0x90, 0x27, 0x3a, 0xec, 0xa1, 0x6e, 0x7f, 0x8a, 0xd9, 0x61, 0x23, 0x07, 0x91, 0x9f, - 0xb9, 0xf4, 0x65, 0xa0, 0xb3, 0x87, 0xab, 0x9b, 0x92, 0x3f, 0x77, 0x6f, 0xfe, 0xda, 0x81, 0xb5, - 0x59, 0x57, 0x8e, 0x5a, 0x8d, 0x45, 0xd2, 0x47, 0x33, 0x35, 0x2f, 0x00, 0xe9, 0x40, 0x48, 0xa5, - 0x87, 0xda, 0x86, 0x12, 0xfd, 0xee, 0x63, 0x72, 0xd3, 0x54, 0x31, 0x35, 0x4e, 0x4d, 0x4b, 0x4c, - 0xb1, 0x3e, 0x59, 0xc6, 0xa3, 0x0a, 0x51, 0x2e, 0x37, 0x8f, 0xdb, 0x15, 0xe4, 0x18, 0x64, 0xcf, - 0x48, 0x55, 0x44, 0x1d, 0xcb, 0xd8, 0xc4, 0x6f, 0x3e, 0x64, 0x51, 0x6c, 0x1e, 0xbb, 0x46, 0x03, - 0xcc, 0x42, 0x1b, 0x06, 0x2a, 0x3e, 0x8d, 0xcc, 0xb3, 0x92, 0xb5, 0xcd, 0x10, 0xe5, 0xc8, 0xef, - 0x2a, 0xe1, 0x3b, 0x37, 0xff, 0xe3, 0xf3, 0x6b, 0xce, 0x67, 0x9f, 0x5f, 0x73, 0xfe, 0xe7, 0xf3, - 0x6b, 0xce, 0x2f, 0xbe, 0xb8, 0xb6, 0xf4, 0xd9, 0x17, 0xd7, 0x96, 0x7e, 0xf3, 0xc5, 0xb5, 0xa5, - 0xef, 0x93, 0xf9, 0x3f, 0xdf, 0x7a, 0x55, 0x1d, 0x61, 0xee, 0xfe, 0x5f, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x6a, 0xa7, 0x41, 0x01, 0x14, 0x27, 0x00, 0x00, + 0x7a, 0x41, 0xac, 0x2b, 0x07, 0x3b, 0x8e, 0x3f, 0x8e, 0x4e, 0x52, 0xa9, 0xe4, 0xe8, 0xdc, 0x7d, + 0x4b, 0xb9, 0x2a, 0xa9, 0xe4, 0x9c, 0x4a, 0xaa, 0x72, 0xd0, 0xd1, 0xb9, 0xa5, 0xa4, 0xd2, 0xbf, + 0xc8, 0x21, 0xf5, 0xba, 0x7b, 0x66, 0x67, 0x17, 0x20, 0xb8, 0x54, 0x72, 0x9b, 0x7e, 0xfd, 0xde, + 0xeb, 0xd7, 0xaf, 0xfb, 0x7d, 0xf6, 0xc0, 0x6b, 0xa3, 0x93, 0xfe, 0xed, 0x38, 0xea, 0xdd, 0x1e, + 0xf5, 0x6e, 0x0f, 0x45, 0xc8, 0xe3, 0xdb, 0x23, 0x29, 0x94, 0x48, 0xcd, 0x20, 0x6d, 0xeb, 0x11, + 0x5d, 0x65, 0xc9, 0x44, 0x4d, 0x46, 0xbc, 0xad, 0xa1, 0xad, 0x57, 0xfb, 0x42, 0xf4, 0x63, 0x6e, + 0x50, 0x7b, 0xe3, 0xe3, 0xdb, 0xa9, 0x92, 0xe3, 0x40, 0x19, 0x64, 0xef, 0x3f, 0x4b, 0xb0, 0xd9, + 0x1d, 0x32, 0xa9, 0x76, 0x62, 0x11, 0x9c, 0x74, 0x13, 0x36, 0x4a, 0x07, 0x42, 0xed, 0xb0, 0x94, + 0xd3, 0x5b, 0x50, 0xed, 0x21, 0x30, 0x6d, 0x3a, 0xd7, 0xcb, 0x37, 0x96, 0xb7, 0x36, 0xda, 0x33, + 0x8c, 0xdb, 0x9a, 0xc2, 0xb7, 0x38, 0xf4, 0x4d, 0xa8, 0x85, 0x5c, 0xb1, 0x28, 0x4e, 0x9b, 0xa5, + 0xeb, 0xce, 0x8d, 0xe5, 0xad, 0x97, 0xdb, 0x66, 0xe1, 0x76, 0xb6, 0x70, 0xbb, 0xab, 0x17, 0xf6, + 0x33, 0x3c, 0x7a, 0x17, 0xea, 0xc7, 0x51, 0xcc, 0x1f, 0xf0, 0x49, 0xda, 0x2c, 0x5f, 0x4e, 0x93, + 0x23, 0xd2, 0x0f, 0x60, 0x8d, 0x9f, 0x29, 0xc9, 0x7c, 0x1e, 0x33, 0x15, 0x89, 0x24, 0x6d, 0xba, + 0x5a, 0xba, 0x97, 0xe7, 0xa4, 0xcb, 0xe6, 0xfd, 0x39, 0x74, 0x7a, 0x1d, 0x96, 0x45, 0xef, 0x53, + 0x1e, 0xa8, 0xc3, 0xc9, 0x88, 0xa7, 0xcd, 0xca, 0xf5, 0xf2, 0x8d, 0x86, 0x5f, 0x04, 0xd1, 0x77, + 0x60, 0x39, 0x10, 0x71, 0xcc, 0x03, 0xc3, 0xbf, 0x7a, 0xb9, 0x68, 0x45, 0x5c, 0xef, 0x67, 0x6f, + 0x40, 0x45, 0xeb, 0x85, 0xae, 0x41, 0x29, 0x0a, 0x9b, 0xce, 0x75, 0xe7, 0x46, 0xc3, 0x2f, 0x45, + 0x21, 0xbd, 0x0d, 0xd5, 0xe3, 0x88, 0xc7, 0xe1, 0x73, 0xd5, 0x63, 0xd1, 0xe8, 0x3d, 0x58, 0x91, + 0x3c, 0x55, 0x32, 0xb2, 0x62, 0x18, 0x0d, 0xfd, 0xce, 0x45, 0x87, 0xd0, 0xf6, 0x0b, 0x88, 0xfe, + 0x0c, 0x19, 0x6e, 0x37, 0x18, 0x44, 0x71, 0x28, 0x79, 0xb2, 0x1f, 0x1a, 0x65, 0x35, 0xfc, 0x22, + 0x88, 0xde, 0x80, 0x2b, 0x3d, 0x16, 0x9c, 0xf4, 0xa5, 0x18, 0x27, 0xe1, 0xae, 0x88, 0x85, 0x6c, + 0x56, 0xb4, 0xd8, 0xf3, 0x60, 0x7a, 0x07, 0x2a, 0x2c, 0x8e, 0xfa, 0x89, 0x56, 0xc9, 0xda, 0x56, + 0xeb, 0x42, 0x59, 0xb6, 0x11, 0xc3, 0x37, 0x88, 0x74, 0x1f, 0x20, 0xc5, 0xdb, 0xa5, 0x2f, 0x49, + 0x73, 0x59, 0x6f, 0xe1, 0x9b, 0x17, 0x92, 0xed, 0x8a, 0x44, 0xf1, 0x44, 0xb5, 0xbb, 0x39, 0xfa, + 0xde, 0x92, 0x5f, 0x20, 0xa6, 0xdf, 0x01, 0x57, 0xf1, 0x33, 0xd5, 0x5c, 0xbb, 0x44, 0x0f, 0x19, + 0x93, 0x43, 0x7e, 0xa6, 0xf6, 0x96, 0x7c, 0x4d, 0x80, 0x84, 0x78, 0x7b, 0x9a, 0x57, 0x16, 0x20, + 0xbc, 0x1f, 0xc5, 0x1c, 0x09, 0x91, 0x80, 0xbe, 0x07, 0xd5, 0x98, 0x4d, 0xc4, 0x58, 0x35, 0x89, + 0x26, 0xfd, 0xdd, 0x4b, 0x49, 0x1f, 0x6a, 0xd4, 0xbd, 0x25, 0xdf, 0x12, 0xd1, 0xb7, 0xa0, 0x1c, + 0x46, 0xa7, 0xcd, 0x75, 0x4d, 0x7b, 0xfd, 0x52, 0xda, 0x4e, 0x74, 0xba, 0xb7, 0xe4, 0x23, 0x3a, + 0xdd, 0x85, 0x7a, 0x4f, 0x88, 0x93, 0x21, 0x93, 0x27, 0x4d, 0xaa, 0x49, 0x7f, 0xef, 0x52, 0xd2, + 0x1d, 0x8b, 0xbc, 0xb7, 0xe4, 0xe7, 0x84, 0xb8, 0xe5, 0x28, 0x10, 0x49, 0xf3, 0xea, 0x02, 0x5b, + 0xde, 0x0f, 0x44, 0x82, 0x5b, 0x46, 0x02, 0x24, 0x8c, 0xa3, 0xe4, 0xa4, 0xb9, 0xb1, 0x00, 0xe1, + 0xc3, 0x28, 0xc1, 0x55, 0x35, 0x01, 0x8a, 0x1d, 0x32, 0xc5, 0x4e, 0x23, 0xfe, 0xb4, 0xf9, 0xd2, + 0x02, 0x62, 0x77, 0x2c, 0x32, 0x8a, 0x9d, 0x11, 0x22, 0x13, 0x69, 0xed, 0xb4, 0xb9, 0xb9, 0x00, + 0x93, 0xcc, 0xa8, 0x91, 0x49, 0x46, 0x48, 0xff, 0x0c, 0xd6, 0x8f, 0x39, 0x53, 0x63, 0xc9, 0xc3, + 0xa9, 0x8f, 0x78, 0x59, 0x73, 0x6b, 0x5f, 0x7e, 0xf6, 0xf3, 0x54, 0x7b, 0x4b, 0xfe, 0x79, 0x56, + 0xf4, 0x5d, 0xa8, 0xc4, 0x4c, 0xf1, 0xb3, 0x66, 0x53, 0xf3, 0xf4, 0x9e, 0x73, 0x29, 0x14, 0x3f, + 0xdb, 0x5b, 0xf2, 0x0d, 0x09, 0xfd, 0x63, 0xb8, 0xa2, 0x58, 0x2f, 0xe6, 0x07, 0xc7, 0x16, 0x21, + 0x6d, 0x7e, 0x4d, 0x73, 0xb9, 0x75, 0xf9, 0x75, 0x9e, 0xa5, 0xd9, 0x5b, 0xf2, 0xe7, 0xd9, 0xb4, + 0x7e, 0x08, 0x2b, 0x45, 0x27, 0x40, 0x29, 0xb8, 0x92, 0x33, 0xe3, 0x80, 0xea, 0xbe, 0xfe, 0x46, + 0x18, 0x0f, 0x23, 0xa5, 0x1d, 0x50, 0xdd, 0xd7, 0xdf, 0x74, 0x13, 0xaa, 0x92, 0x0f, 0xc5, 0x29, + 0xd7, 0xfe, 0xa5, 0xee, 0xdb, 0x11, 0xe2, 0x86, 0x92, 0xf5, 0x9b, 0xae, 0xc1, 0xc5, 0x6f, 0xc4, + 0x0d, 0xa5, 0x18, 0x1d, 0x24, 0xda, 0x3f, 0xd4, 0x7d, 0x3b, 0x6a, 0x7d, 0xf9, 0x0d, 0xa8, 0x59, + 0x41, 0x5a, 0x7f, 0x0e, 0x55, 0x63, 0x08, 0xf4, 0x03, 0xa8, 0xa4, 0x6a, 0x12, 0x73, 0x2d, 0xc2, + 0xda, 0xd6, 0xef, 0x2f, 0x60, 0x3c, 0xed, 0x2e, 0x12, 0xf8, 0x86, 0xce, 0x7b, 0x13, 0x2a, 0x7a, + 0x4c, 0x6b, 0x50, 0xf6, 0xc5, 0x53, 0xb2, 0x44, 0x01, 0xaa, 0xbb, 0x22, 0x1e, 0x0f, 0x13, 0xe2, + 0x20, 0xb0, 0x13, 0x9d, 0x92, 0x12, 0x02, 0xf7, 0x38, 0x0b, 0xb9, 0x24, 0xe5, 0xd6, 0x7f, 0x39, + 0xe0, 0xe2, 0xb5, 0xa4, 0xaf, 0xc1, 0xaa, 0x62, 0xb2, 0xcf, 0x4d, 0x58, 0xdb, 0xcf, 0x1c, 0xf1, + 0x2c, 0x90, 0xbe, 0x97, 0x89, 0x58, 0xd2, 0x22, 0x7e, 0xf3, 0xb9, 0xd7, 0x7d, 0x46, 0xc0, 0x82, + 0x4b, 0x2f, 0x2f, 0xe4, 0xd2, 0xbd, 0x3f, 0xcc, 0x76, 0x54, 0x07, 0xf7, 0x31, 0xeb, 0x73, 0xb2, + 0x44, 0x57, 0xa0, 0x9e, 0x99, 0x02, 0x71, 0xe8, 0x2a, 0x34, 0x3a, 0x2c, 0x1d, 0xf4, 0x04, 0x93, + 0x21, 0x29, 0xd1, 0x65, 0xa8, 0x6d, 0xcb, 0x60, 0x10, 0x9d, 0x72, 0x52, 0x6e, 0x7d, 0xa2, 0x37, + 0x4c, 0xff, 0x68, 0x56, 0xad, 0xaf, 0x3f, 0xcf, 0xaf, 0xcc, 0xea, 0xf4, 0x95, 0x82, 0x04, 0x0f, + 0xa3, 0x04, 0x25, 0xa8, 0x83, 0xdb, 0x11, 0x2a, 0x25, 0x4e, 0xeb, 0x3f, 0x1c, 0xa8, 0x67, 0xee, + 0x84, 0x12, 0x28, 0x8f, 0x65, 0x6c, 0xf5, 0x86, 0x9f, 0x74, 0x03, 0x2a, 0x2a, 0x52, 0x56, 0x5b, + 0x0d, 0xdf, 0x0c, 0x30, 0xbe, 0x84, 0x3c, 0x0d, 0x64, 0x34, 0xd2, 0x66, 0x5b, 0xd6, 0x73, 0x45, + 0x10, 0x7d, 0x15, 0x1a, 0xd1, 0x90, 0xf5, 0xf9, 0x1e, 0x4b, 0x07, 0xfa, 0x3e, 0x35, 0xfc, 0x29, + 0x00, 0xe9, 0x8f, 0xd9, 0x29, 0x3a, 0x1f, 0x3d, 0x6f, 0x22, 0x4f, 0x11, 0x44, 0xef, 0x82, 0x8b, + 0x1b, 0xb4, 0x41, 0xe7, 0x1b, 0x73, 0x1b, 0xc6, 0x63, 0x79, 0x2c, 0x39, 0x2a, 0xb0, 0x8d, 0xe1, + 0xdb, 0xd7, 0xc8, 0xad, 0x16, 0xb8, 0xe8, 0xd8, 0xf0, 0x1e, 0x27, 0x6c, 0xc8, 0xed, 0x3e, 0xf4, + 0x77, 0xeb, 0x2a, 0xac, 0x9f, 0xb3, 0xf5, 0xd6, 0x3f, 0x57, 0xc1, 0xc5, 0xb0, 0x81, 0x14, 0x3a, + 0xce, 0x58, 0x0a, 0x1d, 0x42, 0x5e, 0xe8, 0xa2, 0x20, 0x97, 0xd9, 0x8b, 0xf2, 0x1e, 0x54, 0x50, + 0xa7, 0xd9, 0x3d, 0x59, 0x80, 0xfc, 0x11, 0xa2, 0xfb, 0x86, 0x8a, 0x36, 0xa1, 0x16, 0x0c, 0x78, + 0x70, 0xc2, 0x43, 0x6b, 0x8e, 0xd9, 0x10, 0x8f, 0x24, 0x28, 0x04, 0x6c, 0x33, 0xd0, 0x0a, 0x0f, + 0x44, 0x72, 0x6f, 0x28, 0x3e, 0x8d, 0xb4, 0xd6, 0x50, 0xe1, 0x19, 0x20, 0x9b, 0xdd, 0xc7, 0x13, + 0x68, 0xd6, 0xa6, 0xb3, 0x1a, 0xd0, 0xba, 0x07, 0x15, 0xbd, 0x36, 0xde, 0x33, 0x23, 0xb3, 0x49, + 0xfe, 0x5e, 0x5f, 0x4c, 0x66, 0x2b, 0x72, 0xeb, 0xd7, 0x25, 0x70, 0x71, 0x4c, 0x6f, 0x42, 0x45, + 0xb2, 0xa4, 0x6f, 0x0e, 0xe0, 0x7c, 0x0e, 0xe9, 0xe3, 0x9c, 0x6f, 0x50, 0xe8, 0x07, 0xf6, 0xa0, + 0x8d, 0x92, 0xdf, 0x58, 0x6c, 0xc5, 0xc2, 0xa1, 0xa3, 0x3a, 0x46, 0x4c, 0xb2, 0xa1, 0xbd, 0x85, + 0x66, 0xe0, 0xfd, 0xca, 0x01, 0x17, 0x91, 0xe8, 0x3a, 0xac, 0x76, 0x95, 0x8c, 0x4e, 0xb8, 0x1a, + 0x48, 0x31, 0xee, 0x0f, 0x8c, 0xf9, 0x3d, 0xe0, 0x13, 0x63, 0x6f, 0x0e, 0xba, 0x92, 0x7d, 0xc5, + 0xe2, 0x28, 0x20, 0x25, 0x34, 0x8b, 0x1d, 0x11, 0x87, 0xa4, 0x4c, 0xaf, 0xc0, 0xf2, 0x93, 0x24, + 0xe4, 0x32, 0x0d, 0x84, 0xe4, 0x21, 0x71, 0xad, 0xed, 0x9c, 0x90, 0x0a, 0xda, 0x2b, 0x0a, 0xa2, + 0xb3, 0x23, 0x52, 0xa5, 0x57, 0xe1, 0xca, 0xce, 0x6c, 0xca, 0x44, 0x6a, 0x68, 0xc4, 0x8f, 0x78, + 0x82, 0x97, 0x8c, 0xd4, 0x69, 0x03, 0x2a, 0xfa, 0x14, 0x48, 0x03, 0x17, 0x3b, 0xd0, 0x49, 0x27, + 0x01, 0xef, 0x5f, 0x9d, 0xcc, 0x2e, 0x57, 0xa1, 0xf1, 0x98, 0x49, 0xd6, 0x97, 0x6c, 0x84, 0xf2, + 0x2d, 0x43, 0xcd, 0x38, 0xb7, 0x37, 0x89, 0x33, 0x1d, 0x6c, 0x19, 0xdf, 0x60, 0x06, 0x77, 0x49, + 0x79, 0x3a, 0x78, 0x8b, 0xb8, 0xb8, 0xc6, 0xc7, 0x63, 0xa1, 0x38, 0xa9, 0xa0, 0xa4, 0xbb, 0x22, + 0xe4, 0xa4, 0x8a, 0xc0, 0x43, 0xb4, 0x57, 0x52, 0xc3, 0x3d, 0xef, 0xe2, 0xfd, 0xe9, 0x89, 0x33, + 0x52, 0x47, 0x31, 0x50, 0x8d, 0x3c, 0x24, 0x0d, 0x9c, 0xf9, 0x68, 0x3c, 0xec, 0x71, 0xdc, 0x26, + 0xe0, 0xcc, 0xa1, 0xe8, 0xf7, 0x63, 0x4e, 0x96, 0x51, 0x07, 0x9d, 0xa9, 0x49, 0x93, 0x15, 0x5c, + 0x71, 0x97, 0xc5, 0xb1, 0x18, 0x2b, 0xb2, 0xda, 0xfa, 0xac, 0x0c, 0x2e, 0x66, 0x4e, 0x68, 0x3b, + 0x03, 0xb4, 0x62, 0x6b, 0x3b, 0xf8, 0x9d, 0x5b, 0x60, 0x69, 0x6a, 0x81, 0xf4, 0x5d, 0x7b, 0xd2, + 0xe5, 0x05, 0x7c, 0x18, 0x32, 0x2e, 0x1e, 0x32, 0x05, 0x77, 0x18, 0x0d, 0xb9, 0xf5, 0x24, 0xfa, + 0x1b, 0x61, 0x69, 0xf4, 0x43, 0xae, 0xcd, 0xa0, 0xec, 0xeb, 0x6f, 0xb4, 0x1a, 0x16, 0x86, 0x3c, + 0xdc, 0x56, 0xda, 0x06, 0xca, 0x7e, 0x36, 0x34, 0xd6, 0xcc, 0x94, 0xb9, 0xfd, 0xcf, 0xb3, 0x66, + 0xbd, 0x7c, 0x17, 0xd1, 0x7d, 0x43, 0x35, 0x75, 0x06, 0xf5, 0xc5, 0xc9, 0x0b, 0x2e, 0xb8, 0x63, + 0x6f, 0x63, 0x1d, 0xdc, 0x8f, 0x44, 0xe6, 0x81, 0x11, 0x8d, 0x38, 0x78, 0x4a, 0xda, 0x0c, 0x49, + 0x09, 0x3f, 0x8f, 0xa2, 0x90, 0x0b, 0x52, 0xc6, 0xcf, 0xed, 0x71, 0x18, 0x09, 0xe2, 0x62, 0xd4, + 0x7b, 0xdc, 0xb9, 0x4f, 0x2a, 0xde, 0xeb, 0x05, 0x47, 0xbe, 0x3d, 0x56, 0xc2, 0xb0, 0xd1, 0xd7, + 0xd2, 0x31, 0xb7, 0xac, 0xc7, 0x43, 0x52, 0xf2, 0xbe, 0x8d, 0x78, 0x28, 0xb5, 0x86, 0x8d, 0xd4, + 0x84, 0x2c, 0xe1, 0x1d, 0x7b, 0x32, 0x8a, 0x05, 0x0b, 0xa3, 0xa4, 0x4f, 0x1c, 0x13, 0x00, 0x12, + 0xbb, 0xe6, 0x3d, 0x29, 0x05, 0x46, 0xd2, 0x15, 0x80, 0x69, 0x26, 0xde, 0xfa, 0xcd, 0x95, 0x69, + 0x98, 0xc2, 0x34, 0x20, 0x15, 0x63, 0x19, 0x70, 0xed, 0x1a, 0x1a, 0xbe, 0x1d, 0xd1, 0x0f, 0xa1, + 0x82, 0xf3, 0x58, 0xe0, 0xa0, 0xc7, 0xb8, 0xb9, 0x50, 0xfe, 0xd7, 0x3e, 0x8a, 0xf8, 0x53, 0xdf, + 0x10, 0xd2, 0xb7, 0xa1, 0x21, 0x17, 0x2d, 0xeb, 0xa6, 0x98, 0xf4, 0x1a, 0x00, 0x0b, 0x54, 0x74, + 0xca, 0x91, 0x97, 0xb5, 0xfd, 0x02, 0x84, 0x6e, 0xc3, 0x6a, 0x86, 0x8c, 0x0a, 0x32, 0x35, 0xdf, + 0xf2, 0xd6, 0x2b, 0xcf, 0x60, 0x8d, 0x38, 0xfe, 0x2c, 0x45, 0xeb, 0xb7, 0x2e, 0xb8, 0x9a, 0xd7, + 0x7c, 0x59, 0xb7, 0x3b, 0xe3, 0xb3, 0x6e, 0x2f, 0xbe, 0xe7, 0xb9, 0x2b, 0xad, 0x4d, 0xa4, 0x5c, + 0x30, 0x91, 0x0f, 0xa1, 0x92, 0x0a, 0xa9, 0x32, 0x3d, 0x2c, 0xa8, 0xcd, 0xae, 0x90, 0xca, 0x37, + 0x84, 0xf4, 0x3e, 0xd4, 0x8e, 0xa3, 0x58, 0x71, 0x99, 0x6d, 0xf8, 0xd6, 0x62, 0x3c, 0xee, 0x6b, + 0x22, 0x3f, 0x23, 0xa6, 0x0f, 0x8b, 0xa7, 0x52, 0xd5, 0x9c, 0xda, 0x8b, 0x71, 0xba, 0xe8, 0xb0, + 0x6e, 0x02, 0x09, 0xc4, 0x29, 0x97, 0xd9, 0xdc, 0x03, 0x3e, 0xb1, 0x51, 0xe8, 0x1c, 0x9c, 0xb6, + 0xa0, 0x3e, 0x88, 0x42, 0x8e, 0x81, 0x5c, 0x1b, 0x5b, 0xdd, 0xcf, 0xc7, 0xf4, 0x01, 0xd4, 0x03, + 0x26, 0xc3, 0x2e, 0x9a, 0x7d, 0xe3, 0x85, 0x95, 0x8f, 0x64, 0x7e, 0xce, 0x00, 0x17, 0xd2, 0x8b, + 0xdf, 0x8f, 0x54, 0x13, 0xcc, 0x42, 0xd9, 0xd8, 0x7b, 0xcb, 0xda, 0x2b, 0x7a, 0x50, 0x4c, 0xba, + 0x33, 0x4b, 0x4b, 0x95, 0x71, 0xc9, 0xdf, 0x65, 0x71, 0xcc, 0xe5, 0xc4, 0x64, 0xa2, 0x0f, 0x58, + 0xd2, 0x63, 0x09, 0x29, 0x7b, 0x37, 0xc0, 0xd5, 0x9c, 0x1b, 0x50, 0xe9, 0x0e, 0x59, 0x1c, 0x9b, + 0xec, 0xf5, 0x11, 0x0f, 0xa3, 0xf1, 0xd0, 0x58, 0xe8, 0x43, 0x4c, 0x45, 0x49, 0xa9, 0xf5, 0x4f, + 0x65, 0xa8, 0x67, 0x9b, 0xc6, 0xac, 0xeb, 0x84, 0x4f, 0xb2, 0xac, 0xeb, 0x84, 0x4f, 0x74, 0xb8, + 0x4e, 0x8f, 0xa2, 0x34, 0xea, 0xd9, 0xf4, 0xa3, 0xee, 0x4f, 0x01, 0x18, 0xf1, 0x9e, 0x46, 0xa1, + 0x1a, 0xe8, 0xab, 0x53, 0xf1, 0xcd, 0x00, 0x2b, 0xfa, 0x90, 0x29, 0xbe, 0x9f, 0x04, 0xf1, 0x38, + 0xe4, 0x87, 0xe8, 0x2d, 0x4d, 0xc6, 0x3e, 0x0f, 0xa6, 0x7f, 0x02, 0xa0, 0xa2, 0x21, 0xbf, 0x2f, + 0xe4, 0x90, 0x29, 0x9b, 0x61, 0xbd, 0xf3, 0x62, 0x87, 0xdb, 0x3e, 0xcc, 0x19, 0xf8, 0x05, 0x66, + 0xc8, 0x1a, 0x57, 0xb3, 0xac, 0x6b, 0x5f, 0x89, 0x75, 0x27, 0x67, 0xe0, 0x17, 0x98, 0x79, 0x7f, + 0x0a, 0x30, 0x9d, 0xa1, 0x9b, 0x40, 0x1f, 0x89, 0x44, 0x0d, 0xb6, 0x7b, 0x3d, 0xb9, 0xc3, 0x8f, + 0x85, 0xe4, 0x1d, 0x86, 0x6e, 0xee, 0x25, 0x58, 0xcf, 0xe1, 0xdb, 0xc7, 0x8a, 0x4b, 0x04, 0x6b, + 0xd5, 0x77, 0x07, 0x42, 0x2a, 0x13, 0x43, 0xf5, 0xe7, 0x93, 0x2e, 0x29, 0xa3, 0x6b, 0xdd, 0xef, + 0x1e, 0x10, 0xd7, 0xbb, 0x01, 0x30, 0xdd, 0x12, 0xc6, 0x44, 0xf3, 0xf5, 0xe6, 0x96, 0xc9, 0x17, + 0xcc, 0x68, 0xeb, 0x2d, 0xe2, 0xb4, 0x7e, 0xe1, 0x80, 0x8b, 0x16, 0x87, 0x49, 0x6c, 0xf1, 0x3e, + 0x9b, 0xe3, 0x2b, 0x82, 0xbe, 0x9a, 0x9f, 0x40, 0xde, 0x05, 0x3f, 0xe1, 0x7d, 0xcd, 0x5e, 0xc5, + 0x1a, 0x94, 0xb7, 0xd3, 0xc0, 0xe6, 0xee, 0x3c, 0x0d, 0x88, 0xd3, 0xfa, 0x1b, 0x17, 0xaa, 0xc6, + 0x70, 0xe9, 0xc7, 0x50, 0x17, 0x23, 0x2e, 0x99, 0x12, 0xd2, 0x16, 0x09, 0x6f, 0xbf, 0x88, 0xe1, + 0xb7, 0x0f, 0x2c, 0xb1, 0x9f, 0xb3, 0x99, 0xdf, 0x5f, 0xe9, 0xfc, 0xfe, 0x6e, 0x02, 0xc9, 0x6c, + 0xfc, 0xb1, 0x44, 0x3a, 0x35, 0xb1, 0x49, 0xe9, 0x39, 0x38, 0x3d, 0x84, 0x46, 0x20, 0x92, 0x30, + 0xca, 0x0b, 0x86, 0xb5, 0xad, 0x6f, 0xbf, 0x90, 0x84, 0xbb, 0x19, 0xb5, 0x3f, 0x65, 0x44, 0x6f, + 0x41, 0xe5, 0x94, 0xc5, 0x63, 0x93, 0x18, 0x2c, 0x6f, 0x6d, 0x9e, 0x2b, 0xc6, 0x8e, 0x70, 0xd6, + 0x37, 0x48, 0xde, 0x2b, 0x50, 0xcf, 0xf6, 0xa9, 0xd5, 0x99, 0x84, 0x64, 0x89, 0x56, 0xa1, 0x74, + 0x20, 0x89, 0xe3, 0xfd, 0x9b, 0x03, 0x8d, 0x7c, 0x8d, 0x42, 0xa0, 0xc6, 0xf8, 0xf8, 0x83, 0x31, + 0x8b, 0x89, 0xa3, 0x53, 0x25, 0xa1, 0xcc, 0x48, 0x5f, 0xa4, 0xef, 0x4a, 0xce, 0x14, 0x16, 0xa1, + 0xda, 0x3b, 0xf0, 0x34, 0x25, 0x2e, 0xa5, 0xb0, 0x66, 0xc1, 0x07, 0xd2, 0xa0, 0x56, 0x30, 0x93, + 0xc2, 0xd9, 0x0c, 0x50, 0x35, 0xce, 0xe4, 0x84, 0x9b, 0x4c, 0xf1, 0x23, 0xa1, 0xf4, 0xa0, 0x8e, + 0xb2, 0xec, 0x27, 0xa4, 0x81, 0x6b, 0x7e, 0x24, 0xd4, 0x7e, 0x42, 0x60, 0x1a, 0xc2, 0x97, 0xb3, + 0xe5, 0xf5, 0x68, 0x45, 0x27, 0x08, 0x71, 0xbc, 0x9f, 0x90, 0x55, 0x3b, 0x61, 0x46, 0x6b, 0xad, + 0x57, 0x2f, 0x73, 0x2d, 0xad, 0x57, 0xd0, 0x09, 0x29, 0x7e, 0x76, 0x51, 0xc9, 0xd3, 0x5a, 0x87, + 0x2b, 0x73, 0x6d, 0x07, 0xef, 0x18, 0xea, 0x8f, 0x45, 0x3a, 0xaf, 0x94, 0x1a, 0x94, 0x0f, 0xc5, + 0xc8, 0x64, 0xcf, 0x3b, 0x42, 0x29, 0x31, 0x34, 0xd9, 0xf3, 0x43, 0x7e, 0xac, 0x4c, 0xf2, 0xe2, + 0x47, 0xfd, 0x81, 0x32, 0x89, 0xe9, 0x7e, 0x92, 0x70, 0x49, 0x2a, 0xb8, 0x55, 0x9f, 0x8f, 0x62, + 0x16, 0x60, 0x6e, 0xba, 0x06, 0xa0, 0xe1, 0xf7, 0x23, 0x99, 0x2a, 0x52, 0xf3, 0xbe, 0x83, 0xdb, + 0x89, 0xfa, 0x09, 0x26, 0x2a, 0xfa, 0x43, 0xb3, 0x5a, 0x42, 0xd5, 0xe9, 0xe1, 0x2e, 0x4f, 0x50, + 0xd3, 0x0e, 0x12, 0x9a, 0x6e, 0xa3, 0x5e, 0xa0, 0xb4, 0xd3, 0x80, 0x5a, 0x60, 0x84, 0xf5, 0x1e, + 0xc3, 0xaa, 0xbe, 0x43, 0x8f, 0xb8, 0x62, 0x07, 0x49, 0x3c, 0xf9, 0x3f, 0xf7, 0x63, 0xbd, 0x37, + 0xa0, 0xa2, 0xab, 0x15, 0xd4, 0xd6, 0xb1, 0x14, 0x43, 0xcd, 0xab, 0xe2, 0xeb, 0x6f, 0xe4, 0xae, + 0x84, 0xe6, 0x54, 0xf1, 0x4b, 0x4a, 0x78, 0xff, 0x58, 0x86, 0xda, 0x76, 0x10, 0x88, 0x71, 0xa2, + 0xce, 0xad, 0x7c, 0x51, 0x42, 0xfc, 0x36, 0x54, 0xd9, 0x29, 0x53, 0x4c, 0xda, 0x12, 0xf1, 0xeb, + 0x73, 0xf6, 0x60, 0x79, 0xb5, 0xb7, 0x35, 0x92, 0x6f, 0x91, 0x5b, 0x1c, 0xaa, 0x06, 0x42, 0xdf, + 0x81, 0x8a, 0xae, 0xa9, 0x6d, 0x9d, 0xb5, 0x50, 0x97, 0xd3, 0x50, 0xd0, 0xcd, 0xac, 0x88, 0xd4, + 0x02, 0x21, 0x5c, 0x0f, 0x77, 0xea, 0x99, 0x4c, 0xad, 0x2f, 0x1d, 0xa8, 0xee, 0x8a, 0xe4, 0x38, + 0xea, 0xd3, 0xd7, 0x61, 0x8d, 0x27, 0x78, 0x2f, 0x32, 0x9b, 0xb4, 0x1d, 0xa6, 0x39, 0x28, 0x7a, + 0x0c, 0x0b, 0xe1, 0xbd, 0x71, 0xdf, 0x06, 0xae, 0x22, 0x88, 0xbe, 0x0f, 0x2d, 0x33, 0xf4, 0x79, + 0xcc, 0x59, 0xca, 0x77, 0x07, 0x2c, 0x49, 0x78, 0xdc, 0x7d, 0x1a, 0xa9, 0x60, 0x60, 0xbb, 0x51, + 0x97, 0x60, 0x50, 0x0f, 0x56, 0xcc, 0x6c, 0x77, 0xc4, 0x02, 0x9e, 0xda, 0xd2, 0x78, 0x06, 0x46, + 0xbf, 0x05, 0x15, 0xdd, 0xfd, 0x6f, 0x86, 0x97, 0x9f, 0xb1, 0xc1, 0xf2, 0xfe, 0xc7, 0x81, 0xe5, + 0x42, 0x3f, 0xe1, 0xff, 0xb1, 0x07, 0xd2, 0x82, 0xba, 0x56, 0xf6, 0x13, 0x19, 0xdb, 0xc2, 0x25, + 0x1f, 0x63, 0xfa, 0x6a, 0xdb, 0x1d, 0x38, 0x6b, 0x9c, 0x66, 0x01, 0xf2, 0x95, 0xfa, 0x1f, 0xde, + 0x96, 0x0d, 0x15, 0xcb, 0x50, 0x7b, 0x92, 0x9c, 0x24, 0xe2, 0x69, 0x62, 0xc2, 0x85, 0x6e, 0x3b, + 0xcd, 0x14, 0x1a, 0x75, 0xd3, 0xf7, 0x20, 0x65, 0xef, 0x27, 0xee, 0x5c, 0x13, 0xf1, 0x1e, 0x54, + 0xcd, 0xbb, 0x88, 0xce, 0xf4, 0xd7, 0xb6, 0xbe, 0x75, 0x2e, 0x63, 0x9e, 0x22, 0xb7, 0x4d, 0x31, + 0x5b, 0x00, 0xf9, 0x96, 0x98, 0x3e, 0x2c, 0xf4, 0x86, 0x4d, 0x6d, 0x70, 0xe7, 0x32, 0x46, 0xd9, + 0x1d, 0x9a, 0x79, 0xd4, 0xc8, 0x39, 0xb4, 0x7e, 0xea, 0xc0, 0xc6, 0x45, 0x28, 0x58, 0xf0, 0xf5, + 0x66, 0xba, 0x7d, 0xd9, 0x90, 0x76, 0xe7, 0x9e, 0x52, 0x4a, 0x7a, 0x37, 0xb7, 0x5f, 0x50, 0x88, + 0xd9, 0x87, 0x15, 0xef, 0xc7, 0x0e, 0xac, 0x9f, 0xdb, 0x73, 0xc1, 0x2f, 0x02, 0x54, 0x3b, 0x3c, + 0xe6, 0x8a, 0x9b, 0xbe, 0x5e, 0xde, 0x69, 0x32, 0x89, 0xa2, 0x36, 0xc8, 0xd4, 0x94, 0xee, 0x1d, + 0xf3, 0x1e, 0x46, 0x5c, 0x74, 0x68, 0x78, 0x6a, 0x78, 0xd1, 0xfb, 0x58, 0xbf, 0x13, 0x58, 0x31, + 0x9d, 0x51, 0x0b, 0xa9, 0xa2, 0x7f, 0x3f, 0xe4, 0xc3, 0x51, 0xcc, 0x14, 0x27, 0x35, 0xcf, 0x87, + 0xab, 0x17, 0x08, 0xaa, 0x97, 0x3e, 0xb2, 0x62, 0xac, 0x01, 0x74, 0x8e, 0xb2, 0xc5, 0x89, 0x83, + 0x31, 0xa9, 0x73, 0xb4, 0xab, 0xa3, 0x92, 0x6d, 0x3f, 0xe8, 0xf0, 0xd5, 0x39, 0xc2, 0xbc, 0x38, + 0x25, 0x65, 0xef, 0x03, 0x78, 0xe9, 0x70, 0x20, 0x39, 0x0b, 0x3b, 0x9c, 0x8f, 0x62, 0xbc, 0x5d, + 0x6c, 0x82, 0xc5, 0xe2, 0x05, 0xb9, 0xe9, 0x06, 0x54, 0x58, 0x18, 0x4a, 0xa3, 0xd0, 0x86, 0x6f, + 0x06, 0xde, 0x27, 0xb0, 0x69, 0x18, 0x98, 0x55, 0x3e, 0x1e, 0xf3, 0x31, 0xbf, 0x97, 0x28, 0x39, + 0x31, 0xb9, 0x7f, 0xf6, 0x58, 0x66, 0x70, 0x2c, 0xbb, 0x73, 0x70, 0xb4, 0x18, 0xa5, 0xbf, 0xf6, + 0x43, 0x6b, 0x6c, 0xf9, 0xd8, 0xfb, 0xb9, 0x0b, 0x70, 0x90, 0x3f, 0xd8, 0x5d, 0x60, 0xa6, 0x17, + 0xbb, 0xd8, 0x42, 0x19, 0x53, 0x5e, 0xb8, 0xb8, 0xfc, 0x83, 0xfc, 0x11, 0xc8, 0xd5, 0xf6, 0x37, + 0xff, 0x90, 0x33, 0x95, 0xc3, 0x36, 0xb1, 0xf3, 0xf7, 0x9f, 0x99, 0x36, 0x5c, 0x65, 0xbe, 0x0d, + 0x37, 0xe7, 0x33, 0xaa, 0xe7, 0x7d, 0xc6, 0x26, 0x54, 0x07, 0x51, 0x18, 0xf2, 0x44, 0x27, 0xcf, + 0x75, 0xdf, 0x8e, 0x50, 0x33, 0xa8, 0x07, 0x91, 0xc4, 0x93, 0xac, 0x58, 0xc9, 0xc6, 0xf4, 0x2e, + 0x54, 0x94, 0x7e, 0xd6, 0xac, 0xeb, 0x2b, 0x3e, 0x1f, 0x46, 0xa6, 0x2f, 0xbd, 0xda, 0x55, 0x18, + 0x5c, 0x74, 0x40, 0x51, 0x6a, 0x1b, 0xcd, 0xa1, 0x2e, 0xa6, 0xea, 0x7e, 0x01, 0xe2, 0xfd, 0xbd, + 0x93, 0x37, 0xf5, 0x1b, 0x50, 0xe9, 0xb1, 0x34, 0x0a, 0x4c, 0x6b, 0x6a, 0x24, 0xc5, 0xb1, 0x69, + 0x5c, 0xd4, 0xc1, 0x55, 0x22, 0x14, 0xa4, 0x84, 0xe9, 0x40, 0xca, 0x31, 0xf0, 0xaf, 0x01, 0x4c, + 0x1f, 0x55, 0x89, 0x8b, 0x37, 0x37, 0xd3, 0xaa, 0xe9, 0x4c, 0x69, 0xd2, 0x2a, 0xda, 0x46, 0x98, + 0xf7, 0xbc, 0x6b, 0xb8, 0x82, 0xf6, 0x8c, 0xa4, 0x8e, 0x38, 0x89, 0x50, 0xdc, 0x24, 0x41, 0x29, + 0x7a, 0x74, 0x02, 0xc8, 0x06, 0x5d, 0x41, 0x8f, 0xa5, 0x9c, 0x6c, 0x78, 0x7f, 0x3b, 0x15, 0xed, + 0x4e, 0x1e, 0x66, 0x17, 0x39, 0xa4, 0x67, 0x05, 0xe2, 0x7b, 0xb0, 0x2e, 0xf9, 0x0f, 0xc6, 0xd1, + 0xcc, 0xeb, 0xd1, 0x73, 0x6e, 0xcb, 0x79, 0x0a, 0xef, 0x14, 0xd6, 0xb3, 0xc1, 0xf7, 0x22, 0x35, + 0xd0, 0xa9, 0x27, 0xbd, 0x5b, 0x78, 0xde, 0x72, 0x6c, 0x40, 0x7a, 0x06, 0xcb, 0xe9, 0x73, 0x56, + 0x9e, 0xd6, 0x96, 0x16, 0x49, 0x6b, 0xff, 0xae, 0x76, 0x69, 0x31, 0xf9, 0x36, 0x54, 0x8f, 0x4d, + 0x3d, 0x66, 0xea, 0x90, 0xaf, 0x3f, 0x63, 0x7d, 0x5b, 0x73, 0x59, 0xe4, 0x0b, 0xfb, 0x13, 0xef, + 0xc2, 0x4a, 0xc8, 0x8f, 0xd9, 0x38, 0x56, 0x47, 0x0b, 0x64, 0xdd, 0x33, 0xb8, 0x74, 0x47, 0x97, + 0x86, 0xac, 0x6b, 0xba, 0x48, 0x15, 0x2d, 0x8a, 0xf7, 0x0c, 0x51, 0xb4, 0x27, 0x36, 0x98, 0x7e, + 0x81, 0xaa, 0x60, 0x1d, 0xd5, 0x8b, 0xac, 0x03, 0x73, 0x3e, 0x6b, 0x37, 0xf9, 0xd8, 0x14, 0x29, + 0xe6, 0x3b, 0x63, 0xaf, 0x5f, 0x85, 0xeb, 0xfe, 0x39, 0x38, 0xfa, 0xb6, 0xe1, 0x38, 0x56, 0x91, + 0x6d, 0x3c, 0x98, 0xc1, 0xfc, 0xcf, 0x03, 0x8d, 0xf3, 0x3f, 0x0f, 0xbc, 0x0f, 0x90, 0x72, 0x74, + 0x65, 0x9d, 0x28, 0x50, 0xcd, 0x15, 0x7d, 0x73, 0xae, 0x3d, 0x6b, 0x6f, 0x07, 0xda, 0xd2, 0xfd, + 0x02, 0x05, 0xca, 0x3f, 0x64, 0x67, 0xbb, 0x98, 0xed, 0x35, 0x57, 0x75, 0x3e, 0x99, 0x8f, 0xe7, + 0x7d, 0xc6, 0xda, 0x79, 0x9f, 0x71, 0x17, 0x2a, 0x69, 0x20, 0x46, 0x5c, 0x3f, 0xe0, 0x3e, 0xfb, + 0x7c, 0xdb, 0x5d, 0x44, 0xf2, 0x0d, 0xae, 0x7e, 0x5f, 0x40, 0x57, 0x2d, 0xa4, 0x7e, 0xba, 0x6d, + 0xf8, 0xd9, 0xb0, 0xf5, 0x6b, 0x07, 0xaa, 0x46, 0xc6, 0x8b, 0xb2, 0x58, 0x5d, 0x33, 0x94, 0x0a, + 0xcf, 0x24, 0xf9, 0x73, 0x44, 0xb9, 0xf8, 0x1c, 0xf1, 0x6e, 0x26, 0x93, 0x71, 0xa0, 0xaf, 0x5d, + 0xae, 0x8c, 0x19, 0xd1, 0xbc, 0x5b, 0x50, 0xd1, 0x63, 0xf4, 0x00, 0xb1, 0x08, 0x58, 0x6c, 0x6a, + 0x70, 0x39, 0x8d, 0x67, 0x90, 0x5d, 0x69, 0x52, 0xf2, 0xbe, 0x9f, 0x61, 0x43, 0x96, 0xb8, 0x98, + 0xa4, 0x07, 0x57, 0x23, 0x0e, 0xdd, 0x00, 0x92, 0x72, 0x75, 0x70, 0x7c, 0x38, 0xe0, 0x5d, 0x36, + 0xe4, 0xda, 0x2f, 0x95, 0x68, 0x13, 0x36, 0x0c, 0x6e, 0x3a, 0x3b, 0xa3, 0x43, 0x73, 0x1c, 0xf5, + 0x24, 0x93, 0x13, 0xe2, 0x7a, 0xef, 0xeb, 0x9e, 0x43, 0x76, 0xfb, 0x96, 0xf3, 0xbf, 0x5d, 0x8c, + 0x27, 0x0c, 0xb9, 0x44, 0x57, 0x69, 0x3a, 0x42, 0xcc, 0x24, 0xeb, 0xa6, 0xa1, 0x6a, 0xa4, 0x2e, + 0x7b, 0x77, 0x30, 0xb7, 0x9a, 0xb6, 0x14, 0xcf, 0xe9, 0xd3, 0x1a, 0x6b, 0x29, 0x37, 0x56, 0x6f, + 0xa7, 0x90, 0x34, 0xcc, 0x46, 0x2f, 0x67, 0xd1, 0xe8, 0xe5, 0x3d, 0x80, 0x2b, 0x19, 0xd8, 0xa8, + 0x17, 0x03, 0x5a, 0x4d, 0x8c, 0x8a, 0x7c, 0x9e, 0x77, 0x3b, 0x33, 0xf4, 0x9b, 0xff, 0x52, 0x86, + 0xb5, 0xd9, 0x08, 0xa2, 0x2b, 0x30, 0xb3, 0xdb, 0x83, 0x38, 0x34, 0x25, 0xda, 0x0e, 0x9a, 0x52, + 0x20, 0xc7, 0xc3, 0x5e, 0x6a, 0x02, 0x83, 0x4e, 0x39, 0x09, 0x4e, 0x3d, 0x36, 0xf1, 0x42, 0x03, + 0xd6, 0x71, 0x6a, 0x4f, 0x0c, 0x39, 0xb9, 0x5e, 0x7c, 0xe7, 0xbc, 0x93, 0xbd, 0x88, 0x6a, 0x07, + 0xff, 0x21, 0x86, 0x93, 0x2e, 0x57, 0x64, 0x1b, 0x53, 0xa1, 0xee, 0xe1, 0xd4, 0x8f, 0x93, 0x4f, + 0x68, 0xc3, 0xb6, 0xcd, 0x7f, 0x54, 0xa2, 0xab, 0x85, 0xac, 0xe8, 0x57, 0x25, 0xba, 0x01, 0x57, + 0x76, 0xc6, 0x49, 0x18, 0xf3, 0x30, 0x87, 0xfe, 0x83, 0x86, 0xea, 0x97, 0x0e, 0xa5, 0xeb, 0x4e, + 0xcd, 0xe4, 0x97, 0x78, 0xfc, 0x57, 0x0b, 0xd0, 0x3c, 0x51, 0xfa, 0xab, 0xf9, 0x99, 0x9c, 0xd3, + 0x5f, 0x17, 0xf9, 0xe7, 0xf8, 0x3f, 0x72, 0x11, 0xba, 0x9f, 0x84, 0xfc, 0xac, 0x00, 0xfd, 0xb1, + 0x4b, 0x37, 0x61, 0xdd, 0xe2, 0x16, 0x84, 0xff, 0x0b, 0x97, 0x5e, 0x85, 0xb5, 0x6d, 0xa3, 0x76, + 0xab, 0x15, 0xf2, 0x13, 0xac, 0x90, 0xdd, 0x0e, 0xae, 0xf1, 0x97, 0x2e, 0x5d, 0x87, 0x95, 0xef, + 0x09, 0x79, 0xa2, 0xc3, 0x1e, 0xea, 0xf6, 0xa7, 0x98, 0x1d, 0x36, 0x72, 0x10, 0xf9, 0x99, 0x4b, + 0x5f, 0x06, 0x3a, 0x7b, 0xb8, 0xba, 0x29, 0xf9, 0x73, 0xcd, 0x7b, 0x76, 0x82, 0xfc, 0xc2, 0xbd, + 0xf9, 0x1b, 0x67, 0x0a, 0x9d, 0xf6, 0xb6, 0x62, 0x91, 0xf4, 0xd1, 0x76, 0xcd, 0xb3, 0x40, 0x3a, + 0x10, 0x52, 0xe9, 0xa1, 0x36, 0xac, 0x44, 0x3f, 0x06, 0x99, 0x84, 0x35, 0x55, 0x4c, 0x8d, 0x53, + 0xd3, 0x27, 0x53, 0xac, 0x4f, 0x96, 0xf1, 0xfc, 0x42, 0x14, 0xd6, 0xcd, 0x83, 0x79, 0x05, 0x39, + 0x06, 0xd9, 0xdb, 0x52, 0x15, 0x51, 0xc7, 0x32, 0x36, 0x41, 0x9d, 0x0f, 0x59, 0x14, 0x9b, 0x17, + 0xb0, 0xd1, 0x00, 0x53, 0xd3, 0x86, 0x81, 0x8a, 0x4f, 0x23, 0xf3, 0xd6, 0x64, 0x0d, 0x36, 0x44, + 0x39, 0xf2, 0x0b, 0x4c, 0xf8, 0xce, 0xcd, 0x7f, 0xff, 0xfc, 0x9a, 0xf3, 0xd9, 0xe7, 0xd7, 0x9c, + 0xff, 0xfe, 0xfc, 0x9a, 0xf3, 0xcb, 0x2f, 0xae, 0x2d, 0x7d, 0xf6, 0xc5, 0xb5, 0xa5, 0xdf, 0x7e, + 0x71, 0x6d, 0xe9, 0xfb, 0x64, 0xfe, 0x77, 0xb8, 0x5e, 0x55, 0x87, 0x9d, 0xbb, 0xff, 0x1b, 0x00, + 0x00, 0xff, 0xff, 0xa1, 0x0e, 0x95, 0x27, 0x29, 0x27, 0x00, 0x00, } func (m *SmartBlockSnapshotBase) Marshal() (dAtA []byte, err error) { diff --git a/pkg/lib/pb/model/protos/models.proto b/pkg/lib/pb/model/protos/models.proto index f06d24b6f..ff1f79ec1 100644 --- a/pkg/lib/pb/model/protos/models.proto +++ b/pkg/lib/pb/model/protos/models.proto @@ -42,7 +42,7 @@ enum SmartBlockType { WorkspaceOld = 0x205; // deprecated thread-based workspace Workspace = 0x206; RelationOptionList = 0x207; - + RelationOption = 0x208; } message Block { diff --git a/util/builtintemplate/builtintemplate.go b/util/builtintemplate/builtintemplate.go index 782ba92b8..c6227f499 100644 --- a/util/builtintemplate/builtintemplate.go +++ b/util/builtintemplate/builtintemplate.go @@ -123,7 +123,7 @@ func (b *builtinTemplate) registerBuiltin(rd io.ReadCloser) (err error) { return } b.source.RegisterStaticSource(id, func() source.Source { - return b.source.NewStaticSource(id, model.SmartBlockType_BundledTemplate, st.Copy()) + return b.source.NewStaticSource(id, model.SmartBlockType_BundledTemplate, st.Copy(), nil) }) return } diff --git a/util/builtintemplate/builtintemplate_test.go b/util/builtintemplate/builtintemplate_test.go index 0c149817a..dbdee2b5f 100644 --- a/util/builtintemplate/builtintemplate_test.go +++ b/util/builtintemplate/builtintemplate_test.go @@ -16,7 +16,7 @@ func Test_registerBuiltin(t *testing.T) { s := mockSource.NewMockService(ctrl) s.EXPECT().Name().Return(source.CName).AnyTimes() s.EXPECT().Init(gomock.Any()).AnyTimes() - s.EXPECT().NewStaticSource(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + s.EXPECT().NewStaticSource(gomock.Any(), gomock.Any(), gomock.Any(), nil).AnyTimes() s.EXPECT().RegisterStaticSource(gomock.Any(), gomock.Any()).AnyTimes() a := testapp.New().With(s).With(New())