diff --git a/api/api.pb.go b/api/api.pb.go index 019746443bd118f19b39944ca0b536f967de5f2c..e8c5cd8f94fc660ef5508f4e7d28feea00fd23b7 100644 --- a/api/api.pb.go +++ b/api/api.pb.go @@ -702,14 +702,12 @@ type ChannelMessage struct { Username string `protobuf:"bytes,5,opt,name=username" json:"username,omitempty"` // The content payload. Content string `protobuf:"bytes,6,opt,name=content" json:"content,omitempty"` - // Another message ID reference, if any. - ReferenceId *google_protobuf3.StringValue `protobuf:"bytes,7,opt,name=reference_id,json=referenceId" json:"reference_id,omitempty"` // The UNIX time when the message was created. - CreateTime *google_protobuf2.Timestamp `protobuf:"bytes,8,opt,name=create_time,json=createTime" json:"create_time,omitempty"` + CreateTime *google_protobuf2.Timestamp `protobuf:"bytes,7,opt,name=create_time,json=createTime" json:"create_time,omitempty"` // The UNIX time when the message was last updated. - UpdateTime *google_protobuf2.Timestamp `protobuf:"bytes,9,opt,name=update_time,json=updateTime" json:"update_time,omitempty"` + UpdateTime *google_protobuf2.Timestamp `protobuf:"bytes,8,opt,name=update_time,json=updateTime" json:"update_time,omitempty"` // True if the message was persisted to the channel's history, false otherwise. - Persistent *google_protobuf3.BoolValue `protobuf:"bytes,10,opt,name=persistent" json:"persistent,omitempty"` + Persistent *google_protobuf3.BoolValue `protobuf:"bytes,9,opt,name=persistent" json:"persistent,omitempty"` } func (m *ChannelMessage) Reset() { *m = ChannelMessage{} } @@ -759,13 +757,6 @@ func (m *ChannelMessage) GetContent() string { return "" } -func (m *ChannelMessage) GetReferenceId() *google_protobuf3.StringValue { - if m != nil { - return m.ReferenceId - } - return nil -} - func (m *ChannelMessage) GetCreateTime() *google_protobuf2.Timestamp { if m != nil { return m.CreateTime @@ -4134,241 +4125,240 @@ var _Nakama_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("api/api.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 3768 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5b, 0xcd, 0x6f, 0x1c, 0xc9, - 0x75, 0x4f, 0xcf, 0xf7, 0xbc, 0x21, 0xa9, 0x61, 0x51, 0xe2, 0x0e, 0x87, 0x22, 0x45, 0xf5, 0x52, - 0x2b, 0x2d, 0xbd, 0xcb, 0xd9, 0x50, 0x4e, 0x76, 0x41, 0x03, 0xb6, 0x28, 0x8a, 0x54, 0x26, 0x2b, - 0xd3, 0x8b, 0x26, 0xa5, 0x35, 0x36, 0x30, 0x66, 0x8b, 0xdd, 0xc5, 0x61, 0x9b, 0x3d, 0xdd, 0xed, - 0xee, 0x1e, 0x52, 0xdc, 0xc5, 0xc2, 0x81, 0x11, 0xc0, 0x46, 0x0e, 0x86, 0xe1, 0xe4, 0x16, 0x20, - 0x09, 0x9c, 0x4b, 0x10, 0x20, 0x41, 0xfe, 0x80, 0x5c, 0x73, 0xc8, 0x35, 0x01, 0x02, 0xc3, 0xa7, - 0x1c, 0x72, 0xf4, 0x7f, 0x90, 0x4b, 0x50, 0x1f, 0xdd, 0x5d, 0xfd, 0x35, 0xfc, 0xd2, 0xda, 0x17, - 0x69, 0xaa, 0xfa, 0x55, 0xbd, 0x57, 0x55, 0xef, 0xbd, 0xdf, 0x7b, 0xaf, 0x8a, 0x30, 0x8d, 0x5d, - 0xb3, 0x87, 0x5d, 0x73, 0xdd, 0xf5, 0x9c, 0xc0, 0x41, 0x60, 0xe3, 0x13, 0x3c, 0xc2, 0xeb, 0xd8, - 0x35, 0xbb, 0x77, 0x87, 0x8e, 0x33, 0xb4, 0x48, 0x8f, 0x51, 0xd8, 0xb6, 0x13, 0xe0, 0xc0, 0x74, - 0x6c, 0x9f, 0x53, 0x76, 0x17, 0xc5, 0x57, 0xd6, 0x3a, 0x1c, 0x1f, 0xf5, 0xc8, 0xc8, 0x0d, 0xce, - 0xc5, 0xc7, 0x7b, 0xe9, 0x8f, 0x81, 0x39, 0x22, 0x7e, 0x80, 0x47, 0xae, 0x20, 0x58, 0x4e, 0x13, - 0x9c, 0x79, 0xd8, 0x75, 0x89, 0x17, 0xce, 0xfe, 0x1e, 0xfb, 0x4f, 0x7f, 0x7f, 0x48, 0xec, 0xf7, - 0xfd, 0x33, 0x3c, 0x1c, 0x12, 0xaf, 0xe7, 0xb8, 0x8c, 0x7f, 0x56, 0x16, 0xf5, 0xb7, 0x0a, 0xd4, - 0xb7, 0x74, 0xdd, 0x19, 0xdb, 0x01, 0x5a, 0x85, 0xca, 0xd8, 0x27, 0x5e, 0x47, 0x59, 0x51, 0x1e, - 0xb5, 0x36, 0xda, 0xeb, 0xf1, 0x82, 0xd6, 0x5f, 0xfa, 0xc4, 0xd3, 0xd8, 0x57, 0x34, 0x0f, 0xb5, - 0x33, 0x6c, 0x59, 0x24, 0xe8, 0x94, 0x56, 0x94, 0x47, 0x4d, 0x4d, 0xb4, 0xd0, 0x6d, 0xa8, 0x92, - 0x11, 0x36, 0xad, 0x4e, 0x99, 0x75, 0xf3, 0x06, 0x7a, 0x0c, 0x75, 0x83, 0x9c, 0x9a, 0x3a, 0xf1, - 0x3b, 0x95, 0x95, 0xf2, 0xa3, 0xd6, 0xc6, 0x82, 0x3c, 0xad, 0xe0, 0xfc, 0x8c, 0x51, 0x68, 0x21, - 0x25, 0x5a, 0x84, 0xa6, 0x3e, 0xf6, 0x03, 0x67, 0x34, 0x30, 0x8d, 0x4e, 0x95, 0x4d, 0xd7, 0xe0, - 0x1d, 0x7d, 0x03, 0x7d, 0x0b, 0x5a, 0xa7, 0xc4, 0x33, 0x8f, 0xce, 0x07, 0x74, 0x67, 0x3a, 0x35, - 0x26, 0x6c, 0x77, 0x9d, 0xef, 0xca, 0x7a, 0xb8, 0x2b, 0xeb, 0x07, 0xe1, 0xb6, 0x69, 0xc0, 0xc9, - 0x69, 0x87, 0x7a, 0x0f, 0xa6, 0x05, 0xcf, 0x6d, 0x36, 0x1f, 0x9a, 0x81, 0x92, 0x69, 0xb0, 0x15, - 0x37, 0xb5, 0x92, 0x69, 0x48, 0x04, 0x5c, 0xa8, 0x0c, 0xc1, 0x13, 0x98, 0x12, 0x04, 0x3b, 0x6c, - 0x81, 0xd1, 0xb2, 0x15, 0x79, 0xd9, 0x5d, 0x68, 0xb8, 0xd8, 0xf7, 0xcf, 0x1c, 0xcf, 0x10, 0xdb, - 0x14, 0xb5, 0xd5, 0x87, 0x70, 0x4b, 0xcc, 0xb0, 0x8b, 0x75, 0x72, 0xe8, 0x38, 0x27, 0x74, 0x92, - 0xc0, 0x39, 0x21, 0x76, 0x38, 0x09, 0x6b, 0xa8, 0xff, 0xa9, 0xc0, 0xac, 0xa0, 0x7c, 0x8e, 0x47, - 0x64, 0x9b, 0xd8, 0x01, 0xf1, 0xe8, 0xe6, 0xb8, 0x16, 0x3e, 0x27, 0xde, 0x20, 0x92, 0xab, 0xc1, - 0x3b, 0xfa, 0x06, 0xfd, 0x78, 0x38, 0xb6, 0x0d, 0x8b, 0xd0, 0x8f, 0x82, 0x31, 0xef, 0xe8, 0x1b, - 0xe8, 0x1b, 0x30, 0x1b, 0x29, 0xd3, 0xc0, 0x27, 0xba, 0x63, 0x1b, 0x3e, 0x3b, 0xad, 0xb2, 0xd6, - 0x8e, 0x3e, 0xec, 0xf3, 0x7e, 0x84, 0xa0, 0xe2, 0x63, 0x2b, 0xe8, 0x54, 0xd8, 0x24, 0xec, 0x37, - 0xba, 0x0b, 0x4d, 0xdf, 0x1c, 0xda, 0x38, 0x18, 0x7b, 0x44, 0x9c, 0x4b, 0xdc, 0x81, 0x56, 0x61, - 0xc6, 0x1d, 0x1f, 0x5a, 0xa6, 0x3e, 0x38, 0x21, 0xe7, 0x83, 0xb1, 0x67, 0xb1, 0xb3, 0x69, 0x6a, - 0x53, 0xbc, 0xf7, 0x63, 0x72, 0xfe, 0xd2, 0xb3, 0xd4, 0x07, 0xd1, 0x06, 0x3f, 0x67, 0x27, 0x56, - 0xb0, 0xf6, 0xd5, 0x68, 0x9b, 0xf7, 0x03, 0x82, 0x47, 0x05, 0x54, 0xdb, 0x30, 0xbb, 0x65, 0x18, - 0xbb, 0x9e, 0x49, 0x6c, 0xc3, 0xd7, 0xc8, 0x8f, 0xc6, 0xc4, 0x0f, 0x50, 0x1b, 0xca, 0xa6, 0xe1, - 0x77, 0x94, 0x95, 0xf2, 0xa3, 0xa6, 0x46, 0x7f, 0x52, 0xb9, 0xa9, 0xea, 0xda, 0x78, 0x44, 0xfc, - 0x4e, 0x89, 0xf5, 0xc7, 0x1d, 0xea, 0xdf, 0x2b, 0xb0, 0xb0, 0x35, 0x0e, 0x8e, 0x89, 0x1d, 0x98, - 0x3a, 0x0e, 0x08, 0xd7, 0x8c, 0x70, 0xb6, 0xc7, 0x50, 0xc7, 0x5c, 0x10, 0x61, 0x17, 0x79, 0x0a, - 0x2c, 0x86, 0x84, 0x94, 0x68, 0x03, 0x6a, 0xba, 0x47, 0x70, 0x40, 0xd8, 0x19, 0xe4, 0xa9, 0xe7, - 0x53, 0xc7, 0xb1, 0x5e, 0x61, 0x6b, 0x4c, 0x34, 0x41, 0x49, 0x55, 0x26, 0x94, 0x49, 0x98, 0x50, - 0xd4, 0xce, 0x88, 0x28, 0x0c, 0xe6, 0x2a, 0x22, 0x86, 0x36, 0xf6, 0x75, 0x89, 0xf8, 0xb7, 0x0a, - 0x74, 0x64, 0x11, 0x99, 0x75, 0x84, 0x12, 0x6e, 0xa4, 0x25, 0xec, 0xe4, 0x48, 0xc8, 0x47, 0x7c, - 0x6d, 0x02, 0xfe, 0x5a, 0x81, 0x45, 0x59, 0xc0, 0xd0, 0xf8, 0x42, 0x19, 0xff, 0x28, 0x2d, 0xe3, - 0x62, 0x8e, 0x8c, 0xd1, 0xa0, 0xaf, 0x4b, 0x4c, 0x3a, 0x9f, 0x39, 0x72, 0x1d, 0x8f, 0x5b, 0xde, - 0x05, 0xf3, 0x71, 0x4a, 0xf5, 0x1f, 0x15, 0x58, 0x92, 0x97, 0x16, 0x7b, 0x8b, 0x70, 0x71, 0x1f, - 0xa6, 0x17, 0xb7, 0x94, 0xb3, 0x38, 0x69, 0xd8, 0xef, 0x4c, 0x93, 0xb9, 0x13, 0xb8, 0x92, 0x26, - 0x8b, 0x21, 0xbf, 0x33, 0x4d, 0x66, 0x0e, 0xe8, 0x4a, 0x9a, 0xcc, 0x47, 0x7c, 0x6d, 0x02, 0xee, - 0xc0, 0xdc, 0x53, 0xcb, 0xd1, 0x4f, 0x6e, 0xe8, 0xf7, 0xfe, 0xa3, 0x0c, 0x33, 0xdb, 0xc7, 0xd8, - 0xb6, 0x89, 0xf5, 0x5d, 0xe2, 0xfb, 0x78, 0x48, 0xd0, 0x12, 0x80, 0xce, 0x7b, 0x62, 0x70, 0x69, - 0x8a, 0x9e, 0xbe, 0x41, 0x3f, 0x8f, 0x38, 0x65, 0x0c, 0x2f, 0x4d, 0xd1, 0xd3, 0x37, 0x50, 0x0f, - 0x2a, 0xba, 0x63, 0x70, 0x79, 0xa9, 0xf9, 0xa4, 0x57, 0xd9, 0xb7, 0x83, 0xc7, 0x1b, 0x7c, 0x99, - 0x8c, 0x90, 0xa2, 0x95, 0x4f, 0x6c, 0x83, 0x43, 0x19, 0x07, 0x9a, 0x06, 0xef, 0xe8, 0x1b, 0x89, - 0x1d, 0xa8, 0xa6, 0x8c, 0xa4, 0x03, 0x75, 0xdd, 0xb1, 0x03, 0x62, 0x07, 0x02, 0x63, 0xc2, 0x26, - 0xfa, 0x0e, 0x4c, 0x79, 0xe4, 0x88, 0x78, 0xc4, 0xd6, 0x99, 0x90, 0x75, 0x26, 0xcb, 0xdd, 0x8c, - 0x2c, 0xfb, 0x81, 0x67, 0xda, 0x43, 0x2e, 0x4c, 0x2b, 0x1a, 0xc1, 0xc3, 0x0b, 0x7e, 0x04, 0x3c, - 0xbc, 0x68, 0x5c, 0x1c, 0x5e, 0x70, 0x72, 0xda, 0x41, 0x07, 0x8f, 0x5d, 0x23, 0x1a, 0xdc, 0xbc, - 0x78, 0x30, 0x27, 0x67, 0x83, 0x37, 0x01, 0x68, 0x18, 0x67, 0xfa, 0x6c, 0x5d, 0x70, 0xa1, 0xaa, - 0x48, 0xd4, 0xea, 0xcf, 0x15, 0x40, 0xc9, 0xb3, 0x7c, 0x61, 0xfa, 0x01, 0xfa, 0x63, 0x68, 0x88, - 0xe3, 0xe1, 0x7a, 0x41, 0x27, 0x94, 0xd4, 0x35, 0x39, 0x42, 0x8b, 0x68, 0xd1, 0x3d, 0x68, 0xd9, - 0xe4, 0x75, 0x30, 0xd0, 0xc7, 0x9e, 0xef, 0x78, 0xe2, 0xa4, 0x81, 0x76, 0x6d, 0xb3, 0x1e, 0x4a, - 0xe0, 0x7a, 0xe4, 0x34, 0x24, 0xe0, 0x1a, 0x0a, 0xb4, 0x8b, 0x13, 0xa8, 0x7f, 0x59, 0x82, 0xb9, - 0x6d, 0xb6, 0x31, 0xcf, 0x3d, 0x67, 0xec, 0x46, 0x4a, 0xfa, 0x04, 0x6a, 0x43, 0xd6, 0x21, 0xe4, - 0x79, 0x94, 0x90, 0x27, 0x3b, 0x60, 0x7d, 0x8f, 0x9c, 0xb1, 0x0e, 0x4d, 0x8c, 0xeb, 0xfe, 0xab, - 0x02, 0x8d, 0xb0, 0x93, 0x46, 0x29, 0x4c, 0x41, 0xb8, 0xaa, 0xb2, 0xdf, 0x68, 0x05, 0x5a, 0x06, - 0xf1, 0x75, 0xcf, 0x64, 0x41, 0xaf, 0x10, 0x5e, 0xee, 0x42, 0x0b, 0xd0, 0xb0, 0xb0, 0x3d, 0x1c, - 0x04, 0x78, 0x28, 0x44, 0xaf, 0xd3, 0xf6, 0x01, 0x1e, 0x52, 0xad, 0x1b, 0x91, 0x00, 0x1b, 0x38, - 0xc0, 0xa1, 0x46, 0x86, 0x6d, 0xaa, 0xfe, 0xf8, 0x14, 0x07, 0xd8, 0x63, 0xc1, 0x8d, 0x88, 0x7f, - 0x78, 0xcf, 0x4b, 0xcf, 0xa2, 0x4a, 0xe9, 0x7a, 0xe6, 0x29, 0xb5, 0x73, 0xaa, 0x94, 0x0d, 0x2d, - 0x6c, 0xaa, 0xbb, 0x70, 0xfb, 0x19, 0xb1, 0x48, 0x40, 0x6e, 0x68, 0xb1, 0xcf, 0x61, 0x99, 0xcf, - 0xf3, 0x82, 0x60, 0x83, 0x78, 0x87, 0x0e, 0xf6, 0x0c, 0x8d, 0xe8, 0x0e, 0xfd, 0x97, 0xcf, 0xf8, - 0x00, 0x66, 0xac, 0xf8, 0x5b, 0x6c, 0xc4, 0xd3, 0x52, 0x6f, 0xdf, 0x50, 0xd7, 0xa1, 0xcb, 0x27, - 0xda, 0x73, 0x02, 0xf3, 0x88, 0x7a, 0x39, 0x9a, 0x12, 0x14, 0x8a, 0xa5, 0xea, 0x70, 0x87, 0xd3, - 0xef, 0x07, 0x8e, 0x87, 0x87, 0xe4, 0x7b, 0x87, 0x3f, 0x24, 0x7a, 0xd0, 0x37, 0xd0, 0x32, 0x80, - 0xee, 0x58, 0x16, 0xd1, 0xd9, 0x56, 0x73, 0x5e, 0x52, 0x0f, 0x9d, 0xea, 0x84, 0x9c, 0x8b, 0x33, - 0xa0, 0x3f, 0xe9, 0x2e, 0x9d, 0x52, 0xbd, 0x75, 0xec, 0x70, 0xeb, 0x45, 0x53, 0x1d, 0xc0, 0x62, - 0x0e, 0x13, 0x49, 0x73, 0xc0, 0x61, 0x3d, 0x83, 0x50, 0xb8, 0xd6, 0xc6, 0x7d, 0x59, 0x7b, 0x72, - 0x25, 0xd4, 0x9a, 0x8e, 0xf8, 0xe5, 0xab, 0xff, 0xa0, 0x40, 0x8d, 0x9f, 0xc0, 0x25, 0x53, 0x9d, - 0xdb, 0x50, 0xf5, 0x83, 0xd0, 0x6f, 0x57, 0x35, 0xde, 0x50, 0x7f, 0x00, 0xd5, 0x7d, 0xfa, 0x03, - 0xdd, 0x81, 0xd9, 0xfd, 0x83, 0xad, 0x83, 0x9d, 0xc1, 0xcb, 0xbd, 0xfd, 0x4f, 0x76, 0xb6, 0xfb, - 0xbb, 0xfd, 0x9d, 0x67, 0xed, 0x3f, 0x40, 0x00, 0xb5, 0x5d, 0xad, 0xbf, 0xb3, 0xf7, 0xac, 0xad, - 0xa0, 0x5b, 0xd0, 0xea, 0xef, 0xbd, 0xea, 0x1f, 0xec, 0x0c, 0xf6, 0x77, 0xf6, 0x0e, 0xda, 0x25, - 0x34, 0x07, 0xb7, 0x44, 0x87, 0xb6, 0xb3, 0xbd, 0xd3, 0x7f, 0xb5, 0xf3, 0xac, 0x5d, 0x46, 0x2d, - 0xa8, 0x3f, 0x7d, 0xf1, 0xbd, 0xed, 0x8f, 0x77, 0x9e, 0xb5, 0x2b, 0xea, 0x87, 0x50, 0x17, 0x6a, - 0x82, 0xde, 0x83, 0xfa, 0x11, 0xff, 0x29, 0xd6, 0x8b, 0x64, 0x41, 0x39, 0x95, 0x16, 0x92, 0xa8, - 0x06, 0xdc, 0x7a, 0x4e, 0x02, 0x2a, 0xfe, 0x75, 0x15, 0x0c, 0xdd, 0x87, 0xa9, 0x23, 0x11, 0xe1, - 0xb0, 0x5d, 0x2e, 0x33, 0x82, 0x56, 0xd8, 0x47, 0x37, 0xf1, 0xb7, 0x25, 0xa8, 0x72, 0xdb, 0x4b, - 0x65, 0x46, 0x0c, 0x3c, 0xa8, 0x01, 0x3b, 0x9e, 0x84, 0x0e, 0xa2, 0xa7, 0x6f, 0x44, 0xa6, 0x5a, - 0x2e, 0x36, 0xd5, 0xca, 0x64, 0x53, 0xad, 0x16, 0x9b, 0x6a, 0x6d, 0xa2, 0xa9, 0xd6, 0x27, 0x98, - 0x6a, 0x23, 0x61, 0xaa, 0xf4, 0xc8, 0x39, 0xba, 0x37, 0xf9, 0x91, 0x73, 0x04, 0x4f, 0x81, 0x02, - 0xdc, 0x04, 0x14, 0x5a, 0x57, 0x01, 0x05, 0xf5, 0x31, 0xd4, 0xb8, 0x3f, 0x44, 0xef, 0xa6, 0x3c, - 0xe7, 0xac, 0xac, 0x0b, 0x09, 0x17, 0xa9, 0xfe, 0x54, 0x81, 0xbb, 0x7d, 0x16, 0x1a, 0x86, 0xf1, - 0x6a, 0xca, 0xf1, 0x5c, 0x33, 0xd6, 0xfd, 0x00, 0xaa, 0x1e, 0xf1, 0x45, 0xe6, 0x3f, 0x19, 0x9c, - 0x38, 0xa1, 0xfa, 0xef, 0x65, 0x98, 0xcd, 0x38, 0xab, 0x4b, 0x7a, 0x29, 0x7a, 0xf6, 0xce, 0x99, - 0x4d, 0x24, 0x75, 0xaa, 0xb3, 0x76, 0xdf, 0x40, 0x1f, 0xa5, 0xc2, 0xa3, 0x8b, 0x20, 0x3e, 0x0e, - 0x1d, 0xa8, 0x4d, 0xeb, 0x8e, 0x47, 0x98, 0xb2, 0x95, 0x35, 0xde, 0xa0, 0xba, 0xe4, 0x8f, 0x0f, - 0xf9, 0x87, 0x2a, 0xfb, 0x10, 0xb5, 0x69, 0x94, 0x62, 0x8f, 0x47, 0x03, 0xfe, 0xb1, 0xc6, 0xd4, - 0xa2, 0x61, 0x8f, 0x47, 0xfb, 0xe1, 0xc0, 0x48, 0x09, 0xeb, 0x29, 0x25, 0xfc, 0xfd, 0x85, 0x12, - 0xdf, 0x82, 0x16, 0x79, 0xed, 0x9a, 0xde, 0xf9, 0xa5, 0xf5, 0x95, 0x93, 0xb3, 0xc1, 0x08, 0x2a, - 0x1e, 0xb6, 0x4f, 0x98, 0xa2, 0x96, 0x35, 0xf6, 0x5b, 0xfd, 0x6f, 0x05, 0xee, 0x64, 0xce, 0x91, - 0x85, 0x18, 0x1f, 0x42, 0xdd, 0x63, 0xad, 0x50, 0x2f, 0x13, 0x99, 0x45, 0x16, 0xa8, 0x42, 0x6a, - 0xf4, 0x14, 0xa6, 0xf9, 0xe9, 0x86, 0xc3, 0x4b, 0x97, 0x19, 0x3e, 0xc5, 0xc6, 0x68, 0x62, 0x8e, - 0x54, 0x9c, 0x52, 0xbe, 0x28, 0x4e, 0xa9, 0x64, 0xe2, 0x94, 0x3f, 0x57, 0x60, 0xee, 0x85, 0x69, - 0x9f, 0xbc, 0xb9, 0x6c, 0xf0, 0xca, 0xd9, 0xdb, 0xbf, 0x29, 0xd0, 0xa5, 0x5b, 0x99, 0x8c, 0xc6, - 0x22, 0x5b, 0xbd, 0x20, 0x26, 0xff, 0x43, 0xa8, 0x5a, 0xe6, 0xc8, 0x0c, 0x6d, 0x72, 0x62, 0xd4, - 0xcd, 0x29, 0xd1, 0x37, 0xa1, 0x7e, 0xe4, 0x78, 0x67, 0xd8, 0x33, 0x84, 0xed, 0x4c, 0x92, 0x32, - 0x24, 0x45, 0xf3, 0x50, 0x4b, 0xec, 0xa2, 0x68, 0xa9, 0xff, 0xa2, 0xc0, 0x12, 0x15, 0x3f, 0x73, - 0x56, 0xfe, 0xd5, 0x82, 0x12, 0x6a, 0x67, 0xa1, 0xb9, 0x87, 0xd0, 0xd4, 0x10, 0xf6, 0xee, 0xc7, - 0xcb, 0x2c, 0x5f, 0x7a, 0x99, 0x45, 0x02, 0xff, 0x73, 0x09, 0x10, 0x15, 0xf8, 0xbb, 0x38, 0xd0, - 0x8f, 0xe3, 0x7d, 0x8e, 0x38, 0x28, 0x97, 0xe6, 0xf0, 0x04, 0xa6, 0xf1, 0x38, 0x38, 0x76, 0x3c, - 0x33, 0xc0, 0x81, 0x79, 0x7a, 0x99, 0xfc, 0x2e, 0x39, 0x00, 0x6d, 0x40, 0xd5, 0xc2, 0x87, 0xc4, - 0xba, 0x94, 0x13, 0xe3, 0xa4, 0x2c, 0xa8, 0x37, 0xed, 0x81, 0x6f, 0x7e, 0x41, 0x84, 0x96, 0x4d, - 0x94, 0xb5, 0x3e, 0x32, 0xed, 0x7d, 0xf3, 0x0b, 0xc2, 0xc6, 0xe1, 0xd7, 0x7c, 0x5c, 0xf5, 0x32, - 0xe3, 0xf0, 0x6b, 0x3a, 0x4e, 0x7d, 0x0d, 0x1d, 0xba, 0x5d, 0xb9, 0xa1, 0xe2, 0x35, 0x36, 0xed, - 0x5d, 0x68, 0xeb, 0x58, 0x3f, 0x26, 0xf8, 0xd0, 0x22, 0xc9, 0x04, 0xe3, 0x56, 0xd4, 0x2f, 0x8c, - 0xf3, 0xef, 0x14, 0x58, 0xa0, 0xac, 0xf3, 0x03, 0xc2, 0xb7, 0xa0, 0x4e, 0xbd, 0x7a, 0xac, 0x4f, - 0x35, 0xda, 0xcc, 0x04, 0xa5, 0xa5, 0x4c, 0x50, 0xfa, 0x06, 0x75, 0xe9, 0x17, 0x0a, 0x54, 0x99, - 0x1e, 0x51, 0xb0, 0x1a, 0xd1, 0x1f, 0xb1, 0x38, 0x75, 0xd6, 0xee, 0xd3, 0x60, 0x33, 0x47, 0x4d, - 0x1a, 0x6f, 0x42, 0x15, 0x10, 0x54, 0x22, 0x35, 0xa8, 0x6a, 0xec, 0xb7, 0xfa, 0x11, 0x34, 0x99, - 0x44, 0xcc, 0x3b, 0x7f, 0x03, 0xb8, 0x14, 0x24, 0x37, 0x6a, 0x60, 0x74, 0x5a, 0x48, 0xa1, 0xfe, - 0x8f, 0x02, 0x53, 0xf2, 0x29, 0x67, 0x22, 0xbc, 0x0e, 0xd4, 0xfd, 0x31, 0x3b, 0x84, 0x10, 0x8f, - 0x45, 0x53, 0x4e, 0xc8, 0xcb, 0xc9, 0x84, 0x1c, 0x89, 0xa2, 0x80, 0x10, 0x31, 0x9b, 0xf7, 0x57, - 0x53, 0x79, 0x7f, 0x0a, 0x35, 0x6b, 0x57, 0x42, 0xcd, 0xe5, 0x44, 0x0e, 0x5d, 0x67, 0xfb, 0x2c, - 0xe7, 0xc9, 0x5f, 0x41, 0x5b, 0x5e, 0x21, 0xdb, 0xa3, 0x6f, 0xc3, 0xb4, 0x2d, 0xeb, 0xb6, 0xd8, - 0xa9, 0x44, 0x61, 0x47, 0x1e, 0xa4, 0x25, 0xc9, 0xaf, 0xa2, 0xd0, 0x9f, 0xc3, 0x9c, 0x46, 0xb0, - 0x71, 0xf3, 0x2c, 0x4a, 0xd2, 0xfd, 0xb2, 0xac, 0xfb, 0xea, 0x9f, 0xc1, 0x42, 0x86, 0x43, 0x64, - 0x31, 0xdf, 0xce, 0x49, 0xa1, 0xee, 0xc9, 0xcb, 0xcc, 0x11, 0x4e, 0x4e, 0xa0, 0xfe, 0x14, 0xca, - 0x9a, 0xab, 0xe7, 0xa9, 0x85, 0x8b, 0xcf, 0x2d, 0x07, 0x47, 0x61, 0x9a, 0x68, 0x52, 0xa3, 0x38, - 0x0e, 0x02, 0x77, 0x40, 0xa5, 0x17, 0x7a, 0x41, 0xdb, 0x1f, 0x93, 0x73, 0xf5, 0x15, 0xd4, 0xf7, - 0x89, 0x4f, 0x13, 0x3f, 0xa6, 0x3c, 0xec, 0x08, 0xf9, 0xa4, 0x0d, 0x2d, 0x6c, 0xc6, 0x55, 0xff, - 0x92, 0x54, 0xf5, 0xa7, 0xea, 0x33, 0x36, 0xdc, 0x01, 0xff, 0x12, 0x16, 0xc7, 0x0c, 0xf7, 0x80, - 0x5d, 0x09, 0xfc, 0xba, 0x04, 0xd3, 0x89, 0x25, 0xbc, 0xc1, 0xdd, 0xa5, 0xf2, 0x9c, 0x52, 0xfb, - 0x13, 0x5e, 0x80, 0x37, 0xe4, 0x94, 0xb6, 0x9a, 0x48, 0x69, 0xd1, 0x43, 0xb8, 0xe5, 0x12, 0x6f, - 0x64, 0xb2, 0x75, 0x0e, 0x3c, 0x82, 0x0d, 0x11, 0x40, 0xce, 0xc4, 0xdd, 0x74, 0xcf, 0xa9, 0x0e, - 0x49, 0x84, 0x67, 0x9e, 0x19, 0x10, 0xa6, 0xbd, 0x55, 0x4d, 0x9a, 0xe0, 0x53, 0xda, 0xfd, 0xfb, - 0x8b, 0x2a, 0xd5, 0x33, 0x68, 0x27, 0x76, 0x76, 0x4b, 0x3f, 0x79, 0x93, 0x05, 0x00, 0x79, 0xdb, - 0x2b, 0x09, 0xa5, 0xde, 0x81, 0xd9, 0x34, 0x63, 0x1f, 0x7d, 0x00, 0x15, 0xac, 0x9f, 0x84, 0x6a, - 0x7c, 0x57, 0x56, 0xe3, 0x34, 0xb1, 0xc6, 0x28, 0xd5, 0x1d, 0x98, 0x49, 0xda, 0x05, 0x7a, 0x0c, - 0x75, 0xae, 0xdd, 0xe1, 0x34, 0x0b, 0x85, 0xd3, 0x68, 0x21, 0xa5, 0xfa, 0x79, 0x4a, 0x1a, 0xe6, - 0x44, 0xae, 0x33, 0x93, 0x84, 0x2a, 0xa5, 0x04, 0xaa, 0xfc, 0x5f, 0x09, 0x6e, 0xbf, 0x64, 0xfb, - 0x2e, 0x02, 0xcd, 0xd0, 0x80, 0xe5, 0xb4, 0x47, 0xb9, 0x52, 0xda, 0xf3, 0x1d, 0x98, 0x32, 0x4c, - 0xdf, 0xb5, 0xf0, 0xf9, 0x80, 0x8d, 0x2e, 0x5d, 0xa6, 0x2e, 0x2a, 0x46, 0xec, 0x61, 0xa6, 0x39, - 0x72, 0x46, 0x7d, 0x19, 0x8c, 0x92, 0xf2, 0xed, 0x0f, 0xa5, 0x2c, 0xbe, 0x72, 0x89, 0xa1, 0x51, - 0x8e, 0xff, 0x11, 0x34, 0x2c, 0x87, 0x3b, 0x5a, 0x11, 0xb3, 0x5c, 0xb0, 0xe0, 0x90, 0x9a, 0x8e, - 0xa4, 0x2a, 0xfe, 0x85, 0x63, 0x87, 0x18, 0x72, 0xc1, 0xc8, 0x90, 0x5a, 0xfd, 0x65, 0x05, 0x2a, - 0x2f, 0x7d, 0xe2, 0x65, 0xfc, 0x9c, 0x5c, 0x91, 0x2e, 0xa5, 0x2a, 0xd2, 0xf7, 0x53, 0xfb, 0x5b, - 0x16, 0xa5, 0x0c, 0x69, 0x07, 0x93, 0x35, 0x89, 0x4a, 0xba, 0x26, 0x31, 0xb9, 0xd2, 0x11, 0xed, - 0x82, 0xa8, 0x74, 0x44, 0xeb, 0xec, 0x4a, 0xeb, 0x14, 0x09, 0x68, 0xd8, 0x4e, 0x24, 0xa7, 0x8d, - 0x54, 0x72, 0x7a, 0x0f, 0x5a, 0x52, 0xa9, 0x87, 0x79, 0x82, 0xa6, 0x06, 0x71, 0xa5, 0x87, 0x7a, - 0x59, 0xbe, 0x5f, 0xf4, 0x33, 0xf0, 0xd1, 0xbc, 0xa3, 0x6f, 0xa0, 0xb7, 0x61, 0x7a, 0x88, 0x47, - 0x44, 0x67, 0xb7, 0x45, 0x94, 0xa0, 0xc5, 0xaf, 0x7a, 0xe3, 0x4e, 0x9e, 0xbf, 0xfb, 0x01, 0xc1, - 0xec, 0x16, 0x7f, 0x4a, 0xc4, 0x0b, 0xb4, 0xdd, 0x67, 0xc9, 0x84, 0x63, 0x5b, 0xa6, 0x4d, 0x3a, - 0xd3, 0xcc, 0xe3, 0x8b, 0x16, 0xdd, 0x23, 0x62, 0x0c, 0xc9, 0x80, 0x67, 0x5e, 0x33, 0xcc, 0x03, - 0x36, 0x69, 0xcf, 0x76, 0x5e, 0x1d, 0xe6, 0xd6, 0x4d, 0x7c, 0x5f, 0xfb, 0x4a, 0xbe, 0xaf, 0x07, - 0x55, 0x56, 0x59, 0x43, 0xef, 0x40, 0x95, 0x1e, 0x7a, 0x68, 0xe6, 0xd9, 0xd2, 0x21, 0xff, 0xac, - 0xfe, 0xac, 0x04, 0x4b, 0xcc, 0x61, 0xdf, 0xb0, 0x56, 0x8b, 0xbe, 0x0f, 0x35, 0x9e, 0x21, 0x0b, - 0x9b, 0x7d, 0x22, 0x73, 0x9c, 0xc8, 0x21, 0x9b, 0x3e, 0x33, 0x72, 0x4d, 0xcc, 0xd7, 0x3d, 0x82, - 0xf9, 0x7c, 0x8a, 0xb8, 0x48, 0xa2, 0x14, 0x15, 0x49, 0x4a, 0xa9, 0x22, 0x89, 0xac, 0x6a, 0xe5, - 0xa4, 0xaa, 0xa9, 0x7f, 0x51, 0x02, 0xc4, 0xe6, 0xbd, 0x29, 0x2e, 0x47, 0xf0, 0x5b, 0x2e, 0x80, - 0xdf, 0x4a, 0x12, 0x50, 0x9e, 0x65, 0xe1, 0xf7, 0x12, 0x89, 0x4f, 0x1a, 0x9b, 0x77, 0x73, 0xb0, - 0xb9, 0x76, 0xf1, 0x34, 0x69, 0xe0, 0x56, 0x5f, 0x41, 0x37, 0xbb, 0x0b, 0x7e, 0xec, 0xda, 0x53, - 0x00, 0xb2, 0x9c, 0x39, 0xe7, 0x7c, 0x14, 0xd9, 0xf8, 0xcd, 0x03, 0xa8, 0xed, 0x31, 0x52, 0xf4, - 0x29, 0x40, 0xfc, 0x1e, 0x02, 0x25, 0xef, 0x78, 0xd3, 0xef, 0x24, 0xba, 0xf3, 0x19, 0xe9, 0x77, - 0x46, 0x6e, 0x70, 0xae, 0xa2, 0x9f, 0xfc, 0xd7, 0xff, 0xfe, 0x55, 0x69, 0x4a, 0x85, 0xde, 0xe9, - 0x46, 0x8f, 0x17, 0x97, 0xd1, 0x4f, 0x14, 0x40, 0xd9, 0x37, 0x12, 0xe8, 0x41, 0x82, 0x43, 0xd1, - 0x1b, 0x8a, 0xee, 0x5c, 0x02, 0x0b, 0x79, 0xd4, 0xa7, 0x7e, 0xc0, 0xd8, 0xac, 0xa9, 0xf7, 0x28, - 0x1b, 0x51, 0x3f, 0xe9, 0x61, 0x69, 0x8e, 0x1e, 0x7f, 0xf2, 0xb3, 0x19, 0x15, 0x57, 0xd2, 0x42, - 0x88, 0x17, 0x3a, 0x85, 0x42, 0x24, 0x5e, 0x49, 0x5c, 0x57, 0x08, 0xfe, 0x26, 0x29, 0x16, 0xe2, - 0xc7, 0x30, 0x9b, 0x79, 0xe6, 0x80, 0x56, 0x8b, 0x44, 0x90, 0x5f, 0x41, 0xe4, 0x4b, 0xd0, 0x63, - 0x12, 0xbc, 0xab, 0x2e, 0x17, 0x4a, 0xc0, 0x5e, 0x14, 0xc5, 0x02, 0xfc, 0x4c, 0x81, 0xdb, 0x79, - 0xef, 0x18, 0xd0, 0xc3, 0x22, 0x21, 0x52, 0xb5, 0xad, 0x7c, 0x39, 0x36, 0x98, 0x1c, 0xef, 0xa9, - 0xf7, 0x0b, 0xe5, 0x08, 0xb1, 0x21, 0x16, 0xe5, 0xe7, 0x0a, 0xcc, 0xe7, 0xbf, 0x3b, 0x40, 0xef, - 0x16, 0x09, 0x93, 0x79, 0x9b, 0x90, 0x2f, 0xce, 0x37, 0x99, 0x38, 0xeb, 0xea, 0xdb, 0x85, 0xe2, - 0xc4, 0x50, 0x53, 0xac, 0x21, 0xe2, 0x89, 0x51, 0xa1, 0x86, 0x24, 0x5e, 0x1f, 0x5c, 0x57, 0x43, - 0xb8, 0x15, 0x15, 0x6a, 0x08, 0x7f, 0xbf, 0x54, 0xa8, 0x21, 0xf2, 0xeb, 0x82, 0xeb, 0x6a, 0x08, - 0x43, 0xd5, 0x58, 0x00, 0x0c, 0x53, 0xf2, 0xfb, 0x00, 0x94, 0x48, 0xf1, 0x72, 0x5e, 0x0e, 0x14, - 0x7a, 0x82, 0x0e, 0xe3, 0x8c, 0xd4, 0x76, 0xec, 0x09, 0x7a, 0x87, 0x74, 0x3c, 0xfa, 0x3e, 0xb4, - 0xa4, 0xcb, 0xda, 0x24, 0x87, 0x9c, 0x5b, 0xdc, 0x2e, 0xca, 0x5c, 0x56, 0xf8, 0xea, 0x6d, 0x36, - 0xfb, 0x8c, 0xda, 0xa4, 0xb3, 0xb3, 0x9b, 0x8b, 0x4d, 0x65, 0x0d, 0xfd, 0x00, 0xa6, 0x13, 0x77, - 0xa5, 0x68, 0x25, 0x7b, 0xc7, 0x77, 0x35, 0x47, 0xb6, 0x26, 0x3b, 0xb2, 0x9f, 0x2a, 0xf0, 0x56, - 0xc1, 0x1d, 0x2a, 0x5a, 0xcb, 0x72, 0x2a, 0x82, 0xd6, 0x42, 0x9e, 0x8f, 0x18, 0x4f, 0x75, 0x6d, - 0x85, 0xf2, 0x94, 0x80, 0xbc, 0xf7, 0x65, 0x12, 0xeb, 0xbf, 0x42, 0x0e, 0xcc, 0xe5, 0xdc, 0xc1, - 0xa2, 0x77, 0xb2, 0x42, 0xe4, 0x55, 0xde, 0x2e, 0x3a, 0xb3, 0x35, 0x76, 0x66, 0x72, 0xa1, 0x02, - 0x9d, 0x86, 0xb7, 0xd0, 0xa9, 0x24, 0xe8, 0xe1, 0x05, 0x97, 0xa8, 0x17, 0xb2, 0x5c, 0x62, 0x2c, - 0xdf, 0xea, 0x22, 0xca, 0xd2, 0xe7, 0x43, 0x7b, 0x06, 0x9b, 0x88, 0x9e, 0xe8, 0x1e, 0xc0, 0x73, - 0x12, 0x84, 0x8f, 0x4c, 0x0b, 0x26, 0x49, 0xaa, 0xbe, 0x20, 0x56, 0xe7, 0xd8, 0xcc, 0xd3, 0xa8, - 0x25, 0xa9, 0x3e, 0x7a, 0x01, 0x8d, 0xf0, 0x9e, 0x13, 0x25, 0xaa, 0xf2, 0xa9, 0xdb, 0xcf, 0xee, - 0x6c, 0x3a, 0x36, 0xf3, 0xd5, 0x36, 0x9b, 0x10, 0x50, 0x83, 0x4e, 0xc8, 0xee, 0x78, 0xf7, 0xa1, - 0xf5, 0x27, 0x04, 0x5b, 0xc1, 0xb1, 0x7e, 0x4c, 0xf4, 0x93, 0x42, 0xf1, 0x8a, 0xd6, 0x2e, 0x94, - 0x18, 0x4d, 0xf5, 0x8e, 0xa5, 0x59, 0x7e, 0x0c, 0x77, 0x72, 0xef, 0xdf, 0x50, 0xe2, 0xb9, 0xc3, - 0xa4, 0x2b, 0xba, 0x42, 0x86, 0xab, 0x8c, 0xe1, 0xb2, 0x3a, 0x27, 0xd9, 0x64, 0xd6, 0x33, 0xeb, - 0x00, 0x2f, 0x4c, 0xfb, 0x44, 0xc0, 0x74, 0xf1, 0x93, 0xc5, 0x42, 0x36, 0x2a, 0x63, 0x73, 0x57, - 0x7d, 0x4b, 0x76, 0x3a, 0x96, 0x69, 0x9f, 0x84, 0xa8, 0xac, 0xac, 0x85, 0x4c, 0x04, 0x0c, 0x17, - 0x3f, 0x3a, 0xbc, 0x06, 0x13, 0x81, 0xba, 0xca, 0x1a, 0xfa, 0x1c, 0x9a, 0x94, 0x09, 0xc7, 0xd9, - 0xc2, 0x67, 0x83, 0x85, 0x2c, 0xee, 0x33, 0x16, 0x8b, 0xea, 0x7c, 0x86, 0x05, 0x87, 0x55, 0x65, - 0x0d, 0xf9, 0x30, 0x25, 0xdf, 0x00, 0x25, 0x9d, 0x59, 0xce, 0xdd, 0x50, 0x21, 0xaf, 0x35, 0xc6, - 0x6b, 0x55, 0x5d, 0xc8, 0xf0, 0xca, 0x1e, 0x90, 0x03, 0x33, 0x74, 0x6a, 0x09, 0x31, 0x27, 0xbf, - 0xc8, 0x2b, 0x64, 0xfa, 0x0e, 0x63, 0xba, 0xa2, 0x2e, 0x66, 0x98, 0x4a, 0x00, 0x19, 0x1f, 0x96, - 0x40, 0xc4, 0xe2, 0x77, 0x75, 0xd7, 0x38, 0x2c, 0x01, 0x80, 0xf1, 0x61, 0x71, 0xc8, 0x2b, 0x7c, - 0x19, 0x77, 0x8d, 0xc3, 0xe2, 0x08, 0xa7, 0xac, 0x21, 0x0f, 0xe6, 0x72, 0xee, 0xca, 0x92, 0x5e, - 0xb3, 0xf8, 0x32, 0xad, 0xbb, 0x5c, 0xfc, 0xfc, 0x89, 0x8e, 0x4a, 0x3a, 0x1c, 0x71, 0xc9, 0x86, - 0xf6, 0xa0, 0x45, 0x3f, 0x86, 0x36, 0x7c, 0x29, 0x0f, 0x26, 0x88, 0x43, 0x0c, 0x42, 0x32, 0x06, - 0xfd, 0x42, 0x81, 0xf9, 0xfc, 0x1b, 0xb3, 0x64, 0xd8, 0x34, 0xf1, 0x56, 0xad, 0x7b, 0x7f, 0xe2, - 0x45, 0x29, 0x5b, 0x8d, 0x00, 0x23, 0x74, 0x31, 0x18, 0x7d, 0xca, 0x97, 0x28, 0xae, 0xc4, 0xd0, - 0x72, 0x5a, 0x8c, 0xe4, 0x5d, 0x59, 0xf7, 0x4e, 0xe6, 0x16, 0x81, 0xf1, 0x9b, 0x65, 0xfc, 0x5a, - 0x88, 0x21, 0x3a, 0xbb, 0x55, 0x40, 0x3f, 0x82, 0xd9, 0xcc, 0xe5, 0x51, 0x32, 0x18, 0x2a, 0xba, - 0x5b, 0xea, 0xde, 0x2d, 0x2a, 0xc0, 0x33, 0x5e, 0x02, 0xe7, 0x50, 0x16, 0xe7, 0x7e, 0xa5, 0xf0, - 0xfb, 0xbd, 0x14, 0xcc, 0x3d, 0x48, 0x33, 0xcd, 0x07, 0xb9, 0xa5, 0xc2, 0xba, 0x1d, 0x63, 0xbb, - 0xcb, 0xd8, 0x3e, 0x41, 0x1d, 0x19, 0xeb, 0xbe, 0x8c, 0xb3, 0xd6, 0xaf, 0x3e, 0x5b, 0x45, 0x6a, - 0xd1, 0xb7, 0xde, 0x97, 0xa2, 0xbe, 0x49, 0xd1, 0x1f, 0x65, 0xeb, 0xf4, 0x49, 0x19, 0x0b, 0xeb, - 0xf8, 0xdd, 0x6e, 0xa1, 0x8c, 0xbe, 0x3a, 0xcf, 0x04, 0x6c, 0xab, 0x2d, 0x49, 0x08, 0x6a, 0x38, - 0x9f, 0x41, 0x5d, 0x73, 0xf5, 0xdd, 0xb1, 0xad, 0xa3, 0x5b, 0x09, 0x2e, 0xae, 0xde, 0x4d, 0x77, - 0xa8, 0xef, 0xb3, 0x49, 0x1e, 0xaa, 0x53, 0x74, 0x12, 0xcf, 0xd5, 0x7b, 0x5f, 0x9a, 0xc6, 0x57, - 0x9b, 0x61, 0x59, 0xff, 0x33, 0x0a, 0x77, 0xd2, 0x07, 0x34, 0x84, 0xa9, 0x97, 0xb6, 0x75, 0x23, - 0xbc, 0x09, 0x61, 0x2d, 0xe1, 0x3b, 0xc7, 0x76, 0x0a, 0x71, 0x22, 0x46, 0xd7, 0xc7, 0x9c, 0x49, - 0x8c, 0x62, 0xd4, 0x31, 0xa0, 0xc5, 0x19, 0x5d, 0x17, 0x77, 0xde, 0x66, 0x6c, 0x96, 0xd4, 0x4e, - 0x0e, 0x9b, 0x08, 0x79, 0x46, 0x30, 0xc3, 0xb9, 0x44, 0xd8, 0x33, 0xe9, 0x95, 0xc1, 0xd5, 0x20, - 0x40, 0xf0, 0x8a, 0x90, 0x87, 0x01, 0x5d, 0x9b, 0xb3, 0xbb, 0x39, 0xea, 0x08, 0xcf, 0xa2, 0x2e, - 0xe5, 0xb0, 0x4c, 0xe2, 0x4e, 0x74, 0x64, 0xd7, 0x47, 0x9e, 0x49, 0x47, 0x16, 0x63, 0x4f, 0x74, - 0x64, 0xd7, 0x45, 0x9f, 0x49, 0x47, 0x16, 0xe1, 0x0f, 0x86, 0xe9, 0x44, 0x65, 0x3e, 0x99, 0x9e, - 0xe4, 0x15, 0xed, 0x0b, 0xf9, 0x09, 0x4b, 0xed, 0xca, 0xc1, 0x2d, 0x65, 0xf1, 0xd7, 0x0a, 0xcc, - 0xe7, 0xd7, 0xf5, 0x92, 0xf0, 0x30, 0xb1, 0xf6, 0xd7, 0x9d, 0xfc, 0x8e, 0x26, 0x4a, 0x6b, 0x2f, - 0x84, 0x86, 0x4d, 0x51, 0x2d, 0x44, 0x01, 0xcc, 0xe5, 0x94, 0xaf, 0x92, 0xc8, 0x5b, 0x5c, 0xdf, - 0x9a, 0xe0, 0x57, 0xb7, 0xf4, 0x13, 0x3f, 0xb9, 0x19, 0xb1, 0xdb, 0x7a, 0xfa, 0x37, 0xa5, 0x5f, - 0x6e, 0xfd, 0x46, 0x41, 0x63, 0x98, 0xe6, 0x25, 0xae, 0x95, 0xad, 0x4f, 0xfa, 0x2b, 0xa7, 0x1b, - 0xea, 0x00, 0xee, 0x1f, 0x1c, 0x93, 0x95, 0xb0, 0x93, 0xdd, 0xa4, 0xfb, 0x2b, 0xef, 0xac, 0x6c, - 0x3b, 0x76, 0xe0, 0x99, 0x87, 0xe3, 0xc0, 0xf1, 0x7c, 0xb4, 0x7a, 0x1c, 0x04, 0xae, 0xbf, 0xd9, - 0xeb, 0x0d, 0xcd, 0xe0, 0x78, 0x7c, 0xb8, 0xae, 0x3b, 0xa3, 0xde, 0x31, 0xf1, 0x1c, 0x53, 0xb7, - 0xf0, 0xa1, 0xdf, 0xe3, 0x02, 0x75, 0x6f, 0x1f, 0x13, 0xcb, 0x72, 0x9e, 0xc4, 0x1f, 0x28, 0xdd, - 0x46, 0x79, 0x63, 0xfd, 0x83, 0x35, 0x45, 0xd9, 0x68, 0x63, 0xd7, 0xb5, 0x04, 0xb4, 0xf4, 0x7e, - 0xe8, 0x3b, 0xf6, 0x66, 0xa6, 0xc7, 0xdb, 0x84, 0x45, 0x21, 0x88, 0x4f, 0xbc, 0x53, 0xe2, 0xad, - 0x18, 0x8e, 0x3e, 0x1e, 0x11, 0x9b, 0xff, 0xa9, 0x1d, 0x5a, 0x0c, 0xc5, 0x48, 0xb2, 0xe8, 0x19, - 0x8e, 0xee, 0xc3, 0x82, 0xee, 0x8c, 0xd6, 0xa5, 0x0f, 0xf1, 0x2e, 0x3d, 0x6d, 0xf2, 0x49, 0xb7, - 0x5c, 0xf3, 0x13, 0xe5, 0xb3, 0x32, 0x76, 0xcd, 0x5f, 0x95, 0x2a, 0x7b, 0x1f, 0x7f, 0xf2, 0xf4, - 0x9f, 0x4a, 0xa2, 0xde, 0x77, 0x58, 0x63, 0x2a, 0xf5, 0xf8, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, - 0x70, 0x26, 0x54, 0x0d, 0x8b, 0x38, 0x00, 0x00, + // 3755 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5b, 0xdd, 0x6f, 0x1c, 0xc9, + 0x71, 0xcf, 0xec, 0xf7, 0xd6, 0xf2, 0x63, 0xd9, 0x94, 0x78, 0xcb, 0xa5, 0x48, 0x51, 0x73, 0xd4, + 0x49, 0x47, 0xdf, 0x71, 0x2f, 0x94, 0x93, 0x3b, 0xd0, 0x80, 0x23, 0x8a, 0x22, 0x95, 0xcd, 0xc9, + 0xf4, 0x61, 0x48, 0xe9, 0x8c, 0x0b, 0x8c, 0xbd, 0xe6, 0x4c, 0x6b, 0x39, 0xe6, 0xec, 0xcc, 0x78, + 0x66, 0x96, 0x14, 0xef, 0x70, 0x70, 0x60, 0x04, 0xf0, 0x21, 0x0f, 0x86, 0xe1, 0xe4, 0x2d, 0x40, + 0x12, 0x38, 0x2f, 0x41, 0x80, 0x04, 0xf9, 0x03, 0xf2, 0x9a, 0x7f, 0x20, 0x01, 0x02, 0xc3, 0x4f, + 0x79, 0xc8, 0xa3, 0xff, 0x83, 0xbc, 0x04, 0xfd, 0x31, 0x33, 0x3d, 0x5f, 0xcb, 0x2f, 0x9d, 0xfd, + 0x22, 0x6d, 0xf7, 0x54, 0x77, 0x55, 0x77, 0x57, 0xd5, 0xaf, 0xaa, 0xba, 0x09, 0xd3, 0xd8, 0x35, + 0x7b, 0xd8, 0x35, 0x37, 0x5c, 0xcf, 0x09, 0x1c, 0x04, 0x36, 0x3e, 0xc1, 0x23, 0xbc, 0x81, 0x5d, + 0xb3, 0x7b, 0x67, 0xe8, 0x38, 0x43, 0x8b, 0xf4, 0x18, 0x85, 0x6d, 0x3b, 0x01, 0x0e, 0x4c, 0xc7, + 0xf6, 0x39, 0x65, 0x77, 0x49, 0x7c, 0x65, 0xad, 0xa3, 0xf1, 0xab, 0x1e, 0x19, 0xb9, 0xc1, 0xb9, + 0xf8, 0x78, 0x37, 0xfd, 0x31, 0x30, 0x47, 0xc4, 0x0f, 0xf0, 0xc8, 0x15, 0x04, 0x2b, 0x69, 0x82, + 0x33, 0x0f, 0xbb, 0x2e, 0xf1, 0xc2, 0xd9, 0xdf, 0x63, 0xff, 0xe9, 0xef, 0x0f, 0x89, 0xfd, 0xbe, + 0x7f, 0x86, 0x87, 0x43, 0xe2, 0xf5, 0x1c, 0x97, 0xf1, 0xcf, 0xca, 0xa2, 0xfe, 0x56, 0x81, 0xfa, + 0xb6, 0xae, 0x3b, 0x63, 0x3b, 0x40, 0x6b, 0x50, 0x19, 0xfb, 0xc4, 0xeb, 0x28, 0xab, 0xca, 0xc3, + 0xd6, 0x66, 0x7b, 0x23, 0x5e, 0xd0, 0xc6, 0x0b, 0x9f, 0x78, 0x1a, 0xfb, 0x8a, 0x16, 0xa0, 0x76, + 0x86, 0x2d, 0x8b, 0x04, 0x9d, 0xd2, 0xaa, 0xf2, 0xb0, 0xa9, 0x89, 0x16, 0xba, 0x05, 0x55, 0x32, + 0xc2, 0xa6, 0xd5, 0x29, 0xb3, 0x6e, 0xde, 0x40, 0x8f, 0xa0, 0x6e, 0x90, 0x53, 0x53, 0x27, 0x7e, + 0xa7, 0xb2, 0x5a, 0x7e, 0xd8, 0xda, 0x5c, 0x94, 0xa7, 0x15, 0x9c, 0x9f, 0x32, 0x0a, 0x2d, 0xa4, + 0x44, 0x4b, 0xd0, 0xd4, 0xc7, 0x7e, 0xe0, 0x8c, 0x06, 0xa6, 0xd1, 0xa9, 0xb2, 0xe9, 0x1a, 0xbc, + 0xa3, 0x6f, 0xa0, 0xef, 0x40, 0xeb, 0x94, 0x78, 0xe6, 0xab, 0xf3, 0x01, 0xdd, 0x99, 0x4e, 0x8d, + 0x09, 0xdb, 0xdd, 0xe0, 0xbb, 0xb2, 0x11, 0xee, 0xca, 0xc6, 0x61, 0xb8, 0x6d, 0x1a, 0x70, 0x72, + 0xda, 0xa1, 0xde, 0x85, 0x69, 0xc1, 0x73, 0x87, 0xcd, 0x87, 0x66, 0xa0, 0x64, 0x1a, 0x6c, 0xc5, + 0x4d, 0xad, 0x64, 0x1a, 0x12, 0x01, 0x17, 0x2a, 0x43, 0xf0, 0x18, 0xa6, 0x04, 0xc1, 0x2e, 0x5b, + 0x60, 0xb4, 0x6c, 0x45, 0x5e, 0x76, 0x17, 0x1a, 0x2e, 0xf6, 0xfd, 0x33, 0xc7, 0x33, 0xc4, 0x36, + 0x45, 0x6d, 0xf5, 0x01, 0xcc, 0x8a, 0x19, 0xf6, 0xb0, 0x4e, 0x8e, 0x1c, 0xe7, 0x84, 0x4e, 0x12, + 0x38, 0x27, 0xc4, 0x0e, 0x27, 0x61, 0x0d, 0xf5, 0x3f, 0x15, 0x98, 0x13, 0x94, 0xcf, 0xf0, 0x88, + 0xec, 0x10, 0x3b, 0x20, 0x1e, 0xdd, 0x1c, 0xd7, 0xc2, 0xe7, 0xc4, 0x1b, 0x44, 0x72, 0x35, 0x78, + 0x47, 0xdf, 0xa0, 0x1f, 0x8f, 0xc6, 0xb6, 0x61, 0x11, 0xfa, 0x51, 0x30, 0xe6, 0x1d, 0x7d, 0x03, + 0x7d, 0x0b, 0xe6, 0x22, 0x65, 0x1a, 0xf8, 0x44, 0x77, 0x6c, 0xc3, 0x67, 0xa7, 0x55, 0xd6, 0xda, + 0xd1, 0x87, 0x03, 0xde, 0x8f, 0x10, 0x54, 0x7c, 0x6c, 0x05, 0x9d, 0x0a, 0x9b, 0x84, 0xfd, 0x46, + 0x77, 0xa0, 0xe9, 0x9b, 0x43, 0x1b, 0x07, 0x63, 0x8f, 0x88, 0x73, 0x89, 0x3b, 0xd0, 0x1a, 0xcc, + 0xb8, 0xe3, 0x23, 0xcb, 0xd4, 0x07, 0x27, 0xe4, 0x7c, 0x30, 0xf6, 0x2c, 0x76, 0x36, 0x4d, 0x6d, + 0x8a, 0xf7, 0x7e, 0x4c, 0xce, 0x5f, 0x78, 0x96, 0x7a, 0x3f, 0xda, 0xe0, 0x67, 0xec, 0xc4, 0x0a, + 0xd6, 0xbe, 0x16, 0x6d, 0xf3, 0x41, 0x40, 0xf0, 0xa8, 0x80, 0x6a, 0x07, 0xe6, 0xb6, 0x0d, 0x63, + 0xcf, 0x33, 0x89, 0x6d, 0xf8, 0x1a, 0xf9, 0xf1, 0x98, 0xf8, 0x01, 0x6a, 0x43, 0xd9, 0x34, 0xfc, + 0x8e, 0xb2, 0x5a, 0x7e, 0xd8, 0xd4, 0xe8, 0x4f, 0x2a, 0x37, 0x55, 0x5d, 0x1b, 0x8f, 0x88, 0xdf, + 0x29, 0xb1, 0xfe, 0xb8, 0x43, 0xfd, 0x07, 0x05, 0x16, 0xb7, 0xc7, 0xc1, 0x31, 0xb1, 0x03, 0x53, + 0xc7, 0x01, 0xe1, 0x9a, 0x11, 0xce, 0xf6, 0x08, 0xea, 0x98, 0x0b, 0x22, 0xec, 0x22, 0x4f, 0x81, + 0xc5, 0x90, 0x90, 0x12, 0x6d, 0x42, 0x4d, 0xf7, 0x08, 0x0e, 0x08, 0x3b, 0x83, 0x3c, 0xf5, 0x7c, + 0xe2, 0x38, 0xd6, 0x4b, 0x6c, 0x8d, 0x89, 0x26, 0x28, 0xa9, 0xca, 0x84, 0x32, 0x09, 0x13, 0x8a, + 0xda, 0x19, 0x11, 0x85, 0xc1, 0x5c, 0x45, 0xc4, 0xd0, 0xc6, 0xbe, 0x29, 0x11, 0xff, 0x4e, 0x81, + 0x8e, 0x2c, 0x22, 0xb3, 0x8e, 0x50, 0xc2, 0xcd, 0xb4, 0x84, 0x9d, 0x1c, 0x09, 0xf9, 0x88, 0x6f, + 0x4c, 0xc0, 0x5f, 0x2b, 0xb0, 0x24, 0x0b, 0x18, 0x1a, 0x5f, 0x28, 0xe3, 0x1f, 0xa5, 0x65, 0x5c, + 0xca, 0x91, 0x31, 0x1a, 0xf4, 0x4d, 0x89, 0x49, 0xe7, 0x33, 0x47, 0xae, 0xe3, 0x71, 0xcb, 0xbb, + 0x60, 0x3e, 0x4e, 0xa9, 0xfe, 0x93, 0x02, 0xcb, 0xf2, 0xd2, 0x62, 0x6f, 0x11, 0x2e, 0xee, 0xc3, + 0xf4, 0xe2, 0x96, 0x73, 0x16, 0x27, 0x0d, 0xfb, 0x9d, 0x69, 0x32, 0x77, 0x02, 0x57, 0xd2, 0x64, + 0x31, 0xe4, 0x77, 0xa6, 0xc9, 0xcc, 0x01, 0x5d, 0x49, 0x93, 0xf9, 0x88, 0x6f, 0x4c, 0xc0, 0x5d, + 0x98, 0x7f, 0x62, 0x39, 0xfa, 0xc9, 0x0d, 0xfd, 0xde, 0xd7, 0x65, 0x98, 0xd9, 0x39, 0xc6, 0xb6, + 0x4d, 0xac, 0xef, 0x11, 0xdf, 0xc7, 0x43, 0x82, 0x96, 0x01, 0x74, 0xde, 0x13, 0x83, 0x4b, 0x53, + 0xf4, 0xf4, 0x0d, 0xfa, 0x79, 0xc4, 0x29, 0x63, 0x78, 0x69, 0x8a, 0x9e, 0xbe, 0x81, 0x7a, 0x50, + 0xd1, 0x1d, 0x83, 0xcb, 0x4b, 0xcd, 0x27, 0xbd, 0xca, 0xbe, 0x1d, 0x3c, 0xda, 0xe4, 0xcb, 0x64, + 0x84, 0x14, 0xad, 0x7c, 0x62, 0x1b, 0x1c, 0xca, 0x38, 0xd0, 0x34, 0x78, 0x47, 0xdf, 0x48, 0xec, + 0x40, 0x35, 0x65, 0x24, 0x1d, 0xa8, 0xeb, 0x8e, 0x1d, 0x10, 0x3b, 0x10, 0x18, 0x13, 0x36, 0x69, + 0x74, 0xc0, 0x77, 0x90, 0x47, 0x07, 0xf5, 0x8b, 0xa3, 0x03, 0x4e, 0x4e, 0x3b, 0xe8, 0xe0, 0xb1, + 0x6b, 0x44, 0x83, 0x1b, 0x17, 0x0f, 0xe6, 0xe4, 0x6c, 0xf0, 0x16, 0x00, 0x8d, 0xc2, 0x4c, 0x9f, + 0x89, 0xd5, 0xbc, 0xf0, 0xa4, 0x25, 0x6a, 0xf5, 0xe7, 0x0a, 0xa0, 0xe4, 0x51, 0x3c, 0x37, 0xfd, + 0x00, 0xfd, 0x31, 0x34, 0xc4, 0xee, 0xf2, 0x63, 0xa5, 0x13, 0x4a, 0xda, 0x96, 0x1c, 0xa1, 0x45, + 0xb4, 0xe8, 0x2e, 0xb4, 0x6c, 0xf2, 0x3a, 0x18, 0xe8, 0x63, 0xcf, 0x77, 0x3c, 0x71, 0x50, 0x40, + 0xbb, 0x76, 0x58, 0x0f, 0x25, 0x70, 0x3d, 0x72, 0x1a, 0x12, 0x70, 0x05, 0x03, 0xda, 0xc5, 0x09, + 0xd4, 0xbf, 0x2a, 0xc1, 0xfc, 0x0e, 0xdb, 0x98, 0x67, 0x9e, 0x33, 0x76, 0x23, 0x1d, 0x7b, 0x0c, + 0xb5, 0x21, 0xeb, 0x10, 0xf2, 0x3c, 0x4c, 0xc8, 0x93, 0x1d, 0xb0, 0xb1, 0x4f, 0xce, 0x58, 0x87, + 0x26, 0xc6, 0x75, 0xff, 0x4d, 0x81, 0x46, 0xd8, 0x49, 0x83, 0x0c, 0x76, 0xbe, 0x5c, 0xd3, 0xd8, + 0x6f, 0xb4, 0x0a, 0x2d, 0x83, 0xf8, 0xba, 0x67, 0xb2, 0x98, 0x55, 0x08, 0x2f, 0x77, 0xa1, 0x45, + 0x68, 0x58, 0xd8, 0x1e, 0x0e, 0x02, 0x3c, 0x14, 0xa2, 0xd7, 0x69, 0xfb, 0x10, 0x0f, 0xa9, 0xd2, + 0x8c, 0x48, 0x80, 0x0d, 0x1c, 0xe0, 0x50, 0xa1, 0xc2, 0x36, 0xd5, 0x5e, 0x7c, 0x8a, 0x03, 0xec, + 0xb1, 0xd8, 0x44, 0x84, 0x2f, 0xbc, 0xe7, 0x85, 0x67, 0x51, 0x9d, 0x72, 0x3d, 0xf3, 0x94, 0x9a, + 0x29, 0xd5, 0xa9, 0x86, 0x16, 0x36, 0xd5, 0x3d, 0xb8, 0xf5, 0x94, 0x58, 0x24, 0x20, 0x37, 0x34, + 0xb8, 0x67, 0xb0, 0xc2, 0xe7, 0x79, 0x4e, 0xb0, 0x41, 0xbc, 0x23, 0x07, 0x7b, 0x86, 0x46, 0x74, + 0x87, 0xfe, 0xcb, 0x67, 0xbc, 0x0f, 0x33, 0x56, 0xfc, 0x2d, 0xb6, 0xc1, 0x69, 0xa9, 0xb7, 0x6f, + 0xa8, 0x1b, 0xd0, 0xe5, 0x13, 0xed, 0x3b, 0x81, 0xf9, 0x8a, 0x3a, 0x29, 0x1a, 0xd1, 0x17, 0x8a, + 0xa5, 0xea, 0x70, 0x9b, 0xd3, 0x1f, 0x04, 0x8e, 0x87, 0x87, 0xe4, 0xfb, 0x47, 0x3f, 0x22, 0x7a, + 0xd0, 0x37, 0xd0, 0x0a, 0x80, 0xee, 0x58, 0x16, 0xd1, 0xd9, 0x56, 0x73, 0x5e, 0x52, 0x0f, 0x9d, + 0xea, 0x84, 0x9c, 0x8b, 0x33, 0xa0, 0x3f, 0xe9, 0x2e, 0x9d, 0x52, 0xbd, 0x75, 0xec, 0x70, 0xeb, + 0x45, 0x53, 0x1d, 0xc0, 0x52, 0x0e, 0x13, 0x49, 0x73, 0xc0, 0x61, 0x3d, 0x83, 0x50, 0xb8, 0xd6, + 0xe6, 0x3d, 0x59, 0x7b, 0x72, 0x25, 0xd4, 0x9a, 0x8e, 0xf8, 0xe5, 0xab, 0xff, 0xa8, 0x40, 0x8d, + 0x9f, 0xc0, 0x25, 0x33, 0x95, 0x5b, 0x50, 0xf5, 0x83, 0xd0, 0xed, 0x56, 0x35, 0xde, 0x50, 0x7f, + 0x08, 0xd5, 0x03, 0xfa, 0x03, 0xdd, 0x86, 0xb9, 0x83, 0xc3, 0xed, 0xc3, 0xdd, 0xc1, 0x8b, 0xfd, + 0x83, 0x4f, 0x76, 0x77, 0xfa, 0x7b, 0xfd, 0xdd, 0xa7, 0xed, 0x3f, 0x40, 0x00, 0xb5, 0x3d, 0xad, + 0xbf, 0xbb, 0xff, 0xb4, 0xad, 0xa0, 0x59, 0x68, 0xf5, 0xf7, 0x5f, 0xf6, 0x0f, 0x77, 0x07, 0x07, + 0xbb, 0xfb, 0x87, 0xed, 0x12, 0x9a, 0x87, 0x59, 0xd1, 0xa1, 0xed, 0xee, 0xec, 0xf6, 0x5f, 0xee, + 0x3e, 0x6d, 0x97, 0x51, 0x0b, 0xea, 0x4f, 0x9e, 0x7f, 0x7f, 0xe7, 0xe3, 0xdd, 0xa7, 0xed, 0x8a, + 0xfa, 0x21, 0xd4, 0x85, 0x9a, 0xa0, 0xf7, 0xa0, 0xfe, 0x8a, 0xff, 0x14, 0xeb, 0x45, 0xb2, 0xa0, + 0x9c, 0x4a, 0x0b, 0x49, 0x54, 0x03, 0x66, 0x9f, 0x91, 0x80, 0x8a, 0x7f, 0x5d, 0x05, 0x43, 0xf7, + 0x60, 0xea, 0x95, 0x08, 0x50, 0xd8, 0x2e, 0x97, 0x19, 0x41, 0x2b, 0xec, 0xa3, 0x9b, 0xf8, 0xdb, + 0x12, 0x54, 0xb9, 0xed, 0xa5, 0x12, 0x1b, 0xe6, 0xfb, 0xa9, 0x01, 0x3b, 0x9e, 0xe4, 0xdc, 0x45, + 0x4f, 0xdf, 0x88, 0x4c, 0xb5, 0x5c, 0x6c, 0xaa, 0x95, 0xc9, 0xa6, 0x5a, 0x2d, 0x36, 0xd5, 0xda, + 0x44, 0x53, 0xad, 0x4f, 0x30, 0xd5, 0x46, 0xc2, 0x54, 0xe9, 0x91, 0x73, 0x70, 0x6e, 0xf2, 0x23, + 0xe7, 0x00, 0x9c, 0x02, 0x05, 0xb8, 0x09, 0x28, 0xb4, 0xae, 0x02, 0x0a, 0xea, 0x23, 0xa8, 0x71, + 0x7f, 0x88, 0xde, 0x4d, 0x79, 0xce, 0x39, 0x59, 0x17, 0x12, 0x2e, 0x52, 0xfd, 0x99, 0x02, 0x77, + 0xfa, 0x2c, 0xb2, 0x0b, 0xc3, 0xcd, 0x94, 0xe3, 0xb9, 0x66, 0xa8, 0xfa, 0x01, 0x54, 0x3d, 0xe2, + 0x8b, 0xc4, 0x7d, 0x32, 0x38, 0x71, 0x42, 0xf5, 0x3f, 0xca, 0x30, 0x97, 0x71, 0x56, 0x97, 0xf4, + 0x52, 0xf4, 0xec, 0x9d, 0x33, 0x9b, 0x48, 0xea, 0x54, 0x67, 0xed, 0xbe, 0x81, 0x3e, 0x4a, 0x45, + 0x37, 0xad, 0xcd, 0x3b, 0x19, 0x61, 0x0e, 0x02, 0xcf, 0xb4, 0x87, 0x5c, 0x9c, 0x18, 0xf9, 0xa9, + 0x4d, 0xeb, 0x8e, 0x47, 0x98, 0xb2, 0x95, 0x35, 0xde, 0xa0, 0xba, 0xe4, 0x8f, 0x8f, 0xf8, 0x87, + 0x2a, 0xfb, 0x10, 0xb5, 0x69, 0x90, 0x61, 0x8f, 0x47, 0x03, 0xfe, 0xb1, 0xc6, 0xd4, 0xa2, 0x61, + 0x8f, 0x47, 0x07, 0xe1, 0xc0, 0x48, 0x09, 0xeb, 0x29, 0x25, 0x4c, 0x69, 0x4d, 0xe3, 0x26, 0x5a, + 0xd3, 0xbc, 0x52, 0x28, 0xf1, 0x1d, 0x68, 0x91, 0xd7, 0xae, 0xe9, 0x9d, 0x5f, 0x5a, 0x5f, 0x39, + 0x39, 0x1b, 0x8c, 0xa0, 0xe2, 0x61, 0xfb, 0x84, 0x29, 0x6a, 0x59, 0x63, 0xbf, 0xd5, 0xff, 0x56, + 0xe0, 0x76, 0xe6, 0x1c, 0x59, 0x88, 0xf1, 0x21, 0xd4, 0x3d, 0xd6, 0x0a, 0xf5, 0x32, 0x91, 0x18, + 0x64, 0x81, 0x2a, 0xa4, 0x46, 0x4f, 0x60, 0x9a, 0x9f, 0x6e, 0x38, 0xbc, 0x74, 0x99, 0xe1, 0x53, + 0x6c, 0x8c, 0x26, 0xe6, 0x48, 0xc5, 0x29, 0xe5, 0x8b, 0xe2, 0x94, 0x4a, 0x26, 0x4e, 0xf9, 0x0b, + 0x05, 0xe6, 0x9f, 0x9b, 0xf6, 0xc9, 0x9b, 0x4b, 0xe6, 0xae, 0x9c, 0x7c, 0xfd, 0xbb, 0x02, 0x5d, + 0xba, 0x95, 0xc9, 0x68, 0x2c, 0xb2, 0xd5, 0x0b, 0x42, 0xea, 0x3f, 0x84, 0xaa, 0x65, 0x8e, 0xcc, + 0xd0, 0x26, 0x27, 0x06, 0xcd, 0x9c, 0x12, 0x7d, 0x1b, 0xea, 0xaf, 0x1c, 0xef, 0x0c, 0x7b, 0x86, + 0xb0, 0x9d, 0x49, 0x52, 0x86, 0xa4, 0x68, 0x01, 0x6a, 0x89, 0x5d, 0x14, 0x2d, 0xf5, 0x5f, 0x15, + 0x58, 0xa6, 0xe2, 0x67, 0xce, 0xca, 0xbf, 0x5a, 0x50, 0x42, 0xed, 0x2c, 0x34, 0xf7, 0x10, 0x9a, + 0x1a, 0xc2, 0xde, 0xfd, 0x78, 0x99, 0xe5, 0x4b, 0x2f, 0xb3, 0x48, 0xe0, 0x7f, 0x29, 0x01, 0xa2, + 0x02, 0x7f, 0x0f, 0x07, 0xfa, 0x71, 0xbc, 0xcf, 0x11, 0x07, 0xe5, 0xd2, 0x1c, 0x1e, 0xc3, 0x34, + 0x1e, 0x07, 0xc7, 0x8e, 0x67, 0x06, 0x38, 0x30, 0x4f, 0x2f, 0x93, 0x9e, 0x25, 0x07, 0xa0, 0x4d, + 0xa8, 0x5a, 0xf8, 0x88, 0x58, 0x97, 0x72, 0x62, 0x9c, 0x94, 0x05, 0xf5, 0xa6, 0x3d, 0xf0, 0xcd, + 0x2f, 0x88, 0xd0, 0xb2, 0x89, 0xb2, 0xd6, 0x47, 0xa6, 0x7d, 0x60, 0x7e, 0x41, 0xd8, 0x38, 0xfc, + 0x9a, 0x8f, 0xab, 0x5e, 0x66, 0x1c, 0x7e, 0x4d, 0xc7, 0xa9, 0xaf, 0xa1, 0x43, 0xb7, 0x2b, 0x37, + 0x54, 0xbc, 0xc6, 0xa6, 0xbd, 0x0b, 0x6d, 0x1d, 0xeb, 0xc7, 0x04, 0x1f, 0x59, 0x24, 0x99, 0x60, + 0xcc, 0x46, 0xfd, 0xc2, 0x38, 0xff, 0x5e, 0x81, 0x45, 0xca, 0x3a, 0x3f, 0x20, 0x7c, 0x0b, 0xea, + 0xd4, 0xab, 0xc7, 0xfa, 0x54, 0xa3, 0xcd, 0x4c, 0x50, 0x5a, 0xca, 0x04, 0xa5, 0x6f, 0x50, 0x97, + 0x7e, 0xa1, 0x40, 0x95, 0xe9, 0x11, 0x05, 0xab, 0x11, 0xfd, 0x11, 0x8b, 0x53, 0x67, 0xed, 0x3e, + 0x0d, 0x36, 0x73, 0xd4, 0xa4, 0xf1, 0x26, 0x54, 0x01, 0x41, 0x25, 0x52, 0x83, 0xaa, 0xc6, 0x7e, + 0xab, 0x1f, 0x41, 0x93, 0x49, 0xc4, 0xbc, 0xf3, 0xb7, 0x80, 0x4b, 0x41, 0x72, 0xa3, 0x06, 0x46, + 0xa7, 0x85, 0x14, 0xea, 0xff, 0x28, 0x30, 0x25, 0x9f, 0x72, 0x26, 0xc2, 0xeb, 0x40, 0xdd, 0x1f, + 0xb3, 0x43, 0x08, 0xf1, 0x58, 0x34, 0xe5, 0x7c, 0xba, 0x9c, 0xcc, 0xa7, 0x91, 0xc8, 0xe9, 0x85, + 0x88, 0xd9, 0xb4, 0xbd, 0x9a, 0x4a, 0xdb, 0x53, 0xa8, 0x59, 0xbb, 0x12, 0x6a, 0xae, 0x24, 0x72, + 0xe8, 0x3a, 0xdb, 0x67, 0x39, 0x4f, 0xfe, 0x0a, 0xda, 0xf2, 0x0a, 0xd9, 0x1e, 0x7d, 0x17, 0xa6, + 0x6d, 0x59, 0xb7, 0xc5, 0x4e, 0x25, 0xea, 0x32, 0xf2, 0x20, 0x2d, 0x49, 0x7e, 0x15, 0x85, 0xfe, + 0x1c, 0xe6, 0x35, 0x82, 0x8d, 0x9b, 0x67, 0x51, 0x92, 0xee, 0x97, 0x65, 0xdd, 0x57, 0xff, 0x1c, + 0x16, 0x33, 0x1c, 0x22, 0x8b, 0xf9, 0x6e, 0x4e, 0x0a, 0x75, 0x57, 0x5e, 0x66, 0x8e, 0x70, 0x72, + 0x02, 0xf5, 0x67, 0x50, 0xd6, 0x5c, 0x3d, 0x4f, 0x2d, 0x5c, 0x7c, 0x6e, 0x39, 0x38, 0x0a, 0xd3, + 0x44, 0x93, 0x1a, 0xc5, 0x71, 0x10, 0xb8, 0x03, 0x2a, 0xbd, 0xd0, 0x0b, 0xda, 0xfe, 0x98, 0x9c, + 0xab, 0x2f, 0xa1, 0x7e, 0x40, 0x7c, 0x9a, 0xf8, 0x31, 0xe5, 0x61, 0x47, 0xc8, 0x27, 0x6d, 0x68, + 0x61, 0x33, 0x2e, 0xda, 0x97, 0xa4, 0xa2, 0x3d, 0x55, 0x9f, 0xb1, 0xe1, 0x0e, 0xf8, 0x97, 0xb0, + 0xb6, 0x65, 0xb8, 0x87, 0xac, 0xa2, 0xff, 0xeb, 0x12, 0x4c, 0x27, 0x96, 0xf0, 0x06, 0x77, 0x97, + 0xca, 0x73, 0x4a, 0xed, 0x4f, 0x78, 0x01, 0xde, 0x90, 0x53, 0xda, 0x6a, 0x22, 0xa5, 0x45, 0x0f, + 0x60, 0xd6, 0x25, 0xde, 0xc8, 0x64, 0xeb, 0x1c, 0x78, 0x04, 0x1b, 0x22, 0x80, 0x9c, 0x89, 0xbb, + 0xe9, 0x9e, 0x53, 0x1d, 0x92, 0x08, 0xcf, 0x3c, 0x33, 0xe0, 0xa5, 0xa7, 0xaa, 0x26, 0x4d, 0xf0, + 0x29, 0xed, 0xfe, 0xfd, 0x45, 0x95, 0xea, 0x19, 0xb4, 0x13, 0x3b, 0xbb, 0xad, 0x9f, 0xbc, 0xc9, + 0x02, 0x80, 0xbc, 0xed, 0x95, 0x84, 0x52, 0xef, 0xc2, 0x5c, 0x9a, 0xb1, 0x8f, 0x3e, 0x80, 0x0a, + 0xd6, 0x4f, 0x42, 0x35, 0xbe, 0x23, 0xab, 0x71, 0x9a, 0x58, 0x63, 0x94, 0xea, 0x2e, 0xcc, 0x24, + 0xed, 0x02, 0x3d, 0x82, 0x3a, 0xd7, 0xee, 0x70, 0x9a, 0xc5, 0xc2, 0x69, 0xb4, 0x90, 0x52, 0xfd, + 0x3c, 0x25, 0x0d, 0x73, 0x22, 0xd7, 0x99, 0x49, 0x42, 0x95, 0x52, 0x02, 0x55, 0xfe, 0xaf, 0x04, + 0xb7, 0x5e, 0xb0, 0x7d, 0x17, 0x81, 0x66, 0x68, 0xc0, 0x72, 0xda, 0xa3, 0x5c, 0x29, 0xed, 0xf9, + 0x13, 0x98, 0x32, 0x4c, 0xdf, 0xb5, 0xf0, 0xf9, 0x80, 0x8d, 0x2e, 0x5d, 0x62, 0x74, 0x4b, 0x8c, + 0xd8, 0xc7, 0x4c, 0x73, 0xe4, 0x8c, 0xfa, 0x32, 0x18, 0x25, 0xe5, 0xdb, 0x1f, 0x4a, 0x59, 0x7c, + 0xe5, 0x12, 0x43, 0xa3, 0x1c, 0xff, 0x23, 0x68, 0x58, 0x0e, 0x77, 0xb4, 0x22, 0x66, 0xb9, 0x60, + 0xc1, 0x21, 0x35, 0x1d, 0x49, 0x55, 0xfc, 0x0b, 0xc7, 0x0e, 0x31, 0xe4, 0x82, 0x91, 0x21, 0xb5, + 0xfa, 0xcb, 0x0a, 0x54, 0x5e, 0xf8, 0xc4, 0xcb, 0xf8, 0x39, 0xb9, 0xa0, 0x5c, 0x4a, 0x15, 0x94, + 0xef, 0xa5, 0xf6, 0xb7, 0x2c, 0x4a, 0x19, 0xd2, 0x0e, 0x26, 0x6b, 0x12, 0x95, 0x74, 0x4d, 0x62, + 0x72, 0xa5, 0x23, 0xda, 0x05, 0x51, 0xe9, 0x88, 0xd6, 0xd9, 0x95, 0xd6, 0x29, 0x12, 0xd0, 0xb0, + 0x9d, 0x48, 0x4e, 0x1b, 0xa9, 0xe4, 0xf4, 0x2e, 0xb4, 0xa4, 0x52, 0x0f, 0xf3, 0x04, 0x4d, 0x0d, + 0xe2, 0x4a, 0x0f, 0xf5, 0xb2, 0x7c, 0xbf, 0xe8, 0x67, 0xe0, 0xa3, 0x79, 0x47, 0xdf, 0x40, 0x6f, + 0xc3, 0xf4, 0x10, 0x8f, 0x88, 0xce, 0x2e, 0x7b, 0x28, 0x41, 0x8b, 0xdf, 0xd4, 0xc6, 0x9d, 0x3c, + 0x7f, 0xf7, 0x03, 0x82, 0xd9, 0x25, 0xfc, 0x94, 0x88, 0x17, 0x68, 0xbb, 0xcf, 0x92, 0x09, 0xc7, + 0xb6, 0x4c, 0x9b, 0x74, 0xa6, 0x99, 0xc7, 0x17, 0x2d, 0xba, 0x47, 0xc4, 0x18, 0x92, 0x01, 0xcf, + 0xbc, 0x66, 0x98, 0x07, 0x6c, 0xd2, 0x9e, 0x9d, 0xbc, 0x3a, 0xcc, 0xec, 0x4d, 0x7c, 0x5f, 0xfb, + 0x4a, 0xbe, 0xaf, 0x07, 0x55, 0x56, 0x59, 0x43, 0xef, 0x40, 0x95, 0x1e, 0x7a, 0x68, 0xe6, 0xd9, + 0xd2, 0x21, 0xff, 0xac, 0x7e, 0x5d, 0x82, 0x65, 0xe6, 0xb0, 0x6f, 0x58, 0xab, 0x45, 0x3f, 0x80, + 0x1a, 0xcf, 0x90, 0x85, 0xcd, 0x3e, 0x96, 0x39, 0x4e, 0xe4, 0x90, 0x4d, 0x9f, 0x19, 0xb9, 0x26, + 0xe6, 0xeb, 0xbe, 0x82, 0x85, 0x7c, 0x8a, 0xb8, 0x48, 0xa2, 0x14, 0x15, 0x49, 0x4a, 0xa9, 0x22, + 0x89, 0xac, 0x6a, 0xe5, 0xa4, 0xaa, 0xa9, 0x7f, 0x59, 0x02, 0xc4, 0xe6, 0xbd, 0x29, 0x2e, 0x47, + 0xf0, 0x5b, 0x2e, 0x80, 0xdf, 0x4a, 0x12, 0x50, 0x9e, 0x66, 0xe1, 0xf7, 0x12, 0x89, 0x4f, 0x1a, + 0x9b, 0xf7, 0x72, 0xb0, 0xb9, 0x76, 0xf1, 0x34, 0x69, 0xe0, 0x56, 0x5f, 0x42, 0x37, 0xbb, 0x0b, + 0x7e, 0xec, 0xda, 0x53, 0x00, 0xb2, 0x92, 0x39, 0xe7, 0x7c, 0x14, 0xd9, 0xfc, 0xcd, 0x7d, 0xa8, + 0xed, 0x33, 0x52, 0xf4, 0x29, 0x40, 0xfc, 0x9c, 0x01, 0x25, 0xaf, 0x68, 0xd3, 0xcf, 0x1c, 0xba, + 0x0b, 0x19, 0xe9, 0x77, 0x47, 0x6e, 0x70, 0xae, 0xa2, 0x9f, 0xfe, 0xd7, 0xff, 0xfe, 0x75, 0x69, + 0x4a, 0x85, 0xde, 0xe9, 0x66, 0x8f, 0x17, 0x97, 0xd1, 0x4f, 0x15, 0x40, 0xd9, 0x27, 0x0e, 0xe8, + 0x7e, 0x82, 0x43, 0xd1, 0x13, 0x88, 0xee, 0x7c, 0x02, 0x0b, 0x79, 0xd4, 0xa7, 0x7e, 0xc0, 0xd8, + 0xac, 0xab, 0x77, 0x29, 0x1b, 0x51, 0x3f, 0xe9, 0x61, 0x69, 0x8e, 0x1e, 0x7f, 0xb1, 0xb3, 0x15, + 0x15, 0x57, 0xd2, 0x42, 0x88, 0x07, 0x36, 0x85, 0x42, 0x24, 0x1e, 0x39, 0x5c, 0x57, 0x08, 0xfe, + 0xa4, 0x28, 0x16, 0xe2, 0x27, 0x30, 0x97, 0x79, 0xa5, 0x80, 0xd6, 0x8a, 0x44, 0x90, 0x1f, 0x31, + 0xe4, 0x4b, 0xd0, 0x63, 0x12, 0xbc, 0xab, 0xae, 0x14, 0x4a, 0xc0, 0x1e, 0x04, 0xc5, 0x02, 0x7c, + 0xad, 0xc0, 0xad, 0xbc, 0x67, 0x08, 0xe8, 0x41, 0x91, 0x10, 0xa9, 0xda, 0x56, 0xbe, 0x1c, 0x9b, + 0x4c, 0x8e, 0xf7, 0xd4, 0x7b, 0x85, 0x72, 0x84, 0xd8, 0x10, 0x8b, 0xf2, 0x73, 0x05, 0x16, 0xf2, + 0x9f, 0x0d, 0xa0, 0x77, 0x8b, 0x84, 0xc9, 0x3c, 0x2d, 0xc8, 0x17, 0xe7, 0xdb, 0x4c, 0x9c, 0x0d, + 0xf5, 0xed, 0x42, 0x71, 0x62, 0xa8, 0x29, 0xd6, 0x10, 0xf1, 0x42, 0xa8, 0x50, 0x43, 0x12, 0x8f, + 0x07, 0xae, 0xab, 0x21, 0xdc, 0x8a, 0x0a, 0x35, 0x84, 0x3f, 0x3f, 0x2a, 0xd4, 0x10, 0xf9, 0x71, + 0xc0, 0x75, 0x35, 0x84, 0xa1, 0x6a, 0x2c, 0x00, 0x86, 0x29, 0xf9, 0x7a, 0x1f, 0x25, 0x52, 0xbc, + 0x9c, 0x8b, 0xff, 0x42, 0x4f, 0xd0, 0x61, 0x9c, 0x91, 0xda, 0x8e, 0x3d, 0x41, 0xef, 0x88, 0x8e, + 0x47, 0x3f, 0x80, 0x96, 0x74, 0x59, 0x9b, 0xe4, 0x90, 0x73, 0x8b, 0xdb, 0x45, 0x99, 0xcb, 0x0a, + 0x5f, 0xbd, 0xc5, 0x66, 0x9f, 0x51, 0x9b, 0x74, 0x76, 0x76, 0x73, 0xb1, 0xa5, 0xac, 0xa3, 0x1f, + 0xc2, 0x74, 0xe2, 0xae, 0x14, 0xad, 0x66, 0xef, 0xf8, 0xae, 0xe6, 0xc8, 0xd6, 0x65, 0x47, 0xf6, + 0x33, 0x05, 0xde, 0x2a, 0xb8, 0x43, 0x45, 0xeb, 0x59, 0x4e, 0x45, 0xd0, 0x5a, 0xc8, 0xf3, 0x21, + 0xe3, 0xa9, 0xae, 0xaf, 0x52, 0x9e, 0x12, 0x90, 0xf7, 0xbe, 0x4c, 0x62, 0xfd, 0x57, 0xc8, 0x81, + 0xf9, 0x9c, 0x3b, 0x58, 0xf4, 0x4e, 0x56, 0x88, 0xbc, 0xca, 0xdb, 0x45, 0x67, 0xb6, 0xce, 0xce, + 0x4c, 0x2e, 0x54, 0xa0, 0xd3, 0xf0, 0x16, 0x3a, 0x95, 0x04, 0x3d, 0xb8, 0xe0, 0x12, 0xf5, 0x42, + 0x96, 0xcb, 0x8c, 0xe5, 0x5b, 0x5d, 0x44, 0x59, 0xfa, 0x7c, 0x68, 0xcf, 0x60, 0x13, 0xd1, 0x13, + 0xdd, 0x07, 0x78, 0x46, 0x82, 0xf0, 0x8d, 0x68, 0xc1, 0x24, 0x49, 0xd5, 0x17, 0xc4, 0xea, 0x3c, + 0x9b, 0x79, 0x1a, 0xb5, 0x24, 0xd5, 0x47, 0xcf, 0xa1, 0x11, 0xde, 0x73, 0xa2, 0x44, 0x55, 0x3e, + 0x75, 0xfb, 0xd9, 0x9d, 0x4b, 0xc7, 0x66, 0xbe, 0xda, 0x66, 0x13, 0x02, 0x6a, 0xd0, 0x09, 0xd9, + 0x1d, 0xef, 0x01, 0xb4, 0xfe, 0x94, 0x60, 0x2b, 0x38, 0xd6, 0x8f, 0x89, 0x7e, 0x52, 0x28, 0x5e, + 0xd1, 0xda, 0x85, 0x12, 0xa3, 0xa9, 0xde, 0xb1, 0x34, 0xcb, 0x4f, 0xe0, 0x76, 0xee, 0xfd, 0x1b, + 0x4a, 0x3c, 0x77, 0x98, 0x74, 0x45, 0x57, 0xc8, 0x70, 0x8d, 0x31, 0x5c, 0x51, 0xe7, 0x25, 0x9b, + 0xcc, 0x7a, 0x66, 0x1d, 0xe0, 0xb9, 0x69, 0x9f, 0x08, 0x98, 0x2e, 0x7e, 0x71, 0x58, 0xc8, 0x46, + 0x65, 0x6c, 0xee, 0xa8, 0x6f, 0xc9, 0x4e, 0xc7, 0x32, 0xed, 0x93, 0x10, 0x95, 0x95, 0xf5, 0x90, + 0x89, 0x80, 0xe1, 0xe2, 0x37, 0x83, 0xd7, 0x60, 0x22, 0x50, 0x57, 0x59, 0x47, 0x9f, 0x43, 0x93, + 0x32, 0xe1, 0x38, 0x5b, 0xf8, 0xea, 0xaf, 0x90, 0xc5, 0x3d, 0xc6, 0x62, 0x49, 0x5d, 0xc8, 0xb0, + 0xe0, 0xb0, 0xaa, 0xac, 0x23, 0x1f, 0xa6, 0xe4, 0x1b, 0xa0, 0xa4, 0x33, 0xcb, 0xb9, 0x1b, 0x2a, + 0xe4, 0xb5, 0xce, 0x78, 0xad, 0xa9, 0x8b, 0x19, 0x5e, 0xd9, 0x03, 0x72, 0x60, 0x86, 0x4e, 0x2d, + 0x21, 0xe6, 0xe4, 0x07, 0x75, 0x85, 0x4c, 0xdf, 0x61, 0x4c, 0x57, 0xd5, 0xa5, 0x0c, 0x53, 0x09, + 0x20, 0xe3, 0xc3, 0x12, 0x88, 0x58, 0xfc, 0x2c, 0xee, 0x1a, 0x87, 0x25, 0x00, 0x30, 0x3e, 0x2c, + 0x0e, 0x79, 0x85, 0x0f, 0xdb, 0xae, 0x71, 0x58, 0x1c, 0xe1, 0x94, 0x75, 0xe4, 0xc1, 0x7c, 0xce, + 0x5d, 0x59, 0xd2, 0x6b, 0x16, 0x5f, 0xa6, 0x75, 0x57, 0x8a, 0x9f, 0x3f, 0xd1, 0x51, 0x49, 0x87, + 0x23, 0x2e, 0xd9, 0xd0, 0x3e, 0xb4, 0xe8, 0xc7, 0xd0, 0x86, 0x2f, 0xe5, 0xc1, 0x04, 0x71, 0x88, + 0x41, 0x48, 0xc6, 0xa0, 0x5f, 0x28, 0xb0, 0x90, 0x7f, 0x63, 0x96, 0x0c, 0x9b, 0x26, 0xde, 0xaa, + 0x75, 0xef, 0x4d, 0xbc, 0x28, 0x65, 0xab, 0x11, 0x60, 0x84, 0x2e, 0x06, 0xa3, 0x4f, 0xf9, 0x12, + 0xc5, 0x95, 0x18, 0x5a, 0x49, 0x8b, 0x91, 0xbc, 0x2b, 0xeb, 0xde, 0xce, 0xdc, 0x22, 0x30, 0x7e, + 0x73, 0x8c, 0x5f, 0x0b, 0x31, 0x44, 0x67, 0xb7, 0x0a, 0xe8, 0xc7, 0x30, 0x97, 0xb9, 0x3c, 0x4a, + 0x06, 0x43, 0x45, 0x77, 0x4b, 0xdd, 0x3b, 0x45, 0x05, 0x78, 0xc6, 0x4b, 0xe0, 0x1c, 0xca, 0xe2, + 0xdc, 0xaf, 0x14, 0x7e, 0xbf, 0x97, 0x82, 0xb9, 0xfb, 0x69, 0xa6, 0xf9, 0x20, 0xb7, 0x5c, 0x58, + 0xb7, 0x63, 0x6c, 0xf7, 0x18, 0xdb, 0xc7, 0xa8, 0x23, 0x63, 0xdd, 0x97, 0x71, 0xd6, 0xfa, 0xd5, + 0x67, 0x6b, 0x48, 0x2d, 0xfa, 0xd6, 0xfb, 0x52, 0xd4, 0x37, 0x29, 0xfa, 0xa3, 0x6c, 0x9d, 0x3e, + 0x29, 0x63, 0x61, 0x1d, 0xbf, 0xdb, 0x2d, 0x94, 0xd1, 0x57, 0x17, 0x98, 0x80, 0x6d, 0xb5, 0x25, + 0x09, 0x41, 0x0d, 0xe7, 0x33, 0xa8, 0x6b, 0xae, 0xbe, 0x37, 0xb6, 0x75, 0x34, 0x9b, 0xe0, 0xe2, + 0xea, 0xdd, 0x74, 0x87, 0xfa, 0x3e, 0x9b, 0xe4, 0x81, 0x3a, 0x45, 0x27, 0xf1, 0x5c, 0xbd, 0xf7, + 0xa5, 0x69, 0x7c, 0xb5, 0x15, 0x96, 0xf5, 0x3f, 0xa3, 0x70, 0x27, 0x7d, 0x40, 0x43, 0x98, 0x7a, + 0x61, 0x5b, 0x37, 0xc2, 0x9b, 0x10, 0xd6, 0x12, 0xbe, 0x73, 0x6c, 0xa7, 0x10, 0x27, 0x62, 0x74, + 0x7d, 0xcc, 0x99, 0xc4, 0x28, 0x46, 0x1d, 0x03, 0x5a, 0x9c, 0xd1, 0x75, 0x71, 0xe7, 0x6d, 0xc6, + 0x66, 0x59, 0xed, 0xe4, 0xb0, 0x89, 0x90, 0x67, 0x04, 0x33, 0x9c, 0x4b, 0x84, 0x3d, 0x93, 0x5e, + 0x19, 0x5c, 0x0d, 0x02, 0x04, 0xaf, 0x08, 0x79, 0x18, 0xd0, 0xb5, 0x39, 0xbb, 0x9b, 0xa3, 0x8e, + 0xf0, 0x2c, 0xea, 0x72, 0x0e, 0xcb, 0x24, 0xee, 0x44, 0x47, 0x76, 0x7d, 0xe4, 0x99, 0x74, 0x64, + 0x31, 0xf6, 0x44, 0x47, 0x76, 0x5d, 0xf4, 0x99, 0x74, 0x64, 0x11, 0xfe, 0x60, 0x98, 0x4e, 0x54, + 0xe6, 0x93, 0xe9, 0x49, 0x5e, 0xd1, 0xbe, 0x90, 0x9f, 0xb0, 0xd4, 0xae, 0x1c, 0xdc, 0x52, 0x16, + 0x7f, 0xa3, 0xc0, 0x42, 0x7e, 0x5d, 0x2f, 0x09, 0x0f, 0x13, 0x6b, 0x7f, 0xdd, 0xc9, 0xef, 0x68, + 0xa2, 0xb4, 0xf6, 0x42, 0x68, 0xd8, 0x12, 0xd5, 0x42, 0x14, 0xc0, 0x7c, 0x4e, 0xf9, 0x2a, 0x89, + 0xbc, 0xc5, 0xf5, 0xad, 0x09, 0x7e, 0x75, 0x5b, 0x3f, 0xf1, 0x93, 0x9b, 0x11, 0xbb, 0xad, 0x27, + 0x7f, 0x5b, 0xfa, 0xe5, 0xf6, 0x6f, 0x14, 0x34, 0x86, 0x69, 0x5e, 0xe2, 0x5a, 0xdd, 0xfe, 0xa4, + 0xbf, 0x7a, 0xba, 0xa9, 0x0e, 0xe0, 0xde, 0xe1, 0x31, 0x59, 0x0d, 0x3b, 0xd9, 0x4d, 0xba, 0xbf, + 0xfa, 0xce, 0xea, 0x8e, 0x63, 0x07, 0x9e, 0x79, 0x34, 0x0e, 0x1c, 0xcf, 0x47, 0x6b, 0xc7, 0x41, + 0xe0, 0xfa, 0x5b, 0xbd, 0xde, 0xd0, 0x0c, 0x8e, 0xc7, 0x47, 0x1b, 0xba, 0x33, 0xea, 0x1d, 0x13, + 0xcf, 0x31, 0x75, 0x0b, 0x1f, 0xf9, 0x3d, 0x2e, 0x50, 0xf7, 0xd6, 0x31, 0xb1, 0x2c, 0xe7, 0x71, + 0xfc, 0x81, 0xd2, 0x6d, 0x96, 0x37, 0x37, 0x3e, 0x58, 0x57, 0x94, 0xcd, 0x36, 0x76, 0x5d, 0x4b, + 0x40, 0x4b, 0xef, 0x47, 0xbe, 0x63, 0x6f, 0x65, 0x7a, 0xbc, 0x2d, 0x58, 0x12, 0x82, 0xf8, 0xc4, + 0x3b, 0x25, 0xde, 0xaa, 0xe1, 0xe8, 0xe3, 0x11, 0xb1, 0xf9, 0x5f, 0xca, 0xa1, 0xa5, 0x50, 0x8c, + 0x24, 0x8b, 0x9e, 0xe1, 0xe8, 0x3e, 0x2c, 0xea, 0xce, 0x68, 0x43, 0xfa, 0x10, 0xef, 0xd2, 0x93, + 0x26, 0x9f, 0x74, 0xdb, 0x35, 0x3f, 0x51, 0x3e, 0x2b, 0x63, 0xd7, 0xfc, 0x55, 0xa9, 0xb2, 0xff, + 0xf1, 0x27, 0x4f, 0xfe, 0xb9, 0x24, 0xea, 0x7d, 0x47, 0x35, 0xa6, 0x52, 0x8f, 0xfe, 0x3f, 0x00, + 0x00, 0xff, 0xff, 0x69, 0xb0, 0x53, 0xdc, 0x4a, 0x38, 0x00, 0x00, } diff --git a/api/api.proto b/api/api.proto index 2023cffc4912097028ba0d1137d40627abf89791..cf08c4bed86e4d349f0b260d11c495fe2e8b492c 100644 --- a/api/api.proto +++ b/api/api.proto @@ -572,14 +572,12 @@ message ChannelMessage { string username = 5; // The content payload. string content = 6; - // Another message ID reference, if any. - google.protobuf.StringValue reference_id = 7; // The UNIX time when the message was created. - google.protobuf.Timestamp create_time = 8; + google.protobuf.Timestamp create_time = 7; // The UNIX time when the message was last updated. - google.protobuf.Timestamp update_time = 9; + google.protobuf.Timestamp update_time = 8; // True if the message was persisted to the channel's history, false otherwise. - google.protobuf.BoolValue persistent = 10; + google.protobuf.BoolValue persistent = 9; } // A list of channel messages, usually a result of a list operation. diff --git a/api/api.swagger.json b/api/api.swagger.json index 39520ff28b816eeff92e7dc9da3bd9cb0962a20f..13d1976c4865e2a1a65330c4905385242b814a53 100644 --- a/api/api.swagger.json +++ b/api/api.swagger.json @@ -1524,10 +1524,6 @@ "type": "string", "description": "The content payload." }, - "reference_id": { - "type": "string", - "description": "Another message ID reference, if any." - }, "create_time": { "type": "string", "format": "date-time", diff --git a/migrate/sql/20180103142001_initial_schema.sql b/migrate/sql/20180103142001_initial_schema.sql index d635d5c9eb7e991804d8cdadd356030ecd4c686d..b14d7cde23f403c83d73fa15d6ed98e107b42c20 100644 --- a/migrate/sql/20180103142001_initial_schema.sql +++ b/migrate/sql/20180103142001_initial_schema.sql @@ -104,10 +104,9 @@ CREATE INDEX IF NOT EXISTS collection_read_user_id_key_idx ON storage (collectio CREATE TABLE IF NOT EXISTS message ( PRIMARY KEY (stream_mode, stream_subject, stream_descriptor, stream_label, create_time, id), FOREIGN KEY (sender_id) REFERENCES users (id) ON DELETE CASCADE, - FOREIGN KEY (reference_id) REFERENCES message (id) ON DELETE CASCADE, id UUID UNIQUE NOT NULL, - -- chat(0), chat_update(1), group_join(2), group_add(3), group_leave(4), group_kick(5), group_promoted(6) + -- chat(0), chat_update(1), chat_remove(2), group_join(3), group_add(4), group_leave(5), group_kick(6), group_promoted(7) code SMALLINT DEFAULT 0 NOT NULL, sender_id UUID NOT NULL, username VARCHAR(128) NOT NULL, @@ -116,7 +115,6 @@ CREATE TABLE IF NOT EXISTS message ( stream_descriptor UUID NOT NULL, stream_label VARCHAR(128) NOT NULL, content JSONB DEFAULT '{}' NOT NULL, - reference_id UUID, create_time TIMESTAMPTZ DEFAULT now() NOT NULL, update_time TIMESTAMPTZ DEFAULT now() NOT NULL, diff --git a/rtapi/realtime.pb.go b/rtapi/realtime.pb.go index 0c73a07909389bb591c76c225b3fc2cb0418f9e0..825826acbbf08291a3ddca0151e9510e45b46a41 100644 --- a/rtapi/realtime.pb.go +++ b/rtapi/realtime.pb.go @@ -15,6 +15,7 @@ It has these top-level messages: ChannelMessageAck ChannelMessageSend ChannelMessageUpdate + ChannelMessageRemove ChannelPresenceEvent Error Match @@ -132,7 +133,7 @@ var Error_Code_value = map[string]int32{ func (x Error_Code) String() string { return proto.EnumName(Error_Code_name, int32(x)) } -func (Error_Code) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{8, 0} } +func (Error_Code) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{9, 0} } // An envelope for a realtime message. type Envelope struct { @@ -145,6 +146,7 @@ type Envelope struct { // *Envelope_ChannelMessageAck // *Envelope_ChannelMessageSend // *Envelope_ChannelMessageUpdate + // *Envelope_ChannelMessageRemove // *Envelope_ChannelPresenceEvent // *Envelope_Error // *Envelope_Match @@ -195,56 +197,59 @@ type Envelope_ChannelMessageSend struct { type Envelope_ChannelMessageUpdate struct { ChannelMessageUpdate *ChannelMessageUpdate `protobuf:"bytes,8,opt,name=channel_message_update,json=channelMessageUpdate,oneof"` } +type Envelope_ChannelMessageRemove struct { + ChannelMessageRemove *ChannelMessageRemove `protobuf:"bytes,9,opt,name=channel_message_remove,json=channelMessageRemove,oneof"` +} type Envelope_ChannelPresenceEvent struct { - ChannelPresenceEvent *ChannelPresenceEvent `protobuf:"bytes,9,opt,name=channel_presence_event,json=channelPresenceEvent,oneof"` + ChannelPresenceEvent *ChannelPresenceEvent `protobuf:"bytes,10,opt,name=channel_presence_event,json=channelPresenceEvent,oneof"` } type Envelope_Error struct { - Error *Error `protobuf:"bytes,10,opt,name=error,oneof"` + Error *Error `protobuf:"bytes,11,opt,name=error,oneof"` } type Envelope_Match struct { - Match *Match `protobuf:"bytes,11,opt,name=match,oneof"` + Match *Match `protobuf:"bytes,12,opt,name=match,oneof"` } type Envelope_MatchCreate struct { - MatchCreate *MatchCreate `protobuf:"bytes,12,opt,name=match_create,json=matchCreate,oneof"` + MatchCreate *MatchCreate `protobuf:"bytes,13,opt,name=match_create,json=matchCreate,oneof"` } type Envelope_MatchData struct { - MatchData *MatchData `protobuf:"bytes,13,opt,name=match_data,json=matchData,oneof"` + MatchData *MatchData `protobuf:"bytes,14,opt,name=match_data,json=matchData,oneof"` } type Envelope_MatchDataSend struct { - MatchDataSend *MatchDataSend `protobuf:"bytes,14,opt,name=match_data_send,json=matchDataSend,oneof"` + MatchDataSend *MatchDataSend `protobuf:"bytes,15,opt,name=match_data_send,json=matchDataSend,oneof"` } type Envelope_MatchJoin struct { - MatchJoin *MatchJoin `protobuf:"bytes,15,opt,name=match_join,json=matchJoin,oneof"` + MatchJoin *MatchJoin `protobuf:"bytes,16,opt,name=match_join,json=matchJoin,oneof"` } type Envelope_MatchLeave struct { - MatchLeave *MatchLeave `protobuf:"bytes,16,opt,name=match_leave,json=matchLeave,oneof"` + MatchLeave *MatchLeave `protobuf:"bytes,17,opt,name=match_leave,json=matchLeave,oneof"` } type Envelope_MatchPresenceEvent struct { - MatchPresenceEvent *MatchPresenceEvent `protobuf:"bytes,17,opt,name=match_presence_event,json=matchPresenceEvent,oneof"` + MatchPresenceEvent *MatchPresenceEvent `protobuf:"bytes,18,opt,name=match_presence_event,json=matchPresenceEvent,oneof"` } type Envelope_MatchmakerAdd struct { - MatchmakerAdd *MatchmakerAdd `protobuf:"bytes,18,opt,name=matchmaker_add,json=matchmakerAdd,oneof"` + MatchmakerAdd *MatchmakerAdd `protobuf:"bytes,19,opt,name=matchmaker_add,json=matchmakerAdd,oneof"` } type Envelope_MatchmakerMatched struct { - MatchmakerMatched *MatchmakerMatched `protobuf:"bytes,19,opt,name=matchmaker_matched,json=matchmakerMatched,oneof"` + MatchmakerMatched *MatchmakerMatched `protobuf:"bytes,20,opt,name=matchmaker_matched,json=matchmakerMatched,oneof"` } type Envelope_MatchmakerRemove struct { - MatchmakerRemove *MatchmakerRemove `protobuf:"bytes,20,opt,name=matchmaker_remove,json=matchmakerRemove,oneof"` + MatchmakerRemove *MatchmakerRemove `protobuf:"bytes,21,opt,name=matchmaker_remove,json=matchmakerRemove,oneof"` } type Envelope_MatchmakerTicket struct { - MatchmakerTicket *MatchmakerTicket `protobuf:"bytes,21,opt,name=matchmaker_ticket,json=matchmakerTicket,oneof"` + MatchmakerTicket *MatchmakerTicket `protobuf:"bytes,22,opt,name=matchmaker_ticket,json=matchmakerTicket,oneof"` } type Envelope_Notifications struct { - Notifications *Notifications `protobuf:"bytes,22,opt,name=notifications,oneof"` + Notifications *Notifications `protobuf:"bytes,23,opt,name=notifications,oneof"` } type Envelope_Rpc struct { - Rpc *nakama_api.Rpc `protobuf:"bytes,23,opt,name=rpc,oneof"` + Rpc *nakama_api.Rpc `protobuf:"bytes,24,opt,name=rpc,oneof"` } type Envelope_StreamData struct { - StreamData *StreamData `protobuf:"bytes,24,opt,name=stream_data,json=streamData,oneof"` + StreamData *StreamData `protobuf:"bytes,25,opt,name=stream_data,json=streamData,oneof"` } type Envelope_StreamPresenceEvent struct { - StreamPresenceEvent *StreamPresenceEvent `protobuf:"bytes,25,opt,name=stream_presence_event,json=streamPresenceEvent,oneof"` + StreamPresenceEvent *StreamPresenceEvent `protobuf:"bytes,26,opt,name=stream_presence_event,json=streamPresenceEvent,oneof"` } func (*Envelope_Channel) isEnvelope_Message() {} @@ -254,6 +259,7 @@ func (*Envelope_ChannelMessage) isEnvelope_Message() {} func (*Envelope_ChannelMessageAck) isEnvelope_Message() {} func (*Envelope_ChannelMessageSend) isEnvelope_Message() {} func (*Envelope_ChannelMessageUpdate) isEnvelope_Message() {} +func (*Envelope_ChannelMessageRemove) isEnvelope_Message() {} func (*Envelope_ChannelPresenceEvent) isEnvelope_Message() {} func (*Envelope_Error) isEnvelope_Message() {} func (*Envelope_Match) isEnvelope_Message() {} @@ -335,6 +341,13 @@ func (m *Envelope) GetChannelMessageUpdate() *ChannelMessageUpdate { return nil } +func (m *Envelope) GetChannelMessageRemove() *ChannelMessageRemove { + if x, ok := m.GetMessage().(*Envelope_ChannelMessageRemove); ok { + return x.ChannelMessageRemove + } + return nil +} + func (m *Envelope) GetChannelPresenceEvent() *ChannelPresenceEvent { if x, ok := m.GetMessage().(*Envelope_ChannelPresenceEvent); ok { return x.ChannelPresenceEvent @@ -464,6 +477,7 @@ func (*Envelope) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) erro (*Envelope_ChannelMessageAck)(nil), (*Envelope_ChannelMessageSend)(nil), (*Envelope_ChannelMessageUpdate)(nil), + (*Envelope_ChannelMessageRemove)(nil), (*Envelope_ChannelPresenceEvent)(nil), (*Envelope_Error)(nil), (*Envelope_Match)(nil), @@ -523,88 +537,93 @@ func _Envelope_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { if err := b.EncodeMessage(x.ChannelMessageUpdate); err != nil { return err } - case *Envelope_ChannelPresenceEvent: + case *Envelope_ChannelMessageRemove: b.EncodeVarint(9<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.ChannelMessageRemove); err != nil { + return err + } + case *Envelope_ChannelPresenceEvent: + b.EncodeVarint(10<<3 | proto.WireBytes) if err := b.EncodeMessage(x.ChannelPresenceEvent); err != nil { return err } case *Envelope_Error: - b.EncodeVarint(10<<3 | proto.WireBytes) + b.EncodeVarint(11<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Error); err != nil { return err } case *Envelope_Match: - b.EncodeVarint(11<<3 | proto.WireBytes) + b.EncodeVarint(12<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Match); err != nil { return err } case *Envelope_MatchCreate: - b.EncodeVarint(12<<3 | proto.WireBytes) + b.EncodeVarint(13<<3 | proto.WireBytes) if err := b.EncodeMessage(x.MatchCreate); err != nil { return err } case *Envelope_MatchData: - b.EncodeVarint(13<<3 | proto.WireBytes) + b.EncodeVarint(14<<3 | proto.WireBytes) if err := b.EncodeMessage(x.MatchData); err != nil { return err } case *Envelope_MatchDataSend: - b.EncodeVarint(14<<3 | proto.WireBytes) + b.EncodeVarint(15<<3 | proto.WireBytes) if err := b.EncodeMessage(x.MatchDataSend); err != nil { return err } case *Envelope_MatchJoin: - b.EncodeVarint(15<<3 | proto.WireBytes) + b.EncodeVarint(16<<3 | proto.WireBytes) if err := b.EncodeMessage(x.MatchJoin); err != nil { return err } case *Envelope_MatchLeave: - b.EncodeVarint(16<<3 | proto.WireBytes) + b.EncodeVarint(17<<3 | proto.WireBytes) if err := b.EncodeMessage(x.MatchLeave); err != nil { return err } case *Envelope_MatchPresenceEvent: - b.EncodeVarint(17<<3 | proto.WireBytes) + b.EncodeVarint(18<<3 | proto.WireBytes) if err := b.EncodeMessage(x.MatchPresenceEvent); err != nil { return err } case *Envelope_MatchmakerAdd: - b.EncodeVarint(18<<3 | proto.WireBytes) + b.EncodeVarint(19<<3 | proto.WireBytes) if err := b.EncodeMessage(x.MatchmakerAdd); err != nil { return err } case *Envelope_MatchmakerMatched: - b.EncodeVarint(19<<3 | proto.WireBytes) + b.EncodeVarint(20<<3 | proto.WireBytes) if err := b.EncodeMessage(x.MatchmakerMatched); err != nil { return err } case *Envelope_MatchmakerRemove: - b.EncodeVarint(20<<3 | proto.WireBytes) + b.EncodeVarint(21<<3 | proto.WireBytes) if err := b.EncodeMessage(x.MatchmakerRemove); err != nil { return err } case *Envelope_MatchmakerTicket: - b.EncodeVarint(21<<3 | proto.WireBytes) + b.EncodeVarint(22<<3 | proto.WireBytes) if err := b.EncodeMessage(x.MatchmakerTicket); err != nil { return err } case *Envelope_Notifications: - b.EncodeVarint(22<<3 | proto.WireBytes) + b.EncodeVarint(23<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Notifications); err != nil { return err } case *Envelope_Rpc: - b.EncodeVarint(23<<3 | proto.WireBytes) + b.EncodeVarint(24<<3 | proto.WireBytes) if err := b.EncodeMessage(x.Rpc); err != nil { return err } case *Envelope_StreamData: - b.EncodeVarint(24<<3 | proto.WireBytes) + b.EncodeVarint(25<<3 | proto.WireBytes) if err := b.EncodeMessage(x.StreamData); err != nil { return err } case *Envelope_StreamPresenceEvent: - b.EncodeVarint(25<<3 | proto.WireBytes) + b.EncodeVarint(26<<3 | proto.WireBytes) if err := b.EncodeMessage(x.StreamPresenceEvent); err != nil { return err } @@ -674,7 +693,15 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_ChannelMessageUpdate{msg} return true, err - case 9: // message.channel_presence_event + case 9: // message.channel_message_remove + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(ChannelMessageRemove) + err := b.DecodeMessage(msg) + m.Message = &Envelope_ChannelMessageRemove{msg} + return true, err + case 10: // message.channel_presence_event if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -682,7 +709,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_ChannelPresenceEvent{msg} return true, err - case 10: // message.error + case 11: // message.error if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -690,7 +717,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_Error{msg} return true, err - case 11: // message.match + case 12: // message.match if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -698,7 +725,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_Match{msg} return true, err - case 12: // message.match_create + case 13: // message.match_create if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -706,7 +733,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_MatchCreate{msg} return true, err - case 13: // message.match_data + case 14: // message.match_data if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -714,7 +741,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_MatchData{msg} return true, err - case 14: // message.match_data_send + case 15: // message.match_data_send if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -722,7 +749,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_MatchDataSend{msg} return true, err - case 15: // message.match_join + case 16: // message.match_join if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -730,7 +757,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_MatchJoin{msg} return true, err - case 16: // message.match_leave + case 17: // message.match_leave if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -738,7 +765,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_MatchLeave{msg} return true, err - case 17: // message.match_presence_event + case 18: // message.match_presence_event if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -746,7 +773,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_MatchPresenceEvent{msg} return true, err - case 18: // message.matchmaker_add + case 19: // message.matchmaker_add if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -754,7 +781,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_MatchmakerAdd{msg} return true, err - case 19: // message.matchmaker_matched + case 20: // message.matchmaker_matched if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -762,7 +789,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_MatchmakerMatched{msg} return true, err - case 20: // message.matchmaker_remove + case 21: // message.matchmaker_remove if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -770,7 +797,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_MatchmakerRemove{msg} return true, err - case 21: // message.matchmaker_ticket + case 22: // message.matchmaker_ticket if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -778,7 +805,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_MatchmakerTicket{msg} return true, err - case 22: // message.notifications + case 23: // message.notifications if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -786,7 +813,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_Notifications{msg} return true, err - case 23: // message.rpc + case 24: // message.rpc if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -794,7 +821,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_Rpc{msg} return true, err - case 24: // message.stream_data + case 25: // message.stream_data if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -802,7 +829,7 @@ func _Envelope_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Message = &Envelope_StreamData{msg} return true, err - case 25: // message.stream_presence_event + case 26: // message.stream_presence_event if wire != proto.WireBytes { return true, proto.ErrInternalBadWireType } @@ -854,89 +881,94 @@ func _Envelope_OneofSizer(msg proto.Message) (n int) { n += proto.SizeVarint(8<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s + case *Envelope_ChannelMessageRemove: + s := proto.Size(x.ChannelMessageRemove) + n += proto.SizeVarint(9<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s case *Envelope_ChannelPresenceEvent: s := proto.Size(x.ChannelPresenceEvent) - n += proto.SizeVarint(9<<3 | proto.WireBytes) + n += proto.SizeVarint(10<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_Error: s := proto.Size(x.Error) - n += proto.SizeVarint(10<<3 | proto.WireBytes) + n += proto.SizeVarint(11<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_Match: s := proto.Size(x.Match) - n += proto.SizeVarint(11<<3 | proto.WireBytes) + n += proto.SizeVarint(12<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_MatchCreate: s := proto.Size(x.MatchCreate) - n += proto.SizeVarint(12<<3 | proto.WireBytes) + n += proto.SizeVarint(13<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_MatchData: s := proto.Size(x.MatchData) - n += proto.SizeVarint(13<<3 | proto.WireBytes) + n += proto.SizeVarint(14<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_MatchDataSend: s := proto.Size(x.MatchDataSend) - n += proto.SizeVarint(14<<3 | proto.WireBytes) + n += proto.SizeVarint(15<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_MatchJoin: s := proto.Size(x.MatchJoin) - n += proto.SizeVarint(15<<3 | proto.WireBytes) + n += proto.SizeVarint(16<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_MatchLeave: s := proto.Size(x.MatchLeave) - n += proto.SizeVarint(16<<3 | proto.WireBytes) + n += proto.SizeVarint(17<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_MatchPresenceEvent: s := proto.Size(x.MatchPresenceEvent) - n += proto.SizeVarint(17<<3 | proto.WireBytes) + n += proto.SizeVarint(18<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_MatchmakerAdd: s := proto.Size(x.MatchmakerAdd) - n += proto.SizeVarint(18<<3 | proto.WireBytes) + n += proto.SizeVarint(19<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_MatchmakerMatched: s := proto.Size(x.MatchmakerMatched) - n += proto.SizeVarint(19<<3 | proto.WireBytes) + n += proto.SizeVarint(20<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_MatchmakerRemove: s := proto.Size(x.MatchmakerRemove) - n += proto.SizeVarint(20<<3 | proto.WireBytes) + n += proto.SizeVarint(21<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_MatchmakerTicket: s := proto.Size(x.MatchmakerTicket) - n += proto.SizeVarint(21<<3 | proto.WireBytes) + n += proto.SizeVarint(22<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_Notifications: s := proto.Size(x.Notifications) - n += proto.SizeVarint(22<<3 | proto.WireBytes) + n += proto.SizeVarint(23<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_Rpc: s := proto.Size(x.Rpc) - n += proto.SizeVarint(23<<3 | proto.WireBytes) + n += proto.SizeVarint(24<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_StreamData: s := proto.Size(x.StreamData) - n += proto.SizeVarint(24<<3 | proto.WireBytes) + n += proto.SizeVarint(25<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case *Envelope_StreamPresenceEvent: s := proto.Size(x.StreamPresenceEvent) - n += proto.SizeVarint(25<<3 | proto.WireBytes) + n += proto.SizeVarint(26<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s case nil: @@ -1051,14 +1083,16 @@ type ChannelMessageAck struct { ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId" json:"channel_id,omitempty"` // The unique ID assigned to the message. MessageId string `protobuf:"bytes,2,opt,name=message_id,json=messageId" json:"message_id,omitempty"` + // The code representing a message type or category. + Code *google_protobuf1.Int32Value `protobuf:"bytes,3,opt,name=code" json:"code,omitempty"` // Username of the message sender. - Username string `protobuf:"bytes,3,opt,name=username" json:"username,omitempty"` + Username string `protobuf:"bytes,4,opt,name=username" json:"username,omitempty"` // The UNIX time when the message was created. - CreateTime *google_protobuf.Timestamp `protobuf:"bytes,4,opt,name=create_time,json=createTime" json:"create_time,omitempty"` + CreateTime *google_protobuf.Timestamp `protobuf:"bytes,5,opt,name=create_time,json=createTime" json:"create_time,omitempty"` // The UNIX time when the message was last updated. - UpdateTime *google_protobuf.Timestamp `protobuf:"bytes,5,opt,name=update_time,json=updateTime" json:"update_time,omitempty"` + UpdateTime *google_protobuf.Timestamp `protobuf:"bytes,6,opt,name=update_time,json=updateTime" json:"update_time,omitempty"` // True if the message was persisted to the channel's history, false otherwise. - Persistent *google_protobuf1.BoolValue `protobuf:"bytes,6,opt,name=persistent" json:"persistent,omitempty"` + Persistent *google_protobuf1.BoolValue `protobuf:"bytes,7,opt,name=persistent" json:"persistent,omitempty"` } func (m *ChannelMessageAck) Reset() { *m = ChannelMessageAck{} } @@ -1080,6 +1114,13 @@ func (m *ChannelMessageAck) GetMessageId() string { return "" } +func (m *ChannelMessageAck) GetCode() *google_protobuf1.Int32Value { + if m != nil { + return m.Code + } + return nil +} + func (m *ChannelMessageAck) GetUsername() string { if m != nil { return m.Username @@ -1171,6 +1212,33 @@ func (m *ChannelMessageUpdate) GetContent() string { return "" } +// Remove a message previously sent to a realtime channel. +type ChannelMessageRemove struct { + // The channel the message was sent to. + ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId" json:"channel_id,omitempty"` + // The ID assigned to the message to update. + MessageId string `protobuf:"bytes,2,opt,name=message_id,json=messageId" json:"message_id,omitempty"` +} + +func (m *ChannelMessageRemove) Reset() { *m = ChannelMessageRemove{} } +func (m *ChannelMessageRemove) String() string { return proto.CompactTextString(m) } +func (*ChannelMessageRemove) ProtoMessage() {} +func (*ChannelMessageRemove) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } + +func (m *ChannelMessageRemove) GetChannelId() string { + if m != nil { + return m.ChannelId + } + return "" +} + +func (m *ChannelMessageRemove) GetMessageId() string { + if m != nil { + return m.MessageId + } + return "" +} + // A set of joins and leaves on a particular channel. type ChannelPresenceEvent struct { // The channel identifier this event is for. @@ -1184,7 +1252,7 @@ type ChannelPresenceEvent struct { func (m *ChannelPresenceEvent) Reset() { *m = ChannelPresenceEvent{} } func (m *ChannelPresenceEvent) String() string { return proto.CompactTextString(m) } func (*ChannelPresenceEvent) ProtoMessage() {} -func (*ChannelPresenceEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } +func (*ChannelPresenceEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } func (m *ChannelPresenceEvent) GetChannelId() string { if m != nil { @@ -1220,7 +1288,7 @@ type Error struct { func (m *Error) Reset() { *m = Error{} } func (m *Error) String() string { return proto.CompactTextString(m) } func (*Error) ProtoMessage() {} -func (*Error) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } +func (*Error) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } func (m *Error) GetCode() int32 { if m != nil { @@ -1262,7 +1330,7 @@ type Match struct { func (m *Match) Reset() { *m = Match{} } func (m *Match) String() string { return proto.CompactTextString(m) } func (*Match) ProtoMessage() {} -func (*Match) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } +func (*Match) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } func (m *Match) GetMatchId() string { if m != nil { @@ -1313,7 +1381,7 @@ type MatchCreate struct { func (m *MatchCreate) Reset() { *m = MatchCreate{} } func (m *MatchCreate) String() string { return proto.CompactTextString(m) } func (*MatchCreate) ProtoMessage() {} -func (*MatchCreate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } +func (*MatchCreate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } // Realtime match data received from the server. type MatchData struct { @@ -1330,7 +1398,7 @@ type MatchData struct { func (m *MatchData) Reset() { *m = MatchData{} } func (m *MatchData) String() string { return proto.CompactTextString(m) } func (*MatchData) ProtoMessage() {} -func (*MatchData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } +func (*MatchData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } func (m *MatchData) GetMatchId() string { if m != nil { @@ -1375,7 +1443,7 @@ type MatchDataSend struct { func (m *MatchDataSend) Reset() { *m = MatchDataSend{} } func (m *MatchDataSend) String() string { return proto.CompactTextString(m) } func (*MatchDataSend) ProtoMessage() {} -func (*MatchDataSend) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } +func (*MatchDataSend) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } func (m *MatchDataSend) GetMatchId() string { if m != nil { @@ -1416,7 +1484,7 @@ type MatchJoin struct { func (m *MatchJoin) Reset() { *m = MatchJoin{} } func (m *MatchJoin) String() string { return proto.CompactTextString(m) } func (*MatchJoin) ProtoMessage() {} -func (*MatchJoin) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } +func (*MatchJoin) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } type isMatchJoin_Id interface { isMatchJoin_Id() @@ -1528,7 +1596,7 @@ type MatchLeave struct { func (m *MatchLeave) Reset() { *m = MatchLeave{} } func (m *MatchLeave) String() string { return proto.CompactTextString(m) } func (*MatchLeave) ProtoMessage() {} -func (*MatchLeave) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } +func (*MatchLeave) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } func (m *MatchLeave) GetMatchId() string { if m != nil { @@ -1550,7 +1618,7 @@ type MatchPresenceEvent struct { func (m *MatchPresenceEvent) Reset() { *m = MatchPresenceEvent{} } func (m *MatchPresenceEvent) String() string { return proto.CompactTextString(m) } func (*MatchPresenceEvent) ProtoMessage() {} -func (*MatchPresenceEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } +func (*MatchPresenceEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } func (m *MatchPresenceEvent) GetMatchId() string { if m != nil { @@ -1590,7 +1658,7 @@ type MatchmakerAdd struct { func (m *MatchmakerAdd) Reset() { *m = MatchmakerAdd{} } func (m *MatchmakerAdd) String() string { return proto.CompactTextString(m) } func (*MatchmakerAdd) ProtoMessage() {} -func (*MatchmakerAdd) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } +func (*MatchmakerAdd) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } func (m *MatchmakerAdd) GetMinCount() int32 { if m != nil { @@ -1646,7 +1714,7 @@ type MatchmakerMatched struct { func (m *MatchmakerMatched) Reset() { *m = MatchmakerMatched{} } func (m *MatchmakerMatched) String() string { return proto.CompactTextString(m) } func (*MatchmakerMatched) ProtoMessage() {} -func (*MatchmakerMatched) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } +func (*MatchmakerMatched) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } type isMatchmakerMatched_Id interface { isMatchmakerMatched_Id() @@ -1783,7 +1851,7 @@ func (m *MatchmakerMatched_MatchmakerUser) Reset() { *m = MatchmakerMatc func (m *MatchmakerMatched_MatchmakerUser) String() string { return proto.CompactTextString(m) } func (*MatchmakerMatched_MatchmakerUser) ProtoMessage() {} func (*MatchmakerMatched_MatchmakerUser) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{17, 0} + return fileDescriptor0, []int{18, 0} } func (m *MatchmakerMatched_MatchmakerUser) GetPresence() *UserPresence { @@ -1816,7 +1884,7 @@ type MatchmakerRemove struct { func (m *MatchmakerRemove) Reset() { *m = MatchmakerRemove{} } func (m *MatchmakerRemove) String() string { return proto.CompactTextString(m) } func (*MatchmakerRemove) ProtoMessage() {} -func (*MatchmakerRemove) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } +func (*MatchmakerRemove) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } func (m *MatchmakerRemove) GetTicket() string { if m != nil { @@ -1834,7 +1902,7 @@ type MatchmakerTicket struct { func (m *MatchmakerTicket) Reset() { *m = MatchmakerTicket{} } func (m *MatchmakerTicket) String() string { return proto.CompactTextString(m) } func (*MatchmakerTicket) ProtoMessage() {} -func (*MatchmakerTicket) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } +func (*MatchmakerTicket) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } func (m *MatchmakerTicket) GetTicket() string { if m != nil { @@ -1852,7 +1920,7 @@ type Notifications struct { func (m *Notifications) Reset() { *m = Notifications{} } func (m *Notifications) String() string { return proto.CompactTextString(m) } func (*Notifications) ProtoMessage() {} -func (*Notifications) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } +func (*Notifications) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } func (m *Notifications) GetNotifications() []*nakama_api.Notification { if m != nil { @@ -1876,7 +1944,7 @@ type Stream struct { func (m *Stream) Reset() { *m = Stream{} } func (m *Stream) String() string { return proto.CompactTextString(m) } func (*Stream) ProtoMessage() {} -func (*Stream) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } +func (*Stream) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } func (m *Stream) GetMode() int32 { if m != nil { @@ -1919,7 +1987,7 @@ type StreamData struct { func (m *StreamData) Reset() { *m = StreamData{} } func (m *StreamData) String() string { return proto.CompactTextString(m) } func (*StreamData) ProtoMessage() {} -func (*StreamData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } +func (*StreamData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } func (m *StreamData) GetStream() *Stream { if m != nil { @@ -1955,7 +2023,7 @@ type StreamPresenceEvent struct { func (m *StreamPresenceEvent) Reset() { *m = StreamPresenceEvent{} } func (m *StreamPresenceEvent) String() string { return proto.CompactTextString(m) } func (*StreamPresenceEvent) ProtoMessage() {} -func (*StreamPresenceEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } +func (*StreamPresenceEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } func (m *StreamPresenceEvent) GetStream() *Stream { if m != nil { @@ -1995,7 +2063,7 @@ type UserPresence struct { func (m *UserPresence) Reset() { *m = UserPresence{} } func (m *UserPresence) String() string { return proto.CompactTextString(m) } func (*UserPresence) ProtoMessage() {} -func (*UserPresence) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } +func (*UserPresence) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } func (m *UserPresence) GetUserId() string { if m != nil { @@ -2040,6 +2108,7 @@ func init() { proto.RegisterType((*ChannelMessageAck)(nil), "nakama.realtime.ChannelMessageAck") proto.RegisterType((*ChannelMessageSend)(nil), "nakama.realtime.ChannelMessageSend") proto.RegisterType((*ChannelMessageUpdate)(nil), "nakama.realtime.ChannelMessageUpdate") + proto.RegisterType((*ChannelMessageRemove)(nil), "nakama.realtime.ChannelMessageRemove") proto.RegisterType((*ChannelPresenceEvent)(nil), "nakama.realtime.ChannelPresenceEvent") proto.RegisterType((*Error)(nil), "nakama.realtime.Error") proto.RegisterType((*Match)(nil), "nakama.realtime.Match") @@ -2066,126 +2135,128 @@ func init() { func init() { proto.RegisterFile("rtapi/realtime.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 1922 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x59, 0x4f, 0x73, 0xe3, 0x48, - 0x15, 0xb7, 0x6c, 0xcb, 0x89, 0x5f, 0xe2, 0xc4, 0xe9, 0x38, 0x19, 0xad, 0x87, 0x1d, 0x06, 0xcd, - 0x52, 0x6c, 0x6d, 0x15, 0x4e, 0xed, 0xec, 0x6e, 0x15, 0xcc, 0xc2, 0x16, 0x89, 0xad, 0xc4, 0x1e, - 0x36, 0xb6, 0xab, 0x6d, 0xb3, 0xec, 0x54, 0x51, 0xaa, 0x8e, 0xd4, 0x93, 0x68, 0x63, 0x49, 0x46, - 0x92, 0xb3, 0x13, 0x4e, 0x1c, 0xe1, 0xc2, 0x89, 0x1b, 0x5c, 0x80, 0x1b, 0x47, 0xb8, 0x73, 0xe3, - 0xc0, 0x07, 0xe1, 0x0b, 0x70, 0xe6, 0x40, 0xf5, 0x1f, 0xd9, 0x92, 0xe2, 0x3f, 0xc9, 0x52, 0xb5, - 0x55, 0x7b, 0x1a, 0xf5, 0xeb, 0xdf, 0xfb, 0xbd, 0xf6, 0xeb, 0xf7, 0xfa, 0xbd, 0x37, 0x81, 0x5a, - 0x10, 0x91, 0x89, 0x73, 0x14, 0x50, 0x32, 0x8e, 0x1c, 0x97, 0x36, 0x26, 0x81, 0x1f, 0xf9, 0x68, - 0xd7, 0x23, 0xd7, 0xc4, 0x25, 0x8d, 0x58, 0x5c, 0xff, 0xf6, 0xa5, 0xef, 0x5f, 0x8e, 0xe9, 0x11, - 0xdf, 0xbe, 0x98, 0xbe, 0x3e, 0x62, 0xd2, 0x30, 0x22, 0xee, 0x44, 0x68, 0xd4, 0x9f, 0x64, 0x01, - 0x5f, 0x06, 0x64, 0x32, 0xa1, 0x41, 0x28, 0xf7, 0xdf, 0xbb, 0x74, 0xa2, 0xab, 0xe9, 0x45, 0xc3, - 0xf2, 0xdd, 0xa3, 0x2b, 0x1a, 0xf8, 0x8e, 0x35, 0x26, 0x17, 0xe1, 0x91, 0xb0, 0x73, 0xc4, 0x8e, - 0x40, 0x26, 0x8e, 0xc0, 0xea, 0xff, 0xae, 0xc0, 0xa6, 0xe1, 0xdd, 0xd0, 0xb1, 0x3f, 0xa1, 0xa8, - 0x0a, 0x05, 0xcb, 0xb1, 0x35, 0xe5, 0xa9, 0xf2, 0x6e, 0x19, 0xb3, 0x4f, 0xf4, 0x21, 0x6c, 0x58, - 0x57, 0xc4, 0xf3, 0xe8, 0x58, 0xcb, 0x3f, 0x55, 0xde, 0xdd, 0x7a, 0xae, 0x35, 0x32, 0xc7, 0x6d, - 0x34, 0xc5, 0x7e, 0x3b, 0x87, 0x63, 0x28, 0x3a, 0x86, 0x6d, 0xf9, 0x69, 0x7e, 0xe1, 0x3b, 0x9e, - 0x56, 0xe0, 0xaa, 0xdf, 0x5a, 0xa6, 0xfa, 0xd2, 0x77, 0xbc, 0x76, 0x0e, 0x6f, 0x59, 0xf3, 0x25, - 0x6a, 0x41, 0x25, 0xa6, 0x18, 0x53, 0x72, 0x43, 0xb5, 0x22, 0xe7, 0x78, 0x7b, 0x19, 0xc7, 0xa7, - 0x0c, 0xd4, 0xce, 0xe1, 0xd8, 0x30, 0x5f, 0x23, 0x03, 0x76, 0x63, 0x16, 0x97, 0x86, 0x21, 0xb9, - 0xa4, 0x9a, 0xca, 0x79, 0xea, 0x31, 0x0f, 0xf3, 0x84, 0xa4, 0x38, 0x17, 0x88, 0x76, 0x0e, 0xef, - 0x58, 0x29, 0x09, 0x1a, 0xc2, 0x7e, 0x86, 0xc6, 0x24, 0xd6, 0xb5, 0x56, 0xe2, 0x54, 0xfa, 0xb2, - 0x23, 0x49, 0xed, 0x63, 0xeb, 0xba, 0x9d, 0xc3, 0x7b, 0x56, 0x56, 0x88, 0x3e, 0x83, 0x5a, 0x96, - 0x35, 0xa4, 0x9e, 0xad, 0x6d, 0x70, 0xda, 0x67, 0x6b, 0x68, 0x07, 0xd4, 0xb3, 0xdb, 0x39, 0x8c, - 0xac, 0x3b, 0x52, 0xf4, 0x0b, 0x38, 0xcc, 0x12, 0x4f, 0x27, 0x36, 0x89, 0xa8, 0xb6, 0xc9, 0xa9, - 0xbf, 0xbb, 0x86, 0x7a, 0xc4, 0xc1, 0xed, 0x1c, 0xae, 0x59, 0x0b, 0xe4, 0x49, 0xfa, 0x49, 0x40, - 0x43, 0xea, 0x59, 0xd4, 0xa4, 0x37, 0xd4, 0x8b, 0xb4, 0xf2, 0x6a, 0xfa, 0xbe, 0x44, 0x1b, 0x0c, - 0x9c, 0xa0, 0x4f, 0xc9, 0x51, 0x03, 0x54, 0x1a, 0x04, 0x7e, 0xa0, 0x01, 0x67, 0x3b, 0xbc, 0xc3, - 0x66, 0xb0, 0xdd, 0x76, 0x0e, 0x0b, 0x18, 0xc3, 0xbb, 0x24, 0xb2, 0xae, 0xb4, 0xad, 0x25, 0xf8, - 0x73, 0xb6, 0xcb, 0xf0, 0x1c, 0xc6, 0x82, 0x93, 0x7f, 0x98, 0x56, 0x40, 0x99, 0x4f, 0xb6, 0x97, - 0x04, 0x27, 0x57, 0x6b, 0x72, 0x0c, 0x0b, 0x4e, 0x77, 0xbe, 0x44, 0x1f, 0x03, 0x08, 0x0a, 0x9b, - 0x44, 0x44, 0xab, 0xa4, 0x23, 0x2a, 0x4d, 0xd0, 0x22, 0x11, 0x69, 0xe7, 0x70, 0xd9, 0x8d, 0x17, - 0xa8, 0x0d, 0xbb, 0x73, 0x65, 0x71, 0xe3, 0x3b, 0x9c, 0xe1, 0xc9, 0x72, 0x06, 0x79, 0xd9, 0x15, - 0x37, 0x29, 0x98, 0x1f, 0x83, 0x27, 0xd9, 0xee, 0xaa, 0x63, 0xc8, 0x14, 0x13, 0xc7, 0xe0, 0x09, - 0xf6, 0x09, 0x88, 0x9f, 0x24, 0xd3, 0xab, 0xca, 0xb5, 0x1f, 0x2f, 0xd6, 0x8e, 0x93, 0x4b, 0x98, - 0x13, 0xa9, 0xf5, 0x19, 0xd4, 0x84, 0x7e, 0x26, 0x06, 0xf6, 0x96, 0x44, 0x2f, 0x27, 0xca, 0x46, - 0x00, 0x72, 0xef, 0x48, 0xd1, 0x19, 0xec, 0x70, 0xa9, 0x4b, 0xae, 0x69, 0x60, 0x12, 0xdb, 0xd6, - 0xd0, 0x2a, 0xf7, 0x70, 0xd8, 0xb1, 0x3d, 0x77, 0x4f, 0x2c, 0x40, 0x03, 0x40, 0x09, 0x22, 0xfe, - 0x49, 0x6d, 0x6d, 0x7f, 0x49, 0xd2, 0xce, 0xc9, 0xce, 0x05, 0x92, 0x25, 0xad, 0x9b, 0x15, 0xa2, - 0x3e, 0x24, 0x84, 0x66, 0x40, 0x5d, 0xff, 0x86, 0x6a, 0x35, 0xce, 0xf9, 0x9d, 0x15, 0x9c, 0x98, - 0x03, 0xdb, 0x39, 0x5c, 0x75, 0x33, 0xb2, 0x0c, 0x63, 0xe4, 0x58, 0xd7, 0x34, 0xd2, 0x0e, 0xd6, - 0x32, 0x0e, 0x39, 0x30, 0xcd, 0x28, 0x64, 0xe8, 0x14, 0x2a, 0x9e, 0x1f, 0x39, 0xaf, 0x1d, 0x8b, - 0x44, 0x8e, 0xef, 0x85, 0xda, 0xe1, 0x12, 0x07, 0x76, 0x93, 0x28, 0xe6, 0xc0, 0x94, 0x1a, 0x7a, - 0x06, 0x85, 0x60, 0x62, 0x69, 0x8f, 0xb8, 0xf6, 0x6e, 0xf2, 0xc5, 0xc4, 0x13, 0xab, 0x9d, 0xc3, - 0x6c, 0x97, 0xc5, 0x51, 0x18, 0x05, 0x94, 0xb8, 0x22, 0x19, 0xb4, 0x25, 0x71, 0x34, 0xe0, 0x18, - 0x99, 0x0d, 0x10, 0xce, 0x56, 0xe8, 0x15, 0x1c, 0x48, 0xfd, 0x4c, 0x20, 0xbd, 0xc5, 0x99, 0xde, - 0x59, 0xc2, 0x94, 0x8d, 0xa4, 0xfd, 0xf0, 0xae, 0xf8, 0xa4, 0x0c, 0x1b, 0xf2, 0x01, 0xd4, 0x7f, - 0xab, 0xc0, 0x86, 0x7c, 0x86, 0xd0, 0x0e, 0xe4, 0x67, 0x55, 0x2e, 0xef, 0xb0, 0x3c, 0x2a, 0xc7, - 0xb6, 0x43, 0x2d, 0xff, 0xb4, 0xb0, 0xb0, 0xce, 0x8c, 0x42, 0x1a, 0xc4, 0xec, 0x78, 0x8e, 0x47, - 0xef, 0x43, 0x31, 0xa4, 0xe3, 0xd7, 0xb2, 0xc6, 0xad, 0xd1, 0xe3, 0x50, 0xfd, 0x3f, 0x0a, 0x6c, - 0x25, 0x4a, 0x1f, 0x3a, 0x84, 0x52, 0x44, 0x82, 0x4b, 0x1a, 0xc9, 0x33, 0xc9, 0x15, 0x42, 0x50, - 0x8c, 0x6e, 0x27, 0x94, 0x57, 0x5e, 0x15, 0xf3, 0x6f, 0xf4, 0x23, 0xd8, 0x62, 0x95, 0xde, 0x09, - 0x23, 0x46, 0x28, 0xad, 0xd6, 0x1b, 0xa2, 0x23, 0x68, 0xc4, 0x1d, 0x41, 0xe3, 0xc4, 0xf7, 0xc7, - 0x3f, 0x23, 0xe3, 0x29, 0xc5, 0x49, 0x38, 0x7a, 0x0e, 0xa5, 0x2b, 0xc7, 0xb6, 0xa9, 0x27, 0xcb, - 0xe9, 0x2a, 0x45, 0x89, 0xd4, 0x0d, 0x28, 0x0e, 0x99, 0xe5, 0x1a, 0x54, 0x87, 0x9f, 0xf7, 0x0d, - 0x73, 0xd4, 0x1d, 0xf4, 0x8d, 0x66, 0xe7, 0xb4, 0x63, 0xb4, 0xaa, 0x39, 0xb4, 0x09, 0x45, 0xdc, - 0xeb, 0x9d, 0x57, 0x15, 0x84, 0x60, 0xa7, 0xd5, 0xc1, 0x46, 0x73, 0x68, 0x9e, 0x1b, 0x83, 0xc1, - 0xf1, 0x99, 0x51, 0xcd, 0xa3, 0x32, 0xa8, 0x67, 0xb8, 0x37, 0xea, 0x57, 0x0b, 0xfa, 0xf7, 0x61, - 0x3b, 0x59, 0xaa, 0xd1, 0xdb, 0x00, 0x71, 0x15, 0x99, 0x5d, 0x46, 0x59, 0x4a, 0x3a, 0xb6, 0xfe, - 0x97, 0x3c, 0xec, 0xdd, 0xa9, 0xa3, 0x6b, 0x94, 0xd8, 0x76, 0x5c, 0xf0, 0x1c, 0x9b, 0xbb, 0xad, - 0x8c, 0xcb, 0x52, 0xd2, 0xb1, 0x51, 0x1d, 0x36, 0xa7, 0x21, 0x0d, 0x3c, 0xe2, 0x0a, 0xc7, 0x95, - 0xf1, 0x6c, 0x8d, 0x3e, 0x86, 0x2d, 0x51, 0x0f, 0x4c, 0x76, 0x6b, 0x4b, 0xdd, 0x33, 0x8c, 0x5b, - 0x31, 0x0c, 0x02, 0xce, 0x04, 0x4c, 0x59, 0x14, 0x58, 0xa1, 0xac, 0xae, 0x57, 0x16, 0x70, 0xae, - 0xfc, 0x02, 0x60, 0x76, 0x45, 0x91, 0xec, 0x29, 0x56, 0xdd, 0x4b, 0x02, 0xad, 0x9f, 0x03, 0xba, - 0xdb, 0x15, 0xac, 0xf3, 0x92, 0x06, 0x1b, 0x96, 0xef, 0x71, 0x6b, 0xc2, 0x45, 0xf1, 0x52, 0xf7, - 0xa0, 0xb6, 0xa8, 0x13, 0xf8, 0x3f, 0xdd, 0x9e, 0xb0, 0x57, 0x48, 0xdb, 0xfb, 0x93, 0x32, 0x33, - 0x98, 0xae, 0x01, 0x6b, 0x0c, 0x7e, 0x00, 0x2a, 0x2b, 0x79, 0xf7, 0x4c, 0x56, 0x81, 0x45, 0x1f, - 0x41, 0x89, 0x97, 0xba, 0x50, 0x2b, 0xdc, 0x47, 0x4b, 0x82, 0xf5, 0xff, 0xe6, 0x41, 0xe5, 0x1d, - 0x07, 0x4b, 0x47, 0xcb, 0xb7, 0x29, 0x3f, 0x8e, 0x8a, 0xf9, 0x37, 0xfb, 0x6d, 0x71, 0x63, 0x29, - 0x7d, 0x29, 0x97, 0xe8, 0xc7, 0xf2, 0x57, 0xbf, 0x89, 0xa4, 0xbd, 0x67, 0x8b, 0x1b, 0x99, 0x46, - 0x53, 0xa0, 0x0c, 0x2f, 0x0a, 0x6e, 0x71, 0xac, 0x53, 0x7f, 0x01, 0xdb, 0xc9, 0x0d, 0xd6, 0x9a, - 0x5f, 0xd3, 0xdb, 0xb8, 0x35, 0xbf, 0xa6, 0xb7, 0xa8, 0x06, 0xea, 0x0d, 0x0b, 0x08, 0x69, 0x58, - 0x2c, 0x5e, 0xe4, 0x7f, 0xa0, 0xe8, 0xff, 0x52, 0xa0, 0xd8, 0x64, 0xa7, 0x3b, 0x80, 0x3d, 0x3c, - 0xea, 0x0e, 0x3b, 0xe7, 0x86, 0x69, 0xfc, 0xbc, 0x69, 0xf4, 0x87, 0x9d, 0x5e, 0xb7, 0x9a, 0x43, - 0x1a, 0xd4, 0x46, 0x5d, 0x6c, 0x34, 0x7b, 0x67, 0xdd, 0xce, 0x2b, 0xa3, 0x65, 0xf6, 0x8f, 0x3f, - 0xff, 0xb4, 0x77, 0xdc, 0xaa, 0x2a, 0x68, 0x1f, 0x76, 0xcf, 0x3b, 0x83, 0x41, 0xa7, 0x7b, 0x36, - 0x13, 0xe6, 0x51, 0x05, 0xca, 0x27, 0xc7, 0x2d, 0xb3, 0xd3, 0xed, 0x8f, 0x86, 0xd5, 0x02, 0xc7, - 0x1c, 0x0f, 0x9b, 0x6d, 0xb3, 0xdb, 0x1b, 0x9a, 0xa7, 0xbd, 0x51, 0xb7, 0x55, 0x2d, 0xa2, 0x47, - 0xb0, 0x2f, 0x84, 0x2f, 0x7b, 0x9d, 0xae, 0x89, 0x8d, 0x97, 0x46, 0x73, 0x68, 0xb4, 0xaa, 0x2a, - 0x7a, 0x02, 0xf5, 0xf8, 0x08, 0xa7, 0xa3, 0x6e, 0x93, 0x9d, 0x20, 0xa1, 0x58, 0x5a, 0xb8, 0x3f, - 0x3f, 0xeb, 0x86, 0xfe, 0xeb, 0x3c, 0xa8, 0xbc, 0xe8, 0xa1, 0xb7, 0x60, 0x53, 0x34, 0x1c, 0xb3, - 0x88, 0xd8, 0xe0, 0xeb, 0x8e, 0x8d, 0xde, 0x81, 0x0a, 0x99, 0x46, 0x57, 0x7e, 0xe0, 0x44, 0x24, - 0x72, 0x6e, 0x84, 0x4b, 0x36, 0x71, 0x5a, 0x88, 0x9e, 0x83, 0x3a, 0x26, 0x17, 0x74, 0x3c, 0x1b, - 0x47, 0xb2, 0x39, 0x36, 0x88, 0x02, 0xc7, 0xbb, 0x14, 0x59, 0x26, 0xa0, 0xec, 0xce, 0x43, 0xe7, - 0x57, 0xe2, 0x3d, 0x50, 0x31, 0xff, 0x4e, 0x97, 0x0b, 0xf5, 0x2b, 0x96, 0x8b, 0xd2, 0xfd, 0xcb, - 0x45, 0x05, 0xb6, 0x12, 0xbd, 0xa8, 0xfe, 0x3b, 0x05, 0xca, 0xb3, 0xc6, 0x70, 0x95, 0x57, 0x7e, - 0x08, 0x9b, 0xb1, 0x5d, 0x39, 0xbc, 0xad, 0x31, 0x37, 0x83, 0xa3, 0x47, 0xb0, 0xe1, 0x4f, 0x4c, - 0x1e, 0xed, 0xcc, 0x59, 0x05, 0x5c, 0xf2, 0x27, 0x3c, 0xa2, 0x10, 0x14, 0x79, 0x99, 0x67, 0xfe, - 0xd8, 0xc6, 0xfc, 0x5b, 0xff, 0xbd, 0x02, 0x95, 0x54, 0xa7, 0xba, 0xea, 0x50, 0x09, 0xe6, 0xfc, - 0x42, 0xe6, 0xc2, 0x9c, 0x39, 0xed, 0xe9, 0xe2, 0xc3, 0x3c, 0xad, 0x9f, 0x4a, 0x37, 0xf1, 0x12, - 0xfb, 0x38, 0x7b, 0x22, 0x36, 0xae, 0xc6, 0x67, 0x3a, 0x04, 0x35, 0xf2, 0xaf, 0xa9, 0x27, 0x32, - 0x89, 0x4d, 0x0a, 0x7c, 0x79, 0x52, 0x64, 0x7d, 0x82, 0xfe, 0x3d, 0x80, 0x79, 0x13, 0xbc, 0xe2, - 0xa7, 0xe9, 0x7f, 0x50, 0x00, 0xdd, 0xed, 0x72, 0x57, 0x39, 0xe3, 0xeb, 0x7c, 0xc7, 0xfe, 0x5e, - 0x90, 0xb7, 0x34, 0xeb, 0x8f, 0x1f, 0x43, 0xd9, 0x75, 0x3c, 0xd3, 0xf2, 0xa7, 0x5e, 0x24, 0x1f, - 0xb5, 0x4d, 0xd7, 0xf1, 0x9a, 0x6c, 0xcd, 0x37, 0xc9, 0x1b, 0xb9, 0x99, 0x97, 0x9b, 0xe4, 0x8d, - 0xd8, 0xac, 0x81, 0xfa, 0xcb, 0x29, 0x0d, 0x6e, 0xe5, 0x7b, 0x2e, 0x16, 0x88, 0xc0, 0x5e, 0xc8, - 0x33, 0xc8, 0x9c, 0x04, 0xfe, 0x84, 0x06, 0x91, 0x33, 0xbb, 0xb5, 0x0f, 0x57, 0xf7, 0xee, 0x32, - 0xf3, 0xfa, 0x33, 0x35, 0xf1, 0x18, 0x56, 0xc3, 0x8c, 0x18, 0xd9, 0x80, 0xbc, 0xa9, 0x4b, 0x03, - 0xc7, 0x4a, 0xda, 0x10, 0x39, 0xf8, 0xd1, 0x1a, 0x1b, 0x5d, 0xa1, 0x98, 0x35, 0xb2, 0xe7, 0x65, - 0xe5, 0xf5, 0x26, 0x1c, 0x2c, 0x3c, 0xd0, 0x43, 0x1e, 0xe1, 0x7a, 0x0b, 0x0e, 0x17, 0x5b, 0x5c, - 0xc7, 0xa2, 0x24, 0x9f, 0xf2, 0x7f, 0xa8, 0xb0, 0x77, 0x67, 0x32, 0xe1, 0x0d, 0xa3, 0x98, 0x13, - 0xe2, 0x86, 0x51, 0x34, 0xfe, 0xc9, 0x28, 0xcf, 0x2f, 0x8d, 0xf2, 0x42, 0x2a, 0xca, 0xd1, 0x19, - 0xa8, 0xac, 0x0b, 0x8a, 0xaf, 0xea, 0xfd, 0xf5, 0x93, 0x51, 0x42, 0xc2, 0x42, 0x0d, 0x0b, 0x7d, - 0x64, 0xc8, 0xa7, 0x4d, 0xb4, 0x3f, 0x5f, 0x81, 0x87, 0xab, 0xd7, 0xff, 0x59, 0x80, 0x9d, 0xf4, - 0x46, 0xea, 0x25, 0x53, 0x1e, 0xf6, 0x92, 0x45, 0x8b, 0x82, 0x52, 0x04, 0xcc, 0xd9, 0x83, 0x4f, - 0x78, 0xef, 0x38, 0xfd, 0x72, 0x61, 0x9c, 0x96, 0xb8, 0xd9, 0xf6, 0xc3, 0xcd, 0x7e, 0x13, 0x43, - 0x57, 0xbe, 0x9e, 0xef, 0x41, 0x35, 0x3b, 0x05, 0x2f, 0x0b, 0xdf, 0x34, 0x56, 0xce, 0xb2, 0xcb, - 0xb0, 0x3d, 0xa8, 0xa4, 0xa6, 0x57, 0xf4, 0x49, 0x76, 0xe8, 0x55, 0xb8, 0xb7, 0xb5, 0xe4, 0xd8, - 0x9a, 0xd4, 0xc8, 0x0c, 0xbb, 0xfa, 0x18, 0x4a, 0x62, 0xb2, 0x64, 0x95, 0xc8, 0x4d, 0xf4, 0x79, - 0xae, 0xec, 0xf3, 0xc2, 0xe9, 0xc5, 0x17, 0xd4, 0x9a, 0xf5, 0xcc, 0x72, 0x89, 0x9e, 0x00, 0xd8, - 0x34, 0xb4, 0x02, 0x67, 0x12, 0xf9, 0x81, 0x7c, 0x10, 0x13, 0x12, 0xe6, 0x20, 0xd1, 0x75, 0x14, - 0x85, 0x9b, 0xf9, 0x42, 0xff, 0x8d, 0x02, 0x30, 0x1f, 0x89, 0xd1, 0x11, 0x94, 0xc4, 0xfc, 0x2a, - 0xc3, 0xfb, 0xd1, 0x92, 0xa9, 0x17, 0x4b, 0x18, 0x2b, 0x02, 0x21, 0xf5, 0x6c, 0x1a, 0xdc, 0xaf, - 0xb2, 0x4b, 0x70, 0xaa, 0xc8, 0x96, 0x65, 0xf9, 0xfe, 0x9b, 0x02, 0xfb, 0x0b, 0x66, 0xea, 0x87, - 0x9f, 0xe9, 0xeb, 0xac, 0x66, 0x7f, 0x54, 0x60, 0x3b, 0xb9, 0xc1, 0xfa, 0x0a, 0xf6, 0x0a, 0xcd, - 0x8b, 0x6c, 0x89, 0x2d, 0xc5, 0x70, 0x12, 0xd2, 0x30, 0x74, 0x7c, 0x2f, 0x31, 0x9c, 0x48, 0xc9, - 0x9a, 0x99, 0xf0, 0x69, 0x7a, 0xd6, 0x2e, 0xf2, 0xa6, 0x32, 0x35, 0x4f, 0x1f, 0x32, 0x1f, 0x91, - 0x68, 0x1a, 0xf2, 0x47, 0xaf, 0x8c, 0xe5, 0xea, 0xe4, 0x27, 0x70, 0x60, 0xf9, 0x6e, 0x63, 0xfe, - 0x9f, 0xef, 0xf2, 0x57, 0x9d, 0xec, 0x74, 0xf9, 0xbf, 0x58, 0xfe, 0xb8, 0xbe, 0xf2, 0x4a, 0xe5, - 0x7f, 0x14, 0xf8, 0x73, 0xbe, 0xd8, 0xfd, 0x69, 0xff, 0xe4, 0xaf, 0xf9, 0x92, 0x00, 0x5c, 0x94, - 0x78, 0x57, 0xfa, 0xc1, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x1a, 0x7a, 0xfd, 0x3f, 0x34, 0x18, - 0x00, 0x00, + // 1961 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x59, 0xcd, 0x73, 0xe3, 0x48, + 0x15, 0xb7, 0xfc, 0x95, 0xf8, 0x25, 0x4e, 0x9c, 0x8e, 0x93, 0xd1, 0x7a, 0xd8, 0x61, 0xd0, 0x2c, + 0xc5, 0xd6, 0x56, 0xe1, 0xd4, 0x66, 0x76, 0xab, 0x60, 0x16, 0xb6, 0x48, 0x6c, 0x25, 0xf6, 0xb0, + 0xb1, 0x5d, 0x6d, 0x9b, 0x65, 0xa7, 0x8a, 0x52, 0x29, 0x52, 0x4f, 0xa2, 0x8d, 0xf5, 0x81, 0x24, + 0x67, 0x27, 0x9c, 0x38, 0xc2, 0x85, 0x13, 0x37, 0xb8, 0xc0, 0x91, 0x23, 0xdc, 0x39, 0xc1, 0x81, + 0x3b, 0x7f, 0x09, 0x67, 0x0e, 0x54, 0x7f, 0x48, 0x96, 0xe4, 0xaf, 0x64, 0xb7, 0x6a, 0xaa, 0x38, + 0x45, 0xfd, 0xfa, 0xf7, 0x7e, 0xaf, 0xfd, 0xfa, 0xf5, 0xfb, 0xa8, 0x40, 0xdd, 0x0f, 0x75, 0xcf, + 0x3a, 0xf2, 0x89, 0x3e, 0x09, 0x2d, 0x9b, 0x34, 0x3d, 0xdf, 0x0d, 0x5d, 0xb4, 0xeb, 0xe8, 0x37, + 0xba, 0xad, 0x37, 0x23, 0x71, 0xe3, 0xdb, 0x57, 0xae, 0x7b, 0x35, 0x21, 0x47, 0x6c, 0xfb, 0x72, + 0xfa, 0xfa, 0x88, 0x4a, 0x83, 0x50, 0xb7, 0x3d, 0xae, 0xd1, 0x78, 0x92, 0x05, 0x7c, 0xe5, 0xeb, + 0x9e, 0x47, 0xfc, 0x40, 0xec, 0x7f, 0x70, 0x65, 0x85, 0xd7, 0xd3, 0xcb, 0xa6, 0xe1, 0xda, 0x47, + 0xd7, 0xc4, 0x77, 0x2d, 0x63, 0xa2, 0x5f, 0x06, 0x47, 0xdc, 0xce, 0x11, 0x3d, 0x82, 0xee, 0x59, + 0x1c, 0xab, 0xfc, 0x63, 0x07, 0x36, 0x55, 0xe7, 0x96, 0x4c, 0x5c, 0x8f, 0xa0, 0x1a, 0x14, 0x0c, + 0xcb, 0x94, 0xa5, 0xa7, 0xd2, 0xfb, 0x15, 0x4c, 0x3f, 0xd1, 0x47, 0xb0, 0x61, 0x5c, 0xeb, 0x8e, + 0x43, 0x26, 0x72, 0xfe, 0xa9, 0xf4, 0xfe, 0xd6, 0xb1, 0xdc, 0xcc, 0x1c, 0xb7, 0xd9, 0xe2, 0xfb, + 0x9d, 0x1c, 0x8e, 0xa0, 0xe8, 0x04, 0xb6, 0xc5, 0xa7, 0xf6, 0xa5, 0x6b, 0x39, 0x72, 0x81, 0xa9, + 0x7e, 0x6b, 0x99, 0xea, 0x4b, 0xd7, 0x72, 0x3a, 0x39, 0xbc, 0x65, 0xcc, 0x96, 0xa8, 0x0d, 0xd5, + 0x88, 0x62, 0x42, 0xf4, 0x5b, 0x22, 0x17, 0x19, 0xc7, 0xbb, 0xcb, 0x38, 0x3e, 0xa3, 0xa0, 0x4e, + 0x0e, 0x47, 0x86, 0xd9, 0x1a, 0xa9, 0xb0, 0x1b, 0xb1, 0xd8, 0x24, 0x08, 0xf4, 0x2b, 0x22, 0x97, + 0x18, 0x4f, 0x23, 0xe2, 0xa1, 0x9e, 0x10, 0x14, 0x17, 0x1c, 0xd1, 0xc9, 0xe1, 0x1d, 0x23, 0x25, + 0x41, 0x23, 0xd8, 0xcf, 0xd0, 0x68, 0xba, 0x71, 0x23, 0x97, 0x19, 0x95, 0xb2, 0xec, 0x48, 0x42, + 0xfb, 0xc4, 0xb8, 0xe9, 0xe4, 0xf0, 0x9e, 0x91, 0x15, 0xa2, 0xcf, 0xa1, 0x9e, 0x65, 0x0d, 0x88, + 0x63, 0xca, 0x1b, 0x8c, 0xf6, 0xd9, 0x1a, 0xda, 0x21, 0x71, 0xcc, 0x4e, 0x0e, 0x23, 0x63, 0x4e, + 0x8a, 0x7e, 0x01, 0x87, 0x59, 0xe2, 0xa9, 0x67, 0xea, 0x21, 0x91, 0x37, 0x19, 0xf5, 0x77, 0xd7, + 0x50, 0x8f, 0x19, 0xb8, 0x93, 0xc3, 0x75, 0x63, 0x81, 0x7c, 0x11, 0xbd, 0x4f, 0x6c, 0xf7, 0x96, + 0xc8, 0x95, 0x7b, 0xd1, 0x63, 0x06, 0x9e, 0xa7, 0xe7, 0xf2, 0x24, 0xbd, 0xe7, 0x93, 0x80, 0x38, + 0x06, 0xd1, 0xc8, 0x2d, 0x71, 0x42, 0x19, 0x56, 0xd3, 0x0f, 0x04, 0x5a, 0xa5, 0xe0, 0x04, 0x7d, + 0x4a, 0x8e, 0x9a, 0x50, 0x22, 0xbe, 0xef, 0xfa, 0xf2, 0x16, 0x63, 0x3b, 0x9c, 0x63, 0x53, 0xe9, + 0x6e, 0x27, 0x87, 0x39, 0x8c, 0xe2, 0x6d, 0x3d, 0x34, 0xae, 0xe5, 0xed, 0x25, 0xf8, 0x0b, 0xba, + 0x4b, 0xf1, 0x0c, 0x46, 0x63, 0x9f, 0x7d, 0x68, 0x86, 0x4f, 0xa8, 0xcb, 0xab, 0x4b, 0x62, 0x9f, + 0xa9, 0xb5, 0x18, 0x86, 0xc6, 0xbe, 0x3d, 0x5b, 0xa2, 0x4f, 0x00, 0x38, 0x85, 0xa9, 0x87, 0xba, + 0xbc, 0x93, 0x0e, 0xd8, 0x34, 0x41, 0x5b, 0x0f, 0xf5, 0x4e, 0x0e, 0x57, 0xec, 0x68, 0x81, 0x3a, + 0xb0, 0x3b, 0x53, 0xe6, 0x01, 0xb5, 0xcb, 0x18, 0x9e, 0x2c, 0x67, 0x10, 0xb1, 0x54, 0xb5, 0x93, + 0x82, 0xd9, 0x31, 0xd8, 0x1b, 0xae, 0xad, 0x3a, 0x86, 0x78, 0xc1, 0xfc, 0x18, 0xec, 0xfd, 0x7e, + 0x0a, 0xfc, 0x27, 0x89, 0xd7, 0xbb, 0xc7, 0xb4, 0x1f, 0x2f, 0xd6, 0x8e, 0xde, 0x2e, 0x37, 0xc7, + 0x5f, 0xee, 0xe7, 0x50, 0xe7, 0xfa, 0x99, 0x18, 0x40, 0x4b, 0x1e, 0x07, 0x23, 0xca, 0x46, 0x00, + 0xb2, 0xe7, 0xa4, 0xe8, 0x1c, 0x76, 0x98, 0xd4, 0xd6, 0x6f, 0x88, 0xaf, 0xe9, 0xa6, 0x29, 0xef, + 0xaf, 0x72, 0x0f, 0x83, 0x9d, 0x98, 0x33, 0xf7, 0x44, 0x02, 0x34, 0x04, 0x94, 0x20, 0x62, 0x9f, + 0xc4, 0x94, 0xeb, 0x4b, 0x72, 0xc2, 0x8c, 0xec, 0x82, 0x23, 0x69, 0x4e, 0xb0, 0xb3, 0x42, 0x34, + 0x80, 0x84, 0x30, 0x7a, 0x56, 0x07, 0x8c, 0xf3, 0x3b, 0x2b, 0x38, 0xe3, 0x27, 0x55, 0xb3, 0x33, + 0xb2, 0x0c, 0x63, 0x68, 0x19, 0x37, 0x24, 0x94, 0x0f, 0xd7, 0x32, 0x8e, 0x18, 0x30, 0xcd, 0xc8, + 0x65, 0xe8, 0x0c, 0xaa, 0x8e, 0x1b, 0x5a, 0xaf, 0x2d, 0x43, 0x0f, 0x2d, 0xd7, 0x09, 0xe4, 0x47, + 0x4b, 0x1c, 0xd8, 0x4b, 0xa2, 0xa8, 0x03, 0x53, 0x6a, 0xe8, 0x19, 0x14, 0x7c, 0xcf, 0x90, 0x65, + 0xa6, 0xbd, 0x9b, 0x4c, 0xc8, 0xd8, 0x33, 0x3a, 0x39, 0x4c, 0x77, 0x69, 0x1c, 0x05, 0xa1, 0x4f, + 0x74, 0x9b, 0x3f, 0x86, 0x77, 0x96, 0xc4, 0xd1, 0x90, 0x61, 0xc4, 0x6b, 0x80, 0x20, 0x5e, 0xa1, + 0x57, 0x70, 0x20, 0xf4, 0x33, 0x81, 0xd4, 0x60, 0x4c, 0xef, 0x2d, 0x61, 0xca, 0x46, 0xd2, 0x7e, + 0x30, 0x2f, 0x3e, 0xad, 0xc0, 0x86, 0x48, 0x80, 0xca, 0x6f, 0x25, 0xd8, 0x10, 0x69, 0x08, 0xed, + 0x40, 0x3e, 0x2e, 0xa2, 0x79, 0x8b, 0xbe, 0xa3, 0x4a, 0x64, 0x3b, 0x90, 0xf3, 0x4f, 0x0b, 0x0b, + 0xcb, 0xd8, 0x38, 0x20, 0x7e, 0xc4, 0x8e, 0x67, 0x78, 0xf4, 0x21, 0x14, 0x03, 0x32, 0x79, 0x2d, + 0x4a, 0xe8, 0x1a, 0x3d, 0x06, 0x55, 0xfe, 0x23, 0xc1, 0x56, 0xa2, 0xb2, 0xa2, 0x43, 0x28, 0x87, + 0xba, 0x7f, 0x45, 0x42, 0x71, 0x26, 0xb1, 0x42, 0x08, 0x8a, 0xe1, 0x9d, 0x47, 0x58, 0x61, 0x2f, + 0x61, 0xf6, 0x8d, 0x7e, 0x04, 0x5b, 0xb4, 0x91, 0xb0, 0x82, 0x90, 0x12, 0x0a, 0xab, 0x8d, 0x26, + 0x6f, 0x38, 0x9a, 0x51, 0xc3, 0xd1, 0x3c, 0x75, 0xdd, 0xc9, 0xcf, 0xf4, 0xc9, 0x94, 0xe0, 0x24, + 0x1c, 0x1d, 0x43, 0xf9, 0xda, 0x32, 0x4d, 0xe2, 0x88, 0x6a, 0xbd, 0x4a, 0x51, 0x20, 0x15, 0x15, + 0x8a, 0x23, 0x6a, 0xb9, 0x0e, 0xb5, 0xd1, 0x17, 0x03, 0x55, 0x1b, 0xf7, 0x86, 0x03, 0xb5, 0xd5, + 0x3d, 0xeb, 0xaa, 0xed, 0x5a, 0x0e, 0x6d, 0x42, 0x11, 0xf7, 0xfb, 0x17, 0x35, 0x09, 0x21, 0xd8, + 0x69, 0x77, 0xb1, 0xda, 0x1a, 0x69, 0x17, 0xea, 0x70, 0x78, 0x72, 0xae, 0xd6, 0xf2, 0xa8, 0x02, + 0xa5, 0x73, 0xdc, 0x1f, 0x0f, 0x6a, 0x05, 0xe5, 0xfb, 0xb0, 0x9d, 0xec, 0x04, 0xd0, 0xbb, 0x00, + 0x51, 0x15, 0x89, 0x2f, 0xa3, 0x22, 0x24, 0x5d, 0x53, 0xf9, 0x77, 0x1e, 0xf6, 0xe6, 0xca, 0xf4, + 0x1a, 0x25, 0xba, 0x1d, 0x15, 0x3c, 0xcb, 0x64, 0x6e, 0xab, 0xe0, 0x8a, 0x90, 0x74, 0x4d, 0x74, + 0x04, 0x45, 0xc3, 0x35, 0x23, 0xa7, 0x3d, 0x9e, 0xfb, 0xed, 0x5d, 0x27, 0x7c, 0x7e, 0xcc, 0x7f, + 0x3c, 0x03, 0xa2, 0x06, 0x6c, 0x4e, 0x03, 0xe2, 0x3b, 0xba, 0xcd, 0xdb, 0x9b, 0x0a, 0x8e, 0xd7, + 0xe8, 0x13, 0xd8, 0xe2, 0x05, 0x44, 0xa3, 0xd7, 0x1c, 0x77, 0x2d, 0x59, 0xce, 0x51, 0xd4, 0x1a, + 0x62, 0xe0, 0x70, 0x2a, 0xa0, 0xca, 0xbc, 0xe0, 0x73, 0xe5, 0xf2, 0x7a, 0x65, 0x0e, 0x67, 0xca, + 0x2f, 0x00, 0xe2, 0x3b, 0x0d, 0x45, 0x33, 0xb2, 0xea, 0x22, 0x13, 0x68, 0xe5, 0x02, 0xd0, 0x7c, + 0x97, 0xb2, 0xce, 0xad, 0x32, 0x6c, 0x18, 0xae, 0xc3, 0xac, 0x71, 0x9f, 0x46, 0x4b, 0xc5, 0x81, + 0xfa, 0xa2, 0xce, 0xe4, 0x1b, 0xde, 0x53, 0xc2, 0x5e, 0x21, 0x6d, 0x6f, 0x94, 0xb5, 0x27, 0x72, + 0xe8, 0x37, 0xb2, 0xa7, 0xfc, 0x49, 0x8a, 0x69, 0xd3, 0xa5, 0x68, 0x0d, 0xed, 0x73, 0x28, 0xd1, + 0xca, 0x7b, 0xcf, 0x9c, 0xc1, 0xb1, 0xe8, 0x63, 0x28, 0xb3, 0x8a, 0x1b, 0xc8, 0x85, 0xfb, 0x68, + 0x09, 0xb0, 0xf2, 0xdf, 0x3c, 0x94, 0x58, 0xe3, 0x43, 0xb3, 0x02, 0x8b, 0x62, 0x89, 0x67, 0x05, + 0x16, 0xa8, 0x72, 0x9c, 0xe8, 0xa2, 0x1b, 0x12, 0x4b, 0xf4, 0x63, 0xe1, 0xcb, 0x37, 0xa1, 0xb0, + 0xf7, 0x6c, 0x71, 0x3f, 0xd5, 0x6c, 0x71, 0x94, 0xea, 0x84, 0xfe, 0x1d, 0x8e, 0x74, 0x1a, 0x2f, + 0x60, 0x3b, 0xb9, 0x41, 0x07, 0x90, 0x1b, 0x72, 0x17, 0x0d, 0x20, 0x37, 0xe4, 0x0e, 0xd5, 0xa1, + 0x74, 0x4b, 0xc3, 0x4c, 0x18, 0xe6, 0x8b, 0x17, 0xf9, 0x1f, 0x48, 0xca, 0xbf, 0x24, 0x28, 0xb6, + 0xe8, 0xe9, 0x0e, 0x60, 0x0f, 0x8f, 0x7b, 0xa3, 0xee, 0x85, 0xaa, 0xa9, 0x3f, 0x6f, 0xa9, 0x83, + 0x51, 0xb7, 0xdf, 0xab, 0xe5, 0x90, 0x0c, 0xf5, 0x71, 0x0f, 0xab, 0xad, 0xfe, 0x79, 0xaf, 0xfb, + 0x4a, 0x6d, 0x6b, 0x83, 0x93, 0x2f, 0x3e, 0xeb, 0x9f, 0xb4, 0x6b, 0x12, 0xda, 0x87, 0xdd, 0x8b, + 0xee, 0x70, 0xd8, 0xed, 0x9d, 0xc7, 0xc2, 0x3c, 0xaa, 0x42, 0xe5, 0xf4, 0xa4, 0xad, 0x75, 0x7b, + 0x83, 0xf1, 0xa8, 0x56, 0x60, 0x98, 0x93, 0x51, 0xab, 0xa3, 0xf5, 0xfa, 0x23, 0xed, 0xac, 0x3f, + 0xee, 0xb5, 0x6b, 0x45, 0xf4, 0x08, 0xf6, 0xb9, 0xf0, 0x65, 0xbf, 0xdb, 0xd3, 0xb0, 0xfa, 0x52, + 0x6d, 0x8d, 0xd4, 0x76, 0xad, 0x84, 0x9e, 0x40, 0x23, 0x3a, 0xc2, 0xd9, 0xb8, 0xd7, 0xa2, 0x27, + 0x48, 0x28, 0x96, 0x17, 0xee, 0xcf, 0xce, 0xba, 0xa1, 0xfc, 0x3a, 0x0f, 0x25, 0x56, 0x7b, 0xd1, + 0x3b, 0xb0, 0xc9, 0xfb, 0x9e, 0x38, 0x22, 0x36, 0xd8, 0xba, 0x6b, 0xa2, 0xf7, 0xa0, 0xaa, 0x4f, + 0xc3, 0x6b, 0xd7, 0xb7, 0x42, 0x3d, 0xb4, 0x6e, 0xb9, 0x4b, 0x36, 0x71, 0x5a, 0x88, 0x8e, 0xa1, + 0x34, 0xd1, 0x2f, 0xc9, 0x24, 0x1e, 0xba, 0xb2, 0x2f, 0x77, 0x18, 0xfa, 0x96, 0x73, 0xc5, 0xdf, + 0x2e, 0x87, 0xd2, 0x3b, 0x0f, 0xac, 0x5f, 0xf1, 0x24, 0x54, 0xc2, 0xec, 0x3b, 0x5d, 0xb5, 0x4a, + 0x5f, 0xb3, 0x6a, 0x95, 0xef, 0x5f, 0xb5, 0xaa, 0xb0, 0x95, 0x68, 0x89, 0x95, 0xdf, 0x49, 0x50, + 0x89, 0xfb, 0xd3, 0x55, 0x5e, 0xf9, 0x21, 0x6c, 0x46, 0x76, 0xc5, 0x88, 0xba, 0xc6, 0x5c, 0x0c, + 0x47, 0x8f, 0x60, 0xc3, 0xf5, 0xb4, 0x38, 0x67, 0x17, 0x70, 0xd9, 0xf5, 0x58, 0x44, 0x21, 0x28, + 0xb2, 0x6e, 0x83, 0xfa, 0x63, 0x1b, 0xb3, 0x6f, 0xe5, 0xf7, 0x12, 0x54, 0x53, 0x0d, 0xf3, 0xaa, + 0x43, 0x25, 0x98, 0xf3, 0x0b, 0x99, 0x0b, 0x33, 0xe6, 0xb4, 0xa7, 0x8b, 0x0f, 0xf3, 0xb4, 0x72, + 0x26, 0xdc, 0xc4, 0x2a, 0xfd, 0xe3, 0xec, 0x89, 0xe8, 0x50, 0x1e, 0x9d, 0xe9, 0x10, 0x4a, 0xa1, + 0x7b, 0x43, 0x1c, 0xfe, 0x92, 0xe8, 0xc0, 0xc2, 0x96, 0xa7, 0x45, 0xda, 0xae, 0x28, 0xdf, 0x03, + 0x98, 0xf5, 0xe2, 0x2b, 0x7e, 0x9a, 0xf2, 0x07, 0x09, 0xd0, 0x7c, 0xb3, 0xbd, 0xca, 0x19, 0x6f, + 0x33, 0x8f, 0xfd, 0xad, 0x20, 0x6e, 0x29, 0x6e, 0xd3, 0x1f, 0x43, 0xc5, 0xb6, 0x1c, 0xcd, 0x70, + 0xa7, 0x4e, 0x28, 0x92, 0xda, 0xa6, 0x6d, 0x39, 0x2d, 0xba, 0x66, 0x9b, 0xfa, 0x1b, 0xb1, 0x99, + 0x17, 0x9b, 0xfa, 0x1b, 0xbe, 0x59, 0x87, 0xd2, 0x2f, 0xa7, 0xc4, 0xbf, 0x13, 0x55, 0x82, 0x2f, + 0x90, 0x0e, 0x7b, 0x01, 0x7b, 0x41, 0x9a, 0xe7, 0xbb, 0x1e, 0xf1, 0x43, 0x2b, 0xbe, 0xb5, 0x8f, + 0x56, 0x8f, 0x10, 0xe2, 0xe5, 0x0d, 0x62, 0x35, 0x9e, 0x0c, 0x6b, 0x41, 0x46, 0x8c, 0x4c, 0x40, + 0xce, 0xd4, 0x26, 0xbe, 0x65, 0x24, 0x6d, 0xf0, 0x37, 0xf8, 0xf1, 0x1a, 0x1b, 0x3d, 0xae, 0x98, + 0x35, 0xb2, 0xe7, 0x64, 0xe5, 0x8d, 0x16, 0x1c, 0x2c, 0x3c, 0xd0, 0x43, 0x92, 0x70, 0xa3, 0x0d, + 0x87, 0x8b, 0x2d, 0xae, 0x63, 0x91, 0x92, 0xa9, 0xfc, 0xef, 0x25, 0xd8, 0x9b, 0x1b, 0x90, 0x58, + 0xdf, 0xca, 0xc7, 0x95, 0xa8, 0x6f, 0xe5, 0xf3, 0x47, 0x32, 0xca, 0xf3, 0x4b, 0xa3, 0xbc, 0x90, + 0x8a, 0x72, 0x74, 0x0e, 0x25, 0xda, 0x5b, 0x45, 0x57, 0xf5, 0xe1, 0xfa, 0x01, 0x2d, 0x21, 0xa1, + 0xa1, 0x86, 0xb9, 0x3e, 0x52, 0x45, 0x6a, 0xe3, 0x1d, 0xd9, 0xd7, 0xe0, 0x61, 0xea, 0x8d, 0x7f, + 0x16, 0x60, 0x27, 0xbd, 0x91, 0xca, 0x64, 0xd2, 0xc3, 0x32, 0x59, 0xb8, 0x28, 0x28, 0x79, 0xc0, + 0x9c, 0x3f, 0xf8, 0x84, 0xf7, 0x8e, 0xd3, 0xaf, 0x16, 0xc6, 0x69, 0x99, 0x99, 0xed, 0x3c, 0xdc, + 0xec, 0xff, 0x63, 0xe8, 0x8a, 0xec, 0xf9, 0x01, 0xd4, 0xb2, 0xc3, 0xf8, 0xb2, 0xf0, 0x4d, 0x63, + 0xc5, 0x48, 0xbd, 0x0c, 0xdb, 0x87, 0x6a, 0x6a, 0x88, 0x46, 0x9f, 0x66, 0x67, 0x6f, 0x89, 0x79, + 0x5b, 0x4e, 0x4e, 0xcf, 0x49, 0x8d, 0xcc, 0xcc, 0xad, 0x4c, 0xa0, 0xcc, 0x07, 0x5c, 0x5a, 0x89, + 0xec, 0x44, 0x9f, 0x67, 0x8b, 0x3e, 0x2f, 0x98, 0x5e, 0x7e, 0x49, 0x8c, 0xb8, 0x13, 0x17, 0x4b, + 0xf4, 0x04, 0xc0, 0x24, 0x81, 0xe1, 0x5b, 0x5e, 0xe8, 0xfa, 0x22, 0x21, 0x26, 0x24, 0xd4, 0x41, + 0xbc, 0xeb, 0xe0, 0x73, 0x0c, 0x5f, 0x28, 0xbf, 0x91, 0x00, 0x66, 0x93, 0x39, 0x3a, 0x82, 0x32, + 0x1f, 0xa3, 0x45, 0x78, 0x3f, 0x5a, 0x32, 0x7c, 0x63, 0x01, 0xa3, 0x45, 0x20, 0x20, 0x8e, 0x49, + 0xfc, 0xfb, 0x55, 0x76, 0x01, 0x4e, 0x15, 0xd9, 0x8a, 0x28, 0xdf, 0x7f, 0x95, 0x60, 0x7f, 0xc1, + 0x68, 0xff, 0xf0, 0x33, 0xbd, 0xcd, 0x6a, 0xf6, 0x47, 0x09, 0xb6, 0x93, 0x1b, 0xb4, 0xaf, 0xa0, + 0x59, 0x68, 0x56, 0x64, 0xcb, 0x74, 0xc9, 0x47, 0x90, 0x80, 0x04, 0x81, 0xe5, 0x3a, 0x89, 0x11, + 0x44, 0x48, 0xba, 0x66, 0x6a, 0xd2, 0x2c, 0x64, 0x26, 0xcd, 0xa7, 0xe9, 0x91, 0xbf, 0xc8, 0x9a, + 0xca, 0xd4, 0x58, 0x7f, 0x48, 0x7d, 0xa4, 0x87, 0xd3, 0x80, 0x25, 0xbd, 0x0a, 0x16, 0xab, 0xd3, + 0x9f, 0xc0, 0x81, 0xe1, 0xda, 0xcd, 0xd9, 0xbf, 0x18, 0xc4, 0xaf, 0x3a, 0xdd, 0xe9, 0xb1, 0xbf, + 0x58, 0xfc, 0xb8, 0x81, 0xf4, 0xaa, 0xc4, 0xfe, 0xf5, 0xf1, 0xe7, 0x7c, 0xb1, 0xf7, 0xd3, 0xc1, + 0xe9, 0x5f, 0xf2, 0x65, 0x0e, 0xb8, 0x2c, 0xb3, 0xae, 0xf4, 0xf9, 0xff, 0x02, 0x00, 0x00, 0xff, + 0xff, 0x95, 0x9f, 0x3d, 0x8a, 0x1a, 0x19, 0x00, 0x00, } diff --git a/rtapi/realtime.proto b/rtapi/realtime.proto index aa120959a9b7414097ea04f45dc1a9ba5862b073..b5250fba165e7f9f275111155d542a8b2ae7282e 100644 --- a/rtapi/realtime.proto +++ b/rtapi/realtime.proto @@ -51,40 +51,42 @@ message Envelope { ChannelMessageSend channel_message_send = 7; // Update a message previously sent to a realtime chat channel. ChannelMessageUpdate channel_message_update = 8; + // Remove a message previously sent to a realtime chat channel. + ChannelMessageRemove channel_message_remove = 9; // Presence update for a particular realtime chat channel. - ChannelPresenceEvent channel_presence_event = 9; + ChannelPresenceEvent channel_presence_event = 10; // Describes an error which occurred on the server. - Error error = 10; + Error error = 11; // Incoming information about a realtime match. - Match match = 11; + Match match = 12; // A client to server request to create a realtime match. - MatchCreate match_create = 12; + MatchCreate match_create = 13; // Incoming realtime match data delivered from the server. - MatchData match_data = 13; + MatchData match_data = 14; // A client to server request to send data to a realtime match. - MatchDataSend match_data_send = 14; + MatchDataSend match_data_send = 15; // A client to server request to join a realtime match. - MatchJoin match_join = 15; + MatchJoin match_join = 16; // A client to server request to leave a realtime match. - MatchLeave match_leave = 16; + MatchLeave match_leave = 17; // Presence update for a particular realtime match. - MatchPresenceEvent match_presence_event = 17; + MatchPresenceEvent match_presence_event = 18; // Submit a new matchmaking process request. - MatchmakerAdd matchmaker_add = 18; + MatchmakerAdd matchmaker_add = 19; // A successful matchmaking result. - MatchmakerMatched matchmaker_matched = 19; + MatchmakerMatched matchmaker_matched = 20; // Cancel a matchmaking process using a ticket. - MatchmakerRemove matchmaker_remove = 20; + MatchmakerRemove matchmaker_remove = 21; // A response from starting a new matchmaking process. - MatchmakerTicket matchmaker_ticket = 21; + MatchmakerTicket matchmaker_ticket = 22; // Notifications send by the server. - Notifications notifications = 22; + Notifications notifications = 23; // RPC call or response. - api.Rpc rpc = 23; + api.Rpc rpc = 24; // A data message delivered over a stream. - StreamData stream_data = 24; + StreamData stream_data = 25; // Presence update for a particular stream. - StreamPresenceEvent stream_presence_event = 25; + StreamPresenceEvent stream_presence_event = 26; } } @@ -134,14 +136,16 @@ message ChannelMessageAck { string channel_id = 1; // The unique ID assigned to the message. string message_id = 2; + // The code representing a message type or category. + google.protobuf.Int32Value code = 3; // Username of the message sender. - string username = 3; + string username = 4; // The UNIX time when the message was created. - google.protobuf.Timestamp create_time = 4; + google.protobuf.Timestamp create_time = 5; // The UNIX time when the message was last updated. - google.protobuf.Timestamp update_time = 5; + google.protobuf.Timestamp update_time = 6; // True if the message was persisted to the channel's history, false otherwise. - google.protobuf.BoolValue persistent = 6; + google.protobuf.BoolValue persistent = 7; } // Send a message to a realtime channel. @@ -162,6 +166,14 @@ message ChannelMessageUpdate { string content = 3; } +// Remove a message previously sent to a realtime channel. +message ChannelMessageRemove { + // The channel the message was sent to. + string channel_id = 1; + // The ID assigned to the message to update. + string message_id = 2; +} + // A set of joins and leaves on a particular channel. message ChannelPresenceEvent { // The channel identifier this event is for. diff --git a/server/core_channel.go b/server/core_channel.go index cbd7c4626148c41def7e25cc3b5fb4a82e112797..5c66700bb56542456785606d9ee6f670c032f151 100644 --- a/server/core_channel.go +++ b/server/core_channel.go @@ -82,7 +82,7 @@ func ChannelMessagesList(logger *zap.Logger, db *sql.DB, stream PresenceStream, } } - query := `SELECT id, code, sender_id, username, content, reference_id, create_time, update_time FROM message + query := `SELECT id, code, sender_id, username, content, create_time, update_time FROM message WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3::UUID AND stream_label = $4` if incomingCursor == nil { // Ascending doesn't need an ordering clause. @@ -119,7 +119,6 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3: var dbSenderId string var dbUsername string var dbContent string - var dbReferenceId sql.NullString var dbCreateTime pq.NullTime var dbUpdateTime pq.NullTime for rows.Next() { @@ -137,28 +136,22 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3: break } - err = rows.Scan(&dbId, &dbCode, &dbSenderId, &dbUsername, &dbContent, &dbReferenceId, &dbCreateTime, &dbUpdateTime) + err = rows.Scan(&dbId, &dbCode, &dbSenderId, &dbUsername, &dbContent, &dbCreateTime, &dbUpdateTime) if err != nil { logger.Error("Error parsing listed channel messages", zap.Error(err)) return nil, err } - var refId *wrappers.StringValue - if dbReferenceId.Valid { - refId = &wrappers.StringValue{Value: dbReferenceId.String} - } - messages = append(messages, &api.ChannelMessage{ - ChannelId: channelId, - MessageId: dbId, - Code: &wrappers.Int32Value{Value: dbCode}, - SenderId: dbSenderId, - Username: dbUsername, - Content: dbContent, - ReferenceId: refId, - CreateTime: ×tamp.Timestamp{Seconds: dbCreateTime.Time.Unix()}, - UpdateTime: ×tamp.Timestamp{Seconds: dbUpdateTime.Time.Unix()}, - Persistent: &wrappers.BoolValue{Value: true}, + ChannelId: channelId, + MessageId: dbId, + Code: &wrappers.Int32Value{Value: dbCode}, + SenderId: dbSenderId, + Username: dbUsername, + Content: dbContent, + CreateTime: ×tamp.Timestamp{Seconds: dbCreateTime.Time.Unix()}, + UpdateTime: ×tamp.Timestamp{Seconds: dbUpdateTime.Time.Unix()}, + Persistent: &wrappers.BoolValue{Value: true}, }) // There can only be a previous page if this is a paginated listing. diff --git a/server/pipeline.go b/server/pipeline.go index 71058e19bd0e930545dffec8e5e7690d10167b68..92703cfb508734a42e62b84da5125317f22cea7f 100644 --- a/server/pipeline.go +++ b/server/pipeline.go @@ -126,6 +126,8 @@ func (p *Pipeline) ProcessRequest(logger *zap.Logger, session Session, envelope p.channelMessageSend(logger, session, envelope) case *rtapi.Envelope_ChannelMessageUpdate: p.channelMessageUpdate(logger, session, envelope) + case *rtapi.Envelope_ChannelMessageRemove: + p.channelMessageRemove(logger, session, envelope) case *rtapi.Envelope_MatchCreate: p.matchCreate(logger, session, envelope) case *rtapi.Envelope_MatchDataSend: diff --git a/server/pipeline_channel.go b/server/pipeline_channel.go index 2280aa9caa33baa5fa2aad6c36700a4137319dca..d3575624b2ef41c39804d25556109f5bcad7811d 100644 --- a/server/pipeline_channel.go +++ b/server/pipeline_channel.go @@ -15,18 +15,18 @@ package server import ( - "context" "encoding/json" "fmt" "regexp" "time" "unicode/utf8" - "github.com/cockroachdb/cockroach-go/crdb" + "database/sql" "github.com/golang/protobuf/ptypes/timestamp" "github.com/golang/protobuf/ptypes/wrappers" "github.com/heroiclabs/nakama/api" "github.com/heroiclabs/nakama/rtapi" + "github.com/lib/pq" "github.com/pkg/errors" "github.com/satori/go.uuid" "go.uber.org/zap" @@ -35,6 +35,7 @@ import ( const ( ChannelMessageTypeChat int32 = iota ChannelMessageTypeChatUpdate + ChannelMessageTypeChatRemove ChannelMessageTypeGroupJoin ChannelMessageTypeGroupAdd ChannelMessageTypeGroupKick @@ -295,13 +296,12 @@ func (p *Pipeline) channelMessageSend(logger *zap.Logger, session Session, envel ts := time.Now().Unix() message := &api.ChannelMessage{ - ChannelId: incoming.ChannelId, - MessageId: uuid.Must(uuid.NewV4()).String(), - Code: &wrappers.Int32Value{Value: ChannelMessageTypeChat}, - SenderId: session.UserID().String(), - Username: session.Username(), - Content: incoming.Content, - // No reference ID. + ChannelId: incoming.ChannelId, + MessageId: uuid.Must(uuid.NewV4()).String(), + Code: &wrappers.Int32Value{Value: ChannelMessageTypeChat}, + SenderId: session.UserID().String(), + Username: session.Username(), + Content: incoming.Content, CreateTime: ×tamp.Timestamp{Seconds: ts}, UpdateTime: ×tamp.Timestamp{Seconds: ts}, Persistent: &wrappers.BoolValue{Value: meta.Persistence}, @@ -324,6 +324,7 @@ VALUES ($1, $2, $3, $4, $5, $6::UUID, $7::UUID, $8, $9, CAST($10::BIGINT AS TIME session.Send(&rtapi.Envelope{Cid: envelope.Cid, Message: &rtapi.Envelope_ChannelMessageAck{ChannelMessageAck: &rtapi.ChannelMessageAck{ ChannelId: message.ChannelId, MessageId: message.MessageId, + Code: message.Code, Username: message.Username, CreateTime: message.CreateTime, UpdateTime: message.UpdateTime, @@ -373,71 +374,126 @@ func (p *Pipeline) channelMessageUpdate(logger *zap.Logger, session Session, env ts := time.Now().Unix() message := &api.ChannelMessage{ - ChannelId: incoming.ChannelId, - MessageId: uuid.Must(uuid.NewV4()).String(), - Code: &wrappers.Int32Value{Value: ChannelMessageTypeChatUpdate}, - SenderId: session.UserID().String(), - Username: session.Username(), - Content: incoming.Content, - ReferenceId: &wrappers.StringValue{Value: incoming.MessageId}, - CreateTime: ×tamp.Timestamp{Seconds: ts}, - UpdateTime: ×tamp.Timestamp{Seconds: ts}, - Persistent: &wrappers.BoolValue{Value: meta.Persistence}, + ChannelId: incoming.ChannelId, + MessageId: incoming.MessageId, + Code: &wrappers.Int32Value{Value: ChannelMessageTypeChatUpdate}, + SenderId: session.UserID().String(), + Username: session.Username(), + Content: incoming.Content, + CreateTime: ×tamp.Timestamp{Seconds: ts}, + UpdateTime: ×tamp.Timestamp{Seconds: ts}, + Persistent: &wrappers.BoolValue{Value: meta.Persistence}, } if meta.Persistence { - tx, err := p.db.Begin() + // First find and update the referenced message. + var dbCreateTime pq.NullTime + query := "UPDATE message SET update_time = CAST($5::BIGINT AS TIMESTAMPTZ), username = $4, content = $3 WHERE id = $1 AND sender_id = $2 RETURNING create_time" + err := p.db.QueryRow(query, incoming.MessageId, message.SenderId, message.Content, message.Username, message.UpdateTime.Seconds).Scan(&dbCreateTime) if err != nil { - logger.Error("Could not begin database transaction.", zap.Error(err)) - session.Send(&rtapi.Envelope{Cid: envelope.Cid, Message: &rtapi.Envelope_Error{Error: &rtapi.Error{ - Code: int32(rtapi.Error_RUNTIME_EXCEPTION), - Message: "Could not persist message update to channel history", - }}}) - return + if err == sql.ErrNoRows { + session.Send(&rtapi.Envelope{Cid: envelope.Cid, Message: &rtapi.Envelope_Error{Error: &rtapi.Error{ + Code: int32(rtapi.Error_BAD_INPUT), + Message: "Could not find message to update in channel history", + }}}) + return + } else { + logger.Error("Error persisting channel message update", zap.Error(err)) + session.Send(&rtapi.Envelope{Cid: envelope.Cid, Message: &rtapi.Envelope_Error{Error: &rtapi.Error{ + Code: int32(rtapi.Error_RUNTIME_EXCEPTION), + Message: "Could not persist message update to channel history", + }}}) + return + } } + // Replace the message create time with the real one from DB. + message.CreateTime = ×tamp.Timestamp{Seconds: dbCreateTime.Time.Unix()} + } - err = crdb.ExecuteInTx(context.Background(), tx, func() error { - // First find and update the referenced message. - query := "UPDATE message SET update_time = CAST($5::BIGINT AS TIMESTAMPTZ), username = $4, content = $3 WHERE id = $1 AND sender_id = $2" - result, err := tx.Exec(query, incoming.MessageId, message.SenderId, message.Content, message.Username, message.UpdateTime.Seconds) - if err != nil { - return err - } - if rowsAffected, _ := result.RowsAffected(); rowsAffected != 1 { - return ErrChannelMessageUpdateNotFound - } + session.Send(&rtapi.Envelope{Cid: envelope.Cid, Message: &rtapi.Envelope_ChannelMessageAck{ChannelMessageAck: &rtapi.ChannelMessageAck{ + ChannelId: message.ChannelId, + MessageId: message.MessageId, + Code: message.Code, + Username: message.Username, + CreateTime: message.CreateTime, + UpdateTime: message.UpdateTime, + Persistent: message.Persistent, + }}}) - // Insert update marker message. - query = `INSERT INTO message (id, code, sender_id, username, stream_mode, stream_subject, stream_descriptor, stream_label, content, create_time, update_time) -VALUES ($1, $2, $3, $4, $5, $6::UUID, $7::UUID, $8, $9, CAST($10::BIGINT AS TIMESTAMPTZ), CAST($10::BIGINT AS TIMESTAMPTZ))` - _, err = tx.Exec(query, message.MessageId, message.Code.Value, message.SenderId, message.Username, streamConversionResult.Stream.Mode, streamConversionResult.Stream.Subject, streamConversionResult.Stream.Descriptor, streamConversionResult.Stream.Label, message.Content, message.CreateTime.Seconds) - if err != nil { - return err - } + p.router.SendToStream(logger, streamConversionResult.Stream, &rtapi.Envelope{Message: &rtapi.Envelope_ChannelMessage{ChannelMessage: message}}) +} + +func (p *Pipeline) channelMessageRemove(logger *zap.Logger, session Session, envelope *rtapi.Envelope) { + incoming := envelope.GetChannelMessageRemove() - return nil - }) + if _, err := uuid.FromString(incoming.MessageId); err != nil { + session.Send(&rtapi.Envelope{Cid: envelope.Cid, Message: &rtapi.Envelope_Error{Error: &rtapi.Error{ + Code: int32(rtapi.Error_BAD_INPUT), + Message: "Invalid message identifier", + }}}) + return + } + + streamConversionResult, err := ChannelIdToStream(incoming.ChannelId) + if err != nil { + session.Send(&rtapi.Envelope{Cid: envelope.Cid, Message: &rtapi.Envelope_Error{Error: &rtapi.Error{ + Code: int32(rtapi.Error_BAD_INPUT), + Message: "Invalid channel identifier", + }}}) + return + } + + meta := p.tracker.GetLocalBySessionIDStreamUserID(session.ID(), streamConversionResult.Stream, session.UserID()) + if meta == nil { + session.Send(&rtapi.Envelope{Cid: envelope.Cid, Message: &rtapi.Envelope_Error{Error: &rtapi.Error{ + Code: int32(rtapi.Error_BAD_INPUT), + Message: "Must join channel before removing messages", + }}}) + return + } + + ts := time.Now().Unix() + message := &api.ChannelMessage{ + ChannelId: incoming.ChannelId, + MessageId: incoming.MessageId, + Code: &wrappers.Int32Value{Value: ChannelMessageTypeChatRemove}, + SenderId: session.UserID().String(), + Username: session.Username(), + Content: "{}", + CreateTime: ×tamp.Timestamp{Seconds: ts}, + UpdateTime: ×tamp.Timestamp{Seconds: ts}, + Persistent: &wrappers.BoolValue{Value: meta.Persistence}, + } + + if meta.Persistence { + // First find and remove the referenced message. + var dbCreateTime pq.NullTime + query := "DELETE FROM message WHERE id = $1 AND sender_id = $2 RETURNING create_time" + err := p.db.QueryRow(query, incoming.MessageId, message.SenderId).Scan(&dbCreateTime) if err != nil { - if err == ErrChannelMessageUpdateNotFound { + if err == sql.ErrNoRows { session.Send(&rtapi.Envelope{Cid: envelope.Cid, Message: &rtapi.Envelope_Error{Error: &rtapi.Error{ Code: int32(rtapi.Error_BAD_INPUT), - Message: "Could not find message to update in channel history", + Message: "Could not find message to remove in channel history", }}}) return } else { - logger.Error("Error persisting channel message update", zap.Error(err)) + logger.Error("Error persisting channel message remove", zap.Error(err)) session.Send(&rtapi.Envelope{Cid: envelope.Cid, Message: &rtapi.Envelope_Error{Error: &rtapi.Error{ Code: int32(rtapi.Error_RUNTIME_EXCEPTION), - Message: "Could not persist message update to channel history", + Message: "Could not persist message remove to channel history", }}}) return } } + // Replace the message create time with the real one from DB. + message.CreateTime = ×tamp.Timestamp{Seconds: dbCreateTime.Time.Unix()} } session.Send(&rtapi.Envelope{Cid: envelope.Cid, Message: &rtapi.Envelope_ChannelMessageAck{ChannelMessageAck: &rtapi.ChannelMessageAck{ ChannelId: message.ChannelId, MessageId: message.MessageId, + Code: message.Code, Username: message.Username, CreateTime: message.CreateTime, UpdateTime: message.UpdateTime,