From e77bd62ba8932e0b239ce9e844190d6d2ea9e0e2 Mon Sep 17 00:00:00 2001 From: gy <997485446@qq.com> Date: Thu, 18 Aug 2022 13:26:14 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E5=A4=9A=E7=BA=A7=E5=AE=A1=E6=89=B9=20f?= =?UTF-8?q?eat=20=E5=AE=A1=E6=89=B9=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/approval/approval.pb.go | 1173 +++++++++++++------------ api/approval/approval.proto | 48 +- api/approval/approval.validator.pb.go | 14 +- api/approval/approval_triple.pb.go | 79 +- pkg/common/md5/md5.go | 16 + pkg/m/msg.go | 11 +- pkg/model/approval.go | 139 ++- pkg/model/approval_setting.go | 10 +- pkg/model/approval_type.go | 39 + pkg/model/approval_workflow.go | 11 +- pkg/model/init.go | 5 +- pkg/serializer/approval.go | 42 +- pkg/serializer/approval_type.go | 8 +- pkg/service/approval.go | 113 ++- 14 files changed, 1014 insertions(+), 694 deletions(-) create mode 100644 pkg/common/md5/md5.go diff --git a/api/approval/approval.pb.go b/api/approval/approval.pb.go index f4b4155..fa55f98 100644 --- a/api/approval/approval.pb.go +++ b/api/approval/approval.pb.go @@ -21,55 +21,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type StatusType int32 - -const ( - StatusType_Doing StatusType = 0 - StatusType_Ok StatusType = 1 - StatusType_Fail StatusType = 2 -) - -// Enum value maps for StatusType. -var ( - StatusType_name = map[int32]string{ - 0: "Doing", - 1: "Ok", - 2: "Fail", - } - StatusType_value = map[string]int32{ - "Doing": 0, - "Ok": 1, - "Fail": 2, - } -) - -func (x StatusType) Enum() *StatusType { - p := new(StatusType) - *p = x - return p -} - -func (x StatusType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (StatusType) Descriptor() protoreflect.EnumDescriptor { - return file_api_approval_approval_proto_enumTypes[0].Descriptor() -} - -func (StatusType) Type() protoreflect.EnumType { - return &file_api_approval_approval_proto_enumTypes[0] -} - -func (x StatusType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use StatusType.Descriptor instead. -func (StatusType) EnumDescriptor() ([]byte, []int) { - return file_api_approval_approval_proto_rawDescGZIP(), []int{0} -} - type NowLevelByInfoRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -201,7 +152,9 @@ type CommonRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Domain string `protobuf:"bytes,1,opt,name=Domain,json=domain,proto3" json:"Domain,omitempty"` + Domain string `protobuf:"bytes,1,opt,name=Domain,json=domain,proto3" json:"Domain,omitempty"` + Page uint64 `protobuf:"varint,2,opt,name=Page,proto3" json:"Page,omitempty"` + PageSize uint64 `protobuf:"varint,3,opt,name=PageSize,json=pageSize,proto3" json:"PageSize,omitempty"` } func (x *CommonRequest) Reset() { @@ -243,15 +196,29 @@ func (x *CommonRequest) GetDomain() string { return "" } +func (x *CommonRequest) GetPage() uint64 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *CommonRequest) GetPageSize() uint64 { + if x != nil { + return x.PageSize + } + return 0 +} + type CreateTypeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Domain string `protobuf:"bytes,1,opt,name=Domain,json=domain,proto3" json:"Domain,omitempty"` - ID uint64 `protobuf:"varint,2,opt,name=ID,proto3" json:"ID,omitempty"` - Title string `protobuf:"bytes,3,opt,name=Title,json=title,proto3" json:"Title,omitempty"` - KeyWord string `protobuf:"bytes,4,opt,name=KeyWord,json=keyWord,proto3" json:"KeyWord,omitempty"` + Domain string `protobuf:"bytes,1,opt,name=Domain,json=domain,proto3" json:"Domain,omitempty"` + ID uint64 `protobuf:"varint,2,opt,name=ID,proto3" json:"ID,omitempty"` + Title string `protobuf:"bytes,3,opt,name=Title,json=title,proto3" json:"Title,omitempty"` + Remark string `protobuf:"bytes,5,opt,name=Remark,json=keyWord,proto3" json:"Remark,omitempty"` } func (x *CreateTypeRequest) Reset() { @@ -307,9 +274,9 @@ func (x *CreateTypeRequest) GetTitle() string { return "" } -func (x *CreateTypeRequest) GetKeyWord() string { +func (x *CreateTypeRequest) GetRemark() string { if x != nil { - return x.KeyWord + return x.Remark } return "" } @@ -429,12 +396,12 @@ type StatusRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Domain string `protobuf:"bytes,1,opt,name=Domain,json=domain,proto3" json:"Domain,omitempty"` - ID uint64 `protobuf:"varint,2,opt,name=ID,proto3" json:"ID,omitempty"` - Reply string `protobuf:"bytes,3,opt,name=Reply,proto3" json:"Reply,omitempty"` - WorkFlowId uint64 `protobuf:"varint,4,opt,name=WorkFlowId,json=workFlowId,proto3" json:"WorkFlowId,omitempty"` - Status StatusType `protobuf:"varint,5,opt,name=Status,json=status,proto3,enum=approval.StatusType" json:"Status,omitempty"` - Level uint64 `protobuf:"varint,6,opt,name=Level,json=level,proto3" json:"Level,omitempty"` + Domain string `protobuf:"bytes,1,opt,name=Domain,json=domain,proto3" json:"Domain,omitempty"` + ID uint64 `protobuf:"varint,2,opt,name=ID,proto3" json:"ID,omitempty"` + Reply string `protobuf:"bytes,3,opt,name=Reply,proto3" json:"Reply,omitempty"` + WorkFlowId uint64 `protobuf:"varint,4,opt,name=WorkFlowId,json=workFlowId,proto3" json:"WorkFlowId,omitempty"` + Status uint64 `protobuf:"varint,5,opt,name=Status,json=status,proto3" json:"Status,omitempty"` + Level uint64 `protobuf:"varint,6,opt,name=Level,json=level,proto3" json:"Level,omitempty"` } func (x *StatusRequest) Reset() { @@ -497,11 +464,11 @@ func (x *StatusRequest) GetWorkFlowId() uint64 { return 0 } -func (x *StatusRequest) GetStatus() StatusType { +func (x *StatusRequest) GetStatus() uint64 { if x != nil { return x.Status } - return StatusType_Doing + return 0 } func (x *StatusRequest) GetLevel() uint64 { @@ -557,7 +524,7 @@ type ListRequest struct { Domain string `protobuf:"bytes,1,opt,name=Domain,json=domain,proto3" json:"Domain,omitempty"` PageSize uint64 `protobuf:"varint,2,opt,name=PageSize,proto3" json:"PageSize,omitempty"` // Page uint64 `protobuf:"varint,3,opt,name=Page,proto3" json:"Page,omitempty"` // - Status uint64 `protobuf:"varint,4,opt,name=Status,json=status,proto3" json:"Status,omitempty"` //0待审批 1-审批成功 2-拒绝 + Status uint64 `protobuf:"varint,4,opt,name=Status,json=status,proto3" json:"Status,omitempty"` //0待审批 1-审批成功 2-拒绝 4-是所有 Type string `protobuf:"bytes,5,opt,name=Type,json=type,proto3" json:"Type,omitempty"` //类型 UserID uint64 `protobuf:"varint,6,opt,name=UserID,json=userID,proto3" json:"UserID,omitempty"` // } @@ -1362,7 +1329,8 @@ type Exhibition struct { ID uint64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` ReceivedAt string `protobuf:"bytes,2,opt,name=ReceivedAt,json=receivedAt,proto3" json:"ReceivedAt,omitempty"` Address string `protobuf:"bytes,3,opt,name=Address,json=address,proto3" json:"Address,omitempty"` - ApprovalExhibitions []*ApprovalExhibition `protobuf:"bytes,4,rep,name=ApprovalExhibitions,json=approvalExhibitions,proto3" json:"ApprovalExhibitions,omitempty"` + PidApprovalID uint64 `protobuf:"varint,4,opt,name=PidApprovalID,json=pidApprovalID,proto3" json:"PidApprovalID,omitempty"` + ApprovalExhibitions []*ApprovalExhibition `protobuf:"bytes,5,rep,name=ApprovalExhibitions,json=approvalExhibitions,proto3" json:"ApprovalExhibitions,omitempty"` } func (x *Exhibition) Reset() { @@ -1418,6 +1386,13 @@ func (x *Exhibition) GetAddress() string { return "" } +func (x *Exhibition) GetPidApprovalID() uint64 { + if x != nil { + return x.PidApprovalID + } + return 0 +} + func (x *Exhibition) GetApprovalExhibitions() []*ApprovalExhibition { if x != nil { return x.ApprovalExhibitions @@ -1432,16 +1407,14 @@ type CreateRequest struct { ID uint64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` Domain string `protobuf:"bytes,2,opt,name=Domain,json=domain,proto3" json:"Domain,omitempty"` - Status StatusType `protobuf:"varint,3,opt,name=Status,json=status,proto3,enum=approval.StatusType" json:"Status,omitempty"` + Status uint64 `protobuf:"varint,3,opt,name=Status,json=status,proto3" json:"Status,omitempty"` Type string `protobuf:"bytes,4,opt,name=Type,json=type,proto3" json:"Type,omitempty"` - ApproverID uint64 `protobuf:"varint,5,opt,name=ApproverID,json=approverID,proto3" json:"ApproverID,omitempty"` - ApproverName string `protobuf:"bytes,6,opt,name=ApproverName,json=approverName,proto3" json:"ApproverName,omitempty"` SubmitterID uint64 `protobuf:"varint,7,opt,name=SubmitterID,json=submitterID,proto3" json:"SubmitterID,omitempty"` //审批人 SubmitterName string `protobuf:"bytes,8,opt,name=SubmitterName,json=submitterName,proto3" json:"SubmitterName,omitempty"` CopyUsers []*CopyUser `protobuf:"bytes,9,rep,name=CopyUsers,json=copyName,proto3" json:"CopyUsers,omitempty"` //抄送人 Content string `protobuf:"bytes,10,opt,name=Content,json=content,proto3" json:"Content,omitempty"` //申请内容 Reply string `protobuf:"bytes,11,opt,name=Reply,json=reply,proto3" json:"Reply,omitempty"` //回复 - IsViewed bool `protobuf:"varint,12,opt,name=IsViewed,proto3" json:"IsViewed,omitempty"` //抄送人是否查看过 + CanView bool `protobuf:"varint,12,opt,name=CanView,proto3" json:"CanView,omitempty"` //是否可以阅读 Work *Work `protobuf:"bytes,13,opt,name=Work,json=work,proto3" json:"Work,omitempty"` Show *Show `protobuf:"bytes,14,opt,name=Show,json=show,proto3" json:"Show,omitempty"` Exhibition *Exhibition `protobuf:"bytes,15,opt,name=Exhibition,json=exhibition,proto3" json:"Exhibition,omitempty"` @@ -1449,6 +1422,11 @@ type CreateRequest struct { ApprovalUsers []*ApprovalUser `protobuf:"bytes,17,rep,name=ApprovalUsers,json=approvalUsers,proto3" json:"ApprovalUsers,omitempty"` //审批的人 CanApproval bool `protobuf:"varint,18,opt,name=CanApproval,json=canApproval,proto3" json:"CanApproval,omitempty"` //审批的人 WorkFlows []*WorkFlow `protobuf:"bytes,19,rep,name=WorkFlows,json=workFlows,proto3" json:"WorkFlows,omitempty"` //审批的人 + AllStatus uint64 `protobuf:"varint,20,opt,name=AllStatus,json=allStatus,proto3" json:"AllStatus,omitempty"` //状态 0 1 2 3已阅读 4-待阅读 + NowUserId uint64 `protobuf:"varint,21,opt,name=NowUserId,json=nowUserId,proto3" json:"NowUserId,omitempty"` + NowUserName string `protobuf:"bytes,22,opt,name=NowUserName,json=nowUserName,proto3" json:"NowUserName,omitempty"` + Level uint64 `protobuf:"varint,23,opt,name=Level,json=level,proto3" json:"Level,omitempty"` + NowLevel uint64 `protobuf:"varint,24,opt,name=NowLevel,json=nowLevel,proto3" json:"NowLevel,omitempty"` } func (x *CreateRequest) Reset() { @@ -1497,11 +1475,11 @@ func (x *CreateRequest) GetDomain() string { return "" } -func (x *CreateRequest) GetStatus() StatusType { +func (x *CreateRequest) GetStatus() uint64 { if x != nil { return x.Status } - return StatusType_Doing + return 0 } func (x *CreateRequest) GetType() string { @@ -1511,20 +1489,6 @@ func (x *CreateRequest) GetType() string { return "" } -func (x *CreateRequest) GetApproverID() uint64 { - if x != nil { - return x.ApproverID - } - return 0 -} - -func (x *CreateRequest) GetApproverName() string { - if x != nil { - return x.ApproverName - } - return "" -} - func (x *CreateRequest) GetSubmitterID() uint64 { if x != nil { return x.SubmitterID @@ -1560,9 +1524,9 @@ func (x *CreateRequest) GetReply() string { return "" } -func (x *CreateRequest) GetIsViewed() bool { +func (x *CreateRequest) GetCanView() bool { if x != nil { - return x.IsViewed + return x.CanView } return false } @@ -1616,6 +1580,41 @@ func (x *CreateRequest) GetWorkFlows() []*WorkFlow { return nil } +func (x *CreateRequest) GetAllStatus() uint64 { + if x != nil { + return x.AllStatus + } + return 0 +} + +func (x *CreateRequest) GetNowUserId() uint64 { + if x != nil { + return x.NowUserId + } + return 0 +} + +func (x *CreateRequest) GetNowUserName() string { + if x != nil { + return x.NowUserName + } + return "" +} + +func (x *CreateRequest) GetLevel() uint64 { + if x != nil { + return x.Level + } + return 0 +} + +func (x *CreateRequest) GetNowLevel() uint64 { + if x != nil { + return x.NowLevel + } + return 0 +} + type WorkFlow struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1718,6 +1717,7 @@ type DetailRequest struct { ID uint64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` Domain string `protobuf:"bytes,2,opt,name=Domain,json=domain,proto3" json:"Domain,omitempty"` + UserId uint64 `protobuf:"varint,3,opt,name=UserId,json=userId,proto3" json:"UserId,omitempty"` } func (x *DetailRequest) Reset() { @@ -1766,6 +1766,68 @@ func (x *DetailRequest) GetDomain() string { return "" } +func (x *DetailRequest) GetUserId() uint64 { + if x != nil { + return x.UserId + } + return 0 +} + +type RemoveRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IDs []uint64 `protobuf:"varint,1,rep,packed,name=IDs,proto3" json:"IDs,omitempty"` + Domain string `protobuf:"bytes,2,opt,name=Domain,json=domain,proto3" json:"Domain,omitempty"` +} + +func (x *RemoveRequest) Reset() { + *x = RemoveRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_approval_approval_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoveRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveRequest) ProtoMessage() {} + +func (x *RemoveRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_approval_approval_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveRequest.ProtoReflect.Descriptor instead. +func (*RemoveRequest) Descriptor() ([]byte, []int) { + return file_api_approval_approval_proto_rawDescGZIP(), []int{23} +} + +func (x *RemoveRequest) GetIDs() []uint64 { + if x != nil { + return x.IDs + } + return nil +} + +func (x *RemoveRequest) GetDomain() string { + if x != nil { + return x.Domain + } + return "" +} + type ApprovalResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1778,7 +1840,7 @@ type ApprovalResponse struct { func (x *ApprovalResponse) Reset() { *x = ApprovalResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_approval_approval_proto_msgTypes[23] + mi := &file_api_approval_approval_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1791,7 +1853,7 @@ func (x *ApprovalResponse) String() string { func (*ApprovalResponse) ProtoMessage() {} func (x *ApprovalResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_approval_approval_proto_msgTypes[23] + mi := &file_api_approval_approval_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1804,7 +1866,7 @@ func (x *ApprovalResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ApprovalResponse.ProtoReflect.Descriptor instead. func (*ApprovalResponse) Descriptor() ([]byte, []int) { - return file_api_approval_approval_proto_rawDescGZIP(), []int{23} + return file_api_approval_approval_proto_rawDescGZIP(), []int{24} } func (x *ApprovalResponse) GetID() uint64 { @@ -1832,7 +1894,7 @@ type RemoveResponse struct { func (x *RemoveResponse) Reset() { *x = RemoveResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_approval_approval_proto_msgTypes[24] + mi := &file_api_approval_approval_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1845,7 +1907,7 @@ func (x *RemoveResponse) String() string { func (*RemoveResponse) ProtoMessage() {} func (x *RemoveResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_approval_approval_proto_msgTypes[24] + mi := &file_api_approval_approval_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1858,7 +1920,7 @@ func (x *RemoveResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveResponse.ProtoReflect.Descriptor instead. func (*RemoveResponse) Descriptor() ([]byte, []int) { - return file_api_approval_approval_proto_rawDescGZIP(), []int{24} + return file_api_approval_approval_proto_rawDescGZIP(), []int{25} } func (x *RemoveResponse) GetSuccess() bool { @@ -1879,7 +1941,7 @@ type ApprovalExhibitionRemove struct { func (x *ApprovalExhibitionRemove) Reset() { *x = ApprovalExhibitionRemove{} if protoimpl.UnsafeEnabled { - mi := &file_api_approval_approval_proto_msgTypes[25] + mi := &file_api_approval_approval_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1892,7 +1954,7 @@ func (x *ApprovalExhibitionRemove) String() string { func (*ApprovalExhibitionRemove) ProtoMessage() {} func (x *ApprovalExhibitionRemove) ProtoReflect() protoreflect.Message { - mi := &file_api_approval_approval_proto_msgTypes[25] + mi := &file_api_approval_approval_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1905,7 +1967,7 @@ func (x *ApprovalExhibitionRemove) ProtoReflect() protoreflect.Message { // Deprecated: Use ApprovalExhibitionRemove.ProtoReflect.Descriptor instead. func (*ApprovalExhibitionRemove) Descriptor() ([]byte, []int) { - return file_api_approval_approval_proto_rawDescGZIP(), []int{25} + return file_api_approval_approval_proto_rawDescGZIP(), []int{26} } func (x *ApprovalExhibitionRemove) GetSuccess() bool { @@ -1935,7 +1997,7 @@ type ApprovalExhibitionRequest struct { func (x *ApprovalExhibitionRequest) Reset() { *x = ApprovalExhibitionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_approval_approval_proto_msgTypes[26] + mi := &file_api_approval_approval_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1948,7 +2010,7 @@ func (x *ApprovalExhibitionRequest) String() string { func (*ApprovalExhibitionRequest) ProtoMessage() {} func (x *ApprovalExhibitionRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_approval_approval_proto_msgTypes[26] + mi := &file_api_approval_approval_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1961,7 +2023,7 @@ func (x *ApprovalExhibitionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ApprovalExhibitionRequest.ProtoReflect.Descriptor instead. func (*ApprovalExhibitionRequest) Descriptor() ([]byte, []int) { - return file_api_approval_approval_proto_rawDescGZIP(), []int{26} + return file_api_approval_approval_proto_rawDescGZIP(), []int{27} } func (x *ApprovalExhibitionRequest) GetID() uint64 { @@ -2046,7 +2108,7 @@ type ApprovalExhibitionDetail struct { func (x *ApprovalExhibitionDetail) Reset() { *x = ApprovalExhibitionDetail{} if protoimpl.UnsafeEnabled { - mi := &file_api_approval_approval_proto_msgTypes[27] + mi := &file_api_approval_approval_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2059,7 +2121,7 @@ func (x *ApprovalExhibitionDetail) String() string { func (*ApprovalExhibitionDetail) ProtoMessage() {} func (x *ApprovalExhibitionDetail) ProtoReflect() protoreflect.Message { - mi := &file_api_approval_approval_proto_msgTypes[27] + mi := &file_api_approval_approval_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2072,7 +2134,7 @@ func (x *ApprovalExhibitionDetail) ProtoReflect() protoreflect.Message { // Deprecated: Use ApprovalExhibitionDetail.ProtoReflect.Descriptor instead. func (*ApprovalExhibitionDetail) Descriptor() ([]byte, []int) { - return file_api_approval_approval_proto_rawDescGZIP(), []int{27} + return file_api_approval_approval_proto_rawDescGZIP(), []int{28} } func (x *ApprovalExhibitionDetail) GetID() uint64 { @@ -2102,7 +2164,7 @@ type CopyUser struct { func (x *CopyUser) Reset() { *x = CopyUser{} if protoimpl.UnsafeEnabled { - mi := &file_api_approval_approval_proto_msgTypes[28] + mi := &file_api_approval_approval_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2115,7 +2177,7 @@ func (x *CopyUser) String() string { func (*CopyUser) ProtoMessage() {} func (x *CopyUser) ProtoReflect() protoreflect.Message { - mi := &file_api_approval_approval_proto_msgTypes[28] + mi := &file_api_approval_approval_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2128,7 +2190,7 @@ func (x *CopyUser) ProtoReflect() protoreflect.Message { // Deprecated: Use CopyUser.ProtoReflect.Descriptor instead. func (*CopyUser) Descriptor() ([]byte, []int) { - return file_api_approval_approval_proto_rawDescGZIP(), []int{28} + return file_api_approval_approval_proto_rawDescGZIP(), []int{29} } func (x *CopyUser) GetID() uint64 { @@ -2165,7 +2227,7 @@ type ApprovalUser struct { func (x *ApprovalUser) Reset() { *x = ApprovalUser{} if protoimpl.UnsafeEnabled { - mi := &file_api_approval_approval_proto_msgTypes[29] + mi := &file_api_approval_approval_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2178,7 +2240,7 @@ func (x *ApprovalUser) String() string { func (*ApprovalUser) ProtoMessage() {} func (x *ApprovalUser) ProtoReflect() protoreflect.Message { - mi := &file_api_approval_approval_proto_msgTypes[29] + mi := &file_api_approval_approval_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2191,7 +2253,7 @@ func (x *ApprovalUser) ProtoReflect() protoreflect.Message { // Deprecated: Use ApprovalUser.ProtoReflect.Descriptor instead. func (*ApprovalUser) Descriptor() ([]byte, []int) { - return file_api_approval_approval_proto_rawDescGZIP(), []int{29} + return file_api_approval_approval_proto_rawDescGZIP(), []int{30} } func (x *ApprovalUser) GetID() uint64 { @@ -2233,7 +2295,7 @@ type SettingRequest struct { func (x *SettingRequest) Reset() { *x = SettingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_approval_approval_proto_msgTypes[30] + mi := &file_api_approval_approval_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2246,7 +2308,7 @@ func (x *SettingRequest) String() string { func (*SettingRequest) ProtoMessage() {} func (x *SettingRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_approval_approval_proto_msgTypes[30] + mi := &file_api_approval_approval_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2259,7 +2321,7 @@ func (x *SettingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SettingRequest.ProtoReflect.Descriptor instead. func (*SettingRequest) Descriptor() ([]byte, []int) { - return file_api_approval_approval_proto_rawDescGZIP(), []int{30} + return file_api_approval_approval_proto_rawDescGZIP(), []int{31} } func (x *SettingRequest) GetID() uint64 { @@ -2330,7 +2392,7 @@ type DetailSettingRequest struct { func (x *DetailSettingRequest) Reset() { *x = DetailSettingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_approval_approval_proto_msgTypes[31] + mi := &file_api_approval_approval_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2343,7 +2405,7 @@ func (x *DetailSettingRequest) String() string { func (*DetailSettingRequest) ProtoMessage() {} func (x *DetailSettingRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_approval_approval_proto_msgTypes[31] + mi := &file_api_approval_approval_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2356,7 +2418,7 @@ func (x *DetailSettingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DetailSettingRequest.ProtoReflect.Descriptor instead. func (*DetailSettingRequest) Descriptor() ([]byte, []int) { - return file_api_approval_approval_proto_rawDescGZIP(), []int{31} + return file_api_approval_approval_proto_rawDescGZIP(), []int{32} } func (x *DetailSettingRequest) GetKeyWord() string { @@ -2385,7 +2447,7 @@ type SettingResponse struct { func (x *SettingResponse) Reset() { *x = SettingResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_approval_approval_proto_msgTypes[32] + mi := &file_api_approval_approval_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2398,7 +2460,7 @@ func (x *SettingResponse) String() string { func (*SettingResponse) ProtoMessage() {} func (x *SettingResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_approval_approval_proto_msgTypes[32] + mi := &file_api_approval_approval_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2411,7 +2473,7 @@ func (x *SettingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SettingResponse.ProtoReflect.Descriptor instead. func (*SettingResponse) Descriptor() ([]byte, []int) { - return file_api_approval_approval_proto_rawDescGZIP(), []int{32} + return file_api_approval_approval_proto_rawDescGZIP(), []int{33} } func (x *SettingResponse) GetID() uint64 { @@ -2448,364 +2510,373 @@ var file_api_approval_approval_proto_rawDesc = []byte{ 0x01, 0x28, 0x09, 0x52, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x43, 0x6f, + 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x57, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x22, 0x6b, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, + 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x04, 0x50, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x57, 0x6f, 0x72, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, - 0x22, 0x36, 0x0a, 0x0c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, - 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x58, 0x0a, 0x0f, 0x41, 0x6c, 0x6c, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x44, - 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x70, 0x72, - 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0xc8, 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x57, 0x6f, 0x72, 0x6b, 0x46, 0x6c, 0x6f, 0x77, 0x49, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x6c, 0x6f, 0x77, - 0x49, 0x64, 0x12, 0x43, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x42, 0x15, 0xe2, 0xdf, 0x1f, 0x11, 0x2a, 0x0c, - 0xe7, 0x8a, 0xb6, 0xe6, 0x80, 0x81, 0xe9, 0x9d, 0x9e, 0xe6, 0xb3, 0x95, 0x88, 0x01, 0x01, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x10, 0x0a, - 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0xbb, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x38, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x20, 0xe2, 0xdf, 0x1f, 0x1c, 0x2a, 0x18, 0xe7, 0x8e, 0xaf, 0xe5, 0xa2, 0x83, 0xe5, 0x8f, 0x98, - 0xe9, 0x87, 0x8f, 0xe5, 0xbf, 0x85, 0xe9, 0xa1, 0xbb, 0xe8, 0xa6, 0x81, 0xe6, 0x9c, 0x89, 0x58, - 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x61, 0x67, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x50, 0x61, 0x67, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x04, 0x50, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x51, 0x0a, - 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x22, 0x4f, 0x0a, 0x0d, 0x56, 0x69, 0x65, 0x77, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x61, 0x72, 0x6b, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x22, + 0x36, 0x0a, 0x0c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, + 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x58, 0x0a, 0x0f, 0x41, 0x6c, 0x6c, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, + 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0xb3, 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, + 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x57, 0x6f, 0x72, 0x6b, 0x46, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x6c, 0x6f, 0x77, 0x49, + 0x64, 0x12, 0x2e, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x42, 0x16, 0xe2, 0xdf, 0x1f, 0x12, 0x10, 0x00, 0x18, 0x04, 0x2a, 0x0c, 0xe7, 0x8a, 0xb6, + 0xe6, 0x80, 0x81, 0xe9, 0x9d, 0x9e, 0xe6, 0xb3, 0x95, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x10, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbb, 0x01, 0x0a, 0x0b, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x06, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x20, 0xe2, 0xdf, 0x1f, 0x1c, 0x2a, + 0x18, 0xe7, 0x8e, 0xaf, 0xe5, 0xa2, 0x83, 0xe5, 0x8f, 0x98, 0xe9, 0x87, 0x8f, 0xe5, 0xbf, 0x85, + 0xe9, 0xa1, 0xbb, 0xe8, 0xa6, 0x81, 0xe6, 0x9c, 0x89, 0x58, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x50, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x50, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x50, + 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x51, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, + 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4f, 0x0a, 0x0d, 0x56, 0x69, + 0x65, 0x77, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x44, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x02, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x58, 0x0a, 0x12, 0x49, + 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, - 0x72, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x44, 0x22, 0x58, 0x0a, 0x12, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, - 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0b, - 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x74, 0x61, - 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x74, 0x61, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x46, 0x61, 0x69, 0x6c, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x66, 0x61, 0x69, 0x6c, 0x54, 0x6f, - 0x74, 0x61, 0x6c, 0x22, 0xc2, 0x01, 0x0a, 0x13, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x4d, - 0x79, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6d, 0x79, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x39, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, - 0x4d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, - 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x35, 0x0a, 0x0a, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, - 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x64, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x7e, 0x0a, 0x06, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, - 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x41, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x41, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x28, - 0x0a, 0x0f, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4e, 0x75, - 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4e, 0x75, 0x6d, 0x22, 0x4c, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, - 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, - 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x74, 0x69, 0x73, 0x74, 0x4e, 0x75, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x4e, 0x75, 0x6d, 0x12, 0x16, - 0x0a, 0x06, 0x53, 0x68, 0x6f, 0x77, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x53, 0x68, 0x6f, 0x77, 0x41, 0x74, 0x22, 0x80, 0x02, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x72, 0x6f, - 0x76, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x57, 0x6f, 0x72, 0x6b, 0x49, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x57, 0x6f, 0x72, 0x6b, 0x49, 0x44, 0x12, - 0x1e, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x49, 0x44, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0a, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x49, 0x44, 0x12, - 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x09, 0x61, 0x72, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x44, 0x12, 0x20, 0x0a, - 0x0b, 0x41, 0x72, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x61, 0x72, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x41, 0x72, 0x74, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x72, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x43, 0x6f, - 0x76, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x41, 0x72, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x61, 0x72, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x90, 0x01, 0x0a, 0x04, 0x57, 0x6f, - 0x72, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, - 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x41, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x41, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3c, - 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, - 0x2e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x0d, 0x61, - 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x22, 0xf0, 0x01, 0x0a, - 0x12, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x02, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x65, 0x78, 0x68, 0x69, 0x62, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x72, 0x6f, - 0x76, 0x61, 0x6c, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x70, 0x70, - 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, - 0xa6, 0x01, 0x0a, 0x0a, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1e, - 0x0a, 0x0a, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4e, 0x0a, 0x13, 0x41, 0x70, 0x70, 0x72, + 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, + 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x44, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0b, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x44, + 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0a, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0c, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, + 0x1c, 0x0a, 0x09, 0x46, 0x61, 0x69, 0x6c, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x09, 0x66, 0x61, 0x69, 0x6c, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xc2, 0x01, + 0x0a, 0x13, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x4d, 0x79, 0x53, 0x75, 0x62, 0x6d, 0x69, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0c, 0x6d, 0x79, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x39, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, + 0x6c, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x35, 0x0a, 0x0a, 0x44, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x22, 0x7e, 0x0a, 0x06, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4e, + 0x75, 0x6d, 0x22, 0x4c, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, + 0x74, 0x69, 0x73, 0x74, 0x4e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x61, + 0x72, 0x74, 0x69, 0x73, 0x74, 0x4e, 0x75, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x68, 0x6f, 0x77, + 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x68, 0x6f, 0x77, 0x41, 0x74, + 0x22, 0x80, 0x02, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, + 0x44, 0x12, 0x16, 0x0a, 0x06, 0x57, 0x6f, 0x72, 0x6b, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x06, 0x57, 0x6f, 0x72, 0x6b, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x70, 0x70, + 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x41, + 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x61, 0x72, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x41, 0x72, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x72, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x72, 0x74, + 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, + 0x72, 0x74, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x61, 0x72, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x24, 0x0a, + 0x0d, 0x41, 0x72, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x61, 0x72, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x90, 0x01, 0x0a, 0x04, 0x57, 0x6f, 0x72, 0x6b, 0x12, 0x0e, 0x0a, 0x02, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3c, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x72, + 0x6f, 0x76, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x72, 0x6f, + 0x76, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, + 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x22, 0xf0, 0x01, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x72, 0x6f, + 0x76, 0x61, 0x6c, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x22, 0x0a, + 0x0c, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0c, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x49, 0x44, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x49, + 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x44, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, + 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xcc, 0x01, 0x0a, 0x0a, 0x45, 0x78, + 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x69, 0x64, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, + 0x6c, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x70, 0x69, 0x64, 0x41, 0x70, + 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x49, 0x44, 0x12, 0x4e, 0x0a, 0x13, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x78, 0x68, - 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc2, 0x06, 0x0a, 0x0d, 0x43, 0x72, 0x65, + 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xae, 0x06, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x38, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x20, 0xe2, 0xdf, 0x1f, 0x1c, 0x2a, 0x18, 0xe7, 0x8e, 0xaf, 0xe5, 0xa2, 0x83, 0xe5, 0x8f, 0x98, 0xe9, 0x87, 0x8f, 0xe5, 0xbf, 0x85, 0xe9, 0xa1, 0xbb, 0xe8, 0xa6, 0x81, 0xe6, 0x9c, 0x89, 0x58, 0x01, 0x52, 0x06, 0x64, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x43, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x42, 0x15, 0xe2, 0xdf, 0x1f, 0x11, - 0x2a, 0x0c, 0xe7, 0x8a, 0xb6, 0xe6, 0x80, 0x81, 0xe9, 0x9d, 0x9e, 0xe6, 0xb3, 0x95, 0x88, 0x01, - 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x0a, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1a, 0xe2, 0xdf, 0x1f, 0x16, 0x2a, 0x12, 0xe7, - 0xb1, 0xbb, 0xe5, 0x9e, 0x8b, 0xe5, 0xbf, 0x85, 0xe9, 0xa1, 0xbb, 0xe8, 0xa6, 0x81, 0xe6, 0x9c, - 0x89, 0x58, 0x01, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x36, 0x0a, 0x0a, 0x41, 0x70, 0x70, - 0x72, 0x6f, 0x76, 0x65, 0x72, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x42, 0x16, 0xe2, - 0xdf, 0x1f, 0x12, 0x2a, 0x0e, 0xe6, 0x8f, 0x90, 0xe4, 0xba, 0xa4, 0xe4, 0xba, 0xba, 0xe4, 0xba, - 0xba, 0x49, 0x44, 0x58, 0x01, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x49, - 0x44, 0x12, 0x3b, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xe2, 0xdf, 0x1f, 0x13, 0x2a, 0x0f, 0xe6, - 0x8f, 0x90, 0xe4, 0xba, 0xa4, 0xe4, 0xba, 0xba, 0xe5, 0x90, 0x8d, 0xe7, 0xa7, 0xb0, 0x58, 0x01, - 0x52, 0x0c, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x49, 0x44, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0b, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x49, 0x44, - 0x12, 0x24, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x43, 0x6f, 0x70, 0x79, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x70, 0x72, - 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x55, 0x73, 0x65, 0x72, 0x52, 0x08, 0x63, - 0x6f, 0x70, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x73, 0x56, 0x69, 0x65, - 0x77, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x49, 0x73, 0x56, 0x69, 0x65, - 0x77, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x04, 0x57, 0x6f, 0x72, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x52, 0x04, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, - 0x2e, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x04, 0x73, 0x68, 0x6f, 0x77, 0x12, 0x34, 0x0a, 0x0a, 0x45, - 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x45, 0x78, 0x68, 0x69, 0x62, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x0a, 0x06, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x42, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x52, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x41, - 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x11, 0x20, 0x03, + 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x0a, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1a, 0xe2, 0xdf, 0x1f, 0x16, + 0x2a, 0x12, 0xe7, 0xb1, 0xbb, 0xe5, 0x9e, 0x8b, 0xe5, 0xbf, 0x85, 0xe9, 0xa1, 0xbb, 0xe8, 0xa6, + 0x81, 0xe6, 0x9c, 0x89, 0x58, 0x01, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0b, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x49, 0x44, 0x12, 0x24, + 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x43, 0x6f, 0x70, 0x79, 0x55, 0x73, 0x65, 0x72, + 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, + 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x55, 0x73, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6f, 0x70, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x56, 0x69, 0x65, 0x77, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x43, 0x61, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x12, + 0x22, 0x0a, 0x04, 0x57, 0x6f, 0x72, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x04, 0x77, + 0x6f, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x53, 0x68, 0x6f, + 0x77, 0x52, 0x04, 0x73, 0x68, 0x6f, 0x77, 0x12, 0x34, 0x0a, 0x0a, 0x45, 0x78, 0x68, 0x69, 0x62, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, + 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, + 0x06, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, + 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x72, 0x6f, + 0x76, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, + 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x61, 0x6e, 0x41, 0x70, 0x70, 0x72, + 0x6f, 0x76, 0x61, 0x6c, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x61, 0x6e, 0x41, + 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x46, + 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x70, + 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x09, + 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x6c, 0x6c, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x61, 0x6c, + 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x6f, 0x77, 0x55, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6e, 0x6f, 0x77, 0x55, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x6f, 0x77, 0x55, + 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x18, 0x17, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1a, 0x0a, + 0x08, 0x4e, 0x6f, 0x77, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x08, 0x6e, 0x6f, 0x77, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0xaa, 0x01, 0x0a, 0x08, 0x57, 0x6f, + 0x72, 0x6b, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x4f, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, + 0x16, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x39, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x49, 0x44, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x04, 0x52, 0x03, 0x49, 0x44, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x22, 0x3c, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x22, 0x2a, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x34, 0x0a, 0x18, + 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x22, 0xe3, 0x02, 0x0a, 0x19, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x45, + 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, + 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x70, + 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, + 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x45, 0x78, + 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0c, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x26, + 0x0a, 0x0e, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x61, 0x72, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x0e, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78, + 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2a, 0x0a, 0x10, + 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x42, 0x0a, 0x18, 0x41, 0x70, 0x70, 0x72, + 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x02, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x4a, 0x0a, 0x08, + 0x43, 0x6f, 0x70, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x49, 0x73, 0x56, 0x69, 0x65, 0x77, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x69, 0x73, 0x56, 0x69, 0x65, 0x77, 0x65, 0x64, 0x22, 0x48, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x72, + 0x6f, 0x76, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x22, 0x9c, 0x02, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x09, 0x43, 0x6f, 0x70, + 0x79, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, + 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x09, 0x63, 0x6f, 0x70, 0x79, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x41, + 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x72, - 0x6f, 0x76, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x61, 0x6e, - 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x63, 0x61, 0x6e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x09, 0x57, - 0x6f, 0x72, 0x6b, 0x46, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x46, 0x6c, - 0x6f, 0x77, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xaa, 0x01, - 0x0a, 0x08, 0x57, 0x6f, 0x72, 0x6b, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x73, - 0x65, 0x72, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x37, 0x0a, 0x0d, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x22, 0x3c, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x22, 0x2a, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x34, 0x0a, - 0x18, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x22, 0xe3, 0x02, 0x0a, 0x19, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, - 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, - 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x41, - 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0a, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x45, - 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, - 0x26, 0x0a, 0x0e, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x61, 0x72, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x0e, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, - 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2a, 0x0a, - 0x10, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x42, 0x0a, 0x18, 0x41, 0x70, 0x70, - 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x4a, 0x0a, - 0x08, 0x43, 0x6f, 0x70, 0x79, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x49, 0x73, 0x56, 0x69, 0x65, 0x77, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x69, 0x73, 0x56, 0x69, 0x65, 0x77, 0x65, 0x64, 0x22, 0x48, 0x0a, 0x0c, 0x41, 0x70, 0x70, - 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x22, 0x9c, 0x02, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x09, 0x43, 0x6f, - 0x70, 0x79, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x09, 0x63, 0x6f, 0x70, 0x79, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x3c, 0x0a, 0x0d, - 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x41, - 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0d, 0x61, 0x70, 0x70, - 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x22, 0x48, 0x0a, 0x14, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4b, 0x65, - 0x79, 0x57, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, - 0x57, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3b, 0x0a, 0x0f, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, - 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2a, 0x29, 0x0a, 0x0a, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x6f, 0x69, 0x6e, 0x67, - 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x6b, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x61, - 0x69, 0x6c, 0x10, 0x02, 0x32, 0xc9, 0x08, 0x0a, 0x08, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, - 0x6c, 0x12, 0x3f, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x61, 0x70, - 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, - 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x06, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x17, 0x2e, 0x61, - 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x00, - 0x12, 0x3f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x70, - 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x41, - 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x3d, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x17, 0x2e, 0x61, 0x70, - 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x37, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, - 0x76, 0x61, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0e, 0x4e, 0x6f, 0x77, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x42, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x61, 0x70, - 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x4e, 0x6f, 0x77, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x42, - 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, - 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x46, 0x6c, 0x6f, 0x77, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x49, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x70, 0x72, - 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, - 0x61, 0x6c, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x06, 0x56, 0x69, 0x65, 0x77, - 0x65, 0x64, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x56, 0x69, - 0x65, 0x77, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, - 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x09, 0x53, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, - 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0d, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x2e, 0x61, - 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, - 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x70, 0x72, - 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x43, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, + 0x6f, 0x76, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x22, 0x48, 0x0a, 0x14, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4b, 0x65, 0x79, + 0x57, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x57, + 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3b, 0x0a, 0x0f, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, + 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x32, 0x88, 0x09, 0x0a, 0x08, 0x41, 0x70, 0x70, + 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x12, 0x3f, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, + 0x17, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, + 0x76, 0x61, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x06, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x12, 0x17, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x70, 0x72, + 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, - 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0a, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x1b, 0x2e, 0x61, 0x70, - 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0a, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, - 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, + 0x61, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, + 0x17, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, + 0x76, 0x61, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x39, 0x0a, 0x06, 0x4d, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x12, 0x15, + 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, - 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x3f, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x70, - 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x41, - 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x3e, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x3b, 0x0a, 0x08, 0x4d, 0x79, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x15, 0x2e, 0x61, 0x70, + 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0e, + 0x4e, 0x6f, 0x77, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x42, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, + 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x4e, 0x6f, 0x77, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x42, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x46, + 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, + 0x0b, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x2e, 0x61, + 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x70, + 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x06, 0x56, + 0x69, 0x65, 0x77, 0x65, 0x64, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, + 0x2e, 0x56, 0x69, 0x65, 0x77, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, + 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x09, + 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x70, 0x72, + 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, + 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, + 0x1e, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0d, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x2e, 0x61, + 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, - 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x42, 0x0d, 0x5a, 0x0b, 0x2e, 0x2f, 0x3b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0a, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, + 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x1b, + 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x00, 0x12, 0x43, 0x0a, + 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, + 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, + 0x76, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x2e, + 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, + 0x6c, 0x2e, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x70, 0x72, + 0x6f, 0x76, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x42, 0x0d, 0x5a, 0x0b, 0x2e, 0x2f, 0x3b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, + 0x61, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2820,33 +2891,32 @@ func file_api_approval_approval_proto_rawDescGZIP() []byte { return file_api_approval_approval_proto_rawDescData } -var file_api_approval_approval_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_api_approval_approval_proto_msgTypes = make([]protoimpl.MessageInfo, 33) +var file_api_approval_approval_proto_msgTypes = make([]protoimpl.MessageInfo, 34) var file_api_approval_approval_proto_goTypes = []interface{}{ - (StatusType)(0), // 0: approval.StatusType - (*NowLevelByInfoRequest)(nil), // 1: approval.NowLevelByInfoRequest - (*WorkFlowResponse)(nil), // 2: approval.WorkFlowResponse - (*CommonRequest)(nil), // 3: approval.CommonRequest - (*CreateTypeRequest)(nil), // 4: approval.CreateTypeRequest - (*TypeResponse)(nil), // 5: approval.TypeResponse - (*AllTypeResponse)(nil), // 6: approval.AllTypeResponse - (*StatusRequest)(nil), // 7: approval.StatusRequest - (*StatusResponse)(nil), // 8: approval.StatusResponse - (*ListRequest)(nil), // 9: approval.ListRequest - (*ListResponse)(nil), // 10: approval.ListResponse - (*ViewedRequest)(nil), // 11: approval.ViewedRequest - (*InformationRequest)(nil), // 12: approval.InformationRequest - (*Information)(nil), // 13: approval.Information - (*InformationResponse)(nil), // 14: approval.InformationResponse - (*Bundle)(nil), // 15: approval.Bundle - (*Show)(nil), // 16: approval.Show - (*ApprovalWork)(nil), // 17: approval.ApprovalWork - (*Work)(nil), // 18: approval.Work - (*ApprovalExhibition)(nil), // 19: approval.ApprovalExhibition - (*Exhibition)(nil), // 20: approval.Exhibition - (*CreateRequest)(nil), // 21: approval.CreateRequest - (*WorkFlow)(nil), // 22: approval.WorkFlow - (*DetailRequest)(nil), // 23: approval.DetailRequest + (*NowLevelByInfoRequest)(nil), // 0: approval.NowLevelByInfoRequest + (*WorkFlowResponse)(nil), // 1: approval.WorkFlowResponse + (*CommonRequest)(nil), // 2: approval.CommonRequest + (*CreateTypeRequest)(nil), // 3: approval.CreateTypeRequest + (*TypeResponse)(nil), // 4: approval.TypeResponse + (*AllTypeResponse)(nil), // 5: approval.AllTypeResponse + (*StatusRequest)(nil), // 6: approval.StatusRequest + (*StatusResponse)(nil), // 7: approval.StatusResponse + (*ListRequest)(nil), // 8: approval.ListRequest + (*ListResponse)(nil), // 9: approval.ListResponse + (*ViewedRequest)(nil), // 10: approval.ViewedRequest + (*InformationRequest)(nil), // 11: approval.InformationRequest + (*Information)(nil), // 12: approval.Information + (*InformationResponse)(nil), // 13: approval.InformationResponse + (*Bundle)(nil), // 14: approval.Bundle + (*Show)(nil), // 15: approval.Show + (*ApprovalWork)(nil), // 16: approval.ApprovalWork + (*Work)(nil), // 17: approval.Work + (*ApprovalExhibition)(nil), // 18: approval.ApprovalExhibition + (*Exhibition)(nil), // 19: approval.Exhibition + (*CreateRequest)(nil), // 20: approval.CreateRequest + (*WorkFlow)(nil), // 21: approval.WorkFlow + (*DetailRequest)(nil), // 22: approval.DetailRequest + (*RemoveRequest)(nil), // 23: approval.RemoveRequest (*ApprovalResponse)(nil), // 24: approval.ApprovalResponse (*RemoveResponse)(nil), // 25: approval.RemoveResponse (*ApprovalExhibitionRemove)(nil), // 26: approval.ApprovalExhibitionRemove @@ -2859,61 +2929,61 @@ var file_api_approval_approval_proto_goTypes = []interface{}{ (*SettingResponse)(nil), // 33: approval.SettingResponse } var file_api_approval_approval_proto_depIdxs = []int32{ - 4, // 0: approval.AllTypeResponse.Data:type_name -> approval.CreateTypeRequest - 0, // 1: approval.StatusRequest.Status:type_name -> approval.StatusType - 21, // 2: approval.ListResponse.data:type_name -> approval.CreateRequest - 13, // 3: approval.InformationResponse.MySubmitInfo:type_name -> approval.Information - 13, // 4: approval.InformationResponse.SubmitMeInfo:type_name -> approval.Information - 13, // 5: approval.InformationResponse.DomainInfo:type_name -> approval.Information - 17, // 6: approval.Work.ApprovalWorks:type_name -> approval.ApprovalWork - 19, // 7: approval.Exhibition.ApprovalExhibitions:type_name -> approval.ApprovalExhibition - 0, // 8: approval.CreateRequest.Status:type_name -> approval.StatusType - 29, // 9: approval.CreateRequest.CopyUsers:type_name -> approval.CopyUser - 18, // 10: approval.CreateRequest.Work:type_name -> approval.Work - 16, // 11: approval.CreateRequest.Show:type_name -> approval.Show - 20, // 12: approval.CreateRequest.Exhibition:type_name -> approval.Exhibition - 15, // 13: approval.CreateRequest.Bundle:type_name -> approval.Bundle - 30, // 14: approval.CreateRequest.ApprovalUsers:type_name -> approval.ApprovalUser - 22, // 15: approval.CreateRequest.WorkFlows:type_name -> approval.WorkFlow - 29, // 16: approval.SettingRequest.CopyUsers:type_name -> approval.CopyUser - 30, // 17: approval.SettingRequest.ApprovalUsers:type_name -> approval.ApprovalUser - 21, // 18: approval.Approval.Create:input_type -> approval.CreateRequest - 23, // 19: approval.Approval.Detail:input_type -> approval.DetailRequest - 21, // 20: approval.Approval.Update:input_type -> approval.CreateRequest - 23, // 21: approval.Approval.Remove:input_type -> approval.DetailRequest - 9, // 22: approval.Approval.List:input_type -> approval.ListRequest - 1, // 23: approval.Approval.NowLevelByInfo:input_type -> approval.NowLevelByInfoRequest - 12, // 24: approval.Approval.Information:input_type -> approval.InformationRequest - 11, // 25: approval.Approval.Viewed:input_type -> approval.ViewedRequest - 7, // 26: approval.Approval.SetStatus:input_type -> approval.StatusRequest - 32, // 27: approval.Approval.DetailSetting:input_type -> approval.DetailSettingRequest - 31, // 28: approval.Approval.UpdateSetting:input_type -> approval.SettingRequest - 4, // 29: approval.Approval.CreateType:input_type -> approval.CreateTypeRequest - 5, // 30: approval.Approval.DetailType:input_type -> approval.TypeResponse - 4, // 31: approval.Approval.UpdateType:input_type -> approval.CreateTypeRequest - 3, // 32: approval.Approval.AllType:input_type -> approval.CommonRequest - 5, // 33: approval.Approval.RemoveType:input_type -> approval.TypeResponse - 24, // 34: approval.Approval.Create:output_type -> approval.ApprovalResponse - 21, // 35: approval.Approval.Detail:output_type -> approval.CreateRequest - 24, // 36: approval.Approval.Update:output_type -> approval.ApprovalResponse - 25, // 37: approval.Approval.Remove:output_type -> approval.RemoveResponse - 10, // 38: approval.Approval.List:output_type -> approval.ListResponse - 2, // 39: approval.Approval.NowLevelByInfo:output_type -> approval.WorkFlowResponse - 14, // 40: approval.Approval.Information:output_type -> approval.InformationResponse + 3, // 0: approval.AllTypeResponse.Data:type_name -> approval.CreateTypeRequest + 20, // 1: approval.ListResponse.data:type_name -> approval.CreateRequest + 12, // 2: approval.InformationResponse.MySubmitInfo:type_name -> approval.Information + 12, // 3: approval.InformationResponse.SubmitMeInfo:type_name -> approval.Information + 12, // 4: approval.InformationResponse.DomainInfo:type_name -> approval.Information + 16, // 5: approval.Work.ApprovalWorks:type_name -> approval.ApprovalWork + 18, // 6: approval.Exhibition.ApprovalExhibitions:type_name -> approval.ApprovalExhibition + 29, // 7: approval.CreateRequest.CopyUsers:type_name -> approval.CopyUser + 17, // 8: approval.CreateRequest.Work:type_name -> approval.Work + 15, // 9: approval.CreateRequest.Show:type_name -> approval.Show + 19, // 10: approval.CreateRequest.Exhibition:type_name -> approval.Exhibition + 14, // 11: approval.CreateRequest.Bundle:type_name -> approval.Bundle + 30, // 12: approval.CreateRequest.ApprovalUsers:type_name -> approval.ApprovalUser + 21, // 13: approval.CreateRequest.WorkFlows:type_name -> approval.WorkFlow + 29, // 14: approval.SettingRequest.CopyUsers:type_name -> approval.CopyUser + 30, // 15: approval.SettingRequest.ApprovalUsers:type_name -> approval.ApprovalUser + 20, // 16: approval.Approval.Create:input_type -> approval.CreateRequest + 22, // 17: approval.Approval.Detail:input_type -> approval.DetailRequest + 20, // 18: approval.Approval.Update:input_type -> approval.CreateRequest + 23, // 19: approval.Approval.Remove:input_type -> approval.RemoveRequest + 8, // 20: approval.Approval.MyWork:input_type -> approval.ListRequest + 8, // 21: approval.Approval.MySubmit:input_type -> approval.ListRequest + 0, // 22: approval.Approval.NowLevelByInfo:input_type -> approval.NowLevelByInfoRequest + 11, // 23: approval.Approval.Information:input_type -> approval.InformationRequest + 10, // 24: approval.Approval.Viewed:input_type -> approval.ViewedRequest + 6, // 25: approval.Approval.SetStatus:input_type -> approval.StatusRequest + 32, // 26: approval.Approval.DetailSetting:input_type -> approval.DetailSettingRequest + 31, // 27: approval.Approval.UpdateSetting:input_type -> approval.SettingRequest + 3, // 28: approval.Approval.CreateType:input_type -> approval.CreateTypeRequest + 4, // 29: approval.Approval.DetailType:input_type -> approval.TypeResponse + 3, // 30: approval.Approval.UpdateType:input_type -> approval.CreateTypeRequest + 2, // 31: approval.Approval.AllType:input_type -> approval.CommonRequest + 4, // 32: approval.Approval.RemoveType:input_type -> approval.TypeResponse + 24, // 33: approval.Approval.Create:output_type -> approval.ApprovalResponse + 20, // 34: approval.Approval.Detail:output_type -> approval.CreateRequest + 24, // 35: approval.Approval.Update:output_type -> approval.ApprovalResponse + 25, // 36: approval.Approval.Remove:output_type -> approval.RemoveResponse + 9, // 37: approval.Approval.MyWork:output_type -> approval.ListResponse + 9, // 38: approval.Approval.MySubmit:output_type -> approval.ListResponse + 1, // 39: approval.Approval.NowLevelByInfo:output_type -> approval.WorkFlowResponse + 13, // 40: approval.Approval.Information:output_type -> approval.InformationResponse 24, // 41: approval.Approval.Viewed:output_type -> approval.ApprovalResponse - 8, // 42: approval.Approval.SetStatus:output_type -> approval.StatusResponse + 7, // 42: approval.Approval.SetStatus:output_type -> approval.StatusResponse 31, // 43: approval.Approval.DetailSetting:output_type -> approval.SettingRequest 33, // 44: approval.Approval.UpdateSetting:output_type -> approval.SettingResponse - 5, // 45: approval.Approval.CreateType:output_type -> approval.TypeResponse - 4, // 46: approval.Approval.DetailType:output_type -> approval.CreateTypeRequest - 5, // 47: approval.Approval.UpdateType:output_type -> approval.TypeResponse - 6, // 48: approval.Approval.AllType:output_type -> approval.AllTypeResponse - 5, // 49: approval.Approval.RemoveType:output_type -> approval.TypeResponse - 34, // [34:50] is the sub-list for method output_type - 18, // [18:34] is the sub-list for method input_type - 18, // [18:18] is the sub-list for extension type_name - 18, // [18:18] is the sub-list for extension extendee - 0, // [0:18] is the sub-list for field type_name + 4, // 45: approval.Approval.CreateType:output_type -> approval.TypeResponse + 3, // 46: approval.Approval.DetailType:output_type -> approval.CreateTypeRequest + 4, // 47: approval.Approval.UpdateType:output_type -> approval.TypeResponse + 5, // 48: approval.Approval.AllType:output_type -> approval.AllTypeResponse + 4, // 49: approval.Approval.RemoveType:output_type -> approval.TypeResponse + 33, // [33:50] is the sub-list for method output_type + 16, // [16:33] is the sub-list for method input_type + 16, // [16:16] is the sub-list for extension type_name + 16, // [16:16] is the sub-list for extension extendee + 0, // [0:16] is the sub-list for field type_name } func init() { file_api_approval_approval_proto_init() } @@ -3199,7 +3269,7 @@ func file_api_approval_approval_proto_init() { } } file_api_approval_approval_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApprovalResponse); i { + switch v := v.(*RemoveRequest); i { case 0: return &v.state case 1: @@ -3211,7 +3281,7 @@ func file_api_approval_approval_proto_init() { } } file_api_approval_approval_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveResponse); i { + switch v := v.(*ApprovalResponse); i { case 0: return &v.state case 1: @@ -3223,7 +3293,7 @@ func file_api_approval_approval_proto_init() { } } file_api_approval_approval_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApprovalExhibitionRemove); i { + switch v := v.(*RemoveResponse); i { case 0: return &v.state case 1: @@ -3235,7 +3305,7 @@ func file_api_approval_approval_proto_init() { } } file_api_approval_approval_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApprovalExhibitionRequest); i { + switch v := v.(*ApprovalExhibitionRemove); i { case 0: return &v.state case 1: @@ -3247,7 +3317,7 @@ func file_api_approval_approval_proto_init() { } } file_api_approval_approval_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApprovalExhibitionDetail); i { + switch v := v.(*ApprovalExhibitionRequest); i { case 0: return &v.state case 1: @@ -3259,7 +3329,7 @@ func file_api_approval_approval_proto_init() { } } file_api_approval_approval_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CopyUser); i { + switch v := v.(*ApprovalExhibitionDetail); i { case 0: return &v.state case 1: @@ -3271,7 +3341,7 @@ func file_api_approval_approval_proto_init() { } } file_api_approval_approval_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApprovalUser); i { + switch v := v.(*CopyUser); i { case 0: return &v.state case 1: @@ -3283,7 +3353,7 @@ func file_api_approval_approval_proto_init() { } } file_api_approval_approval_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SettingRequest); i { + switch v := v.(*ApprovalUser); i { case 0: return &v.state case 1: @@ -3295,7 +3365,7 @@ func file_api_approval_approval_proto_init() { } } file_api_approval_approval_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DetailSettingRequest); i { + switch v := v.(*SettingRequest); i { case 0: return &v.state case 1: @@ -3307,6 +3377,18 @@ func file_api_approval_approval_proto_init() { } } file_api_approval_approval_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetailSettingRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_approval_approval_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SettingResponse); i { case 0: return &v.state @@ -3324,14 +3406,13 @@ func file_api_approval_approval_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_approval_approval_proto_rawDesc, - NumEnums: 1, - NumMessages: 33, + NumEnums: 0, + NumMessages: 34, NumExtensions: 0, NumServices: 1, }, GoTypes: file_api_approval_approval_proto_goTypes, DependencyIndexes: file_api_approval_approval_proto_depIdxs, - EnumInfos: file_api_approval_approval_proto_enumTypes, MessageInfos: file_api_approval_approval_proto_msgTypes, }.Build() File_api_approval_approval_proto = out.File diff --git a/api/approval/approval.proto b/api/approval/approval.proto index a194704..b646719 100644 --- a/api/approval/approval.proto +++ b/api/approval/approval.proto @@ -10,8 +10,9 @@ service Approval { rpc Create(CreateRequest) returns (ApprovalResponse) {}; rpc Detail(DetailRequest) returns (CreateRequest) {}; rpc Update(CreateRequest) returns (ApprovalResponse) {}; - rpc Remove(DetailRequest) returns (RemoveResponse) {}; - rpc List(ListRequest) returns (ListResponse) {}; + rpc Remove(RemoveRequest) returns (RemoveResponse) {}; + rpc MyWork(ListRequest) returns (ListResponse) {};// 我的工作---待处理 + rpc MySubmit(ListRequest) returns (ListResponse) {};// 我的提交 rpc NowLevelByInfo(NowLevelByInfoRequest) returns (WorkFlowResponse) {}; rpc Information(InformationRequest) returns (InformationResponse) {}; rpc Viewed(ViewedRequest) returns (ApprovalResponse) {}; @@ -41,13 +42,15 @@ message WorkFlowResponse { message CommonRequest { string Domain = 1 [json_name = "domain"]; + uint64 Page = 2 [json_name = "Page"]; + uint64 PageSize = 3 [json_name = "pageSize"]; } message CreateTypeRequest { string Domain = 1 [json_name = "domain"]; uint64 ID = 2 [json_name = "ID"]; string Title = 3 [json_name = "title"]; - string KeyWord = 4 [json_name = "keyWord"]; + string Remark = 5 [json_name = "keyWord"]; } message TypeResponse { @@ -60,19 +63,12 @@ message AllTypeResponse { uint64 Count = 2; } -enum StatusType { - Doing = 0; - Ok = 1; - Fail = 2; -} - - message StatusRequest { string Domain = 1 [json_name = "domain"]; uint64 ID = 2 [json_name = "ID"]; string Reply = 3 [json_name = "Reply"]; uint64 WorkFlowId = 4 [json_name = "workFlowId"]; - StatusType Status = 5 [json_name = "status",(validator.field) = {is_in_enum: true,human_error: "状态非法"}]; + uint64 Status = 5 [json_name = "status",(validator.field) = {int_lt: 4,int_gt: 0,human_error: "状态非法"}]; uint64 Level = 6 [json_name = "level"]; } @@ -84,7 +80,7 @@ message ListRequest { string Domain = 1 [json_name = "domain",(validator.field) = {string_not_empty: true,human_error: "环境变量必须要有"} ]; uint64 PageSize = 2 [json_name = "PageSize"]; // uint64 Page = 3 [json_name = "Page"]; // - uint64 Status = 4 [json_name = "status"];//0待审批 1-审批成功 2-拒绝 + uint64 Status = 4 [json_name = "status"];//0待审批 1-审批成功 2-拒绝 4-是所有 string Type = 5 [json_name = "type"]; //类型 uint64 UserID = 6 [json_name = "userID"]; // } @@ -163,25 +159,24 @@ message ApprovalExhibition { } message Exhibition { - uint64 ID =1 [json_name = "ID"]; - string ReceivedAt =2 [json_name = "receivedAt"]; - string Address =3 [json_name = "address"]; - repeated ApprovalExhibition ApprovalExhibitions = 4 [json_name = "approvalExhibitions"]; + uint64 ID =1 [json_name = "ID"]; + string ReceivedAt =2 [json_name = "receivedAt"]; + string Address =3 [json_name = "address"]; + uint64 PidApprovalID =4 [json_name = "pidApprovalID"]; + repeated ApprovalExhibition ApprovalExhibitions = 5 [json_name = "approvalExhibitions"]; } message CreateRequest { uint64 ID = 1 [json_name = "ID"]; string Domain = 2 [json_name = "domain",(validator.field) = {string_not_empty: true,human_error: "环境变量必须要有"} ]; - StatusType Status = 3 [json_name = "status",(validator.field) = {is_in_enum: true,human_error: "状态非法"}]; + uint64 Status = 3 [json_name = "status"]; string Type = 4 [json_name = "type",(validator.field) = {string_not_empty: true,human_error: "类型必须要有"} ]; - uint64 ApproverID = 5 [json_name = "approverID",(validator.field) = {string_not_empty: true,human_error: "提交人人ID"} ]; - string ApproverName = 6 [json_name = "approverName",(validator.field) = {string_not_empty: true,human_error: "提交人名称"} ]; uint64 SubmitterID = 7 [json_name = "submitterID"];//审批人 string SubmitterName = 8 [json_name = "submitterName"]; repeated CopyUser CopyUsers = 9 [json_name = "copyName"];//抄送人 string Content = 10 [json_name = "content"];//申请内容 string Reply = 11 [json_name = "reply"];//回复 - bool IsViewed = 12 [json_name = "IsViewed"];//抄送人是否查看过 + bool CanView = 12 [json_name = "CanView"];//是否可以阅读 Work Work = 13 [json_name = "work"]; Show Show = 14 [json_name = "show"]; Exhibition Exhibition = 15 [json_name = "exhibition"]; @@ -189,6 +184,11 @@ message CreateRequest { repeated ApprovalUser ApprovalUsers= 17 [json_name = "approvalUsers"];//审批的人 bool CanApproval = 18 [json_name = "canApproval"];//审批的人 repeated WorkFlow WorkFlows = 19 [json_name = "workFlows"];//审批的人 + uint64 AllStatus = 20 [json_name = "allStatus"];//状态 0 1 2 3已阅读 4-待阅读 + uint64 NowUserId = 21 [json_name = "nowUserId"]; + string NowUserName = 22 [json_name = "nowUserName"]; + uint64 Level = 23 [json_name = "level"]; + uint64 NowLevel = 24 [json_name = "nowLevel"]; } message WorkFlow { @@ -204,8 +204,16 @@ message WorkFlow { message DetailRequest { uint64 ID=1 [json_name = "ID"]; string Domain=2 [json_name = "domain"]; + uint64 UserId=3 [json_name = "userId"]; } +message RemoveRequest { + repeated uint64 IDs=1 [json_name = "IDs"]; + string Domain=2 [json_name = "domain"]; +} + + + message ApprovalResponse { uint64 ID=1 [json_name = "ID"]; bool Success=2 [json_name = "success"]; diff --git a/api/approval/approval.validator.pb.go b/api/approval/approval.validator.pb.go index d8bc946..955ae98 100644 --- a/api/approval/approval.validator.pb.go +++ b/api/approval/approval.validator.pb.go @@ -42,7 +42,10 @@ func (this *AllTypeResponse) Validate() error { return nil } func (this *StatusRequest) Validate() error { - if _, ok := StatusType_name[int32(this.Status)]; !ok { + if !(this.Status > 0) { + return github_com_mwitkow_go_proto_validators.FieldError("Status", fmt.Errorf(`状态非法`)) + } + if !(this.Status < 4) { return github_com_mwitkow_go_proto_validators.FieldError("Status", fmt.Errorf(`状态非法`)) } return nil @@ -129,15 +132,9 @@ func (this *CreateRequest) Validate() error { if this.Domain == "" { return github_com_mwitkow_go_proto_validators.FieldError("Domain", fmt.Errorf(`环境变量必须要有`)) } - if _, ok := StatusType_name[int32(this.Status)]; !ok { - return github_com_mwitkow_go_proto_validators.FieldError("Status", fmt.Errorf(`状态非法`)) - } if this.Type == "" { return github_com_mwitkow_go_proto_validators.FieldError("Type", fmt.Errorf(`类型必须要有`)) } - if this.ApproverName == "" { - return github_com_mwitkow_go_proto_validators.FieldError("ApproverName", fmt.Errorf(`提交人名称`)) - } for _, item := range this.CopyUsers { if item != nil { if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(item); err != nil { @@ -187,6 +184,9 @@ func (this *WorkFlow) Validate() error { func (this *DetailRequest) Validate() error { return nil } +func (this *RemoveRequest) Validate() error { + return nil +} func (this *ApprovalResponse) Validate() error { return nil } diff --git a/api/approval/approval_triple.pb.go b/api/approval/approval_triple.pb.go index 041d1b6..7efddf1 100644 --- a/api/approval/approval_triple.pb.go +++ b/api/approval/approval_triple.pb.go @@ -31,8 +31,9 @@ type ApprovalClient interface { Create(ctx context.Context, in *CreateRequest, opts ...grpc_go.CallOption) (*ApprovalResponse, common.ErrorWithAttachment) Detail(ctx context.Context, in *DetailRequest, opts ...grpc_go.CallOption) (*CreateRequest, common.ErrorWithAttachment) Update(ctx context.Context, in *CreateRequest, opts ...grpc_go.CallOption) (*ApprovalResponse, common.ErrorWithAttachment) - Remove(ctx context.Context, in *DetailRequest, opts ...grpc_go.CallOption) (*RemoveResponse, common.ErrorWithAttachment) - List(ctx context.Context, in *ListRequest, opts ...grpc_go.CallOption) (*ListResponse, common.ErrorWithAttachment) + Remove(ctx context.Context, in *RemoveRequest, opts ...grpc_go.CallOption) (*RemoveResponse, common.ErrorWithAttachment) + MyWork(ctx context.Context, in *ListRequest, opts ...grpc_go.CallOption) (*ListResponse, common.ErrorWithAttachment) + MySubmit(ctx context.Context, in *ListRequest, opts ...grpc_go.CallOption) (*ListResponse, common.ErrorWithAttachment) NowLevelByInfo(ctx context.Context, in *NowLevelByInfoRequest, opts ...grpc_go.CallOption) (*WorkFlowResponse, common.ErrorWithAttachment) Information(ctx context.Context, in *InformationRequest, opts ...grpc_go.CallOption) (*InformationResponse, common.ErrorWithAttachment) Viewed(ctx context.Context, in *ViewedRequest, opts ...grpc_go.CallOption) (*ApprovalResponse, common.ErrorWithAttachment) @@ -54,8 +55,9 @@ type ApprovalClientImpl struct { Create func(ctx context.Context, in *CreateRequest) (*ApprovalResponse, error) Detail func(ctx context.Context, in *DetailRequest) (*CreateRequest, error) Update func(ctx context.Context, in *CreateRequest) (*ApprovalResponse, error) - Remove func(ctx context.Context, in *DetailRequest) (*RemoveResponse, error) - List func(ctx context.Context, in *ListRequest) (*ListResponse, error) + Remove func(ctx context.Context, in *RemoveRequest) (*RemoveResponse, error) + MyWork func(ctx context.Context, in *ListRequest) (*ListResponse, error) + MySubmit func(ctx context.Context, in *ListRequest) (*ListResponse, error) NowLevelByInfo func(ctx context.Context, in *NowLevelByInfoRequest) (*WorkFlowResponse, error) Information func(ctx context.Context, in *InformationRequest) (*InformationResponse, error) Viewed func(ctx context.Context, in *ViewedRequest) (*ApprovalResponse, error) @@ -99,16 +101,22 @@ func (c *approvalClient) Update(ctx context.Context, in *CreateRequest, opts ... return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/Update", in, out) } -func (c *approvalClient) Remove(ctx context.Context, in *DetailRequest, opts ...grpc_go.CallOption) (*RemoveResponse, common.ErrorWithAttachment) { +func (c *approvalClient) Remove(ctx context.Context, in *RemoveRequest, opts ...grpc_go.CallOption) (*RemoveResponse, common.ErrorWithAttachment) { out := new(RemoveResponse) interfaceKey := ctx.Value(constant.InterfaceKey).(string) return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/Remove", in, out) } -func (c *approvalClient) List(ctx context.Context, in *ListRequest, opts ...grpc_go.CallOption) (*ListResponse, common.ErrorWithAttachment) { +func (c *approvalClient) MyWork(ctx context.Context, in *ListRequest, opts ...grpc_go.CallOption) (*ListResponse, common.ErrorWithAttachment) { out := new(ListResponse) interfaceKey := ctx.Value(constant.InterfaceKey).(string) - return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/List", in, out) + return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/MyWork", in, out) +} + +func (c *approvalClient) MySubmit(ctx context.Context, in *ListRequest, opts ...grpc_go.CallOption) (*ListResponse, common.ErrorWithAttachment) { + out := new(ListResponse) + interfaceKey := ctx.Value(constant.InterfaceKey).(string) + return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/MySubmit", in, out) } func (c *approvalClient) NowLevelByInfo(ctx context.Context, in *NowLevelByInfoRequest, opts ...grpc_go.CallOption) (*WorkFlowResponse, common.ErrorWithAttachment) { @@ -184,8 +192,9 @@ type ApprovalServer interface { Create(context.Context, *CreateRequest) (*ApprovalResponse, error) Detail(context.Context, *DetailRequest) (*CreateRequest, error) Update(context.Context, *CreateRequest) (*ApprovalResponse, error) - Remove(context.Context, *DetailRequest) (*RemoveResponse, error) - List(context.Context, *ListRequest) (*ListResponse, error) + Remove(context.Context, *RemoveRequest) (*RemoveResponse, error) + MyWork(context.Context, *ListRequest) (*ListResponse, error) + MySubmit(context.Context, *ListRequest) (*ListResponse, error) NowLevelByInfo(context.Context, *NowLevelByInfoRequest) (*WorkFlowResponse, error) Information(context.Context, *InformationRequest) (*InformationResponse, error) Viewed(context.Context, *ViewedRequest) (*ApprovalResponse, error) @@ -214,11 +223,14 @@ func (UnimplementedApprovalServer) Detail(context.Context, *DetailRequest) (*Cre func (UnimplementedApprovalServer) Update(context.Context, *CreateRequest) (*ApprovalResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") } -func (UnimplementedApprovalServer) Remove(context.Context, *DetailRequest) (*RemoveResponse, error) { +func (UnimplementedApprovalServer) Remove(context.Context, *RemoveRequest) (*RemoveResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Remove not implemented") } -func (UnimplementedApprovalServer) List(context.Context, *ListRequest) (*ListResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method List not implemented") +func (UnimplementedApprovalServer) MyWork(context.Context, *ListRequest) (*ListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method MyWork not implemented") +} +func (UnimplementedApprovalServer) MySubmit(context.Context, *ListRequest) (*ListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method MySubmit not implemented") } func (UnimplementedApprovalServer) NowLevelByInfo(context.Context, *NowLevelByInfoRequest) (*WorkFlowResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method NowLevelByInfo not implemented") @@ -369,7 +381,7 @@ func _Approval_Update_Handler(srv interface{}, ctx context.Context, dec func(int } func _Approval_Remove_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) { - in := new(DetailRequest) + in := new(RemoveRequest) if err := dec(in); err != nil { return nil, err } @@ -397,7 +409,7 @@ func _Approval_Remove_Handler(srv interface{}, ctx context.Context, dec func(int return interceptor(ctx, in, info, handler) } -func _Approval_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) { +func _Approval_MyWork_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) { in := new(ListRequest) if err := dec(in); err != nil { return nil, err @@ -410,7 +422,36 @@ func _Approval_List_Handler(srv interface{}, ctx context.Context, dec func(inter for k, v := range md { invAttachment[k] = v } - invo := invocation.NewRPCInvocation("List", args, invAttachment) + invo := invocation.NewRPCInvocation("MyWork", args, invAttachment) + if interceptor == nil { + result := base.XXX_GetProxyImpl().Invoke(ctx, invo) + return result, result.Error() + } + info := &grpc_go.UnaryServerInfo{ + Server: srv, + FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string), + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + result := base.XXX_GetProxyImpl().Invoke(ctx, invo) + return result, result.Error() + } + return interceptor(ctx, in, info, handler) +} + +func _Approval_MySubmit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) { + in := new(ListRequest) + if err := dec(in); err != nil { + return nil, err + } + base := srv.(dubbo3.Dubbo3GrpcService) + args := []interface{}{} + args = append(args, in) + md, _ := metadata.FromIncomingContext(ctx) + invAttachment := make(map[string]interface{}, len(md)) + for k, v := range md { + invAttachment[k] = v + } + invo := invocation.NewRPCInvocation("MySubmit", args, invAttachment) if interceptor == nil { result := base.XXX_GetProxyImpl().Invoke(ctx, invo) return result, result.Error() @@ -769,8 +810,12 @@ var Approval_ServiceDesc = grpc_go.ServiceDesc{ Handler: _Approval_Remove_Handler, }, { - MethodName: "List", - Handler: _Approval_List_Handler, + MethodName: "MyWork", + Handler: _Approval_MyWork_Handler, + }, + { + MethodName: "MySubmit", + Handler: _Approval_MySubmit_Handler, }, { MethodName: "NowLevelByInfo", diff --git a/pkg/common/md5/md5.go b/pkg/common/md5/md5.go new file mode 100644 index 0000000..3cf9f2e --- /dev/null +++ b/pkg/common/md5/md5.go @@ -0,0 +1,16 @@ +package md5 + +import ( + "crypto/md5" + "encoding/hex" +) + +func Md5(str string) string { + h := md5.New() + h.Write([]byte(str)) + return hex.EncodeToString(h.Sum(nil)) +} + +func Md5Part(str string, start int, end int) string { + return Md5(str)[start:end] +} diff --git a/pkg/m/msg.go b/pkg/m/msg.go index d458ebb..8602a06 100644 --- a/pkg/m/msg.go +++ b/pkg/m/msg.go @@ -15,9 +15,14 @@ const ( ) const ( - ErrorNotFound = "暂无数据" - ErrorWrongStatus = "当前状态无法修改" - ErrorChangeType = "无法修改其类型" + ErrorNotFound = "暂无数据" + ErrorWrongStatus = "当前状态无法修改" + ErrorDoingNotView = "进行中的状态无法设置已阅读" + ErrorChangeType = "无法修改其类型" + ErrorSettingView = "您不可设置已读" + ErrorAlreadySettingView = "已经设置过已读" + ErrorWrongNum = "数量设置错误" + ErrorAlreadyExist = "已经存在" ) const ( diff --git a/pkg/model/approval.go b/pkg/model/approval.go index 3c90bd7..50e3d62 100644 --- a/pkg/model/approval.go +++ b/pkg/model/approval.go @@ -2,6 +2,7 @@ package model import ( "errors" + "fmt" "github.com/fonchain_enterprise/fonchain-approval/api/approval" "github.com/fonchain_enterprise/fonchain-approval/pkg/common/page" msg "github.com/fonchain_enterprise/fonchain-approval/pkg/m" @@ -44,9 +45,14 @@ const ( TypeBundle = "bundle" ) const ( - StatusDoing = 0 - StatusOk = 1 - StatusFail = 2 + StatusDoing = 1 + StatusOk = 2 + StatusFail = 3 +) + +const ( + StatusNeedViewed = 4 + StatusViewed = 5 ) type ApprovalContentInterface interface { @@ -61,9 +67,36 @@ func (m *Approval) TableName() string { return "approval" } +func preValidateExhibition(in *approval.CreateRequest) error { + var entity *Bundle + + if in.Type != TypeExhibition { + return nil + } + + if in.Exhibition == nil || in.Exhibition.PidApprovalID == 0 { + return errors.New(msg.ErrorApprovalType) + } + + if err := DB.Where(Bundle{ApprovalID: in.Exhibition.PidApprovalID}).First(&entity).Error; err != nil { + return err + } + + if len(in.Exhibition.ApprovalExhibitions) != int(entity.ApplicationsNum) { + return errors.New(msg.ErrorWrongNum) + } + + return nil + +} + func StoreApproval(in *approval.CreateRequest) (*Approval, error) { var entity *Approval + if err1 := preValidateExhibition(in); err1 != nil { + return entity, err1 + } + err := DB.Transaction(func(tx *gorm.DB) error { setting, terr := GetApprovalSettingFromKeyWord(in.Domain, in.Type) @@ -80,6 +113,7 @@ func StoreApproval(in *approval.CreateRequest) (*Approval, error) { ApprovalUsers: setting.ApprovalUsers, Type: in.Type, Content: in.Content, + Status: StatusDoing, Level: uint8(len(setting.ApprovalUsers)), NowLevel: 1, NowUserId: setting.ApprovalUsers[0].ID, @@ -108,20 +142,34 @@ func Viewed(in *approval.ViewedRequest) error { var entity *Approval var err error + var isView = false if err = DB.First(&entity, in.ID).Error; err != nil { return errors.New(msg.ErrorNotFound) } + if entity.Status != StatusOk { + return errors.New(msg.ErrorDoingNotView) + } + copyUsers := entity.CopyUsers for i, temp := range copyUsers { if temp.ID == in.UserID { - temp.IsViewed = true + if temp.IsViewed == true { + return errors.New(msg.ErrorAlreadySettingView) + } + + isView = true + temp.IsViewed = isView copyUsers[i] = temp } } + if isView == false { + return errors.New(msg.ErrorSettingView) + } + return DB.Model(&Approval{}).Where(&Approval{ID: in.ID}).Updates(&Approval{CopyUsers: copyUsers}).Error } @@ -129,6 +177,10 @@ func Viewed(in *approval.ViewedRequest) error { func UpdateApproval(in *approval.CreateRequest) (*Approval, error) { var entity *Approval + if err1 := preValidateExhibition(in); err1 != nil { + return entity, err1 + } + err := DB.Transaction(func(tx *gorm.DB) error { if departErr := DB.First(&entity, in.ID).Error; departErr != nil { @@ -139,31 +191,9 @@ func UpdateApproval(in *approval.CreateRequest) (*Approval, error) { return errors.New(msg.ErrorChangeType) } - if entity.Status != StatusDoing { - return errors.New(msg.ErrorWrongStatus) - } else if in.Status != StatusDoing { //审批 - // 保存基本信息 - entity = &Approval{ - ID: in.ID, - Status: int8(in.Status), - Reply: in.Reply, - } - - return DB.Save(&entity).Error - } - // 保存基本信息 entity = &Approval{ - ID: in.ID, - //Domain: in.Domain, - //SubmitterID: in.SubmitterId, - //SubmitterName: in.SubmitterName, - //ApproverID: in.ApproverId, - //ApproverName: in.ApproverName, - //CopyUsers: FormatCopyUsers(in.CopyUsers), - //Type: in.Type, Content: in.Content, - Reply: in.Reply, } if err := DB.Where(&Approval{ID: in.ID}).Updates(&entity).Error; err != nil { @@ -194,7 +224,7 @@ func approvalCalc(filter *Approval) *approval.Information { DB.Model(&Approval{}).Where(&filter).Count(&num) info.Total = uint64(num) - DB.Model(&Approval{}).Where(&filter).Where(&Approval{Status: StatusOk}).Count(&num) + DB.Model(&Approval{}).Where(&filter).Where(&Approval{Status: StatusDoing}).Count(&num) info.DoingTotal = uint64(num) DB.Model(&Approval{}).Where(&filter).Where(&Approval{Status: StatusOk}).Count(&num) @@ -209,7 +239,7 @@ func approvalCalc(filter *Approval) *approval.Information { func approvalCalcJson(domain string, userId uint64) *approval.Information { var num int64 - var jsonStr = "JSON_CONTAINS(approve_users,JSON_OBJECT('ID', ?))" + var jsonStr = "JSON_CONTAINS(approval_users,JSON_OBJECT('ID', ?))" info := &approval.Information{ Total: 0, @@ -221,7 +251,7 @@ func approvalCalcJson(domain string, userId uint64) *approval.Information { DB.Model(&Approval{}).Where(jsonStr, userId).Count(&num) info.Total = uint64(num) - DB.Model(&Approval{}).Where(jsonStr, userId).Where(&Approval{Status: StatusOk, Domain: &domain}).Count(&num) + DB.Model(&Approval{}).Where(jsonStr, userId).Where(&Approval{Status: StatusDoing, Domain: &domain}).Count(&num) info.DoingTotal = uint64(num) DB.Model(&Approval{}).Where(jsonStr, userId).Where(&Approval{Status: StatusOk, Domain: &domain}).Count(&num) @@ -310,7 +340,7 @@ func (m *Approval) UpdateContent(in *approval.CreateRequest) error { return err } -func ApprovalList(in *approval.ListRequest) ([]*Approval, int64) { +func MyWorkApprovals(in *approval.ListRequest) ([]*Approval, int64) { var list []*Approval var count int64 @@ -327,8 +357,8 @@ func ApprovalList(in *approval.ListRequest) ([]*Approval, int64) { } if in.UserID != 0 { - modelObj = modelObj.Where(DB.Where("JSON_CONTAINS(approve_users,JSON_OBJECT('ID', ?))", in.UserID). - Or("JSON_CONTAINS(copy_users,JSON_OBJECT('ID', ?))", in.UserID)) + modelObj = modelObj.Where(DB.Where("JSON_CONTAINS(approval_users,JSON_OBJECT('ID', ?))", in.UserID). + Or(DB.Where("JSON_CONTAINS(copy_users,JSON_OBJECT('ID', ?))", in.UserID)).Where("status != ?", StatusDoing)) } if in.Status != 0 { @@ -342,6 +372,35 @@ func ApprovalList(in *approval.ListRequest) ([]*Approval, int64) { return list, count } +func MySubmitApprovals(in *approval.ListRequest) ([]*Approval, int64) { + var list []*Approval + var count int64 + + //list + modelObj := DB.Model(&Approval{}). + Preload("Show"). + Preload("Work.ApprovalWorks"). + Preload("Bundle"). + Preload("ApprovalWorkFlows"). + Preload("Exhibition.ApprovalExhibitions") + + if in.Status != 0 { + modelObj = modelObj.Where(&Approval{Status: int8(in.Status)}) + } + + if in.Type != "" { + modelObj = modelObj.Where(&Approval{Type: in.Type}) + } + + modelObj = modelObj.Where(&Approval{SubmitterID: in.UserID}) + + modelObj.Count(&count) + + modelObj.Limit(int(in.PageSize)).Offset(page.GetOffset(in.Page, in.PageSize)).Order("id desc").Find(&list) + + return list, count +} + func (m *Approval) Pass(reply string, workFlowId uint64) error { return m.operateStatus(StatusOk, reply, workFlowId) } @@ -354,6 +413,7 @@ func (m *Approval) operateStatus(status uint8, reply string, workFlowId uint64) var workFlow ApprovalWorkFlow + m.Reply = reply if err := DB.Model(&ApprovalWorkFlow{ApprovalID: m.ID, Status: StatusDoing}).First(&workFlow, workFlowId).Error; err != nil { return err } @@ -362,9 +422,9 @@ func (m *Approval) operateStatus(status uint8, reply string, workFlowId uint64) return errors.New(msg.ErrorOperate) } - if status == StatusFail { //拒绝 + // 拒绝通过 + if status == StatusFail { m.Status = StatusFail - m.Reply = reply if err := DB.Save(m).Error; err != nil { return err @@ -373,12 +433,16 @@ func (m *Approval) operateStatus(status uint8, reply string, workFlowId uint64) return workFlow.Refuse(reply) } - //层级审批通过 - if m.Level == m.NowLevel { // 整个审批通过 + /*--------层级审批通过---------*/ + // 整个审批通过 + if m.Level == m.NowLevel { m.Status = StatusOk - } else { //审批层级通过 + + //审批层级通过 + } else { m.NowLevel = workFlow.Level + 1 nextFlow, err := GetWorkFlowByLevel(m.ID, m.NowLevel) + fmt.Println(nextFlow) if err != nil { return err } @@ -386,7 +450,6 @@ func (m *Approval) operateStatus(status uint8, reply string, workFlowId uint64) m.NowUserName = nextFlow.Name } - m.Reply = reply if err := DB.Save(m).Error; err != nil { return err } diff --git a/pkg/model/approval_setting.go b/pkg/model/approval_setting.go index 8640e15..d370709 100644 --- a/pkg/model/approval_setting.go +++ b/pkg/model/approval_setting.go @@ -40,8 +40,6 @@ func (m *ApprovalSetting) TableName() string { return "approval_setting" } -type JSON json.RawMessage - func (j *CopyUsers) Scan(src interface{}) error { return json.Unmarshal(src.([]byte), j) } @@ -53,13 +51,13 @@ func (j CopyUsers) Value() (driver.Value, error) { return string(v), err } -func (j *ApprovalUsers) Scan(src interface{}) error { - return json.Unmarshal(src.([]byte), j) +func (s *ApprovalUsers) Scan(src interface{}) error { + return json.Unmarshal(src.([]byte), s) } -func (j ApprovalUsers) Value() (driver.Value, error) { +func (s ApprovalUsers) Value() (driver.Value, error) { - v, err := json.Marshal(j) + v, err := json.Marshal(s) return string(v), err } diff --git a/pkg/model/approval_type.go b/pkg/model/approval_type.go index 2bd11d1..3ce9230 100644 --- a/pkg/model/approval_type.go +++ b/pkg/model/approval_type.go @@ -1,7 +1,10 @@ package model import ( + md52 "github.com/fonchain_enterprise/fonchain-approval/pkg/common/md5" "gorm.io/plugin/soft_delete" + "math/rand" + "strconv" "time" ) @@ -14,9 +17,45 @@ type ApprovalType struct { KeyWord string `gorm:"column:key_word" json:"keyWord"` // 回复内容 Domain string `gorm:"column:domain" json:"domain"` // 回复内容 Title string `gorm:"column:title" json:"title"` // 回复内容 + Remark string `gorm:"column:remark" json:"remark"` // 回复内容 } // TableName get sql table name.获取数据库表名 func (m *ApprovalType) TableName() string { return "approval_type" } + +var keyWordMap = map[string]string{ + "普通审批": "content", + "画作申请审批": "work", + "画展包审批": "exhibition", + "画展包数量审批": "bundle", + "画展审批": "show", +} + +func DataExist(domain, keyWork string) bool { + var count int64 + DB.Model(&ApprovalType{}).Where(&ApprovalType{Domain: domain, KeyWord: keyWork}).Count(&count) + if count != 0 { + return true + + } + return false + +} + +func KeyWordFromTitle(title string) string { + keyWord := md52.Md5Part(title+strconv.Itoa(rand.Intn(100)), 8, 16) + + if IsSystemKeyWork(title) == true { + keyWord = keyWordMap[title] + } + + return keyWord + +} + +func IsSystemKeyWork(title string) bool { + _, isOk := keyWordMap[title] + return isOk +} diff --git a/pkg/model/approval_workflow.go b/pkg/model/approval_workflow.go index cb6b6e9..5a8a456 100644 --- a/pkg/model/approval_workflow.go +++ b/pkg/model/approval_workflow.go @@ -19,13 +19,15 @@ type ApprovalWorkFlow struct { Level uint8 `gorm:"column:level" json:"Level"` Status uint8 `gorm:"column:status" json:"Status"` Reply string `gorm:"column:reply" json:"Reply"` - OperatedAt time.Time `gorm:"column:operated_at" json:"operatedAt"` + OperatedAt *time.Time `gorm:"column:operated_at" json:"operatedAt"` } func GetNowWorkFlowByApprovalId(approvalId uint64) (*ApprovalWorkFlow, error) { var workFlow *ApprovalWorkFlow - if err := DB.Model(&ApprovalWorkFlow{ApprovalID: approvalId, Status: StatusDoing}).Order("level asc").First(&workFlow).Error; err != nil { + if err := DB.Model(&ApprovalWorkFlow{}). + Where(&ApprovalWorkFlow{ApprovalID: approvalId, Status: StatusDoing}). + Order("level asc").First(&workFlow).Error; err != nil { return nil, err } @@ -36,7 +38,7 @@ func GetNowWorkFlowByApprovalId(approvalId uint64) (*ApprovalWorkFlow, error) { func GetWorkFlowByLevel(approvalId uint64, level uint8) (*ApprovalWorkFlow, error) { var workFlow *ApprovalWorkFlow - if err := DB.Model(&ApprovalWorkFlow{ApprovalID: approvalId, Level: level}).First(&workFlow).Error; err != nil { + if err := DB.Model(&ApprovalWorkFlow{}).Where(&ApprovalWorkFlow{ApprovalID: approvalId, Level: level}).First(&workFlow).Error; err != nil { return nil, err } @@ -56,6 +58,7 @@ func BatchSave(users ApprovalUsers, approvalId uint64) error { UserId: user.ID, Name: user.Name, ApprovalID: approvalId, + Status: StatusDoing, Level: uint8(index + 1), } @@ -81,6 +84,8 @@ func (m *ApprovalWorkFlow) Refuse(replay string) error { func (m *ApprovalWorkFlow) SetStatus(status uint8, reply string) error { m.Status = status m.Reply = reply + temp := time.Now() + m.OperatedAt = &temp DB.Save(m) return DB.Save(m).Error } diff --git a/pkg/model/init.go b/pkg/model/init.go index 78602c1..9295148 100644 --- a/pkg/model/init.go +++ b/pkg/model/init.go @@ -35,10 +35,7 @@ func init() { LoadMysqlData(file) //MySQL数据库 - path := strings.Join([]string{DbUser, ":", DbPassWord, "@tcp(", DbHost, ":", DbPort, ")/", DbName, "?charset=utf8&parseTime=true"}, "") - fmt.Println("-----------------------------") - fmt.Println(path) - fmt.Println("-----------------------------") + path := strings.Join([]string{DbUser, ":", DbPassWord, "@tcp(", DbHost, ":", DbPort, ")/", DbName, "?charset=utf8&parseTime=true&loc=Local"}, "") //连接数据库 Database(path) } diff --git a/pkg/serializer/approval.go b/pkg/serializer/approval.go index 0545d63..02ec94a 100644 --- a/pkg/serializer/approval.go +++ b/pkg/serializer/approval.go @@ -12,27 +12,38 @@ func BuildApproval(entity *model.Approval, userId uint64) *approval.CreateReques var exhibition *approval.Exhibition var bundle *approval.Bundle var workFlows []*approval.WorkFlow - isViewed := false + canViewed := false canApproval := false + allStatus := uint64(entity.Status) copyUsers := model.FormatToResponse(entity.CopyUsers) - for _, cu := range copyUsers { - if userId != 0 && cu.ID == userId && cu.IsViewed == true { - isViewed = true + if allStatus != model.StatusDoing { + for _, cu := range copyUsers { + if userId != 0 && cu.ID == userId { + allStatus = model.StatusNeedViewed + if cu.IsViewed == true { + canViewed = true + allStatus = model.StatusViewed + } + } } } for _, tt := range entity.ApprovalWorkFlows { temp := &approval.WorkFlow{ - ID: tt.ID, - UserID: tt.UserId, - Name: tt.Name, - Level: uint64(tt.Level), - Status: uint64(tt.Status), - Reply: tt.Reply, - OperatedAt: entity.CreatedAt.Format("2006-01-02 15:04:05"), + ID: tt.ID, + UserID: tt.UserId, + Name: tt.Name, + Level: uint64(tt.Level), + Status: uint64(tt.Status), + Reply: tt.Reply, } + + if tt.OperatedAt != nil { + temp.OperatedAt = tt.OperatedAt.Format("2006-01-02 15:04:05") + } + workFlows = append(workFlows, temp) } @@ -44,13 +55,13 @@ func BuildApproval(entity *model.Approval, userId uint64) *approval.CreateReques response := &approval.CreateRequest{ ID: entity.ID, Domain: *entity.Domain, - Status: approval.StatusType(uint64(entity.Status)), + Status: uint64(entity.Status), Type: entity.Type, CopyUsers: copyUsers, SubmitterID: entity.SubmitterID, SubmitterName: entity.SubmitterName, Content: entity.Content, - IsViewed: isViewed, + CanView: canViewed, CanApproval: canApproval, WorkFlows: workFlows, Reply: entity.Reply, @@ -58,6 +69,11 @@ func BuildApproval(entity *model.Approval, userId uint64) *approval.CreateReques Show: show, Exhibition: exhibition, Bundle: bundle, + AllStatus: allStatus, //0-未处理 1-通过 2-拒绝 3-已阅读 4-待阅读 + NowUserId: entity.NowUserId, //0-未处理 1-通过 2-拒绝 3-已阅读 4-待阅读 + NowUserName: entity.NowUserName, //0-未处理 1-通过 2-拒绝 3-已阅读 4-待阅读 + Level: uint64(entity.Level), //0-未处理 1-通过 2-拒绝 3-已阅读 4-待阅读 + NowLevel: uint64(entity.NowLevel), //0-未处理 1-通过 2-拒绝 3-已阅读 4-待阅读 } _ = entity.SetResContent(response) diff --git a/pkg/serializer/approval_type.go b/pkg/serializer/approval_type.go index cd3672d..ec2e129 100644 --- a/pkg/serializer/approval_type.go +++ b/pkg/serializer/approval_type.go @@ -9,10 +9,10 @@ import ( func BuildType(entity *model.ApprovalType) *approval.CreateTypeRequest { response := &approval.CreateTypeRequest{ - ID: entity.ID, - Domain: entity.Domain, - KeyWord: entity.KeyWord, - Title: entity.Title, + ID: entity.ID, + Domain: entity.Domain, + Remark: entity.Remark, + Title: entity.Title, } return response diff --git a/pkg/service/approval.go b/pkg/service/approval.go index eb5c753..aeaab7e 100644 --- a/pkg/service/approval.go +++ b/pkg/service/approval.go @@ -4,6 +4,7 @@ import ( "context" "errors" "github.com/fonchain_enterprise/fonchain-approval/api/approval" + "github.com/fonchain_enterprise/fonchain-approval/pkg/common/page" "github.com/fonchain_enterprise/fonchain-approval/pkg/m" "github.com/fonchain_enterprise/fonchain-approval/pkg/model" "github.com/fonchain_enterprise/fonchain-approval/pkg/serializer" @@ -18,6 +19,10 @@ func (a *ApprovalProvider) Create(ctx context.Context, in *approval.CreateReques response := &approval.ApprovalResponse{} entity, err := model.StoreApproval(in) + if err != nil { + return response, err + } + response.ID = entity.ID response.Success = true @@ -53,6 +58,7 @@ func (a *ApprovalProvider) NowLevelByInfo(ctx context.Context, in *approval.NowL return response, err1 } response.ID = workFlow.ID + response.UserID = workFlow.UserId response.Status = uint64(workFlow.Status) return response, nil @@ -87,37 +93,45 @@ func (a *ApprovalProvider) SetStatus(ctx context.Context, in *approval.StatusReq return response, err } -func (a *ApprovalProvider) Remove(ctx context.Context, in *approval.DetailRequest) (*approval.RemoveResponse, error) { +func (a *ApprovalProvider) Remove(ctx context.Context, in *approval.RemoveRequest) (*approval.RemoveResponse, error) { response := &approval.RemoveResponse{} - err := model.DB.Transaction(func(tx *gorm.DB) error { + for _, ID := range in.IDs { - var err error - var entity *model.Approval + err := model.DB.Transaction(func(tx *gorm.DB) error { - // 确定有数据则执行删除 - if err = model.DB.Where(&model.Approval{Domain: &in.Domain}). - Find(&entity, in.ID).Error; err != nil { - return err + var err error + var entity *model.Approval + + // 确定有数据则执行删除 + if err = model.DB.Where(&model.Approval{Domain: &in.Domain}). + Find(&entity, ID).Error; err != nil { + return err + } + + //删除子关联数据 + if err = entity.DeleteContent(); err != nil { + return err + } + + if err = model.DB.Where(&model.Approval{Domain: &in.Domain}). + Delete(&model.Approval{}, ID).Error; err != nil { + return err + } + + //删除流 + if err = model.DB.Where(&model.ApprovalWorkFlow{ApprovalID: ID}). + Delete(&model.ApprovalWorkFlow{}).Error; err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err } - - //删除子关联数据 - if err = entity.DeleteContent(); err != nil { - return err - } - - if err = model.DB.Where(&model.Approval{Domain: &in.Domain}). - Delete(&model.Approval{}, in.ID).Error; err != nil { - return err - } - - return nil - - }) - - if err != nil { - return nil, err } response.Success = true @@ -140,7 +154,7 @@ func (a *ApprovalProvider) Detail(ctx context.Context, in *approval.DetailReques return response, err } - response = serializer.BuildApproval(entity, 0) + response = serializer.BuildApproval(entity, in.UserId) return response, err } @@ -167,7 +181,7 @@ func (a *ApprovalProvider) Viewed(ctx context.Context, in *approval.ViewedReques } -func (a *ApprovalProvider) List(ctx context.Context, in *approval.ListRequest) (*approval.ListResponse, error) { +func (a *ApprovalProvider) MySubmit(ctx context.Context, in *approval.ListRequest) (*approval.ListResponse, error) { //获取人的 部门角色(1、管理组 2、超级管理 3、Leader角色) response := &approval.ListResponse{} @@ -175,7 +189,22 @@ func (a *ApprovalProvider) List(ctx context.Context, in *approval.ListRequest) ( var list []*model.Approval var count int64 - list, count = model.ApprovalList(in) + list, count = model.MySubmitApprovals(in) + + response.Count = uint64(count) + response.Data = serializer.BuildApprovals(list, in.UserID) + return response, nil +} + +func (a *ApprovalProvider) MyWork(ctx context.Context, in *approval.ListRequest) (*approval.ListResponse, error) { + + //获取人的 部门角色(1、管理组 2、超级管理 3、Leader角色) + response := &approval.ListResponse{} + + var list []*model.Approval + var count int64 + + list, count = model.MyWorkApprovals(in) response.Count = uint64(count) response.Data = serializer.BuildApprovals(list, in.UserID) @@ -244,16 +273,23 @@ func (a *ApprovalProvider) DetailSetting(ctx context.Context, in *approval.Detai func (a *ApprovalProvider) CreateType(ctx context.Context, in *approval.CreateTypeRequest) (*approval.TypeResponse, error) { response := &approval.TypeResponse{} + keyWord := model.KeyWordFromTitle(in.Title) + + if model.DataExist(in.Domain, keyWord) == true { + return response, errors.New(m.ErrorAlreadyExist) + } typeObj := model.ApprovalType{ - KeyWord: in.KeyWord, + KeyWord: keyWord, Title: in.Title, Domain: in.Domain, + Remark: in.Remark, } if err := model.DB.Create(&typeObj).Error; err != nil { return response, err } + response.ID = typeObj.ID response.Domain = typeObj.Domain @@ -281,8 +317,12 @@ func (a *ApprovalProvider) UpdateType(ctx context.Context, in *approval.CreateTy return nil, err } + if typeObj.Title != in.Title && model.IsSystemKeyWork(in.Title) == true { + return response, errors.New(m.ErrorChangeType) + } + typeObj.Title = in.Title - typeObj.KeyWord = in.Title + typeObj.Remark = in.Remark if err := model.DB.Save(&typeObj).Error; err != nil { return nil, err @@ -297,14 +337,20 @@ func (a *ApprovalProvider) AllType(ctx context.Context, in *approval.CommonReque response := &approval.AllTypeResponse{} var list []*model.ApprovalType + var count int64 - if err := model.DB.Where(&model.ApprovalType{Domain: in.Domain}).Find(&list).Error; err != nil { - return nil, err + modelObj := model.DB.Model(&model.ApprovalType{}).Where(&model.ApprovalType{Domain: in.Domain}).Order("id desc") + modelObj.Count(&count) + + if in.Page != 0 && in.PageSize != 0 { + modelObj.Limit(int(in.PageSize)).Offset(page.GetOffset(in.Page, in.PageSize)) } + modelObj.Find(&list) + response.Data = serializer.BuildTypes(list) - response.Count = uint64(len(list)) + response.Count = uint64(count) return response, nil } @@ -320,6 +366,7 @@ func (a *ApprovalProvider) RemoveType(ctx context.Context, in *approval.TypeResp if err := model.DB.Delete(&typeObj, in.ID).Error; err != nil { return nil, err } + response.ID = in.ID response.Domain = in.Domain