1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-10 18:10:49 +09:00

GO-3921: add new sync status

Signed-off-by: AnastasiaShemyakinskaya <shem98a@mail.ru>
This commit is contained in:
AnastasiaShemyakinskaya 2024-08-21 11:06:59 +02:00
parent 49281ac17d
commit 4a4b056bfc
No known key found for this signature in database
GPG key ID: CCD60ED83B103281
11 changed files with 801 additions and 414 deletions

View file

@ -215,4 +215,7 @@ packages:
SpaceIdGetter:
NodeUsage:
NetworkConfig:
Updater:
Updater:
github.com/anyproto/anytype-heart/core/compatibility:
interfaces:
Checker:

View file

@ -50,6 +50,7 @@ import (
"github.com/anyproto/anytype-heart/core/block/restriction"
"github.com/anyproto/anytype-heart/core/block/source"
templateservice "github.com/anyproto/anytype-heart/core/block/template"
"github.com/anyproto/anytype-heart/core/compatibility"
"github.com/anyproto/anytype-heart/core/configfetcher"
"github.com/anyproto/anytype-heart/core/debug"
"github.com/anyproto/anytype-heart/core/debug/profiler"
@ -301,7 +302,8 @@ func Bootstrap(a *app.App, components ...app.Component) {
Register(nameserviceclient.New()).
Register(payments.New()).
Register(paymentscache.New()).
Register(peerstatus.New())
Register(peerstatus.New()).
Register(compatibility.New())
}
func MiddlewareVersion() string {

View file

@ -0,0 +1,50 @@
package compatibility
import (
"sync"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/net/secureservice"
)
const CName = "core.compatibility.checker"
type Checker interface {
app.Component
AddPeerVersion(peerId string, version uint32)
IsVersionCompatibleWithPeers() bool
}
func New() Checker {
return &compatibilityChecker{peersToVersions: make(map[string]uint32, 0)}
}
type compatibilityChecker struct {
peersToVersions map[string]uint32
sync.Mutex
}
func (i *compatibilityChecker) Init(a *app.App) (err error) {
return
}
func (i *compatibilityChecker) AddPeerVersion(peerId string, version uint32) {
i.Lock()
defer i.Unlock()
i.peersToVersions[peerId] = version
}
func (i *compatibilityChecker) IsVersionCompatibleWithPeers() bool {
i.Lock()
defer i.Unlock()
for _, version := range i.peersToVersions {
if version != secureservice.ProtoVersion {
return false
}
}
return true
}
func (i *compatibilityChecker) Name() (name string) {
return CName
}

View file

@ -0,0 +1,56 @@
package compatibility
import (
"testing"
"github.com/anyproto/any-sync/net/secureservice"
"github.com/stretchr/testify/assert"
)
func TestCompatibilityChecker_AddPeerVersion(t *testing.T) {
t.Run("add peer version", func(t *testing.T) {
// given
checker := &compatibilityChecker{peersToVersions: map[string]uint32{}}
// when
checker.AddPeerVersion("id", 1)
// then
assert.Equal(t, uint32(1), checker.peersToVersions["id"])
})
}
func TestCompatibilityChecker_IsVersionCompatibleWithPeers(t *testing.T) {
t.Run("no versions", func(t *testing.T) {
// given
checker := &compatibilityChecker{peersToVersions: map[string]uint32{}}
// when
compatibleWithPeers := checker.IsVersionCompatibleWithPeers()
// then
assert.True(t, compatibleWithPeers)
})
t.Run("versions compatible", func(t *testing.T) {
// given
checker := &compatibilityChecker{peersToVersions: map[string]uint32{}}
// when
checker.AddPeerVersion("id", secureservice.ProtoVersion)
compatibleWithPeers := checker.IsVersionCompatibleWithPeers()
// then
assert.True(t, compatibleWithPeers)
})
t.Run("versions is not compatible", func(t *testing.T) {
// given
checker := &compatibilityChecker{peersToVersions: map[string]uint32{}}
// when
checker.AddPeerVersion("id", 1)
compatibleWithPeers := checker.IsVersionCompatibleWithPeers()
// then
assert.False(t, compatibleWithPeers)
})
}

View file

@ -0,0 +1,206 @@
// Code generated by mockery. DO NOT EDIT.
package mock_compatibility
import (
app "github.com/anyproto/any-sync/app"
mock "github.com/stretchr/testify/mock"
)
// MockChecker is an autogenerated mock type for the Checker type
type MockChecker struct {
mock.Mock
}
type MockChecker_Expecter struct {
mock *mock.Mock
}
func (_m *MockChecker) EXPECT() *MockChecker_Expecter {
return &MockChecker_Expecter{mock: &_m.Mock}
}
// AddPeerVersion provides a mock function with given fields: peerId, version
func (_m *MockChecker) AddPeerVersion(peerId string, version uint32) {
_m.Called(peerId, version)
}
// MockChecker_AddPeerVersion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddPeerVersion'
type MockChecker_AddPeerVersion_Call struct {
*mock.Call
}
// AddPeerVersion is a helper method to define mock.On call
// - peerId string
// - version uint32
func (_e *MockChecker_Expecter) AddPeerVersion(peerId interface{}, version interface{}) *MockChecker_AddPeerVersion_Call {
return &MockChecker_AddPeerVersion_Call{Call: _e.mock.On("AddPeerVersion", peerId, version)}
}
func (_c *MockChecker_AddPeerVersion_Call) Run(run func(peerId string, version uint32)) *MockChecker_AddPeerVersion_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(string), args[1].(uint32))
})
return _c
}
func (_c *MockChecker_AddPeerVersion_Call) Return() *MockChecker_AddPeerVersion_Call {
_c.Call.Return()
return _c
}
func (_c *MockChecker_AddPeerVersion_Call) RunAndReturn(run func(string, uint32)) *MockChecker_AddPeerVersion_Call {
_c.Call.Return(run)
return _c
}
// Init provides a mock function with given fields: a
func (_m *MockChecker) Init(a *app.App) error {
ret := _m.Called(a)
if len(ret) == 0 {
panic("no return value specified for Init")
}
var r0 error
if rf, ok := ret.Get(0).(func(*app.App) error); ok {
r0 = rf(a)
} else {
r0 = ret.Error(0)
}
return r0
}
// MockChecker_Init_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Init'
type MockChecker_Init_Call struct {
*mock.Call
}
// Init is a helper method to define mock.On call
// - a *app.App
func (_e *MockChecker_Expecter) Init(a interface{}) *MockChecker_Init_Call {
return &MockChecker_Init_Call{Call: _e.mock.On("Init", a)}
}
func (_c *MockChecker_Init_Call) Run(run func(a *app.App)) *MockChecker_Init_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(*app.App))
})
return _c
}
func (_c *MockChecker_Init_Call) Return(err error) *MockChecker_Init_Call {
_c.Call.Return(err)
return _c
}
func (_c *MockChecker_Init_Call) RunAndReturn(run func(*app.App) error) *MockChecker_Init_Call {
_c.Call.Return(run)
return _c
}
// IsVersionCompatibleWithPeers provides a mock function with given fields:
func (_m *MockChecker) IsVersionCompatibleWithPeers() bool {
ret := _m.Called()
if len(ret) == 0 {
panic("no return value specified for IsVersionCompatibleWithPeers")
}
var r0 bool
if rf, ok := ret.Get(0).(func() bool); ok {
r0 = rf()
} else {
r0 = ret.Get(0).(bool)
}
return r0
}
// MockChecker_IsVersionCompatibleWithPeers_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsVersionCompatibleWithPeers'
type MockChecker_IsVersionCompatibleWithPeers_Call struct {
*mock.Call
}
// IsVersionCompatibleWithPeers is a helper method to define mock.On call
func (_e *MockChecker_Expecter) IsVersionCompatibleWithPeers() *MockChecker_IsVersionCompatibleWithPeers_Call {
return &MockChecker_IsVersionCompatibleWithPeers_Call{Call: _e.mock.On("IsVersionCompatibleWithPeers")}
}
func (_c *MockChecker_IsVersionCompatibleWithPeers_Call) Run(run func()) *MockChecker_IsVersionCompatibleWithPeers_Call {
_c.Call.Run(func(args mock.Arguments) {
run()
})
return _c
}
func (_c *MockChecker_IsVersionCompatibleWithPeers_Call) Return(_a0 bool) *MockChecker_IsVersionCompatibleWithPeers_Call {
_c.Call.Return(_a0)
return _c
}
func (_c *MockChecker_IsVersionCompatibleWithPeers_Call) RunAndReturn(run func() bool) *MockChecker_IsVersionCompatibleWithPeers_Call {
_c.Call.Return(run)
return _c
}
// Name provides a mock function with given fields:
func (_m *MockChecker) Name() string {
ret := _m.Called()
if len(ret) == 0 {
panic("no return value specified for Name")
}
var r0 string
if rf, ok := ret.Get(0).(func() string); ok {
r0 = rf()
} else {
r0 = ret.Get(0).(string)
}
return r0
}
// MockChecker_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name'
type MockChecker_Name_Call struct {
*mock.Call
}
// Name is a helper method to define mock.On call
func (_e *MockChecker_Expecter) Name() *MockChecker_Name_Call {
return &MockChecker_Name_Call{Call: _e.mock.On("Name")}
}
func (_c *MockChecker_Name_Call) Run(run func()) *MockChecker_Name_Call {
_c.Call.Run(func(args mock.Arguments) {
run()
})
return _c
}
func (_c *MockChecker_Name_Call) Return(name string) *MockChecker_Name_Call {
_c.Call.Return(name)
return _c
}
func (_c *MockChecker_Name_Call) RunAndReturn(run func() string) *MockChecker_Name_Call {
_c.Call.Return(run)
return _c
}
// NewMockChecker creates a new instance of MockChecker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockChecker(t interface {
mock.TestingT
Cleanup(func())
}) *MockChecker {
mock := &MockChecker{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}

View file

@ -11,6 +11,7 @@ import (
"github.com/anyproto/any-sync/util/periodicsync"
"github.com/samber/lo"
"github.com/anyproto/anytype-heart/core/compatibility"
"github.com/anyproto/anytype-heart/core/event"
"github.com/anyproto/anytype-heart/core/files"
"github.com/anyproto/anytype-heart/core/session"
@ -55,14 +56,15 @@ type spaceSyncStatus struct {
nodeUsage NodeUsage
subs syncsubscriptions.SyncSubscriptions
spaceIdGetter SpaceIdGetter
curStatuses map[string]struct{}
missingIds map[string][]string
lastSentEvents map[string]pb.EventSpaceSyncStatusUpdate
mx sync.Mutex
periodicCall periodicsync.PeriodicSync
loopInterval time.Duration
isLocal bool
spaceIdGetter SpaceIdGetter
curStatuses map[string]struct{}
missingIds map[string][]string
lastSentEvents map[string]pb.EventSpaceSyncStatusUpdate
mx sync.Mutex
periodicCall periodicsync.PeriodicSync
loopInterval time.Duration
isLocal bool
compatibilityCheck compatibility.Checker
}
func NewSpaceSyncStatus() Updater {
@ -86,6 +88,7 @@ func (s *spaceSyncStatus) Init(a *app.App) (err error) {
sessionHookRunner := app.MustComponent[session.HookRunner](a)
sessionHookRunner.RegisterHook(s.sendSyncEventForNewSession)
s.periodicCall = periodicsync.NewPeriodicSyncDuration(s.loopInterval, time.Second*5, s.update, logger.CtxLogger{Logger: log.Desugar()})
s.compatibilityCheck = app.MustComponent[compatibility.Checker](a)
return
}
@ -143,10 +146,11 @@ func (s *spaceSyncStatus) sendEventToSession(spaceId, token string) {
return
}
params := syncParams{
bytesLeftPercentage: s.getBytesLeftPercentage(spaceId),
connectionStatus: s.nodeStatus.GetNodeStatus(spaceId),
compatibility: s.nodeConf.NetworkCompatibilityStatus(),
objectsSyncingCount: s.getObjectSyncingObjectsCount(spaceId, s.getMissingIds(spaceId)),
bytesLeftPercentage: s.getBytesLeftPercentage(spaceId),
connectionStatus: s.nodeStatus.GetNodeStatus(spaceId),
compatibility: s.nodeConf.NetworkCompatibilityStatus(),
objectsSyncingCount: s.getObjectSyncingObjectsCount(spaceId, s.getMissingIds(spaceId)),
syncProtocolCompatible: s.compatibilityCheck.IsVersionCompatibleWithPeers(),
}
s.eventSender.SendToSession(token, &pb.Event{
Messages: []*pb.EventMessage{{
@ -242,10 +246,11 @@ func (s *spaceSyncStatus) updateSpaceSyncStatus(spaceId string) {
}
missingObjects := s.getMissingIds(spaceId)
params := syncParams{
bytesLeftPercentage: s.getBytesLeftPercentage(spaceId),
connectionStatus: s.nodeStatus.GetNodeStatus(spaceId),
compatibility: s.nodeConf.NetworkCompatibilityStatus(),
objectsSyncingCount: s.getObjectSyncingObjectsCount(spaceId, missingObjects),
bytesLeftPercentage: s.getBytesLeftPercentage(spaceId),
connectionStatus: s.nodeStatus.GetNodeStatus(spaceId),
compatibility: s.nodeConf.NetworkCompatibilityStatus(),
objectsSyncingCount: s.getObjectSyncingObjectsCount(spaceId, missingObjects),
syncProtocolCompatible: s.compatibilityCheck.IsVersionCompatibleWithPeers(),
}
s.broadcast(&pb.Event{
Messages: []*pb.EventMessage{{
@ -262,10 +267,11 @@ func (s *spaceSyncStatus) Close(ctx context.Context) (err error) {
}
type syncParams struct {
bytesLeftPercentage float64
connectionStatus nodestatus.ConnectionStatus
compatibility nodeconf.NetworkCompatibilityStatus
objectsSyncingCount int
bytesLeftPercentage float64
connectionStatus nodestatus.ConnectionStatus
compatibility nodeconf.NetworkCompatibilityStatus
objectsSyncingCount int
syncProtocolCompatible bool
}
func (s *spaceSyncStatus) makeSyncEvent(spaceId string, params syncParams) *pb.EventSpaceSyncStatusUpdate {
@ -287,6 +293,9 @@ func (s *spaceSyncStatus) makeSyncEvent(spaceId string, params syncParams) *pb.E
status = pb.EventSpace_Error
err = pb.EventSpace_IncompatibleVersion
}
if !params.syncProtocolCompatible {
status = pb.EventSpace_SyncProtocolInCompatibleMode
}
return &pb.EventSpaceSyncStatusUpdate{
Id: spaceId,
Status: status,

View file

@ -14,6 +14,7 @@ import (
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
"github.com/anyproto/anytype-heart/core/compatibility/mock_compatibility"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/core/event"
"github.com/anyproto/anytype-heart/core/event/mock_event"
@ -65,18 +66,19 @@ func (m mockSessionContext) GetResponseEvent() *pb.ResponseEvent {
type fixture struct {
*spaceSyncStatus
a *app.App
nodeConf *mock_nodeconf.MockService
nodeUsage *mock_spacesyncstatus.MockNodeUsage
nodeStatus *mock_nodestatus.MockNodeStatus
subscriptionService subscription.Service
syncSubs syncsubscriptions.SyncSubscriptions
objectStore *objectstore.StoreFixture
spaceIdGetter *mock_spacesyncstatus.MockSpaceIdGetter
eventSender *mock_event.MockSender
session session.HookRunner
networkConfig *mock_spacesyncstatus.MockNetworkConfig
ctrl *gomock.Controller
a *app.App
nodeConf *mock_nodeconf.MockService
nodeUsage *mock_spacesyncstatus.MockNodeUsage
nodeStatus *mock_nodestatus.MockNodeStatus
subscriptionService subscription.Service
syncSubs syncsubscriptions.SyncSubscriptions
objectStore *objectstore.StoreFixture
spaceIdGetter *mock_spacesyncstatus.MockSpaceIdGetter
eventSender *mock_event.MockSender
session session.HookRunner
networkConfig *mock_spacesyncstatus.MockNetworkConfig
ctrl *gomock.Controller
compatibilityChecker *mock_compatibility.MockChecker
}
func genObject(syncStatus domain.ObjectSyncStatus, spaceId string) objectstore.TestObject {
@ -105,19 +107,20 @@ func newFixture(t *testing.T, beforeStart func(fx *fixture)) *fixture {
networkConfig := mock_spacesyncstatus.NewMockNetworkConfig(t)
sess := session.NewHookRunner()
fx := &fixture{
a: a,
ctrl: ctrl,
spaceSyncStatus: NewSpaceSyncStatus().(*spaceSyncStatus),
nodeUsage: mock_spacesyncstatus.NewMockNodeUsage(t),
nodeStatus: mock_nodestatus.NewMockNodeStatus(t),
nodeConf: mock_nodeconf.NewMockService(ctrl),
spaceIdGetter: mock_spacesyncstatus.NewMockSpaceIdGetter(t),
objectStore: internalSubs.StoreFixture,
eventSender: app.MustComponent[event.Sender](a).(*mock_event.MockSender),
subscriptionService: internalSubs,
session: sess,
syncSubs: syncsubscriptions.New(),
networkConfig: networkConfig,
a: a,
ctrl: ctrl,
spaceSyncStatus: NewSpaceSyncStatus().(*spaceSyncStatus),
nodeUsage: mock_spacesyncstatus.NewMockNodeUsage(t),
nodeStatus: mock_nodestatus.NewMockNodeStatus(t),
nodeConf: mock_nodeconf.NewMockService(ctrl),
spaceIdGetter: mock_spacesyncstatus.NewMockSpaceIdGetter(t),
objectStore: internalSubs.StoreFixture,
eventSender: app.MustComponent[event.Sender](a).(*mock_event.MockSender),
subscriptionService: internalSubs,
session: sess,
syncSubs: syncsubscriptions.New(),
networkConfig: networkConfig,
compatibilityChecker: mock_compatibility.NewMockChecker(t),
}
fx.spaceIdGetter.EXPECT().TechSpaceId().Return("techSpaceId").Maybe()
@ -127,6 +130,7 @@ func newFixture(t *testing.T, beforeStart func(fx *fixture)) *fixture {
Register(testutil.PrepareMock(ctx, a, fx.spaceIdGetter)).
Register(testutil.PrepareMock(ctx, a, fx.nodeConf)).
Register(testutil.PrepareMock(ctx, a, fx.nodeUsage)).
Register(testutil.PrepareMock(ctx, a, fx.compatibilityChecker)).
Register(sess).
Register(fx.spaceSyncStatus)
beforeStart(fx)
@ -149,6 +153,7 @@ func Test(t *testing.T) {
LocalUsageBytes: 0,
}, nil)
fx.nodeConf.EXPECT().NetworkCompatibilityStatus().Return(nodeconf.NetworkCompatibilityStatusOk)
fx.compatibilityChecker.EXPECT().IsVersionCompatibleWithPeers().Return(true)
fx.eventSender.EXPECT().Broadcast(&pb.Event{
Messages: []*pb.EventMessage{{
Value: &pb.EventMessageValueOfSpaceSyncStatusUpdate{
@ -178,6 +183,7 @@ func Test(t *testing.T) {
LocalUsageBytes: 0,
}, nil)
fx.nodeConf.EXPECT().NetworkCompatibilityStatus().Return(nodeconf.NetworkCompatibilityStatusOk)
fx.compatibilityChecker.EXPECT().IsVersionCompatibleWithPeers().Return(true)
fx.eventSender.EXPECT().Broadcast(&pb.Event{
Messages: []*pb.EventMessage{{
Value: &pb.EventMessageValueOfSpaceSyncStatusUpdate{
@ -209,6 +215,7 @@ func Test(t *testing.T) {
LocalUsageBytes: 0,
}, nil)
fx.nodeConf.EXPECT().NetworkCompatibilityStatus().AnyTimes().Return(nodeconf.NetworkCompatibilityStatusOk)
fx.compatibilityChecker.EXPECT().IsVersionCompatibleWithPeers().Return(true)
fx.eventSender.EXPECT().Broadcast(&pb.Event{
Messages: []*pb.EventMessage{{
Value: &pb.EventMessageValueOfSpaceSyncStatusUpdate{
@ -261,6 +268,7 @@ func Test(t *testing.T) {
LocalUsageBytes: 0,
}, nil)
fx.nodeConf.EXPECT().NetworkCompatibilityStatus().Return(nodeconf.NetworkCompatibilityStatusOk)
fx.compatibilityChecker.EXPECT().IsVersionCompatibleWithPeers().Return(true)
fx.eventSender.EXPECT().Broadcast(&pb.Event{
Messages: []*pb.EventMessage{{
Value: &pb.EventMessageValueOfSpaceSyncStatusUpdate{
@ -292,6 +300,7 @@ func Test(t *testing.T) {
LocalUsageBytes: 0,
}, nil)
fx.nodeConf.EXPECT().NetworkCompatibilityStatus().Return(nodeconf.NetworkCompatibilityStatusOk)
fx.compatibilityChecker.EXPECT().IsVersionCompatibleWithPeers().Return(true)
fx.eventSender.EXPECT().Broadcast(&pb.Event{
Messages: []*pb.EventMessage{{
Value: &pb.EventMessageValueOfSpaceSyncStatusUpdate{
@ -323,6 +332,7 @@ func Test(t *testing.T) {
LocalUsageBytes: 0,
}, nil)
fx.nodeConf.EXPECT().NetworkCompatibilityStatus().Return(nodeconf.NetworkCompatibilityStatusIncompatible)
fx.compatibilityChecker.EXPECT().IsVersionCompatibleWithPeers().Return(true)
fx.eventSender.EXPECT().Broadcast(&pb.Event{
Messages: []*pb.EventMessage{{
Value: &pb.EventMessageValueOfSpaceSyncStatusUpdate{
@ -355,6 +365,7 @@ func Test(t *testing.T) {
LocalUsageBytes: 0,
}, nil)
fx.nodeConf.EXPECT().NetworkCompatibilityStatus().AnyTimes().Return(nodeconf.NetworkCompatibilityStatusOk)
fx.compatibilityChecker.EXPECT().IsVersionCompatibleWithPeers().Return(true)
fx.eventSender.EXPECT().Broadcast(&pb.Event{
Messages: []*pb.EventMessage{{
Value: &pb.EventMessageValueOfSpaceSyncStatusUpdate{
@ -385,6 +396,34 @@ func Test(t *testing.T) {
time.Sleep(100 * time.Millisecond)
defer fx.ctrl.Finish()
})
t.Run("sync protocol compatibility", func(t *testing.T) {
fx := newFixture(t, func(fx *fixture) {
fx.networkConfig.EXPECT().GetNetworkMode().Return(pb.RpcAccount_DefaultConfig)
fx.spaceIdGetter.EXPECT().AllSpaceIds().Return([]string{"spaceId"})
fx.nodeStatus.EXPECT().GetNodeStatus("spaceId").Return(nodestatus.Online)
fx.nodeUsage.EXPECT().GetNodeUsage(mock.Anything).Return(&files.NodeUsageResponse{
Usage: filesync.NodeUsage{
BytesLeft: 1000,
AccountBytesLimit: 1000,
},
LocalUsageBytes: 0,
}, nil)
fx.nodeConf.EXPECT().NetworkCompatibilityStatus().Return(nodeconf.NetworkCompatibilityStatusOk)
fx.compatibilityChecker.EXPECT().IsVersionCompatibleWithPeers().Return(false)
fx.eventSender.EXPECT().Broadcast(&pb.Event{
Messages: []*pb.EventMessage{{
Value: &pb.EventMessageValueOfSpaceSyncStatusUpdate{
SpaceSyncStatusUpdate: &pb.EventSpaceSyncStatusUpdate{
Id: "spaceId",
Status: pb.EventSpace_SyncProtocolInCompatibleMode,
Network: pb.EventSpace_Anytype,
},
},
}},
})
})
defer fx.ctrl.Finish()
})
t.Run("hook new session", func(t *testing.T) {
fx := newFixture(t, func(fx *fixture) {
objs := genSyncingObjects(10, 100, "spaceId")
@ -400,6 +439,7 @@ func Test(t *testing.T) {
LocalUsageBytes: 0,
}, nil)
fx.nodeConf.EXPECT().NetworkCompatibilityStatus().AnyTimes().Return(nodeconf.NetworkCompatibilityStatusIncompatible)
fx.compatibilityChecker.EXPECT().IsVersionCompatibleWithPeers().Return(true)
fx.eventSender.EXPECT().Broadcast(&pb.Event{
Messages: []*pb.EventMessage{{
Value: &pb.EventMessageValueOfSpaceSyncStatusUpdate{

View file

@ -25802,6 +25802,7 @@ Precondition: user A and user B opened the same block
| Syncing | 1 | |
| Error | 2 | |
| Offline | 3 | |
| SyncProtocolInCompatibleMode | 4 | |

View file

@ -98,10 +98,11 @@ func (EventStatusThreadSyncStatus) EnumDescriptor() ([]byte, []int) {
type EventSpaceStatus int32
const (
EventSpace_Synced EventSpaceStatus = 0
EventSpace_Syncing EventSpaceStatus = 1
EventSpace_Error EventSpaceStatus = 2
EventSpace_Offline EventSpaceStatus = 3
EventSpace_Synced EventSpaceStatus = 0
EventSpace_Syncing EventSpaceStatus = 1
EventSpace_Error EventSpaceStatus = 2
EventSpace_Offline EventSpaceStatus = 3
EventSpace_SyncProtocolInCompatibleMode EventSpaceStatus = 4
)
var EventSpaceStatus_name = map[int32]string{
@ -109,13 +110,15 @@ var EventSpaceStatus_name = map[int32]string{
1: "Syncing",
2: "Error",
3: "Offline",
4: "SyncProtocolInCompatibleMode",
}
var EventSpaceStatus_value = map[string]int32{
"Synced": 0,
"Syncing": 1,
"Error": 2,
"Offline": 3,
"Synced": 0,
"Syncing": 1,
"Error": 2,
"Offline": 3,
"SyncProtocolInCompatibleMode": 4,
}
func (x EventSpaceStatus) String() string {
@ -11595,370 +11598,372 @@ func init() {
func init() { proto.RegisterFile("pb/protos/events.proto", fileDescriptor_a966342d378ae5f5) }
var fileDescriptor_a966342d378ae5f5 = []byte{
// 5807 bytes of a gzipped FileDescriptorProto
// 5827 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5c, 0x49, 0x8c, 0x1c, 0xc9,
0x75, 0xad, 0x7d, 0xf9, 0xbd, 0xb0, 0x18, 0xc3, 0xe1, 0xe4, 0x24, 0x7b, 0x38, 0x9c, 0xe6, 0xaa,
0x19, 0xb2, 0xc8, 0xe1, 0xd6, 0x14, 0xc5, 0x21, 0xd9, 0x1b, 0xa7, 0x8b, 0x4b, 0xb3, 0x1d, 0x4d,
0x52, 0xa3, 0x91, 0x20, 0x28, 0xbb, 0x32, 0xba, 0x3a, 0xc5, 0xec, 0xcc, 0x52, 0x66, 0x76, 0x93,
0x2d, 0xd9, 0xb2, 0xe0, 0x05, 0x86, 0x01, 0x1b, 0xf6, 0x49, 0x36, 0x7c, 0xb3, 0x61, 0x03, 0x3e,
0xd8, 0x86, 0x0d, 0x1f, 0xac, 0x93, 0x61, 0xc0, 0x30, 0xe0, 0x15, 0x90, 0x01, 0x1f, 0x7c, 0x93,
0x30, 0xba, 0xf8, 0xe2, 0x83, 0x2c, 0xc0, 0xf0, 0xc9, 0x30, 0x62, 0xc9, 0xcc, 0x88, 0x5c, 0x2a,
0xab, 0x34, 0x23, 0x2f, 0xf0, 0x9c, 0xaa, 0x22, 0xe2, 0xbf, 0x17, 0xdb, 0xff, 0xb1, 0xfc, 0x88,
0x48, 0x38, 0x3a, 0xdc, 0xba, 0x38, 0xf4, 0xdc, 0xc0, 0xf5, 0x2f, 0x92, 0x7d, 0xe2, 0x04, 0x7e,
0x97, 0x85, 0x50, 0xd3, 0x70, 0x0e, 0x82, 0x83, 0x21, 0xd1, 0x4f, 0x0d, 0x9f, 0x0f, 0x2e, 0xda,
0xd6, 0xd6, 0xc5, 0xe1, 0xd6, 0xc5, 0x5d, 0xd7, 0x24, 0x76, 0x28, 0xce, 0x02, 0x42, 0x5c, 0x9f,
0x1b, 0xb8, 0xee, 0xc0, 0x26, 0x3c, 0x6d, 0x6b, 0x6f, 0xfb, 0xa2, 0x1f, 0x78, 0x7b, 0xfd, 0x80,
0xa7, 0xce, 0xff, 0xe1, 0x9f, 0x95, 0xa1, 0xbe, 0x4a, 0xe9, 0xd1, 0x65, 0x68, 0xed, 0x12, 0xdf,
0x37, 0x06, 0xc4, 0xd7, 0xca, 0x27, 0xaa, 0xe7, 0xa6, 0x2e, 0x1f, 0xed, 0x8a, 0xac, 0xba, 0x4c,
0xa2, 0xfb, 0x88, 0x27, 0xe3, 0x48, 0x0e, 0xcd, 0x41, 0xbb, 0xef, 0x3a, 0x01, 0x79, 0x19, 0xf4,
0x4c, 0xad, 0x72, 0xa2, 0x7c, 0xae, 0x8d, 0xe3, 0x08, 0x74, 0x15, 0xda, 0x96, 0x63, 0x05, 0x96,
0x11, 0xb8, 0x9e, 0x56, 0x3d, 0x51, 0x56, 0x28, 0x59, 0x21, 0xbb, 0x8b, 0xfd, 0xbe, 0xbb, 0xe7,
0x04, 0x38, 0x16, 0x44, 0x1a, 0x34, 0x03, 0xcf, 0xe8, 0x93, 0x9e, 0xa9, 0xd5, 0x18, 0x63, 0x18,
0xd4, 0x7f, 0x74, 0x01, 0x9a, 0xa2, 0x0c, 0xe8, 0x0e, 0x4c, 0x19, 0x1c, 0xbb, 0xb9, 0xe3, 0xbe,
0xd0, 0xca, 0x8c, 0xfd, 0x58, 0xa2, 0xc0, 0x82, 0xbd, 0x4b, 0x45, 0xd6, 0x4a, 0x58, 0x46, 0xa0,
0x1e, 0xcc, 0x8a, 0xe0, 0x0a, 0x09, 0x0c, 0xcb, 0xf6, 0xb5, 0xbf, 0xe1, 0x24, 0xc7, 0x73, 0x48,
0x84, 0xd8, 0x5a, 0x09, 0x27, 0x80, 0xe8, 0x0b, 0xf0, 0x8a, 0x88, 0x59, 0x76, 0x9d, 0x6d, 0x6b,
0xf0, 0x74, 0x68, 0x1a, 0x01, 0xd1, 0xfe, 0x96, 0xf3, 0x9d, 0xca, 0xe1, 0xe3, 0xb2, 0x5d, 0x2e,
0xbc, 0x56, 0xc2, 0x59, 0x1c, 0xe8, 0x1e, 0xcc, 0x88, 0x68, 0x41, 0xfa, 0x77, 0x9c, 0xf4, 0x8d,
0x1c, 0xd2, 0x88, 0x4d, 0x85, 0xa1, 0x2f, 0xc2, 0x11, 0x11, 0xf1, 0xd0, 0x72, 0x9e, 0x2f, 0xef,
0x18, 0xb6, 0x4d, 0x9c, 0x01, 0xd1, 0xfe, 0x7e, 0x74, 0x19, 0x15, 0xe1, 0xb5, 0x12, 0xce, 0x24,
0x41, 0x8f, 0xa1, 0xe3, 0x6e, 0x7d, 0x95, 0xf4, 0xc3, 0x06, 0xd9, 0x24, 0x81, 0xd6, 0x61, 0xbc,
0x6f, 0x25, 0x78, 0x1f, 0x33, 0xb1, 0xb0, 0x29, 0xbb, 0x9b, 0x24, 0x58, 0x2b, 0xe1, 0x14, 0x18,
0x3d, 0x05, 0xa4, 0xc4, 0x2d, 0xee, 0x12, 0xc7, 0xd4, 0x2e, 0x33, 0xca, 0x93, 0xa3, 0x29, 0x99,
0xe8, 0x5a, 0x09, 0x67, 0x10, 0xa4, 0x68, 0x9f, 0x3a, 0x3e, 0x09, 0xb4, 0x2b, 0xe3, 0xd0, 0x32,
0xd1, 0x14, 0x2d, 0x8b, 0xa5, 0x6d, 0xcb, 0x63, 0x31, 0xb1, 0x8d, 0xc0, 0x72, 0x1d, 0x51, 0xde,
0xab, 0x8c, 0xf8, 0x74, 0x36, 0x71, 0x24, 0x1b, 0x95, 0x38, 0x93, 0x04, 0x7d, 0x19, 0x5e, 0x4d,
0xc4, 0x63, 0xb2, 0xeb, 0xee, 0x13, 0xed, 0x1a, 0x63, 0x3f, 0x53, 0xc4, 0xce, 0xa5, 0xd7, 0x4a,
0x38, 0x9b, 0x06, 0x2d, 0xc1, 0x74, 0x98, 0xc0, 0x68, 0xaf, 0x33, 0xda, 0xb9, 0x3c, 0x5a, 0x41,
0xa6, 0x60, 0xa8, 0x2d, 0xf2, 0xf0, 0xb2, 0xed, 0xfa, 0x44, 0x5b, 0xcc, 0xb4, 0x45, 0x41, 0xc1,
0x44, 0xa8, 0x2d, 0x4a, 0x08, 0xb9, 0x92, 0x7e, 0xe0, 0x59, 0x7d, 0x56, 0x40, 0xaa, 0x45, 0x0b,
0xa3, 0x2b, 0x19, 0x0b, 0x0b, 0x55, 0xca, 0xa6, 0x41, 0x18, 0x0e, 0xf9, 0x7b, 0x5b, 0x7e, 0xdf,
0xb3, 0x86, 0x34, 0x6e, 0xd1, 0x34, 0xb5, 0x5b, 0xa3, 0x98, 0x37, 0x25, 0xe1, 0xee, 0xa2, 0x49,
0x7b, 0x27, 0x49, 0x80, 0xbe, 0x08, 0x48, 0x8e, 0x12, 0xcd, 0xf7, 0x1e, 0xa3, 0xfd, 0xcc, 0x18,
0xb4, 0x51, 0x5b, 0x66, 0xd0, 0x20, 0x03, 0x8e, 0xc8, 0xb1, 0x1b, 0xae, 0x6f, 0xd1, 0x5f, 0xed,
0x36, 0xa3, 0x7f, 0x67, 0x0c, 0xfa, 0x10, 0x42, 0x15, 0x2b, 0x8b, 0x2a, 0x99, 0xc5, 0x32, 0x35,
0x6b, 0xe2, 0xf9, 0xda, 0x9d, 0xb1, 0xb3, 0x08, 0x21, 0xc9, 0x2c, 0xc2, 0xf8, 0x64, 0x13, 0xbd,
0xef, 0xb9, 0x7b, 0x43, 0x5f, 0xbb, 0x3b, 0x76, 0x13, 0x71, 0x40, 0xb2, 0x89, 0x78, 0x2c, 0xba,
0x0e, 0xad, 0x2d, 0xdb, 0xed, 0x3f, 0xa7, 0x9d, 0x59, 0x61, 0x94, 0x5a, 0x82, 0x72, 0x89, 0x26,
0x8b, 0xee, 0x8b, 0x64, 0xa9, 0xb2, 0xb2, 0xff, 0x2b, 0xc4, 0x26, 0x01, 0x11, 0xd3, 0xd2, 0xb1,
0x4c, 0x28, 0x17, 0xa1, 0xca, 0x2a, 0x21, 0xd0, 0x0a, 0x4c, 0x6d, 0x5b, 0x36, 0xf1, 0x9f, 0x0e,
0x6d, 0xd7, 0xe0, 0x73, 0xd4, 0xd4, 0xe5, 0x13, 0x99, 0x04, 0xf7, 0x62, 0x39, 0xca, 0x22, 0xc1,
0xd0, 0x6d, 0x68, 0xef, 0x1a, 0xde, 0x73, 0xbf, 0xe7, 0x6c, 0xbb, 0x5a, 0x3d, 0x73, 0xe2, 0xe1,
0x1c, 0x8f, 0x42, 0xa9, 0xb5, 0x12, 0x8e, 0x21, 0x74, 0xfa, 0x62, 0x85, 0xda, 0x24, 0xc1, 0x3d,
0x8b, 0xd8, 0xa6, 0xaf, 0x35, 0x18, 0xc9, 0x9b, 0x99, 0x24, 0x9b, 0x24, 0xe8, 0x72, 0x31, 0x3a,
0x7d, 0xa9, 0x40, 0xf4, 0x01, 0xbc, 0x12, 0xc6, 0x2c, 0xef, 0x58, 0xb6, 0xe9, 0x11, 0xa7, 0x67,
0xfa, 0x5a, 0x33, 0x73, 0x66, 0x88, 0xf9, 0x24, 0x59, 0x3a, 0x7b, 0x65, 0x50, 0xd0, 0x91, 0x31,
0x8c, 0x96, 0x4d, 0x52, 0x6b, 0x65, 0x8e, 0x8c, 0x31, 0xb5, 0x2c, 0x4c, 0xb5, 0x2b, 0x8b, 0x04,
0x99, 0xf0, 0x5a, 0x18, 0xbf, 0x64, 0xf4, 0x9f, 0x0f, 0x3c, 0x77, 0xcf, 0x31, 0x97, 0x5d, 0xdb,
0xf5, 0xb4, 0x36, 0xe3, 0x3f, 0x97, 0xcb, 0x9f, 0x90, 0x5f, 0x2b, 0xe1, 0x3c, 0x2a, 0xb4, 0x0c,
0xd3, 0x61, 0xd2, 0x13, 0xf2, 0x32, 0xd0, 0x20, 0x73, 0xfa, 0x8d, 0xa9, 0xa9, 0x10, 0x1d, 0x20,
0x65, 0x90, 0x4c, 0x42, 0x55, 0x42, 0x9b, 0x2a, 0x20, 0xa1, 0x42, 0x32, 0x09, 0x0d, 0xcb, 0x24,
0x74, 0xfa, 0xd5, 0x66, 0x0a, 0x48, 0xa8, 0x90, 0x4c, 0x42, 0xc3, 0x74, 0xaa, 0x8e, 0x6a, 0xea,
0xba, 0xcf, 0xa9, 0x3e, 0x69, 0xb3, 0x99, 0x53, 0xb5, 0xd4, 0x5a, 0x42, 0x90, 0x4e, 0xd5, 0x49,
0x30, 0x5d, 0xa0, 0x84, 0x71, 0x8b, 0xb6, 0x35, 0x70, 0xb4, 0x43, 0x23, 0x74, 0x99, 0xb2, 0x31,
0x29, 0xba, 0x40, 0x51, 0x60, 0xe8, 0xae, 0x30, 0xcb, 0x4d, 0x12, 0xac, 0x58, 0xfb, 0xda, 0xe1,
0xcc, 0x69, 0x28, 0x66, 0x59, 0xb1, 0xf6, 0x23, 0xbb, 0xe4, 0x10, 0xb9, 0x6a, 0xe1, 0x24, 0xa7,
0xbd, 0x5a, 0x50, 0xb5, 0x50, 0x50, 0xae, 0x5a, 0x18, 0x27, 0x57, 0xed, 0xa1, 0x11, 0x90, 0x97,
0xda, 0xeb, 0x05, 0x55, 0x63, 0x52, 0x72, 0xd5, 0x58, 0x04, 0x9d, 0xdd, 0xc2, 0x88, 0x67, 0xc4,
0x0b, 0xac, 0xbe, 0x61, 0xf3, 0xa6, 0x3a, 0x95, 0x39, 0x07, 0xc5, 0x7c, 0x8a, 0x34, 0x9d, 0xdd,
0x32, 0x69, 0xe4, 0x8a, 0x3f, 0x31, 0xb6, 0x6c, 0x82, 0xdd, 0x17, 0xda, 0xe9, 0x82, 0x8a, 0x87,
0x82, 0x72, 0xc5, 0xc3, 0x38, 0x79, 0x6c, 0xf9, 0xbc, 0x65, 0x0e, 0x48, 0xa0, 0x9d, 0x2b, 0x18,
0x5b, 0xb8, 0x98, 0x3c, 0xb6, 0xf0, 0x98, 0x68, 0x04, 0x58, 0x31, 0x02, 0x63, 0xdf, 0x22, 0x2f,
0x9e, 0x59, 0xe4, 0x05, 0x9d, 0xd8, 0x5f, 0x19, 0x31, 0x02, 0x84, 0xb2, 0x5d, 0x21, 0x1c, 0x8d,
0x00, 0x09, 0x92, 0x68, 0x04, 0x90, 0xe3, 0xc5, 0xb0, 0x7e, 0x64, 0xc4, 0x08, 0xa0, 0xf0, 0x47,
0x63, 0x7c, 0x1e, 0x15, 0x32, 0xe0, 0x68, 0x2a, 0xe9, 0xb1, 0x67, 0x12, 0x4f, 0x7b, 0x83, 0x65,
0x72, 0xb6, 0x38, 0x13, 0x26, 0xbe, 0x56, 0xc2, 0x39, 0x44, 0xa9, 0x2c, 0x36, 0xdd, 0x3d, 0xaf,
0x4f, 0x68, 0x3b, 0x9d, 0x1c, 0x27, 0x8b, 0x48, 0x3c, 0x95, 0x45, 0x94, 0x82, 0xf6, 0xe1, 0x8d,
0x28, 0x85, 0x66, 0xcc, 0x66, 0x51, 0x96, 0xbb, 0xd8, 0x58, 0x9c, 0x61, 0x39, 0x75, 0x47, 0xe7,
0x94, 0x44, 0xad, 0x95, 0xf0, 0x68, 0x5a, 0x74, 0x00, 0xc7, 0x15, 0x01, 0x3e, 0xcf, 0xcb, 0x19,
0x9f, 0x65, 0x19, 0x5f, 0x1c, 0x9d, 0x71, 0x0a, 0xb6, 0x56, 0xc2, 0x05, 0xc4, 0x68, 0x08, 0xc7,
0x94, 0xc6, 0x08, 0x0d, 0x5b, 0xa8, 0xc8, 0x4f, 0xb3, 0x7c, 0xcf, 0x8f, 0xce, 0x57, 0xc5, 0xac,
0x95, 0xf0, 0x28, 0x4a, 0x34, 0x00, 0x2d, 0x33, 0x99, 0xf6, 0xe4, 0x37, 0x32, 0x97, 0x3d, 0x39,
0xd9, 0xf1, 0xbe, 0xcc, 0x25, 0xcb, 0xd4, 0x7c, 0xd1, 0x9c, 0x3f, 0x33, 0xae, 0xe6, 0x47, 0xed,
0x98, 0x47, 0xa5, 0xf4, 0x1d, 0x4d, 0x7a, 0x62, 0x78, 0x03, 0x12, 0xf0, 0x86, 0xee, 0x99, 0xb4,
0x52, 0xdf, 0x1c, 0xa7, 0xef, 0x52, 0x30, 0xa5, 0xef, 0x32, 0x89, 0x91, 0x0f, 0x73, 0x8a, 0x44,
0xcf, 0x5f, 0x76, 0x6d, 0x9b, 0xf4, 0xc3, 0xd6, 0xfc, 0x59, 0x96, 0xf1, 0x85, 0xd1, 0x19, 0x27,
0x40, 0x6b, 0x25, 0x3c, 0x92, 0x34, 0x55, 0xdf, 0xc7, 0xb6, 0x99, 0xd0, 0x19, 0x6d, 0x2c, 0x5d,
0x4d, 0xc2, 0x52, 0xf5, 0x4d, 0x49, 0xa4, 0x74, 0x55, 0x92, 0xa0, 0xd5, 0x7d, 0x6d, 0x1c, 0x5d,
0x55, 0x31, 0x29, 0x5d, 0x55, 0x93, 0xe9, 0xec, 0xb6, 0xe7, 0x13, 0x8f, 0x71, 0xdc, 0x77, 0x2d,
0x47, 0x7b, 0x33, 0x73, 0x76, 0x7b, 0xea, 0x13, 0x4f, 0x64, 0x44, 0xa5, 0xe8, 0xec, 0xa6, 0xc0,
0x14, 0x9e, 0x87, 0x64, 0x3b, 0xd0, 0x4e, 0x14, 0xf1, 0x50, 0x29, 0x85, 0x87, 0x46, 0xd0, 0x99,
0x22, 0x8a, 0xd8, 0x24, 0xb4, 0x57, 0xb0, 0xe1, 0x0c, 0x88, 0xf6, 0x56, 0xe6, 0x4c, 0x21, 0xd1,
0x49, 0xc2, 0x74, 0xa6, 0xc8, 0x22, 0xa1, 0x3b, 0xff, 0x28, 0x9e, 0xae, 0xc8, 0x38, 0xf5, 0x7c,
0xe6, 0xce, 0x5f, 0xa2, 0x8e, 0x44, 0xe9, 0x1e, 0x24, 0x4d, 0x80, 0x3e, 0x03, 0xb5, 0xa1, 0xe5,
0x0c, 0x34, 0x93, 0x11, 0xbd, 0x92, 0x20, 0xda, 0xb0, 0x9c, 0xc1, 0x5a, 0x09, 0x33, 0x11, 0x74,
0x0b, 0x60, 0xe8, 0xb9, 0x7d, 0xe2, 0xfb, 0xeb, 0xe4, 0x85, 0x46, 0x18, 0x40, 0x4f, 0x02, 0xb8,
0x40, 0x77, 0x9d, 0xd0, 0x79, 0x59, 0x92, 0x47, 0xab, 0x30, 0x23, 0x42, 0xc2, 0xca, 0xb7, 0x33,
0x17, 0x7f, 0x21, 0x41, 0xec, 0x05, 0x52, 0x50, 0x74, 0xef, 0x23, 0x22, 0x56, 0x5c, 0x87, 0x68,
0x83, 0xcc, 0xbd, 0x4f, 0x48, 0x42, 0x45, 0xe8, 0x1a, 0x4b, 0x42, 0xa0, 0x25, 0x98, 0x0e, 0x76,
0x3c, 0x62, 0x98, 0x9b, 0x81, 0x11, 0xec, 0xf9, 0x9a, 0x93, 0xb9, 0x4c, 0xe3, 0x89, 0xdd, 0x27,
0x4c, 0x92, 0x2e, 0x41, 0x65, 0x0c, 0x5a, 0x87, 0x0e, 0xdd, 0x08, 0x3d, 0xb4, 0x76, 0xad, 0x00,
0x13, 0xa3, 0xbf, 0x43, 0x4c, 0xcd, 0xcd, 0xdc, 0x44, 0xd1, 0x65, 0x6f, 0x57, 0x96, 0xa3, 0xab,
0x95, 0x24, 0x16, 0xad, 0xc1, 0x2c, 0x8d, 0xdb, 0x1c, 0x1a, 0x7d, 0xf2, 0xd4, 0x37, 0x06, 0x44,
0x1b, 0x66, 0x6a, 0x20, 0x63, 0x8b, 0xa5, 0xe8, 0x62, 0x45, 0xc5, 0x85, 0x4c, 0x0f, 0xdd, 0xbe,
0x61, 0x73, 0xa6, 0xaf, 0xe5, 0x33, 0xc5, 0x52, 0x21, 0x53, 0x1c, 0xa3, 0xd4, 0x91, 0xb7, 0xbd,
0xa9, 0xed, 0x17, 0xd4, 0x51, 0xc8, 0x29, 0x75, 0x14, 0x71, 0x94, 0xcf, 0x71, 0x03, 0x6b, 0xdb,
0xea, 0x0b, 0xfb, 0x75, 0x4c, 0xcd, 0xcb, 0xe4, 0x5b, 0x97, 0xc4, 0xba, 0x9b, 0xdc, 0xb3, 0x94,
0xc2, 0xa2, 0x27, 0x80, 0xe4, 0x38, 0xa1, 0x54, 0x3e, 0x63, 0x9c, 0x1f, 0xc5, 0x18, 0x69, 0x56,
0x06, 0x9e, 0x96, 0x72, 0x68, 0x1c, 0xd0, 0xed, 0xed, 0x92, 0xe7, 0x1a, 0x66, 0xdf, 0xf0, 0x03,
0x2d, 0xc8, 0x2c, 0xe5, 0x06, 0x17, 0xeb, 0x46, 0x72, 0xb4, 0x94, 0x49, 0x2c, 0xe5, 0xdb, 0x25,
0xbb, 0x5b, 0xc4, 0xf3, 0x77, 0xac, 0xa1, 0x28, 0xe3, 0x5e, 0x26, 0xdf, 0xa3, 0x48, 0x2c, 0x2e,
0x61, 0x0a, 0x4b, 0x17, 0xe2, 0x3e, 0xed, 0xed, 0xcd, 0x03, 0xa7, 0xcf, 0x95, 0x51, 0x90, 0xbe,
0xc8, 0x5c, 0x88, 0x33, 0xcd, 0xe8, 0xc6, 0xc2, 0x31, 0x75, 0x36, 0x0d, 0x7a, 0x00, 0x87, 0x86,
0x97, 0x87, 0x0a, 0xf3, 0xcb, 0xcc, 0x85, 0xf3, 0xc6, 0xe5, 0x8d, 0x24, 0x65, 0x12, 0xb9, 0xd4,
0x84, 0xfa, 0xbe, 0x61, 0xef, 0x11, 0xfd, 0x4f, 0xea, 0xd0, 0x14, 0xfe, 0x58, 0x7d, 0x1d, 0x6a,
0xcc, 0x79, 0x7d, 0x04, 0xea, 0x96, 0x63, 0x92, 0x97, 0xcc, 0xef, 0x5d, 0xc7, 0x3c, 0x80, 0x2e,
0x41, 0x53, 0xf8, 0x67, 0x85, 0x47, 0x24, 0xcf, 0xdb, 0x1e, 0x8a, 0xe9, 0x1f, 0x42, 0x33, 0x74,
0x62, 0xcf, 0x41, 0x7b, 0xe8, 0xb9, 0x54, 0xf3, 0x7a, 0x26, 0xa3, 0x6d, 0xe3, 0x38, 0x02, 0xbd,
0x0b, 0x4d, 0x53, 0xb8, 0xc9, 0x39, 0xf5, 0x6b, 0x5d, 0x7e, 0xae, 0xd0, 0x0d, 0xcf, 0x15, 0xba,
0x9b, 0xec, 0x5c, 0x01, 0x87, 0x72, 0xfa, 0xb7, 0xca, 0xd0, 0xe0, 0xbe, 0x6c, 0x7d, 0x1f, 0x1a,
0xa2, 0x89, 0xae, 0x41, 0xa3, 0xcf, 0xe2, 0xb4, 0xa4, 0x1f, 0x5b, 0x29, 0xa1, 0x70, 0x8e, 0x63,
0x21, 0x4c, 0x61, 0x3e, 0x1f, 0x71, 0x2a, 0x23, 0x61, 0xbc, 0x05, 0xb1, 0x10, 0xfe, 0x1f, 0xcb,
0xf7, 0x3f, 0xcb, 0x30, 0xa3, 0xba, 0xc8, 0xe7, 0xa0, 0xdd, 0x8f, 0x9c, 0xee, 0xa2, 0x75, 0xfb,
0x92, 0x03, 0x1d, 0xfa, 0xb6, 0x45, 0x9c, 0x80, 0x79, 0x83, 0x2a, 0x99, 0x8b, 0x8c, 0x4c, 0x97,
0x7c, 0x77, 0x39, 0x82, 0x61, 0x89, 0x42, 0xff, 0x26, 0x40, 0x9c, 0x82, 0x4e, 0x44, 0xc3, 0xfe,
0xba, 0xb1, 0x1b, 0x66, 0x2f, 0x47, 0x49, 0x12, 0x1b, 0x46, 0xb0, 0x23, 0x4e, 0x72, 0xe4, 0x28,
0x74, 0x1e, 0x0e, 0xfb, 0xd6, 0xc0, 0x31, 0x82, 0x3d, 0x8f, 0x3c, 0x23, 0x9e, 0xb5, 0x6d, 0x11,
0x93, 0x39, 0xcf, 0x5a, 0x38, 0x9d, 0xa0, 0xff, 0x72, 0x1b, 0x1a, 0x7c, 0x39, 0xa7, 0xff, 0x7b,
0x25, 0xd2, 0x31, 0xfd, 0x2f, 0xcb, 0x50, 0xe7, 0x6e, 0xed, 0x59, 0xa8, 0x58, 0xa1, 0x9a, 0x55,
0x2c, 0x13, 0xdd, 0x93, 0xf5, 0xab, 0x9a, 0xb1, 0xd6, 0xc9, 0x72, 0xf3, 0x77, 0x1f, 0x90, 0x83,
0x67, 0xd4, 0x46, 0x22, 0xa5, 0x43, 0x47, 0xa1, 0xe1, 0xef, 0x6d, 0xf5, 0x4c, 0x5f, 0xab, 0x9e,
0xa8, 0x9e, 0x6b, 0x63, 0x11, 0xd2, 0xef, 0x43, 0x2b, 0x14, 0x46, 0x1d, 0xa8, 0x3e, 0x27, 0x07,
0x22, 0x73, 0xfa, 0x17, 0x9d, 0x17, 0xb6, 0x16, 0x99, 0x4d, 0x52, 0xb7, 0x79, 0x2e, 0xc2, 0x20,
0xbf, 0x02, 0x55, 0xba, 0x80, 0x4a, 0x56, 0x61, 0x72, 0x13, 0xc9, 0x2d, 0xed, 0x32, 0xd4, 0xf9,
0xd1, 0x42, 0x32, 0x0f, 0x04, 0xb5, 0xe7, 0xe4, 0x80, 0xb7, 0x51, 0x1b, 0xb3, 0xff, 0xb9, 0x24,
0x7f, 0x51, 0x85, 0x69, 0xd9, 0x9d, 0xaa, 0xaf, 0x42, 0x75, 0xd1, 0x4c, 0x37, 0xbd, 0x06, 0x4d,
0x63, 0x3b, 0x20, 0x5e, 0x74, 0x82, 0x17, 0x06, 0xe9, 0x28, 0xc3, 0xb8, 0x58, 0x3f, 0xb7, 0x31,
0x0f, 0xe8, 0x5d, 0x68, 0x08, 0x2f, 0x75, 0x92, 0x29, 0x92, 0xaf, 0xc8, 0xf2, 0xf7, 0xa1, 0x15,
0x39, 0x9d, 0x3f, 0x6e, 0xde, 0x1e, 0xb4, 0x22, 0xef, 0xf2, 0x11, 0xa8, 0x07, 0x6e, 0x60, 0xd8,
0x8c, 0xae, 0x8a, 0x79, 0x80, 0x1a, 0x9a, 0x43, 0x5e, 0x06, 0xcb, 0xd1, 0x28, 0x58, 0xc5, 0x71,
0x04, 0x1f, 0xe4, 0xc8, 0x3e, 0x4f, 0xad, 0xf2, 0xd4, 0x28, 0x22, 0xce, 0xb3, 0x26, 0xe7, 0x79,
0x00, 0x0d, 0xe1, 0x72, 0x8e, 0xd2, 0xcb, 0x52, 0x3a, 0x5a, 0x84, 0xfa, 0x80, 0xa6, 0x8b, 0x5e,
0x7f, 0x27, 0x31, 0x44, 0xf0, 0x95, 0xe4, 0xb2, 0xeb, 0x04, 0x54, 0x8d, 0xd5, 0x9d, 0x34, 0xe6,
0x48, 0xda, 0x85, 0x1e, 0x3f, 0x3f, 0xe0, 0x16, 0x25, 0x42, 0xfa, 0xef, 0x95, 0xa1, 0x1d, 0x1d,
0xd8, 0xe8, 0x1f, 0xe6, 0x19, 0xcf, 0x22, 0xcc, 0x78, 0x42, 0x8a, 0x8e, 0x0e, 0xa1, 0x09, 0x1d,
0x4b, 0x94, 0x04, 0x4b, 0x32, 0x58, 0x45, 0xe8, 0xb7, 0x72, 0x3b, 0x75, 0x1e, 0xa6, 0x43, 0xd1,
0x07, 0xb1, 0xea, 0x29, 0x71, 0xba, 0x1e, 0xa1, 0x3b, 0x50, 0xb5, 0x4c, 0x7e, 0x7e, 0xdc, 0xc6,
0xf4, 0xaf, 0xbe, 0x0d, 0xd3, 0xb2, 0xdb, 0x56, 0x7f, 0x96, 0x6d, 0x3d, 0x77, 0x68, 0x36, 0x92,
0x8b, 0xb8, 0x92, 0x58, 0x9b, 0x86, 0x55, 0x88, 0x45, 0xb0, 0x02, 0xd0, 0x5f, 0x83, 0x3a, 0x3f,
0x4c, 0x4a, 0x30, 0xeb, 0xbf, 0xd5, 0x87, 0x3a, 0xeb, 0x04, 0xfd, 0x0a, 0x37, 0x80, 0xf3, 0xd0,
0x60, 0x1b, 0xa3, 0xf0, 0x98, 0xfb, 0x48, 0x56, 0x8f, 0x61, 0x21, 0xa3, 0x2f, 0xc3, 0x94, 0xe4,
0xc6, 0xa7, 0x1a, 0xcb, 0x12, 0x22, 0x2d, 0x08, 0x83, 0x48, 0x87, 0x16, 0x9d, 0x2c, 0xc5, 0x00,
0x4a, 0xeb, 0x1f, 0x85, 0xf5, 0x53, 0xd0, 0x10, 0x1b, 0x3d, 0x5d, 0x1c, 0x5b, 0xf4, 0xa2, 0x56,
0x8a, 0xc2, 0xfa, 0x97, 0xa0, 0x1d, 0x79, 0xfb, 0xd1, 0x63, 0x98, 0x16, 0xde, 0x7e, 0xbe, 0x59,
0xa1, 0xc2, 0xb3, 0x05, 0xda, 0x45, 0x77, 0x26, 0xec, 0xc0, 0xa0, 0xfb, 0xe4, 0x60, 0x48, 0xb0,
0x42, 0xa0, 0xff, 0xe2, 0x39, 0xd6, 0xf2, 0xfa, 0x10, 0x5a, 0x91, 0x8b, 0x33, 0xd9, 0x0b, 0x0b,
0x7c, 0x68, 0xac, 0x14, 0xfa, 0xe7, 0x39, 0x9e, 0x0e, 0xc0, 0x6c, 0x04, 0xd5, 0x8f, 0x41, 0xf5,
0x01, 0x39, 0xa0, 0x16, 0xc2, 0x07, 0x52, 0x61, 0x21, 0x7c, 0xc0, 0xec, 0x41, 0x43, 0x1c, 0x35,
0x24, 0xf3, 0xbb, 0x08, 0x8d, 0x6d, 0x7e, 0x7a, 0x51, 0x30, 0x64, 0x0a, 0x31, 0xfd, 0x0e, 0x4c,
0xc9, 0x07, 0x0c, 0x49, 0xbe, 0x13, 0x30, 0xd5, 0x97, 0x8e, 0x30, 0x78, 0x37, 0xc8, 0x51, 0x3a,
0x51, 0xd5, 0x31, 0xc5, 0xb0, 0x9a, 0xa9, 0x87, 0x6f, 0x65, 0x36, 0xfb, 0x08, 0x6d, 0x7c, 0x00,
0x87, 0x92, 0x27, 0x09, 0xc9, 0x9c, 0xce, 0xc1, 0xa1, 0xad, 0xc4, 0xb9, 0x05, 0x1f, 0x03, 0x93,
0xd1, 0x7a, 0x0f, 0xea, 0xdc, 0xd3, 0x9b, 0xa4, 0xb8, 0x04, 0x75, 0x83, 0x79, 0x92, 0x29, 0x70,
0x56, 0xda, 0x4f, 0xca, 0xa5, 0x64, 0x50, 0xcc, 0x05, 0x75, 0x0b, 0x66, 0x54, 0xe7, 0x71, 0x92,
0x72, 0x0d, 0x66, 0xf6, 0x15, 0x27, 0x35, 0xa7, 0x9e, 0xcf, 0xa4, 0x56, 0xa8, 0xb0, 0x0a, 0xd4,
0x7f, 0xae, 0x01, 0x35, 0x76, 0xfa, 0x91, 0xcc, 0xe2, 0x3a, 0xd4, 0x02, 0xf2, 0x32, 0x5c, 0xa3,
0xce, 0x8f, 0x3c, 0x4a, 0xe1, 0x5b, 0x70, 0x26, 0x8f, 0x3e, 0x0b, 0x75, 0x3f, 0x38, 0xb0, 0xc3,
0x33, 0xbb, 0x93, 0xa3, 0x81, 0x9b, 0x54, 0x14, 0x73, 0x04, 0x85, 0x32, 0x5b, 0x10, 0xa7, 0x75,
0x05, 0x50, 0x66, 0x84, 0x98, 0x23, 0xd0, 0x1d, 0x68, 0xf6, 0x77, 0x48, 0xff, 0x39, 0x31, 0xc5,
0x31, 0xdd, 0xe9, 0xd1, 0xe0, 0x65, 0x2e, 0x8c, 0x43, 0x14, 0xcd, 0xbb, 0xcf, 0x7a, 0xb7, 0x31,
0x4e, 0xde, 0xac, 0xc7, 0x31, 0x47, 0xa0, 0x55, 0x68, 0x5b, 0x7d, 0xd7, 0x59, 0xdd, 0x75, 0xbf,
0x6a, 0x89, 0xf3, 0xb8, 0xb3, 0xa3, 0xe1, 0xbd, 0x50, 0x1c, 0xc7, 0xc8, 0x90, 0xa6, 0xb7, 0x4b,
0xb7, 0xb4, 0xad, 0x71, 0x69, 0x98, 0x38, 0x8e, 0x91, 0xfa, 0x9c, 0xe8, 0xcf, 0x6c, 0x23, 0xbf,
0x07, 0x75, 0xd6, 0xe4, 0xe8, 0x3d, 0x39, 0x79, 0x56, 0xca, 0x29, 0x77, 0xc4, 0x12, 0x5d, 0x15,
0xf1, 0xb0, 0xf6, 0x57, 0x79, 0xa6, 0xc6, 0xe1, 0x11, 0xfd, 0xc6, 0x79, 0xde, 0x84, 0xa6, 0xe8,
0x0a, 0xb5, 0xc0, 0xad, 0x50, 0xe0, 0x0d, 0xa8, 0x73, 0xc3, 0xcc, 0xae, 0xcf, 0x5b, 0xd0, 0x8e,
0x1a, 0x73, 0xb4, 0x08, 0x6b, 0x9d, 0x1c, 0x91, 0x5f, 0xaa, 0x40, 0x9d, 0x9f, 0x02, 0xa5, 0x87,
0x5a, 0xd9, 0x0a, 0x4e, 0x8e, 0x3e, 0x54, 0x92, 0xcd, 0xe0, 0x1e, 0xdb, 0xa8, 0xd1, 0x85, 0x79,
0x74, 0xab, 0xea, 0x5c, 0x01, 0x7a, 0x23, 0x94, 0xc7, 0x31, 0xb4, 0xa0, 0x3b, 0x1f, 0x43, 0x3b,
0x42, 0xa1, 0x25, 0xb5, 0x4b, 0xcf, 0x8f, 0xec, 0x8a, 0x64, 0x96, 0x82, 0xf0, 0xdb, 0x65, 0xa8,
0xae, 0x58, 0xfb, 0xa9, 0x76, 0xb8, 0x11, 0x5a, 0x75, 0xd1, 0x70, 0xb0, 0x62, 0xed, 0x2b, 0x46,
0xad, 0xaf, 0x86, 0x1a, 0x77, 0x4b, 0x2d, 0xde, 0x99, 0xd1, 0x2b, 0xb0, 0x98, 0x86, 0x17, 0xec,
0xd7, 0x9a, 0x50, 0x63, 0x07, 0xac, 0x59, 0xe3, 0xd4, 0xc1, 0xb0, 0xb8, 0x60, 0xcc, 0x85, 0xc3,
0x26, 0x5c, 0x26, 0xcf, 0xc7, 0x29, 0x23, 0x28, 0x1e, 0xa7, 0xb8, 0x47, 0x8a, 0x8a, 0x62, 0x8e,
0xa0, 0x59, 0xee, 0x5a, 0xbb, 0x44, 0x0c, 0x53, 0x05, 0x59, 0x3e, 0xb2, 0x76, 0x09, 0x66, 0xf2,
0x14, 0xb7, 0x63, 0xf8, 0x3b, 0x62, 0x84, 0x2a, 0xc0, 0xad, 0x19, 0xfe, 0x0e, 0x66, 0xf2, 0x14,
0xe7, 0xd0, 0x2d, 0x61, 0x63, 0x1c, 0x1c, 0xdd, 0x29, 0x62, 0x26, 0x4f, 0x71, 0xbe, 0xf5, 0x75,
0x22, 0xc6, 0xa4, 0x02, 0xdc, 0xa6, 0xf5, 0x75, 0x82, 0x99, 0x7c, 0x3c, 0x84, 0xb7, 0xc6, 0x6b,
0x1a, 0x69, 0x08, 0x7f, 0x02, 0xb3, 0x81, 0x72, 0x4c, 0x20, 0x4e, 0xf9, 0xcf, 0x17, 0xf4, 0x8b,
0x82, 0xc1, 0x09, 0x0e, 0x6a, 0x04, 0x6c, 0x03, 0x9c, 0x6d, 0x04, 0x6f, 0x40, 0xfd, 0xf3, 0x96,
0x19, 0xec, 0xa8, 0xc9, 0x75, 0x65, 0xc8, 0xa3, 0xdd, 0x36, 0xd1, 0x90, 0x27, 0xf7, 0x3a, 0xe7,
0x59, 0x81, 0x1a, 0x55, 0x9f, 0xc9, 0xf4, 0x38, 0xd6, 0xba, 0x8f, 0x35, 0x00, 0xcb, 0x0d, 0xcd,
0x79, 0xe6, 0xa0, 0x46, 0x35, 0x24, 0xa7, 0x49, 0xe6, 0xa0, 0x46, 0xf5, 0x2e, 0x3f, 0x95, 0xf6,
0xb6, 0x9a, 0x5a, 0x0d, 0x53, 0xcf, 0xc0, 0xac, 0xda, 0x1d, 0x39, 0x2c, 0x7f, 0xde, 0x84, 0x1a,
0xbb, 0xad, 0x90, 0xb4, 0xc8, 0x9f, 0x82, 0x19, 0xde, 0x7f, 0x4b, 0x62, 0x09, 0x5e, 0xc9, 0xbc,
0xac, 0xa4, 0xde, 0x81, 0x10, 0x2a, 0x20, 0x20, 0x58, 0x65, 0x18, 0x7f, 0x51, 0xc1, 0xa8, 0x14,
0x8d, 0xbc, 0x15, 0x2d, 0x5e, 0x6b, 0x05, 0x57, 0x65, 0x18, 0x96, 0x2f, 0x81, 0xc3, 0x95, 0x2c,
0x5a, 0x82, 0x16, 0x9d, 0x5a, 0x69, 0x73, 0x09, 0xb3, 0x3d, 0x33, 0x1a, 0xdf, 0x13, 0xd2, 0x38,
0xc2, 0xd1, 0x89, 0xbd, 0x6f, 0x78, 0x26, 0x2b, 0x95, 0xb0, 0xe1, 0xb3, 0xa3, 0x49, 0x96, 0x43,
0x71, 0x1c, 0x23, 0xd1, 0x03, 0x98, 0x32, 0x49, 0xe4, 0x27, 0x10, 0x46, 0xfd, 0x99, 0xd1, 0x44,
0x2b, 0x31, 0x00, 0xcb, 0x68, 0x5a, 0xa6, 0x70, 0x6f, 0xe8, 0x17, 0x2e, 0x36, 0x18, 0x55, 0x7c,
0x25, 0x31, 0x46, 0xea, 0xa7, 0x61, 0x46, 0xe9, 0xb7, 0x4f, 0x74, 0xd5, 0x21, 0xf7, 0x25, 0xe7,
0x59, 0x88, 0xb6, 0x28, 0x17, 0xd4, 0x65, 0x47, 0xee, 0x8e, 0x44, 0x00, 0x1f, 0x42, 0x2b, 0xec,
0x18, 0x74, 0x57, 0x2d, 0xc3, 0xdb, 0xc5, 0x65, 0x88, 0xfa, 0x54, 0xb0, 0xad, 0x43, 0x3b, 0xea,
0x21, 0xb4, 0xa8, 0xd2, 0xbd, 0x53, 0x4c, 0x17, 0xf7, 0xae, 0xe0, 0xc3, 0x30, 0x25, 0x75, 0x14,
0x5a, 0x56, 0x19, 0x2f, 0x14, 0x33, 0xca, 0xdd, 0x1c, 0xaf, 0x7a, 0xa2, 0x1e, 0x93, 0x7b, 0xa5,
0x1a, 0xf7, 0xca, 0x1f, 0x37, 0xa1, 0x15, 0xdd, 0x10, 0xca, 0xd8, 0x63, 0xee, 0x79, 0x76, 0xe1,
0x1e, 0x33, 0xc4, 0x77, 0x9f, 0x7a, 0x36, 0xa6, 0x08, 0xda, 0xc5, 0x81, 0x15, 0x44, 0xa6, 0x7a,
0xb6, 0x18, 0xfa, 0x84, 0x8a, 0x63, 0x8e, 0x42, 0x8f, 0x55, 0x2d, 0xaf, 0x8d, 0x38, 0x41, 0x56,
0x48, 0x72, 0x35, 0xbd, 0x07, 0x6d, 0x8b, 0x2e, 0xfd, 0xd6, 0xe2, 0x99, 0xf7, 0x9d, 0x62, 0xba,
0x5e, 0x08, 0xc1, 0x31, 0x9a, 0x96, 0x6d, 0xdb, 0xd8, 0xa7, 0x76, 0xcd, 0xc8, 0x1a, 0xe3, 0x96,
0xed, 0x5e, 0x0c, 0xc2, 0x32, 0x03, 0xba, 0x29, 0xd6, 0x2e, 0xcd, 0x82, 0x91, 0x25, 0x6e, 0xaa,
0x78, 0xfd, 0xf2, 0x41, 0x6a, 0xa6, 0xe5, 0x66, 0x7c, 0x69, 0x0c, 0x96, 0x91, 0xb3, 0x2d, 0xed,
0x41, 0xbe, 0x32, 0x6a, 0x8f, 0xdb, 0x83, 0xf2, 0xea, 0x48, 0x3f, 0x06, 0xd5, 0xa7, 0x9e, 0x9d,
0x3f, 0x57, 0xb3, 0xee, 0xce, 0x49, 0x3e, 0xa9, 0x5a, 0x42, 0xfe, 0x82, 0x3e, 0xea, 0x93, 0x5c,
0x1e, 0xa9, 0xd1, 0x73, 0x84, 0xde, 0x13, 0x13, 0xfa, 0x35, 0xd5, 0xde, 0xde, 0x4c, 0xd8, 0x1b,
0xb5, 0xb0, 0x0d, 0x8f, 0xf0, 0x4b, 0x12, 0xd2, 0x4c, 0x3e, 0xee, 0x3c, 0x79, 0x3f, 0x5c, 0x7f,
0x4c, 0x34, 0x52, 0x24, 0xdb, 0x96, 0x73, 0xfd, 0x42, 0x19, 0x5a, 0xd1, 0x05, 0xb0, 0xb4, 0x77,
0xbe, 0x65, 0xf9, 0x6b, 0xc4, 0x30, 0x89, 0x27, 0xec, 0xf6, 0xed, 0xc2, 0x9b, 0x65, 0xdd, 0x9e,
0x40, 0xe0, 0x08, 0xab, 0x9f, 0x80, 0x56, 0x18, 0x9b, 0xb3, 0x29, 0xfb, 0x7e, 0x05, 0x1a, 0xe2,
0xea, 0x58, 0xb2, 0x10, 0xb7, 0xa1, 0x61, 0x1b, 0x07, 0xee, 0x5e, 0xb8, 0x65, 0x3a, 0x53, 0x70,
0x1b, 0xad, 0xfb, 0x90, 0x49, 0x63, 0x81, 0x42, 0x9f, 0x83, 0xba, 0x6d, 0xed, 0x5a, 0x81, 0x18,
0x3e, 0x4e, 0x17, 0xc2, 0xd9, 0x21, 0x33, 0xc7, 0xd0, 0xcc, 0xd9, 0x8d, 0x91, 0xf0, 0xbe, 0x6f,
0x61, 0xe6, 0xcf, 0x98, 0x34, 0x16, 0x28, 0xfd, 0x3e, 0x34, 0x78, 0x71, 0x26, 0x9b, 0x24, 0xd4,
0x9a, 0xc4, 0x9a, 0xce, 0xca, 0x96, 0xb3, 0x2a, 0x3d, 0x0e, 0x0d, 0x9e, 0x79, 0x8e, 0xd6, 0x7c,
0xef, 0x75, 0xb6, 0xdf, 0xb1, 0xf5, 0x87, 0xf1, 0xe1, 0xdf, 0xc7, 0x3f, 0xcb, 0xd0, 0x9f, 0xc0,
0xa1, 0x15, 0x23, 0x30, 0xb6, 0x0c, 0x9f, 0x60, 0xd2, 0x77, 0x3d, 0x33, 0x93, 0xd5, 0xe3, 0x49,
0xc2, 0x43, 0x9d, 0xcf, 0x2a, 0xe4, 0x3e, 0x75, 0x1d, 0xfe, 0xef, 0x71, 0x1d, 0xfe, 0x69, 0x2d,
0xc7, 0x9f, 0x37, 0x8e, 0x27, 0x83, 0x2a, 0x5c, 0xca, 0xa1, 0x77, 0x53, 0x5d, 0x7b, 0x9f, 0x2a,
0x40, 0x2a, 0x8b, 0xef, 0x9b, 0xaa, 0x47, 0xaf, 0x08, 0xab, 0xb8, 0xf4, 0xee, 0x26, 0x5d, 0x7a,
0x67, 0x0a, 0xd0, 0x29, 0x9f, 0xde, 0x4d, 0xd5, 0xa7, 0x57, 0x94, 0xbb, 0xec, 0xd4, 0xfb, 0x7f,
0xe6, 0x46, 0xfb, 0x8d, 0x1c, 0xb7, 0xcf, 0x67, 0x55, 0xb7, 0xcf, 0x08, 0xad, 0xf9, 0x49, 0xf9,
0x7d, 0x7e, 0xb3, 0x91, 0xe3, 0xf7, 0x59, 0x50, 0xfc, 0x3e, 0x23, 0x4a, 0x96, 0x74, 0xfc, 0xdc,
0x54, 0x1d, 0x3f, 0xa7, 0x0a, 0x90, 0x8a, 0xe7, 0x67, 0x41, 0xf1, 0xfc, 0x14, 0x65, 0x2a, 0xb9,
0x7e, 0x16, 0x14, 0xd7, 0x4f, 0x11, 0x50, 0xf2, 0xfd, 0x2c, 0x28, 0xbe, 0x9f, 0x22, 0xa0, 0xe4,
0xfc, 0x59, 0x50, 0x9c, 0x3f, 0x45, 0x40, 0xc9, 0xfb, 0x73, 0x53, 0xf5, 0xfe, 0x14, 0xb7, 0x8f,
0xd4, 0xe9, 0x9f, 0x3a, 0x6a, 0xfe, 0x1b, 0x1d, 0x35, 0xbf, 0x5a, 0xcd, 0x71, 0xc0, 0xe0, 0x6c,
0x07, 0xcc, 0xf9, 0xfc, 0x9e, 0x2c, 0xf6, 0xc0, 0x8c, 0x3f, 0x0b, 0xa4, 0x5d, 0x30, 0xef, 0x25,
0x5c, 0x30, 0xa7, 0x0b, 0xc0, 0xaa, 0x0f, 0xe6, 0xff, 0x8c, 0x93, 0xe1, 0x0f, 0x1a, 0x23, 0xf6,
0xd3, 0x37, 0xe4, 0xfd, 0xf4, 0x88, 0x99, 0x2c, 0xbd, 0xa1, 0xbe, 0xad, 0x6e, 0xa8, 0xcf, 0x8d,
0x81, 0x55, 0x76, 0xd4, 0x1b, 0x59, 0x3b, 0xea, 0xee, 0x18, 0x2c, 0xb9, 0x5b, 0xea, 0xfb, 0xe9,
0x2d, 0xf5, 0xf9, 0x31, 0xf8, 0x32, 0xf7, 0xd4, 0x1b, 0x59, 0x7b, 0xea, 0x71, 0x4a, 0x97, 0xbb,
0xa9, 0xfe, 0x9c, 0xb2, 0xa9, 0x3e, 0x3b, 0x4e, 0x73, 0xc5, 0x93, 0xc3, 0x17, 0x72, 0x76, 0xd5,
0xef, 0x8e, 0x43, 0x33, 0xda, 0x89, 0xfd, 0xe9, 0xbe, 0x58, 0xcd, 0xe6, 0xf7, 0xdf, 0x84, 0x56,
0x78, 0xd1, 0x46, 0xff, 0x1a, 0x34, 0xc3, 0xf7, 0x42, 0x49, 0xcb, 0x39, 0x1a, 0x6d, 0xea, 0xf8,
0xea, 0x59, 0x84, 0xd0, 0x6d, 0xa8, 0xd1, 0x7f, 0xc2, 0x2c, 0xde, 0x1e, 0xef, 0x42, 0x0f, 0xcd,
0x04, 0x33, 0x9c, 0xfe, 0xa3, 0x23, 0x00, 0xd2, 0x33, 0x8a, 0x71, 0xb3, 0x7d, 0x9f, 0x0e, 0x66,
0x76, 0x40, 0x3c, 0x76, 0x91, 0xab, 0xf0, 0x99, 0x41, 0x9c, 0x03, 0xd5, 0x96, 0x80, 0x78, 0x58,
0xc0, 0xd1, 0x23, 0x68, 0x85, 0x8e, 0x54, 0xad, 0xc6, 0xa8, 0xde, 0x1d, 0x9b, 0x2a, 0x74, 0xed,
0xe1, 0x88, 0x02, 0x2d, 0x42, 0xcd, 0x77, 0xbd, 0x40, 0xab, 0x33, 0xaa, 0x0b, 0x63, 0x53, 0x6d,
0xba, 0x5e, 0x80, 0x19, 0x94, 0x57, 0x4d, 0x7a, 0xa5, 0x3a, 0x49, 0xd5, 0x94, 0x11, 0xfb, 0xdf,
0xaa, 0xd1, 0x18, 0xba, 0x2c, 0xac, 0x91, 0xeb, 0xd0, 0xc5, 0xf1, 0x7b, 0x49, 0xb6, 0x4a, 0x24,
0x16, 0x41, 0xbc, 0x27, 0xf8, 0xfa, 0xe6, 0x6d, 0xe8, 0xf4, 0xdd, 0x7d, 0xe2, 0xe1, 0xf8, 0x8a,
0x93, 0xb8, 0x85, 0x96, 0x8a, 0x47, 0x3a, 0xb4, 0x76, 0x2c, 0x93, 0xf4, 0xfa, 0x62, 0xfc, 0x6b,
0xe1, 0x28, 0x8c, 0x1e, 0x40, 0x8b, 0xf9, 0xd8, 0x43, 0x0f, 0xff, 0x64, 0x85, 0xe4, 0xae, 0xfe,
0x90, 0x80, 0x66, 0xc4, 0x32, 0xbf, 0x67, 0x05, 0xac, 0x0d, 0x5b, 0x38, 0x0a, 0xd3, 0x02, 0xb3,
0x7b, 0x64, 0x72, 0x81, 0x9b, 0xbc, 0xc0, 0xc9, 0x78, 0x74, 0x15, 0x5e, 0x65, 0x71, 0x89, 0x2d,
0x26, 0x77, 0xd5, 0xb7, 0x70, 0x76, 0x22, 0xbb, 0x37, 0x67, 0x0c, 0xf8, 0x9d, 0x74, 0xe6, 0xbc,
0xab, 0xe3, 0x38, 0x02, 0x9d, 0x87, 0xc3, 0x26, 0xd9, 0x36, 0xf6, 0xec, 0xe0, 0x09, 0xd9, 0x1d,
0xda, 0x46, 0x40, 0x7a, 0x26, 0x7b, 0x28, 0xdb, 0xc6, 0xe9, 0x04, 0x74, 0x09, 0x5e, 0x11, 0x91,
0xdc, 0x8c, 0x69, 0x6f, 0xf4, 0x4c, 0xf6, 0x6e, 0xb4, 0x8d, 0xb3, 0x92, 0xf4, 0xef, 0xd5, 0x68,
0xa7, 0x33, 0xd5, 0x7e, 0x1f, 0xaa, 0x86, 0x69, 0x8a, 0x69, 0xf3, 0xca, 0x84, 0x06, 0x22, 0xde,
0x82, 0x53, 0x06, 0xb4, 0x11, 0x5d, 0xb9, 0xe3, 0x13, 0xe7, 0xf5, 0x49, 0xb9, 0xa2, 0xf7, 0xfb,
0x82, 0x87, 0x32, 0xee, 0xf1, 0x4b, 0xdf, 0xd5, 0x1f, 0x8f, 0x31, 0xba, 0x0b, 0x2e, 0x78, 0xd0,
0x7d, 0xa8, 0xb1, 0x12, 0xf2, 0x89, 0xf5, 0xea, 0xa4, 0x7c, 0x8f, 0x78, 0xf9, 0x18, 0x87, 0xde,
0xe7, 0x77, 0xdf, 0xa4, 0x0b, 0x97, 0x65, 0xf5, 0xc2, 0xe5, 0x12, 0xd4, 0xad, 0x80, 0xec, 0xa6,
0xef, 0xdf, 0x8e, 0x54, 0x55, 0x31, 0xf2, 0x70, 0xe8, 0xc8, 0x7b, 0x80, 0x1f, 0x46, 0x77, 0xb1,
0x93, 0xe3, 0xe1, 0x5d, 0xa8, 0x51, 0x78, 0x6a, 0x2d, 0x39, 0x4e, 0xc6, 0x0c, 0xa9, 0x5f, 0x86,
0x1a, 0xad, 0xec, 0x88, 0xda, 0x89, 0xf2, 0x54, 0xa2, 0xf2, 0x2c, 0x4d, 0x41, 0xdb, 0x1d, 0x12,
0x8f, 0x19, 0x86, 0xfe, 0xaf, 0x35, 0xe9, 0x52, 0x5c, 0x4f, 0xd6, 0xb1, 0x6b, 0x13, 0x8f, 0x9c,
0xb2, 0x96, 0xe1, 0x84, 0x96, 0xdd, 0x98, 0x9c, 0x2d, 0xa5, 0x67, 0x38, 0xa1, 0x67, 0x3f, 0x06,
0x67, 0x4a, 0xd3, 0x1e, 0x2a, 0x9a, 0x76, 0x7d, 0x72, 0x46, 0x45, 0xd7, 0x48, 0x91, 0xae, 0xad,
0xa8, 0xba, 0xd6, 0x1d, 0xaf, 0xcb, 0xa3, 0xa9, 0x69, 0x0c, 0x6d, 0xfb, 0x52, 0xae, 0xb6, 0x2d,
0x29, 0xda, 0x36, 0x69, 0xd6, 0x9f, 0x90, 0xbe, 0xfd, 0x63, 0x0d, 0x6a, 0x74, 0x7a, 0x44, 0xab,
0xb2, 0xae, 0xbd, 0x3b, 0xd1, 0xd4, 0x2a, 0xeb, 0xd9, 0x7a, 0x42, 0xcf, 0xae, 0x4e, 0xc6, 0x94,
0xd2, 0xb1, 0xf5, 0x84, 0x8e, 0x4d, 0xc8, 0x97, 0xd2, 0xaf, 0x35, 0x45, 0xbf, 0x2e, 0x4f, 0xc6,
0xa6, 0xe8, 0x96, 0x51, 0xa4, 0x5b, 0x77, 0x55, 0xdd, 0x1a, 0x73, 0xf5, 0xc6, 0xd6, 0x2a, 0x63,
0xe8, 0xd5, 0x07, 0xb9, 0x7a, 0x75, 0x5b, 0xd1, 0xab, 0x49, 0xb2, 0xfd, 0x84, 0x74, 0xea, 0x2a,
0x5f, 0x74, 0x8a, 0x7b, 0xc6, 0x63, 0x2e, 0x3a, 0xf5, 0x6b, 0xd0, 0x8e, 0xdf, 0xa1, 0x67, 0x5c,
0xcf, 0xe7, 0x62, 0x61, 0xae, 0x61, 0x50, 0xbf, 0x02, 0xed, 0xf8, 0x6d, 0x79, 0x46, 0x5e, 0x3e,
0x4b, 0x14, 0x28, 0x11, 0xd2, 0x57, 0xe1, 0x70, 0xfa, 0xe5, 0x6b, 0x86, 0x1f, 0x5e, 0xba, 0x5b,
0x1e, 0x3e, 0x45, 0x91, 0xa2, 0xf4, 0x17, 0x30, 0x9b, 0x78, 0xcb, 0x3a, 0x31, 0x07, 0xba, 0x22,
0x2d, 0x91, 0xab, 0x62, 0x0f, 0x9e, 0x7d, 0x5b, 0x3e, 0x5e, 0x08, 0xeb, 0x2b, 0x30, 0x5b, 0x50,
0xf8, 0x71, 0x2e, 0xcb, 0x7f, 0x05, 0xa6, 0x46, 0x95, 0xfd, 0x13, 0xb8, 0xcc, 0x1f, 0x40, 0x27,
0xf5, 0x0e, 0x3f, 0x99, 0xcd, 0x06, 0xc0, 0x20, 0x92, 0x11, 0x4a, 0x7b, 0x69, 0x82, 0xa7, 0x0b,
0x0c, 0x87, 0x25, 0x0e, 0xfd, 0x77, 0xcb, 0x70, 0x38, 0xfd, 0x08, 0x7f, 0xdc, 0xcd, 0x8f, 0x06,
0x4d, 0xc6, 0x15, 0xbd, 0xf8, 0x08, 0x83, 0xe8, 0x11, 0x4c, 0xfb, 0xb6, 0xd5, 0x27, 0xcb, 0x3b,
0x86, 0x33, 0x20, 0xbe, 0xd8, 0xd1, 0x14, 0x3c, 0xa4, 0xdf, 0x8c, 0x11, 0x58, 0x81, 0xeb, 0x2f,
0x60, 0x4a, 0x4a, 0x44, 0xb7, 0xa0, 0xe2, 0x0e, 0x53, 0xf7, 0x1a, 0xf3, 0x39, 0x1f, 0x87, 0xf6,
0x86, 0x2b, 0xee, 0x30, 0x6d, 0x92, 0xb2, 0xf9, 0x56, 0x15, 0xf3, 0xd5, 0x1f, 0xc0, 0xe1, 0xf4,
0x3b, 0xf7, 0x64, 0xf3, 0x9c, 0x49, 0x79, 0x09, 0x78, 0x33, 0x25, 0xb7, 0xfc, 0x0b, 0x70, 0x28,
0xf9, 0x7a, 0x3d, 0xe3, 0x35, 0x4e, 0xfc, 0xa8, 0x29, 0x74, 0xd7, 0xcf, 0xff, 0x4a, 0x19, 0x66,
0xd5, 0x8a, 0xa0, 0xa3, 0x80, 0xd4, 0x98, 0x75, 0xd7, 0x21, 0x9d, 0x12, 0x7a, 0x15, 0x0e, 0xab,
0xf1, 0x8b, 0xa6, 0xd9, 0x29, 0xa7, 0xc5, 0xe9, 0xb0, 0xd5, 0xa9, 0x20, 0x0d, 0x8e, 0x24, 0x5a,
0x88, 0x0d, 0xa2, 0x9d, 0x2a, 0x7a, 0x1d, 0x5e, 0x4d, 0xa6, 0x0c, 0x6d, 0xa3, 0x4f, 0x3a, 0x35,
0xfd, 0x87, 0x15, 0xa8, 0x3d, 0xf5, 0x89, 0xa7, 0xff, 0x4b, 0x25, 0x7c, 0xa5, 0x71, 0x03, 0x6a,
0xec, 0x61, 0xb9, 0xf4, 0x9a, 0xb1, 0x9c, 0x78, 0xcd, 0xa8, 0xbc, 0x88, 0x8b, 0x5f, 0x33, 0xde,
0x80, 0x1a, 0x7b, 0x4a, 0x3e, 0x39, 0xf2, 0xe7, 0xcb, 0xd0, 0x8e, 0x9f, 0x75, 0x4f, 0x8c, 0x97,
0x5f, 0x85, 0x54, 0xd4, 0x57, 0x21, 0x6f, 0x43, 0xdd, 0x63, 0xef, 0x37, 0xf8, 0x28, 0x93, 0x7c,
0x6b, 0xc2, 0x32, 0xc4, 0x5c, 0x44, 0x27, 0x30, 0x25, 0x3f, 0x5a, 0x9f, 0xbc, 0x18, 0xa7, 0xc4,
0x17, 0x6b, 0x7a, 0xa6, 0xbf, 0xe8, 0x79, 0xc6, 0x81, 0x50, 0x4c, 0x35, 0x52, 0x9f, 0x83, 0xda,
0x86, 0xe5, 0x0c, 0xb2, 0x1f, 0x91, 0xea, 0xdf, 0x29, 0x43, 0x53, 0x5c, 0xde, 0xd5, 0x17, 0xa0,
0xba, 0x4e, 0x5e, 0xd0, 0x82, 0x88, 0x6b, 0xc3, 0xa9, 0x82, 0x3c, 0x62, 0xb5, 0x10, 0xf2, 0x38,
0x14, 0xd3, 0x6f, 0x46, 0xd3, 0xe4, 0xe4, 0xd8, 0x1b, 0x50, 0x63, 0x6f, 0xcd, 0x27, 0x47, 0xfe,
0x76, 0x0b, 0x1a, 0xfc, 0x25, 0xa6, 0xfe, 0xed, 0x16, 0x34, 0xf8, 0xfb, 0x73, 0x74, 0x1b, 0x9a,
0xfe, 0xde, 0xee, 0xae, 0xe1, 0x1d, 0x68, 0xd9, 0x1f, 0x3b, 0x54, 0x9e, 0xab, 0x77, 0x37, 0xb9,
0x2c, 0x0e, 0x41, 0xe8, 0x1a, 0xd4, 0xfa, 0xc6, 0x36, 0x49, 0x1d, 0xe7, 0x66, 0x81, 0x97, 0x8d,
0x6d, 0x82, 0x99, 0x38, 0xba, 0x0b, 0x2d, 0xd1, 0x2d, 0xbe, 0xf0, 0xe7, 0x8c, 0xce, 0x37, 0xec,
0xcc, 0x08, 0xa5, 0xdf, 0x87, 0xa6, 0x28, 0x0c, 0xba, 0x13, 0xbd, 0x43, 0x4d, 0x7a, 0x9e, 0x33,
0xab, 0x10, 0x3d, 0x4c, 0x8e, 0x5e, 0xa4, 0xfe, 0x55, 0x05, 0x6a, 0xb4, 0x70, 0x1f, 0x9b, 0x09,
0x1d, 0x07, 0xb0, 0x0d, 0x3f, 0xd8, 0xd8, 0xb3, 0x6d, 0x62, 0x8a, 0x17, 0x76, 0x52, 0x0c, 0x3a,
0x07, 0x87, 0x78, 0xc8, 0xdf, 0xd9, 0xdc, 0xeb, 0xf7, 0x49, 0xf4, 0x4c, 0x34, 0x19, 0x8d, 0x16,
0xa1, 0xce, 0xbe, 0x88, 0x26, 0x56, 0x85, 0xef, 0x14, 0xb6, 0x6c, 0x77, 0xc3, 0x72, 0x44, 0x69,
0x38, 0x52, 0x77, 0xa1, 0x1d, 0xc5, 0x51, 0x23, 0x1c, 0x5a, 0x8e, 0x63, 0x39, 0x03, 0xa1, 0xd1,
0x61, 0x90, 0x4e, 0x3a, 0xf4, 0xaf, 0x28, 0x6f, 0x1d, 0x8b, 0x10, 0x8d, 0xdf, 0x36, 0x2c, 0x5b,
0x14, 0xb1, 0x8e, 0x45, 0x88, 0x32, 0xed, 0x89, 0x57, 0xfb, 0x35, 0x56, 0xc1, 0x30, 0xa8, 0x7f,
0x54, 0x8e, 0x1e, 0x63, 0x67, 0x3d, 0xce, 0x4c, 0xf9, 0x92, 0xe6, 0x64, 0x87, 0x36, 0x9f, 0x10,
0x24, 0x17, 0xf5, 0x51, 0x68, 0xb8, 0x8e, 0x6d, 0x39, 0x44, 0xf8, 0x8e, 0x44, 0x28, 0xd1, 0xc6,
0xf5, 0x54, 0x1b, 0x8b, 0xf4, 0x55, 0xd3, 0xa2, 0x45, 0x6c, 0xc4, 0xe9, 0x3c, 0x06, 0xbd, 0x07,
0x4d, 0x93, 0xec, 0x5b, 0x7d, 0xe2, 0x6b, 0x4d, 0xa6, 0x7a, 0x27, 0x47, 0xb6, 0xed, 0x0a, 0x93,
0xc5, 0x21, 0x46, 0x0f, 0xa0, 0xc1, 0xa3, 0xa2, 0x2a, 0x95, 0xa5, 0x2a, 0xc5, 0x85, 0xae, 0x8c,
0x28, 0x74, 0xb5, 0xa0, 0xd0, 0xb5, 0x64, 0xa1, 0xe7, 0x4d, 0x80, 0x58, 0xdd, 0xd0, 0x14, 0x34,
0x9f, 0x3a, 0xcf, 0x1d, 0xf7, 0x85, 0xd3, 0x29, 0xd1, 0xc0, 0xe3, 0xed, 0x6d, 0x9a, 0x4b, 0xa7,
0x4c, 0x03, 0x54, 0xce, 0x72, 0x06, 0x9d, 0x0a, 0x02, 0x68, 0xd0, 0x00, 0x31, 0x3b, 0x55, 0xfa,
0xff, 0x1e, 0xeb, 0xbf, 0x4e, 0x0d, 0xbd, 0x06, 0xaf, 0xf4, 0x9c, 0xbe, 0xbb, 0x3b, 0x34, 0x02,
0x6b, 0xcb, 0x26, 0xcf, 0x88, 0xe7, 0x5b, 0xae, 0xd3, 0xa9, 0xeb, 0xff, 0x51, 0xe6, 0xa7, 0xbe,
0xfa, 0x5d, 0x98, 0x56, 0x3e, 0x23, 0xa1, 0x41, 0x93, 0xbd, 0xea, 0x8f, 0xd7, 0xdd, 0x22, 0xc8,
0xb4, 0x84, 0x3f, 0x8b, 0x17, 0x4b, 0x16, 0x1e, 0xd2, 0xef, 0x01, 0x48, 0x1f, 0x8f, 0x38, 0x0e,
0xb0, 0x75, 0x10, 0x10, 0x9f, 0x7f, 0x38, 0x82, 0x52, 0xd4, 0xb0, 0x14, 0x23, 0xf3, 0x57, 0x14,
0x7e, 0xfd, 0x3a, 0x80, 0xf4, 0xe9, 0x08, 0x6a, 0x3f, 0x34, 0xb4, 0x94, 0x24, 0x4b, 0x46, 0xeb,
0x5d, 0x51, 0x83, 0xf0, 0x23, 0x11, 0x61, 0x09, 0xb8, 0x97, 0x4e, 0x2e, 0x01, 0x8b, 0xd1, 0x57,
0x01, 0xe2, 0xef, 0x24, 0xe8, 0x0b, 0xd1, 0x10, 0x7d, 0x01, 0x6a, 0xa6, 0x11, 0x18, 0x62, 0x74,
0x7c, 0x3d, 0x31, 0x43, 0xc5, 0x10, 0xcc, 0xc4, 0xf4, 0xdf, 0x29, 0xc3, 0xb4, 0xfc, 0x4d, 0x08,
0xfd, 0x7d, 0xa8, 0xb1, 0x8f, 0x4a, 0xdc, 0x81, 0x69, 0xf9, 0xa3, 0x10, 0xa9, 0x6f, 0xf2, 0x72,
0x3e, 0x19, 0x8a, 0x15, 0x80, 0xde, 0x8b, 0x8a, 0xf4, 0xb1, 0xa9, 0x2e, 0x41, 0x53, 0x7c, 0x63,
0x42, 0x3f, 0x0d, 0xed, 0xf8, 0x93, 0x12, 0x74, 0x8c, 0xe0, 0xf1, 0x61, 0x2f, 0x8b, 0xa0, 0xfe,
0x4f, 0x55, 0xa8, 0xb3, 0xee, 0xd4, 0xbf, 0x55, 0x91, 0x35, 0x51, 0xff, 0x61, 0x39, 0x77, 0xcf,
0x77, 0x45, 0xf9, 0x3c, 0xc0, 0x6c, 0xea, 0x53, 0x2a, 0xe2, 0x0b, 0x12, 0xea, 0x00, 0x7a, 0x1d,
0x9a, 0x0e, 0x09, 0x5e, 0xb8, 0xde, 0x73, 0x66, 0x24, 0xb3, 0xe9, 0xcf, 0xa7, 0x30, 0xd4, 0x3a,
0x97, 0xc1, 0xa1, 0x30, 0xba, 0x0a, 0x75, 0xe2, 0x79, 0xae, 0xc7, 0x4c, 0x67, 0x36, 0xf5, 0x51,
0x92, 0xf8, 0x6b, 0x15, 0xab, 0x54, 0x0a, 0x73, 0x61, 0x74, 0x15, 0x5e, 0xf5, 0xb9, 0xb5, 0xf0,
0xb5, 0xa3, 0x2f, 0xde, 0x4f, 0x8b, 0x51, 0x25, 0x3b, 0x71, 0xfe, 0xb3, 0xe1, 0x44, 0x2a, 0x19,
0x58, 0x49, 0xb6, 0xbc, 0x32, 0x6a, 0x43, 0x9d, 0x65, 0xd4, 0xa9, 0xc8, 0xe6, 0x59, 0x9d, 0xbf,
0x02, 0x4d, 0x51, 0x74, 0x1a, 0xbf, 0xc8, 0xcb, 0xd8, 0x29, 0xa1, 0x69, 0x68, 0x6d, 0x12, 0x7b,
0x7b, 0xcd, 0xf5, 0x83, 0x4e, 0x19, 0xcd, 0x40, 0x9b, 0xe9, 0xfc, 0x63, 0xc7, 0x3e, 0xe8, 0x54,
0xe6, 0x3f, 0x80, 0x76, 0x54, 0x72, 0xd4, 0x82, 0xda, 0xfa, 0x9e, 0x6d, 0x77, 0x4a, 0x6c, 0xa9,
0x19, 0xb8, 0x5e, 0xe8, 0x68, 0x5e, 0x7d, 0x49, 0xe7, 0x8d, 0x4e, 0x39, 0xcf, 0xba, 0x2b, 0xa8,
0x03, 0xd3, 0x22, 0x73, 0x5e, 0xb6, 0xaa, 0xfe, 0x0f, 0x65, 0x68, 0x47, 0x9f, 0xdb, 0xa0, 0xeb,
0xbc, 0xb0, 0x2f, 0xf3, 0xed, 0x7d, 0x21, 0xd1, 0xab, 0xf9, 0x5f, 0xef, 0x48, 0xf4, 0xec, 0x19,
0x98, 0x15, 0x43, 0x68, 0xd8, 0xc8, 0x7c, 0x14, 0x4c, 0xc4, 0xce, 0xdf, 0x8c, 0x5a, 0xb7, 0xc3,
0x4c, 0x69, 0xd9, 0x75, 0x1c, 0xd2, 0x0f, 0x58, 0x1b, 0x1f, 0x82, 0xa9, 0x75, 0x37, 0xd8, 0x70,
0x7d, 0x9f, 0xd6, 0x8c, 0xb7, 0x54, 0x9c, 0x5e, 0x99, 0xff, 0x06, 0xcc, 0x60, 0xe2, 0x0f, 0x5d,
0xc7, 0x27, 0x3f, 0xa9, 0xcf, 0x76, 0xe7, 0x7e, 0x80, 0x7b, 0xfe, 0x3b, 0x55, 0xa8, 0xb3, 0xb5,
0x97, 0xfe, 0x47, 0xd5, 0x68, 0x95, 0x98, 0x71, 0x33, 0x2f, 0xbe, 0x3f, 0x23, 0xdb, 0x84, 0xb2,
0x6a, 0x93, 0x0f, 0x61, 0x2e, 0xcb, 0xf7, 0x66, 0x64, 0x7b, 0x50, 0x11, 0xca, 0x7d, 0x99, 0xcf,
0x41, 0x6b, 0xe8, 0xb9, 0x03, 0x8f, 0x2e, 0x0f, 0x6b, 0x89, 0x8f, 0xac, 0xa8, 0xb0, 0x0d, 0x21,
0x86, 0x23, 0x80, 0xbe, 0x0e, 0xad, 0x30, 0x36, 0xe7, 0x33, 0x02, 0x08, 0x6a, 0xa6, 0x2b, 0xa6,
0xb8, 0x2a, 0x66, 0xff, 0x69, 0xbb, 0x88, 0x16, 0x0c, 0xb7, 0x76, 0x22, 0x38, 0xff, 0x65, 0x71,
0xae, 0x39, 0x03, 0xed, 0x15, 0xcf, 0x1d, 0xb2, 0xf7, 0xe2, 0x9d, 0x12, 0xb5, 0x9d, 0xde, 0xee,
0xd0, 0xf5, 0xa8, 0xc2, 0x03, 0x34, 0x56, 0x5f, 0xb2, 0xff, 0x15, 0x66, 0x0a, 0xc6, 0x3e, 0xa1,
0x62, 0x9d, 0x2a, 0x42, 0x30, 0x8b, 0x09, 0x3b, 0xcb, 0x11, 0x0b, 0x8b, 0x4e, 0x8d, 0x12, 0x3d,
0xb2, 0x06, 0x7c, 0xb3, 0xd4, 0xa9, 0xcf, 0x2f, 0x86, 0xf7, 0x57, 0xa8, 0x69, 0xf0, 0xcd, 0xd9,
0x14, 0x34, 0xf1, 0x1e, 0x5b, 0xdd, 0x74, 0xca, 0x34, 0x9a, 0x2e, 0x99, 0x39, 0xf5, 0xb2, 0xe1,
0xf4, 0x89, 0xcd, 0x66, 0xc4, 0xc8, 0x46, 0x6b, 0x4b, 0x73, 0x7f, 0xfd, 0xd1, 0xf1, 0xf2, 0x77,
0x3f, 0x3a, 0x5e, 0xfe, 0xfe, 0x47, 0xc7, 0xcb, 0xbf, 0xfe, 0x83, 0xe3, 0xa5, 0xef, 0xfe, 0xe0,
0x78, 0xe9, 0x9f, 0x7f, 0x70, 0xbc, 0xf4, 0x61, 0x65, 0xb8, 0xb5, 0xd5, 0x60, 0x17, 0x0f, 0xae,
0xfc, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd4, 0xa1, 0x21, 0xc1, 0x74, 0x5e, 0x00, 0x00,
0x18, 0x86, 0x0d, 0x1f, 0xac, 0x93, 0x61, 0xc0, 0x30, 0xe0, 0x15, 0x96, 0x6f, 0xbe, 0x49, 0x18,
0x5d, 0x7c, 0xf1, 0x41, 0x16, 0x20, 0xf8, 0x64, 0x18, 0xb1, 0x64, 0x66, 0x44, 0x2e, 0x95, 0x55,
0x9a, 0x91, 0x17, 0x78, 0x4e, 0x55, 0x11, 0xf1, 0xff, 0x8b, 0xe5, 0xff, 0x1f, 0xf1, 0xe3, 0x47,
0x44, 0xc2, 0xd1, 0xe1, 0xd6, 0xc5, 0xa1, 0xe7, 0x06, 0xae, 0x7f, 0x91, 0xec, 0x13, 0x27, 0xf0,
0xbb, 0x2c, 0x85, 0x9a, 0x86, 0x73, 0x10, 0x1c, 0x0c, 0x89, 0x7e, 0x6a, 0xf8, 0x7c, 0x70, 0xd1,
0xb6, 0xb6, 0x2e, 0x0e, 0xb7, 0x2e, 0xee, 0xba, 0x26, 0xb1, 0x43, 0x72, 0x96, 0x10, 0xe4, 0xfa,
0xdc, 0xc0, 0x75, 0x07, 0x36, 0xe1, 0x65, 0x5b, 0x7b, 0xdb, 0x17, 0xfd, 0xc0, 0xdb, 0xeb, 0x07,
0xbc, 0x74, 0xfe, 0x9f, 0xfe, 0xbc, 0x0c, 0xf5, 0x55, 0x0a, 0x8f, 0x2e, 0x43, 0x6b, 0x97, 0xf8,
0xbe, 0x31, 0x20, 0xbe, 0x56, 0x3e, 0x51, 0x3d, 0x37, 0x75, 0xf9, 0x68, 0x57, 0x54, 0xd5, 0x65,
0x14, 0xdd, 0x47, 0xbc, 0x18, 0x47, 0x74, 0x68, 0x0e, 0xda, 0x7d, 0xd7, 0x09, 0xc8, 0xcb, 0xa0,
0x67, 0x6a, 0x95, 0x13, 0xe5, 0x73, 0x6d, 0x1c, 0x67, 0xa0, 0xab, 0xd0, 0xb6, 0x1c, 0x2b, 0xb0,
0x8c, 0xc0, 0xf5, 0xb4, 0xea, 0x89, 0xb2, 0x02, 0xc9, 0x1a, 0xd9, 0x5d, 0xec, 0xf7, 0xdd, 0x3d,
0x27, 0xc0, 0x31, 0x21, 0xd2, 0xa0, 0x19, 0x78, 0x46, 0x9f, 0xf4, 0x4c, 0xad, 0xc6, 0x10, 0xc3,
0xa4, 0xfe, 0xa3, 0x0b, 0xd0, 0x14, 0x6d, 0x40, 0x77, 0x60, 0xca, 0xe0, 0xbc, 0x9b, 0x3b, 0xee,
0x0b, 0xad, 0xcc, 0xd0, 0x8f, 0x25, 0x1a, 0x2c, 0xd0, 0xbb, 0x94, 0x64, 0xad, 0x84, 0x65, 0x0e,
0xd4, 0x83, 0x59, 0x91, 0x5c, 0x21, 0x81, 0x61, 0xd9, 0xbe, 0xf6, 0xb7, 0x1c, 0xe4, 0x78, 0x0e,
0x88, 0x20, 0x5b, 0x2b, 0xe1, 0x04, 0x23, 0xfa, 0x02, 0xbc, 0x22, 0x72, 0x96, 0x5d, 0x67, 0xdb,
0x1a, 0x3c, 0x1d, 0x9a, 0x46, 0x40, 0xb4, 0xbf, 0xe3, 0x78, 0xa7, 0x72, 0xf0, 0x38, 0x6d, 0x97,
0x13, 0xaf, 0x95, 0x70, 0x16, 0x06, 0xba, 0x07, 0x33, 0x22, 0x5b, 0x80, 0xfe, 0x3d, 0x07, 0x7d,
0x23, 0x07, 0x34, 0x42, 0x53, 0xd9, 0xd0, 0x17, 0xe1, 0x88, 0xc8, 0x78, 0x68, 0x39, 0xcf, 0x97,
0x77, 0x0c, 0xdb, 0x26, 0xce, 0x80, 0x68, 0xff, 0x30, 0xba, 0x8d, 0x0a, 0xf1, 0x5a, 0x09, 0x67,
0x82, 0xa0, 0xc7, 0xd0, 0x71, 0xb7, 0xbe, 0x4a, 0xfa, 0xe1, 0x80, 0x6c, 0x92, 0x40, 0xeb, 0x30,
0xdc, 0xb7, 0x12, 0xb8, 0x8f, 0x19, 0x59, 0x38, 0x94, 0xdd, 0x4d, 0x12, 0xac, 0x95, 0x70, 0x8a,
0x19, 0x3d, 0x05, 0xa4, 0xe4, 0x2d, 0xee, 0x12, 0xc7, 0xd4, 0x2e, 0x33, 0xc8, 0x93, 0xa3, 0x21,
0x19, 0xe9, 0x5a, 0x09, 0x67, 0x00, 0xa4, 0x60, 0x9f, 0x3a, 0x3e, 0x09, 0xb4, 0x2b, 0xe3, 0xc0,
0x32, 0xd2, 0x14, 0x2c, 0xcb, 0xa5, 0x63, 0xcb, 0x73, 0x31, 0xb1, 0x8d, 0xc0, 0x72, 0x1d, 0xd1,
0xde, 0xab, 0x0c, 0xf8, 0x74, 0x36, 0x70, 0x44, 0x1b, 0xb5, 0x38, 0x13, 0x04, 0x7d, 0x19, 0x5e,
0x4d, 0xe4, 0x63, 0xb2, 0xeb, 0xee, 0x13, 0xed, 0x1a, 0x43, 0x3f, 0x53, 0x84, 0xce, 0xa9, 0xd7,
0x4a, 0x38, 0x1b, 0x06, 0x2d, 0xc1, 0x74, 0x58, 0xc0, 0x60, 0xaf, 0x33, 0xd8, 0xb9, 0x3c, 0x58,
0x01, 0xa6, 0xf0, 0x50, 0x5b, 0xe4, 0xe9, 0x65, 0xdb, 0xf5, 0x89, 0xb6, 0x98, 0x69, 0x8b, 0x02,
0x82, 0x91, 0x50, 0x5b, 0x94, 0x38, 0xe4, 0x4e, 0xfa, 0x81, 0x67, 0xf5, 0x59, 0x03, 0xa9, 0x16,
0x2d, 0x8c, 0xee, 0x64, 0x4c, 0x2c, 0x54, 0x29, 0x1b, 0x06, 0x61, 0x38, 0xe4, 0xef, 0x6d, 0xf9,
0x7d, 0xcf, 0x1a, 0xd2, 0xbc, 0x45, 0xd3, 0xd4, 0x6e, 0x8d, 0x42, 0xde, 0x94, 0x88, 0xbb, 0x8b,
0x26, 0x95, 0x4e, 0x12, 0x00, 0x7d, 0x11, 0x90, 0x9c, 0x25, 0x86, 0xef, 0x3d, 0x06, 0xfb, 0x99,
0x31, 0x60, 0xa3, 0xb1, 0xcc, 0x80, 0x41, 0x06, 0x1c, 0x91, 0x73, 0x37, 0x5c, 0xdf, 0xa2, 0xbf,
0xda, 0x6d, 0x06, 0xff, 0xce, 0x18, 0xf0, 0x21, 0x0b, 0x55, 0xac, 0x2c, 0xa8, 0x64, 0x15, 0xcb,
0xd4, 0xac, 0x89, 0xe7, 0x6b, 0x77, 0xc6, 0xae, 0x22, 0x64, 0x49, 0x56, 0x11, 0xe6, 0x27, 0x87,
0xe8, 0x7d, 0xcf, 0xdd, 0x1b, 0xfa, 0xda, 0xdd, 0xb1, 0x87, 0x88, 0x33, 0x24, 0x87, 0x88, 0xe7,
0xa2, 0xeb, 0xd0, 0xda, 0xb2, 0xdd, 0xfe, 0x73, 0x2a, 0xcc, 0x0a, 0x83, 0xd4, 0x12, 0x90, 0x4b,
0xb4, 0x58, 0x88, 0x2f, 0xa2, 0xa5, 0xca, 0xca, 0xfe, 0xaf, 0x10, 0x9b, 0x04, 0x44, 0x2c, 0x4b,
0xc7, 0x32, 0x59, 0x39, 0x09, 0x55, 0x56, 0x89, 0x03, 0xad, 0xc0, 0xd4, 0xb6, 0x65, 0x13, 0xff,
0xe9, 0xd0, 0x76, 0x0d, 0xbe, 0x46, 0x4d, 0x5d, 0x3e, 0x91, 0x09, 0x70, 0x2f, 0xa6, 0xa3, 0x28,
0x12, 0x1b, 0xba, 0x0d, 0xed, 0x5d, 0xc3, 0x7b, 0xee, 0xf7, 0x9c, 0x6d, 0x57, 0xab, 0x67, 0x2e,
0x3c, 0x1c, 0xe3, 0x51, 0x48, 0xb5, 0x56, 0xc2, 0x31, 0x0b, 0x5d, 0xbe, 0x58, 0xa3, 0x36, 0x49,
0x70, 0xcf, 0x22, 0xb6, 0xe9, 0x6b, 0x0d, 0x06, 0xf2, 0x66, 0x26, 0xc8, 0x26, 0x09, 0xba, 0x9c,
0x8c, 0x2e, 0x5f, 0x2a, 0x23, 0xfa, 0x00, 0x5e, 0x09, 0x73, 0x96, 0x77, 0x2c, 0xdb, 0xf4, 0x88,
0xd3, 0x33, 0x7d, 0xad, 0x99, 0xb9, 0x32, 0xc4, 0x78, 0x12, 0x2d, 0x5d, 0xbd, 0x32, 0x20, 0xe8,
0xcc, 0x18, 0x66, 0xcb, 0x26, 0xa9, 0xb5, 0x32, 0x67, 0xc6, 0x18, 0x5a, 0x26, 0xa6, 0xda, 0x95,
0x05, 0x82, 0x4c, 0x78, 0x2d, 0xcc, 0x5f, 0x32, 0xfa, 0xcf, 0x07, 0x9e, 0xbb, 0xe7, 0x98, 0xcb,
0xae, 0xed, 0x7a, 0x5a, 0x9b, 0xe1, 0x9f, 0xcb, 0xc5, 0x4f, 0xd0, 0xaf, 0x95, 0x70, 0x1e, 0x14,
0x5a, 0x86, 0xe9, 0xb0, 0xe8, 0x09, 0x79, 0x19, 0x68, 0x90, 0xb9, 0xfc, 0xc6, 0xd0, 0x94, 0x88,
0x4e, 0x90, 0x32, 0x93, 0x0c, 0x42, 0x55, 0x42, 0x9b, 0x2a, 0x00, 0xa1, 0x44, 0x32, 0x08, 0x4d,
0xcb, 0x20, 0x74, 0xf9, 0xd5, 0x66, 0x0a, 0x40, 0x28, 0x91, 0x0c, 0x42, 0xd3, 0x74, 0xa9, 0x8e,
0x7a, 0xea, 0xba, 0xcf, 0xa9, 0x3e, 0x69, 0xb3, 0x99, 0x4b, 0xb5, 0x34, 0x5a, 0x82, 0x90, 0x2e,
0xd5, 0x49, 0x66, 0xea, 0xa0, 0x84, 0x79, 0x8b, 0xb6, 0x35, 0x70, 0xb4, 0x43, 0x23, 0x74, 0x99,
0xa2, 0x31, 0x2a, 0xea, 0xa0, 0x28, 0x6c, 0xe8, 0xae, 0x30, 0xcb, 0x4d, 0x12, 0xac, 0x58, 0xfb,
0xda, 0xe1, 0xcc, 0x65, 0x28, 0x46, 0x59, 0xb1, 0xf6, 0x23, 0xbb, 0xe4, 0x2c, 0x72, 0xd7, 0xc2,
0x45, 0x4e, 0x7b, 0xb5, 0xa0, 0x6b, 0x21, 0xa1, 0xdc, 0xb5, 0x30, 0x4f, 0xee, 0xda, 0x43, 0x23,
0x20, 0x2f, 0xb5, 0xd7, 0x0b, 0xba, 0xc6, 0xa8, 0xe4, 0xae, 0xb1, 0x0c, 0xba, 0xba, 0x85, 0x19,
0xcf, 0x88, 0x17, 0x58, 0x7d, 0xc3, 0xe6, 0x43, 0x75, 0x2a, 0x73, 0x0d, 0x8a, 0xf1, 0x14, 0x6a,
0xba, 0xba, 0x65, 0xc2, 0xc8, 0x1d, 0x7f, 0x62, 0x6c, 0xd9, 0x04, 0xbb, 0x2f, 0xb4, 0xd3, 0x05,
0x1d, 0x0f, 0x09, 0xe5, 0x8e, 0x87, 0x79, 0xf2, 0xdc, 0xf2, 0x79, 0xcb, 0x1c, 0x90, 0x40, 0x3b,
0x57, 0x30, 0xb7, 0x70, 0x32, 0x79, 0x6e, 0xe1, 0x39, 0xd1, 0x0c, 0xb0, 0x62, 0x04, 0xc6, 0xbe,
0x45, 0x5e, 0x3c, 0xb3, 0xc8, 0x0b, 0xba, 0xb0, 0xbf, 0x32, 0x62, 0x06, 0x08, 0x69, 0xbb, 0x82,
0x38, 0x9a, 0x01, 0x12, 0x20, 0xd1, 0x0c, 0x20, 0xe7, 0x8b, 0x69, 0xfd, 0xc8, 0x88, 0x19, 0x40,
0xc1, 0x8f, 0xe6, 0xf8, 0x3c, 0x28, 0x64, 0xc0, 0xd1, 0x54, 0xd1, 0x63, 0xcf, 0x24, 0x9e, 0xf6,
0x06, 0xab, 0xe4, 0x6c, 0x71, 0x25, 0x8c, 0x7c, 0xad, 0x84, 0x73, 0x80, 0x52, 0x55, 0x6c, 0xba,
0x7b, 0x5e, 0x9f, 0xd0, 0x71, 0x3a, 0x39, 0x4e, 0x15, 0x11, 0x79, 0xaa, 0x8a, 0xa8, 0x04, 0xed,
0xc3, 0x1b, 0x51, 0x09, 0xad, 0x98, 0xad, 0xa2, 0xac, 0x76, 0xb1, 0xb1, 0x38, 0xc3, 0x6a, 0xea,
0x8e, 0xae, 0x29, 0xc9, 0xb5, 0x56, 0xc2, 0xa3, 0x61, 0xd1, 0x01, 0x1c, 0x57, 0x08, 0xf8, 0x3a,
0x2f, 0x57, 0x7c, 0x96, 0x55, 0x7c, 0x71, 0x74, 0xc5, 0x29, 0xb6, 0xb5, 0x12, 0x2e, 0x00, 0x46,
0x43, 0x38, 0xa6, 0x0c, 0x46, 0x68, 0xd8, 0x42, 0x45, 0x7e, 0x96, 0xd5, 0x7b, 0x7e, 0x74, 0xbd,
0x2a, 0xcf, 0x5a, 0x09, 0x8f, 0x82, 0x44, 0x03, 0xd0, 0x32, 0x8b, 0xa9, 0x24, 0xbf, 0x91, 0xe9,
0xf6, 0xe4, 0x54, 0xc7, 0x65, 0x99, 0x0b, 0x96, 0xa9, 0xf9, 0x62, 0x38, 0x7f, 0x6e, 0x5c, 0xcd,
0x8f, 0xc6, 0x31, 0x0f, 0x4a, 0x91, 0x1d, 0x2d, 0x7a, 0x62, 0x78, 0x03, 0x12, 0xf0, 0x81, 0xee,
0x99, 0xb4, 0x53, 0xdf, 0x1c, 0x47, 0x76, 0x29, 0x36, 0x45, 0x76, 0x99, 0xc0, 0xc8, 0x87, 0x39,
0x85, 0xa2, 0xe7, 0x2f, 0xbb, 0xb6, 0x4d, 0xfa, 0xe1, 0x68, 0xfe, 0x3c, 0xab, 0xf8, 0xc2, 0xe8,
0x8a, 0x13, 0x4c, 0x6b, 0x25, 0x3c, 0x12, 0x34, 0xd5, 0xdf, 0xc7, 0xb6, 0x99, 0xd0, 0x19, 0x6d,
0x2c, 0x5d, 0x4d, 0xb2, 0xa5, 0xfa, 0x9b, 0xa2, 0x48, 0xe9, 0xaa, 0x44, 0x41, 0xbb, 0xfb, 0xda,
0x38, 0xba, 0xaa, 0xf2, 0xa4, 0x74, 0x55, 0x2d, 0xa6, 0xab, 0xdb, 0x9e, 0x4f, 0x3c, 0x86, 0x71,
0xdf, 0xb5, 0x1c, 0xed, 0xcd, 0xcc, 0xd5, 0xed, 0xa9, 0x4f, 0x3c, 0x51, 0x11, 0xa5, 0xa2, 0xab,
0x9b, 0xc2, 0xa6, 0xe0, 0x3c, 0x24, 0xdb, 0x81, 0x76, 0xa2, 0x08, 0x87, 0x52, 0x29, 0x38, 0x34,
0x83, 0xae, 0x14, 0x51, 0xc6, 0x26, 0xa1, 0x52, 0xc1, 0x86, 0x33, 0x20, 0xda, 0x5b, 0x99, 0x2b,
0x85, 0x04, 0x27, 0x11, 0xd3, 0x95, 0x22, 0x0b, 0x84, 0xee, 0xfc, 0xa3, 0x7c, 0xea, 0x91, 0x71,
0xe8, 0xf9, 0xcc, 0x9d, 0xbf, 0x04, 0x1d, 0x91, 0xd2, 0x3d, 0x48, 0x1a, 0x00, 0x7d, 0x06, 0x6a,
0x43, 0xcb, 0x19, 0x68, 0x26, 0x03, 0x7a, 0x25, 0x01, 0xb4, 0x61, 0x39, 0x83, 0xb5, 0x12, 0x66,
0x24, 0xe8, 0x16, 0xc0, 0xd0, 0x73, 0xfb, 0xc4, 0xf7, 0xd7, 0xc9, 0x0b, 0x8d, 0x30, 0x06, 0x3d,
0xc9, 0xc0, 0x09, 0xba, 0xeb, 0x84, 0xae, 0xcb, 0x12, 0x3d, 0x5a, 0x85, 0x19, 0x91, 0x12, 0x56,
0xbe, 0x9d, 0xe9, 0xfc, 0x85, 0x00, 0x71, 0x14, 0x48, 0xe1, 0xa2, 0x7b, 0x1f, 0x91, 0xb1, 0xe2,
0x3a, 0x44, 0x1b, 0x64, 0xee, 0x7d, 0x42, 0x10, 0x4a, 0x42, 0x7d, 0x2c, 0x89, 0x03, 0x2d, 0xc1,
0x74, 0xb0, 0xe3, 0x11, 0xc3, 0xdc, 0x0c, 0x8c, 0x60, 0xcf, 0xd7, 0x9c, 0x4c, 0x37, 0x8d, 0x17,
0x76, 0x9f, 0x30, 0x4a, 0xea, 0x82, 0xca, 0x3c, 0x68, 0x1d, 0x3a, 0x74, 0x23, 0xf4, 0xd0, 0xda,
0xb5, 0x02, 0x4c, 0x8c, 0xfe, 0x0e, 0x31, 0x35, 0x37, 0x73, 0x13, 0x45, 0xdd, 0xde, 0xae, 0x4c,
0x47, 0xbd, 0x95, 0x24, 0x2f, 0x5a, 0x83, 0x59, 0x9a, 0xb7, 0x39, 0x34, 0xfa, 0xe4, 0xa9, 0x6f,
0x0c, 0x88, 0x36, 0xcc, 0xd4, 0x40, 0x86, 0x16, 0x53, 0x51, 0x67, 0x45, 0xe5, 0x0b, 0x91, 0x1e,
0xba, 0x7d, 0xc3, 0xe6, 0x48, 0x5f, 0xcb, 0x47, 0x8a, 0xa9, 0x42, 0xa4, 0x38, 0x47, 0xe9, 0x23,
0x1f, 0x7b, 0x53, 0xdb, 0x2f, 0xe8, 0xa3, 0xa0, 0x53, 0xfa, 0x28, 0xf2, 0x28, 0x9e, 0xe3, 0x06,
0xd6, 0xb6, 0xd5, 0x17, 0xf6, 0xeb, 0x98, 0x9a, 0x97, 0x89, 0xb7, 0x2e, 0x91, 0x75, 0x37, 0x79,
0x64, 0x29, 0xc5, 0x8b, 0x9e, 0x00, 0x92, 0xf3, 0x84, 0x52, 0xf9, 0x0c, 0x71, 0x7e, 0x14, 0x62,
0xa4, 0x59, 0x19, 0xfc, 0xb4, 0x95, 0x43, 0xe3, 0x80, 0x6e, 0x6f, 0x97, 0x3c, 0xd7, 0x30, 0xfb,
0x86, 0x1f, 0x68, 0x41, 0x66, 0x2b, 0x37, 0x38, 0x59, 0x37, 0xa2, 0xa3, 0xad, 0x4c, 0xf2, 0x52,
0xbc, 0x5d, 0xb2, 0xbb, 0x45, 0x3c, 0x7f, 0xc7, 0x1a, 0x8a, 0x36, 0xee, 0x65, 0xe2, 0x3d, 0x8a,
0xc8, 0xe2, 0x16, 0xa6, 0x78, 0xa9, 0x23, 0xee, 0x53, 0x69, 0x6f, 0x1e, 0x38, 0x7d, 0xae, 0x8c,
0x02, 0xf4, 0x45, 0xa6, 0x23, 0xce, 0x34, 0xa3, 0x1b, 0x13, 0xc7, 0xd0, 0xd9, 0x30, 0xe8, 0x01,
0x1c, 0x1a, 0x5e, 0x1e, 0x2a, 0xc8, 0x2f, 0x33, 0x1d, 0xe7, 0x8d, 0xcb, 0x1b, 0x49, 0xc8, 0x24,
0xe7, 0x52, 0x13, 0xea, 0xfb, 0x86, 0xbd, 0x47, 0xf4, 0x3f, 0xad, 0x43, 0x53, 0xc4, 0x63, 0xf5,
0x75, 0xa8, 0xb1, 0xe0, 0xf5, 0x11, 0xa8, 0x5b, 0x8e, 0x49, 0x5e, 0xb2, 0xb8, 0x77, 0x1d, 0xf3,
0x04, 0xba, 0x04, 0x4d, 0x11, 0x9f, 0x15, 0x11, 0x91, 0xbc, 0x68, 0x7b, 0x48, 0xa6, 0x7f, 0x08,
0xcd, 0x30, 0x88, 0x3d, 0x07, 0xed, 0xa1, 0xe7, 0x52, 0xcd, 0xeb, 0x99, 0x0c, 0xb6, 0x8d, 0xe3,
0x0c, 0xf4, 0x2e, 0x34, 0x4d, 0x11, 0x26, 0xe7, 0xd0, 0xaf, 0x75, 0xf9, 0xb9, 0x42, 0x37, 0x3c,
0x57, 0xe8, 0x6e, 0xb2, 0x73, 0x05, 0x1c, 0xd2, 0xe9, 0xdf, 0x2a, 0x43, 0x83, 0xc7, 0xb2, 0xf5,
0x7d, 0x68, 0x88, 0x21, 0xba, 0x06, 0x8d, 0x3e, 0xcb, 0xd3, 0x92, 0x71, 0x6c, 0xa5, 0x85, 0x22,
0x38, 0x8e, 0x05, 0x31, 0x65, 0xf3, 0xf9, 0x8c, 0x53, 0x19, 0xc9, 0xc6, 0x47, 0x10, 0x0b, 0xe2,
0xff, 0xb1, 0x7a, 0xff, 0xb3, 0x0c, 0x33, 0x6a, 0x88, 0x7c, 0x0e, 0xda, 0xfd, 0x28, 0xe8, 0x2e,
0x46, 0xb7, 0x2f, 0x05, 0xd0, 0xa1, 0x6f, 0x5b, 0xc4, 0x09, 0x58, 0x34, 0xa8, 0x92, 0xe9, 0x64,
0x64, 0x86, 0xe4, 0xbb, 0xcb, 0x11, 0x1b, 0x96, 0x20, 0xf4, 0x6f, 0x02, 0xc4, 0x25, 0xe8, 0x44,
0x34, 0xed, 0xaf, 0x1b, 0xbb, 0x61, 0xf5, 0x72, 0x96, 0x44, 0xb1, 0x61, 0x04, 0x3b, 0xe2, 0x24,
0x47, 0xce, 0x42, 0xe7, 0xe1, 0xb0, 0x6f, 0x0d, 0x1c, 0x23, 0xd8, 0xf3, 0xc8, 0x33, 0xe2, 0x59,
0xdb, 0x16, 0x31, 0x59, 0xf0, 0xac, 0x85, 0xd3, 0x05, 0xfa, 0xaf, 0xb6, 0xa1, 0xc1, 0xdd, 0x39,
0xfd, 0xc7, 0x95, 0x48, 0xc7, 0xf4, 0xbf, 0x2a, 0x43, 0x9d, 0x87, 0xb5, 0x67, 0xa1, 0x62, 0x85,
0x6a, 0x56, 0xb1, 0x4c, 0x74, 0x4f, 0xd6, 0xaf, 0x6a, 0x86, 0xaf, 0x93, 0x15, 0xe6, 0xef, 0x3e,
0x20, 0x07, 0xcf, 0xa8, 0x8d, 0x44, 0x4a, 0x87, 0x8e, 0x42, 0xc3, 0xdf, 0xdb, 0xea, 0x99, 0xbe,
0x56, 0x3d, 0x51, 0x3d, 0xd7, 0xc6, 0x22, 0xa5, 0xdf, 0x87, 0x56, 0x48, 0x8c, 0x3a, 0x50, 0x7d,
0x4e, 0x0e, 0x44, 0xe5, 0xf4, 0x2f, 0x3a, 0x2f, 0x6c, 0x2d, 0x32, 0x9b, 0xa4, 0x6e, 0xf3, 0x5a,
0x84, 0x41, 0x7e, 0x05, 0xaa, 0xd4, 0x81, 0x4a, 0x76, 0x61, 0x72, 0x13, 0xc9, 0x6d, 0xed, 0x32,
0xd4, 0xf9, 0xd1, 0x42, 0xb2, 0x0e, 0x04, 0xb5, 0xe7, 0xe4, 0x80, 0x8f, 0x51, 0x1b, 0xb3, 0xff,
0xb9, 0x20, 0x7f, 0x59, 0x85, 0x69, 0x39, 0x9c, 0xaa, 0xaf, 0x42, 0x75, 0xd1, 0x4c, 0x0f, 0xbd,
0x06, 0x4d, 0x63, 0x3b, 0x20, 0x5e, 0x74, 0x82, 0x17, 0x26, 0xe9, 0x2c, 0xc3, 0xb0, 0x98, 0x9c,
0xdb, 0x98, 0x27, 0xf4, 0x2e, 0x34, 0x44, 0x94, 0x3a, 0x89, 0x14, 0xd1, 0x57, 0x64, 0xfa, 0xfb,
0xd0, 0x8a, 0x82, 0xce, 0x1f, 0xb7, 0x6e, 0x0f, 0x5a, 0x51, 0x74, 0xf9, 0x08, 0xd4, 0x03, 0x37,
0x30, 0x6c, 0x06, 0x57, 0xc5, 0x3c, 0x41, 0x0d, 0xcd, 0x21, 0x2f, 0x83, 0xe5, 0x68, 0x16, 0xac,
0xe2, 0x38, 0x83, 0x4f, 0x72, 0x64, 0x9f, 0x97, 0x56, 0x79, 0x69, 0x94, 0x11, 0xd7, 0x59, 0x93,
0xeb, 0x3c, 0x80, 0x86, 0x08, 0x39, 0x47, 0xe5, 0x65, 0xa9, 0x1c, 0x2d, 0x42, 0x7d, 0x40, 0xcb,
0x85, 0xd4, 0xdf, 0x49, 0x4c, 0x11, 0xdc, 0x93, 0x5c, 0x76, 0x9d, 0x80, 0xaa, 0xb1, 0xba, 0x93,
0xc6, 0x9c, 0x93, 0x8a, 0xd0, 0xe3, 0xe7, 0x07, 0xdc, 0xa2, 0x44, 0x4a, 0xff, 0x83, 0x32, 0xb4,
0xa3, 0x03, 0x1b, 0xfd, 0xc3, 0x3c, 0xe3, 0x59, 0x84, 0x19, 0x4f, 0x50, 0xd1, 0xd9, 0x21, 0x34,
0xa1, 0x63, 0x89, 0x96, 0x60, 0x89, 0x06, 0xab, 0x1c, 0xfa, 0xad, 0x5c, 0xa1, 0xce, 0xc3, 0x74,
0x48, 0xfa, 0x20, 0x56, 0x3d, 0x25, 0x4f, 0xd7, 0x23, 0xee, 0x0e, 0x54, 0x2d, 0x93, 0x9f, 0x1f,
0xb7, 0x31, 0xfd, 0xab, 0x6f, 0xc3, 0xb4, 0x1c, 0xb6, 0xd5, 0x9f, 0x65, 0x5b, 0xcf, 0x1d, 0x5a,
0x8d, 0x14, 0x22, 0xae, 0x24, 0x7c, 0xd3, 0xb0, 0x0b, 0x31, 0x09, 0x56, 0x18, 0xf4, 0xd7, 0xa0,
0xce, 0x0f, 0x93, 0x12, 0xc8, 0xfa, 0xef, 0xf4, 0xa1, 0xce, 0x84, 0xa0, 0x5f, 0xe1, 0x06, 0x70,
0x1e, 0x1a, 0x6c, 0x63, 0x14, 0x1e, 0x73, 0x1f, 0xc9, 0x92, 0x18, 0x16, 0x34, 0xfa, 0x32, 0x4c,
0x49, 0x61, 0x7c, 0xaa, 0xb1, 0xac, 0x20, 0xd2, 0x82, 0x30, 0x89, 0x74, 0x68, 0xd1, 0xc5, 0x52,
0x4c, 0xa0, 0xb4, 0xff, 0x51, 0x5a, 0x3f, 0x05, 0x0d, 0xb1, 0xd1, 0xd3, 0xc5, 0xb1, 0x45, 0x2f,
0x1a, 0xa5, 0x28, 0xad, 0x7f, 0x09, 0xda, 0x51, 0xb4, 0x1f, 0x3d, 0x86, 0x69, 0x11, 0xed, 0xe7,
0x9b, 0x15, 0x4a, 0x3c, 0x5b, 0xa0, 0x5d, 0x74, 0x67, 0xc2, 0x0e, 0x0c, 0xba, 0x4f, 0x0e, 0x86,
0x04, 0x2b, 0x00, 0xfa, 0x2f, 0x9f, 0x63, 0x23, 0xaf, 0x0f, 0xa1, 0x15, 0x85, 0x38, 0x93, 0x52,
0x58, 0xe0, 0x53, 0x63, 0xa5, 0x30, 0x3e, 0xcf, 0xf9, 0xe9, 0x04, 0xcc, 0x66, 0x50, 0xfd, 0x18,
0x54, 0x1f, 0x90, 0x03, 0x6a, 0x21, 0x7c, 0x22, 0x15, 0x16, 0xc2, 0x27, 0xcc, 0x1e, 0x34, 0xc4,
0x51, 0x43, 0xb2, 0xbe, 0x8b, 0xd0, 0xd8, 0xe6, 0xa7, 0x17, 0x05, 0x53, 0xa6, 0x20, 0xd3, 0xef,
0xc0, 0x94, 0x7c, 0xc0, 0x90, 0xc4, 0x3b, 0x01, 0x53, 0x7d, 0xe9, 0x08, 0x83, 0x8b, 0x41, 0xce,
0xd2, 0x89, 0xaa, 0x8e, 0x29, 0x84, 0xd5, 0x4c, 0x3d, 0x7c, 0x2b, 0x73, 0xd8, 0x47, 0x68, 0xe3,
0x03, 0x38, 0x94, 0x3c, 0x49, 0x48, 0xd6, 0x74, 0x0e, 0x0e, 0x6d, 0x25, 0xce, 0x2d, 0xf8, 0x1c,
0x98, 0xcc, 0xd6, 0x7b, 0x50, 0xe7, 0x91, 0xde, 0x24, 0xc4, 0x25, 0xa8, 0x1b, 0x2c, 0x92, 0x4c,
0x19, 0x67, 0xa5, 0xfd, 0xa4, 0xdc, 0x4a, 0xc6, 0x8a, 0x39, 0xa1, 0x6e, 0xc1, 0x8c, 0x1a, 0x3c,
0x4e, 0x42, 0xae, 0xc1, 0xcc, 0xbe, 0x12, 0xa4, 0xe6, 0xd0, 0xf3, 0x99, 0xd0, 0x0a, 0x14, 0x56,
0x19, 0xf5, 0x5f, 0x68, 0x40, 0x8d, 0x9d, 0x7e, 0x24, 0xab, 0xb8, 0x0e, 0xb5, 0x80, 0xbc, 0x0c,
0x7d, 0xd4, 0xf9, 0x91, 0x47, 0x29, 0x7c, 0x0b, 0xce, 0xe8, 0xd1, 0x67, 0xa1, 0xee, 0x07, 0x07,
0x76, 0x78, 0x66, 0x77, 0x72, 0x34, 0xe3, 0x26, 0x25, 0xc5, 0x9c, 0x83, 0xb2, 0x32, 0x5b, 0x10,
0xa7, 0x75, 0x05, 0xac, 0xcc, 0x08, 0x31, 0xe7, 0x40, 0x77, 0xa0, 0xd9, 0xdf, 0x21, 0xfd, 0xe7,
0xc4, 0x14, 0xc7, 0x74, 0xa7, 0x47, 0x33, 0x2f, 0x73, 0x62, 0x1c, 0x72, 0xd1, 0xba, 0xfb, 0x4c,
0xba, 0x8d, 0x71, 0xea, 0x66, 0x12, 0xc7, 0x9c, 0x03, 0xad, 0x42, 0xdb, 0xea, 0xbb, 0xce, 0xea,
0xae, 0xfb, 0x55, 0x4b, 0x9c, 0xc7, 0x9d, 0x1d, 0xcd, 0xde, 0x0b, 0xc9, 0x71, 0xcc, 0x19, 0xc2,
0xf4, 0x76, 0xe9, 0x96, 0xb6, 0x35, 0x2e, 0x0c, 0x23, 0xc7, 0x31, 0xa7, 0x3e, 0x27, 0xe4, 0x99,
0x6d, 0xe4, 0xf7, 0xa0, 0xce, 0x86, 0x1c, 0xbd, 0x27, 0x17, 0xcf, 0x4a, 0x35, 0xe5, 0xce, 0x58,
0x42, 0x54, 0x11, 0x0e, 0x1b, 0x7f, 0x15, 0x67, 0x6a, 0x1c, 0x1c, 0x21, 0x37, 0x8e, 0xf3, 0x26,
0x34, 0x85, 0x28, 0xd4, 0x06, 0xb7, 0x42, 0x82, 0x37, 0xa0, 0xce, 0x0d, 0x33, 0xbb, 0x3f, 0x6f,
0x41, 0x3b, 0x1a, 0xcc, 0xd1, 0x24, 0x6c, 0x74, 0x72, 0x48, 0x7e, 0xa5, 0x02, 0x75, 0x7e, 0x0a,
0x94, 0x9e, 0x6a, 0x65, 0x2b, 0x38, 0x39, 0xfa, 0x50, 0x49, 0x36, 0x83, 0x7b, 0x6c, 0xa3, 0x46,
0x1d, 0xf3, 0xe8, 0x56, 0xd5, 0xb9, 0x02, 0xee, 0x8d, 0x90, 0x1e, 0xc7, 0xac, 0x05, 0xe2, 0x7c,
0x0c, 0xed, 0x88, 0x0b, 0x2d, 0xa9, 0x22, 0x3d, 0x3f, 0x52, 0x14, 0xc9, 0x2a, 0x05, 0xe0, 0xb7,
0xcb, 0x50, 0x5d, 0xb1, 0xf6, 0x53, 0xe3, 0x70, 0x23, 0xb4, 0xea, 0xa2, 0xe9, 0x60, 0xc5, 0xda,
0x57, 0x8c, 0x5a, 0x5f, 0x0d, 0x35, 0xee, 0x96, 0xda, 0xbc, 0x33, 0xa3, 0x3d, 0xb0, 0x18, 0x86,
0x37, 0xec, 0x37, 0x9a, 0x50, 0x63, 0x07, 0xac, 0x59, 0xf3, 0xd4, 0xc1, 0xb0, 0xb8, 0x61, 0x2c,
0x84, 0xc3, 0x16, 0x5c, 0x46, 0xcf, 0xe7, 0x29, 0x23, 0x28, 0x9e, 0xa7, 0x78, 0x44, 0x8a, 0x92,
0x62, 0xce, 0x41, 0xab, 0xdc, 0xb5, 0x76, 0x89, 0x98, 0xa6, 0x0a, 0xaa, 0x7c, 0x64, 0xed, 0x12,
0xcc, 0xe8, 0x29, 0xdf, 0x8e, 0xe1, 0xef, 0x88, 0x19, 0xaa, 0x80, 0x6f, 0xcd, 0xf0, 0x77, 0x30,
0xa3, 0xa7, 0x7c, 0x0e, 0xdd, 0x12, 0x36, 0xc6, 0xe1, 0xa3, 0x3b, 0x45, 0xcc, 0xe8, 0x29, 0x9f,
0x6f, 0x7d, 0x9d, 0x88, 0x39, 0xa9, 0x80, 0x6f, 0xd3, 0xfa, 0x3a, 0xc1, 0x8c, 0x3e, 0x9e, 0xc2,
0x5b, 0xe3, 0x0d, 0x8d, 0x34, 0x85, 0x3f, 0x81, 0xd9, 0x40, 0x39, 0x26, 0x10, 0xa7, 0xfc, 0xe7,
0x0b, 0xe4, 0xa2, 0xf0, 0xe0, 0x04, 0x06, 0x35, 0x02, 0xb6, 0x01, 0xce, 0x36, 0x82, 0x37, 0xa0,
0xfe, 0x79, 0xcb, 0x0c, 0x76, 0xd4, 0xe2, 0xba, 0x32, 0xe5, 0x51, 0xb1, 0x4d, 0x34, 0xe5, 0xc9,
0x52, 0xe7, 0x38, 0x2b, 0x50, 0xa3, 0xea, 0x33, 0x99, 0x1e, 0xc7, 0x5a, 0xf7, 0xb1, 0x26, 0x60,
0x79, 0xa0, 0x39, 0xce, 0x1c, 0xd4, 0xa8, 0x86, 0xe4, 0x0c, 0xc9, 0x1c, 0xd4, 0xa8, 0xde, 0xe5,
0x97, 0x52, 0x69, 0xab, 0xa5, 0xd5, 0xb0, 0xf4, 0x0c, 0xcc, 0xaa, 0xe2, 0xc8, 0x41, 0xf9, 0x8b,
0x26, 0xd4, 0xd8, 0x6d, 0x85, 0xa4, 0x45, 0xfe, 0x0c, 0xcc, 0x70, 0xf9, 0x2d, 0x09, 0x17, 0xbc,
0x92, 0x79, 0x59, 0x49, 0xbd, 0x03, 0x21, 0x54, 0x40, 0xb0, 0x60, 0x15, 0x61, 0x7c, 0xa7, 0x82,
0x41, 0x29, 0x1a, 0x79, 0x2b, 0x72, 0x5e, 0x6b, 0x05, 0x57, 0x65, 0x18, 0x2f, 0x77, 0x81, 0x43,
0x4f, 0x16, 0x2d, 0x41, 0x8b, 0x2e, 0xad, 0x74, 0xb8, 0x84, 0xd9, 0x9e, 0x19, 0xcd, 0xdf, 0x13,
0xd4, 0x38, 0xe2, 0xa3, 0x0b, 0x7b, 0xdf, 0xf0, 0x4c, 0xd6, 0x2a, 0x61, 0xc3, 0x67, 0x47, 0x83,
0x2c, 0x87, 0xe4, 0x38, 0xe6, 0x44, 0x0f, 0x60, 0xca, 0x24, 0x51, 0x9c, 0x40, 0x18, 0xf5, 0x67,
0x46, 0x03, 0xad, 0xc4, 0x0c, 0x58, 0xe6, 0xa6, 0x6d, 0x0a, 0xf7, 0x86, 0x7e, 0xa1, 0xb3, 0xc1,
0xa0, 0xe2, 0x2b, 0x89, 0x31, 0xa7, 0x7e, 0x1a, 0x66, 0x14, 0xb9, 0x7d, 0xa2, 0x5e, 0x87, 0x2c,
0x4b, 0x8e, 0xb3, 0x10, 0x6d, 0x51, 0x2e, 0xa8, 0x6e, 0x47, 0xee, 0x8e, 0x44, 0x30, 0x3e, 0x84,
0x56, 0x28, 0x18, 0x74, 0x57, 0x6d, 0xc3, 0xdb, 0xc5, 0x6d, 0x88, 0x64, 0x2a, 0xd0, 0xd6, 0xa1,
0x1d, 0x49, 0x08, 0x2d, 0xaa, 0x70, 0xef, 0x14, 0xc3, 0xc5, 0xd2, 0x15, 0x78, 0x18, 0xa6, 0x24,
0x41, 0xa1, 0x65, 0x15, 0xf1, 0x42, 0x31, 0xa2, 0x2c, 0xe6, 0xd8, 0xeb, 0x89, 0x24, 0x26, 0x4b,
0xa5, 0x1a, 0x4b, 0xe5, 0x4f, 0x9a, 0xd0, 0x8a, 0x6e, 0x08, 0x65, 0xec, 0x31, 0xf7, 0x3c, 0xbb,
0x70, 0x8f, 0x19, 0xf2, 0x77, 0x9f, 0x7a, 0x36, 0xa6, 0x1c, 0x54, 0xc4, 0x81, 0x15, 0x44, 0xa6,
0x7a, 0xb6, 0x98, 0xf5, 0x09, 0x25, 0xc7, 0x9c, 0x0b, 0x3d, 0x56, 0xb5, 0xbc, 0x36, 0xe2, 0x04,
0x59, 0x01, 0xc9, 0xd5, 0xf4, 0x1e, 0xb4, 0x2d, 0xea, 0xfa, 0xad, 0xc5, 0x2b, 0xef, 0x3b, 0xc5,
0x70, 0xbd, 0x90, 0x05, 0xc7, 0xdc, 0xb4, 0x6d, 0xdb, 0xc6, 0x3e, 0xb5, 0x6b, 0x06, 0xd6, 0x18,
0xb7, 0x6d, 0xf7, 0x62, 0x26, 0x2c, 0x23, 0xa0, 0x9b, 0xc2, 0x77, 0x69, 0x16, 0xcc, 0x2c, 0xf1,
0x50, 0xc5, 0xfe, 0xcb, 0x07, 0xa9, 0x95, 0x96, 0x9b, 0xf1, 0xa5, 0x31, 0x50, 0x46, 0xae, 0xb6,
0x54, 0x82, 0xdc, 0x33, 0x6a, 0x8f, 0x2b, 0x41, 0xd9, 0x3b, 0xd2, 0x8f, 0x41, 0xf5, 0xa9, 0x67,
0xe7, 0xaf, 0xd5, 0x4c, 0xdc, 0x39, 0xc5, 0x27, 0x55, 0x4b, 0xc8, 0x77, 0xe8, 0x23, 0x99, 0xe4,
0xe2, 0x48, 0x83, 0x9e, 0x43, 0xf4, 0x9e, 0x58, 0xd0, 0xaf, 0xa9, 0xf6, 0xf6, 0x66, 0xc2, 0xde,
0xa8, 0x85, 0x6d, 0x78, 0x84, 0x5f, 0x92, 0x90, 0x56, 0xf2, 0x71, 0xd7, 0xc9, 0xfb, 0xa1, 0xff,
0x31, 0xd1, 0x4c, 0x91, 0x1c, 0x5b, 0x8e, 0xf5, 0x4b, 0x65, 0x68, 0x45, 0x17, 0xc0, 0xd2, 0xd1,
0xf9, 0x96, 0xe5, 0xaf, 0x11, 0xc3, 0x24, 0x9e, 0xb0, 0xdb, 0xb7, 0x0b, 0x6f, 0x96, 0x75, 0x7b,
0x82, 0x03, 0x47, 0xbc, 0xfa, 0x09, 0x68, 0x85, 0xb9, 0x39, 0x9b, 0xb2, 0xef, 0x57, 0xa0, 0x21,
0xae, 0x8e, 0x25, 0x1b, 0x71, 0x1b, 0x1a, 0xb6, 0x71, 0xe0, 0xee, 0x85, 0x5b, 0xa6, 0x33, 0x05,
0xb7, 0xd1, 0xba, 0x0f, 0x19, 0x35, 0x16, 0x5c, 0xe8, 0x73, 0x50, 0xb7, 0xad, 0x5d, 0x2b, 0x10,
0xd3, 0xc7, 0xe9, 0x42, 0x76, 0x76, 0xc8, 0xcc, 0x79, 0x68, 0xe5, 0xec, 0xc6, 0x48, 0x78, 0xdf,
0xb7, 0xb0, 0xf2, 0x67, 0x8c, 0x1a, 0x0b, 0x2e, 0xfd, 0x3e, 0x34, 0x78, 0x73, 0x26, 0x5b, 0x24,
0xd4, 0x9e, 0xc4, 0x9a, 0xce, 0xda, 0x96, 0xe3, 0x95, 0x1e, 0x87, 0x06, 0xaf, 0x3c, 0x47, 0x6b,
0xbe, 0xf7, 0x3a, 0xdb, 0xef, 0xd8, 0xfa, 0xc3, 0xf8, 0xf0, 0xef, 0xe3, 0x9f, 0x65, 0xe8, 0x4f,
0xe0, 0xd0, 0x8a, 0x11, 0x18, 0x5b, 0x86, 0x4f, 0x30, 0xe9, 0xbb, 0x9e, 0x99, 0x89, 0xea, 0xf1,
0x22, 0x11, 0xa1, 0xce, 0x47, 0x15, 0x74, 0x9f, 0x86, 0x0e, 0xff, 0xf7, 0x84, 0x0e, 0xff, 0xac,
0x96, 0x13, 0xcf, 0x1b, 0x27, 0x92, 0x41, 0x15, 0x2e, 0x15, 0xd0, 0xbb, 0xa9, 0xfa, 0xde, 0xa7,
0x0a, 0x38, 0x15, 0xe7, 0xfb, 0xa6, 0x1a, 0xd1, 0x2b, 0xe2, 0x55, 0x42, 0x7a, 0x77, 0x93, 0x21,
0xbd, 0x33, 0x05, 0xdc, 0xa9, 0x98, 0xde, 0x4d, 0x35, 0xa6, 0x57, 0x54, 0xbb, 0x1c, 0xd4, 0xfb,
0x7f, 0x16, 0x46, 0xfb, 0xad, 0x9c, 0xb0, 0xcf, 0x67, 0xd5, 0xb0, 0xcf, 0x08, 0xad, 0xf9, 0x69,
0xc5, 0x7d, 0x7e, 0xbb, 0x91, 0x13, 0xf7, 0x59, 0x50, 0xe2, 0x3e, 0x23, 0x5a, 0x96, 0x0c, 0xfc,
0xdc, 0x54, 0x03, 0x3f, 0xa7, 0x0a, 0x38, 0x95, 0xc8, 0xcf, 0x82, 0x12, 0xf9, 0x29, 0xaa, 0x54,
0x0a, 0xfd, 0x2c, 0x28, 0xa1, 0x9f, 0x22, 0x46, 0x29, 0xf6, 0xb3, 0xa0, 0xc4, 0x7e, 0x8a, 0x18,
0xa5, 0xe0, 0xcf, 0x82, 0x12, 0xfc, 0x29, 0x62, 0x94, 0xa2, 0x3f, 0x37, 0xd5, 0xe8, 0x4f, 0xf1,
0xf8, 0x48, 0x42, 0xff, 0x34, 0x50, 0xf3, 0xdf, 0x18, 0xa8, 0xf9, 0xf5, 0x6a, 0x4e, 0x00, 0x06,
0x67, 0x07, 0x60, 0xce, 0xe7, 0x4b, 0xb2, 0x38, 0x02, 0x33, 0xfe, 0x2a, 0x90, 0x0e, 0xc1, 0xbc,
0x97, 0x08, 0xc1, 0x9c, 0x2e, 0x60, 0x56, 0x63, 0x30, 0xff, 0x67, 0x82, 0x0c, 0x7f, 0xd4, 0x18,
0xb1, 0x9f, 0xbe, 0x21, 0xef, 0xa7, 0x47, 0xac, 0x64, 0xe9, 0x0d, 0xf5, 0x6d, 0x75, 0x43, 0x7d,
0x6e, 0x0c, 0x5e, 0x65, 0x47, 0xbd, 0x91, 0xb5, 0xa3, 0xee, 0x8e, 0x81, 0x92, 0xbb, 0xa5, 0xbe,
0x9f, 0xde, 0x52, 0x9f, 0x1f, 0x03, 0x2f, 0x73, 0x4f, 0xbd, 0x91, 0xb5, 0xa7, 0x1e, 0xa7, 0x75,
0xb9, 0x9b, 0xea, 0xcf, 0x29, 0x9b, 0xea, 0xb3, 0xe3, 0x0c, 0x57, 0xbc, 0x38, 0x7c, 0x21, 0x67,
0x57, 0xfd, 0xee, 0x38, 0x30, 0xa3, 0x83, 0xd8, 0x9f, 0xee, 0x8b, 0xd5, 0x6a, 0xfe, 0xf0, 0x4d,
0x68, 0x85, 0x17, 0x6d, 0xf4, 0xaf, 0x41, 0x33, 0x7c, 0x2f, 0x94, 0xb4, 0x9c, 0xa3, 0xd1, 0xa6,
0x8e, 0x7b, 0xcf, 0x22, 0x85, 0x6e, 0x43, 0x8d, 0xfe, 0x13, 0x66, 0xf1, 0xf6, 0x78, 0x17, 0x7a,
0x68, 0x25, 0x98, 0xf1, 0xe9, 0x3f, 0x3a, 0x02, 0x20, 0x3d, 0xa3, 0x18, 0xb7, 0xda, 0xf7, 0xe9,
0x64, 0x66, 0x07, 0xc4, 0x63, 0x17, 0xb9, 0x0a, 0x9f, 0x19, 0xc4, 0x35, 0x50, 0x6d, 0x09, 0x88,
0x87, 0x05, 0x3b, 0x7a, 0x04, 0xad, 0x30, 0x90, 0xaa, 0xd5, 0x18, 0xd4, 0xbb, 0x63, 0x43, 0x85,
0xa1, 0x3d, 0x1c, 0x41, 0xa0, 0x45, 0xa8, 0xf9, 0xae, 0x17, 0x68, 0x75, 0x06, 0x75, 0x61, 0x6c,
0xa8, 0x4d, 0xd7, 0x0b, 0x30, 0x63, 0xe5, 0x5d, 0x93, 0x5e, 0xa9, 0x4e, 0xd2, 0x35, 0x65, 0xc6,
0xfe, 0xf7, 0x6a, 0x34, 0x87, 0x2e, 0x0b, 0x6b, 0xe4, 0x3a, 0x74, 0x71, 0x7c, 0x29, 0xc9, 0x56,
0x89, 0x84, 0x13, 0xc4, 0x25, 0xc1, 0xfd, 0x9b, 0xb7, 0xa1, 0xd3, 0x77, 0xf7, 0x89, 0x87, 0xe3,
0x2b, 0x4e, 0xe2, 0x16, 0x5a, 0x2a, 0x1f, 0xe9, 0xd0, 0xda, 0xb1, 0x4c, 0xd2, 0xeb, 0x8b, 0xf9,
0xaf, 0x85, 0xa3, 0x34, 0x7a, 0x00, 0x2d, 0x16, 0x63, 0x0f, 0x23, 0xfc, 0x93, 0x35, 0x92, 0x87,
0xfa, 0x43, 0x00, 0x5a, 0x11, 0xab, 0xfc, 0x9e, 0x15, 0xb0, 0x31, 0x6c, 0xe1, 0x28, 0x4d, 0x1b,
0xcc, 0xee, 0x91, 0xc9, 0x0d, 0x6e, 0xf2, 0x06, 0x27, 0xf3, 0xd1, 0x55, 0x78, 0x95, 0xe5, 0x25,
0xb6, 0x98, 0x3c, 0x54, 0xdf, 0xc2, 0xd9, 0x85, 0xec, 0xde, 0x9c, 0x31, 0xe0, 0x77, 0xd2, 0x59,
0xf0, 0xae, 0x8e, 0xe3, 0x0c, 0x74, 0x1e, 0x0e, 0x9b, 0x64, 0xdb, 0xd8, 0xb3, 0x83, 0x27, 0x64,
0x77, 0x68, 0x1b, 0x01, 0xe9, 0x99, 0xec, 0xa1, 0x6c, 0x1b, 0xa7, 0x0b, 0xd0, 0x25, 0x78, 0x45,
0x64, 0x72, 0x33, 0xa6, 0xd2, 0xe8, 0x99, 0xec, 0xdd, 0x68, 0x1b, 0x67, 0x15, 0xe9, 0xdf, 0xab,
0x51, 0xa1, 0x33, 0xd5, 0x7e, 0x1f, 0xaa, 0x86, 0x69, 0x8a, 0x65, 0xf3, 0xca, 0x84, 0x06, 0x22,
0xde, 0x82, 0x53, 0x04, 0xb4, 0x11, 0x5d, 0xb9, 0xe3, 0x0b, 0xe7, 0xf5, 0x49, 0xb1, 0xa2, 0xf7,
0xfb, 0x02, 0x87, 0x22, 0xee, 0xf1, 0x4b, 0xdf, 0xd5, 0x9f, 0x0c, 0x31, 0xba, 0x0b, 0x2e, 0x70,
0xd0, 0x7d, 0xa8, 0xb1, 0x16, 0xf2, 0x85, 0xf5, 0xea, 0xa4, 0x78, 0x8f, 0x78, 0xfb, 0x18, 0x86,
0xde, 0xe7, 0x77, 0xdf, 0xa4, 0x0b, 0x97, 0x65, 0xf5, 0xc2, 0xe5, 0x12, 0xd4, 0xad, 0x80, 0xec,
0xa6, 0xef, 0xdf, 0x8e, 0x54, 0x55, 0x31, 0xf3, 0x70, 0xd6, 0x91, 0xf7, 0x00, 0x3f, 0x8c, 0xee,
0x62, 0x27, 0xe7, 0xc3, 0xbb, 0x50, 0xa3, 0xec, 0x29, 0x5f, 0x72, 0x9c, 0x8a, 0x19, 0xa7, 0x7e,
0x19, 0x6a, 0xb4, 0xb3, 0x23, 0x7a, 0x27, 0xda, 0x53, 0x89, 0xda, 0xb3, 0x34, 0x05, 0x6d, 0x77,
0x48, 0x3c, 0x66, 0x18, 0xfa, 0xbf, 0xd5, 0xa4, 0x4b, 0x71, 0x3d, 0x59, 0xc7, 0xae, 0x4d, 0x3c,
0x73, 0xca, 0x5a, 0x86, 0x13, 0x5a, 0x76, 0x63, 0x72, 0xb4, 0x94, 0x9e, 0xe1, 0x84, 0x9e, 0xfd,
0x04, 0x98, 0x29, 0x4d, 0x7b, 0xa8, 0x68, 0xda, 0xf5, 0xc9, 0x11, 0x15, 0x5d, 0x23, 0x45, 0xba,
0xb6, 0xa2, 0xea, 0x5a, 0x77, 0x3c, 0x91, 0x47, 0x4b, 0xd3, 0x18, 0xda, 0xf6, 0xa5, 0x5c, 0x6d,
0x5b, 0x52, 0xb4, 0x6d, 0xd2, 0xaa, 0x3f, 0x21, 0x7d, 0xfb, 0xe7, 0x1a, 0xd4, 0xe8, 0xf2, 0x88,
0x56, 0x65, 0x5d, 0x7b, 0x77, 0xa2, 0xa5, 0x55, 0xd6, 0xb3, 0xf5, 0x84, 0x9e, 0x5d, 0x9d, 0x0c,
0x29, 0xa5, 0x63, 0xeb, 0x09, 0x1d, 0x9b, 0x10, 0x2f, 0xa5, 0x5f, 0x6b, 0x8a, 0x7e, 0x5d, 0x9e,
0x0c, 0x4d, 0xd1, 0x2d, 0xa3, 0x48, 0xb7, 0xee, 0xaa, 0xba, 0x35, 0xa6, 0xf7, 0xc6, 0x7c, 0x95,
0x31, 0xf4, 0xea, 0x83, 0x5c, 0xbd, 0xba, 0xad, 0xe8, 0xd5, 0x24, 0xd5, 0x7e, 0x42, 0x3a, 0x75,
0x95, 0x3b, 0x9d, 0xe2, 0x9e, 0xf1, 0x98, 0x4e, 0xa7, 0x7e, 0x0d, 0xda, 0xf1, 0x3b, 0xf4, 0x8c,
0xeb, 0xf9, 0x9c, 0x2c, 0xac, 0x35, 0x4c, 0xea, 0x57, 0xa0, 0x1d, 0xbf, 0x2d, 0xcf, 0xa8, 0xcb,
0x67, 0x85, 0x82, 0x4b, 0xa4, 0xf4, 0x55, 0x38, 0x9c, 0x7e, 0xf9, 0x9a, 0x11, 0x87, 0x97, 0xee,
0x96, 0x87, 0x4f, 0x51, 0xa4, 0x2c, 0xfd, 0x05, 0xcc, 0x26, 0xde, 0xb2, 0x4e, 0x8c, 0x81, 0xae,
0x48, 0x2e, 0x72, 0x55, 0xec, 0xc1, 0xb3, 0x6f, 0xcb, 0xc7, 0x8e, 0xb0, 0xbe, 0x02, 0xb3, 0x05,
0x8d, 0x1f, 0xe7, 0xb2, 0xfc, 0x57, 0x60, 0x6a, 0x54, 0xdb, 0x3f, 0x81, 0xcb, 0xfc, 0x01, 0x74,
0x52, 0xef, 0xf0, 0x93, 0xd5, 0x6c, 0x00, 0x0c, 0x22, 0x1a, 0xa1, 0xb4, 0x97, 0x26, 0x78, 0xba,
0xc0, 0xf8, 0xb0, 0x84, 0xa1, 0xff, 0x7e, 0x19, 0x0e, 0xa7, 0x1f, 0xe1, 0x8f, 0xbb, 0xf9, 0xd1,
0xa0, 0xc9, 0xb0, 0xa2, 0x17, 0x1f, 0x61, 0x12, 0x3d, 0x82, 0x69, 0xdf, 0xb6, 0xfa, 0x64, 0x79,
0xc7, 0x70, 0x06, 0xc4, 0x17, 0x3b, 0x9a, 0x82, 0x87, 0xf4, 0x9b, 0x31, 0x07, 0x56, 0xd8, 0xf5,
0x17, 0x30, 0x25, 0x15, 0xa2, 0x5b, 0x50, 0x71, 0x87, 0xa9, 0x7b, 0x8d, 0xf9, 0x98, 0x8f, 0x43,
0x7b, 0xc3, 0x15, 0x77, 0x98, 0x36, 0x49, 0xd9, 0x7c, 0xab, 0x8a, 0xf9, 0xea, 0x0f, 0xe0, 0x70,
0xfa, 0x9d, 0x7b, 0x72, 0x78, 0xce, 0xa4, 0xa2, 0x04, 0x7c, 0x98, 0x92, 0x5b, 0xfe, 0x05, 0x38,
0x94, 0x7c, 0xbd, 0x9e, 0xf1, 0x1a, 0x27, 0x7e, 0xd4, 0x14, 0x86, 0xeb, 0xe7, 0x7f, 0xad, 0x0c,
0xb3, 0x6a, 0x47, 0xd0, 0x51, 0x40, 0x6a, 0xce, 0xba, 0xeb, 0x90, 0x4e, 0x09, 0xbd, 0x0a, 0x87,
0xd5, 0xfc, 0x45, 0xd3, 0xec, 0x94, 0xd3, 0xe4, 0x74, 0xda, 0xea, 0x54, 0x90, 0x06, 0x47, 0x12,
0x23, 0xc4, 0x26, 0xd1, 0x4e, 0x15, 0xbd, 0x0e, 0xaf, 0x26, 0x4b, 0x86, 0xb6, 0xd1, 0x27, 0x9d,
0x9a, 0xfe, 0xc3, 0x0a, 0xd4, 0x9e, 0xfa, 0xc4, 0xd3, 0xff, 0xb5, 0x12, 0xbe, 0xd2, 0xb8, 0x01,
0x35, 0xf6, 0xb0, 0x5c, 0x7a, 0xcd, 0x58, 0x4e, 0xbc, 0x66, 0x54, 0x5e, 0xc4, 0xc5, 0xaf, 0x19,
0x6f, 0x40, 0x8d, 0x3d, 0x25, 0x9f, 0x9c, 0xf3, 0x17, 0xcb, 0xd0, 0x8e, 0x9f, 0x75, 0x4f, 0xcc,
0x2f, 0xbf, 0x0a, 0xa9, 0xa8, 0xaf, 0x42, 0xde, 0x86, 0xba, 0xc7, 0xde, 0x6f, 0xf0, 0x59, 0x26,
0xf9, 0xd6, 0x84, 0x55, 0x88, 0x39, 0x89, 0x4e, 0x60, 0x4a, 0x7e, 0xb4, 0x3e, 0x79, 0x33, 0x4e,
0x89, 0x2f, 0xd6, 0xf4, 0x4c, 0x7f, 0xd1, 0xf3, 0x8c, 0x03, 0xa1, 0x98, 0x6a, 0xa6, 0x3e, 0x07,
0xb5, 0x0d, 0xcb, 0x19, 0x64, 0x3f, 0x22, 0xd5, 0xbf, 0x53, 0x86, 0xa6, 0xb8, 0xbc, 0xab, 0x2f,
0x40, 0x75, 0x9d, 0xbc, 0xa0, 0x0d, 0x11, 0xd7, 0x86, 0x53, 0x0d, 0x79, 0xc4, 0x7a, 0x21, 0xe8,
0x71, 0x48, 0xa6, 0xdf, 0x8c, 0x96, 0xc9, 0xc9, 0x79, 0x6f, 0x40, 0x8d, 0xbd, 0x35, 0x9f, 0x9c,
0xf3, 0x77, 0x5b, 0xd0, 0xe0, 0x2f, 0x31, 0xf5, 0x6f, 0xb7, 0xa0, 0xc1, 0xdf, 0x9f, 0xa3, 0xdb,
0xd0, 0xf4, 0xf7, 0x76, 0x77, 0x0d, 0xef, 0x40, 0xcb, 0xfe, 0xd8, 0xa1, 0xf2, 0x5c, 0xbd, 0xbb,
0xc9, 0x69, 0x71, 0xc8, 0x84, 0xae, 0x41, 0xad, 0x6f, 0x6c, 0x93, 0xd4, 0x71, 0x6e, 0x16, 0xf3,
0xb2, 0xb1, 0x4d, 0x30, 0x23, 0x47, 0x77, 0xa1, 0x25, 0xc4, 0xe2, 0x8b, 0x78, 0xce, 0xe8, 0x7a,
0x43, 0x61, 0x46, 0x5c, 0xfa, 0x7d, 0x68, 0x8a, 0xc6, 0xa0, 0x3b, 0xd1, 0x3b, 0xd4, 0x64, 0xe4,
0x39, 0xb3, 0x0b, 0xd1, 0xc3, 0xe4, 0xe8, 0x45, 0xea, 0x5f, 0x57, 0xa0, 0x46, 0x1b, 0xf7, 0xb1,
0x91, 0xd0, 0x71, 0x00, 0xdb, 0xf0, 0x83, 0x8d, 0x3d, 0xdb, 0x26, 0xa6, 0x78, 0x61, 0x27, 0xe5,
0xa0, 0x73, 0x70, 0x88, 0xa7, 0xfc, 0x9d, 0xcd, 0xbd, 0x7e, 0x9f, 0x44, 0xcf, 0x44, 0x93, 0xd9,
0x68, 0x11, 0xea, 0xec, 0x8b, 0x68, 0xc2, 0x2b, 0x7c, 0xa7, 0x70, 0x64, 0xbb, 0x1b, 0x96, 0x23,
0x5a, 0xc3, 0x39, 0x75, 0x17, 0xda, 0x51, 0x1e, 0x35, 0xc2, 0xa1, 0xe5, 0x38, 0x96, 0x33, 0x10,
0x1a, 0x1d, 0x26, 0xe9, 0xa2, 0x43, 0xff, 0x8a, 0xf6, 0xd6, 0xb1, 0x48, 0xd1, 0xfc, 0x6d, 0xc3,
0xb2, 0x45, 0x13, 0xeb, 0x58, 0xa4, 0x28, 0xd2, 0x9e, 0x78, 0xb5, 0x5f, 0x63, 0x1d, 0x0c, 0x93,
0xfa, 0x47, 0xe5, 0xe8, 0x31, 0x76, 0xd6, 0xe3, 0xcc, 0x54, 0x2c, 0x69, 0x4e, 0x0e, 0x68, 0xf3,
0x05, 0x41, 0x0a, 0x51, 0x1f, 0x85, 0x86, 0xeb, 0xd8, 0x96, 0x43, 0x44, 0xec, 0x48, 0xa4, 0x12,
0x63, 0x5c, 0x4f, 0x8d, 0xb1, 0x28, 0x5f, 0x35, 0x2d, 0xda, 0xc4, 0x46, 0x5c, 0xce, 0x73, 0xd0,
0x7b, 0xd0, 0x34, 0xc9, 0xbe, 0xd5, 0x27, 0xbe, 0xd6, 0x64, 0xaa, 0x77, 0x72, 0xe4, 0xd8, 0xae,
0x30, 0x5a, 0x1c, 0xf2, 0xe8, 0x01, 0x34, 0x78, 0x56, 0xd4, 0xa5, 0xb2, 0xd4, 0xa5, 0xb8, 0xd1,
0x95, 0x11, 0x8d, 0xae, 0x16, 0x34, 0xba, 0x96, 0x6c, 0xf4, 0xbc, 0x09, 0x10, 0xab, 0x1b, 0x9a,
0x82, 0xe6, 0x53, 0xe7, 0xb9, 0xe3, 0xbe, 0x70, 0x3a, 0x25, 0x9a, 0x78, 0xbc, 0xbd, 0x4d, 0x6b,
0xe9, 0x94, 0x69, 0x82, 0xd2, 0x59, 0xce, 0xa0, 0x53, 0x41, 0x00, 0x0d, 0x9a, 0x20, 0x66, 0xa7,
0x4a, 0xff, 0xdf, 0x63, 0xf2, 0xeb, 0xd4, 0xd0, 0x6b, 0xf0, 0x4a, 0xcf, 0xe9, 0xbb, 0xbb, 0x43,
0x23, 0xb0, 0xb6, 0x6c, 0xf2, 0x8c, 0x78, 0xbe, 0xe5, 0x3a, 0x9d, 0xba, 0xfe, 0x1f, 0x65, 0x7e,
0xea, 0xab, 0xdf, 0x85, 0x69, 0xe5, 0x33, 0x12, 0x1a, 0x34, 0xd9, 0xab, 0xfe, 0xd8, 0xef, 0x16,
0x49, 0xa6, 0x25, 0xfc, 0x59, 0xbc, 0x70, 0x59, 0x78, 0x4a, 0xbf, 0x07, 0x20, 0x7d, 0x3c, 0xe2,
0x38, 0xc0, 0xd6, 0x41, 0x40, 0x7c, 0xfe, 0xe1, 0x08, 0x0a, 0x51, 0xc3, 0x52, 0x8e, 0x8c, 0x5f,
0x51, 0xf0, 0xf5, 0xeb, 0x00, 0xd2, 0xa7, 0x23, 0xa8, 0xfd, 0xd0, 0xd4, 0x52, 0x12, 0x2c, 0x99,
0xad, 0x77, 0x45, 0x0f, 0xc2, 0x8f, 0x44, 0x84, 0x2d, 0xe0, 0x51, 0x3a, 0xb9, 0x05, 0x2c, 0x47,
0x5f, 0x05, 0x88, 0xbf, 0x93, 0xa0, 0x2f, 0x44, 0x53, 0xf4, 0x05, 0xa8, 0x99, 0x46, 0x60, 0x88,
0xd9, 0xf1, 0xf5, 0xc4, 0x0a, 0x15, 0xb3, 0x60, 0x46, 0xa6, 0xff, 0x5e, 0x19, 0xa6, 0xe5, 0x6f,
0x42, 0xe8, 0xef, 0x43, 0x8d, 0x7d, 0x54, 0xe2, 0x0e, 0x4c, 0xcb, 0x1f, 0x85, 0x48, 0x7d, 0x93,
0x97, 0xe3, 0xc9, 0xac, 0x58, 0x61, 0xd0, 0x7b, 0x51, 0x93, 0x3e, 0x36, 0xd4, 0x25, 0x68, 0x8a,
0x6f, 0x4c, 0xe8, 0xa7, 0xa1, 0x1d, 0x7f, 0x52, 0x82, 0xce, 0x11, 0x3c, 0x3f, 0x94, 0xb2, 0x48,
0xea, 0x3f, 0xae, 0x42, 0x9d, 0x89, 0x53, 0xff, 0x56, 0x45, 0xd6, 0x44, 0xfd, 0x87, 0xe5, 0xdc,
0x3d, 0xdf, 0x15, 0xe5, 0xf3, 0x00, 0xb3, 0xa9, 0x4f, 0xa9, 0x88, 0x2f, 0x48, 0xa8, 0x13, 0xe8,
0x75, 0x68, 0x3a, 0x24, 0x78, 0xe1, 0x7a, 0xcf, 0x99, 0x91, 0xcc, 0xa6, 0x3f, 0x9f, 0xc2, 0xb8,
0xd6, 0x39, 0x0d, 0x0e, 0x89, 0xd1, 0x55, 0xa8, 0x13, 0xcf, 0x73, 0x3d, 0x66, 0x3a, 0xb3, 0xa9,
0x8f, 0x92, 0xc4, 0x5f, 0xab, 0x58, 0xa5, 0x54, 0x98, 0x13, 0xa3, 0xab, 0xf0, 0xaa, 0xcf, 0xad,
0x85, 0xfb, 0x8e, 0xbe, 0x78, 0x3f, 0x2d, 0x66, 0x95, 0xec, 0xc2, 0xf9, 0x2f, 0x86, 0x0b, 0xa9,
0x64, 0x60, 0x25, 0xd9, 0xf2, 0xca, 0xa8, 0x0d, 0x75, 0x56, 0x51, 0xa7, 0x22, 0x9b, 0x67, 0x15,
0x9d, 0x80, 0x39, 0x4a, 0xb4, 0xe1, 0xb9, 0x81, 0xdb, 0x77, 0xed, 0x9e, 0xb3, 0x1c, 0x59, 0x21,
0x5d, 0xb6, 0x3b, 0xb5, 0xf9, 0x2b, 0xd0, 0x14, 0x9d, 0xa3, 0x9c, 0x8b, 0xbc, 0x17, 0x9d, 0x12,
0x9a, 0x86, 0xd6, 0x26, 0xb1, 0xb7, 0xd7, 0x5c, 0x3f, 0xe8, 0x94, 0xd1, 0x0c, 0xb4, 0x99, 0x55,
0x3c, 0x76, 0xec, 0x83, 0x4e, 0x65, 0xfe, 0x03, 0x68, 0x47, 0x7d, 0x43, 0x2d, 0xa8, 0xad, 0xef,
0xd9, 0x76, 0xa7, 0xc4, 0x9c, 0xd1, 0xc0, 0xf5, 0xc2, 0x50, 0xf4, 0xea, 0x4b, 0xba, 0xb2, 0x74,
0xca, 0x79, 0xf6, 0x5f, 0x41, 0x1d, 0x98, 0x16, 0x95, 0xf3, 0xd6, 0x57, 0xf5, 0x7f, 0x2c, 0x43,
0x3b, 0xfa, 0x20, 0x07, 0xf5, 0x04, 0x43, 0x69, 0xe7, 0xcf, 0x08, 0x0b, 0x09, 0xb9, 0xe7, 0x7f,
0xdf, 0x23, 0x21, 0xfb, 0x33, 0x30, 0x2b, 0x26, 0xd9, 0x50, 0x0c, 0x7c, 0x9e, 0x4c, 0xe4, 0xce,
0xdf, 0x8c, 0xc6, 0xbf, 0xc3, 0x8c, 0x6d, 0xd9, 0x75, 0x1c, 0xd2, 0x0f, 0x98, 0x14, 0x0e, 0xc1,
0xd4, 0xba, 0x1b, 0x6c, 0xb8, 0xbe, 0x4f, 0x7b, 0xc6, 0x47, 0x2a, 0x2e, 0xaf, 0xcc, 0x7f, 0x03,
0x66, 0x30, 0xf1, 0x87, 0xae, 0xe3, 0x93, 0x9f, 0xd6, 0x87, 0xbd, 0x73, 0x3f, 0xd1, 0x3d, 0xff,
0x9d, 0x2a, 0xd4, 0x99, 0x77, 0xa6, 0xff, 0x71, 0x35, 0xf2, 0x23, 0x33, 0xee, 0xee, 0xc5, 0x37,
0x6c, 0x64, 0xab, 0x51, 0xfc, 0x3a, 0xf9, 0x98, 0xe6, 0xb2, 0x7c, 0xb3, 0x46, 0xb6, 0x18, 0x95,
0x43, 0xb9, 0x51, 0xf3, 0x39, 0x68, 0x0d, 0x3d, 0x77, 0xe0, 0x51, 0x07, 0xb2, 0x96, 0xf8, 0x0c,
0x8b, 0xca, 0xb6, 0x21, 0xc8, 0x70, 0xc4, 0xa0, 0xaf, 0x43, 0x2b, 0xcc, 0xcd, 0xf9, 0xd0, 0x00,
0x82, 0x9a, 0xe9, 0x8a, 0x45, 0xb0, 0x8a, 0xd9, 0x7f, 0x3a, 0x2e, 0x62, 0x04, 0xc3, 0xcd, 0x9f,
0x48, 0xce, 0x7f, 0x59, 0x9c, 0x7c, 0xce, 0x40, 0x7b, 0xc5, 0x73, 0x87, 0xec, 0x45, 0x79, 0xa7,
0x44, 0xad, 0xab, 0xb7, 0x3b, 0x74, 0x3d, 0xaa, 0xf0, 0x00, 0x8d, 0xd5, 0x97, 0xec, 0x7f, 0x85,
0x99, 0x82, 0xb1, 0x4f, 0x28, 0x59, 0xa7, 0x8a, 0x10, 0xcc, 0x62, 0xc2, 0x4e, 0x7b, 0x84, 0xeb,
0xd1, 0xa9, 0x51, 0xa0, 0x47, 0xd6, 0x80, 0x6f, 0xa7, 0x3a, 0xf5, 0xf9, 0xc5, 0xf0, 0x86, 0x0b,
0x35, 0x0d, 0xbe, 0x7d, 0x9b, 0x82, 0x26, 0xde, 0x63, 0xfe, 0x4f, 0xa7, 0x4c, 0xb3, 0xa9, 0x53,
0xcd, 0xa1, 0x97, 0x0d, 0xa7, 0x4f, 0x6c, 0xb6, 0x66, 0x46, 0x56, 0x5c, 0x5b, 0x9a, 0xfb, 0x9b,
0x8f, 0x8e, 0x97, 0xbf, 0xfb, 0xd1, 0xf1, 0xf2, 0xf7, 0x3f, 0x3a, 0x5e, 0xfe, 0xcd, 0x1f, 0x1c,
0x2f, 0x7d, 0xf7, 0x07, 0xc7, 0x4b, 0xff, 0xf2, 0x83, 0xe3, 0xa5, 0x0f, 0x2b, 0xc3, 0xad, 0xad,
0x06, 0xbb, 0x9a, 0x70, 0xe5, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x9a, 0x37, 0xbb, 0xd4, 0x96,
0x5e, 0x00, 0x00,
}
func (m *Event) Marshal() (dAtA []byte, err error) {

View file

@ -1086,6 +1086,7 @@ message Event {
Syncing = 1;
Error = 2;
Offline = 3;
SyncProtocolInCompatibleMode = 4;
}
enum Network {
Anytype = 0;

View file

@ -18,6 +18,7 @@ import (
"github.com/anyproto/any-sync/net/peer"
"go.uber.org/zap"
"github.com/anyproto/anytype-heart/core/compatibility"
"github.com/anyproto/anytype-heart/core/syncstatus/nodestatus"
"github.com/anyproto/anytype-heart/space/spacecore/peerstore"
)
@ -57,6 +58,7 @@ type clientPeerManager struct {
availableResponsiblePeers chan struct{}
nodeStatus NodeStatus
spaceSyncService Updater
compatibilityChecker compatibility.Checker
ctx context.Context
ctxCancel context.CancelFunc
@ -74,6 +76,7 @@ func (n *clientPeerManager) Init(a *app.App) (err error) {
n.nodeStatus = app.MustComponent[NodeStatus](a)
n.spaceSyncService = app.MustComponent[Updater](a)
n.peerToPeerStatus = app.MustComponent[PeerToPeerStatus](a)
n.compatibilityChecker = app.MustComponent[compatibility.Checker](a)
return
}
@ -179,6 +182,7 @@ func (n *clientPeerManager) getStreamResponsiblePeers(ctx context.Context) (peer
log.Warn("failed to get responsible peer from common pool", zap.Error(nodeErr))
} else {
peerIds = []string{p.Id()}
n.addPeerVersion(p)
}
peerIds = append(peerIds, n.peerStore.LocalPeerIds(n.spaceId)...)
for _, peerId := range peerIds {
@ -188,6 +192,7 @@ func (n *clientPeerManager) getStreamResponsiblePeers(ctx context.Context) (peer
log.Warn("failed to get peer from stream pool", zap.String("peerId", peerId), zap.Error(err))
continue
}
n.addPeerVersion(p)
peers = append(peers, p)
}
@ -198,6 +203,15 @@ func (n *clientPeerManager) getStreamResponsiblePeers(ctx context.Context) (peer
return
}
func (n *clientPeerManager) addPeerVersion(p peer.Peer) {
protoVersion, err := peer.CtxProtoVersion(p.Context())
if err != nil {
log.Warn("failed to get responsible peer proto version", zap.Error(err))
} else {
n.compatibilityChecker.AddPeerVersion(p.Id(), protoVersion)
}
}
func (n *clientPeerManager) manageResponsiblePeers() {
for {
n.fetchResponsiblePeers()