From ddfd670dac3507b4ca22bd3a3995ce5e68f2d239 Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Mon, 6 Jul 2020 03:56:25 +0800 Subject: [PATCH] first commit. --- .idea/.gitignore | 8 + binary/jce/reader.go | 416 +++ binary/jce/structs.go | 397 +++ binary/jce/writer.go | 192 ++ binary/reader.go | 146 + binary/tea.go | 143 + binary/utils.go | 77 + binary/writer.go | 112 + client/builders.go | 418 +++ client/client.go | 409 +++ client/decoders.go | 282 ++ client/entities.go | 80 + client/events.go | 57 + client/global.go | 201 ++ client/pb/data.pb.go | 1959 ++++++++++++ client/pb/data.proto | 157 + client/pb/msg/msg.pb.go | 5402 ++++++++++++++++++++++++++++++++++ client/pb/msg/msg.proto | 519 ++++ client/tlv_decoders.go | 153 + go.mod | 8 + go.sum | 85 + message/elements.go | 227 ++ message/message.go | 116 + protocol/crypto/crypto.go | 35 + protocol/crypto/ecdh.go | 1 + protocol/crypto/secp192k1.go | 233 ++ protocol/packets/builders.go | 40 + protocol/packets/global.go | 195 ++ protocol/protocol_global.go | 1 + protocol/tlv/t1.go | 24 + protocol/tlv/t100.go | 17 + protocol/tlv/t104.go | 10 + protocol/tlv/t106.go | 57 + protocol/tlv/t107.go | 15 + protocol/tlv/t109.go | 16 + protocol/tlv/t116.go | 16 + protocol/tlv/t124.go | 17 + protocol/tlv/t128.go | 19 + protocol/tlv/t141.go | 15 + protocol/tlv/t142.go | 13 + protocol/tlv/t144.go | 24 + protocol/tlv/t145.go | 12 + protocol/tlv/t147.go | 14 + protocol/tlv/t154.go | 12 + protocol/tlv/t166.go | 12 + protocol/tlv/t16e.go | 12 + protocol/tlv/t177.go | 14 + protocol/tlv/t18.go | 18 + protocol/tlv/t187.go | 16 + protocol/tlv/t188.go | 16 + protocol/tlv/t191.go | 12 + protocol/tlv/t194.go | 12 + protocol/tlv/t2.go | 14 + protocol/tlv/t202.go | 13 + protocol/tlv/t511.go | 52 + protocol/tlv/t516.go | 12 + protocol/tlv/t521.go | 13 + protocol/tlv/t525.go | 13 + protocol/tlv/t52d.go | 12 + protocol/tlv/t536.go | 12 + protocol/tlv/t8.go | 14 + protocol/tlv/tlv.go | 8 + 62 files changed, 12625 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 binary/jce/reader.go create mode 100644 binary/jce/structs.go create mode 100644 binary/jce/writer.go create mode 100644 binary/reader.go create mode 100644 binary/tea.go create mode 100644 binary/utils.go create mode 100644 binary/writer.go create mode 100644 client/builders.go create mode 100644 client/client.go create mode 100644 client/decoders.go create mode 100644 client/entities.go create mode 100644 client/events.go create mode 100644 client/global.go create mode 100644 client/pb/data.pb.go create mode 100644 client/pb/data.proto create mode 100644 client/pb/msg/msg.pb.go create mode 100644 client/pb/msg/msg.proto create mode 100644 client/tlv_decoders.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 message/elements.go create mode 100644 message/message.go create mode 100644 protocol/crypto/crypto.go create mode 100644 protocol/crypto/ecdh.go create mode 100644 protocol/crypto/secp192k1.go create mode 100644 protocol/packets/builders.go create mode 100644 protocol/packets/global.go create mode 100644 protocol/protocol_global.go create mode 100644 protocol/tlv/t1.go create mode 100644 protocol/tlv/t100.go create mode 100644 protocol/tlv/t104.go create mode 100644 protocol/tlv/t106.go create mode 100644 protocol/tlv/t107.go create mode 100644 protocol/tlv/t109.go create mode 100644 protocol/tlv/t116.go create mode 100644 protocol/tlv/t124.go create mode 100644 protocol/tlv/t128.go create mode 100644 protocol/tlv/t141.go create mode 100644 protocol/tlv/t142.go create mode 100644 protocol/tlv/t144.go create mode 100644 protocol/tlv/t145.go create mode 100644 protocol/tlv/t147.go create mode 100644 protocol/tlv/t154.go create mode 100644 protocol/tlv/t166.go create mode 100644 protocol/tlv/t16e.go create mode 100644 protocol/tlv/t177.go create mode 100644 protocol/tlv/t18.go create mode 100644 protocol/tlv/t187.go create mode 100644 protocol/tlv/t188.go create mode 100644 protocol/tlv/t191.go create mode 100644 protocol/tlv/t194.go create mode 100644 protocol/tlv/t2.go create mode 100644 protocol/tlv/t202.go create mode 100644 protocol/tlv/t511.go create mode 100644 protocol/tlv/t516.go create mode 100644 protocol/tlv/t521.go create mode 100644 protocol/tlv/t525.go create mode 100644 protocol/tlv/t52d.go create mode 100644 protocol/tlv/t536.go create mode 100644 protocol/tlv/t8.go create mode 100644 protocol/tlv/tlv.go diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..73f69e09 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/binary/jce/reader.go b/binary/jce/reader.go new file mode 100644 index 00000000..9f637c1a --- /dev/null +++ b/binary/jce/reader.go @@ -0,0 +1,416 @@ +package jce + +import ( + "bytes" + "math" + "reflect" +) + +type JceReader struct { + buf *bytes.Reader + data []byte +} + +type HeadData struct { + Type byte + Tag int +} + +func NewJceReader(data []byte) *JceReader { + buf := bytes.NewReader(data) + return &JceReader{buf: buf, data: data} +} + +func (r *JceReader) readHead() (hd *HeadData, l int32) { + hd = &HeadData{} + b, _ := r.buf.ReadByte() + hd.Type = b & 0xF + hd.Tag = (int(b) & 0xF0) >> 4 + if hd.Tag == 15 { + b, _ = r.buf.ReadByte() + hd.Tag = int(b) & 0xFF + return hd, 2 + } + return hd, 1 +} + +func (r *JceReader) peakHead() (hd *HeadData, l int32) { + offset := r.buf.Size() - int64(r.buf.Len()) + n := NewJceReader(r.data[offset:]) + return n.readHead() +} + +func (r *JceReader) skip(l int) { + r.readBytes(l) +} + +func (r *JceReader) skipField(t byte) { + switch t { + case 0: + r.skip(1) + case 1: + r.skip(2) + case 2, 4: + r.skip(4) + case 3, 5: + r.skip(8) + case 6: + b, _ := r.buf.ReadByte() + r.skip(int(b)) + case 7: + r.skip(int(r.readInt32())) + case 8: + s := r.ReadInt32(0) + for i := 0; i < int(s)*2; i++ { + r.skipNextField() + } + case 9: + s := r.ReadInt32(0) + for i := 0; i < int(s); i++ { + r.skipNextField() + } + case 13: + r.readHead() + s := r.ReadInt32(0) + r.skip(int(s)) + case 10: + r.skipToStructEnd() + } +} + +func (r *JceReader) skipNextField() { + hd, _ := r.readHead() + r.skipField(hd.Type) +} + +func (r *JceReader) SkipField(c int) { + for i := 0; i < c; i++ { + r.skipNextField() + } +} + +func (r *JceReader) readBytes(len int) []byte { + b := make([]byte, len) + _, err := r.buf.Read(b) + if err != nil { + panic(err) + } + return b +} + +func (r *JceReader) readByte() byte { + return r.readBytes(1)[0] +} + +func (r *JceReader) readUInt16() uint16 { + f, _ := r.buf.ReadByte() + s, err := r.buf.ReadByte() + if err != nil { + panic(err) + } + return uint16((int32(f) << 8) + int32(s)) +} + +func (r *JceReader) readInt32() int32 { + b := r.readBytes(4) + return (int32(b[0]) << 24) | (int32(b[1]) << 16) | (int32(b[2]) << 8) | int32(b[3]) +} + +func (r *JceReader) readInt64() int64 { + b := r.readBytes(8) + return (int64(b[0]) << 56) | (int64(b[1]) << 48) | (int64(b[2]) << 40) | (int64(b[3]) << 32) | (int64(b[4]) << 24) | (int64(b[5]) << 16) | (int64(b[6]) << 8) | int64(b[7]) +} + +func (r *JceReader) readFloat32() float32 { + b := r.readInt32() + return math.Float32frombits(uint32(b)) +} + +func (r *JceReader) readFloat64() float64 { + b := r.readInt64() + return math.Float64frombits(uint64(b)) +} + +func (r *JceReader) skipToTag(tag int) bool { + for { + hd, l := r.peakHead() + if tag <= hd.Tag || hd.Type == 11 { + return tag == hd.Tag + } + r.skip(int(l)) + r.skipField(hd.Type) + } +} + +func (r *JceReader) skipToStructEnd() { + for { + hd, _ := r.readHead() + r.skipField(hd.Type) + if hd.Type == 11 { + return + } + } +} + +func (r *JceReader) ReadByte(tag int) byte { + if !r.skipToTag(tag) { + return 0 + } + hd, _ := r.readHead() + switch hd.Type { + case 12: + return 0 + case 0: + return r.readByte() + default: + return 0 + } +} + +func (r *JceReader) ReadBool(tag int) bool { + return r.ReadByte(tag) != 0 +} + +func (r *JceReader) ReadInt16(tag int) int16 { + if !r.skipToTag(tag) { + return 0 + } + hd, _ := r.readHead() + switch hd.Type { + case 12: + return 0 + case 0: + return int16(r.readByte()) + case 1: + return int16(r.readUInt16()) + default: + return 0 + } +} + +func (r *JceReader) ReadInt32(tag int) int32 { + if !r.skipToTag(tag) { + return 0 + } + hd, _ := r.readHead() + switch hd.Type { + case 12: + return 0 + case 0: + return int32(r.readByte()) + case 1: + return int32(r.readUInt16()) + case 2: + return r.readInt32() + default: + return 0 + } +} + +func (r *JceReader) ReadInt64(tag int) int64 { + if !r.skipToTag(tag) { + return 0 + } + hd, _ := r.readHead() + switch hd.Type { + case 12: + return 0 + case 0: + return int64(r.readByte()) + case 1: + return int64(int16(r.readUInt16())) + case 2: + return int64(r.readInt32()) + case 3: + return r.readInt64() + default: + return 0 + } +} + +func (r *JceReader) ReadFloat32(tag int) float32 { + if !r.skipToTag(tag) { + return 0 + } + hd, _ := r.readHead() + switch hd.Type { + case 12: + return 0 + case 4: + return r.readFloat32() + default: + return 0 + } +} + +func (r *JceReader) ReadFloat64(tag int) float64 { + if !r.skipToTag(tag) { + return 0 + } + hd, _ := r.readHead() + switch hd.Type { + case 12: + return 0 + case 4: + return float64(r.readFloat32()) + case 5: + return r.readFloat64() + default: + return 0 + } +} + +func (r *JceReader) ReadString(tag int) string { + if !r.skipToTag(tag) { + return "" + } + hd, _ := r.readHead() + switch hd.Type { + case 6: + return string(r.readBytes(int(r.readByte()))) + case 7: + return string(r.readBytes(int(r.readInt32()))) + default: + return "" + } +} + +// ReadAny Read any type via tag, unsupported JceStruct +func (r *JceReader) ReadAny(tag int) interface{} { + if !r.skipToTag(tag) { + return nil + } + hd, _ := r.readHead() + switch hd.Type { + case 0: + return r.readByte() + case 1: + return r.readUInt16() + case 2: + return r.readInt32() + case 3: + return r.readInt64() + case 4: + return r.readFloat32() + case 5: + return r.readFloat64() + case 6: + return string(r.readBytes(int(r.readByte()))) + case 7: + return string(r.readBytes(int(r.readInt32()))) + case 8: + s := r.ReadInt32(0) + m := make(map[interface{}]interface{}) + for i := 0; i < int(s); i++ { + m[r.ReadAny(0)] = r.ReadAny(1) + } + return m + case 9: + var sl []interface{} + s := r.ReadInt32(0) + for i := 0; i < int(s); i++ { + sl = append(sl, r.ReadAny(0)) + } + return sl + case 12: + return 0 + case 13: + r.readHead() + return r.readBytes(int(r.ReadInt32(0))) + default: + return nil + } +} + +func (r *JceReader) ReadMapF(tag int, f func(interface{}, interface{})) { + if !r.skipToTag(tag) { + return + } + r.readHead() + s := r.ReadInt32(0) + for i := 0; i < int(s); i++ { + k := r.ReadAny(0) + v := r.ReadAny(1) + if k != nil { + f(k, v) + } + } +} + +func (r *JceReader) readObject(t reflect.Type, tag int) reflect.Value { + switch t.Kind() { + case reflect.Int, reflect.Int16, reflect.Int32, reflect.Int64: + var i int64 + r.ReadObject(&i, tag) + return reflect.ValueOf(i) + case reflect.String: + var s string + r.ReadObject(&s, tag) + return reflect.ValueOf(s) + case reflect.Slice: + s := reflect.New(t.Elem()).Interface().(IJecStruct) + r.readHead() + s.ReadFrom(r) + r.skipToStructEnd() + return reflect.ValueOf(s).Elem() + } + return reflect.ValueOf(nil) +} + +func (r *JceReader) ReadSlice(i interface{}, tag int) { + t := reflect.TypeOf(i) + v := reflect.ValueOf(i).Elem() + if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Slice { + return + } + if v.IsNil() { + return + } + if !r.skipToTag(tag) { + return + } + hd, _ := r.readHead() + if hd.Type == 9 { + s := r.ReadInt32(0) + for i := 0; i < int(s); i++ { + val := r.readObject(t.Elem(), 0) + v.Set(reflect.Append(v, val)) + } + } + if hd.Type == 13 { + r.readHead() + arr := r.readBytes(int(r.ReadInt32(0))) + for _, b := range arr { + v.Set(reflect.Append(v, reflect.ValueOf(b))) + } + } +} + +func (r *JceReader) ReadObject(i interface{}, tag int) { + va := reflect.ValueOf(i) + if va.Kind() != reflect.Ptr || va.IsNil() { + return + } + switch o := i.(type) { + case *byte: + *o = r.ReadByte(tag) + case *bool: + *o = r.ReadBool(tag) + case *int16: + *o = r.ReadInt16(tag) + case *int: + *o = int(r.ReadInt32(tag)) + case *int32: + *o = r.ReadInt32(tag) + case *int64: + *o = r.ReadInt64(tag) + case *float32: + *o = r.ReadFloat32(tag) + case *float64: + *o = r.ReadFloat64(tag) + case *string: + *o = r.ReadString(tag) + case IJecStruct: + o.ReadFrom(r) + } +} diff --git a/binary/jce/structs.go b/binary/jce/structs.go new file mode 100644 index 00000000..00c37cfe --- /dev/null +++ b/binary/jce/structs.go @@ -0,0 +1,397 @@ +package jce + +type IJecStruct interface { + ToBytes() []byte + ReadFrom(*JceReader) +} + +// TODO: code gen +type ( + RequestPacket struct { + IVersion int16 `jceId:"1"` + CPacketType byte `jceId:"2"` + IMessageType int32 `jceId:"3"` + IRequestId int32 `jceId:"4"` + SServantName string `jceId:"5"` + SFuncName string `jceId:"6"` + SBuffer []byte `jceId:"7"` + ITimeout int32 `jceId:"8"` + Context map[string]string `jceId:"9"` + Status map[string]string `jceId:"10"` + } + + RequestDataVersion3 struct { + Map map[string][]byte `jceId:"0"` + } + + RequestDataVersion2 struct { + Map map[string]map[string][]byte `jceId:"0"` + } + + SvcReqRegister struct { + Uin int64 `jceId:"0"` + Bid int64 `jceId:"1"` + ConnType byte `jceId:"2"` + Other string `jceId:"3"` + Status int32 `jceId:"4"` + OnlinePush byte `jceId:"5"` + IsOnline byte `jceId:"6"` + IsShowOnline byte `jceId:"7"` + KickPC byte `jceId:"8"` + KickWeak byte `jceId:"9"` + Timestamp int64 `jceId:"10"` + IOSVersion int64 `jceId:"11"` + NetType byte `jceId:"12"` + BuildVer string `jceId:"13"` + RegType byte `jceId:"14"` + DevParam []byte `jceId:"15"` + Guid []byte `jceId:"16"` + LocaleId int32 `jceId:"17"` + SilentPush byte `jceId:"18"` + DevName string `jceId:"19"` + DevType string `jceId:"20"` + OSVer string `jceId:"21"` + OpenPush byte `jceId:"22"` + LargeSeq int64 `jceId:"23"` + LastWatchStartTime int64 `jceId:"24"` + OldSSOIp int64 `jceId:"26"` + NewSSOIp int64 `jceId:"27"` + ChannelNo string `jceId:"28"` + CPID int64 `jceId:"29"` + VendorName string `jceId:"30"` + VendorOSName string `jceId:"31"` + IOSIdfa string `jceId:"32"` + B769 []byte `jceId:"33"` + IsSetStatus byte `jceId:"34"` + ServerBuf []byte `jceId:"35"` + SetMute byte `jceId:"36"` + } + + FriendListRequest struct { + Reqtype int32 `jceId:"0"` + IfReflush byte `jceId:"1"` + Uin int64 `jceId:"2"` + StartIndex int16 `jceId:"3"` + FriendCount int16 `jceId:"4"` + GroupId byte `jceId:"5"` + IfGetGroupInfo byte `jceId:"6"` + GroupStartIndex byte `jceId:"7"` + GroupCount byte `jceId:"8"` + IfGetMSFGroup byte `jceId:"9"` + IfShowTermType byte `jceId:"10"` + Version int64 `jceId:"11"` + UinList []int64 `jceId:"12"` + AppType int32 `jceId:"13"` + IfGetDOVId byte `jceId:"14"` + IfGetBothFlag byte `jceId:"15"` + D50 []byte `jceId:"16"` + D6B []byte `jceId:"17"` + SnsTypeList []int64 `jceId:"18"` + } + + FriendInfo struct { + FriendUin int64 `jceId:"0"` + GroupId byte `jceId:"1"` + FaceId int16 `jceId:"2"` + Remark string `jceId:"3"` + QQType byte `jceId:"4"` + Status byte `jceId:"5"` + MemberLevel byte `jceId:"6"` + IsMqqOnLine byte `jceId:"7"` + QQOnlineState byte `jceId:"8"` + IsIphoneOnline byte `jceId:"9"` + DetailStatusFlag byte `jceId:"10"` + QQOnlineStateV2 byte `jceId:"11"` + ShowName string `jceId:"12"` + IsRemark byte `jceId:"13"` + Nick string `jceId:"14"` + SpecialFlag byte `jceId:"15"` + IMGroupID []byte `jceId:"16"` + MSFGroupID []byte `jceId:"17"` + TermType int32 `jceId:"18"` + Network byte `jceId:"20"` + Ring []byte `jceId:"21"` + AbiFlag int64 `jceId:"22"` + FaceAddonId int64 `jceId:"23"` + NetworkType int32 `jceId:"24"` + VipFont int64 `jceId:"25"` + IconType int32 `jceId:"26"` + TermDesc string `jceId:"27"` + ColorRing int64 `jceId:"28"` + ApolloFlag byte `jceId:"29"` + ApolloTimestamp int64 `jceId:"30"` + Sex byte `jceId:"31"` + FounderFont int64 `jceId:"32"` + EimId string `jceId:"33"` + EimMobile string `jceId:"34"` + OlympicTorch byte `jceId:"35"` + ApolloSignTime int64 `jceId:"36"` + LaviUin int64 `jceId:"37"` + TagUpdateTime int64 `jceId:"38"` + GameLastLoginTime int64 `jceId:"39"` + GameAppId int64 `jceId:"40"` + CardID []byte `jceId:"41"` + BitSet int64 `jceId:"42"` + KingOfGloryFlag byte `jceId:"43"` + KingOfGloryRank int64 `jceId:"44"` + MasterUin string `jceId:"45"` + LastMedalUpdateTime int64 `jceId:"46"` + FaceStoreId int64 `jceId:"47"` + FontEffect int64 `jceId:"48"` + DOVId string `jceId:"49"` + BothFlag int64 `jceId:"50"` + CentiShow3DFlag byte `jceId:"51"` + IntimateInfo []byte `jceId:"52"` + ShowNameplate byte `jceId:"53"` + NewLoverDiamondFlag byte `jceId:"54"` + ExtSnsFrdData []byte `jceId:"55"` + MutualMarkData []byte `jceId:"56"` + } + + TroopListRequest struct { + Uin int64 `jceId:"0"` + GetMSFMsgFlag byte `jceId:"1"` + Cookies []byte `jceId:"2"` + GroupInfo []int64 `jceId:"3"` + GroupFlagExt byte `jceId:"4"` + Version int32 `jceId:"5"` + CompanyId int64 `jceId:"6"` + VersionNum int64 `jceId:"7"` + GetLongGroupName byte `jceId:"8"` + } + + TroopNumber struct { + GroupUin int64 `jceId:"0"` + GroupCode int64 `jceId:"1"` + Flag byte `jceId:"2"` + GroupInfoSeq int64 `jceId:"3"` + GroupName string `jceId:"4"` + GroupMemo string `jceId:"5"` + GroupFlagExt int64 `jceId:"6"` + GroupRankSeq int64 `jceId:"7"` + CertificationType int64 `jceId:"8"` + ShutUpTimestamp int64 `jceId:"9"` + MyShutUpTimestamp int64 `jceId:"10"` + CmdUinUinFlag int64 `jceId:"11"` + AdditionalFlag int64 `jceId:"12"` + GroupTypeFlag int64 `jceId:"13"` + GroupSecType int64 `jceId:"14"` + GroupSecTypeInfo int64 `jceId:"15"` + GroupClassExt int64 `jceId:"16"` + AppPrivilegeFlag int64 `jceId:"17"` + SubscriptionUin int64 `jceId:"18"` + MemberNum int64 `jceId:"19"` + MemberNumSeq int64 `jceId:"20"` + MemberCardSeq int64 `jceId:"21"` + GroupFlagExt3 int64 `jceId:"22"` + GroupOwnerUin int64 `jceId:"23"` + IsConfGroup byte `jceId:"24"` + IsModifyConfGroupFace byte `jceId:"25"` + IsModifyConfGroupName byte `jceId:"26"` + CmdUinJoinTime int64 `jceId:"27"` + CompanyId int64 `jceId:"28"` + MaxGroupMemberNum int64 `jceId:"29"` + CmdUinGroupMask int64 `jceId:"30"` + GuildAppId int64 `jceId:"31"` + GuildSubType int64 `jceId:"32"` + CmdUinRingtoneID int64 `jceId:"33"` + CmdUinFlagEx2 int64 `jceId:"34"` + } + + TroopMemberListRequest struct { + Uin int64 `jceId:"0"` + GroupCode int64 `jceId:"1"` + NextUin int64 `jceId:"2"` + GroupUin int64 `jceId:"3"` + Version int64 `jceId:"4"` + ReqType int64 `jceId:"5"` + GetListAppointTime int64 `jceId:"6"` + RichCardNameVer byte `jceId:"7"` + } + + TroopMemberInfo struct { + MemberUin int64 `jceId:"0"` + FaceId int16 `jceId:"1"` + Age byte `jceId:"2"` + Gender byte `jceId:"3"` + Nick string `jceId:"4"` + Status byte `jceId:"5"` + ShowName string `jceId:"6"` + Name string `jceId:"8"` + Memo string `jceId:"12"` + AutoRemark string `jceId:"13"` + MemberLevel int64 `jceId:"14"` + JoinTime int64 `jceId:"15"` + LastSpeakTime int64 `jceId:"16"` + CreditLevel int64 `jceId:"17"` + Flag int64 `jceId:"18"` + FlagExt int64 `jceId:"19"` + Point int64 `jceId:"20"` + Concerned byte `jceId:"21"` + Shielded byte `jceId:"22"` + SpecialTitle string `jceId:"23"` + SpecialTitleExpireTime int64 `jceId:"24"` + Job string `jceId:"25"` + ApolloFlag byte `jceId:"26"` + ApolloTimestamp int64 `jceId:"27"` + GlobalGroupLevel int64 `jceId:"28"` + TitleId int64 `jceId:"29"` + ShutUpTimestap int64 `jceId:"30"` + GlobalGroupPoint int64 `jceId:"31"` + RichCardNameVer byte `jceId:"33"` + VipType int64 `jceId:"34"` + VipLevel int64 `jceId:"35"` + BigClubLevel int64 `jceId:"36"` + BigClubFlag int64 `jceId:"37"` + Nameplate int64 `jceId:"38"` + GroupHonor []byte `jceId:"39"` + } +) + +func (pkt *RequestPacket) ToBytes() []byte { + w := NewJceWriter() + w.WriteJceStructRaw(pkt) + return w.Bytes() +} + +func (pkt *RequestPacket) ReadFrom(r *JceReader) { + pkt.SBuffer = []byte{} + pkt.Context = make(map[string]string) + pkt.Status = make(map[string]string) + pkt.IVersion = r.ReadInt16(1) + pkt.CPacketType = r.ReadByte(2) + pkt.IMessageType = r.ReadInt32(3) + pkt.IRequestId = r.ReadInt32(4) + pkt.SServantName = r.ReadString(5) + pkt.SFuncName = r.ReadString(6) + r.ReadSlice(&pkt.SBuffer, 7) + pkt.ITimeout = r.ReadInt32(8) + r.ReadMapF(9, func(k interface{}, v interface{}) { pkt.Context[k.(string)] = v.(string) }) + r.ReadMapF(10, func(k interface{}, v interface{}) { pkt.Status[k.(string)] = v.(string) }) +} + +func (pkt *RequestDataVersion3) ToBytes() []byte { + w := NewJceWriter() + w.WriteJceStructRaw(pkt) + return w.Bytes() +} + +func (pkt *RequestDataVersion3) ReadFrom(r *JceReader) { + pkt.Map = make(map[string][]byte) + r.ReadMapF(0, func(k interface{}, v interface{}) { + pkt.Map[k.(string)] = v.([]byte) + }) +} + +func (pkt *RequestDataVersion2) ToBytes() []byte { + w := NewJceWriter() + w.WriteJceStructRaw(pkt) + return w.Bytes() +} + +func (pkt *RequestDataVersion2) ReadFrom(r *JceReader) { + pkt.Map = make(map[string]map[string][]byte) + r.ReadMapF(0, func(k interface{}, v interface{}) { + pkt.Map[k.(string)] = make(map[string][]byte) + for k2, v := range v.(map[interface{}]interface{}) { + pkt.Map[k.(string)][k2.(string)] = v.([]byte) + } + }) +} + +func (pkt *SvcReqRegister) ToBytes() []byte { + w := NewJceWriter() + w.WriteJceStructRaw(pkt) + return w.Bytes() +} + +func (pkt *SvcReqRegister) ReadFrom(r *JceReader) { + +} + +func (pkt *FriendListRequest) ToBytes() []byte { + w := NewJceWriter() + w.WriteJceStructRaw(pkt) + return w.Bytes() +} + +func (pkt *FriendListRequest) ReadFrom(r *JceReader) { + +} + +func (pkt *FriendInfo) ToBytes() []byte { + w := NewJceWriter() + w.WriteJceStructRaw(pkt) + return w.Bytes() +} + +func (pkt *FriendInfo) ReadFrom(r *JceReader) { + pkt.FriendUin = r.ReadInt64(0) + pkt.GroupId = r.ReadByte(1) + pkt.FaceId = r.ReadInt16(2) + pkt.Remark = r.ReadString(3) + pkt.Status = r.ReadByte(5) + pkt.MemberLevel = r.ReadByte(6) + pkt.Nick = r.ReadString(14) + pkt.Network = r.ReadByte(20) + pkt.NetworkType = r.ReadInt32(24) + pkt.CardID = []byte{} + r.ReadObject(&pkt.CardID, 41) +} + +func (pkt *TroopListRequest) ToBytes() []byte { + w := NewJceWriter() + w.WriteJceStructRaw(pkt) + return w.Bytes() +} + +func (pkt *TroopListRequest) ReadFrom(r *JceReader) { + +} + +func (pkt *TroopNumber) ToBytes() []byte { + w := NewJceWriter() + w.WriteJceStructRaw(pkt) + return w.Bytes() +} + +func (pkt *TroopNumber) ReadFrom(r *JceReader) { + pkt.GroupUin = r.ReadInt64(0) + pkt.GroupCode = r.ReadInt64(1) + pkt.GroupName = r.ReadString(4) + pkt.GroupMemo = r.ReadString(5) + pkt.MemberNum = r.ReadInt64(19) + pkt.GroupOwnerUin = r.ReadInt64(23) + pkt.MaxGroupMemberNum = r.ReadInt64(29) +} + +func (pkt *TroopMemberListRequest) ToBytes() []byte { + w := NewJceWriter() + w.WriteJceStructRaw(pkt) + return w.Bytes() +} + +func (pkt *TroopMemberListRequest) ReadFrom(r *JceReader) { + +} + +func (pkt *TroopMemberInfo) ToBytes() []byte { + w := NewJceWriter() + w.WriteJceStructRaw(pkt) + return w.Bytes() +} + +func (pkt *TroopMemberInfo) ReadFrom(r *JceReader) { + pkt.MemberUin = r.ReadInt64(0) + pkt.FaceId = r.ReadInt16(1) + pkt.Nick = r.ReadString(4) + pkt.ShowName = r.ReadString(6) + pkt.Name = r.ReadString(8) + pkt.AutoRemark = r.ReadString(13) + pkt.MemberLevel = r.ReadInt64(14) + pkt.JoinTime = r.ReadInt64(15) + pkt.LastSpeakTime = r.ReadInt64(16) + pkt.SpecialTitle = r.ReadString(23) + pkt.SpecialTitleExpireTime = r.ReadInt64(24) + pkt.Job = r.ReadString(25) +} diff --git a/binary/jce/writer.go b/binary/jce/writer.go new file mode 100644 index 00000000..650da8f4 --- /dev/null +++ b/binary/jce/writer.go @@ -0,0 +1,192 @@ +package jce + +import ( + "bytes" + goBinary "encoding/binary" + "reflect" + "strconv" +) + +type JceWriter struct { + buf *bytes.Buffer +} + +func NewJceWriter() *JceWriter { + return &JceWriter{buf: new(bytes.Buffer)} +} + +func (w *JceWriter) writeHead(t byte, tag int) { + if tag < 15 { + b := byte(tag<<4) | t + w.buf.WriteByte(b) + } else if tag < 256 { + b := 0xF0 | t + w.buf.WriteByte(b) + w.buf.WriteByte(byte(tag)) + } +} + +func (w *JceWriter) WriteByte(b byte, tag int) { + if b == 0 { + w.writeHead(12, tag) + } else { + w.writeHead(0, tag) + w.buf.WriteByte(b) + } +} + +func (w *JceWriter) WriteBool(b bool, tag int) { + var by byte = 0 + if b { + by = 1 + } + w.WriteByte(by, tag) +} + +func (w *JceWriter) WriteInt16(n int16, tag int) { + if n >= -128 && n <= 127 { + w.WriteByte(byte(n), tag) + return + } + w.writeHead(1, tag) + _ = goBinary.Write(w.buf, goBinary.BigEndian, n) +} + +func (w *JceWriter) WriteInt32(n int32, tag int) { + if n >= -32768 && n <= 32767 { // ? if ((n >= 32768) && (n <= 32767)) + w.WriteInt16(int16(n), tag) + return + } + w.writeHead(2, tag) + _ = goBinary.Write(w.buf, goBinary.BigEndian, n) +} + +func (w *JceWriter) WriteInt64(n int64, tag int) { + if n >= -2147483648 && n <= 2147483647 { + w.WriteInt32(int32(n), tag) + return + } + w.writeHead(3, tag) + _ = goBinary.Write(w.buf, goBinary.BigEndian, n) +} + +func (w *JceWriter) WriteFloat32(n float32, tag int) { + w.writeHead(4, tag) + _ = goBinary.Write(w.buf, goBinary.BigEndian, n) +} + +func (w *JceWriter) WriteFloat64(n float64, tag int) { + w.writeHead(5, tag) + _ = goBinary.Write(w.buf, goBinary.BigEndian, n) +} + +func (w *JceWriter) WriteString(s string, tag int) { + by := []byte(s) + if len(by) > 255 { + w.writeHead(7, tag) + _ = goBinary.Write(w.buf, goBinary.BigEndian, len(by)) + w.buf.Write(by) + return + } + w.writeHead(6, tag) + w.buf.WriteByte(byte(len(by))) + w.buf.Write(by) +} + +func (w *JceWriter) WriteBytes(l []byte, tag int) { + w.writeHead(13, tag) + w.writeHead(0, 0) + w.WriteInt32(int32(len(l)), 0) + w.buf.Write(l) +} + +func (w *JceWriter) WriteInt64Slice(l []int64, tag int) { + w.writeHead(9, tag) + if len(l) == 0 { + w.WriteInt32(0, 0) + return + } + w.WriteInt32(int32(len(l)), 0) + for _, v := range l { + w.WriteInt64(v, 0) + } +} + +func (w *JceWriter) WriteMap(m interface{}, tag int) { + if m == nil { + w.writeHead(8, tag) + w.WriteInt32(0, 0) + return + } + va := reflect.ValueOf(m) + if va.Kind() != reflect.Map { + return + } + w.writeHead(8, tag) + w.WriteInt32(int32(len(va.MapKeys())), 0) + for _, k := range va.MapKeys() { + v := va.MapIndex(k) + w.WriteObject(k.Interface(), 0) + w.WriteObject(v.Interface(), 1) + } +} + +func (w *JceWriter) WriteObject(i interface{}, tag int) { + t := reflect.TypeOf(i) + if t.Kind() == reflect.Map { + w.WriteMap(i, tag) + return + } + switch o := i.(type) { + case byte: + w.WriteByte(o, tag) + case bool: + w.WriteBool(o, tag) + case int16: + w.WriteInt16(o, tag) + case int32: + w.WriteInt32(o, tag) + case int64: + w.WriteInt64(o, tag) + case float32: + w.WriteFloat32(o, tag) + case float64: + w.WriteFloat64(o, tag) + case string: + w.WriteString(o, tag) + case []byte: + w.WriteBytes(o, tag) + case []int64: + w.WriteInt64Slice(o, tag) + case IJecStruct: + w.WriteJceStruct(o, tag) + } +} + +func (w *JceWriter) WriteJceStructRaw(s IJecStruct) { + var ( + t = reflect.TypeOf(s).Elem() + v = reflect.ValueOf(s).Elem() + ) + for i := 0; i < t.NumField(); i++ { + strId := t.Field(i).Tag.Get("jceId") + if strId == "" { + continue + } + id, err := strconv.Atoi(strId) + if err != nil { + continue + } + w.WriteObject(v.Field(i).Interface(), id) + } +} + +func (w *JceWriter) WriteJceStruct(s IJecStruct, tag int) { + w.writeHead(10, tag) + w.WriteJceStructRaw(s) + w.writeHead(11, 0) +} + +func (w *JceWriter) Bytes() []byte { + return w.buf.Bytes() +} diff --git a/binary/reader.go b/binary/reader.go new file mode 100644 index 00000000..0313290a --- /dev/null +++ b/binary/reader.go @@ -0,0 +1,146 @@ +package binary + +import ( + "bytes" + "net" +) + +type Reader struct { + buf *bytes.Reader +} + +type NetworkReader struct { + conn net.Conn +} + +type TlvMap map[uint16][]byte + +// --- ByteStream reader --- + +func NewReader(data []byte) *Reader { + buf := bytes.NewReader(data) + return &Reader{ + buf: buf, + } +} + +func (r *Reader) ReadByte() byte { + b, err := r.buf.ReadByte() + if err != nil { + panic(err) + } + return b +} + +func (r *Reader) ReadBytes(len int) []byte { + b := make([]byte, len) + _, err := r.buf.Read(b) + if err != nil { + panic(err) + } + return b +} + +func (r *Reader) ReadBytesShort() []byte { + return r.ReadBytes(int(r.ReadUInt16())) +} + +func (r *Reader) ReadUInt16() uint16 { + f, _ := r.buf.ReadByte() + s, err := r.buf.ReadByte() + if err != nil { + panic(err) + } + return uint16((int32(f) << 8) + int32(s)) +} + +func (r *Reader) ReadInt32() int32 { + b := r.ReadBytes(4) + return (int32(b[0]) << 24) | (int32(b[1]) << 16) | (int32(b[2]) << 8) | int32(b[3]) +} + +func (r *Reader) ReadString() string { + data := r.ReadBytes(int(r.ReadInt32() - 4)) + return string(data) +} + +func (r *Reader) ReadStringShort() string { + data := r.ReadBytes(int(r.ReadUInt16())) + return string(data) +} + +func (r *Reader) ReadStringLimit(limit int) string { + data := r.ReadBytes(limit) + return string(data) +} + +func (r *Reader) ReadAvailable() []byte { + return r.ReadBytes(r.buf.Len()) +} + +func (r *Reader) ReadTlvMap(tagSize int) (m TlvMap) { + defer func() { + if r := recover(); r != nil { + // TODO: error + } + }() + m = make(map[uint16][]byte) + for { + if r.Len() < tagSize { + return m + } + var k uint16 + if tagSize == 1 { + k = uint16(r.ReadByte()) + } else if tagSize == 2 { + k = r.ReadUInt16() + } else if tagSize == 4 { + k = uint16(r.ReadInt32()) + } + if k == 255 { + return m + } + m[k] = r.ReadBytes(int(r.ReadUInt16())) + } +} + +func (r *Reader) Len() int { + return r.buf.Len() +} + +func (tlv TlvMap) Exists(key uint16) bool { + if _, ok := tlv[key]; ok { + return true + } + return false +} + +// --- Network reader --- + +func NewNetworkReader(conn net.Conn) *NetworkReader { + return &NetworkReader{conn: conn} +} + +func (r *NetworkReader) ReadByte() byte { + buf := make([]byte, 1) + n, err := r.conn.Read(buf) + if err != nil { + panic(err) + } + if n != 1 { + return r.ReadByte() + } + return buf[0] +} + +func (r *NetworkReader) ReadBytes(len int) []byte { + buf := make([]byte, len) + for i := 0; i < len; i++ { + buf[i] = r.ReadByte() + } + return buf +} + +func (r *NetworkReader) ReadInt32() int32 { + return (int32(r.ReadByte()) << 24) | (int32(r.ReadByte()) << 16) | (int32(r.ReadByte()) << 8) | int32(r.ReadByte()) +} diff --git a/binary/tea.go b/binary/tea.go new file mode 100644 index 00000000..787ff9b6 --- /dev/null +++ b/binary/tea.go @@ -0,0 +1,143 @@ +package binary + +import ( + "bytes" + "encoding/binary" + "math/rand" + "time" +) + +const ( + delta = uint32(0x9E3779B9) + fillnor = 0xF8 +) + +type teaCipher struct { + keys [4]uint32 + value []byte + byte8 [8]byte + ubyte32 [2]uint32 + xor [8]byte //xor + fxor [8]byte //first xor + lxor [8]byte //last xor + nxor [8]byte //new xor Decrypt add + balebuff *bytes.Buffer + seedrand *rand.Rand +} + +func NewTeaCipher(key []byte) *teaCipher { + if len(key) != 16 { + return nil + } + cipher := &teaCipher{ + balebuff: bytes.NewBuffer(nil), + } + for i := 0; i < 4; i++ { + cipher.keys[i] = binary.BigEndian.Uint32(key[i*4:]) + } + cipher.seedrand = rand.New(rand.NewSource(time.Now().UnixNano())) + return cipher +} + +func (c *teaCipher) Encrypt(value []byte) []byte { + c.balebuff.Reset() + vl := len(value) + filln := (8 - (vl + 2)) % 8 + if filln < 0 { + filln += 2 + 8 + } else { + filln += 2 + } + bindex := filln + 1 + if bindex <= 0 { + return nil + } + rands := make([]byte, bindex) + for i := 1; i < bindex; i++ { + rands[i] = byte((c.seedrand.Intn(236) + 1)) + } + rands[0] = byte((filln - 2) | fillnor) + c.balebuff.Write(rands) + c.balebuff.Write(value) + c.balebuff.Write([]byte{00, 00, 00, 00, 00, 00, 00}) + vl = c.balebuff.Len() + c.value = c.balebuff.Bytes() + c.balebuff.Reset() + for i := 0; i < vl; i += 8 { + c.xor = xor(c.value[i:i+8], c.fxor[0:8]) + c.ubyte32[0] = binary.BigEndian.Uint32(c.xor[0:4]) + c.ubyte32[1] = binary.BigEndian.Uint32(c.xor[4:8]) + c.encipher() + c.fxor = xor(c.byte8[0:8], c.lxor[0:8]) + c.balebuff.Write(c.fxor[0:8]) + c.lxor = c.xor + + } + return c.balebuff.Bytes() +} + +func (c *teaCipher) Decrypt(value []byte) []byte { + vl := len(value) + if vl <= 0 || (vl%8) != 0 { + return nil + } + c.balebuff.Reset() + c.ubyte32[0] = binary.BigEndian.Uint32(value[0:4]) + c.ubyte32[1] = binary.BigEndian.Uint32(value[4:8]) + c.decipher() + copy(c.lxor[0:8], value[0:8]) + c.fxor = c.byte8 + pos := int((c.byte8[0] & 0x7) + 2) + c.balebuff.Write(c.byte8[0:8]) + for i := 8; i < vl; i += 8 { + c.xor = xor(value[i:i+8], c.fxor[0:8]) + c.ubyte32[0] = binary.BigEndian.Uint32(c.xor[0:4]) + c.ubyte32[1] = binary.BigEndian.Uint32(c.xor[4:8]) + c.decipher() + c.nxor = xor(c.byte8[0:8], c.lxor[0:8]) + c.balebuff.Write(c.nxor[0:8]) + c.fxor = xor(c.nxor[0:8], c.lxor[0:8]) + copy(c.lxor[0:8], value[i:i+8]) + } + pos++ + c.value = c.balebuff.Bytes() + nl := c.balebuff.Len() + if pos >= c.balebuff.Len() || (nl-7) <= pos { + return nil + } + return c.value[pos : nl-7] +} + +func (c *teaCipher) encipher() { + sum := delta + for i := 0x10; i > 0; i-- { + c.ubyte32[0] += ((c.ubyte32[1] << 4 & 0xFFFFFFF0) + c.keys[0]) ^ (c.ubyte32[1] + sum) ^ ((c.ubyte32[1] >> 5 & 0x07ffffff) + c.keys[1]) + c.ubyte32[1] += ((c.ubyte32[0] << 4 & 0xFFFFFFF0) + c.keys[2]) ^ (c.ubyte32[0] + sum) ^ ((c.ubyte32[0] >> 5 & 0x07ffffff) + c.keys[3]) + sum += delta + } + binary.BigEndian.PutUint32(c.byte8[0:4], c.ubyte32[0]) + binary.BigEndian.PutUint32(c.byte8[4:8], c.ubyte32[1]) +} + +func (c *teaCipher) decipher() { + sum := delta + sum = (sum << 4) & 0xffffffff + + for i := 0x10; i > 0; i-- { + c.ubyte32[1] -= (((c.ubyte32[0] << 4 & 0xFFFFFFF0) + c.keys[2]) ^ (c.ubyte32[0] + sum) ^ ((c.ubyte32[0] >> 5 & 0x07ffffff) + c.keys[3])) + c.ubyte32[1] &= 0xffffffff + c.ubyte32[0] -= (((c.ubyte32[1] << 4 & 0xFFFFFFF0) + c.keys[0]) ^ (c.ubyte32[1] + sum) ^ ((c.ubyte32[1] >> 5 & 0x07ffffff) + c.keys[1])) + c.ubyte32[0] &= 0xffffffff + sum -= delta + } + binary.BigEndian.PutUint32(c.byte8[0:4], c.ubyte32[0]) + binary.BigEndian.PutUint32(c.byte8[4:8], c.ubyte32[1]) +} + +func xor(a, b []byte) (bts [8]byte) { + l := len(a) + for i := 0; i < l; i += 4 { + binary.BigEndian.PutUint32(bts[i:i+4], binary.BigEndian.Uint32(a[i:i+4])^binary.BigEndian.Uint32(b[i:i+4])) + } + return bts +} diff --git a/binary/utils.go b/binary/utils.go new file mode 100644 index 00000000..3f80e7b9 --- /dev/null +++ b/binary/utils.go @@ -0,0 +1,77 @@ +package binary + +import ( + "bytes" + "compress/zlib" + "crypto/rand" + binary2 "encoding/binary" + "encoding/hex" + "fmt" + "io" + "math/big" + "strings" +) + +func ZlibUncompress(src []byte) []byte { + b := bytes.NewReader(src) + var out bytes.Buffer + r, _ := zlib.NewReader(b) + io.Copy(&out, r) + return out.Bytes() +} + +func RandomString(len int) string { + var res string + var str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" + b := bytes.NewBufferString(str) + length := b.Len() + bigInt := big.NewInt(int64(length)) + for i := 0; i < len; i++ { + randomInt, _ := rand.Int(rand.Reader, bigInt) + res += string(str[randomInt.Int64()]) + } + return res +} + +func CalculateImageResourceId(md5 []byte) string { + return strings.ToUpper(fmt.Sprintf( + "{%s-%s-%s-%s-%s}.png", + hex.EncodeToString(md5[0:4]), hex.EncodeToString(md5[4:6]), hex.EncodeToString(md5[6:8]), + hex.EncodeToString(md5[8:10]), hex.EncodeToString(md5[10:]), + )) +} + +func ToIPV4Address(arr []byte) string { + if len(arr) != 4 { + return "" + } + return fmt.Sprintf("%d.%d.%d.%d", arr[0], arr[1], arr[2], arr[3]) +} + +func UInt32ToIPV4Address(i uint32) string { + addr := make([]byte, 4) + binary2.LittleEndian.PutUint32(addr, i) + return ToIPV4Address(addr) +} + +func ToChunkedBytesF(b []byte, size int, f func([]byte)) { + r := NewReader(b) + for r.Len() >= size { + f(r.ReadBytes(size)) + } + if r.Len() > 0 { + f(r.ReadAvailable()) + } +} + +func ToBytes(i interface{}) []byte { + return NewWriterF(func(w *Writer) { + // TODO: more types + switch t := i.(type) { + case int16: + w.WriteUInt16(uint16(t)) + case int32: + w.WriteUInt32(uint32(t)) + } + }) +} diff --git a/binary/writer.go b/binary/writer.go new file mode 100644 index 00000000..103eeb4e --- /dev/null +++ b/binary/writer.go @@ -0,0 +1,112 @@ +package binary + +import ( + "bytes" + "encoding/binary" +) + +type Writer struct { + buf *bytes.Buffer +} + +func NewWriter() *Writer { + return &Writer{buf: new(bytes.Buffer)} +} + +func NewWriterF(f func(writer *Writer)) []byte { + w := NewWriter() + f(w) + return w.Bytes() +} + +func (w *Writer) Write(b []byte) { + w.buf.Write(b) +} + +func (w *Writer) WriteByte(b byte) { + w.buf.WriteByte(b) +} + +func (w *Writer) WriteUInt16(v uint16) { + b := make([]byte, 2) + binary.BigEndian.PutUint16(b, v) + w.Write(b) +} + +func (w *Writer) WriteUInt32(v uint32) { + b := make([]byte, 4) + binary.BigEndian.PutUint32(b, v) + w.Write(b) +} + +func (w *Writer) WriteUInt64(v uint64) { + b := make([]byte, 8) + binary.BigEndian.PutUint64(b, v) + w.Write(b) +} + +func (w *Writer) WriteString(v string) { + payload := []byte(v) + w.WriteUInt32(uint32(len(payload) + 4)) + w.Write(payload) +} + +func (w *Writer) WriteStringShort(v string) { + w.WriteTlv([]byte(v)) +} + +func (w *Writer) WriteBool(b bool) { + if b { + w.WriteByte(0x01) + } else { + w.WriteByte(0x00) + } +} + +func (w *Writer) EncryptAndWrite(key []byte, data []byte) { + tea := NewTeaCipher(key) + ed := tea.Encrypt(data) + w.Write(ed) +} + +func (w *Writer) WriteIntLvPacket(offset int, f func(writer *Writer)) { + t := NewWriter() + f(t) + data := t.Bytes() + w.WriteUInt32(uint32(len(data) + offset)) + w.Write(data) +} + +func (w *Writer) WriteUniPacket(commandName string, sessionId, extraData, body []byte) { + w.WriteIntLvPacket(4, func(w *Writer) { + w.WriteString(commandName) + w.WriteUInt32(8) + w.Write(sessionId) + if len(extraData) == 0 { + w.WriteUInt32(0x04) + } else { + w.WriteUInt32(uint32(len(extraData) + 4)) + w.Write(extraData) + } + }) + w.WriteIntLvPacket(4, func(w *Writer) { + w.Write(body) + }) +} + +func (w *Writer) WriteTlv(data []byte) { + w.WriteUInt16(uint16(len(data))) + w.Write(data) +} + +func (w *Writer) WriteTlvLimitedSize(data []byte, limit int) { + if len(data) <= limit { + w.WriteTlv(data) + return + } + w.WriteTlv(data[:limit]) +} + +func (w *Writer) Bytes() []byte { + return w.buf.Bytes() +} diff --git a/client/builders.go b/client/builders.go new file mode 100644 index 00000000..25316692 --- /dev/null +++ b/client/builders.go @@ -0,0 +1,418 @@ +package client + +import ( + "crypto/md5" + "github.com/Mrs4s/MiraiGo/binary" + "github.com/Mrs4s/MiraiGo/binary/jce" + "github.com/Mrs4s/MiraiGo/client/pb" + "github.com/Mrs4s/MiraiGo/client/pb/msg" + "github.com/Mrs4s/MiraiGo/message" + "github.com/Mrs4s/MiraiGo/protocol/crypto" + "github.com/Mrs4s/MiraiGo/protocol/packets" + "github.com/Mrs4s/MiraiGo/protocol/tlv" + "github.com/golang/protobuf/proto" + "math/rand" + "strconv" +) + +func (c *QQClient) buildLoginPacket() (uint16, []byte) { + seq := c.nextSeq() + req := packets.BuildOicqRequestPacket(c.Uin, 0x0810, crypto.ECDH, c.RandomKey, func(w *binary.Writer) { + w.WriteUInt16(9) + w.WriteUInt16(17) + + w.Write(tlv.T18(16, uint32(c.Uin))) + w.Write(tlv.T1(uint32(c.Uin), SystemDeviceInfo.IpAddress)) + w.Write(tlv.T106(uint32(c.Uin), 0, c.PasswordMd5, true, SystemDeviceInfo.Guid, SystemDeviceInfo.TgtgtKey)) + w.Write(tlv.T116(184024956, 0x10400)) + w.Write(tlv.T100()) + w.Write(tlv.T107(0)) + w.Write(tlv.T142("com.tencent.mobileqq")) + w.Write(tlv.T144( + SystemDeviceInfo.AndroidId, + SystemDeviceInfo.GenDeviceInfoData(), + SystemDeviceInfo.OSType, + SystemDeviceInfo.Version.Release, + SystemDeviceInfo.SimInfo, + SystemDeviceInfo.APN, + false, true, false, tlv.GuidFlag(), + SystemDeviceInfo.Model, + SystemDeviceInfo.Guid, + SystemDeviceInfo.Brand, + SystemDeviceInfo.TgtgtKey, + )) + + w.Write(tlv.T145(SystemDeviceInfo.Guid)) + w.Write(tlv.T147(16, []byte("8.2.7"), []byte{0xA6, 0xB7, 0x45, 0xBF, 0x24, 0xA2, 0xC2, 0x77, 0x52, 0x77, 0x16, 0xF6, 0xF3, 0x6E, 0xB6, 0x8D})) + /* + if (miscBitMap & 0x80) != 0{ + w.Write(tlv.T166(1)) + } + */ + w.Write(tlv.T154(seq)) + w.Write(tlv.T141(SystemDeviceInfo.SimInfo, SystemDeviceInfo.APN)) + w.Write(tlv.T8(2052)) + w.Write(tlv.T511([]string{ + "tenpay.com", "openmobile.qq.com", "docs.qq.com", "connect.qq.com", + "qzone.qq.com", "vip.qq.com", "qun.qq.com", "game.qq.com", "qqweb.qq.com", + "office.qq.com", "ti.qq.com", "mail.qq.com", "qzone.com", "mma.qq.com", + })) + + w.Write(tlv.T187(SystemDeviceInfo.MacAddress)) + w.Write(tlv.T188(SystemDeviceInfo.AndroidId)) + if len(SystemDeviceInfo.IMSIMd5) != 0 { + w.Write(tlv.T194(SystemDeviceInfo.IMSIMd5)) + } + w.Write(tlv.T191(0x82)) + if len(SystemDeviceInfo.WifiBSSID) != 0 && len(SystemDeviceInfo.WifiSSID) != 0 { + w.Write(tlv.T202(SystemDeviceInfo.WifiBSSID, SystemDeviceInfo.WifiSSID)) + } + w.Write(tlv.T177()) + w.Write(tlv.T516()) + w.Write(tlv.T521()) + w.Write(tlv.T525(tlv.T536([]byte{0x01, 0x00}))) + }) + sso := packets.BuildSsoPacket(seq, "wtlogin.login", SystemDeviceInfo.IMEI, []byte{}, c.OutGoingPacketSessionId, req, c.ksid) + packet := packets.BuildLoginPacket(c.Uin, 2, make([]byte, 16), sso, []byte{}) + return seq, packet +} + +func (c *QQClient) buildCaptchaPacket(result string, sign []byte) (uint16, []byte) { + seq := c.nextSeq() + req := packets.BuildOicqRequestPacket(c.Uin, 0x810, crypto.ECDH, c.RandomKey, func(w *binary.Writer) { + w.WriteUInt16(2) // sub command + w.WriteUInt16(4) + w.Write(tlv.T2(result, sign)) + w.Write(tlv.T8(2052)) + w.Write(tlv.T104(c.t104)) + w.Write(tlv.T116(150470524, 66560)) + }) + sso := packets.BuildSsoPacket(seq, "wtlogin.login", SystemDeviceInfo.IMEI, []byte{}, c.OutGoingPacketSessionId, req, c.ksid) + packet := packets.BuildLoginPacket(c.Uin, 2, make([]byte, 16), sso, []byte{}) + return seq, packet +} + +func (c *QQClient) buildClientRegisterPacket() (uint16, []byte) { + seq := c.nextSeq() + svc := &jce.SvcReqRegister{ + ConnType: 0, + Uin: c.Uin, + Bid: 1 | 2 | 4, + Status: 11, + KickPC: 0, + KickWeak: 0, + IOSVersion: int64(SystemDeviceInfo.Version.Sdk), + NetType: 1, + RegType: 0, + Guid: SystemDeviceInfo.Guid, + IsSetStatus: 0, + LocaleId: 2052, + DevName: string(SystemDeviceInfo.Model), + DevType: string(SystemDeviceInfo.Model), + OSVer: string(SystemDeviceInfo.Version.Release), + OpenPush: 1, + LargeSeq: 1551, + OldSSOIp: 0, + NewSSOIp: 31806887127679168, + ChannelNo: "", + CPID: 0, + VendorName: "MIUI", + VendorOSName: "ONEPLUS A5000_23_17", + B769: []byte{0x0A, 0x04, 0x08, 0x2E, 0x10, 0x00, 0x0A, 0x05, 0x08, 0x9B, 0x02, 0x10, 0x00}, + SetMute: 0, + } + b := append([]byte{0x0A}, svc.ToBytes()...) + b = append(b, 0x0B) + buf := &jce.RequestDataVersion3{ + Map: map[string][]byte{"SvcReqRegister": b}, + } + pkt := &jce.RequestPacket{ + IVersion: 3, + SServantName: "PushService", + SFuncName: "SvcReqRegister", + SBuffer: buf.ToBytes(), + Context: make(map[string]string), + Status: make(map[string]string), + } + sso := packets.BuildSsoPacket(seq, "StatSvc.register", SystemDeviceInfo.IMEI, c.sigInfo.tgt, c.OutGoingPacketSessionId, pkt.ToBytes(), c.ksid) + packet := packets.BuildLoginPacket(c.Uin, 1, c.sigInfo.d2Key, sso, c.sigInfo.d2) + return seq, packet +} + +func (c *QQClient) buildPushResponsePacket(t int32, pktSeq int64, jceBuf []byte) (uint16, []byte) { + seq := c.nextSeq() + req := jce.NewJceWriter() + req.WriteInt32(t, 1) + req.WriteInt64(pktSeq, 2) + req.WriteBytes(jceBuf, 3) + b := append([]byte{0x0A}, req.Bytes()...) + b = append(b, 0x0B) + buf := &jce.RequestDataVersion3{ + Map: map[string][]byte{"PushResp": b}, + } + pkt := &jce.RequestPacket{ + IVersion: 3, + SServantName: "QQService.ConfigPushSvc.MainServant", + SFuncName: "PushResp", + SBuffer: buf.ToBytes(), + Context: make(map[string]string), + Status: make(map[string]string), + } + packet := packets.BuildUniPacket(c.Uin, seq, "ConfigPushSvc.PushResp", 1, c.OutGoingPacketSessionId, []byte{}, c.sigInfo.d2Key, pkt.ToBytes()) + return seq, packet +} + +func (c *QQClient) buildFriendGroupListRequestPacket(friendStartIndex, friendListCount, groupStartIndex, groupListCount int16) (uint16, []byte) { + seq := c.nextSeq() + d50, _ := proto.Marshal(&pb.D50ReqBody{ + Appid: 1002, + ReqMusicSwitch: 1, + ReqMutualmarkAlienation: 1, + ReqKsingSwitch: 1, + ReqMutualmarkLbsshare: 1, + }) + req := &jce.FriendListRequest{ + Reqtype: 3, + IfReflush: func() byte { // fuck golang + if friendStartIndex <= 0 { + return 0 + } + return 1 + }(), + Uin: int64(c.Uin), + StartIndex: friendStartIndex, + FriendCount: friendListCount, + GroupId: 0, + IfGetGroupInfo: func() byte { + if groupListCount <= 0 { + return 0 + } + return 1 + }(), + GroupStartIndex: byte(groupStartIndex), + GroupCount: byte(groupListCount), + IfGetMSFGroup: 0, + IfShowTermType: 1, + Version: 27, + UinList: nil, + AppType: 0, + IfGetDOVId: 0, + IfGetBothFlag: 0, + D50: d50, + D6B: []byte{}, + SnsTypeList: []int64{13580, 13581, 13582}, + } + b := append([]byte{0x0A}, req.ToBytes()...) + b = append(b, 0x0B) + buf := &jce.RequestDataVersion3{ + Map: map[string][]byte{"FL": b}, + } + pkt := &jce.RequestPacket{ + IVersion: 3, + CPacketType: 0x003, + IRequestId: 1921334514, + SServantName: "mqq.IMService.FriendListServiceServantObj", + SFuncName: "GetFriendListReq", + SBuffer: buf.ToBytes(), + Context: make(map[string]string), + Status: make(map[string]string), + } + packet := packets.BuildUniPacket(c.Uin, seq, "friendlist.getFriendGroupList", 1, c.OutGoingPacketSessionId, []byte{}, c.sigInfo.d2Key, pkt.ToBytes()) + return seq, packet +} + +func (c *QQClient) buildGroupListRequestPacket() (uint16, []byte) { + seq := c.nextSeq() + req := &jce.TroopListRequest{ + Uin: c.Uin, + GetMSFMsgFlag: 1, + Cookies: []byte{}, + GroupInfo: []int64{}, + GroupFlagExt: 1, + Version: 7, + CompanyId: 0, + VersionNum: 1, + GetLongGroupName: 1, + } + b := append([]byte{0x0A}, req.ToBytes()...) + b = append(b, 0x0B) + buf := &jce.RequestDataVersion3{ + Map: map[string][]byte{"GetTroopListReqV2Simplify": b}, + } + pkt := &jce.RequestPacket{ + IVersion: 3, + CPacketType: 0x00, + IRequestId: c.nextPacketSeq(), + SServantName: "mqq.IMService.FriendListServiceServantObj", + SFuncName: "GetTroopListReqV2Simplify", + SBuffer: buf.ToBytes(), + Context: make(map[string]string), + Status: make(map[string]string), + } + packet := packets.BuildUniPacket(c.Uin, seq, "friendlist.GetTroopListReqV2", 1, c.OutGoingPacketSessionId, []byte{}, c.sigInfo.d2Key, pkt.ToBytes()) + return seq, packet +} + +func (c *QQClient) buildGroupMemberListRequestPacket(groupUin, groupCode, nextUin int64) (uint16, []byte) { + seq := c.nextSeq() + req := &jce.TroopMemberListRequest{ + Uin: c.Uin, + GroupCode: groupCode, + NextUin: nextUin, + GroupUin: groupUin, + Version: 2, + } + b := append([]byte{0x0A}, req.ToBytes()...) + b = append(b, 0x0B) + buf := &jce.RequestDataVersion3{ + Map: map[string][]byte{"GTML": b}, + } + pkt := &jce.RequestPacket{ + IVersion: 3, + IRequestId: c.nextPacketSeq(), + SServantName: "mqq.IMService.FriendListServiceServantObj", + SFuncName: "GetTroopMemberListReq", + SBuffer: buf.ToBytes(), + Context: make(map[string]string), + Status: make(map[string]string), + } + packet := packets.BuildUniPacket(c.Uin, seq, "friendlist.GetTroopMemberListReq", 1, c.OutGoingPacketSessionId, []byte{}, c.sigInfo.d2Key, pkt.ToBytes()) + return seq, packet +} + +func (c *QQClient) buildGetMessageRequestPacket(flag msg.SyncFlag, msgTime int64) (uint16, []byte) { + seq := c.nextSeq() + cook := c.syncCookie + if cook == nil { + cook, _ = proto.Marshal(&msg.SyncCookie{ + Time: msgTime, + Ran1: 758330138, + Ran2: 2480149246, + Const1: 1167238020, + Const2: 3913056418, + Const3: 0x1D, + }) + } + req := &msg.GetMessageRequest{ + SyncFlag: flag, + SyncCookie: cook, + LatestRambleNumber: 20, + OtherRambleNumber: 3, + OnlineSyncFlag: 1, + ContextFlag: 1, + MsgReqType: 1, + PubaccountCookie: []byte{}, + MsgCtrlBuf: []byte{}, + ServerBuf: []byte{}, + } + payload, _ := proto.Marshal(req) + packet := packets.BuildUniPacket(c.Uin, seq, "MessageSvc.PbGetMsg", 1, c.OutGoingPacketSessionId, []byte{}, c.sigInfo.d2Key, payload) + return seq, packet +} + +func (c *QQClient) buildStopGetMessagePacket(msgTime int64) []byte { + _, pkt := c.buildGetMessageRequestPacket(msg.SyncFlag_STOP, msgTime) + return pkt +} + +func (c *QQClient) buildDeleteMessageRequestPacket(msg []*pb.MessageItem) (uint16, []byte) { + seq := c.nextSeq() + req := &pb.DeleteMessageRequest{Items: msg} + payload, _ := proto.Marshal(req) + packet := packets.BuildUniPacket(c.Uin, seq, "MessageSvc.PbDeleteMsg", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload) + return seq, packet +} + +func (c *QQClient) buildGroupSendingPacket(groupCode int64, m *message.SendingMessage) (uint16, []byte) { + seq := c.nextSeq() + req := &msg.SendMessageRequest{ + RoutingHead: &msg.RoutingHead{Grp: &msg.Grp{GroupCode: groupCode}}, + ContentHead: &msg.ContentHead{PkgNum: 1}, + MsgBody: &msg.MessageBody{ + RichText: &msg.RichText{ + Elems: message.ToProtoElems(m.Elements), + }, + }, + MsgSeq: c.nextMessageSeq(), + MsgRand: int32(rand.Uint32()), + SyncCookie: EmptyBytes, + MsgVia: 1, + MsgCtrl: nil, + } + payload, _ := proto.Marshal(req) + packet := packets.BuildUniPacket(c.Uin, seq, "MessageSvc.PbSendMsg", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload) + return seq, packet +} + +func (c *QQClient) buildGroupImageStorePacket(groupCode int64, md5 [16]byte, size int32) (uint16, []byte) { + seq := c.nextSeq() + name := binary.RandomString(16) + ".gif" + req := &pb.D388ReqBody{ + NetType: 3, + Subcmd: 1, + MsgTryupImgReq: []*pb.TryUpImgReq{ + { + GroupCode: groupCode, + SrcUin: c.Uin, + FileMd5: md5[:], + FileSize: int64(size), + FileName: name, + SrcTerm: 5, + PlatformType: 9, + BuType: 1, + PicType: 1000, + BuildVer: "8.2.7.4410", + AppPicType: 1006, + FileIndex: EmptyBytes, + TransferUrl: EmptyBytes, + }, + }, + Extension: EmptyBytes, + } + payload, _ := proto.Marshal(req) + packet := packets.BuildUniPacket(c.Uin, seq, "ImgStore.GroupPicUp", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload) + return seq, packet +} + +func (c *QQClient) buildImageUploadPacket(data, updKey []byte, commandId int32, fmd5 [16]byte) (r [][]byte) { + offset := 0 + binary.ToChunkedBytesF(data, 8192*8, func(chunked []byte) { + w := binary.NewWriter() + cmd5 := md5.Sum(chunked) + head, _ := proto.Marshal(&pb.ReqDataHighwayHead{ + MsgBasehead: &pb.DataHighwayHead{ + Version: 1, + Uin: strconv.FormatInt(c.Uin, 10), + Command: "PicUp.DataUp", + Seq: func() int32 { + if commandId == 2 { + return c.nextGroupDataTransSeq() + } + return c.nextGroupDataTransSeq() + }(), + Appid: 537062409, + Dataflag: 4096, + CommandId: commandId, + LocaleId: 2052, + }, + MsgSeghead: &pb.SegHead{ + Filesize: int64(len(data)), + Dataoffset: int64(offset), + Datalength: int32(len(chunked)), + Serviceticket: updKey, + Md5: cmd5[:], + FileMd5: fmd5[:], + }, + ReqExtendinfo: EmptyBytes, + }) + offset += len(chunked) + w.WriteByte(40) + w.WriteUInt32(uint32(len(head))) + w.WriteUInt32(uint32(len(chunked))) + w.Write(head) + w.Write(chunked) + w.WriteByte(41) + r = append(r, w.Bytes()) + }) + return +} diff --git a/client/client.go b/client/client.go new file mode 100644 index 00000000..99cf1b07 --- /dev/null +++ b/client/client.go @@ -0,0 +1,409 @@ +package client + +import ( + "crypto/md5" + "errors" + "fmt" + "github.com/Mrs4s/MiraiGo/binary" + "github.com/Mrs4s/MiraiGo/client/pb" + "github.com/Mrs4s/MiraiGo/message" + "github.com/Mrs4s/MiraiGo/protocol/packets" + "github.com/golang/protobuf/proto" + "log" + "math/rand" + "net" + "strconv" + "sync/atomic" + "time" +) + +type QQClient struct { + Uin int64 + PasswordMd5 [16]byte + + Nickname string + Age uint16 + Gender uint16 + FriendList []*FriendInfo + GroupList []*GroupInfo + + SequenceId uint16 + OutGoingPacketSessionId []byte + RandomKey []byte + Conn net.Conn + + decoders map[string]func(*QQClient, []byte) (interface{}, error) + handlers map[uint16]func(interface{}, error) + + syncCookie []byte + pubAccountCookie []byte + msgCtrlBuf []byte + ksid []byte + t104 []byte + t150 []byte + t149 []byte + t528 []byte + t530 []byte + rollbackSig []byte + timeDiff int64 + sigInfo *loginSigInfo + pwdFlag bool + running bool + + lastMessageSeq int32 + requestPacketRequestId int32 + messageSeq int32 + groupDataTransSeq int32 + + privateMessageHandlers []func(*QQClient, *message.PrivateMessage) + groupMessageHandlers []func(*QQClient, *message.GroupMessage) +} + +type loginSigInfo struct { + loginBitmap uint64 + tgt []byte + tgtKey []byte + + userStKey []byte + userStWebSig []byte + sKey []byte + d2 []byte + d2Key []byte + wtSessionTicketKey []byte + deviceToken []byte +} + +func init() { + rand.Seed(time.Now().UTC().UnixNano()) +} + +// NewClient create new qq client +func NewClient(uin int64, password string) *QQClient { + cli := &QQClient{ + Uin: uin, + PasswordMd5: md5.Sum([]byte(password)), + SequenceId: 0x3635, + RandomKey: make([]byte, 16), + OutGoingPacketSessionId: []byte{0x02, 0xB0, 0x5B, 0x8B}, + decoders: map[string]func(*QQClient, []byte) (interface{}, error){ + "wtlogin.login": decodeLoginResponse, + "StatSvc.register": decodeClientRegisterResponse, + "MessageSvc.PushNotify": decodeSvcNotify, + "OnlinePush.PbPushGroupMsg": decodeGroupMessagePacket, + "ConfigPushSvc.PushReq": decodePushReqPacket, + "MessageSvc.PbGetMsg": decodeMessageSvcPacket, + "friendlist.getFriendGroupList": decodeFriendGroupListResponse, + "friendlist.GetTroopListReqV2": decodeGroupListResponse, + "friendlist.GetTroopMemberListReq": decodeGroupMemberListResponse, + "ImgStore.GroupPicUp": decodeGroupImageStoreResponse, + }, + handlers: map[uint16]func(interface{}, error){}, + sigInfo: &loginSigInfo{}, + requestPacketRequestId: 1921334513, + messageSeq: 22911, + ksid: []byte("|454001228437590|A8.2.7.27f6ea96"), + } + rand.Read(cli.RandomKey) + return cli +} + +// Login send login request +func (c *QQClient) Login() (*LoginResponse, error) { + if c.running { + return nil, ErrAlreadyRunning + } + conn, err := net.Dial("tcp", "125.94.60.146:80") //TODO: more servers + if err != nil { + return nil, err + } + c.Conn = conn + c.running = true + go c.loop() + seq, packet := c.buildLoginPacket() + rsp, err := c.sendAndWait(seq, packet) + if err != nil { + return nil, err + } + l := rsp.(LoginResponse) + if l.Success { + c.registerClient() + go c.heartbeat() + } + return &l, nil +} + +// SubmitCaptcha send captcha to server +func (c *QQClient) SubmitCaptcha(result string, sign []byte) (*LoginResponse, error) { + seq, packet := c.buildCaptchaPacket(result, sign) + rsp, err := c.sendAndWait(seq, packet) + if err != nil { + return nil, err + } + l := rsp.(LoginResponse) + if l.Success { + c.registerClient() + go c.heartbeat() + } + return &l, nil +} + +// ReloadFriendList refresh QQClient.FriendList field via GetFriendList() +func (c *QQClient) ReloadFriendList() error { + rsp, err := c.GetFriendList() + if err != nil { + return err + } + c.FriendList = rsp.List + return nil +} + +// GetFriendList request friend list +func (c *QQClient) GetFriendList() (*FriendListResponse, error) { + var curFriendCount = 0 + r := &FriendListResponse{} + for { + rsp, err := c.sendAndWait(c.buildFriendGroupListRequestPacket(int16(curFriendCount), 150, 0, 0)) + if err != nil { + return nil, err + } + list := rsp.(FriendListResponse) + r.TotalCount = list.TotalCount + r.List = append(r.List, list.List...) + curFriendCount += len(list.List) + if int32(curFriendCount) >= r.TotalCount { + break + } + } + return r, nil +} + +func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage) { + _, pkt := c.buildGroupSendingPacket(groupCode, m) + c.send(pkt) +} + +func (c *QQClient) UploadGroupImage(groupCode int64, img []byte) (*message.GroupImageElement, error) { + h := md5.Sum(img) + seq, pkt := c.buildGroupImageStorePacket(groupCode, h, int32(len(img))) + r, err := c.sendAndWait(seq, pkt) + if err != nil { + return nil, err + } + rsp := r.(groupImageUploadResponse) + if rsp.ResultCode != 0 { + return nil, errors.New(rsp.Message) + } + if rsp.IsExists { + return message.NewGroupImage(binary.CalculateImageResourceId(h[:]), h[:]), nil + } + for i, ip := range rsp.UploadIp { + updServer := binary.UInt32ToIPV4Address(uint32(ip)) + conn, err := net.DialTimeout("tcp", updServer+":"+strconv.FormatInt(int64(rsp.UploadPort[i]), 10), time.Second*5) + if err != nil { + continue + } + if conn.SetDeadline(time.Now().Add(time.Second*10)) != nil { + _ = conn.Close() + continue + } + pkt := c.buildImageUploadPacket(img, rsp.UploadKey, 2, h) + for _, p := range pkt { + _, err = conn.Write(p) + } + if err != nil { + continue + } + r := binary.NewNetworkReader(conn) + r.ReadByte() + hl := r.ReadInt32() + r.ReadBytes(4) + payload := r.ReadBytes(int(hl)) + _ = conn.Close() + rsp := pb.RspDataHighwayHead{} + if proto.Unmarshal(payload, &rsp) != nil { + continue + } + if rsp.ErrorCode != 0 { + return nil, errors.New("upload failed") + } + return message.NewGroupImage(binary.CalculateImageResourceId(h[:]), h[:]), nil + } + return nil, errors.New("upload failed") +} + +func (c *QQClient) ReloadGroupList() error { + list, err := c.GetGroupList() + if err != nil { + return err + } + c.GroupList = list + return nil +} + +func (c *QQClient) GetGroupList() ([]*GroupInfo, error) { + rsp, err := c.sendAndWait(c.buildGroupListRequestPacket()) + if err != nil { + return nil, err + } + r := rsp.([]*GroupInfo) + for _, group := range r { + m, err := c.GetGroupMembers(group) + if err != nil { + continue + } + group.Members = m + } + return r, nil +} + +func (c *QQClient) GetGroupMembers(group *GroupInfo) ([]GroupMemberInfo, error) { + var nextUin int64 + var list []GroupMemberInfo + for { + data, err := c.sendAndWait(c.buildGroupMemberListRequestPacket(group.Uin, group.Code, nextUin)) + if err != nil { + return nil, err + } + rsp := data.(groupMemberListResponse) + nextUin = rsp.NextUin + list = append(list, rsp.list...) + if nextUin == 0 { + return list, nil + } + } +} + +func (c *QQClient) FindFriend(uin int64) *FriendInfo { + for _, t := range c.FriendList { + f := t + if f.Uin == uin { + return f + } + } + return nil +} + +func (c *QQClient) FindGroup(uin int64) *GroupInfo { + for _, g := range c.GroupList { + f := g + if f.Uin == uin { + return f + } + } + return nil +} + +func (g *GroupInfo) FindMember(uin int64) *GroupMemberInfo { + for _, m := range g.Members { + f := m + if f.Uin == uin { + return &f + } + } + return nil +} + +func (c *QQClient) registerClient() { + seq, packet := c.buildClientRegisterPacket() + _, _ = c.sendAndWait(seq, packet) +} + +func (c *QQClient) nextSeq() uint16 { + c.SequenceId++ + c.SequenceId &= 0x7FFF + if c.SequenceId == 0 { + c.SequenceId++ + } + return c.SequenceId +} + +func (c *QQClient) nextPacketSeq() int32 { + s := atomic.LoadInt32(&c.requestPacketRequestId) + atomic.AddInt32(&c.requestPacketRequestId, 2) + return s +} + +func (c *QQClient) nextMessageSeq() int32 { + s := atomic.LoadInt32(&c.messageSeq) + atomic.AddInt32(&c.messageSeq, 2) + return s +} + +func (c *QQClient) nextGroupDataTransSeq() int32 { + s := atomic.LoadInt32(&c.groupDataTransSeq) + atomic.AddInt32(&c.groupDataTransSeq, 2) + return s +} + +func (c *QQClient) send(pkt []byte) error { + _, err := c.Conn.Write(pkt) + return err +} + +func (c *QQClient) sendAndWait(seq uint16, pkt []byte) (interface{}, error) { + type T struct { + Response interface{} + Error error + } + _, err := c.Conn.Write(pkt) + if err != nil { + return nil, err + } + ch := make(chan T) + c.handlers[seq] = func(i interface{}, err error) { + ch <- T{ + Response: i, + Error: err, + } + } + rsp := <-ch + return rsp.Response, rsp.Error +} + +func (c *QQClient) loop() { + reader := binary.NewNetworkReader(c.Conn) + for c.running { + data := reader.ReadBytes(int(reader.ReadInt32()) - 4) + pkt, err := packets.ParseIncomingPacket(data, c.sigInfo.d2Key) + if err != nil { + log.Println("parse incoming packet error: " + err.Error()) + continue + } + payload := pkt.Payload + if pkt.Flag2 == 2 { + payload, err = pkt.DecryptPayload(c.RandomKey) + if err != nil { + continue + } + } + fmt.Println(pkt.CommandName) + go func() { + decoder, ok := c.decoders[pkt.CommandName] + if !ok { + if f, ok := c.handlers[pkt.SequenceId]; ok { + delete(c.handlers, pkt.SequenceId) + f(nil, nil) + } + return + } + rsp, err := decoder(c, payload) + if err != nil { + log.Println("decode", pkt.CommandName, "error:", err) + } + if f, ok := c.handlers[pkt.SequenceId]; ok { + delete(c.handlers, pkt.SequenceId) + f(rsp, err) + } + }() + } +} + +func (c *QQClient) heartbeat() { + for c.running { + time.Sleep(time.Second * 30) + seq := c.nextSeq() + sso := packets.BuildSsoPacket(seq, "Heartbeat.Alive", SystemDeviceInfo.IMEI, []byte{}, c.OutGoingPacketSessionId, []byte{}, c.ksid) + packet := packets.BuildLoginPacket(c.Uin, 0, []byte{}, sso, []byte{}) + _, _ = c.sendAndWait(seq, packet) + } +} diff --git a/client/decoders.go b/client/decoders.go new file mode 100644 index 00000000..eab754cd --- /dev/null +++ b/client/decoders.go @@ -0,0 +1,282 @@ +package client + +import ( + "errors" + "github.com/Mrs4s/MiraiGo/binary" + "github.com/Mrs4s/MiraiGo/binary/jce" + "github.com/Mrs4s/MiraiGo/client/pb" + "github.com/Mrs4s/MiraiGo/client/pb/msg" + "github.com/golang/protobuf/proto" + "time" +) + +func decodeLoginResponse(c *QQClient, payload []byte) (interface{}, error) { + reader := binary.NewReader(payload) + reader.ReadUInt16() // sub command + t := reader.ReadByte() + reader.ReadUInt16() + m := reader.ReadTlvMap(2) + if t == 0 { // login success + if t150, ok := m[0x150]; ok { + c.t150 = t150 + } + if t161, ok := m[0x161]; ok { + c.decodeT161(t161) + } + c.decodeT119(m[0x119]) + return LoginResponse{ + Success: true, + }, nil + } + if t == 2 { + c.t104, _ = m[0x104] + if m.Exists(0x192) { // slider, not supported yet + return LoginResponse{ + Success: false, + Error: UnknownLoginError, + }, nil + } + if m.Exists(0x165) { // image + imgData := binary.NewReader(m[0x105]) + signLen := imgData.ReadUInt16() + imgData.ReadUInt16() + sign := imgData.ReadBytes(int(signLen)) + return LoginResponse{ + Success: false, + Error: NeedCaptcha, + CaptchaImage: imgData.ReadAvailable(), + CaptchaSign: sign, + }, nil + } else { + return LoginResponse{ + Success: false, + Error: UnknownLoginError, + }, nil + } + } // need captcha + + if t == 160 { + + } + + if t == 204 { + return LoginResponse{ + Success: false, + Error: DeviceLockError, + }, nil + } // drive lock + + if t149, ok := m[0x149]; ok { + t149r := binary.NewReader(t149) + t149r.ReadBytes(2) + t149r.ReadStringShort() // title + return LoginResponse{ + Success: false, + Error: OtherLoginError, + ErrorMessage: t149r.ReadStringShort(), + }, nil + } + + if t146, ok := m[0x146]; ok { + t146r := binary.NewReader(t146) + t146r.ReadBytes(4) // ver and code + t146r.ReadStringShort() // title + return LoginResponse{ + Success: false, + Error: OtherLoginError, + ErrorMessage: t146r.ReadStringShort(), + }, nil + } + + return nil, nil // ? +} + +func decodeClientRegisterResponse(c *QQClient, payload []byte) (interface{}, error) { + request := &jce.RequestPacket{} + request.ReadFrom(jce.NewJceReader(payload)) + data := &jce.RequestDataVersion2{} + data.ReadFrom(jce.NewJceReader(request.SBuffer)) + return nil, nil +} + +func decodePushReqPacket(c *QQClient, payload []byte) (interface{}, error) { + request := &jce.RequestPacket{} + request.ReadFrom(jce.NewJceReader(payload)) + data := &jce.RequestDataVersion2{} + data.ReadFrom(jce.NewJceReader(request.SBuffer)) + r := jce.NewJceReader(data.Map["PushReq"]["ConfigPush.PushReq"][1:]) + jceBuf := []byte{} + t := r.ReadInt32(1) + r.ReadSlice(&jceBuf, 2) + seq := r.ReadInt64(3) + _, pkt := c.buildPushResponsePacket(t, seq, jceBuf) + return nil, c.send(pkt) +} + +func decodeMessageSvcPacket(c *QQClient, payload []byte) (interface{}, error) { + rsp := msg.GetMessageResponse{} + err := proto.Unmarshal(payload, &rsp) + if err != nil { + return nil, err + } + if rsp.Result != 0 { + return nil, errors.New("message svc result unsuccessful") + } + c.syncCookie = rsp.SyncCookie + c.pubAccountCookie = rsp.PubAccountCookie + c.msgCtrlBuf = rsp.MsgCtrlBuf + if rsp.UinPairMsgs == nil { + return nil, nil + } + var delItems []*pb.MessageItem + for _, pairMsg := range rsp.UinPairMsgs { + for _, message := range pairMsg.Messages { + // delete message + delItem := &pb.MessageItem{ + FromUin: message.Head.FromUin, + ToUin: message.Head.ToUin, + MsgType: 187, + MsgSeq: message.Head.MsgSeq, + MsgUid: message.Head.MsgUid, + } + delItems = append(delItems, delItem) + + if message.Head.ToUin != c.Uin { + continue + } + if message.Body.RichText == nil || message.Body.RichText.Elems == nil { + continue + } + if c.lastMessageSeq >= message.Head.MsgSeq { + continue + } + c.lastMessageSeq = message.Head.MsgSeq + + c.dispatchFriendMessage(c.parsePrivateMessage(message)) + } + } + _, _ = c.sendAndWait(c.buildDeleteMessageRequestPacket(delItems)) + if rsp.SyncFlag != msg.SyncFlag_STOP { + seq, pkt := c.buildGetMessageRequestPacket(rsp.SyncFlag, time.Now().Unix()) + _, _ = c.sendAndWait(seq, pkt) + } + return nil, err +} + +func decodeGroupMessagePacket(c *QQClient, payload []byte) (interface{}, error) { + pkt := msg.PushMessagePacket{} + err := proto.Unmarshal(payload, &pkt) + if err != nil { + return nil, err + } + if pkt.Message.Head.FromUin == c.Uin { + return nil, nil + } + c.dispatchGroupMessage(c.parseGroupMessage(pkt.Message)) + return nil, nil +} + +func decodeSvcNotify(c *QQClient, payload []byte) (interface{}, error) { + _, pkt := c.buildGetMessageRequestPacket(msg.SyncFlag_START, time.Now().Unix()) + return nil, c.send(pkt) +} + +func decodeFriendGroupListResponse(c *QQClient, payload []byte) (interface{}, error) { + request := &jce.RequestPacket{} + request.ReadFrom(jce.NewJceReader(payload)) + data := &jce.RequestDataVersion3{} + data.ReadFrom(jce.NewJceReader(request.SBuffer)) + r := jce.NewJceReader(data.Map["FLRESP"][1:]) + totalFriendCount := r.ReadInt16(5) + friends := []jce.FriendInfo{} + r.ReadSlice(&friends, 7) + var l []*FriendInfo + for _, f := range friends { + l = append(l, &FriendInfo{ + Uin: f.FriendUin, + Nickname: f.Nick, + Remark: f.Remark, + FaceId: f.FaceId, + }) + } + rsp := FriendListResponse{ + TotalCount: int32(totalFriendCount), + List: l, + } + return rsp, nil +} + +func decodeGroupListResponse(c *QQClient, payload []byte) (interface{}, error) { + request := &jce.RequestPacket{} + request.ReadFrom(jce.NewJceReader(payload)) + data := &jce.RequestDataVersion3{} + data.ReadFrom(jce.NewJceReader(request.SBuffer)) + r := jce.NewJceReader(data.Map["GetTroopListRespV2"][1:]) + groups := []jce.TroopNumber{} + r.ReadSlice(&groups, 5) + var l []*GroupInfo + for _, g := range groups { + l = append(l, &GroupInfo{ + Uin: g.GroupUin, + Code: g.GroupCode, + Name: g.GroupName, + Memo: g.GroupMemo, + OwnerUin: uint32(g.GroupOwnerUin), + MemberCount: uint16(g.MemberNum), + MaxMemberCount: uint16(g.MaxGroupMemberNum), + }) + } + return l, nil +} + +func decodeGroupMemberListResponse(c *QQClient, payload []byte) (interface{}, error) { + request := &jce.RequestPacket{} + request.ReadFrom(jce.NewJceReader(payload)) + data := &jce.RequestDataVersion3{} + data.ReadFrom(jce.NewJceReader(request.SBuffer)) + r := jce.NewJceReader(data.Map["GTMLRESP"][1:]) + members := []jce.TroopMemberInfo{} + r.ReadSlice(&members, 3) + next := r.ReadInt64(4) + var l []GroupMemberInfo + for _, m := range members { + l = append(l, GroupMemberInfo{ + Uin: m.MemberUin, + Nickname: m.Nick, + CardName: m.Name, + Level: uint16(m.MemberLevel), + JoinTime: m.JoinTime, + LastSpeakTime: m.LastSpeakTime, + SpecialTitle: m.SpecialTitle, + SpecialTitleExpireTime: m.SpecialTitleExpireTime, + Job: m.Job, + }) + } + return groupMemberListResponse{ + NextUin: next, + list: l, + }, nil +} + +func decodeGroupImageStoreResponse(c *QQClient, payload []byte) (interface{}, error) { + pkt := pb.D388RespBody{} + err := proto.Unmarshal(payload, &pkt) + if err != nil { + return nil, err + } + rsp := pkt.MsgTryupImgRsp[0] + if rsp.Result != 0 { + return groupImageUploadResponse{ + ResultCode: rsp.Result, + Message: rsp.FailMsg, + }, nil + } + if rsp.BoolFileExit { + return groupImageUploadResponse{IsExists: true}, nil + } + return groupImageUploadResponse{ + UploadKey: rsp.UpUkey, + UploadIp: rsp.Uint32UpIp, + UploadPort: rsp.Uint32UpPort, + }, nil +} diff --git a/client/entities.go b/client/entities.go new file mode 100644 index 00000000..8f26a562 --- /dev/null +++ b/client/entities.go @@ -0,0 +1,80 @@ +package client + +import "errors" + +var ( + ErrAlreadyRunning = errors.New("already running") +) + +type ( + LoginError int + LoginResponse struct { + Success bool + Error LoginError + + // Captcha info + CaptchaImage []byte + CaptchaSign []byte + + // other error + ErrorMessage string + } + + FriendInfo struct { + Uin int64 + Nickname string + Remark string + FaceId int16 + } + + FriendListResponse struct { + TotalCount int32 + List []*FriendInfo + } + + GroupInfo struct { + Uin int64 + Code int64 + Name string + Memo string + OwnerUin uint32 + MemberCount uint16 + MaxMemberCount uint16 + Members []GroupMemberInfo + } + + GroupMemberInfo struct { + Uin int64 + Nickname string + CardName string + Level uint16 + JoinTime int64 + LastSpeakTime int64 + SpecialTitle string + SpecialTitleExpireTime int64 + Job string + } + + groupMemberListResponse struct { + NextUin int64 + list []GroupMemberInfo + } + + groupImageUploadResponse struct { + ResultCode int32 + Message string + + IsExists bool + + UploadKey []byte + UploadIp []int32 + UploadPort []int32 + } +) + +const ( + NeedCaptcha LoginError = 1 + DeviceLockError = 2 + OtherLoginError = 3 + UnknownLoginError = -1 +) diff --git a/client/events.go b/client/events.go new file mode 100644 index 00000000..3a532a9f --- /dev/null +++ b/client/events.go @@ -0,0 +1,57 @@ +package client + +import "github.com/Mrs4s/MiraiGo/message" + +func (c *QQClient) OnPrivateMessage(f func(*QQClient, *message.PrivateMessage)) { + c.privateMessageHandlers = append(c.privateMessageHandlers, f) +} + +func (c *QQClient) OnPrivateMessageF(filter func(*message.PrivateMessage) bool, f func(*QQClient, *message.PrivateMessage)) { + c.privateMessageHandlers = append(c.privateMessageHandlers, func(client *QQClient, msg *message.PrivateMessage) { + if filter(msg) { + f(client, msg) + } + }) +} + +func (c *QQClient) OnGroupMessage(f func(*QQClient, *message.GroupMessage)) { + c.groupMessageHandlers = append(c.groupMessageHandlers, f) +} + +func NewUinFilterPrivate(uin int64) func(*message.PrivateMessage) bool { + return func(msg *message.PrivateMessage) bool { + return msg.Sender.Uin == uin + } +} + +func (c *QQClient) dispatchFriendMessage(msg *message.PrivateMessage) { + if msg == nil { + return + } + for _, f := range c.privateMessageHandlers { + func() { + defer func() { + if pan := recover(); pan != nil { + // + } + }() + f(c, msg) + }() + } +} + +func (c *QQClient) dispatchGroupMessage(msg *message.GroupMessage) { + if msg == nil { + return + } + for _, f := range c.groupMessageHandlers { + func() { + defer func() { + if pan := recover(); pan != nil { + // TODO: logger + } + }() + f(c, msg) + }() + } +} diff --git a/client/global.go b/client/global.go new file mode 100644 index 00000000..85b162eb --- /dev/null +++ b/client/global.go @@ -0,0 +1,201 @@ +package client + +import ( + "crypto/md5" + devinfo "github.com/Mrs4s/MiraiGo/client/pb" + "github.com/Mrs4s/MiraiGo/client/pb/msg" + "github.com/Mrs4s/MiraiGo/message" + "google.golang.org/protobuf/proto" + "math/rand" +) + +type DeviceInfo struct { + Display []byte + Product []byte + Device []byte + Board []byte + Brand []byte + Model []byte + Bootloader []byte + FingerPrint []byte + BootId []byte + ProcVersion []byte + BaseBand []byte + SimInfo []byte + OSType []byte + MacAddress []byte + IpAddress []byte + WifiBSSID []byte + WifiSSID []byte + IMSIMd5 []byte + IMEI string + AndroidId []byte + APN []byte + Guid []byte + TgtgtKey []byte + Version *Version +} + +type Version struct { + Incremental []byte + Release []byte + CodeName []byte + Sdk uint32 +} + +var SystemDeviceInfo = &DeviceInfo{ + Display: []byte("MIRAI.123456.001"), + Product: []byte("mirai"), + Device: []byte("mirai"), + Board: []byte("mirai"), + Brand: []byte("mamoe"), + Model: []byte("mirai"), + Bootloader: []byte("unknown"), + FingerPrint: []byte("mamoe/mirai/mirai:10/MIRAI.200122.001/1234567:user/release-keys"), + BootId: []byte("cb886ae2-00b6-4d68-a230-787f111d12c7"), + ProcVersion: []byte("Linux version 3.0.31-cb886ae2 (android-build@xxx.xxx.xxx.xxx.com)"), + BaseBand: []byte{}, + SimInfo: []byte("T-Mobile"), + OSType: []byte("android"), + MacAddress: []byte("00:50:56:C0:00:08"), + IpAddress: []byte{10, 0, 1, 3}, // 10.0.1.3 + WifiBSSID: []byte("00:50:56:C0:00:08"), + WifiSSID: []byte(""), + IMEI: "468356291846738", + AndroidId: []byte("MIRAI.123456.001"), + APN: []byte("wifi"), + Version: &Version{ + Incremental: []byte("5891938"), + Release: []byte("10"), + CodeName: []byte("REL"), + Sdk: 29, + }, +} + +var EmptyBytes = []byte{} + +func init() { + r := make([]byte, 16) + rand.Read(r) + t := md5.Sum(r) + SystemDeviceInfo.IMSIMd5 = t[:] + SystemDeviceInfo.GenNewGuid() + SystemDeviceInfo.GenNewTgtgtKey() +} + +func (info *DeviceInfo) GenNewGuid() { + t := md5.Sum(append(info.AndroidId, info.MacAddress...)) + info.Guid = t[:] +} + +func (info *DeviceInfo) GenNewTgtgtKey() { + r := make([]byte, 16) + rand.Read(r) + t := md5.Sum(append(r, info.Guid...)) + info.TgtgtKey = t[:] +} + +func (info *DeviceInfo) GenDeviceInfoData() []byte { + msg := &devinfo.DeviceInfo{ + Bootloader: string(info.Bootloader), + ProcVersion: string(info.ProcVersion), + Codename: string(info.Version.CodeName), + Incremental: string(info.Version.Incremental), + Fingerprint: string(info.FingerPrint), + BootId: string(info.BootId), + AndroidId: string(info.AndroidId), + BaseBand: string(info.BaseBand), + InnerVersion: string(info.Version.Incremental), + } + data, err := proto.Marshal(msg) + if err != nil { + panic(err) + } + return data +} + +func (c *QQClient) parsePrivateMessage(msg *msg.Message) *message.PrivateMessage { + switch msg.Head.MsgType { + case 166: + friend := c.FindFriend(msg.Head.FromUin) + if friend == nil { + return nil + } + return &message.PrivateMessage{ + Id: msg.Head.MsgSeq, + Sender: &message.Sender{ + Uin: friend.Uin, + Nickname: friend.Nickname, + }, + Elements: parseMessageElems(msg.Body.RichText.Elems), + } + default: + return nil + } +} + +func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage { + group := c.FindGroup(m.Head.GroupInfo.GroupCode) + if group == nil { + return nil + } + var anonInfo *msg.AnonymousGroupMessage + for _, e := range m.Body.RichText.Elems { + if e.AnonGroupMsg != nil { + anonInfo = e.AnonGroupMsg + } + } + var sender *message.Sender + if anonInfo != nil { + sender = &message.Sender{ + Uin: 80000000, + Nickname: string(anonInfo.AnonNick), + IsFriend: false, + } + } else { + mem := group.FindMember(m.Head.FromUin) + if mem == nil { + return nil + } + sender = &message.Sender{ + Uin: mem.Uin, + Nickname: mem.Nickname, + CardName: mem.CardName, + IsFriend: c.FindFriend(mem.Uin) != nil, + } + } + g := &message.GroupMessage{ + Id: m.Head.MsgSeq, + GroupUin: m.Head.GroupInfo.GroupCode, + GroupName: string(m.Head.GroupInfo.GroupName), + Sender: sender, + Elements: parseMessageElems(m.Body.RichText.Elems), + IsAdministrator: false, + } + return g +} + +func parseMessageElems(elems []*msg.Elem) []message.IMessageElement { + var res []message.IMessageElement + for _, elem := range elems { + if elem.Text != nil { + res = append(res, message.NewText(elem.Text.Str)) + } + if elem.CustomFace != nil { + res = append(res, message.NewNetImage(elem.CustomFace.FilePath, "http://gchat.qpic.cn/"+elem.CustomFace.OrigUrl)) + } + if elem.NotOnlineImage != nil { + var img string + if elem.NotOnlineImage.OrigUrl != "" { + img = "http://c2cpicdw.qpic.cn" + elem.NotOnlineImage.OrigUrl + } else { + img = "http://c2cpicdw.qpic.cn/offpic_new/0/" + elem.NotOnlineImage.ResId + "/0?term=2" + } + res = append(res, message.NewNetImage(elem.NotOnlineImage.FilePath, img)) + } + if elem.Face != nil { + res = append(res, message.NewFace(elem.Face.Index)) + } + } + return res +} diff --git a/client/pb/data.pb.go b/client/pb/data.pb.go new file mode 100644 index 00000000..5ed55258 --- /dev/null +++ b/client/pb/data.pb.go @@ -0,0 +1,1959 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.11.4 +// source: data.proto + +package pb + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type DeviceInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Bootloader string `protobuf:"bytes,1,opt,name=bootloader,proto3" json:"bootloader,omitempty"` + ProcVersion string `protobuf:"bytes,2,opt,name=procVersion,proto3" json:"procVersion,omitempty"` + Codename string `protobuf:"bytes,3,opt,name=codename,proto3" json:"codename,omitempty"` + Incremental string `protobuf:"bytes,4,opt,name=incremental,proto3" json:"incremental,omitempty"` + Fingerprint string `protobuf:"bytes,5,opt,name=fingerprint,proto3" json:"fingerprint,omitempty"` + BootId string `protobuf:"bytes,6,opt,name=bootId,proto3" json:"bootId,omitempty"` + AndroidId string `protobuf:"bytes,7,opt,name=androidId,proto3" json:"androidId,omitempty"` + BaseBand string `protobuf:"bytes,8,opt,name=baseBand,proto3" json:"baseBand,omitempty"` + InnerVersion string `protobuf:"bytes,9,opt,name=innerVersion,proto3" json:"innerVersion,omitempty"` +} + +func (x *DeviceInfo) Reset() { + *x = DeviceInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeviceInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeviceInfo) ProtoMessage() {} + +func (x *DeviceInfo) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[0] + 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 DeviceInfo.ProtoReflect.Descriptor instead. +func (*DeviceInfo) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{0} +} + +func (x *DeviceInfo) GetBootloader() string { + if x != nil { + return x.Bootloader + } + return "" +} + +func (x *DeviceInfo) GetProcVersion() string { + if x != nil { + return x.ProcVersion + } + return "" +} + +func (x *DeviceInfo) GetCodename() string { + if x != nil { + return x.Codename + } + return "" +} + +func (x *DeviceInfo) GetIncremental() string { + if x != nil { + return x.Incremental + } + return "" +} + +func (x *DeviceInfo) GetFingerprint() string { + if x != nil { + return x.Fingerprint + } + return "" +} + +func (x *DeviceInfo) GetBootId() string { + if x != nil { + return x.BootId + } + return "" +} + +func (x *DeviceInfo) GetAndroidId() string { + if x != nil { + return x.AndroidId + } + return "" +} + +func (x *DeviceInfo) GetBaseBand() string { + if x != nil { + return x.BaseBand + } + return "" +} + +func (x *DeviceInfo) GetInnerVersion() string { + if x != nil { + return x.InnerVersion + } + return "" +} + +type RequestBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RptConfigList []*ConfigSeq `protobuf:"bytes,1,rep,name=rpt_config_list,json=rptConfigList,proto3" json:"rpt_config_list,omitempty"` +} + +func (x *RequestBody) Reset() { + *x = RequestBody{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RequestBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestBody) ProtoMessage() {} + +func (x *RequestBody) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[1] + 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 RequestBody.ProtoReflect.Descriptor instead. +func (*RequestBody) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{1} +} + +func (x *RequestBody) GetRptConfigList() []*ConfigSeq { + if x != nil { + return x.RptConfigList + } + return nil +} + +type ConfigSeq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type int32 `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"` + Version int32 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *ConfigSeq) Reset() { + *x = ConfigSeq{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConfigSeq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConfigSeq) ProtoMessage() {} + +func (x *ConfigSeq) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[2] + 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 ConfigSeq.ProtoReflect.Descriptor instead. +func (*ConfigSeq) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{2} +} + +func (x *ConfigSeq) GetType() int32 { + if x != nil { + return x.Type + } + return 0 +} + +func (x *ConfigSeq) GetVersion() int32 { + if x != nil { + return x.Version + } + return 0 +} + +type D50ReqBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Appid int64 `protobuf:"varint,1,opt,name=appid,proto3" json:"appid,omitempty"` + MaxPkgSize int32 `protobuf:"varint,2,opt,name=maxPkgSize,proto3" json:"maxPkgSize,omitempty"` + StartTime int32 `protobuf:"varint,3,opt,name=startTime,proto3" json:"startTime,omitempty"` + StartIndex int32 `protobuf:"varint,4,opt,name=startIndex,proto3" json:"startIndex,omitempty"` + ReqNum int32 `protobuf:"varint,5,opt,name=reqNum,proto3" json:"reqNum,omitempty"` + UinList []int64 `protobuf:"varint,6,rep,packed,name=uinList,proto3" json:"uinList,omitempty"` + ReqMusicSwitch int32 `protobuf:"varint,91001,opt,name=reqMusicSwitch,proto3" json:"reqMusicSwitch,omitempty"` + ReqMutualmarkAlienation int32 `protobuf:"varint,101001,opt,name=reqMutualmarkAlienation,proto3" json:"reqMutualmarkAlienation,omitempty"` + ReqMutualmarkScore int32 `protobuf:"varint,141001,opt,name=reqMutualmarkScore,proto3" json:"reqMutualmarkScore,omitempty"` + ReqKsingSwitch int32 `protobuf:"varint,151001,opt,name=reqKsingSwitch,proto3" json:"reqKsingSwitch,omitempty"` + ReqMutualmarkLbsshare int32 `protobuf:"varint,181001,opt,name=reqMutualmarkLbsshare,proto3" json:"reqMutualmarkLbsshare,omitempty"` +} + +func (x *D50ReqBody) Reset() { + *x = D50ReqBody{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *D50ReqBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*D50ReqBody) ProtoMessage() {} + +func (x *D50ReqBody) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[3] + 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 D50ReqBody.ProtoReflect.Descriptor instead. +func (*D50ReqBody) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{3} +} + +func (x *D50ReqBody) GetAppid() int64 { + if x != nil { + return x.Appid + } + return 0 +} + +func (x *D50ReqBody) GetMaxPkgSize() int32 { + if x != nil { + return x.MaxPkgSize + } + return 0 +} + +func (x *D50ReqBody) GetStartTime() int32 { + if x != nil { + return x.StartTime + } + return 0 +} + +func (x *D50ReqBody) GetStartIndex() int32 { + if x != nil { + return x.StartIndex + } + return 0 +} + +func (x *D50ReqBody) GetReqNum() int32 { + if x != nil { + return x.ReqNum + } + return 0 +} + +func (x *D50ReqBody) GetUinList() []int64 { + if x != nil { + return x.UinList + } + return nil +} + +func (x *D50ReqBody) GetReqMusicSwitch() int32 { + if x != nil { + return x.ReqMusicSwitch + } + return 0 +} + +func (x *D50ReqBody) GetReqMutualmarkAlienation() int32 { + if x != nil { + return x.ReqMutualmarkAlienation + } + return 0 +} + +func (x *D50ReqBody) GetReqMutualmarkScore() int32 { + if x != nil { + return x.ReqMutualmarkScore + } + return 0 +} + +func (x *D50ReqBody) GetReqKsingSwitch() int32 { + if x != nil { + return x.ReqKsingSwitch + } + return 0 +} + +func (x *D50ReqBody) GetReqMutualmarkLbsshare() int32 { + if x != nil { + return x.ReqMutualmarkLbsshare + } + return 0 +} + +type D388ReqBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NetType int32 `protobuf:"varint,1,opt,name=netType,proto3" json:"netType,omitempty"` + Subcmd int32 `protobuf:"varint,2,opt,name=subcmd,proto3" json:"subcmd,omitempty"` + MsgTryupImgReq []*TryUpImgReq `protobuf:"bytes,3,rep,name=msgTryupImgReq,proto3" json:"msgTryupImgReq,omitempty"` + CommandId int32 `protobuf:"varint,7,opt,name=commandId,proto3" json:"commandId,omitempty"` + Extension []byte `protobuf:"bytes,1001,opt,name=extension,proto3" json:"extension,omitempty"` +} + +func (x *D388ReqBody) Reset() { + *x = D388ReqBody{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *D388ReqBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*D388ReqBody) ProtoMessage() {} + +func (x *D388ReqBody) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[4] + 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 D388ReqBody.ProtoReflect.Descriptor instead. +func (*D388ReqBody) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{4} +} + +func (x *D388ReqBody) GetNetType() int32 { + if x != nil { + return x.NetType + } + return 0 +} + +func (x *D388ReqBody) GetSubcmd() int32 { + if x != nil { + return x.Subcmd + } + return 0 +} + +func (x *D388ReqBody) GetMsgTryupImgReq() []*TryUpImgReq { + if x != nil { + return x.MsgTryupImgReq + } + return nil +} + +func (x *D388ReqBody) GetCommandId() int32 { + if x != nil { + return x.CommandId + } + return 0 +} + +func (x *D388ReqBody) GetExtension() []byte { + if x != nil { + return x.Extension + } + return nil +} + +type D388RespBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientIp int32 `protobuf:"varint,1,opt,name=clientIp,proto3" json:"clientIp,omitempty"` + SubCmd int32 `protobuf:"varint,2,opt,name=subCmd,proto3" json:"subCmd,omitempty"` + MsgTryupImgRsp []*TryUpImgResp `protobuf:"bytes,3,rep,name=msgTryupImgRsp,proto3" json:"msgTryupImgRsp,omitempty"` +} + +func (x *D388RespBody) Reset() { + *x = D388RespBody{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *D388RespBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*D388RespBody) ProtoMessage() {} + +func (x *D388RespBody) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[5] + 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 D388RespBody.ProtoReflect.Descriptor instead. +func (*D388RespBody) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{5} +} + +func (x *D388RespBody) GetClientIp() int32 { + if x != nil { + return x.ClientIp + } + return 0 +} + +func (x *D388RespBody) GetSubCmd() int32 { + if x != nil { + return x.SubCmd + } + return 0 +} + +func (x *D388RespBody) GetMsgTryupImgRsp() []*TryUpImgResp { + if x != nil { + return x.MsgTryupImgRsp + } + return nil +} + +type ReqDataHighwayHead struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MsgBasehead *DataHighwayHead `protobuf:"bytes,1,opt,name=msgBasehead,proto3" json:"msgBasehead,omitempty"` + MsgSeghead *SegHead `protobuf:"bytes,2,opt,name=msgSeghead,proto3" json:"msgSeghead,omitempty"` + ReqExtendinfo []byte `protobuf:"bytes,3,opt,name=reqExtendinfo,proto3" json:"reqExtendinfo,omitempty"` + Timestamp int64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` //LoginSigHead? msgLoginSigHead = 5; +} + +func (x *ReqDataHighwayHead) Reset() { + *x = ReqDataHighwayHead{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReqDataHighwayHead) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReqDataHighwayHead) ProtoMessage() {} + +func (x *ReqDataHighwayHead) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[6] + 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 ReqDataHighwayHead.ProtoReflect.Descriptor instead. +func (*ReqDataHighwayHead) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{6} +} + +func (x *ReqDataHighwayHead) GetMsgBasehead() *DataHighwayHead { + if x != nil { + return x.MsgBasehead + } + return nil +} + +func (x *ReqDataHighwayHead) GetMsgSeghead() *SegHead { + if x != nil { + return x.MsgSeghead + } + return nil +} + +func (x *ReqDataHighwayHead) GetReqExtendinfo() []byte { + if x != nil { + return x.ReqExtendinfo + } + return nil +} + +func (x *ReqDataHighwayHead) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +type RspDataHighwayHead struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MsgBasehead *DataHighwayHead `protobuf:"bytes,1,opt,name=msgBasehead,proto3" json:"msgBasehead,omitempty"` + MsgSeghead *SegHead `protobuf:"bytes,2,opt,name=msgSeghead,proto3" json:"msgSeghead,omitempty"` + ErrorCode int32 `protobuf:"varint,3,opt,name=errorCode,proto3" json:"errorCode,omitempty"` + AllowRetry int32 `protobuf:"varint,4,opt,name=allowRetry,proto3" json:"allowRetry,omitempty"` + Cachecost int32 `protobuf:"varint,5,opt,name=cachecost,proto3" json:"cachecost,omitempty"` + Htcost int32 `protobuf:"varint,6,opt,name=htcost,proto3" json:"htcost,omitempty"` + RspExtendinfo []byte `protobuf:"bytes,7,opt,name=rspExtendinfo,proto3" json:"rspExtendinfo,omitempty"` + Timestamp int64 `protobuf:"varint,8,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Range int64 `protobuf:"varint,9,opt,name=range,proto3" json:"range,omitempty"` + IsReset int32 `protobuf:"varint,10,opt,name=isReset,proto3" json:"isReset,omitempty"` +} + +func (x *RspDataHighwayHead) Reset() { + *x = RspDataHighwayHead{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RspDataHighwayHead) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RspDataHighwayHead) ProtoMessage() {} + +func (x *RspDataHighwayHead) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[7] + 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 RspDataHighwayHead.ProtoReflect.Descriptor instead. +func (*RspDataHighwayHead) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{7} +} + +func (x *RspDataHighwayHead) GetMsgBasehead() *DataHighwayHead { + if x != nil { + return x.MsgBasehead + } + return nil +} + +func (x *RspDataHighwayHead) GetMsgSeghead() *SegHead { + if x != nil { + return x.MsgSeghead + } + return nil +} + +func (x *RspDataHighwayHead) GetErrorCode() int32 { + if x != nil { + return x.ErrorCode + } + return 0 +} + +func (x *RspDataHighwayHead) GetAllowRetry() int32 { + if x != nil { + return x.AllowRetry + } + return 0 +} + +func (x *RspDataHighwayHead) GetCachecost() int32 { + if x != nil { + return x.Cachecost + } + return 0 +} + +func (x *RspDataHighwayHead) GetHtcost() int32 { + if x != nil { + return x.Htcost + } + return 0 +} + +func (x *RspDataHighwayHead) GetRspExtendinfo() []byte { + if x != nil { + return x.RspExtendinfo + } + return nil +} + +func (x *RspDataHighwayHead) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *RspDataHighwayHead) GetRange() int64 { + if x != nil { + return x.Range + } + return 0 +} + +func (x *RspDataHighwayHead) GetIsReset() int32 { + if x != nil { + return x.IsReset + } + return 0 +} + +type DataHighwayHead struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version int32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` + Uin string `protobuf:"bytes,2,opt,name=uin,proto3" json:"uin,omitempty"` + Command string `protobuf:"bytes,3,opt,name=command,proto3" json:"command,omitempty"` + Seq int32 `protobuf:"varint,4,opt,name=seq,proto3" json:"seq,omitempty"` + RetryTimes int32 `protobuf:"varint,5,opt,name=retryTimes,proto3" json:"retryTimes,omitempty"` + Appid int32 `protobuf:"varint,6,opt,name=appid,proto3" json:"appid,omitempty"` + Dataflag int32 `protobuf:"varint,7,opt,name=dataflag,proto3" json:"dataflag,omitempty"` + CommandId int32 `protobuf:"varint,8,opt,name=commandId,proto3" json:"commandId,omitempty"` + BuildVer string `protobuf:"bytes,9,opt,name=buildVer,proto3" json:"buildVer,omitempty"` + LocaleId int32 `protobuf:"varint,10,opt,name=localeId,proto3" json:"localeId,omitempty"` +} + +func (x *DataHighwayHead) Reset() { + *x = DataHighwayHead{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataHighwayHead) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataHighwayHead) ProtoMessage() {} + +func (x *DataHighwayHead) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[8] + 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 DataHighwayHead.ProtoReflect.Descriptor instead. +func (*DataHighwayHead) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{8} +} + +func (x *DataHighwayHead) GetVersion() int32 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *DataHighwayHead) GetUin() string { + if x != nil { + return x.Uin + } + return "" +} + +func (x *DataHighwayHead) GetCommand() string { + if x != nil { + return x.Command + } + return "" +} + +func (x *DataHighwayHead) GetSeq() int32 { + if x != nil { + return x.Seq + } + return 0 +} + +func (x *DataHighwayHead) GetRetryTimes() int32 { + if x != nil { + return x.RetryTimes + } + return 0 +} + +func (x *DataHighwayHead) GetAppid() int32 { + if x != nil { + return x.Appid + } + return 0 +} + +func (x *DataHighwayHead) GetDataflag() int32 { + if x != nil { + return x.Dataflag + } + return 0 +} + +func (x *DataHighwayHead) GetCommandId() int32 { + if x != nil { + return x.CommandId + } + return 0 +} + +func (x *DataHighwayHead) GetBuildVer() string { + if x != nil { + return x.BuildVer + } + return "" +} + +func (x *DataHighwayHead) GetLocaleId() int32 { + if x != nil { + return x.LocaleId + } + return 0 +} + +type SegHead struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Serviceid int32 `protobuf:"varint,1,opt,name=serviceid,proto3" json:"serviceid,omitempty"` + Filesize int64 `protobuf:"varint,2,opt,name=filesize,proto3" json:"filesize,omitempty"` + Dataoffset int64 `protobuf:"varint,3,opt,name=dataoffset,proto3" json:"dataoffset,omitempty"` + Datalength int32 `protobuf:"varint,4,opt,name=datalength,proto3" json:"datalength,omitempty"` + Rtcode int32 `protobuf:"varint,5,opt,name=rtcode,proto3" json:"rtcode,omitempty"` + Serviceticket []byte `protobuf:"bytes,6,opt,name=serviceticket,proto3" json:"serviceticket,omitempty"` + Flag int32 `protobuf:"varint,7,opt,name=flag,proto3" json:"flag,omitempty"` + Md5 []byte `protobuf:"bytes,8,opt,name=md5,proto3" json:"md5,omitempty"` + FileMd5 []byte `protobuf:"bytes,9,opt,name=fileMd5,proto3" json:"fileMd5,omitempty"` + CacheAddr int32 `protobuf:"varint,10,opt,name=cacheAddr,proto3" json:"cacheAddr,omitempty"` + QueryTimes int32 `protobuf:"varint,11,opt,name=queryTimes,proto3" json:"queryTimes,omitempty"` + UpdateCacheip int32 `protobuf:"varint,12,opt,name=updateCacheip,proto3" json:"updateCacheip,omitempty"` +} + +func (x *SegHead) Reset() { + *x = SegHead{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SegHead) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SegHead) ProtoMessage() {} + +func (x *SegHead) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[9] + 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 SegHead.ProtoReflect.Descriptor instead. +func (*SegHead) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{9} +} + +func (x *SegHead) GetServiceid() int32 { + if x != nil { + return x.Serviceid + } + return 0 +} + +func (x *SegHead) GetFilesize() int64 { + if x != nil { + return x.Filesize + } + return 0 +} + +func (x *SegHead) GetDataoffset() int64 { + if x != nil { + return x.Dataoffset + } + return 0 +} + +func (x *SegHead) GetDatalength() int32 { + if x != nil { + return x.Datalength + } + return 0 +} + +func (x *SegHead) GetRtcode() int32 { + if x != nil { + return x.Rtcode + } + return 0 +} + +func (x *SegHead) GetServiceticket() []byte { + if x != nil { + return x.Serviceticket + } + return nil +} + +func (x *SegHead) GetFlag() int32 { + if x != nil { + return x.Flag + } + return 0 +} + +func (x *SegHead) GetMd5() []byte { + if x != nil { + return x.Md5 + } + return nil +} + +func (x *SegHead) GetFileMd5() []byte { + if x != nil { + return x.FileMd5 + } + return nil +} + +func (x *SegHead) GetCacheAddr() int32 { + if x != nil { + return x.CacheAddr + } + return 0 +} + +func (x *SegHead) GetQueryTimes() int32 { + if x != nil { + return x.QueryTimes + } + return 0 +} + +func (x *SegHead) GetUpdateCacheip() int32 { + if x != nil { + return x.UpdateCacheip + } + return 0 +} + +type TryUpImgReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupCode int64 `protobuf:"varint,1,opt,name=groupCode,proto3" json:"groupCode,omitempty"` + SrcUin int64 `protobuf:"varint,2,opt,name=srcUin,proto3" json:"srcUin,omitempty"` + FileId int64 `protobuf:"varint,3,opt,name=fileId,proto3" json:"fileId,omitempty"` + FileMd5 []byte `protobuf:"bytes,4,opt,name=fileMd5,proto3" json:"fileMd5,omitempty"` + FileSize int64 `protobuf:"varint,5,opt,name=fileSize,proto3" json:"fileSize,omitempty"` + FileName string `protobuf:"bytes,6,opt,name=fileName,proto3" json:"fileName,omitempty"` + SrcTerm int32 `protobuf:"varint,7,opt,name=srcTerm,proto3" json:"srcTerm,omitempty"` + PlatformType int32 `protobuf:"varint,8,opt,name=platformType,proto3" json:"platformType,omitempty"` + BuType int32 `protobuf:"varint,9,opt,name=buType,proto3" json:"buType,omitempty"` + PicWidth int32 `protobuf:"varint,10,opt,name=picWidth,proto3" json:"picWidth,omitempty"` + PicHeight int32 `protobuf:"varint,11,opt,name=picHeight,proto3" json:"picHeight,omitempty"` + PicType int32 `protobuf:"varint,12,opt,name=picType,proto3" json:"picType,omitempty"` + BuildVer string `protobuf:"bytes,13,opt,name=buildVer,proto3" json:"buildVer,omitempty"` + InnerIp int32 `protobuf:"varint,14,opt,name=innerIp,proto3" json:"innerIp,omitempty"` + AppPicType int32 `protobuf:"varint,15,opt,name=appPicType,proto3" json:"appPicType,omitempty"` + OriginalPic int32 `protobuf:"varint,16,opt,name=originalPic,proto3" json:"originalPic,omitempty"` + FileIndex []byte `protobuf:"bytes,17,opt,name=fileIndex,proto3" json:"fileIndex,omitempty"` + DstUin int64 `protobuf:"varint,18,opt,name=dstUin,proto3" json:"dstUin,omitempty"` + SrvUpload int32 `protobuf:"varint,19,opt,name=srvUpload,proto3" json:"srvUpload,omitempty"` + TransferUrl []byte `protobuf:"bytes,20,opt,name=transferUrl,proto3" json:"transferUrl,omitempty"` +} + +func (x *TryUpImgReq) Reset() { + *x = TryUpImgReq{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TryUpImgReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TryUpImgReq) ProtoMessage() {} + +func (x *TryUpImgReq) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[10] + 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 TryUpImgReq.ProtoReflect.Descriptor instead. +func (*TryUpImgReq) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{10} +} + +func (x *TryUpImgReq) GetGroupCode() int64 { + if x != nil { + return x.GroupCode + } + return 0 +} + +func (x *TryUpImgReq) GetSrcUin() int64 { + if x != nil { + return x.SrcUin + } + return 0 +} + +func (x *TryUpImgReq) GetFileId() int64 { + if x != nil { + return x.FileId + } + return 0 +} + +func (x *TryUpImgReq) GetFileMd5() []byte { + if x != nil { + return x.FileMd5 + } + return nil +} + +func (x *TryUpImgReq) GetFileSize() int64 { + if x != nil { + return x.FileSize + } + return 0 +} + +func (x *TryUpImgReq) GetFileName() string { + if x != nil { + return x.FileName + } + return "" +} + +func (x *TryUpImgReq) GetSrcTerm() int32 { + if x != nil { + return x.SrcTerm + } + return 0 +} + +func (x *TryUpImgReq) GetPlatformType() int32 { + if x != nil { + return x.PlatformType + } + return 0 +} + +func (x *TryUpImgReq) GetBuType() int32 { + if x != nil { + return x.BuType + } + return 0 +} + +func (x *TryUpImgReq) GetPicWidth() int32 { + if x != nil { + return x.PicWidth + } + return 0 +} + +func (x *TryUpImgReq) GetPicHeight() int32 { + if x != nil { + return x.PicHeight + } + return 0 +} + +func (x *TryUpImgReq) GetPicType() int32 { + if x != nil { + return x.PicType + } + return 0 +} + +func (x *TryUpImgReq) GetBuildVer() string { + if x != nil { + return x.BuildVer + } + return "" +} + +func (x *TryUpImgReq) GetInnerIp() int32 { + if x != nil { + return x.InnerIp + } + return 0 +} + +func (x *TryUpImgReq) GetAppPicType() int32 { + if x != nil { + return x.AppPicType + } + return 0 +} + +func (x *TryUpImgReq) GetOriginalPic() int32 { + if x != nil { + return x.OriginalPic + } + return 0 +} + +func (x *TryUpImgReq) GetFileIndex() []byte { + if x != nil { + return x.FileIndex + } + return nil +} + +func (x *TryUpImgReq) GetDstUin() int64 { + if x != nil { + return x.DstUin + } + return 0 +} + +func (x *TryUpImgReq) GetSrvUpload() int32 { + if x != nil { + return x.SrvUpload + } + return 0 +} + +func (x *TryUpImgReq) GetTransferUrl() []byte { + if x != nil { + return x.TransferUrl + } + return nil +} + +type TryUpImgResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FileId int64 `protobuf:"varint,1,opt,name=fileId,proto3" json:"fileId,omitempty"` + Result int32 `protobuf:"varint,2,opt,name=result,proto3" json:"result,omitempty"` + FailMsg string `protobuf:"bytes,3,opt,name=failMsg,proto3" json:"failMsg,omitempty"` + BoolFileExit bool `protobuf:"varint,4,opt,name=boolFileExit,proto3" json:"boolFileExit,omitempty"` + MsgImgInfo *ImgInfo `protobuf:"bytes,5,opt,name=msgImgInfo,proto3" json:"msgImgInfo,omitempty"` + Uint32UpIp []int32 `protobuf:"varint,6,rep,packed,name=uint32UpIp,proto3" json:"uint32UpIp,omitempty"` + Uint32UpPort []int32 `protobuf:"varint,7,rep,packed,name=uint32UpPort,proto3" json:"uint32UpPort,omitempty"` + UpUkey []byte `protobuf:"bytes,8,opt,name=upUkey,proto3" json:"upUkey,omitempty"` + Fid int64 `protobuf:"varint,9,opt,name=fid,proto3" json:"fid,omitempty"` +} + +func (x *TryUpImgResp) Reset() { + *x = TryUpImgResp{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TryUpImgResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TryUpImgResp) ProtoMessage() {} + +func (x *TryUpImgResp) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[11] + 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 TryUpImgResp.ProtoReflect.Descriptor instead. +func (*TryUpImgResp) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{11} +} + +func (x *TryUpImgResp) GetFileId() int64 { + if x != nil { + return x.FileId + } + return 0 +} + +func (x *TryUpImgResp) GetResult() int32 { + if x != nil { + return x.Result + } + return 0 +} + +func (x *TryUpImgResp) GetFailMsg() string { + if x != nil { + return x.FailMsg + } + return "" +} + +func (x *TryUpImgResp) GetBoolFileExit() bool { + if x != nil { + return x.BoolFileExit + } + return false +} + +func (x *TryUpImgResp) GetMsgImgInfo() *ImgInfo { + if x != nil { + return x.MsgImgInfo + } + return nil +} + +func (x *TryUpImgResp) GetUint32UpIp() []int32 { + if x != nil { + return x.Uint32UpIp + } + return nil +} + +func (x *TryUpImgResp) GetUint32UpPort() []int32 { + if x != nil { + return x.Uint32UpPort + } + return nil +} + +func (x *TryUpImgResp) GetUpUkey() []byte { + if x != nil { + return x.UpUkey + } + return nil +} + +func (x *TryUpImgResp) GetFid() int64 { + if x != nil { + return x.Fid + } + return 0 +} + +type ImgInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FileMd5 []byte `protobuf:"bytes,1,opt,name=fileMd5,proto3" json:"fileMd5,omitempty"` + FileType int32 `protobuf:"varint,2,opt,name=fileType,proto3" json:"fileType,omitempty"` + FileSize int64 `protobuf:"varint,3,opt,name=fileSize,proto3" json:"fileSize,omitempty"` + FileWidth int32 `protobuf:"varint,4,opt,name=fileWidth,proto3" json:"fileWidth,omitempty"` + FileHeight int32 `protobuf:"varint,5,opt,name=fileHeight,proto3" json:"fileHeight,omitempty"` +} + +func (x *ImgInfo) Reset() { + *x = ImgInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ImgInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImgInfo) ProtoMessage() {} + +func (x *ImgInfo) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[12] + 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 ImgInfo.ProtoReflect.Descriptor instead. +func (*ImgInfo) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{12} +} + +func (x *ImgInfo) GetFileMd5() []byte { + if x != nil { + return x.FileMd5 + } + return nil +} + +func (x *ImgInfo) GetFileType() int32 { + if x != nil { + return x.FileType + } + return 0 +} + +func (x *ImgInfo) GetFileSize() int64 { + if x != nil { + return x.FileSize + } + return 0 +} + +func (x *ImgInfo) GetFileWidth() int32 { + if x != nil { + return x.FileWidth + } + return 0 +} + +func (x *ImgInfo) GetFileHeight() int32 { + if x != nil { + return x.FileHeight + } + return 0 +} + +type DeleteMessageRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Items []*MessageItem `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` +} + +func (x *DeleteMessageRequest) Reset() { + *x = DeleteMessageRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteMessageRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteMessageRequest) ProtoMessage() {} + +func (x *DeleteMessageRequest) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[13] + 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 DeleteMessageRequest.ProtoReflect.Descriptor instead. +func (*DeleteMessageRequest) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{13} +} + +func (x *DeleteMessageRequest) GetItems() []*MessageItem { + if x != nil { + return x.Items + } + return nil +} + +type MessageItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FromUin int64 `protobuf:"varint,1,opt,name=fromUin,proto3" json:"fromUin,omitempty"` + ToUin int64 `protobuf:"varint,2,opt,name=toUin,proto3" json:"toUin,omitempty"` + MsgType int32 `protobuf:"varint,3,opt,name=msgType,proto3" json:"msgType,omitempty"` + MsgSeq int32 `protobuf:"varint,4,opt,name=msgSeq,proto3" json:"msgSeq,omitempty"` + MsgUid int64 `protobuf:"varint,5,opt,name=msgUid,proto3" json:"msgUid,omitempty"` + Sig []byte `protobuf:"bytes,7,opt,name=sig,proto3" json:"sig,omitempty"` +} + +func (x *MessageItem) Reset() { + *x = MessageItem{} + if protoimpl.UnsafeEnabled { + mi := &file_data_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MessageItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MessageItem) ProtoMessage() {} + +func (x *MessageItem) ProtoReflect() protoreflect.Message { + mi := &file_data_proto_msgTypes[14] + 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 MessageItem.ProtoReflect.Descriptor instead. +func (*MessageItem) Descriptor() ([]byte, []int) { + return file_data_proto_rawDescGZIP(), []int{14} +} + +func (x *MessageItem) GetFromUin() int64 { + if x != nil { + return x.FromUin + } + return 0 +} + +func (x *MessageItem) GetToUin() int64 { + if x != nil { + return x.ToUin + } + return 0 +} + +func (x *MessageItem) GetMsgType() int32 { + if x != nil { + return x.MsgType + } + return 0 +} + +func (x *MessageItem) GetMsgSeq() int32 { + if x != nil { + return x.MsgSeq + } + return 0 +} + +func (x *MessageItem) GetMsgUid() int64 { + if x != nil { + return x.MsgUid + } + return 0 +} + +func (x *MessageItem) GetSig() []byte { + if x != nil { + return x.Sig + } + return nil +} + +var File_data_proto protoreflect.FileDescriptor + +var file_data_proto_rawDesc = []byte{ + 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa4, 0x02, 0x0a, + 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1e, 0x0a, 0x0a, 0x62, + 0x6f, 0x6f, 0x74, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x62, 0x6f, 0x6f, 0x74, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x70, + 0x72, 0x6f, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, + 0x08, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x63, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x63, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x66, + 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x62, 0x6f, 0x6f, 0x74, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, + 0x6f, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, + 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, + 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x61, 0x73, 0x65, 0x42, 0x61, 0x6e, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x61, 0x73, 0x65, 0x42, 0x61, 0x6e, 0x64, 0x12, + 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x41, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, + 0x64, 0x79, 0x12, 0x32, 0x0a, 0x0f, 0x72, 0x70, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x53, 0x65, 0x71, 0x52, 0x0d, 0x72, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x39, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x53, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0xac, 0x03, 0x0a, 0x0a, 0x44, 0x35, 0x30, 0x52, 0x65, 0x71, 0x42, 0x6f, 0x64, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x50, 0x6b, 0x67, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x50, + 0x6b, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x71, 0x4e, 0x75, 0x6d, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x65, 0x71, 0x4e, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x07, + 0x75, 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x06, 0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x75, + 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x4d, 0x75, 0x73, + 0x69, 0x63, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0xf9, 0xc6, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0e, 0x72, 0x65, 0x71, 0x4d, 0x75, 0x73, 0x69, 0x63, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x12, 0x3a, 0x0a, 0x17, 0x72, 0x65, 0x71, 0x4d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6d, 0x61, 0x72, + 0x6b, 0x41, 0x6c, 0x69, 0x65, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x89, 0x95, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x17, 0x72, 0x65, 0x71, 0x4d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6d, 0x61, + 0x72, 0x6b, 0x41, 0x6c, 0x69, 0x65, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x12, + 0x72, 0x65, 0x71, 0x4d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6d, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x6f, + 0x72, 0x65, 0x18, 0xc9, 0xcd, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x72, 0x65, 0x71, 0x4d, + 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6d, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x28, + 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x4b, 0x73, 0x69, 0x6e, 0x67, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x18, 0xd9, 0x9b, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x4b, 0x73, 0x69, + 0x6e, 0x67, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x15, 0x72, 0x65, 0x71, 0x4d, + 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6d, 0x61, 0x72, 0x6b, 0x4c, 0x62, 0x73, 0x73, 0x68, 0x61, 0x72, + 0x65, 0x18, 0x89, 0x86, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x72, 0x65, 0x71, 0x4d, 0x75, + 0x74, 0x75, 0x61, 0x6c, 0x6d, 0x61, 0x72, 0x6b, 0x4c, 0x62, 0x73, 0x73, 0x68, 0x61, 0x72, 0x65, + 0x22, 0xb2, 0x01, 0x0a, 0x0b, 0x44, 0x33, 0x38, 0x38, 0x52, 0x65, 0x71, 0x42, 0x6f, 0x64, 0x79, + 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x75, + 0x62, 0x63, 0x6d, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x75, 0x62, 0x63, + 0x6d, 0x64, 0x12, 0x34, 0x0a, 0x0e, 0x6d, 0x73, 0x67, 0x54, 0x72, 0x79, 0x75, 0x70, 0x49, 0x6d, + 0x67, 0x52, 0x65, 0x71, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x54, 0x72, 0x79, + 0x55, 0x70, 0x49, 0x6d, 0x67, 0x52, 0x65, 0x71, 0x52, 0x0e, 0x6d, 0x73, 0x67, 0x54, 0x72, 0x79, + 0x75, 0x70, 0x49, 0x6d, 0x67, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x79, 0x0a, 0x0c, 0x44, 0x33, 0x38, 0x38, 0x52, 0x65, 0x73, + 0x70, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, + 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x75, 0x62, 0x43, 0x6d, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x73, 0x75, 0x62, 0x43, 0x6d, 0x64, 0x12, 0x35, 0x0a, 0x0e, 0x6d, 0x73, 0x67, + 0x54, 0x72, 0x79, 0x75, 0x70, 0x49, 0x6d, 0x67, 0x52, 0x73, 0x70, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x54, 0x72, 0x79, 0x55, 0x70, 0x49, 0x6d, 0x67, 0x52, 0x65, 0x73, 0x70, + 0x52, 0x0e, 0x6d, 0x73, 0x67, 0x54, 0x72, 0x79, 0x75, 0x70, 0x49, 0x6d, 0x67, 0x52, 0x73, 0x70, + 0x22, 0xb6, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x67, 0x68, + 0x77, 0x61, 0x79, 0x48, 0x65, 0x61, 0x64, 0x12, 0x32, 0x0a, 0x0b, 0x6d, 0x73, 0x67, 0x42, 0x61, + 0x73, 0x65, 0x68, 0x65, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x48, 0x69, 0x67, 0x68, 0x77, 0x61, 0x79, 0x48, 0x65, 0x61, 0x64, 0x52, 0x0b, + 0x6d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, 0x68, 0x65, 0x61, 0x64, 0x12, 0x28, 0x0a, 0x0a, 0x6d, + 0x73, 0x67, 0x53, 0x65, 0x67, 0x68, 0x65, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x08, 0x2e, 0x53, 0x65, 0x67, 0x48, 0x65, 0x61, 0x64, 0x52, 0x0a, 0x6d, 0x73, 0x67, 0x53, 0x65, + 0x67, 0x68, 0x65, 0x61, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x72, 0x65, + 0x71, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xda, 0x02, 0x0a, 0x12, 0x52, 0x73, + 0x70, 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x67, 0x68, 0x77, 0x61, 0x79, 0x48, 0x65, 0x61, 0x64, + 0x12, 0x32, 0x0a, 0x0b, 0x6d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, 0x68, 0x65, 0x61, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x67, 0x68, + 0x77, 0x61, 0x79, 0x48, 0x65, 0x61, 0x64, 0x52, 0x0b, 0x6d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, + 0x68, 0x65, 0x61, 0x64, 0x12, 0x28, 0x0a, 0x0a, 0x6d, 0x73, 0x67, 0x53, 0x65, 0x67, 0x68, 0x65, + 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x53, 0x65, 0x67, 0x48, 0x65, + 0x61, 0x64, 0x52, 0x0a, 0x6d, 0x73, 0x67, 0x53, 0x65, 0x67, 0x68, 0x65, 0x61, 0x64, 0x12, 0x1c, + 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x74, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x74, + 0x63, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x68, 0x74, 0x63, 0x6f, + 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x73, 0x70, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x72, 0x73, 0x70, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x69, 0x73, 0x52, 0x65, 0x73, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x69, + 0x73, 0x52, 0x65, 0x73, 0x65, 0x74, 0x22, 0x91, 0x02, 0x0a, 0x0f, 0x44, 0x61, 0x74, 0x61, 0x48, + 0x69, 0x67, 0x68, 0x77, 0x61, 0x79, 0x48, 0x65, 0x61, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x69, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x73, + 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x66, 0x6c, 0x61, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x66, 0x6c, 0x61, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x12, 0x1a, + 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x49, 0x64, 0x22, 0xe5, 0x02, 0x0a, 0x07, 0x53, + 0x65, 0x67, 0x48, 0x65, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x69, 0x7a, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x72, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x66, 0x6c, 0x61, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x66, 0x6c, + 0x61, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x64, 0x35, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x03, 0x6d, 0x64, 0x35, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x64, 0x35, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x64, 0x35, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x41, 0x64, 0x64, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1e, 0x0a, 0x0a, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x69, 0x70, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x69, 0x70, 0x22, 0xc5, 0x04, 0x0a, 0x0b, 0x54, 0x72, 0x79, 0x55, 0x70, 0x49, 0x6d, 0x67, 0x52, + 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x72, 0x63, 0x55, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x06, 0x73, 0x72, 0x63, 0x55, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x65, + 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x64, 0x35, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x64, 0x35, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, + 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x69, + 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x54, 0x65, 0x72, 0x6d, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x72, 0x63, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x22, 0x0a, 0x0c, + 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x54, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x62, 0x75, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x63, 0x57, + 0x69, 0x64, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x69, 0x63, 0x57, + 0x69, 0x64, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x69, 0x63, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x69, 0x63, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x07, 0x70, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x49, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x69, 0x6e, 0x6e, 0x65, 0x72, + 0x49, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x50, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x50, 0x69, 0x63, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x50, 0x69, + 0x63, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, + 0x6c, 0x50, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x73, 0x74, 0x55, 0x69, 0x6e, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x06, 0x64, 0x73, 0x74, 0x55, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x72, + 0x76, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, + 0x72, 0x76, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x55, 0x72, 0x6c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x55, 0x72, 0x6c, 0x22, 0x94, 0x02, 0x0a, 0x0c, 0x54, + 0x72, 0x79, 0x55, 0x70, 0x49, 0x6d, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x66, + 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x66, 0x69, 0x6c, + 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x66, + 0x61, 0x69, 0x6c, 0x4d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x61, + 0x69, 0x6c, 0x4d, 0x73, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x6c, + 0x65, 0x45, 0x78, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x62, 0x6f, 0x6f, + 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x74, 0x12, 0x28, 0x0a, 0x0a, 0x6d, 0x73, 0x67, + 0x49, 0x6d, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, + 0x49, 0x6d, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x6d, 0x73, 0x67, 0x49, 0x6d, 0x67, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x55, 0x70, 0x49, + 0x70, 0x18, 0x06, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x55, + 0x70, 0x49, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x55, 0x70, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x55, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x70, 0x55, 0x6b, 0x65, + 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x75, 0x70, 0x55, 0x6b, 0x65, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x66, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x66, 0x69, + 0x64, 0x22, 0x99, 0x01, 0x0a, 0x07, 0x49, 0x6d, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, + 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x64, 0x35, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x64, 0x35, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1e, 0x0a, + 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3a, 0x0a, + 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x74, + 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x72, 0x6f, + 0x6d, 0x55, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x72, 0x6f, 0x6d, + 0x55, 0x69, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x55, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x55, 0x69, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x73, 0x67, 0x53, 0x65, 0x71, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x73, 0x67, 0x53, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x6d, + 0x73, 0x67, 0x55, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x73, 0x67, + 0x55, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x03, 0x73, 0x69, 0x67, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_data_proto_rawDescOnce sync.Once + file_data_proto_rawDescData = file_data_proto_rawDesc +) + +func file_data_proto_rawDescGZIP() []byte { + file_data_proto_rawDescOnce.Do(func() { + file_data_proto_rawDescData = protoimpl.X.CompressGZIP(file_data_proto_rawDescData) + }) + return file_data_proto_rawDescData +} + +var file_data_proto_msgTypes = make([]protoimpl.MessageInfo, 15) +var file_data_proto_goTypes = []interface{}{ + (*DeviceInfo)(nil), // 0: DeviceInfo + (*RequestBody)(nil), // 1: RequestBody + (*ConfigSeq)(nil), // 2: ConfigSeq + (*D50ReqBody)(nil), // 3: D50ReqBody + (*D388ReqBody)(nil), // 4: D388ReqBody + (*D388RespBody)(nil), // 5: D388RespBody + (*ReqDataHighwayHead)(nil), // 6: ReqDataHighwayHead + (*RspDataHighwayHead)(nil), // 7: RspDataHighwayHead + (*DataHighwayHead)(nil), // 8: DataHighwayHead + (*SegHead)(nil), // 9: SegHead + (*TryUpImgReq)(nil), // 10: TryUpImgReq + (*TryUpImgResp)(nil), // 11: TryUpImgResp + (*ImgInfo)(nil), // 12: ImgInfo + (*DeleteMessageRequest)(nil), // 13: DeleteMessageRequest + (*MessageItem)(nil), // 14: MessageItem +} +var file_data_proto_depIdxs = []int32{ + 2, // 0: RequestBody.rpt_config_list:type_name -> ConfigSeq + 10, // 1: D388ReqBody.msgTryupImgReq:type_name -> TryUpImgReq + 11, // 2: D388RespBody.msgTryupImgRsp:type_name -> TryUpImgResp + 8, // 3: ReqDataHighwayHead.msgBasehead:type_name -> DataHighwayHead + 9, // 4: ReqDataHighwayHead.msgSeghead:type_name -> SegHead + 8, // 5: RspDataHighwayHead.msgBasehead:type_name -> DataHighwayHead + 9, // 6: RspDataHighwayHead.msgSeghead:type_name -> SegHead + 12, // 7: TryUpImgResp.msgImgInfo:type_name -> ImgInfo + 14, // 8: DeleteMessageRequest.items:type_name -> MessageItem + 9, // [9:9] is the sub-list for method output_type + 9, // [9:9] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name +} + +func init() { file_data_proto_init() } +func file_data_proto_init() { + if File_data_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_data_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeviceInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RequestBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConfigSeq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*D50ReqBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*D388ReqBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*D388RespBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReqDataHighwayHead); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RspDataHighwayHead); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataHighwayHead); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SegHead); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TryUpImgReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TryUpImgResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImgInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteMessageRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MessageItem); 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{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_data_proto_rawDesc, + NumEnums: 0, + NumMessages: 15, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_data_proto_goTypes, + DependencyIndexes: file_data_proto_depIdxs, + MessageInfos: file_data_proto_msgTypes, + }.Build() + File_data_proto = out.File + file_data_proto_rawDesc = nil + file_data_proto_goTypes = nil + file_data_proto_depIdxs = nil +} diff --git a/client/pb/data.proto b/client/pb/data.proto new file mode 100644 index 00000000..6ffb1700 --- /dev/null +++ b/client/pb/data.proto @@ -0,0 +1,157 @@ +syntax = "proto3"; + +option go_package = ".;pb"; + +message DeviceInfo { + string bootloader = 1; + string procVersion = 2; + string codename = 3; + string incremental = 4; + string fingerprint = 5; + string bootId = 6; + string androidId = 7; + string baseBand = 8; + string innerVersion = 9; +} + +message RequestBody { + repeated ConfigSeq rpt_config_list = 1; +} + +message ConfigSeq { + int32 type = 1; + int32 version = 2; +} + +message D50ReqBody { + int64 appid = 1; + int32 maxPkgSize = 2; + int32 startTime = 3; + int32 startIndex = 4; + int32 reqNum = 5; + repeated int64 uinList = 6; + int32 reqMusicSwitch = 91001; + int32 reqMutualmarkAlienation = 101001; + int32 reqMutualmarkScore = 141001; + int32 reqKsingSwitch = 151001; + int32 reqMutualmarkLbsshare = 181001; +} + +message D388ReqBody { + int32 netType = 1; + int32 subcmd = 2; + repeated TryUpImgReq msgTryupImgReq = 3; + int32 commandId = 7; + bytes extension = 1001; +} + +message D388RespBody { + int32 clientIp = 1; + int32 subCmd = 2; + repeated TryUpImgResp msgTryupImgRsp = 3; +} + +message ReqDataHighwayHead { + DataHighwayHead msgBasehead = 1; + SegHead msgSeghead = 2; + bytes reqExtendinfo = 3; + int64 timestamp = 4; + //LoginSigHead? msgLoginSigHead = 5; +} + +message RspDataHighwayHead { + DataHighwayHead msgBasehead = 1; + SegHead msgSeghead = 2; + int32 errorCode = 3; + int32 allowRetry = 4; + int32 cachecost = 5; + int32 htcost = 6; + bytes rspExtendinfo = 7; + int64 timestamp = 8; + int64 range = 9; + int32 isReset = 10; +} + +message DataHighwayHead { + int32 version = 1; + string uin = 2; + string command = 3; + int32 seq = 4; + int32 retryTimes = 5; + int32 appid = 6; + int32 dataflag = 7; + int32 commandId = 8; + string buildVer = 9; + int32 localeId = 10; +} + +message SegHead { + int32 serviceid = 1; + int64 filesize = 2; + int64 dataoffset = 3; + int32 datalength = 4; + int32 rtcode = 5; + bytes serviceticket = 6; + int32 flag = 7; + bytes md5 = 8; + bytes fileMd5 = 9; + int32 cacheAddr = 10; + int32 queryTimes = 11; + int32 updateCacheip = 12; +} + +message TryUpImgReq { + int64 groupCode = 1; + int64 srcUin = 2; + int64 fileId = 3; + bytes fileMd5 = 4; + int64 fileSize = 5; + string fileName = 6; + int32 srcTerm = 7; + int32 platformType = 8; + int32 buType = 9; + int32 picWidth = 10; + int32 picHeight = 11; + int32 picType = 12; + string buildVer = 13; + int32 innerIp = 14; + int32 appPicType = 15; + int32 originalPic = 16; + bytes fileIndex = 17; + int64 dstUin = 18; + int32 srvUpload = 19; + bytes transferUrl = 20; +} + +message TryUpImgResp { + int64 fileId = 1; + int32 result = 2; + string failMsg = 3; + bool boolFileExit = 4; + ImgInfo msgImgInfo = 5; + repeated int32 uint32UpIp = 6; + repeated int32 uint32UpPort = 7; + bytes upUkey = 8; + int64 fid = 9; +} + +message ImgInfo { + bytes fileMd5 = 1; + int32 fileType = 2; + int64 fileSize = 3; + int32 fileWidth = 4; + int32 fileHeight = 5; +} + +message DeleteMessageRequest { + repeated MessageItem items = 1; +} + +message MessageItem { + int64 fromUin = 1; + int64 toUin = 2; + int32 msgType = 3; + int32 msgSeq = 4; + int64 msgUid = 5; + bytes sig = 7; +} \ No newline at end of file diff --git a/client/pb/msg/msg.pb.go b/client/pb/msg/msg.pb.go new file mode 100644 index 00000000..30d70386 --- /dev/null +++ b/client/pb/msg/msg.pb.go @@ -0,0 +1,5402 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.11.4 +// source: msg.proto + +package msg + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type SyncFlag int32 + +const ( + SyncFlag_START SyncFlag = 0 + SyncFlag_CONTINUME SyncFlag = 1 + SyncFlag_STOP SyncFlag = 2 +) + +// Enum value maps for SyncFlag. +var ( + SyncFlag_name = map[int32]string{ + 0: "START", + 1: "CONTINUME", + 2: "STOP", + } + SyncFlag_value = map[string]int32{ + "START": 0, + "CONTINUME": 1, + "STOP": 2, + } +) + +func (x SyncFlag) Enum() *SyncFlag { + p := new(SyncFlag) + *p = x + return p +} + +func (x SyncFlag) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SyncFlag) Descriptor() protoreflect.EnumDescriptor { + return file_msg_proto_enumTypes[0].Descriptor() +} + +func (SyncFlag) Type() protoreflect.EnumType { + return &file_msg_proto_enumTypes[0] +} + +func (x SyncFlag) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SyncFlag.Descriptor instead. +func (SyncFlag) EnumDescriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{0} +} + +type GetMessageRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SyncFlag SyncFlag `protobuf:"varint,1,opt,name=syncFlag,proto3,enum=SyncFlag" json:"syncFlag,omitempty"` + SyncCookie []byte `protobuf:"bytes,2,opt,name=syncCookie,proto3" json:"syncCookie,omitempty"` + RambleFlag int32 `protobuf:"varint,3,opt,name=rambleFlag,proto3" json:"rambleFlag,omitempty"` + LatestRambleNumber int32 `protobuf:"varint,4,opt,name=latestRambleNumber,proto3" json:"latestRambleNumber,omitempty"` + OtherRambleNumber int32 `protobuf:"varint,5,opt,name=otherRambleNumber,proto3" json:"otherRambleNumber,omitempty"` + OnlineSyncFlag int32 `protobuf:"varint,6,opt,name=onlineSyncFlag,proto3" json:"onlineSyncFlag,omitempty"` + ContextFlag int32 `protobuf:"varint,7,opt,name=contextFlag,proto3" json:"contextFlag,omitempty"` + WhisperSessionId int32 `protobuf:"varint,8,opt,name=whisperSessionId,proto3" json:"whisperSessionId,omitempty"` + MsgReqType int32 `protobuf:"varint,9,opt,name=msgReqType,proto3" json:"msgReqType,omitempty"` + PubaccountCookie []byte `protobuf:"bytes,10,opt,name=pubaccountCookie,proto3" json:"pubaccountCookie,omitempty"` + MsgCtrlBuf []byte `protobuf:"bytes,11,opt,name=msgCtrlBuf,proto3" json:"msgCtrlBuf,omitempty"` + ServerBuf []byte `protobuf:"bytes,12,opt,name=serverBuf,proto3" json:"serverBuf,omitempty"` +} + +func (x *GetMessageRequest) Reset() { + *x = GetMessageRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetMessageRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetMessageRequest) ProtoMessage() {} + +func (x *GetMessageRequest) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[0] + 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 GetMessageRequest.ProtoReflect.Descriptor instead. +func (*GetMessageRequest) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{0} +} + +func (x *GetMessageRequest) GetSyncFlag() SyncFlag { + if x != nil { + return x.SyncFlag + } + return SyncFlag_START +} + +func (x *GetMessageRequest) GetSyncCookie() []byte { + if x != nil { + return x.SyncCookie + } + return nil +} + +func (x *GetMessageRequest) GetRambleFlag() int32 { + if x != nil { + return x.RambleFlag + } + return 0 +} + +func (x *GetMessageRequest) GetLatestRambleNumber() int32 { + if x != nil { + return x.LatestRambleNumber + } + return 0 +} + +func (x *GetMessageRequest) GetOtherRambleNumber() int32 { + if x != nil { + return x.OtherRambleNumber + } + return 0 +} + +func (x *GetMessageRequest) GetOnlineSyncFlag() int32 { + if x != nil { + return x.OnlineSyncFlag + } + return 0 +} + +func (x *GetMessageRequest) GetContextFlag() int32 { + if x != nil { + return x.ContextFlag + } + return 0 +} + +func (x *GetMessageRequest) GetWhisperSessionId() int32 { + if x != nil { + return x.WhisperSessionId + } + return 0 +} + +func (x *GetMessageRequest) GetMsgReqType() int32 { + if x != nil { + return x.MsgReqType + } + return 0 +} + +func (x *GetMessageRequest) GetPubaccountCookie() []byte { + if x != nil { + return x.PubaccountCookie + } + return nil +} + +func (x *GetMessageRequest) GetMsgCtrlBuf() []byte { + if x != nil { + return x.MsgCtrlBuf + } + return nil +} + +func (x *GetMessageRequest) GetServerBuf() []byte { + if x != nil { + return x.ServerBuf + } + return nil +} + +type SendMessageRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RoutingHead *RoutingHead `protobuf:"bytes,1,opt,name=routingHead,proto3" json:"routingHead,omitempty"` + ContentHead *ContentHead `protobuf:"bytes,2,opt,name=contentHead,proto3" json:"contentHead,omitempty"` + MsgBody *MessageBody `protobuf:"bytes,3,opt,name=msgBody,proto3" json:"msgBody,omitempty"` + MsgSeq int32 `protobuf:"varint,4,opt,name=msgSeq,proto3" json:"msgSeq,omitempty"` + MsgRand int32 `protobuf:"varint,5,opt,name=msgRand,proto3" json:"msgRand,omitempty"` + SyncCookie []byte `protobuf:"bytes,6,opt,name=syncCookie,proto3" json:"syncCookie,omitempty"` + //MsgComm.AppShareInfo? appShare = 7; + MsgVia int32 `protobuf:"varint,8,opt,name=msgVia,proto3" json:"msgVia,omitempty"` + DataStatist int32 `protobuf:"varint,9,opt,name=dataStatist,proto3" json:"dataStatist,omitempty"` + //MultiMsgAssist? multiMsgAssist = 10; + //PbInputNotifyInfo? inputNotifyInfo = 11; + MsgCtrl *MsgCtrl `protobuf:"bytes,12,opt,name=msgCtrl,proto3" json:"msgCtrl,omitempty"` + //ImReceipt.ReceiptReq? receiptReq = 13; + MultiSendSeq int32 `protobuf:"varint,14,opt,name=multiSendSeq,proto3" json:"multiSendSeq,omitempty"` +} + +func (x *SendMessageRequest) Reset() { + *x = SendMessageRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SendMessageRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SendMessageRequest) ProtoMessage() {} + +func (x *SendMessageRequest) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[1] + 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 SendMessageRequest.ProtoReflect.Descriptor instead. +func (*SendMessageRequest) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{1} +} + +func (x *SendMessageRequest) GetRoutingHead() *RoutingHead { + if x != nil { + return x.RoutingHead + } + return nil +} + +func (x *SendMessageRequest) GetContentHead() *ContentHead { + if x != nil { + return x.ContentHead + } + return nil +} + +func (x *SendMessageRequest) GetMsgBody() *MessageBody { + if x != nil { + return x.MsgBody + } + return nil +} + +func (x *SendMessageRequest) GetMsgSeq() int32 { + if x != nil { + return x.MsgSeq + } + return 0 +} + +func (x *SendMessageRequest) GetMsgRand() int32 { + if x != nil { + return x.MsgRand + } + return 0 +} + +func (x *SendMessageRequest) GetSyncCookie() []byte { + if x != nil { + return x.SyncCookie + } + return nil +} + +func (x *SendMessageRequest) GetMsgVia() int32 { + if x != nil { + return x.MsgVia + } + return 0 +} + +func (x *SendMessageRequest) GetDataStatist() int32 { + if x != nil { + return x.DataStatist + } + return 0 +} + +func (x *SendMessageRequest) GetMsgCtrl() *MsgCtrl { + if x != nil { + return x.MsgCtrl + } + return nil +} + +func (x *SendMessageRequest) GetMultiSendSeq() int32 { + if x != nil { + return x.MultiSendSeq + } + return 0 +} + +type RoutingHead struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + C2C *C2C `protobuf:"bytes,1,opt,name=c2c,proto3" json:"c2c,omitempty"` + Grp *Grp `protobuf:"bytes,2,opt,name=grp,proto3" json:"grp,omitempty"` + GrpTmp *GrpTmp `protobuf:"bytes,3,opt,name=grpTmp,proto3" json:"grpTmp,omitempty"` +} + +func (x *RoutingHead) Reset() { + *x = RoutingHead{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoutingHead) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoutingHead) ProtoMessage() {} + +func (x *RoutingHead) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[2] + 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 RoutingHead.ProtoReflect.Descriptor instead. +func (*RoutingHead) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{2} +} + +func (x *RoutingHead) GetC2C() *C2C { + if x != nil { + return x.C2C + } + return nil +} + +func (x *RoutingHead) GetGrp() *Grp { + if x != nil { + return x.Grp + } + return nil +} + +func (x *RoutingHead) GetGrpTmp() *GrpTmp { + if x != nil { + return x.GrpTmp + } + return nil +} + +type C2C struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ToUin int64 `protobuf:"varint,1,opt,name=toUin,proto3" json:"toUin,omitempty"` +} + +func (x *C2C) Reset() { + *x = C2C{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *C2C) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*C2C) ProtoMessage() {} + +func (x *C2C) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[3] + 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 C2C.ProtoReflect.Descriptor instead. +func (*C2C) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{3} +} + +func (x *C2C) GetToUin() int64 { + if x != nil { + return x.ToUin + } + return 0 +} + +type Grp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupCode int64 `protobuf:"varint,1,opt,name=groupCode,proto3" json:"groupCode,omitempty"` +} + +func (x *Grp) Reset() { + *x = Grp{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Grp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Grp) ProtoMessage() {} + +func (x *Grp) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[4] + 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 Grp.ProtoReflect.Descriptor instead. +func (*Grp) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{4} +} + +func (x *Grp) GetGroupCode() int64 { + if x != nil { + return x.GroupCode + } + return 0 +} + +type GrpTmp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupUin int64 `protobuf:"varint,1,opt,name=groupUin,proto3" json:"groupUin,omitempty"` + ToUin int64 `protobuf:"varint,2,opt,name=toUin,proto3" json:"toUin,omitempty"` +} + +func (x *GrpTmp) Reset() { + *x = GrpTmp{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GrpTmp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GrpTmp) ProtoMessage() {} + +func (x *GrpTmp) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[5] + 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 GrpTmp.ProtoReflect.Descriptor instead. +func (*GrpTmp) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{5} +} + +func (x *GrpTmp) GetGroupUin() int64 { + if x != nil { + return x.GroupUin + } + return 0 +} + +func (x *GrpTmp) GetToUin() int64 { + if x != nil { + return x.ToUin + } + return 0 +} + +type MsgCtrl struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MsgFlag int32 `protobuf:"varint,1,opt,name=msgFlag,proto3" json:"msgFlag,omitempty"` +} + +func (x *MsgCtrl) Reset() { + *x = MsgCtrl{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgCtrl) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgCtrl) ProtoMessage() {} + +func (x *MsgCtrl) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[6] + 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 MsgCtrl.ProtoReflect.Descriptor instead. +func (*MsgCtrl) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{6} +} + +func (x *MsgCtrl) GetMsgFlag() int32 { + if x != nil { + return x.MsgFlag + } + return 0 +} + +type GetMessageResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Result int32 `protobuf:"varint,1,opt,name=result,proto3" json:"result,omitempty"` + ErrorMessage string `protobuf:"bytes,2,opt,name=errorMessage,proto3" json:"errorMessage,omitempty"` + SyncCookie []byte `protobuf:"bytes,3,opt,name=syncCookie,proto3" json:"syncCookie,omitempty"` + SyncFlag SyncFlag `protobuf:"varint,4,opt,name=syncFlag,proto3,enum=SyncFlag" json:"syncFlag,omitempty"` + UinPairMsgs []*UinPairMessage `protobuf:"bytes,5,rep,name=uinPairMsgs,proto3" json:"uinPairMsgs,omitempty"` + BindUin int64 `protobuf:"varint,6,opt,name=bindUin,proto3" json:"bindUin,omitempty"` + MsgRspType int32 `protobuf:"varint,7,opt,name=msgRspType,proto3" json:"msgRspType,omitempty"` + PubAccountCookie []byte `protobuf:"bytes,8,opt,name=pubAccountCookie,proto3" json:"pubAccountCookie,omitempty"` + IsPartialSync bool `protobuf:"varint,9,opt,name=isPartialSync,proto3" json:"isPartialSync,omitempty"` + MsgCtrlBuf []byte `protobuf:"bytes,10,opt,name=msgCtrlBuf,proto3" json:"msgCtrlBuf,omitempty"` +} + +func (x *GetMessageResponse) Reset() { + *x = GetMessageResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetMessageResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetMessageResponse) ProtoMessage() {} + +func (x *GetMessageResponse) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[7] + 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 GetMessageResponse.ProtoReflect.Descriptor instead. +func (*GetMessageResponse) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{7} +} + +func (x *GetMessageResponse) GetResult() int32 { + if x != nil { + return x.Result + } + return 0 +} + +func (x *GetMessageResponse) GetErrorMessage() string { + if x != nil { + return x.ErrorMessage + } + return "" +} + +func (x *GetMessageResponse) GetSyncCookie() []byte { + if x != nil { + return x.SyncCookie + } + return nil +} + +func (x *GetMessageResponse) GetSyncFlag() SyncFlag { + if x != nil { + return x.SyncFlag + } + return SyncFlag_START +} + +func (x *GetMessageResponse) GetUinPairMsgs() []*UinPairMessage { + if x != nil { + return x.UinPairMsgs + } + return nil +} + +func (x *GetMessageResponse) GetBindUin() int64 { + if x != nil { + return x.BindUin + } + return 0 +} + +func (x *GetMessageResponse) GetMsgRspType() int32 { + if x != nil { + return x.MsgRspType + } + return 0 +} + +func (x *GetMessageResponse) GetPubAccountCookie() []byte { + if x != nil { + return x.PubAccountCookie + } + return nil +} + +func (x *GetMessageResponse) GetIsPartialSync() bool { + if x != nil { + return x.IsPartialSync + } + return false +} + +func (x *GetMessageResponse) GetMsgCtrlBuf() []byte { + if x != nil { + return x.MsgCtrlBuf + } + return nil +} + +type PushMessagePacket struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message *Message `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + Svrip int32 `protobuf:"varint,2,opt,name=svrip,proto3" json:"svrip,omitempty"` + PushToken []byte `protobuf:"bytes,3,opt,name=pushToken,proto3" json:"pushToken,omitempty"` + PingFLag int32 `protobuf:"varint,4,opt,name=pingFLag,proto3" json:"pingFLag,omitempty"` + GeneralFlag int32 `protobuf:"varint,9,opt,name=generalFlag,proto3" json:"generalFlag,omitempty"` +} + +func (x *PushMessagePacket) Reset() { + *x = PushMessagePacket{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PushMessagePacket) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PushMessagePacket) ProtoMessage() {} + +func (x *PushMessagePacket) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[8] + 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 PushMessagePacket.ProtoReflect.Descriptor instead. +func (*PushMessagePacket) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{8} +} + +func (x *PushMessagePacket) GetMessage() *Message { + if x != nil { + return x.Message + } + return nil +} + +func (x *PushMessagePacket) GetSvrip() int32 { + if x != nil { + return x.Svrip + } + return 0 +} + +func (x *PushMessagePacket) GetPushToken() []byte { + if x != nil { + return x.PushToken + } + return nil +} + +func (x *PushMessagePacket) GetPingFLag() int32 { + if x != nil { + return x.PingFLag + } + return 0 +} + +func (x *PushMessagePacket) GetGeneralFlag() int32 { + if x != nil { + return x.GeneralFlag + } + return 0 +} + +type UinPairMessage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LastReadTime int32 `protobuf:"varint,1,opt,name=lastReadTime,proto3" json:"lastReadTime,omitempty"` + PeerUin int64 `protobuf:"varint,2,opt,name=peerUin,proto3" json:"peerUin,omitempty"` + MsgCompleted int32 `protobuf:"varint,3,opt,name=msgCompleted,proto3" json:"msgCompleted,omitempty"` + Messages []*Message `protobuf:"bytes,4,rep,name=messages,proto3" json:"messages,omitempty"` +} + +func (x *UinPairMessage) Reset() { + *x = UinPairMessage{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UinPairMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UinPairMessage) ProtoMessage() {} + +func (x *UinPairMessage) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[9] + 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 UinPairMessage.ProtoReflect.Descriptor instead. +func (*UinPairMessage) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{9} +} + +func (x *UinPairMessage) GetLastReadTime() int32 { + if x != nil { + return x.LastReadTime + } + return 0 +} + +func (x *UinPairMessage) GetPeerUin() int64 { + if x != nil { + return x.PeerUin + } + return 0 +} + +func (x *UinPairMessage) GetMsgCompleted() int32 { + if x != nil { + return x.MsgCompleted + } + return 0 +} + +func (x *UinPairMessage) GetMessages() []*Message { + if x != nil { + return x.Messages + } + return nil +} + +type Message struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Head *MessageHead `protobuf:"bytes,1,opt,name=head,proto3" json:"head,omitempty"` + Body *MessageBody `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` +} + +func (x *Message) Reset() { + *x = Message{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Message) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Message) ProtoMessage() {} + +func (x *Message) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[10] + 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 Message.ProtoReflect.Descriptor instead. +func (*Message) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{10} +} + +func (x *Message) GetHead() *MessageHead { + if x != nil { + return x.Head + } + return nil +} + +func (x *Message) GetBody() *MessageBody { + if x != nil { + return x.Body + } + return nil +} + +type MessageBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RichText *RichText `protobuf:"bytes,1,opt,name=richText,proto3" json:"richText,omitempty"` + MsgContent []byte `protobuf:"bytes,2,opt,name=msgContent,proto3" json:"msgContent,omitempty"` + MsgEncryptContent []byte `protobuf:"bytes,3,opt,name=msgEncryptContent,proto3" json:"msgEncryptContent,omitempty"` +} + +func (x *MessageBody) Reset() { + *x = MessageBody{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MessageBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MessageBody) ProtoMessage() {} + +func (x *MessageBody) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[11] + 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 MessageBody.ProtoReflect.Descriptor instead. +func (*MessageBody) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{11} +} + +func (x *MessageBody) GetRichText() *RichText { + if x != nil { + return x.RichText + } + return nil +} + +func (x *MessageBody) GetMsgContent() []byte { + if x != nil { + return x.MsgContent + } + return nil +} + +func (x *MessageBody) GetMsgEncryptContent() []byte { + if x != nil { + return x.MsgEncryptContent + } + return nil +} + +type RichText struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Attr *Attr `protobuf:"bytes,1,opt,name=attr,proto3" json:"attr,omitempty"` + Elems []*Elem `protobuf:"bytes,2,rep,name=elems,proto3" json:"elems,omitempty"` + NotOnlineFile *NotOnlineFile `protobuf:"bytes,3,opt,name=notOnlineFile,proto3" json:"notOnlineFile,omitempty"` + Ptt *Ptt `protobuf:"bytes,4,opt,name=ptt,proto3" json:"ptt,omitempty"` +} + +func (x *RichText) Reset() { + *x = RichText{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RichText) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RichText) ProtoMessage() {} + +func (x *RichText) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[12] + 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 RichText.ProtoReflect.Descriptor instead. +func (*RichText) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{12} +} + +func (x *RichText) GetAttr() *Attr { + if x != nil { + return x.Attr + } + return nil +} + +func (x *RichText) GetElems() []*Elem { + if x != nil { + return x.Elems + } + return nil +} + +func (x *RichText) GetNotOnlineFile() *NotOnlineFile { + if x != nil { + return x.NotOnlineFile + } + return nil +} + +func (x *RichText) GetPtt() *Ptt { + if x != nil { + return x.Ptt + } + return nil +} + +type Elem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Text *Text `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` + Face *Face `protobuf:"bytes,2,opt,name=face,proto3" json:"face,omitempty"` + OnlineImage *OnlineImage `protobuf:"bytes,3,opt,name=onlineImage,proto3" json:"onlineImage,omitempty"` + NotOnlineImage *NotOnlineImage `protobuf:"bytes,4,opt,name=notOnlineImage,proto3" json:"notOnlineImage,omitempty"` + //TransElem transElemInfo = 5; + //MarketFace marketFace = 6; + //ElemFlags elemFlags = 7; + CustomFace *CustomFace `protobuf:"bytes,8,opt,name=customFace,proto3" json:"customFace,omitempty"` + //ElemFlags2 elemFlags2 = 9; + //FunFace funFace = 10; + //SecretFileMsg secretFile = 11; + //RichMsg richMsg = 12; + GroupFile *GroupFile `protobuf:"bytes,13,opt,name=groupFile,proto3" json:"groupFile,omitempty"` + //PubGroup pubGroup = 14; + //MarketTrans marketTrans = 15; + ExtraInfo *ExtraInfo `protobuf:"bytes,16,opt,name=extraInfo,proto3" json:"extraInfo,omitempty"` + //ShakeWindow? shakeWindow = 17; + //PubAccount? pubAccount = 18; + VideoFile *VideoFile `protobuf:"bytes,19,opt,name=videoFile,proto3" json:"videoFile,omitempty"` + //TipsInfo? tipsInfo = 20; + AnonGroupMsg *AnonymousGroupMessage `protobuf:"bytes,21,opt,name=anonGroupMsg,proto3" json:"anonGroupMsg,omitempty"` + //QQLiveOld? qqLiveOld = 22; + //LifeOnlineAccount? lifeOnline = 23; + //QQWalletMsg? qqwalletMsg = 24; + //CrmElem? crmElem = 25; + //ConferenceTipsInfo? conferenceTipsInfo = 26; + //RedBagInfo? redbagInfo = 27; + //LowVersionTips? lowVersionTips = 28; + //bytes bankcodeCtrlInfo = 29; + //NearByMessageType? nearByMsg = 30; + CustomElem *CustomElem `protobuf:"bytes,31,opt,name=customElem,proto3" json:"customElem,omitempty"` +} + +func (x *Elem) Reset() { + *x = Elem{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Elem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Elem) ProtoMessage() {} + +func (x *Elem) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[13] + 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 Elem.ProtoReflect.Descriptor instead. +func (*Elem) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{13} +} + +func (x *Elem) GetText() *Text { + if x != nil { + return x.Text + } + return nil +} + +func (x *Elem) GetFace() *Face { + if x != nil { + return x.Face + } + return nil +} + +func (x *Elem) GetOnlineImage() *OnlineImage { + if x != nil { + return x.OnlineImage + } + return nil +} + +func (x *Elem) GetNotOnlineImage() *NotOnlineImage { + if x != nil { + return x.NotOnlineImage + } + return nil +} + +func (x *Elem) GetCustomFace() *CustomFace { + if x != nil { + return x.CustomFace + } + return nil +} + +func (x *Elem) GetGroupFile() *GroupFile { + if x != nil { + return x.GroupFile + } + return nil +} + +func (x *Elem) GetExtraInfo() *ExtraInfo { + if x != nil { + return x.ExtraInfo + } + return nil +} + +func (x *Elem) GetVideoFile() *VideoFile { + if x != nil { + return x.VideoFile + } + return nil +} + +func (x *Elem) GetAnonGroupMsg() *AnonymousGroupMessage { + if x != nil { + return x.AnonGroupMsg + } + return nil +} + +func (x *Elem) GetCustomElem() *CustomElem { + if x != nil { + return x.CustomElem + } + return nil +} + +type CustomElem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Desc []byte `protobuf:"bytes,1,opt,name=desc,proto3" json:"desc,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + EnumType int32 `protobuf:"varint,3,opt,name=enumType,proto3" json:"enumType,omitempty"` + Ext []byte `protobuf:"bytes,4,opt,name=ext,proto3" json:"ext,omitempty"` + Sound []byte `protobuf:"bytes,5,opt,name=sound,proto3" json:"sound,omitempty"` +} + +func (x *CustomElem) Reset() { + *x = CustomElem{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CustomElem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CustomElem) ProtoMessage() {} + +func (x *CustomElem) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[14] + 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 CustomElem.ProtoReflect.Descriptor instead. +func (*CustomElem) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{14} +} + +func (x *CustomElem) GetDesc() []byte { + if x != nil { + return x.Desc + } + return nil +} + +func (x *CustomElem) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *CustomElem) GetEnumType() int32 { + if x != nil { + return x.EnumType + } + return 0 +} + +func (x *CustomElem) GetExt() []byte { + if x != nil { + return x.Ext + } + return nil +} + +func (x *CustomElem) GetSound() []byte { + if x != nil { + return x.Sound + } + return nil +} + +type Text struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Str string `protobuf:"bytes,1,opt,name=str,proto3" json:"str,omitempty"` + Link string `protobuf:"bytes,2,opt,name=link,proto3" json:"link,omitempty"` + Attr6Buf []byte `protobuf:"bytes,3,opt,name=attr6Buf,proto3" json:"attr6Buf,omitempty"` + Attr7Buf []byte `protobuf:"bytes,4,opt,name=attr7Buf,proto3" json:"attr7Buf,omitempty"` + Buf []byte `protobuf:"bytes,11,opt,name=buf,proto3" json:"buf,omitempty"` + PbReserve []byte `protobuf:"bytes,12,opt,name=pbReserve,proto3" json:"pbReserve,omitempty"` +} + +func (x *Text) Reset() { + *x = Text{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Text) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Text) ProtoMessage() {} + +func (x *Text) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[15] + 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 Text.ProtoReflect.Descriptor instead. +func (*Text) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{15} +} + +func (x *Text) GetStr() string { + if x != nil { + return x.Str + } + return "" +} + +func (x *Text) GetLink() string { + if x != nil { + return x.Link + } + return "" +} + +func (x *Text) GetAttr6Buf() []byte { + if x != nil { + return x.Attr6Buf + } + return nil +} + +func (x *Text) GetAttr7Buf() []byte { + if x != nil { + return x.Attr7Buf + } + return nil +} + +func (x *Text) GetBuf() []byte { + if x != nil { + return x.Buf + } + return nil +} + +func (x *Text) GetPbReserve() []byte { + if x != nil { + return x.PbReserve + } + return nil +} + +type Attr struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CodePage int32 `protobuf:"varint,1,opt,name=codePage,proto3" json:"codePage,omitempty"` + Time int32 `protobuf:"varint,2,opt,name=time,proto3" json:"time,omitempty"` + Random int32 `protobuf:"varint,3,opt,name=random,proto3" json:"random,omitempty"` + Color int32 `protobuf:"varint,4,opt,name=color,proto3" json:"color,omitempty"` + Size int32 `protobuf:"varint,5,opt,name=size,proto3" json:"size,omitempty"` + Effect int32 `protobuf:"varint,6,opt,name=effect,proto3" json:"effect,omitempty"` + CharSet int32 `protobuf:"varint,7,opt,name=charSet,proto3" json:"charSet,omitempty"` + PitchAndFamily int32 `protobuf:"varint,8,opt,name=pitchAndFamily,proto3" json:"pitchAndFamily,omitempty"` + FontName string `protobuf:"bytes,9,opt,name=fontName,proto3" json:"fontName,omitempty"` + ReserveData []byte `protobuf:"bytes,10,opt,name=reserveData,proto3" json:"reserveData,omitempty"` +} + +func (x *Attr) Reset() { + *x = Attr{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Attr) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Attr) ProtoMessage() {} + +func (x *Attr) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[16] + 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 Attr.ProtoReflect.Descriptor instead. +func (*Attr) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{16} +} + +func (x *Attr) GetCodePage() int32 { + if x != nil { + return x.CodePage + } + return 0 +} + +func (x *Attr) GetTime() int32 { + if x != nil { + return x.Time + } + return 0 +} + +func (x *Attr) GetRandom() int32 { + if x != nil { + return x.Random + } + return 0 +} + +func (x *Attr) GetColor() int32 { + if x != nil { + return x.Color + } + return 0 +} + +func (x *Attr) GetSize() int32 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *Attr) GetEffect() int32 { + if x != nil { + return x.Effect + } + return 0 +} + +func (x *Attr) GetCharSet() int32 { + if x != nil { + return x.CharSet + } + return 0 +} + +func (x *Attr) GetPitchAndFamily() int32 { + if x != nil { + return x.PitchAndFamily + } + return 0 +} + +func (x *Attr) GetFontName() string { + if x != nil { + return x.FontName + } + return "" +} + +func (x *Attr) GetReserveData() []byte { + if x != nil { + return x.ReserveData + } + return nil +} + +type Ptt struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FileType int32 `protobuf:"varint,1,opt,name=fileType,proto3" json:"fileType,omitempty"` + SrcUin int64 `protobuf:"varint,2,opt,name=srcUin,proto3" json:"srcUin,omitempty"` + FileUuid []byte `protobuf:"bytes,3,opt,name=fileUuid,proto3" json:"fileUuid,omitempty"` + FileMd5 []byte `protobuf:"bytes,4,opt,name=fileMd5,proto3" json:"fileMd5,omitempty"` + FileName []byte `protobuf:"bytes,5,opt,name=fileName,proto3" json:"fileName,omitempty"` + FileSize int32 `protobuf:"varint,6,opt,name=fileSize,proto3" json:"fileSize,omitempty"` + Reserve []byte `protobuf:"bytes,7,opt,name=reserve,proto3" json:"reserve,omitempty"` + FileId int32 `protobuf:"varint,8,opt,name=fileId,proto3" json:"fileId,omitempty"` + ServerIp int32 `protobuf:"varint,9,opt,name=serverIp,proto3" json:"serverIp,omitempty"` + ServerPort int32 `protobuf:"varint,10,opt,name=serverPort,proto3" json:"serverPort,omitempty"` + BoolValid bool `protobuf:"varint,11,opt,name=boolValid,proto3" json:"boolValid,omitempty"` + Signature []byte `protobuf:"bytes,12,opt,name=signature,proto3" json:"signature,omitempty"` + Shortcut []byte `protobuf:"bytes,13,opt,name=shortcut,proto3" json:"shortcut,omitempty"` + FileKey []byte `protobuf:"bytes,14,opt,name=fileKey,proto3" json:"fileKey,omitempty"` + MagicPttIndex int32 `protobuf:"varint,15,opt,name=magicPttIndex,proto3" json:"magicPttIndex,omitempty"` + VoiceSwitch int32 `protobuf:"varint,16,opt,name=voiceSwitch,proto3" json:"voiceSwitch,omitempty"` + PttUrl []byte `protobuf:"bytes,17,opt,name=pttUrl,proto3" json:"pttUrl,omitempty"` + GroupFileKey []byte `protobuf:"bytes,18,opt,name=groupFileKey,proto3" json:"groupFileKey,omitempty"` + Time int32 `protobuf:"varint,19,opt,name=time,proto3" json:"time,omitempty"` + DownPara []byte `protobuf:"bytes,20,opt,name=downPara,proto3" json:"downPara,omitempty"` + Format int32 `protobuf:"varint,29,opt,name=format,proto3" json:"format,omitempty"` + PbReserve []byte `protobuf:"bytes,30,opt,name=pbReserve,proto3" json:"pbReserve,omitempty"` + BytesPttUrls [][]byte `protobuf:"bytes,31,rep,name=bytesPttUrls,proto3" json:"bytesPttUrls,omitempty"` + DownloadFlag int32 `protobuf:"varint,32,opt,name=downloadFlag,proto3" json:"downloadFlag,omitempty"` +} + +func (x *Ptt) Reset() { + *x = Ptt{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Ptt) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Ptt) ProtoMessage() {} + +func (x *Ptt) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[17] + 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 Ptt.ProtoReflect.Descriptor instead. +func (*Ptt) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{17} +} + +func (x *Ptt) GetFileType() int32 { + if x != nil { + return x.FileType + } + return 0 +} + +func (x *Ptt) GetSrcUin() int64 { + if x != nil { + return x.SrcUin + } + return 0 +} + +func (x *Ptt) GetFileUuid() []byte { + if x != nil { + return x.FileUuid + } + return nil +} + +func (x *Ptt) GetFileMd5() []byte { + if x != nil { + return x.FileMd5 + } + return nil +} + +func (x *Ptt) GetFileName() []byte { + if x != nil { + return x.FileName + } + return nil +} + +func (x *Ptt) GetFileSize() int32 { + if x != nil { + return x.FileSize + } + return 0 +} + +func (x *Ptt) GetReserve() []byte { + if x != nil { + return x.Reserve + } + return nil +} + +func (x *Ptt) GetFileId() int32 { + if x != nil { + return x.FileId + } + return 0 +} + +func (x *Ptt) GetServerIp() int32 { + if x != nil { + return x.ServerIp + } + return 0 +} + +func (x *Ptt) GetServerPort() int32 { + if x != nil { + return x.ServerPort + } + return 0 +} + +func (x *Ptt) GetBoolValid() bool { + if x != nil { + return x.BoolValid + } + return false +} + +func (x *Ptt) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *Ptt) GetShortcut() []byte { + if x != nil { + return x.Shortcut + } + return nil +} + +func (x *Ptt) GetFileKey() []byte { + if x != nil { + return x.FileKey + } + return nil +} + +func (x *Ptt) GetMagicPttIndex() int32 { + if x != nil { + return x.MagicPttIndex + } + return 0 +} + +func (x *Ptt) GetVoiceSwitch() int32 { + if x != nil { + return x.VoiceSwitch + } + return 0 +} + +func (x *Ptt) GetPttUrl() []byte { + if x != nil { + return x.PttUrl + } + return nil +} + +func (x *Ptt) GetGroupFileKey() []byte { + if x != nil { + return x.GroupFileKey + } + return nil +} + +func (x *Ptt) GetTime() int32 { + if x != nil { + return x.Time + } + return 0 +} + +func (x *Ptt) GetDownPara() []byte { + if x != nil { + return x.DownPara + } + return nil +} + +func (x *Ptt) GetFormat() int32 { + if x != nil { + return x.Format + } + return 0 +} + +func (x *Ptt) GetPbReserve() []byte { + if x != nil { + return x.PbReserve + } + return nil +} + +func (x *Ptt) GetBytesPttUrls() [][]byte { + if x != nil { + return x.BytesPttUrls + } + return nil +} + +func (x *Ptt) GetDownloadFlag() int32 { + if x != nil { + return x.DownloadFlag + } + return 0 +} + +type OnlineImage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Guid []byte `protobuf:"bytes,1,opt,name=guid,proto3" json:"guid,omitempty"` + FilePath []byte `protobuf:"bytes,2,opt,name=filePath,proto3" json:"filePath,omitempty"` + OldVerSendFile []byte `protobuf:"bytes,3,opt,name=oldVerSendFile,proto3" json:"oldVerSendFile,omitempty"` +} + +func (x *OnlineImage) Reset() { + *x = OnlineImage{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnlineImage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnlineImage) ProtoMessage() {} + +func (x *OnlineImage) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[18] + 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 OnlineImage.ProtoReflect.Descriptor instead. +func (*OnlineImage) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{18} +} + +func (x *OnlineImage) GetGuid() []byte { + if x != nil { + return x.Guid + } + return nil +} + +func (x *OnlineImage) GetFilePath() []byte { + if x != nil { + return x.FilePath + } + return nil +} + +func (x *OnlineImage) GetOldVerSendFile() []byte { + if x != nil { + return x.OldVerSendFile + } + return nil +} + +type NotOnlineImage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FilePath string `protobuf:"bytes,1,opt,name=filePath,proto3" json:"filePath,omitempty"` + FileLen int32 `protobuf:"varint,2,opt,name=fileLen,proto3" json:"fileLen,omitempty"` + DownloadPath string `protobuf:"bytes,3,opt,name=downloadPath,proto3" json:"downloadPath,omitempty"` + OldVerSendFile []byte `protobuf:"bytes,4,opt,name=oldVerSendFile,proto3" json:"oldVerSendFile,omitempty"` + ImgType int32 `protobuf:"varint,5,opt,name=imgType,proto3" json:"imgType,omitempty"` + PreviewsImage []byte `protobuf:"bytes,6,opt,name=previewsImage,proto3" json:"previewsImage,omitempty"` + PicMd5 []byte `protobuf:"bytes,7,opt,name=picMd5,proto3" json:"picMd5,omitempty"` + PicHeight int32 `protobuf:"varint,8,opt,name=picHeight,proto3" json:"picHeight,omitempty"` + PicWidth int32 `protobuf:"varint,9,opt,name=picWidth,proto3" json:"picWidth,omitempty"` + ResId string `protobuf:"bytes,10,opt,name=resId,proto3" json:"resId,omitempty"` + Flag []byte `protobuf:"bytes,11,opt,name=flag,proto3" json:"flag,omitempty"` + ThumbUrl string `protobuf:"bytes,12,opt,name=thumbUrl,proto3" json:"thumbUrl,omitempty"` + Original int32 `protobuf:"varint,13,opt,name=original,proto3" json:"original,omitempty"` + BigUrl string `protobuf:"bytes,14,opt,name=bigUrl,proto3" json:"bigUrl,omitempty"` + OrigUrl string `protobuf:"bytes,15,opt,name=origUrl,proto3" json:"origUrl,omitempty"` + BizType int32 `protobuf:"varint,16,opt,name=bizType,proto3" json:"bizType,omitempty"` + Result int32 `protobuf:"varint,17,opt,name=result,proto3" json:"result,omitempty"` + Index int32 `protobuf:"varint,18,opt,name=index,proto3" json:"index,omitempty"` + OpFaceBuf []byte `protobuf:"bytes,19,opt,name=opFaceBuf,proto3" json:"opFaceBuf,omitempty"` + OldPicMd5 bool `protobuf:"varint,20,opt,name=oldPicMd5,proto3" json:"oldPicMd5,omitempty"` + ThumbWidth int32 `protobuf:"varint,21,opt,name=thumbWidth,proto3" json:"thumbWidth,omitempty"` + ThumbHeight int32 `protobuf:"varint,22,opt,name=thumbHeight,proto3" json:"thumbHeight,omitempty"` + FileId int32 `protobuf:"varint,23,opt,name=fileId,proto3" json:"fileId,omitempty"` + ShowLen int32 `protobuf:"varint,24,opt,name=showLen,proto3" json:"showLen,omitempty"` + DownloadLen int32 `protobuf:"varint,25,opt,name=downloadLen,proto3" json:"downloadLen,omitempty"` + PbReserve []byte `protobuf:"bytes,29,opt,name=pbReserve,proto3" json:"pbReserve,omitempty"` +} + +func (x *NotOnlineImage) Reset() { + *x = NotOnlineImage{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NotOnlineImage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NotOnlineImage) ProtoMessage() {} + +func (x *NotOnlineImage) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[19] + 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 NotOnlineImage.ProtoReflect.Descriptor instead. +func (*NotOnlineImage) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{19} +} + +func (x *NotOnlineImage) GetFilePath() string { + if x != nil { + return x.FilePath + } + return "" +} + +func (x *NotOnlineImage) GetFileLen() int32 { + if x != nil { + return x.FileLen + } + return 0 +} + +func (x *NotOnlineImage) GetDownloadPath() string { + if x != nil { + return x.DownloadPath + } + return "" +} + +func (x *NotOnlineImage) GetOldVerSendFile() []byte { + if x != nil { + return x.OldVerSendFile + } + return nil +} + +func (x *NotOnlineImage) GetImgType() int32 { + if x != nil { + return x.ImgType + } + return 0 +} + +func (x *NotOnlineImage) GetPreviewsImage() []byte { + if x != nil { + return x.PreviewsImage + } + return nil +} + +func (x *NotOnlineImage) GetPicMd5() []byte { + if x != nil { + return x.PicMd5 + } + return nil +} + +func (x *NotOnlineImage) GetPicHeight() int32 { + if x != nil { + return x.PicHeight + } + return 0 +} + +func (x *NotOnlineImage) GetPicWidth() int32 { + if x != nil { + return x.PicWidth + } + return 0 +} + +func (x *NotOnlineImage) GetResId() string { + if x != nil { + return x.ResId + } + return "" +} + +func (x *NotOnlineImage) GetFlag() []byte { + if x != nil { + return x.Flag + } + return nil +} + +func (x *NotOnlineImage) GetThumbUrl() string { + if x != nil { + return x.ThumbUrl + } + return "" +} + +func (x *NotOnlineImage) GetOriginal() int32 { + if x != nil { + return x.Original + } + return 0 +} + +func (x *NotOnlineImage) GetBigUrl() string { + if x != nil { + return x.BigUrl + } + return "" +} + +func (x *NotOnlineImage) GetOrigUrl() string { + if x != nil { + return x.OrigUrl + } + return "" +} + +func (x *NotOnlineImage) GetBizType() int32 { + if x != nil { + return x.BizType + } + return 0 +} + +func (x *NotOnlineImage) GetResult() int32 { + if x != nil { + return x.Result + } + return 0 +} + +func (x *NotOnlineImage) GetIndex() int32 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *NotOnlineImage) GetOpFaceBuf() []byte { + if x != nil { + return x.OpFaceBuf + } + return nil +} + +func (x *NotOnlineImage) GetOldPicMd5() bool { + if x != nil { + return x.OldPicMd5 + } + return false +} + +func (x *NotOnlineImage) GetThumbWidth() int32 { + if x != nil { + return x.ThumbWidth + } + return 0 +} + +func (x *NotOnlineImage) GetThumbHeight() int32 { + if x != nil { + return x.ThumbHeight + } + return 0 +} + +func (x *NotOnlineImage) GetFileId() int32 { + if x != nil { + return x.FileId + } + return 0 +} + +func (x *NotOnlineImage) GetShowLen() int32 { + if x != nil { + return x.ShowLen + } + return 0 +} + +func (x *NotOnlineImage) GetDownloadLen() int32 { + if x != nil { + return x.DownloadLen + } + return 0 +} + +func (x *NotOnlineImage) GetPbReserve() []byte { + if x != nil { + return x.PbReserve + } + return nil +} + +type NotOnlineFile struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FileType int32 `protobuf:"varint,1,opt,name=fileType,proto3" json:"fileType,omitempty"` + Sig []byte `protobuf:"bytes,2,opt,name=sig,proto3" json:"sig,omitempty"` + FileUuid []byte `protobuf:"bytes,3,opt,name=fileUuid,proto3" json:"fileUuid,omitempty"` + FileMd5 []byte `protobuf:"bytes,4,opt,name=fileMd5,proto3" json:"fileMd5,omitempty"` + FileName []byte `protobuf:"bytes,5,opt,name=fileName,proto3" json:"fileName,omitempty"` + FileSize int64 `protobuf:"varint,6,opt,name=fileSize,proto3" json:"fileSize,omitempty"` + Note []byte `protobuf:"bytes,7,opt,name=note,proto3" json:"note,omitempty"` + Reserved int32 `protobuf:"varint,8,opt,name=reserved,proto3" json:"reserved,omitempty"` + Subcmd int32 `protobuf:"varint,9,opt,name=subcmd,proto3" json:"subcmd,omitempty"` + MicroCloud int32 `protobuf:"varint,10,opt,name=microCloud,proto3" json:"microCloud,omitempty"` + BytesFileUrls [][]byte `protobuf:"bytes,11,rep,name=bytesFileUrls,proto3" json:"bytesFileUrls,omitempty"` + DownloadFlag int32 `protobuf:"varint,12,opt,name=downloadFlag,proto3" json:"downloadFlag,omitempty"` + DangerEvel int32 `protobuf:"varint,50,opt,name=dangerEvel,proto3" json:"dangerEvel,omitempty"` + LifeTime int32 `protobuf:"varint,51,opt,name=lifeTime,proto3" json:"lifeTime,omitempty"` + UploadTime int32 `protobuf:"varint,52,opt,name=uploadTime,proto3" json:"uploadTime,omitempty"` + AbsFileType int32 `protobuf:"varint,53,opt,name=absFileType,proto3" json:"absFileType,omitempty"` + ClientType int32 `protobuf:"varint,54,opt,name=clientType,proto3" json:"clientType,omitempty"` + ExpireTime int32 `protobuf:"varint,55,opt,name=expireTime,proto3" json:"expireTime,omitempty"` + PbReserve []byte `protobuf:"bytes,56,opt,name=pbReserve,proto3" json:"pbReserve,omitempty"` +} + +func (x *NotOnlineFile) Reset() { + *x = NotOnlineFile{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NotOnlineFile) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NotOnlineFile) ProtoMessage() {} + +func (x *NotOnlineFile) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[20] + 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 NotOnlineFile.ProtoReflect.Descriptor instead. +func (*NotOnlineFile) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{20} +} + +func (x *NotOnlineFile) GetFileType() int32 { + if x != nil { + return x.FileType + } + return 0 +} + +func (x *NotOnlineFile) GetSig() []byte { + if x != nil { + return x.Sig + } + return nil +} + +func (x *NotOnlineFile) GetFileUuid() []byte { + if x != nil { + return x.FileUuid + } + return nil +} + +func (x *NotOnlineFile) GetFileMd5() []byte { + if x != nil { + return x.FileMd5 + } + return nil +} + +func (x *NotOnlineFile) GetFileName() []byte { + if x != nil { + return x.FileName + } + return nil +} + +func (x *NotOnlineFile) GetFileSize() int64 { + if x != nil { + return x.FileSize + } + return 0 +} + +func (x *NotOnlineFile) GetNote() []byte { + if x != nil { + return x.Note + } + return nil +} + +func (x *NotOnlineFile) GetReserved() int32 { + if x != nil { + return x.Reserved + } + return 0 +} + +func (x *NotOnlineFile) GetSubcmd() int32 { + if x != nil { + return x.Subcmd + } + return 0 +} + +func (x *NotOnlineFile) GetMicroCloud() int32 { + if x != nil { + return x.MicroCloud + } + return 0 +} + +func (x *NotOnlineFile) GetBytesFileUrls() [][]byte { + if x != nil { + return x.BytesFileUrls + } + return nil +} + +func (x *NotOnlineFile) GetDownloadFlag() int32 { + if x != nil { + return x.DownloadFlag + } + return 0 +} + +func (x *NotOnlineFile) GetDangerEvel() int32 { + if x != nil { + return x.DangerEvel + } + return 0 +} + +func (x *NotOnlineFile) GetLifeTime() int32 { + if x != nil { + return x.LifeTime + } + return 0 +} + +func (x *NotOnlineFile) GetUploadTime() int32 { + if x != nil { + return x.UploadTime + } + return 0 +} + +func (x *NotOnlineFile) GetAbsFileType() int32 { + if x != nil { + return x.AbsFileType + } + return 0 +} + +func (x *NotOnlineFile) GetClientType() int32 { + if x != nil { + return x.ClientType + } + return 0 +} + +func (x *NotOnlineFile) GetExpireTime() int32 { + if x != nil { + return x.ExpireTime + } + return 0 +} + +func (x *NotOnlineFile) GetPbReserve() []byte { + if x != nil { + return x.PbReserve + } + return nil +} + +type ExtraInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Nick []byte `protobuf:"bytes,1,opt,name=nick,proto3" json:"nick,omitempty"` + GroupCard []byte `protobuf:"bytes,2,opt,name=groupCard,proto3" json:"groupCard,omitempty"` + Level int32 `protobuf:"varint,3,opt,name=level,proto3" json:"level,omitempty"` + Flags int32 `protobuf:"varint,4,opt,name=flags,proto3" json:"flags,omitempty"` + GroupMask int32 `protobuf:"varint,5,opt,name=groupMask,proto3" json:"groupMask,omitempty"` + MsgTailId int32 `protobuf:"varint,6,opt,name=msgTailId,proto3" json:"msgTailId,omitempty"` + SenderTitle []byte `protobuf:"bytes,7,opt,name=senderTitle,proto3" json:"senderTitle,omitempty"` + ApnsTips []byte `protobuf:"bytes,8,opt,name=apnsTips,proto3" json:"apnsTips,omitempty"` + Uin int64 `protobuf:"varint,9,opt,name=uin,proto3" json:"uin,omitempty"` + MsgStateFlag int32 `protobuf:"varint,10,opt,name=msgStateFlag,proto3" json:"msgStateFlag,omitempty"` + ApnsSoundType int32 `protobuf:"varint,11,opt,name=apnsSoundType,proto3" json:"apnsSoundType,omitempty"` + NewGroupFlag int32 `protobuf:"varint,12,opt,name=newGroupFlag,proto3" json:"newGroupFlag,omitempty"` +} + +func (x *ExtraInfo) Reset() { + *x = ExtraInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExtraInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExtraInfo) ProtoMessage() {} + +func (x *ExtraInfo) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[21] + 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 ExtraInfo.ProtoReflect.Descriptor instead. +func (*ExtraInfo) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{21} +} + +func (x *ExtraInfo) GetNick() []byte { + if x != nil { + return x.Nick + } + return nil +} + +func (x *ExtraInfo) GetGroupCard() []byte { + if x != nil { + return x.GroupCard + } + return nil +} + +func (x *ExtraInfo) GetLevel() int32 { + if x != nil { + return x.Level + } + return 0 +} + +func (x *ExtraInfo) GetFlags() int32 { + if x != nil { + return x.Flags + } + return 0 +} + +func (x *ExtraInfo) GetGroupMask() int32 { + if x != nil { + return x.GroupMask + } + return 0 +} + +func (x *ExtraInfo) GetMsgTailId() int32 { + if x != nil { + return x.MsgTailId + } + return 0 +} + +func (x *ExtraInfo) GetSenderTitle() []byte { + if x != nil { + return x.SenderTitle + } + return nil +} + +func (x *ExtraInfo) GetApnsTips() []byte { + if x != nil { + return x.ApnsTips + } + return nil +} + +func (x *ExtraInfo) GetUin() int64 { + if x != nil { + return x.Uin + } + return 0 +} + +func (x *ExtraInfo) GetMsgStateFlag() int32 { + if x != nil { + return x.MsgStateFlag + } + return 0 +} + +func (x *ExtraInfo) GetApnsSoundType() int32 { + if x != nil { + return x.ApnsSoundType + } + return 0 +} + +func (x *ExtraInfo) GetNewGroupFlag() int32 { + if x != nil { + return x.NewGroupFlag + } + return 0 +} + +type GroupFile struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Filename []byte `protobuf:"bytes,1,opt,name=filename,proto3" json:"filename,omitempty"` + FileSize int64 `protobuf:"varint,2,opt,name=fileSize,proto3" json:"fileSize,omitempty"` + FileId []byte `protobuf:"bytes,3,opt,name=fileId,proto3" json:"fileId,omitempty"` + BatchId []byte `protobuf:"bytes,4,opt,name=batchId,proto3" json:"batchId,omitempty"` + FileKey []byte `protobuf:"bytes,5,opt,name=fileKey,proto3" json:"fileKey,omitempty"` + Mark []byte `protobuf:"bytes,6,opt,name=mark,proto3" json:"mark,omitempty"` + Sequence int64 `protobuf:"varint,7,opt,name=sequence,proto3" json:"sequence,omitempty"` + BatchItemId []byte `protobuf:"bytes,8,opt,name=batchItemId,proto3" json:"batchItemId,omitempty"` + FeedMsgTime int32 `protobuf:"varint,9,opt,name=feedMsgTime,proto3" json:"feedMsgTime,omitempty"` + PbReserve []byte `protobuf:"bytes,10,opt,name=pbReserve,proto3" json:"pbReserve,omitempty"` +} + +func (x *GroupFile) Reset() { + *x = GroupFile{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GroupFile) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupFile) ProtoMessage() {} + +func (x *GroupFile) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[22] + 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 GroupFile.ProtoReflect.Descriptor instead. +func (*GroupFile) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{22} +} + +func (x *GroupFile) GetFilename() []byte { + if x != nil { + return x.Filename + } + return nil +} + +func (x *GroupFile) GetFileSize() int64 { + if x != nil { + return x.FileSize + } + return 0 +} + +func (x *GroupFile) GetFileId() []byte { + if x != nil { + return x.FileId + } + return nil +} + +func (x *GroupFile) GetBatchId() []byte { + if x != nil { + return x.BatchId + } + return nil +} + +func (x *GroupFile) GetFileKey() []byte { + if x != nil { + return x.FileKey + } + return nil +} + +func (x *GroupFile) GetMark() []byte { + if x != nil { + return x.Mark + } + return nil +} + +func (x *GroupFile) GetSequence() int64 { + if x != nil { + return x.Sequence + } + return 0 +} + +func (x *GroupFile) GetBatchItemId() []byte { + if x != nil { + return x.BatchItemId + } + return nil +} + +func (x *GroupFile) GetFeedMsgTime() int32 { + if x != nil { + return x.FeedMsgTime + } + return 0 +} + +func (x *GroupFile) GetPbReserve() []byte { + if x != nil { + return x.PbReserve + } + return nil +} + +type AnonymousGroupMessage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Flags int32 `protobuf:"varint,1,opt,name=flags,proto3" json:"flags,omitempty"` + AnonId []byte `protobuf:"bytes,2,opt,name=anonId,proto3" json:"anonId,omitempty"` + AnonNick []byte `protobuf:"bytes,3,opt,name=anonNick,proto3" json:"anonNick,omitempty"` + HeadPortrait int32 `protobuf:"varint,4,opt,name=headPortrait,proto3" json:"headPortrait,omitempty"` + ExpireTime int32 `protobuf:"varint,5,opt,name=expireTime,proto3" json:"expireTime,omitempty"` + BubbleId int32 `protobuf:"varint,6,opt,name=bubbleId,proto3" json:"bubbleId,omitempty"` + RankColor []byte `protobuf:"bytes,7,opt,name=rankColor,proto3" json:"rankColor,omitempty"` +} + +func (x *AnonymousGroupMessage) Reset() { + *x = AnonymousGroupMessage{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AnonymousGroupMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AnonymousGroupMessage) ProtoMessage() {} + +func (x *AnonymousGroupMessage) ProtoReflect() protoreflect.Message { + mi := &file_msg_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 AnonymousGroupMessage.ProtoReflect.Descriptor instead. +func (*AnonymousGroupMessage) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{23} +} + +func (x *AnonymousGroupMessage) GetFlags() int32 { + if x != nil { + return x.Flags + } + return 0 +} + +func (x *AnonymousGroupMessage) GetAnonId() []byte { + if x != nil { + return x.AnonId + } + return nil +} + +func (x *AnonymousGroupMessage) GetAnonNick() []byte { + if x != nil { + return x.AnonNick + } + return nil +} + +func (x *AnonymousGroupMessage) GetHeadPortrait() int32 { + if x != nil { + return x.HeadPortrait + } + return 0 +} + +func (x *AnonymousGroupMessage) GetExpireTime() int32 { + if x != nil { + return x.ExpireTime + } + return 0 +} + +func (x *AnonymousGroupMessage) GetBubbleId() int32 { + if x != nil { + return x.BubbleId + } + return 0 +} + +func (x *AnonymousGroupMessage) GetRankColor() []byte { + if x != nil { + return x.RankColor + } + return nil +} + +type VideoFile struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FileUuid []byte `protobuf:"bytes,1,opt,name=fileUuid,proto3" json:"fileUuid,omitempty"` + FileMd5 []byte `protobuf:"bytes,2,opt,name=fileMd5,proto3" json:"fileMd5,omitempty"` + FileName []byte `protobuf:"bytes,3,opt,name=fileName,proto3" json:"fileName,omitempty"` + FileFormat int32 `protobuf:"varint,4,opt,name=fileFormat,proto3" json:"fileFormat,omitempty"` + FileTime int32 `protobuf:"varint,5,opt,name=fileTime,proto3" json:"fileTime,omitempty"` + FileSize int32 `protobuf:"varint,6,opt,name=fileSize,proto3" json:"fileSize,omitempty"` + ThumbWidth int32 `protobuf:"varint,7,opt,name=thumbWidth,proto3" json:"thumbWidth,omitempty"` + ThumbHeight int32 `protobuf:"varint,8,opt,name=thumbHeight,proto3" json:"thumbHeight,omitempty"` + ThumbFileMd5 []byte `protobuf:"bytes,9,opt,name=thumbFileMd5,proto3" json:"thumbFileMd5,omitempty"` + Source []byte `protobuf:"bytes,10,opt,name=source,proto3" json:"source,omitempty"` + ThumbFileSize int32 `protobuf:"varint,11,opt,name=thumbFileSize,proto3" json:"thumbFileSize,omitempty"` + BusiType int32 `protobuf:"varint,12,opt,name=busiType,proto3" json:"busiType,omitempty"` + FromChatType int32 `protobuf:"varint,13,opt,name=fromChatType,proto3" json:"fromChatType,omitempty"` + ToChatType int32 `protobuf:"varint,14,opt,name=toChatType,proto3" json:"toChatType,omitempty"` + BoolSupportProgressive bool `protobuf:"varint,15,opt,name=boolSupportProgressive,proto3" json:"boolSupportProgressive,omitempty"` + FileWidth int32 `protobuf:"varint,16,opt,name=fileWidth,proto3" json:"fileWidth,omitempty"` + FileHeight int32 `protobuf:"varint,17,opt,name=fileHeight,proto3" json:"fileHeight,omitempty"` + SubBusiType int32 `protobuf:"varint,18,opt,name=subBusiType,proto3" json:"subBusiType,omitempty"` + VideoAttr int32 `protobuf:"varint,19,opt,name=videoAttr,proto3" json:"videoAttr,omitempty"` + BytesThumbFileUrls [][]byte `protobuf:"bytes,20,rep,name=bytesThumbFileUrls,proto3" json:"bytesThumbFileUrls,omitempty"` + BytesVideoFileUrls [][]byte `protobuf:"bytes,21,rep,name=bytesVideoFileUrls,proto3" json:"bytesVideoFileUrls,omitempty"` + ThumbDownloadFlag int32 `protobuf:"varint,22,opt,name=thumbDownloadFlag,proto3" json:"thumbDownloadFlag,omitempty"` + VideoDownloadFlag int32 `protobuf:"varint,23,opt,name=videoDownloadFlag,proto3" json:"videoDownloadFlag,omitempty"` + PbReserve []byte `protobuf:"bytes,24,opt,name=pbReserve,proto3" json:"pbReserve,omitempty"` +} + +func (x *VideoFile) Reset() { + *x = VideoFile{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VideoFile) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VideoFile) ProtoMessage() {} + +func (x *VideoFile) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[24] + 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 VideoFile.ProtoReflect.Descriptor instead. +func (*VideoFile) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{24} +} + +func (x *VideoFile) GetFileUuid() []byte { + if x != nil { + return x.FileUuid + } + return nil +} + +func (x *VideoFile) GetFileMd5() []byte { + if x != nil { + return x.FileMd5 + } + return nil +} + +func (x *VideoFile) GetFileName() []byte { + if x != nil { + return x.FileName + } + return nil +} + +func (x *VideoFile) GetFileFormat() int32 { + if x != nil { + return x.FileFormat + } + return 0 +} + +func (x *VideoFile) GetFileTime() int32 { + if x != nil { + return x.FileTime + } + return 0 +} + +func (x *VideoFile) GetFileSize() int32 { + if x != nil { + return x.FileSize + } + return 0 +} + +func (x *VideoFile) GetThumbWidth() int32 { + if x != nil { + return x.ThumbWidth + } + return 0 +} + +func (x *VideoFile) GetThumbHeight() int32 { + if x != nil { + return x.ThumbHeight + } + return 0 +} + +func (x *VideoFile) GetThumbFileMd5() []byte { + if x != nil { + return x.ThumbFileMd5 + } + return nil +} + +func (x *VideoFile) GetSource() []byte { + if x != nil { + return x.Source + } + return nil +} + +func (x *VideoFile) GetThumbFileSize() int32 { + if x != nil { + return x.ThumbFileSize + } + return 0 +} + +func (x *VideoFile) GetBusiType() int32 { + if x != nil { + return x.BusiType + } + return 0 +} + +func (x *VideoFile) GetFromChatType() int32 { + if x != nil { + return x.FromChatType + } + return 0 +} + +func (x *VideoFile) GetToChatType() int32 { + if x != nil { + return x.ToChatType + } + return 0 +} + +func (x *VideoFile) GetBoolSupportProgressive() bool { + if x != nil { + return x.BoolSupportProgressive + } + return false +} + +func (x *VideoFile) GetFileWidth() int32 { + if x != nil { + return x.FileWidth + } + return 0 +} + +func (x *VideoFile) GetFileHeight() int32 { + if x != nil { + return x.FileHeight + } + return 0 +} + +func (x *VideoFile) GetSubBusiType() int32 { + if x != nil { + return x.SubBusiType + } + return 0 +} + +func (x *VideoFile) GetVideoAttr() int32 { + if x != nil { + return x.VideoAttr + } + return 0 +} + +func (x *VideoFile) GetBytesThumbFileUrls() [][]byte { + if x != nil { + return x.BytesThumbFileUrls + } + return nil +} + +func (x *VideoFile) GetBytesVideoFileUrls() [][]byte { + if x != nil { + return x.BytesVideoFileUrls + } + return nil +} + +func (x *VideoFile) GetThumbDownloadFlag() int32 { + if x != nil { + return x.ThumbDownloadFlag + } + return 0 +} + +func (x *VideoFile) GetVideoDownloadFlag() int32 { + if x != nil { + return x.VideoDownloadFlag + } + return 0 +} + +func (x *VideoFile) GetPbReserve() []byte { + if x != nil { + return x.PbReserve + } + return nil +} + +type Face struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + Old []byte `protobuf:"bytes,2,opt,name=old,proto3" json:"old,omitempty"` + Buf []byte `protobuf:"bytes,11,opt,name=buf,proto3" json:"buf,omitempty"` +} + +func (x *Face) Reset() { + *x = Face{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Face) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Face) ProtoMessage() {} + +func (x *Face) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[25] + 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 Face.ProtoReflect.Descriptor instead. +func (*Face) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{25} +} + +func (x *Face) GetIndex() int32 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *Face) GetOld() []byte { + if x != nil { + return x.Old + } + return nil +} + +func (x *Face) GetBuf() []byte { + if x != nil { + return x.Buf + } + return nil +} + +type CustomFace struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Guid []byte `protobuf:"bytes,1,opt,name=guid,proto3" json:"guid,omitempty"` + FilePath string `protobuf:"bytes,2,opt,name=filePath,proto3" json:"filePath,omitempty"` + Shortcut string `protobuf:"bytes,3,opt,name=shortcut,proto3" json:"shortcut,omitempty"` + Buffer []byte `protobuf:"bytes,4,opt,name=buffer,proto3" json:"buffer,omitempty"` + Flag []byte `protobuf:"bytes,5,opt,name=flag,proto3" json:"flag,omitempty"` + OldData []byte `protobuf:"bytes,6,opt,name=oldData,proto3" json:"oldData,omitempty"` + FileId int32 `protobuf:"varint,7,opt,name=fileId,proto3" json:"fileId,omitempty"` + ServerIp int32 `protobuf:"varint,8,opt,name=serverIp,proto3" json:"serverIp,omitempty"` + ServerPort int32 `protobuf:"varint,9,opt,name=serverPort,proto3" json:"serverPort,omitempty"` + FileType int32 `protobuf:"varint,10,opt,name=fileType,proto3" json:"fileType,omitempty"` + Signature []byte `protobuf:"bytes,11,opt,name=signature,proto3" json:"signature,omitempty"` + Useful int32 `protobuf:"varint,12,opt,name=useful,proto3" json:"useful,omitempty"` + Md5 []byte `protobuf:"bytes,13,opt,name=md5,proto3" json:"md5,omitempty"` + ThumbUrl string `protobuf:"bytes,14,opt,name=thumbUrl,proto3" json:"thumbUrl,omitempty"` + BigUrl string `protobuf:"bytes,15,opt,name=bigUrl,proto3" json:"bigUrl,omitempty"` + OrigUrl string `protobuf:"bytes,16,opt,name=origUrl,proto3" json:"origUrl,omitempty"` + BizType int32 `protobuf:"varint,17,opt,name=bizType,proto3" json:"bizType,omitempty"` + RepeatIndex int32 `protobuf:"varint,18,opt,name=repeatIndex,proto3" json:"repeatIndex,omitempty"` + RepeatImage int32 `protobuf:"varint,19,opt,name=repeatImage,proto3" json:"repeatImage,omitempty"` + ImageType int32 `protobuf:"varint,20,opt,name=imageType,proto3" json:"imageType,omitempty"` + Index int32 `protobuf:"varint,21,opt,name=index,proto3" json:"index,omitempty"` + Width int32 `protobuf:"varint,22,opt,name=width,proto3" json:"width,omitempty"` + Height int32 `protobuf:"varint,23,opt,name=height,proto3" json:"height,omitempty"` + Source int32 `protobuf:"varint,24,opt,name=source,proto3" json:"source,omitempty"` + Size int32 `protobuf:"varint,25,opt,name=size,proto3" json:"size,omitempty"` + Origin int32 `protobuf:"varint,26,opt,name=origin,proto3" json:"origin,omitempty"` + ThumbWidth int32 `protobuf:"varint,27,opt,name=thumbWidth,proto3" json:"thumbWidth,omitempty"` + ThumbHeight int32 `protobuf:"varint,28,opt,name=thumbHeight,proto3" json:"thumbHeight,omitempty"` + ShowLen int32 `protobuf:"varint,29,opt,name=showLen,proto3" json:"showLen,omitempty"` + DownloadLen int32 `protobuf:"varint,30,opt,name=downloadLen,proto3" json:"downloadLen,omitempty"` + X400Url string `protobuf:"bytes,31,opt,name=_400Url,json=400Url,proto3" json:"_400Url,omitempty"` + X400Width int32 `protobuf:"varint,32,opt,name=_400Width,json=400Width,proto3" json:"_400Width,omitempty"` + X400Height int32 `protobuf:"varint,33,opt,name=_400Height,json=400Height,proto3" json:"_400Height,omitempty"` + PbReserve []byte `protobuf:"bytes,34,opt,name=pbReserve,proto3" json:"pbReserve,omitempty"` +} + +func (x *CustomFace) Reset() { + *x = CustomFace{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CustomFace) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CustomFace) ProtoMessage() {} + +func (x *CustomFace) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[26] + 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 CustomFace.ProtoReflect.Descriptor instead. +func (*CustomFace) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{26} +} + +func (x *CustomFace) GetGuid() []byte { + if x != nil { + return x.Guid + } + return nil +} + +func (x *CustomFace) GetFilePath() string { + if x != nil { + return x.FilePath + } + return "" +} + +func (x *CustomFace) GetShortcut() string { + if x != nil { + return x.Shortcut + } + return "" +} + +func (x *CustomFace) GetBuffer() []byte { + if x != nil { + return x.Buffer + } + return nil +} + +func (x *CustomFace) GetFlag() []byte { + if x != nil { + return x.Flag + } + return nil +} + +func (x *CustomFace) GetOldData() []byte { + if x != nil { + return x.OldData + } + return nil +} + +func (x *CustomFace) GetFileId() int32 { + if x != nil { + return x.FileId + } + return 0 +} + +func (x *CustomFace) GetServerIp() int32 { + if x != nil { + return x.ServerIp + } + return 0 +} + +func (x *CustomFace) GetServerPort() int32 { + if x != nil { + return x.ServerPort + } + return 0 +} + +func (x *CustomFace) GetFileType() int32 { + if x != nil { + return x.FileType + } + return 0 +} + +func (x *CustomFace) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *CustomFace) GetUseful() int32 { + if x != nil { + return x.Useful + } + return 0 +} + +func (x *CustomFace) GetMd5() []byte { + if x != nil { + return x.Md5 + } + return nil +} + +func (x *CustomFace) GetThumbUrl() string { + if x != nil { + return x.ThumbUrl + } + return "" +} + +func (x *CustomFace) GetBigUrl() string { + if x != nil { + return x.BigUrl + } + return "" +} + +func (x *CustomFace) GetOrigUrl() string { + if x != nil { + return x.OrigUrl + } + return "" +} + +func (x *CustomFace) GetBizType() int32 { + if x != nil { + return x.BizType + } + return 0 +} + +func (x *CustomFace) GetRepeatIndex() int32 { + if x != nil { + return x.RepeatIndex + } + return 0 +} + +func (x *CustomFace) GetRepeatImage() int32 { + if x != nil { + return x.RepeatImage + } + return 0 +} + +func (x *CustomFace) GetImageType() int32 { + if x != nil { + return x.ImageType + } + return 0 +} + +func (x *CustomFace) GetIndex() int32 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *CustomFace) GetWidth() int32 { + if x != nil { + return x.Width + } + return 0 +} + +func (x *CustomFace) GetHeight() int32 { + if x != nil { + return x.Height + } + return 0 +} + +func (x *CustomFace) GetSource() int32 { + if x != nil { + return x.Source + } + return 0 +} + +func (x *CustomFace) GetSize() int32 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *CustomFace) GetOrigin() int32 { + if x != nil { + return x.Origin + } + return 0 +} + +func (x *CustomFace) GetThumbWidth() int32 { + if x != nil { + return x.ThumbWidth + } + return 0 +} + +func (x *CustomFace) GetThumbHeight() int32 { + if x != nil { + return x.ThumbHeight + } + return 0 +} + +func (x *CustomFace) GetShowLen() int32 { + if x != nil { + return x.ShowLen + } + return 0 +} + +func (x *CustomFace) GetDownloadLen() int32 { + if x != nil { + return x.DownloadLen + } + return 0 +} + +func (x *CustomFace) GetX400Url() string { + if x != nil { + return x.X400Url + } + return "" +} + +func (x *CustomFace) GetX400Width() int32 { + if x != nil { + return x.X400Width + } + return 0 +} + +func (x *CustomFace) GetX400Height() int32 { + if x != nil { + return x.X400Height + } + return 0 +} + +func (x *CustomFace) GetPbReserve() []byte { + if x != nil { + return x.PbReserve + } + return nil +} + +type ContentHead struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PkgNum int32 `protobuf:"varint,1,opt,name=pkgNum,proto3" json:"pkgNum,omitempty"` + PkgIndex int32 `protobuf:"varint,2,opt,name=pkgIndex,proto3" json:"pkgIndex,omitempty"` + DivSeq int32 `protobuf:"varint,3,opt,name=divSeq,proto3" json:"divSeq,omitempty"` + AutoReply int32 `protobuf:"varint,4,opt,name=autoReply,proto3" json:"autoReply,omitempty"` +} + +func (x *ContentHead) Reset() { + *x = ContentHead{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContentHead) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContentHead) ProtoMessage() {} + +func (x *ContentHead) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[27] + 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 ContentHead.ProtoReflect.Descriptor instead. +func (*ContentHead) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{27} +} + +func (x *ContentHead) GetPkgNum() int32 { + if x != nil { + return x.PkgNum + } + return 0 +} + +func (x *ContentHead) GetPkgIndex() int32 { + if x != nil { + return x.PkgIndex + } + return 0 +} + +func (x *ContentHead) GetDivSeq() int32 { + if x != nil { + return x.DivSeq + } + return 0 +} + +func (x *ContentHead) GetAutoReply() int32 { + if x != nil { + return x.AutoReply + } + return 0 +} + +type MessageHead struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FromUin int64 `protobuf:"varint,1,opt,name=fromUin,proto3" json:"fromUin,omitempty"` + ToUin int64 `protobuf:"varint,2,opt,name=toUin,proto3" json:"toUin,omitempty"` + MsgType int32 `protobuf:"varint,3,opt,name=msgType,proto3" json:"msgType,omitempty"` + C2CCmd int32 `protobuf:"varint,4,opt,name=c2cCmd,proto3" json:"c2cCmd,omitempty"` + MsgSeq int32 `protobuf:"varint,5,opt,name=msgSeq,proto3" json:"msgSeq,omitempty"` + MsgTime int32 `protobuf:"varint,6,opt,name=msgTime,proto3" json:"msgTime,omitempty"` + MsgUid int64 `protobuf:"varint,7,opt,name=msgUid,proto3" json:"msgUid,omitempty"` + C2CTmpMsgHead *C2CTempMessageHead `protobuf:"bytes,8,opt,name=c2cTmpMsgHead,proto3" json:"c2cTmpMsgHead,omitempty"` + GroupInfo *GroupInfo `protobuf:"bytes,9,opt,name=groupInfo,proto3" json:"groupInfo,omitempty"` + FromAppid int32 `protobuf:"varint,10,opt,name=fromAppid,proto3" json:"fromAppid,omitempty"` + FromInstid int32 `protobuf:"varint,11,opt,name=fromInstid,proto3" json:"fromInstid,omitempty"` + UserActive int32 `protobuf:"varint,12,opt,name=userActive,proto3" json:"userActive,omitempty"` + DiscussInfo *DiscussInfo `protobuf:"bytes,13,opt,name=discussInfo,proto3" json:"discussInfo,omitempty"` + FromNick string `protobuf:"bytes,14,opt,name=fromNick,proto3" json:"fromNick,omitempty"` + AuthUin int64 `protobuf:"varint,15,opt,name=authUin,proto3" json:"authUin,omitempty"` + AuthNick string `protobuf:"bytes,16,opt,name=authNick,proto3" json:"authNick,omitempty"` + MsgFlag int32 `protobuf:"varint,17,opt,name=msgFlag,proto3" json:"msgFlag,omitempty"` + AuthRemark string `protobuf:"bytes,18,opt,name=authRemark,proto3" json:"authRemark,omitempty"` + GroupName string `protobuf:"bytes,19,opt,name=groupName,proto3" json:"groupName,omitempty"` + MutiltransHead *MutilTransHead `protobuf:"bytes,20,opt,name=mutiltransHead,proto3" json:"mutiltransHead,omitempty"` + MsgInstCtrl *InstCtrl `protobuf:"bytes,21,opt,name=msgInstCtrl,proto3" json:"msgInstCtrl,omitempty"` + PublicAccountGroupSendFlag int32 `protobuf:"varint,22,opt,name=publicAccountGroupSendFlag,proto3" json:"publicAccountGroupSendFlag,omitempty"` + WseqInC2CMsghead int32 `protobuf:"varint,23,opt,name=wseqInC2cMsghead,proto3" json:"wseqInC2cMsghead,omitempty"` + Cpid int64 `protobuf:"varint,24,opt,name=cpid,proto3" json:"cpid,omitempty"` + ExtGroupKeyInfo *ExtGroupKeyInfo `protobuf:"bytes,25,opt,name=extGroupKeyInfo,proto3" json:"extGroupKeyInfo,omitempty"` + MultiCompatibleText string `protobuf:"bytes,26,opt,name=multiCompatibleText,proto3" json:"multiCompatibleText,omitempty"` + AuthSex int32 `protobuf:"varint,27,opt,name=authSex,proto3" json:"authSex,omitempty"` + IsSrcMsg bool `protobuf:"varint,28,opt,name=isSrcMsg,proto3" json:"isSrcMsg,omitempty"` +} + +func (x *MessageHead) Reset() { + *x = MessageHead{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MessageHead) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MessageHead) ProtoMessage() {} + +func (x *MessageHead) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[28] + 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 MessageHead.ProtoReflect.Descriptor instead. +func (*MessageHead) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{28} +} + +func (x *MessageHead) GetFromUin() int64 { + if x != nil { + return x.FromUin + } + return 0 +} + +func (x *MessageHead) GetToUin() int64 { + if x != nil { + return x.ToUin + } + return 0 +} + +func (x *MessageHead) GetMsgType() int32 { + if x != nil { + return x.MsgType + } + return 0 +} + +func (x *MessageHead) GetC2CCmd() int32 { + if x != nil { + return x.C2CCmd + } + return 0 +} + +func (x *MessageHead) GetMsgSeq() int32 { + if x != nil { + return x.MsgSeq + } + return 0 +} + +func (x *MessageHead) GetMsgTime() int32 { + if x != nil { + return x.MsgTime + } + return 0 +} + +func (x *MessageHead) GetMsgUid() int64 { + if x != nil { + return x.MsgUid + } + return 0 +} + +func (x *MessageHead) GetC2CTmpMsgHead() *C2CTempMessageHead { + if x != nil { + return x.C2CTmpMsgHead + } + return nil +} + +func (x *MessageHead) GetGroupInfo() *GroupInfo { + if x != nil { + return x.GroupInfo + } + return nil +} + +func (x *MessageHead) GetFromAppid() int32 { + if x != nil { + return x.FromAppid + } + return 0 +} + +func (x *MessageHead) GetFromInstid() int32 { + if x != nil { + return x.FromInstid + } + return 0 +} + +func (x *MessageHead) GetUserActive() int32 { + if x != nil { + return x.UserActive + } + return 0 +} + +func (x *MessageHead) GetDiscussInfo() *DiscussInfo { + if x != nil { + return x.DiscussInfo + } + return nil +} + +func (x *MessageHead) GetFromNick() string { + if x != nil { + return x.FromNick + } + return "" +} + +func (x *MessageHead) GetAuthUin() int64 { + if x != nil { + return x.AuthUin + } + return 0 +} + +func (x *MessageHead) GetAuthNick() string { + if x != nil { + return x.AuthNick + } + return "" +} + +func (x *MessageHead) GetMsgFlag() int32 { + if x != nil { + return x.MsgFlag + } + return 0 +} + +func (x *MessageHead) GetAuthRemark() string { + if x != nil { + return x.AuthRemark + } + return "" +} + +func (x *MessageHead) GetGroupName() string { + if x != nil { + return x.GroupName + } + return "" +} + +func (x *MessageHead) GetMutiltransHead() *MutilTransHead { + if x != nil { + return x.MutiltransHead + } + return nil +} + +func (x *MessageHead) GetMsgInstCtrl() *InstCtrl { + if x != nil { + return x.MsgInstCtrl + } + return nil +} + +func (x *MessageHead) GetPublicAccountGroupSendFlag() int32 { + if x != nil { + return x.PublicAccountGroupSendFlag + } + return 0 +} + +func (x *MessageHead) GetWseqInC2CMsghead() int32 { + if x != nil { + return x.WseqInC2CMsghead + } + return 0 +} + +func (x *MessageHead) GetCpid() int64 { + if x != nil { + return x.Cpid + } + return 0 +} + +func (x *MessageHead) GetExtGroupKeyInfo() *ExtGroupKeyInfo { + if x != nil { + return x.ExtGroupKeyInfo + } + return nil +} + +func (x *MessageHead) GetMultiCompatibleText() string { + if x != nil { + return x.MultiCompatibleText + } + return "" +} + +func (x *MessageHead) GetAuthSex() int32 { + if x != nil { + return x.AuthSex + } + return 0 +} + +func (x *MessageHead) GetIsSrcMsg() bool { + if x != nil { + return x.IsSrcMsg + } + return false +} + +type GroupInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupCode int64 `protobuf:"varint,1,opt,name=groupCode,proto3" json:"groupCode,omitempty"` + GroupType int32 `protobuf:"varint,2,opt,name=groupType,proto3" json:"groupType,omitempty"` + GroupInfoSeq int64 `protobuf:"varint,3,opt,name=groupInfoSeq,proto3" json:"groupInfoSeq,omitempty"` + GroupCard string `protobuf:"bytes,4,opt,name=groupCard,proto3" json:"groupCard,omitempty"` + GroupRank []byte `protobuf:"bytes,5,opt,name=groupRank,proto3" json:"groupRank,omitempty"` + GroupLevel int32 `protobuf:"varint,6,opt,name=groupLevel,proto3" json:"groupLevel,omitempty"` + GroupCardType int32 `protobuf:"varint,7,opt,name=groupCardType,proto3" json:"groupCardType,omitempty"` + GroupName []byte `protobuf:"bytes,8,opt,name=groupName,proto3" json:"groupName,omitempty"` +} + +func (x *GroupInfo) Reset() { + *x = GroupInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GroupInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupInfo) ProtoMessage() {} + +func (x *GroupInfo) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[29] + 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 GroupInfo.ProtoReflect.Descriptor instead. +func (*GroupInfo) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{29} +} + +func (x *GroupInfo) GetGroupCode() int64 { + if x != nil { + return x.GroupCode + } + return 0 +} + +func (x *GroupInfo) GetGroupType() int32 { + if x != nil { + return x.GroupType + } + return 0 +} + +func (x *GroupInfo) GetGroupInfoSeq() int64 { + if x != nil { + return x.GroupInfoSeq + } + return 0 +} + +func (x *GroupInfo) GetGroupCard() string { + if x != nil { + return x.GroupCard + } + return "" +} + +func (x *GroupInfo) GetGroupRank() []byte { + if x != nil { + return x.GroupRank + } + return nil +} + +func (x *GroupInfo) GetGroupLevel() int32 { + if x != nil { + return x.GroupLevel + } + return 0 +} + +func (x *GroupInfo) GetGroupCardType() int32 { + if x != nil { + return x.GroupCardType + } + return 0 +} + +func (x *GroupInfo) GetGroupName() []byte { + if x != nil { + return x.GroupName + } + return nil +} + +type DiscussInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DiscussUin int64 `protobuf:"varint,1,opt,name=discussUin,proto3" json:"discussUin,omitempty"` + DiscussType int32 `protobuf:"varint,2,opt,name=discussType,proto3" json:"discussType,omitempty"` + DiscussInfoSeq int64 `protobuf:"varint,3,opt,name=discussInfoSeq,proto3" json:"discussInfoSeq,omitempty"` + DiscussRemark []byte `protobuf:"bytes,4,opt,name=discussRemark,proto3" json:"discussRemark,omitempty"` + DiscussName []byte `protobuf:"bytes,5,opt,name=discussName,proto3" json:"discussName,omitempty"` +} + +func (x *DiscussInfo) Reset() { + *x = DiscussInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DiscussInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DiscussInfo) ProtoMessage() {} + +func (x *DiscussInfo) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[30] + 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 DiscussInfo.ProtoReflect.Descriptor instead. +func (*DiscussInfo) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{30} +} + +func (x *DiscussInfo) GetDiscussUin() int64 { + if x != nil { + return x.DiscussUin + } + return 0 +} + +func (x *DiscussInfo) GetDiscussType() int32 { + if x != nil { + return x.DiscussType + } + return 0 +} + +func (x *DiscussInfo) GetDiscussInfoSeq() int64 { + if x != nil { + return x.DiscussInfoSeq + } + return 0 +} + +func (x *DiscussInfo) GetDiscussRemark() []byte { + if x != nil { + return x.DiscussRemark + } + return nil +} + +func (x *DiscussInfo) GetDiscussName() []byte { + if x != nil { + return x.DiscussName + } + return nil +} + +type MutilTransHead struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Status int32 `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"` + MsgId int32 `protobuf:"varint,2,opt,name=msgId,proto3" json:"msgId,omitempty"` +} + +func (x *MutilTransHead) Reset() { + *x = MutilTransHead{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MutilTransHead) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MutilTransHead) ProtoMessage() {} + +func (x *MutilTransHead) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[31] + 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 MutilTransHead.ProtoReflect.Descriptor instead. +func (*MutilTransHead) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{31} +} + +func (x *MutilTransHead) GetStatus() int32 { + if x != nil { + return x.Status + } + return 0 +} + +func (x *MutilTransHead) GetMsgId() int32 { + if x != nil { + return x.MsgId + } + return 0 +} + +type C2CTempMessageHead struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + C2CType int32 `protobuf:"varint,1,opt,name=c2cType,proto3" json:"c2cType,omitempty"` + ServiceType int32 `protobuf:"varint,2,opt,name=serviceType,proto3" json:"serviceType,omitempty"` + GroupUin int64 `protobuf:"varint,3,opt,name=groupUin,proto3" json:"groupUin,omitempty"` + GroupCode int64 `protobuf:"varint,4,opt,name=groupCode,proto3" json:"groupCode,omitempty"` + Sig []byte `protobuf:"bytes,5,opt,name=sig,proto3" json:"sig,omitempty"` + SigType int32 `protobuf:"varint,6,opt,name=sigType,proto3" json:"sigType,omitempty"` + FromPhone string `protobuf:"bytes,7,opt,name=fromPhone,proto3" json:"fromPhone,omitempty"` + ToPhone string `protobuf:"bytes,8,opt,name=toPhone,proto3" json:"toPhone,omitempty"` + LockDisplay int32 `protobuf:"varint,9,opt,name=lockDisplay,proto3" json:"lockDisplay,omitempty"` + DirectionFlag int32 `protobuf:"varint,10,opt,name=directionFlag,proto3" json:"directionFlag,omitempty"` + Reserved []byte `protobuf:"bytes,11,opt,name=reserved,proto3" json:"reserved,omitempty"` +} + +func (x *C2CTempMessageHead) Reset() { + *x = C2CTempMessageHead{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *C2CTempMessageHead) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*C2CTempMessageHead) ProtoMessage() {} + +func (x *C2CTempMessageHead) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[32] + 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 C2CTempMessageHead.ProtoReflect.Descriptor instead. +func (*C2CTempMessageHead) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{32} +} + +func (x *C2CTempMessageHead) GetC2CType() int32 { + if x != nil { + return x.C2CType + } + return 0 +} + +func (x *C2CTempMessageHead) GetServiceType() int32 { + if x != nil { + return x.ServiceType + } + return 0 +} + +func (x *C2CTempMessageHead) GetGroupUin() int64 { + if x != nil { + return x.GroupUin + } + return 0 +} + +func (x *C2CTempMessageHead) GetGroupCode() int64 { + if x != nil { + return x.GroupCode + } + return 0 +} + +func (x *C2CTempMessageHead) GetSig() []byte { + if x != nil { + return x.Sig + } + return nil +} + +func (x *C2CTempMessageHead) GetSigType() int32 { + if x != nil { + return x.SigType + } + return 0 +} + +func (x *C2CTempMessageHead) GetFromPhone() string { + if x != nil { + return x.FromPhone + } + return "" +} + +func (x *C2CTempMessageHead) GetToPhone() string { + if x != nil { + return x.ToPhone + } + return "" +} + +func (x *C2CTempMessageHead) GetLockDisplay() int32 { + if x != nil { + return x.LockDisplay + } + return 0 +} + +func (x *C2CTempMessageHead) GetDirectionFlag() int32 { + if x != nil { + return x.DirectionFlag + } + return 0 +} + +func (x *C2CTempMessageHead) GetReserved() []byte { + if x != nil { + return x.Reserved + } + return nil +} + +type InstCtrl struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MsgSendToInst []*InstInfo `protobuf:"bytes,1,rep,name=msgSendToInst,proto3" json:"msgSendToInst,omitempty"` + MsgExcludeInst []*InstInfo `protobuf:"bytes,2,rep,name=msgExcludeInst,proto3" json:"msgExcludeInst,omitempty"` + MsgFromInst *InstInfo `protobuf:"bytes,3,opt,name=msgFromInst,proto3" json:"msgFromInst,omitempty"` +} + +func (x *InstCtrl) Reset() { + *x = InstCtrl{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InstCtrl) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InstCtrl) ProtoMessage() {} + +func (x *InstCtrl) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[33] + 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 InstCtrl.ProtoReflect.Descriptor instead. +func (*InstCtrl) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{33} +} + +func (x *InstCtrl) GetMsgSendToInst() []*InstInfo { + if x != nil { + return x.MsgSendToInst + } + return nil +} + +func (x *InstCtrl) GetMsgExcludeInst() []*InstInfo { + if x != nil { + return x.MsgExcludeInst + } + return nil +} + +func (x *InstCtrl) GetMsgFromInst() *InstInfo { + if x != nil { + return x.MsgFromInst + } + return nil +} + +type InstInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Apppid int32 `protobuf:"varint,1,opt,name=apppid,proto3" json:"apppid,omitempty"` + Instid int32 `protobuf:"varint,2,opt,name=instid,proto3" json:"instid,omitempty"` + Platform int32 `protobuf:"varint,3,opt,name=platform,proto3" json:"platform,omitempty"` + EnumDeviceType int32 `protobuf:"varint,10,opt,name=enumDeviceType,proto3" json:"enumDeviceType,omitempty"` +} + +func (x *InstInfo) Reset() { + *x = InstInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InstInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InstInfo) ProtoMessage() {} + +func (x *InstInfo) ProtoReflect() protoreflect.Message { + mi := &file_msg_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 InstInfo.ProtoReflect.Descriptor instead. +func (*InstInfo) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{34} +} + +func (x *InstInfo) GetApppid() int32 { + if x != nil { + return x.Apppid + } + return 0 +} + +func (x *InstInfo) GetInstid() int32 { + if x != nil { + return x.Instid + } + return 0 +} + +func (x *InstInfo) GetPlatform() int32 { + if x != nil { + return x.Platform + } + return 0 +} + +func (x *InstInfo) GetEnumDeviceType() int32 { + if x != nil { + return x.EnumDeviceType + } + return 0 +} + +type ExtGroupKeyInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CurMaxSeq int32 `protobuf:"varint,1,opt,name=curMaxSeq,proto3" json:"curMaxSeq,omitempty"` + CurTime int64 `protobuf:"varint,2,opt,name=curTime,proto3" json:"curTime,omitempty"` +} + +func (x *ExtGroupKeyInfo) Reset() { + *x = ExtGroupKeyInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExtGroupKeyInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExtGroupKeyInfo) ProtoMessage() {} + +func (x *ExtGroupKeyInfo) ProtoReflect() protoreflect.Message { + mi := &file_msg_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 ExtGroupKeyInfo.ProtoReflect.Descriptor instead. +func (*ExtGroupKeyInfo) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{35} +} + +func (x *ExtGroupKeyInfo) GetCurMaxSeq() int32 { + if x != nil { + return x.CurMaxSeq + } + return 0 +} + +func (x *ExtGroupKeyInfo) GetCurTime() int64 { + if x != nil { + return x.CurTime + } + return 0 +} + +type SyncCookie struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Time1 int64 `protobuf:"varint,1,opt,name=time1,proto3" json:"time1,omitempty"` + Time int64 `protobuf:"varint,2,opt,name=time,proto3" json:"time,omitempty"` + Ran1 int64 `protobuf:"varint,3,opt,name=ran1,proto3" json:"ran1,omitempty"` + Ran2 int64 `protobuf:"varint,4,opt,name=ran2,proto3" json:"ran2,omitempty"` + Const1 int64 `protobuf:"varint,5,opt,name=const1,proto3" json:"const1,omitempty"` + Const2 int64 `protobuf:"varint,11,opt,name=const2,proto3" json:"const2,omitempty"` + Const3 int64 `protobuf:"varint,12,opt,name=const3,proto3" json:"const3,omitempty"` + LastSyncTime int64 `protobuf:"varint,13,opt,name=lastSyncTime,proto3" json:"lastSyncTime,omitempty"` + Const4 int64 `protobuf:"varint,14,opt,name=const4,proto3" json:"const4,omitempty"` +} + +func (x *SyncCookie) Reset() { + *x = SyncCookie{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SyncCookie) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SyncCookie) ProtoMessage() {} + +func (x *SyncCookie) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[36] + 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 SyncCookie.ProtoReflect.Descriptor instead. +func (*SyncCookie) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{36} +} + +func (x *SyncCookie) GetTime1() int64 { + if x != nil { + return x.Time1 + } + return 0 +} + +func (x *SyncCookie) GetTime() int64 { + if x != nil { + return x.Time + } + return 0 +} + +func (x *SyncCookie) GetRan1() int64 { + if x != nil { + return x.Ran1 + } + return 0 +} + +func (x *SyncCookie) GetRan2() int64 { + if x != nil { + return x.Ran2 + } + return 0 +} + +func (x *SyncCookie) GetConst1() int64 { + if x != nil { + return x.Const1 + } + return 0 +} + +func (x *SyncCookie) GetConst2() int64 { + if x != nil { + return x.Const2 + } + return 0 +} + +func (x *SyncCookie) GetConst3() int64 { + if x != nil { + return x.Const3 + } + return 0 +} + +func (x *SyncCookie) GetLastSyncTime() int64 { + if x != nil { + return x.LastSyncTime + } + return 0 +} + +func (x *SyncCookie) GetConst4() int64 { + if x != nil { + return x.Const4 + } + return 0 +} + +var File_msg_proto protoreflect.FileDescriptor + +var file_msg_proto_rawDesc = []byte{ + 0x0a, 0x09, 0x6d, 0x73, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd8, 0x03, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x25, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x09, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x08, + 0x73, 0x79, 0x6e, 0x63, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x79, 0x6e, 0x63, + 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x73, 0x79, + 0x6e, 0x63, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x61, 0x6d, 0x62, + 0x6c, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x61, + 0x6d, 0x62, 0x6c, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x2e, 0x0a, 0x12, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x74, 0x52, 0x61, 0x6d, 0x62, 0x6c, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x61, 0x6d, 0x62, + 0x6c, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x52, 0x61, 0x6d, 0x62, 0x6c, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x11, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x52, 0x61, 0x6d, 0x62, 0x6c, 0x65, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x53, 0x79, 0x6e, 0x63, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, + 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x20, + 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x46, 0x6c, 0x61, 0x67, + 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x68, 0x69, 0x73, 0x70, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x77, 0x68, 0x69, 0x73, + 0x70, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, + 0x6d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x54, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x6d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x10, + 0x70, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x73, 0x67, 0x43, + 0x74, 0x72, 0x6c, 0x42, 0x75, 0x66, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x73, + 0x67, 0x43, 0x74, 0x72, 0x6c, 0x42, 0x75, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x42, 0x75, 0x66, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x42, 0x75, 0x66, 0x22, 0xf0, 0x02, 0x0a, 0x12, 0x53, 0x65, 0x6e, 0x64, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, + 0x0b, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x65, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x65, 0x61, 0x64, + 0x52, 0x0b, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x65, 0x61, 0x64, 0x12, 0x2e, 0x0a, + 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, + 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x12, 0x26, 0x0a, + 0x07, 0x6d, 0x73, 0x67, 0x42, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x07, 0x6d, 0x73, + 0x67, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x73, 0x67, 0x53, 0x65, 0x71, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x73, 0x67, 0x53, 0x65, 0x71, 0x12, 0x18, 0x0a, + 0x07, 0x6d, 0x73, 0x67, 0x52, 0x61, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, + 0x6d, 0x73, 0x67, 0x52, 0x61, 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x79, 0x6e, 0x63, 0x43, + 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x73, 0x79, 0x6e, + 0x63, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x73, 0x67, 0x56, 0x69, + 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x73, 0x67, 0x56, 0x69, 0x61, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x12, 0x22, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x43, 0x74, 0x72, 0x6c, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x74, 0x72, 0x6c, 0x52, 0x07, 0x6d, 0x73, + 0x67, 0x43, 0x74, 0x72, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x65, + 0x6e, 0x64, 0x53, 0x65, 0x71, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x53, 0x65, 0x6e, 0x64, 0x53, 0x65, 0x71, 0x22, 0x5e, 0x0a, 0x0b, 0x52, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x48, 0x65, 0x61, 0x64, 0x12, 0x16, 0x0a, 0x03, 0x63, 0x32, 0x63, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, 0x2e, 0x43, 0x32, 0x43, 0x52, 0x03, 0x63, 0x32, 0x63, + 0x12, 0x16, 0x0a, 0x03, 0x67, 0x72, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, 0x2e, + 0x47, 0x72, 0x70, 0x52, 0x03, 0x67, 0x72, 0x70, 0x12, 0x1f, 0x0a, 0x06, 0x67, 0x72, 0x70, 0x54, + 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x07, 0x2e, 0x47, 0x72, 0x70, 0x54, 0x6d, + 0x70, 0x52, 0x06, 0x67, 0x72, 0x70, 0x54, 0x6d, 0x70, 0x22, 0x1b, 0x0a, 0x03, 0x43, 0x32, 0x43, + 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x55, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x05, 0x74, 0x6f, 0x55, 0x69, 0x6e, 0x22, 0x23, 0x0a, 0x03, 0x47, 0x72, 0x70, 0x12, 0x1c, 0x0a, + 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x0a, 0x06, 0x47, + 0x72, 0x70, 0x54, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x69, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x55, 0x69, + 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x55, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x05, 0x74, 0x6f, 0x55, 0x69, 0x6e, 0x22, 0x23, 0x0a, 0x07, 0x4d, 0x73, 0x67, 0x43, 0x74, + 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x46, 0x6c, 0x61, 0x67, 0x22, 0xf6, 0x02, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x12, + 0x25, 0x0a, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x09, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x08, 0x73, 0x79, + 0x6e, 0x63, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x31, 0x0a, 0x0b, 0x75, 0x69, 0x6e, 0x50, 0x61, 0x69, + 0x72, 0x4d, 0x73, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x55, 0x69, + 0x6e, 0x50, 0x61, 0x69, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0b, 0x75, 0x69, + 0x6e, 0x50, 0x61, 0x69, 0x72, 0x4d, 0x73, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x69, 0x6e, + 0x64, 0x55, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x62, 0x69, 0x6e, 0x64, + 0x55, 0x69, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x73, 0x67, 0x52, 0x73, 0x70, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x73, 0x67, 0x52, 0x73, 0x70, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x75, 0x62, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, + 0x75, 0x62, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x12, + 0x24, 0x0a, 0x0d, 0x69, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, + 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x73, 0x67, 0x43, 0x74, 0x72, 0x6c, + 0x42, 0x75, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x73, 0x67, 0x43, 0x74, + 0x72, 0x6c, 0x42, 0x75, 0x66, 0x22, 0xa9, 0x01, 0x0a, 0x11, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x22, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x76, 0x72, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x73, 0x76, 0x72, 0x69, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x75, 0x73, 0x68, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x73, 0x68, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x4c, 0x61, 0x67, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x4c, 0x61, 0x67, 0x12, + 0x20, 0x0a, 0x0b, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x46, 0x6c, 0x61, + 0x67, 0x22, 0x98, 0x01, 0x0a, 0x0e, 0x55, 0x69, 0x6e, 0x50, 0x61, 0x69, 0x72, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x61, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, + 0x52, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x65, 0x72, + 0x55, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x70, 0x65, 0x65, 0x72, 0x55, + 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x73, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x73, 0x67, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x4d, 0x0a, 0x07, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, + 0x65, 0x61, 0x64, 0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x62, 0x6f, 0x64, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x82, 0x01, 0x0a, 0x0b, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x25, 0x0a, 0x08, 0x72, + 0x69, 0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, + 0x52, 0x69, 0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x52, 0x08, 0x72, 0x69, 0x63, 0x68, 0x54, 0x65, + 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x73, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x73, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x6d, 0x73, 0x67, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x6d, + 0x73, 0x67, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x90, 0x01, 0x0a, 0x08, 0x52, 0x69, 0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x12, 0x19, 0x0a, + 0x04, 0x61, 0x74, 0x74, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x41, 0x74, + 0x74, 0x72, 0x52, 0x04, 0x61, 0x74, 0x74, 0x72, 0x12, 0x1b, 0x0a, 0x05, 0x65, 0x6c, 0x65, 0x6d, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x52, 0x05, + 0x65, 0x6c, 0x65, 0x6d, 0x73, 0x12, 0x34, 0x0a, 0x0d, 0x6e, 0x6f, 0x74, 0x4f, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x4e, + 0x6f, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x0d, 0x6e, 0x6f, + 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x03, 0x70, + 0x74, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x04, 0x2e, 0x50, 0x74, 0x74, 0x52, 0x03, + 0x70, 0x74, 0x74, 0x22, 0xb9, 0x03, 0x0a, 0x04, 0x45, 0x6c, 0x65, 0x6d, 0x12, 0x19, 0x0a, 0x04, + 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x54, 0x65, 0x78, + 0x74, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x19, 0x0a, 0x04, 0x66, 0x61, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x46, 0x61, 0x63, 0x65, 0x52, 0x04, 0x66, 0x61, + 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x0b, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x12, 0x37, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x4e, 0x6f, 0x74, + 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x0e, 0x6e, 0x6f, 0x74, + 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2b, 0x0a, 0x0a, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x46, 0x61, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0b, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x46, 0x61, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x46, 0x61, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x46, 0x69, + 0x6c, 0x65, 0x12, 0x28, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x72, 0x61, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x09, 0x65, 0x78, 0x74, 0x72, 0x61, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x28, 0x0a, 0x09, + 0x76, 0x69, 0x64, 0x65, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0a, 0x2e, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x09, 0x76, 0x69, 0x64, + 0x65, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x61, 0x6e, 0x6f, 0x6e, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x4d, 0x73, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x41, + 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x52, 0x0c, 0x61, 0x6e, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, + 0x73, 0x67, 0x12, 0x2b, 0x0a, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x45, 0x6c, 0x65, 0x6d, + 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x45, + 0x6c, 0x65, 0x6d, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x45, 0x6c, 0x65, 0x6d, 0x22, + 0x78, 0x0a, 0x0a, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x45, 0x6c, 0x65, 0x6d, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x65, 0x73, + 0x63, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, + 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x94, 0x01, 0x0a, 0x04, 0x54, 0x65, + 0x78, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x73, 0x74, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x74, 0x74, 0x72, + 0x36, 0x42, 0x75, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x61, 0x74, 0x74, 0x72, + 0x36, 0x42, 0x75, 0x66, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x74, 0x74, 0x72, 0x37, 0x42, 0x75, 0x66, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x61, 0x74, 0x74, 0x72, 0x37, 0x42, 0x75, 0x66, + 0x12, 0x10, 0x0a, 0x03, 0x62, 0x75, 0x66, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x62, + 0x75, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x62, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x62, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x22, 0x90, 0x02, 0x0a, 0x04, 0x41, 0x74, 0x74, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x64, + 0x65, 0x50, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x6f, 0x64, + 0x65, 0x50, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, 0x6e, + 0x64, 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x72, 0x53, 0x65, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x63, 0x68, 0x61, 0x72, 0x53, 0x65, 0x74, 0x12, 0x26, 0x0a, + 0x0e, 0x70, 0x69, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x69, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, 0x46, + 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x6f, 0x6e, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x6f, 0x6e, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x22, 0xb9, 0x05, 0x0a, 0x03, 0x50, 0x74, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x72, 0x63, 0x55, 0x69, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x72, 0x63, 0x55, 0x69, 0x6e, 0x12, + 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x66, + 0x69, 0x6c, 0x65, 0x4d, 0x64, 0x35, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x66, 0x69, + 0x6c, 0x65, 0x4d, 0x64, 0x35, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62, + 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x63, 0x75, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x63, 0x75, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, + 0x0d, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x50, 0x74, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x50, 0x74, 0x74, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x53, 0x77, 0x69, 0x74, + 0x63, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x53, + 0x77, 0x69, 0x74, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x74, 0x74, 0x55, 0x72, 0x6c, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x74, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x22, 0x0a, + 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x4b, 0x65, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x6f, 0x77, 0x6e, 0x50, 0x61, 0x72, + 0x61, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x64, 0x6f, 0x77, 0x6e, 0x50, 0x61, 0x72, + 0x61, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x62, 0x52, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x62, + 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x50, 0x74, 0x74, 0x55, 0x72, 0x6c, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0c, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x50, 0x74, 0x74, 0x55, 0x72, 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x64, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x20, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x22, + 0x65, 0x0a, 0x0b, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x67, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x67, 0x75, + 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, + 0x0a, 0x0e, 0x6f, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x6f, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x53, 0x65, + 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xf0, 0x05, 0x0a, 0x0e, 0x4e, 0x6f, 0x74, 0x4f, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, + 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, + 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4c, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4c, 0x65, 0x6e, 0x12, + 0x22, 0x0a, 0x0c, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x74, 0x68, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x6f, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x53, 0x65, 0x6e, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x6f, 0x6c, 0x64, + 0x56, 0x65, 0x72, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x69, + 0x6d, 0x67, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x69, 0x6d, + 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x73, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x73, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x69, 0x63, 0x4d, 0x64, 0x35, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x69, 0x63, + 0x4d, 0x64, 0x35, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x69, 0x63, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x69, 0x63, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x63, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x69, 0x63, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x14, 0x0a, + 0x05, 0x72, 0x65, 0x73, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x65, + 0x73, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x61, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x66, 0x6c, 0x61, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x68, 0x75, 0x6d, 0x62, + 0x55, 0x72, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x68, 0x75, 0x6d, 0x62, + 0x55, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, + 0x16, 0x0a, 0x06, 0x62, 0x69, 0x67, 0x55, 0x72, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x62, 0x69, 0x67, 0x55, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x69, 0x67, 0x55, + 0x72, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x69, 0x67, 0x55, 0x72, + 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x69, 0x7a, 0x54, 0x79, 0x70, 0x65, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x07, 0x62, 0x69, 0x7a, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x70, 0x46, + 0x61, 0x63, 0x65, 0x42, 0x75, 0x66, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x6f, 0x70, + 0x46, 0x61, 0x63, 0x65, 0x42, 0x75, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x50, 0x69, + 0x63, 0x4d, 0x64, 0x35, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6c, 0x64, 0x50, + 0x69, 0x63, 0x4d, 0x64, 0x35, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x57, 0x69, + 0x64, 0x74, 0x68, 0x18, 0x15, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x68, 0x75, 0x6d, 0x62, + 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x74, 0x68, 0x75, 0x6d, + 0x62, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, + 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x77, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, + 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, + 0x62, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, + 0x70, 0x62, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x22, 0xb9, 0x04, 0x0a, 0x0d, 0x4e, 0x6f, + 0x74, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x69, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, + 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x66, 0x69, 0x6c, + 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x64, 0x35, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x64, 0x35, 0x12, + 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x75, 0x62, 0x63, 0x6d, + 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x75, 0x62, 0x63, 0x6d, 0x64, 0x12, + 0x1e, 0x0a, 0x0a, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x12, + 0x24, 0x0a, 0x0d, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x73, + 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0d, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x6c, + 0x65, 0x55, 0x72, 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x64, 0x6f, 0x77, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x61, 0x6e, + 0x67, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6c, 0x18, 0x32, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x64, + 0x61, 0x6e, 0x67, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x69, 0x66, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x33, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6c, 0x69, 0x66, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, + 0x69, 0x6d, 0x65, 0x18, 0x34, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x62, 0x73, 0x46, 0x69, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x35, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x61, 0x62, 0x73, 0x46, + 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x36, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x37, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x62, 0x52, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x62, 0x52, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x22, 0xe3, 0x02, 0x0a, 0x09, 0x45, 0x78, 0x74, 0x72, 0x61, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x69, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x6e, 0x69, 0x63, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x43, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6c, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, + 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, 0x73, 0x6b, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, 0x73, 0x6b, 0x12, + 0x1c, 0x0a, 0x09, 0x6d, 0x73, 0x67, 0x54, 0x61, 0x69, 0x6c, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x6d, 0x73, 0x67, 0x54, 0x61, 0x69, 0x6c, 0x49, 0x64, 0x12, 0x20, 0x0a, + 0x0b, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x61, 0x70, 0x6e, 0x73, 0x54, 0x69, 0x70, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x08, 0x61, 0x70, 0x6e, 0x73, 0x54, 0x69, 0x70, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x69, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x75, 0x69, 0x6e, 0x12, 0x22, 0x0a, + 0x0c, 0x6d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, + 0x67, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x70, 0x6e, 0x73, 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x61, 0x70, 0x6e, 0x73, 0x53, 0x6f, + 0x75, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, + 0x65, 0x77, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x46, 0x6c, 0x61, 0x67, 0x22, 0xa1, 0x02, 0x0a, 0x09, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x62, 0x61, 0x74, 0x63, + 0x68, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x6d, 0x61, 0x72, + 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0b, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, + 0x20, 0x0a, 0x0b, 0x66, 0x65, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x66, 0x65, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x62, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x62, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x22, + 0xdf, 0x01, 0x0a, 0x15, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, + 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x61, 0x6e, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x06, 0x61, 0x6e, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x6e, 0x6f, 0x6e, 0x4e, + 0x69, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x61, 0x6e, 0x6f, 0x6e, 0x4e, + 0x69, 0x63, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x72, + 0x61, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x50, + 0x6f, 0x72, 0x74, 0x72, 0x61, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x75, 0x62, 0x62, 0x6c, + 0x65, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x62, 0x75, 0x62, 0x62, 0x6c, + 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x61, 0x6e, 0x6b, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x72, 0x61, 0x6e, 0x6b, 0x43, 0x6f, 0x6c, 0x6f, + 0x72, 0x22, 0xc9, 0x06, 0x0a, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x66, + 0x69, 0x6c, 0x65, 0x4d, 0x64, 0x35, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x66, 0x69, + 0x6c, 0x65, 0x4d, 0x64, 0x35, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x68, 0x75, + 0x6d, 0x62, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, + 0x68, 0x75, 0x6d, 0x62, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x68, 0x75, + 0x6d, 0x62, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, + 0x74, 0x68, 0x75, 0x6d, 0x62, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x74, + 0x68, 0x75, 0x6d, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x64, 0x35, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x64, 0x35, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, + 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x74, 0x68, 0x75, 0x6d, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x62, 0x75, 0x73, 0x69, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x62, 0x75, 0x73, 0x69, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x72, 0x6f, + 0x6d, 0x43, 0x68, 0x61, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x74, 0x6f, 0x43, 0x68, 0x61, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x43, 0x68, 0x61, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x36, 0x0a, + 0x16, 0x62, 0x6f, 0x6f, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x62, + 0x6f, 0x6f, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x64, + 0x74, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, + 0x64, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x42, 0x75, 0x73, 0x69, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x75, 0x62, 0x42, 0x75, 0x73, + 0x69, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x74, + 0x74, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x41, + 0x74, 0x74, 0x72, 0x12, 0x2e, 0x0a, 0x12, 0x62, 0x79, 0x74, 0x65, 0x73, 0x54, 0x68, 0x75, 0x6d, + 0x62, 0x46, 0x69, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0c, 0x52, + 0x12, 0x62, 0x79, 0x74, 0x65, 0x73, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x55, + 0x72, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x62, 0x79, 0x74, 0x65, 0x73, 0x56, 0x69, 0x64, 0x65, + 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0c, 0x52, + 0x12, 0x62, 0x79, 0x74, 0x65, 0x73, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x55, + 0x72, 0x6c, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x44, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x16, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, + 0x74, 0x68, 0x75, 0x6d, 0x62, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x6c, 0x61, + 0x67, 0x12, 0x2c, 0x0a, 0x11, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x76, 0x69, + 0x64, 0x65, 0x6f, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x12, + 0x1c, 0x0a, 0x09, 0x70, 0x62, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x18, 0x18, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x09, 0x70, 0x62, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x22, 0x40, 0x0a, + 0x04, 0x46, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6f, + 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6f, 0x6c, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x62, 0x75, 0x66, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x62, 0x75, 0x66, 0x22, + 0x99, 0x07, 0x0a, 0x0a, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x46, 0x61, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x67, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x67, 0x75, + 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x66, 0x6c, 0x61, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x6c, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x49, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x49, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x6f, + 0x72, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, + 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x64, 0x35, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6d, 0x64, 0x35, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x68, 0x75, 0x6d, + 0x62, 0x55, 0x72, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x68, 0x75, 0x6d, + 0x62, 0x55, 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x69, 0x67, 0x55, 0x72, 0x6c, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x69, 0x67, 0x55, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, + 0x6f, 0x72, 0x69, 0x67, 0x55, 0x72, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, + 0x72, 0x69, 0x67, 0x55, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x69, 0x7a, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x62, 0x69, 0x7a, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x15, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x18, 0x16, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x16, + 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, 0x1a, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x68, + 0x75, 0x6d, 0x62, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x74, 0x68, 0x75, 0x6d, 0x62, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x68, + 0x75, 0x6d, 0x62, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0b, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x68, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, + 0x68, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x64, 0x6f, 0x77, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x5f, 0x34, 0x30, 0x30, + 0x55, 0x72, 0x6c, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x34, 0x30, 0x30, 0x55, 0x72, + 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x5f, 0x34, 0x30, 0x30, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x20, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x34, 0x30, 0x30, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1d, + 0x0a, 0x0a, 0x5f, 0x34, 0x30, 0x30, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x21, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x34, 0x30, 0x30, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x70, 0x62, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x09, 0x70, 0x62, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x22, 0x77, 0x0a, 0x0b, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6b, + 0x67, 0x4e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6b, 0x67, 0x4e, + 0x75, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6b, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6b, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, + 0x0a, 0x06, 0x64, 0x69, 0x76, 0x53, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, + 0x64, 0x69, 0x76, 0x53, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0xe0, 0x07, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x48, 0x65, 0x61, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x72, 0x6f, 0x6d, 0x55, 0x69, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x72, 0x6f, 0x6d, 0x55, 0x69, 0x6e, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x55, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, + 0x6f, 0x55, 0x69, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x63, 0x32, 0x63, 0x43, 0x6d, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, + 0x63, 0x32, 0x63, 0x43, 0x6d, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x73, 0x67, 0x53, 0x65, 0x71, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x73, 0x67, 0x53, 0x65, 0x71, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x07, 0x6d, 0x73, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x73, 0x67, 0x55, + 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x73, 0x67, 0x55, 0x69, 0x64, + 0x12, 0x39, 0x0a, 0x0d, 0x63, 0x32, 0x63, 0x54, 0x6d, 0x70, 0x4d, 0x73, 0x67, 0x48, 0x65, 0x61, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x43, 0x32, 0x43, 0x54, 0x65, 0x6d, + 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x65, 0x61, 0x64, 0x52, 0x0d, 0x63, 0x32, + 0x63, 0x54, 0x6d, 0x70, 0x4d, 0x73, 0x67, 0x48, 0x65, 0x61, 0x64, 0x12, 0x28, 0x0a, 0x09, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, + 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x70, 0x70, + 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x70, + 0x70, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x49, 0x6e, 0x73, 0x74, 0x69, + 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x49, 0x6e, 0x73, + 0x74, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x75, + 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x4e, 0x69, 0x63, 0x6b, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x4e, 0x69, 0x63, 0x6b, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x75, 0x74, 0x68, 0x55, 0x69, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x07, 0x61, 0x75, 0x74, 0x68, 0x55, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x75, 0x74, + 0x68, 0x4e, 0x69, 0x63, 0x6b, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x75, 0x74, + 0x68, 0x4e, 0x69, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x46, 0x6c, 0x61, 0x67, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x46, 0x6c, 0x61, 0x67, 0x12, + 0x1e, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x52, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x52, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x12, + 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x13, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, + 0x0e, 0x6d, 0x75, 0x74, 0x69, 0x6c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x48, 0x65, 0x61, 0x64, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x4d, 0x75, 0x74, 0x69, 0x6c, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x48, 0x65, 0x61, 0x64, 0x52, 0x0e, 0x6d, 0x75, 0x74, 0x69, 0x6c, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x48, 0x65, 0x61, 0x64, 0x12, 0x2b, 0x0a, 0x0b, 0x6d, 0x73, 0x67, 0x49, 0x6e, 0x73, + 0x74, 0x43, 0x74, 0x72, 0x6c, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x49, 0x6e, + 0x73, 0x74, 0x43, 0x74, 0x72, 0x6c, 0x52, 0x0b, 0x6d, 0x73, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x43, + 0x74, 0x72, 0x6c, 0x12, 0x3e, 0x0a, 0x1a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x6c, 0x61, + 0x67, 0x18, 0x16, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6e, 0x64, 0x46, + 0x6c, 0x61, 0x67, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x73, 0x65, 0x71, 0x49, 0x6e, 0x43, 0x32, 0x63, + 0x4d, 0x73, 0x67, 0x68, 0x65, 0x61, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x77, + 0x73, 0x65, 0x71, 0x49, 0x6e, 0x43, 0x32, 0x63, 0x4d, 0x73, 0x67, 0x68, 0x65, 0x61, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x63, 0x70, 0x69, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x63, + 0x70, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, + 0x65, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x45, + 0x78, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, + 0x65, 0x78, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x30, 0x0a, 0x13, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, + 0x6c, 0x65, 0x54, 0x65, 0x78, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x54, 0x65, 0x78, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x75, 0x74, 0x68, 0x53, 0x65, 0x78, 0x18, 0x1b, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x07, 0x61, 0x75, 0x74, 0x68, 0x53, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x69, + 0x73, 0x53, 0x72, 0x63, 0x4d, 0x73, 0x67, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, + 0x73, 0x53, 0x72, 0x63, 0x4d, 0x73, 0x67, 0x22, 0x8b, 0x02, 0x0a, 0x09, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, + 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x65, + 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, + 0x66, 0x6f, 0x53, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x61, + 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, + 0x61, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x61, 0x6e, 0x6b, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x61, 0x6e, + 0x6b, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x61, 0x72, 0x64, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, + 0x61, 0x72, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xbf, 0x01, 0x0a, 0x0b, 0x44, 0x69, 0x73, 0x63, 0x75, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, + 0x55, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x63, 0x75, + 0x73, 0x73, 0x55, 0x69, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x63, + 0x75, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x63, 0x75, + 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0e, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x65, 0x71, 0x12, + 0x24, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x52, 0x65, 0x6d, 0x61, 0x72, 0x6b, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x52, + 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x63, + 0x75, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x0e, 0x4d, 0x75, 0x74, 0x69, 0x6c, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x48, 0x65, 0x61, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x22, 0xd2, 0x02, 0x0a, 0x12, 0x43, 0x32, 0x43, 0x54, + 0x65, 0x6d, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x65, 0x61, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x32, 0x63, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x07, 0x63, 0x32, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x55, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x55, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, + 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x03, 0x73, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x67, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x74, 0x6f, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x74, 0x6f, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6c, 0x6f, 0x63, 0x6b, + 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6c, + 0x6f, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0d, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6c, 0x61, 0x67, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x22, 0x9b, 0x01, 0x0a, + 0x08, 0x49, 0x6e, 0x73, 0x74, 0x43, 0x74, 0x72, 0x6c, 0x12, 0x2f, 0x0a, 0x0d, 0x6d, 0x73, 0x67, + 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x49, 0x6e, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x09, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x6d, 0x73, 0x67, + 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x49, 0x6e, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0e, 0x6d, 0x73, + 0x67, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x6d, + 0x73, 0x67, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x12, 0x2b, 0x0a, + 0x0b, 0x6d, 0x73, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x49, 0x6e, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6d, + 0x73, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x49, 0x6e, 0x73, 0x74, 0x22, 0x7e, 0x0a, 0x08, 0x49, 0x6e, + 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x70, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x61, 0x70, 0x70, 0x70, 0x69, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x69, 0x6e, 0x73, 0x74, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, + 0x69, 0x6e, 0x73, 0x74, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x65, 0x6e, 0x75, 0x6d, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x49, 0x0a, 0x0f, 0x45, 0x78, + 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, + 0x09, 0x63, 0x75, 0x72, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x63, 0x75, 0x72, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x75, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x75, + 0x72, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x0a, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, + 0x6f, 0x6b, 0x69, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x6d, 0x65, 0x31, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x69, 0x6d, 0x65, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x31, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x72, 0x61, + 0x6e, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x32, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x04, 0x72, 0x61, 0x6e, 0x32, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x31, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x31, 0x12, 0x16, + 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x32, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x32, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x33, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x33, 0x12, 0x22, + 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x34, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x34, 0x2a, 0x2e, 0x0a, 0x08, 0x53, 0x79, + 0x6e, 0x63, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, + 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4d, 0x45, 0x10, 0x01, + 0x12, 0x08, 0x0a, 0x04, 0x53, 0x54, 0x4f, 0x50, 0x10, 0x02, 0x42, 0x07, 0x5a, 0x05, 0x2e, 0x3b, + 0x6d, 0x73, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_msg_proto_rawDescOnce sync.Once + file_msg_proto_rawDescData = file_msg_proto_rawDesc +) + +func file_msg_proto_rawDescGZIP() []byte { + file_msg_proto_rawDescOnce.Do(func() { + file_msg_proto_rawDescData = protoimpl.X.CompressGZIP(file_msg_proto_rawDescData) + }) + return file_msg_proto_rawDescData +} + +var file_msg_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_msg_proto_msgTypes = make([]protoimpl.MessageInfo, 37) +var file_msg_proto_goTypes = []interface{}{ + (SyncFlag)(0), // 0: SyncFlag + (*GetMessageRequest)(nil), // 1: GetMessageRequest + (*SendMessageRequest)(nil), // 2: SendMessageRequest + (*RoutingHead)(nil), // 3: RoutingHead + (*C2C)(nil), // 4: C2C + (*Grp)(nil), // 5: Grp + (*GrpTmp)(nil), // 6: GrpTmp + (*MsgCtrl)(nil), // 7: MsgCtrl + (*GetMessageResponse)(nil), // 8: GetMessageResponse + (*PushMessagePacket)(nil), // 9: PushMessagePacket + (*UinPairMessage)(nil), // 10: UinPairMessage + (*Message)(nil), // 11: Message + (*MessageBody)(nil), // 12: MessageBody + (*RichText)(nil), // 13: RichText + (*Elem)(nil), // 14: Elem + (*CustomElem)(nil), // 15: CustomElem + (*Text)(nil), // 16: Text + (*Attr)(nil), // 17: Attr + (*Ptt)(nil), // 18: Ptt + (*OnlineImage)(nil), // 19: OnlineImage + (*NotOnlineImage)(nil), // 20: NotOnlineImage + (*NotOnlineFile)(nil), // 21: NotOnlineFile + (*ExtraInfo)(nil), // 22: ExtraInfo + (*GroupFile)(nil), // 23: GroupFile + (*AnonymousGroupMessage)(nil), // 24: AnonymousGroupMessage + (*VideoFile)(nil), // 25: VideoFile + (*Face)(nil), // 26: Face + (*CustomFace)(nil), // 27: CustomFace + (*ContentHead)(nil), // 28: ContentHead + (*MessageHead)(nil), // 29: MessageHead + (*GroupInfo)(nil), // 30: GroupInfo + (*DiscussInfo)(nil), // 31: DiscussInfo + (*MutilTransHead)(nil), // 32: MutilTransHead + (*C2CTempMessageHead)(nil), // 33: C2CTempMessageHead + (*InstCtrl)(nil), // 34: InstCtrl + (*InstInfo)(nil), // 35: InstInfo + (*ExtGroupKeyInfo)(nil), // 36: ExtGroupKeyInfo + (*SyncCookie)(nil), // 37: SyncCookie +} +var file_msg_proto_depIdxs = []int32{ + 0, // 0: GetMessageRequest.syncFlag:type_name -> SyncFlag + 3, // 1: SendMessageRequest.routingHead:type_name -> RoutingHead + 28, // 2: SendMessageRequest.contentHead:type_name -> ContentHead + 12, // 3: SendMessageRequest.msgBody:type_name -> MessageBody + 7, // 4: SendMessageRequest.msgCtrl:type_name -> MsgCtrl + 4, // 5: RoutingHead.c2c:type_name -> C2C + 5, // 6: RoutingHead.grp:type_name -> Grp + 6, // 7: RoutingHead.grpTmp:type_name -> GrpTmp + 0, // 8: GetMessageResponse.syncFlag:type_name -> SyncFlag + 10, // 9: GetMessageResponse.uinPairMsgs:type_name -> UinPairMessage + 11, // 10: PushMessagePacket.message:type_name -> Message + 11, // 11: UinPairMessage.messages:type_name -> Message + 29, // 12: Message.head:type_name -> MessageHead + 12, // 13: Message.body:type_name -> MessageBody + 13, // 14: MessageBody.richText:type_name -> RichText + 17, // 15: RichText.attr:type_name -> Attr + 14, // 16: RichText.elems:type_name -> Elem + 21, // 17: RichText.notOnlineFile:type_name -> NotOnlineFile + 18, // 18: RichText.ptt:type_name -> Ptt + 16, // 19: Elem.text:type_name -> Text + 26, // 20: Elem.face:type_name -> Face + 19, // 21: Elem.onlineImage:type_name -> OnlineImage + 20, // 22: Elem.notOnlineImage:type_name -> NotOnlineImage + 27, // 23: Elem.customFace:type_name -> CustomFace + 23, // 24: Elem.groupFile:type_name -> GroupFile + 22, // 25: Elem.extraInfo:type_name -> ExtraInfo + 25, // 26: Elem.videoFile:type_name -> VideoFile + 24, // 27: Elem.anonGroupMsg:type_name -> AnonymousGroupMessage + 15, // 28: Elem.customElem:type_name -> CustomElem + 33, // 29: MessageHead.c2cTmpMsgHead:type_name -> C2CTempMessageHead + 30, // 30: MessageHead.groupInfo:type_name -> GroupInfo + 31, // 31: MessageHead.discussInfo:type_name -> DiscussInfo + 32, // 32: MessageHead.mutiltransHead:type_name -> MutilTransHead + 34, // 33: MessageHead.msgInstCtrl:type_name -> InstCtrl + 36, // 34: MessageHead.extGroupKeyInfo:type_name -> ExtGroupKeyInfo + 35, // 35: InstCtrl.msgSendToInst:type_name -> InstInfo + 35, // 36: InstCtrl.msgExcludeInst:type_name -> InstInfo + 35, // 37: InstCtrl.msgFromInst:type_name -> InstInfo + 38, // [38:38] is the sub-list for method output_type + 38, // [38:38] is the sub-list for method input_type + 38, // [38:38] is the sub-list for extension type_name + 38, // [38:38] is the sub-list for extension extendee + 0, // [0:38] is the sub-list for field type_name +} + +func init() { file_msg_proto_init() } +func file_msg_proto_init() { + if File_msg_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_msg_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMessageRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SendMessageRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoutingHead); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*C2C); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Grp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GrpTmp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgCtrl); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMessageResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PushMessagePacket); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UinPairMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Message); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MessageBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RichText); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Elem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CustomElem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Text); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Attr); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ptt); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnlineImage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NotOnlineImage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NotOnlineFile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExtraInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GroupFile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AnonymousGroupMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VideoFile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Face); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CustomFace); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContentHead); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MessageHead); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GroupInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DiscussInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MutilTransHead); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*C2CTempMessageHead); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstCtrl); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExtGroupKeyInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SyncCookie); 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{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_msg_proto_rawDesc, + NumEnums: 1, + NumMessages: 37, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_msg_proto_goTypes, + DependencyIndexes: file_msg_proto_depIdxs, + EnumInfos: file_msg_proto_enumTypes, + MessageInfos: file_msg_proto_msgTypes, + }.Build() + File_msg_proto = out.File + file_msg_proto_rawDesc = nil + file_msg_proto_goTypes = nil + file_msg_proto_depIdxs = nil +} diff --git a/client/pb/msg/msg.proto b/client/pb/msg/msg.proto new file mode 100644 index 00000000..5a16a5db --- /dev/null +++ b/client/pb/msg/msg.proto @@ -0,0 +1,519 @@ +syntax = "proto3"; + +option go_package = ".;msg"; + +message GetMessageRequest { + SyncFlag syncFlag = 1; + bytes syncCookie = 2; + int32 rambleFlag = 3; + int32 latestRambleNumber = 4; + int32 otherRambleNumber = 5; + int32 onlineSyncFlag = 6; + int32 contextFlag = 7; + int32 whisperSessionId = 8; + int32 msgReqType = 9; + bytes pubaccountCookie = 10; + bytes msgCtrlBuf = 11; + bytes serverBuf = 12; +} + +message SendMessageRequest { + RoutingHead routingHead = 1; + ContentHead contentHead = 2; + MessageBody msgBody = 3; + int32 msgSeq = 4; + int32 msgRand = 5; + bytes syncCookie = 6; + //MsgComm.AppShareInfo? appShare = 7; + int32 msgVia = 8; + int32 dataStatist = 9; + //MultiMsgAssist? multiMsgAssist = 10; + //PbInputNotifyInfo? inputNotifyInfo = 11; + MsgCtrl msgCtrl = 12; + //ImReceipt.ReceiptReq? receiptReq = 13; + int32 multiSendSeq = 14; + +} + +message RoutingHead { + C2C c2c = 1; + Grp grp = 2; + GrpTmp grpTmp = 3; + /* + Dis dis = 4; + DisTmp disTmp = 5; + WPATmp? wpaTmp = 6; + SecretFileHead? secretFile = 7; + PublicPlat? publicPlat = 8; + TransMsg? transMsg = 9; + AddressListTmp? addressList = 10; + RichStatusTmp? richStatusTmp = 11; + TransCmd? transCmd = 12; + AccostTmp? accostTmp = 13; + PubGroupTmp? pubGroupTmp = 14; + Trans0x211? trans0x211 = 15; + BusinessWPATmp? businessWpaTmp = 16; + AuthTmp? authTmp = 17; + BsnsTmp? bsnsTmp = 18; + QQQueryBusinessTmp? qqQuerybusinessTmp = 19; + NearByDatingTmp? nearbyDatingTmp = 20; + NearByAssistantTmp? nearbyAssistantTmp = 21; + CommTmp? commTmp = 22; + */ +} + +message C2C { + int64 toUin = 1; +} + +message Grp { + int64 groupCode = 1; +} + +message GrpTmp { + int64 groupUin = 1; + int64 toUin = 2; +} + +message MsgCtrl { + int32 msgFlag = 1; +} + +message GetMessageResponse { + int32 result = 1; + string errorMessage = 2; + bytes syncCookie = 3; + SyncFlag syncFlag = 4; + repeated UinPairMessage uinPairMsgs = 5; + int64 bindUin = 6; + int32 msgRspType = 7; + bytes pubAccountCookie = 8; + bool isPartialSync = 9; + bytes msgCtrlBuf = 10; +} + +message PushMessagePacket { + Message message = 1; + int32 svrip = 2; + bytes pushToken = 3; + int32 pingFLag = 4; + int32 generalFlag = 9; +} + +message UinPairMessage { + int32 lastReadTime = 1; + int64 peerUin = 2; + int32 msgCompleted = 3; + repeated Message messages = 4; +} + +message Message { + MessageHead head = 1; + MessageBody body = 3; +} + +message MessageBody { + RichText richText = 1; + bytes msgContent = 2; + bytes msgEncryptContent = 3; +} + +message RichText { + Attr attr = 1; + repeated Elem elems = 2; + NotOnlineFile notOnlineFile = 3; + Ptt ptt = 4; +} + +message Elem { + Text text = 1; + Face face = 2; + OnlineImage onlineImage = 3; + NotOnlineImage notOnlineImage = 4; + //TransElem transElemInfo = 5; + //MarketFace marketFace = 6; + //ElemFlags elemFlags = 7; + CustomFace customFace = 8; + //ElemFlags2 elemFlags2 = 9; + //FunFace funFace = 10; + //SecretFileMsg secretFile = 11; + //RichMsg richMsg = 12; + GroupFile groupFile = 13; + //PubGroup pubGroup = 14; + //MarketTrans marketTrans = 15; + ExtraInfo extraInfo = 16; + //ShakeWindow? shakeWindow = 17; + //PubAccount? pubAccount = 18; + VideoFile videoFile = 19; + //TipsInfo? tipsInfo = 20; + AnonymousGroupMessage anonGroupMsg = 21; + //QQLiveOld? qqLiveOld = 22; + //LifeOnlineAccount? lifeOnline = 23; + //QQWalletMsg? qqwalletMsg = 24; + //CrmElem? crmElem = 25; + //ConferenceTipsInfo? conferenceTipsInfo = 26; + //RedBagInfo? redbagInfo = 27; + //LowVersionTips? lowVersionTips = 28; + //bytes bankcodeCtrlInfo = 29; + //NearByMessageType? nearByMsg = 30; + CustomElem customElem = 31; + //LocationInfo? locationInfo = 32; + //PubAccInfo? pubAccInfo = 33; + //SmallEmoji? smallEmoji = 34; + //FSJMessageElem? fsjMsgElem = 35; + //ArkAppElem? arkApp = 36; + //GeneralFlags? generalFlags = 37; + //CustomFace? hcFlashPic = 38; + //DeliverGiftMsg? deliverGiftMsg = 39; + //BitAppMsg? bitappMsg = 40; + //OpenQQData? openQqData = 41; + //ApolloActMsg? apolloMsg = 42; + //GroupPubAccountInfo? groupPubAccInfo = 43; + //BlessingMessage? blessMsg = 44; + //SourceMsg? srcMsg = 45; + //LolaMsg? lolaMsg = 46; + //GroupBusinessMsg? groupBusinessMsg = 47; + //WorkflowNotifyMsg? msgWorkflowNotify = 48; + //PatsElem? patElem = 49; + //GroupPostElem? groupPostElem = 50; + //LightAppElem? lightApp = 51; + //EIMInfo? eimInfo = 52; + //CommonElem? commonElem = 53; +} + +message CustomElem { + bytes desc = 1; + bytes data = 2; + int32 enumType = 3; + bytes ext = 4; + bytes sound = 5; +} + +message Text { + string str = 1; + string link = 2; + bytes attr6Buf = 3; + bytes attr7Buf = 4; + bytes buf = 11; + bytes pbReserve = 12; +} + +message Attr { + int32 codePage = 1; + int32 time = 2; + int32 random = 3; + int32 color = 4; + int32 size = 5; + int32 effect = 6; + int32 charSet = 7; + int32 pitchAndFamily = 8; + string fontName = 9; + bytes reserveData = 10; +} + +message Ptt { + int32 fileType = 1; + int64 srcUin = 2; + bytes fileUuid = 3; + bytes fileMd5 = 4; + bytes fileName = 5; + int32 fileSize = 6; + bytes reserve = 7; + int32 fileId = 8; + int32 serverIp = 9; + int32 serverPort = 10; + bool boolValid = 11; + bytes signature = 12; + bytes shortcut = 13; + bytes fileKey = 14; + int32 magicPttIndex = 15; + int32 voiceSwitch = 16; + bytes pttUrl = 17; + bytes groupFileKey = 18; + int32 time = 19; + bytes downPara = 20; + int32 format = 29; + bytes pbReserve = 30; + repeated bytes bytesPttUrls = 31; + int32 downloadFlag = 32; + +} + +message OnlineImage { + bytes guid = 1; + bytes filePath = 2; + bytes oldVerSendFile = 3; +} + +message NotOnlineImage { + string filePath = 1; + int32 fileLen = 2; + string downloadPath = 3; + bytes oldVerSendFile = 4; + int32 imgType = 5; + bytes previewsImage = 6; + bytes picMd5 = 7; + int32 picHeight = 8; + int32 picWidth = 9; + string resId = 10; + bytes flag = 11; + string thumbUrl = 12; + int32 original = 13; + string bigUrl = 14; + string origUrl = 15; + int32 bizType = 16; + int32 result = 17; + int32 index = 18; + bytes opFaceBuf = 19; + bool oldPicMd5 = 20; + int32 thumbWidth = 21; + int32 thumbHeight = 22; + int32 fileId = 23; + int32 showLen = 24; + int32 downloadLen = 25; + bytes pbReserve = 29; +} + +message NotOnlineFile { + int32 fileType = 1; + bytes sig = 2; + bytes fileUuid = 3; + bytes fileMd5 = 4; + bytes fileName = 5; + int64 fileSize = 6; + bytes note = 7; + int32 reserved = 8; + int32 subcmd = 9; + int32 microCloud = 10; + repeated bytes bytesFileUrls = 11; + int32 downloadFlag = 12; + int32 dangerEvel = 50; + int32 lifeTime = 51; + int32 uploadTime = 52; + int32 absFileType = 53; + int32 clientType = 54; + int32 expireTime = 55; + bytes pbReserve = 56; +} + +message ExtraInfo { + bytes nick = 1; + bytes groupCard = 2; + int32 level = 3; + int32 flags = 4; + int32 groupMask = 5; + int32 msgTailId = 6; + bytes senderTitle = 7; + bytes apnsTips = 8; + int64 uin = 9; + int32 msgStateFlag = 10; + int32 apnsSoundType = 11; + int32 newGroupFlag = 12; +} + +message GroupFile { + bytes filename = 1; + int64 fileSize = 2; + bytes fileId = 3; + bytes batchId = 4; + bytes fileKey = 5; + bytes mark = 6; + int64 sequence = 7; + bytes batchItemId = 8; + int32 feedMsgTime = 9; + bytes pbReserve = 10; +} + +message AnonymousGroupMessage { + int32 flags = 1; + bytes anonId = 2; + bytes anonNick = 3; + int32 headPortrait = 4; + int32 expireTime = 5; + int32 bubbleId = 6; + bytes rankColor = 7; +} + +message VideoFile { + bytes fileUuid = 1; + bytes fileMd5 = 2; + bytes fileName = 3; + int32 fileFormat = 4; + int32 fileTime = 5; + int32 fileSize = 6; + int32 thumbWidth = 7; + int32 thumbHeight = 8; + bytes thumbFileMd5 = 9; + bytes source = 10; + int32 thumbFileSize = 11; + int32 busiType = 12; + int32 fromChatType = 13; + int32 toChatType = 14; + bool boolSupportProgressive = 15; + int32 fileWidth = 16; + int32 fileHeight = 17; + int32 subBusiType = 18; + int32 videoAttr = 19; + repeated bytes bytesThumbFileUrls = 20; + repeated bytes bytesVideoFileUrls = 21; + int32 thumbDownloadFlag = 22; + int32 videoDownloadFlag = 23; + bytes pbReserve = 24; +} + +message Face { + int32 index = 1; + bytes old = 2; + bytes buf = 11; +} + +message CustomFace { + bytes guid = 1; + string filePath = 2; + string shortcut = 3; + bytes buffer = 4; + bytes flag = 5; + bytes oldData = 6; + int32 fileId = 7; + int32 serverIp = 8; + int32 serverPort = 9; + int32 fileType = 10; + bytes signature = 11; + int32 useful = 12; + bytes md5 = 13; + string thumbUrl = 14; + string bigUrl = 15; + string origUrl = 16; + int32 bizType = 17; + int32 repeatIndex = 18; + int32 repeatImage = 19; + int32 imageType = 20; + int32 index = 21; + int32 width = 22; + int32 height = 23; + int32 source = 24; + int32 size = 25; + int32 origin = 26; + int32 thumbWidth = 27; + int32 thumbHeight = 28; + int32 showLen = 29; + int32 downloadLen = 30; + string _400Url = 31; + int32 _400Width = 32; + int32 _400Height = 33; + bytes pbReserve = 34; +} + +message ContentHead { + int32 pkgNum = 1; + int32 pkgIndex = 2; + int32 divSeq = 3; + int32 autoReply = 4; +} + +message MessageHead { + int64 fromUin = 1; + int64 toUin = 2; + int32 msgType = 3; + int32 c2cCmd = 4; + int32 msgSeq = 5; + int32 msgTime = 6; + int64 msgUid = 7; + C2CTempMessageHead c2cTmpMsgHead = 8; + GroupInfo groupInfo = 9; + int32 fromAppid = 10; + int32 fromInstid = 11; + int32 userActive = 12; + DiscussInfo discussInfo = 13; + string fromNick = 14; + int64 authUin = 15; + string authNick = 16; + int32 msgFlag = 17; + string authRemark = 18; + string groupName = 19; + MutilTransHead mutiltransHead = 20; + InstCtrl msgInstCtrl = 21; + int32 publicAccountGroupSendFlag = 22; + int32 wseqInC2cMsghead = 23; + int64 cpid = 24; + ExtGroupKeyInfo extGroupKeyInfo = 25; + string multiCompatibleText = 26; + int32 authSex = 27; + bool isSrcMsg = 28; + +} + +message GroupInfo { + int64 groupCode = 1; + int32 groupType = 2; + int64 groupInfoSeq = 3; + string groupCard = 4; + bytes groupRank = 5; + int32 groupLevel = 6; + int32 groupCardType = 7; + bytes groupName = 8; +} + +message DiscussInfo { + int64 discussUin = 1; + int32 discussType = 2; + int64 discussInfoSeq = 3; + bytes discussRemark = 4; + bytes discussName = 5; +} + +message MutilTransHead{ + int32 status = 1; + int32 msgId = 2; +} + +message C2CTempMessageHead { + int32 c2cType = 1; + int32 serviceType = 2; + int64 groupUin = 3; + int64 groupCode = 4; + bytes sig = 5; + int32 sigType = 6; + string fromPhone = 7; + string toPhone = 8; + int32 lockDisplay = 9; + int32 directionFlag = 10; + bytes reserved = 11; +} + +message InstCtrl { + repeated InstInfo msgSendToInst = 1; + repeated InstInfo msgExcludeInst = 2; + InstInfo msgFromInst = 3; + +} + +message InstInfo { + int32 apppid = 1; + int32 instid = 2; + int32 platform = 3; + int32 enumDeviceType = 10; +} + +message ExtGroupKeyInfo { + int32 curMaxSeq = 1; + int64 curTime = 2; +} + +message SyncCookie { + int64 time1 = 1; + int64 time = 2; + int64 ran1 = 3; + int64 ran2 = 4; + int64 const1 = 5; + int64 const2 = 11; + int64 const3 = 12; + int64 lastSyncTime = 13; + int64 const4 = 14; +} + +enum SyncFlag { + START = 0; + CONTINUME = 1; + STOP = 2; +} \ No newline at end of file diff --git a/client/tlv_decoders.go b/client/tlv_decoders.go new file mode 100644 index 00000000..d877b099 --- /dev/null +++ b/client/tlv_decoders.go @@ -0,0 +1,153 @@ +package client + +import ( + "fmt" + "github.com/Mrs4s/MiraiGo/binary" + "time" +) + +// --- tlv decoders for qq client --- + +func (c *QQClient) decodeT161(data []byte) { + reader := binary.NewReader(data) + reader.ReadBytes(2) + t := reader.ReadTlvMap(2) + if t172, ok := t[0x172]; ok { + c.rollbackSig = t172 + } +} + +func (c *QQClient) decodeT119(data []byte) { + tea := binary.NewTeaCipher(SystemDeviceInfo.TgtgtKey) + reader := binary.NewReader(tea.Decrypt(data)) + reader.ReadBytes(2) + m := reader.ReadTlvMap(2) + + if t130, ok := m[0x130]; ok { + c.decodeT130(t130) + } + if t113, ok := m[0x113]; ok { + c.decodeT113(t113) + } + if t528, ok := m[0x528]; ok { + c.t528 = t528 + } + if t530, ok := m[0x530]; ok { + c.t530 = t530 + } + if t108, ok := m[0x108]; ok { + c.ksid = t108 + } + + var ( + //openId []byte + //openKey []byte + //payToken []byte + //pf []byte + //pfkey []byte + gender uint16 = 0 + age uint16 = 0 + nick = "" + //a1 []byte + //noPicSig []byte + //ctime = time.Now().Unix() + //etime = ctime + 2160000 + ) + + if _, ok := m[0x125]; ok { + //openId, openKey = readT125(t125) + } + if t186, ok := m[0x186]; ok { + c.decodeT186(t186) + } + if t11a, ok := m[0x11a]; ok { + nick, age, gender = readT11A(t11a) + } + if _, ok := m[0x199]; ok { + //openId, payToken = readT199(t199) + } + if _, ok := m[0x200]; ok { + //pf, pfkey = readT200(t200) + } + if _, ok := m[0x512]; ok { + + } // 暂不处理, Http api cookie + if _, ok := m[0x531]; ok { + //a1, noPicSig = readT531(t531) + } + + c.sigInfo = &loginSigInfo{ + loginBitmap: 0, + tgt: m[0x10a], + tgtKey: m[0x10d], + userStKey: m[0x10e], + userStWebSig: m[0x103], + sKey: m[0x120], + d2: m[0x143], + d2Key: m[0x305], + wtSessionTicketKey: m[0x134], + deviceToken: m[0x322], + } + c.Nickname = nick + c.Age = age + c.Gender = gender +} + +func (c *QQClient) decodeT130(data []byte) { + reader := binary.NewReader(data) + reader.ReadBytes(2) + c.timeDiff = int64(reader.ReadInt32()) - time.Now().Unix() + c.t149 = reader.ReadBytes(4) +} + +func (c *QQClient) decodeT113(data []byte) { + reader := binary.NewReader(data) + uin := reader.ReadInt32() // ? + fmt.Println("got t113 uin:", uin) +} + +func (c *QQClient) decodeT186(data []byte) { + c.pwdFlag = data[1] == 1 +} + +// --- tlv readers --- + +func readT125(data []byte) (openId, openKey []byte) { + reader := binary.NewReader(data) + openId = reader.ReadBytesShort() + openKey = reader.ReadBytesShort() + return +} + +func readT11A(data []byte) (nick string, age, gender uint16) { + reader := binary.NewReader(data) + reader.ReadUInt16() + age = reader.ReadUInt16() + gender = uint16(reader.ReadByte()) + nick = reader.ReadStringLimit(int(reader.ReadByte()) & 0xff) + return +} + +func readT199(data []byte) (openId, payToken []byte) { + reader := binary.NewReader(data) + openId = reader.ReadBytesShort() + payToken = reader.ReadBytesShort() + return +} + +func readT200(data []byte) (pf, pfKey []byte) { + reader := binary.NewReader(data) + pf = reader.ReadBytesShort() + pfKey = reader.ReadBytesShort() + return +} + +func readT531(data []byte) (a1, noPicSig []byte) { + reader := binary.NewReader(data) + m := reader.ReadTlvMap(2) + if m.Exists(0x103) && m.Exists(0x16a) && m.Exists(0x113) && m.Exists(0x10c) { + a1 = append(m[0x106], m[0x10c]...) + noPicSig = m[0x16a] + } + return +} diff --git a/go.mod b/go.mod new file mode 100644 index 00000000..b1874305 --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module github.com/Mrs4s/MiraiGo + +go 1.14 + +require ( + github.com/golang/protobuf v1.4.1 + google.golang.org/protobuf v1.25.0 +) diff --git a/go.sum b/go.sum new file mode 100644 index 00000000..26f8e2dc --- /dev/null +++ b/go.sum @@ -0,0 +1,85 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/ishbir/elliptic v0.0.0-20150227224012-7fa75501baae h1:p4rT8RR3B5Q6rXTG5v0Tns45zn4wJucqQKF5hzrjtgU= +github.com/ishbir/elliptic v0.0.0-20150227224012-7fa75501baae/go.mod h1:JPqapJUq3G3ojsWKJHZNsUK2OJmarnOxFN9afp3/Ovo= +github.com/jhump/protoreflect v1.6.1 h1:4/2yi5LyDPP7nN+Hiird1SAJ6YoxUm13/oxHGRnbPd8= +github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/message/elements.go b/message/elements.go new file mode 100644 index 00000000..6e305067 --- /dev/null +++ b/message/elements.go @@ -0,0 +1,227 @@ +package message + +import "strings" + +type TextElement struct { + Content string +} + +type ImageElement struct { + Filename string + Url string + Data []byte +} + +type GroupImageElement struct { + ImageId string + Md5 []byte + Url string +} + +type FaceElement struct { + Index int32 + Name string +} + +func NewText(s string) *TextElement { + return &TextElement{Content: s} +} + +func NewNetImage(filename, url string) *ImageElement { + return &ImageElement{ + Filename: filename, + Url: url, + } +} + +func NewGroupImage(id string, md5 []byte) *GroupImageElement { + return &GroupImageElement{ + ImageId: id, + Md5: md5, + Url: "http://gchat.qpic.cn/gchatpic_new/1/0-0-" + strings.ReplaceAll(id[1:36], "-", "") + "/0?term=2", + } +} + +func NewFace(index int32) *FaceElement { + name := faceMap[int(index)] + if name == "" { + name = "未知表情" + } + return &FaceElement{ + Index: index, + Name: name, + } +} + +func (e *TextElement) Type() ElementType { + return Text +} + +func (e *ImageElement) Type() ElementType { + return Image +} + +func (e *FaceElement) Type() ElementType { + return Face +} + +func (e *GroupImageElement) Type() ElementType { + return Image +} + +var faceMap = map[int]string{ + 14: "微笑", + 1: "撇嘴", + 2: "色", + 3: "发呆", + 4: "得意", + 5: "流泪", + 6: "害羞", + 7: "闭嘴", + 8: "睡", + 9: "大哭", + 10: "尴尬", + 11: "发怒", + 12: "调皮", + 13: "呲牙", + 0: "惊讶", + 15: "难过", + 16: "酷", + 96: "冷汗", + 18: "抓狂", + 19: "吐", + 20: "偷笑", + 21: "可爱", + 22: "白眼", + 23: "傲慢", + 24: "饥饿", + 25: "困", + 26: "惊恐", + 27: "流汗", + 28: "憨笑", + 29: "大兵", + 30: "奋斗", + 31: "咒骂", + 32: "疑问", + 33: "嘘", + 34: "晕", + 35: "折磨", + 36: "衰", + 37: "骷髅", + 38: "敲打", + 39: "再见", + 97: "擦汗", + 98: "抠鼻", + 99: "鼓掌", + 100: "糗大了", + 101: "坏笑", + 102: "左哼哼", + 103: "右哼哼", + 104: "哈欠", + 105: "鄙视", + 106: "委屈", + 107: "快哭了", + 108: "阴险", + 109: "亲亲", + 110: "吓", + 111: "可怜", + 172: "眨眼睛", + 182: "笑哭", + 179: "doge", + 173: "泪奔", + 174: "无奈", + 212: "托腮", + 175: "卖萌", + 178: "斜眼笑", + 177: "喷血", + 180: "惊喜", + 181: "骚扰", + 176: "小纠结", + 183: "我最美", + 112: "菜刀", + 89: "西瓜", + 113: "啤酒", + 114: "篮球", + 115: "乒乓", + 171: "茶", + 60: "咖啡", + 61: "饭", + 46: "猪头", + 63: "玫瑰", + 64: "凋谢", + 116: "示爱", + 66: "爱心", + 67: "心碎", + 53: "蛋糕", + 54: "闪电", + 55: "炸弹", + 56: "刀", + 57: "足球", + 117: "瓢虫", + 59: "便便", + 75: "月亮", + 74: "太阳", + 69: "礼物", + 49: "拥抱", + 76: "强", + 77: "弱", + 78: "握手", + 79: "胜利", + 118: "抱拳", + 119: "勾引", + 120: "拳头", + 121: "差劲", + 122: "爱你", + 123: "NO", + 124: "OK", + 42: "爱情", + 85: "飞吻", + 43: "跳跳", + 41: "发抖", + 86: "怄火", + 125: "转圈", + 126: "磕头", + 127: "回头", + 128: "跳绳", + 129: "挥手", + 130: "激动", + 131: "街舞", + 132: "献吻", + 133: "左太极", + 134: "右太极", + 136: "双喜", + 137: "鞭炮", + 138: "灯笼", + 140: "K歌", + 144: "喝彩", + 145: "祈祷", + 146: "爆筋", + 147: "棒棒糖", + 148: "喝奶", + 151: "飞机", + 158: "钞票", + 168: "药", + 169: "手枪", + 188: "蛋", + 192: "红包", + 184: "河蟹", + 185: "羊驼", + 190: "菊花", + 187: "幽灵", + 193: "大笑", + 194: "不开心", + 197: "冷漠", + 198: "呃", + 199: "好棒", + 200: "拜托", + 201: "点赞", + 202: "无聊", + 203: "托脸", + 204: "吃", + 205: "送花", + 206: "害怕", + 207: "花痴", + 208: "小样儿", + 210: "飙泪", + 211: "我不看", +} diff --git a/message/message.go b/message/message.go new file mode 100644 index 00000000..f11f09aa --- /dev/null +++ b/message/message.go @@ -0,0 +1,116 @@ +package message + +import ( + "github.com/Mrs4s/MiraiGo/binary" + "github.com/Mrs4s/MiraiGo/client/pb/msg" +) + +type PrivateMessage struct { + Id int32 + Sender *Sender + Elements []IMessageElement +} + +type GroupMessage struct { + Id int32 + GroupUin int64 + GroupName string + Sender *Sender + Elements []IMessageElement + IsAdministrator bool +} + +type SendingMessage struct { + Elements []IMessageElement +} + +type Sender struct { + Uin int64 + Nickname string + CardName string + IsFriend bool +} + +type IMessageElement interface { + Type() ElementType +} + +type ElementType int + +const ( + Text ElementType = iota + Image + Face +) + +func (s *Sender) IsAnonymous() bool { + return s.Uin == 80000000 +} + +func (msg *PrivateMessage) ToString() (res string) { + for _, elem := range msg.Elements { + switch e := elem.(type) { + case *TextElement: + res += e.Content + case *ImageElement: + res += " [Image= " + e.Filename + " ] " + case *FaceElement: + res += " [" + e.Name + "] " + } + } + return +} + +func (msg *GroupMessage) ToString() (res string) { + for _, elem := range msg.Elements { + switch e := elem.(type) { + case *TextElement: + res += e.Content + case *ImageElement: + res += " [Image= " + e.Filename + " ] " + case *FaceElement: + res += " [" + e.Name + "] " + case *GroupImageElement: + res += "[Image= " + e.ImageId + " ]" + } + } + return +} + +func (msg *SendingMessage) Append(e IMessageElement) *SendingMessage { + msg.Elements = append(msg.Elements, e) + return msg +} + +func ToProtoElems(elems []IMessageElement) (r []*msg.Elem) { + for _, elem := range elems { + switch e := elem.(type) { + case *TextElement: + r = append(r, &msg.Elem{ + Text: &msg.Text{ + Str: e.Content, + }, + }) + case *FaceElement: + r = append(r, &msg.Elem{ + Face: &msg.Face{ + Index: e.Index, + Old: binary.ToBytes(int16(0x1445 - 4 + e.Index)), + Buf: []byte{0x00, 0x01, 0x00, 0x04, 0x52, 0xCC, 0xF5, 0xD0}, + }, + }) + case *GroupImageElement: + r = append(r, &msg.Elem{ + CustomFace: &msg.CustomFace{ + FilePath: e.ImageId, + Md5: e.Md5[:], + Flag: make([]byte, 4), + OldData: []byte{0x15, 0x36, 0x20, 0x39, 0x32, 0x6B, 0x41, 0x31, 0x00, 0x38, 0x37, 0x32, 0x66, 0x30, 0x36, 0x36, 0x30, 0x33, 0x61, 0x65, 0x31, 0x30, 0x33, 0x62, 0x37, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x35, 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x30, 0x31, 0x45, 0x39, 0x34, 0x35, 0x31, 0x42, 0x2D, 0x37, 0x30, 0x45, 0x44, + 0x2D, 0x45, 0x41, 0x45, 0x33, 0x2D, 0x42, 0x33, 0x37, 0x43, 0x2D, 0x31, 0x30, 0x31, 0x46, 0x31, 0x45, 0x45, 0x42, 0x46, 0x35, 0x42, 0x35, 0x7D, 0x2E, 0x70, 0x6E, 0x67, 0x41}, + }, + }) + } + } + return +} diff --git a/protocol/crypto/crypto.go b/protocol/crypto/crypto.go new file mode 100644 index 00000000..8e8525bf --- /dev/null +++ b/protocol/crypto/crypto.go @@ -0,0 +1,35 @@ +package crypto + +import ( + "encoding/hex" + "github.com/Mrs4s/MiraiGo/binary" +) + +type EncryptECDH struct { + InitialShareKey []byte + PublicKey []byte +} + +var ECDH = &EncryptECDH{} + +func init() { + //TODO: Keygen + ECDH.InitialShareKey, _ = hex.DecodeString("41d0d17c506a5256d0d08d7aac133c70") + ECDH.PublicKey, _ = hex.DecodeString("049fb03421ba7ab5fc91c2d94a7657fff7ba8fe09f08a22951a24865212cbc45aff1b5125188fa8f0e30473bc55d54edc2") +} + +func (e *EncryptECDH) DoEncrypt(d, k []byte) []byte { + w := binary.NewWriter() + w.WriteByte(0x01) + w.WriteByte(0x01) + w.Write(k) + w.WriteUInt16(258) + w.WriteUInt16(uint16(len(ECDH.PublicKey))) + w.Write(ECDH.PublicKey) + w.EncryptAndWrite(ECDH.InitialShareKey, d) + return w.Bytes() +} + +func (e *EncryptECDH) Id() byte { + return 7 +} diff --git a/protocol/crypto/ecdh.go b/protocol/crypto/ecdh.go new file mode 100644 index 00000000..5871506e --- /dev/null +++ b/protocol/crypto/ecdh.go @@ -0,0 +1 @@ +package crypto diff --git a/protocol/crypto/secp192k1.go b/protocol/crypto/secp192k1.go new file mode 100644 index 00000000..091f0fd4 --- /dev/null +++ b/protocol/crypto/secp192k1.go @@ -0,0 +1,233 @@ +package crypto + +import ( + "io" + "math/big" +) + +// A BitCurve represents a Koblitz Curve with a=0. +// See http://www.hyperelliptic.org/EFD/g1p/auto-shortw.html +type BitCurve struct { + P *big.Int // the order of the underlying field + N *big.Int // the order of the base point + B *big.Int // the constant of the BitCurve equation + Gx, Gy *big.Int // (x,y) of the base point + BitSize int // the size of the underlying field +} + +// See FIPS 186-3, section D.2.2.1 +// And http://www.secg.org/sec2-v2.pdf section 2.2.1 +var secp192k1 = &BitCurve{ + P: new(big.Int).SetBytes([]byte{ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEE, 0x37, + }), N: new(big.Int).SetBytes([]byte{ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0x26, 0xF2, 0xFC, 0x17, 0x0F, 0x69, 0x46, 0x6A, 0x74, 0xDE, 0xFD, 0x8D, + }), B: new(big.Int).SetBytes([]byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }), Gx: new(big.Int).SetBytes([]byte{ + 0xDB, 0x4F, 0xF1, 0x0E, 0xC0, 0x57, 0xE9, 0xAE, 0x26, 0xB0, 0x7D, 0x02, + 0x80, 0xB7, 0xF4, 0x34, 0x1D, 0xA5, 0xD1, 0xB1, 0xEA, 0xE0, 0x6C, 0x7D, + }), Gy: new(big.Int).SetBytes([]byte{ + 0x9B, 0x2F, 0x2F, 0x6D, 0x9C, 0x56, 0x28, 0xA7, 0x84, 0x41, 0x63, 0xD0, + 0x15, 0xBE, 0x86, 0x34, 0x40, 0x82, 0xAA, 0x88, 0xD9, 0x5E, 0x2F, 0x9D, + }), + BitSize: 192, +} + +func (BitCurve *BitCurve) affineFromJacobian(x, y, z *big.Int) (xOut, yOut *big.Int) { + zinv := new(big.Int).ModInverse(z, BitCurve.P) + zinvsq := new(big.Int).Mul(zinv, zinv) + + xOut = new(big.Int).Mul(x, zinvsq) + xOut.Mod(xOut, BitCurve.P) + zinvsq.Mul(zinvsq, zinv) + yOut = new(big.Int).Mul(y, zinvsq) + yOut.Mod(yOut, BitCurve.P) + return +} + +// addJacobian takes two points in Jacobian coordinates, (x1, y1, z1) and +// (x2, y2, z2) and returns their sum, also in Jacobian form. +func (BitCurve *BitCurve) addJacobian(x1, y1, z1, x2, y2, z2 *big.Int) (*big.Int, *big.Int, *big.Int) { + // See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl + z1z1 := new(big.Int).Mul(z1, z1) + z1z1.Mod(z1z1, BitCurve.P) + z2z2 := new(big.Int).Mul(z2, z2) + z2z2.Mod(z2z2, BitCurve.P) + + u1 := new(big.Int).Mul(x1, z2z2) + u1.Mod(u1, BitCurve.P) + u2 := new(big.Int).Mul(x2, z1z1) + u2.Mod(u2, BitCurve.P) + h := new(big.Int).Sub(u2, u1) + if h.Sign() == -1 { + h.Add(h, BitCurve.P) + } + i := new(big.Int).Lsh(h, 1) + i.Mul(i, i) + j := new(big.Int).Mul(h, i) + + s1 := new(big.Int).Mul(y1, z2) + s1.Mul(s1, z2z2) + s1.Mod(s1, BitCurve.P) + s2 := new(big.Int).Mul(y2, z1) + s2.Mul(s2, z1z1) + s2.Mod(s2, BitCurve.P) + r := new(big.Int).Sub(s2, s1) + if r.Sign() == -1 { + r.Add(r, BitCurve.P) + } + r.Lsh(r, 1) + v := new(big.Int).Mul(u1, i) + + x3 := new(big.Int).Set(r) + x3.Mul(x3, x3) + x3.Sub(x3, j) + x3.Sub(x3, v) + x3.Sub(x3, v) + x3.Mod(x3, BitCurve.P) + + y3 := new(big.Int).Set(r) + v.Sub(v, x3) + y3.Mul(y3, v) + s1.Mul(s1, j) + s1.Lsh(s1, 1) + y3.Sub(y3, s1) + y3.Mod(y3, BitCurve.P) + + z3 := new(big.Int).Add(z1, z2) + z3.Mul(z3, z3) + z3.Sub(z3, z1z1) + if z3.Sign() == -1 { + z3.Add(z3, BitCurve.P) + } + z3.Sub(z3, z2z2) + if z3.Sign() == -1 { + z3.Add(z3, BitCurve.P) + } + z3.Mul(z3, h) + z3.Mod(z3, BitCurve.P) + + return x3, y3, z3 +} + +// doubleJacobian takes a point in Jacobian coordinates, (x, y, z), and +// returns its double, also in Jacobian form. +func (BitCurve *BitCurve) doubleJacobian(x, y, z *big.Int) (*big.Int, *big.Int, *big.Int) { + // See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l + + a := new(big.Int).Mul(x, x) //X1² + b := new(big.Int).Mul(y, y) //Y1² + c := new(big.Int).Mul(b, b) //B² + + d := new(big.Int).Add(x, b) //X1+B + d.Mul(d, d) //(X1+B)² + d.Sub(d, a) //(X1+B)²-A + d.Sub(d, c) //(X1+B)²-A-C + d.Mul(d, big.NewInt(2)) //2*((X1+B)²-A-C) + + e := new(big.Int).Mul(big.NewInt(3), a) //3*A + f := new(big.Int).Mul(e, e) //E² + + x3 := new(big.Int).Mul(big.NewInt(2), d) //2*D + x3.Sub(f, x3) //F-2*D + x3.Mod(x3, BitCurve.P) + + y3 := new(big.Int).Sub(d, x3) //D-X3 + y3.Mul(e, y3) //E*(D-X3) + y3.Sub(y3, new(big.Int).Mul(big.NewInt(8), c)) //E*(D-X3)-8*C + y3.Mod(y3, BitCurve.P) + + z3 := new(big.Int).Mul(y, z) //Y1*Z1 + z3.Mul(big.NewInt(2), z3) //3*Y1*Z1 + z3.Mod(z3, BitCurve.P) + + return x3, y3, z3 +} + +//TODO: double check if it is okay +// ScalarMult returns k*(Bx,By) where k is a number in big-endian form. +func (BitCurve *BitCurve) ScalarMult(Bx, By *big.Int, k []byte) (*big.Int, *big.Int) { + // We have a slight problem in that the identity of the group (the + // point at infinity) cannot be represented in (x, y) form on a finite + // machine. Thus the standard add/double algorithm has to be tweaked + // slightly: our initial state is not the identity, but x, and we + // ignore the first true bit in |k|. If we don't find any true bits in + // |k|, then we return nil, nil, because we cannot return the identity + // element. + + Bz := new(big.Int).SetInt64(1) + x := Bx + y := By + z := Bz + + seenFirstTrue := false + for _, byte := range k { + for bitNum := 0; bitNum < 8; bitNum++ { + if seenFirstTrue { + x, y, z = BitCurve.doubleJacobian(x, y, z) + } + if byte&0x80 == 0x80 { + if !seenFirstTrue { + seenFirstTrue = true + } else { + x, y, z = BitCurve.addJacobian(Bx, By, Bz, x, y, z) + } + } + byte <<= 1 + } + } + + if !seenFirstTrue { + return nil, nil + } + + return BitCurve.affineFromJacobian(x, y, z) +} + +// ScalarBaseMult returns k*G, where G is the base point of the group and k is +// an integer in big-endian form. +func (BitCurve *BitCurve) ScalarBaseMult(k []byte) (*big.Int, *big.Int) { + return BitCurve.ScalarMult(BitCurve.Gx, BitCurve.Gy, k) +} + +var mask = []byte{0xff, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f} + +//TODO: double check if it is okay +// GenerateKey returns a public/private key pair. The private key is generated +// using the given reader, which must return random data. +func (BitCurve *BitCurve) GenerateKey(rand io.Reader) (priv []byte, x, y *big.Int, err error) { + byteLen := (BitCurve.BitSize + 7) >> 3 + priv = make([]byte, byteLen) + + for x == nil { + _, err = io.ReadFull(rand, priv) + if err != nil { + return + } + // We have to mask off any excess bits in the case that the size of the + // underlying field is not a whole number of bytes. + priv[0] &= mask[BitCurve.BitSize%8] + // This is because, in tests, rand will return all zeros and we don't + // want to get the point at infinity and loop forever. + priv[1] ^= 0x42 + x, y = BitCurve.ScalarBaseMult(priv) + } + return +} + +/* +$ openssl asn1parse -in 1.cer -inform DER -dump + 0:d=0 hl=2 l= 70 cons: SEQUENCE + 2:d=1 hl=2 l= 16 cons: SEQUENCE + 4:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey + 13:d=2 hl=2 l= 5 prim: OBJECT :secp192k1 + 20:d=1 hl=2 l= 50 prim: BIT STRING + 0000 - 00 04 92 8d 88 50 67 30-88 b3 43 26 4e 0c 6b ac .....Pg0..C&N.k. + 0010 - b8 49 6d 69 77 99 f3 72-11 de b2 5b b7 39 06 cb .Imiw..r...[.9.. + 0020 - 08 9f ea 96 39 b4 e0 26-04 98 b5 1a 99 2d 50 81 ....9..&.....-P. + 0030 - 3d a8 =. +*/ diff --git a/protocol/packets/builders.go b/protocol/packets/builders.go new file mode 100644 index 00000000..0ddacda3 --- /dev/null +++ b/protocol/packets/builders.go @@ -0,0 +1,40 @@ +package packets + +import ( + "github.com/Mrs4s/MiraiGo/binary" + "strconv" +) + +func BuildLoginPacket(uin int64, bodyType byte, key, body, extraData []byte) []byte { + w := binary.NewWriter() + w.WriteIntLvPacket(4, func(w *binary.Writer) { + w.WriteUInt32(0x00_00_00_0A) + w.WriteByte(bodyType) + w.WriteIntLvPacket(4, func(w *binary.Writer) { + w.Write(extraData) + }) + w.WriteByte(0x00) + w.WriteString(strconv.FormatInt(uin, 10)) + if len(key) == 0 { + w.Write(body) + } else { + w.EncryptAndWrite(key, body) + } + }) + return w.Bytes() +} + +func BuildUniPacket(uin int64, seq uint16, commandName string, bodyType byte, sessionId, extraData, key, body []byte) []byte { + w := binary.NewWriter() + w.WriteIntLvPacket(4, func(w *binary.Writer) { + w.WriteUInt32(0x0B) + w.WriteByte(bodyType) + w.WriteUInt32(uint32(seq)) + w.WriteByte(0) + w.WriteString(strconv.FormatInt(uin, 10)) + w.EncryptAndWrite(key, binary.NewWriterF(func(w *binary.Writer) { + w.WriteUniPacket(commandName, sessionId, extraData, body) + })) + }) + return w.Bytes() +} diff --git a/protocol/packets/global.go b/protocol/packets/global.go new file mode 100644 index 00000000..2ba671e1 --- /dev/null +++ b/protocol/packets/global.go @@ -0,0 +1,195 @@ +package packets + +import ( + "errors" + "github.com/Mrs4s/MiraiGo/binary" + "github.com/Mrs4s/MiraiGo/protocol/crypto" +) + +var ErrUnknownFlag = errors.New("unknown flag") +var ErrDecryptFailed = errors.New("decrypt failed") + +type ISendingPacket interface { + CommandId() uint16 + Writer() *binary.Writer +} + +type IncomingPacket struct { + SequenceId uint16 + Flag2 byte + CommandName string + SessionId []byte + Payload []byte +} + +type IEncryptMethod interface { + DoEncrypt([]byte, []byte) []byte + Id() byte +} + +func BuildOicqRequestPacket(uin int64, commandId uint16, encrypt IEncryptMethod, key []byte, bodyFunc func(writer *binary.Writer)) []byte { + b := binary.NewWriter() + bodyFunc(b) + + body := encrypt.DoEncrypt(b.Bytes(), key) + p := binary.NewWriter() + p.WriteByte(0x02) + p.WriteUInt16(27 + 2 + uint16(len(body))) + p.WriteUInt16(8001) + p.WriteUInt16(commandId) + p.WriteUInt16(1) + p.WriteUInt32(uint32(uin)) + p.WriteByte(3) + p.WriteByte(encrypt.Id()) + p.WriteByte(0) + p.WriteUInt32(2) + p.WriteUInt32(0) + p.WriteUInt32(0) + p.Write(body) + p.WriteByte(0x03) + return p.Bytes() +} + +func BuildSsoPacket(seq uint16, commandName, imei string, extData, outPacketSessionId, body, ksid []byte) []byte { + p := binary.NewWriter() + p.WriteIntLvPacket(4, func(writer *binary.Writer) { + writer.WriteUInt32(uint32(seq)) + writer.WriteUInt32(537062409) // Android pad (sub app id) + writer.WriteUInt32(537062409) + writer.Write([]byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00}) + if len(extData) == 0 || len(extData) == 4 { + writer.WriteUInt32(0x04) + } else { + writer.WriteUInt32(uint32(len(extData) + 4)) + writer.Write(extData) + } + writer.WriteString(commandName) + writer.WriteUInt32(0x08) + writer.Write(outPacketSessionId) + writer.WriteString(imei) + writer.WriteUInt32(0x04) + { + writer.WriteUInt16(uint16(len(ksid)) + 2) + writer.Write(ksid) + } + writer.WriteUInt32(0x04) + }) + + p.WriteIntLvPacket(4, func(writer *binary.Writer) { + writer.Write(body) + }) + return p.Bytes() +} + +func ParseIncomingPacket(payload, d2key []byte) (*IncomingPacket, error) { + reader := binary.NewReader(payload) + flag1 := reader.ReadInt32() + flag2 := reader.ReadByte() + if reader.ReadByte() != 0 { // flag3 + return nil, ErrUnknownFlag + } + reader.ReadString() // uin string + decrypted := func() (data []byte) { + defer func() { + if pan := recover(); pan != nil { + // TODO: bot.client.tryDecryptOrNull + } + }() + switch flag2 { + case 0: + return reader.ReadAvailable() + case 1: + d2 := binary.NewTeaCipher(d2key) + return d2.Decrypt(reader.ReadAvailable()) + case 2: + z16 := binary.NewTeaCipher(make([]byte, 16)) + return z16.Decrypt(reader.ReadAvailable()) + } + return nil + }() + if len(decrypted) == 0 { + return nil, ErrDecryptFailed + } + if flag1 != 0x0A && flag1 != 0x0B { + return nil, ErrDecryptFailed + } + return parseSsoFrame(decrypted, flag2), nil +} + +func parseSsoFrame(payload []byte, flag2 byte) *IncomingPacket { + reader := binary.NewReader(payload) + reader.ReadInt32() // packet len + seqId := reader.ReadInt32() + reader.ReadInt32() // return code + reader.ReadBytes(int(reader.ReadInt32()) - 4) // extra data + commandName := reader.ReadString() + sessionId := reader.ReadBytes(int(reader.ReadInt32()) - 4) + if commandName == "Heartbeat.Alive" { + return &IncomingPacket{ + SequenceId: uint16(seqId), + Flag2: flag2, + CommandName: commandName, + SessionId: sessionId, + Payload: []byte{}, + } + } + compressedFlag := reader.ReadInt32() + packet := func() []byte { + if compressedFlag == 0 { + pktSize := uint64(reader.ReadInt32()) & 0xffffffff + if pktSize == uint64(reader.Len()) || pktSize == uint64(reader.Len()+4) { + return reader.ReadAvailable() + } else { + return reader.ReadAvailable() // some logic + } + } + if compressedFlag == 1 { + reader.ReadBytes(4) + return binary.ZlibUncompress(reader.ReadAvailable()) // ? + } + if compressedFlag == 8 { + return reader.ReadAvailable() + } + return nil + }() + return &IncomingPacket{ + SequenceId: uint16(seqId), + Flag2: flag2, + CommandName: commandName, + SessionId: sessionId, + Payload: packet, + } +} + +func (pkt *IncomingPacket) DecryptPayload(random []byte) ([]byte, error) { + reader := binary.NewReader(pkt.Payload) + if reader.ReadByte() != 2 { + return nil, ErrUnknownFlag + } + reader.ReadBytes(2) + reader.ReadBytes(2) + reader.ReadUInt16() + reader.ReadUInt16() + reader.ReadInt32() + encryptType := reader.ReadUInt16() + reader.ReadByte() + if encryptType == 0 { + data := func() (decrypted []byte) { + d := reader.ReadBytes(reader.Len() - 1) + defer func() { + if pan := recover(); pan != nil { + tea := binary.NewTeaCipher(random) + decrypted = tea.Decrypt(d) + } + }() + tea := binary.NewTeaCipher(crypto.ECDH.InitialShareKey) + decrypted = tea.Decrypt(d) + return + }() + return data, nil + } + if encryptType == 4 { + panic("todo") + } + return nil, ErrUnknownFlag +} diff --git a/protocol/protocol_global.go b/protocol/protocol_global.go new file mode 100644 index 00000000..2d0eaff9 --- /dev/null +++ b/protocol/protocol_global.go @@ -0,0 +1 @@ +package protocol diff --git a/protocol/tlv/t1.go b/protocol/tlv/t1.go new file mode 100644 index 00000000..3e8875d2 --- /dev/null +++ b/protocol/tlv/t1.go @@ -0,0 +1,24 @@ +package tlv + +import ( + "github.com/Mrs4s/MiraiGo/binary" + "math/rand" + "time" +) + +func T1(uin uint32, ip []byte) []byte { + if len(ip) != 4 { + panic("invalid ip") + } + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x01) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(1) + w.WriteUInt32(rand.Uint32()) + w.WriteUInt32(uin) + w.WriteUInt32(uint32(time.Now().UnixNano() / 1e6)) + w.Write(ip) + w.WriteUInt16(0) + })) + }) +} diff --git a/protocol/tlv/t100.go b/protocol/tlv/t100.go new file mode 100644 index 00000000..a525ae8c --- /dev/null +++ b/protocol/tlv/t100.go @@ -0,0 +1,17 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T100() []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x100) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(1) + w.WriteUInt32(5) + w.WriteUInt32(16) + w.WriteUInt32(537062409) // Sub app id + w.WriteUInt32(0) // App client version + w.WriteUInt32(34869472) + })) + }) +} diff --git a/protocol/tlv/t104.go b/protocol/tlv/t104.go new file mode 100644 index 00000000..b912b368 --- /dev/null +++ b/protocol/tlv/t104.go @@ -0,0 +1,10 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T104(data []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x104) + w.WriteTlv(data) + }) +} diff --git a/protocol/tlv/t106.go b/protocol/tlv/t106.go new file mode 100644 index 00000000..17401659 --- /dev/null +++ b/protocol/tlv/t106.go @@ -0,0 +1,57 @@ +package tlv + +import ( + "crypto/md5" + binary2 "encoding/binary" + "github.com/Mrs4s/MiraiGo/binary" + "math/rand" + "time" +) + +func T106(uin, salt uint32, passwordMd5 [16]byte, guidAvailable bool, guid, tgtgtKey []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x106) + body := binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(4) + w.WriteUInt32(rand.Uint32()) + w.WriteUInt32(5) + w.WriteUInt32(16) // appId + w.WriteUInt32(0) // app client version + if uin == 0 { + w.WriteUInt64(uint64(salt)) + } else { + w.WriteUInt64(uint64(uin)) + } + w.WriteUInt32(uint32(time.Now().UnixNano() / 1e6)) + w.Write([]byte{0x00, 0x00, 0x00, 0x00}) // fake ip + w.WriteByte(0x01) + w.Write(passwordMd5[:]) + w.Write(tgtgtKey) + w.WriteUInt32(0) + w.WriteBool(guidAvailable) + if len(guid) == 0 { + for i := 0; i < 4; i++ { + w.WriteUInt32(rand.Uint32()) + } + } else { + w.Write(guid) + } + w.WriteUInt32(537062409) // sub app id (android pad) + w.WriteUInt32(1) // password login + b := make([]byte, 8) + binary2.BigEndian.PutUint64(b, uint64(uin)) + w.WriteTlv(b) + w.WriteUInt16(0) + }) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + b := make([]byte, 4) + if salt != 0 { + binary2.BigEndian.PutUint32(b, salt) + } else { + binary2.BigEndian.PutUint32(b, uin) + } + key := md5.Sum(append(append(passwordMd5[:], []byte{0x00, 0x00, 0x00, 0x00}...), b...)) + w.EncryptAndWrite(key[:], body) + })) + }) +} diff --git a/protocol/tlv/t107.go b/protocol/tlv/t107.go new file mode 100644 index 00000000..1a94367c --- /dev/null +++ b/protocol/tlv/t107.go @@ -0,0 +1,15 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T107(picType uint16) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x107) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(picType) + w.WriteByte(0x00) + w.WriteUInt16(0) + w.WriteByte(0x01) + })) + }) +} diff --git a/protocol/tlv/t109.go b/protocol/tlv/t109.go new file mode 100644 index 00000000..1f6635f6 --- /dev/null +++ b/protocol/tlv/t109.go @@ -0,0 +1,16 @@ +package tlv + +import ( + "crypto/md5" + "github.com/Mrs4s/MiraiGo/binary" +) + +func T109(androidId []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x109) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + h := md5.Sum(androidId) + w.Write(h[:]) + })) + }) +} diff --git a/protocol/tlv/t116.go b/protocol/tlv/t116.go new file mode 100644 index 00000000..0eabbcb1 --- /dev/null +++ b/protocol/tlv/t116.go @@ -0,0 +1,16 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T116(miscBitmap, subSigMap uint32) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x116) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteByte(0x00) + w.WriteUInt32(miscBitmap) + w.WriteUInt32(subSigMap) + w.WriteByte(0x01) + w.WriteUInt32(1600000226) // app id list + })) + }) +} diff --git a/protocol/tlv/t124.go b/protocol/tlv/t124.go new file mode 100644 index 00000000..322bdc96 --- /dev/null +++ b/protocol/tlv/t124.go @@ -0,0 +1,17 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T124(osType, osVersion, simInfo, apn []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x124) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteTlvLimitedSize(osType, 16) + w.WriteTlvLimitedSize(osVersion, 16) + w.WriteUInt16(2) // Network type wifi + w.WriteTlvLimitedSize(simInfo, 16) + w.WriteTlvLimitedSize([]byte{}, 16) + w.WriteTlvLimitedSize(apn, 16) + })) + }) +} diff --git a/protocol/tlv/t128.go b/protocol/tlv/t128.go new file mode 100644 index 00000000..8352ff61 --- /dev/null +++ b/protocol/tlv/t128.go @@ -0,0 +1,19 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T128(isGuidFromFileNull, isGuidAvailable, isGuidChanged bool, guidFlag uint32, buildModel, guid, buildBrand []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x128) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0) + w.WriteBool(isGuidFromFileNull) + w.WriteBool(isGuidAvailable) + w.WriteBool(isGuidChanged) + w.WriteUInt32(guidFlag) + w.WriteTlvLimitedSize(buildModel, 32) + w.WriteTlvLimitedSize(guid, 16) + w.WriteTlvLimitedSize(buildBrand, 16) + })) + }) +} diff --git a/protocol/tlv/t141.go b/protocol/tlv/t141.go new file mode 100644 index 00000000..579af241 --- /dev/null +++ b/protocol/tlv/t141.go @@ -0,0 +1,15 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T141(simInfo, apn []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x141) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(1) + w.WriteTlv(simInfo) + w.WriteUInt16(2) // network type wifi + w.WriteTlv(apn) + })) + }) +} diff --git a/protocol/tlv/t142.go b/protocol/tlv/t142.go new file mode 100644 index 00000000..06d2060f --- /dev/null +++ b/protocol/tlv/t142.go @@ -0,0 +1,13 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T142(apkId string) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x142) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0) + w.WriteTlvLimitedSize([]byte(apkId), 32) + })) + }) +} diff --git a/protocol/tlv/t144.go b/protocol/tlv/t144.go new file mode 100644 index 00000000..61bcb02d --- /dev/null +++ b/protocol/tlv/t144.go @@ -0,0 +1,24 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T144( + androidId, devInfo, osType, osVersion, simInfo, apn []byte, + isGuidFromFileNull, isGuidAvailable, isGuidChanged bool, + guidFlag uint32, + buildModel, guid, buildBrand, tgtgtKey []byte, +) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x144) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.EncryptAndWrite(tgtgtKey, binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(5) + w.Write(T109(androidId)) + w.Write(T52D(devInfo)) + w.Write(T124(osType, osVersion, simInfo, apn)) + w.Write(T128(isGuidFromFileNull, isGuidAvailable, isGuidChanged, guidFlag, buildModel, guid, buildBrand)) + w.Write(T16E(buildModel)) + })) + })) + }) +} diff --git a/protocol/tlv/t145.go b/protocol/tlv/t145.go new file mode 100644 index 00000000..6a1cebbb --- /dev/null +++ b/protocol/tlv/t145.go @@ -0,0 +1,12 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T145(guid []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x145) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.Write(guid) + })) + }) +} diff --git a/protocol/tlv/t147.go b/protocol/tlv/t147.go new file mode 100644 index 00000000..4f7795f4 --- /dev/null +++ b/protocol/tlv/t147.go @@ -0,0 +1,14 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T147(appId uint32, apkVersionName, apkSignatureMd5 []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x147) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt32(appId) + w.WriteTlvLimitedSize(apkVersionName, 32) + w.WriteTlvLimitedSize(apkSignatureMd5, 32) + })) + }) +} diff --git a/protocol/tlv/t154.go b/protocol/tlv/t154.go new file mode 100644 index 00000000..2d7a56f7 --- /dev/null +++ b/protocol/tlv/t154.go @@ -0,0 +1,12 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T154(seq uint16) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x154) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt32(uint32(seq)) + })) + }) +} diff --git a/protocol/tlv/t166.go b/protocol/tlv/t166.go new file mode 100644 index 00000000..708eadde --- /dev/null +++ b/protocol/tlv/t166.go @@ -0,0 +1,12 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T166(imageType byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x166) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteByte(imageType) + })) + }) +} diff --git a/protocol/tlv/t16e.go b/protocol/tlv/t16e.go new file mode 100644 index 00000000..c15602ab --- /dev/null +++ b/protocol/tlv/t16e.go @@ -0,0 +1,12 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T16E(buildModel []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x16e) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.Write(buildModel) + })) + }) +} diff --git a/protocol/tlv/t177.go b/protocol/tlv/t177.go new file mode 100644 index 00000000..e76bbfc0 --- /dev/null +++ b/protocol/tlv/t177.go @@ -0,0 +1,14 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T177() []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x177) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteByte(0x01) + w.WriteUInt32(1571193922) + w.WriteTlv([]byte("6.0.0.2413")) + })) + }) +} diff --git a/protocol/tlv/t18.go b/protocol/tlv/t18.go new file mode 100644 index 00000000..4e6b5c65 --- /dev/null +++ b/protocol/tlv/t18.go @@ -0,0 +1,18 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T18(appId uint32, uin uint32) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x18) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(1) + w.WriteUInt32(1536) + w.WriteUInt32(appId) + w.WriteUInt32(0) + w.WriteUInt32(uin) + w.WriteUInt16(0) + w.WriteUInt16(0) + })) + }) +} diff --git a/protocol/tlv/t187.go b/protocol/tlv/t187.go new file mode 100644 index 00000000..f6cce89c --- /dev/null +++ b/protocol/tlv/t187.go @@ -0,0 +1,16 @@ +package tlv + +import ( + "crypto/md5" + "github.com/Mrs4s/MiraiGo/binary" +) + +func T187(macAddress []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x187) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + h := md5.Sum(macAddress) + w.Write(h[:]) + })) + }) +} diff --git a/protocol/tlv/t188.go b/protocol/tlv/t188.go new file mode 100644 index 00000000..e089b0a2 --- /dev/null +++ b/protocol/tlv/t188.go @@ -0,0 +1,16 @@ +package tlv + +import ( + "crypto/md5" + "github.com/Mrs4s/MiraiGo/binary" +) + +func T188(androidId []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x188) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + h := md5.Sum(androidId) + w.Write(h[:]) + })) + }) +} diff --git a/protocol/tlv/t191.go b/protocol/tlv/t191.go new file mode 100644 index 00000000..f8c58594 --- /dev/null +++ b/protocol/tlv/t191.go @@ -0,0 +1,12 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T191(k byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x191) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteByte(k) + })) + }) +} diff --git a/protocol/tlv/t194.go b/protocol/tlv/t194.go new file mode 100644 index 00000000..3eec0367 --- /dev/null +++ b/protocol/tlv/t194.go @@ -0,0 +1,12 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T194(imsiMd5 []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x194) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.Write(imsiMd5) + })) + }) +} diff --git a/protocol/tlv/t2.go b/protocol/tlv/t2.go new file mode 100644 index 00000000..b4705f7c --- /dev/null +++ b/protocol/tlv/t2.go @@ -0,0 +1,14 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T2(result string, sign []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x02) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0) + w.WriteStringShort(result) + w.WriteTlv(sign) + })) + }) +} diff --git a/protocol/tlv/t202.go b/protocol/tlv/t202.go new file mode 100644 index 00000000..aa806283 --- /dev/null +++ b/protocol/tlv/t202.go @@ -0,0 +1,13 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T202(wifiBSSID, wifiSSID []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x202) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteTlvLimitedSize(wifiBSSID, 16) + w.WriteTlvLimitedSize(wifiSSID, 32) + })) + }) +} diff --git a/protocol/tlv/t511.go b/protocol/tlv/t511.go new file mode 100644 index 00000000..df0ccdff --- /dev/null +++ b/protocol/tlv/t511.go @@ -0,0 +1,52 @@ +package tlv + +import ( + "github.com/Mrs4s/MiraiGo/binary" + "strconv" + "strings" +) + +func T511(domains []string) []byte { + var arr2 []string + for _, d := range domains { + if d != "" { + arr2 = append(arr2, d) + } + } + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x511) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(uint16(len(arr2))) + for _, d := range arr2 { + indexOf := strings.Index(d, "(") + indexOf2 := strings.Index(d, ")") + if indexOf != 0 || indexOf2 <= 0 { + w.WriteByte(0x01) + w.WriteTlv([]byte(d)) + } else { + var b byte + var z bool + i, err := strconv.Atoi(d[indexOf+1 : indexOf2]) + if err == nil { + z2 := (1048576 & i) > 0 + if (i & 134217728) > 0 { + z = true + } else { + z = false + } + if z2 { + b = 1 + } else { + b = 0 + } + if z { + b |= 2 + } + w.WriteByte(b) + w.WriteTlv([]byte(d[indexOf2+1:])) + } + } + } + })) + }) +} diff --git a/protocol/tlv/t516.go b/protocol/tlv/t516.go new file mode 100644 index 00000000..d4354378 --- /dev/null +++ b/protocol/tlv/t516.go @@ -0,0 +1,12 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T516() []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x516) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt32(0) + })) + }) +} diff --git a/protocol/tlv/t521.go b/protocol/tlv/t521.go new file mode 100644 index 00000000..2134f87e --- /dev/null +++ b/protocol/tlv/t521.go @@ -0,0 +1,13 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T521() []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x521) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt32(0) + w.WriteUInt16(0) + })) + }) +} diff --git a/protocol/tlv/t525.go b/protocol/tlv/t525.go new file mode 100644 index 00000000..6390d92c --- /dev/null +++ b/protocol/tlv/t525.go @@ -0,0 +1,13 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T525(t536 []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x525) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(1) + w.Write(t536) + })) + }) +} diff --git a/protocol/tlv/t52d.go b/protocol/tlv/t52d.go new file mode 100644 index 00000000..f676fffa --- /dev/null +++ b/protocol/tlv/t52d.go @@ -0,0 +1,12 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T52D(devInfo []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x52d) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.Write(devInfo) + })) + }) +} diff --git a/protocol/tlv/t536.go b/protocol/tlv/t536.go new file mode 100644 index 00000000..342370d6 --- /dev/null +++ b/protocol/tlv/t536.go @@ -0,0 +1,12 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T536(loginExtraData []byte) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x536) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.Write(loginExtraData) + })) + }) +} diff --git a/protocol/tlv/t8.go b/protocol/tlv/t8.go new file mode 100644 index 00000000..b511b715 --- /dev/null +++ b/protocol/tlv/t8.go @@ -0,0 +1,14 @@ +package tlv + +import "github.com/Mrs4s/MiraiGo/binary" + +func T8(localId uint32) []byte { + return binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0x8) + w.WriteTlv(binary.NewWriterF(func(w *binary.Writer) { + w.WriteUInt16(0) + w.WriteUInt32(localId) + w.WriteUInt16(0) + })) + }) +} diff --git a/protocol/tlv/tlv.go b/protocol/tlv/tlv.go new file mode 100644 index 00000000..7de80968 --- /dev/null +++ b/protocol/tlv/tlv.go @@ -0,0 +1,8 @@ +package tlv + +func GuidFlag() uint32 { + var flag uint32 = 0 + flag |= 1 << 24 & 0xFF000000 + flag |= 0 << 8 & 0xFF00 + return flag +}