aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2020-02-14 17:49:07 -0800
committerChris Lu <chris.lu@gmail.com>2020-02-14 17:49:07 -0800
commitbe415f4e3c5ddb96577ae5e0fd86e612f6122078 (patch)
treecf17142159434cd3d4315f325853bdd60e7e4ac3
parent9232d3ac68a8d23a7f67ec66d8e227c362431507 (diff)
downloadseaweedfs-be415f4e3c5ddb96577ae5e0fd86e612f6122078.tar.xz
seaweedfs-be415f4e3c5ddb96577ae5e0fd86e612f6122078.zip
add tcp read
Performance not so good. Could need some optimization. Concurrency Level: 16 Time taken for tests: 33.575 seconds Complete requests: 1048576 Failed requests: 0 Total transferred: 1106753375 bytes Requests per second: 31230.86 [#/sec] Transfer rate: 32191.03 [Kbytes/sec] vs normal http Concurrency Level: 16 Time taken for tests: 24.829 seconds Complete requests: 1048576 Failed requests: 0 Total transferred: 1106761259 bytes Requests per second: 42231.10 [#/sec] Transfer rate: 43529.78 [Kbytes/sec]
-rw-r--r--weed/command/benchmark.go47
-rw-r--r--weed/command/server.go1
-rw-r--r--weed/command/volume.go32
-rw-r--r--weed/operation/grpc_client.go73
-rw-r--r--weed/pb/volume_server.proto4
-rw-r--r--weed/pb/volume_server_pb/volume_server.pb.go567
-rw-r--r--weed/server/volume_tcp_file.go150
-rw-r--r--weed/util/http_util.go56
8 files changed, 650 insertions, 280 deletions
diff --git a/weed/command/benchmark.go b/weed/command/benchmark.go
index 9adcb6f33..326e0090c 100644
--- a/weed/command/benchmark.go
+++ b/weed/command/benchmark.go
@@ -7,6 +7,7 @@ import (
"io"
"math"
"math/rand"
+ "net"
"os"
"runtime"
"runtime/pprof"
@@ -41,7 +42,8 @@ type BenchmarkOptions struct {
maxCpu *int
grpcDialOption grpc.DialOption
masterClient *wdclient.MasterClient
- grpcRead *bool
+ readByGrpc *bool
+ readByTcp *bool
}
var (
@@ -66,7 +68,8 @@ func init() {
b.replication = cmdBenchmark.Flag.String("replication", "000", "replication type")
b.cpuprofile = cmdBenchmark.Flag.String("cpuprofile", "", "cpu profile output file")
b.maxCpu = cmdBenchmark.Flag.Int("maxCpu", 0, "maximum number of CPUs. 0 means all available CPUs")
- b.grpcRead = cmdBenchmark.Flag.Bool("grpcRead", false, "use grpc API to read")
+ b.readByGrpc = cmdBenchmark.Flag.Bool("read.grpc", false, "use grpc API to read")
+ b.readByTcp = cmdBenchmark.Flag.Bool("read.tcp", false, "use tcp API to read")
sharedBytes = make([]byte, 1024)
}
@@ -283,7 +286,7 @@ func readFiles(fileIdLineChan chan string, s *stat) {
start := time.Now()
var bytesRead int
var err error
- if *b.grpcRead {
+ if *b.readByGrpc {
volumeServer, err := b.masterClient.LookupVolumeServer(fid)
if err != nil {
s.failed++
@@ -291,6 +294,15 @@ func readFiles(fileIdLineChan chan string, s *stat) {
continue
}
bytesRead, err = grpcFileGet(volumeServer, fid, b.grpcDialOption)
+ } else if *b.readByTcp {
+ volumeServer, err := b.masterClient.LookupVolumeServer(fid)
+ if err != nil {
+ s.failed++
+ println("!!!! ", fid, " location not found!!!!!")
+ continue
+ }
+ bytesRead, err = tcpFileGet(volumeServer, fid)
+
} else {
url, err := b.masterClient.LookupFileId(fid)
if err != nil {
@@ -336,6 +348,35 @@ func grpcFileGet(volumeServer, fid string, grpcDialOption grpc.DialOption) (byte
return
}
+func tcpFileGet(volumeServer, fid string) (bytesRead int, err error) {
+
+ err = operation.WithVolumeServerTcpConnection(volumeServer, func(conn net.Conn) error {
+ // println("requesting", fid, "...")
+ if err := util.WriteMessage(conn, &volume_server_pb.TcpRequestHeader{
+ Get: &volume_server_pb.FileGetRequest{FileId: fid},
+ }); err != nil {
+ return err
+ }
+
+ for {
+ resp := &volume_server_pb.FileGetResponse{}
+ // println("reading...")
+ respErr := util.ReadMessage(conn, resp)
+ if respErr != nil {
+ if respErr == io.EOF {
+ return nil
+ }
+ // println("err:", respErr.Error())
+ return respErr
+ }
+ // println("resp size", len(resp.Data))
+ bytesRead += len(resp.Data)
+ }
+ })
+
+ return
+}
+
func writeFileIds(fileName string, fileIdLineChan chan string, finishChan chan bool) {
file, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
diff --git a/weed/command/server.go b/weed/command/server.go
index 6aa68b6d2..3a3dd5426 100644
--- a/weed/command/server.go
+++ b/weed/command/server.go
@@ -91,6 +91,7 @@ func init() {
serverOptions.v.compactionMBPerSecond = cmdServer.Flag.Int("volume.compactionMBps", 0, "limit compaction speed in mega bytes per second")
serverOptions.v.fileSizeLimitMB = cmdServer.Flag.Int("volume.fileSizeLimitMB", 256, "limit file size to avoid out of memory")
serverOptions.v.publicUrl = cmdServer.Flag.String("volume.publicUrl", "", "publicly accessible address")
+ serverOptions.v.enableTcp = cmdServer.Flag.Bool("volume.enableTcp", false, "[experimental] toggle tcp port, running on 20000 + port")
s3Options.filerBucketsPath = cmdServer.Flag.String("s3.filer.dir.buckets", "/buckets", "folder on filer to store all buckets")
s3Options.port = cmdServer.Flag.Int("s3.port", 8333, "s3 server http listen port")
diff --git a/weed/command/volume.go b/weed/command/volume.go
index 9d665d143..8caa8d92f 100644
--- a/weed/command/volume.go
+++ b/weed/command/volume.go
@@ -50,6 +50,7 @@ type VolumeServerOptions struct {
memProfile *string
compactionMBPerSecond *int
fileSizeLimitMB *int
+ enableTcp *bool // temporary toggle
}
func init() {
@@ -71,6 +72,7 @@ func init() {
v.memProfile = cmdVolume.Flag.String("memprofile", "", "memory profile output file")
v.compactionMBPerSecond = cmdVolume.Flag.Int("compactionMBps", 0, "limit background compaction or copying speed in mega bytes per second")
v.fileSizeLimitMB = cmdVolume.Flag.Int("fileSizeLimitMB", 256, "limit file size to avoid out of memory")
+ v.enableTcp = cmdVolume.Flag.Bool("enableTcp", false, "[experimental] toggle tcp port, running on 20000 + port")
}
var cmdVolume = &Command{
@@ -168,6 +170,10 @@ func (v VolumeServerOptions) startVolumeServer(volumeFolders, maxVolumeCounts, v
// starting grpc server
grpcS := v.startGrpcService(volumeServer)
+ if v.enableTcp != nil && *v.enableTcp {
+ go v.startTcpServer(volumeServer)
+ }
+
// starting public http server
var publicHttpDown httpdown.Server
if v.isSeparatedPublicPort() {
@@ -245,6 +251,32 @@ func (v VolumeServerOptions) startGrpcService(vs volume_server_pb.VolumeServerSe
return grpcS
}
+func (v VolumeServerOptions) startTcpServer(vs *weed_server.VolumeServer) {
+ tcpPort := *v.port + 20000
+ tcpL, err := util.NewListener(*v.bindIp+":"+strconv.Itoa(tcpPort), 0)
+ if err != nil {
+ glog.Fatalf("failed to listen on tcp port %d: %v", tcpPort, err)
+ }
+ defer tcpL.Close()
+
+ for {
+ c, err := tcpL.Accept()
+ if err!= nil {
+ glog.V(0).Infof("accept tcp connection: %v", err)
+ continue
+ }
+ go func() {
+ for {
+ if err := vs.HandleTcpConnection(c); err != nil {
+ glog.V(0).Infof("handle tcp remote %s: %v", c.RemoteAddr(), err)
+ return
+ }
+ }
+
+ }()
+ }
+}
+
func (v VolumeServerOptions) startPublicHttpService(handler http.Handler) httpdown.Server {
publicListeningAddress := *v.bindIp + ":" + strconv.Itoa(*v.publicPort)
glog.V(0).Infoln("Start Seaweed volume server", util.VERSION, "public at", publicListeningAddress)
diff --git a/weed/operation/grpc_client.go b/weed/operation/grpc_client.go
index e7ee2d2ba..c7a8d2ffd 100644
--- a/weed/operation/grpc_client.go
+++ b/weed/operation/grpc_client.go
@@ -3,13 +3,22 @@ package operation
import (
"context"
"fmt"
+ "net"
+ "strconv"
+ "strings"
+ "sync"
+
+ "google.golang.org/grpc"
+
"github.com/chrislusf/seaweedfs/weed/glog"
"github.com/chrislusf/seaweedfs/weed/pb/master_pb"
"github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb"
"github.com/chrislusf/seaweedfs/weed/util"
- "google.golang.org/grpc"
- "strconv"
- "strings"
+)
+
+var (
+ connectionPool = make(map[string]*sync.Pool)
+ connectionPoolLock sync.Mutex
)
func WithVolumeServerClient(volumeServer string, grpcDialOption grpc.DialOption, fn func(context.Context, volume_server_pb.VolumeServerClient) error) error {
@@ -38,6 +47,64 @@ func toVolumeServerGrpcAddress(volumeServer string) (grpcAddress string, err err
return fmt.Sprintf("%s:%d", volumeServer[0:sepIndex], port+10000), nil
}
+func WithVolumeServerTcpConnection(volumeServer string, fn func(conn net.Conn) error) error {
+ tcpAddress, err := toVolumeServerTcpAddress(volumeServer)
+ if err != nil {
+ return err
+ }
+
+ conn := getConnection(tcpAddress)
+ defer releaseConnection(conn, tcpAddress)
+
+ err = fn(conn)
+ return err
+}
+
+func getConnection(tcpAddress string) net.Conn {
+ connectionPoolLock.Lock()
+ defer connectionPoolLock.Unlock()
+
+ pool, found := connectionPool[tcpAddress]
+ if !found {
+ pool = &sync.Pool{New: func() interface{} {
+ conn, err := net.Dial("tcp", tcpAddress)
+ if err != nil {
+ glog.Errorf("failed to connect to %s: %v", tcpAddress, err)
+ return conn
+ }
+ // println("connected", tcpAddress, "=>", conn.LocalAddr().String())
+ return conn
+ }}
+ connectionPool[tcpAddress] = pool
+ }
+ conn := pool.Get().(net.Conn)
+ // println("get connection", tcpAddress, "=>", conn.LocalAddr().String())
+ return conn
+}
+
+func releaseConnection(conn net.Conn, tcpAddress string) {
+ connectionPoolLock.Lock()
+ defer connectionPoolLock.Unlock()
+
+ pool, found := connectionPool[tcpAddress]
+ if !found {
+ // println("can not return connection", tcpAddress, "=>", conn.LocalAddr().String())
+ return
+ }
+ pool.Put(conn)
+ // println("returned connection", tcpAddress, "=>", conn.LocalAddr().String())
+}
+
+func toVolumeServerTcpAddress(volumeServer string) (grpcAddress string, err error) {
+ sepIndex := strings.LastIndex(volumeServer, ":")
+ port, err := strconv.Atoi(volumeServer[sepIndex+1:])
+ if err != nil {
+ glog.Errorf("failed to parse volume server address: %v", volumeServer)
+ return "", err
+ }
+ return fmt.Sprintf("%s:%d", volumeServer[0:sepIndex], port+20000), nil
+}
+
func WithMasterServerClient(masterServer string, grpcDialOption grpc.DialOption, fn func(ctx2 context.Context, masterClient master_pb.SeaweedClient) error) error {
ctx := context.Background()
diff --git a/weed/pb/volume_server.proto b/weed/pb/volume_server.proto
index 284e00633..bf201fd98 100644
--- a/weed/pb/volume_server.proto
+++ b/weed/pb/volume_server.proto
@@ -104,6 +104,10 @@ message DeleteResult {
uint32 version = 5;
}
+message TcpRequestHeader {
+ FileGetRequest get = 1;
+}
+
message FileGetRequest {
string file_id = 1;
bool accept_gzip = 2;
diff --git a/weed/pb/volume_server_pb/volume_server.pb.go b/weed/pb/volume_server_pb/volume_server.pb.go
index ec196a1d9..eb4382ce9 100644
--- a/weed/pb/volume_server_pb/volume_server.pb.go
+++ b/weed/pb/volume_server_pb/volume_server.pb.go
@@ -12,6 +12,7 @@ It has these top-level messages:
BatchDeleteRequest
BatchDeleteResponse
DeleteResult
+ TcpRequestHeader
FileGetRequest
FileGetResponse
Empty
@@ -182,6 +183,22 @@ func (m *DeleteResult) GetVersion() uint32 {
return 0
}
+type TcpRequestHeader struct {
+ Get *FileGetRequest `protobuf:"bytes,1,opt,name=get" json:"get,omitempty"`
+}
+
+func (m *TcpRequestHeader) Reset() { *m = TcpRequestHeader{} }
+func (m *TcpRequestHeader) String() string { return proto.CompactTextString(m) }
+func (*TcpRequestHeader) ProtoMessage() {}
+func (*TcpRequestHeader) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
+
+func (m *TcpRequestHeader) GetGet() *FileGetRequest {
+ if m != nil {
+ return m.Get
+ }
+ return nil
+}
+
type FileGetRequest struct {
FileId string `protobuf:"bytes,1,opt,name=file_id,json=fileId" json:"file_id,omitempty"`
AcceptGzip bool `protobuf:"varint,2,opt,name=accept_gzip,json=acceptGzip" json:"accept_gzip,omitempty"`
@@ -190,7 +207,7 @@ type FileGetRequest struct {
func (m *FileGetRequest) Reset() { *m = FileGetRequest{} }
func (m *FileGetRequest) String() string { return proto.CompactTextString(m) }
func (*FileGetRequest) ProtoMessage() {}
-func (*FileGetRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
+func (*FileGetRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
func (m *FileGetRequest) GetFileId() string {
if m != nil {
@@ -221,7 +238,7 @@ type FileGetResponse struct {
func (m *FileGetResponse) Reset() { *m = FileGetResponse{} }
func (m *FileGetResponse) String() string { return proto.CompactTextString(m) }
func (*FileGetResponse) ProtoMessage() {}
-func (*FileGetResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
+func (*FileGetResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
func (m *FileGetResponse) GetData() []byte {
if m != nil {
@@ -292,7 +309,7 @@ type Empty struct {
func (m *Empty) Reset() { *m = Empty{} }
func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage() {}
-func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
+func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
type VacuumVolumeCheckRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -301,7 +318,7 @@ type VacuumVolumeCheckRequest struct {
func (m *VacuumVolumeCheckRequest) Reset() { *m = VacuumVolumeCheckRequest{} }
func (m *VacuumVolumeCheckRequest) String() string { return proto.CompactTextString(m) }
func (*VacuumVolumeCheckRequest) ProtoMessage() {}
-func (*VacuumVolumeCheckRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
+func (*VacuumVolumeCheckRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
func (m *VacuumVolumeCheckRequest) GetVolumeId() uint32 {
if m != nil {
@@ -317,7 +334,7 @@ type VacuumVolumeCheckResponse struct {
func (m *VacuumVolumeCheckResponse) Reset() { *m = VacuumVolumeCheckResponse{} }
func (m *VacuumVolumeCheckResponse) String() string { return proto.CompactTextString(m) }
func (*VacuumVolumeCheckResponse) ProtoMessage() {}
-func (*VacuumVolumeCheckResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
+func (*VacuumVolumeCheckResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
func (m *VacuumVolumeCheckResponse) GetGarbageRatio() float64 {
if m != nil {
@@ -334,7 +351,7 @@ type VacuumVolumeCompactRequest struct {
func (m *VacuumVolumeCompactRequest) Reset() { *m = VacuumVolumeCompactRequest{} }
func (m *VacuumVolumeCompactRequest) String() string { return proto.CompactTextString(m) }
func (*VacuumVolumeCompactRequest) ProtoMessage() {}
-func (*VacuumVolumeCompactRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
+func (*VacuumVolumeCompactRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (m *VacuumVolumeCompactRequest) GetVolumeId() uint32 {
if m != nil {
@@ -356,7 +373,7 @@ type VacuumVolumeCompactResponse struct {
func (m *VacuumVolumeCompactResponse) Reset() { *m = VacuumVolumeCompactResponse{} }
func (m *VacuumVolumeCompactResponse) String() string { return proto.CompactTextString(m) }
func (*VacuumVolumeCompactResponse) ProtoMessage() {}
-func (*VacuumVolumeCompactResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
+func (*VacuumVolumeCompactResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
type VacuumVolumeCommitRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -365,7 +382,7 @@ type VacuumVolumeCommitRequest struct {
func (m *VacuumVolumeCommitRequest) Reset() { *m = VacuumVolumeCommitRequest{} }
func (m *VacuumVolumeCommitRequest) String() string { return proto.CompactTextString(m) }
func (*VacuumVolumeCommitRequest) ProtoMessage() {}
-func (*VacuumVolumeCommitRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
+func (*VacuumVolumeCommitRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
func (m *VacuumVolumeCommitRequest) GetVolumeId() uint32 {
if m != nil {
@@ -380,7 +397,7 @@ type VacuumVolumeCommitResponse struct {
func (m *VacuumVolumeCommitResponse) Reset() { *m = VacuumVolumeCommitResponse{} }
func (m *VacuumVolumeCommitResponse) String() string { return proto.CompactTextString(m) }
func (*VacuumVolumeCommitResponse) ProtoMessage() {}
-func (*VacuumVolumeCommitResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
+func (*VacuumVolumeCommitResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
type VacuumVolumeCleanupRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -389,7 +406,7 @@ type VacuumVolumeCleanupRequest struct {
func (m *VacuumVolumeCleanupRequest) Reset() { *m = VacuumVolumeCleanupRequest{} }
func (m *VacuumVolumeCleanupRequest) String() string { return proto.CompactTextString(m) }
func (*VacuumVolumeCleanupRequest) ProtoMessage() {}
-func (*VacuumVolumeCleanupRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
+func (*VacuumVolumeCleanupRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
func (m *VacuumVolumeCleanupRequest) GetVolumeId() uint32 {
if m != nil {
@@ -404,7 +421,7 @@ type VacuumVolumeCleanupResponse struct {
func (m *VacuumVolumeCleanupResponse) Reset() { *m = VacuumVolumeCleanupResponse{} }
func (m *VacuumVolumeCleanupResponse) String() string { return proto.CompactTextString(m) }
func (*VacuumVolumeCleanupResponse) ProtoMessage() {}
-func (*VacuumVolumeCleanupResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
+func (*VacuumVolumeCleanupResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
type DeleteCollectionRequest struct {
Collection string `protobuf:"bytes,1,opt,name=collection" json:"collection,omitempty"`
@@ -413,7 +430,7 @@ type DeleteCollectionRequest struct {
func (m *DeleteCollectionRequest) Reset() { *m = DeleteCollectionRequest{} }
func (m *DeleteCollectionRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteCollectionRequest) ProtoMessage() {}
-func (*DeleteCollectionRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
+func (*DeleteCollectionRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (m *DeleteCollectionRequest) GetCollection() string {
if m != nil {
@@ -428,7 +445,7 @@ type DeleteCollectionResponse struct {
func (m *DeleteCollectionResponse) Reset() { *m = DeleteCollectionResponse{} }
func (m *DeleteCollectionResponse) String() string { return proto.CompactTextString(m) }
func (*DeleteCollectionResponse) ProtoMessage() {}
-func (*DeleteCollectionResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
+func (*DeleteCollectionResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
type AllocateVolumeRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -442,7 +459,7 @@ type AllocateVolumeRequest struct {
func (m *AllocateVolumeRequest) Reset() { *m = AllocateVolumeRequest{} }
func (m *AllocateVolumeRequest) String() string { return proto.CompactTextString(m) }
func (*AllocateVolumeRequest) ProtoMessage() {}
-func (*AllocateVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
+func (*AllocateVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (m *AllocateVolumeRequest) GetVolumeId() uint32 {
if m != nil {
@@ -492,7 +509,7 @@ type AllocateVolumeResponse struct {
func (m *AllocateVolumeResponse) Reset() { *m = AllocateVolumeResponse{} }
func (m *AllocateVolumeResponse) String() string { return proto.CompactTextString(m) }
func (*AllocateVolumeResponse) ProtoMessage() {}
-func (*AllocateVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
+func (*AllocateVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
type VolumeSyncStatusRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -501,7 +518,7 @@ type VolumeSyncStatusRequest struct {
func (m *VolumeSyncStatusRequest) Reset() { *m = VolumeSyncStatusRequest{} }
func (m *VolumeSyncStatusRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeSyncStatusRequest) ProtoMessage() {}
-func (*VolumeSyncStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
+func (*VolumeSyncStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (m *VolumeSyncStatusRequest) GetVolumeId() uint32 {
if m != nil {
@@ -523,7 +540,7 @@ type VolumeSyncStatusResponse struct {
func (m *VolumeSyncStatusResponse) Reset() { *m = VolumeSyncStatusResponse{} }
func (m *VolumeSyncStatusResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeSyncStatusResponse) ProtoMessage() {}
-func (*VolumeSyncStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
+func (*VolumeSyncStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
func (m *VolumeSyncStatusResponse) GetVolumeId() uint32 {
if m != nil {
@@ -582,7 +599,7 @@ type VolumeIncrementalCopyRequest struct {
func (m *VolumeIncrementalCopyRequest) Reset() { *m = VolumeIncrementalCopyRequest{} }
func (m *VolumeIncrementalCopyRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeIncrementalCopyRequest) ProtoMessage() {}
-func (*VolumeIncrementalCopyRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
+func (*VolumeIncrementalCopyRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
func (m *VolumeIncrementalCopyRequest) GetVolumeId() uint32 {
if m != nil {
@@ -605,7 +622,7 @@ type VolumeIncrementalCopyResponse struct {
func (m *VolumeIncrementalCopyResponse) Reset() { *m = VolumeIncrementalCopyResponse{} }
func (m *VolumeIncrementalCopyResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeIncrementalCopyResponse) ProtoMessage() {}
-func (*VolumeIncrementalCopyResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
+func (*VolumeIncrementalCopyResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
func (m *VolumeIncrementalCopyResponse) GetFileContent() []byte {
if m != nil {
@@ -621,7 +638,7 @@ type VolumeMountRequest struct {
func (m *VolumeMountRequest) Reset() { *m = VolumeMountRequest{} }
func (m *VolumeMountRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeMountRequest) ProtoMessage() {}
-func (*VolumeMountRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
+func (*VolumeMountRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
func (m *VolumeMountRequest) GetVolumeId() uint32 {
if m != nil {
@@ -636,7 +653,7 @@ type VolumeMountResponse struct {
func (m *VolumeMountResponse) Reset() { *m = VolumeMountResponse{} }
func (m *VolumeMountResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeMountResponse) ProtoMessage() {}
-func (*VolumeMountResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
+func (*VolumeMountResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
type VolumeUnmountRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -645,7 +662,7 @@ type VolumeUnmountRequest struct {
func (m *VolumeUnmountRequest) Reset() { *m = VolumeUnmountRequest{} }
func (m *VolumeUnmountRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeUnmountRequest) ProtoMessage() {}
-func (*VolumeUnmountRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
+func (*VolumeUnmountRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
func (m *VolumeUnmountRequest) GetVolumeId() uint32 {
if m != nil {
@@ -660,7 +677,7 @@ type VolumeUnmountResponse struct {
func (m *VolumeUnmountResponse) Reset() { *m = VolumeUnmountResponse{} }
func (m *VolumeUnmountResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeUnmountResponse) ProtoMessage() {}
-func (*VolumeUnmountResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
+func (*VolumeUnmountResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
type VolumeDeleteRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -669,7 +686,7 @@ type VolumeDeleteRequest struct {
func (m *VolumeDeleteRequest) Reset() { *m = VolumeDeleteRequest{} }
func (m *VolumeDeleteRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeDeleteRequest) ProtoMessage() {}
-func (*VolumeDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
+func (*VolumeDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
func (m *VolumeDeleteRequest) GetVolumeId() uint32 {
if m != nil {
@@ -684,7 +701,7 @@ type VolumeDeleteResponse struct {
func (m *VolumeDeleteResponse) Reset() { *m = VolumeDeleteResponse{} }
func (m *VolumeDeleteResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeDeleteResponse) ProtoMessage() {}
-func (*VolumeDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
+func (*VolumeDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
type VolumeMarkReadonlyRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -693,7 +710,7 @@ type VolumeMarkReadonlyRequest struct {
func (m *VolumeMarkReadonlyRequest) Reset() { *m = VolumeMarkReadonlyRequest{} }
func (m *VolumeMarkReadonlyRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeMarkReadonlyRequest) ProtoMessage() {}
-func (*VolumeMarkReadonlyRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
+func (*VolumeMarkReadonlyRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
func (m *VolumeMarkReadonlyRequest) GetVolumeId() uint32 {
if m != nil {
@@ -708,7 +725,7 @@ type VolumeMarkReadonlyResponse struct {
func (m *VolumeMarkReadonlyResponse) Reset() { *m = VolumeMarkReadonlyResponse{} }
func (m *VolumeMarkReadonlyResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeMarkReadonlyResponse) ProtoMessage() {}
-func (*VolumeMarkReadonlyResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
+func (*VolumeMarkReadonlyResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
type VolumeConfigureRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -718,7 +735,7 @@ type VolumeConfigureRequest struct {
func (m *VolumeConfigureRequest) Reset() { *m = VolumeConfigureRequest{} }
func (m *VolumeConfigureRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeConfigureRequest) ProtoMessage() {}
-func (*VolumeConfigureRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
+func (*VolumeConfigureRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
func (m *VolumeConfigureRequest) GetVolumeId() uint32 {
if m != nil {
@@ -741,7 +758,7 @@ type VolumeConfigureResponse struct {
func (m *VolumeConfigureResponse) Reset() { *m = VolumeConfigureResponse{} }
func (m *VolumeConfigureResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeConfigureResponse) ProtoMessage() {}
-func (*VolumeConfigureResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
+func (*VolumeConfigureResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
func (m *VolumeConfigureResponse) GetError() string {
if m != nil {
@@ -761,7 +778,7 @@ type VolumeCopyRequest struct {
func (m *VolumeCopyRequest) Reset() { *m = VolumeCopyRequest{} }
func (m *VolumeCopyRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeCopyRequest) ProtoMessage() {}
-func (*VolumeCopyRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
+func (*VolumeCopyRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }
func (m *VolumeCopyRequest) GetVolumeId() uint32 {
if m != nil {
@@ -805,7 +822,7 @@ type VolumeCopyResponse struct {
func (m *VolumeCopyResponse) Reset() { *m = VolumeCopyResponse{} }
func (m *VolumeCopyResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeCopyResponse) ProtoMessage() {}
-func (*VolumeCopyResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }
+func (*VolumeCopyResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }
func (m *VolumeCopyResponse) GetLastAppendAtNs() uint64 {
if m != nil {
@@ -827,7 +844,7 @@ type CopyFileRequest struct {
func (m *CopyFileRequest) Reset() { *m = CopyFileRequest{} }
func (m *CopyFileRequest) String() string { return proto.CompactTextString(m) }
func (*CopyFileRequest) ProtoMessage() {}
-func (*CopyFileRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }
+func (*CopyFileRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
func (m *CopyFileRequest) GetVolumeId() uint32 {
if m != nil {
@@ -885,7 +902,7 @@ type CopyFileResponse struct {
func (m *CopyFileResponse) Reset() { *m = CopyFileResponse{} }
func (m *CopyFileResponse) String() string { return proto.CompactTextString(m) }
func (*CopyFileResponse) ProtoMessage() {}
-func (*CopyFileResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
+func (*CopyFileResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
func (m *CopyFileResponse) GetFileContent() []byte {
if m != nil {
@@ -903,7 +920,7 @@ type VolumeTailSenderRequest struct {
func (m *VolumeTailSenderRequest) Reset() { *m = VolumeTailSenderRequest{} }
func (m *VolumeTailSenderRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeTailSenderRequest) ProtoMessage() {}
-func (*VolumeTailSenderRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
+func (*VolumeTailSenderRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
func (m *VolumeTailSenderRequest) GetVolumeId() uint32 {
if m != nil {
@@ -935,7 +952,7 @@ type VolumeTailSenderResponse struct {
func (m *VolumeTailSenderResponse) Reset() { *m = VolumeTailSenderResponse{} }
func (m *VolumeTailSenderResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeTailSenderResponse) ProtoMessage() {}
-func (*VolumeTailSenderResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
+func (*VolumeTailSenderResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
func (m *VolumeTailSenderResponse) GetNeedleHeader() []byte {
if m != nil {
@@ -968,7 +985,7 @@ type VolumeTailReceiverRequest struct {
func (m *VolumeTailReceiverRequest) Reset() { *m = VolumeTailReceiverRequest{} }
func (m *VolumeTailReceiverRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeTailReceiverRequest) ProtoMessage() {}
-func (*VolumeTailReceiverRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
+func (*VolumeTailReceiverRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
func (m *VolumeTailReceiverRequest) GetVolumeId() uint32 {
if m != nil {
@@ -1004,7 +1021,7 @@ type VolumeTailReceiverResponse struct {
func (m *VolumeTailReceiverResponse) Reset() { *m = VolumeTailReceiverResponse{} }
func (m *VolumeTailReceiverResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeTailReceiverResponse) ProtoMessage() {}
-func (*VolumeTailReceiverResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
+func (*VolumeTailReceiverResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
type VolumeEcShardsGenerateRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -1014,7 +1031,7 @@ type VolumeEcShardsGenerateRequest struct {
func (m *VolumeEcShardsGenerateRequest) Reset() { *m = VolumeEcShardsGenerateRequest{} }
func (m *VolumeEcShardsGenerateRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardsGenerateRequest) ProtoMessage() {}
-func (*VolumeEcShardsGenerateRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
+func (*VolumeEcShardsGenerateRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }
func (m *VolumeEcShardsGenerateRequest) GetVolumeId() uint32 {
if m != nil {
@@ -1036,7 +1053,7 @@ type VolumeEcShardsGenerateResponse struct {
func (m *VolumeEcShardsGenerateResponse) Reset() { *m = VolumeEcShardsGenerateResponse{} }
func (m *VolumeEcShardsGenerateResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardsGenerateResponse) ProtoMessage() {}
-func (*VolumeEcShardsGenerateResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }
+func (*VolumeEcShardsGenerateResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }
type VolumeEcShardsRebuildRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -1046,7 +1063,7 @@ type VolumeEcShardsRebuildRequest struct {
func (m *VolumeEcShardsRebuildRequest) Reset() { *m = VolumeEcShardsRebuildRequest{} }
func (m *VolumeEcShardsRebuildRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardsRebuildRequest) ProtoMessage() {}
-func (*VolumeEcShardsRebuildRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }
+func (*VolumeEcShardsRebuildRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} }
func (m *VolumeEcShardsRebuildRequest) GetVolumeId() uint32 {
if m != nil {
@@ -1069,7 +1086,7 @@ type VolumeEcShardsRebuildResponse struct {
func (m *VolumeEcShardsRebuildResponse) Reset() { *m = VolumeEcShardsRebuildResponse{} }
func (m *VolumeEcShardsRebuildResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardsRebuildResponse) ProtoMessage() {}
-func (*VolumeEcShardsRebuildResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} }
+func (*VolumeEcShardsRebuildResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} }
func (m *VolumeEcShardsRebuildResponse) GetRebuiltShardIds() []uint32 {
if m != nil {
@@ -1091,7 +1108,7 @@ type VolumeEcShardsCopyRequest struct {
func (m *VolumeEcShardsCopyRequest) Reset() { *m = VolumeEcShardsCopyRequest{} }
func (m *VolumeEcShardsCopyRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardsCopyRequest) ProtoMessage() {}
-func (*VolumeEcShardsCopyRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} }
+func (*VolumeEcShardsCopyRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} }
func (m *VolumeEcShardsCopyRequest) GetVolumeId() uint32 {
if m != nil {
@@ -1148,7 +1165,7 @@ type VolumeEcShardsCopyResponse struct {
func (m *VolumeEcShardsCopyResponse) Reset() { *m = VolumeEcShardsCopyResponse{} }
func (m *VolumeEcShardsCopyResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardsCopyResponse) ProtoMessage() {}
-func (*VolumeEcShardsCopyResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} }
+func (*VolumeEcShardsCopyResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} }
type VolumeEcShardsDeleteRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -1159,7 +1176,7 @@ type VolumeEcShardsDeleteRequest struct {
func (m *VolumeEcShardsDeleteRequest) Reset() { *m = VolumeEcShardsDeleteRequest{} }
func (m *VolumeEcShardsDeleteRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardsDeleteRequest) ProtoMessage() {}
-func (*VolumeEcShardsDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} }
+func (*VolumeEcShardsDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} }
func (m *VolumeEcShardsDeleteRequest) GetVolumeId() uint32 {
if m != nil {
@@ -1188,7 +1205,7 @@ type VolumeEcShardsDeleteResponse struct {
func (m *VolumeEcShardsDeleteResponse) Reset() { *m = VolumeEcShardsDeleteResponse{} }
func (m *VolumeEcShardsDeleteResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardsDeleteResponse) ProtoMessage() {}
-func (*VolumeEcShardsDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} }
+func (*VolumeEcShardsDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} }
type VolumeEcShardsMountRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -1199,7 +1216,7 @@ type VolumeEcShardsMountRequest struct {
func (m *VolumeEcShardsMountRequest) Reset() { *m = VolumeEcShardsMountRequest{} }
func (m *VolumeEcShardsMountRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardsMountRequest) ProtoMessage() {}
-func (*VolumeEcShardsMountRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} }
+func (*VolumeEcShardsMountRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} }
func (m *VolumeEcShardsMountRequest) GetVolumeId() uint32 {
if m != nil {
@@ -1228,7 +1245,7 @@ type VolumeEcShardsMountResponse struct {
func (m *VolumeEcShardsMountResponse) Reset() { *m = VolumeEcShardsMountResponse{} }
func (m *VolumeEcShardsMountResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardsMountResponse) ProtoMessage() {}
-func (*VolumeEcShardsMountResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} }
+func (*VolumeEcShardsMountResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} }
type VolumeEcShardsUnmountRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -1238,7 +1255,7 @@ type VolumeEcShardsUnmountRequest struct {
func (m *VolumeEcShardsUnmountRequest) Reset() { *m = VolumeEcShardsUnmountRequest{} }
func (m *VolumeEcShardsUnmountRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardsUnmountRequest) ProtoMessage() {}
-func (*VolumeEcShardsUnmountRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} }
+func (*VolumeEcShardsUnmountRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} }
func (m *VolumeEcShardsUnmountRequest) GetVolumeId() uint32 {
if m != nil {
@@ -1260,7 +1277,7 @@ type VolumeEcShardsUnmountResponse struct {
func (m *VolumeEcShardsUnmountResponse) Reset() { *m = VolumeEcShardsUnmountResponse{} }
func (m *VolumeEcShardsUnmountResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardsUnmountResponse) ProtoMessage() {}
-func (*VolumeEcShardsUnmountResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} }
+func (*VolumeEcShardsUnmountResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} }
type VolumeEcShardReadRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -1273,7 +1290,7 @@ type VolumeEcShardReadRequest struct {
func (m *VolumeEcShardReadRequest) Reset() { *m = VolumeEcShardReadRequest{} }
func (m *VolumeEcShardReadRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardReadRequest) ProtoMessage() {}
-func (*VolumeEcShardReadRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} }
+func (*VolumeEcShardReadRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} }
func (m *VolumeEcShardReadRequest) GetVolumeId() uint32 {
if m != nil {
@@ -1318,7 +1335,7 @@ type VolumeEcShardReadResponse struct {
func (m *VolumeEcShardReadResponse) Reset() { *m = VolumeEcShardReadResponse{} }
func (m *VolumeEcShardReadResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardReadResponse) ProtoMessage() {}
-func (*VolumeEcShardReadResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} }
+func (*VolumeEcShardReadResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} }
func (m *VolumeEcShardReadResponse) GetData() []byte {
if m != nil {
@@ -1344,7 +1361,7 @@ type VolumeEcBlobDeleteRequest struct {
func (m *VolumeEcBlobDeleteRequest) Reset() { *m = VolumeEcBlobDeleteRequest{} }
func (m *VolumeEcBlobDeleteRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeEcBlobDeleteRequest) ProtoMessage() {}
-func (*VolumeEcBlobDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} }
+func (*VolumeEcBlobDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} }
func (m *VolumeEcBlobDeleteRequest) GetVolumeId() uint32 {
if m != nil {
@@ -1380,7 +1397,7 @@ type VolumeEcBlobDeleteResponse struct {
func (m *VolumeEcBlobDeleteResponse) Reset() { *m = VolumeEcBlobDeleteResponse{} }
func (m *VolumeEcBlobDeleteResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeEcBlobDeleteResponse) ProtoMessage() {}
-func (*VolumeEcBlobDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} }
+func (*VolumeEcBlobDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} }
type VolumeEcShardsToVolumeRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -1390,7 +1407,7 @@ type VolumeEcShardsToVolumeRequest struct {
func (m *VolumeEcShardsToVolumeRequest) Reset() { *m = VolumeEcShardsToVolumeRequest{} }
func (m *VolumeEcShardsToVolumeRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardsToVolumeRequest) ProtoMessage() {}
-func (*VolumeEcShardsToVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} }
+func (*VolumeEcShardsToVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} }
func (m *VolumeEcShardsToVolumeRequest) GetVolumeId() uint32 {
if m != nil {
@@ -1412,7 +1429,7 @@ type VolumeEcShardsToVolumeResponse struct {
func (m *VolumeEcShardsToVolumeResponse) Reset() { *m = VolumeEcShardsToVolumeResponse{} }
func (m *VolumeEcShardsToVolumeResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeEcShardsToVolumeResponse) ProtoMessage() {}
-func (*VolumeEcShardsToVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} }
+func (*VolumeEcShardsToVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} }
type ReadVolumeFileStatusRequest struct {
VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"`
@@ -1421,7 +1438,7 @@ type ReadVolumeFileStatusRequest struct {
func (m *ReadVolumeFileStatusRequest) Reset() { *m = ReadVolumeFileStatusRequest{} }
func (m *ReadVolumeFileStatusRequest) String() string { return proto.CompactTextString(m) }
func (*ReadVolumeFileStatusRequest) ProtoMessage() {}
-func (*ReadVolumeFileStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} }
+func (*ReadVolumeFileStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} }
func (m *ReadVolumeFileStatusRequest) GetVolumeId() uint32 {
if m != nil {
@@ -1444,7 +1461,7 @@ type ReadVolumeFileStatusResponse struct {
func (m *ReadVolumeFileStatusResponse) Reset() { *m = ReadVolumeFileStatusResponse{} }
func (m *ReadVolumeFileStatusResponse) String() string { return proto.CompactTextString(m) }
func (*ReadVolumeFileStatusResponse) ProtoMessage() {}
-func (*ReadVolumeFileStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} }
+func (*ReadVolumeFileStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{60} }
func (m *ReadVolumeFileStatusResponse) GetVolumeId() uint32 {
if m != nil {
@@ -1512,7 +1529,7 @@ type DiskStatus struct {
func (m *DiskStatus) Reset() { *m = DiskStatus{} }
func (m *DiskStatus) String() string { return proto.CompactTextString(m) }
func (*DiskStatus) ProtoMessage() {}
-func (*DiskStatus) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{60} }
+func (*DiskStatus) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{61} }
func (m *DiskStatus) GetDir() string {
if m != nil {
@@ -1555,7 +1572,7 @@ type MemStatus struct {
func (m *MemStatus) Reset() { *m = MemStatus{} }
func (m *MemStatus) String() string { return proto.CompactTextString(m) }
func (*MemStatus) ProtoMessage() {}
-func (*MemStatus) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{61} }
+func (*MemStatus) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{62} }
func (m *MemStatus) GetGoroutines() int32 {
if m != nil {
@@ -1620,7 +1637,7 @@ type RemoteFile struct {
func (m *RemoteFile) Reset() { *m = RemoteFile{} }
func (m *RemoteFile) String() string { return proto.CompactTextString(m) }
func (*RemoteFile) ProtoMessage() {}
-func (*RemoteFile) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{62} }
+func (*RemoteFile) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{63} }
func (m *RemoteFile) GetBackendType() string {
if m != nil {
@@ -1680,7 +1697,7 @@ type VolumeInfo struct {
func (m *VolumeInfo) Reset() { *m = VolumeInfo{} }
func (m *VolumeInfo) String() string { return proto.CompactTextString(m) }
func (*VolumeInfo) ProtoMessage() {}
-func (*VolumeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{63} }
+func (*VolumeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{64} }
func (m *VolumeInfo) GetFiles() []*RemoteFile {
if m != nil {
@@ -1714,7 +1731,7 @@ func (m *VolumeTierMoveDatToRemoteRequest) Reset() { *m = VolumeTierMove
func (m *VolumeTierMoveDatToRemoteRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeTierMoveDatToRemoteRequest) ProtoMessage() {}
func (*VolumeTierMoveDatToRemoteRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor0, []int{64}
+ return fileDescriptor0, []int{65}
}
func (m *VolumeTierMoveDatToRemoteRequest) GetVolumeId() uint32 {
@@ -1754,7 +1771,7 @@ func (m *VolumeTierMoveDatToRemoteResponse) Reset() { *m = VolumeTierMov
func (m *VolumeTierMoveDatToRemoteResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeTierMoveDatToRemoteResponse) ProtoMessage() {}
func (*VolumeTierMoveDatToRemoteResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor0, []int{65}
+ return fileDescriptor0, []int{66}
}
func (m *VolumeTierMoveDatToRemoteResponse) GetProcessed() int64 {
@@ -1781,7 +1798,7 @@ func (m *VolumeTierMoveDatFromRemoteRequest) Reset() { *m = VolumeTierMo
func (m *VolumeTierMoveDatFromRemoteRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeTierMoveDatFromRemoteRequest) ProtoMessage() {}
func (*VolumeTierMoveDatFromRemoteRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor0, []int{66}
+ return fileDescriptor0, []int{67}
}
func (m *VolumeTierMoveDatFromRemoteRequest) GetVolumeId() uint32 {
@@ -1814,7 +1831,7 @@ func (m *VolumeTierMoveDatFromRemoteResponse) Reset() { *m = VolumeTierM
func (m *VolumeTierMoveDatFromRemoteResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeTierMoveDatFromRemoteResponse) ProtoMessage() {}
func (*VolumeTierMoveDatFromRemoteResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor0, []int{67}
+ return fileDescriptor0, []int{68}
}
func (m *VolumeTierMoveDatFromRemoteResponse) GetProcessed() int64 {
@@ -1843,7 +1860,7 @@ type QueryRequest struct {
func (m *QueryRequest) Reset() { *m = QueryRequest{} }
func (m *QueryRequest) String() string { return proto.CompactTextString(m) }
func (*QueryRequest) ProtoMessage() {}
-func (*QueryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{68} }
+func (*QueryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{69} }
func (m *QueryRequest) GetSelections() []string {
if m != nil {
@@ -1889,7 +1906,7 @@ type QueryRequest_Filter struct {
func (m *QueryRequest_Filter) Reset() { *m = QueryRequest_Filter{} }
func (m *QueryRequest_Filter) String() string { return proto.CompactTextString(m) }
func (*QueryRequest_Filter) ProtoMessage() {}
-func (*QueryRequest_Filter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{68, 0} }
+func (*QueryRequest_Filter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{69, 0} }
func (m *QueryRequest_Filter) GetField() string {
if m != nil {
@@ -1924,7 +1941,7 @@ func (m *QueryRequest_InputSerialization) Reset() { *m = QueryRequest_In
func (m *QueryRequest_InputSerialization) String() string { return proto.CompactTextString(m) }
func (*QueryRequest_InputSerialization) ProtoMessage() {}
func (*QueryRequest_InputSerialization) Descriptor() ([]byte, []int) {
- return fileDescriptor0, []int{68, 1}
+ return fileDescriptor0, []int{69, 1}
}
func (m *QueryRequest_InputSerialization) GetCompressionType() string {
@@ -1972,7 +1989,7 @@ func (m *QueryRequest_InputSerialization_CSVInput) Reset() {
func (m *QueryRequest_InputSerialization_CSVInput) String() string { return proto.CompactTextString(m) }
func (*QueryRequest_InputSerialization_CSVInput) ProtoMessage() {}
func (*QueryRequest_InputSerialization_CSVInput) Descriptor() ([]byte, []int) {
- return fileDescriptor0, []int{68, 1, 0}
+ return fileDescriptor0, []int{69, 1, 0}
}
func (m *QueryRequest_InputSerialization_CSVInput) GetFileHeaderInfo() string {
@@ -2034,7 +2051,7 @@ func (m *QueryRequest_InputSerialization_JSONInput) Reset() {
func (m *QueryRequest_InputSerialization_JSONInput) String() string { return proto.CompactTextString(m) }
func (*QueryRequest_InputSerialization_JSONInput) ProtoMessage() {}
func (*QueryRequest_InputSerialization_JSONInput) Descriptor() ([]byte, []int) {
- return fileDescriptor0, []int{68, 1, 1}
+ return fileDescriptor0, []int{69, 1, 1}
}
func (m *QueryRequest_InputSerialization_JSONInput) GetType() string {
@@ -2055,7 +2072,7 @@ func (m *QueryRequest_InputSerialization_ParquetInput) String() string {
}
func (*QueryRequest_InputSerialization_ParquetInput) ProtoMessage() {}
func (*QueryRequest_InputSerialization_ParquetInput) Descriptor() ([]byte, []int) {
- return fileDescriptor0, []int{68, 1, 2}
+ return fileDescriptor0, []int{69, 1, 2}
}
type QueryRequest_OutputSerialization struct {
@@ -2067,7 +2084,7 @@ func (m *QueryRequest_OutputSerialization) Reset() { *m = QueryRequest_O
func (m *QueryRequest_OutputSerialization) String() string { return proto.CompactTextString(m) }
func (*QueryRequest_OutputSerialization) ProtoMessage() {}
func (*QueryRequest_OutputSerialization) Descriptor() ([]byte, []int) {
- return fileDescriptor0, []int{68, 2}
+ return fileDescriptor0, []int{69, 2}
}
func (m *QueryRequest_OutputSerialization) GetCsvOutput() *QueryRequest_OutputSerialization_CSVOutput {
@@ -2100,7 +2117,7 @@ func (m *QueryRequest_OutputSerialization_CSVOutput) String() string {
}
func (*QueryRequest_OutputSerialization_CSVOutput) ProtoMessage() {}
func (*QueryRequest_OutputSerialization_CSVOutput) Descriptor() ([]byte, []int) {
- return fileDescriptor0, []int{68, 2, 0}
+ return fileDescriptor0, []int{69, 2, 0}
}
func (m *QueryRequest_OutputSerialization_CSVOutput) GetQuoteFields() string {
@@ -2150,7 +2167,7 @@ func (m *QueryRequest_OutputSerialization_JSONOutput) String() string {
}
func (*QueryRequest_OutputSerialization_JSONOutput) ProtoMessage() {}
func (*QueryRequest_OutputSerialization_JSONOutput) Descriptor() ([]byte, []int) {
- return fileDescriptor0, []int{68, 2, 1}
+ return fileDescriptor0, []int{69, 2, 1}
}
func (m *QueryRequest_OutputSerialization_JSONOutput) GetRecordDelimiter() string {
@@ -2167,7 +2184,7 @@ type QueriedStripe struct {
func (m *QueriedStripe) Reset() { *m = QueriedStripe{} }
func (m *QueriedStripe) String() string { return proto.CompactTextString(m) }
func (*QueriedStripe) ProtoMessage() {}
-func (*QueriedStripe) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{69} }
+func (*QueriedStripe) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{70} }
func (m *QueriedStripe) GetRecords() []byte {
if m != nil {
@@ -2180,6 +2197,7 @@ func init() {
proto.RegisterType((*BatchDeleteRequest)(nil), "volume_server_pb.BatchDeleteRequest")
proto.RegisterType((*BatchDeleteResponse)(nil), "volume_server_pb.BatchDeleteResponse")
proto.RegisterType((*DeleteResult)(nil), "volume_server_pb.DeleteResult")
+ proto.RegisterType((*TcpRequestHeader)(nil), "volume_server_pb.TcpRequestHeader")
proto.RegisterType((*FileGetRequest)(nil), "volume_server_pb.FileGetRequest")
proto.RegisterType((*FileGetResponse)(nil), "volume_server_pb.FileGetResponse")
proto.RegisterType((*Empty)(nil), "volume_server_pb.Empty")
@@ -3582,204 +3600,205 @@ var _VolumeServer_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("volume_server.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
- // 3173 bytes of a gzipped FileDescriptorProto
+ // 3199 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xd4, 0x3a, 0x4b, 0x73, 0xdc, 0xc6,
- 0xd1, 0x5c, 0x2e, 0x1f, 0xbb, 0xbd, 0x4b, 0x91, 0x1a, 0xd2, 0xd4, 0x1a, 0x22, 0x25, 0x0a, 0xf2,
- 0x83, 0x94, 0x2d, 0x52, 0xa6, 0xed, 0xcf, 0xfa, 0xe4, 0xcf, 0xfe, 0x22, 0x51, 0x0f, 0xcb, 0x16,
- 0x29, 0x1b, 0x94, 0x65, 0x27, 0x76, 0x05, 0x05, 0x02, 0xb3, 0x24, 0x4c, 0x2c, 0x06, 0x02, 0x66,
- 0x69, 0xad, 0xca, 0xb9, 0xc4, 0xa9, 0x4a, 0xaa, 0x52, 0xc9, 0x21, 0x95, 0x4b, 0xce, 0xb9, 0xe7,
- 0x9a, 0xbf, 0xe0, 0x3f, 0x90, 0xaa, 0x9c, 0x72, 0xc9, 0x39, 0x87, 0xdc, 0x52, 0x95, 0x4b, 0x6a,
- 0x5e, 0x58, 0x3c, 0xb9, 0xa0, 0xc5, 0x54, 0x2a, 0x37, 0x4c, 0x4f, 0x3f, 0xa6, 0x7b, 0xba, 0x7b,
- 0x7a, 0xa6, 0x01, 0xf3, 0x47, 0xc4, 0xeb, 0xf7, 0xb0, 0x19, 0xe1, 0xf0, 0x08, 0x87, 0xeb, 0x41,
- 0x48, 0x28, 0x41, 0x73, 0x29, 0xa0, 0x19, 0xec, 0xe9, 0x1b, 0x80, 0x6e, 0x59, 0xd4, 0x3e, 0xb8,
- 0x8d, 0x3d, 0x4c, 0xb1, 0x81, 0x9f, 0xf4, 0x71, 0x44, 0xd1, 0x8b, 0xd0, 0xe8, 0xba, 0x1e, 0x36,
- 0x5d, 0x27, 0xea, 0xd4, 0x56, 0xea, 0xab, 0x4d, 0x63, 0x9a, 0x8d, 0xef, 0x3b, 0x91, 0xfe, 0x10,
- 0xe6, 0x53, 0x04, 0x51, 0x40, 0xfc, 0x08, 0xa3, 0xeb, 0x30, 0x1d, 0xe2, 0xa8, 0xef, 0x51, 0x41,
- 0xd0, 0xda, 0xbc, 0xb0, 0x9e, 0x95, 0xb5, 0x1e, 0x93, 0xf4, 0x3d, 0x6a, 0x28, 0x74, 0xfd, 0xdb,
- 0x1a, 0xb4, 0x93, 0x33, 0xe8, 0x1c, 0x4c, 0x4b, 0xe1, 0x9d, 0xda, 0x4a, 0x6d, 0xb5, 0x69, 0x4c,
- 0x09, 0xd9, 0x68, 0x11, 0xa6, 0x22, 0x6a, 0xd1, 0x7e, 0xd4, 0x19, 0x5f, 0xa9, 0xad, 0x4e, 0x1a,
- 0x72, 0x84, 0x16, 0x60, 0x12, 0x87, 0x21, 0x09, 0x3b, 0x75, 0x8e, 0x2e, 0x06, 0x08, 0xc1, 0x44,
- 0xe4, 0x3e, 0xc3, 0x9d, 0x89, 0x95, 0xda, 0xea, 0x8c, 0xc1, 0xbf, 0x51, 0x07, 0xa6, 0x8f, 0x70,
- 0x18, 0xb9, 0xc4, 0xef, 0x4c, 0x72, 0xb0, 0x1a, 0xea, 0x1f, 0xc2, 0x99, 0xbb, 0xae, 0x87, 0xef,
- 0x61, 0xaa, 0x6c, 0x50, 0xba, 0x8c, 0x8b, 0xd0, 0xb2, 0x6c, 0x1b, 0x07, 0xd4, 0xdc, 0x7f, 0xe6,
- 0x06, 0x7c, 0x2d, 0x0d, 0x03, 0x04, 0xe8, 0xde, 0x33, 0x37, 0xd0, 0x7f, 0x5e, 0x87, 0xd9, 0x98,
- 0x99, 0xb4, 0x0f, 0x82, 0x09, 0xc7, 0xa2, 0x16, 0x67, 0xd5, 0x36, 0xf8, 0x37, 0x7a, 0x19, 0xce,
- 0xd8, 0xc4, 0xa7, 0xd8, 0xa7, 0xa6, 0x87, 0xfd, 0x7d, 0x7a, 0xc0, 0x79, 0xcd, 0x18, 0x33, 0x12,
- 0xfa, 0x80, 0x03, 0xd1, 0x25, 0x68, 0x2b, 0x34, 0x3a, 0x08, 0xb0, 0xd4, 0xb2, 0x25, 0x61, 0x8f,
- 0x06, 0x01, 0x46, 0x97, 0x61, 0xc6, 0xb3, 0x22, 0x6a, 0xf6, 0x88, 0xe3, 0x76, 0x5d, 0xec, 0x70,
- 0xa5, 0x27, 0x8c, 0x36, 0x03, 0x6e, 0x4b, 0x18, 0xd2, 0xc4, 0xa6, 0xfa, 0x56, 0x0f, 0x73, 0xed,
- 0x9b, 0x46, 0x3c, 0x66, 0xcb, 0xc3, 0xd4, 0xda, 0xef, 0x4c, 0x71, 0x38, 0xff, 0x46, 0xcb, 0x00,
- 0x6e, 0xc4, 0x75, 0x0c, 0xb0, 0xd3, 0x99, 0xe6, 0x6a, 0x36, 0xdd, 0xe8, 0x9e, 0x00, 0xa0, 0x0f,
- 0x60, 0xfa, 0x00, 0x5b, 0x0e, 0x0e, 0xa3, 0x4e, 0x83, 0xef, 0xf8, 0x7a, 0x7e, 0xc7, 0x33, 0x56,
- 0x58, 0xff, 0x40, 0x10, 0xdc, 0xf1, 0x69, 0x38, 0x30, 0x14, 0x39, 0x5a, 0x82, 0x26, 0xdf, 0xb2,
- 0x2d, 0xe2, 0xe0, 0x4e, 0x93, 0x6f, 0xed, 0x10, 0xa0, 0xdd, 0x80, 0x76, 0x92, 0x0c, 0xcd, 0x41,
- 0xfd, 0x10, 0x0f, 0xe4, 0x9e, 0xb0, 0x4f, 0xb6, 0xff, 0x47, 0x96, 0xd7, 0xc7, 0xdc, 0x7c, 0x4d,
- 0x43, 0x0c, 0x6e, 0x8c, 0x5f, 0xaf, 0xe9, 0xd3, 0x30, 0x79, 0xa7, 0x17, 0xd0, 0x81, 0xfe, 0x0e,
- 0x74, 0x1e, 0x5b, 0x76, 0xbf, 0xdf, 0x7b, 0xcc, 0x97, 0xb8, 0x75, 0x80, 0xed, 0x43, 0xb5, 0xd1,
- 0xe7, 0xa1, 0x29, 0x17, 0x2e, 0xb7, 0x7a, 0xc6, 0x68, 0x08, 0xc0, 0x7d, 0x47, 0xff, 0x01, 0xbc,
- 0x58, 0x40, 0x28, 0x37, 0xf5, 0x32, 0xcc, 0xec, 0x5b, 0xe1, 0x9e, 0xb5, 0x8f, 0xcd, 0xd0, 0xa2,
- 0x2e, 0xe1, 0xd4, 0x35, 0xa3, 0x2d, 0x81, 0x06, 0x83, 0xe9, 0x5f, 0x80, 0x96, 0xe2, 0x40, 0x7a,
- 0x81, 0x65, 0xd3, 0x2a, 0xc2, 0xd1, 0x0a, 0xb4, 0x82, 0x10, 0x5b, 0x9e, 0x47, 0x6c, 0x8b, 0x0a,
- 0xf5, 0xea, 0x46, 0x12, 0xa4, 0x2f, 0xc3, 0xf9, 0x42, 0xe6, 0x62, 0x81, 0xfa, 0xf5, 0xcc, 0xea,
- 0x49, 0xaf, 0xe7, 0x56, 0x12, 0xad, 0x2f, 0xe5, 0x56, 0xcd, 0x29, 0x25, 0xdf, 0xff, 0xcd, 0xcc,
- 0x7a, 0xd8, 0xf2, 0xfb, 0x41, 0x25, 0xc6, 0xd9, 0x15, 0x2b, 0xd2, 0x98, 0xf3, 0x39, 0x91, 0x0c,
- 0xb6, 0x88, 0xe7, 0x61, 0x9b, 0xba, 0xc4, 0x57, 0x6c, 0x2f, 0x00, 0xd8, 0x31, 0x50, 0xee, 0x7f,
- 0x02, 0xa2, 0x6b, 0xd0, 0xc9, 0x93, 0x4a, 0xb6, 0x7f, 0xa9, 0xc1, 0x0b, 0x37, 0xa5, 0xd1, 0x84,
- 0xe0, 0x4a, 0x1b, 0x90, 0x16, 0x39, 0x9e, 0x15, 0x99, 0xdd, 0xa0, 0x7a, 0x6e, 0x83, 0x18, 0x46,
- 0x88, 0x03, 0xcf, 0xb5, 0x2d, 0xce, 0x62, 0x42, 0xc4, 0x6e, 0x02, 0xc4, 0xfc, 0x99, 0x52, 0x4f,
- 0x46, 0x24, 0xfb, 0x44, 0x9b, 0xb0, 0xd8, 0xc3, 0x3d, 0x12, 0x0e, 0xcc, 0x9e, 0x15, 0x98, 0x3d,
- 0xeb, 0xa9, 0xc9, 0x92, 0x97, 0xd9, 0xdb, 0xe3, 0xe1, 0x39, 0x63, 0x20, 0x31, 0xbb, 0x6d, 0x05,
- 0xdb, 0xd6, 0xd3, 0x5d, 0xf7, 0x19, 0xde, 0xde, 0xd3, 0x3b, 0xb0, 0x98, 0xd5, 0x4f, 0xaa, 0xfe,
- 0x3f, 0x70, 0x4e, 0x40, 0x76, 0x07, 0xbe, 0xbd, 0xcb, 0x33, 0x66, 0xa5, 0x8d, 0xfa, 0x67, 0x0d,
- 0x3a, 0x79, 0x42, 0xe9, 0xf9, 0xcf, 0x6b, 0xb5, 0x13, 0xdb, 0xe4, 0x22, 0xb4, 0xa8, 0xe5, 0x7a,
- 0x26, 0xe9, 0x76, 0x23, 0x4c, 0xb9, 0x21, 0x26, 0x0c, 0x60, 0xa0, 0x87, 0x1c, 0x82, 0xd6, 0x60,
- 0xce, 0x16, 0xde, 0x6f, 0x86, 0xf8, 0xc8, 0xe5, 0x39, 0x7e, 0x9a, 0x2f, 0x6c, 0xd6, 0x56, 0x51,
- 0x21, 0xc0, 0x48, 0x87, 0x19, 0xd7, 0x79, 0x6a, 0xf2, 0xec, 0xce, 0x8f, 0x88, 0x06, 0xe7, 0xd6,
- 0x72, 0x9d, 0xa7, 0x2c, 0x61, 0x31, 0x8b, 0xea, 0x8f, 0x61, 0x49, 0x28, 0x7f, 0xdf, 0xb7, 0x43,
- 0xdc, 0xc3, 0x3e, 0xb5, 0xbc, 0x2d, 0x12, 0x0c, 0x2a, 0xb9, 0xcd, 0x8b, 0xd0, 0x88, 0x5c, 0xdf,
- 0xc6, 0xa6, 0x2f, 0x8e, 0xaa, 0x09, 0x63, 0x9a, 0x8f, 0x77, 0x22, 0xfd, 0x16, 0x2c, 0x97, 0xf0,
- 0x95, 0x96, 0xbd, 0x04, 0x6d, 0xbe, 0x30, 0x99, 0xde, 0xe5, 0x81, 0xd1, 0x62, 0xb0, 0x2d, 0x01,
- 0xd2, 0xdf, 0x00, 0x24, 0x78, 0x6c, 0x93, 0xbe, 0x5f, 0x2d, 0x9c, 0x5f, 0x80, 0xf9, 0x14, 0x89,
- 0xf4, 0x8d, 0x37, 0x61, 0x41, 0x80, 0x3f, 0xf5, 0x7b, 0x95, 0x79, 0x9d, 0x83, 0x17, 0x32, 0x44,
- 0x92, 0xdb, 0xa6, 0x12, 0x92, 0x2e, 0x26, 0x8e, 0x65, 0xb6, 0xa8, 0x56, 0x90, 0xae, 0x27, 0x78,
- 0xe6, 0x12, 0x0b, 0xb6, 0xc2, 0x43, 0x03, 0x5b, 0x0e, 0xf1, 0xbd, 0x41, 0xe5, 0xcc, 0x55, 0x40,
- 0x29, 0xf9, 0x7e, 0x06, 0x8b, 0x2a, 0xa3, 0xf9, 0x5d, 0x77, 0xbf, 0x1f, 0xe2, 0xaa, 0x99, 0x38,
- 0xe9, 0xb2, 0xe3, 0x39, 0x97, 0xd5, 0x37, 0x54, 0x98, 0x25, 0x18, 0xcb, 0x2d, 0x8d, 0xeb, 0x93,
- 0x5a, 0xa2, 0x3e, 0xd1, 0xff, 0x50, 0x83, 0xb3, 0x8a, 0xa2, 0xa2, 0x5f, 0x9d, 0x30, 0xb0, 0xea,
- 0xa5, 0x81, 0x35, 0x31, 0x0c, 0xac, 0x55, 0x98, 0x8b, 0x48, 0x3f, 0xb4, 0xb1, 0xc9, 0x6a, 0x12,
- 0xd3, 0x67, 0x67, 0xb0, 0x88, 0xbb, 0x33, 0x02, 0x7e, 0xdb, 0xa2, 0xd6, 0x0e, 0x71, 0xb0, 0xfe,
- 0xff, 0xca, 0xed, 0x52, 0xfe, 0xba, 0x06, 0x67, 0x79, 0xe9, 0x61, 0x05, 0x01, 0xf6, 0x1d, 0xd3,
- 0xa2, 0xcc, 0xe9, 0x6b, 0xdc, 0xe9, 0xcf, 0xb0, 0x89, 0x9b, 0x1c, 0x7e, 0x93, 0xee, 0x44, 0xfa,
- 0x6f, 0xc7, 0x61, 0x96, 0xd1, 0xb2, 0x20, 0xab, 0xa4, 0xef, 0x1c, 0xd4, 0xf1, 0x53, 0x2a, 0x15,
- 0x65, 0x9f, 0x68, 0x03, 0xe6, 0x65, 0x34, 0xbb, 0xc4, 0x1f, 0x06, 0x7a, 0x5d, 0xe4, 0xc5, 0xe1,
- 0x54, 0x1c, 0xeb, 0x17, 0xa1, 0x15, 0x51, 0x12, 0xa8, 0xbc, 0x21, 0xea, 0x22, 0x60, 0x20, 0x99,
- 0x37, 0xd2, 0x36, 0x9d, 0x2c, 0xb0, 0x69, 0xdb, 0x8d, 0x4c, 0x6c, 0x9b, 0x62, 0x55, 0x3c, 0xf3,
- 0x34, 0x0c, 0x70, 0xa3, 0x3b, 0xb6, 0xb0, 0x06, 0x7a, 0x1f, 0x96, 0xdc, 0x7d, 0x9f, 0x84, 0xd8,
- 0x94, 0x86, 0xe4, 0xf1, 0xeb, 0x13, 0x6a, 0x76, 0x49, 0xdf, 0x57, 0x95, 0x53, 0x47, 0xe0, 0xec,
- 0x72, 0x14, 0x66, 0x81, 0x1d, 0x42, 0xef, 0xb2, 0x79, 0xfd, 0x6d, 0x98, 0x1b, 0x5a, 0xa5, 0x7a,
- 0x16, 0xf8, 0xb6, 0xa6, 0x3c, 0xee, 0x91, 0xe5, 0x7a, 0xbb, 0xd8, 0x77, 0x70, 0xf8, 0x9c, 0xd9,
- 0x09, 0x5d, 0x83, 0x05, 0xd7, 0xf1, 0xb0, 0x49, 0xdd, 0x1e, 0x26, 0x7d, 0x6a, 0x46, 0xd8, 0x26,
- 0xbe, 0x13, 0x29, 0xfb, 0xb2, 0xb9, 0x47, 0x62, 0x6a, 0x57, 0xcc, 0xe8, 0x3f, 0x8b, 0x4f, 0x89,
- 0xe4, 0x2a, 0x86, 0xf5, 0x91, 0x8f, 0x31, 0x63, 0x28, 0x4a, 0x3d, 0xa9, 0x46, 0x5b, 0x00, 0x45,
- 0x55, 0xc7, 0x76, 0x48, 0x22, 0xed, 0x11, 0x67, 0xc0, 0x57, 0xd4, 0x36, 0x40, 0x80, 0x6e, 0x11,
- 0x67, 0xc0, 0xd3, 0x75, 0x64, 0x72, 0x27, 0xb3, 0x0f, 0xfa, 0xfe, 0x21, 0x5f, 0x4d, 0xc3, 0x68,
- 0xb9, 0xd1, 0x03, 0x2b, 0xa2, 0x5b, 0x0c, 0xa4, 0xff, 0xb1, 0xa6, 0xf2, 0x05, 0x5b, 0x86, 0x81,
- 0x6d, 0xec, 0x1e, 0xfd, 0x07, 0xcc, 0xc1, 0x28, 0xa4, 0x13, 0xa4, 0x6a, 0x61, 0x19, 0x70, 0x48,
- 0xcc, 0xc9, 0x53, 0x95, 0xcf, 0x0c, 0xd3, 0x55, 0x7a, 0xe1, 0x32, 0x5d, 0x7d, 0xa9, 0x8e, 0x8b,
- 0x3b, 0xf6, 0xee, 0x81, 0x15, 0x3a, 0xd1, 0x3d, 0xec, 0xe3, 0xd0, 0xa2, 0xa7, 0x52, 0xbe, 0xe8,
- 0x2b, 0x70, 0xa1, 0x8c, 0xbb, 0x94, 0xff, 0x85, 0x3a, 0x06, 0x15, 0x86, 0x81, 0xf7, 0xfa, 0xae,
- 0xe7, 0x9c, 0x8a, 0xf8, 0x8f, 0xb2, 0xca, 0xc5, 0xcc, 0xa5, 0xff, 0x5c, 0x81, 0xb3, 0x21, 0x07,
- 0x51, 0x33, 0x62, 0x08, 0xf1, 0x7d, 0x74, 0xc6, 0x98, 0x95, 0x13, 0x9c, 0x90, 0xdd, 0x4b, 0x7f,
- 0x39, 0xae, 0x3c, 0x40, 0x71, 0x3b, 0xb5, 0xb4, 0x7a, 0x1e, 0x9a, 0x43, 0xf1, 0x75, 0x2e, 0xbe,
- 0x11, 0x49, 0xb9, 0xcc, 0x3b, 0x6d, 0x12, 0x0c, 0x4c, 0x6c, 0x8b, 0x8a, 0x82, 0x6f, 0x75, 0x83,
- 0x5d, 0xcf, 0x82, 0xc1, 0x1d, 0x9b, 0x17, 0x14, 0xd5, 0x73, 0x6c, 0x82, 0xdb, 0x57, 0x82, 0xdb,
- 0x54, 0x92, 0xdb, 0x57, 0x9c, 0x9b, 0xc2, 0x39, 0x72, 0xbb, 0x02, 0x67, 0x7a, 0x88, 0xf3, 0xd8,
- 0xed, 0x32, 0x9c, 0xa1, 0x57, 0xa5, 0x8d, 0x21, 0x77, 0xf5, 0x6b, 0x38, 0x9f, 0x9e, 0xad, 0x7e,
- 0x60, 0x3f, 0x97, 0xb1, 0xf4, 0x0b, 0x59, 0x77, 0xca, 0x9c, 0xfa, 0x47, 0xd9, 0x65, 0x57, 0xae,
- 0x70, 0x9e, 0x6f, 0x5d, 0xcb, 0x59, 0x83, 0xa4, 0xcb, 0xa4, 0xcf, 0xb3, 0xcb, 0x3e, 0x41, 0xb9,
- 0x74, 0xbc, 0xe0, 0x8b, 0xd9, 0x10, 0xc8, 0xd6, 0x54, 0xbf, 0x8b, 0xf3, 0xab, 0xc4, 0x60, 0x15,
- 0x4d, 0xe5, 0xbc, 0x26, 0xe5, 0xca, 0x77, 0x85, 0x69, 0x29, 0x16, 0x2d, 0xc2, 0x94, 0x3c, 0x0f,
- 0xc5, 0x8d, 0x45, 0x8e, 0x52, 0x4f, 0x26, 0x75, 0xf9, 0x64, 0xa2, 0x9e, 0x82, 0xd8, 0x9d, 0x7b,
- 0x52, 0xa4, 0x47, 0x36, 0xfe, 0x08, 0x0f, 0xf4, 0x9d, 0x4c, 0xc4, 0x89, 0xa5, 0x1d, 0xf3, 0xe0,
- 0x21, 0x5e, 0x14, 0x1c, 0xbe, 0xe7, 0x8e, 0x7c, 0x38, 0x69, 0xba, 0xd2, 0x09, 0x1c, 0xfd, 0x57,
- 0xb5, 0x21, 0xc3, 0x5b, 0x1e, 0xd9, 0x3b, 0x45, 0xaf, 0x4c, 0x6a, 0x51, 0x4f, 0x69, 0x91, 0x7c,
- 0x13, 0x9a, 0x48, 0xbf, 0x09, 0x25, 0x82, 0x28, 0xb9, 0x9c, 0xb2, 0xd4, 0xfc, 0x88, 0x9c, 0xde,
- 0xcd, 0x32, 0x9f, 0x9a, 0x87, 0xdc, 0xa5, 0xfc, 0x1b, 0x70, 0x9e, 0x19, 0x5c, 0x40, 0xf9, 0xbd,
- 0xa5, 0xfa, 0xdd, 0xee, 0x6f, 0xe3, 0xb0, 0x54, 0x4c, 0x5c, 0xe5, 0x7e, 0xf7, 0x2e, 0x68, 0xf1,
- 0xfd, 0x89, 0x1d, 0x8d, 0x11, 0xb5, 0x7a, 0x41, 0x7c, 0x38, 0x8a, 0x33, 0xf4, 0x9c, 0xbc, 0x4c,
- 0x3d, 0x52, 0xf3, 0xea, 0x84, 0xcc, 0x5d, 0xbe, 0xea, 0xb9, 0xcb, 0x17, 0x13, 0xe0, 0x58, 0xb4,
- 0x4c, 0x80, 0xa8, 0xe1, 0xce, 0x39, 0x16, 0x2d, 0x13, 0x10, 0x13, 0x73, 0x01, 0xc2, 0x6b, 0x5b,
- 0x12, 0x9f, 0x0b, 0x58, 0x06, 0x90, 0xe5, 0x55, 0xdf, 0x57, 0x97, 0xc9, 0xa6, 0x28, 0xae, 0xfa,
- 0x7e, 0x69, 0x95, 0x39, 0x5d, 0x5a, 0x65, 0xa6, 0x77, 0xb3, 0x91, 0xdb, 0xcd, 0xcf, 0x01, 0x6e,
- 0xbb, 0xd1, 0xa1, 0x30, 0x32, 0x2b, 0x6b, 0x1d, 0x57, 0xdd, 0x06, 0xd8, 0x27, 0x83, 0x58, 0x9e,
- 0x27, 0x4d, 0xc7, 0x3e, 0x59, 0xf8, 0xf4, 0x23, 0xec, 0x48, 0xeb, 0xf0, 0x6f, 0x06, 0xeb, 0x86,
- 0x18, 0x4b, 0x03, 0xf0, 0x6f, 0xfd, 0xf7, 0x35, 0x68, 0x6e, 0xe3, 0x9e, 0xe4, 0x7c, 0x01, 0x60,
- 0x9f, 0x84, 0xa4, 0x4f, 0x5d, 0x1f, 0x8b, 0x2a, 0x7c, 0xd2, 0x48, 0x40, 0xbe, 0xbf, 0x1c, 0x9e,
- 0x1a, 0xb0, 0xd7, 0x95, 0xc6, 0xe4, 0xdf, 0x0c, 0x76, 0x80, 0xad, 0x40, 0xda, 0x8f, 0x7f, 0xb3,
- 0xbb, 0x4e, 0x44, 0x2d, 0xfb, 0x90, 0x1b, 0x6b, 0xc2, 0x10, 0x03, 0xfd, 0xcf, 0x35, 0x00, 0x03,
- 0xf7, 0x08, 0xe5, 0xbe, 0xc6, 0xaa, 0xdb, 0x3d, 0xcb, 0x3e, 0x64, 0xf7, 0x05, 0xfe, 0xa2, 0x29,
- 0x2c, 0xd1, 0x92, 0x30, 0xfe, 0xa2, 0xb9, 0x0c, 0xa0, 0x50, 0x64, 0xfe, 0x6a, 0x1a, 0x4d, 0x09,
- 0x11, 0x37, 0x03, 0x15, 0xca, 0xf2, 0x11, 0x70, 0x98, 0xd3, 0xc4, 0xb2, 0x55, 0x4e, 0x3b, 0x0f,
- 0xcd, 0xac, 0x2b, 0xf0, 0x54, 0xc0, 0xfd, 0xe0, 0x32, 0xcc, 0xa8, 0x27, 0x53, 0xee, 0x68, 0x52,
- 0x95, 0xb6, 0x02, 0x32, 0xe7, 0xe2, 0xcf, 0x93, 0x4f, 0x29, 0xf6, 0x63, 0x1f, 0x68, 0x1a, 0x43,
- 0x80, 0xfe, 0x0d, 0x80, 0xba, 0xd0, 0x77, 0x09, 0xda, 0x84, 0x49, 0xc6, 0x5c, 0x3d, 0x82, 0x2f,
- 0xe5, 0x9f, 0x44, 0x87, 0x66, 0x30, 0x04, 0x6a, 0x32, 0x01, 0x8d, 0xa7, 0x12, 0xd0, 0xe8, 0xfb,
- 0x9c, 0xfe, 0x5d, 0x0d, 0x56, 0x64, 0xf9, 0xe8, 0xe2, 0x70, 0x9b, 0x1c, 0xb1, 0x52, 0xe2, 0x11,
- 0x11, 0x42, 0x4e, 0x25, 0x73, 0x5e, 0x87, 0x8e, 0x83, 0x23, 0xea, 0xfa, 0x5c, 0xa0, 0xa9, 0x36,
- 0x85, 0xbf, 0x22, 0x8b, 0x05, 0x2d, 0x26, 0xe6, 0x6f, 0x89, 0xe9, 0x1d, 0xab, 0x87, 0xd1, 0x55,
- 0x98, 0x3f, 0xc4, 0x38, 0x30, 0x3d, 0x62, 0x5b, 0x9e, 0xa9, 0x62, 0x52, 0xd6, 0x47, 0x73, 0x6c,
- 0xea, 0x01, 0x9b, 0xb9, 0x2d, 0xe2, 0x52, 0x8f, 0xe0, 0xd2, 0x31, 0x9a, 0xc8, 0xbc, 0xb4, 0x04,
- 0xcd, 0x20, 0x24, 0x36, 0x8e, 0x98, 0xcf, 0xd6, 0xf8, 0x31, 0x35, 0x04, 0xa0, 0x6b, 0x30, 0x1f,
- 0x0f, 0x3e, 0xc6, 0xa1, 0x8d, 0x7d, 0x6a, 0xed, 0x8b, 0x77, 0xd3, 0x71, 0xa3, 0x68, 0x4a, 0xff,
- 0x4d, 0x0d, 0xf4, 0x9c, 0xd4, 0xbb, 0x21, 0xe9, 0x9d, 0xa2, 0x05, 0x37, 0x60, 0x81, 0xdb, 0x21,
- 0xe4, 0x2c, 0x87, 0x86, 0x10, 0xd7, 0x98, 0xb3, 0x6c, 0x4e, 0x48, 0x53, 0x96, 0xe8, 0xc3, 0xe5,
- 0x63, 0xd7, 0xf4, 0x6f, 0xb2, 0xc5, 0x3f, 0xda, 0xd0, 0xfe, 0xa4, 0x8f, 0xc3, 0x41, 0xe2, 0xc1,
- 0x35, 0xc2, 0x52, 0x0b, 0xd5, 0x07, 0x4a, 0x40, 0x58, 0xa6, 0xed, 0x86, 0xa4, 0x67, 0xc6, 0xad,
- 0xa2, 0x71, 0x8e, 0xd2, 0x62, 0xc0, 0xbb, 0xa2, 0x5d, 0x84, 0xde, 0x83, 0xa9, 0xae, 0xeb, 0x51,
- 0x2c, 0x9a, 0x33, 0xad, 0xcd, 0x97, 0xf3, 0x11, 0x91, 0x94, 0xb9, 0x7e, 0x97, 0x23, 0x1b, 0x92,
- 0x08, 0xed, 0xc1, 0xbc, 0xeb, 0x07, 0xfc, 0xea, 0x15, 0xba, 0x96, 0xe7, 0x3e, 0x1b, 0x3e, 0x19,
- 0xb6, 0x36, 0xdf, 0x18, 0xc1, 0xeb, 0x3e, 0xa3, 0xdc, 0x4d, 0x12, 0x1a, 0xc8, 0xcd, 0xc1, 0x10,
- 0x86, 0x05, 0xd2, 0xa7, 0x79, 0x21, 0x93, 0x5c, 0xc8, 0xe6, 0x08, 0x21, 0x0f, 0x39, 0x69, 0x5a,
- 0xca, 0x3c, 0xc9, 0x03, 0xb5, 0x1d, 0x98, 0x12, 0xca, 0xb1, 0x1c, 0xd9, 0x75, 0xb1, 0xa7, 0xfa,
- 0x4a, 0x62, 0xc0, 0xd2, 0x00, 0x09, 0x70, 0x68, 0xf9, 0x2a, 0xdd, 0xa9, 0xe1, 0xb0, 0xbf, 0x51,
- 0x4f, 0xf4, 0x37, 0xb4, 0x3f, 0x4d, 0x02, 0xca, 0x6b, 0xa8, 0xde, 0x41, 0x43, 0x1c, 0xb1, 0x14,
- 0x92, 0xcc, 0xaf, 0xb3, 0x09, 0x38, 0xcf, 0xb1, 0x9f, 0x41, 0xd3, 0x8e, 0x8e, 0x4c, 0x6e, 0x12,
- 0x2e, 0xb3, 0xb5, 0x79, 0xe3, 0xc4, 0x26, 0x5d, 0xdf, 0xda, 0x7d, 0xcc, 0xa1, 0x46, 0xc3, 0x8e,
- 0x8e, 0xf8, 0x17, 0xfa, 0x11, 0xc0, 0x57, 0x11, 0xf1, 0x25, 0x67, 0xb1, 0xf1, 0xef, 0x9e, 0x9c,
- 0xf3, 0x87, 0xbb, 0x0f, 0x77, 0x04, 0xeb, 0x26, 0x63, 0x27, 0x78, 0xdb, 0x30, 0x13, 0x58, 0xe1,
- 0x93, 0x3e, 0xa6, 0x92, 0xbd, 0xf0, 0x85, 0xf7, 0x4f, 0xce, 0xfe, 0x63, 0xc1, 0x46, 0x48, 0x68,
- 0x07, 0x89, 0x91, 0xf6, 0xdd, 0x38, 0x34, 0x94, 0x5e, 0xec, 0xf6, 0xc6, 0x3d, 0x5c, 0xbc, 0x61,
- 0x98, 0xae, 0xdf, 0x25, 0xd2, 0xa2, 0x67, 0x18, 0x5c, 0x3c, 0x63, 0xf0, 0xec, 0xbf, 0x06, 0x73,
- 0x21, 0xb6, 0x49, 0xe8, 0xb0, 0x1a, 0xd7, 0xed, 0xb9, 0xcc, 0xed, 0xc5, 0x5e, 0xce, 0x0a, 0xf8,
- 0x6d, 0x05, 0x46, 0xaf, 0xc2, 0x2c, 0xdf, 0xf6, 0x04, 0x66, 0x5d, 0xf1, 0xc4, 0x5e, 0x02, 0x71,
- 0x0d, 0xe6, 0x9e, 0xf4, 0x59, 0xde, 0xb0, 0x0f, 0xac, 0xd0, 0xb2, 0x29, 0x89, 0x5f, 0x13, 0x66,
- 0x39, 0x7c, 0x2b, 0x06, 0xa3, 0xb7, 0x60, 0x51, 0xa0, 0xe2, 0xc8, 0xb6, 0x82, 0x98, 0x02, 0x87,
- 0xf2, 0xb2, 0xb9, 0xc0, 0x67, 0xef, 0xf0, 0xc9, 0x2d, 0x35, 0x87, 0x34, 0x68, 0xd8, 0xa4, 0xd7,
- 0xc3, 0x3e, 0x8d, 0x64, 0xfb, 0x2f, 0x1e, 0xa3, 0x9b, 0xb0, 0x6c, 0x79, 0x1e, 0xf9, 0xda, 0xe4,
- 0x94, 0x8e, 0x99, 0xd3, 0x4e, 0x5c, 0x3d, 0x35, 0x8e, 0xf4, 0x09, 0xc7, 0x31, 0xd2, 0x8a, 0x6a,
- 0x17, 0xa1, 0x19, 0xef, 0x23, 0xab, 0x18, 0x12, 0x0e, 0xc9, 0xbf, 0xb5, 0x33, 0xd0, 0x4e, 0xee,
- 0x84, 0xf6, 0xf7, 0x3a, 0xcc, 0x17, 0x04, 0x15, 0xfa, 0x02, 0x80, 0x79, 0xab, 0x08, 0x2d, 0xe9,
- 0xae, 0xff, 0x77, 0xf2, 0xe0, 0x64, 0xfe, 0x2a, 0xc0, 0x06, 0xf3, 0x7e, 0xf1, 0x89, 0x7e, 0x0c,
- 0x2d, 0xee, 0xb1, 0x92, 0xbb, 0x70, 0xd9, 0xf7, 0xbe, 0x07, 0x77, 0xa6, 0xab, 0x64, 0xcf, 0x63,
- 0x40, 0x7c, 0x6b, 0x7f, 0xad, 0x41, 0x33, 0x16, 0xcc, 0xea, 0x1f, 0xb1, 0x51, 0x7c, 0xaf, 0x23,
- 0x55, 0xff, 0x70, 0xd8, 0x5d, 0x0e, 0xfa, 0xaf, 0x74, 0x25, 0xed, 0x1d, 0x80, 0xa1, 0xfe, 0x85,
- 0x2a, 0xd4, 0x0a, 0x55, 0xd0, 0xd7, 0x60, 0x86, 0x59, 0xd6, 0xc5, 0xce, 0x2e, 0x0d, 0xdd, 0x80,
- 0x37, 0xea, 0x05, 0x4e, 0x24, 0x2f, 0x90, 0x6a, 0xb8, 0xf9, 0xd3, 0x25, 0x68, 0x27, 0x1f, 0xd0,
- 0xd0, 0x97, 0xd0, 0x4a, 0xfc, 0x90, 0x80, 0x5e, 0xca, 0x6f, 0x5a, 0xfe, 0x07, 0x07, 0xed, 0xe5,
- 0x11, 0x58, 0xf2, 0x8e, 0x35, 0x86, 0x0c, 0x98, 0x96, 0x4d, 0x6c, 0xb4, 0x72, 0x4c, 0x7f, 0x5b,
- 0x70, 0xbd, 0x34, 0xb2, 0x03, 0xae, 0x8f, 0x5d, 0xab, 0x21, 0x1f, 0xce, 0xe6, 0x7a, 0xca, 0xe8,
- 0x4a, 0x9e, 0xb6, 0xac, 0x63, 0xad, 0xbd, 0x56, 0x09, 0x37, 0xd6, 0x81, 0xc2, 0x7c, 0x41, 0x93,
- 0x18, 0xbd, 0x3e, 0x82, 0x4b, 0xaa, 0x51, 0xad, 0x5d, 0xad, 0x88, 0x1d, 0x4b, 0x7d, 0x02, 0x28,
- 0xdf, 0x41, 0x46, 0xaf, 0x8d, 0x64, 0x33, 0xec, 0x50, 0x6b, 0xaf, 0x57, 0x43, 0x2e, 0x55, 0x54,
- 0xf4, 0x96, 0x47, 0x2a, 0x9a, 0xea, 0x5e, 0x8f, 0x54, 0x34, 0xd3, 0xb0, 0x1e, 0x43, 0x87, 0x30,
- 0x97, 0xed, 0x3b, 0xa3, 0xb5, 0xb2, 0xbf, 0x5f, 0x72, 0x6d, 0x6d, 0xed, 0x4a, 0x15, 0xd4, 0x58,
- 0x18, 0x86, 0x33, 0xe9, 0x3e, 0x2f, 0x7a, 0x35, 0x4f, 0x5f, 0xd8, 0xe9, 0xd6, 0x56, 0x47, 0x23,
- 0x26, 0x75, 0xca, 0xf6, 0x7e, 0x8b, 0x74, 0x2a, 0x69, 0x2c, 0x17, 0xe9, 0x54, 0xd6, 0x4a, 0xd6,
- 0xc7, 0xd0, 0x37, 0xaa, 0xa1, 0x98, 0xe9, 0x89, 0xa2, 0xf5, 0x32, 0x36, 0xc5, 0x4d, 0x59, 0x6d,
- 0xa3, 0x32, 0x7e, 0x22, 0x1a, 0xbf, 0x84, 0x56, 0xa2, 0x35, 0x5a, 0x94, 0x3f, 0xf2, 0xcd, 0xd6,
- 0xa2, 0xfc, 0x51, 0xd4, 0x5f, 0x1d, 0x43, 0x7b, 0x30, 0x93, 0x6a, 0x96, 0xa2, 0x57, 0xca, 0x28,
- 0xd3, 0x6f, 0x8a, 0xda, 0xab, 0x23, 0xf1, 0x62, 0x19, 0xa6, 0xca, 0x88, 0x32, 0x05, 0x96, 0x2e,
- 0x2e, 0x9d, 0x03, 0x5f, 0x19, 0x85, 0x96, 0x0a, 0xe5, 0x5c, 0x4b, 0xb5, 0x30, 0x94, 0xcb, 0x5a,
- 0xb6, 0x85, 0xa1, 0x5c, 0xde, 0xa5, 0x1d, 0x43, 0x07, 0x30, 0x9b, 0x69, 0xa7, 0xa2, 0xd5, 0x32,
- 0x16, 0xd9, 0x56, 0xae, 0xb6, 0x56, 0x01, 0x33, 0x96, 0xf4, 0x43, 0x75, 0x81, 0xe7, 0x2e, 0x77,
- 0xb9, 0x9c, 0x74, 0xe8, 0x67, 0x2f, 0x1d, 0x8f, 0x14, 0xb3, 0xfe, 0x1a, 0x16, 0x8a, 0x5e, 0xd9,
- 0xd0, 0xd5, 0xa2, 0x67, 0x81, 0xd2, 0xa7, 0x3c, 0x6d, 0xbd, 0x2a, 0x7a, 0x2c, 0xf8, 0x53, 0x68,
- 0xa8, 0x96, 0x22, 0x2a, 0x38, 0x94, 0x32, 0x4d, 0x58, 0x4d, 0x3f, 0x0e, 0x25, 0x11, 0x2a, 0x3d,
- 0x95, 0x15, 0x86, 0xbd, 0xbe, 0xf2, 0xac, 0x90, 0xeb, 0x4a, 0x96, 0x67, 0x85, 0x7c, 0xeb, 0x90,
- 0x8b, 0x8b, 0xdd, 0x2e, 0xd9, 0x1a, 0x2b, 0x77, 0xbb, 0x82, 0xce, 0x5f, 0xb9, 0xdb, 0x15, 0x76,
- 0xdb, 0xc6, 0xd0, 0x4f, 0xd4, 0xef, 0x01, 0xd9, 0x8e, 0x18, 0x2a, 0xcd, 0x2d, 0x25, 0x9d, 0x39,
- 0xed, 0x5a, 0x75, 0x82, 0x58, 0xfc, 0x33, 0x95, 0x09, 0x33, 0x1d, 0xb1, 0xf2, 0x4c, 0x58, 0xdc,
- 0x97, 0xd3, 0x36, 0x2a, 0xe3, 0xe7, 0x83, 0x3c, 0xd9, 0x32, 0x2a, 0xb7, 0x76, 0x41, 0x97, 0xad,
- 0xdc, 0xda, 0x85, 0x5d, 0x28, 0x1e, 0x1f, 0x45, 0xed, 0xa0, 0xa2, 0xf8, 0x38, 0xa6, 0x5f, 0xa5,
- 0xad, 0x57, 0x45, 0x4f, 0x15, 0x0a, 0xf9, 0x7e, 0x0f, 0x1a, 0xb9, 0xfe, 0xd4, 0x19, 0x70, 0xb5,
- 0x22, 0x76, 0xf9, 0xee, 0xaa, 0x33, 0x61, 0xa4, 0x02, 0x99, 0xb3, 0x61, 0xa3, 0x32, 0x7e, 0x2c,
- 0x3b, 0x50, 0x3f, 0x9b, 0x24, 0x7a, 0x35, 0xe8, 0xca, 0x08, 0x3e, 0x89, 0x5e, 0x93, 0xf6, 0x5a,
- 0x25, 0xdc, 0xa2, 0xe8, 0x4d, 0x76, 0x4f, 0x8e, 0xf3, 0xa7, 0x5c, 0xcb, 0xe7, 0x38, 0x7f, 0x2a,
- 0x68, 0xc8, 0x14, 0x44, 0xaf, 0x6a, 0x9a, 0x8c, 0x8e, 0xde, 0x4c, 0xf3, 0x66, 0x74, 0xf4, 0xe6,
- 0xfa, 0x31, 0x63, 0xe8, 0x17, 0xc3, 0x9f, 0x10, 0xf2, 0x4f, 0x98, 0x68, 0xb3, 0x34, 0x15, 0x95,
- 0xbe, 0xdc, 0x6a, 0x6f, 0x9e, 0x88, 0x26, 0x61, 0xfc, 0x5f, 0xd7, 0x54, 0x47, 0xb3, 0xf0, 0x0d,
- 0x11, 0xbd, 0x55, 0x81, 0x71, 0xee, 0x19, 0x54, 0x7b, 0xfb, 0x84, 0x54, 0x89, 0x05, 0x3d, 0x80,
- 0x49, 0x7e, 0x77, 0x46, 0x17, 0x8e, 0xbf, 0x54, 0x6b, 0x17, 0x8b, 0xe7, 0xe3, 0xab, 0x21, 0xe3,
- 0xb6, 0x37, 0xc5, 0x7f, 0x67, 0x7f, 0xf3, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xdd, 0x00, 0x24,
- 0xb7, 0xe5, 0x2e, 0x00, 0x00,
+ 0xd1, 0x5c, 0x2e, 0x1f, 0xbb, 0xbd, 0x4b, 0x91, 0x1a, 0xca, 0xd4, 0x1a, 0xa2, 0x24, 0x0a, 0xf2,
+ 0x83, 0x94, 0x2d, 0x52, 0xa6, 0xed, 0xcf, 0xfa, 0xe4, 0xcf, 0xfe, 0x22, 0x51, 0xa2, 0x2c, 0x5b,
+ 0xa4, 0x6c, 0x90, 0x96, 0x9d, 0xd8, 0x15, 0x14, 0x08, 0xcc, 0x92, 0x30, 0xb1, 0x18, 0x08, 0x98,
+ 0xa5, 0xb5, 0x2a, 0xe7, 0x12, 0xa7, 0x2a, 0xa9, 0x4a, 0x25, 0x87, 0x54, 0x2e, 0x39, 0xe7, 0x9e,
+ 0x6b, 0xfe, 0x82, 0xff, 0x40, 0xaa, 0x72, 0xca, 0x25, 0xe7, 0x1c, 0x72, 0x4b, 0x55, 0x2e, 0xa9,
+ 0x79, 0x61, 0xf1, 0xe4, 0x82, 0x16, 0x53, 0xa9, 0xdc, 0x30, 0x3d, 0xfd, 0x98, 0xee, 0xe9, 0xee,
+ 0xe9, 0x99, 0x06, 0xcc, 0x1f, 0x11, 0xaf, 0xdf, 0xc3, 0x66, 0x84, 0xc3, 0x23, 0x1c, 0xae, 0x06,
+ 0x21, 0xa1, 0x04, 0xcd, 0xa5, 0x80, 0x66, 0xb0, 0xa7, 0xaf, 0x01, 0xba, 0x63, 0x51, 0xfb, 0xe0,
+ 0x2e, 0xf6, 0x30, 0xc5, 0x06, 0x7e, 0xd2, 0xc7, 0x11, 0x45, 0x2f, 0x42, 0xa3, 0xeb, 0x7a, 0xd8,
+ 0x74, 0x9d, 0xa8, 0x53, 0x5b, 0xaa, 0x2f, 0x37, 0x8d, 0x69, 0x36, 0x7e, 0xe0, 0x44, 0xfa, 0x23,
+ 0x98, 0x4f, 0x11, 0x44, 0x01, 0xf1, 0x23, 0x8c, 0x6e, 0xc2, 0x74, 0x88, 0xa3, 0xbe, 0x47, 0x05,
+ 0x41, 0x6b, 0xfd, 0xd2, 0x6a, 0x56, 0xd6, 0x6a, 0x4c, 0xd2, 0xf7, 0xa8, 0xa1, 0xd0, 0xf5, 0x6f,
+ 0x6b, 0xd0, 0x4e, 0xce, 0xa0, 0xf3, 0x30, 0x2d, 0x85, 0x77, 0x6a, 0x4b, 0xb5, 0xe5, 0xa6, 0x31,
+ 0x25, 0x64, 0xa3, 0x05, 0x98, 0x8a, 0xa8, 0x45, 0xfb, 0x51, 0x67, 0x7c, 0xa9, 0xb6, 0x3c, 0x69,
+ 0xc8, 0x11, 0x3a, 0x07, 0x93, 0x38, 0x0c, 0x49, 0xd8, 0xa9, 0x73, 0x74, 0x31, 0x40, 0x08, 0x26,
+ 0x22, 0xf7, 0x19, 0xee, 0x4c, 0x2c, 0xd5, 0x96, 0x67, 0x0c, 0xfe, 0x8d, 0x3a, 0x30, 0x7d, 0x84,
+ 0xc3, 0xc8, 0x25, 0x7e, 0x67, 0x92, 0x83, 0xd5, 0x50, 0xdf, 0x84, 0xb9, 0x5d, 0x3b, 0x90, 0xfa,
+ 0x7f, 0x80, 0x2d, 0x07, 0x87, 0x68, 0x1d, 0xea, 0xfb, 0x98, 0xf2, 0x45, 0xb4, 0xd6, 0x97, 0xf2,
+ 0xfa, 0x6c, 0xba, 0x1e, 0xbe, 0x8f, 0xa9, 0x24, 0x32, 0x18, 0xb2, 0xfe, 0x21, 0x9c, 0x49, 0x83,
+ 0xcb, 0xd5, 0xb9, 0x0c, 0x2d, 0xcb, 0xb6, 0x71, 0x40, 0xcd, 0xfd, 0x67, 0x6e, 0xc0, 0x75, 0x6a,
+ 0x18, 0x20, 0x40, 0xf7, 0x9f, 0xb9, 0x81, 0xfe, 0xf3, 0x3a, 0xcc, 0xc6, 0xcc, 0xa4, 0x9d, 0x11,
+ 0x4c, 0x38, 0x16, 0xb5, 0x38, 0xab, 0xb6, 0xc1, 0xbf, 0xd1, 0xcb, 0x70, 0xc6, 0x26, 0x3e, 0xc5,
+ 0x3e, 0x35, 0x3d, 0xec, 0xef, 0xd3, 0x03, 0xce, 0x6b, 0xc6, 0x98, 0x91, 0xd0, 0x87, 0x1c, 0x88,
+ 0xae, 0x40, 0x5b, 0xa1, 0xd1, 0x41, 0x80, 0xa5, 0xb5, 0x5a, 0x12, 0xb6, 0x3b, 0x08, 0x30, 0xba,
+ 0x0a, 0x33, 0x9e, 0x15, 0x51, 0xb3, 0x47, 0x1c, 0xb7, 0xeb, 0x62, 0x87, 0x1b, 0x6f, 0xc2, 0x68,
+ 0x33, 0xe0, 0x96, 0x84, 0x21, 0x4d, 0x38, 0x87, 0x6f, 0xf5, 0x30, 0xb7, 0x62, 0xd3, 0x88, 0xc7,
+ 0x6c, 0x79, 0x98, 0x5a, 0xfb, 0x9d, 0x29, 0x0e, 0xe7, 0xdf, 0xe8, 0x22, 0x80, 0x1b, 0x71, 0x1d,
+ 0x03, 0xec, 0x74, 0xa6, 0xb9, 0x9a, 0x4d, 0x37, 0xba, 0x2f, 0x00, 0xe8, 0x03, 0x98, 0x3e, 0xe0,
+ 0xf6, 0x8e, 0x3a, 0x0d, 0xee, 0x39, 0xab, 0xc7, 0x58, 0x5a, 0x58, 0x61, 0x55, 0x6c, 0x50, 0x74,
+ 0xcf, 0xa7, 0xe1, 0xc0, 0x50, 0xe4, 0x68, 0x11, 0x9a, 0x7c, 0xeb, 0x37, 0x88, 0x83, 0x3b, 0x4d,
+ 0xee, 0x22, 0x43, 0x80, 0x76, 0x0b, 0xda, 0x49, 0x32, 0x34, 0x07, 0xf5, 0x43, 0x3c, 0x90, 0x7b,
+ 0xc2, 0x3e, 0x99, 0x1f, 0x1d, 0x59, 0x5e, 0x1f, 0x73, 0xf3, 0x35, 0x0d, 0x31, 0xb8, 0x35, 0x7e,
+ 0xb3, 0xa6, 0x4f, 0xc3, 0xe4, 0xbd, 0x5e, 0x40, 0x07, 0xfa, 0x3b, 0xd0, 0x79, 0x6c, 0xd9, 0xfd,
+ 0x7e, 0xef, 0x31, 0x5f, 0xe2, 0xc6, 0x01, 0xb6, 0x0f, 0xd5, 0x46, 0x5f, 0x80, 0xa6, 0x5c, 0xb8,
+ 0xdc, 0xea, 0x19, 0xa3, 0x21, 0x00, 0x0f, 0x1c, 0xfd, 0x07, 0xf0, 0x62, 0x01, 0xa1, 0xdc, 0xd4,
+ 0xab, 0x30, 0xb3, 0x6f, 0x85, 0x7b, 0xd6, 0x3e, 0x36, 0x43, 0x8b, 0xba, 0x84, 0x53, 0xd7, 0x8c,
+ 0xb6, 0x04, 0x1a, 0x0c, 0xa6, 0x7f, 0x01, 0x5a, 0x8a, 0x03, 0xe9, 0x05, 0x96, 0x4d, 0xab, 0x08,
+ 0x47, 0x4b, 0xd0, 0x0a, 0x42, 0x6c, 0x79, 0x1e, 0xb1, 0x2d, 0x2a, 0xd4, 0xab, 0x1b, 0x49, 0x90,
+ 0x7e, 0x11, 0x2e, 0x14, 0x32, 0x17, 0x0b, 0xd4, 0x6f, 0x66, 0x56, 0x4f, 0x7a, 0x3d, 0xb7, 0x92,
+ 0x68, 0x7d, 0x31, 0xb7, 0x6a, 0x4e, 0x29, 0xf9, 0xfe, 0x6f, 0x66, 0xd6, 0xc3, 0x96, 0xdf, 0x0f,
+ 0x2a, 0x31, 0xce, 0xae, 0x58, 0x91, 0xc6, 0x9c, 0xcf, 0x8b, 0xa4, 0xb2, 0x41, 0x3c, 0x0f, 0xdb,
+ 0xd4, 0x25, 0xbe, 0x62, 0x7b, 0x09, 0xc0, 0x8e, 0x81, 0x72, 0xff, 0x13, 0x10, 0x5d, 0x83, 0x4e,
+ 0x9e, 0x54, 0xb2, 0xfd, 0x4b, 0x0d, 0x5e, 0xb8, 0x2d, 0x8d, 0x26, 0x04, 0x57, 0xda, 0x80, 0xb4,
+ 0xc8, 0xf1, 0xac, 0xc8, 0xec, 0x06, 0xd5, 0x73, 0x1b, 0xc4, 0x30, 0x42, 0x1c, 0x78, 0xae, 0x6d,
+ 0x71, 0x16, 0x13, 0x22, 0x76, 0x13, 0x20, 0xe6, 0xcf, 0x94, 0x7a, 0x32, 0x22, 0xd9, 0x27, 0x5a,
+ 0x87, 0x85, 0x1e, 0xee, 0x91, 0x70, 0x60, 0xf6, 0xac, 0xc0, 0xec, 0x59, 0x4f, 0x4d, 0x96, 0x04,
+ 0xcd, 0xde, 0x1e, 0x0f, 0xcf, 0x19, 0x03, 0x89, 0xd9, 0x2d, 0x2b, 0xd8, 0xb2, 0x9e, 0xee, 0xb8,
+ 0xcf, 0xf0, 0xd6, 0x9e, 0xde, 0x81, 0x85, 0xac, 0x7e, 0x52, 0xf5, 0xff, 0x81, 0xf3, 0x02, 0xb2,
+ 0x33, 0xf0, 0xed, 0x1d, 0x9e, 0x79, 0x2b, 0x6d, 0xd4, 0x3f, 0x6b, 0xd0, 0xc9, 0x13, 0x4a, 0xcf,
+ 0x7f, 0x5e, 0xab, 0x9d, 0xd8, 0x26, 0x97, 0xa1, 0x45, 0x2d, 0xd7, 0x33, 0x49, 0xb7, 0x1b, 0x61,
+ 0xca, 0x0d, 0x31, 0x61, 0x00, 0x03, 0x3d, 0xe2, 0x10, 0xb4, 0x02, 0x73, 0xb6, 0xf0, 0x7e, 0x33,
+ 0xc4, 0x47, 0x2e, 0x3f, 0x2b, 0xa6, 0xf9, 0xc2, 0x66, 0x6d, 0x15, 0x15, 0x02, 0x8c, 0x74, 0x98,
+ 0x71, 0x9d, 0xa7, 0x26, 0xcf, 0xee, 0xfc, 0xa8, 0x69, 0x70, 0x6e, 0x2d, 0xd7, 0x79, 0xca, 0x12,
+ 0x16, 0xb3, 0xa8, 0xfe, 0x18, 0x16, 0x85, 0xf2, 0x0f, 0x7c, 0x3b, 0xc4, 0x3d, 0xec, 0x53, 0xcb,
+ 0xdb, 0x20, 0xc1, 0xa0, 0x92, 0xdb, 0xbc, 0x08, 0x8d, 0xc8, 0xf5, 0x6d, 0x6c, 0xfa, 0xe2, 0xc8,
+ 0x9b, 0x30, 0xa6, 0xf9, 0x78, 0x3b, 0xd2, 0xef, 0xc0, 0xc5, 0x12, 0xbe, 0xd2, 0xb2, 0x57, 0xa0,
+ 0xcd, 0x17, 0x26, 0xd3, 0xbb, 0x3c, 0x30, 0x5a, 0x0c, 0xb6, 0x21, 0x40, 0xfa, 0x1b, 0x80, 0x04,
+ 0x8f, 0x2d, 0xd2, 0xf7, 0xab, 0x85, 0xf3, 0x0b, 0x30, 0x9f, 0x22, 0x91, 0xbe, 0xf1, 0x26, 0x9c,
+ 0x13, 0xe0, 0x4f, 0xfd, 0x5e, 0x65, 0x5e, 0xe7, 0xe1, 0x85, 0x0c, 0x91, 0xe4, 0xb6, 0xae, 0x84,
+ 0xa4, 0x8b, 0x92, 0x63, 0x99, 0x2d, 0xa8, 0x15, 0xa4, 0xeb, 0x12, 0x9e, 0xb9, 0xc4, 0x82, 0xad,
+ 0xf0, 0xd0, 0xc0, 0x96, 0x43, 0x7c, 0x6f, 0x50, 0x39, 0x73, 0x15, 0x50, 0x4a, 0xbe, 0x9f, 0xc1,
+ 0x82, 0xca, 0x68, 0x7e, 0xd7, 0xdd, 0xef, 0x87, 0xb8, 0x6a, 0x26, 0x4e, 0xba, 0xec, 0x78, 0xce,
+ 0x65, 0xf5, 0x35, 0x15, 0x66, 0x09, 0xc6, 0x72, 0x4b, 0xe3, 0x3a, 0xa7, 0x96, 0xa8, 0x73, 0xf4,
+ 0x3f, 0xd4, 0xe0, 0xac, 0xa2, 0xa8, 0xe8, 0x57, 0x27, 0x0c, 0xac, 0x7a, 0x69, 0x60, 0x4d, 0x0c,
+ 0x03, 0x6b, 0x19, 0xe6, 0x22, 0xd2, 0x0f, 0x6d, 0x6c, 0xb2, 0x9a, 0xc4, 0xf4, 0xd9, 0x19, 0x2c,
+ 0xe2, 0xee, 0x8c, 0x80, 0xdf, 0xb5, 0xa8, 0xb5, 0x4d, 0x1c, 0xac, 0xff, 0xbf, 0x72, 0xbb, 0x94,
+ 0xbf, 0xae, 0xc0, 0x59, 0x5e, 0x7a, 0x58, 0x41, 0x80, 0x7d, 0xc7, 0xb4, 0x28, 0x73, 0xfa, 0x1a,
+ 0x77, 0xfa, 0x33, 0x6c, 0xe2, 0x36, 0x87, 0xdf, 0xa6, 0xdb, 0x91, 0xfe, 0xdb, 0x71, 0x98, 0x65,
+ 0xb4, 0x2c, 0xc8, 0x2a, 0xe9, 0x3b, 0x07, 0x75, 0xfc, 0x94, 0x4a, 0x45, 0xd9, 0x27, 0x5a, 0x83,
+ 0x79, 0x19, 0xcd, 0x2e, 0xf1, 0x87, 0x81, 0x5e, 0x17, 0x79, 0x71, 0x38, 0x15, 0xc7, 0xfa, 0x65,
+ 0x68, 0x45, 0x94, 0x04, 0x2a, 0x6f, 0x88, 0xba, 0x08, 0x18, 0x48, 0xe6, 0x8d, 0xb4, 0x4d, 0x27,
+ 0x0b, 0x6c, 0xda, 0x76, 0x23, 0x13, 0xdb, 0xa6, 0x58, 0x15, 0xcf, 0x3c, 0x0d, 0x03, 0xdc, 0xe8,
+ 0x9e, 0x2d, 0xac, 0x81, 0xde, 0x87, 0x45, 0x77, 0xdf, 0x27, 0x21, 0x36, 0xa5, 0x21, 0x79, 0xfc,
+ 0xfa, 0x84, 0x9a, 0x5d, 0xd2, 0xf7, 0x55, 0xe5, 0xd4, 0x11, 0x38, 0x3b, 0x1c, 0x85, 0x59, 0x60,
+ 0x9b, 0xd0, 0x4d, 0x36, 0xaf, 0xbf, 0x0d, 0x73, 0x43, 0xab, 0x54, 0xcf, 0x02, 0xdf, 0xd6, 0x94,
+ 0xc7, 0xed, 0x5a, 0xae, 0xb7, 0x83, 0x7d, 0x07, 0x87, 0xcf, 0x99, 0x9d, 0xd0, 0x0d, 0x38, 0xe7,
+ 0x3a, 0x1e, 0x36, 0xa9, 0xdb, 0xc3, 0xa4, 0x4f, 0xcd, 0x08, 0xdb, 0xc4, 0x77, 0x22, 0x65, 0x5f,
+ 0x36, 0xb7, 0x2b, 0xa6, 0x76, 0xc4, 0x8c, 0xfe, 0xb3, 0xf8, 0x94, 0x48, 0xae, 0x62, 0x58, 0x1f,
+ 0xf9, 0x18, 0x33, 0x86, 0xa2, 0xd4, 0x93, 0x6a, 0xb4, 0x05, 0x50, 0x56, 0xeb, 0x97, 0xa1, 0x25,
+ 0x91, 0xf6, 0x88, 0x33, 0xe0, 0x2b, 0x6a, 0x1b, 0x20, 0x40, 0x77, 0x88, 0x33, 0xe0, 0xe9, 0x3a,
+ 0x32, 0xb9, 0x93, 0xd9, 0x07, 0x7d, 0xff, 0x90, 0xaf, 0xa6, 0x61, 0xb4, 0xdc, 0xe8, 0xa1, 0x15,
+ 0xd1, 0x0d, 0x06, 0xd2, 0xff, 0x58, 0x53, 0xf9, 0x82, 0x2d, 0xc3, 0xc0, 0x36, 0x76, 0x8f, 0xfe,
+ 0x03, 0xe6, 0x60, 0x14, 0xd2, 0x09, 0x52, 0xb5, 0xb0, 0x0c, 0x38, 0x24, 0xe6, 0xe4, 0xa9, 0xca,
+ 0x67, 0x86, 0xe9, 0x2a, 0xbd, 0x70, 0x99, 0xae, 0xbe, 0x54, 0xc7, 0xc5, 0x3d, 0x7b, 0xe7, 0xc0,
+ 0x0a, 0x9d, 0xe8, 0x3e, 0xf6, 0x71, 0x68, 0xd1, 0x53, 0x29, 0x5f, 0xf4, 0x25, 0xb8, 0x54, 0xc6,
+ 0x5d, 0xca, 0xff, 0x42, 0x1d, 0x83, 0x0a, 0xc3, 0xc0, 0x7b, 0x7d, 0xd7, 0x73, 0x4e, 0x45, 0xfc,
+ 0x47, 0x59, 0xe5, 0x62, 0xe6, 0xd2, 0x7f, 0xae, 0xc1, 0xd9, 0x90, 0x83, 0xa8, 0x19, 0x31, 0x84,
+ 0xf8, 0x5e, 0x3b, 0x63, 0xcc, 0xca, 0x09, 0x4e, 0xc8, 0xee, 0xb7, 0xbf, 0x1c, 0x57, 0x1e, 0xa0,
+ 0xb8, 0x9d, 0x5a, 0x5a, 0xbd, 0x00, 0xcd, 0xa1, 0xf8, 0x3a, 0x17, 0xdf, 0x88, 0xa4, 0x5c, 0xe6,
+ 0x9d, 0x36, 0x09, 0x06, 0x26, 0xb6, 0x45, 0x45, 0xc1, 0xb7, 0xba, 0xc1, 0xae, 0x67, 0xc1, 0xe0,
+ 0x9e, 0xcd, 0x0b, 0x8a, 0xea, 0x39, 0x36, 0xc1, 0xed, 0x2b, 0xc1, 0x6d, 0x2a, 0xc9, 0xed, 0x2b,
+ 0xce, 0x4d, 0xe1, 0x1c, 0xb9, 0x5d, 0x81, 0x33, 0x3d, 0xc4, 0x79, 0xec, 0x76, 0x19, 0xce, 0xd0,
+ 0xab, 0xd2, 0xc6, 0x90, 0xbb, 0xfa, 0x35, 0x5c, 0x48, 0xcf, 0x56, 0x3f, 0xb0, 0x9f, 0xcb, 0x58,
+ 0xfa, 0xa5, 0xac, 0x3b, 0x65, 0x4e, 0xfd, 0xa3, 0xec, 0xb2, 0x2b, 0x57, 0x38, 0xcf, 0xb7, 0xae,
+ 0x8b, 0x59, 0x83, 0xa4, 0xcb, 0xa4, 0xcf, 0xb3, 0xcb, 0x3e, 0x41, 0xb9, 0x74, 0xbc, 0xe0, 0xcb,
+ 0xd9, 0x10, 0xc8, 0xd6, 0x54, 0xbf, 0x8b, 0xf3, 0xab, 0xc4, 0x60, 0x15, 0x4d, 0xe5, 0xbc, 0x26,
+ 0xe5, 0xca, 0x77, 0x85, 0x69, 0x29, 0x16, 0x2d, 0xc0, 0x94, 0x3c, 0x0f, 0xc5, 0x8d, 0x45, 0x8e,
+ 0x52, 0x4f, 0x2f, 0x75, 0xf9, 0xf4, 0xa2, 0x9e, 0x94, 0xd8, 0x9d, 0x7b, 0x52, 0xa4, 0x47, 0x36,
+ 0xfe, 0x08, 0x0f, 0xf4, 0xed, 0x4c, 0xc4, 0x89, 0xa5, 0x1d, 0xf3, 0xe0, 0x21, 0x5e, 0x14, 0x1c,
+ 0xbe, 0xe7, 0x8e, 0x7c, 0x38, 0x69, 0xba, 0xd2, 0x09, 0x1c, 0xfd, 0x57, 0xb5, 0x21, 0xc3, 0x3b,
+ 0x1e, 0xd9, 0x3b, 0x45, 0xaf, 0x4c, 0x6a, 0x51, 0x4f, 0x69, 0x91, 0x7c, 0x5b, 0x9a, 0x48, 0xbf,
+ 0x2d, 0x25, 0x82, 0x28, 0xb9, 0x9c, 0xb2, 0xd4, 0xbc, 0x4b, 0x4e, 0xef, 0x66, 0x99, 0x4f, 0xcd,
+ 0x43, 0xee, 0x52, 0xfe, 0x2d, 0xb8, 0xc0, 0x0c, 0x2e, 0xa0, 0xfc, 0xde, 0x52, 0xfd, 0x6e, 0xf7,
+ 0xb7, 0x71, 0x58, 0x2c, 0x26, 0xae, 0x72, 0xbf, 0x7b, 0x17, 0xb4, 0xf8, 0xfe, 0xc4, 0x8e, 0xc6,
+ 0x88, 0x5a, 0xbd, 0x20, 0x3e, 0x1c, 0xc5, 0x19, 0x7a, 0x5e, 0x5e, 0xa6, 0x76, 0xd5, 0xbc, 0x3a,
+ 0x21, 0x73, 0x97, 0xaf, 0x7a, 0xee, 0xf2, 0xc5, 0x04, 0x38, 0x16, 0x2d, 0x13, 0x20, 0x6a, 0xb8,
+ 0xf3, 0x8e, 0x45, 0xcb, 0x04, 0xc4, 0xc4, 0x5c, 0x80, 0xf0, 0xda, 0x96, 0xc4, 0xe7, 0x02, 0x2e,
+ 0x02, 0xc8, 0xf2, 0xaa, 0xef, 0xab, 0xcb, 0x64, 0x53, 0x14, 0x57, 0x7d, 0xbf, 0xb4, 0xca, 0x9c,
+ 0x2e, 0xad, 0x32, 0xd3, 0xbb, 0xd9, 0xc8, 0xed, 0xe6, 0xe7, 0x00, 0x77, 0xdd, 0xe8, 0x50, 0x18,
+ 0x99, 0x95, 0xb5, 0x8e, 0xab, 0x6e, 0x03, 0xec, 0x93, 0x41, 0x2c, 0xcf, 0x93, 0xa6, 0x63, 0x9f,
+ 0x2c, 0x7c, 0xfa, 0x11, 0x76, 0xa4, 0x75, 0xf8, 0x37, 0x83, 0x75, 0x43, 0x8c, 0xa5, 0x01, 0xf8,
+ 0xb7, 0xfe, 0xfb, 0x1a, 0x34, 0xb7, 0x70, 0x4f, 0x72, 0xbe, 0x04, 0xb0, 0x4f, 0x42, 0xd2, 0xa7,
+ 0xae, 0x8f, 0x45, 0x15, 0x3e, 0x69, 0x24, 0x20, 0xdf, 0x5f, 0x0e, 0x4f, 0x0d, 0xd8, 0xeb, 0x4a,
+ 0x63, 0xf2, 0x6f, 0x06, 0x3b, 0xc0, 0x56, 0x20, 0xed, 0xc7, 0xbf, 0xd9, 0x5d, 0x27, 0xa2, 0x96,
+ 0x7d, 0xc8, 0x8d, 0x35, 0x61, 0x88, 0x81, 0xfe, 0xe7, 0x1a, 0x80, 0x81, 0x7b, 0x84, 0x72, 0x5f,
+ 0x63, 0xd5, 0xed, 0x9e, 0x65, 0x1f, 0xb2, 0xfb, 0x02, 0x7f, 0xd1, 0x14, 0x96, 0x68, 0x49, 0x18,
+ 0x7f, 0xd1, 0xbc, 0x08, 0xa0, 0x50, 0x64, 0xfe, 0x6a, 0x1a, 0x4d, 0x09, 0x11, 0x37, 0x03, 0x15,
+ 0xca, 0xf2, 0x11, 0x70, 0x98, 0xd3, 0xc4, 0xb2, 0x55, 0x4e, 0xbb, 0x00, 0xcd, 0xac, 0x2b, 0xf0,
+ 0x54, 0xc0, 0xfd, 0xe0, 0x2a, 0xcc, 0xa8, 0x27, 0x53, 0xee, 0x68, 0x52, 0x95, 0xb6, 0x02, 0x32,
+ 0xe7, 0xe2, 0xcf, 0x93, 0x4f, 0x29, 0xf6, 0x63, 0x1f, 0x68, 0x1a, 0x43, 0x80, 0xfe, 0x0d, 0x80,
+ 0xba, 0xd0, 0x77, 0x09, 0x5a, 0x87, 0x49, 0xc6, 0x5c, 0x3d, 0xa6, 0x2f, 0xe6, 0x9f, 0x44, 0x87,
+ 0x66, 0x30, 0x04, 0x6a, 0x32, 0x01, 0x8d, 0xa7, 0x12, 0xd0, 0xe8, 0xfb, 0x9c, 0xfe, 0x5d, 0x0d,
+ 0x96, 0x64, 0xf9, 0xe8, 0xe2, 0x70, 0x8b, 0x1c, 0xb1, 0x52, 0x62, 0x97, 0x08, 0x21, 0xa7, 0x92,
+ 0x39, 0x6f, 0x42, 0xc7, 0xc1, 0x11, 0x75, 0x7d, 0x2e, 0xd0, 0x54, 0x9b, 0xc2, 0x5f, 0x91, 0xc5,
+ 0x82, 0x16, 0x12, 0xf3, 0x77, 0xc4, 0xf4, 0xb6, 0xd5, 0xc3, 0xe8, 0x3a, 0xcc, 0x1f, 0x62, 0x1c,
+ 0x98, 0x1e, 0xb1, 0x2d, 0xcf, 0x54, 0x31, 0x29, 0xeb, 0xa3, 0x39, 0x36, 0xf5, 0x90, 0xcd, 0xdc,
+ 0x15, 0x71, 0xa9, 0x47, 0x70, 0xe5, 0x18, 0x4d, 0x64, 0x5e, 0x5a, 0x84, 0x66, 0x10, 0x12, 0x1b,
+ 0x47, 0xcc, 0x67, 0x6b, 0xfc, 0x98, 0x1a, 0x02, 0xd0, 0x0d, 0x98, 0x8f, 0x07, 0x1f, 0xe3, 0xd0,
+ 0xc6, 0x3e, 0xb5, 0xf6, 0xc5, 0xbb, 0xe9, 0xb8, 0x51, 0x34, 0xa5, 0xff, 0xa6, 0x06, 0x7a, 0x4e,
+ 0xea, 0x66, 0x48, 0x7a, 0xa7, 0x68, 0xc1, 0x35, 0x38, 0xc7, 0xed, 0x10, 0x72, 0x96, 0x43, 0x43,
+ 0x88, 0x6b, 0xcc, 0x59, 0x36, 0x27, 0xa4, 0x29, 0x4b, 0xf4, 0xe1, 0xea, 0xb1, 0x6b, 0xfa, 0x37,
+ 0xd9, 0xe2, 0x1f, 0x6d, 0x68, 0x7f, 0xd2, 0xc7, 0xe1, 0x20, 0xf1, 0xe0, 0x1a, 0x61, 0xa9, 0x85,
+ 0xea, 0x27, 0x25, 0x20, 0x2c, 0xd3, 0x76, 0x43, 0xd2, 0x33, 0xe3, 0x96, 0xd3, 0x38, 0x47, 0x69,
+ 0x31, 0xe0, 0xa6, 0x68, 0x3b, 0xa1, 0xf7, 0x60, 0xaa, 0xeb, 0x7a, 0x14, 0x8b, 0x26, 0x4f, 0x6b,
+ 0xfd, 0xe5, 0x7c, 0x44, 0x24, 0x65, 0xae, 0x6e, 0x72, 0x64, 0x43, 0x12, 0xa1, 0x3d, 0x98, 0x77,
+ 0xfd, 0x80, 0x5f, 0xbd, 0x42, 0xd7, 0xf2, 0xdc, 0x67, 0xc3, 0x27, 0xc3, 0xd6, 0xfa, 0x1b, 0x23,
+ 0x78, 0x3d, 0x60, 0x94, 0x3b, 0x49, 0x42, 0x03, 0xb9, 0x39, 0x18, 0xc2, 0x70, 0x8e, 0xf4, 0x69,
+ 0x5e, 0xc8, 0x24, 0x17, 0xb2, 0x3e, 0x42, 0xc8, 0x23, 0x4e, 0x9a, 0x96, 0x32, 0x4f, 0xf2, 0x40,
+ 0x6d, 0x1b, 0xa6, 0x84, 0x72, 0x2c, 0x47, 0x76, 0x5d, 0xec, 0xa9, 0xbe, 0x92, 0x18, 0xb0, 0x34,
+ 0x40, 0x02, 0x1c, 0x5a, 0xbe, 0x4a, 0x77, 0x6a, 0x38, 0xec, 0x6f, 0xd4, 0x13, 0xfd, 0x0d, 0xed,
+ 0x4f, 0x93, 0x80, 0xf2, 0x1a, 0xaa, 0x77, 0xd0, 0x10, 0x47, 0x2c, 0x85, 0x24, 0xf3, 0xeb, 0x6c,
+ 0x02, 0xce, 0x73, 0xec, 0x67, 0xd0, 0xb4, 0xa3, 0x23, 0x93, 0x9b, 0x84, 0xcb, 0x6c, 0xad, 0xdf,
+ 0x3a, 0xb1, 0x49, 0x57, 0x37, 0x76, 0x1e, 0x73, 0xa8, 0xd1, 0xb0, 0xa3, 0x23, 0xfe, 0x85, 0x7e,
+ 0x04, 0xf0, 0x55, 0x44, 0x7c, 0xc9, 0x59, 0x6c, 0xfc, 0xbb, 0x27, 0xe7, 0xfc, 0xe1, 0xce, 0xa3,
+ 0x6d, 0xc1, 0xba, 0xc9, 0xd8, 0x09, 0xde, 0x36, 0xcc, 0x04, 0x56, 0xf8, 0xa4, 0x8f, 0xa9, 0x64,
+ 0x2f, 0x7c, 0xe1, 0xfd, 0x93, 0xb3, 0xff, 0x58, 0xb0, 0x11, 0x12, 0xda, 0x41, 0x62, 0xa4, 0x7d,
+ 0x37, 0x0e, 0x0d, 0xa5, 0x17, 0xbb, 0xbd, 0x71, 0x0f, 0x17, 0x6f, 0x18, 0xa6, 0xeb, 0x77, 0x89,
+ 0xb4, 0xe8, 0x19, 0x06, 0x17, 0xcf, 0x18, 0x3c, 0xfb, 0xaf, 0xc0, 0x5c, 0x88, 0x6d, 0x12, 0x3a,
+ 0xac, 0xc6, 0x75, 0x7b, 0x2e, 0x73, 0x7b, 0xb1, 0x97, 0xb3, 0x02, 0x7e, 0x57, 0x81, 0xd1, 0xab,
+ 0x30, 0xcb, 0xb7, 0x3d, 0x81, 0x59, 0x57, 0x3c, 0xb1, 0x97, 0x40, 0x5c, 0x81, 0xb9, 0x27, 0x7d,
+ 0x96, 0x37, 0xec, 0x03, 0x2b, 0xb4, 0x6c, 0x4a, 0xe2, 0xd7, 0x84, 0x59, 0x0e, 0xdf, 0x88, 0xc1,
+ 0xe8, 0x2d, 0x58, 0x10, 0xa8, 0x38, 0xb2, 0xad, 0x20, 0xa6, 0xc0, 0xa1, 0xbc, 0x6c, 0x9e, 0xe3,
+ 0xb3, 0xf7, 0xf8, 0xe4, 0x86, 0x9a, 0x43, 0x1a, 0x34, 0x6c, 0xd2, 0xeb, 0x61, 0x9f, 0x46, 0xb2,
+ 0xfd, 0x17, 0x8f, 0xd1, 0x6d, 0xb8, 0x68, 0x79, 0x1e, 0xf9, 0xda, 0xe4, 0x94, 0x8e, 0x99, 0xd3,
+ 0x4e, 0x5c, 0x3d, 0x35, 0x8e, 0xf4, 0x09, 0xc7, 0x31, 0xd2, 0x8a, 0x6a, 0x97, 0xa1, 0x19, 0xef,
+ 0x23, 0xab, 0x18, 0x12, 0x0e, 0xc9, 0xbf, 0xb5, 0x33, 0xd0, 0x4e, 0xee, 0x84, 0xf6, 0xf7, 0x3a,
+ 0xcc, 0x17, 0x04, 0x15, 0xfa, 0x02, 0x80, 0x79, 0xab, 0x08, 0x2d, 0xe9, 0xae, 0xff, 0x77, 0xf2,
+ 0xe0, 0x64, 0xfe, 0x2a, 0xc0, 0x06, 0xf3, 0x7e, 0xf1, 0x89, 0x7e, 0x0c, 0x2d, 0xee, 0xb1, 0x92,
+ 0xbb, 0x70, 0xd9, 0xf7, 0xbe, 0x07, 0x77, 0xa6, 0xab, 0x64, 0xcf, 0x63, 0x40, 0x7c, 0x6b, 0x7f,
+ 0xad, 0x41, 0x33, 0x16, 0xcc, 0xea, 0x1f, 0xb1, 0x51, 0x7c, 0xaf, 0x23, 0x55, 0xff, 0x70, 0xd8,
+ 0x26, 0x07, 0xfd, 0x57, 0xba, 0x92, 0xf6, 0x0e, 0xc0, 0x50, 0xff, 0x42, 0x15, 0x6a, 0x85, 0x2a,
+ 0xe8, 0x2b, 0x30, 0xc3, 0x2c, 0xeb, 0x62, 0x67, 0x87, 0x86, 0x6e, 0xc0, 0x1b, 0xfe, 0x02, 0x27,
+ 0x92, 0x17, 0x48, 0x35, 0x5c, 0xff, 0xe9, 0x22, 0xb4, 0x93, 0x0f, 0x68, 0xe8, 0x4b, 0x68, 0x25,
+ 0x7e, 0x6c, 0x40, 0x2f, 0xe5, 0x37, 0x2d, 0xff, 0xa3, 0x84, 0xf6, 0xf2, 0x08, 0x2c, 0x79, 0xc7,
+ 0x1a, 0x43, 0x06, 0x4c, 0xcb, 0x26, 0x36, 0x1a, 0xf9, 0x27, 0x81, 0x76, 0x65, 0x64, 0x07, 0x5c,
+ 0x1f, 0xbb, 0x51, 0x43, 0x3e, 0x9c, 0xcd, 0xf5, 0x94, 0xd1, 0xb5, 0x3c, 0x6d, 0x59, 0xc7, 0x5a,
+ 0x7b, 0xad, 0x12, 0x6e, 0xac, 0x03, 0x85, 0xf9, 0x82, 0x26, 0x31, 0x7a, 0x7d, 0x04, 0x97, 0x54,
+ 0xa3, 0x5a, 0xbb, 0x5e, 0x11, 0x3b, 0x96, 0xfa, 0x04, 0x50, 0xbe, 0x83, 0x8c, 0x5e, 0x1b, 0xc9,
+ 0x66, 0xd8, 0xa1, 0xd6, 0x5e, 0xaf, 0x86, 0x5c, 0xaa, 0xa8, 0xe8, 0x2d, 0x8f, 0x54, 0x34, 0xd5,
+ 0xbd, 0x1e, 0xa9, 0x68, 0xa6, 0x61, 0x3d, 0x86, 0x0e, 0x61, 0x2e, 0xdb, 0x77, 0x46, 0x2b, 0x65,
+ 0x7f, 0xd1, 0xe4, 0xda, 0xda, 0xda, 0xb5, 0x2a, 0xa8, 0xb1, 0x30, 0x0c, 0x67, 0xd2, 0x7d, 0x5e,
+ 0xf4, 0x6a, 0x9e, 0xbe, 0xb0, 0xd3, 0xad, 0x2d, 0x8f, 0x46, 0x4c, 0xea, 0x94, 0xed, 0xfd, 0x16,
+ 0xe9, 0x54, 0xd2, 0x58, 0x2e, 0xd2, 0xa9, 0xac, 0x95, 0xac, 0x8f, 0xa1, 0x6f, 0x54, 0x43, 0x31,
+ 0xd3, 0x13, 0x45, 0xab, 0x65, 0x6c, 0x8a, 0x9b, 0xb2, 0xda, 0x5a, 0x65, 0xfc, 0x44, 0x34, 0x7e,
+ 0x09, 0xad, 0x44, 0x6b, 0xb4, 0x28, 0x7f, 0xe4, 0x9b, 0xad, 0x45, 0xf9, 0xa3, 0xa8, 0xbf, 0x3a,
+ 0x86, 0xf6, 0x60, 0x26, 0xd5, 0x2c, 0x45, 0xaf, 0x94, 0x51, 0xa6, 0xdf, 0x14, 0xb5, 0x57, 0x47,
+ 0xe2, 0xc5, 0x32, 0x4c, 0x95, 0x11, 0x65, 0x0a, 0x2c, 0x5d, 0x5c, 0x3a, 0x07, 0xbe, 0x32, 0x0a,
+ 0x2d, 0x15, 0xca, 0xb9, 0x96, 0x6a, 0x61, 0x28, 0x97, 0xb5, 0x6c, 0x0b, 0x43, 0xb9, 0xbc, 0x4b,
+ 0x3b, 0x86, 0x0e, 0x60, 0x36, 0xd3, 0x4e, 0x45, 0xcb, 0x65, 0x2c, 0xb2, 0xad, 0x5c, 0x6d, 0xa5,
+ 0x02, 0x66, 0x2c, 0xe9, 0x87, 0xea, 0x02, 0xcf, 0x5d, 0xee, 0x6a, 0x39, 0xe9, 0xd0, 0xcf, 0x5e,
+ 0x3a, 0x1e, 0x29, 0x66, 0xfd, 0x35, 0x9c, 0x2b, 0x7a, 0x65, 0x43, 0xd7, 0x8b, 0x9e, 0x05, 0x4a,
+ 0x9f, 0xf2, 0xb4, 0xd5, 0xaa, 0xe8, 0xb1, 0xe0, 0x4f, 0xa1, 0xa1, 0x5a, 0x8a, 0xa8, 0xe0, 0x50,
+ 0xca, 0x34, 0x61, 0x35, 0xfd, 0x38, 0x94, 0x44, 0xa8, 0xf4, 0x54, 0x56, 0x18, 0xf6, 0xfa, 0xca,
+ 0xb3, 0x42, 0xae, 0x2b, 0x59, 0x9e, 0x15, 0xf2, 0xad, 0x43, 0x2e, 0x2e, 0x76, 0xbb, 0x64, 0x6b,
+ 0xac, 0xdc, 0xed, 0x0a, 0x3a, 0x7f, 0xe5, 0x6e, 0x57, 0xd8, 0x6d, 0x1b, 0x43, 0x3f, 0x51, 0xbf,
+ 0x07, 0x64, 0x3b, 0x62, 0xa8, 0x34, 0xb7, 0x94, 0x74, 0xe6, 0xb4, 0x1b, 0xd5, 0x09, 0x62, 0xf1,
+ 0xcf, 0x54, 0x26, 0xcc, 0x74, 0xc4, 0xca, 0x33, 0x61, 0x71, 0x5f, 0x4e, 0x5b, 0xab, 0x8c, 0x9f,
+ 0x0f, 0xf2, 0x64, 0xcb, 0xa8, 0xdc, 0xda, 0x05, 0x5d, 0xb6, 0x72, 0x6b, 0x17, 0x76, 0xa1, 0x78,
+ 0x7c, 0x14, 0xb5, 0x83, 0x8a, 0xe2, 0xe3, 0x98, 0x7e, 0x95, 0xb6, 0x5a, 0x15, 0x3d, 0x55, 0x28,
+ 0xe4, 0xfb, 0x3d, 0x68, 0xe4, 0xfa, 0x53, 0x67, 0xc0, 0xf5, 0x8a, 0xd8, 0xe5, 0xbb, 0xab, 0xce,
+ 0x84, 0x91, 0x0a, 0x64, 0xce, 0x86, 0xb5, 0xca, 0xf8, 0xb1, 0xec, 0x40, 0xfd, 0x6c, 0x92, 0xe8,
+ 0xd5, 0xa0, 0x6b, 0x23, 0xf8, 0x24, 0x7a, 0x4d, 0xda, 0x6b, 0x95, 0x70, 0x8b, 0xa2, 0x37, 0xd9,
+ 0x3d, 0x39, 0xce, 0x9f, 0x72, 0x2d, 0x9f, 0xe3, 0xfc, 0xa9, 0xa0, 0x21, 0x53, 0x10, 0xbd, 0xaa,
+ 0x69, 0x32, 0x3a, 0x7a, 0x33, 0xcd, 0x9b, 0xd1, 0xd1, 0x9b, 0xeb, 0xc7, 0x8c, 0xa1, 0x5f, 0x0c,
+ 0x7f, 0x42, 0xc8, 0x3f, 0x61, 0xa2, 0xf5, 0xd2, 0x54, 0x54, 0xfa, 0x72, 0xab, 0xbd, 0x79, 0x22,
+ 0x9a, 0x84, 0xf1, 0x7f, 0x5d, 0x53, 0x1d, 0xcd, 0xc2, 0x37, 0x44, 0xf4, 0x56, 0x05, 0xc6, 0xb9,
+ 0x67, 0x50, 0xed, 0xed, 0x13, 0x52, 0x25, 0x16, 0xf4, 0x10, 0x26, 0xf9, 0xdd, 0x19, 0x5d, 0x3a,
+ 0xfe, 0x52, 0xad, 0x5d, 0x2e, 0x9e, 0x8f, 0xaf, 0x86, 0x8c, 0xdb, 0xde, 0x14, 0xff, 0x2d, 0xfe,
+ 0xcd, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x3c, 0x65, 0x7f, 0x31, 0x2d, 0x2f, 0x00, 0x00,
}
diff --git a/weed/server/volume_tcp_file.go b/weed/server/volume_tcp_file.go
new file mode 100644
index 000000000..d7298aae7
--- /dev/null
+++ b/weed/server/volume_tcp_file.go
@@ -0,0 +1,150 @@
+package weed_server
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "net"
+ "net/http"
+ "strings"
+
+ "github.com/chrislusf/seaweedfs/weed/glog"
+ "github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb"
+ "github.com/chrislusf/seaweedfs/weed/storage/needle"
+ "github.com/chrislusf/seaweedfs/weed/util"
+)
+
+func (vs *VolumeServer) HandleTcpConnection(conn net.Conn) error {
+
+ // println("handle tcp conn", conn.RemoteAddr())
+ tcpMessage := &volume_server_pb.TcpRequestHeader{}
+ if err := util.ReadMessage(conn, tcpMessage); err != nil {
+ return fmt.Errorf("read message: %v", err)
+ }
+
+ if tcpMessage.Get != nil {
+ vs.handleFileGet(conn, tcpMessage.Get)
+ }
+
+ err := util.WriteMessageEOF(conn)
+ // println("processed", tcpMessage.Get.FileId)
+ return err
+}
+
+func (vs *VolumeServer) handleFileGet(conn net.Conn, req *volume_server_pb.FileGetRequest) error {
+
+ headResponse := &volume_server_pb.FileGetResponse{}
+ n := new(needle.Needle)
+
+ commaIndex := strings.LastIndex(req.FileId, ",")
+ vid := req.FileId[:commaIndex]
+ fid := req.FileId[commaIndex+1:]
+
+ volumeId, err := needle.NewVolumeId(vid)
+ if err != nil {
+ headResponse.ErrorCode = http.StatusBadRequest
+ return util.WriteMessage(conn, headResponse)
+ }
+ err = n.ParsePath(fid)
+ if err != nil {
+ headResponse.ErrorCode = http.StatusBadRequest
+ return util.WriteMessage(conn, headResponse)
+ }
+
+ hasVolume := vs.store.HasVolume(volumeId)
+ _, hasEcVolume := vs.store.FindEcVolume(volumeId)
+
+ if !hasVolume && !hasEcVolume {
+ headResponse.ErrorCode = http.StatusMovedPermanently
+ return util.WriteMessage(conn, headResponse)
+ }
+
+ cookie := n.Cookie
+ var count int
+ if hasVolume {
+ count, err = vs.store.ReadVolumeNeedle(volumeId, n)
+ } else if hasEcVolume {
+ count, err = vs.store.ReadEcShardNeedle(context.Background(), volumeId, n)
+ }
+
+ if err != nil || count < 0 {
+ headResponse.ErrorCode = http.StatusNotFound
+ return util.WriteMessage(conn, headResponse)
+ }
+ if n.Cookie != cookie {
+ headResponse.ErrorCode = http.StatusNotFound
+ return util.WriteMessage(conn, headResponse)
+ }
+
+ if n.LastModified != 0 {
+ headResponse.LastModified = n.LastModified
+ }
+
+ headResponse.Etag = n.Etag()
+
+ if n.HasPairs() {
+ pairMap := make(map[string]string)
+ err = json.Unmarshal(n.Pairs, &pairMap)
+ if err != nil {
+ glog.V(0).Infoln("Unmarshal pairs error:", err)
+ }
+ headResponse.Headers = pairMap
+ }
+
+ /*
+ // skip this, no redirection
+ if vs.tryHandleChunkedFile(n, filename, w, r) {
+ return
+ }
+ */
+
+ if n.NameSize > 0 {
+ headResponse.Filename = string(n.Name)
+ }
+ mtype := ""
+ if n.MimeSize > 0 {
+ mt := string(n.Mime)
+ if !strings.HasPrefix(mt, "application/octet-stream") {
+ mtype = mt
+ }
+ }
+ headResponse.ContentType = mtype
+
+ headResponse.IsGzipped = n.IsGzipped()
+
+ if n.IsGzipped() && req.AcceptGzip {
+ if n.Data, err = util.UnGzipData(n.Data); err != nil {
+ glog.V(0).Infof("ungzip %s error: %v", req.FileId, err)
+ }
+ }
+
+ headResponse.ContentLength = uint32(len(n.Data))
+ bytesToRead := len(n.Data)
+ bytesRead := 0
+
+ t := headResponse
+
+ for bytesRead < bytesToRead {
+
+ stopIndex := bytesRead + BufferSizeLimit
+ if stopIndex > bytesToRead {
+ stopIndex = bytesToRead
+ }
+
+ if t == nil {
+ t = &volume_server_pb.FileGetResponse{}
+ }
+ t.Data = n.Data[bytesRead:stopIndex]
+
+ err = util.WriteMessage(conn, t)
+ t = nil
+ if err != nil {
+ return err
+ }
+
+ bytesRead = stopIndex
+ }
+
+ return nil
+
+}
diff --git a/weed/util/http_util.go b/weed/util/http_util.go
index f819d8497..0f4c11eee 100644
--- a/weed/util/http_util.go
+++ b/weed/util/http_util.go
@@ -8,10 +8,14 @@ import (
"fmt"
"io"
"io/ioutil"
+ "math"
+ "net"
"net/http"
"net/url"
"strings"
+ "github.com/golang/protobuf/proto"
+
"github.com/chrislusf/seaweedfs/weed/glog"
)
@@ -312,3 +316,55 @@ func CloseResponse(resp *http.Response) {
io.Copy(ioutil.Discard, resp.Body)
resp.Body.Close()
}
+
+func WriteMessage(conn net.Conn, message proto.Message) error {
+ data, err := proto.Marshal(message)
+ if err != nil {
+ glog.Fatalf("marshal: %v", err)
+ }
+ messageSizeBytes := make([]byte, 4)
+ Uint32toBytes(messageSizeBytes, uint32(len(data)))
+ _, err = conn.Write(messageSizeBytes)
+ if err != nil {
+ return err
+ }
+ _, err = conn.Write(data)
+ return err
+}
+func WriteMessageEOF(conn net.Conn) error {
+ messageSizeBytes := make([]byte, 4)
+ Uint32toBytes(messageSizeBytes, math.MaxUint32)
+ _, err := conn.Write(messageSizeBytes)
+ return err
+}
+func ReadMessage(conn net.Conn, message proto.Message) error {
+ messageSizeBuffer := make([]byte, 4)
+ n, err := conn.Read(messageSizeBuffer)
+ if err != nil {
+ if err == io.EOF {
+ // println("unexpected eof")
+ return err
+ }
+ return fmt.Errorf("read message size byte length: %d %v", n, err)
+ }
+ if n != 4 {
+ return fmt.Errorf("unexpected message size byte length: %d", n)
+ }
+ messageSize := BytesToUint32(messageSizeBuffer)
+ if messageSize == math.MaxUint32 {
+ // println("marked eof")
+ return io.EOF
+ }
+
+ messageBytes := make([]byte, messageSize)
+
+ readMessageLength, err := conn.Read(messageBytes)
+ if readMessageLength != int(messageSize) {
+ return fmt.Errorf("message size:%d, expected:%d", readMessageLength, messageSize)
+ }
+
+ if err := proto.Unmarshal(messageBytes, message); err != nil {
+ return err
+ }
+ return nil
+}