mirror of https://github.com/milvus-io/milvus.git
Add tickle for datacoord watch event (#21193)
Signed-off-by: aoiasd <zhicheng.yue@zilliz.com>pull/22114/head
parent
d011f750d8
commit
148a024e05
|
@ -280,7 +280,7 @@ dataCoord:
|
|||
enableActiveStandby: false # Enable active-standby
|
||||
|
||||
channel:
|
||||
maxWatchDuration: 600 # Timeout on watching channels (in seconds). Default 600 seconds.
|
||||
watchTimeoutInterval: 30 # Timeout on watching channels (in seconds). Datanode tickler update watch progress will reset timeout timer.
|
||||
|
||||
segment:
|
||||
maxSize: 512 # Maximum size of a segment in MB
|
||||
|
|
|
@ -33,10 +33,12 @@ import (
|
|||
)
|
||||
|
||||
type channelStateTimer struct {
|
||||
watchkv kv.MetaKv
|
||||
runningTimers sync.Map // channel name to timer stop channels
|
||||
etcdWatcher clientv3.WatchChan
|
||||
timeoutWatcher chan *ackEvent
|
||||
watchkv kv.MetaKv
|
||||
|
||||
runningTimers sync.Map
|
||||
runningTimerStops sync.Map // channel name to timer stop channels
|
||||
etcdWatcher clientv3.WatchChan
|
||||
timeoutWatcher chan *ackEvent
|
||||
}
|
||||
|
||||
func newChannelStateTimer(kv kv.MetaKv) *channelStateTimer {
|
||||
|
@ -49,7 +51,6 @@ func newChannelStateTimer(kv kv.MetaKv) *channelStateTimer {
|
|||
func (c *channelStateTimer) getWatchers(prefix string) (clientv3.WatchChan, chan *ackEvent) {
|
||||
if c.etcdWatcher == nil {
|
||||
c.etcdWatcher = c.watchkv.WatchWithPrefix(prefix)
|
||||
|
||||
}
|
||||
return c.etcdWatcher, c.timeoutWatcher
|
||||
}
|
||||
|
@ -80,8 +81,8 @@ func (c *channelStateTimer) loadAllChannels(nodeID UniqueID) ([]*datapb.ChannelW
|
|||
}
|
||||
|
||||
// startOne can write ToWatch or ToRelease states.
|
||||
func (c *channelStateTimer) startOne(watchState datapb.ChannelWatchState, channelName string, nodeID UniqueID, timeoutTs int64) {
|
||||
if timeoutTs == 0 {
|
||||
func (c *channelStateTimer) startOne(watchState datapb.ChannelWatchState, channelName string, nodeID UniqueID, timeout time.Duration) {
|
||||
if timeout == 0 {
|
||||
log.Info("zero timeoutTs, skip starting timer",
|
||||
zap.String("watch state", watchState.String()),
|
||||
zap.Int64("nodeID", nodeID),
|
||||
|
@ -89,23 +90,29 @@ func (c *channelStateTimer) startOne(watchState datapb.ChannelWatchState, channe
|
|||
)
|
||||
return
|
||||
}
|
||||
|
||||
stop := make(chan struct{})
|
||||
ticker := time.NewTimer(timeout)
|
||||
c.removeTimers([]string{channelName})
|
||||
c.runningTimers.Store(channelName, stop)
|
||||
timeoutT := time.Unix(0, timeoutTs)
|
||||
c.runningTimerStops.Store(channelName, stop)
|
||||
c.runningTimers.Store(channelName, ticker)
|
||||
|
||||
go func() {
|
||||
log.Info("timer started",
|
||||
zap.String("watch state", watchState.String()),
|
||||
zap.Int64("nodeID", nodeID),
|
||||
zap.String("channel name", channelName),
|
||||
zap.Time("timeout time", timeoutT))
|
||||
zap.Duration("check interval", timeout))
|
||||
defer ticker.Stop()
|
||||
|
||||
select {
|
||||
case <-time.NewTimer(time.Until(timeoutT)).C:
|
||||
case <-ticker.C:
|
||||
// check tickle at path as :tickle/[prefix]/{channel_name}
|
||||
log.Info("timeout and stop timer: wait for channel ACK timeout",
|
||||
zap.String("watch state", watchState.String()),
|
||||
zap.Int64("nodeID", nodeID),
|
||||
zap.String("channel name", channelName),
|
||||
zap.Time("timeout time", timeoutT))
|
||||
zap.Duration("timeout interval", timeout))
|
||||
ackType := getAckType(watchState)
|
||||
c.notifyTimeoutWatcher(&ackEvent{ackType, channelName, nodeID})
|
||||
case <-stop:
|
||||
|
@ -113,7 +120,7 @@ func (c *channelStateTimer) startOne(watchState datapb.ChannelWatchState, channe
|
|||
zap.String("watch state", watchState.String()),
|
||||
zap.Int64("nodeID", nodeID),
|
||||
zap.String("channel name", channelName),
|
||||
zap.Time("timeout time", timeoutT))
|
||||
zap.Duration("timeout interval", timeout))
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
@ -124,16 +131,25 @@ func (c *channelStateTimer) notifyTimeoutWatcher(e *ackEvent) {
|
|||
|
||||
func (c *channelStateTimer) removeTimers(channels []string) {
|
||||
for _, channel := range channels {
|
||||
if stop, ok := c.runningTimers.LoadAndDelete(channel); ok {
|
||||
if stop, ok := c.runningTimerStops.LoadAndDelete(channel); ok {
|
||||
close(stop.(chan struct{}))
|
||||
c.runningTimers.Delete(channel)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (c *channelStateTimer) stopIfExist(e *ackEvent) {
|
||||
stop, ok := c.runningTimers.LoadAndDelete(e.channelName)
|
||||
stop, ok := c.runningTimerStops.LoadAndDelete(e.channelName)
|
||||
if ok && e.ackType != watchTimeoutAck && e.ackType != releaseTimeoutAck {
|
||||
close(stop.(chan struct{}))
|
||||
c.runningTimers.Delete(e.channelName)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *channelStateTimer) resetIfExist(channel string, interval time.Duration) {
|
||||
if value, ok := c.runningTimers.Load(channel); ok {
|
||||
timer := value.(*time.Timer)
|
||||
timer.Reset(interval)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -52,10 +52,9 @@ func TestChannelStateTimer(t *testing.T) {
|
|||
timer.loadAllChannels(1)
|
||||
|
||||
validWatchInfo := datapb.ChannelWatchInfo{
|
||||
Vchan: &datapb.VchannelInfo{},
|
||||
StartTs: time.Now().Unix(),
|
||||
State: datapb.ChannelWatchState_ToWatch,
|
||||
TimeoutTs: time.Now().Add(20 * time.Millisecond).UnixNano(),
|
||||
Vchan: &datapb.VchannelInfo{},
|
||||
StartTs: time.Now().Unix(),
|
||||
State: datapb.ChannelWatchState_ToWatch,
|
||||
}
|
||||
validData, err := proto.Marshal(&validWatchInfo)
|
||||
require.NoError(t, err)
|
||||
|
@ -87,18 +86,20 @@ func TestChannelStateTimer(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("test startOne", func(t *testing.T) {
|
||||
normalTimeoutTs := time.Now().Add(20 * time.Second).UnixNano()
|
||||
nowTimeoutTs := time.Now().UnixNano()
|
||||
zeroTimeoutTs := int64(0)
|
||||
normalTimeoutTs := 20 * time.Second
|
||||
nowTimeoutTs := 1 * time.Millisecond
|
||||
zeroTimeoutTs := 0 * time.Second
|
||||
resetTimeoutTs := 30 * time.Second
|
||||
tests := []struct {
|
||||
channelName string
|
||||
timeoutTs int64
|
||||
timeoutTs time.Duration
|
||||
|
||||
description string
|
||||
}{
|
||||
{"channel-1", normalTimeoutTs, "test stop"},
|
||||
{"channel-2", nowTimeoutTs, "test timeout"},
|
||||
{"channel-3", zeroTimeoutTs, "not start"},
|
||||
{"channel-4", resetTimeoutTs, "reset timer"},
|
||||
}
|
||||
|
||||
timer := newChannelStateTimer(kv)
|
||||
|
@ -112,6 +113,11 @@ func TestChannelStateTimer(t *testing.T) {
|
|||
e := <-timeoutCh
|
||||
assert.Equal(t, watchTimeoutAck, e.ackType)
|
||||
assert.Equal(t, test.channelName, e.channelName)
|
||||
} else if test.timeoutTs == resetTimeoutTs {
|
||||
timer.resetIfExist(test.channelName, nowTimeoutTs)
|
||||
e := <-timeoutCh
|
||||
assert.Equal(t, watchTimeoutAck, e.ackType)
|
||||
assert.Equal(t, test.channelName, e.channelName)
|
||||
} else {
|
||||
timer.stopIfExist(&ackEvent{watchSuccessAck, test.channelName, 1})
|
||||
}
|
||||
|
@ -123,18 +129,17 @@ func TestChannelStateTimer(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("test startOne no leaking issue 17335", func(t *testing.T) {
|
||||
timeoutTs := time.Now().Add(20 * time.Second).UnixNano()
|
||||
timer := newChannelStateTimer(kv)
|
||||
|
||||
timer.startOne(datapb.ChannelWatchState_ToRelease, "channel-1", 1, timeoutTs)
|
||||
stop, ok := timer.runningTimers.Load("channel-1")
|
||||
timer.startOne(datapb.ChannelWatchState_ToRelease, "channel-1", 1, 20*time.Second)
|
||||
stop, ok := timer.runningTimerStops.Load("channel-1")
|
||||
require.True(t, ok)
|
||||
|
||||
timer.startOne(datapb.ChannelWatchState_ToWatch, "channel-1", 1, timeoutTs)
|
||||
timer.startOne(datapb.ChannelWatchState_ToWatch, "channel-1", 1, 20*time.Second)
|
||||
_, ok = <-stop.(chan struct{})
|
||||
assert.False(t, ok)
|
||||
|
||||
stop2, ok := timer.runningTimers.Load("channel-1")
|
||||
stop2, ok := timer.runningTimerStops.Load("channel-1")
|
||||
assert.True(t, ok)
|
||||
|
||||
timer.removeTimers([]string{"channel-1"})
|
||||
|
@ -151,10 +156,9 @@ func TestChannelStateTimer_parses(t *testing.T) {
|
|||
|
||||
t.Run("test parseWatchInfo", func(t *testing.T) {
|
||||
validWatchInfo := datapb.ChannelWatchInfo{
|
||||
Vchan: &datapb.VchannelInfo{},
|
||||
StartTs: time.Now().Unix(),
|
||||
State: datapb.ChannelWatchState_ToWatch,
|
||||
TimeoutTs: time.Now().Add(20 * time.Millisecond).UnixNano(),
|
||||
Vchan: &datapb.VchannelInfo{},
|
||||
StartTs: time.Now().Unix(),
|
||||
State: datapb.ChannelWatchState_ToWatch,
|
||||
}
|
||||
validData, err := proto.Marshal(&validWatchInfo)
|
||||
require.NoError(t, err)
|
||||
|
@ -186,7 +190,6 @@ func TestChannelStateTimer_parses(t *testing.T) {
|
|||
assert.NotNil(t, info)
|
||||
assert.Equal(t, info.GetState(), validWatchInfo.GetState())
|
||||
assert.Equal(t, info.GetStartTs(), validWatchInfo.GetStartTs())
|
||||
assert.Equal(t, info.GetTimeoutTs(), validWatchInfo.GetTimeoutTs())
|
||||
} else {
|
||||
assert.Nil(t, info)
|
||||
assert.Error(t, err)
|
||||
|
@ -205,9 +208,8 @@ func TestChannelStateTimer_parses(t *testing.T) {
|
|||
DroppedSegments: []*datapb.SegmentInfo{{ID: 3}},
|
||||
UnflushedSegmentIds: []int64{1},
|
||||
},
|
||||
StartTs: time.Now().Unix(),
|
||||
State: datapb.ChannelWatchState_ToWatch,
|
||||
TimeoutTs: time.Now().Add(20 * time.Millisecond).UnixNano(),
|
||||
StartTs: time.Now().Unix(),
|
||||
State: datapb.ChannelWatchState_ToWatch,
|
||||
}
|
||||
|
||||
oldData, err := proto.Marshal(&oldWatchInfo)
|
||||
|
|
|
@ -192,6 +192,7 @@ func (c *ChannelManager) checkOldNodes(nodes []UniqueID) error {
|
|||
for nodeID, watchInfos := range nodeWatchInfos {
|
||||
for _, info := range watchInfos {
|
||||
channelName := info.GetVchan().GetChannelName()
|
||||
checkInterval := Params.DataCoordCfg.WatchTimeoutInterval.GetAsDuration(time.Second)
|
||||
|
||||
log.Info("processing watch info",
|
||||
zap.String("watch state", info.GetState().String()),
|
||||
|
@ -199,7 +200,7 @@ func (c *ChannelManager) checkOldNodes(nodes []UniqueID) error {
|
|||
|
||||
switch info.GetState() {
|
||||
case datapb.ChannelWatchState_ToWatch, datapb.ChannelWatchState_Uncomplete:
|
||||
c.stateTimer.startOne(datapb.ChannelWatchState_ToWatch, channelName, nodeID, info.GetTimeoutTs())
|
||||
c.stateTimer.startOne(datapb.ChannelWatchState_ToWatch, channelName, nodeID, checkInterval)
|
||||
|
||||
case datapb.ChannelWatchState_WatchFailure:
|
||||
if err := c.Release(nodeID, channelName); err != nil {
|
||||
|
@ -207,7 +208,7 @@ func (c *ChannelManager) checkOldNodes(nodes []UniqueID) error {
|
|||
}
|
||||
|
||||
case datapb.ChannelWatchState_ToRelease:
|
||||
c.stateTimer.startOne(datapb.ChannelWatchState_ToRelease, channelName, nodeID, info.GetTimeoutTs())
|
||||
c.stateTimer.startOne(datapb.ChannelWatchState_ToRelease, channelName, nodeID, checkInterval)
|
||||
|
||||
case datapb.ChannelWatchState_ReleaseSuccess:
|
||||
if err := c.Reassign(nodeID, channelName); err != nil {
|
||||
|
@ -446,11 +447,10 @@ func (c *ChannelManager) fillChannelWatchInfo(op *ChannelOp) {
|
|||
for _, ch := range op.Channels {
|
||||
vcInfo := c.h.GetDataVChanPositions(ch, allPartitionID)
|
||||
info := &datapb.ChannelWatchInfo{
|
||||
Vchan: vcInfo,
|
||||
StartTs: time.Now().Unix(),
|
||||
State: datapb.ChannelWatchState_Uncomplete,
|
||||
TimeoutTs: time.Now().Add(Params.DataCoordCfg.MaxWatchDuration.GetAsDuration(time.Second)).UnixNano(),
|
||||
Schema: ch.Schema,
|
||||
Vchan: vcInfo,
|
||||
StartTs: time.Now().Unix(),
|
||||
State: datapb.ChannelWatchState_Uncomplete,
|
||||
Schema: ch.Schema,
|
||||
}
|
||||
op.ChannelWatchInfos = append(op.ChannelWatchInfos, info)
|
||||
}
|
||||
|
@ -460,20 +460,19 @@ func (c *ChannelManager) fillChannelWatchInfo(op *ChannelOp) {
|
|||
func (c *ChannelManager) fillChannelWatchInfoWithState(op *ChannelOp, state datapb.ChannelWatchState) []string {
|
||||
var channelsWithTimer = []string{}
|
||||
startTs := time.Now().Unix()
|
||||
timeoutTs := time.Now().Add(Params.DataCoordCfg.MaxWatchDuration.GetAsDuration(time.Second)).UnixNano()
|
||||
checkInterval := Params.DataCoordCfg.WatchTimeoutInterval.GetAsDuration(time.Second)
|
||||
for _, ch := range op.Channels {
|
||||
vcInfo := c.h.GetDataVChanPositions(ch, allPartitionID)
|
||||
info := &datapb.ChannelWatchInfo{
|
||||
Vchan: vcInfo,
|
||||
StartTs: startTs,
|
||||
State: state,
|
||||
TimeoutTs: timeoutTs,
|
||||
Schema: ch.Schema,
|
||||
Vchan: vcInfo,
|
||||
StartTs: startTs,
|
||||
State: state,
|
||||
Schema: ch.Schema,
|
||||
}
|
||||
|
||||
// Only set timer for watchInfo not from bufferID
|
||||
if op.NodeID != bufferID {
|
||||
c.stateTimer.startOne(state, ch.Name, op.NodeID, timeoutTs)
|
||||
c.stateTimer.startOne(state, ch.Name, op.NodeID, checkInterval)
|
||||
channelsWithTimer = append(channelsWithTimer, ch.Name)
|
||||
}
|
||||
|
||||
|
@ -696,11 +695,13 @@ func (c *ChannelManager) watchChannelStatesLoop(ctx context.Context) {
|
|||
continue
|
||||
}
|
||||
|
||||
// ignore these states
|
||||
// runnging states
|
||||
state := watchInfo.GetState()
|
||||
if state == datapb.ChannelWatchState_ToWatch ||
|
||||
state == datapb.ChannelWatchState_ToRelease ||
|
||||
state == datapb.ChannelWatchState_Uncomplete {
|
||||
c.stateTimer.resetIfExist(watchInfo.GetVchan().ChannelName, Params.DataCoordCfg.WatchTimeoutInterval.GetAsDuration(time.Second))
|
||||
log.Info("tickle update, timer delay", zap.String("channel", watchInfo.GetVchan().ChannelName), zap.Int32("progress", watchInfo.Progress))
|
||||
continue
|
||||
}
|
||||
|
||||
|
|
|
@ -127,7 +127,7 @@ func TestChannelManager_StateTransfer(t *testing.T) {
|
|||
waitAndCheckState(t, metakv, datapb.ChannelWatchState_WatchSuccess, nodeID, cName, collectionID)
|
||||
|
||||
assert.Eventually(t, func() bool {
|
||||
_, loaded := chManager.stateTimer.runningTimers.Load(cName)
|
||||
_, loaded := chManager.stateTimer.runningTimerStops.Load(cName)
|
||||
return !loaded
|
||||
}, waitFor, tick)
|
||||
|
||||
|
@ -157,7 +157,7 @@ func TestChannelManager_StateTransfer(t *testing.T) {
|
|||
waitAndCheckState(t, metakv, datapb.ChannelWatchState_ToRelease, nodeID, cName, collectionID)
|
||||
|
||||
assert.Eventually(t, func() bool {
|
||||
_, loaded := chManager.stateTimer.runningTimers.Load(cName)
|
||||
_, loaded := chManager.stateTimer.runningTimerStops.Load(cName)
|
||||
return loaded
|
||||
}, waitFor, tick)
|
||||
|
||||
|
@ -193,7 +193,7 @@ func TestChannelManager_StateTransfer(t *testing.T) {
|
|||
|
||||
waitAndCheckState(t, metakv, datapb.ChannelWatchState_ToRelease, nodeID, cName, collectionID)
|
||||
assert.Eventually(t, func() bool {
|
||||
_, loaded := chManager.stateTimer.runningTimers.Load(cName)
|
||||
_, loaded := chManager.stateTimer.runningTimerStops.Load(cName)
|
||||
return loaded
|
||||
}, waitFor, tick)
|
||||
|
||||
|
@ -242,7 +242,7 @@ func TestChannelManager_StateTransfer(t *testing.T) {
|
|||
assert.Error(t, err)
|
||||
assert.Empty(t, w)
|
||||
|
||||
_, loaded := chManager.stateTimer.runningTimers.Load(cName)
|
||||
_, loaded := chManager.stateTimer.runningTimerStops.Load(cName)
|
||||
assert.True(t, loaded)
|
||||
chManager.stateTimer.removeTimers([]string{cName})
|
||||
})
|
||||
|
@ -279,7 +279,7 @@ func TestChannelManager_StateTransfer(t *testing.T) {
|
|||
waitAndCheckState(t, metakv, datapb.ChannelWatchState_ToWatch, nodeID, cName, collectionID)
|
||||
|
||||
assert.Eventually(t, func() bool {
|
||||
_, loaded := chManager.stateTimer.runningTimers.Load(cName)
|
||||
_, loaded := chManager.stateTimer.runningTimerStops.Load(cName)
|
||||
return loaded
|
||||
}, waitFor, tick)
|
||||
cancel()
|
||||
|
@ -331,7 +331,7 @@ func TestChannelManager_StateTransfer(t *testing.T) {
|
|||
assert.Error(t, err)
|
||||
assert.Empty(t, w)
|
||||
|
||||
_, loaded := chManager.stateTimer.runningTimers.Load(cName)
|
||||
_, loaded := chManager.stateTimer.runningTimerStops.Load(cName)
|
||||
assert.True(t, loaded)
|
||||
chManager.stateTimer.removeTimers([]string{cName})
|
||||
})
|
||||
|
@ -370,7 +370,7 @@ func TestChannelManager_StateTransfer(t *testing.T) {
|
|||
|
||||
waitAndCheckState(t, metakv, datapb.ChannelWatchState_ToWatch, nodeID, cName, collectionID)
|
||||
assert.Eventually(t, func() bool {
|
||||
_, loaded := chManager.stateTimer.runningTimers.Load(cName)
|
||||
_, loaded := chManager.stateTimer.runningTimerStops.Load(cName)
|
||||
return loaded
|
||||
}, waitFor, tick)
|
||||
|
||||
|
@ -585,7 +585,7 @@ func TestChannelManager(t *testing.T) {
|
|||
bufferID: {bufferID, []*channel{}},
|
||||
},
|
||||
}
|
||||
chManager.stateTimer.startOne(datapb.ChannelWatchState_ToRelease, "channel-1", 1, time.Now().Add(Params.DataCoordCfg.MaxWatchDuration.GetAsDuration(time.Second)).UnixNano())
|
||||
chManager.stateTimer.startOne(datapb.ChannelWatchState_ToRelease, "channel-1", 1, Params.DataCoordCfg.WatchTimeoutInterval.GetAsDuration(time.Second))
|
||||
|
||||
err = chManager.DeleteNode(1)
|
||||
assert.NoError(t, err)
|
||||
|
@ -755,8 +755,7 @@ func TestChannelManager_Reload(t *testing.T) {
|
|||
CollectionID: collectionID,
|
||||
ChannelName: channelName,
|
||||
},
|
||||
State: state,
|
||||
TimeoutTs: time.Now().Add(20 * time.Second).UnixNano(),
|
||||
State: state,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -773,7 +772,7 @@ func TestChannelManager_Reload(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
|
||||
chManager.checkOldNodes([]UniqueID{nodeID})
|
||||
_, ok := chManager.stateTimer.runningTimers.Load(channelName)
|
||||
_, ok := chManager.stateTimer.runningTimerStops.Load(channelName)
|
||||
assert.True(t, ok)
|
||||
chManager.stateTimer.removeTimers([]string{channelName})
|
||||
})
|
||||
|
@ -789,7 +788,7 @@ func TestChannelManager_Reload(t *testing.T) {
|
|||
err = chManager.checkOldNodes([]UniqueID{nodeID})
|
||||
assert.NoError(t, err)
|
||||
|
||||
_, ok := chManager.stateTimer.runningTimers.Load(channelName)
|
||||
_, ok := chManager.stateTimer.runningTimerStops.Load(channelName)
|
||||
assert.True(t, ok)
|
||||
chManager.stateTimer.removeTimers([]string{channelName})
|
||||
})
|
||||
|
|
|
@ -455,14 +455,14 @@ func BgCheckWithMaxWatchDuration(kv kv.TxnKV) ChannelBGChecker {
|
|||
return nil, err
|
||||
}
|
||||
reviseVChannelInfo(watchInfo.GetVchan())
|
||||
// if a channel is not watched after maxWatchDuration,
|
||||
// if a channel is not watched or update watch progress after WatchTimeoutInterval,
|
||||
// then we reallocate it to another node
|
||||
if watchInfo.State == datapb.ChannelWatchState_Complete || watchInfo.State == datapb.ChannelWatchState_WatchSuccess {
|
||||
continue
|
||||
}
|
||||
startTime := time.Unix(watchInfo.StartTs, 0)
|
||||
d := ts.Sub(startTime)
|
||||
if d >= Params.DataCoordCfg.MaxWatchDuration.GetAsDuration(time.Second) {
|
||||
if d >= Params.DataCoordCfg.WatchTimeoutInterval.GetAsDuration(time.Second) {
|
||||
cinfo.Channels = append(cinfo.Channels, c)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -402,7 +402,7 @@ func TestBgCheckWithMaxWatchDuration(t *testing.T) {
|
|||
getKv([]*watch{{1, "chan1", &datapb.ChannelWatchInfo{StartTs: ts.Unix(), State: datapb.ChannelWatchState_Uncomplete}},
|
||||
{1, "chan2", &datapb.ChannelWatchInfo{StartTs: ts.Unix(), State: datapb.ChannelWatchState_Complete}}}),
|
||||
[]*NodeChannelInfo{{1, []*channel{{Name: "chan1", CollectionID: 1}, {Name: "chan2", CollectionID: 1}}}},
|
||||
ts.Add(Params.DataCoordCfg.MaxWatchDuration.GetAsDuration(time.Second)),
|
||||
ts.Add(Params.DataCoordCfg.WatchTimeoutInterval.GetAsDuration(time.Second)),
|
||||
},
|
||||
[]*NodeChannelInfo{{1, []*channel{{Name: "chan1", CollectionID: 1}}}},
|
||||
nil,
|
||||
|
@ -412,7 +412,7 @@ func TestBgCheckWithMaxWatchDuration(t *testing.T) {
|
|||
args{
|
||||
getKv([]*watch{{1, "chan1", &datapb.ChannelWatchInfo{StartTs: ts.Unix(), State: datapb.ChannelWatchState_Uncomplete}}}),
|
||||
[]*NodeChannelInfo{{1, []*channel{{Name: "chan1", CollectionID: 1}}}},
|
||||
ts.Add(Params.DataCoordCfg.MaxWatchDuration.GetAsDuration(time.Second)).Add(-time.Second),
|
||||
ts.Add(Params.DataCoordCfg.WatchTimeoutInterval.GetAsDuration(time.Second)).Add(-time.Second),
|
||||
},
|
||||
[]*NodeChannelInfo{},
|
||||
nil,
|
||||
|
|
|
@ -363,6 +363,11 @@ func (node *DataNode) handleWatchInfo(e *event, key string, data []byte) {
|
|||
return
|
||||
}
|
||||
|
||||
if watchInfo.Progress != 0 {
|
||||
log.Info("DataNode received a PUT event with tickler update progress", zap.String("channel", watchInfo.Vchan.ChannelName), zap.Int64("version", e.version))
|
||||
return
|
||||
}
|
||||
|
||||
e.info = watchInfo
|
||||
e.vChanName = watchInfo.GetVchan().GetChannelName()
|
||||
log.Info("DataNode is handling watchInfo PUT event", zap.String("key", key), zap.Any("watch state", watchInfo.GetState().String()))
|
||||
|
@ -410,9 +415,13 @@ func parseDeleteEventKey(key string) string {
|
|||
|
||||
func (node *DataNode) handlePutEvent(watchInfo *datapb.ChannelWatchInfo, version int64) (err error) {
|
||||
vChanName := watchInfo.GetVchan().GetChannelName()
|
||||
key := path.Join(Params.CommonCfg.DataCoordWatchSubPath.GetValue(), fmt.Sprintf("%d", node.GetSession().ServerID), vChanName)
|
||||
tickler := newTickler(version, key, watchInfo, node.watchKv, Params.DataNodeCfg.WatchEventTicklerInterval.GetAsDuration(time.Second))
|
||||
|
||||
switch watchInfo.State {
|
||||
case datapb.ChannelWatchState_Uncomplete, datapb.ChannelWatchState_ToWatch:
|
||||
if err := node.flowgraphManager.addAndStart(node, watchInfo.GetVchan(), watchInfo.GetSchema()); err != nil {
|
||||
if err := node.flowgraphManager.addAndStart(node, watchInfo.GetVchan(), watchInfo.GetSchema(), tickler); err != nil {
|
||||
watchInfo.State = datapb.ChannelWatchState_WatchFailure
|
||||
return fmt.Errorf("fail to add and start flowgraph for vChanName: %s, err: %v", vChanName, err)
|
||||
}
|
||||
log.Info("handle put event: new data sync service success", zap.String("vChanName", vChanName))
|
||||
|
@ -429,10 +438,8 @@ func (node *DataNode) handlePutEvent(watchInfo *datapb.ChannelWatchInfo, version
|
|||
return fmt.Errorf("fail to marshal watchInfo with state, vChanName: %s, state: %s ,err: %w", vChanName, watchInfo.State.String(), err)
|
||||
}
|
||||
|
||||
key := path.Join(Params.CommonCfg.DataCoordWatchSubPath.GetValue(), fmt.Sprintf("%d", node.GetSession().ServerID), vChanName)
|
||||
|
||||
success, err := node.watchKv.CompareVersionAndSwap(key, version, string(v))
|
||||
// etcd error, retrying
|
||||
success, err := node.watchKv.CompareVersionAndSwap(key, tickler.version, string(v))
|
||||
// etcd error
|
||||
if err != nil {
|
||||
// flow graph will leak if not release, causing new datanode failed to subscribe
|
||||
node.tryToReleaseFlowgraph(vChanName)
|
||||
|
|
|
@ -202,7 +202,7 @@ func TestDataNode(t *testing.T) {
|
|||
|
||||
for i, test := range testDataSyncs {
|
||||
if i <= 2 {
|
||||
err = node.flowgraphManager.addAndStart(node, &datapb.VchannelInfo{CollectionID: 1, ChannelName: test.dmChannelName}, nil)
|
||||
err = node.flowgraphManager.addAndStart(node, &datapb.VchannelInfo{CollectionID: 1, ChannelName: test.dmChannelName}, nil, genTestTickler())
|
||||
assert.Nil(t, err)
|
||||
vchanNameCh <- test.dmChannelName
|
||||
}
|
||||
|
@ -273,9 +273,8 @@ func TestWatchChannel(t *testing.T) {
|
|||
UnflushedSegmentIds: []int64{},
|
||||
}
|
||||
info := &datapb.ChannelWatchInfo{
|
||||
State: datapb.ChannelWatchState_ToWatch,
|
||||
Vchan: vchan,
|
||||
TimeoutTs: time.Now().Add(time.Minute).UnixNano(),
|
||||
State: datapb.ChannelWatchState_ToWatch,
|
||||
Vchan: vchan,
|
||||
}
|
||||
val, err := proto.Marshal(info)
|
||||
assert.Nil(t, err)
|
||||
|
@ -332,9 +331,8 @@ func TestWatchChannel(t *testing.T) {
|
|||
UnflushedSegmentIds: []int64{},
|
||||
}
|
||||
info := &datapb.ChannelWatchInfo{
|
||||
State: datapb.ChannelWatchState_ToRelease,
|
||||
Vchan: vchan,
|
||||
TimeoutTs: time.Now().Add(time.Minute).UnixNano(),
|
||||
State: datapb.ChannelWatchState_ToRelease,
|
||||
Vchan: vchan,
|
||||
}
|
||||
val, err := proto.Marshal(info)
|
||||
assert.Nil(t, err)
|
||||
|
@ -396,9 +394,8 @@ func TestWatchChannel(t *testing.T) {
|
|||
m.Run()
|
||||
|
||||
info = datapb.ChannelWatchInfo{
|
||||
Vchan: &datapb.VchannelInfo{ChannelName: ch},
|
||||
State: datapb.ChannelWatchState_Uncomplete,
|
||||
TimeoutTs: time.Now().Add(time.Minute).UnixNano(),
|
||||
Vchan: &datapb.VchannelInfo{ChannelName: ch},
|
||||
State: datapb.ChannelWatchState_Uncomplete,
|
||||
}
|
||||
bs, err = proto.Marshal(&info)
|
||||
assert.NoError(t, err)
|
||||
|
@ -437,9 +434,8 @@ func TestWatchChannel(t *testing.T) {
|
|||
}
|
||||
|
||||
info := datapb.ChannelWatchInfo{
|
||||
Vchan: &datapb.VchannelInfo{ChannelName: ch},
|
||||
State: datapb.ChannelWatchState_Uncomplete,
|
||||
TimeoutTs: time.Now().Add(time.Minute).UnixNano(),
|
||||
Vchan: &datapb.VchannelInfo{ChannelName: ch},
|
||||
State: datapb.ChannelWatchState_Uncomplete,
|
||||
}
|
||||
bs, err := proto.Marshal(&info)
|
||||
assert.NoError(t, err)
|
||||
|
@ -460,8 +456,7 @@ func TestWatchChannel(t *testing.T) {
|
|||
DroppedSegments: []*datapb.SegmentInfo{{ID: 3}},
|
||||
UnflushedSegmentIds: []int64{1},
|
||||
},
|
||||
State: datapb.ChannelWatchState_Uncomplete,
|
||||
TimeoutTs: time.Now().Add(time.Minute).UnixNano(),
|
||||
State: datapb.ChannelWatchState_Uncomplete,
|
||||
}
|
||||
bs, err := proto.Marshal(&info)
|
||||
assert.NoError(t, err)
|
||||
|
|
|
@ -25,6 +25,7 @@ import (
|
|||
"go.uber.org/zap"
|
||||
|
||||
"github.com/milvus-io/milvus-proto/go-api/commonpb"
|
||||
"github.com/milvus-io/milvus/internal/kv"
|
||||
"github.com/milvus-io/milvus/internal/log"
|
||||
"github.com/milvus-io/milvus/internal/metrics"
|
||||
"github.com/milvus-io/milvus/internal/mq/msgdispatcher"
|
||||
|
@ -63,6 +64,7 @@ type dataSyncService struct {
|
|||
chunkManager storage.ChunkManager
|
||||
compactor *compactionExecutor // reference to compaction executor
|
||||
|
||||
kv kv.MetaKv
|
||||
serverID int64
|
||||
stopOnce sync.Once
|
||||
flushListener chan *segmentFlushPack // chan to listen flush event
|
||||
|
@ -81,6 +83,7 @@ func newDataSyncService(ctx context.Context,
|
|||
flushingSegCache *Cache,
|
||||
chunkManager storage.ChunkManager,
|
||||
compactor *compactionExecutor,
|
||||
tickler *tickler,
|
||||
serverID int64,
|
||||
) (*dataSyncService, error) {
|
||||
|
||||
|
@ -117,7 +120,7 @@ func newDataSyncService(ctx context.Context,
|
|||
serverID: serverID,
|
||||
}
|
||||
|
||||
if err := service.initNodes(vchan); err != nil {
|
||||
if err := service.initNodes(vchan, tickler); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return service, nil
|
||||
|
@ -179,7 +182,7 @@ func (dsService *dataSyncService) clearGlobalFlushingCache() {
|
|||
}
|
||||
|
||||
// initNodes inits a TimetickedFlowGraph
|
||||
func (dsService *dataSyncService) initNodes(vchanInfo *datapb.VchannelInfo) error {
|
||||
func (dsService *dataSyncService) initNodes(vchanInfo *datapb.VchannelInfo, tickler *tickler) error {
|
||||
dsService.fg = flowgraph.NewTimeTickedFlowGraph(dsService.ctx)
|
||||
// initialize flush manager for DataSync Service
|
||||
dsService.flushManager = NewRendezvousFlushManager(dsService.idAllocator, dsService.chunkManager, dsService.channel,
|
||||
|
@ -235,6 +238,7 @@ func (dsService *dataSyncService) initNodes(vchanInfo *datapb.VchannelInfo) erro
|
|||
recoverTs: vchanInfo.GetSeekPosition().GetTimestamp()}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
tickler.inc()
|
||||
return nil, nil
|
||||
})
|
||||
futures = append(futures, future)
|
||||
|
@ -270,11 +274,16 @@ func (dsService *dataSyncService) initNodes(vchanInfo *datapb.VchannelInfo) erro
|
|||
}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
tickler.inc()
|
||||
return nil, nil
|
||||
})
|
||||
futures = append(futures, future)
|
||||
}
|
||||
|
||||
//tickler will update addSegment progress to watchInfo
|
||||
tickler.watch()
|
||||
defer tickler.stop()
|
||||
|
||||
err = concurrency.AwaitAll(futures...)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
@ -181,6 +181,7 @@ func TestDataSyncService_newDataSyncService(te *testing.T) {
|
|||
newCache(),
|
||||
cm,
|
||||
newCompactionExecutor(),
|
||||
genTestTickler(),
|
||||
0,
|
||||
)
|
||||
|
||||
|
@ -279,7 +280,7 @@ func TestDataSyncService_Start(t *testing.T) {
|
|||
},
|
||||
}
|
||||
|
||||
sync, err := newDataSyncService(ctx, flushChan, resendTTChan, channel, allocFactory, dispClient, factory, vchan, signalCh, dataCoord, newCache(), cm, newCompactionExecutor(), 0)
|
||||
sync, err := newDataSyncService(ctx, flushChan, resendTTChan, channel, allocFactory, dispClient, factory, vchan, signalCh, dataCoord, newCache(), cm, newCompactionExecutor(), genTestTickler(), 0)
|
||||
assert.Nil(t, err)
|
||||
|
||||
sync.flushListener = make(chan *segmentFlushPack)
|
||||
|
@ -431,7 +432,7 @@ func TestDataSyncService_Close(t *testing.T) {
|
|||
paramtable.Get().Reset(Params.DataNodeCfg.FlushInsertBufferSize.Key)
|
||||
|
||||
channel := newChannel(insertChannelName, collMeta.ID, collMeta.GetSchema(), mockRootCoord, cm)
|
||||
sync, err := newDataSyncService(ctx, flushChan, resendTTChan, channel, allocFactory, dispClient, factory, vchan, signalCh, mockDataCoord, newCache(), cm, newCompactionExecutor(), 0)
|
||||
sync, err := newDataSyncService(ctx, flushChan, resendTTChan, channel, allocFactory, dispClient, factory, vchan, signalCh, mockDataCoord, newCache(), cm, newCompactionExecutor(), genTestTickler(), 0)
|
||||
assert.Nil(t, err)
|
||||
|
||||
sync.flushListener = make(chan *segmentFlushPack, 10)
|
||||
|
|
|
@ -20,9 +20,11 @@ import (
|
|||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/golang/protobuf/proto"
|
||||
"github.com/milvus-io/milvus/internal/kv"
|
||||
"github.com/milvus-io/milvus/internal/log"
|
||||
"github.com/milvus-io/milvus/internal/proto/datapb"
|
||||
|
||||
"go.uber.org/atomic"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
|
@ -67,7 +69,7 @@ func (e *channelEventManager) Run() {
|
|||
case event := <-e.eventChan:
|
||||
switch event.eventType {
|
||||
case putEventType:
|
||||
e.retryHandlePutEvent(event)
|
||||
e.handlePutEvent(event.info, event.version)
|
||||
case deleteEventType:
|
||||
e.handleDeleteEvent(event.vChanName)
|
||||
}
|
||||
|
@ -78,65 +80,6 @@ func (e *channelEventManager) Run() {
|
|||
}()
|
||||
}
|
||||
|
||||
func (e *channelEventManager) retryHandlePutEvent(event event) {
|
||||
countdown := time.Until(time.Unix(0, event.info.TimeoutTs))
|
||||
if countdown < 0 {
|
||||
log.Warn("event already timed out", zap.String("vChanName", event.vChanName))
|
||||
return
|
||||
}
|
||||
// Trigger retry for-loop when fail to handle put event for the first time
|
||||
if err := e.handlePutEvent(event.info, event.version); err != nil {
|
||||
timer := time.NewTimer(countdown)
|
||||
defer timer.Stop()
|
||||
ticker := time.NewTicker(e.retryInterval)
|
||||
defer ticker.Stop()
|
||||
for {
|
||||
log.Warn("handle put event fail, starting retry",
|
||||
zap.String("vChanName", event.vChanName),
|
||||
zap.String("retry interval", e.retryInterval.String()),
|
||||
zap.Error(err))
|
||||
|
||||
// reset the ticker
|
||||
ticker.Reset(e.retryInterval)
|
||||
|
||||
select {
|
||||
case <-ticker.C:
|
||||
// ticker notify, do another retry
|
||||
case <-timer.C:
|
||||
// timeout
|
||||
log.Warn("event process timed out", zap.String("vChanName", event.vChanName))
|
||||
return
|
||||
case evt, ok := <-e.eventChan:
|
||||
if !ok {
|
||||
log.Warn("event channel closed", zap.String("vChanName", event.vChanName))
|
||||
return
|
||||
}
|
||||
// When got another put event, overwrite current event
|
||||
if evt.eventType == putEventType {
|
||||
// handles only Uncomplete, ToWatch and ToRelease
|
||||
if isEndWatchState(evt.info.State) {
|
||||
return
|
||||
}
|
||||
event = evt
|
||||
}
|
||||
// When getting a delete event at next retry, exit retry loop
|
||||
// When getting a put event, just continue the retry
|
||||
if evt.eventType == deleteEventType {
|
||||
log.Warn("delete event triggerred, terminating retry.",
|
||||
zap.String("vChanName", event.vChanName))
|
||||
e.handleDeleteEvent(evt.vChanName)
|
||||
return
|
||||
}
|
||||
}
|
||||
err = e.handlePutEvent(event.info, event.version)
|
||||
if err == nil {
|
||||
log.Info("handle put event successfully", zap.String("vChanName", event.vChanName))
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (e *channelEventManager) handleEvent(event event) {
|
||||
e.eventChan <- event
|
||||
}
|
||||
|
@ -152,3 +95,88 @@ func isEndWatchState(state datapb.ChannelWatchState) bool {
|
|||
state != datapb.ChannelWatchState_ToRelease && // start release
|
||||
state != datapb.ChannelWatchState_Uncomplete // legacy state, equal to ToWatch
|
||||
}
|
||||
|
||||
type tickler struct {
|
||||
progress *atomic.Int32
|
||||
version int64
|
||||
|
||||
kv kv.MetaKv
|
||||
path string
|
||||
watchInfo *datapb.ChannelWatchInfo
|
||||
|
||||
interval time.Duration
|
||||
closeCh chan struct{}
|
||||
closeWg sync.WaitGroup
|
||||
}
|
||||
|
||||
func (t *tickler) inc() {
|
||||
t.progress.Inc()
|
||||
}
|
||||
|
||||
func (t *tickler) watch() {
|
||||
if t.interval == 0 {
|
||||
log.Info("zero interval, close ticler watch",
|
||||
zap.String("channel name", t.watchInfo.GetVchan().GetChannelName()),
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
t.closeWg.Add(1)
|
||||
ticker := time.NewTicker(t.interval)
|
||||
go func() {
|
||||
for {
|
||||
select {
|
||||
case <-ticker.C:
|
||||
nowProgress := t.progress.Load()
|
||||
if t.watchInfo.Progress == nowProgress {
|
||||
continue
|
||||
}
|
||||
|
||||
t.watchInfo.Progress = nowProgress
|
||||
v, err := proto.Marshal(t.watchInfo)
|
||||
if err != nil {
|
||||
log.Error("fail to marshal watchInfo with progress at tickler",
|
||||
zap.String("vChanName", t.watchInfo.Vchan.ChannelName),
|
||||
zap.Int32("progree", nowProgress),
|
||||
zap.Error(err))
|
||||
return
|
||||
}
|
||||
success, err := t.kv.CompareVersionAndSwap(t.path, t.version, string(v))
|
||||
if err != nil {
|
||||
log.Error("tickler update failed", zap.Error(err))
|
||||
continue
|
||||
}
|
||||
|
||||
if !success {
|
||||
log.Error("tickler update failed: failed to compare version and swap",
|
||||
zap.String("key", t.path), zap.Int32("progress", nowProgress), zap.Int64("version", t.version),
|
||||
zap.String("vChanName", t.watchInfo.GetVchan().ChannelName))
|
||||
return
|
||||
}
|
||||
log.Debug("tickler update success", zap.Int32("progress", nowProgress), zap.Int64("version", t.version),
|
||||
zap.String("vChanName", t.watchInfo.GetVchan().ChannelName))
|
||||
t.version++
|
||||
case <-t.closeCh:
|
||||
t.closeWg.Done()
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func (t *tickler) stop() {
|
||||
close(t.closeCh)
|
||||
t.closeWg.Wait()
|
||||
}
|
||||
|
||||
func newTickler(version int64, path string, watchInfo *datapb.ChannelWatchInfo, kv kv.MetaKv, interval time.Duration) *tickler {
|
||||
return &tickler{
|
||||
progress: atomic.NewInt32(0),
|
||||
path: path,
|
||||
kv: kv,
|
||||
watchInfo: watchInfo,
|
||||
version: version,
|
||||
interval: interval,
|
||||
closeCh: make(chan struct{}),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,12 +18,14 @@ package datanode
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"path"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/golang/protobuf/proto"
|
||||
"github.com/milvus-io/milvus/internal/proto/datapb"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"go.uber.org/atomic"
|
||||
)
|
||||
|
||||
func TestChannelEventManager(t *testing.T) {
|
||||
|
@ -41,97 +43,12 @@ func TestChannelEventManager(t *testing.T) {
|
|||
eventType: putEventType,
|
||||
vChanName: "",
|
||||
version: 0,
|
||||
info: &datapb.ChannelWatchInfo{
|
||||
TimeoutTs: time.Now().Add(time.Minute).UnixNano(),
|
||||
},
|
||||
info: &datapb.ChannelWatchInfo{},
|
||||
})
|
||||
<-ch
|
||||
assert.True(t, ran)
|
||||
})
|
||||
|
||||
t.Run("event already timeout", func(t *testing.T) {
|
||||
ch := make(chan struct{}, 1)
|
||||
ran := false
|
||||
em := newChannelEventManager(func(info *datapb.ChannelWatchInfo, version int64) error {
|
||||
ran = true
|
||||
ch <- struct{}{}
|
||||
return nil
|
||||
}, func(name string) {}, time.Millisecond*10)
|
||||
|
||||
em.Run()
|
||||
em.handleEvent(event{
|
||||
eventType: putEventType,
|
||||
vChanName: "",
|
||||
version: 0,
|
||||
info: &datapb.ChannelWatchInfo{
|
||||
TimeoutTs: time.Now().Add(-time.Minute).UnixNano(),
|
||||
},
|
||||
})
|
||||
select {
|
||||
case <-ch:
|
||||
t.FailNow()
|
||||
case <-time.NewTimer(time.Millisecond * 100).C:
|
||||
}
|
||||
assert.False(t, ran)
|
||||
})
|
||||
|
||||
t.Run("retry success", func(t *testing.T) {
|
||||
ch := make(chan struct{}, 1)
|
||||
ran := false
|
||||
counter := atomic.Int32{}
|
||||
counter.Store(0)
|
||||
em := newChannelEventManager(func(info *datapb.ChannelWatchInfo, version int64) error {
|
||||
current := counter.Add(1)
|
||||
if current == 2 {
|
||||
ran = true
|
||||
ch <- struct{}{}
|
||||
return nil
|
||||
}
|
||||
|
||||
return errors.New("mocked error")
|
||||
}, func(name string) {}, time.Millisecond*10)
|
||||
|
||||
em.Run()
|
||||
em.handleEvent(event{
|
||||
eventType: putEventType,
|
||||
vChanName: "",
|
||||
version: 0,
|
||||
info: &datapb.ChannelWatchInfo{
|
||||
TimeoutTs: time.Now().Add(time.Minute).UnixNano(),
|
||||
},
|
||||
})
|
||||
<-ch
|
||||
assert.True(t, ran)
|
||||
})
|
||||
|
||||
t.Run("retry until timeout", func(t *testing.T) {
|
||||
em := newChannelEventManager(func(info *datapb.ChannelWatchInfo, version int64) error {
|
||||
return errors.New("mocked error")
|
||||
}, func(name string) {}, time.Millisecond*100)
|
||||
|
||||
ch := make(chan struct{}, 1)
|
||||
|
||||
go func() {
|
||||
ddl := time.Now().Add(time.Millisecond * 50)
|
||||
evt := event{
|
||||
eventType: putEventType,
|
||||
vChanName: "",
|
||||
version: 0,
|
||||
info: &datapb.ChannelWatchInfo{
|
||||
TimeoutTs: ddl.UnixNano(),
|
||||
},
|
||||
}
|
||||
em.retryHandlePutEvent(evt)
|
||||
ch <- struct{}{}
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-ch:
|
||||
case <-time.NewTimer(time.Second).C:
|
||||
t.FailNow()
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("close behavior", func(t *testing.T) {
|
||||
ch := make(chan struct{}, 1)
|
||||
em := newChannelEventManager(func(info *datapb.ChannelWatchInfo, version int64) error {
|
||||
|
@ -139,25 +56,22 @@ func TestChannelEventManager(t *testing.T) {
|
|||
}, func(name string) {}, time.Millisecond*10)
|
||||
|
||||
go func() {
|
||||
ddl := time.Now().Add(time.Minute)
|
||||
evt := event{
|
||||
eventType: putEventType,
|
||||
vChanName: "",
|
||||
version: 0,
|
||||
info: &datapb.ChannelWatchInfo{
|
||||
TimeoutTs: ddl.UnixNano(),
|
||||
},
|
||||
info: &datapb.ChannelWatchInfo{},
|
||||
}
|
||||
em.retryHandlePutEvent(evt)
|
||||
em.handleEvent(evt)
|
||||
ch <- struct{}{}
|
||||
}()
|
||||
|
||||
close(em.eventChan)
|
||||
select {
|
||||
case <-ch:
|
||||
case <-time.NewTimer(time.Second).C:
|
||||
t.FailNow()
|
||||
}
|
||||
close(em.eventChan)
|
||||
|
||||
assert.NotPanics(t, func() {
|
||||
em.Close()
|
||||
|
@ -183,17 +97,13 @@ func TestChannelEventManager(t *testing.T) {
|
|||
eventType: putEventType,
|
||||
vChanName: "",
|
||||
version: 0,
|
||||
info: &datapb.ChannelWatchInfo{
|
||||
TimeoutTs: time.Now().Add(time.Minute).UnixNano(),
|
||||
},
|
||||
info: &datapb.ChannelWatchInfo{},
|
||||
})
|
||||
em.handleEvent(event{
|
||||
eventType: deleteEventType,
|
||||
vChanName: "",
|
||||
version: 0,
|
||||
info: &datapb.ChannelWatchInfo{
|
||||
TimeoutTs: time.Now().Add(time.Minute).UnixNano(),
|
||||
},
|
||||
info: &datapb.ChannelWatchInfo{},
|
||||
})
|
||||
<-ch
|
||||
assert.True(t, ran)
|
||||
|
@ -219,8 +129,7 @@ func TestChannelEventManager(t *testing.T) {
|
|||
vChanName: "",
|
||||
version: 0,
|
||||
info: &datapb.ChannelWatchInfo{
|
||||
State: datapb.ChannelWatchState_ToWatch,
|
||||
TimeoutTs: time.Now().Add(time.Minute).UnixNano(),
|
||||
State: datapb.ChannelWatchState_ToWatch,
|
||||
},
|
||||
})
|
||||
em.handleEvent(event{
|
||||
|
@ -228,62 +137,72 @@ func TestChannelEventManager(t *testing.T) {
|
|||
vChanName: "",
|
||||
version: 1,
|
||||
info: &datapb.ChannelWatchInfo{
|
||||
State: datapb.ChannelWatchState_ToWatch,
|
||||
TimeoutTs: time.Now().Add(time.Minute).UnixNano(),
|
||||
State: datapb.ChannelWatchState_ToWatch,
|
||||
},
|
||||
})
|
||||
<-ch
|
||||
assert.True(t, ran)
|
||||
})
|
||||
|
||||
t.Run("canceled by EndStates", func(t *testing.T) {
|
||||
endStates := []datapb.ChannelWatchState{
|
||||
datapb.ChannelWatchState_Complete,
|
||||
datapb.ChannelWatchState_WatchSuccess,
|
||||
datapb.ChannelWatchState_WatchFailure,
|
||||
datapb.ChannelWatchState_ReleaseSuccess,
|
||||
datapb.ChannelWatchState_ReleaseFailure,
|
||||
}
|
||||
|
||||
for _, es := range endStates {
|
||||
em := newChannelEventManager(
|
||||
func(info *datapb.ChannelWatchInfo, version int64) error {
|
||||
return errors.New("mocked error")
|
||||
},
|
||||
func(name string) {},
|
||||
time.Millisecond*100,
|
||||
)
|
||||
|
||||
ch := make(chan struct{}, 1)
|
||||
ddl := time.Now().Add(time.Minute)
|
||||
|
||||
go func() {
|
||||
evt := event{
|
||||
eventType: putEventType,
|
||||
vChanName: "",
|
||||
version: 0,
|
||||
info: &datapb.ChannelWatchInfo{
|
||||
TimeoutTs: ddl.UnixNano(),
|
||||
},
|
||||
}
|
||||
em.retryHandlePutEvent(evt)
|
||||
ch <- struct{}{}
|
||||
}()
|
||||
|
||||
em.eventChan <- event{
|
||||
eventType: putEventType,
|
||||
vChanName: "",
|
||||
version: 0,
|
||||
info: &datapb.ChannelWatchInfo{
|
||||
State: es,
|
||||
TimeoutTs: ddl.UnixNano(),
|
||||
},
|
||||
}
|
||||
select {
|
||||
case <-ch:
|
||||
case <-time.NewTimer(time.Minute).C:
|
||||
t.FailNow()
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func parseWatchInfo(key string, data []byte) (*datapb.ChannelWatchInfo, error) {
|
||||
watchInfo := datapb.ChannelWatchInfo{}
|
||||
if err := proto.Unmarshal(data, &watchInfo); err != nil {
|
||||
return nil, fmt.Errorf("invalid event data: fail to parse ChannelWatchInfo, key: %s, err: %v", key, err)
|
||||
|
||||
}
|
||||
|
||||
if watchInfo.Vchan == nil {
|
||||
return nil, fmt.Errorf("invalid event: ChannelWatchInfo with nil VChannelInfo, key: %s", key)
|
||||
}
|
||||
reviseVChannelInfo(watchInfo.GetVchan())
|
||||
|
||||
return &watchInfo, nil
|
||||
}
|
||||
|
||||
func TestEventTickler(t *testing.T) {
|
||||
channelName := "test-channel"
|
||||
etcdPrefix := "test_path"
|
||||
|
||||
kv, err := newTestEtcdKV()
|
||||
assert.NoError(t, err)
|
||||
kv.RemoveWithPrefix(etcdPrefix)
|
||||
defer kv.RemoveWithPrefix(etcdPrefix)
|
||||
|
||||
tickler := newTickler(0, path.Join(etcdPrefix, channelName), &datapb.ChannelWatchInfo{
|
||||
Vchan: &datapb.VchannelInfo{
|
||||
ChannelName: channelName,
|
||||
},
|
||||
}, kv, 100*time.Millisecond)
|
||||
defer tickler.stop()
|
||||
endCh := make(chan struct{}, 1)
|
||||
go func() {
|
||||
watchCh := kv.WatchWithPrefix(etcdPrefix)
|
||||
for {
|
||||
event, ok := <-watchCh
|
||||
assert.True(t, ok)
|
||||
for _, evt := range event.Events {
|
||||
key := string(evt.Kv.Key)
|
||||
watchInfo, err := parseWatchInfo(key, evt.Kv.Value)
|
||||
assert.NoError(t, err)
|
||||
if watchInfo.GetVchan().GetChannelName() == channelName {
|
||||
assert.Equal(t, int32(1), watchInfo.Progress)
|
||||
endCh <- struct{}{}
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}()
|
||||
|
||||
tickler.inc()
|
||||
tickler.watch()
|
||||
assert.Eventually(t, func() bool {
|
||||
select {
|
||||
case <-endCh:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}, 4*time.Second, 100*time.Millisecond)
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ func newFlowgraphManager() *flowgraphManager {
|
|||
return &flowgraphManager{}
|
||||
}
|
||||
|
||||
func (fm *flowgraphManager) addAndStart(dn *DataNode, vchan *datapb.VchannelInfo, schema *schemapb.CollectionSchema) error {
|
||||
func (fm *flowgraphManager) addAndStart(dn *DataNode, vchan *datapb.VchannelInfo, schema *schemapb.CollectionSchema, tickler *tickler) error {
|
||||
if _, ok := fm.flowgraphs.Load(vchan.GetChannelName()); ok {
|
||||
log.Warn("try to add an existed DataSyncService", zap.String("vChannelName", vchan.GetChannelName()))
|
||||
return nil
|
||||
|
@ -48,7 +48,7 @@ func (fm *flowgraphManager) addAndStart(dn *DataNode, vchan *datapb.VchannelInfo
|
|||
var alloc allocatorInterface = newAllocator(dn.rootCoord)
|
||||
|
||||
dataSyncService, err := newDataSyncService(dn.ctx, make(chan flushMsg, 100), make(chan resendTTMsg, 100), channel,
|
||||
alloc, dn.dispClient, dn.factory, vchan, dn.clearSignal, dn.dataCoord, dn.segmentCache, dn.chunkManager, dn.compactionExecutor, dn.GetSession().ServerID)
|
||||
alloc, dn.dispClient, dn.factory, vchan, dn.clearSignal, dn.dataCoord, dn.segmentCache, dn.chunkManager, dn.compactionExecutor, tickler, dn.GetSession().ServerID)
|
||||
if err != nil {
|
||||
log.Warn("new data sync service fail", zap.String("vChannelName", vchan.GetChannelName()), zap.Error(err))
|
||||
return err
|
||||
|
|
|
@ -64,7 +64,7 @@ func TestFlowGraphManager(t *testing.T) {
|
|||
}
|
||||
require.False(t, fm.exist(vchanName))
|
||||
|
||||
err := fm.addAndStart(node, vchan, nil)
|
||||
err := fm.addAndStart(node, vchan, nil, genTestTickler())
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, fm.exist(vchanName))
|
||||
|
||||
|
@ -79,7 +79,7 @@ func TestFlowGraphManager(t *testing.T) {
|
|||
}
|
||||
require.False(t, fm.exist(vchanName))
|
||||
|
||||
err := fm.addAndStart(node, vchan, nil)
|
||||
err := fm.addAndStart(node, vchan, nil, genTestTickler())
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, fm.exist(vchanName))
|
||||
|
||||
|
@ -97,7 +97,7 @@ func TestFlowGraphManager(t *testing.T) {
|
|||
}
|
||||
require.False(t, fm.exist(vchanName))
|
||||
|
||||
err := fm.addAndStart(node, vchan, nil)
|
||||
err := fm.addAndStart(node, vchan, nil, genTestTickler())
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, fm.exist(vchanName))
|
||||
fg, ok := fm.getFlowgraphService(vchanName)
|
||||
|
@ -145,7 +145,7 @@ func TestFlowGraphManager(t *testing.T) {
|
|||
}
|
||||
require.False(t, fm.exist(vchanName))
|
||||
|
||||
err := fm.addAndStart(node, vchan, nil)
|
||||
err := fm.addAndStart(node, vchan, nil, genTestTickler())
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, fm.exist(vchanName))
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@ import (
|
|||
"github.com/milvus-io/milvus-proto/go-api/milvuspb"
|
||||
"github.com/milvus-io/milvus-proto/go-api/schemapb"
|
||||
"github.com/milvus-io/milvus/internal/common"
|
||||
"github.com/milvus-io/milvus/internal/kv"
|
||||
etcdkv "github.com/milvus-io/milvus/internal/kv/etcd"
|
||||
"github.com/milvus-io/milvus/internal/log"
|
||||
"github.com/milvus-io/milvus/internal/mq/msgdispatcher"
|
||||
|
@ -136,6 +137,22 @@ func makeNewChannelNames(names []string, suffix string) []string {
|
|||
return ret
|
||||
}
|
||||
|
||||
func newTestEtcdKV() (kv.MetaKv, error) {
|
||||
etcdCli, err := etcd.GetEtcdClient(
|
||||
Params.EtcdCfg.UseEmbedEtcd.GetAsBool(),
|
||||
Params.EtcdCfg.EtcdUseSSL.GetAsBool(),
|
||||
Params.EtcdCfg.Endpoints.GetAsStrings(),
|
||||
Params.EtcdCfg.EtcdTLSCert.GetValue(),
|
||||
Params.EtcdCfg.EtcdTLSKey.GetValue(),
|
||||
Params.EtcdCfg.EtcdTLSCACert.GetValue(),
|
||||
Params.EtcdCfg.EtcdTLSMinVersion.GetValue())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return etcdkv.NewEtcdKV(etcdCli, Params.EtcdCfg.MetaRootPath.GetValue()), nil
|
||||
}
|
||||
|
||||
func clearEtcd(rootPath string) error {
|
||||
client, err := etcd.GetEtcdClient(
|
||||
Params.EtcdCfg.UseEmbedEtcd.GetAsBool(),
|
||||
|
@ -1293,3 +1310,7 @@ func genTimestamp() typeutil.Timestamp {
|
|||
gb := time.Date(2009, time.Month(11), 10, 23, 0, 0, 0, time.UTC)
|
||||
return tsoutil.ComposeTSByTime(gb, 0)
|
||||
}
|
||||
|
||||
func genTestTickler() *tickler {
|
||||
return newTickler(0, "", nil, nil, 0)
|
||||
}
|
||||
|
|
|
@ -185,7 +185,7 @@ func (s *DataNodeServicesSuite) TestFlushSegments() {
|
|||
FlushedSegmentIds: []int64{},
|
||||
}
|
||||
|
||||
err := s.node.flowgraphManager.addAndStart(s.node, vchan, nil)
|
||||
err := s.node.flowgraphManager.addAndStart(s.node, vchan, nil, genTestTickler())
|
||||
s.Require().NoError(err)
|
||||
|
||||
fgservice, ok := s.node.flowgraphManager.getFlowgraphService(dmChannelName)
|
||||
|
@ -391,14 +391,14 @@ func (s *DataNodeServicesSuite) TestImport() {
|
|||
ChannelName: chName1,
|
||||
UnflushedSegmentIds: []int64{},
|
||||
FlushedSegmentIds: []int64{},
|
||||
}, nil)
|
||||
}, nil, genTestTickler())
|
||||
s.Require().Nil(err)
|
||||
err = s.node.flowgraphManager.addAndStart(s.node, &datapb.VchannelInfo{
|
||||
CollectionID: 100,
|
||||
ChannelName: chName2,
|
||||
UnflushedSegmentIds: []int64{},
|
||||
FlushedSegmentIds: []int64{},
|
||||
}, nil)
|
||||
}, nil, genTestTickler())
|
||||
s.Require().Nil(err)
|
||||
|
||||
_, ok := s.node.flowgraphManager.getFlowgraphService(chName1)
|
||||
|
@ -452,14 +452,14 @@ func (s *DataNodeServicesSuite) TestImport() {
|
|||
ChannelName: chName1,
|
||||
UnflushedSegmentIds: []int64{},
|
||||
FlushedSegmentIds: []int64{},
|
||||
}, nil)
|
||||
}, nil, genTestTickler())
|
||||
s.Require().Nil(err)
|
||||
err = s.node.flowgraphManager.addAndStart(s.node, &datapb.VchannelInfo{
|
||||
CollectionID: 999, // wrong collection ID.
|
||||
ChannelName: chName2,
|
||||
UnflushedSegmentIds: []int64{},
|
||||
FlushedSegmentIds: []int64{},
|
||||
}, nil)
|
||||
}, nil, genTestTickler())
|
||||
s.Require().Nil(err)
|
||||
|
||||
_, ok := s.node.flowgraphManager.getFlowgraphService(chName1)
|
||||
|
@ -564,14 +564,14 @@ func (s *DataNodeServicesSuite) TestAddImportSegment() {
|
|||
ChannelName: chName1,
|
||||
UnflushedSegmentIds: []int64{},
|
||||
FlushedSegmentIds: []int64{},
|
||||
}, nil)
|
||||
}, nil, genTestTickler())
|
||||
s.Require().NoError(err)
|
||||
err = s.node.flowgraphManager.addAndStart(s.node, &datapb.VchannelInfo{
|
||||
CollectionID: 100,
|
||||
ChannelName: chName2,
|
||||
UnflushedSegmentIds: []int64{},
|
||||
FlushedSegmentIds: []int64{},
|
||||
}, nil)
|
||||
}, nil, genTestTickler())
|
||||
s.Require().NoError(err)
|
||||
|
||||
_, ok := s.node.flowgraphManager.getFlowgraphService(chName1)
|
||||
|
@ -612,7 +612,7 @@ func (s *DataNodeServicesSuite) TestSyncSegments() {
|
|||
ChannelName: chanName,
|
||||
UnflushedSegmentIds: []int64{},
|
||||
FlushedSegmentIds: []int64{100, 200, 300},
|
||||
}, nil)
|
||||
}, nil, genTestTickler())
|
||||
s.Require().NoError(err)
|
||||
fg, ok := s.node.flowgraphManager.getFlowgraphService(chanName)
|
||||
s.Assert().True(ok)
|
||||
|
@ -696,7 +696,7 @@ func (s *DataNodeServicesSuite) TestResendSegmentStats() {
|
|||
FlushedSegmentIds: []int64{},
|
||||
}
|
||||
|
||||
err := s.node.flowgraphManager.addAndStart(s.node, vChan, nil)
|
||||
err := s.node.flowgraphManager.addAndStart(s.node, vChan, nil, genTestTickler())
|
||||
s.Require().Nil(err)
|
||||
|
||||
fgService, ok := s.node.flowgraphManager.getFlowgraphService(dmChannelName)
|
||||
|
|
|
@ -413,10 +413,12 @@ message ChannelWatchInfo {
|
|||
int64 startTs = 2;
|
||||
ChannelWatchState state = 3;
|
||||
// the timeout ts, datanode shall do nothing after it
|
||||
// if the timeout is not set(= 0), original infinite retry logic shall be applied
|
||||
// NOT USED.
|
||||
int64 timeoutTs = 4;
|
||||
// the schema of the collection to watch, to avoid get schema rpc issues.
|
||||
schema.CollectionSchema schema = 5;
|
||||
// watch progress
|
||||
int32 progress = 6;
|
||||
}
|
||||
|
||||
enum CompactionType {
|
||||
|
|
|
@ -2757,13 +2757,15 @@ type ChannelWatchInfo struct {
|
|||
StartTs int64 `protobuf:"varint,2,opt,name=startTs,proto3" json:"startTs,omitempty"`
|
||||
State ChannelWatchState `protobuf:"varint,3,opt,name=state,proto3,enum=milvus.proto.data.ChannelWatchState" json:"state,omitempty"`
|
||||
// the timeout ts, datanode shall do nothing after it
|
||||
// if the timeout is not set(= 0), original infinite retry logic shall be applied
|
||||
// NOT USED.
|
||||
TimeoutTs int64 `protobuf:"varint,4,opt,name=timeoutTs,proto3" json:"timeoutTs,omitempty"`
|
||||
// the schema of the collection to watch, to avoid get schema rpc issues.
|
||||
Schema *schemapb.CollectionSchema `protobuf:"bytes,5,opt,name=schema,proto3" json:"schema,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
Schema *schemapb.CollectionSchema `protobuf:"bytes,5,opt,name=schema,proto3" json:"schema,omitempty"`
|
||||
// watch progress
|
||||
Progress int32 `protobuf:"varint,6,opt,name=progress,proto3" json:"progress,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ChannelWatchInfo) Reset() { *m = ChannelWatchInfo{} }
|
||||
|
@ -2826,6 +2828,13 @@ func (m *ChannelWatchInfo) GetSchema() *schemapb.CollectionSchema {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (m *ChannelWatchInfo) GetProgress() int32 {
|
||||
if m != nil {
|
||||
return m.Progress
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CompactionStateRequest struct {
|
||||
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
|
@ -4969,299 +4978,300 @@ func init() {
|
|||
func init() { proto.RegisterFile("data_coord.proto", fileDescriptor_82cd95f524594f49) }
|
||||
|
||||
var fileDescriptor_82cd95f524594f49 = []byte{
|
||||
// 4667 bytes of a gzipped FileDescriptorProto
|
||||
// 4678 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x4b, 0x8c, 0x1c, 0x49,
|
||||
0x5a, 0xb0, 0xb3, 0x5e, 0x5d, 0xf5, 0xd5, 0xa3, 0xab, 0xc3, 0x9e, 0x76, 0xb9, 0x66, 0xfc, 0x4a,
|
||||
0xdb, 0xe3, 0x1e, 0x8f, 0xc7, 0xf6, 0x78, 0xfe, 0xd1, 0xfa, 0x5f, 0xef, 0xcc, 0xe2, 0xee, 0x76,
|
||||
0x7b, 0x0a, 0xdc, 0xbd, 0xbd, 0xd9, 0xed, 0x31, 0x9a, 0x45, 0x2a, 0x65, 0x57, 0x46, 0x57, 0xe7,
|
||||
0x76, 0x55, 0x66, 0x39, 0x33, 0xab, 0xdb, 0xbd, 0x48, 0xec, 0x00, 0x12, 0xd2, 0x20, 0x04, 0x08,
|
||||
0x09, 0x21, 0x6e, 0x88, 0xd3, 0xb2, 0x68, 0x11, 0xd2, 0xc2, 0x85, 0x0b, 0xd7, 0x11, 0x1c, 0x56,
|
||||
0x08, 0x89, 0x23, 0x47, 0xe0, 0x8e, 0xc4, 0x89, 0x03, 0x8a, 0x47, 0x46, 0xbe, 0x22, 0xab, 0xb2,
|
||||
0xab, 0xec, 0xb1, 0x04, 0xb7, 0x8a, 0xc8, 0x2f, 0xbe, 0xf8, 0x22, 0xbe, 0xf7, 0x17, 0x11, 0x05,
|
||||
0x4d, 0x43, 0xf7, 0xf4, 0x6e, 0xcf, 0xb6, 0x1d, 0xe3, 0xce, 0xc8, 0xb1, 0x3d, 0x1b, 0x2d, 0x0d,
|
||||
0xcd, 0xc1, 0xd1, 0xd8, 0x65, 0xad, 0x3b, 0xe4, 0x73, 0xbb, 0xd6, 0xb3, 0x87, 0x43, 0xdb, 0x62,
|
||||
0x5d, 0xed, 0x86, 0x69, 0x79, 0xd8, 0xb1, 0xf4, 0x01, 0x6f, 0xd7, 0xc2, 0x03, 0xda, 0x35, 0xb7,
|
||||
0x77, 0x80, 0x87, 0x3a, 0x6f, 0x2d, 0x99, 0x96, 0x81, 0x5f, 0x86, 0xf1, 0xab, 0x0b, 0x50, 0x7c,
|
||||
0x3c, 0x1c, 0x79, 0x27, 0xea, 0xdf, 0x28, 0x50, 0xdb, 0x18, 0x8c, 0xdd, 0x03, 0x0d, 0xbf, 0x18,
|
||||
0x63, 0xd7, 0x43, 0xf7, 0xa0, 0xb0, 0xa7, 0xbb, 0xb8, 0xa5, 0x5c, 0x51, 0x56, 0xaa, 0xf7, 0xdf,
|
||||
0xb9, 0x13, 0x21, 0x84, 0x93, 0xb0, 0xe9, 0xf6, 0x57, 0x75, 0x17, 0x6b, 0x14, 0x12, 0x21, 0x28,
|
||||
0x18, 0x7b, 0x9d, 0xf5, 0x56, 0xee, 0x8a, 0xb2, 0x92, 0xd7, 0xe8, 0x6f, 0x74, 0x09, 0xc0, 0xc5,
|
||||
0xfd, 0x21, 0xb6, 0xbc, 0xce, 0xba, 0xdb, 0xca, 0x5f, 0xc9, 0xaf, 0xe4, 0xb5, 0x50, 0x0f, 0x52,
|
||||
0xa1, 0xd6, 0xb3, 0x07, 0x03, 0xdc, 0xf3, 0x4c, 0xdb, 0xea, 0xac, 0xb7, 0x0a, 0x74, 0x6c, 0xa4,
|
||||
0x0f, 0xb5, 0xa1, 0x6c, 0xba, 0x9d, 0xe1, 0xc8, 0x76, 0xbc, 0x56, 0xf1, 0x8a, 0xb2, 0x52, 0xd6,
|
||||
0x44, 0x5b, 0xfd, 0x37, 0x05, 0xea, 0x9c, 0x6c, 0x77, 0x64, 0x5b, 0x2e, 0x46, 0x1f, 0x41, 0xc9,
|
||||
0xf5, 0x74, 0x6f, 0xec, 0x72, 0xca, 0xdf, 0x96, 0x52, 0xbe, 0x43, 0x41, 0x34, 0x0e, 0x2a, 0x25,
|
||||
0x3d, 0x4e, 0x5a, 0x5e, 0x42, 0x5a, 0x74, 0x79, 0x85, 0xc4, 0xf2, 0x56, 0x60, 0x71, 0x9f, 0x50,
|
||||
0xb7, 0x13, 0x00, 0x15, 0x29, 0x50, 0xbc, 0x9b, 0x60, 0xf2, 0xcc, 0x21, 0xfe, 0xde, 0xfe, 0x0e,
|
||||
0xd6, 0x07, 0xad, 0x12, 0x9d, 0x2b, 0xd4, 0xa3, 0xfe, 0x93, 0x02, 0x4d, 0x01, 0xee, 0xf3, 0xe8,
|
||||
0x1c, 0x14, 0x7b, 0xf6, 0xd8, 0xf2, 0xe8, 0x52, 0xeb, 0x1a, 0x6b, 0xa0, 0xab, 0x50, 0xeb, 0x1d,
|
||||
0xe8, 0x96, 0x85, 0x07, 0x5d, 0x4b, 0x1f, 0x62, 0xba, 0xa8, 0x8a, 0x56, 0xe5, 0x7d, 0x5b, 0xfa,
|
||||
0x10, 0x67, 0x5a, 0xdb, 0x15, 0xa8, 0x8e, 0x74, 0xc7, 0x33, 0x23, 0x9c, 0x09, 0x77, 0x4d, 0x62,
|
||||
0x0c, 0x99, 0xc1, 0xa4, 0xbf, 0x76, 0x75, 0xf7, 0xb0, 0xb3, 0xce, 0x57, 0x14, 0xe9, 0x53, 0xff,
|
||||
0x4c, 0x81, 0xe5, 0x47, 0xae, 0x6b, 0xf6, 0xad, 0xc4, 0xca, 0x96, 0xa1, 0x64, 0xd9, 0x06, 0xee,
|
||||
0xac, 0xd3, 0xa5, 0xe5, 0x35, 0xde, 0x42, 0x6f, 0x43, 0x65, 0x84, 0xb1, 0xd3, 0x75, 0xec, 0x81,
|
||||
0xbf, 0xb0, 0x32, 0xe9, 0xd0, 0xec, 0x01, 0x46, 0xdf, 0x87, 0x25, 0x37, 0x86, 0x88, 0xc9, 0x5c,
|
||||
0xf5, 0xfe, 0xb5, 0x3b, 0x09, 0x45, 0xba, 0x13, 0x9f, 0x54, 0x4b, 0x8e, 0x56, 0xbf, 0xcc, 0xc1,
|
||||
0x59, 0x01, 0xc7, 0x68, 0x25, 0xbf, 0xc9, 0xce, 0xbb, 0xb8, 0x2f, 0xc8, 0x63, 0x8d, 0x2c, 0x3b,
|
||||
0x2f, 0x58, 0x96, 0x0f, 0xb3, 0x2c, 0x8b, 0x1a, 0xc4, 0xf8, 0x51, 0x4c, 0xf2, 0xe3, 0x32, 0x54,
|
||||
0xf1, 0xcb, 0x91, 0xe9, 0xe0, 0x2e, 0x11, 0x1c, 0xba, 0xe5, 0x05, 0x0d, 0x58, 0xd7, 0xae, 0x39,
|
||||
0x0c, 0xeb, 0xc6, 0x42, 0x66, 0xdd, 0x50, 0xff, 0x5c, 0x81, 0xf3, 0x09, 0x2e, 0x71, 0x65, 0xd3,
|
||||
0xa0, 0x49, 0x57, 0x1e, 0xec, 0x0c, 0x51, 0x3b, 0xb2, 0xe1, 0xef, 0x4e, 0xda, 0xf0, 0x00, 0x5c,
|
||||
0x4b, 0x8c, 0x0f, 0x11, 0x99, 0xcb, 0x4e, 0xe4, 0x21, 0x9c, 0x7f, 0x82, 0x3d, 0x3e, 0x01, 0xf9,
|
||||
0x86, 0xdd, 0xd9, 0x0d, 0x59, 0x54, 0xab, 0x73, 0x71, 0xad, 0x56, 0xff, 0x3a, 0x27, 0x74, 0x91,
|
||||
0x4e, 0xd5, 0xb1, 0xf6, 0x6d, 0xf4, 0x0e, 0x54, 0x04, 0x08, 0x97, 0x8a, 0xa0, 0x03, 0x7d, 0x0b,
|
||||
0x8a, 0x84, 0x52, 0x26, 0x12, 0x8d, 0xfb, 0x57, 0xe5, 0x6b, 0x0a, 0xe1, 0xd4, 0x18, 0x3c, 0xea,
|
||||
0x40, 0xc3, 0xf5, 0x74, 0xc7, 0xeb, 0x8e, 0x6c, 0x97, 0xf2, 0x99, 0x0a, 0x4e, 0xf5, 0xbe, 0x1a,
|
||||
0xc5, 0x20, 0xbc, 0xc0, 0xa6, 0xdb, 0xdf, 0xe6, 0x90, 0x5a, 0x9d, 0x8e, 0xf4, 0x9b, 0xe8, 0x31,
|
||||
0xd4, 0xb0, 0x65, 0x04, 0x88, 0x0a, 0x99, 0x11, 0x55, 0xb1, 0x65, 0x08, 0x34, 0x01, 0x7f, 0x8a,
|
||||
0xd9, 0xf9, 0xf3, 0x7b, 0x0a, 0xb4, 0x92, 0x0c, 0x9a, 0xc7, 0x64, 0x3f, 0x64, 0x83, 0x30, 0x63,
|
||||
0xd0, 0x44, 0x0d, 0x17, 0x4c, 0xd2, 0xf8, 0x10, 0xf5, 0x8f, 0x15, 0x78, 0x2b, 0x20, 0x87, 0x7e,
|
||||
0x7a, 0x5d, 0xd2, 0x82, 0x6e, 0x41, 0xd3, 0xb4, 0x7a, 0x83, 0xb1, 0x81, 0x9f, 0x59, 0x9f, 0x61,
|
||||
0x7d, 0xe0, 0x1d, 0x9c, 0x50, 0x1e, 0x96, 0xb5, 0x44, 0xbf, 0xfa, 0xaf, 0x39, 0x58, 0x8e, 0xd3,
|
||||
0x35, 0xcf, 0x26, 0xfd, 0x3f, 0x28, 0x9a, 0xd6, 0xbe, 0xed, 0xef, 0xd1, 0xa5, 0x09, 0x4a, 0x49,
|
||||
0xe6, 0x62, 0xc0, 0xc8, 0x06, 0xe4, 0x9b, 0xb1, 0xde, 0x01, 0xee, 0x1d, 0x8e, 0x6c, 0x93, 0x1a,
|
||||
0x2c, 0x82, 0xe2, 0x97, 0x24, 0x28, 0xe4, 0x14, 0xdf, 0x59, 0x63, 0x38, 0xd6, 0x04, 0x8a, 0xc7,
|
||||
0x96, 0xe7, 0x9c, 0x68, 0x4b, 0xbd, 0x78, 0x7f, 0xfb, 0x00, 0x96, 0xe5, 0xc0, 0xa8, 0x09, 0xf9,
|
||||
0x43, 0x7c, 0x42, 0x97, 0x5c, 0xd1, 0xc8, 0x4f, 0xf4, 0x00, 0x8a, 0x47, 0xfa, 0x60, 0x8c, 0xb9,
|
||||
0x75, 0xc8, 0x22, 0xbe, 0x6c, 0xc0, 0xb7, 0x73, 0x0f, 0x14, 0x75, 0x08, 0x6f, 0x3f, 0xc1, 0x5e,
|
||||
0xc7, 0x72, 0xb1, 0xe3, 0xad, 0x9a, 0xd6, 0xc0, 0xee, 0x6f, 0xeb, 0xde, 0xc1, 0x1c, 0xb6, 0x22,
|
||||
0xa2, 0xf6, 0xb9, 0x98, 0xda, 0xab, 0x3f, 0x51, 0xe0, 0x1d, 0xf9, 0x7c, 0x9c, 0xab, 0x6d, 0x28,
|
||||
0xef, 0x9b, 0x78, 0x60, 0x10, 0xd1, 0x51, 0xa8, 0xe8, 0x88, 0x36, 0xb1, 0x19, 0x23, 0x02, 0xcc,
|
||||
0x99, 0x77, 0x35, 0x65, 0xa5, 0x3b, 0x9e, 0x63, 0x5a, 0xfd, 0xa7, 0xa6, 0xeb, 0x69, 0x0c, 0x3e,
|
||||
0x24, 0x2a, 0xf9, 0xec, 0x1a, 0xfa, 0xbb, 0x0a, 0x5c, 0x7a, 0x82, 0xbd, 0x35, 0xe1, 0x72, 0xc8,
|
||||
0x77, 0xd3, 0xf5, 0xcc, 0x9e, 0xfb, 0x6a, 0x43, 0xc2, 0x0c, 0xb1, 0x87, 0xfa, 0x07, 0x0a, 0x5c,
|
||||
0x4e, 0x25, 0x86, 0x6f, 0x1d, 0x37, 0xa9, 0xbe, 0xc3, 0x91, 0x9b, 0xd4, 0x5f, 0xc1, 0x27, 0x9f,
|
||||
0x13, 0xe6, 0x6f, 0xeb, 0xa6, 0xc3, 0x4c, 0xea, 0x8c, 0x0e, 0xe6, 0x67, 0x0a, 0x5c, 0x7c, 0x82,
|
||||
0xbd, 0x6d, 0xdf, 0xdd, 0xbe, 0xc1, 0xdd, 0x21, 0x30, 0x21, 0xb7, 0xef, 0xc7, 0x9d, 0x91, 0x3e,
|
||||
0xf5, 0xf7, 0x19, 0x3b, 0xa5, 0xf4, 0xbe, 0x91, 0x0d, 0xbc, 0x44, 0x35, 0x21, 0x64, 0x27, 0xb8,
|
||||
0xc6, 0xf3, 0xed, 0x53, 0xbf, 0x2a, 0x42, 0xed, 0x73, 0x6e, 0x1a, 0xa8, 0x43, 0x8d, 0xef, 0x84,
|
||||
0x22, 0x8f, 0x89, 0x42, 0xc1, 0x95, 0x2c, 0xde, 0x7a, 0x02, 0x75, 0x17, 0xe3, 0xc3, 0x59, 0xdc,
|
||||
0x67, 0x8d, 0x0c, 0x14, 0x6e, 0xef, 0x29, 0x2c, 0x8d, 0x2d, 0x1a, 0xb5, 0x63, 0x83, 0xaf, 0x82,
|
||||
0xed, 0xfc, 0x74, 0xb3, 0x9a, 0x1c, 0x88, 0x3e, 0xe3, 0x89, 0x41, 0x08, 0x57, 0x31, 0x13, 0xae,
|
||||
0xf8, 0x30, 0xd4, 0x81, 0xa6, 0xe1, 0xd8, 0xa3, 0x11, 0x36, 0xba, 0xae, 0x8f, 0xaa, 0x94, 0x0d,
|
||||
0x15, 0x1f, 0x27, 0x50, 0xdd, 0x83, 0xb3, 0x71, 0x4a, 0x3b, 0x06, 0x89, 0x15, 0x89, 0x78, 0xc9,
|
||||
0x3e, 0xa1, 0xdb, 0xb0, 0x94, 0x84, 0x2f, 0x53, 0xf8, 0xe4, 0x07, 0xf4, 0x01, 0xa0, 0x18, 0xa9,
|
||||
0x04, 0xbc, 0xc2, 0xc0, 0xa3, 0xc4, 0x70, 0x70, 0x9a, 0xb0, 0x46, 0xc1, 0x81, 0x81, 0xf3, 0x2f,
|
||||
0x21, 0xf0, 0x0e, 0xf1, 0xb3, 0x11, 0x70, 0xb7, 0x55, 0xcd, 0xb6, 0x11, 0x51, 0x64, 0xae, 0xfa,
|
||||
0x95, 0x02, 0xcb, 0xcf, 0x75, 0xaf, 0x77, 0xb0, 0x3e, 0xe4, 0x52, 0x3a, 0x87, 0x96, 0x7f, 0x02,
|
||||
0x95, 0x23, 0x2e, 0x91, 0xbe, 0x29, 0xbf, 0x2c, 0x21, 0x28, 0x2c, 0xfb, 0x5a, 0x30, 0x82, 0x24,
|
||||
0x49, 0xe7, 0x36, 0x42, 0xc9, 0xe2, 0x1b, 0xb0, 0x37, 0x53, 0xb2, 0x5c, 0xf5, 0x25, 0x00, 0x27,
|
||||
0x6e, 0xd3, 0xed, 0xcf, 0x40, 0xd7, 0x03, 0x58, 0xe0, 0xd8, 0xb8, 0x41, 0x99, 0xc6, 0x30, 0x1f,
|
||||
0x5c, 0xfd, 0x69, 0x09, 0xaa, 0xa1, 0x0f, 0xa8, 0x01, 0x39, 0x61, 0x29, 0x72, 0x92, 0xd5, 0xe5,
|
||||
0xa6, 0xe7, 0x55, 0xf9, 0x64, 0x5e, 0x75, 0x03, 0x1a, 0x26, 0xf5, 0xe0, 0x5d, 0xce, 0x15, 0x1a,
|
||||
0x3a, 0x57, 0xb4, 0x3a, 0xeb, 0xe5, 0x22, 0x82, 0x2e, 0x41, 0xd5, 0x1a, 0x0f, 0xbb, 0xf6, 0x7e,
|
||||
0xd7, 0xb1, 0x8f, 0x5d, 0x9e, 0xa0, 0x55, 0xac, 0xf1, 0xf0, 0x7b, 0xfb, 0x9a, 0x7d, 0xec, 0x06,
|
||||
0x39, 0x40, 0xe9, 0x94, 0x39, 0xc0, 0x25, 0xa8, 0x0e, 0xf5, 0x97, 0x04, 0x6b, 0xd7, 0x1a, 0x0f,
|
||||
0x69, 0xee, 0x96, 0xd7, 0x2a, 0x43, 0xfd, 0xa5, 0x66, 0x1f, 0x6f, 0x8d, 0x87, 0x68, 0x05, 0x9a,
|
||||
0x03, 0xdd, 0xf5, 0xba, 0xe1, 0xe4, 0xaf, 0x4c, 0x93, 0xbf, 0x06, 0xe9, 0x7f, 0x1c, 0x24, 0x80,
|
||||
0xc9, 0x6c, 0xa2, 0x32, 0x47, 0x36, 0x61, 0x0c, 0x07, 0x01, 0x22, 0xc8, 0x9e, 0x4d, 0x18, 0xc3,
|
||||
0x81, 0x40, 0xf3, 0x00, 0x16, 0xf6, 0x68, 0x5c, 0x34, 0x49, 0x59, 0x37, 0x48, 0x48, 0xc4, 0xc2,
|
||||
0x27, 0xcd, 0x07, 0x47, 0xdf, 0x81, 0x0a, 0x75, 0x47, 0x74, 0x6c, 0x2d, 0xd3, 0xd8, 0x60, 0x00,
|
||||
0x19, 0x6d, 0xe0, 0x81, 0xa7, 0xd3, 0xd1, 0xf5, 0x6c, 0xa3, 0xc5, 0x00, 0x62, 0x29, 0x7b, 0x0e,
|
||||
0xd6, 0x3d, 0x6c, 0xac, 0x9e, 0xac, 0xd9, 0xc3, 0x91, 0x4e, 0x85, 0xa9, 0xd5, 0xa0, 0x61, 0xbd,
|
||||
0xec, 0x13, 0x7a, 0x17, 0x1a, 0x3d, 0xd1, 0xda, 0x70, 0xec, 0x61, 0x6b, 0x91, 0xea, 0x51, 0xac,
|
||||
0x17, 0x5d, 0x04, 0xf0, 0x6d, 0xa4, 0xee, 0xb5, 0x9a, 0x94, 0x8b, 0x15, 0xde, 0xf3, 0x88, 0xd6,
|
||||
0x76, 0x4c, 0xb7, 0xcb, 0xaa, 0x28, 0xa6, 0xd5, 0x6f, 0x2d, 0xd1, 0x19, 0xab, 0x7e, 0xd9, 0xc5,
|
||||
0xb4, 0xfa, 0xe8, 0x3c, 0x2c, 0x98, 0x6e, 0x77, 0x5f, 0x3f, 0xc4, 0x2d, 0x44, 0xbf, 0x96, 0x4c,
|
||||
0x77, 0x43, 0x3f, 0xc4, 0xea, 0x8f, 0xe1, 0x5c, 0x20, 0x5d, 0x21, 0x4e, 0x26, 0x85, 0x42, 0x99,
|
||||
0x55, 0x28, 0x26, 0x47, 0xc3, 0xbf, 0x28, 0xc0, 0xf2, 0x8e, 0x7e, 0x84, 0x5f, 0x7f, 0xe0, 0x9d,
|
||||
0xc9, 0xac, 0x3d, 0x85, 0x25, 0x1a, 0x6b, 0xdf, 0x0f, 0xd1, 0x33, 0xc1, 0xa3, 0x87, 0x45, 0x21,
|
||||
0x39, 0x10, 0x7d, 0x97, 0x84, 0x22, 0xb8, 0x77, 0xb8, 0x4d, 0x92, 0x17, 0xdf, 0x9b, 0x5f, 0x94,
|
||||
0xe0, 0x59, 0x13, 0x50, 0x5a, 0x78, 0x04, 0xda, 0x86, 0xc5, 0x28, 0x1b, 0x7c, 0x3f, 0x7e, 0x73,
|
||||
0x62, 0x66, 0x1b, 0xec, 0xbe, 0xd6, 0x88, 0x30, 0xc3, 0x45, 0x2d, 0x58, 0xe0, 0x4e, 0x98, 0xda,
|
||||
0x8c, 0xb2, 0xe6, 0x37, 0xd1, 0x36, 0x9c, 0x65, 0x2b, 0xd8, 0xe1, 0x0a, 0xc1, 0x16, 0x5f, 0xce,
|
||||
0xb4, 0x78, 0xd9, 0xd0, 0xa8, 0x3e, 0x55, 0x4e, 0xab, 0x4f, 0x2d, 0x58, 0xe0, 0x32, 0x4e, 0xed,
|
||||
0x48, 0x59, 0xf3, 0x9b, 0x84, 0xcd, 0x81, 0xb4, 0x57, 0xe9, 0xb7, 0xa0, 0x83, 0x24, 0x2d, 0x10,
|
||||
0xec, 0xe7, 0x94, 0x1a, 0xcc, 0xa7, 0x50, 0x16, 0x12, 0x9e, 0x3d, 0x79, 0x14, 0x63, 0xe2, 0xf6,
|
||||
0x3d, 0x1f, 0xb3, 0xef, 0xea, 0x3f, 0x2a, 0x50, 0x5b, 0x27, 0x4b, 0x7a, 0x6a, 0xf7, 0xa9, 0x37,
|
||||
0xba, 0x01, 0x0d, 0x07, 0xf7, 0x6c, 0xc7, 0xe8, 0x62, 0xcb, 0x73, 0x4c, 0xcc, 0x52, 0xf7, 0x82,
|
||||
0x56, 0x67, 0xbd, 0x8f, 0x59, 0x27, 0x01, 0x23, 0x26, 0xdb, 0xf5, 0xf4, 0xe1, 0xa8, 0xbb, 0x4f,
|
||||
0x4c, 0x43, 0x8e, 0x81, 0x89, 0x5e, 0x6a, 0x19, 0xae, 0x42, 0x2d, 0x00, 0xf3, 0x6c, 0x3a, 0x7f,
|
||||
0x41, 0xab, 0x8a, 0xbe, 0x5d, 0x1b, 0x5d, 0x87, 0x06, 0xdd, 0xd3, 0xee, 0xc0, 0xee, 0x77, 0x49,
|
||||
0x2e, 0xc8, 0x1d, 0x55, 0xcd, 0xe0, 0x64, 0x11, 0x5e, 0x45, 0xa1, 0x5c, 0xf3, 0x47, 0x98, 0xbb,
|
||||
0x2a, 0x01, 0xb5, 0x63, 0xfe, 0x08, 0xab, 0xff, 0xa0, 0x40, 0x7d, 0x5d, 0xf7, 0xf4, 0x2d, 0xdb,
|
||||
0xc0, 0xbb, 0x33, 0x3a, 0xf6, 0x0c, 0xf5, 0xd0, 0x77, 0xa0, 0x22, 0x56, 0xc0, 0x97, 0x14, 0x74,
|
||||
0xa0, 0x0d, 0x68, 0xf8, 0xb1, 0x5c, 0x97, 0xe5, 0x2a, 0x85, 0xd4, 0x00, 0x2a, 0xe4, 0x39, 0x5d,
|
||||
0xad, 0xee, 0x0f, 0xa3, 0x4d, 0x75, 0x03, 0x6a, 0xe1, 0xcf, 0x64, 0xd6, 0x9d, 0xb8, 0xa0, 0x88,
|
||||
0x0e, 0x22, 0x8d, 0x5b, 0xe3, 0x21, 0xe1, 0x29, 0x37, 0x2c, 0x7e, 0x53, 0xfd, 0x6d, 0x05, 0xea,
|
||||
0xdc, 0xdd, 0xef, 0x88, 0x93, 0x03, 0xba, 0x34, 0x56, 0xa1, 0xa0, 0xbf, 0xd1, 0xb7, 0xa3, 0xc5,
|
||||
0xbe, 0xeb, 0x52, 0x23, 0x40, 0x91, 0xd0, 0x20, 0x33, 0xe2, 0xeb, 0xb3, 0x64, 0xc7, 0x5f, 0x12,
|
||||
0x41, 0xe3, 0xac, 0xa1, 0x82, 0xd6, 0x82, 0x05, 0xdd, 0x30, 0x1c, 0xec, 0xba, 0x9c, 0x0e, 0xbf,
|
||||
0x49, 0xbe, 0x1c, 0x61, 0xc7, 0xf5, 0x45, 0x3e, 0xaf, 0xf9, 0x4d, 0xf4, 0x1d, 0x28, 0x8b, 0xa8,
|
||||
0x94, 0x95, 0x76, 0xae, 0xa4, 0xd3, 0xc9, 0x73, 0x39, 0x31, 0x42, 0xfd, 0xdb, 0x1c, 0x34, 0xf8,
|
||||
0x86, 0xad, 0x72, 0x7f, 0x3c, 0x59, 0xf9, 0x56, 0xa1, 0xb6, 0x1f, 0xe8, 0xfe, 0xa4, 0x82, 0x54,
|
||||
0xd8, 0x44, 0x44, 0xc6, 0x4c, 0x53, 0xc0, 0x68, 0x44, 0x50, 0x98, 0x2b, 0x22, 0x28, 0x9e, 0xd6,
|
||||
0x82, 0x25, 0x63, 0xc4, 0x92, 0x24, 0x46, 0x54, 0x7f, 0x0d, 0xaa, 0x21, 0x04, 0xd4, 0x42, 0xb3,
|
||||
0x72, 0x0f, 0xdf, 0x31, 0xbf, 0x89, 0x3e, 0x0a, 0xe2, 0x22, 0xb6, 0x55, 0x17, 0x24, 0xb4, 0xc4,
|
||||
0x42, 0x22, 0xf5, 0xef, 0x15, 0x28, 0x71, 0xcc, 0x97, 0xa1, 0xca, 0x8d, 0x0e, 0x8d, 0x19, 0x19,
|
||||
0x76, 0xe0, 0x5d, 0x24, 0x68, 0x7c, 0x75, 0x56, 0xe7, 0x02, 0x94, 0x63, 0xf6, 0x66, 0x81, 0xbb,
|
||||
0x05, 0xff, 0x53, 0xc8, 0xc8, 0x90, 0x4f, 0xc4, 0xbe, 0xa0, 0x73, 0x50, 0x1c, 0xd8, 0x7d, 0x71,
|
||||
0x32, 0xc4, 0x1a, 0xea, 0xd7, 0x0a, 0x2d, 0xe4, 0x6b, 0xb8, 0x67, 0x1f, 0x61, 0xe7, 0x64, 0xfe,
|
||||
0x0a, 0xe8, 0xc3, 0x90, 0x98, 0x67, 0x4c, 0xbe, 0xc4, 0x00, 0xf4, 0x30, 0x60, 0x42, 0x5e, 0x56,
|
||||
0x23, 0x09, 0xdb, 0x1d, 0x2e, 0xa4, 0x01, 0x33, 0xfe, 0x50, 0xa1, 0xb5, 0xdc, 0xe8, 0x52, 0x66,
|
||||
0x8d, 0x76, 0x5e, 0x49, 0x22, 0xa3, 0xfe, 0x42, 0x81, 0x76, 0x50, 0x84, 0x71, 0x57, 0x4f, 0xe6,
|
||||
0x3d, 0x29, 0x79, 0x35, 0xf9, 0xd5, 0xff, 0x17, 0xa5, 0x7c, 0xa2, 0xb4, 0x99, 0x32, 0x23, 0xbf,
|
||||
0x90, 0x6f, 0xd1, 0x7a, 0x6e, 0x72, 0x41, 0xf3, 0x88, 0x4c, 0x1b, 0xca, 0xa2, 0x80, 0xc0, 0xca,
|
||||
0xf9, 0xa2, 0x4d, 0x34, 0xec, 0xc2, 0x13, 0xec, 0x6d, 0x44, 0x8b, 0x30, 0x6f, 0x7a, 0x03, 0xc3,
|
||||
0x47, 0x0c, 0x07, 0xfc, 0x88, 0xa1, 0x10, 0x3b, 0x62, 0xe0, 0xfd, 0xea, 0x90, 0x8a, 0x40, 0x62,
|
||||
0x01, 0xaf, 0x6b, 0xc3, 0x7e, 0x47, 0x81, 0x16, 0x9f, 0x85, 0xce, 0x49, 0x52, 0xa2, 0x01, 0xf6,
|
||||
0xb0, 0xf1, 0x4d, 0x97, 0x0a, 0xfe, 0x5b, 0x81, 0x66, 0xd8, 0xeb, 0x52, 0xc7, 0xf9, 0x31, 0x14,
|
||||
0x69, 0xa5, 0x85, 0x53, 0x30, 0xd5, 0x34, 0x30, 0x68, 0x62, 0xb6, 0x69, 0xa8, 0xbd, 0x2b, 0x02,
|
||||
0x04, 0xde, 0x0c, 0x5c, 0x7f, 0xfe, 0xf4, 0xae, 0x9f, 0x87, 0x42, 0xf6, 0x98, 0xe0, 0x65, 0x27,
|
||||
0xc0, 0x41, 0x07, 0xfa, 0x04, 0x4a, 0xec, 0x32, 0x07, 0x3f, 0x76, 0xbb, 0x11, 0x45, 0xcd, 0x2f,
|
||||
0x7a, 0x84, 0x2a, 0xe6, 0xb4, 0x43, 0xe3, 0x83, 0xd4, 0x5f, 0x86, 0xe5, 0x20, 0x1b, 0x65, 0xd3,
|
||||
0xce, 0x2a, 0xb4, 0xea, 0xbf, 0x28, 0x70, 0x76, 0xe7, 0xc4, 0xea, 0xc5, 0xc5, 0x7f, 0x19, 0x4a,
|
||||
0xa3, 0x81, 0x1e, 0xd4, 0x6a, 0x79, 0x8b, 0x86, 0x81, 0x6c, 0x6e, 0x6c, 0x10, 0x1f, 0xc2, 0xf6,
|
||||
0xac, 0x2a, 0xfa, 0x76, 0xed, 0xa9, 0xae, 0xfd, 0x86, 0x48, 0x9f, 0xb1, 0xc1, 0xbc, 0x15, 0x2b,
|
||||
0x43, 0xd5, 0x45, 0x2f, 0xf5, 0x56, 0x9f, 0x00, 0x50, 0x87, 0xde, 0x3d, 0x8d, 0x13, 0xa7, 0x23,
|
||||
0x9e, 0x12, 0x93, 0xfd, 0xf3, 0x1c, 0xb4, 0x42, 0xbb, 0xf4, 0x4d, 0xc7, 0x37, 0x29, 0x59, 0x59,
|
||||
0xfe, 0x15, 0x65, 0x65, 0x85, 0xf9, 0x63, 0x9a, 0xa2, 0x2c, 0xa6, 0xf9, 0xcd, 0x3c, 0x34, 0x82,
|
||||
0x5d, 0xdb, 0x1e, 0xe8, 0x56, 0xaa, 0x24, 0xec, 0x88, 0x78, 0x3e, 0xba, 0x4f, 0xef, 0xcb, 0xf4,
|
||||
0x24, 0x85, 0x11, 0x5a, 0x0c, 0x05, 0xba, 0x48, 0x99, 0xee, 0x78, 0xac, 0xf0, 0xc5, 0x73, 0x08,
|
||||
0xa6, 0x90, 0xe6, 0x10, 0xa3, 0xdb, 0x80, 0xb8, 0x16, 0x75, 0x4d, 0xab, 0xeb, 0xe2, 0x9e, 0x6d,
|
||||
0x19, 0x4c, 0xbf, 0x8a, 0x5a, 0x93, 0x7f, 0xe9, 0x58, 0x3b, 0xac, 0x1f, 0x7d, 0x0c, 0x05, 0xef,
|
||||
0x64, 0xc4, 0xa2, 0x95, 0x86, 0xd4, 0xdf, 0x07, 0x74, 0xed, 0x9e, 0x8c, 0xb0, 0x46, 0xc1, 0xfd,
|
||||
0xeb, 0x3b, 0x9e, 0xa3, 0x1f, 0xf1, 0xd0, 0xaf, 0xa0, 0x85, 0x7a, 0x88, 0xc5, 0xf0, 0xf7, 0x70,
|
||||
0x81, 0x85, 0x48, 0xbc, 0xc9, 0x24, 0xdb, 0x57, 0xda, 0xae, 0xe7, 0x0d, 0x68, 0xe9, 0x8e, 0x4a,
|
||||
0xb6, 0xdf, 0xbb, 0xeb, 0x0d, 0xc8, 0x22, 0x3d, 0xdb, 0xd3, 0x07, 0x4c, 0x3f, 0x2a, 0xdc, 0x3a,
|
||||
0x90, 0x1e, 0x9a, 0x98, 0xfc, 0x73, 0x0e, 0x9a, 0x01, 0x61, 0x1a, 0x76, 0xc7, 0x83, 0x74, 0x7d,
|
||||
0x9c, 0x5c, 0x3a, 0x99, 0xa6, 0x8a, 0xdf, 0x85, 0x2a, 0x97, 0x8a, 0x53, 0x48, 0x15, 0xb0, 0x21,
|
||||
0x4f, 0x27, 0x88, 0x79, 0xf1, 0x15, 0x89, 0x79, 0x69, 0x86, 0xe2, 0x83, 0x9c, 0x37, 0xea, 0x4f,
|
||||
0x14, 0x78, 0x2b, 0x61, 0x35, 0x27, 0x6e, 0xed, 0xe4, 0xd4, 0x8f, 0x5b, 0xd3, 0x38, 0x4a, 0x6e,
|
||||
0xff, 0x1f, 0x42, 0xc9, 0xa1, 0xd8, 0xf9, 0x19, 0xd5, 0xb5, 0x89, 0xc2, 0xc7, 0x08, 0xd1, 0xf8,
|
||||
0x10, 0xf5, 0x8f, 0x14, 0x38, 0x9f, 0x24, 0x75, 0x0e, 0xa7, 0xbe, 0x0a, 0x0b, 0x0c, 0xb5, 0xaf,
|
||||
0xa3, 0x2b, 0x93, 0x75, 0x34, 0xd8, 0x1c, 0xcd, 0x1f, 0xa8, 0xee, 0xc0, 0xb2, 0xef, 0xfb, 0x83,
|
||||
0xad, 0xdf, 0xc4, 0x9e, 0x3e, 0x21, 0xf1, 0xb9, 0x0c, 0x55, 0x16, 0x41, 0xb3, 0x84, 0x82, 0x95,
|
||||
0x0c, 0x60, 0x4f, 0x54, 0xda, 0xd4, 0xff, 0x50, 0xe0, 0x1c, 0x75, 0x9e, 0xf1, 0xa3, 0x99, 0x2c,
|
||||
0x07, 0x86, 0xaa, 0xa8, 0x48, 0x6c, 0xe9, 0x43, 0x7e, 0x77, 0xa4, 0xa2, 0x45, 0xfa, 0x50, 0x27,
|
||||
0x59, 0x88, 0x93, 0x26, 0xc8, 0xc1, 0x09, 0x29, 0x49, 0xc6, 0xe9, 0x01, 0x69, 0xbc, 0x02, 0x17,
|
||||
0x38, 0xed, 0xc2, 0x2c, 0x4e, 0xfb, 0x29, 0xbc, 0x15, 0x5b, 0xe9, 0x1c, 0x1c, 0x55, 0xff, 0x42,
|
||||
0x21, 0xec, 0x88, 0xdc, 0xc1, 0x99, 0x3d, 0x70, 0xbd, 0x28, 0xce, 0x84, 0xba, 0xa6, 0x11, 0x37,
|
||||
0x22, 0x06, 0xfa, 0x14, 0x2a, 0x16, 0x3e, 0xee, 0x86, 0x63, 0xa1, 0x0c, 0x51, 0x7d, 0xd9, 0xc2,
|
||||
0xc7, 0xf4, 0x97, 0xba, 0x05, 0xe7, 0x13, 0xa4, 0xce, 0xb3, 0xf6, 0xbf, 0x53, 0xe0, 0xc2, 0xba,
|
||||
0x63, 0x8f, 0x3e, 0x37, 0x1d, 0x6f, 0xac, 0x0f, 0xa2, 0x67, 0xcf, 0xaf, 0xa7, 0xb2, 0xf5, 0x59,
|
||||
0x28, 0x2a, 0x66, 0xf2, 0x73, 0x5b, 0xa2, 0x41, 0x49, 0xa2, 0xf8, 0xa2, 0x43, 0x31, 0xf4, 0xbf,
|
||||
0xe7, 0x65, 0xc4, 0x73, 0xb8, 0x29, 0x71, 0x49, 0x96, 0x04, 0x43, 0x5a, 0x08, 0xcf, 0xcf, 0x5a,
|
||||
0x08, 0x4f, 0x31, 0xef, 0x85, 0x57, 0x64, 0xde, 0x4f, 0x5d, 0x99, 0xf9, 0x0c, 0xa2, 0x87, 0x14,
|
||||
0xd4, 0x3b, 0xcf, 0x74, 0xba, 0xb1, 0x0a, 0x10, 0x14, 0xec, 0xf9, 0x15, 0xca, 0x2c, 0x68, 0x42,
|
||||
0xa3, 0x08, 0xb7, 0x84, 0x2b, 0xe5, 0x9e, 0x3e, 0x54, 0x42, 0xfe, 0x3e, 0xb4, 0x65, 0x52, 0x3a,
|
||||
0x8f, 0xe4, 0xff, 0x3c, 0x07, 0xd0, 0x11, 0xb7, 0x6e, 0x67, 0xf3, 0x05, 0xd7, 0x20, 0x14, 0x8d,
|
||||
0x04, 0xfa, 0x1e, 0x96, 0x22, 0x83, 0xa8, 0x84, 0xc8, 0x49, 0x09, 0x4c, 0x22, 0x4f, 0x35, 0x28,
|
||||
0x9e, 0x90, 0xd6, 0x30, 0xa1, 0x88, 0x9b, 0xdf, 0xb7, 0xa1, 0xe2, 0xd8, 0xc7, 0x5d, 0xa2, 0x66,
|
||||
0x86, 0x7f, 0xad, 0xd8, 0xb1, 0x8f, 0x89, 0xf2, 0x19, 0xe8, 0x3c, 0x2c, 0x78, 0xba, 0x7b, 0x48,
|
||||
0xf0, 0xb3, 0xba, 0x51, 0x89, 0x34, 0x3b, 0x06, 0x3a, 0x07, 0xc5, 0x7d, 0x73, 0x80, 0xd9, 0x6d,
|
||||
0x85, 0x8a, 0xc6, 0x1a, 0xe8, 0x5b, 0xfe, 0xfd, 0xb7, 0x72, 0xe6, 0x2b, 0x2e, 0x14, 0x5e, 0xfd,
|
||||
0x5a, 0x81, 0xc5, 0x60, 0xd7, 0xa8, 0x01, 0x22, 0x36, 0x8d, 0xda, 0xb3, 0x35, 0xdb, 0x60, 0xa6,
|
||||
0xa2, 0x91, 0xe2, 0x11, 0xd8, 0x40, 0x66, 0xb5, 0x82, 0x21, 0x93, 0xd2, 0x64, 0xb2, 0x2e, 0xb2,
|
||||
0x68, 0xd3, 0xf0, 0x2f, 0xc9, 0x97, 0x1c, 0xfb, 0xb8, 0x63, 0x88, 0xdd, 0x60, 0x77, 0x86, 0x59,
|
||||
0x52, 0x48, 0x76, 0x63, 0x8d, 0x5e, 0x1b, 0xbe, 0x06, 0x75, 0xec, 0x38, 0xb6, 0xd3, 0x1d, 0x62,
|
||||
0xd7, 0xd5, 0xfb, 0x98, 0xc7, 0xe7, 0x35, 0xda, 0xb9, 0xc9, 0xfa, 0xd4, 0x3f, 0x29, 0x40, 0x23,
|
||||
0x58, 0x8a, 0x7f, 0x4c, 0x6e, 0x1a, 0xfe, 0x31, 0xb9, 0x49, 0x58, 0x07, 0x0e, 0x33, 0x85, 0x82,
|
||||
0xb9, 0xab, 0xb9, 0x96, 0xa2, 0x55, 0x78, 0x6f, 0xc7, 0x20, 0x6e, 0x99, 0x28, 0x99, 0x65, 0x1b,
|
||||
0x38, 0x60, 0x2e, 0xf8, 0x5d, 0x9c, 0xb7, 0x11, 0x19, 0x29, 0x64, 0x90, 0x91, 0x62, 0x06, 0x19,
|
||||
0x29, 0x49, 0x64, 0x64, 0x19, 0x4a, 0x7b, 0xe3, 0xde, 0x21, 0xf6, 0x78, 0xc4, 0xc6, 0x5b, 0x51,
|
||||
0xd9, 0x29, 0xc7, 0x64, 0x47, 0x88, 0x48, 0x25, 0x2c, 0x22, 0x6f, 0x43, 0x85, 0x9d, 0xd7, 0x76,
|
||||
0x3d, 0x97, 0x1e, 0x3e, 0xe5, 0xb5, 0x32, 0xeb, 0xd8, 0x75, 0xd1, 0x03, 0x3f, 0x9c, 0xab, 0xca,
|
||||
0x94, 0x9d, 0x5a, 0x9d, 0x98, 0x94, 0xf8, 0xc1, 0xdc, 0x4d, 0x58, 0x0c, 0x6d, 0x07, 0xf5, 0x11,
|
||||
0x35, 0x4a, 0x6a, 0x28, 0xda, 0xa7, 0x6e, 0xe2, 0x06, 0x34, 0x82, 0x2d, 0xa1, 0x70, 0x75, 0x96,
|
||||
0x64, 0x89, 0x5e, 0x0a, 0x26, 0x24, 0xb9, 0x71, 0x3a, 0x49, 0x46, 0x17, 0xa0, 0xcc, 0xb3, 0x23,
|
||||
0xb7, 0xb5, 0x18, 0x29, 0x56, 0xa8, 0x3f, 0x04, 0x14, 0x50, 0x3f, 0x5f, 0xb4, 0x18, 0x13, 0x8f,
|
||||
0x5c, 0x5c, 0x3c, 0xd4, 0x9f, 0x2a, 0xb0, 0x14, 0x9e, 0x6c, 0x56, 0xc7, 0xfb, 0x29, 0x54, 0xd9,
|
||||
0xf1, 0x5f, 0x97, 0x28, 0x3e, 0x2f, 0x02, 0x5d, 0x9c, 0xc8, 0x17, 0x0d, 0x82, 0x57, 0x07, 0x44,
|
||||
0xbc, 0x8e, 0x6d, 0xe7, 0xd0, 0xb4, 0xfa, 0x5d, 0x42, 0x99, 0xaf, 0x6e, 0x35, 0xde, 0xb9, 0x45,
|
||||
0xfa, 0xd4, 0xaf, 0x14, 0xb8, 0xf4, 0x6c, 0x64, 0xe8, 0x1e, 0x0e, 0x45, 0x20, 0xf3, 0xde, 0xf6,
|
||||
0xfb, 0xd8, 0xbf, 0x6e, 0x97, 0xcb, 0x76, 0x84, 0xc5, 0xa0, 0xd5, 0xbf, 0x12, 0xb4, 0x24, 0xae,
|
||||
0xc8, 0xce, 0x4e, 0x4b, 0x1b, 0xca, 0x47, 0x1c, 0x9d, 0xff, 0x8a, 0xc2, 0x6f, 0x47, 0x8e, 0x49,
|
||||
0xf3, 0xa7, 0x3f, 0x26, 0x55, 0x37, 0xe1, 0x82, 0x86, 0x5d, 0x6c, 0x19, 0x91, 0xd5, 0xcc, 0x5c,
|
||||
0x6c, 0x1a, 0x41, 0x5b, 0x86, 0x6e, 0x1e, 0x61, 0x65, 0xb1, 0x6b, 0xd7, 0x21, 0x68, 0x3d, 0x6e,
|
||||
0x8a, 0x49, 0xc8, 0x44, 0xe7, 0xf1, 0xd4, 0xbf, 0xcc, 0xc1, 0xf9, 0x47, 0x86, 0xc1, 0xad, 0x38,
|
||||
0x8f, 0xc6, 0x5e, 0x57, 0xa0, 0x1c, 0x0f, 0x24, 0xf3, 0xc9, 0x40, 0xf2, 0x55, 0x59, 0x56, 0xee,
|
||||
0x63, 0xac, 0xf1, 0xd0, 0xf7, 0x9d, 0x0e, 0xbb, 0x3f, 0xf4, 0x90, 0x9f, 0x9b, 0x91, 0x84, 0x9e,
|
||||
0xfa, 0xcf, 0xe9, 0xf1, 0x55, 0xd9, 0x2f, 0x9a, 0xa9, 0x23, 0x68, 0x25, 0x37, 0x6b, 0x4e, 0x53,
|
||||
0xe2, 0xef, 0xc8, 0xc8, 0x66, 0x05, 0xd6, 0x1a, 0x09, 0xa1, 0x68, 0xd7, 0xb6, 0xed, 0xaa, 0xff,
|
||||
0x99, 0x83, 0xd6, 0x8e, 0x7e, 0x84, 0xff, 0xef, 0x30, 0xe8, 0x0b, 0x38, 0xe7, 0xea, 0x47, 0xb8,
|
||||
0x1b, 0x4a, 0x8c, 0xbb, 0x0e, 0x7e, 0xc1, 0x43, 0xd0, 0xf7, 0x64, 0x96, 0x44, 0x7a, 0xcd, 0x46,
|
||||
0x5b, 0x72, 0x23, 0xfd, 0x1a, 0x7e, 0x81, 0xde, 0x85, 0xc5, 0xf0, 0x3d, 0x2e, 0x42, 0x5a, 0x99,
|
||||
0x6e, 0x79, 0x3d, 0x74, 0x4d, 0xab, 0x63, 0xa8, 0x2f, 0xe0, 0x9d, 0x67, 0x96, 0x8b, 0xbd, 0x4e,
|
||||
0x70, 0xd5, 0x68, 0xce, 0x14, 0xf2, 0x32, 0x54, 0x83, 0x8d, 0x4f, 0xbc, 0x9c, 0x30, 0x5c, 0xd5,
|
||||
0x86, 0xf6, 0xa6, 0xee, 0x1c, 0xfa, 0x65, 0xe6, 0x75, 0x76, 0x25, 0xe4, 0x35, 0x4e, 0xb8, 0x2f,
|
||||
0x6e, 0x48, 0x69, 0x78, 0x1f, 0x3b, 0xd8, 0xea, 0xe1, 0xa7, 0x76, 0xef, 0x90, 0x84, 0x1b, 0x1e,
|
||||
0x7b, 0xc6, 0xa6, 0x84, 0x82, 0xce, 0xf5, 0xd0, 0x2b, 0xb5, 0x5c, 0xe4, 0x95, 0xda, 0x94, 0x57,
|
||||
0x8f, 0xea, 0xcf, 0x72, 0xb0, 0xfc, 0x68, 0xe0, 0x61, 0x27, 0xc8, 0xfc, 0x4f, 0x53, 0xc4, 0x08,
|
||||
0xaa, 0x0a, 0xb9, 0x19, 0xaa, 0x0a, 0x89, 0xeb, 0xe3, 0xf9, 0xe4, 0xf5, 0x71, 0x59, 0x0d, 0xa4,
|
||||
0x30, 0x63, 0x0d, 0xe4, 0x11, 0xc0, 0xc8, 0xb1, 0x47, 0xd8, 0xf1, 0x4c, 0xec, 0xa7, 0x6f, 0x19,
|
||||
0xc2, 0x97, 0xd0, 0x20, 0xf5, 0x0b, 0x68, 0x3e, 0xe9, 0xad, 0xd9, 0xd6, 0xbe, 0xe9, 0x0c, 0xfd,
|
||||
0x8d, 0x4a, 0x28, 0x9d, 0x92, 0x41, 0xe9, 0x72, 0x09, 0xa5, 0x53, 0x4d, 0x58, 0x0a, 0xe1, 0x9e,
|
||||
0xd3, 0x70, 0xf5, 0x7b, 0xdd, 0x7d, 0xd3, 0x32, 0xe9, 0x95, 0xab, 0x1c, 0x0d, 0x3f, 0xa1, 0xdf,
|
||||
0xdb, 0xe0, 0x3d, 0xb7, 0x3e, 0x15, 0x97, 0x55, 0x77, 0x4f, 0x46, 0x18, 0x2d, 0x40, 0x7e, 0x0b,
|
||||
0x1f, 0x37, 0xcf, 0x20, 0x80, 0xd2, 0x96, 0xed, 0x0c, 0xf5, 0x41, 0x53, 0x41, 0x55, 0x58, 0xe0,
|
||||
0x67, 0x73, 0xcd, 0x1c, 0xaa, 0x43, 0x65, 0xcd, 0x3f, 0xdf, 0x68, 0xe6, 0x6f, 0xfd, 0xa9, 0x02,
|
||||
0x4b, 0x89, 0xd3, 0x23, 0xd4, 0x00, 0x78, 0x66, 0xf5, 0xf8, 0xb1, 0x5a, 0xf3, 0x0c, 0xaa, 0x41,
|
||||
0xd9, 0x3f, 0x64, 0x63, 0xf8, 0x76, 0x6d, 0x0a, 0xdd, 0xcc, 0xa1, 0x26, 0xd4, 0xd8, 0xc0, 0x71,
|
||||
0xaf, 0x87, 0x5d, 0xb7, 0x99, 0x17, 0x3d, 0x1b, 0xba, 0x39, 0x18, 0x3b, 0xb8, 0x59, 0x20, 0x73,
|
||||
0xee, 0xda, 0x1a, 0x1e, 0x60, 0xdd, 0xc5, 0xcd, 0x22, 0x42, 0xd0, 0xe0, 0x0d, 0x7f, 0x50, 0x29,
|
||||
0xd4, 0xe7, 0x0f, 0x5b, 0xb8, 0xf5, 0x3c, 0x7c, 0x06, 0x40, 0x97, 0x77, 0x1e, 0xce, 0x3e, 0xb3,
|
||||
0x0c, 0xbc, 0x6f, 0x5a, 0xd8, 0x08, 0x3e, 0x35, 0xcf, 0xa0, 0xb3, 0xb0, 0xb8, 0x89, 0x9d, 0x3e,
|
||||
0x0e, 0x75, 0xe6, 0xd0, 0x12, 0xd4, 0x37, 0xcd, 0x97, 0xa1, 0xae, 0xbc, 0x5a, 0x28, 0x2b, 0x4d,
|
||||
0xe5, 0xfe, 0x7f, 0x5d, 0x85, 0x0a, 0x91, 0xad, 0x35, 0xdb, 0x76, 0x0c, 0x34, 0x00, 0x44, 0xdf,
|
||||
0x85, 0x0c, 0x47, 0xb6, 0x25, 0x1e, 0x92, 0xa1, 0x3b, 0x51, 0xf6, 0xf0, 0x46, 0x12, 0x90, 0xcb,
|
||||
0x4e, 0xfb, 0xba, 0x14, 0x3e, 0x06, 0xac, 0x9e, 0x41, 0x43, 0x3a, 0xdb, 0xae, 0x39, 0xc4, 0xbb,
|
||||
0x66, 0xef, 0xd0, 0x0f, 0x90, 0xee, 0xa5, 0x84, 0x43, 0x49, 0x50, 0x7f, 0xbe, 0x6b, 0xd2, 0xf9,
|
||||
0xd8, 0xc3, 0x1d, 0x5f, 0xe6, 0xd4, 0x33, 0xe8, 0x05, 0x9c, 0x7b, 0x82, 0x43, 0xb1, 0xa6, 0x3f,
|
||||
0xe1, 0xfd, 0xf4, 0x09, 0x13, 0xc0, 0xa7, 0x9c, 0xf2, 0x29, 0x14, 0xa9, 0xb8, 0x21, 0x59, 0x38,
|
||||
0x1a, 0x7e, 0x0f, 0xde, 0xbe, 0x92, 0x0e, 0x20, 0xb0, 0xfd, 0x10, 0x16, 0x63, 0x2f, 0x45, 0x91,
|
||||
0xcc, 0x39, 0xc9, 0xdf, 0xfc, 0xb6, 0x6f, 0x65, 0x01, 0x15, 0x73, 0xf5, 0xa1, 0x11, 0x7d, 0x4f,
|
||||
0x82, 0x56, 0x32, 0x3c, 0x4d, 0x63, 0x33, 0xbd, 0x97, 0xf9, 0x11, 0x1b, 0x15, 0x82, 0x66, 0xfc,
|
||||
0xe5, 0x22, 0xba, 0x35, 0x11, 0x41, 0x54, 0xd8, 0xde, 0xcf, 0x04, 0x2b, 0xa6, 0x3b, 0xa1, 0x42,
|
||||
0x90, 0x78, 0x31, 0x16, 0x97, 0x71, 0x1f, 0x4d, 0xda, 0x53, 0xb6, 0xf6, 0xdd, 0xcc, 0xf0, 0x62,
|
||||
0xea, 0xdf, 0x62, 0x97, 0x6f, 0x64, 0xaf, 0xae, 0xd0, 0x87, 0x72, 0x74, 0x13, 0x9e, 0x8b, 0xb5,
|
||||
0xef, 0x9f, 0x66, 0x88, 0x20, 0xe2, 0xc7, 0xf4, 0xd6, 0x8c, 0xe4, 0xdd, 0x52, 0x5c, 0xef, 0x7c,
|
||||
0x7c, 0xe9, 0x4f, 0xb2, 0xda, 0x1f, 0x9e, 0x62, 0x84, 0x20, 0xc0, 0x8e, 0x3f, 0x0d, 0xf5, 0xd5,
|
||||
0xf0, 0xee, 0x54, 0xa9, 0x99, 0x4d, 0x07, 0x7f, 0x00, 0x8b, 0xb1, 0x70, 0x0d, 0x65, 0x0f, 0xe9,
|
||||
0xda, 0x93, 0x5c, 0x13, 0x53, 0xc9, 0xd8, 0x25, 0x24, 0x94, 0x22, 0xfd, 0x92, 0x8b, 0x4a, 0xed,
|
||||
0x5b, 0x59, 0x40, 0xc5, 0x42, 0x5c, 0x6a, 0x2e, 0x63, 0x57, 0x4b, 0xd0, 0x6d, 0x39, 0x0e, 0xf9,
|
||||
0x15, 0x9a, 0xf6, 0x07, 0x19, 0xa1, 0xc5, 0xa4, 0x47, 0x70, 0x56, 0x72, 0x03, 0x08, 0x7d, 0x30,
|
||||
0x91, 0x59, 0xf1, 0xab, 0x4f, 0xed, 0x3b, 0x59, 0xc1, 0xc5, 0xbc, 0xbf, 0x0e, 0x68, 0xe7, 0xc0,
|
||||
0x3e, 0xa6, 0x91, 0x43, 0x7f, 0xec, 0xe8, 0x2c, 0xd8, 0x49, 0xf3, 0x0d, 0x49, 0xd0, 0x14, 0x19,
|
||||
0x9d, 0x38, 0x42, 0x4c, 0xde, 0x05, 0x78, 0x82, 0xbd, 0x4d, 0xec, 0x39, 0x44, 0x31, 0xde, 0x4d,
|
||||
0x73, 0x7f, 0x1c, 0xc0, 0x9f, 0xea, 0xe6, 0x54, 0xb8, 0x90, 0x2b, 0x6a, 0x6e, 0xea, 0xd6, 0x58,
|
||||
0x1f, 0x84, 0x9e, 0x30, 0xdc, 0x96, 0x0e, 0x8f, 0x83, 0xa5, 0x30, 0x32, 0x15, 0x5a, 0x4c, 0x79,
|
||||
0x2c, 0x5c, 0x7b, 0xe8, 0x44, 0x71, 0xb2, 0x6b, 0x4f, 0xde, 0x66, 0x89, 0x9b, 0xbd, 0x09, 0xf0,
|
||||
0x62, 0xe2, 0x2f, 0x15, 0x7a, 0x89, 0x2c, 0x06, 0xf0, 0xdc, 0xf4, 0x0e, 0xb6, 0x07, 0xba, 0xe5,
|
||||
0x66, 0x21, 0x81, 0x02, 0x9e, 0x82, 0x04, 0x0e, 0x2f, 0x48, 0x30, 0xa0, 0x1e, 0x39, 0xe8, 0x43,
|
||||
0xb2, 0x3b, 0xff, 0xb2, 0x43, 0xcf, 0xf6, 0xca, 0x74, 0x40, 0x31, 0xcb, 0x01, 0xd4, 0x7d, 0x55,
|
||||
0x62, 0x9b, 0xfb, 0x5e, 0x1a, 0xa5, 0x01, 0x4c, 0x8a, 0x25, 0x90, 0x83, 0x86, 0x2d, 0x41, 0xf2,
|
||||
0x1c, 0x03, 0x65, 0x3b, 0xff, 0x9a, 0x64, 0x09, 0xd2, 0x0f, 0x47, 0x98, 0xa9, 0x8b, 0x9d, 0x19,
|
||||
0xca, 0xed, 0xa8, 0xf4, 0x08, 0x54, 0x6a, 0xea, 0x52, 0x8e, 0x20, 0xd5, 0x33, 0xe8, 0x39, 0x94,
|
||||
0xf8, 0x1f, 0x9d, 0x5c, 0x9f, 0x5c, 0x7b, 0xe4, 0xd8, 0x6f, 0x4c, 0x81, 0x12, 0x88, 0x0f, 0xe1,
|
||||
0x7c, 0x4a, 0xe5, 0x51, 0xea, 0x82, 0x27, 0x57, 0x29, 0xa7, 0x39, 0x07, 0x31, 0x59, 0xa2, 0xb4,
|
||||
0x38, 0x61, 0xb2, 0xb4, 0x32, 0xe4, 0xb4, 0xc9, 0xba, 0xb0, 0x94, 0xa8, 0xda, 0xa0, 0xf7, 0x53,
|
||||
0x1c, 0x9d, 0xac, 0xb6, 0x33, 0x6d, 0x82, 0x3e, 0xbc, 0x25, 0xad, 0x50, 0x48, 0x1d, 0xf7, 0xa4,
|
||||
0x5a, 0xc6, 0xb4, 0x89, 0x7a, 0x70, 0x56, 0x52, 0x97, 0x90, 0xba, 0x9c, 0xf4, 0xfa, 0xc5, 0xb4,
|
||||
0x49, 0xf6, 0xa1, 0xbd, 0xea, 0xd8, 0xba, 0xd1, 0xd3, 0x5d, 0x8f, 0xd6, 0x0a, 0x48, 0x16, 0xe5,
|
||||
0x47, 0x4e, 0xf2, 0xb0, 0x5a, 0x5a, 0x51, 0x98, 0x36, 0xcf, 0x1e, 0x54, 0x29, 0x2b, 0xd9, 0x5f,
|
||||
0x50, 0x20, 0xb9, 0x8f, 0x08, 0x41, 0xa4, 0x18, 0x1e, 0x19, 0xa0, 0x10, 0xea, 0x5d, 0xa8, 0xae,
|
||||
0xd1, 0x23, 0x95, 0x8e, 0x65, 0xe0, 0x97, 0x71, 0x7f, 0x45, 0x5f, 0xdf, 0xde, 0x09, 0x01, 0x64,
|
||||
0xde, 0xa1, 0x3a, 0x0d, 0x68, 0x0d, 0xfc, 0x92, 0xf1, 0x79, 0x45, 0x86, 0x37, 0x02, 0x92, 0x92,
|
||||
0x00, 0x48, 0x21, 0x43, 0x9e, 0xfe, 0x5c, 0x38, 0xcc, 0x13, 0xd3, 0xdd, 0x4d, 0x41, 0x92, 0x80,
|
||||
0xf4, 0x67, 0xbd, 0x97, 0x7d, 0x40, 0xd8, 0x33, 0xf8, 0x74, 0x75, 0xe8, 0x79, 0xce, 0xcd, 0x49,
|
||||
0xa4, 0x87, 0x63, 0xb7, 0x95, 0xe9, 0x80, 0x62, 0x96, 0x6d, 0xa8, 0x10, 0xe9, 0x64, 0xec, 0xb9,
|
||||
0x2e, 0x1b, 0x28, 0x3e, 0x67, 0x67, 0xce, 0x3a, 0x76, 0x7b, 0x8e, 0xb9, 0xc7, 0x99, 0x2e, 0x25,
|
||||
0x27, 0x02, 0x32, 0x91, 0x39, 0x31, 0x48, 0x41, 0xf9, 0x6f, 0xd0, 0x68, 0x9d, 0xf6, 0xae, 0x8e,
|
||||
0xcd, 0x81, 0xb1, 0xed, 0xd8, 0x7d, 0xfa, 0xf2, 0xe5, 0xde, 0xa4, 0xe5, 0x47, 0x40, 0x53, 0x23,
|
||||
0xb1, 0x09, 0x23, 0xc4, 0xfc, 0xbf, 0x0a, 0x15, 0x51, 0x3e, 0x42, 0xb2, 0x1b, 0x5b, 0xf1, 0xc2,
|
||||
0x55, 0xfb, 0xfa, 0x64, 0x20, 0x1f, 0xf3, 0xfd, 0xaf, 0x2b, 0x50, 0xf6, 0x5f, 0xf9, 0x7c, 0xc3,
|
||||
0x75, 0x8f, 0x37, 0x50, 0x88, 0xf8, 0x01, 0x2c, 0xc6, 0x5e, 0xdc, 0x4b, 0x6d, 0x9c, 0xfc, 0x55,
|
||||
0xfe, 0x34, 0x61, 0x7c, 0xce, 0xff, 0x24, 0x4e, 0xe4, 0x24, 0x37, 0xd3, 0x8a, 0x19, 0xf1, 0x74,
|
||||
0x64, 0x0a, 0xe2, 0xff, 0xdd, 0x49, 0xc0, 0x16, 0x40, 0x28, 0xfc, 0x9f, 0x7c, 0x17, 0x96, 0x44,
|
||||
0xb4, 0xd3, 0x76, 0x6b, 0x28, 0x8d, 0xf0, 0xdf, 0xcb, 0x72, 0xaf, 0x30, 0x3d, 0x46, 0x4b, 0x8f,
|
||||
0xeb, 0x9f, 0x41, 0x2d, 0x7c, 0x4b, 0x1d, 0x49, 0xff, 0x92, 0x2c, 0x79, 0x8d, 0x7d, 0xda, 0x2a,
|
||||
0x36, 0x4f, 0x19, 0xfa, 0x4d, 0x41, 0xe7, 0x02, 0x4a, 0x9e, 0x6f, 0x4a, 0x43, 0xe5, 0xd4, 0x53,
|
||||
0x55, 0x69, 0xa8, 0x9c, 0x7e, 0x68, 0xca, 0x6a, 0x5a, 0xf1, 0x43, 0x3b, 0x69, 0x4d, 0x2b, 0xe5,
|
||||
0x18, 0x54, 0x5a, 0xd3, 0x4a, 0x3b, 0x05, 0x54, 0xcf, 0xac, 0x7e, 0xf4, 0xc5, 0x87, 0x7d, 0xd3,
|
||||
0x3b, 0x18, 0xef, 0x91, 0xd5, 0xdf, 0x65, 0x43, 0x3f, 0x30, 0x6d, 0xfe, 0xeb, 0xae, 0x2f, 0xee,
|
||||
0x77, 0x29, 0xb6, 0xbb, 0x04, 0xdb, 0x68, 0x6f, 0xaf, 0x44, 0x5b, 0x1f, 0xfd, 0x4f, 0x00, 0x00,
|
||||
0x00, 0xff, 0xff, 0x26, 0x21, 0x68, 0xba, 0x15, 0x53, 0x00, 0x00,
|
||||
0x09, 0x01, 0x37, 0xc4, 0x69, 0x59, 0xb4, 0x08, 0x69, 0xe1, 0xc2, 0x85, 0xeb, 0x08, 0x0e, 0x2b,
|
||||
0x84, 0xc4, 0x91, 0x23, 0x70, 0x47, 0xe2, 0x8c, 0xe2, 0x91, 0x91, 0xaf, 0xc8, 0xaa, 0xec, 0x2a,
|
||||
0x7b, 0x2c, 0xc1, 0xad, 0x22, 0xf2, 0x8b, 0x2f, 0xbe, 0x88, 0xef, 0xfd, 0x45, 0x44, 0x41, 0xd3,
|
||||
0xd0, 0x3d, 0xbd, 0xdb, 0xb3, 0x6d, 0xc7, 0xb8, 0x33, 0x72, 0x6c, 0xcf, 0x46, 0x4b, 0x43, 0x73,
|
||||
0x70, 0x34, 0x76, 0x59, 0xeb, 0x0e, 0xf9, 0xdc, 0xae, 0xf5, 0xec, 0xe1, 0xd0, 0xb6, 0x58, 0x57,
|
||||
0xbb, 0x61, 0x5a, 0x1e, 0x76, 0x2c, 0x7d, 0xc0, 0xdb, 0xb5, 0xf0, 0x80, 0x76, 0xcd, 0xed, 0x1d,
|
||||
0xe0, 0xa1, 0xce, 0x5b, 0x4b, 0xa6, 0x65, 0xe0, 0x97, 0x61, 0xfc, 0xea, 0x02, 0x14, 0x1f, 0x0f,
|
||||
0x47, 0xde, 0x89, 0xfa, 0xb7, 0x0a, 0xd4, 0x36, 0x06, 0x63, 0xf7, 0x40, 0xc3, 0x2f, 0xc6, 0xd8,
|
||||
0xf5, 0xd0, 0x3d, 0x28, 0xec, 0xe9, 0x2e, 0x6e, 0x29, 0x57, 0x94, 0x95, 0xea, 0xfd, 0x77, 0xee,
|
||||
0x44, 0x08, 0xe1, 0x24, 0x6c, 0xba, 0xfd, 0x55, 0xdd, 0xc5, 0x1a, 0x85, 0x44, 0x08, 0x0a, 0xc6,
|
||||
0x5e, 0x67, 0xbd, 0x95, 0xbb, 0xa2, 0xac, 0xe4, 0x35, 0xfa, 0x1b, 0x5d, 0x02, 0x70, 0x71, 0x7f,
|
||||
0x88, 0x2d, 0xaf, 0xb3, 0xee, 0xb6, 0xf2, 0x57, 0xf2, 0x2b, 0x79, 0x2d, 0xd4, 0x83, 0x54, 0xa8,
|
||||
0xf5, 0xec, 0xc1, 0x00, 0xf7, 0x3c, 0xd3, 0xb6, 0x3a, 0xeb, 0xad, 0x02, 0x1d, 0x1b, 0xe9, 0x43,
|
||||
0x6d, 0x28, 0x9b, 0x6e, 0x67, 0x38, 0xb2, 0x1d, 0xaf, 0x55, 0xbc, 0xa2, 0xac, 0x94, 0x35, 0xd1,
|
||||
0x56, 0xff, 0x5d, 0x81, 0x3a, 0x27, 0xdb, 0x1d, 0xd9, 0x96, 0x8b, 0xd1, 0x47, 0x50, 0x72, 0x3d,
|
||||
0xdd, 0x1b, 0xbb, 0x9c, 0xf2, 0xb7, 0xa5, 0x94, 0xef, 0x50, 0x10, 0x8d, 0x83, 0x4a, 0x49, 0x8f,
|
||||
0x93, 0x96, 0x97, 0x90, 0x16, 0x5d, 0x5e, 0x21, 0xb1, 0xbc, 0x15, 0x58, 0xdc, 0x27, 0xd4, 0xed,
|
||||
0x04, 0x40, 0x45, 0x0a, 0x14, 0xef, 0x26, 0x98, 0x3c, 0x73, 0x88, 0xbf, 0xb7, 0xbf, 0x83, 0xf5,
|
||||
0x41, 0xab, 0x44, 0xe7, 0x0a, 0xf5, 0xa8, 0xff, 0xac, 0x40, 0x53, 0x80, 0xfb, 0x3c, 0x3a, 0x07,
|
||||
0xc5, 0x9e, 0x3d, 0xb6, 0x3c, 0xba, 0xd4, 0xba, 0xc6, 0x1a, 0xe8, 0x2a, 0xd4, 0x7a, 0x07, 0xba,
|
||||
0x65, 0xe1, 0x41, 0xd7, 0xd2, 0x87, 0x98, 0x2e, 0xaa, 0xa2, 0x55, 0x79, 0xdf, 0x96, 0x3e, 0xc4,
|
||||
0x99, 0xd6, 0x76, 0x05, 0xaa, 0x23, 0xdd, 0xf1, 0xcc, 0x08, 0x67, 0xc2, 0x5d, 0x93, 0x18, 0x43,
|
||||
0x66, 0x30, 0xe9, 0xaf, 0x5d, 0xdd, 0x3d, 0xec, 0xac, 0xf3, 0x15, 0x45, 0xfa, 0xd4, 0x3f, 0x57,
|
||||
0x60, 0xf9, 0x91, 0xeb, 0x9a, 0x7d, 0x2b, 0xb1, 0xb2, 0x65, 0x28, 0x59, 0xb6, 0x81, 0x3b, 0xeb,
|
||||
0x74, 0x69, 0x79, 0x8d, 0xb7, 0xd0, 0xdb, 0x50, 0x19, 0x61, 0xec, 0x74, 0x1d, 0x7b, 0xe0, 0x2f,
|
||||
0xac, 0x4c, 0x3a, 0x34, 0x7b, 0x80, 0xd1, 0xf7, 0x61, 0xc9, 0x8d, 0x21, 0x62, 0x32, 0x57, 0xbd,
|
||||
0x7f, 0xed, 0x4e, 0x42, 0x91, 0xee, 0xc4, 0x27, 0xd5, 0x92, 0xa3, 0xd5, 0x2f, 0x73, 0x70, 0x56,
|
||||
0xc0, 0x31, 0x5a, 0xc9, 0x6f, 0xb2, 0xf3, 0x2e, 0xee, 0x0b, 0xf2, 0x58, 0x23, 0xcb, 0xce, 0x0b,
|
||||
0x96, 0xe5, 0xc3, 0x2c, 0xcb, 0xa2, 0x06, 0x31, 0x7e, 0x14, 0x93, 0xfc, 0xb8, 0x0c, 0x55, 0xfc,
|
||||
0x72, 0x64, 0x3a, 0xb8, 0x4b, 0x04, 0x87, 0x6e, 0x79, 0x41, 0x03, 0xd6, 0xb5, 0x6b, 0x0e, 0xc3,
|
||||
0xba, 0xb1, 0x90, 0x59, 0x37, 0xd4, 0xbf, 0x50, 0xe0, 0x7c, 0x82, 0x4b, 0x5c, 0xd9, 0x34, 0x68,
|
||||
0xd2, 0x95, 0x07, 0x3b, 0x43, 0xd4, 0x8e, 0x6c, 0xf8, 0xbb, 0x93, 0x36, 0x3c, 0x00, 0xd7, 0x12,
|
||||
0xe3, 0x43, 0x44, 0xe6, 0xb2, 0x13, 0x79, 0x08, 0xe7, 0x9f, 0x60, 0x8f, 0x4f, 0x40, 0xbe, 0x61,
|
||||
0x77, 0x76, 0x43, 0x16, 0xd5, 0xea, 0x5c, 0x5c, 0xab, 0xd5, 0xbf, 0xc9, 0x09, 0x5d, 0xa4, 0x53,
|
||||
0x75, 0xac, 0x7d, 0x1b, 0xbd, 0x03, 0x15, 0x01, 0xc2, 0xa5, 0x22, 0xe8, 0x40, 0xdf, 0x82, 0x22,
|
||||
0xa1, 0x94, 0x89, 0x44, 0xe3, 0xfe, 0x55, 0xf9, 0x9a, 0x42, 0x38, 0x35, 0x06, 0x8f, 0x3a, 0xd0,
|
||||
0x70, 0x3d, 0xdd, 0xf1, 0xba, 0x23, 0xdb, 0xa5, 0x7c, 0xa6, 0x82, 0x53, 0xbd, 0xaf, 0x46, 0x31,
|
||||
0x08, 0x2f, 0xb0, 0xe9, 0xf6, 0xb7, 0x39, 0xa4, 0x56, 0xa7, 0x23, 0xfd, 0x26, 0x7a, 0x0c, 0x35,
|
||||
0x6c, 0x19, 0x01, 0xa2, 0x42, 0x66, 0x44, 0x55, 0x6c, 0x19, 0x02, 0x4d, 0xc0, 0x9f, 0x62, 0x76,
|
||||
0xfe, 0xfc, 0x9e, 0x02, 0xad, 0x24, 0x83, 0xe6, 0x31, 0xd9, 0x0f, 0xd9, 0x20, 0xcc, 0x18, 0x34,
|
||||
0x51, 0xc3, 0x05, 0x93, 0x34, 0x3e, 0x44, 0xfd, 0x63, 0x05, 0xde, 0x0a, 0xc8, 0xa1, 0x9f, 0x5e,
|
||||
0x97, 0xb4, 0xa0, 0x5b, 0xd0, 0x34, 0xad, 0xde, 0x60, 0x6c, 0xe0, 0x67, 0xd6, 0x67, 0x58, 0x1f,
|
||||
0x78, 0x07, 0x27, 0x94, 0x87, 0x65, 0x2d, 0xd1, 0xaf, 0xfe, 0x5b, 0x0e, 0x96, 0xe3, 0x74, 0xcd,
|
||||
0xb3, 0x49, 0xff, 0x0f, 0x8a, 0xa6, 0xb5, 0x6f, 0xfb, 0x7b, 0x74, 0x69, 0x82, 0x52, 0x92, 0xb9,
|
||||
0x18, 0x30, 0xb2, 0x01, 0xf9, 0x66, 0xac, 0x77, 0x80, 0x7b, 0x87, 0x23, 0xdb, 0xa4, 0x06, 0x8b,
|
||||
0xa0, 0xf8, 0x25, 0x09, 0x0a, 0x39, 0xc5, 0x77, 0xd6, 0x18, 0x8e, 0x35, 0x81, 0xe2, 0xb1, 0xe5,
|
||||
0x39, 0x27, 0xda, 0x52, 0x2f, 0xde, 0xdf, 0x3e, 0x80, 0x65, 0x39, 0x30, 0x6a, 0x42, 0xfe, 0x10,
|
||||
0x9f, 0xd0, 0x25, 0x57, 0x34, 0xf2, 0x13, 0x3d, 0x80, 0xe2, 0x91, 0x3e, 0x18, 0x63, 0x6e, 0x1d,
|
||||
0xb2, 0x88, 0x2f, 0x1b, 0xf0, 0xed, 0xdc, 0x03, 0x45, 0x1d, 0xc2, 0xdb, 0x4f, 0xb0, 0xd7, 0xb1,
|
||||
0x5c, 0xec, 0x78, 0xab, 0xa6, 0x35, 0xb0, 0xfb, 0xdb, 0xba, 0x77, 0x30, 0x87, 0xad, 0x88, 0xa8,
|
||||
0x7d, 0x2e, 0xa6, 0xf6, 0xea, 0x4f, 0x14, 0x78, 0x47, 0x3e, 0x1f, 0xe7, 0x6a, 0x1b, 0xca, 0xfb,
|
||||
0x26, 0x1e, 0x18, 0x44, 0x74, 0x14, 0x2a, 0x3a, 0xa2, 0x4d, 0x6c, 0xc6, 0x88, 0x00, 0x73, 0xe6,
|
||||
0x5d, 0x4d, 0x59, 0xe9, 0x8e, 0xe7, 0x98, 0x56, 0xff, 0xa9, 0xe9, 0x7a, 0x1a, 0x83, 0x0f, 0x89,
|
||||
0x4a, 0x3e, 0xbb, 0x86, 0xfe, 0xae, 0x02, 0x97, 0x9e, 0x60, 0x6f, 0x4d, 0xb8, 0x1c, 0xf2, 0xdd,
|
||||
0x74, 0x3d, 0xb3, 0xe7, 0xbe, 0xda, 0x90, 0x30, 0x43, 0xec, 0xa1, 0xfe, 0x81, 0x02, 0x97, 0x53,
|
||||
0x89, 0xe1, 0x5b, 0xc7, 0x4d, 0xaa, 0xef, 0x70, 0xe4, 0x26, 0xf5, 0x57, 0xf0, 0xc9, 0xe7, 0x84,
|
||||
0xf9, 0xdb, 0xba, 0xe9, 0x30, 0x93, 0x3a, 0xa3, 0x83, 0xf9, 0x99, 0x02, 0x17, 0x9f, 0x60, 0x6f,
|
||||
0xdb, 0x77, 0xb7, 0x6f, 0x70, 0x77, 0x08, 0x4c, 0xc8, 0xed, 0xfb, 0x71, 0x67, 0xa4, 0x4f, 0xfd,
|
||||
0x7d, 0xc6, 0x4e, 0x29, 0xbd, 0x6f, 0x64, 0x03, 0x2f, 0x51, 0x4d, 0x08, 0xd9, 0x09, 0xae, 0xf1,
|
||||
0x7c, 0xfb, 0xd4, 0xaf, 0x8a, 0x50, 0xfb, 0x9c, 0x9b, 0x06, 0xea, 0x50, 0xe3, 0x3b, 0xa1, 0xc8,
|
||||
0x63, 0xa2, 0x50, 0x70, 0x25, 0x8b, 0xb7, 0x9e, 0x40, 0xdd, 0xc5, 0xf8, 0x70, 0x16, 0xf7, 0x59,
|
||||
0x23, 0x03, 0x85, 0xdb, 0x7b, 0x0a, 0x4b, 0x63, 0x8b, 0x46, 0xed, 0xd8, 0xe0, 0xab, 0x60, 0x3b,
|
||||
0x3f, 0xdd, 0xac, 0x26, 0x07, 0xa2, 0xcf, 0x78, 0x62, 0x10, 0xc2, 0x55, 0xcc, 0x84, 0x2b, 0x3e,
|
||||
0x0c, 0x75, 0xa0, 0x69, 0x38, 0xf6, 0x68, 0x84, 0x8d, 0xae, 0xeb, 0xa3, 0x2a, 0x65, 0x43, 0xc5,
|
||||
0xc7, 0x09, 0x54, 0xf7, 0xe0, 0x6c, 0x9c, 0xd2, 0x8e, 0x41, 0x62, 0x45, 0x22, 0x5e, 0xb2, 0x4f,
|
||||
0xe8, 0x36, 0x2c, 0x25, 0xe1, 0xcb, 0x14, 0x3e, 0xf9, 0x01, 0x7d, 0x00, 0x28, 0x46, 0x2a, 0x01,
|
||||
0xaf, 0x30, 0xf0, 0x28, 0x31, 0x1c, 0x9c, 0x26, 0xac, 0x51, 0x70, 0x60, 0xe0, 0xfc, 0x4b, 0x08,
|
||||
0xbc, 0x43, 0xfc, 0x6c, 0x04, 0xdc, 0x6d, 0x55, 0xb3, 0x6d, 0x44, 0x14, 0x99, 0xab, 0x7e, 0xa5,
|
||||
0xc0, 0xf2, 0x73, 0xdd, 0xeb, 0x1d, 0xac, 0x0f, 0xb9, 0x94, 0xce, 0xa1, 0xe5, 0x9f, 0x40, 0xe5,
|
||||
0x88, 0x4b, 0xa4, 0x6f, 0xca, 0x2f, 0x4b, 0x08, 0x0a, 0xcb, 0xbe, 0x16, 0x8c, 0x20, 0x49, 0xd2,
|
||||
0xb9, 0x8d, 0x50, 0xb2, 0xf8, 0x06, 0xec, 0xcd, 0x94, 0x2c, 0x57, 0x7d, 0x09, 0xc0, 0x89, 0xdb,
|
||||
0x74, 0xfb, 0x33, 0xd0, 0xf5, 0x00, 0x16, 0x38, 0x36, 0x6e, 0x50, 0xa6, 0x31, 0xcc, 0x07, 0x57,
|
||||
0x7f, 0x5a, 0x82, 0x6a, 0xe8, 0x03, 0x6a, 0x40, 0x4e, 0x58, 0x8a, 0x9c, 0x64, 0x75, 0xb9, 0xe9,
|
||||
0x79, 0x55, 0x3e, 0x99, 0x57, 0xdd, 0x80, 0x86, 0x49, 0x3d, 0x78, 0x97, 0x73, 0x85, 0x86, 0xce,
|
||||
0x15, 0xad, 0xce, 0x7a, 0xb9, 0x88, 0xa0, 0x4b, 0x50, 0xb5, 0xc6, 0xc3, 0xae, 0xbd, 0xdf, 0x75,
|
||||
0xec, 0x63, 0x97, 0x27, 0x68, 0x15, 0x6b, 0x3c, 0xfc, 0xde, 0xbe, 0x66, 0x1f, 0xbb, 0x41, 0x0e,
|
||||
0x50, 0x3a, 0x65, 0x0e, 0x70, 0x09, 0xaa, 0x43, 0xfd, 0x25, 0xc1, 0xda, 0xb5, 0xc6, 0x43, 0x9a,
|
||||
0xbb, 0xe5, 0xb5, 0xca, 0x50, 0x7f, 0xa9, 0xd9, 0xc7, 0x5b, 0xe3, 0x21, 0x5a, 0x81, 0xe6, 0x40,
|
||||
0x77, 0xbd, 0x6e, 0x38, 0xf9, 0x2b, 0xd3, 0xe4, 0xaf, 0x41, 0xfa, 0x1f, 0x07, 0x09, 0x60, 0x32,
|
||||
0x9b, 0xa8, 0xcc, 0x91, 0x4d, 0x18, 0xc3, 0x41, 0x80, 0x08, 0xb2, 0x67, 0x13, 0xc6, 0x70, 0x20,
|
||||
0xd0, 0x3c, 0x80, 0x85, 0x3d, 0x1a, 0x17, 0x4d, 0x52, 0xd6, 0x0d, 0x12, 0x12, 0xb1, 0xf0, 0x49,
|
||||
0xf3, 0xc1, 0xd1, 0x77, 0xa0, 0x42, 0xdd, 0x11, 0x1d, 0x5b, 0xcb, 0x34, 0x36, 0x18, 0x40, 0x46,
|
||||
0x1b, 0x78, 0xe0, 0xe9, 0x74, 0x74, 0x3d, 0xdb, 0x68, 0x31, 0x80, 0x58, 0xca, 0x9e, 0x83, 0x75,
|
||||
0x0f, 0x1b, 0xab, 0x27, 0x6b, 0xf6, 0x70, 0xa4, 0x53, 0x61, 0x6a, 0x35, 0x68, 0x58, 0x2f, 0xfb,
|
||||
0x84, 0xde, 0x85, 0x46, 0x4f, 0xb4, 0x36, 0x1c, 0x7b, 0xd8, 0x5a, 0xa4, 0x7a, 0x14, 0xeb, 0x45,
|
||||
0x17, 0x01, 0x7c, 0x1b, 0xa9, 0x7b, 0xad, 0x26, 0xe5, 0x62, 0x85, 0xf7, 0x3c, 0xa2, 0xb5, 0x1d,
|
||||
0xd3, 0xed, 0xb2, 0x2a, 0x8a, 0x69, 0xf5, 0x5b, 0x4b, 0x74, 0xc6, 0xaa, 0x5f, 0x76, 0x31, 0xad,
|
||||
0x3e, 0x3a, 0x0f, 0x0b, 0xa6, 0xdb, 0xdd, 0xd7, 0x0f, 0x71, 0x0b, 0xd1, 0xaf, 0x25, 0xd3, 0xdd,
|
||||
0xd0, 0x0f, 0xb1, 0xfa, 0x63, 0x38, 0x17, 0x48, 0x57, 0x88, 0x93, 0x49, 0xa1, 0x50, 0x66, 0x15,
|
||||
0x8a, 0xc9, 0xd1, 0xf0, 0x2f, 0x0a, 0xb0, 0xbc, 0xa3, 0x1f, 0xe1, 0xd7, 0x1f, 0x78, 0x67, 0x32,
|
||||
0x6b, 0x4f, 0x61, 0x89, 0xc6, 0xda, 0xf7, 0x43, 0xf4, 0x4c, 0xf0, 0xe8, 0x61, 0x51, 0x48, 0x0e,
|
||||
0x44, 0xdf, 0x25, 0xa1, 0x08, 0xee, 0x1d, 0x6e, 0x93, 0xe4, 0xc5, 0xf7, 0xe6, 0x17, 0x25, 0x78,
|
||||
0xd6, 0x04, 0x94, 0x16, 0x1e, 0x81, 0xb6, 0x61, 0x31, 0xca, 0x06, 0xdf, 0x8f, 0xdf, 0x9c, 0x98,
|
||||
0xd9, 0x06, 0xbb, 0xaf, 0x35, 0x22, 0xcc, 0x70, 0x51, 0x0b, 0x16, 0xb8, 0x13, 0xa6, 0x36, 0xa3,
|
||||
0xac, 0xf9, 0x4d, 0xb4, 0x0d, 0x67, 0xd9, 0x0a, 0x76, 0xb8, 0x42, 0xb0, 0xc5, 0x97, 0x33, 0x2d,
|
||||
0x5e, 0x36, 0x34, 0xaa, 0x4f, 0x95, 0xd3, 0xea, 0x53, 0x0b, 0x16, 0xb8, 0x8c, 0x53, 0x3b, 0x52,
|
||||
0xd6, 0xfc, 0x26, 0x61, 0x73, 0x20, 0xed, 0x55, 0xfa, 0x2d, 0xe8, 0x20, 0x49, 0x0b, 0x04, 0xfb,
|
||||
0x39, 0xa5, 0x06, 0xf3, 0x29, 0x94, 0x85, 0x84, 0x67, 0x4f, 0x1e, 0xc5, 0x98, 0xb8, 0x7d, 0xcf,
|
||||
0xc7, 0xec, 0xbb, 0xfa, 0x4f, 0x0a, 0xd4, 0xd6, 0xc9, 0x92, 0x9e, 0xda, 0x7d, 0xea, 0x8d, 0x6e,
|
||||
0x40, 0xc3, 0xc1, 0x3d, 0xdb, 0x31, 0xba, 0xd8, 0xf2, 0x1c, 0x13, 0xb3, 0xd4, 0xbd, 0xa0, 0xd5,
|
||||
0x59, 0xef, 0x63, 0xd6, 0x49, 0xc0, 0x88, 0xc9, 0x76, 0x3d, 0x7d, 0x38, 0xea, 0xee, 0x13, 0xd3,
|
||||
0x90, 0x63, 0x60, 0xa2, 0x97, 0x5a, 0x86, 0xab, 0x50, 0x0b, 0xc0, 0x3c, 0x9b, 0xce, 0x5f, 0xd0,
|
||||
0xaa, 0xa2, 0x6f, 0xd7, 0x46, 0xd7, 0xa1, 0x41, 0xf7, 0xb4, 0x3b, 0xb0, 0xfb, 0x5d, 0x92, 0x0b,
|
||||
0x72, 0x47, 0x55, 0x33, 0x38, 0x59, 0x84, 0x57, 0x51, 0x28, 0xd7, 0xfc, 0x11, 0xe6, 0xae, 0x4a,
|
||||
0x40, 0xed, 0x98, 0x3f, 0xc2, 0xea, 0x3f, 0x2a, 0x50, 0x5f, 0xd7, 0x3d, 0x7d, 0xcb, 0x36, 0xf0,
|
||||
0xee, 0x8c, 0x8e, 0x3d, 0x43, 0x3d, 0xf4, 0x1d, 0xa8, 0x88, 0x15, 0xf0, 0x25, 0x05, 0x1d, 0x68,
|
||||
0x03, 0x1a, 0x7e, 0x2c, 0xd7, 0x65, 0xb9, 0x4a, 0x21, 0x35, 0x80, 0x0a, 0x79, 0x4e, 0x57, 0xab,
|
||||
0xfb, 0xc3, 0x68, 0x53, 0xdd, 0x80, 0x5a, 0xf8, 0x33, 0x99, 0x75, 0x27, 0x2e, 0x28, 0xa2, 0x83,
|
||||
0x48, 0xe3, 0xd6, 0x78, 0x48, 0x78, 0xca, 0x0d, 0x8b, 0xdf, 0x54, 0x7f, 0x5b, 0x81, 0x3a, 0x77,
|
||||
0xf7, 0x3b, 0xe2, 0xe4, 0x80, 0x2e, 0x8d, 0x55, 0x28, 0xe8, 0x6f, 0xf4, 0xed, 0x68, 0xb1, 0xef,
|
||||
0xba, 0xd4, 0x08, 0x50, 0x24, 0x34, 0xc8, 0x8c, 0xf8, 0xfa, 0x2c, 0xd9, 0xf1, 0x97, 0x44, 0xd0,
|
||||
0x38, 0x6b, 0xa8, 0xa0, 0xb5, 0x60, 0x41, 0x37, 0x0c, 0x07, 0xbb, 0x2e, 0xa7, 0xc3, 0x6f, 0x92,
|
||||
0x2f, 0x47, 0xd8, 0x71, 0x7d, 0x91, 0xcf, 0x6b, 0x7e, 0x13, 0x7d, 0x07, 0xca, 0x22, 0x2a, 0x65,
|
||||
0xa5, 0x9d, 0x2b, 0xe9, 0x74, 0xf2, 0x5c, 0x4e, 0x8c, 0x50, 0xff, 0x2e, 0x07, 0x0d, 0xbe, 0x61,
|
||||
0xab, 0xdc, 0x1f, 0x4f, 0x56, 0xbe, 0x55, 0xa8, 0xed, 0x07, 0xba, 0x3f, 0xa9, 0x20, 0x15, 0x36,
|
||||
0x11, 0x91, 0x31, 0xd3, 0x14, 0x30, 0x1a, 0x11, 0x14, 0xe6, 0x8a, 0x08, 0x8a, 0xa7, 0xb5, 0x60,
|
||||
0xc9, 0x18, 0xb1, 0x24, 0x89, 0x11, 0xd5, 0x5f, 0x83, 0x6a, 0x08, 0x01, 0xb5, 0xd0, 0xac, 0xdc,
|
||||
0xc3, 0x77, 0xcc, 0x6f, 0xa2, 0x8f, 0x82, 0xb8, 0x88, 0x6d, 0xd5, 0x05, 0x09, 0x2d, 0xb1, 0x90,
|
||||
0x48, 0xfd, 0x07, 0x05, 0x4a, 0x1c, 0xf3, 0x65, 0xa8, 0x72, 0xa3, 0x43, 0x63, 0x46, 0x86, 0x1d,
|
||||
0x78, 0x17, 0x09, 0x1a, 0x5f, 0x9d, 0xd5, 0xb9, 0x00, 0xe5, 0x98, 0xbd, 0x59, 0xe0, 0x6e, 0xc1,
|
||||
0xff, 0x14, 0x32, 0x32, 0xe4, 0x13, 0xb1, 0x2f, 0xe8, 0x1c, 0x14, 0x07, 0x76, 0x5f, 0x9c, 0x0c,
|
||||
0xb1, 0x86, 0xfa, 0xb5, 0x42, 0x0b, 0xf9, 0x1a, 0xee, 0xd9, 0x47, 0xd8, 0x39, 0x99, 0xbf, 0x02,
|
||||
0xfa, 0x30, 0x24, 0xe6, 0x19, 0x93, 0x2f, 0x31, 0x00, 0x3d, 0x0c, 0x98, 0x90, 0x97, 0xd5, 0x48,
|
||||
0xc2, 0x76, 0x87, 0x0b, 0x69, 0xc0, 0x8c, 0x3f, 0x54, 0x68, 0x2d, 0x37, 0xba, 0x94, 0x59, 0xa3,
|
||||
0x9d, 0x57, 0x92, 0xc8, 0xa8, 0xbf, 0x50, 0xa0, 0x1d, 0x14, 0x61, 0xdc, 0xd5, 0x93, 0x79, 0x4f,
|
||||
0x4a, 0x5e, 0x4d, 0x7e, 0xf5, 0xff, 0x45, 0x29, 0x9f, 0x28, 0x6d, 0xa6, 0xcc, 0xc8, 0x2f, 0xe4,
|
||||
0x5b, 0xb4, 0x9e, 0x9b, 0x5c, 0xd0, 0x3c, 0x22, 0xd3, 0x86, 0xb2, 0x28, 0x20, 0xb0, 0x72, 0xbe,
|
||||
0x68, 0x13, 0x0d, 0xbb, 0xf0, 0x04, 0x7b, 0x1b, 0xd1, 0x22, 0xcc, 0x9b, 0xde, 0xc0, 0xf0, 0x11,
|
||||
0xc3, 0x01, 0x3f, 0x62, 0x28, 0xc4, 0x8e, 0x18, 0x78, 0xbf, 0x3a, 0xa4, 0x22, 0x90, 0x58, 0xc0,
|
||||
0xeb, 0xda, 0xb0, 0xdf, 0x51, 0xa0, 0xc5, 0x67, 0xa1, 0x73, 0x92, 0x94, 0x68, 0x80, 0x3d, 0x6c,
|
||||
0x7c, 0xd3, 0xa5, 0x82, 0x3f, 0xcd, 0x41, 0x33, 0xec, 0x75, 0xa9, 0xe3, 0xfc, 0x18, 0x8a, 0xb4,
|
||||
0xd2, 0xc2, 0x29, 0x98, 0x6a, 0x1a, 0x18, 0x34, 0x31, 0xdb, 0x34, 0xd4, 0xde, 0x15, 0x01, 0x02,
|
||||
0x6f, 0x06, 0xae, 0x3f, 0x7f, 0x7a, 0xd7, 0xcf, 0x43, 0x21, 0x7b, 0x4c, 0xf0, 0xb2, 0x13, 0xe0,
|
||||
0xa0, 0x03, 0x7d, 0x02, 0x25, 0x76, 0x99, 0x83, 0x1f, 0xbb, 0xdd, 0x88, 0xa2, 0xe6, 0x17, 0x3d,
|
||||
0x42, 0x15, 0x73, 0xda, 0xa1, 0xf1, 0x41, 0x84, 0x47, 0x23, 0xc7, 0xee, 0xd3, 0x18, 0x81, 0x58,
|
||||
0xdc, 0xa2, 0x26, 0xda, 0xea, 0x2f, 0xc3, 0x72, 0x90, 0xa9, 0x32, 0x92, 0x66, 0x15, 0x68, 0xf5,
|
||||
0x5f, 0x15, 0x38, 0xbb, 0x73, 0x62, 0xf5, 0xe2, 0xaa, 0xb1, 0x0c, 0xa5, 0xd1, 0x40, 0x0f, 0xea,
|
||||
0xb8, 0xbc, 0x45, 0x43, 0x44, 0x36, 0x37, 0x36, 0x88, 0x7f, 0x61, 0xfb, 0x59, 0x15, 0x7d, 0xbb,
|
||||
0xf6, 0x54, 0xb7, 0x7f, 0x43, 0xa4, 0xd6, 0xd8, 0x60, 0x9e, 0x8c, 0x95, 0xa8, 0xea, 0xa2, 0x97,
|
||||
0x7a, 0xb2, 0x4f, 0x00, 0xa8, 0xb3, 0xef, 0x9e, 0xc6, 0xc1, 0xd3, 0x11, 0x4f, 0x89, 0x39, 0xff,
|
||||
0x79, 0x0e, 0x5a, 0xa1, 0x5d, 0xfa, 0xa6, 0x63, 0x9f, 0x94, 0x8c, 0x2d, 0xff, 0x8a, 0x32, 0xb6,
|
||||
0xc2, 0xfc, 0xf1, 0x4e, 0x51, 0x16, 0xef, 0xfc, 0x66, 0x1e, 0x1a, 0xc1, 0xae, 0x6d, 0x0f, 0x74,
|
||||
0x2b, 0x55, 0x12, 0x76, 0x44, 0xac, 0x1f, 0xdd, 0xa7, 0xf7, 0x65, 0x3a, 0x94, 0xc2, 0x08, 0x2d,
|
||||
0x86, 0x02, 0x5d, 0xa4, 0x4c, 0x77, 0x3c, 0x56, 0x14, 0xe3, 0xf9, 0x05, 0x53, 0x56, 0x73, 0x88,
|
||||
0xd1, 0x6d, 0x40, 0x5c, 0xc3, 0xba, 0xa6, 0xd5, 0x75, 0x71, 0xcf, 0xb6, 0x0c, 0xa6, 0x7b, 0x45,
|
||||
0xad, 0xc9, 0xbf, 0x74, 0xac, 0x1d, 0xd6, 0x8f, 0x3e, 0x86, 0x82, 0x77, 0x32, 0x62, 0x91, 0x4c,
|
||||
0x43, 0x1a, 0x0b, 0x04, 0x74, 0xed, 0x9e, 0x8c, 0xb0, 0x46, 0xc1, 0xfd, 0xab, 0x3d, 0x9e, 0xa3,
|
||||
0x1f, 0xf1, 0xb0, 0xb0, 0xa0, 0x85, 0x7a, 0x88, 0x35, 0xf1, 0xf7, 0x70, 0x81, 0x85, 0x4f, 0xbc,
|
||||
0xc9, 0x24, 0xdb, 0x57, 0xe8, 0xae, 0xe7, 0x0d, 0x68, 0x59, 0x8f, 0x4a, 0xb6, 0xdf, 0xbb, 0xeb,
|
||||
0x0d, 0xc8, 0x22, 0x3d, 0xdb, 0xd3, 0x07, 0x4c, 0x3f, 0x2a, 0xdc, 0x72, 0x90, 0x1e, 0x9a, 0xb4,
|
||||
0xfc, 0x0b, 0xb1, 0x7c, 0x82, 0x30, 0x0d, 0xbb, 0xe3, 0x41, 0xba, 0x3e, 0x4e, 0x2e, 0xab, 0x4c,
|
||||
0x53, 0xc5, 0xef, 0x42, 0x95, 0x4b, 0xc5, 0x29, 0xa4, 0x0a, 0xd8, 0x90, 0xa7, 0x13, 0xc4, 0xbc,
|
||||
0xf8, 0x8a, 0xc4, 0xbc, 0x34, 0x43, 0x61, 0x42, 0xce, 0x1b, 0xf5, 0x27, 0x0a, 0xbc, 0x95, 0xb0,
|
||||
0x9a, 0x13, 0xb7, 0x76, 0x72, 0x5a, 0xc8, 0xad, 0x69, 0x1c, 0x25, 0xf7, 0x0d, 0x0f, 0xa1, 0xe4,
|
||||
0x50, 0xec, 0xfc, 0xfc, 0xea, 0xda, 0x44, 0xe1, 0x63, 0x84, 0x68, 0x7c, 0x88, 0xfa, 0x47, 0x0a,
|
||||
0x9c, 0x4f, 0x92, 0x3a, 0x87, 0xc3, 0x5f, 0x85, 0x05, 0x86, 0xda, 0xd7, 0xd1, 0x95, 0xc9, 0x3a,
|
||||
0x1a, 0x6c, 0x8e, 0xe6, 0x0f, 0x54, 0x77, 0x60, 0xd9, 0x8f, 0x0b, 0x82, 0xad, 0xdf, 0xc4, 0x9e,
|
||||
0x3e, 0x21, 0x29, 0xba, 0x0c, 0x55, 0x16, 0x5d, 0xb3, 0x64, 0x83, 0x95, 0x13, 0x60, 0x4f, 0x54,
|
||||
0xe1, 0xd4, 0xff, 0x54, 0xe0, 0x1c, 0x75, 0xac, 0xf1, 0x63, 0x9b, 0x2c, 0x87, 0x89, 0xaa, 0xa8,
|
||||
0x56, 0x6c, 0xe9, 0x43, 0x7e, 0xaf, 0xa4, 0xa2, 0x45, 0xfa, 0x50, 0x27, 0x59, 0xa4, 0x93, 0x26,
|
||||
0xcf, 0xc1, 0xe9, 0x29, 0x49, 0xd4, 0xe9, 0xe1, 0x69, 0xbc, 0x3a, 0x17, 0x38, 0xf4, 0xc2, 0x0c,
|
||||
0x0e, 0x5d, 0x7d, 0x0a, 0x6f, 0xc5, 0x56, 0x3a, 0x07, 0x47, 0xd5, 0xbf, 0x54, 0x08, 0x3b, 0x22,
|
||||
0xf7, 0x73, 0x66, 0x0f, 0x6a, 0x2f, 0x8a, 0xf3, 0xa2, 0xae, 0x69, 0xc4, 0x8d, 0x88, 0x81, 0x3e,
|
||||
0x85, 0x8a, 0x85, 0x8f, 0xbb, 0xe1, 0x38, 0x29, 0x43, 0xc4, 0x5f, 0xb6, 0xf0, 0x31, 0xfd, 0xa5,
|
||||
0x6e, 0xc1, 0xf9, 0x04, 0xa9, 0xf3, 0xac, 0xfd, 0xef, 0x15, 0xb8, 0xb0, 0xee, 0xd8, 0xa3, 0xcf,
|
||||
0x4d, 0xc7, 0x1b, 0xeb, 0x83, 0xe8, 0xb9, 0xf4, 0xeb, 0xa9, 0x7a, 0x7d, 0x16, 0x8a, 0x98, 0x99,
|
||||
0xfc, 0xdc, 0x96, 0x68, 0x50, 0x92, 0x28, 0xbe, 0xe8, 0x50, 0x7c, 0xfd, 0x1f, 0x79, 0x19, 0xf1,
|
||||
0x1c, 0x6e, 0x4a, 0x5c, 0x92, 0x25, 0xf9, 0x90, 0x16, 0xc9, 0xf3, 0xb3, 0x16, 0xc9, 0x53, 0xcc,
|
||||
0x7b, 0xe1, 0x15, 0x99, 0xf7, 0x53, 0x57, 0x6d, 0x3e, 0x83, 0xe8, 0x01, 0x06, 0xf5, 0xce, 0x33,
|
||||
0x9d, 0x7c, 0xac, 0x02, 0x04, 0xc5, 0x7c, 0x7e, 0xbd, 0x32, 0x0b, 0x9a, 0xd0, 0x28, 0xc2, 0x2d,
|
||||
0xe1, 0x4a, 0xb9, 0xa7, 0x0f, 0x95, 0x97, 0xbf, 0x0f, 0x6d, 0x99, 0x94, 0xce, 0x23, 0xf9, 0x3f,
|
||||
0xcf, 0x01, 0x74, 0xc4, 0x8d, 0xdc, 0xd9, 0x7c, 0xc1, 0x35, 0x08, 0x45, 0x23, 0x81, 0xbe, 0x87,
|
||||
0xa5, 0xc8, 0x20, 0x2a, 0x21, 0xf2, 0x55, 0x02, 0x93, 0xc8, 0x61, 0x0d, 0x8a, 0x27, 0xa4, 0x35,
|
||||
0x4c, 0x28, 0xe2, 0xe6, 0xf7, 0x6d, 0xa8, 0x38, 0xf6, 0x71, 0x97, 0xa8, 0x99, 0xe1, 0x5f, 0x39,
|
||||
0x76, 0xec, 0x63, 0xa2, 0x7c, 0x06, 0x3a, 0x0f, 0x0b, 0x9e, 0xee, 0x1e, 0x12, 0xfc, 0xac, 0xa6,
|
||||
0x54, 0x22, 0xcd, 0x8e, 0x81, 0xce, 0x41, 0x71, 0xdf, 0x1c, 0x60, 0x76, 0x93, 0xa1, 0xa2, 0xb1,
|
||||
0x06, 0xfa, 0x96, 0x7f, 0x37, 0xae, 0x9c, 0xf9, 0xfa, 0x0b, 0x85, 0x57, 0xbf, 0x56, 0x60, 0x31,
|
||||
0xd8, 0x35, 0x6a, 0x80, 0x88, 0x4d, 0xa3, 0xf6, 0x6c, 0xcd, 0x36, 0x98, 0xa9, 0x68, 0xa4, 0x78,
|
||||
0x04, 0x36, 0x90, 0x59, 0xad, 0x60, 0xc8, 0xa4, 0x14, 0x9a, 0xac, 0x8b, 0x2c, 0xda, 0x34, 0xfc,
|
||||
0x0b, 0xf4, 0x25, 0xc7, 0x3e, 0xee, 0x18, 0x62, 0x37, 0xd8, 0x7d, 0x62, 0x96, 0x30, 0x92, 0xdd,
|
||||
0x58, 0xa3, 0x57, 0x8a, 0xaf, 0x41, 0x1d, 0x3b, 0x8e, 0xed, 0x74, 0x87, 0xd8, 0x75, 0xf5, 0x3e,
|
||||
0xe6, 0xf1, 0x79, 0x8d, 0x76, 0x6e, 0xb2, 0x3e, 0xf5, 0x4f, 0x0a, 0xd0, 0x08, 0x96, 0xe2, 0x1f,
|
||||
0xa1, 0x9b, 0x86, 0x7f, 0x84, 0x6e, 0x12, 0xd6, 0x81, 0xc3, 0x4c, 0xa1, 0x60, 0xee, 0x6a, 0xae,
|
||||
0xa5, 0x68, 0x15, 0xde, 0xdb, 0x31, 0x88, 0x5b, 0x26, 0x4a, 0x66, 0xd9, 0x06, 0x0e, 0x98, 0x0b,
|
||||
0x7e, 0x17, 0xe7, 0x6d, 0x44, 0x46, 0x0a, 0x19, 0x64, 0xa4, 0x98, 0x41, 0x46, 0x4a, 0x12, 0x19,
|
||||
0x59, 0x86, 0xd2, 0xde, 0xb8, 0x77, 0x88, 0x3d, 0x1e, 0xb1, 0xf1, 0x56, 0x54, 0x76, 0xca, 0x31,
|
||||
0xd9, 0x11, 0x22, 0x52, 0x09, 0x8b, 0xc8, 0xdb, 0x50, 0x61, 0x67, 0xb9, 0x5d, 0xcf, 0xa5, 0x07,
|
||||
0x53, 0x79, 0xad, 0xcc, 0x3a, 0x76, 0x5d, 0xf4, 0xc0, 0x0f, 0xe7, 0xaa, 0x32, 0x65, 0xa7, 0x56,
|
||||
0x27, 0x26, 0x25, 0x7e, 0x30, 0x77, 0x13, 0x16, 0x43, 0xdb, 0x41, 0x7d, 0x44, 0x8d, 0x92, 0x1a,
|
||||
0x8a, 0xf6, 0xa9, 0x9b, 0xb8, 0x01, 0x8d, 0x60, 0x4b, 0x28, 0x5c, 0x9d, 0x25, 0x59, 0xa2, 0x97,
|
||||
0x82, 0x09, 0x49, 0x6e, 0x9c, 0x4e, 0x92, 0xd1, 0x05, 0x28, 0xf3, 0xec, 0xc8, 0x6d, 0x2d, 0x46,
|
||||
0x0a, 0x19, 0xea, 0x0f, 0x01, 0x05, 0xd4, 0xcf, 0x17, 0x2d, 0xc6, 0xc4, 0x23, 0x17, 0x17, 0x0f,
|
||||
0xf5, 0xa7, 0x0a, 0x2c, 0x85, 0x27, 0x9b, 0xd5, 0xf1, 0x7e, 0x0a, 0x55, 0x76, 0x34, 0xd8, 0x25,
|
||||
0x8a, 0xcf, 0x0b, 0x44, 0x17, 0x27, 0xf2, 0x45, 0x83, 0xe0, 0x45, 0x02, 0x11, 0xaf, 0x63, 0xdb,
|
||||
0x39, 0x34, 0xad, 0x7e, 0x97, 0x50, 0xe6, 0xab, 0x5b, 0x8d, 0x77, 0x6e, 0x91, 0x3e, 0xf5, 0x2b,
|
||||
0x05, 0x2e, 0x3d, 0x1b, 0x19, 0xba, 0x87, 0x43, 0x11, 0xc8, 0xbc, 0x37, 0x01, 0x3f, 0xf6, 0xaf,
|
||||
0xe2, 0xe5, 0xb2, 0x1d, 0x6f, 0x31, 0x68, 0xf5, 0xaf, 0x05, 0x2d, 0x89, 0xeb, 0xb3, 0xb3, 0xd3,
|
||||
0xd2, 0x86, 0xf2, 0x11, 0x47, 0xe7, 0xbf, 0xb0, 0xf0, 0xdb, 0x91, 0x23, 0xd4, 0xfc, 0xe9, 0x8f,
|
||||
0x50, 0xd5, 0x4d, 0xb8, 0xa0, 0x61, 0x17, 0x5b, 0x46, 0x64, 0x35, 0x33, 0x17, 0x9b, 0x46, 0xd0,
|
||||
0x96, 0xa1, 0x9b, 0x47, 0x58, 0x59, 0xec, 0xda, 0x75, 0x08, 0x5a, 0x8f, 0x9b, 0x62, 0x12, 0x32,
|
||||
0xd1, 0x79, 0x3c, 0xf5, 0xaf, 0x72, 0x70, 0xfe, 0x91, 0x61, 0x70, 0x2b, 0xce, 0xa3, 0xb1, 0xd7,
|
||||
0x15, 0x28, 0xc7, 0x03, 0xc9, 0x7c, 0x32, 0x90, 0x7c, 0x55, 0x96, 0x95, 0xfb, 0x18, 0x6b, 0x3c,
|
||||
0xf4, 0x7d, 0xa7, 0xc3, 0xee, 0x16, 0x3d, 0xe4, 0x67, 0x6a, 0x24, 0xa1, 0xa7, 0xfe, 0x73, 0x7a,
|
||||
0x7c, 0x55, 0xf6, 0x8b, 0x66, 0xea, 0x08, 0x5a, 0xc9, 0xcd, 0x9a, 0xd3, 0x94, 0xf8, 0x3b, 0x32,
|
||||
0xb2, 0x59, 0xf1, 0xb5, 0x46, 0x42, 0x28, 0xda, 0xb5, 0x6d, 0xbb, 0xea, 0x7f, 0xe5, 0xa0, 0xb5,
|
||||
0xa3, 0x1f, 0xe1, 0xff, 0x3b, 0x0c, 0xfa, 0x02, 0xce, 0xb9, 0xfa, 0x11, 0xee, 0x86, 0x12, 0xe3,
|
||||
0xae, 0x83, 0x5f, 0xf0, 0x10, 0xf4, 0x3d, 0x99, 0x25, 0x91, 0x5e, 0xc1, 0xd1, 0x96, 0xdc, 0x48,
|
||||
0xbf, 0x86, 0x5f, 0xa0, 0x77, 0x61, 0x31, 0x7c, 0xc7, 0x8b, 0x90, 0x56, 0xa6, 0x5b, 0x5e, 0x0f,
|
||||
0x5d, 0xe1, 0xea, 0x18, 0xea, 0x0b, 0x78, 0xe7, 0x99, 0xe5, 0x62, 0xaf, 0x13, 0x5c, 0x43, 0x9a,
|
||||
0x33, 0x85, 0xbc, 0x0c, 0xd5, 0x60, 0xe3, 0x13, 0xaf, 0x2a, 0x0c, 0x57, 0xb5, 0xa1, 0xbd, 0xa9,
|
||||
0x3b, 0x87, 0x7e, 0x99, 0x79, 0x9d, 0x5d, 0x17, 0x79, 0x8d, 0x13, 0xee, 0x8b, 0xdb, 0x53, 0x1a,
|
||||
0xde, 0xc7, 0x0e, 0xb6, 0x7a, 0xf8, 0xa9, 0xdd, 0x3b, 0x24, 0xe1, 0x86, 0xc7, 0x9e, 0xb8, 0x29,
|
||||
0xa1, 0xa0, 0x73, 0x3d, 0xf4, 0x82, 0x2d, 0x17, 0x79, 0xc1, 0x36, 0xe5, 0x45, 0xa4, 0xfa, 0xb3,
|
||||
0x1c, 0x2c, 0x3f, 0x1a, 0x78, 0xd8, 0x09, 0x32, 0xff, 0xd3, 0x14, 0x31, 0x82, 0xaa, 0x42, 0x6e,
|
||||
0x96, 0x63, 0x82, 0xf8, 0xd5, 0xf2, 0x7c, 0xf2, 0x6a, 0xb9, 0xac, 0x06, 0x52, 0x98, 0xb1, 0x06,
|
||||
0xf2, 0x08, 0x60, 0xe4, 0xd8, 0x23, 0xec, 0x78, 0x26, 0xf6, 0xd3, 0xb7, 0x0c, 0xe1, 0x4b, 0x68,
|
||||
0x90, 0xfa, 0x05, 0x34, 0x9f, 0xf4, 0xd6, 0x6c, 0x6b, 0xdf, 0x74, 0x86, 0xfe, 0x46, 0x25, 0x94,
|
||||
0x4e, 0xc9, 0xa0, 0x74, 0xb9, 0x84, 0xd2, 0xa9, 0x26, 0x2c, 0x85, 0x70, 0xcf, 0x69, 0xb8, 0xfa,
|
||||
0xbd, 0xee, 0xbe, 0x69, 0x99, 0xf4, 0x3a, 0x56, 0x8e, 0x86, 0x9f, 0xd0, 0xef, 0x6d, 0xf0, 0x9e,
|
||||
0x5b, 0x9f, 0x8a, 0x8b, 0xac, 0xbb, 0x27, 0x23, 0x8c, 0x16, 0x20, 0xbf, 0x85, 0x8f, 0x9b, 0x67,
|
||||
0x10, 0x40, 0x69, 0xcb, 0x76, 0x86, 0xfa, 0xa0, 0xa9, 0xa0, 0x2a, 0x2c, 0xf0, 0x73, 0xbb, 0x66,
|
||||
0x0e, 0xd5, 0xa1, 0xb2, 0xe6, 0x9f, 0x6f, 0x34, 0xf3, 0xb7, 0xfe, 0x4c, 0x81, 0xa5, 0xc4, 0xc9,
|
||||
0x12, 0x6a, 0x00, 0x3c, 0xb3, 0x7a, 0xfc, 0xc8, 0xad, 0x79, 0x06, 0xd5, 0xa0, 0xec, 0x1f, 0xc0,
|
||||
0x31, 0x7c, 0xbb, 0x36, 0x85, 0x6e, 0xe6, 0x50, 0x13, 0x6a, 0x6c, 0xe0, 0xb8, 0xd7, 0xc3, 0xae,
|
||||
0xdb, 0xcc, 0x8b, 0x9e, 0x0d, 0xdd, 0x1c, 0x8c, 0x1d, 0xdc, 0x2c, 0x90, 0x39, 0x77, 0x6d, 0x0d,
|
||||
0x0f, 0xb0, 0xee, 0xe2, 0x66, 0x11, 0x21, 0x68, 0xf0, 0x86, 0x3f, 0xa8, 0x14, 0xea, 0xf3, 0x87,
|
||||
0x2d, 0xdc, 0x7a, 0x1e, 0x3e, 0x03, 0xa0, 0xcb, 0x3b, 0x0f, 0x67, 0x9f, 0x59, 0x06, 0xde, 0x37,
|
||||
0x2d, 0x6c, 0x04, 0x9f, 0x9a, 0x67, 0xd0, 0x59, 0x58, 0xdc, 0xc4, 0x4e, 0x1f, 0x87, 0x3a, 0x73,
|
||||
0x68, 0x09, 0xea, 0x9b, 0xe6, 0xcb, 0x50, 0x57, 0x5e, 0x2d, 0x94, 0x95, 0xa6, 0x72, 0xff, 0xbf,
|
||||
0xaf, 0x42, 0x85, 0xc8, 0xd6, 0x9a, 0x6d, 0x3b, 0x06, 0x1a, 0x00, 0xa2, 0x6f, 0x46, 0x86, 0x23,
|
||||
0xdb, 0x12, 0x8f, 0xcc, 0xd0, 0x9d, 0x28, 0x7b, 0x78, 0x23, 0x09, 0xc8, 0x65, 0xa7, 0x7d, 0x5d,
|
||||
0x0a, 0x1f, 0x03, 0x56, 0xcf, 0xa0, 0x21, 0x9d, 0x6d, 0xd7, 0x1c, 0xe2, 0x5d, 0xb3, 0x77, 0xe8,
|
||||
0x07, 0x48, 0xf7, 0x52, 0xc2, 0xa1, 0x24, 0xa8, 0x3f, 0xdf, 0x35, 0xe9, 0x7c, 0xec, 0x51, 0x8f,
|
||||
0x2f, 0x73, 0xea, 0x19, 0xf4, 0x02, 0xce, 0x3d, 0xc1, 0xa1, 0x58, 0xd3, 0x9f, 0xf0, 0x7e, 0xfa,
|
||||
0x84, 0x09, 0xe0, 0x53, 0x4e, 0xf9, 0x14, 0x8a, 0x54, 0xdc, 0x90, 0x2c, 0x1c, 0x0d, 0xbf, 0x15,
|
||||
0x6f, 0x5f, 0x49, 0x07, 0x10, 0xd8, 0x7e, 0x08, 0x8b, 0xb1, 0x57, 0xa4, 0x48, 0xe6, 0x9c, 0xe4,
|
||||
0xef, 0x81, 0xdb, 0xb7, 0xb2, 0x80, 0x8a, 0xb9, 0xfa, 0xd0, 0x88, 0xbe, 0x35, 0x41, 0x2b, 0x19,
|
||||
0x9e, 0xad, 0xb1, 0x99, 0xde, 0xcb, 0xfc, 0xc0, 0x8d, 0x0a, 0x41, 0x33, 0xfe, 0xaa, 0x11, 0xdd,
|
||||
0x9a, 0x88, 0x20, 0x2a, 0x6c, 0xef, 0x67, 0x82, 0x15, 0xd3, 0x9d, 0x50, 0x21, 0x48, 0xbc, 0x26,
|
||||
0x8b, 0xcb, 0xb8, 0x8f, 0x26, 0xed, 0x99, 0x5b, 0xfb, 0x6e, 0x66, 0x78, 0x31, 0xf5, 0x6f, 0xb1,
|
||||
0x8b, 0x39, 0xb2, 0x17, 0x59, 0xe8, 0x43, 0x39, 0xba, 0x09, 0x4f, 0xc9, 0xda, 0xf7, 0x4f, 0x33,
|
||||
0x44, 0x10, 0xf1, 0x63, 0x7a, 0xa3, 0x46, 0xf2, 0xa6, 0x29, 0xae, 0x77, 0x3e, 0xbe, 0xf4, 0xe7,
|
||||
0x5a, 0xed, 0x0f, 0x4f, 0x31, 0x42, 0x10, 0x60, 0xc7, 0x9f, 0x8d, 0xfa, 0x6a, 0x78, 0x77, 0xaa,
|
||||
0xd4, 0xcc, 0xa6, 0x83, 0x3f, 0x80, 0xc5, 0x58, 0xb8, 0x86, 0xb2, 0x87, 0x74, 0xed, 0x49, 0xae,
|
||||
0x89, 0xa9, 0x64, 0xec, 0x82, 0x12, 0x4a, 0x91, 0x7e, 0xc9, 0x25, 0xa6, 0xf6, 0xad, 0x2c, 0xa0,
|
||||
0x62, 0x21, 0x2e, 0x35, 0x97, 0xb1, 0x6b, 0x27, 0xe8, 0xb6, 0x1c, 0x87, 0xfc, 0x7a, 0x4d, 0xfb,
|
||||
0x83, 0x8c, 0xd0, 0x62, 0xd2, 0x23, 0x38, 0x2b, 0xb9, 0x1d, 0x84, 0x3e, 0x98, 0xc8, 0xac, 0xf8,
|
||||
0xb5, 0xa8, 0xf6, 0x9d, 0xac, 0xe0, 0x62, 0xde, 0x5f, 0x07, 0xb4, 0x73, 0x60, 0x1f, 0xd3, 0xc8,
|
||||
0xa1, 0x3f, 0x76, 0x74, 0x16, 0xec, 0xa4, 0xf9, 0x86, 0x24, 0x68, 0x8a, 0x8c, 0x4e, 0x1c, 0x21,
|
||||
0x26, 0xef, 0x02, 0x3c, 0xc1, 0xde, 0x26, 0xf6, 0x1c, 0xa2, 0x18, 0xef, 0xa6, 0xb9, 0x3f, 0x0e,
|
||||
0xe0, 0x4f, 0x75, 0x73, 0x2a, 0x5c, 0xc8, 0x15, 0x35, 0x37, 0x75, 0x6b, 0xac, 0x0f, 0x42, 0xcf,
|
||||
0x1b, 0x6e, 0x4b, 0x87, 0xc7, 0xc1, 0x52, 0x18, 0x99, 0x0a, 0x2d, 0xa6, 0x3c, 0x16, 0xae, 0x3d,
|
||||
0x74, 0xa2, 0x38, 0xd9, 0xb5, 0x27, 0x6f, 0xb3, 0xc4, 0xcd, 0xde, 0x04, 0x78, 0x31, 0xf1, 0x97,
|
||||
0x0a, 0xbd, 0x60, 0x16, 0x03, 0x78, 0x6e, 0x7a, 0x07, 0xdb, 0x03, 0xdd, 0x72, 0xb3, 0x90, 0x40,
|
||||
0x01, 0x4f, 0x41, 0x02, 0x87, 0x17, 0x24, 0x18, 0x50, 0x8f, 0x1c, 0xf4, 0x21, 0xd9, 0x7b, 0x00,
|
||||
0xd9, 0xa1, 0x67, 0x7b, 0x65, 0x3a, 0xa0, 0x98, 0xe5, 0x00, 0xea, 0xbe, 0x2a, 0xb1, 0xcd, 0x7d,
|
||||
0x2f, 0x8d, 0xd2, 0x00, 0x26, 0xc5, 0x12, 0xc8, 0x41, 0xc3, 0x96, 0x20, 0x79, 0x8e, 0x81, 0xb2,
|
||||
0x9d, 0x7f, 0x4d, 0xb2, 0x04, 0xe9, 0x87, 0x23, 0xcc, 0xd4, 0xc5, 0xce, 0x0c, 0xe5, 0x76, 0x54,
|
||||
0x7a, 0x04, 0x2a, 0x35, 0x75, 0x29, 0x47, 0x90, 0xea, 0x19, 0xf4, 0x1c, 0x4a, 0xfc, 0x4f, 0x50,
|
||||
0xae, 0x4f, 0xae, 0x3d, 0x72, 0xec, 0x37, 0xa6, 0x40, 0x09, 0xc4, 0x87, 0x70, 0x3e, 0xa5, 0xf2,
|
||||
0x28, 0x75, 0xc1, 0x93, 0xab, 0x94, 0xd3, 0x9c, 0x83, 0x98, 0x2c, 0x51, 0x5a, 0x9c, 0x30, 0x59,
|
||||
0x5a, 0x19, 0x72, 0xda, 0x64, 0x5d, 0x58, 0x4a, 0x54, 0x6d, 0xd0, 0xfb, 0x29, 0x8e, 0x4e, 0x56,
|
||||
0xdb, 0x99, 0x36, 0x41, 0x1f, 0xde, 0x92, 0x56, 0x28, 0xa4, 0x8e, 0x7b, 0x52, 0x2d, 0x63, 0xda,
|
||||
0x44, 0x3d, 0x38, 0x2b, 0xa9, 0x4b, 0x48, 0x5d, 0x4e, 0x7a, 0xfd, 0x62, 0xda, 0x24, 0xfb, 0xd0,
|
||||
0x5e, 0x75, 0x6c, 0xdd, 0xe8, 0xe9, 0xae, 0x47, 0x6b, 0x05, 0x24, 0x8b, 0xf2, 0x23, 0x27, 0x79,
|
||||
0x58, 0x2d, 0xad, 0x28, 0x4c, 0x9b, 0x67, 0x0f, 0xaa, 0x94, 0x95, 0xec, 0xef, 0x29, 0x90, 0xdc,
|
||||
0x47, 0x84, 0x20, 0x52, 0x0c, 0x8f, 0x0c, 0x50, 0x08, 0xf5, 0x2e, 0x54, 0xd7, 0xe8, 0x91, 0x4a,
|
||||
0xc7, 0x32, 0xf0, 0xcb, 0xb8, 0xbf, 0xa2, 0x2f, 0x73, 0xef, 0x84, 0x00, 0x32, 0xef, 0x50, 0x9d,
|
||||
0x06, 0xb4, 0x06, 0x7e, 0xc9, 0xf8, 0xbc, 0x22, 0xc3, 0x1b, 0x01, 0x49, 0x49, 0x00, 0xa4, 0x90,
|
||||
0x21, 0x4f, 0x7f, 0x2e, 0x1c, 0xe6, 0x89, 0xe9, 0xee, 0xa6, 0x20, 0x49, 0x40, 0xfa, 0xb3, 0xde,
|
||||
0xcb, 0x3e, 0x20, 0xec, 0x19, 0x7c, 0xba, 0x3a, 0xf4, 0x3c, 0xe7, 0xe6, 0x24, 0xd2, 0xc3, 0xb1,
|
||||
0xdb, 0xca, 0x74, 0x40, 0x31, 0xcb, 0x36, 0x54, 0x88, 0x74, 0x32, 0xf6, 0x5c, 0x97, 0x0d, 0x14,
|
||||
0x9f, 0xb3, 0x33, 0x67, 0x1d, 0xbb, 0x3d, 0xc7, 0xdc, 0xe3, 0x4c, 0x97, 0x92, 0x13, 0x01, 0x99,
|
||||
0xc8, 0x9c, 0x18, 0xa4, 0xa0, 0xfc, 0x37, 0x68, 0xb4, 0x4e, 0x7b, 0x57, 0xc7, 0xe6, 0xc0, 0xd8,
|
||||
0xe6, 0x17, 0x5e, 0xd1, 0xbd, 0x49, 0xcb, 0x8f, 0x80, 0xa6, 0x46, 0x62, 0x13, 0x46, 0x88, 0xf9,
|
||||
0x7f, 0x15, 0x2a, 0xa2, 0x7c, 0x84, 0x64, 0x37, 0xb6, 0xe2, 0x85, 0xab, 0xf6, 0xf5, 0xc9, 0x40,
|
||||
0x3e, 0xe6, 0xfb, 0x5f, 0x57, 0xa0, 0xec, 0xbf, 0x00, 0xfa, 0x86, 0xeb, 0x1e, 0x6f, 0xa0, 0x10,
|
||||
0xf1, 0x03, 0x58, 0x8c, 0xbd, 0xc6, 0x97, 0xda, 0x38, 0xf9, 0x8b, 0xfd, 0x69, 0xc2, 0xf8, 0x9c,
|
||||
0xff, 0x81, 0x9c, 0xc8, 0x49, 0x6e, 0xa6, 0x15, 0x33, 0xe2, 0xe9, 0xc8, 0x14, 0xc4, 0xff, 0xbb,
|
||||
0x93, 0x80, 0x2d, 0x80, 0x50, 0xf8, 0x3f, 0xf9, 0x2e, 0x2c, 0x89, 0x68, 0xa7, 0xed, 0xd6, 0x50,
|
||||
0x1a, 0xe1, 0xbf, 0x97, 0xe5, 0x5e, 0x61, 0x7a, 0x8c, 0x96, 0x1e, 0xd7, 0x3f, 0x83, 0x5a, 0xf8,
|
||||
0x96, 0x3a, 0x92, 0xfe, 0x5d, 0x59, 0xf2, 0x1a, 0xfb, 0xb4, 0x55, 0x6c, 0x9e, 0x32, 0xf4, 0x9b,
|
||||
0x82, 0xce, 0x05, 0x94, 0x3c, 0xdf, 0x94, 0x86, 0xca, 0xa9, 0xa7, 0xaa, 0xd2, 0x50, 0x39, 0xfd,
|
||||
0xd0, 0x94, 0xd5, 0xb4, 0xe2, 0x87, 0x76, 0xd2, 0x9a, 0x56, 0xca, 0x31, 0xa8, 0xb4, 0xa6, 0x95,
|
||||
0x76, 0x0a, 0xa8, 0x9e, 0x59, 0xfd, 0xe8, 0x8b, 0x0f, 0xfb, 0xa6, 0x77, 0x30, 0xde, 0x23, 0xab,
|
||||
0xbf, 0xcb, 0x86, 0x7e, 0x60, 0xda, 0xfc, 0xd7, 0x5d, 0x5f, 0xdc, 0xef, 0x52, 0x6c, 0x77, 0x09,
|
||||
0xb6, 0xd1, 0xde, 0x5e, 0x89, 0xb6, 0x3e, 0xfa, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6d, 0xf9,
|
||||
0xa2, 0x18, 0x31, 0x53, 0x00, 0x00,
|
||||
}
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
|
|
|
@ -176,6 +176,7 @@ type commonConfig struct {
|
|||
DataCoordSegmentInfo ParamItem `refreshable:"true"`
|
||||
DataCoordSubName ParamItem `refreshable:"false"`
|
||||
DataCoordWatchSubPath ParamItem `refreshable:"false"`
|
||||
DataCoordTicklePath ParamItem `refreshable:"false"`
|
||||
DataNodeSubName ParamItem `refreshable:"false"`
|
||||
|
||||
DefaultPartitionName ParamItem `refreshable:"false"`
|
||||
|
@ -366,6 +367,14 @@ func (p *commonConfig) init(base *BaseTable) {
|
|||
}
|
||||
p.DataCoordWatchSubPath.Init(base.mgr)
|
||||
|
||||
p.DataCoordTicklePath = ParamItem{
|
||||
Key: "msgChannel.subNamePrefix.dataCoordWatchSubPath",
|
||||
Version: "2.2.3",
|
||||
DefaultValue: "tickle",
|
||||
PanicIfEmpty: true,
|
||||
}
|
||||
p.DataCoordTicklePath.Init(base.mgr)
|
||||
|
||||
p.DataNodeSubName = ParamItem{
|
||||
Key: "msgChannel.subNamePrefix.dataNodeSubNamePrefix",
|
||||
Version: "2.1.0",
|
||||
|
@ -1367,7 +1376,7 @@ func (p *queryNodeConfig) init(base *BaseTable) {
|
|||
type dataCoordConfig struct {
|
||||
|
||||
// --- CHANNEL ---
|
||||
MaxWatchDuration ParamItem `refreshable:"false"`
|
||||
WatchTimeoutInterval ParamItem `refreshable:"false"`
|
||||
|
||||
// --- SEGMENTS ---
|
||||
SegmentMaxSize ParamItem `refreshable:"false"`
|
||||
|
@ -1414,12 +1423,12 @@ type dataCoordConfig struct {
|
|||
|
||||
func (p *dataCoordConfig) init(base *BaseTable) {
|
||||
|
||||
p.MaxWatchDuration = ParamItem{
|
||||
Key: "dataCoord.channel.maxWatchDuration",
|
||||
Version: "2.2.1",
|
||||
DefaultValue: "600",
|
||||
p.WatchTimeoutInterval = ParamItem{
|
||||
Key: "dataCoord.channel.watchTimeoutInterval",
|
||||
Version: "2.2.3",
|
||||
DefaultValue: "30",
|
||||
}
|
||||
p.MaxWatchDuration.Init(base.mgr)
|
||||
p.WatchTimeoutInterval.Init(base.mgr)
|
||||
|
||||
p.SegmentMaxSize = ParamItem{
|
||||
Key: "dataCoord.segment.maxSize",
|
||||
|
@ -1664,6 +1673,9 @@ type dataNodeConfig struct {
|
|||
BinLogMaxSize ParamItem `refreshable:"true"`
|
||||
SyncPeriod ParamItem `refreshable:"true"`
|
||||
|
||||
// watchEvent
|
||||
WatchEventTicklerInterval ParamItem `refreshable:"false"`
|
||||
|
||||
// io concurrency to fetch stats logs
|
||||
IOConcurrency ParamItem `refreshable:"false"`
|
||||
}
|
||||
|
@ -1713,6 +1725,13 @@ func (p *dataNodeConfig) init(base *BaseTable) {
|
|||
}
|
||||
p.SyncPeriod.Init(base.mgr)
|
||||
|
||||
p.WatchEventTicklerInterval = ParamItem{
|
||||
Key: "datanode.segment.watchEventTicklerInterval",
|
||||
Version: "2.2.3",
|
||||
DefaultValue: "15",
|
||||
}
|
||||
p.WatchEventTicklerInterval.Init(base.mgr)
|
||||
|
||||
p.IOConcurrency = ParamItem{
|
||||
Key: "dataNode.dataSync.ioConcurrency",
|
||||
Version: "2.0.0",
|
||||
|
|
Loading…
Reference in New Issue