implement `gateway.Reference.StatFile` method

Signed-off-by: Ian Campbell <ijc@docker.com>
docker-18.09
Ian Campbell 2018-10-02 14:45:39 +01:00
parent df76f6d380
commit b4454a169f
11 changed files with 578 additions and 73 deletions

15
cache/util/fsutil.go vendored
View File

@ -122,3 +122,18 @@ func ReadDir(ctx context.Context, ref cache.ImmutableRef, req ReadDirRequest) ([
})
return rd, err
}
func StatFile(ctx context.Context, ref cache.ImmutableRef, path string) (*fstypes.Stat, error) {
var st *fstypes.Stat
err := withMount(ctx, ref, func(root string) error {
fp, err := fs.RootPath(root, path)
if err != nil {
return err
}
if st, err = fsutil.Stat(fp); err != nil {
return err
}
return nil
})
return st, err
}

View File

@ -89,6 +89,11 @@ func (g *gatewayClientForBuild) ReadDir(ctx context.Context, in *gatewayapi.Read
return g.gateway.ReadDir(ctx, in, opts...)
}
func (g *gatewayClientForBuild) StatFile(ctx context.Context, in *gatewayapi.StatFileRequest, opts ...grpc.CallOption) (*gatewayapi.StatFileResponse, error) {
ctx = buildid.AppendToOutgoingContext(ctx, g.buildID)
return g.gateway.StatFile(ctx, in, opts...)
}
func (g *gatewayClientForBuild) Ping(ctx context.Context, in *gatewayapi.PingRequest, opts ...grpc.CallOption) (*gatewayapi.PongResponse, error) {
ctx = buildid.AppendToOutgoingContext(ctx, g.buildID)
return g.gateway.Ping(ctx, in, opts...)

View File

@ -133,3 +133,11 @@ func (gwf *GatewayForwarder) ReadDir(ctx context.Context, req *gwapi.ReadDirRequ
}
return fwd.ReadDir(ctx, req)
}
func (gwf *GatewayForwarder) StatFile(ctx context.Context, req *gwapi.StatFileRequest) (*gwapi.StatFileResponse, error) {
fwd, err := gwf.lookupForwarder(ctx)
if err != nil {
return nil, errors.Wrap(err, "forwarding StatFile")
}
return fwd.StatFile(ctx, req)
}

View File

@ -27,6 +27,7 @@ func TestFrontendIntegration(t *testing.T) {
integration.Run(t, []integration.Test{
testRefReadFile,
testRefReadDir,
testRefStatFile,
})
}
@ -213,6 +214,60 @@ func testRefReadDir(t *testing.T, sb integration.Sandbox) {
require.NoError(t, err)
}
func testRefStatFile(t *testing.T, sb integration.Sandbox) {
t.Parallel()
ctx := context.TODO()
c, err := client.New(ctx, sb.Address())
require.NoError(t, err)
defer c.Close()
testcontent := []byte(`foobar`)
dir, err := tmpdir(
fstest.CreateFile("test", testcontent, 0666),
)
require.NoError(t, err)
defer os.RemoveAll(dir)
exp, err := fsutil.Stat(filepath.Join(dir, "test"))
require.NoError(t, err)
frontend := func(ctx context.Context, c gateway.Client) (*gateway.Result, error) {
def, err := llb.Local("mylocal").Marshal()
if err != nil {
return nil, err
}
res, err := c.Solve(ctx, gateway.SolveRequest{
Definition: def.ToPB(),
})
if err != nil {
return nil, err
}
ref, err := res.SingleRef()
if err != nil {
return nil, err
}
st, err := ref.StatFile(ctx, gateway.StatRequest{
Path: "test",
})
require.NoError(t, err)
require.NotNil(t, st)
assert.Equal(t, exp, st)
return gateway.NewResult(), nil
}
_, err = c.Build(ctx, client.SolveOpt{
LocalDirs: map[string]string{
"mylocal": dir,
},
}, "", frontend, nil)
require.NoError(t, err)
}
func tmpdir(appliers ...fstest.Applier) (string, error) {
tmpdir, err := ioutil.TempDir("", "buildkit-frontend")
if err != nil {

View File

@ -18,7 +18,7 @@ type Client interface {
type Reference interface {
ReadFile(ctx context.Context, req ReadRequest) ([]byte, error)
// StatFile(ctx context.Context, req StatRequest) (*StatResponse, error)
StatFile(ctx context.Context, req StatRequest) (*fstypes.Stat, error)
ReadDir(ctx context.Context, req ReadDirRequest) ([]*fstypes.Stat, error)
}
@ -37,6 +37,10 @@ type ReadDirRequest struct {
IncludePattern string
}
type StatRequest struct {
Path string
}
// SolveRequest is same as frontend.SolveRequest but avoiding dependency
type SolveRequest struct {
Definition *pb.Definition

View File

@ -162,6 +162,14 @@ func (r *ref) ReadDir(ctx context.Context, req client.ReadDirRequest) ([]*fstype
return cacheutil.ReadDir(ctx, ref, newReq)
}
func (r *ref) StatFile(ctx context.Context, req client.StatRequest) (*fstypes.Stat, error) {
ref, err := r.getImmutableRef()
if err != nil {
return nil, err
}
return cacheutil.StatFile(ctx, ref, req.Path)
}
func (r *ref) getImmutableRef() (cache.ImmutableRef, error) {
ref, ok := r.CachedResult.Sys().(*worker.WorkerRef)
if !ok {

View File

@ -533,6 +533,30 @@ func (lbf *llbBridgeForwarder) ReadDir(ctx context.Context, req *pb.ReadDirReque
return &pb.ReadDirResponse{Entries: entries}, nil
}
func (lbf *llbBridgeForwarder) StatFile(ctx context.Context, req *pb.StatFileRequest) (*pb.StatFileResponse, error) {
ctx = tracing.ContextWithSpanFromContext(ctx, lbf.callCtx)
lbf.mu.Lock()
ref, ok := lbf.refs[req.Ref]
lbf.mu.Unlock()
if !ok {
return nil, errors.Errorf("no such ref: %v", req.Ref)
}
if ref == nil {
return nil, errors.Wrapf(os.ErrNotExist, "%s not found", req.Path)
}
workerRef, ok := ref.Sys().(*worker.WorkerRef)
if !ok {
return nil, errors.Errorf("invalid ref: %T", ref.Sys())
}
st, err := cacheutil.StatFile(ctx, workerRef.ImmutableRef, req.Path)
if err != nil {
return nil, err
}
return &pb.StatFileResponse{Stat: st}, nil
}
func (lbf *llbBridgeForwarder) Ping(context.Context, *pb.PingRequest) (*pb.PongResponse, error) {
workers := lbf.workers.WorkerInfos()

View File

@ -368,6 +368,18 @@ func (r *reference) ReadDir(ctx context.Context, req client.ReadDirRequest) ([]*
return resp.Entries, nil
}
func (r *reference) StatFile(ctx context.Context, req client.StatRequest) (*fstypes.Stat, error) {
rdr := &pb.StatFileRequest{
Path: req.Path,
Ref: r.id,
}
resp, err := r.c.client.StatFile(ctx, rdr)
if err != nil {
return nil, err
}
return resp.Stat, nil
}
func grpcClientConn(ctx context.Context) (context.Context, *grpc.ClientConn, error) {
dialOpt := grpc.WithDialer(func(addr string, d time.Duration) (net.Conn, error) {
return stdioConn(), nil

View File

@ -17,6 +17,7 @@ const (
CapReturnResult apicaps.CapID = "return"
CapReturnMap apicaps.CapID = "returnmap"
CapReadDir apicaps.CapID = "readdir"
CapStatFile apicaps.CapID = "statfile"
)
func init() {
@ -76,4 +77,11 @@ func init() {
Enabled: true,
Status: apicaps.CapStatusExperimental,
})
Caps.Init(apicaps.Cap{
ID: CapStatFile,
Name: "stat a file",
Enabled: true,
Status: apicaps.CapStatusExperimental,
})
}

View File

@ -21,6 +21,8 @@
ReadFileResponse
ReadDirRequest
ReadDirResponse
StatFileRequest
StatFileResponse
PingRequest
PongResponse
*/
@ -499,13 +501,53 @@ func (m *ReadDirResponse) GetEntries() []*fsutil_types.Stat {
return nil
}
type StatFileRequest struct {
Ref string `protobuf:"bytes,1,opt,name=Ref,proto3" json:"Ref,omitempty"`
Path string `protobuf:"bytes,2,opt,name=Path,proto3" json:"Path,omitempty"`
}
func (m *StatFileRequest) Reset() { *m = StatFileRequest{} }
func (m *StatFileRequest) String() string { return proto.CompactTextString(m) }
func (*StatFileRequest) ProtoMessage() {}
func (*StatFileRequest) Descriptor() ([]byte, []int) { return fileDescriptorGateway, []int{13} }
func (m *StatFileRequest) GetRef() string {
if m != nil {
return m.Ref
}
return ""
}
func (m *StatFileRequest) GetPath() string {
if m != nil {
return m.Path
}
return ""
}
type StatFileResponse struct {
Stat *fsutil_types.Stat `protobuf:"bytes,1,opt,name=stat" json:"stat,omitempty"`
}
func (m *StatFileResponse) Reset() { *m = StatFileResponse{} }
func (m *StatFileResponse) String() string { return proto.CompactTextString(m) }
func (*StatFileResponse) ProtoMessage() {}
func (*StatFileResponse) Descriptor() ([]byte, []int) { return fileDescriptorGateway, []int{14} }
func (m *StatFileResponse) GetStat() *fsutil_types.Stat {
if m != nil {
return m.Stat
}
return nil
}
type PingRequest struct {
}
func (m *PingRequest) Reset() { *m = PingRequest{} }
func (m *PingRequest) String() string { return proto.CompactTextString(m) }
func (*PingRequest) ProtoMessage() {}
func (*PingRequest) Descriptor() ([]byte, []int) { return fileDescriptorGateway, []int{13} }
func (*PingRequest) Descriptor() ([]byte, []int) { return fileDescriptorGateway, []int{15} }
type PongResponse struct {
FrontendAPICaps []moby_buildkit_v1_apicaps.APICap `protobuf:"bytes,1,rep,name=FrontendAPICaps" json:"FrontendAPICaps"`
@ -516,7 +558,7 @@ type PongResponse struct {
func (m *PongResponse) Reset() { *m = PongResponse{} }
func (m *PongResponse) String() string { return proto.CompactTextString(m) }
func (*PongResponse) ProtoMessage() {}
func (*PongResponse) Descriptor() ([]byte, []int) { return fileDescriptorGateway, []int{14} }
func (*PongResponse) Descriptor() ([]byte, []int) { return fileDescriptorGateway, []int{16} }
func (m *PongResponse) GetFrontendAPICaps() []moby_buildkit_v1_apicaps.APICap {
if m != nil {
@ -553,6 +595,8 @@ func init() {
proto.RegisterType((*ReadFileResponse)(nil), "moby.buildkit.v1.frontend.ReadFileResponse")
proto.RegisterType((*ReadDirRequest)(nil), "moby.buildkit.v1.frontend.ReadDirRequest")
proto.RegisterType((*ReadDirResponse)(nil), "moby.buildkit.v1.frontend.ReadDirResponse")
proto.RegisterType((*StatFileRequest)(nil), "moby.buildkit.v1.frontend.StatFileRequest")
proto.RegisterType((*StatFileResponse)(nil), "moby.buildkit.v1.frontend.StatFileResponse")
proto.RegisterType((*PingRequest)(nil), "moby.buildkit.v1.frontend.PingRequest")
proto.RegisterType((*PongResponse)(nil), "moby.buildkit.v1.frontend.PongResponse")
}
@ -576,6 +620,8 @@ type LLBBridgeClient interface {
ReadFile(ctx context.Context, in *ReadFileRequest, opts ...grpc.CallOption) (*ReadFileResponse, error)
// apicaps:CapReadDir
ReadDir(ctx context.Context, in *ReadDirRequest, opts ...grpc.CallOption) (*ReadDirResponse, error)
// apicaps:CapStatFile
StatFile(ctx context.Context, in *StatFileRequest, opts ...grpc.CallOption) (*StatFileResponse, error)
Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PongResponse, error)
Return(ctx context.Context, in *ReturnRequest, opts ...grpc.CallOption) (*ReturnResponse, error)
}
@ -624,6 +670,15 @@ func (c *lLBBridgeClient) ReadDir(ctx context.Context, in *ReadDirRequest, opts
return out, nil
}
func (c *lLBBridgeClient) StatFile(ctx context.Context, in *StatFileRequest, opts ...grpc.CallOption) (*StatFileResponse, error) {
out := new(StatFileResponse)
err := grpc.Invoke(ctx, "/moby.buildkit.v1.frontend.LLBBridge/StatFile", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *lLBBridgeClient) Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PongResponse, error) {
out := new(PongResponse)
err := grpc.Invoke(ctx, "/moby.buildkit.v1.frontend.LLBBridge/Ping", in, out, c.cc, opts...)
@ -653,6 +708,8 @@ type LLBBridgeServer interface {
ReadFile(context.Context, *ReadFileRequest) (*ReadFileResponse, error)
// apicaps:CapReadDir
ReadDir(context.Context, *ReadDirRequest) (*ReadDirResponse, error)
// apicaps:CapStatFile
StatFile(context.Context, *StatFileRequest) (*StatFileResponse, error)
Ping(context.Context, *PingRequest) (*PongResponse, error)
Return(context.Context, *ReturnRequest) (*ReturnResponse, error)
}
@ -733,6 +790,24 @@ func _LLBBridge_ReadDir_Handler(srv interface{}, ctx context.Context, dec func(i
return interceptor(ctx, in, info, handler)
}
func _LLBBridge_StatFile_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(StatFileRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(LLBBridgeServer).StatFile(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/moby.buildkit.v1.frontend.LLBBridge/StatFile",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(LLBBridgeServer).StatFile(ctx, req.(*StatFileRequest))
}
return interceptor(ctx, in, info, handler)
}
func _LLBBridge_Ping_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(PingRequest)
if err := dec(in); err != nil {
@ -789,6 +864,10 @@ var _LLBBridge_serviceDesc = grpc.ServiceDesc{
MethodName: "ReadDir",
Handler: _LLBBridge_ReadDir_Handler,
},
{
MethodName: "StatFile",
Handler: _LLBBridge_StatFile_Handler,
},
{
MethodName: "Ping",
Handler: _LLBBridge_Ping_Handler,
@ -1323,6 +1402,64 @@ func (m *ReadDirResponse) MarshalTo(dAtA []byte) (int, error) {
return i, nil
}
func (m *StatFileRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *StatFileRequest) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if len(m.Ref) > 0 {
dAtA[i] = 0xa
i++
i = encodeVarintGateway(dAtA, i, uint64(len(m.Ref)))
i += copy(dAtA[i:], m.Ref)
}
if len(m.Path) > 0 {
dAtA[i] = 0x12
i++
i = encodeVarintGateway(dAtA, i, uint64(len(m.Path)))
i += copy(dAtA[i:], m.Path)
}
return i, nil
}
func (m *StatFileResponse) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *StatFileResponse) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if m.Stat != nil {
dAtA[i] = 0xa
i++
i = encodeVarintGateway(dAtA, i, uint64(m.Stat.Size()))
n9, err := m.Stat.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n9
}
return i, nil
}
func (m *PingRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@ -1633,6 +1770,30 @@ func (m *ReadDirResponse) Size() (n int) {
return n
}
func (m *StatFileRequest) Size() (n int) {
var l int
_ = l
l = len(m.Ref)
if l > 0 {
n += 1 + l + sovGateway(uint64(l))
}
l = len(m.Path)
if l > 0 {
n += 1 + l + sovGateway(uint64(l))
}
return n
}
func (m *StatFileResponse) Size() (n int) {
var l int
_ = l
if m.Stat != nil {
l = m.Stat.Size()
n += 1 + l + sovGateway(uint64(l))
}
return n
}
func (m *PingRequest) Size() (n int) {
var l int
_ = l
@ -3490,6 +3651,197 @@ func (m *ReadDirResponse) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *StatFileRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGateway
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: StatFileRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: StatFileRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Ref", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGateway
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthGateway
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Ref = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGateway
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthGateway
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Path = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGateway(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthGateway
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *StatFileResponse) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGateway
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: StatFileResponse: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: StatFileResponse: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Stat", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGateway
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthGateway
}
postIndex := iNdEx + msglen
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.Stat == nil {
m.Stat = &fsutil_types.Stat{}
}
if err := m.Stat.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGateway(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthGateway
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *PingRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@ -3791,74 +4143,77 @@ var (
func init() { proto.RegisterFile("gateway.proto", fileDescriptorGateway) }
var fileDescriptorGateway = []byte{
// 1099 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0x4d, 0x6f, 0xdb, 0x46,
0x13, 0x36, 0x2d, 0xd9, 0x92, 0x46, 0xb2, 0xad, 0x77, 0xf1, 0xa2, 0x60, 0x78, 0x70, 0x54, 0xa2,
0x70, 0x15, 0xc7, 0x21, 0x51, 0xa7, 0x45, 0xd2, 0x04, 0x48, 0x1a, 0xd9, 0x31, 0xe2, 0x56, 0x6e,
0x84, 0xcd, 0x21, 0x40, 0xd0, 0x02, 0x5d, 0x49, 0x2b, 0x7a, 0x61, 0x8a, 0xcb, 0x2e, 0x57, 0x76,
0x8d, 0x5e, 0xda, 0x9e, 0x7a, 0xef, 0x9f, 0xca, 0xb1, 0xe7, 0x1e, 0x82, 0xc2, 0xb7, 0xf6, 0x57,
0x14, 0xfb, 0x41, 0x99, 0xfe, 0x92, 0xed, 0x13, 0x77, 0x96, 0xf3, 0xcc, 0x3c, 0xb3, 0xfb, 0xcc,
0x90, 0xb0, 0x14, 0x11, 0x49, 0x8f, 0xc8, 0x71, 0x90, 0x0a, 0x2e, 0x39, 0xba, 0x33, 0xe6, 0xfd,
0xe3, 0xa0, 0x3f, 0x61, 0xf1, 0xf0, 0x80, 0xc9, 0xe0, 0xf0, 0xb3, 0x60, 0x24, 0x78, 0x22, 0x69,
0x32, 0xf4, 0x1e, 0x44, 0x4c, 0xee, 0x4f, 0xfa, 0xc1, 0x80, 0x8f, 0xc3, 0x88, 0x47, 0x3c, 0xd4,
0x88, 0xfe, 0x64, 0xa4, 0x2d, 0x6d, 0xe8, 0x95, 0x89, 0xe4, 0x6d, 0x9e, 0x77, 0x8f, 0x38, 0x8f,
0x62, 0x4a, 0x52, 0x96, 0xd9, 0x65, 0x28, 0xd2, 0x41, 0x98, 0x49, 0x22, 0x27, 0x99, 0xc5, 0x6c,
0x14, 0x30, 0x8a, 0x48, 0x98, 0x13, 0x09, 0x33, 0x1e, 0x1f, 0x52, 0x11, 0xa6, 0xfd, 0x90, 0xa7,
0xb9, 0x77, 0x78, 0xa5, 0x37, 0x49, 0x59, 0x28, 0x8f, 0x53, 0x9a, 0x85, 0x47, 0x5c, 0x1c, 0x50,
0x61, 0x01, 0x0f, 0xaf, 0x04, 0x4c, 0x24, 0x8b, 0x15, 0x6a, 0x40, 0xd2, 0x4c, 0x25, 0x51, 0x4f,
0x0b, 0x2a, 0x96, 0x2d, 0x79, 0xc2, 0x32, 0xc9, 0x58, 0xc4, 0xc2, 0x51, 0xa6, 0x31, 0x26, 0x8b,
0x2a, 0xc2, 0xb8, 0xfb, 0xff, 0x38, 0xb0, 0x88, 0x69, 0x36, 0x89, 0x25, 0x42, 0x50, 0x12, 0x74,
0xe4, 0x3a, 0x2d, 0xa7, 0x5d, 0x7b, 0x35, 0x87, 0x95, 0x81, 0x1e, 0x41, 0x59, 0xd0, 0x51, 0xe6,
0xce, 0xb7, 0x9c, 0x76, 0x7d, 0xf3, 0xe3, 0xe0, 0xca, 0xe3, 0x0e, 0x30, 0x1d, 0xed, 0x91, 0xf4,
0xd5, 0x1c, 0xd6, 0x00, 0xf4, 0x0d, 0x54, 0xc7, 0x54, 0x92, 0x21, 0x91, 0xc4, 0x85, 0x56, 0xa9,
0x5d, 0xdf, 0x0c, 0x67, 0x82, 0x15, 0x83, 0x60, 0xcf, 0x22, 0x5e, 0x26, 0x52, 0x1c, 0xe3, 0x69,
0x00, 0xef, 0x29, 0x2c, 0x9d, 0x79, 0x85, 0x9a, 0x50, 0x3a, 0xa0, 0xc7, 0x86, 0x2a, 0x56, 0x4b,
0xf4, 0x7f, 0x58, 0x38, 0x24, 0xf1, 0x84, 0x6a, 0xa6, 0x0d, 0x6c, 0x8c, 0x27, 0xf3, 0x8f, 0x9d,
0x4e, 0x15, 0x16, 0x85, 0x0e, 0xef, 0xff, 0xa6, 0x6b, 0x55, 0x34, 0xd1, 0x73, 0x5b, 0x97, 0xa3,
0xa9, 0xdd, 0xbf, 0xb6, 0x2e, 0xf5, 0xc8, 0x0c, 0x2d, 0x0d, 0xf4, 0x1e, 0x41, 0x6d, 0xba, 0x75,
0x1d, 0x9d, 0x5a, 0x81, 0x8e, 0x2f, 0x61, 0x09, 0x53, 0x39, 0x11, 0x09, 0xa6, 0x3f, 0x4e, 0x68,
0x26, 0xd1, 0x97, 0x39, 0x3f, 0x8d, 0xbf, 0xee, 0x90, 0x95, 0x23, 0xb6, 0x00, 0xd4, 0x86, 0x05,
0x2a, 0x04, 0x17, 0xf6, 0x7a, 0x50, 0x60, 0x84, 0x1a, 0x88, 0x74, 0x10, 0xbc, 0xd1, 0x42, 0xc5,
0xc6, 0xc1, 0x6f, 0xc2, 0x72, 0x9e, 0x35, 0x4b, 0x79, 0x92, 0x51, 0xff, 0x0f, 0x07, 0xee, 0x60,
0xaa, 0x75, 0xba, 0x3b, 0x26, 0x11, 0xdd, 0xe2, 0xc9, 0x88, 0x45, 0x39, 0xa9, 0x26, 0x94, 0x70,
0xae, 0x05, 0xac, 0x96, 0xa8, 0x0d, 0xd5, 0x5e, 0x4c, 0xe4, 0x88, 0x8b, 0xb1, 0x4d, 0xd7, 0x08,
0xd2, 0x7e, 0x90, 0xef, 0xe1, 0xe9, 0x5b, 0xd4, 0x82, 0xba, 0x0d, 0xbc, 0xc7, 0x87, 0xd4, 0x2d,
0xe9, 0x18, 0xc5, 0x2d, 0xe4, 0x42, 0xa5, 0xcb, 0xa3, 0x6f, 0xc9, 0x98, 0xba, 0x65, 0xfd, 0x36,
0x37, 0xfd, 0x5f, 0x1c, 0xf0, 0x2e, 0x63, 0x65, 0x48, 0xa3, 0xaf, 0x61, 0x71, 0x9b, 0x45, 0x34,
0x33, 0x67, 0x55, 0xeb, 0x6c, 0xbe, 0xff, 0x70, 0x77, 0xee, 0xaf, 0x0f, 0x77, 0xd7, 0x0b, 0xa2,
0xe7, 0x29, 0x4d, 0x06, 0x3c, 0x91, 0x84, 0x25, 0x54, 0xa8, 0xde, 0x7d, 0x30, 0xd4, 0x90, 0xc0,
0x20, 0xb1, 0x8d, 0x80, 0x3e, 0x82, 0x45, 0x13, 0xdd, 0x4a, 0xc6, 0x5a, 0xfe, 0xef, 0x25, 0x68,
0xbc, 0x51, 0x04, 0xf2, 0xb3, 0x08, 0x00, 0xb6, 0xe9, 0x88, 0x25, 0x4c, 0x32, 0x9e, 0xd8, 0x4b,
0x5a, 0x56, 0xb5, 0x9f, 0xee, 0xe2, 0x82, 0x07, 0xf2, 0xa0, 0xba, 0x63, 0x2f, 0xcc, 0x5e, 0xff,
0xd4, 0x46, 0xef, 0xa0, 0x9e, 0xaf, 0x5f, 0xa7, 0xd2, 0x2d, 0x69, 0xf9, 0x3d, 0x9e, 0x71, 0xe3,
0x45, 0x26, 0x41, 0x01, 0x6a, 0xb4, 0x58, 0x0c, 0x86, 0xda, 0xb0, 0xb2, 0x3b, 0x4e, 0xb9, 0x90,
0x5b, 0x64, 0xb0, 0x4f, 0x95, 0x3a, 0xdd, 0x72, 0xab, 0xd4, 0xae, 0xe1, 0xf3, 0xdb, 0x68, 0x03,
0xfe, 0x47, 0xe2, 0x98, 0x1f, 0x59, 0x39, 0x69, 0x61, 0xb8, 0x0b, 0x2d, 0xa7, 0x5d, 0xc5, 0x17,
0x5f, 0x28, 0x2d, 0xef, 0xb0, 0x84, 0xc4, 0x2e, 0x68, 0x0f, 0x63, 0x20, 0x1f, 0x1a, 0x2f, 0x7f,
0x52, 0x61, 0xa9, 0x78, 0x21, 0xa5, 0x70, 0xeb, 0xfa, 0x10, 0xcf, 0xec, 0x79, 0xcf, 0xa0, 0x79,
0x9e, 0xf2, 0xad, 0x7a, 0xe5, 0x3b, 0x58, 0xb2, 0xf5, 0xdb, 0xfb, 0x6f, 0x16, 0x46, 0x94, 0x19,
0x50, 0xa7, 0xdd, 0x53, 0xba, 0x65, 0xf7, 0xf8, 0x3f, 0xc3, 0x0a, 0xa6, 0x64, 0xb8, 0xc3, 0x62,
0x7a, 0xb5, 0xec, 0xd5, 0x65, 0xb2, 0x98, 0xf6, 0x88, 0xdc, 0x9f, 0x5e, 0xa6, 0xb5, 0xd1, 0x13,
0x58, 0xc0, 0x24, 0x89, 0xa8, 0x4d, 0xfd, 0xc9, 0x8c, 0xd4, 0x3a, 0x89, 0xf2, 0xc5, 0x06, 0xe2,
0x3f, 0x85, 0xda, 0x74, 0x4f, 0x49, 0xf1, 0xf5, 0x68, 0x94, 0x51, 0x23, 0xeb, 0x12, 0xb6, 0x96,
0xda, 0xef, 0xd2, 0x24, 0xb2, 0xa9, 0x4b, 0xd8, 0x5a, 0xfe, 0x1a, 0x34, 0x4f, 0x99, 0xdb, 0xa3,
0x41, 0x50, 0xde, 0x56, 0xc3, 0xd6, 0xd1, 0xf7, 0xa0, 0xd7, 0xfe, 0x50, 0x75, 0x3d, 0x19, 0x6e,
0x33, 0x71, 0x75, 0x81, 0x2e, 0x54, 0xb6, 0x99, 0x28, 0xd4, 0x97, 0x9b, 0x68, 0x0d, 0x96, 0x77,
0x93, 0x41, 0x3c, 0x19, 0xaa, 0x6a, 0x25, 0x15, 0x89, 0x6d, 0xe5, 0x73, 0xbb, 0xfe, 0x73, 0x73,
0x8e, 0x3a, 0x8b, 0x25, 0xb3, 0x01, 0x15, 0x9a, 0x48, 0xc1, 0x68, 0x3e, 0x61, 0x51, 0x60, 0x3e,
0x40, 0x81, 0xfe, 0x00, 0xe9, 0xe1, 0x84, 0x73, 0x17, 0x7f, 0x09, 0xea, 0x3d, 0x96, 0xe4, 0xb3,
0xc7, 0x3f, 0x71, 0xa0, 0xd1, 0xe3, 0xc9, 0x69, 0xd7, 0xf7, 0x60, 0x25, 0x97, 0xd1, 0x8b, 0xde,
0xee, 0x16, 0x49, 0xf3, 0xa8, 0xad, 0x8b, 0x27, 0x6e, 0x3f, 0x8a, 0x81, 0x71, 0xec, 0x94, 0xd5,
0x80, 0xc0, 0xe7, 0xe1, 0xe8, 0x2b, 0xa8, 0x74, 0xbb, 0x1d, 0x1d, 0x69, 0xfe, 0x56, 0x91, 0x72,
0x18, 0x7a, 0x06, 0x95, 0xb7, 0xfa, 0x5b, 0x9d, 0xd9, 0x26, 0xbe, 0xe4, 0xf6, 0x4d, 0xad, 0xc6,
0x0d, 0xd3, 0x01, 0x17, 0x43, 0x9c, 0x83, 0x36, 0xff, 0x2d, 0x43, 0xad, 0xdb, 0xed, 0x74, 0x04,
0x1b, 0x46, 0x14, 0xfd, 0xea, 0x00, 0xba, 0x38, 0xf6, 0xd0, 0xe7, 0xb3, 0xc5, 0x7c, 0xf9, 0xec,
0xf6, 0xbe, 0xb8, 0x25, 0xca, 0x9e, 0xf2, 0x3b, 0x58, 0xd0, 0xcd, 0x86, 0x3e, 0xbd, 0xe1, 0x38,
0xf2, 0xda, 0xd7, 0x3b, 0xda, 0xd8, 0x03, 0xa8, 0xe6, 0x82, 0x45, 0xeb, 0x33, 0xe9, 0x9d, 0xe9,
0x47, 0xef, 0xfe, 0x8d, 0x7c, 0x6d, 0x92, 0x1f, 0xa0, 0x62, 0x75, 0x88, 0xee, 0x5d, 0x83, 0x3b,
0xed, 0x08, 0x6f, 0xfd, 0x26, 0xae, 0x36, 0xc3, 0x5b, 0x28, 0x2b, 0xa1, 0xa2, 0xb5, 0x19, 0x98,
0x82, 0x92, 0xbd, 0x59, 0x27, 0x79, 0x46, 0xe1, 0xdf, 0xab, 0x1f, 0x13, 0x3d, 0x6c, 0xdb, 0x33,
0xe9, 0x14, 0xfe, 0x1b, 0xbc, 0x7b, 0x37, 0xf0, 0x34, 0xe1, 0x3b, 0x8d, 0xf7, 0x27, 0xab, 0xce,
0x9f, 0x27, 0xab, 0xce, 0xdf, 0x27, 0xab, 0x4e, 0x7f, 0x51, 0xff, 0xf9, 0x3d, 0xfc, 0x2f, 0x00,
0x00, 0xff, 0xff, 0x12, 0xd8, 0x4e, 0x15, 0x4b, 0x0b, 0x00, 0x00,
// 1144 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0xcf, 0x4f, 0x1b, 0xc7,
0x17, 0x67, 0xb1, 0x8d, 0xed, 0x67, 0x03, 0xfe, 0x8e, 0xbe, 0xaa, 0x36, 0x7b, 0x20, 0xee, 0xaa,
0xa2, 0x0e, 0x21, 0xbb, 0x2a, 0x69, 0x45, 0x4a, 0xa4, 0xa4, 0x31, 0x04, 0x85, 0xd6, 0x34, 0xd6,
0xe4, 0x10, 0x29, 0x6a, 0xa5, 0xae, 0xed, 0xf1, 0x32, 0x62, 0xbd, 0xb3, 0x9d, 0x1d, 0x43, 0x51,
0x2f, 0x6d, 0x4f, 0xbd, 0xf7, 0x9f, 0xca, 0xad, 0x3d, 0xf7, 0x10, 0x55, 0xdc, 0xfa, 0x5f, 0x54,
0xf3, 0x63, 0xed, 0xc5, 0x80, 0x81, 0xd3, 0xce, 0x9b, 0x79, 0x9f, 0xf7, 0x3e, 0x6f, 0xde, 0x8f,
0x59, 0x58, 0x0e, 0x03, 0x41, 0x4e, 0x83, 0x33, 0x2f, 0xe1, 0x4c, 0x30, 0x74, 0x6f, 0xc4, 0x7a,
0x67, 0x5e, 0x6f, 0x4c, 0xa3, 0xc1, 0x31, 0x15, 0xde, 0xc9, 0x67, 0xde, 0x90, 0xb3, 0x58, 0x90,
0x78, 0xe0, 0x3c, 0x0a, 0xa9, 0x38, 0x1a, 0xf7, 0xbc, 0x3e, 0x1b, 0xf9, 0x21, 0x0b, 0x99, 0xaf,
0x10, 0xbd, 0xf1, 0x50, 0x49, 0x4a, 0x50, 0x2b, 0x6d, 0xc9, 0xd9, 0x9a, 0x55, 0x0f, 0x19, 0x0b,
0x23, 0x12, 0x24, 0x34, 0x35, 0x4b, 0x9f, 0x27, 0x7d, 0x3f, 0x15, 0x81, 0x18, 0xa7, 0x06, 0xb3,
0x99, 0xc3, 0x48, 0x22, 0x7e, 0x46, 0xc4, 0x4f, 0x59, 0x74, 0x42, 0xb8, 0x9f, 0xf4, 0x7c, 0x96,
0x64, 0xda, 0xfe, 0xb5, 0xda, 0x41, 0x42, 0x7d, 0x71, 0x96, 0x90, 0xd4, 0x3f, 0x65, 0xfc, 0x98,
0x70, 0x03, 0x78, 0x7c, 0x2d, 0x60, 0x2c, 0x68, 0x24, 0x51, 0xfd, 0x20, 0x49, 0xa5, 0x13, 0xf9,
0x35, 0xa0, 0x7c, 0xd8, 0x82, 0xc5, 0x34, 0x15, 0x94, 0x86, 0xd4, 0x1f, 0xa6, 0x0a, 0xa3, 0xbd,
0xc8, 0x20, 0xb4, 0xba, 0xfb, 0xaf, 0x05, 0x4b, 0x98, 0xa4, 0xe3, 0x48, 0x20, 0x04, 0x05, 0x4e,
0x86, 0xb6, 0xd5, 0xb4, 0x5a, 0xd5, 0x57, 0x0b, 0x58, 0x0a, 0x68, 0x1b, 0x8a, 0x9c, 0x0c, 0x53,
0x7b, 0xb1, 0x69, 0xb5, 0x6a, 0x5b, 0x1f, 0x7b, 0xd7, 0x5e, 0xb7, 0x87, 0xc9, 0xf0, 0x30, 0x48,
0x5e, 0x2d, 0x60, 0x05, 0x40, 0xdf, 0x40, 0x65, 0x44, 0x44, 0x30, 0x08, 0x44, 0x60, 0x43, 0xb3,
0xd0, 0xaa, 0x6d, 0xf9, 0x73, 0xc1, 0x92, 0x81, 0x77, 0x68, 0x10, 0x2f, 0x63, 0xc1, 0xcf, 0xf0,
0xc4, 0x80, 0xf3, 0x14, 0x96, 0x2f, 0x1c, 0xa1, 0x06, 0x14, 0x8e, 0xc9, 0x99, 0xa6, 0x8a, 0xe5,
0x12, 0xfd, 0x1f, 0x4a, 0x27, 0x41, 0x34, 0x26, 0x8a, 0x69, 0x1d, 0x6b, 0x61, 0x67, 0xf1, 0x89,
0xd5, 0xae, 0xc0, 0x12, 0x57, 0xe6, 0xdd, 0xdf, 0x54, 0xac, 0x92, 0x26, 0x7a, 0x6e, 0xe2, 0xb2,
0x14, 0xb5, 0x87, 0x37, 0xc6, 0x25, 0x3f, 0xa9, 0xa6, 0xa5, 0x80, 0xce, 0x36, 0x54, 0x27, 0x5b,
0x37, 0xd1, 0xa9, 0xe6, 0xe8, 0xb8, 0x02, 0x96, 0x31, 0x11, 0x63, 0x1e, 0x63, 0xf2, 0xe3, 0x98,
0xa4, 0x02, 0x7d, 0x99, 0xf1, 0x53, 0xf8, 0x9b, 0x2e, 0x59, 0x2a, 0x62, 0x03, 0x40, 0x2d, 0x28,
0x11, 0xce, 0x19, 0x37, 0xe9, 0x41, 0x9e, 0x2e, 0x54, 0x8f, 0x27, 0x7d, 0xef, 0x8d, 0x2a, 0x54,
0xac, 0x15, 0xdc, 0x06, 0xac, 0x64, 0x5e, 0xd3, 0x84, 0xc5, 0x29, 0x71, 0xff, 0xb0, 0xe0, 0x1e,
0x26, 0xaa, 0x4e, 0x0f, 0x46, 0x41, 0x48, 0x76, 0x59, 0x3c, 0xa4, 0x61, 0x46, 0xaa, 0x01, 0x05,
0x9c, 0xd5, 0x02, 0x96, 0x4b, 0xd4, 0x82, 0x4a, 0x37, 0x0a, 0xc4, 0x90, 0xf1, 0x91, 0x71, 0x57,
0xf7, 0x92, 0x9e, 0x97, 0xed, 0xe1, 0xc9, 0x29, 0x6a, 0x42, 0xcd, 0x18, 0x3e, 0x64, 0x03, 0x62,
0x17, 0x94, 0x8d, 0xfc, 0x16, 0xb2, 0xa1, 0xdc, 0x61, 0xe1, 0xb7, 0xc1, 0x88, 0xd8, 0x45, 0x75,
0x9a, 0x89, 0xee, 0x2f, 0x16, 0x38, 0x57, 0xb1, 0xd2, 0xa4, 0xd1, 0xd7, 0xb0, 0xb4, 0x47, 0x43,
0x92, 0xea, 0xbb, 0xaa, 0xb6, 0xb7, 0xde, 0x7f, 0xb8, 0xbf, 0xf0, 0xf7, 0x87, 0xfb, 0x1b, 0xb9,
0xa2, 0x67, 0x09, 0x89, 0xfb, 0x2c, 0x16, 0x01, 0x8d, 0x09, 0x97, 0xbd, 0xfb, 0x68, 0xa0, 0x20,
0x9e, 0x46, 0x62, 0x63, 0x01, 0x7d, 0x04, 0x4b, 0xda, 0xba, 0x29, 0x19, 0x23, 0xb9, 0xbf, 0x17,
0xa0, 0xfe, 0x46, 0x12, 0xc8, 0xee, 0xc2, 0x03, 0xd8, 0x23, 0x43, 0x1a, 0x53, 0x41, 0x59, 0x6c,
0x92, 0xb4, 0x22, 0x63, 0x9f, 0xee, 0xe2, 0x9c, 0x06, 0x72, 0xa0, 0xb2, 0x6f, 0x12, 0x66, 0xd2,
0x3f, 0x91, 0xd1, 0x3b, 0xa8, 0x65, 0xeb, 0xd7, 0x89, 0xb0, 0x0b, 0xaa, 0xfc, 0x9e, 0xcc, 0xc9,
0x78, 0x9e, 0x89, 0x97, 0x83, 0xea, 0x5a, 0xcc, 0x1b, 0x43, 0x2d, 0x58, 0x3d, 0x18, 0x25, 0x8c,
0x8b, 0xdd, 0xa0, 0x7f, 0x44, 0x64, 0x75, 0xda, 0xc5, 0x66, 0xa1, 0x55, 0xc5, 0xb3, 0xdb, 0x68,
0x13, 0xfe, 0x17, 0x44, 0x11, 0x3b, 0x35, 0xe5, 0xa4, 0x0a, 0xc3, 0x2e, 0x35, 0xad, 0x56, 0x05,
0x5f, 0x3e, 0x90, 0xb5, 0xbc, 0x4f, 0xe3, 0x20, 0xb2, 0x41, 0x69, 0x68, 0x01, 0xb9, 0x50, 0x7f,
0xf9, 0x93, 0x34, 0x4b, 0xf8, 0x0b, 0x21, 0xb8, 0x5d, 0x53, 0x97, 0x78, 0x61, 0xcf, 0x79, 0x06,
0x8d, 0x59, 0xca, 0x77, 0xea, 0x95, 0xef, 0x60, 0xd9, 0xc4, 0x6f, 0xf2, 0xdf, 0xc8, 0x8d, 0x28,
0x3d, 0xa0, 0xa6, 0xdd, 0x53, 0xb8, 0x63, 0xf7, 0xb8, 0x3f, 0xc3, 0x2a, 0x26, 0xc1, 0x60, 0x9f,
0x46, 0xe4, 0xfa, 0xb2, 0x97, 0xc9, 0xa4, 0x11, 0xe9, 0x06, 0xe2, 0x68, 0x92, 0x4c, 0x23, 0xa3,
0x1d, 0x28, 0xe1, 0x20, 0x0e, 0x89, 0x71, 0xfd, 0xc9, 0x1c, 0xd7, 0xca, 0x89, 0xd4, 0xc5, 0x1a,
0xe2, 0x3e, 0x85, 0xea, 0x64, 0x4f, 0x96, 0xe2, 0xeb, 0xe1, 0x30, 0x25, 0xba, 0xac, 0x0b, 0xd8,
0x48, 0x72, 0xbf, 0x43, 0xe2, 0xd0, 0xb8, 0x2e, 0x60, 0x23, 0xb9, 0xeb, 0xd0, 0x98, 0x32, 0x37,
0x57, 0x83, 0xa0, 0xb8, 0x27, 0x87, 0xad, 0xa5, 0xf2, 0xa0, 0xd6, 0xee, 0x40, 0x76, 0x7d, 0x30,
0xd8, 0xa3, 0xfc, 0xfa, 0x00, 0x6d, 0x28, 0xef, 0x51, 0x9e, 0x8b, 0x2f, 0x13, 0xd1, 0x3a, 0xac,
0x1c, 0xc4, 0xfd, 0x68, 0x3c, 0x90, 0xd1, 0x0a, 0xc2, 0x63, 0xd3, 0xca, 0x33, 0xbb, 0xee, 0x73,
0x7d, 0x8f, 0xca, 0x8b, 0x21, 0xb3, 0x09, 0x65, 0x12, 0x0b, 0x4e, 0x49, 0x36, 0x61, 0x91, 0xa7,
0x1f, 0x20, 0x4f, 0x3d, 0x40, 0x6a, 0x38, 0xe1, 0x4c, 0xc5, 0xdd, 0x86, 0x55, 0xb9, 0x31, 0x3f,
0x11, 0x08, 0x8a, 0x39, 0x92, 0x6a, 0xed, 0xee, 0x40, 0x63, 0x0a, 0x34, 0xae, 0xd7, 0xa1, 0x28,
0x9f, 0x37, 0xd3, 0xa7, 0x57, 0xf9, 0x55, 0xe7, 0xee, 0x32, 0xd4, 0xba, 0x34, 0xce, 0x06, 0x9e,
0x7b, 0x6e, 0x41, 0xbd, 0xcb, 0xe2, 0xe9, 0xa8, 0xe9, 0xc2, 0x6a, 0x56, 0xbb, 0x2f, 0xba, 0x07,
0xbb, 0x41, 0x92, 0x85, 0xd2, 0xbc, 0x9c, 0x66, 0xf3, 0x12, 0x7b, 0x5a, 0xb1, 0x5d, 0x94, 0x53,
0x09, 0xcf, 0xc2, 0xd1, 0x57, 0x50, 0xee, 0x74, 0xda, 0xca, 0xd2, 0xe2, 0x9d, 0x2c, 0x65, 0x30,
0xf4, 0x0c, 0xca, 0x6f, 0xd5, 0x0f, 0x42, 0x6a, 0x26, 0xc7, 0x15, 0x25, 0xa7, 0x03, 0xd5, 0x6a,
0x98, 0xf4, 0x19, 0x1f, 0xe0, 0x0c, 0xb4, 0xf5, 0x67, 0x09, 0xaa, 0x9d, 0x4e, 0xbb, 0xcd, 0xe9,
0x20, 0x24, 0xe8, 0x57, 0x0b, 0xd0, 0xe5, 0x59, 0x8b, 0x3e, 0x9f, 0xdf, 0x41, 0x57, 0x3f, 0x18,
0xce, 0x17, 0x77, 0x44, 0x99, 0x5b, 0x7e, 0x07, 0x25, 0xd5, 0xe1, 0xe8, 0xd3, 0x5b, 0xce, 0x40,
0xa7, 0x75, 0xb3, 0xa2, 0xb1, 0xdd, 0x87, 0x4a, 0xd6, 0x25, 0x68, 0x63, 0x2e, 0xbd, 0x0b, 0x43,
0xc0, 0x79, 0x78, 0x2b, 0x5d, 0xe3, 0xe4, 0x07, 0x28, 0x9b, 0xe2, 0x47, 0x0f, 0x6e, 0xc0, 0x4d,
0xdb, 0xd0, 0xd9, 0xb8, 0x8d, 0xea, 0x34, 0x8c, 0xac, 0xc8, 0xe7, 0x86, 0x31, 0xd3, 0x42, 0x73,
0xc3, 0xb8, 0xd4, 0x35, 0x6f, 0xa1, 0x28, 0xbb, 0x01, 0xad, 0xcf, 0x01, 0xe5, 0xda, 0xc5, 0x99,
0x97, 0xae, 0x0b, 0x6d, 0xf4, 0xbd, 0xfc, 0xe5, 0x52, 0xcf, 0x48, 0x6b, 0x6e, 0xcc, 0xb9, 0x3f,
0x22, 0xe7, 0xc1, 0x2d, 0x34, 0xb5, 0xf9, 0x76, 0xfd, 0xfd, 0xf9, 0x9a, 0xf5, 0xd7, 0xf9, 0x9a,
0xf5, 0xcf, 0xf9, 0x9a, 0xd5, 0x5b, 0x52, 0xff, 0xb4, 0x8f, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff,
0x80, 0x7e, 0xd2, 0xb5, 0x25, 0x0c, 0x00, 0x00,
}

View File

@ -22,6 +22,8 @@ service LLBBridge {
rpc ReadFile(ReadFileRequest) returns (ReadFileResponse);
// apicaps:CapReadDir
rpc ReadDir(ReadDirRequest) returns (ReadDirResponse);
// apicaps:CapStatFile
rpc StatFile(StatFileRequest) returns (StatFileResponse);
rpc Ping(PingRequest) returns (PongResponse);
rpc Return(ReturnRequest) returns (ReturnResponse);
}
@ -105,6 +107,15 @@ message ReadDirResponse {
repeated fsutil.types.Stat entries = 1;
}
message StatFileRequest {
string Ref = 1;
string Path = 2;
}
message StatFileResponse {
fsutil.types.Stat stat = 1;
}
message PingRequest{
}
message PongResponse{