Add DeleteProcess API for removing execs

We need a separate API for handing the exit status and deletion of
Exec'd processes to make sure they are properly cleaned up within the
shim and daemon.

Fixes #973

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
Michael Crosby 2017-06-08 11:45:16 -07:00
parent 4e8548cd3f
commit ff598449d1
16 changed files with 646 additions and 225 deletions

View File

@ -14,6 +14,7 @@
StartRequest
DeleteRequest
DeleteResponse
DeleteProcessRequest
InfoRequest
InfoResponse
ListRequest
@ -133,13 +134,22 @@ func (m *DeleteResponse) Reset() { *m = DeleteResponse{} }
func (*DeleteResponse) ProtoMessage() {}
func (*DeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{4} }
type DeleteProcessRequest struct {
ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"`
Pid uint32 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"`
}
func (m *DeleteProcessRequest) Reset() { *m = DeleteProcessRequest{} }
func (*DeleteProcessRequest) ProtoMessage() {}
func (*DeleteProcessRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{5} }
type InfoRequest struct {
ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"`
}
func (m *InfoRequest) Reset() { *m = InfoRequest{} }
func (*InfoRequest) ProtoMessage() {}
func (*InfoRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{5} }
func (*InfoRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{6} }
type InfoResponse struct {
Task *containerd_v1_types2.Task `protobuf:"bytes,1,opt,name=task" json:"task,omitempty"`
@ -147,14 +157,14 @@ type InfoResponse struct {
func (m *InfoResponse) Reset() { *m = InfoResponse{} }
func (*InfoResponse) ProtoMessage() {}
func (*InfoResponse) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{6} }
func (*InfoResponse) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{7} }
type ListRequest struct {
}
func (m *ListRequest) Reset() { *m = ListRequest{} }
func (*ListRequest) ProtoMessage() {}
func (*ListRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{7} }
func (*ListRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{8} }
type ListResponse struct {
Tasks []*containerd_v1_types2.Task `protobuf:"bytes,1,rep,name=tasks" json:"tasks,omitempty"`
@ -162,7 +172,7 @@ type ListResponse struct {
func (m *ListResponse) Reset() { *m = ListResponse{} }
func (*ListResponse) ProtoMessage() {}
func (*ListResponse) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{8} }
func (*ListResponse) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{9} }
type KillRequest struct {
ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"`
@ -175,7 +185,7 @@ type KillRequest struct {
func (m *KillRequest) Reset() { *m = KillRequest{} }
func (*KillRequest) ProtoMessage() {}
func (*KillRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{9} }
func (*KillRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{10} }
type isKillRequest_PidOrAll interface {
isKillRequest_PidOrAll()
@ -287,7 +297,7 @@ type EventsRequest struct {
func (m *EventsRequest) Reset() { *m = EventsRequest{} }
func (*EventsRequest) ProtoMessage() {}
func (*EventsRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{10} }
func (*EventsRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{11} }
type ExecRequest struct {
// ContainerID specifies the container in which to exec the process.
@ -304,7 +314,7 @@ type ExecRequest struct {
func (m *ExecRequest) Reset() { *m = ExecRequest{} }
func (*ExecRequest) ProtoMessage() {}
func (*ExecRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{11} }
func (*ExecRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{12} }
type ExecResponse struct {
Pid uint32 `protobuf:"varint,1,opt,name=pid,proto3" json:"pid,omitempty"`
@ -312,7 +322,7 @@ type ExecResponse struct {
func (m *ExecResponse) Reset() { *m = ExecResponse{} }
func (*ExecResponse) ProtoMessage() {}
func (*ExecResponse) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{12} }
func (*ExecResponse) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{13} }
type PtyRequest struct {
ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"`
@ -323,7 +333,7 @@ type PtyRequest struct {
func (m *PtyRequest) Reset() { *m = PtyRequest{} }
func (*PtyRequest) ProtoMessage() {}
func (*PtyRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{13} }
func (*PtyRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{14} }
type CloseStdinRequest struct {
ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"`
@ -332,7 +342,7 @@ type CloseStdinRequest struct {
func (m *CloseStdinRequest) Reset() { *m = CloseStdinRequest{} }
func (*CloseStdinRequest) ProtoMessage() {}
func (*CloseStdinRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{14} }
func (*CloseStdinRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{15} }
type PauseRequest struct {
ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"`
@ -340,7 +350,7 @@ type PauseRequest struct {
func (m *PauseRequest) Reset() { *m = PauseRequest{} }
func (*PauseRequest) ProtoMessage() {}
func (*PauseRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{15} }
func (*PauseRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{16} }
type ResumeRequest struct {
ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"`
@ -348,7 +358,7 @@ type ResumeRequest struct {
func (m *ResumeRequest) Reset() { *m = ResumeRequest{} }
func (*ResumeRequest) ProtoMessage() {}
func (*ResumeRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{16} }
func (*ResumeRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{17} }
type ProcessesRequest struct {
ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"`
@ -356,7 +366,7 @@ type ProcessesRequest struct {
func (m *ProcessesRequest) Reset() { *m = ProcessesRequest{} }
func (*ProcessesRequest) ProtoMessage() {}
func (*ProcessesRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{17} }
func (*ProcessesRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{18} }
type ProcessesResponse struct {
Processes []*containerd_v1_types2.Process `protobuf:"bytes,1,rep,name=processes" json:"processes,omitempty"`
@ -364,7 +374,7 @@ type ProcessesResponse struct {
func (m *ProcessesResponse) Reset() { *m = ProcessesResponse{} }
func (*ProcessesResponse) ProtoMessage() {}
func (*ProcessesResponse) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{18} }
func (*ProcessesResponse) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{19} }
type CheckpointRequest struct {
ContainerID string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"`
@ -379,7 +389,7 @@ type CheckpointRequest struct {
func (m *CheckpointRequest) Reset() { *m = CheckpointRequest{} }
func (*CheckpointRequest) ProtoMessage() {}
func (*CheckpointRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{19} }
func (*CheckpointRequest) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{20} }
type CheckpointResponse struct {
Descriptors []*containerd_v1_types1.Descriptor `protobuf:"bytes,1,rep,name=descriptors" json:"descriptors,omitempty"`
@ -387,7 +397,7 @@ type CheckpointResponse struct {
func (m *CheckpointResponse) Reset() { *m = CheckpointResponse{} }
func (*CheckpointResponse) ProtoMessage() {}
func (*CheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{20} }
func (*CheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptorExecution, []int{21} }
func init() {
proto.RegisterType((*CreateRequest)(nil), "containerd.v1.services.execution.CreateRequest")
@ -395,6 +405,7 @@ func init() {
proto.RegisterType((*StartRequest)(nil), "containerd.v1.services.execution.StartRequest")
proto.RegisterType((*DeleteRequest)(nil), "containerd.v1.services.execution.DeleteRequest")
proto.RegisterType((*DeleteResponse)(nil), "containerd.v1.services.execution.DeleteResponse")
proto.RegisterType((*DeleteProcessRequest)(nil), "containerd.v1.services.execution.DeleteProcessRequest")
proto.RegisterType((*InfoRequest)(nil), "containerd.v1.services.execution.InfoRequest")
proto.RegisterType((*InfoResponse)(nil), "containerd.v1.services.execution.InfoResponse")
proto.RegisterType((*ListRequest)(nil), "containerd.v1.services.execution.ListRequest")
@ -427,6 +438,7 @@ type TasksClient interface {
Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error)
Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*google_protobuf.Empty, error)
Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error)
DeleteProcess(ctx context.Context, in *DeleteProcessRequest, opts ...grpc.CallOption) (*DeleteResponse, error)
Info(ctx context.Context, in *InfoRequest, opts ...grpc.CallOption) (*InfoResponse, error)
List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error)
Kill(ctx context.Context, in *KillRequest, opts ...grpc.CallOption) (*google_protobuf.Empty, error)
@ -475,6 +487,15 @@ func (c *tasksClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grp
return out, nil
}
func (c *tasksClient) DeleteProcess(ctx context.Context, in *DeleteProcessRequest, opts ...grpc.CallOption) (*DeleteResponse, error) {
out := new(DeleteResponse)
err := grpc.Invoke(ctx, "/containerd.v1.services.execution.Tasks/DeleteProcess", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *tasksClient) Info(ctx context.Context, in *InfoRequest, opts ...grpc.CallOption) (*InfoResponse, error) {
out := new(InfoResponse)
err := grpc.Invoke(ctx, "/containerd.v1.services.execution.Tasks/Info", in, out, c.cc, opts...)
@ -603,6 +624,7 @@ type TasksServer interface {
Create(context.Context, *CreateRequest) (*CreateResponse, error)
Start(context.Context, *StartRequest) (*google_protobuf.Empty, error)
Delete(context.Context, *DeleteRequest) (*DeleteResponse, error)
DeleteProcess(context.Context, *DeleteProcessRequest) (*DeleteResponse, error)
Info(context.Context, *InfoRequest) (*InfoResponse, error)
List(context.Context, *ListRequest) (*ListResponse, error)
Kill(context.Context, *KillRequest) (*google_protobuf.Empty, error)
@ -674,6 +696,24 @@ func _Tasks_Delete_Handler(srv interface{}, ctx context.Context, dec func(interf
return interceptor(ctx, in, info, handler)
}
func _Tasks_DeleteProcess_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(DeleteProcessRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TasksServer).DeleteProcess(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/containerd.v1.services.execution.Tasks/DeleteProcess",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TasksServer).DeleteProcess(ctx, req.(*DeleteProcessRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Tasks_Info_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(InfoRequest)
if err := dec(in); err != nil {
@ -891,6 +931,10 @@ var _Tasks_serviceDesc = grpc.ServiceDesc{
MethodName: "Delete",
Handler: _Tasks_Delete_Handler,
},
{
MethodName: "DeleteProcess",
Handler: _Tasks_DeleteProcess_Handler,
},
{
MethodName: "Info",
Handler: _Tasks_Info_Handler,
@ -1130,6 +1174,35 @@ func (m *DeleteResponse) MarshalTo(dAtA []byte) (int, error) {
return i, nil
}
func (m *DeleteProcessRequest) 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 *DeleteProcessRequest) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if len(m.ContainerID) > 0 {
dAtA[i] = 0xa
i++
i = encodeVarintExecution(dAtA, i, uint64(len(m.ContainerID)))
i += copy(dAtA[i:], m.ContainerID)
}
if m.Pid != 0 {
dAtA[i] = 0x10
i++
i = encodeVarintExecution(dAtA, i, uint64(m.Pid))
}
return i, nil
}
func (m *InfoRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@ -1793,6 +1866,19 @@ func (m *DeleteResponse) Size() (n int) {
return n
}
func (m *DeleteProcessRequest) Size() (n int) {
var l int
_ = l
l = len(m.ContainerID)
if l > 0 {
n += 1 + l + sovExecution(uint64(l))
}
if m.Pid != 0 {
n += 1 + sovExecution(uint64(m.Pid))
}
return n
}
func (m *InfoRequest) Size() (n int) {
var l int
_ = l
@ -2096,6 +2182,17 @@ func (this *DeleteResponse) String() string {
}, "")
return s
}
func (this *DeleteProcessRequest) String() string {
if this == nil {
return "nil"
}
s := strings.Join([]string{`&DeleteProcessRequest{`,
`ContainerID:` + fmt.Sprintf("%v", this.ContainerID) + `,`,
`Pid:` + fmt.Sprintf("%v", this.Pid) + `,`,
`}`,
}, "")
return s
}
func (this *InfoRequest) String() string {
if this == nil {
return "nil"
@ -2934,6 +3031,104 @@ func (m *DeleteResponse) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *DeleteProcessRequest) 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 ErrIntOverflowExecution
}
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: DeleteProcessRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: DeleteProcessRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowExecution
}
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 ErrInvalidLengthExecution
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.ContainerID = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType)
}
m.Pid = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowExecution
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Pid |= (uint32(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipExecution(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthExecution
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *InfoRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@ -4684,81 +4879,83 @@ func init() {
}
var fileDescriptorExecution = []byte{
// 1209 bytes of a gzipped FileDescriptorProto
// 1242 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcd, 0x6e, 0xdb, 0xc6,
0x13, 0x37, 0xad, 0x8f, 0xbf, 0x34, 0x94, 0x12, 0x7b, 0x11, 0x04, 0x8a, 0xf2, 0xaf, 0x24, 0x10,
0x28, 0xa0, 0x16, 0x09, 0x95, 0xca, 0x3d, 0x05, 0x2d, 0x02, 0xcb, 0x76, 0x5a, 0x23, 0x49, 0xed,
0xd2, 0x6e, 0x83, 0x9c, 0x04, 0x9a, 0x5c, 0xcb, 0x0b, 0x51, 0x5c, 0x96, 0xbb, 0xf2, 0xc7, 0x2d,
0x6f, 0xd0, 0x9e, 0xfb, 0x04, 0x7d, 0x14, 0xa3, 0x40, 0x81, 0x1e, 0x8b, 0x1e, 0xdc, 0xc6, 0x4f,
0xd1, 0x63, 0xb1, 0xcb, 0x25, 0x45, 0x29, 0x56, 0x45, 0x57, 0xbd, 0x48, 0xbb, 0xc3, 0x99, 0xdf,
0xce, 0xc7, 0xce, 0xfc, 0x16, 0xbe, 0x18, 0x10, 0x7e, 0x32, 0x3e, 0x32, 0x1d, 0x3a, 0xea, 0x38,
0xd4, 0xe7, 0x36, 0xf1, 0x71, 0xe8, 0xa6, 0x97, 0x76, 0x40, 0x3a, 0x0c, 0x87, 0xa7, 0xc4, 0xc1,
0xac, 0x83, 0xcf, 0xb1, 0x33, 0xe6, 0x84, 0xfa, 0x93, 0x95, 0x19, 0x84, 0x94, 0x53, 0xd4, 0x9a,
0x98, 0x98, 0xa7, 0x9f, 0x98, 0xb1, 0x85, 0x99, 0xe8, 0xd5, 0x1f, 0x0e, 0x28, 0x1d, 0x78, 0xb8,
0x23, 0xf5, 0x8f, 0xc6, 0xc7, 0x1d, 0x3c, 0x0a, 0xf8, 0x45, 0x64, 0x5e, 0x7f, 0x30, 0xfb, 0xd1,
0xf6, 0xe3, 0x4f, 0xf7, 0x06, 0x74, 0x40, 0xe5, 0xb2, 0x23, 0x56, 0x4a, 0xfa, 0x59, 0x26, 0xc7,
0xf9, 0x45, 0x80, 0x59, 0x67, 0x44, 0xc7, 0x3e, 0x8f, 0x7e, 0x95, 0xf5, 0xf3, 0x5b, 0x58, 0xbb,
0x98, 0x39, 0x21, 0x09, 0x38, 0x0d, 0x53, 0x4b, 0x85, 0xf3, 0xf4, 0x16, 0x38, 0xdc, 0x66, 0x43,
0xf9, 0xa3, 0x6c, 0x9b, 0xb3, 0x21, 0x73, 0x32, 0xc2, 0x8c, 0xdb, 0xa3, 0x20, 0x52, 0x30, 0x7e,
0x5c, 0x85, 0xea, 0x56, 0x88, 0x6d, 0x8e, 0x2d, 0xfc, 0xdd, 0x18, 0x33, 0x8e, 0xba, 0x50, 0x49,
0xa0, 0xfb, 0xc4, 0xad, 0xad, 0xb6, 0xb4, 0x76, 0xb9, 0x77, 0xf7, 0xfa, 0xaa, 0xa9, 0x6f, 0xc5,
0xf2, 0xdd, 0x6d, 0x4b, 0x4f, 0x94, 0x76, 0x5d, 0xd4, 0x85, 0x62, 0x48, 0x29, 0x3f, 0x66, 0xb5,
0x5c, 0x2b, 0xd7, 0xd6, 0xbb, 0x75, 0x73, 0xba, 0x52, 0xd2, 0x39, 0xf3, 0x95, 0x48, 0x8e, 0xa5,
0x34, 0xd1, 0x3d, 0x28, 0x30, 0xee, 0x12, 0xbf, 0x56, 0x10, 0x07, 0x58, 0xd1, 0x06, 0xdd, 0x87,
0x22, 0xe3, 0x2e, 0x1d, 0xf3, 0x5a, 0x51, 0x8a, 0xd5, 0x4e, 0xc9, 0x71, 0x18, 0xd6, 0xfe, 0x97,
0xc8, 0x71, 0x18, 0xa2, 0x3a, 0x94, 0x38, 0x0e, 0x47, 0xc4, 0xb7, 0xbd, 0x5a, 0xa9, 0xa5, 0xb5,
0x4b, 0x56, 0xb2, 0x47, 0xcf, 0x00, 0x9c, 0x13, 0xec, 0x0c, 0x03, 0x4a, 0x7c, 0x5e, 0x2b, 0xb7,
0xb4, 0xb6, 0xde, 0x6d, 0xde, 0xe8, 0xd9, 0x76, 0x92, 0x73, 0x2b, 0x65, 0x62, 0x7c, 0x0b, 0x77,
0xe2, 0xdc, 0xb0, 0x80, 0xfa, 0x0c, 0xff, 0xab, 0xe4, 0xac, 0x41, 0x2e, 0x20, 0x6e, 0x2d, 0xd7,
0xd2, 0xda, 0x55, 0x4b, 0x2c, 0x8d, 0x1e, 0x54, 0x0e, 0xb8, 0x1d, 0xf2, 0x79, 0x29, 0xd7, 0x16,
0xa3, 0x1a, 0x5b, 0x50, 0xdd, 0xc6, 0x1e, 0x9e, 0x5f, 0xb7, 0x2c, 0x20, 0x3f, 0x69, 0x70, 0x27,
0x46, 0x99, 0x13, 0x61, 0x06, 0x18, 0xd4, 0x04, 0x1d, 0x9f, 0x13, 0xde, 0x67, 0xdc, 0xe6, 0x63,
0x26, 0x93, 0x52, 0xb5, 0x40, 0x88, 0x0e, 0xa4, 0x04, 0x6d, 0x42, 0x59, 0xec, 0xb0, 0xdb, 0xb7,
0xb9, 0x4c, 0x84, 0xb8, 0x22, 0xd1, 0xd5, 0x34, 0xe3, 0xab, 0x69, 0x1e, 0xc6, 0x57, 0xb3, 0x57,
0xba, 0xbc, 0x6a, 0xae, 0xfc, 0xf0, 0x47, 0x53, 0xb3, 0x4a, 0x91, 0xd9, 0x26, 0x37, 0x36, 0x41,
0xdf, 0xf5, 0x8f, 0xe9, 0x32, 0xd1, 0x7e, 0x0e, 0x95, 0x08, 0x42, 0x85, 0xfa, 0x18, 0xf2, 0xa2,
0x55, 0xa4, 0xad, 0xde, 0x7d, 0x70, 0xe3, 0xcd, 0x38, 0xb4, 0xd9, 0xd0, 0x92, 0x6a, 0x46, 0x15,
0xf4, 0x97, 0x84, 0xc5, 0x45, 0x33, 0x9e, 0x41, 0x25, 0xda, 0x2a, 0xb4, 0x0e, 0x14, 0x84, 0x1a,
0xab, 0x69, 0xb2, 0x05, 0xfe, 0x01, 0x2e, 0xd2, 0x33, 0xbe, 0xd7, 0x40, 0x7f, 0x41, 0x3c, 0x6f,
0x89, 0x90, 0x64, 0x5b, 0x90, 0x81, 0xb8, 0xfc, 0x51, 0xd2, 0xd5, 0x0e, 0x21, 0xc8, 0xd9, 0x9e,
0x27, 0x53, 0x5d, 0xfa, 0x72, 0xc5, 0x12, 0x1b, 0x21, 0x13, 0xf7, 0x30, 0x2f, 0x14, 0x85, 0x2c,
0x20, 0x6e, 0xaf, 0x02, 0x10, 0x10, 0xb7, 0x4f, 0xc3, 0xbe, 0xed, 0x79, 0xc6, 0x5d, 0xa8, 0xee,
0x9c, 0x62, 0x9f, 0xb3, 0x38, 0xc6, 0x5f, 0x34, 0xd0, 0x77, 0xce, 0xb1, 0xb3, 0x8c, 0x8b, 0xe9,
0x0e, 0x5d, 0x9d, 0xe9, 0xd0, 0x64, 0x06, 0xe4, 0x6e, 0x9e, 0x01, 0xf9, 0x39, 0x33, 0xa0, 0x30,
0x35, 0x03, 0xda, 0x90, 0x67, 0x01, 0x76, 0xe4, 0xc4, 0xd0, 0xbb, 0xf7, 0xde, 0xbb, 0x58, 0x9b,
0xfe, 0x85, 0x25, 0x35, 0x8c, 0x16, 0x54, 0xa2, 0x70, 0x54, 0xcd, 0x54, 0x6b, 0x6a, 0x93, 0xd6,
0x7c, 0xab, 0x01, 0xec, 0xf3, 0x8b, 0x65, 0x02, 0x56, 0xa0, 0xab, 0x09, 0xa8, 0x08, 0xf3, 0x8c,
0xb8, 0xfc, 0x44, 0xcd, 0x80, 0x68, 0x23, 0xc2, 0x39, 0xc1, 0x64, 0x70, 0x12, 0x85, 0x59, 0xb5,
0xd4, 0xce, 0x78, 0x03, 0xeb, 0x5b, 0x1e, 0x65, 0xf8, 0x40, 0x24, 0xe3, 0x3f, 0x75, 0x44, 0x0c,
0x9e, 0x7d, 0x7b, 0xcc, 0xf0, 0x92, 0x83, 0xc7, 0xc2, 0x6c, 0x3c, 0x5a, 0x0a, 0xe4, 0x39, 0xac,
0xed, 0x87, 0xd4, 0xc1, 0x8c, 0x61, 0xb6, 0x0c, 0xce, 0x1e, 0xac, 0xa7, 0x70, 0x54, 0x55, 0x9f,
0x42, 0x39, 0x88, 0x85, 0xaa, 0x1b, 0xff, 0x7f, 0x63, 0x37, 0x2a, 0x53, 0x6b, 0xa2, 0x6e, 0xfc,
0xb5, 0x0a, 0xeb, 0x5b, 0x09, 0x03, 0x2c, 0x93, 0xfd, 0x87, 0x50, 0xb6, 0x3d, 0x8f, 0x9e, 0xf5,
0xb9, 0x13, 0xc4, 0x17, 0x5f, 0x0a, 0x0e, 0x9d, 0x00, 0x3d, 0x02, 0x14, 0x7d, 0x1c, 0xfb, 0xe4,
0xbc, 0xcf, 0xa8, 0x33, 0xc4, 0x9c, 0x45, 0xed, 0x6a, 0xad, 0xc9, 0x2f, 0xdf, 0xf8, 0xe4, 0xfc,
0x20, 0x92, 0xa3, 0x0f, 0xe1, 0x8e, 0x82, 0x8a, 0x1b, 0x29, 0x2f, 0x35, 0xab, 0x11, 0x5e, 0xdc,
0x4d, 0x1f, 0x00, 0x1c, 0x13, 0x0f, 0xf7, 0x3d, 0xea, 0x0c, 0x99, 0xec, 0x91, 0x92, 0x55, 0x16,
0x92, 0x97, 0x42, 0x80, 0x3e, 0x82, 0x35, 0xf9, 0x1a, 0xea, 0xfb, 0xf6, 0x08, 0xb3, 0xc0, 0x76,
0x30, 0xab, 0x15, 0x5b, 0xb9, 0x76, 0xd9, 0xba, 0x2b, 0xe5, 0x5f, 0x25, 0x62, 0xd4, 0x87, 0xf5,
0xc0, 0x0e, 0xb1, 0xcf, 0xfb, 0x29, 0x02, 0x95, 0xc4, 0xdb, 0xeb, 0x8a, 0xd9, 0xfc, 0xfb, 0x55,
0xf3, 0xe3, 0xd4, 0xab, 0x84, 0x06, 0xd8, 0x4f, 0x42, 0x67, 0x9d, 0x01, 0x7d, 0xec, 0x92, 0x01,
0x66, 0xdc, 0xdc, 0x96, 0x7f, 0xd6, 0x5a, 0x04, 0x36, 0xc9, 0x2b, 0x42, 0x90, 0x17, 0x93, 0x5d,
0x51, 0xb6, 0x5c, 0x1b, 0xaf, 0x01, 0xa5, 0x33, 0xaf, 0x8a, 0xb9, 0x09, 0xfa, 0xe4, 0x45, 0x14,
0x97, 0x73, 0x21, 0x8b, 0xa7, 0x6d, 0xba, 0x3f, 0x03, 0x14, 0xc4, 0xe0, 0x65, 0x68, 0x08, 0xc5,
0x88, 0xd0, 0x51, 0xc7, 0x5c, 0xf4, 0x96, 0x34, 0xa7, 0x9e, 0x45, 0xf5, 0x27, 0xd9, 0x0d, 0x94,
0xe7, 0x7b, 0x50, 0x90, 0x2c, 0x8f, 0xcc, 0xc5, 0xa6, 0xe9, 0xe7, 0x40, 0xfd, 0xfe, 0x7b, 0x13,
0x6c, 0x47, 0xd4, 0x47, 0x78, 0x1f, 0x91, 0x75, 0x16, 0xef, 0xa7, 0x1e, 0x07, 0x59, 0xbc, 0x9f,
0x79, 0x07, 0x60, 0xc8, 0x0b, 0xb2, 0x44, 0x8f, 0x17, 0x5b, 0xa6, 0x78, 0xb9, 0x6e, 0x66, 0x55,
0x9f, 0x1c, 0x23, 0x58, 0x34, 0xcb, 0x31, 0x29, 0xf2, 0xcd, 0x72, 0xcc, 0x14, 0x39, 0xbf, 0x82,
0xbc, 0xa0, 0xda, 0x2c, 0xc7, 0xa4, 0x28, 0x79, 0x6e, 0x25, 0x5e, 0x43, 0x31, 0x22, 0xca, 0x2c,
0x95, 0x98, 0xa2, 0xd4, 0xfa, 0xcd, 0x4f, 0x63, 0xa9, 0xf3, 0x44, 0x13, 0xe9, 0x10, 0x04, 0x95,
0xc5, 0xcf, 0x14, 0x2f, 0x67, 0x49, 0xc7, 0x14, 0xef, 0xbd, 0x80, 0xdc, 0x3e, 0xbf, 0x40, 0x8f,
0x16, 0x9b, 0x4d, 0xb8, 0x70, 0x6e, 0x32, 0xde, 0x00, 0x4c, 0xf8, 0x0a, 0x6d, 0x64, 0xe8, 0x93,
0x59, 0x76, 0x9b, 0x0b, 0xbd, 0x07, 0x05, 0xc9, 0x57, 0x59, 0x5a, 0x28, 0x4d, 0x6c, 0x73, 0x01,
0xbf, 0x86, 0x62, 0x44, 0x5e, 0x59, 0x0a, 0x37, 0x45, 0x73, 0x73, 0x21, 0x39, 0x94, 0x13, 0x0a,
0x42, 0xdd, 0x0c, 0x7e, 0xce, 0xf0, 0x5e, 0x7d, 0xe3, 0x56, 0x36, 0xaa, 0x82, 0x67, 0x00, 0xa9,
0x71, 0x9a, 0x25, 0xe9, 0xb3, 0xa4, 0x56, 0xff, 0xf4, 0x76, 0x46, 0xd1, 0xc1, 0xbd, 0xda, 0xe5,
0xbb, 0xc6, 0xca, 0x6f, 0xef, 0x1a, 0x2b, 0x6f, 0xaf, 0x1b, 0xda, 0xe5, 0x75, 0x43, 0xfb, 0xf5,
0xba, 0xa1, 0xfd, 0x79, 0xdd, 0xd0, 0x8e, 0x8a, 0x32, 0x31, 0x1b, 0x7f, 0x07, 0x00, 0x00, 0xff,
0xff, 0x7f, 0x76, 0x43, 0x00, 0xef, 0x0f, 0x00, 0x00,
0x13, 0x37, 0xad, 0x8f, 0xbf, 0x34, 0x94, 0x12, 0x7b, 0x61, 0x04, 0x8a, 0xf2, 0xaf, 0x24, 0x10,
0x28, 0xa0, 0x16, 0x09, 0x95, 0x2a, 0x45, 0x0f, 0x41, 0x8b, 0xc0, 0xb2, 0x9d, 0xd6, 0x48, 0x52,
0xbb, 0xb4, 0xdb, 0x20, 0x40, 0x01, 0x81, 0x26, 0xd7, 0xf2, 0x42, 0x14, 0x97, 0xe5, 0xae, 0x6c,
0xeb, 0x96, 0x37, 0x68, 0xcf, 0x7d, 0x82, 0xbe, 0x48, 0x01, 0x5f, 0x0a, 0xf4, 0x58, 0xf4, 0xe0,
0x36, 0x7e, 0x8a, 0x1e, 0x8b, 0xdd, 0x25, 0x25, 0x4a, 0xb1, 0x2a, 0x3a, 0xca, 0x45, 0xda, 0x1d,
0xce, 0xcc, 0xee, 0xfe, 0xe6, 0xe3, 0x37, 0xf0, 0x65, 0x8f, 0xf0, 0x93, 0xe1, 0x91, 0xe9, 0xd0,
0x41, 0xcb, 0xa1, 0x3e, 0xb7, 0x89, 0x8f, 0x43, 0x37, 0xb9, 0xb4, 0x03, 0xd2, 0x62, 0x38, 0x3c,
0x25, 0x0e, 0x66, 0x2d, 0x7c, 0x8e, 0x9d, 0x21, 0x27, 0xd4, 0x9f, 0xac, 0xcc, 0x20, 0xa4, 0x9c,
0xa2, 0xc6, 0xc4, 0xc4, 0x3c, 0xfd, 0xc4, 0x8c, 0x2d, 0xcc, 0xb1, 0x5e, 0xf5, 0x5e, 0x8f, 0xd2,
0x9e, 0x87, 0x5b, 0x52, 0xff, 0x68, 0x78, 0xdc, 0xc2, 0x83, 0x80, 0x8f, 0x94, 0x79, 0xf5, 0xee,
0xec, 0x47, 0xdb, 0x8f, 0x3f, 0x6d, 0xf4, 0x68, 0x8f, 0xca, 0x65, 0x4b, 0xac, 0x22, 0xe9, 0xe7,
0xa9, 0x2e, 0xce, 0x47, 0x01, 0x66, 0xad, 0x01, 0x1d, 0xfa, 0x5c, 0xfd, 0x46, 0xd6, 0x4f, 0x6f,
0x60, 0xed, 0x62, 0xe6, 0x84, 0x24, 0xe0, 0x34, 0x4c, 0x2c, 0x23, 0x3f, 0x8f, 0x6f, 0xe0, 0x87,
0xdb, 0xac, 0x2f, 0x7f, 0x22, 0xdb, 0xfa, 0xec, 0x93, 0x39, 0x19, 0x60, 0xc6, 0xed, 0x41, 0xa0,
0x14, 0x8c, 0x9f, 0x57, 0xa1, 0xbc, 0x15, 0x62, 0x9b, 0x63, 0x0b, 0xff, 0x30, 0xc4, 0x8c, 0xa3,
0x36, 0x94, 0xc6, 0xae, 0xbb, 0xc4, 0xad, 0xac, 0x36, 0xb4, 0x66, 0xb1, 0x73, 0xfb, 0xea, 0xb2,
0xae, 0x6f, 0xc5, 0xf2, 0xdd, 0x6d, 0x4b, 0x1f, 0x2b, 0xed, 0xba, 0xa8, 0x0d, 0xf9, 0x90, 0x52,
0x7e, 0xcc, 0x2a, 0x99, 0x46, 0xa6, 0xa9, 0xb7, 0xab, 0xe6, 0x74, 0xa4, 0xe4, 0xe5, 0xcc, 0x17,
0x02, 0x1c, 0x2b, 0xd2, 0x44, 0x1b, 0x90, 0x63, 0xdc, 0x25, 0x7e, 0x25, 0x27, 0x0e, 0xb0, 0xd4,
0x06, 0xdd, 0x81, 0x3c, 0xe3, 0x2e, 0x1d, 0xf2, 0x4a, 0x5e, 0x8a, 0xa3, 0x5d, 0x24, 0xc7, 0x61,
0x58, 0xf9, 0xdf, 0x58, 0x8e, 0xc3, 0x10, 0x55, 0xa1, 0xc0, 0x71, 0x38, 0x20, 0xbe, 0xed, 0x55,
0x0a, 0x0d, 0xad, 0x59, 0xb0, 0xc6, 0x7b, 0xf4, 0x04, 0xc0, 0x39, 0xc1, 0x4e, 0x3f, 0xa0, 0xc4,
0xe7, 0x95, 0x62, 0x43, 0x6b, 0xea, 0xed, 0xfa, 0xb5, 0x37, 0xdb, 0x1e, 0x63, 0x6e, 0x25, 0x4c,
0x8c, 0xef, 0xe0, 0x56, 0x8c, 0x0d, 0x0b, 0xa8, 0xcf, 0xf0, 0x3b, 0x81, 0xb3, 0x06, 0x99, 0x80,
0xb8, 0x95, 0x4c, 0x43, 0x6b, 0x96, 0x2d, 0xb1, 0x34, 0x3a, 0x50, 0x3a, 0xe0, 0x76, 0xc8, 0xe7,
0x41, 0xae, 0x2d, 0xf6, 0x6a, 0x6c, 0x41, 0x79, 0x1b, 0x7b, 0x78, 0x7e, 0xdc, 0xd2, 0x38, 0xf9,
0x45, 0x83, 0x5b, 0xb1, 0x97, 0x39, 0x2f, 0x4c, 0xe1, 0x06, 0xd5, 0x41, 0xc7, 0xe7, 0x84, 0x77,
0x19, 0xb7, 0xf9, 0x90, 0x49, 0x50, 0xca, 0x16, 0x08, 0xd1, 0x81, 0x94, 0xa0, 0x4d, 0x28, 0x8a,
0x1d, 0x76, 0xbb, 0x36, 0x97, 0x40, 0x88, 0x14, 0x51, 0xa9, 0x69, 0xc6, 0xa9, 0x69, 0x1e, 0xc6,
0xa9, 0xd9, 0x29, 0x5c, 0x5c, 0xd6, 0x57, 0x7e, 0xfa, 0xab, 0xae, 0x59, 0x05, 0x65, 0xb6, 0xc9,
0x8d, 0xef, 0x61, 0x43, 0xdd, 0x74, 0x3f, 0xa4, 0x0e, 0x66, 0x6c, 0x89, 0x67, 0xc7, 0x11, 0x59,
0x9d, 0x44, 0x64, 0x13, 0xf4, 0x5d, 0xff, 0x98, 0x2e, 0x83, 0xe5, 0x17, 0x50, 0x52, 0x2e, 0x22,
0x20, 0x1f, 0x40, 0x56, 0x14, 0xa2, 0xb4, 0xd5, 0xdb, 0x77, 0xaf, 0xcd, 0xbb, 0x43, 0x9b, 0xf5,
0x2d, 0xa9, 0x66, 0x94, 0x41, 0x7f, 0x4e, 0x58, 0x9c, 0x12, 0xc6, 0x13, 0x28, 0xa9, 0x6d, 0xe4,
0xad, 0x05, 0x39, 0xa1, 0xc6, 0x2a, 0x9a, 0x2c, 0xb0, 0xff, 0x70, 0xa7, 0xf4, 0x8c, 0x1f, 0x35,
0xd0, 0x9f, 0x11, 0xcf, 0x5b, 0x06, 0x27, 0x51, 0x74, 0xa4, 0x27, 0x4a, 0x4b, 0x41, 0x15, 0xed,
0x10, 0x82, 0x8c, 0xed, 0x79, 0x32, 0x90, 0x85, 0xaf, 0x56, 0x2c, 0xb1, 0x11, 0x32, 0x81, 0x69,
0x56, 0x28, 0x0a, 0x59, 0x40, 0xdc, 0x4e, 0x09, 0x20, 0x20, 0x6e, 0x97, 0x86, 0x5d, 0xdb, 0xf3,
0x8c, 0xdb, 0x50, 0xde, 0x39, 0xc5, 0x3e, 0x8f, 0x43, 0x67, 0xfc, 0xa6, 0x81, 0xbe, 0x73, 0x8e,
0x9d, 0x65, 0xae, 0x98, 0xac, 0xff, 0xd5, 0x99, 0xfa, 0x1f, 0x77, 0x98, 0xcc, 0xf5, 0x1d, 0x26,
0x3b, 0xa7, 0xc3, 0xe4, 0xa6, 0x3a, 0x4c, 0x13, 0xb2, 0x2c, 0xc0, 0x8e, 0xec, 0x47, 0x7a, 0x7b,
0xe3, 0xad, 0xb4, 0xdd, 0xf4, 0x47, 0x96, 0xd4, 0x30, 0x1a, 0x50, 0x52, 0xcf, 0x89, 0x62, 0x16,
0xa5, 0x99, 0x36, 0x49, 0xb3, 0xd7, 0x1a, 0xc0, 0x3e, 0x1f, 0xbd, 0xd7, 0xdc, 0x15, 0xcf, 0x3c,
0x23, 0x2e, 0x3f, 0x89, 0x3a, 0x8c, 0xda, 0x88, 0xe7, 0x9c, 0x60, 0xd2, 0x3b, 0x51, 0xcf, 0x2c,
0x5b, 0xd1, 0xce, 0x78, 0x05, 0xeb, 0x5b, 0x1e, 0x65, 0xf8, 0x40, 0x80, 0xf1, 0x7e, 0x8b, 0xa8,
0x03, 0xa5, 0x7d, 0x7b, 0xc8, 0xf0, 0x92, 0x6d, 0xcd, 0xc2, 0x6c, 0x38, 0x58, 0xca, 0xc9, 0x53,
0x58, 0x8b, 0xba, 0x04, 0x5e, 0xa6, 0x4f, 0x18, 0x7b, 0xb0, 0x9e, 0xf0, 0x13, 0x45, 0xf5, 0x31,
0x14, 0x83, 0x58, 0x18, 0x55, 0xe3, 0xff, 0xaf, 0xad, 0xc6, 0xb8, 0x51, 0x4d, 0xd4, 0x8d, 0x7f,
0x56, 0x61, 0x7d, 0x6b, 0xcc, 0x2f, 0xcb, 0xa0, 0x7f, 0x0f, 0x8a, 0xb6, 0xe7, 0xd1, 0xb3, 0x2e,
0x77, 0x82, 0x38, 0xf1, 0xa5, 0xe0, 0xd0, 0x09, 0xd0, 0x7d, 0x40, 0xea, 0xe3, 0xd0, 0x27, 0xe7,
0x5d, 0x46, 0x9d, 0x3e, 0xe6, 0x4c, 0x95, 0xab, 0xb5, 0x26, 0xbf, 0x7c, 0xeb, 0x93, 0xf3, 0x03,
0x25, 0x47, 0x1f, 0xc2, 0xad, 0xc8, 0x55, 0x5c, 0x48, 0x59, 0xa9, 0x59, 0x56, 0xfe, 0xe2, 0x6a,
0xfa, 0x00, 0xe0, 0x98, 0x78, 0xb8, 0xeb, 0x51, 0xa7, 0xcf, 0x64, 0x8d, 0x14, 0xac, 0xa2, 0x90,
0x3c, 0x17, 0x02, 0xf4, 0x11, 0xac, 0xc9, 0x59, 0xab, 0xeb, 0xdb, 0x03, 0xcc, 0x02, 0xdb, 0xc1,
0xac, 0x92, 0x6f, 0x64, 0x9a, 0x45, 0xeb, 0xb6, 0x94, 0x7f, 0x3d, 0x16, 0xa3, 0x2e, 0xac, 0x07,
0x76, 0x88, 0x7d, 0xde, 0x4d, 0xd0, 0xb3, 0xa4, 0xf5, 0x4e, 0x5b, 0x74, 0xfe, 0x3f, 0x2f, 0xeb,
0x1f, 0x27, 0x66, 0x1e, 0x1a, 0x60, 0x7f, 0xfc, 0x74, 0xd6, 0xea, 0xd1, 0x07, 0x2e, 0xe9, 0x61,
0xc6, 0xcd, 0x6d, 0xf9, 0x67, 0xad, 0x29, 0x67, 0x13, 0x5c, 0x11, 0x82, 0xac, 0xe0, 0x8d, 0x68,
0x20, 0x90, 0x6b, 0xe3, 0x25, 0xa0, 0x24, 0xf2, 0x51, 0x30, 0x37, 0x41, 0x9f, 0xcc, 0x5b, 0x71,
0x38, 0x17, 0xce, 0x08, 0x49, 0x9b, 0xf6, 0xaf, 0x3a, 0xe4, 0x44, 0xe3, 0x65, 0xa8, 0x0f, 0x79,
0x35, 0x2e, 0xa0, 0x96, 0xb9, 0x68, 0x52, 0x35, 0xa7, 0x86, 0xae, 0xea, 0xc3, 0xf4, 0x06, 0xd1,
0xcd, 0xf7, 0x20, 0x27, 0x67, 0x08, 0x64, 0x2e, 0x36, 0x4d, 0x0e, 0x1b, 0xd5, 0x3b, 0x6f, 0x75,
0xb0, 0x1d, 0x11, 0x1f, 0x71, 0x7b, 0x45, 0xb0, 0x69, 0x6e, 0x3f, 0x35, 0x7a, 0xa4, 0xb9, 0xfd,
0xcc, 0x94, 0x31, 0x8a, 0xa7, 0x97, 0xa8, 0x48, 0xd0, 0x67, 0x69, 0x5d, 0x4c, 0xd3, 0xff, 0x3b,
0x1c, 0x8d, 0x21, 0x2b, 0x78, 0x1a, 0x3d, 0x58, 0x6c, 0x99, 0x18, 0x09, 0xaa, 0x66, 0x5a, 0xf5,
0xc9, 0x31, 0x82, 0xc0, 0xd3, 0x1c, 0x93, 0xe0, 0xfd, 0x34, 0xc7, 0x4c, 0xcd, 0x05, 0x2f, 0x20,
0x2b, 0x58, 0x3e, 0xcd, 0x31, 0x89, 0x69, 0x60, 0x6e, 0x12, 0xbc, 0x84, 0xbc, 0xe2, 0xe8, 0x34,
0x49, 0x30, 0xc5, 0xe6, 0xd5, 0xeb, 0x67, 0x7e, 0xa9, 0xf3, 0x50, 0x13, 0x70, 0x08, 0x6e, 0x4c,
0x73, 0xcf, 0xc4, 0x48, 0x90, 0x06, 0x8e, 0x29, 0xca, 0x7d, 0x06, 0x99, 0x7d, 0x3e, 0x42, 0xf7,
0x17, 0x9b, 0x4d, 0x68, 0x78, 0x2e, 0x18, 0xaf, 0x00, 0x26, 0x54, 0x89, 0x1e, 0xa5, 0x28, 0xd1,
0x59, 0x62, 0x9d, 0xeb, 0x7a, 0x0f, 0x72, 0x92, 0x2a, 0xd3, 0x54, 0x6f, 0x92, 0x53, 0xe7, 0x3a,
0xfc, 0x06, 0xf2, 0x8a, 0x37, 0xd3, 0x04, 0x6e, 0x8a, 0x61, 0xe7, 0xba, 0xe4, 0x50, 0x1c, 0xb3,
0x1f, 0x6a, 0xa7, 0xb8, 0xe7, 0x0c, 0xe5, 0x56, 0x1f, 0xdd, 0xc8, 0x26, 0x8a, 0xe0, 0x19, 0x40,
0xa2, 0x93, 0xa7, 0x01, 0x7d, 0x96, 0x4f, 0xab, 0x9f, 0xde, 0xcc, 0x48, 0x1d, 0xdc, 0xa9, 0x5c,
0xbc, 0xa9, 0xad, 0xfc, 0xf1, 0xa6, 0xb6, 0xf2, 0xfa, 0xaa, 0xa6, 0x5d, 0x5c, 0xd5, 0xb4, 0xdf,
0xaf, 0x6a, 0xda, 0xdf, 0x57, 0x35, 0xed, 0x28, 0x2f, 0x81, 0x79, 0xf4, 0x6f, 0x00, 0x00, 0x00,
0xff, 0xff, 0x46, 0xa7, 0x8c, 0x94, 0xc8, 0x10, 0x00, 0x00,
}

View File

@ -14,6 +14,7 @@ service Tasks {
rpc Create(CreateRequest) returns (CreateResponse);
rpc Start(StartRequest) returns (google.protobuf.Empty);
rpc Delete(DeleteRequest) returns (DeleteResponse);
rpc DeleteProcess(DeleteProcessRequest) returns (DeleteResponse);
rpc Info(InfoRequest) returns (InfoResponse);
rpc List(ListRequest) returns (ListResponse);
rpc Kill(KillRequest) returns (google.protobuf.Empty);
@ -81,6 +82,11 @@ message DeleteResponse {
google.protobuf.Timestamp exited_at = 3 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
}
message DeleteProcessRequest {
string container_id = 1;
uint32 pid = 2;
}
message InfoRequest {
string container_id = 1;
}

View File

@ -14,6 +14,7 @@
StartRequest
DeleteRequest
DeleteResponse
DeleteProcessRequest
ExecRequest
Rlimit
ExecResponse
@ -102,7 +103,6 @@ func (*StartRequest) ProtoMessage() {}
func (*StartRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{2} }
type DeleteRequest struct {
Pid uint32 `protobuf:"varint,1,opt,name=pid,proto3" json:"pid,omitempty"`
}
func (m *DeleteRequest) Reset() { *m = DeleteRequest{} }
@ -118,6 +118,14 @@ func (m *DeleteResponse) Reset() { *m = DeleteResponse{} }
func (*DeleteResponse) ProtoMessage() {}
func (*DeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{4} }
type DeleteProcessRequest struct {
Pid uint32 `protobuf:"varint,1,opt,name=pid,proto3" json:"pid,omitempty"`
}
func (m *DeleteProcessRequest) Reset() { *m = DeleteProcessRequest{} }
func (*DeleteProcessRequest) ProtoMessage() {}
func (*DeleteProcessRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{5} }
type ExecRequest struct {
Terminal bool `protobuf:"varint,1,opt,name=terminal,proto3" json:"terminal,omitempty"`
Stdin string `protobuf:"bytes,2,opt,name=stdin,proto3" json:"stdin,omitempty"`
@ -128,7 +136,7 @@ type ExecRequest struct {
func (m *ExecRequest) Reset() { *m = ExecRequest{} }
func (*ExecRequest) ProtoMessage() {}
func (*ExecRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{5} }
func (*ExecRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{6} }
type Rlimit struct {
Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
@ -138,7 +146,7 @@ type Rlimit struct {
func (m *Rlimit) Reset() { *m = Rlimit{} }
func (*Rlimit) ProtoMessage() {}
func (*Rlimit) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{6} }
func (*Rlimit) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{7} }
type ExecResponse struct {
Pid uint32 `protobuf:"varint,1,opt,name=pid,proto3" json:"pid,omitempty"`
@ -146,7 +154,7 @@ type ExecResponse struct {
func (m *ExecResponse) Reset() { *m = ExecResponse{} }
func (*ExecResponse) ProtoMessage() {}
func (*ExecResponse) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{7} }
func (*ExecResponse) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{8} }
type PtyRequest struct {
Pid uint32 `protobuf:"varint,1,opt,name=pid,proto3" json:"pid,omitempty"`
@ -156,21 +164,21 @@ type PtyRequest struct {
func (m *PtyRequest) Reset() { *m = PtyRequest{} }
func (*PtyRequest) ProtoMessage() {}
func (*PtyRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{8} }
func (*PtyRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{9} }
type EventsRequest struct {
}
func (m *EventsRequest) Reset() { *m = EventsRequest{} }
func (*EventsRequest) ProtoMessage() {}
func (*EventsRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{9} }
func (*EventsRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{10} }
type StateRequest struct {
}
func (m *StateRequest) Reset() { *m = StateRequest{} }
func (*StateRequest) ProtoMessage() {}
func (*StateRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{10} }
func (*StateRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{11} }
type StateResponse struct {
ID string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
@ -186,28 +194,28 @@ type StateResponse struct {
func (m *StateResponse) Reset() { *m = StateResponse{} }
func (*StateResponse) ProtoMessage() {}
func (*StateResponse) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{11} }
func (*StateResponse) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{12} }
type PauseRequest struct {
}
func (m *PauseRequest) Reset() { *m = PauseRequest{} }
func (*PauseRequest) ProtoMessage() {}
func (*PauseRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{12} }
func (*PauseRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{13} }
type ResumeRequest struct {
}
func (m *ResumeRequest) Reset() { *m = ResumeRequest{} }
func (*ResumeRequest) ProtoMessage() {}
func (*ResumeRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{13} }
func (*ResumeRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{14} }
type ExitRequest struct {
}
func (m *ExitRequest) Reset() { *m = ExitRequest{} }
func (*ExitRequest) ProtoMessage() {}
func (*ExitRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{14} }
func (*ExitRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{15} }
type KillRequest struct {
Signal uint32 `protobuf:"varint,1,opt,name=signal,proto3" json:"signal,omitempty"`
@ -217,7 +225,7 @@ type KillRequest struct {
func (m *KillRequest) Reset() { *m = KillRequest{} }
func (*KillRequest) ProtoMessage() {}
func (*KillRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{15} }
func (*KillRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{16} }
type CloseStdinRequest struct {
Pid uint32 `protobuf:"varint,1,opt,name=pid,proto3" json:"pid,omitempty"`
@ -225,7 +233,7 @@ type CloseStdinRequest struct {
func (m *CloseStdinRequest) Reset() { *m = CloseStdinRequest{} }
func (*CloseStdinRequest) ProtoMessage() {}
func (*CloseStdinRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{16} }
func (*CloseStdinRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{17} }
type ProcessesRequest struct {
ID string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
@ -233,7 +241,7 @@ type ProcessesRequest struct {
func (m *ProcessesRequest) Reset() { *m = ProcessesRequest{} }
func (*ProcessesRequest) ProtoMessage() {}
func (*ProcessesRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{17} }
func (*ProcessesRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{18} }
type ProcessesResponse struct {
Processes []*containerd_v1_types1.Process `protobuf:"bytes,1,rep,name=processes" json:"processes,omitempty"`
@ -241,7 +249,7 @@ type ProcessesResponse struct {
func (m *ProcessesResponse) Reset() { *m = ProcessesResponse{} }
func (*ProcessesResponse) ProtoMessage() {}
func (*ProcessesResponse) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{18} }
func (*ProcessesResponse) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{19} }
type CheckpointRequest struct {
Exit bool `protobuf:"varint,1,opt,name=exit,proto3" json:"exit,omitempty"`
@ -255,7 +263,7 @@ type CheckpointRequest struct {
func (m *CheckpointRequest) Reset() { *m = CheckpointRequest{} }
func (*CheckpointRequest) ProtoMessage() {}
func (*CheckpointRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{19} }
func (*CheckpointRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{20} }
func init() {
proto.RegisterType((*CreateRequest)(nil), "containerd.v1.services.shim.CreateRequest")
@ -263,6 +271,7 @@ func init() {
proto.RegisterType((*StartRequest)(nil), "containerd.v1.services.shim.StartRequest")
proto.RegisterType((*DeleteRequest)(nil), "containerd.v1.services.shim.DeleteRequest")
proto.RegisterType((*DeleteResponse)(nil), "containerd.v1.services.shim.DeleteResponse")
proto.RegisterType((*DeleteProcessRequest)(nil), "containerd.v1.services.shim.DeleteProcessRequest")
proto.RegisterType((*ExecRequest)(nil), "containerd.v1.services.shim.ExecRequest")
proto.RegisterType((*Rlimit)(nil), "containerd.v1.services.shim.Rlimit")
proto.RegisterType((*ExecResponse)(nil), "containerd.v1.services.shim.ExecResponse")
@ -294,6 +303,7 @@ type ShimClient interface {
Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error)
Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*google_protobuf1.Empty, error)
Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error)
DeleteProcess(ctx context.Context, in *DeleteProcessRequest, opts ...grpc.CallOption) (*DeleteResponse, error)
State(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateResponse, error)
Processes(ctx context.Context, in *ProcessesRequest, opts ...grpc.CallOption) (*ProcessesResponse, error)
Pause(ctx context.Context, in *PauseRequest, opts ...grpc.CallOption) (*google_protobuf1.Empty, error)
@ -342,6 +352,15 @@ func (c *shimClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc
return out, nil
}
func (c *shimClient) DeleteProcess(ctx context.Context, in *DeleteProcessRequest, opts ...grpc.CallOption) (*DeleteResponse, error) {
out := new(DeleteResponse)
err := grpc.Invoke(ctx, "/containerd.v1.services.shim.Shim/DeleteProcess", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *shimClient) State(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateResponse, error) {
out := new(StateResponse)
err := grpc.Invoke(ctx, "/containerd.v1.services.shim.Shim/State", in, out, c.cc, opts...)
@ -470,6 +489,7 @@ type ShimServer interface {
Create(context.Context, *CreateRequest) (*CreateResponse, error)
Start(context.Context, *StartRequest) (*google_protobuf1.Empty, error)
Delete(context.Context, *DeleteRequest) (*DeleteResponse, error)
DeleteProcess(context.Context, *DeleteProcessRequest) (*DeleteResponse, error)
State(context.Context, *StateRequest) (*StateResponse, error)
Processes(context.Context, *ProcessesRequest) (*ProcessesResponse, error)
Pause(context.Context, *PauseRequest) (*google_protobuf1.Empty, error)
@ -541,6 +561,24 @@ func _Shim_Delete_Handler(srv interface{}, ctx context.Context, dec func(interfa
return interceptor(ctx, in, info, handler)
}
func _Shim_DeleteProcess_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(DeleteProcessRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ShimServer).DeleteProcess(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/containerd.v1.services.shim.Shim/DeleteProcess",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ShimServer).DeleteProcess(ctx, req.(*DeleteProcessRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Shim_State_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(StateRequest)
if err := dec(in); err != nil {
@ -758,6 +796,10 @@ var _Shim_serviceDesc = grpc.ServiceDesc{
MethodName: "Delete",
Handler: _Shim_Delete_Handler,
},
{
MethodName: "DeleteProcess",
Handler: _Shim_DeleteProcess_Handler,
},
{
MethodName: "State",
Handler: _Shim_State_Handler,
@ -963,11 +1005,6 @@ func (m *DeleteRequest) MarshalTo(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if m.Pid != 0 {
dAtA[i] = 0x8
i++
i = encodeVarintShim(dAtA, i, uint64(m.Pid))
}
return i, nil
}
@ -1002,6 +1039,29 @@ func (m *DeleteResponse) MarshalTo(dAtA []byte) (int, error) {
return i, nil
}
func (m *DeleteProcessRequest) 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 *DeleteProcessRequest) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if m.Pid != 0 {
dAtA[i] = 0x8
i++
i = encodeVarintShim(dAtA, i, uint64(m.Pid))
}
return i, nil
}
func (m *ExecRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@ -1617,9 +1677,6 @@ func (m *StartRequest) Size() (n int) {
func (m *DeleteRequest) Size() (n int) {
var l int
_ = l
if m.Pid != 0 {
n += 1 + sovShim(uint64(m.Pid))
}
return n
}
@ -1634,6 +1691,15 @@ func (m *DeleteResponse) Size() (n int) {
return n
}
func (m *DeleteProcessRequest) Size() (n int) {
var l int
_ = l
if m.Pid != 0 {
n += 1 + sovShim(uint64(m.Pid))
}
return n
}
func (m *ExecRequest) Size() (n int) {
var l int
_ = l
@ -1904,7 +1970,6 @@ func (this *DeleteRequest) String() string {
return "nil"
}
s := strings.Join([]string{`&DeleteRequest{`,
`Pid:` + fmt.Sprintf("%v", this.Pid) + `,`,
`}`,
}, "")
return s
@ -1920,6 +1985,16 @@ func (this *DeleteResponse) String() string {
}, "")
return s
}
func (this *DeleteProcessRequest) String() string {
if this == nil {
return "nil"
}
s := strings.Join([]string{`&DeleteProcessRequest{`,
`Pid:` + fmt.Sprintf("%v", this.Pid) + `,`,
`}`,
}, "")
return s
}
func (this *ExecRequest) String() string {
if this == nil {
return "nil"
@ -2598,25 +2673,6 @@ func (m *DeleteRequest) Unmarshal(dAtA []byte) error {
return fmt.Errorf("proto: DeleteRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType)
}
m.Pid = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowShim
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Pid |= (uint32(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipShim(dAtA[iNdEx:])
@ -2737,6 +2793,75 @@ func (m *DeleteResponse) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *DeleteProcessRequest) 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 ErrIntOverflowShim
}
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: DeleteProcessRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: DeleteProcessRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType)
}
m.Pid = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowShim
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Pid |= (uint32(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipShim(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthShim
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *ExecRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@ -4409,77 +4534,78 @@ func init() {
}
var fileDescriptorShim = []byte{
// 1149 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4f, 0x6f, 0xe3, 0x44,
0x14, 0x5f, 0x27, 0x69, 0x36, 0x79, 0xd9, 0xa4, 0xed, 0xa8, 0xaa, 0xbc, 0x29, 0xa4, 0xc5, 0xd2,
0x6a, 0xd3, 0x2e, 0x38, 0xd0, 0xbd, 0xad, 0xe0, 0xd0, 0x7f, 0x88, 0x85, 0x02, 0xd1, 0xb4, 0x9c,
0x90, 0x88, 0x5c, 0x67, 0x9a, 0x0c, 0x75, 0x3c, 0xc6, 0x33, 0xe9, 0xb6, 0x37, 0x3e, 0x00, 0x07,
0xae, 0xdc, 0xf9, 0x0e, 0x7c, 0x85, 0x1e, 0xb9, 0xc1, 0x69, 0x61, 0xfb, 0x49, 0xd0, 0xfc, 0xb1,
0x9d, 0xb4, 0x75, 0xd2, 0x4a, 0x5c, 0xac, 0x99, 0x37, 0xbf, 0x79, 0xf3, 0xde, 0xfb, 0xbd, 0x3f,
0x86, 0xcf, 0x06, 0x54, 0x0c, 0xc7, 0x27, 0xae, 0xcf, 0x46, 0x1d, 0x9f, 0x85, 0xc2, 0xa3, 0x21,
0x89, 0xfb, 0x93, 0x4b, 0x2f, 0xa2, 0x1d, 0x4e, 0xe2, 0x73, 0xea, 0x13, 0xde, 0xe1, 0x43, 0x3a,
0x52, 0x1f, 0x37, 0x8a, 0x99, 0x60, 0x68, 0x2d, 0x03, 0xba, 0xe7, 0x9f, 0xb8, 0x09, 0xce, 0x95,
0x90, 0xe6, 0xd3, 0x01, 0x63, 0x83, 0x80, 0x74, 0x14, 0xf4, 0x64, 0x7c, 0xda, 0xf1, 0xc2, 0x4b,
0x7d, 0xaf, 0xb9, 0x76, 0xf3, 0x88, 0x8c, 0x22, 0x91, 0x1c, 0xae, 0x0c, 0xd8, 0x80, 0xa9, 0x65,
0x47, 0xae, 0x8c, 0xf4, 0xd3, 0x7b, 0x59, 0x2a, 0x2e, 0x23, 0xc2, 0x3b, 0x23, 0x36, 0x0e, 0x85,
0xfe, 0x9a, 0xdb, 0xaf, 0x1e, 0x70, 0x5b, 0x78, 0xfc, 0x4c, 0x7d, 0xcc, 0xdd, 0xf5, 0x9b, 0xc6,
0x0a, 0x3a, 0x22, 0x5c, 0x78, 0xa3, 0x48, 0x03, 0x9c, 0xbf, 0x0a, 0x50, 0xdf, 0x8b, 0x89, 0x27,
0x08, 0x26, 0x3f, 0x8d, 0x09, 0x17, 0x68, 0x15, 0x0a, 0xb4, 0x6f, 0x5b, 0x1b, 0x56, 0xbb, 0xba,
0x5b, 0xbe, 0x7e, 0xbb, 0x5e, 0x78, 0xbd, 0x8f, 0x0b, 0xb4, 0x8f, 0x56, 0xa1, 0x7c, 0x32, 0x0e,
0xfb, 0x01, 0xb1, 0x0b, 0xf2, 0x0c, 0x9b, 0x1d, 0xb2, 0xe1, 0x71, 0x3c, 0x0e, 0xa5, 0x5e, 0xbb,
0xa8, 0x0e, 0x92, 0x2d, 0x7a, 0x0a, 0x95, 0x90, 0xf5, 0x22, 0x7a, 0xce, 0x84, 0x5d, 0xda, 0xb0,
0xda, 0x15, 0xfc, 0x38, 0x64, 0x5d, 0xb9, 0x45, 0x4d, 0xa8, 0x08, 0x12, 0x8f, 0x68, 0xe8, 0x05,
0xf6, 0x82, 0x3a, 0x4a, 0xf7, 0x68, 0x05, 0x16, 0xb8, 0xe8, 0xd3, 0xd0, 0x2e, 0x2b, 0x75, 0x7a,
0x23, 0x9f, 0xe7, 0xa2, 0xcf, 0xc6, 0xc2, 0x7e, 0xac, 0x9f, 0xd7, 0x3b, 0x23, 0x27, 0x71, 0x6c,
0x57, 0x52, 0x39, 0x89, 0x63, 0xb4, 0x0d, 0xe5, 0x98, 0x31, 0x71, 0xca, 0xed, 0xea, 0x46, 0xb1,
0x5d, 0xdb, 0x6e, 0xba, 0xd3, 0x7c, 0xab, 0x78, 0xb9, 0x5f, 0xcb, 0x38, 0x63, 0x83, 0x44, 0x2d,
0x00, 0x7f, 0x48, 0xfc, 0xb3, 0x88, 0xd1, 0x50, 0xd8, 0xa0, 0xf4, 0x4d, 0x48, 0xd0, 0x0b, 0x58,
0x8e, 0xbc, 0x98, 0x84, 0xa2, 0x37, 0x01, 0xab, 0x29, 0xd8, 0x92, 0x3e, 0xd8, 0x4b, 0xe5, 0x8e,
0x03, 0x8d, 0x24, 0xb0, 0x3c, 0x62, 0x21, 0x27, 0x68, 0x09, 0x8a, 0x91, 0x09, 0x6d, 0x1d, 0xcb,
0xa5, 0xd3, 0x80, 0x27, 0x47, 0xc2, 0x8b, 0x85, 0x89, 0xbd, 0xf3, 0x01, 0xd4, 0xf7, 0x49, 0x40,
0x32, 0x32, 0x6e, 0x5f, 0x11, 0xd0, 0x48, 0x20, 0x46, 0xed, 0x3a, 0xd4, 0xc8, 0x05, 0x15, 0x3d,
0x2e, 0x3c, 0x31, 0xe6, 0x06, 0x0b, 0x52, 0x74, 0xa4, 0x24, 0x68, 0x07, 0xaa, 0x72, 0x47, 0xfa,
0x3d, 0x4f, 0x28, 0xf2, 0x64, 0x34, 0x74, 0x62, 0xb8, 0x49, 0x62, 0xb8, 0xc7, 0x49, 0x62, 0xec,
0x56, 0xae, 0xde, 0xae, 0x3f, 0xfa, 0xf5, 0x9f, 0x75, 0x0b, 0x57, 0xf4, 0xb5, 0x1d, 0xe1, 0xfc,
0x66, 0x41, 0xed, 0xe0, 0x82, 0xf8, 0x89, 0x5d, 0x93, 0xfc, 0x59, 0x79, 0xfc, 0x15, 0xee, 0xe6,
0xaf, 0x98, 0xc3, 0x5f, 0x69, 0x8a, 0xbf, 0x36, 0x94, 0x78, 0x44, 0x7c, 0x95, 0x1d, 0xb5, 0xed,
0x95, 0x5b, 0xf6, 0xee, 0x84, 0x97, 0x58, 0x21, 0x9c, 0x7d, 0x28, 0xe3, 0x80, 0x8e, 0xa8, 0x40,
0x08, 0x4a, 0x92, 0x56, 0x9d, 0xbc, 0x58, 0xad, 0xa5, 0x6c, 0xe8, 0xc5, 0x7d, 0x65, 0x4c, 0x09,
0xab, 0xb5, 0x94, 0x71, 0x76, 0xaa, 0x2d, 0x29, 0x61, 0xb5, 0x76, 0x36, 0xe0, 0x89, 0x76, 0x30,
0x97, 0xac, 0x43, 0x80, 0xae, 0xb8, 0xcc, 0x65, 0x46, 0xfa, 0xfd, 0x86, 0xf6, 0xc5, 0x50, 0x3d,
0x55, 0xc7, 0x7a, 0x23, 0xfd, 0x1b, 0x12, 0x3a, 0x18, 0xea, 0xd7, 0xea, 0xd8, 0xec, 0x9c, 0x45,
0xa8, 0x1f, 0x9c, 0x93, 0x50, 0xf0, 0x84, 0x7b, 0x9d, 0x0b, 0x29, 0xf5, 0xce, 0xef, 0x05, 0xa8,
0x1b, 0x81, 0x31, 0xe9, 0xa1, 0x95, 0x69, 0x4c, 0x2c, 0x66, 0x26, 0xbe, 0x94, 0xc1, 0x56, 0x59,
0x22, 0x83, 0xdd, 0xd8, 0x5e, 0xbb, 0xb3, 0x28, 0x74, 0xda, 0x60, 0x03, 0x45, 0xaf, 0xa0, 0x1a,
0xc5, 0xcc, 0x27, 0x9c, 0x13, 0x6e, 0x2f, 0xa8, 0x62, 0x7a, 0xef, 0xce, 0x7b, 0x5d, 0x8d, 0xc2,
0x19, 0xfc, 0x7f, 0xaa, 0xe5, 0xc9, 0x6c, 0xab, 0x4e, 0x67, 0x9b, 0x0c, 0x5b, 0xd7, 0x1b, 0xf3,
0x34, 0x6c, 0x8b, 0x50, 0xc7, 0x84, 0x8f, 0x47, 0xa9, 0xa0, 0x2e, 0x33, 0x97, 0xa6, 0x25, 0xf6,
0x1a, 0x6a, 0x5f, 0xd1, 0x20, 0xc8, 0xba, 0x5d, 0x99, 0xd3, 0x41, 0x92, 0xc6, 0x75, 0x6c, 0x76,
0x32, 0x76, 0x5e, 0x10, 0xa8, 0x80, 0x56, 0xb0, 0x5c, 0xde, 0x8e, 0xa6, 0xf3, 0x0c, 0x96, 0xf7,
0x02, 0xc6, 0xc9, 0x91, 0x74, 0x2a, 0xbf, 0x62, 0xb7, 0x60, 0xa9, 0x9b, 0x04, 0x64, 0x4e, 0x93,
0x75, 0xbe, 0x85, 0xe5, 0x09, 0xac, 0xe1, 0x7d, 0x8a, 0x00, 0xeb, 0x41, 0x04, 0x38, 0xbf, 0x14,
0x60, 0x39, 0x6b, 0x4a, 0xc9, 0xf3, 0x08, 0x4a, 0xb2, 0xb4, 0x4d, 0xe9, 0xaa, 0x35, 0x5a, 0x83,
0xaa, 0x17, 0x04, 0xec, 0x4d, 0x4f, 0xf8, 0x91, 0xf1, 0xbb, 0xa2, 0x04, 0xc7, 0x7e, 0x84, 0x3e,
0x04, 0xa4, 0x0f, 0xc7, 0x21, 0xbd, 0xe8, 0x71, 0xe6, 0x9f, 0x11, 0xc1, 0x55, 0x2c, 0x2a, 0x78,
0x49, 0x9d, 0x7c, 0x17, 0xd2, 0x8b, 0x23, 0x2d, 0x47, 0xcf, 0xa0, 0x61, 0x54, 0x25, 0xac, 0xe9,
0xf6, 0x5f, 0xd7, 0xfa, 0x92, 0x46, 0xf1, 0x3e, 0xc0, 0x29, 0x0d, 0x48, 0x2f, 0x60, 0xfe, 0x19,
0x37, 0x63, 0xa0, 0x2a, 0x25, 0x87, 0x52, 0x80, 0x36, 0x61, 0x49, 0x8d, 0xd6, 0x5e, 0xe8, 0x8d,
0x08, 0x8f, 0x3c, 0x9f, 0x70, 0xbb, 0xbc, 0x51, 0x6c, 0x57, 0xf1, 0xa2, 0x92, 0x7f, 0x93, 0x8a,
0xd1, 0x73, 0x58, 0xcc, 0x3a, 0x72, 0x2f, 0xf2, 0xc4, 0xd0, 0x64, 0x56, 0x23, 0x13, 0x77, 0x3d,
0x31, 0xdc, 0xfe, 0xa3, 0x0a, 0xa5, 0xa3, 0x21, 0x1d, 0x21, 0x0f, 0xca, 0xba, 0x3b, 0xa3, 0x2d,
0x77, 0xc6, 0x8f, 0x80, 0x3b, 0x35, 0x1b, 0x9b, 0x2f, 0xee, 0x85, 0x35, 0xb4, 0x7d, 0x09, 0x0b,
0xaa, 0xb9, 0xa3, 0xcd, 0x99, 0xb7, 0x26, 0x07, 0x40, 0x73, 0xf5, 0x56, 0x9f, 0x3b, 0x90, 0xae,
0x4a, 0x73, 0x75, 0xd7, 0x9f, 0x63, 0xee, 0xd4, 0xf4, 0x98, 0x63, 0xee, 0x8d, 0x31, 0xf2, 0x83,
0x32, 0x57, 0x90, 0xf9, 0xe6, 0x66, 0x0f, 0x6c, 0xdd, 0x07, 0x6a, 0xf4, 0xff, 0x08, 0xd5, 0x34,
0xb5, 0xd1, 0x47, 0x33, 0x2f, 0xde, 0x2c, 0x97, 0xa6, 0x7b, 0x5f, 0x78, 0x16, 0x7a, 0xd5, 0x14,
0xe6, 0xf8, 0x32, 0xd9, 0x38, 0x72, 0x43, 0x7f, 0x08, 0x65, 0xdd, 0x50, 0xe6, 0x84, 0x7e, 0xaa,
0xeb, 0xe4, 0x6a, 0x3b, 0x06, 0xc8, 0xca, 0x11, 0xcd, 0xf6, 0xeb, 0x56, 0xdd, 0xe6, 0x6a, 0xfd,
0x02, 0x4a, 0xb2, 0xc7, 0xa1, 0xf6, 0x4c, 0x7d, 0x13, 0x6d, 0x30, 0x57, 0x13, 0x86, 0xb2, 0x1e,
0x4b, 0x73, 0xbc, 0x9d, 0x9a, 0x5d, 0xcd, 0xbb, 0x7f, 0xae, 0x14, 0xe6, 0x63, 0x4b, 0x5a, 0x27,
0x5b, 0xee, 0x1c, 0xeb, 0x26, 0xba, 0x72, 0xae, 0x75, 0xdf, 0x4b, 0x3f, 0x89, 0x3f, 0xd7, 0xcf,
0xf4, 0x47, 0xa5, 0xb9, 0x79, 0x0f, 0xa4, 0x49, 0x9a, 0xcf, 0xa1, 0xd8, 0x15, 0x97, 0xe8, 0xf9,
0xec, 0x94, 0x49, 0xff, 0x00, 0x66, 0x52, 0x9c, 0x8e, 0x85, 0x79, 0x14, 0xdf, 0x9c, 0x1f, 0x79,
0x5a, 0x77, 0xed, 0xab, 0x77, 0xad, 0x47, 0x7f, 0xbf, 0x6b, 0x3d, 0xfa, 0xf9, 0xba, 0x65, 0x5d,
0x5d, 0xb7, 0xac, 0x3f, 0xaf, 0x5b, 0xd6, 0xbf, 0xd7, 0x2d, 0xeb, 0xa4, 0xac, 0x90, 0x2f, 0xff,
0x0b, 0x00, 0x00, 0xff, 0xff, 0xa8, 0x64, 0xea, 0xc1, 0x10, 0x0d, 0x00, 0x00,
// 1168 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcd, 0x6e, 0x23, 0x45,
0x10, 0xce, 0xd8, 0x8e, 0x63, 0x97, 0xd7, 0x4e, 0xd2, 0x8a, 0xa2, 0x59, 0x07, 0x9c, 0x68, 0xa4,
0xd5, 0x3a, 0x59, 0x18, 0xb3, 0xd9, 0xdb, 0x0a, 0x0e, 0xf9, 0x43, 0x2c, 0x04, 0xb0, 0x26, 0xe1,
0x84, 0x84, 0x35, 0x19, 0x77, 0xec, 0x26, 0xe3, 0xe9, 0x61, 0xba, 0x9d, 0x4d, 0x6e, 0x3c, 0x00,
0x07, 0xae, 0xdc, 0x39, 0xf0, 0x28, 0x39, 0x72, 0x83, 0xd3, 0xc2, 0xe6, 0x49, 0x50, 0xff, 0xcc,
0x8f, 0x93, 0x8c, 0xed, 0x48, 0x5c, 0x46, 0xdd, 0xd5, 0xd5, 0xd5, 0x55, 0xf5, 0x7d, 0x55, 0x35,
0xf0, 0xd9, 0x80, 0xf0, 0xe1, 0xf8, 0xcc, 0xf6, 0xe8, 0xa8, 0xe3, 0xd1, 0x80, 0xbb, 0x24, 0xc0,
0x51, 0x3f, 0xbb, 0x74, 0x43, 0xd2, 0x61, 0x38, 0xba, 0x24, 0x1e, 0x66, 0x1d, 0x36, 0x24, 0x23,
0xf9, 0xb1, 0xc3, 0x88, 0x72, 0x8a, 0x36, 0x52, 0x45, 0xfb, 0xf2, 0xa5, 0x1d, 0xeb, 0xd9, 0x42,
0xa5, 0xf9, 0x74, 0x40, 0xe9, 0xc0, 0xc7, 0x1d, 0xa9, 0x7a, 0x36, 0x3e, 0xef, 0xb8, 0xc1, 0xb5,
0xba, 0xd7, 0xdc, 0xb8, 0x7b, 0x84, 0x47, 0x21, 0x8f, 0x0f, 0xd7, 0x06, 0x74, 0x40, 0xe5, 0xb2,
0x23, 0x56, 0x5a, 0xfa, 0xe9, 0x5c, 0x9e, 0xf2, 0xeb, 0x10, 0xb3, 0xce, 0x88, 0x8e, 0x03, 0xae,
0xbe, 0xfa, 0xf6, 0xeb, 0x47, 0xdc, 0xe6, 0x2e, 0xbb, 0x90, 0x1f, 0x7d, 0x77, 0xf3, 0xae, 0xb3,
0x9c, 0x8c, 0x30, 0xe3, 0xee, 0x28, 0x54, 0x0a, 0xd6, 0x5f, 0x05, 0xa8, 0x1f, 0x44, 0xd8, 0xe5,
0xd8, 0xc1, 0x3f, 0x8d, 0x31, 0xe3, 0x68, 0x1d, 0x0a, 0xa4, 0x6f, 0x1a, 0x5b, 0x46, 0xbb, 0xba,
0x5f, 0xbe, 0x7d, 0xb7, 0x59, 0x78, 0x73, 0xe8, 0x14, 0x48, 0x1f, 0xad, 0x43, 0xf9, 0x6c, 0x1c,
0xf4, 0x7d, 0x6c, 0x16, 0xc4, 0x99, 0xa3, 0x77, 0xc8, 0x84, 0xa5, 0x68, 0x1c, 0x08, 0xbb, 0x66,
0x51, 0x1e, 0xc4, 0x5b, 0xf4, 0x14, 0x2a, 0x01, 0xed, 0x85, 0xe4, 0x92, 0x72, 0xb3, 0xb4, 0x65,
0xb4, 0x2b, 0xce, 0x52, 0x40, 0xbb, 0x62, 0x8b, 0x9a, 0x50, 0xe1, 0x38, 0x1a, 0x91, 0xc0, 0xf5,
0xcd, 0x45, 0x79, 0x94, 0xec, 0xd1, 0x1a, 0x2c, 0x32, 0xde, 0x27, 0x81, 0x59, 0x96, 0xe6, 0xd4,
0x46, 0x3c, 0xcf, 0x78, 0x9f, 0x8e, 0xb9, 0xb9, 0xa4, 0x9e, 0x57, 0x3b, 0x2d, 0xc7, 0x51, 0x64,
0x56, 0x12, 0x39, 0x8e, 0x22, 0xb4, 0x0b, 0xe5, 0x88, 0x52, 0x7e, 0xce, 0xcc, 0xea, 0x56, 0xb1,
0x5d, 0xdb, 0x6d, 0xda, 0x93, 0x78, 0xcb, 0x7c, 0xd9, 0x5f, 0x8b, 0x3c, 0x3b, 0x5a, 0x13, 0xb5,
0x00, 0xbc, 0x21, 0xf6, 0x2e, 0x42, 0x4a, 0x02, 0x6e, 0x82, 0xb4, 0x97, 0x91, 0xa0, 0x17, 0xb0,
0x1a, 0xba, 0x11, 0x0e, 0x78, 0x2f, 0xa3, 0x56, 0x93, 0x6a, 0x2b, 0xea, 0xe0, 0x20, 0x91, 0x5b,
0x16, 0x34, 0xe2, 0xc4, 0xb2, 0x90, 0x06, 0x0c, 0xa3, 0x15, 0x28, 0x86, 0x3a, 0xb5, 0x75, 0x47,
0x2c, 0xad, 0x06, 0x3c, 0x39, 0xe1, 0x6e, 0xc4, 0x75, 0xee, 0xad, 0x65, 0xa8, 0x1f, 0x62, 0x1f,
0x27, 0x60, 0x58, 0x1c, 0x1a, 0xb1, 0x40, 0x1b, 0xd9, 0x84, 0x1a, 0xbe, 0x22, 0xbc, 0xc7, 0xb8,
0xcb, 0xc7, 0x4c, 0x1b, 0x03, 0x21, 0x3a, 0x91, 0x12, 0xb4, 0x07, 0x55, 0xb1, 0xc3, 0xfd, 0x9e,
0xcb, 0x25, 0x54, 0x22, 0x76, 0x45, 0x03, 0x3b, 0xa6, 0x81, 0x7d, 0x1a, 0xd3, 0x60, 0xbf, 0x72,
0xf3, 0x6e, 0x73, 0xe1, 0xd7, 0x7f, 0x36, 0x0d, 0xa7, 0xa2, 0xae, 0xed, 0x71, 0xab, 0x0d, 0x6b,
0xea, 0xd5, 0x6e, 0x44, 0x3d, 0xcc, 0x58, 0x4c, 0x8d, 0xfb, 0x01, 0xfc, 0x66, 0x40, 0xed, 0xe8,
0x0a, 0x7b, 0xb1, 0x46, 0x16, 0x57, 0x23, 0x0f, 0xd7, 0xc2, 0xc3, 0xb8, 0x16, 0x73, 0x70, 0x2d,
0x4d, 0xe0, 0xda, 0x86, 0x12, 0x0b, 0xb1, 0x27, 0x59, 0x53, 0xdb, 0x5d, 0xbb, 0x17, 0xd9, 0x5e,
0x70, 0xed, 0x48, 0x0d, 0xeb, 0x10, 0xca, 0x8e, 0x4f, 0x46, 0x84, 0x23, 0x04, 0x25, 0x01, 0xb7,
0x22, 0xb5, 0x23, 0xd7, 0x42, 0x36, 0x74, 0xa3, 0xbe, 0x74, 0xa6, 0xe4, 0xc8, 0xb5, 0x90, 0x31,
0x7a, 0xae, 0x3c, 0x29, 0x39, 0x72, 0x6d, 0x6d, 0xc1, 0x13, 0x15, 0x60, 0x2e, 0x88, 0xc7, 0x00,
0x5d, 0x7e, 0x9d, 0x9b, 0x23, 0x11, 0xf7, 0x5b, 0xd2, 0xe7, 0x43, 0xf9, 0x54, 0xdd, 0x51, 0x1b,
0x11, 0xdf, 0x10, 0x93, 0xc1, 0x50, 0xbd, 0x56, 0x77, 0xf4, 0x4e, 0x50, 0xe0, 0xe8, 0x12, 0x07,
0x3c, 0x4e, 0xba, 0xe6, 0x48, 0x4a, 0x89, 0xdf, 0x0b, 0x50, 0xd7, 0x02, 0xed, 0xd2, 0x63, 0x2b,
0x56, 0xbb, 0x58, 0x4c, 0x5d, 0x7c, 0x25, 0x92, 0x2d, 0xf9, 0x24, 0x92, 0xdd, 0xd8, 0xdd, 0x78,
0xb0, 0x58, 0x14, 0xc1, 0x1c, 0xad, 0x8a, 0x5e, 0x43, 0x35, 0x54, 0xfc, 0xc0, 0xcc, 0x5c, 0x94,
0x45, 0xf6, 0xc1, 0x83, 0xf7, 0x62, 0x16, 0xa5, 0xea, 0xff, 0x53, 0x8d, 0x67, 0xd9, 0x56, 0x9d,
0x64, 0x9b, 0x48, 0x5b, 0xd7, 0x1d, 0x33, 0x9c, 0x29, 0x2d, 0x07, 0xb3, 0xf1, 0x28, 0x11, 0xd4,
0x05, 0x73, 0x49, 0x52, 0x7a, 0x6f, 0xa0, 0xf6, 0x15, 0xf1, 0xfd, 0xb4, 0x0b, 0x96, 0x19, 0x19,
0xc4, 0x34, 0xae, 0x3b, 0x7a, 0x27, 0x72, 0xe7, 0xfa, 0xbe, 0x4c, 0x68, 0xc5, 0x11, 0xcb, 0xfb,
0xd9, 0xb4, 0x9e, 0xc1, 0xea, 0x81, 0x4f, 0x19, 0x3e, 0x11, 0x41, 0xe5, 0xd7, 0xce, 0x0e, 0xac,
0x74, 0xe3, 0x84, 0xcc, 0x68, 0xbe, 0xd6, 0xb7, 0xb0, 0x9a, 0xd1, 0xd5, 0xb8, 0x4f, 0x00, 0x60,
0x3c, 0x0a, 0x00, 0xeb, 0x97, 0x02, 0xac, 0xa6, 0xcd, 0x2a, 0x7e, 0x1e, 0x41, 0x49, 0x34, 0x01,
0x5d, 0xba, 0x72, 0x8d, 0x36, 0xa0, 0xea, 0xfa, 0x3e, 0x7d, 0xdb, 0xe3, 0x5e, 0xa8, 0xe3, 0xae,
0x48, 0xc1, 0xa9, 0x17, 0xa2, 0x8f, 0x00, 0xa9, 0xc3, 0x71, 0x40, 0xae, 0x7a, 0x8c, 0x7a, 0x17,
0x98, 0x33, 0x99, 0x8b, 0x8a, 0xb3, 0x22, 0x4f, 0xbe, 0x0b, 0xc8, 0xd5, 0x89, 0x92, 0xa3, 0x67,
0xd0, 0xd0, 0xa6, 0x62, 0xd4, 0xd4, 0x58, 0xa8, 0x2b, 0x7b, 0x71, 0xa3, 0xf8, 0x10, 0xe0, 0x9c,
0xf8, 0xb8, 0xe7, 0x53, 0xef, 0x82, 0xe9, 0xf1, 0x50, 0x15, 0x92, 0x63, 0x21, 0x40, 0xdb, 0xb0,
0x22, 0x47, 0x6e, 0x2f, 0x70, 0x47, 0x98, 0x85, 0xae, 0x87, 0x99, 0x59, 0xde, 0x2a, 0xb6, 0xab,
0xce, 0xb2, 0x94, 0x7f, 0x93, 0x88, 0xd1, 0x73, 0x58, 0x4e, 0x3b, 0x75, 0x2f, 0x74, 0xf9, 0x50,
0x33, 0xab, 0x91, 0x8a, 0xbb, 0x2e, 0x1f, 0xee, 0xfe, 0x01, 0x50, 0x3a, 0x19, 0x92, 0x11, 0x72,
0xa1, 0xac, 0xba, 0x36, 0xda, 0xb1, 0xa7, 0xfc, 0x20, 0xd8, 0x13, 0x33, 0xb3, 0xf9, 0x62, 0x2e,
0x5d, 0x0d, 0xdb, 0x97, 0xb0, 0x28, 0x9b, 0x3e, 0xda, 0x9e, 0x7a, 0x2b, 0x3b, 0x18, 0x9a, 0xeb,
0xf7, 0xfa, 0xdc, 0x91, 0x08, 0x55, 0xb8, 0xab, 0x3a, 0xf5, 0x0c, 0x77, 0x27, 0xa6, 0xca, 0x0c,
0x77, 0xef, 0x0c, 0x1c, 0x1a, 0xcf, 0x24, 0xcd, 0x22, 0xf4, 0x72, 0x8e, 0xdb, 0x93, 0x83, 0xe3,
0x71, 0x0f, 0xfe, 0x20, 0xf3, 0xc3, 0xf1, 0xec, 0xfc, 0xa4, 0x11, 0xed, 0xcc, 0xa3, 0xaa, 0xed,
0xff, 0x08, 0xd5, 0xa4, 0x96, 0xd0, 0xc7, 0x53, 0x2f, 0xde, 0xad, 0xcf, 0xa6, 0x3d, 0xaf, 0x7a,
0x8a, 0xb5, 0xec, 0x42, 0x33, 0x62, 0xc9, 0x76, 0xaa, 0x5c, 0xac, 0x8f, 0xa1, 0xac, 0x3a, 0xd8,
0x0c, 0xac, 0x27, 0xda, 0x5c, 0xae, 0xb5, 0x53, 0x80, 0xb4, 0xfe, 0xd1, 0xf4, 0xb8, 0xee, 0x35,
0x8a, 0x5c, 0xab, 0x5f, 0x40, 0x49, 0x34, 0x55, 0xd4, 0x9e, 0x6a, 0x2f, 0xd3, 0x77, 0x73, 0x2d,
0x39, 0x50, 0x56, 0x73, 0x70, 0x46, 0xb4, 0x13, 0xc3, 0xb2, 0xf9, 0xf0, 0x5f, 0x9e, 0xd4, 0xf9,
0xc4, 0x10, 0xde, 0x89, 0x1e, 0x3f, 0xc3, 0xbb, 0xcc, 0x18, 0xc8, 0xf5, 0xee, 0x7b, 0x11, 0x27,
0xf6, 0x66, 0xc6, 0x99, 0xfc, 0x19, 0x35, 0xb7, 0xe7, 0xd0, 0xd4, 0xa4, 0xf9, 0x1c, 0x8a, 0x5d,
0x7e, 0x8d, 0x9e, 0x4f, 0xa7, 0x4c, 0xf2, 0xcb, 0x31, 0x15, 0xe2, 0x64, 0x0e, 0xcd, 0x82, 0xf8,
0xee, 0xc0, 0xca, 0xb3, 0xba, 0x6f, 0xde, 0xbc, 0x6f, 0x2d, 0xfc, 0xfd, 0xbe, 0xb5, 0xf0, 0xf3,
0x6d, 0xcb, 0xb8, 0xb9, 0x6d, 0x19, 0x7f, 0xde, 0xb6, 0x8c, 0x7f, 0x6f, 0x5b, 0xc6, 0x59, 0x59,
0x6a, 0xbe, 0xfa, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xd9, 0x7f, 0x4d, 0x1e, 0x99, 0x0d, 0x00, 0x00,
}

View File

@ -17,6 +17,7 @@ service Shim {
rpc Create(CreateRequest) returns (CreateResponse);
rpc Start(StartRequest) returns (google.protobuf.Empty);
rpc Delete(DeleteRequest) returns (DeleteResponse);
rpc DeleteProcess(DeleteProcessRequest) returns (DeleteResponse);
rpc State(StateRequest) returns (StateResponse);
rpc Processes(ProcessesRequest) returns (ProcessesResponse);
rpc Pause(PauseRequest) returns (google.protobuf.Empty);
@ -53,7 +54,6 @@ message StartRequest {
}
message DeleteRequest {
uint32 pid = 1;
}
message DeleteResponse {
@ -61,6 +61,10 @@ message DeleteResponse {
google.protobuf.Timestamp exited_at = 2 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
}
message DeleteProcessRequest {
uint32 pid = 1;
}
message ExecRequest {
bool terminal = 1;
string stdin = 2;

View File

@ -63,7 +63,7 @@ var execCommand = cli.Command{
if err != nil {
return err
}
defer process.Delete()
defer process.Delete(ctx)
statusC := make(chan uint32, 1)
go func() {

View File

@ -10,7 +10,6 @@ import (
"log"
"net"
"os"
"strconv"
"time"
gocontext "context"
@ -154,13 +153,7 @@ var shimDeleteCommand = cli.Command{
if err != nil {
return err
}
pid, err := strconv.Atoi(context.Args().First())
if err != nil {
return err
}
r, err := service.Delete(gocontext.Background(), &shim.DeleteRequest{
Pid: uint32(pid),
})
r, err := service.Delete(gocontext.Background(), &shim.DeleteRequest{})
if err != nil {
return err
}

View File

@ -302,6 +302,14 @@ func TestContainerExec(t *testing.T) {
if status != 6 {
t.Errorf("expected exec exit code 6 but received %d", status)
}
deleteStatus, err := process.Delete(ctx)
if err != nil {
t.Error(err)
return
}
if deleteStatus != 6 {
t.Errorf("expected delete exit code e6 but received %d", deleteStatus)
}
if err := task.Kill(ctx, syscall.SIGKILL); err != nil {
t.Error(err)
}

View File

@ -59,6 +59,10 @@ func (c *client) Delete(ctx context.Context, in *shimapi.DeleteRequest, opts ...
return c.s.Delete(ctx, in)
}
func (c *client) DeleteProcess(ctx context.Context, in *shimapi.DeleteProcessRequest, opts ...grpc.CallOption) (*shimapi.DeleteResponse, error) {
return c.s.DeleteProcess(ctx, in)
}
func (c *client) Exec(ctx context.Context, in *shimapi.ExecRequest, opts ...grpc.CallOption) (*shimapi.ExecResponse, error) {
return c.s.Exec(ctx, in)
}

View File

@ -191,9 +191,16 @@ func (p *initProcess) Exited(status int) {
}
func (p *initProcess) Delete(context context.Context) error {
status, err := p.ContainerStatus(context)
if err != nil {
return err
}
if status != "stopped" {
return fmt.Errorf("cannot delete a running container")
}
p.killAll(context)
p.Wait()
err := p.runc.Delete(context, p.id)
err = p.runc.Delete(context, p.id)
if p.io != nil {
for _, c := range p.closers {
c.Close()

View File

@ -89,13 +89,29 @@ func (s *Service) Start(ctx context.Context, r *shimapi.StartRequest) (*google_p
}
func (s *Service) Delete(ctx context.Context, r *shimapi.DeleteRequest) (*shimapi.DeleteResponse, error) {
p := s.initProcess
// TODO (@crosbymichael): how to handle errors here
p.Delete(ctx)
s.mu.Lock()
delete(s.processes, p.Pid())
s.mu.Unlock()
return &shimapi.DeleteResponse{
ExitStatus: uint32(p.Status()),
ExitedAt: p.ExitedAt(),
}, nil
}
func (s *Service) DeleteProcess(ctx context.Context, r *shimapi.DeleteProcessRequest) (*shimapi.DeleteResponse, error) {
if int(r.Pid) == s.initProcess.pid {
return nil, fmt.Errorf("cannot delete init process with DeleteProcess")
}
s.mu.Lock()
p, ok := s.processes[int(r.Pid)]
s.mu.Unlock()
if !ok {
p = s.initProcess
return nil, fmt.Errorf("process %d not found", r.Pid)
}
// TODO: how to handle errors here
// TODO (@crosbymichael): how to handle errors here
p.Delete(ctx)
s.mu.Lock()
delete(s.processes, p.Pid())

View File

@ -158,6 +158,19 @@ func (c *Task) Checkpoint(ctx context.Context, opts plugin.CheckpointOpts) error
return err
}
func (c *Task) DeleteProcess(ctx context.Context, pid uint32) (*plugin.Exit, error) {
r, err := c.shim.DeleteProcess(ctx, &shim.DeleteProcessRequest{
Pid: pid,
})
if err != nil {
return nil, err
}
return &plugin.Exit{
Status: r.ExitStatus,
Timestamp: r.ExitedAt,
}, nil
}
type Process struct {
pid int
c *Task

View File

@ -33,6 +33,8 @@ type Task interface {
CloseStdin(context.Context, uint32) error
// Checkpoint checkpoints a container to an image with live system data
Checkpoint(context.Context, CheckpointOpts) error
// DeleteProcess deletes a specific exec process via the pid
DeleteProcess(context.Context, uint32) (*Exit, error)
}
type CheckpointOpts struct {

View File

@ -111,6 +111,14 @@ func (p *process) Resize(ctx context.Context, w, h uint32) error {
return err
}
func (p *process) Delete() error {
return p.io.Close()
func (p *process) Delete(ctx context.Context) (uint32, error) {
cerr := p.io.Close()
r, err := p.task.client.TaskService().DeleteProcess(ctx, &execution.DeleteProcessRequest{
ContainerID: p.task.containerID,
Pid: p.pid,
})
if err != nil {
return UnknownExitStatus, err
}
return r.ExitStatus, cerr
}

View File

@ -171,6 +171,21 @@ func (s *Service) Delete(ctx context.Context, r *api.DeleteRequest) (*api.Delete
}, nil
}
func (s *Service) DeleteProcess(ctx context.Context, r *api.DeleteProcessRequest) (*api.DeleteResponse, error) {
c, err := s.getTask(ctx, r.ContainerID)
if err != nil {
return nil, err
}
exit, err := c.DeleteProcess(ctx, r.Pid)
if err != nil {
return nil, err
}
return &api.DeleteResponse{
ExitStatus: exit.Status,
ExitedAt: exit.Timestamp,
}, nil
}
func taskFromContainerd(ctx context.Context, c plugin.Task) (*task.Task, error) {
state, err := c.State(ctx)
if err != nil {

View File

@ -53,7 +53,7 @@ type Task interface {
type Process interface {
Pid() uint32
Start(context.Context) error
Delete() error
Delete(context.Context) (uint32, error)
Kill(context.Context, syscall.Signal) error
Wait(context.Context) (uint32, error)
CloseStdin(context.Context) error

View File

@ -194,6 +194,28 @@ func (c *container) Checkpoint(ctx context.Context, opts plugin.CheckpointOpts)
return fmt.Errorf("Windows containers do not support checkpoint")
}
func (c *container) DeleteProcess(ctx context.Context, pid uint32) (*plugin.Exit, error) {
var process *hcs.Process
for _, p := range c.ctr.Processes() {
if p.Pid() == pid {
process = p
break
}
}
if process == nil {
return nil, fmt.Errorf("process %d not found", pid)
}
ec, err := process.ExitCode()
if err != nil {
return nil, err
}
process.Delete()
return &plugin.Exit{
Status: ec,
Timestamp: process.ExitedAt(),
}, nil
}
func (c *container) setStatus(status plugin.Status) {
c.Lock()
c.status = status