瀏覽代碼

修改已读

renjiaojiao 1 年之前
父節點
當前提交
b49c63ecb0

+ 5 - 0
api/internal/handler/routes.go

@@ -12,6 +12,11 @@ import (
 func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 	server.AddRoutes(
 		[]rest.Route{
+			{
+				Method:  http.MethodPost,
+				Path:    "/messageCenter/WorkDeskList",
+				Handler: WorkDeskListHandler(serverCtx),
+			},
 			{
 				Method:  http.MethodPost,
 				Path:    "/messageCenter/BitmapSaveMsg",

+ 17 - 0
api/internal/types/types.go

@@ -102,6 +102,7 @@ type MessageListReq struct {
 	IsMsgList       bool   `json:"isMsgList"`                             //是否需要列表信息
 	IsContainLetter bool   `json:"isContainLetter,optional,default=true"` //是否未读数包含私信
 	IsClassSearch   bool   `json:"isClassSearch,optional"`                // 是否为具体分类查询
+	IsfilterActive  bool   `json:"isfilterActive"`                        //是否过滤活动通知消息
 }
 
 type MessageListResp struct {
@@ -161,3 +162,19 @@ type BitmapSaveMsgReq struct {
 	UserIds     string                 `json:"userIds"`
 	PositionIds string                 `json:"positionIds,optional"` // 职位id 如果是多个就逗号分割 和用户id一一对应
 }
+
+type WorkDeskListReq struct {
+	UserId             string `header:"mgoUserId"`
+	AppId              string `header:"appId"`
+	Offset             int64  `json:"offset"`
+	PageSize           int64  `json:"size"`
+	MsgType            int64  `json:"msgType"`
+	NeedDealtWithCount bool   `json:"needDealtWithCount"`
+}
+
+type WorkDeskListResp struct {
+	Code       int64                    `json:"code"`
+	Message    string                   `json:"message"`
+	BusData    []map[string]interface{} `json:"busData"`
+	NeedDoData []map[string]interface{} `json:"needDoData"`
+}

+ 19 - 0
api/message.api

@@ -106,6 +106,7 @@ type MessageListReq {
 	IsMsgList       bool   `json:"isMsgList"`                             //是否需要列表信息
 	IsContainLetter bool   `json:"isContainLetter,optional,default=true"` //是否未读数包含私信
 	IsClassSearch   bool   `json:"isClassSearch,optional"`                // 是否为具体分类查询
+	IsfilterActive  bool   `json:"isfilterActive"`                        //是否过滤活动通知消息
 }
 
 type MessageListResp {
@@ -174,8 +175,26 @@ type BitmapSaveMsgReq {
 	UserIds     string                 `json:"userIds"`
 	PositionIds string                 `json:"positionIds,optional"` // 职位id 如果是多个就逗号分割 和用户id一一对应
 }
+type WorkDeskListReq {
+	UserId             string `header:"mgoUserId"`
+	AppId              string `header:"appId"`
+	Offset             int64  `json:"offset"`
+	PageSize           int64  `json:"size"`
+	MsgType            int64  `json:"msgType"`
+	NeedDealtWithCount bool   `json:"needDealtWithCount"`
+}
+type WorkDeskListResp {
+	Code       int64                    `json:"code"`
+	Message    string                   `json:"message"`
+	BusData    []map[string]interface{} `json:"busData"`
+	NeedDoData []map[string]interface{} `json:"needDoData"`
+}
 
 service message-api {
+	// 工作桌面商机情报
+	@handler WorkDeskListHandler
+	post /messageCenter/WorkDeskList (WorkDeskListReq) returns (WorkDeskListResp)
+	
 	// 更新用户all_msg bitmap
 	@handler BitmapSaveMsgHandler
 	post /messageCenter/BitmapSaveMsg (BitmapSaveMsgReq) returns (MultipleSaveMsgResp)

+ 98 - 4
rpc/internal/common/msglistService.go

@@ -21,7 +21,7 @@ func BitmapUserMsgList(this *message.UserMsgListReq) (*message.UserMsgList, *mes
 		data          = new(message.UserMsgList)
 	)
 	//取出用户所有消息、已读消息id bitmap 查库
-	userAllMsgArr, _, userUnreadArr, err := GetUserMsgSummary(this.UserId)
+	userAllMsgArr, _, userUnreadArr, err := GetUserMsgSummary(this.UserId, this.IsfilterActive)
 	if len(userAllMsgArr) == 0 && err != nil {
 		fmt.Printf("此用户暂无消息 : %s", err.Error())
 	}
@@ -121,7 +121,7 @@ func BitmapUserMsgList(this *message.UserMsgListReq) (*message.UserMsgList, *mes
 			column.IsClassSearch = true
 			columnData = append(columnData, &column)
 		}
-	} else if this.IsColumn {
+	} else if this.IsColumn || this.IsfilterActive {
 		//获取所有分类未读数 不初始化
 		sortUnread, total := BitmapCountUnread(this.UserId, classUnreadCountMap, false)
 		//fmt.Println("*************", total)
@@ -429,9 +429,14 @@ func FindUserClassMsg(userId string) (map[int]int, map[int][]int) {
 }
 
 // GetUserMsgSummary 从用户消息汇总表取数据
-func GetUserMsgSummary(userId string) (userAllMsg, userReadMsg, userUnreadMsg []uint32, err error) {
+func GetUserMsgSummary(userId string, isfilterActive bool) (userAllMsg, userReadMsg, userUnreadMsg []uint32, err error) {
 	var count uint64
-	sqlc := fmt.Sprintf("SELECT COUNT(*) as count from message_user_summary WHERE userId = '%s'", userId)
+	sqlc := ""
+	if isfilterActive {
+		sqlc = fmt.Sprintf("select a2.group_id,bitmapToArray(bitmapAndnot(a1.unreadMsg,a2.msg_bitmap)) as msgArr from (SELECT bitmapAndnot(mus.allMsg,mus.readMsg) as unreadMsg FROM messageCenter.message_user_summary mus WHERE mus.userId = '%s') a1,(select msg_bitmap,group_id from messageCenter.message_summary ms  where group_id = 1 ) a2", userId)
+	} else {
+		sqlc = fmt.Sprintf("SELECT COUNT(*) as count from message_user_summary WHERE userId = '%s'", userId)
+	}
 	log.Println("GetUserMsgSummary selcet ", sqlc)
 	row1 := entity.ClickhouseConn.QueryRow(context.Background(), sqlc)
 	err = row1.Scan(&count)
@@ -481,6 +486,95 @@ func IntArrSort(arr []int) []int {
 	return resArr
 }
 
+func WorkDeskList(in *message.WorkingDesktopReq) (res1, res2 []*message.Messages, err error) {
+	//待办查询
+	sqlStr := ""
+	needDo := map[int][]uint32{} //msgType对应的消息id
+	if in.NeedDealtWithCount {
+		sqlStr = fmt.Sprintf("  or p_group_id = 11")
+	}
+	sql := fmt.Sprintf(`select a2.group_id,bitmapToArray(bitmapAnd(a1.allMsg,a2.msg_bitmap)) as unreadArr from 
+				(SELECT mus.allMsg as allMsg FROM messageCenter.message_user_summary mus WHERE mus.userId = '%s') a1,
+			(select msg_bitmap,group_id from messageCenter.message_summary ms  where group_id = %d %s) a2`, in.UserId, in.MsgType, sqlStr)
+
+	log.Println("WorkDeskList", sql)
+	rows, err := entity.ClickhouseConn.Query(context.Background(), sql)
+	if err != nil {
+		return nil, nil, err
+	}
+	for rows.Next() {
+		group := UserClassUnread{}
+		err = rows.ScanStruct(&group)
+		if err != nil {
+			log.Println("获取各分类读取分类数据出错:", err)
+			return nil, nil, err
+		}
+		if group.GroupId == int32(in.MsgType) {
+			res1 = GetMsgList(Uint32ArrToIntArr(group.UnreadArr), int(in.PageSize), in.UserId)
+		} else {
+			if len(group.UnreadArr) > 0 {
+				needDo[int(group.GroupId)] = group.UnreadArr
+			}
+		}
+	}
+	if len(needDo) > 0 {
+		totalMsg := append(needDo[11], needDo[12]...)
+		needMsgArr := IntArrSort(Uint32ArrToIntArr(totalMsg))
+		res2 = GetMsgList(needMsgArr, int(in.PageSize), in.UserId)
+	}
+	return res1, res2, nil
+}
+
+func GetMsgList(arr []int, size int, userId string) []*message.Messages {
+	newMsg := []int{}
+	if len(arr) > 0 {
+		if len(arr) >= size {
+			newMsg = arr[len(arr)-size:]
+		} else {
+			newMsg = arr
+		}
+	}
+	resData := []*message.Messages{}
+	for _, v := range newMsg {
+		msg := GetMsgInfo(int(v), userId)
+		links4 := common.InterfaceToStr(msg["link"])
+		link4, androidUrl4, iosUrl4, weChatUrl4 := util.LinkSplit(links4)
+		resData = append(resData, &message.Messages{
+			Id:         common.InterfaceToStr(v),
+			Createtime: common.InterfaceToStr(msg["send_time"]),
+			Title:      common.InterfaceToStr(msg["title"]),
+			MsgType:    int64(util.IntAll(msg["group_id"])),
+			Link:       link4,
+			Content:    common.InterfaceToStr(msg["content"]),
+			MsgLogId:   int64(v),
+			Url: map[string]string{
+				"androidUrl": androidUrl4,
+				"iosUrl":     iosUrl4,
+				"weChatUrl":  weChatUrl4,
+			},
+		})
+	}
+	return resData
+}
+
+func GetMsgInfo(msgId int, userId string) map[string]interface{} {
+	msg := GlobMsgMap[msgId]
+	if msg == nil || len(msg) <= 0 {
+		ms := entity.Mysql.FindOne("message_send_log", map[string]interface{}{"id": msgId}, "id,msg_type,title,content,send_time,link,menu_name,group_id,sign", "")
+		if ms != nil && len(*ms) > 0 {
+			msg = *ms
+		}
+	}
+	if common.IntAll(msg["sign"]) == 4 {
+		//查询用户注册时间
+		rData, _ := entity.MQFW.FindOneByField("user", map[string]interface{}{"_id": m.StringTOBsonId(userId)}, `{"l_registedate":1}`)
+		if rData != nil && len(*rData) > 0 {
+			msg["send_time"] = time.Unix(common.Int64All((*rData)["l_registedate"]), 0).Local().Format("2006-01-02 15:04:05")
+		}
+	}
+	return msg
+}
+
 // PutRedisUserAllMsg 加载用户的所有消息
 /*func PutRedisUserAllMsg(userId string, allMsgBitmap *roaring.Bitmap) (rData []map[string]interface{}) {
 	str := ""

+ 6 - 0
rpc/internal/server/messageserver.go

@@ -22,6 +22,12 @@ func NewMessageServer(svcCtx *svc.ServiceContext) *MessageServer {
 	}
 }
 
+// 工作桌面列表
+func (s *MessageServer) WorkingDesktopList(ctx context.Context, in *message.WorkingDesktopReq) (*message.WorkingDesktopResp, error) {
+	l := logic.NewWorkingDesktopListLogic(ctx, s.svcCtx)
+	return l.WorkingDesktopList(in)
+}
+
 // 发送消息更新一次消息汇总表
 func (s *MessageServer) UpdateMsgSummary(ctx context.Context, in *message.UpdateMsgSummaryReq) (*message.Response, error) {
 	l := logic.NewUpdateMsgSummaryLogic(ctx, s.svcCtx)

+ 234 - 217
rpc/message.proto

@@ -4,106 +4,106 @@ package message;
 option go_package = "message/";
 
 message ChangeReadStatusReq {
-    int64 id = 1; // 消息id
-    int64 readStatus = 2; // 阅读状态 0-未读 1-已读
-    string appid = 3; //应用标识
-    string userId = 4;
+  int64 id = 1; // 消息id
+  int64 readStatus = 2; // 阅读状态 0-未读 1-已读
+  string appid = 3; //应用标识
+  string userId = 4;
 }
 message ResCount {
-    int64 msgType = 1; // 类型及未读数量
-    int64 count = 2; // 类型及未读数量
+  int64 msgType = 1; // 类型及未读数量
+  int64 count = 2; // 类型及未读数量
 }
 
 message Response {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
 }
 
 message FindUserMsgReq {
-    string userId = 1; //用户id
-    string receiveUserId = 2; //聊天方用户id
-    string appid = 3; //应用标识
-    int64 offSet = 4; //当前
-    int64 pageSize = 5; //大小
-    int64 msgType = 6; //是否区分类型
-    int64 read = 7; // 是否区分已读未读 -1 不区分已读未读  0 未读 1 已读
+  string userId = 1; //用户id
+  string receiveUserId = 2; //聊天方用户id
+  string appid = 3; //应用标识
+  int64 offSet = 4; //当前
+  int64 pageSize = 5; //大小
+  int64 msgType = 6; //是否区分类型
+  int64 read = 7; // 是否区分已读未读 -1 不区分已读未读  0 未读 1 已读
 }
 
 message Messages {
-    string receiveUserId = 1; //接收方用户ID
-    string receiveName = 2; //接收方用户名
-    string sendUserId = 3; //发送方用户ID
-    string sendName = 4; //发送方用户名
-    string title = 5; //主题
-    string content = 6; //内容
-    int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
-    string link = 8; //跳转链接
-    int64 citeId = 9; //引用id
-    int64 isRead = 10; //已读未读 0:未读  1:已读
-    string createtime = 11;
-    string appid = 12; //应用标识
-    string id = 13; //消息id
-    int64 msgLogId = 14;
-    map<string, string> url = 15;
+  string receiveUserId = 1; //接收方用户ID
+  string receiveName = 2; //接收方用户名
+  string sendUserId = 3; //发送方用户ID
+  string sendName = 4; //发送方用户名
+  string title = 5; //主题
+  string content = 6; //内容
+  int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
+  string link = 8; //跳转链接
+  int64 citeId = 9; //引用id
+  int64 isRead = 10; //已读未读 0:未读  1:已读
+  string createtime = 11;
+  string appid = 12; //应用标识
+  string id = 13; //消息id
+  int64 msgLogId = 14;
+  map<string, string> url = 15;
 }
 
 message FindUserMsgRes {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
-    repeated Messages data = 3; //
-    int64 count = 4; //总数
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  repeated Messages data = 3; //
+  int64 count = 4; //总数
 }
 
 message GetClassUnreadCountReq {
-    string userId = 1; // 用户id
-    int64 msgType = 2; //分类 1:客服   2:系统通知  3:营销   4:用户会话
-    string appid = 3; //应用标识
+  string userId = 1; // 用户id
+  int64 msgType = 2; //分类 1:客服   2:系统通知  3:营销   4:用户会话
+  string appid = 3; //应用标识
 }
 
 //查看消息内容
 message MessageDetailReq {
-    int64 id = 1; //消息id
-    int64 msgLogId = 2;
-    string userId = 3;
+  int64 id = 1; //消息id
+  int64 msgLogId = 2;
+  string userId = 3;
 }
 message MessageDetailResp {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
-    Messages data = 3; //
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  Messages data = 3; //
 }
 message GetLastMessageReq {
-    string userId = 1; // 用户id
-    int64 msgType = 2; //分类 1:客服   2:系统通知  3:营销   4:用户会话
-    string appid = 3; //应用标识
-    int64 isRead = 4; // 0:未读  1:已读  -1 不区分
+  string userId = 1; // 用户id
+  int64 msgType = 2; //分类 1:客服   2:系统通知  3:营销   4:用户会话
+  string appid = 3; //应用标识
+  int64 isRead = 4; // 0:未读  1:已读  -1 不区分
 }
 message GetLastMessageRes {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
-    Messages data = 3; //
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  Messages data = 3; //
 }
 // 获取用户分类的的未读消息分类及数量 及分类下最新的消息
 message GetUnreadClassCountReq {
-    string userId = 1; // 用户id
-    string appid = 2; //应用标识
-    bool needMsg = 3; //是否需要分类下的最新一条消息
+  string userId = 1; // 用户id
+  string appid = 2; //应用标识
+  bool needMsg = 3; //是否需要分类下的最新一条消息
 }
 message GetUnreadClassCountRes {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
-    repeated ResCount data = 3; //
-    repeated Messages info = 4; // 每个类型最新消息列表
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  repeated ResCount data = 3; //
+  repeated Messages info = 4; // 每个类型最新消息列表
 }
 /*message GetMsgTypeReq {
     string userId = 1; // 用户id
     string appid = 2; //应用标识
 }*/
 message MsgTypes{
-    int64 msgType =1;
-    string img = 2;
-    string name =3;
-    string code = 4;
-    string displayPlatform = 5;
+  int64 msgType = 1;
+  string img = 2;
+  string name = 3;
+  string code = 4;
+  string displayPlatform = 5;
 }
 /*message GetMsgTypeRes {
     int64 code = 1; //状态码
@@ -112,123 +112,123 @@ message MsgTypes{
 }*/
 
 message user {
-    string userId = 1;
-    string userName = 2;
+  string userId = 1;
+  string userName = 2;
 }
 
 message multipleSaveMsgReq {
-    string userIds = 1;
-    string sendUserId = 3; //发送方用户ID
-    string title = 5; //主题
-    string content = 6; //内容
-    int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
-    string link = 8; //跳转链接
-    string appid = 10; //应用标识
-    int64 msgLogId = 11;//消息记录表id
-    string positionIds = 14;// 职位id  逗号分割
-    string row4 = 15;
-    string productName = 16;
-    string orderId = 17;
-    string orderMoney = 18;
-    string identity = 19;
-    string appPushUrl = 20;
-    string wxPushUrl = 21;
-    string iosPushUrl = 22;
-    string baseUserIds = 23;
- }
+  string userIds = 1;
+  string sendUserId = 3; //发送方用户ID
+  string title = 5; //主题
+  string content = 6; //内容
+  int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
+  string link = 8; //跳转链接
+  string appid = 10; //应用标识
+  int64 msgLogId = 11;//消息记录表id
+  string positionIds = 14;// 职位id  逗号分割
+  string row4 = 15;
+  string productName = 16;
+  string orderId = 17;
+  string orderMoney = 18;
+  string identity = 19;
+  string appPushUrl = 20;
+  string wxPushUrl = 21;
+  string iosPushUrl = 22;
+  string baseUserIds = 23;
+}
 
 message CustomWxTpl {
-	string TplId = 1;
-	map<string, TmplItem> tmplData = 2;
+  string TplId = 1;
+  map<string, TmplItem> tmplData = 2;
 }
 
 message TmplItem {
-	string value = 1;
-	string color = 2;
+  string value = 1;
+  string color = 2;
 }
 
 message multipleSaveMsgResp {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
-    int64 errCount = 3; // 保存出错数量
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  int64 errCount = 3; // 保存出错数量
 }
 
 message FindUserBuoyMsgReq {
-    string userId = 1; //用户id
-    string appid = 2; //应用标识
-    int64 pageSize = 3; //大小
+  string userId = 1; //用户id
+  string appid = 2; //应用标识
+  int64 pageSize = 3; //大小
 }
 message FindUserBuoyMsgRes {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
-    repeated BuoyMessages data = 3; //
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  repeated BuoyMessages data = 3; //
 }
 message BuoyMessages {
-    string id = 1; //消息id
-    string buoy_detail = 2; //浮标内容
-    string pcUrl   =3;
-    string androidUrl = 4;
-    string iosUrl = 5;
-    string weChatUrl =6;
+  string id = 1; //消息id
+  string buoy_detail = 2; //浮标内容
+  string pcUrl = 3;
+  string androidUrl = 4;
+  string iosUrl = 5;
+  string weChatUrl = 6;
 
 }
 
 message ClearUnreadMsgReq {
-    string userid = 1; //mgoId
-    int64  entId = 2;
-    int64 positionId = 3; //职位id
-    string appId = 4;
-    int64 NewUserId   =5;//私信相关
+  string userid = 1; //mgoId
+  int64  entId = 2;
+  int64 positionId = 3; //职位id
+  string appId = 4;
+  int64 NewUserId = 5;//私信相关
 }
 
 message UserMsgListReq {
-    string userId = 1; //用户id
-    string appid = 3; //应用标识
-    int64 offSet = 4; //当前
-    int64 pageSize = 5; //大小
-    int64 msgType = 6; //是否区分类型
-    int64 read = 7; // 是否区分已读未读 -1 不区分已读未读  0 未读 1 已读
-    int64 SortSize = 8; //分类 每类数
-    bool isColumn   =9;    //是否需要获取栏目
-    bool isColumnNewMsg = 10; //是否需各栏目获取最新消息
-    bool isMsgList =11;  //是否需要列表信息
-    int64 NewUserId   =12;//私信相关
-    int64 PositionId  =13;//私信相关
-    bool isContainLetter  =14;//是否包含私信未读数
-    bool isClassSearch  =15;// 是否是消息细化分类查询
-
+  string userId = 1; //用户id
+  string appid = 3; //应用标识
+  int64 offSet = 4; //当前
+  int64 pageSize = 5; //大小
+  int64 msgType = 6; //是否区分类型
+  int64 read = 7; // 是否区分已读未读 -1 不区分已读未读  0 未读 1 已读
+  int64 SortSize = 8; //分类 每类数
+  bool isColumn = 9;    //是否需要获取栏目
+  bool isColumnNewMsg = 10; //是否需各栏目获取最新消息
+  bool isMsgList = 11;  //是否需要列表信息
+  int64 NewUserId = 12;//私信相关
+  int64 PositionId = 13;//私信相关
+  bool isContainLetter = 14;//是否包含私信未读数
+  bool isClassSearch = 15;// 是否是消息细化分类查询
+  bool isfilterActive = 16; //是否过滤
 }
 
 message UserMsgListRes {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
-    repeated Messages list = 3; //
-    Messages last = 4; //
-    repeated AllSortData column = 5; //
-    int64 count = 6; //总数
-    int64 unread = 7; //未读总数
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  repeated Messages list = 3; //
+  Messages last = 4; //
+  repeated AllSortData column = 5; //
+  int64 count = 6; //总数
+  int64 unread = 7; //未读总数
 }
 
 message UserMsgList {
-    repeated Messages data = 1; //
-    repeated AllSortData sortData = 2; //
-    int64 count = 3; //总数
-    int64 unread = 4; //未读总数
+  repeated Messages data = 1; //
+  repeated AllSortData sortData = 2; //
+  int64 count = 3; //总数
+  int64 unread = 4; //未读总数
 }
 
 message AllSortData {
-    int64 unreadMessages =1 ;
-   string name =2;
-   string img = 3;
-   int64 msgType = 4; //是否区分类型;
-   repeated Messages data = 5; //
-    bool isClassSearch  =6;// 是否是消息细化分类查询
+  int64 unreadMessages = 1 ;
+  string name = 2;
+  string img = 3;
+  int64 msgType = 4; //是否区分类型;
+  repeated Messages data = 5; //
+  bool isClassSearch = 6;// 是否是消息细化分类查询
 }
 
 
 message WxTmplResponse {
-    int64 sendTotal = 1; //发送数量
-    string message = 2; //信息
+  int64 sendTotal = 1; //发送数量
+  string message = 2; //信息
 }
 
 /*message UserUnreadMsgListReq {
@@ -250,11 +250,11 @@ message WxTmplResponse {
 message WxTmplMsgRequest {
   string userIds = 1;      //接受人 mongo_userId(多个用,分割)
   string positionIds = 2;  //接受人 职位id(多个用,分割)
-  int64 msgType =3;  //数据库中switch字段
+  int64 msgType = 3;  //数据库中switch字段
   string title = 4;        //课程名称
   string detail = 5;       //课程时间
   string date = 6;         //课程地点
-  string row4 =7;
+  string row4 = 7;
   string url = 8;          //消息跳转连接
 }
 
@@ -263,90 +263,107 @@ message SendMsgResponse {
   string message = 2; //响应消息
 }
 message MsgOpenLogReq{
-    int64 msgLogId =1;
-    int64 platform =2;
-    string userId = 3;
-    string appId = 4;
+  int64 msgLogId = 1;
+  int64 platform = 2;
+  string userId = 3;
+  string appId = 4;
 }
 
 //新用户消息调用接口
 message NewUserInsertMsgReq{
-    string userIds = 1;
-    string title = 5; //主题
-    string content = 6; //内容
-    int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
-    string link = 8; //跳转链接
-    string appid = 10; //应用标识
-    int64 msgLogId = 11;//消息记录表id
-    string positionIds = 14;// 职位id  逗号分割
-    string row4 = 15;
-    string productName = 16;
-    string orderId = 17;
-    string orderMoney = 18;
-    string identity = 19;
-    string appPushUrl = 20;
-    string wxPushUrl = 21;
-    string iosPushUrl = 22;
+  string userIds = 1;
+  string title = 5; //主题
+  string content = 6; //内容
+  int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
+  string link = 8; //跳转链接
+  string appid = 10; //应用标识
+  int64 msgLogId = 11;//消息记录表id
+  string positionIds = 14;// 职位id  逗号分割
+  string row4 = 15;
+  string productName = 16;
+  string orderId = 17;
+  string orderMoney = 18;
+  string identity = 19;
+  string appPushUrl = 20;
+  string wxPushUrl = 21;
+  string iosPushUrl = 22;
 }
 message UpdateMsgSummaryReq{
-    int64 msgLogId = 1;
-    int64 groupId = 2;
-    int64 msgType = 3;
+  int64 msgLogId = 1;
+  int64 groupId = 2;
+  int64 msgType = 3;
 }
 message BitmapSaveMsgReq{
-    string userIds = 1;
-    string title = 5; //主题
-    string content = 6; //内容
-    int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
-    string link = 8; //跳转链接
-    string appid = 10; //应用标识
-    int64 msgLogId = 11;//消息记录表id
-    string positionIds = 14;// 职位id  逗号分割
-    string row4 = 15;
-    string productName = 16;
-    string orderId = 17;
-    string orderMoney = 18;
-    string identity = 19;
-    string appPushUrl = 20;
-    string wxPushUrl = 21;
-    string iosPushUrl = 22;
-    string baseUserIds = 23;
-    string sendUserId = 24;
+  string userIds = 1;
+  string title = 5; //主题
+  string content = 6; //内容
+  int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
+  string link = 8; //跳转链接
+  string appid = 10; //应用标识
+  int64 msgLogId = 11;//消息记录表id
+  string positionIds = 14;// 职位id  逗号分割
+  string row4 = 15;
+  string productName = 16;
+  string orderId = 17;
+  string orderMoney = 18;
+  string identity = 19;
+  string appPushUrl = 20;
+  string wxPushUrl = 21;
+  string iosPushUrl = 22;
+  string baseUserIds = 23;
+  string sendUserId = 24;
+}
+
+message WorkingDesktopReq{
+  string userId = 1; //用户id
+  string appid = 3; //应用标识
+  int64 offSet = 4; //当前
+  int64 pageSize = 5; //大小
+  int64 msgType = 6;
+  bool needDealtWithCount = 7;
+}
+message WorkingDesktopResp{
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  repeated Messages busMsgList = 3;
+  repeated Messages needDo = 4;
 }
 
 service Message {
-    //发送消息更新一次消息汇总表
-    rpc UpdateMsgSummary (UpdateMsgSummaryReq) returns (Response);
-    //新用户发送消息
-    rpc NewUserMsg (NewUserInsertMsgReq) returns (Response);
-    //bitmap保存消息
-    rpc bitmapSaveMsg (multipleSaveMsgReq) returns (multipleSaveMsgResp);
-    //批量保存消息
-    rpc multipleSaveMsg (multipleSaveMsgReq) returns (multipleSaveMsgResp);
-    // 修改消息阅读状态
-    rpc ChangeReadStatus (ChangeReadStatusReq) returns (Response);
-    //  查询指定用户的历史消息记录
-    rpc FindUserMsg (FindUserMsgReq) returns (FindUserMsgRes);
-    //查看详细详情
-    rpc FindMessageDetail (MessageDetailReq) returns (MessageDetailResp);
-    //  消息的分类
-//    rpc GetMsgType (GetMsgTypeReq) returns (GetMsgTypeRes);
-    //  查询指定用户的浮标消息
-    rpc FindUserBuoyMsg (FindUserBuoyMsgReq) returns (FindUserBuoyMsgRes);
-
-    //   一键清空未读消息
-    rpc ClearUnreadMsg (ClearUnreadMsgReq) returns (Response);
-
-    //   new用户消息列表
-    rpc UserMsgList (UserMsgListReq) returns (UserMsgListRes);
-    //  发送剑鱼微信模版消息
-    rpc SendWxTmplMsg (WxTmplMsgRequest) returns(SendMsgResponse);
-    //   官网、移动端首页、工作桌面消息滚动
-//    rpc UserUnreadMsgList (UserUnreadMsgListReq) returns (UserUnreadMsgListRes);
-    // 点击消息-存查看记录
-    rpc MsgOpenLog (MsgOpenLogReq) returns (Response);
-
-    //  发送剑鱼微信模版消息
-    rpc AppLetterPush (WxTmplMsgRequest) returns(SendMsgResponse);
+  //工作桌面列表
+  rpc WorkingDesktopList (WorkingDesktopReq) returns (WorkingDesktopResp);
+  //发送消息更新一次消息汇总表
+  rpc UpdateMsgSummary (UpdateMsgSummaryReq) returns (Response);
+  //新用户发送消息
+  rpc NewUserMsg (NewUserInsertMsgReq) returns (Response);
+  //bitmap保存消息
+  rpc bitmapSaveMsg (multipleSaveMsgReq) returns (multipleSaveMsgResp);
+  //批量保存消息
+  rpc multipleSaveMsg (multipleSaveMsgReq) returns (multipleSaveMsgResp);
+  // 修改消息阅读状态
+  rpc ChangeReadStatus (ChangeReadStatusReq) returns (Response);
+  //  查询指定用户的历史消息记录
+  rpc FindUserMsg (FindUserMsgReq) returns (FindUserMsgRes);
+  //查看详细详情
+  rpc FindMessageDetail (MessageDetailReq) returns (MessageDetailResp);
+  //  消息的分类
+  //    rpc GetMsgType (GetMsgTypeReq) returns (GetMsgTypeRes);
+  //  查询指定用户的浮标消息
+  rpc FindUserBuoyMsg (FindUserBuoyMsgReq) returns (FindUserBuoyMsgRes);
+
+  //   一键清空未读消息
+  rpc ClearUnreadMsg (ClearUnreadMsgReq) returns (Response);
+
+  //   new用户消息列表
+  rpc UserMsgList (UserMsgListReq) returns (UserMsgListRes);
+  //  发送剑鱼微信模版消息
+  rpc SendWxTmplMsg (WxTmplMsgRequest) returns(SendMsgResponse);
+  //   官网、移动端首页、工作桌面消息滚动
+  //    rpc UserUnreadMsgList (UserUnreadMsgListReq) returns (UserUnreadMsgListRes);
+  // 点击消息-存查看记录
+  rpc MsgOpenLog (MsgOpenLogReq) returns (Response);
+
+  //  发送剑鱼微信模版消息
+  rpc AppLetterPush (WxTmplMsgRequest) returns(SendMsgResponse);
 
 }

+ 10 - 0
rpc/messageclient/message.go

@@ -45,10 +45,14 @@ type (
 	UserMsgList            = message.UserMsgList
 	UserMsgListReq         = message.UserMsgListReq
 	UserMsgListRes         = message.UserMsgListRes
+	WorkingDesktopReq      = message.WorkingDesktopReq
+	WorkingDesktopResp     = message.WorkingDesktopResp
 	WxTmplMsgRequest       = message.WxTmplMsgRequest
 	WxTmplResponse         = message.WxTmplResponse
 
 	Message interface {
+		// 工作桌面列表
+		WorkingDesktopList(ctx context.Context, in *WorkingDesktopReq, opts ...grpc.CallOption) (*WorkingDesktopResp, error)
 		// 发送消息更新一次消息汇总表
 		UpdateMsgSummary(ctx context.Context, in *UpdateMsgSummaryReq, opts ...grpc.CallOption) (*Response, error)
 		// 新用户发送消息
@@ -88,6 +92,12 @@ func NewMessage(cli zrpc.Client) Message {
 	}
 }
 
+// 工作桌面列表
+func (m *defaultMessage) WorkingDesktopList(ctx context.Context, in *WorkingDesktopReq, opts ...grpc.CallOption) (*WorkingDesktopResp, error) {
+	client := message.NewMessageClient(m.cli.Conn())
+	return client.WorkingDesktopList(ctx, in, opts...)
+}
+
 // 发送消息更新一次消息汇总表
 func (m *defaultMessage) UpdateMsgSummary(ctx context.Context, in *UpdateMsgSummaryReq, opts ...grpc.CallOption) (*Response, error) {
 	client := message.NewMessageClient(m.cli.Conn())

+ 458 - 232
rpc/type/message/message.pb.go

@@ -1790,6 +1790,7 @@ type UserMsgListReq struct {
 	PositionId      int64  `protobuf:"varint,13,opt,name=PositionId,proto3" json:"PositionId,omitempty"`           //私信相关
 	IsContainLetter bool   `protobuf:"varint,14,opt,name=isContainLetter,proto3" json:"isContainLetter,omitempty"` //是否包含私信未读数
 	IsClassSearch   bool   `protobuf:"varint,15,opt,name=isClassSearch,proto3" json:"isClassSearch,omitempty"`     // 是否是消息细化分类查询
+	IsfilterActive  bool   `protobuf:"varint,16,opt,name=isfilterActive,proto3" json:"isfilterActive,omitempty"`   //是否过滤
 }
 
 func (x *UserMsgListReq) Reset() {
@@ -1922,6 +1923,13 @@ func (x *UserMsgListReq) GetIsClassSearch() bool {
 	return false
 }
 
+func (x *UserMsgListReq) GetIsfilterActive() bool {
+	if x != nil {
+		return x.IsfilterActive
+	}
+	return false
+}
+
 type UserMsgListRes struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2874,6 +2882,164 @@ func (x *BitmapSaveMsgReq) GetSendUserId() string {
 	return ""
 }
 
+type WorkingDesktopReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	UserId             string `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"`      //用户id
+	Appid              string `protobuf:"bytes,3,opt,name=appid,proto3" json:"appid,omitempty"`        //应用标识
+	OffSet             int64  `protobuf:"varint,4,opt,name=offSet,proto3" json:"offSet,omitempty"`     //当前
+	PageSize           int64  `protobuf:"varint,5,opt,name=pageSize,proto3" json:"pageSize,omitempty"` //大小
+	MsgType            int64  `protobuf:"varint,6,opt,name=msgType,proto3" json:"msgType,omitempty"`
+	NeedDealtWithCount bool   `protobuf:"varint,7,opt,name=needDealtWithCount,proto3" json:"needDealtWithCount,omitempty"`
+}
+
+func (x *WorkingDesktopReq) Reset() {
+	*x = WorkingDesktopReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_message_proto_msgTypes[34]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *WorkingDesktopReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WorkingDesktopReq) ProtoMessage() {}
+
+func (x *WorkingDesktopReq) ProtoReflect() protoreflect.Message {
+	mi := &file_message_proto_msgTypes[34]
+	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 WorkingDesktopReq.ProtoReflect.Descriptor instead.
+func (*WorkingDesktopReq) Descriptor() ([]byte, []int) {
+	return file_message_proto_rawDescGZIP(), []int{34}
+}
+
+func (x *WorkingDesktopReq) GetUserId() string {
+	if x != nil {
+		return x.UserId
+	}
+	return ""
+}
+
+func (x *WorkingDesktopReq) GetAppid() string {
+	if x != nil {
+		return x.Appid
+	}
+	return ""
+}
+
+func (x *WorkingDesktopReq) GetOffSet() int64 {
+	if x != nil {
+		return x.OffSet
+	}
+	return 0
+}
+
+func (x *WorkingDesktopReq) GetPageSize() int64 {
+	if x != nil {
+		return x.PageSize
+	}
+	return 0
+}
+
+func (x *WorkingDesktopReq) GetMsgType() int64 {
+	if x != nil {
+		return x.MsgType
+	}
+	return 0
+}
+
+func (x *WorkingDesktopReq) GetNeedDealtWithCount() bool {
+	if x != nil {
+		return x.NeedDealtWithCount
+	}
+	return false
+}
+
+type WorkingDesktopResp struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Code       int64       `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`      //状态码
+	Message    string      `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` //响应消息
+	BusMsgList []*Messages `protobuf:"bytes,3,rep,name=busMsgList,proto3" json:"busMsgList,omitempty"`
+	NeedDo     []*Messages `protobuf:"bytes,4,rep,name=needDo,proto3" json:"needDo,omitempty"`
+}
+
+func (x *WorkingDesktopResp) Reset() {
+	*x = WorkingDesktopResp{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_message_proto_msgTypes[35]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *WorkingDesktopResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WorkingDesktopResp) ProtoMessage() {}
+
+func (x *WorkingDesktopResp) ProtoReflect() protoreflect.Message {
+	mi := &file_message_proto_msgTypes[35]
+	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 WorkingDesktopResp.ProtoReflect.Descriptor instead.
+func (*WorkingDesktopResp) Descriptor() ([]byte, []int) {
+	return file_message_proto_rawDescGZIP(), []int{35}
+}
+
+func (x *WorkingDesktopResp) GetCode() int64 {
+	if x != nil {
+		return x.Code
+	}
+	return 0
+}
+
+func (x *WorkingDesktopResp) GetMessage() string {
+	if x != nil {
+		return x.Message
+	}
+	return ""
+}
+
+func (x *WorkingDesktopResp) GetBusMsgList() []*Messages {
+	if x != nil {
+		return x.BusMsgList
+	}
+	return nil
+}
+
+func (x *WorkingDesktopResp) GetNeedDo() []*Messages {
+	if x != nil {
+		return x.NeedDo
+	}
+	return nil
+}
+
 var File_message_proto protoreflect.FileDescriptor
 
 var file_message_proto_rawDesc = []byte{
@@ -3091,7 +3257,7 @@ var file_message_proto_rawDesc = []byte{
 	0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28,
 	0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x65, 0x77, 0x55,
 	0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x4e, 0x65, 0x77,
-	0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xac, 0x03, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x4d,
+	0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xd4, 0x03, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x4d,
 	0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65,
 	0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49,
 	0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
@@ -3118,199 +3284,229 @@ var file_message_proto_rawDesc = []byte{
 	0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x4c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x12,
 	0x24, 0x0a, 0x0d, 0x69, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,
 	0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53,
-	0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0xe8, 0x01, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73,
-	0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07,
-	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d,
-	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x03,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d,
-	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x25, 0x0a,
-	0x04, 0x6c, 0x61, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x65,
-	0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x04,
-	0x6c, 0x61, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x05,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x41,
-	0x6c, 0x6c, 0x53, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75,
-	0x6d, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28,
-	0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x6e, 0x72, 0x65,
-	0x61, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64,
-	0x22, 0x94, 0x01, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74,
-	0x12, 0x25, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11,
-	0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
-	0x73, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x08, 0x73, 0x6f, 0x72, 0x74, 0x44,
-	0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x73, 0x73,
-	0x61, 0x67, 0x65, 0x2e, 0x41, 0x6c, 0x6c, 0x53, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52,
-	0x08, 0x73, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75,
-	0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12,
-	0x16, 0x0a, 0x06, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52,
-	0x06, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x22, 0xc2, 0x01, 0x0a, 0x0b, 0x41, 0x6c, 0x6c, 0x53,
-	0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x75, 0x6e, 0x72, 0x65, 0x61,
-	0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
-	0x0e, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12,
-	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
-	0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x6d, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x03, 0x69, 0x6d, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65,
-	0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12,
-	0x25, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e,
-	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73,
-	0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x73, 0x43, 0x6c, 0x61, 0x73,
-	0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69,
-	0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x48, 0x0a, 0x0e,
-	0x57, 0x78, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c,
-	0x0a, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x03, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07,
-	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d,
-	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xd0, 0x01, 0x0a, 0x10, 0x57, 0x78, 0x54, 0x6d, 0x70,
-	0x6c, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x75,
-	0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73,
-	0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
-	0x6e, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x73, 0x69,
-	0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79,
-	0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70,
-	0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69,
-	0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12,
-	0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64,
-	0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x34, 0x18, 0x07, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x34, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x08,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x41, 0x0a, 0x0f, 0x53, 0x65, 0x6e,
-	0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05,
-	0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74,
-	0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x75, 0x0a, 0x0d,
-	0x4d, 0x73, 0x67, 0x4f, 0x70, 0x65, 0x6e, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a,
-	0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
-	0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61,
-	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x6c, 0x61,
-	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a,
-	0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70,
-	0x70, 0x49, 0x64, 0x22, 0xcb, 0x03, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x49,
-	0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x75,
-	0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73,
-	0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x05,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63,
-	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65,
-	0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12,
-	0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c,
-	0x69, 0x6e, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x73, 0x67,
-	0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x73, 0x67,
-	0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
-	0x6e, 0x49, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x73, 0x69,
-	0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x34, 0x18,
-	0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x34, 0x12, 0x20, 0x0a, 0x0b, 0x70,
-	0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a,
-	0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72,
-	0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x72, 0x64,
-	0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74,
-	0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74,
-	0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72,
-	0x6c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x50, 0x75, 0x73, 0x68,
-	0x55, 0x72, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x77, 0x78, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c,
-	0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x77, 0x78, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72,
-	0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6f, 0x73, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x18,
-	0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6f, 0x73, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72,
-	0x6c, 0x22, 0x65, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x53, 0x75,
-	0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x73, 0x67, 0x4c,
-	0x6f, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x73, 0x67, 0x4c,
-	0x6f, 0x67, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x18,
-	0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52,
-	0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x22, 0x8a, 0x04, 0x0a, 0x10, 0x42, 0x69, 0x74,
-	0x6d, 0x61, 0x70, 0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a,
-	0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65,
-	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a,
-	0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79,
-	0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70,
-	0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x18, 0x0a,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6d,
-	0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d,
-	0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74,
-	0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f,
-	0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77,
-	0x34, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x34, 0x12, 0x20, 0x0a,
-	0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12,
-	0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x72, 0x64,
-	0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f,
-	0x72, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65,
-	0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x64, 0x65,
-	0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x50, 0x75, 0x73, 0x68,
-	0x55, 0x72, 0x6c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x50, 0x75,
-	0x73, 0x68, 0x55, 0x72, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x77, 0x78, 0x50, 0x75, 0x73, 0x68, 0x55,
-	0x72, 0x6c, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x77, 0x78, 0x50, 0x75, 0x73, 0x68,
-	0x55, 0x72, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6f, 0x73, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72,
-	0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6f, 0x73, 0x50, 0x75, 0x73, 0x68,
-	0x55, 0x72, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49,
-	0x64, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73,
-	0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x55, 0x73, 0x65,
-	0x72, 0x49, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x55,
-	0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0x8d, 0x07, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
-	0x65, 0x12, 0x43, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x53, 0x75,
-	0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e,
-	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79,
-	0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x4e, 0x65, 0x77, 0x55, 0x73, 0x65,
-	0x72, 0x4d, 0x73, 0x67, 0x12, 0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4e,
-	0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x73, 0x67, 0x52,
-	0x65, 0x71, 0x1a, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0d, 0x62, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x53,
-	0x61, 0x76, 0x65, 0x4d, 0x73, 0x67, 0x12, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
-	0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67,
-	0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x75,
-	0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73,
-	0x70, 0x12, 0x4c, 0x0a, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x53, 0x61, 0x76,
-	0x65, 0x4d, 0x73, 0x67, 0x12, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x6d,
-	0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65,
-	0x71, 0x1a, 0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x75, 0x6c, 0x74,
-	0x69, 0x70, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12,
-	0x43, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x53, 0x74, 0x61,
-	0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x68,
-	0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65,
-	0x71, 0x1a, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72,
-	0x4d, 0x73, 0x67, 0x12, 0x17, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x46, 0x69,
-	0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x6d,
-	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4d,
-	0x73, 0x67, 0x52, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x11, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x73,
-	0x73, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x2e, 0x6d, 0x65, 0x73,
-	0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61,
-	0x69, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e,
-	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73,
-	0x70, 0x12, 0x4b, 0x0a, 0x0f, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x42, 0x75, 0x6f,
-	0x79, 0x4d, 0x73, 0x67, 0x12, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x46,
-	0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x42, 0x75, 0x6f, 0x79, 0x4d, 0x73, 0x67, 0x52, 0x65,
-	0x71, 0x1a, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x64,
-	0x55, 0x73, 0x65, 0x72, 0x42, 0x75, 0x6f, 0x79, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x12, 0x3f,
-	0x0a, 0x0e, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x55, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x73, 0x67,
-	0x12, 0x1a, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x72,
-	0x55, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x6d,
-	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
-	0x3f, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x17,
-	0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67,
-	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
-	0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73,
-	0x12, 0x44, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x78, 0x54, 0x6d, 0x70, 0x6c, 0x4d, 0x73,
-	0x67, 0x12, 0x19, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x57, 0x78, 0x54, 0x6d,
-	0x70, 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6d,
-	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x4d, 0x73, 0x67, 0x4f, 0x70, 0x65,
-	0x6e, 0x4c, 0x6f, 0x67, 0x12, 0x16, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d,
-	0x73, 0x67, 0x4f, 0x70, 0x65, 0x6e, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x6d,
-	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
-	0x44, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x4c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x50, 0x75, 0x73, 0x68,
-	0x12, 0x19, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x57, 0x78, 0x54, 0x6d, 0x70,
-	0x6c, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6d, 0x65,
-	0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0a, 0x5a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
-	0x2f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x73, 0x66, 0x69, 0x6c, 0x74, 0x65,
+	0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69,
+	0x73, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0xe8, 0x01,
+	0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73,
+	0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04,
+	0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x25,
+	0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52,
+	0x04, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x06,
+	0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x41, 0x6c, 0x6c, 0x53, 0x6f, 0x72, 0x74, 0x44, 0x61,
+	0x74, 0x61, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f,
+	0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x12, 0x16, 0x0a, 0x06, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x06, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x22, 0x94, 0x01, 0x0a, 0x0b, 0x55, 0x73, 0x65,
+	0x72, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12,
+	0x30, 0x0a, 0x08, 0x73, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x41, 0x6c, 0x6c, 0x53,
+	0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x73, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74,
+	0x61, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x6e, 0x72, 0x65, 0x61,
+	0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x22,
+	0xc2, 0x01, 0x0a, 0x0b, 0x41, 0x6c, 0x6c, 0x53, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12,
+	0x26, 0x0a, 0x0e, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x69,
+	0x6d, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x69, 0x6d, 0x67, 0x12, 0x18, 0x0a,
+	0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07,
+	0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18,
+	0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e,
+	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24,
+	0x0a, 0x0d, 0x69, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x65,
+	0x61, 0x72, 0x63, 0x68, 0x22, 0x48, 0x0a, 0x0e, 0x57, 0x78, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x54, 0x6f,
+	0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x54,
+	0x6f, 0x74, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xd0,
+	0x01, 0x0a, 0x10, 0x57, 0x78, 0x54, 0x6d, 0x70, 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x20, 0x0a,
+	0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12,
+	0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74,
+	0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12,
+	0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72,
+	0x6f, 0x77, 0x34, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x34, 0x12,
+	0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72,
+	0x6c, 0x22, 0x41, 0x0a, 0x0f, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x22, 0x75, 0x0a, 0x0d, 0x4d, 0x73, 0x67, 0x4f, 0x70, 0x65, 0x6e, 0x4c,
+	0x6f, 0x67, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49,
+	0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x16, 0x0a,
+	0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75,
+	0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0xcb, 0x03, 0x0a, 0x13,
+	0x4e, 0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x73, 0x67,
+	0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x14, 0x0a,
+	0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69,
+	0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x06,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a,
+	0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07,
+	0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18,
+	0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x61,
+	0x70, 0x70, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x69,
+	0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x0b, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x20, 0x0a,
+	0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12,
+	0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x34, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72,
+	0x6f, 0x77, 0x34, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61,
+	0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,
+	0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64,
+	0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12,
+	0x1e, 0x0a, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x18, 0x12, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x12,
+	0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x61,
+	0x70, 0x70, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0a, 0x61, 0x70, 0x70, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x77,
+	0x78, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+	0x77, 0x78, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6f, 0x73,
+	0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69,
+	0x6f, 0x73, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x22, 0x65, 0x0a, 0x13, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71,
+	0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07,
+	0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67,
+	0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70,
+	0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65,
+	0x22, 0x8a, 0x04, 0x0a, 0x10, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x53, 0x61, 0x76, 0x65, 0x4d,
+	0x73, 0x67, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12,
+	0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12,
+	0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e,
+	0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x14, 0x0a,
+	0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70,
+	0x70, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18,
+	0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12,
+	0x20, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x0e,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64,
+	0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x34, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x72, 0x6f, 0x77, 0x34, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
+	0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64,
+	0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72,
+	0x49, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49,
+	0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x18,
+	0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x65,
+	0x79, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x13, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a,
+	0x0a, 0x61, 0x70, 0x70, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x18, 0x14, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x12, 0x1c, 0x0a,
+	0x09, 0x77, 0x78, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x09, 0x77, 0x78, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x69,
+	0x6f, 0x73, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0a, 0x69, 0x6f, 0x73, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x62,
+	0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1e, 0x0a,
+	0x0a, 0x73, 0x65, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xbf, 0x01,
+	0x0a, 0x11, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70,
+	0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61,
+	0x70, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x69,
+	0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x53, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x53, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67,
+	0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x67,
+	0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12,
+	0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x65, 0x64, 0x44, 0x65, 0x61, 0x6c, 0x74, 0x57, 0x69, 0x74, 0x68,
+	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x6e, 0x65, 0x65,
+	0x64, 0x44, 0x65, 0x61, 0x6c, 0x74, 0x57, 0x69, 0x74, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22,
+	0xa0, 0x01, 0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x73, 0x6b, 0x74,
+	0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x0a, 0x62, 0x75, 0x73, 0x4d, 0x73, 0x67, 0x4c, 0x69,
+	0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x0a, 0x62, 0x75, 0x73,
+	0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x6e, 0x65, 0x65, 0x64, 0x44,
+	0x6f, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x06, 0x6e, 0x65, 0x65, 0x64,
+	0x44, 0x6f, 0x32, 0xdc, 0x07, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4d,
+	0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70,
+	0x4c, 0x69, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x57,
+	0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71,
+	0x1a, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x69,
+	0x6e, 0x67, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x43, 0x0a,
+	0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72,
+	0x79, 0x12, 0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x1a,
+	0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x4e, 0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67,
+	0x12, 0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4e, 0x65, 0x77, 0x55, 0x73,
+	0x65, 0x72, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x11,
+	0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x4a, 0x0a, 0x0d, 0x62, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x53, 0x61, 0x76, 0x65, 0x4d,
+	0x73, 0x67, 0x12, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x75, 0x6c,
+	0x74, 0x69, 0x70, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a,
+	0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70,
+	0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a,
+	0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67,
+	0x12, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69,
+	0x70, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65,
+	0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x43, 0x0a, 0x10, 0x43,
+	0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
+	0x52, 0x65, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x3f, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x12,
+	0x17, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73,
+	0x65, 0x72, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x52, 0x65,
+	0x73, 0x12, 0x4a, 0x0a, 0x11, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65,
+	0x71, 0x1a, 0x1a, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4b, 0x0a,
+	0x0f, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x42, 0x75, 0x6f, 0x79, 0x4d, 0x73, 0x67,
+	0x12, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x55,
+	0x73, 0x65, 0x72, 0x42, 0x75, 0x6f, 0x79, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72,
+	0x42, 0x75, 0x6f, 0x79, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x6c,
+	0x65, 0x61, 0x72, 0x55, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x73, 0x67, 0x12, 0x1a, 0x2e, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x55, 0x6e, 0x72, 0x65,
+	0x61, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x55,
+	0x73, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x17, 0x2e, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74,
+	0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x73,
+	0x65, 0x72, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0d,
+	0x53, 0x65, 0x6e, 0x64, 0x57, 0x78, 0x54, 0x6d, 0x70, 0x6c, 0x4d, 0x73, 0x67, 0x12, 0x19, 0x2e,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x57, 0x78, 0x54, 0x6d, 0x70, 0x6c, 0x4d, 0x73,
+	0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x4d, 0x73, 0x67, 0x4f, 0x70, 0x65, 0x6e, 0x4c, 0x6f, 0x67,
+	0x12, 0x16, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x73, 0x67, 0x4f, 0x70,
+	0x65, 0x6e, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0d, 0x41,
+	0x70, 0x70, 0x4c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x50, 0x75, 0x73, 0x68, 0x12, 0x19, 0x2e, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x57, 0x78, 0x54, 0x6d, 0x70, 0x6c, 0x4d, 0x73, 0x67,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x42, 0x0a, 0x5a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2f, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -3325,7 +3521,7 @@ func file_message_proto_rawDescGZIP() []byte {
 	return file_message_proto_rawDescData
 }
 
-var file_message_proto_msgTypes = make([]protoimpl.MessageInfo, 36)
+var file_message_proto_msgTypes = make([]protoimpl.MessageInfo, 38)
 var file_message_proto_goTypes = []interface{}{
 	(*ChangeReadStatusReq)(nil),    // 0: message.ChangeReadStatusReq
 	(*ResCount)(nil),               // 1: message.ResCount
@@ -3361,17 +3557,19 @@ var file_message_proto_goTypes = []interface{}{
 	(*NewUserInsertMsgReq)(nil),    // 31: message.NewUserInsertMsgReq
 	(*UpdateMsgSummaryReq)(nil),    // 32: message.UpdateMsgSummaryReq
 	(*BitmapSaveMsgReq)(nil),       // 33: message.BitmapSaveMsgReq
-	nil,                            // 34: message.Messages.UrlEntry
-	nil,                            // 35: message.CustomWxTpl.TmplDataEntry
+	(*WorkingDesktopReq)(nil),      // 34: message.WorkingDesktopReq
+	(*WorkingDesktopResp)(nil),     // 35: message.WorkingDesktopResp
+	nil,                            // 36: message.Messages.UrlEntry
+	nil,                            // 37: message.CustomWxTpl.TmplDataEntry
 }
 var file_message_proto_depIdxs = []int32{
-	34, // 0: message.Messages.url:type_name -> message.Messages.UrlEntry
+	36, // 0: message.Messages.url:type_name -> message.Messages.UrlEntry
 	4,  // 1: message.FindUserMsgRes.data:type_name -> message.Messages
 	4,  // 2: message.MessageDetailResp.data:type_name -> message.Messages
 	4,  // 3: message.GetLastMessageRes.data:type_name -> message.Messages
 	1,  // 4: message.GetUnreadClassCountRes.data:type_name -> message.ResCount
 	4,  // 5: message.GetUnreadClassCountRes.info:type_name -> message.Messages
-	35, // 6: message.CustomWxTpl.tmplData:type_name -> message.CustomWxTpl.TmplDataEntry
+	37, // 6: message.CustomWxTpl.tmplData:type_name -> message.CustomWxTpl.TmplDataEntry
 	21, // 7: message.FindUserBuoyMsgRes.data:type_name -> message.BuoyMessages
 	4,  // 8: message.UserMsgListRes.list:type_name -> message.Messages
 	4,  // 9: message.UserMsgListRes.last:type_name -> message.Messages
@@ -3379,38 +3577,42 @@ var file_message_proto_depIdxs = []int32{
 	4,  // 11: message.UserMsgList.data:type_name -> message.Messages
 	26, // 12: message.UserMsgList.sortData:type_name -> message.AllSortData
 	4,  // 13: message.AllSortData.data:type_name -> message.Messages
-	17, // 14: message.CustomWxTpl.TmplDataEntry.value:type_name -> message.TmplItem
-	32, // 15: message.Message.UpdateMsgSummary:input_type -> message.UpdateMsgSummaryReq
-	31, // 16: message.Message.NewUserMsg:input_type -> message.NewUserInsertMsgReq
-	15, // 17: message.Message.bitmapSaveMsg:input_type -> message.multipleSaveMsgReq
-	15, // 18: message.Message.multipleSaveMsg:input_type -> message.multipleSaveMsgReq
-	0,  // 19: message.Message.ChangeReadStatus:input_type -> message.ChangeReadStatusReq
-	3,  // 20: message.Message.FindUserMsg:input_type -> message.FindUserMsgReq
-	7,  // 21: message.Message.FindMessageDetail:input_type -> message.MessageDetailReq
-	19, // 22: message.Message.FindUserBuoyMsg:input_type -> message.FindUserBuoyMsgReq
-	22, // 23: message.Message.ClearUnreadMsg:input_type -> message.ClearUnreadMsgReq
-	23, // 24: message.Message.UserMsgList:input_type -> message.UserMsgListReq
-	28, // 25: message.Message.SendWxTmplMsg:input_type -> message.WxTmplMsgRequest
-	30, // 26: message.Message.MsgOpenLog:input_type -> message.MsgOpenLogReq
-	28, // 27: message.Message.AppLetterPush:input_type -> message.WxTmplMsgRequest
-	2,  // 28: message.Message.UpdateMsgSummary:output_type -> message.Response
-	2,  // 29: message.Message.NewUserMsg:output_type -> message.Response
-	18, // 30: message.Message.bitmapSaveMsg:output_type -> message.multipleSaveMsgResp
-	18, // 31: message.Message.multipleSaveMsg:output_type -> message.multipleSaveMsgResp
-	2,  // 32: message.Message.ChangeReadStatus:output_type -> message.Response
-	5,  // 33: message.Message.FindUserMsg:output_type -> message.FindUserMsgRes
-	8,  // 34: message.Message.FindMessageDetail:output_type -> message.MessageDetailResp
-	20, // 35: message.Message.FindUserBuoyMsg:output_type -> message.FindUserBuoyMsgRes
-	2,  // 36: message.Message.ClearUnreadMsg:output_type -> message.Response
-	24, // 37: message.Message.UserMsgList:output_type -> message.UserMsgListRes
-	29, // 38: message.Message.SendWxTmplMsg:output_type -> message.SendMsgResponse
-	2,  // 39: message.Message.MsgOpenLog:output_type -> message.Response
-	29, // 40: message.Message.AppLetterPush:output_type -> message.SendMsgResponse
-	28, // [28:41] is the sub-list for method output_type
-	15, // [15:28] is the sub-list for method input_type
-	15, // [15:15] is the sub-list for extension type_name
-	15, // [15:15] is the sub-list for extension extendee
-	0,  // [0:15] is the sub-list for field type_name
+	4,  // 14: message.WorkingDesktopResp.busMsgList:type_name -> message.Messages
+	4,  // 15: message.WorkingDesktopResp.needDo:type_name -> message.Messages
+	17, // 16: message.CustomWxTpl.TmplDataEntry.value:type_name -> message.TmplItem
+	34, // 17: message.Message.WorkingDesktopList:input_type -> message.WorkingDesktopReq
+	32, // 18: message.Message.UpdateMsgSummary:input_type -> message.UpdateMsgSummaryReq
+	31, // 19: message.Message.NewUserMsg:input_type -> message.NewUserInsertMsgReq
+	15, // 20: message.Message.bitmapSaveMsg:input_type -> message.multipleSaveMsgReq
+	15, // 21: message.Message.multipleSaveMsg:input_type -> message.multipleSaveMsgReq
+	0,  // 22: message.Message.ChangeReadStatus:input_type -> message.ChangeReadStatusReq
+	3,  // 23: message.Message.FindUserMsg:input_type -> message.FindUserMsgReq
+	7,  // 24: message.Message.FindMessageDetail:input_type -> message.MessageDetailReq
+	19, // 25: message.Message.FindUserBuoyMsg:input_type -> message.FindUserBuoyMsgReq
+	22, // 26: message.Message.ClearUnreadMsg:input_type -> message.ClearUnreadMsgReq
+	23, // 27: message.Message.UserMsgList:input_type -> message.UserMsgListReq
+	28, // 28: message.Message.SendWxTmplMsg:input_type -> message.WxTmplMsgRequest
+	30, // 29: message.Message.MsgOpenLog:input_type -> message.MsgOpenLogReq
+	28, // 30: message.Message.AppLetterPush:input_type -> message.WxTmplMsgRequest
+	35, // 31: message.Message.WorkingDesktopList:output_type -> message.WorkingDesktopResp
+	2,  // 32: message.Message.UpdateMsgSummary:output_type -> message.Response
+	2,  // 33: message.Message.NewUserMsg:output_type -> message.Response
+	18, // 34: message.Message.bitmapSaveMsg:output_type -> message.multipleSaveMsgResp
+	18, // 35: message.Message.multipleSaveMsg:output_type -> message.multipleSaveMsgResp
+	2,  // 36: message.Message.ChangeReadStatus:output_type -> message.Response
+	5,  // 37: message.Message.FindUserMsg:output_type -> message.FindUserMsgRes
+	8,  // 38: message.Message.FindMessageDetail:output_type -> message.MessageDetailResp
+	20, // 39: message.Message.FindUserBuoyMsg:output_type -> message.FindUserBuoyMsgRes
+	2,  // 40: message.Message.ClearUnreadMsg:output_type -> message.Response
+	24, // 41: message.Message.UserMsgList:output_type -> message.UserMsgListRes
+	29, // 42: message.Message.SendWxTmplMsg:output_type -> message.SendMsgResponse
+	2,  // 43: message.Message.MsgOpenLog:output_type -> message.Response
+	29, // 44: message.Message.AppLetterPush:output_type -> message.SendMsgResponse
+	31, // [31:45] is the sub-list for method output_type
+	17, // [17:31] is the sub-list for method input_type
+	17, // [17:17] is the sub-list for extension type_name
+	17, // [17:17] is the sub-list for extension extendee
+	0,  // [0:17] is the sub-list for field type_name
 }
 
 func init() { file_message_proto_init() }
@@ -3827,6 +4029,30 @@ func file_message_proto_init() {
 				return nil
 			}
 		}
+		file_message_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WorkingDesktopReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_message_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WorkingDesktopResp); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -3834,7 +4060,7 @@ func file_message_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_message_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   36,
+			NumMessages:   38,
 			NumExtensions: 0,
 			NumServices:   1,
 		},

+ 38 - 0
rpc/type/message/message_grpc.pb.go

@@ -22,6 +22,8 @@ const _ = grpc.SupportPackageIsVersion7
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
 type MessageClient interface {
+	//工作桌面列表
+	WorkingDesktopList(ctx context.Context, in *WorkingDesktopReq, opts ...grpc.CallOption) (*WorkingDesktopResp, error)
 	//发送消息更新一次消息汇总表
 	UpdateMsgSummary(ctx context.Context, in *UpdateMsgSummaryReq, opts ...grpc.CallOption) (*Response, error)
 	//新用户发送消息
@@ -62,6 +64,15 @@ func NewMessageClient(cc grpc.ClientConnInterface) MessageClient {
 	return &messageClient{cc}
 }
 
+func (c *messageClient) WorkingDesktopList(ctx context.Context, in *WorkingDesktopReq, opts ...grpc.CallOption) (*WorkingDesktopResp, error) {
+	out := new(WorkingDesktopResp)
+	err := c.cc.Invoke(ctx, "/message.Message/WorkingDesktopList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *messageClient) UpdateMsgSummary(ctx context.Context, in *UpdateMsgSummaryReq, opts ...grpc.CallOption) (*Response, error) {
 	out := new(Response)
 	err := c.cc.Invoke(ctx, "/message.Message/UpdateMsgSummary", in, out, opts...)
@@ -183,6 +194,8 @@ func (c *messageClient) AppLetterPush(ctx context.Context, in *WxTmplMsgRequest,
 // All implementations must embed UnimplementedMessageServer
 // for forward compatibility
 type MessageServer interface {
+	//工作桌面列表
+	WorkingDesktopList(context.Context, *WorkingDesktopReq) (*WorkingDesktopResp, error)
 	//发送消息更新一次消息汇总表
 	UpdateMsgSummary(context.Context, *UpdateMsgSummaryReq) (*Response, error)
 	//新用户发送消息
@@ -220,6 +233,9 @@ type MessageServer interface {
 type UnimplementedMessageServer struct {
 }
 
+func (UnimplementedMessageServer) WorkingDesktopList(context.Context, *WorkingDesktopReq) (*WorkingDesktopResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method WorkingDesktopList not implemented")
+}
 func (UnimplementedMessageServer) UpdateMsgSummary(context.Context, *UpdateMsgSummaryReq) (*Response, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method UpdateMsgSummary not implemented")
 }
@@ -272,6 +288,24 @@ func RegisterMessageServer(s grpc.ServiceRegistrar, srv MessageServer) {
 	s.RegisterService(&Message_ServiceDesc, srv)
 }
 
+func _Message_WorkingDesktopList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(WorkingDesktopReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MessageServer).WorkingDesktopList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/message.Message/WorkingDesktopList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MessageServer).WorkingDesktopList(ctx, req.(*WorkingDesktopReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _Message_UpdateMsgSummary_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(UpdateMsgSummaryReq)
 	if err := dec(in); err != nil {
@@ -513,6 +547,10 @@ var Message_ServiceDesc = grpc.ServiceDesc{
 	ServiceName: "message.Message",
 	HandlerType: (*MessageServer)(nil),
 	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "WorkingDesktopList",
+			Handler:    _Message_WorkingDesktopList_Handler,
+		},
 		{
 			MethodName: "UpdateMsgSummary",
 			Handler:    _Message_UpdateMsgSummary_Handler,