encoding/text: marshal extensions

Change-Id: Ic4a0c5909fb6eca76d22053b143be58c60b67b34
Reviewed-on: https://go-review.googlesource.com/c/154657
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/encoding/textpb/encode.go b/encoding/textpb/encode.go
index 8d4b9cb..c0b04b6 100644
--- a/encoding/textpb/encode.go
+++ b/encoding/textpb/encode.go
@@ -79,49 +79,66 @@
 
 		tname := text.ValueOf(fd.Name())
 		pval := knownFields.Get(num)
-
-		if fd.Cardinality() == pref.Repeated {
-			// Map or repeated fields.
-			var items []text.Value
-			var err error
-			if fd.IsMap() {
-				items, err = o.marshalMap(pval.Map(), fd)
-				if !nerr.Merge(err) {
-					return text.Value{}, err
-				}
-			} else {
-				items, err = o.marshalList(pval.List(), fd)
-				if !nerr.Merge(err) {
-					return text.Value{}, err
-				}
-			}
-
-			// Add each item as key: value field.
-			for _, item := range items {
-				msgFields = append(msgFields, [2]text.Value{tname, item})
-			}
-		} else {
-			// Required or optional fields.
-			tval, err := o.marshalSingular(pval, fd)
-			if !nerr.Merge(err) {
-				return text.Value{}, err
-			}
-			msgFields = append(msgFields, [2]text.Value{tname, tval})
+		var err error
+		msgFields, err = o.appendField(msgFields, tname, pval, fd)
+		if !nerr.Merge(err) {
+			return text.Value{}, err
 		}
 	}
 
-	// Marshal out unknown fields.
+	// Handle extensions.
+	var err error
+	msgFields, err = o.appendExtensions(msgFields, knownFields)
+	if !nerr.Merge(err) {
+		return text.Value{}, err
+	}
+
+	// Handle unknown fields.
 	// TODO: Provide option to exclude or include unknown fields.
 	m.UnknownFields().Range(func(_ pref.FieldNumber, raw pref.RawFields) bool {
 		msgFields = appendUnknown(msgFields, raw)
 		return true
 	})
 
-	// TODO: Handle extensions and Any expansion.
-
 	return text.ValueOf(msgFields), nerr.E
 }
 
+// appendField marshals a protoreflect.Value and appends it to the given [][2]text.Value.
+func (o MarshalOptions) appendField(msgFields [][2]text.Value, tname text.Value, pval pref.Value, fd pref.FieldDescriptor) ([][2]text.Value, error) {
+	var nerr errors.NonFatal
+
+	if fd.Cardinality() == pref.Repeated {
+		// Map or repeated fields.
+		var items []text.Value
+		var err error
+		if fd.IsMap() {
+			items, err = o.marshalMap(pval.Map(), fd)
+			if !nerr.Merge(err) {
+				return msgFields, err
+			}
+		} else {
+			items, err = o.marshalList(pval.List(), fd)
+			if !nerr.Merge(err) {
+				return msgFields, err
+			}
+		}
+
+		// Add each item as key: value field.
+		for _, item := range items {
+			msgFields = append(msgFields, [2]text.Value{tname, item})
+		}
+	} else {
+		// Required or optional fields.
+		tval, err := o.marshalSingular(pval, fd)
+		if !nerr.Merge(err) {
+			return msgFields, err
+		}
+		msgFields = append(msgFields, [2]text.Value{tname, tval})
+	}
+
+	return msgFields, nerr.E
+}
+
 // marshalSingular converts a non-repeated field value to text.Value.
 // This includes all scalar types, enums, messages, and groups.
 func (o MarshalOptions) marshalSingular(val pref.Value, fd pref.FieldDescriptor) (text.Value, error) {
@@ -252,6 +269,41 @@
 	sort.Slice(values, less)
 }
 
+// appendExtensions marshals extension fields and appends them to the given [][2]text.Value.
+func (o MarshalOptions) appendExtensions(msgFields [][2]text.Value, knownFields pref.KnownFields) ([][2]text.Value, error) {
+	var nerr errors.NonFatal
+	xtTypes := knownFields.ExtensionTypes()
+	xtFields := make([][2]text.Value, 0, xtTypes.Len())
+
+	var err error
+	xtTypes.Range(func(xt pref.ExtensionType) bool {
+		// TODO: Handle MessageSet.  Field name should be message_set_extension
+		// of message type without any fields and has message option
+		// message_set_wire_format=true.
+
+		num := xt.Number()
+		if knownFields.Has(num) {
+			// Use string type to produce [name] format.
+			tname := text.ValueOf(string(xt.FullName()))
+			pval := knownFields.Get(num)
+			xtFields, err = o.appendField(xtFields, tname, pval, xt)
+			if err != nil {
+				return false
+			}
+		}
+		return true
+	})
+	if !nerr.Merge(err) {
+		return msgFields, err
+	}
+
+	// Sort extensions lexicographically and append to output.
+	sort.SliceStable(xtFields, func(i, j int) bool {
+		return xtFields[i][0].String() < xtFields[j][0].String()
+	})
+	return append(msgFields, xtFields...), nerr.E
+}
+
 // appendUnknown parses the given []byte and appends field(s) into the given fields slice.
 // This function assumes proper encoding in the given []byte.
 func appendUnknown(fields [][2]text.Value, b []byte) [][2]text.Value {
diff --git a/encoding/textpb/encode_test.go b/encoding/textpb/encode_test.go
index 55f3e77..8b7974e 100644
--- a/encoding/textpb/encode_test.go
+++ b/encoding/textpb/encode_test.go
@@ -9,9 +9,12 @@
 	"strings"
 	"testing"
 
+	"github.com/golang/protobuf/protoapi"
 	"github.com/golang/protobuf/v2/encoding/textpb"
 	"github.com/golang/protobuf/v2/internal/detrand"
 	"github.com/golang/protobuf/v2/internal/encoding/pack"
+	"github.com/golang/protobuf/v2/internal/encoding/wire"
+	"github.com/golang/protobuf/v2/internal/legacy"
 	"github.com/golang/protobuf/v2/internal/scalar"
 	"github.com/golang/protobuf/v2/proto"
 	"github.com/google/go-cmp/cmp"
@@ -47,6 +50,18 @@
 	return p
 }
 
+func setExtension(m proto.Message, xd *protoapi.ExtensionDesc, val interface{}) {
+	xt := legacy.Export{}.ExtensionTypeFromDesc(xd)
+	knownFields := m.ProtoReflect().KnownFields()
+	extTypes := knownFields.ExtensionTypes()
+	extTypes.Register(xt)
+	if val == nil {
+		return
+	}
+	pval := xt.ValueOf(val)
+	knownFields.Set(wire.Number(xd.Field), pval)
+}
+
 func TestMarshal(t *testing.T) {
 	tests := []struct {
 		desc    string
@@ -794,6 +809,161 @@
 102: "hello"
 102: "世界"
 `,
+	}, {
+		desc: "extensions of non-repeated fields",
+		input: func() proto.Message {
+			m := &pb2.Extensions{
+				OptString: scalar.String("non-extension field"),
+				OptBool:   scalar.Bool(true),
+				OptInt32:  scalar.Int32(42),
+			}
+			setExtension(m, pb2.E_OptExtBool, true)
+			setExtension(m, pb2.E_OptExtString, "extension field")
+			setExtension(m, pb2.E_OptExtEnum, pb2.Enum_TENTH)
+			setExtension(m, pb2.E_OptExtNested, &pb2.Nested{
+				OptString: scalar.String("nested in an extension"),
+				OptNested: &pb2.Nested{
+					OptString: scalar.String("another nested in an extension"),
+				},
+			})
+			return m
+		}(),
+		want: `opt_string: "non-extension field"
+opt_bool: true
+opt_int32: 42
+[pb2.opt_ext_bool]: true
+[pb2.opt_ext_enum]: TENTH
+[pb2.opt_ext_nested]: {
+  opt_string: "nested in an extension"
+  opt_nested: {
+    opt_string: "another nested in an extension"
+  }
+}
+[pb2.opt_ext_string]: "extension field"
+`,
+	}, {
+		desc: "registered extension but not set",
+		input: func() proto.Message {
+			m := &pb2.Extensions{}
+			setExtension(m, pb2.E_OptExtNested, nil)
+			return m
+		}(),
+		want: "\n",
+	}, {
+		desc: "extensions of repeated fields",
+		input: func() proto.Message {
+			m := &pb2.Extensions{}
+			setExtension(m, pb2.E_RptExtEnum, &[]pb2.Enum{pb2.Enum_TENTH, 101, pb2.Enum_FIRST})
+			setExtension(m, pb2.E_RptExtFixed32, &[]uint32{42, 47})
+			setExtension(m, pb2.E_RptExtNested, &[]*pb2.Nested{
+				&pb2.Nested{OptString: scalar.String("one")},
+				&pb2.Nested{OptString: scalar.String("two")},
+				&pb2.Nested{OptString: scalar.String("three")},
+			})
+			return m
+		}(),
+		want: `[pb2.rpt_ext_enum]: TENTH
+[pb2.rpt_ext_enum]: 101
+[pb2.rpt_ext_enum]: FIRST
+[pb2.rpt_ext_fixed32]: 42
+[pb2.rpt_ext_fixed32]: 47
+[pb2.rpt_ext_nested]: {
+  opt_string: "one"
+}
+[pb2.rpt_ext_nested]: {
+  opt_string: "two"
+}
+[pb2.rpt_ext_nested]: {
+  opt_string: "three"
+}
+`,
+	}, {
+		desc: "extensions of non-repeated fields in another message",
+		input: func() proto.Message {
+			m := &pb2.Extensions{}
+			setExtension(m, pb2.E_ExtensionsContainer_OptExtBool, true)
+			setExtension(m, pb2.E_ExtensionsContainer_OptExtString, "extension field")
+			setExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TENTH)
+			setExtension(m, pb2.E_ExtensionsContainer_OptExtNested, &pb2.Nested{
+				OptString: scalar.String("nested in an extension"),
+				OptNested: &pb2.Nested{
+					OptString: scalar.String("another nested in an extension"),
+				},
+			})
+			return m
+		}(),
+		want: `[pb2.ExtensionsContainer.opt_ext_bool]: true
+[pb2.ExtensionsContainer.opt_ext_enum]: TENTH
+[pb2.ExtensionsContainer.opt_ext_nested]: {
+  opt_string: "nested in an extension"
+  opt_nested: {
+    opt_string: "another nested in an extension"
+  }
+}
+[pb2.ExtensionsContainer.opt_ext_string]: "extension field"
+`,
+	}, {
+		desc: "extensions of repeated fields in another message",
+		input: func() proto.Message {
+			m := &pb2.Extensions{
+				OptString: scalar.String("non-extension field"),
+				OptBool:   scalar.Bool(true),
+				OptInt32:  scalar.Int32(42),
+			}
+			setExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, &[]pb2.Enum{pb2.Enum_TENTH, 101, pb2.Enum_FIRST})
+			setExtension(m, pb2.E_ExtensionsContainer_RptExtString, &[]string{"hello", "world"})
+			setExtension(m, pb2.E_ExtensionsContainer_RptExtNested, &[]*pb2.Nested{
+				&pb2.Nested{OptString: scalar.String("one")},
+				&pb2.Nested{OptString: scalar.String("two")},
+				&pb2.Nested{OptString: scalar.String("three")},
+			})
+			return m
+		}(),
+		want: `opt_string: "non-extension field"
+opt_bool: true
+opt_int32: 42
+[pb2.ExtensionsContainer.rpt_ext_enum]: TENTH
+[pb2.ExtensionsContainer.rpt_ext_enum]: 101
+[pb2.ExtensionsContainer.rpt_ext_enum]: FIRST
+[pb2.ExtensionsContainer.rpt_ext_nested]: {
+  opt_string: "one"
+}
+[pb2.ExtensionsContainer.rpt_ext_nested]: {
+  opt_string: "two"
+}
+[pb2.ExtensionsContainer.rpt_ext_nested]: {
+  opt_string: "three"
+}
+[pb2.ExtensionsContainer.rpt_ext_string]: "hello"
+[pb2.ExtensionsContainer.rpt_ext_string]: "world"
+`,
+		/* TODO: test for MessageSet
+		   	}, {
+		   		desc: "MessageSet",
+		   		input: func() proto.Message {
+		   			m := &pb2.MessageSet{}
+		   			setExtension(m, pb2.E_MessageSetExtension_MessageSetExtension, &pb2.MessageSetExtension{
+		   				OptString: scalar.String("a messageset extension"),
+		   			})
+		   			setExtension(m, pb2.E_MessageSetExtension_NotMessageSetExtension, &pb2.MessageSetExtension{
+		   				OptString: scalar.String("not a messageset extension"),
+		   			})
+		   			setExtension(m, pb2.E_MessageSetExtension_ExtNested, &pb2.Nested{
+		   				OptString: scalar.String("just a regular extension"),
+		   			})
+		   			return m
+		   		}(),
+		   		want: `[pb2.MessageSetExtension]: {
+		     opt_string: "a messageset extension"
+		   }
+		   [pb2.MessageSetExtension.ext_nested]: {
+		     opt_string: "just a regular extension"
+		   }
+		   [pb2.MessageSetExtension.not_message_set_extension]: {
+		     opt_string: "not a messageset extension"
+		   }
+		   `,
+		*/
 	}}
 
 	for _, tt := range tests {
diff --git a/encoding/textpb/testprotos/pb2/test.pb.go b/encoding/textpb/testprotos/pb2/test.pb.go
index d731089..61388ba 100644
--- a/encoding/textpb/testprotos/pb2/test.pb.go
+++ b/encoding/textpb/testprotos/pb2/test.pb.go
@@ -1058,7 +1058,6 @@
 	return nil
 }
 
-// Following messages are for testing required field nested in optional, repeated and map fields.
 type NestedWithRequired struct {
 	ReqString            *string  `protobuf:"bytes,1,req,name=req_string,json=reqString" json:"req_string,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -1189,6 +1188,252 @@
 	return nil
 }
 
+type Extensions struct {
+	OptString                    *string  `protobuf:"bytes,1,opt,name=opt_string,json=optString" json:"opt_string,omitempty"`
+	OptBool                      *bool    `protobuf:"varint,101,opt,name=opt_bool,json=optBool" json:"opt_bool,omitempty"`
+	OptInt32                     *int32   `protobuf:"varint,2,opt,name=opt_int32,json=optInt32" json:"opt_int32,omitempty"`
+	XXX_NoUnkeyedLiteral         struct{} `json:"-"`
+	proto.XXX_InternalExtensions `json:"-"`
+	XXX_unrecognized             []byte `json:"-"`
+	XXX_sizecache                int32  `json:"-"`
+}
+
+type xxx_Extensions struct{ m *Extensions }
+
+func (m *Extensions) ProtoReflect() protoreflect.Message {
+	return xxx_Extensions{m}
+}
+func (m xxx_Extensions) Type() protoreflect.MessageType {
+	return xxx_Test_ProtoFile_MessageTypes[11].Type
+}
+func (m xxx_Extensions) KnownFields() protoreflect.KnownFields {
+	return xxx_Test_ProtoFile_MessageTypes[11].KnownFieldsOf(m.m)
+}
+func (m xxx_Extensions) UnknownFields() protoreflect.UnknownFields {
+	return xxx_Test_ProtoFile_MessageTypes[11].UnknownFieldsOf(m.m)
+}
+func (m xxx_Extensions) Interface() protoreflect.ProtoMessage {
+	return m.m
+}
+
+func (m *Extensions) Reset()         { *m = Extensions{} }
+func (m *Extensions) String() string { return proto.CompactTextString(m) }
+func (*Extensions) ProtoMessage()    {}
+func (*Extensions) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8d7acc1bcec9a72, []int{11}
+}
+
+var extRange_Extensions = []proto.ExtensionRange{
+	{Start: 20, End: 100},
+}
+
+func (*Extensions) ExtensionRangeArray() []proto.ExtensionRange {
+	return extRange_Extensions
+}
+
+func (m *Extensions) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Extensions.Unmarshal(m, b)
+}
+func (m *Extensions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Extensions.Marshal(b, m, deterministic)
+}
+func (m *Extensions) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Extensions.Merge(m, src)
+}
+func (m *Extensions) XXX_Size() int {
+	return xxx_messageInfo_Extensions.Size(m)
+}
+func (m *Extensions) XXX_DiscardUnknown() {
+	xxx_messageInfo_Extensions.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Extensions proto.InternalMessageInfo
+
+func (m *Extensions) GetOptString() string {
+	if m != nil && m.OptString != nil {
+		return *m.OptString
+	}
+	return ""
+}
+
+func (m *Extensions) GetOptBool() bool {
+	if m != nil && m.OptBool != nil {
+		return *m.OptBool
+	}
+	return false
+}
+
+func (m *Extensions) GetOptInt32() int32 {
+	if m != nil && m.OptInt32 != nil {
+		return *m.OptInt32
+	}
+	return 0
+}
+
+type ExtensionsContainer struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+type xxx_ExtensionsContainer struct{ m *ExtensionsContainer }
+
+func (m *ExtensionsContainer) ProtoReflect() protoreflect.Message {
+	return xxx_ExtensionsContainer{m}
+}
+func (m xxx_ExtensionsContainer) Type() protoreflect.MessageType {
+	return xxx_Test_ProtoFile_MessageTypes[12].Type
+}
+func (m xxx_ExtensionsContainer) KnownFields() protoreflect.KnownFields {
+	return xxx_Test_ProtoFile_MessageTypes[12].KnownFieldsOf(m.m)
+}
+func (m xxx_ExtensionsContainer) UnknownFields() protoreflect.UnknownFields {
+	return xxx_Test_ProtoFile_MessageTypes[12].UnknownFieldsOf(m.m)
+}
+func (m xxx_ExtensionsContainer) Interface() protoreflect.ProtoMessage {
+	return m.m
+}
+
+func (m *ExtensionsContainer) Reset()         { *m = ExtensionsContainer{} }
+func (m *ExtensionsContainer) String() string { return proto.CompactTextString(m) }
+func (*ExtensionsContainer) ProtoMessage()    {}
+func (*ExtensionsContainer) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8d7acc1bcec9a72, []int{12}
+}
+
+func (m *ExtensionsContainer) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExtensionsContainer.Unmarshal(m, b)
+}
+func (m *ExtensionsContainer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExtensionsContainer.Marshal(b, m, deterministic)
+}
+func (m *ExtensionsContainer) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExtensionsContainer.Merge(m, src)
+}
+func (m *ExtensionsContainer) XXX_Size() int {
+	return xxx_messageInfo_ExtensionsContainer.Size(m)
+}
+func (m *ExtensionsContainer) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExtensionsContainer.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExtensionsContainer proto.InternalMessageInfo
+
+type MessageSet struct {
+	XXX_NoUnkeyedLiteral         struct{} `json:"-"`
+	proto.XXX_InternalExtensions `protobuf_messageset:"1" json:"-"`
+	XXX_unrecognized             []byte `json:"-"`
+	XXX_sizecache                int32  `json:"-"`
+}
+
+type xxx_MessageSet struct{ m *MessageSet }
+
+func (m *MessageSet) ProtoReflect() protoreflect.Message {
+	return xxx_MessageSet{m}
+}
+func (m xxx_MessageSet) Type() protoreflect.MessageType {
+	return xxx_Test_ProtoFile_MessageTypes[13].Type
+}
+func (m xxx_MessageSet) KnownFields() protoreflect.KnownFields {
+	return xxx_Test_ProtoFile_MessageTypes[13].KnownFieldsOf(m.m)
+}
+func (m xxx_MessageSet) UnknownFields() protoreflect.UnknownFields {
+	return xxx_Test_ProtoFile_MessageTypes[13].UnknownFieldsOf(m.m)
+}
+func (m xxx_MessageSet) Interface() protoreflect.ProtoMessage {
+	return m.m
+}
+
+func (m *MessageSet) Reset()         { *m = MessageSet{} }
+func (m *MessageSet) String() string { return proto.CompactTextString(m) }
+func (*MessageSet) ProtoMessage()    {}
+func (*MessageSet) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8d7acc1bcec9a72, []int{13}
+}
+
+var extRange_MessageSet = []proto.ExtensionRange{
+	{Start: 4, End: 2147483646},
+}
+
+func (*MessageSet) ExtensionRangeArray() []proto.ExtensionRange {
+	return extRange_MessageSet
+}
+
+func (m *MessageSet) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MessageSet.Unmarshal(m, b)
+}
+func (m *MessageSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MessageSet.Marshal(b, m, deterministic)
+}
+func (m *MessageSet) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MessageSet.Merge(m, src)
+}
+func (m *MessageSet) XXX_Size() int {
+	return xxx_messageInfo_MessageSet.Size(m)
+}
+func (m *MessageSet) XXX_DiscardUnknown() {
+	xxx_messageInfo_MessageSet.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MessageSet proto.InternalMessageInfo
+
+type MessageSetExtension struct {
+	OptString            *string  `protobuf:"bytes,1,opt,name=opt_string,json=optString" json:"opt_string,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+type xxx_MessageSetExtension struct{ m *MessageSetExtension }
+
+func (m *MessageSetExtension) ProtoReflect() protoreflect.Message {
+	return xxx_MessageSetExtension{m}
+}
+func (m xxx_MessageSetExtension) Type() protoreflect.MessageType {
+	return xxx_Test_ProtoFile_MessageTypes[14].Type
+}
+func (m xxx_MessageSetExtension) KnownFields() protoreflect.KnownFields {
+	return xxx_Test_ProtoFile_MessageTypes[14].KnownFieldsOf(m.m)
+}
+func (m xxx_MessageSetExtension) UnknownFields() protoreflect.UnknownFields {
+	return xxx_Test_ProtoFile_MessageTypes[14].UnknownFieldsOf(m.m)
+}
+func (m xxx_MessageSetExtension) Interface() protoreflect.ProtoMessage {
+	return m.m
+}
+
+func (m *MessageSetExtension) Reset()         { *m = MessageSetExtension{} }
+func (m *MessageSetExtension) String() string { return proto.CompactTextString(m) }
+func (*MessageSetExtension) ProtoMessage()    {}
+func (*MessageSetExtension) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8d7acc1bcec9a72, []int{14}
+}
+
+func (m *MessageSetExtension) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MessageSetExtension.Unmarshal(m, b)
+}
+func (m *MessageSetExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MessageSetExtension.Marshal(b, m, deterministic)
+}
+func (m *MessageSetExtension) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MessageSetExtension.Merge(m, src)
+}
+func (m *MessageSetExtension) XXX_Size() int {
+	return xxx_messageInfo_MessageSetExtension.Size(m)
+}
+func (m *MessageSetExtension) XXX_DiscardUnknown() {
+	xxx_messageInfo_MessageSetExtension.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MessageSetExtension proto.InternalMessageInfo
+
+func (m *MessageSetExtension) GetOptString() string {
+	if m != nil && m.OptString != nil {
+		return *m.OptString
+	}
+	return ""
+}
+
 // Message contains well-known type fields.
 type KnownTypes struct {
 	OptBool              *wrappers.BoolValue   `protobuf:"bytes,1,opt,name=opt_bool,json=optBool" json:"opt_bool,omitempty"`
@@ -1218,13 +1463,13 @@
 	return xxx_KnownTypes{m}
 }
 func (m xxx_KnownTypes) Type() protoreflect.MessageType {
-	return xxx_Test_ProtoFile_MessageTypes[11].Type
+	return xxx_Test_ProtoFile_MessageTypes[15].Type
 }
 func (m xxx_KnownTypes) KnownFields() protoreflect.KnownFields {
-	return xxx_Test_ProtoFile_MessageTypes[11].KnownFieldsOf(m.m)
+	return xxx_Test_ProtoFile_MessageTypes[15].KnownFieldsOf(m.m)
 }
 func (m xxx_KnownTypes) UnknownFields() protoreflect.UnknownFields {
-	return xxx_Test_ProtoFile_MessageTypes[11].UnknownFieldsOf(m.m)
+	return xxx_Test_ProtoFile_MessageTypes[15].UnknownFieldsOf(m.m)
 }
 func (m xxx_KnownTypes) Interface() protoreflect.ProtoMessage {
 	return m.m
@@ -1234,7 +1479,7 @@
 func (m *KnownTypes) String() string { return proto.CompactTextString(m) }
 func (*KnownTypes) ProtoMessage()    {}
 func (*KnownTypes) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c8d7acc1bcec9a72, []int{11}
+	return fileDescriptor_c8d7acc1bcec9a72, []int{15}
 }
 
 func (m *KnownTypes) XXX_Unmarshal(b []byte) error {
@@ -1383,13 +1628,13 @@
 	return xxx_Nests_OptGroup{m}
 }
 func (m xxx_Nests_OptGroup) Type() protoreflect.MessageType {
-	return xxx_Test_ProtoFile_MessageTypes[12].Type
+	return xxx_Test_ProtoFile_MessageTypes[16].Type
 }
 func (m xxx_Nests_OptGroup) KnownFields() protoreflect.KnownFields {
-	return xxx_Test_ProtoFile_MessageTypes[12].KnownFieldsOf(m.m)
+	return xxx_Test_ProtoFile_MessageTypes[16].KnownFieldsOf(m.m)
 }
 func (m xxx_Nests_OptGroup) UnknownFields() protoreflect.UnknownFields {
-	return xxx_Test_ProtoFile_MessageTypes[12].UnknownFieldsOf(m.m)
+	return xxx_Test_ProtoFile_MessageTypes[16].UnknownFieldsOf(m.m)
 }
 func (m xxx_Nests_OptGroup) Interface() protoreflect.ProtoMessage {
 	return m.m
@@ -1461,13 +1706,13 @@
 	return xxx_Nests_RptGroup{m}
 }
 func (m xxx_Nests_RptGroup) Type() protoreflect.MessageType {
-	return xxx_Test_ProtoFile_MessageTypes[13].Type
+	return xxx_Test_ProtoFile_MessageTypes[17].Type
 }
 func (m xxx_Nests_RptGroup) KnownFields() protoreflect.KnownFields {
-	return xxx_Test_ProtoFile_MessageTypes[13].KnownFieldsOf(m.m)
+	return xxx_Test_ProtoFile_MessageTypes[17].KnownFieldsOf(m.m)
 }
 func (m xxx_Nests_RptGroup) UnknownFields() protoreflect.UnknownFields {
-	return xxx_Test_ProtoFile_MessageTypes[13].UnknownFieldsOf(m.m)
+	return xxx_Test_ProtoFile_MessageTypes[17].UnknownFieldsOf(m.m)
 }
 func (m xxx_Nests_RptGroup) Interface() protoreflect.ProtoMessage {
 	return m.m
@@ -1520,13 +1765,13 @@
 	return xxx_Nests_OptGroup_OptNestedGroup{m}
 }
 func (m xxx_Nests_OptGroup_OptNestedGroup) Type() protoreflect.MessageType {
-	return xxx_Test_ProtoFile_MessageTypes[14].Type
+	return xxx_Test_ProtoFile_MessageTypes[18].Type
 }
 func (m xxx_Nests_OptGroup_OptNestedGroup) KnownFields() protoreflect.KnownFields {
-	return xxx_Test_ProtoFile_MessageTypes[14].KnownFieldsOf(m.m)
+	return xxx_Test_ProtoFile_MessageTypes[18].KnownFieldsOf(m.m)
 }
 func (m xxx_Nests_OptGroup_OptNestedGroup) UnknownFields() protoreflect.UnknownFields {
-	return xxx_Test_ProtoFile_MessageTypes[14].UnknownFieldsOf(m.m)
+	return xxx_Test_ProtoFile_MessageTypes[18].UnknownFieldsOf(m.m)
 }
 func (m xxx_Nests_OptGroup_OptNestedGroup) Interface() protoreflect.ProtoMessage {
 	return m.m
@@ -1564,6 +1809,159 @@
 	return Enum_UNKNOWN
 }
 
+var E_OptExtBool = &proto.ExtensionDesc{
+	ExtendedType:  (*Extensions)(nil),
+	ExtensionType: (*bool)(nil),
+	Field:         21,
+	Name:          "pb2.opt_ext_bool",
+	Tag:           "varint,21,opt,name=opt_ext_bool",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_OptExtString = &proto.ExtensionDesc{
+	ExtendedType:  (*Extensions)(nil),
+	ExtensionType: (*string)(nil),
+	Field:         22,
+	Name:          "pb2.opt_ext_string",
+	Tag:           "bytes,22,opt,name=opt_ext_string",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_OptExtEnum = &proto.ExtensionDesc{
+	ExtendedType:  (*Extensions)(nil),
+	ExtensionType: (*Enum)(nil),
+	Field:         23,
+	Name:          "pb2.opt_ext_enum",
+	Tag:           "varint,23,opt,name=opt_ext_enum,enum=pb2.Enum",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_OptExtNested = &proto.ExtensionDesc{
+	ExtendedType:  (*Extensions)(nil),
+	ExtensionType: (*Nested)(nil),
+	Field:         24,
+	Name:          "pb2.opt_ext_nested",
+	Tag:           "bytes,24,opt,name=opt_ext_nested",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_RptExtFixed32 = &proto.ExtensionDesc{
+	ExtendedType:  (*Extensions)(nil),
+	ExtensionType: ([]uint32)(nil),
+	Field:         31,
+	Name:          "pb2.rpt_ext_fixed32",
+	Tag:           "fixed32,31,rep,name=rpt_ext_fixed32",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_RptExtEnum = &proto.ExtensionDesc{
+	ExtendedType:  (*Extensions)(nil),
+	ExtensionType: ([]Enum)(nil),
+	Field:         32,
+	Name:          "pb2.rpt_ext_enum",
+	Tag:           "varint,32,rep,name=rpt_ext_enum,enum=pb2.Enum",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_RptExtNested = &proto.ExtensionDesc{
+	ExtendedType:  (*Extensions)(nil),
+	ExtensionType: ([]*Nested)(nil),
+	Field:         33,
+	Name:          "pb2.rpt_ext_nested",
+	Tag:           "bytes,33,rep,name=rpt_ext_nested",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_ExtensionsContainer_OptExtBool = &proto.ExtensionDesc{
+	ExtendedType:  (*Extensions)(nil),
+	ExtensionType: (*bool)(nil),
+	Field:         51,
+	Name:          "pb2.ExtensionsContainer.opt_ext_bool",
+	Tag:           "varint,51,opt,name=opt_ext_bool",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_ExtensionsContainer_OptExtString = &proto.ExtensionDesc{
+	ExtendedType:  (*Extensions)(nil),
+	ExtensionType: (*string)(nil),
+	Field:         52,
+	Name:          "pb2.ExtensionsContainer.opt_ext_string",
+	Tag:           "bytes,52,opt,name=opt_ext_string",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_ExtensionsContainer_OptExtEnum = &proto.ExtensionDesc{
+	ExtendedType:  (*Extensions)(nil),
+	ExtensionType: (*Enum)(nil),
+	Field:         53,
+	Name:          "pb2.ExtensionsContainer.opt_ext_enum",
+	Tag:           "varint,53,opt,name=opt_ext_enum,enum=pb2.Enum",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_ExtensionsContainer_OptExtNested = &proto.ExtensionDesc{
+	ExtendedType:  (*Extensions)(nil),
+	ExtensionType: (*Nested)(nil),
+	Field:         54,
+	Name:          "pb2.ExtensionsContainer.opt_ext_nested",
+	Tag:           "bytes,54,opt,name=opt_ext_nested",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_ExtensionsContainer_RptExtString = &proto.ExtensionDesc{
+	ExtendedType:  (*Extensions)(nil),
+	ExtensionType: ([]string)(nil),
+	Field:         61,
+	Name:          "pb2.ExtensionsContainer.rpt_ext_string",
+	Tag:           "bytes,61,rep,name=rpt_ext_string",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_ExtensionsContainer_RptExtEnum = &proto.ExtensionDesc{
+	ExtendedType:  (*Extensions)(nil),
+	ExtensionType: ([]Enum)(nil),
+	Field:         62,
+	Name:          "pb2.ExtensionsContainer.rpt_ext_enum",
+	Tag:           "varint,62,rep,name=rpt_ext_enum,enum=pb2.Enum",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_ExtensionsContainer_RptExtNested = &proto.ExtensionDesc{
+	ExtendedType:  (*Extensions)(nil),
+	ExtensionType: ([]*Nested)(nil),
+	Field:         63,
+	Name:          "pb2.ExtensionsContainer.rpt_ext_nested",
+	Tag:           "bytes,63,rep,name=rpt_ext_nested",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_MessageSetExtension_MessageSetExtension = &proto.ExtensionDesc{
+	ExtendedType:  (*MessageSet)(nil),
+	ExtensionType: (*MessageSetExtension)(nil),
+	Field:         10,
+	Name:          "pb2.MessageSetExtension",
+	Tag:           "bytes,10,opt,name=message_set_extension",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_MessageSetExtension_NotMessageSetExtension = &proto.ExtensionDesc{
+	ExtendedType:  (*MessageSet)(nil),
+	ExtensionType: (*MessageSetExtension)(nil),
+	Field:         20,
+	Name:          "pb2.MessageSetExtension.not_message_set_extension",
+	Tag:           "bytes,20,opt,name=not_message_set_extension",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
+var E_MessageSetExtension_ExtNested = &proto.ExtensionDesc{
+	ExtendedType:  (*MessageSet)(nil),
+	ExtensionType: (*Nested)(nil),
+	Field:         30,
+	Name:          "pb2.MessageSetExtension.ext_nested",
+	Tag:           "bytes,30,opt,name=ext_nested",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
 func init() {
 	proto.RegisterFile("encoding/textpb/testprotos/pb2/test.proto", fileDescriptor_c8d7acc1bcec9a72)
 	proto.RegisterEnum("pb2.Enum", Enum_name, Enum_value)
@@ -1586,170 +1984,211 @@
 	proto.RegisterType((*NestedWithRequired)(nil), "pb2.NestedWithRequired")
 	proto.RegisterType((*IndirectRequired)(nil), "pb2.IndirectRequired")
 	proto.RegisterMapType((map[string]*NestedWithRequired)(nil), "pb2.IndirectRequired.StrToNestedEntry")
+	proto.RegisterType((*Extensions)(nil), "pb2.Extensions")
+	proto.RegisterType((*ExtensionsContainer)(nil), "pb2.ExtensionsContainer")
+	proto.RegisterType((*MessageSet)(nil), "pb2.MessageSet")
+	proto.RegisterType((*MessageSetExtension)(nil), "pb2.MessageSetExtension")
 	proto.RegisterType((*KnownTypes)(nil), "pb2.KnownTypes")
 	proto.RegisterType((*Nests_OptGroup)(nil), "pb2.Nests.OptGroup")
 	proto.RegisterType((*Nests_RptGroup)(nil), "pb2.Nests.RptGroup")
 	proto.RegisterType((*Nests_OptGroup_OptNestedGroup)(nil), "pb2.Nests.OptGroup.OptNestedGroup")
+	proto.RegisterExtension(E_OptExtBool)
+	proto.RegisterExtension(E_OptExtString)
+	proto.RegisterExtension(E_OptExtEnum)
+	proto.RegisterExtension(E_OptExtNested)
+	proto.RegisterExtension(E_RptExtFixed32)
+	proto.RegisterExtension(E_RptExtEnum)
+	proto.RegisterExtension(E_RptExtNested)
+	proto.RegisterExtension(E_ExtensionsContainer_OptExtBool)
+	proto.RegisterExtension(E_ExtensionsContainer_OptExtString)
+	proto.RegisterExtension(E_ExtensionsContainer_OptExtEnum)
+	proto.RegisterExtension(E_ExtensionsContainer_OptExtNested)
+	proto.RegisterExtension(E_ExtensionsContainer_RptExtString)
+	proto.RegisterExtension(E_ExtensionsContainer_RptExtEnum)
+	proto.RegisterExtension(E_ExtensionsContainer_RptExtNested)
+	proto.RegisterExtension(E_MessageSetExtension_MessageSetExtension)
+	proto.RegisterExtension(E_MessageSetExtension_NotMessageSetExtension)
+	proto.RegisterExtension(E_MessageSetExtension_ExtNested)
 }
 
 var fileDescriptor_c8d7acc1bcec9a72 = []byte{
-	// 1629 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x58, 0xdd, 0x6e, 0xdb, 0x46,
-	0x16, 0x0e, 0x49, 0xfd, 0x8e, 0xfc, 0xa3, 0x30, 0xc9, 0xae, 0x2c, 0x27, 0x31, 0x23, 0x64, 0x17,
-	0xdc, 0x00, 0x91, 0x00, 0x59, 0x11, 0x8c, 0x75, 0x7e, 0x60, 0xaf, 0xed, 0xc4, 0xc9, 0xd6, 0x2e,
-	0x28, 0xb9, 0x01, 0x72, 0x63, 0x48, 0xd6, 0x58, 0x21, 0x2a, 0x71, 0xa8, 0xe1, 0x30, 0x89, 0xde,
-	0xa3, 0xcf, 0xd0, 0x3e, 0x44, 0xdf, 0xa4, 0x2f, 0xd1, 0x9b, 0x5e, 0x14, 0xe8, 0x4d, 0x71, 0x66,
-	0x38, 0xe4, 0x90, 0x92, 0x0c, 0xdf, 0x71, 0xe6, 0x9c, 0xef, 0x9b, 0x99, 0xf3, 0xab, 0x23, 0xf4,
-	0x1f, 0xec, 0x5d, 0x91, 0x91, 0xeb, 0x8d, 0x5b, 0x0c, 0x7f, 0x63, 0xfe, 0xb0, 0xc5, 0x70, 0xc0,
-	0x7c, 0x4a, 0x18, 0x09, 0x5a, 0xfe, 0xb0, 0xcd, 0x97, 0x4d, 0xbe, 0x36, 0x0d, 0x7f, 0xd8, 0xae,
-	0x6f, 0x8d, 0x09, 0x19, 0x4f, 0x70, 0x8b, 0x6f, 0x0d, 0xc3, 0xeb, 0xd6, 0xc0, 0x9b, 0x0b, 0x79,
-	0x7d, 0x3b, 0x2b, 0xc2, 0x53, 0x9f, 0x49, 0xe1, 0xe3, 0xac, 0x70, 0x14, 0xd2, 0x01, 0x73, 0x89,
-	0x17, 0xc9, 0x1f, 0x66, 0xe5, 0x01, 0xa3, 0xe1, 0x55, 0x74, 0x74, 0x7d, 0x27, 0x2b, 0x65, 0xee,
-	0x14, 0x07, 0x6c, 0x30, 0xf5, 0x57, 0xd1, 0x7f, 0xa5, 0x03, 0xdf, 0xc7, 0x34, 0x10, 0xf2, 0xc6,
-	0x6f, 0x06, 0x2a, 0xf6, 0xae, 0x06, 0x93, 0x01, 0x0d, 0xcc, 0x2d, 0x54, 0x22, 0x3e, 0xbb, 0x1c,
-	0x12, 0x32, 0xa9, 0x69, 0x96, 0x66, 0x97, 0x9c, 0x22, 0xf1, 0xd9, 0x21, 0x21, 0x13, 0x73, 0x1b,
-	0x95, 0x41, 0xe4, 0x7a, 0x6c, 0xb7, 0x5d, 0xd3, 0x2d, 0xcd, 0xce, 0x3b, 0xa0, 0x7b, 0x0a, 0x6b,
-	0x45, 0xd8, 0xed, 0xd4, 0x0c, 0x4b, 0xb3, 0x0d, 0x29, 0xec, 0x76, 0xcc, 0x47, 0x08, 0x81, 0x30,
-	0x14, 0xd0, 0x9c, 0xa5, 0xd9, 0xeb, 0x0e, 0xa8, 0x5f, 0xf0, 0x0d, 0x55, 0xdc, 0xed, 0xd4, 0xf2,
-	0x96, 0x66, 0xe7, 0x62, 0x71, 0x82, 0x0e, 0x04, 0xba, 0x60, 0x69, 0xf6, 0x5d, 0x2e, 0xee, 0xa5,
-	0xd0, 0x81, 0x40, 0x17, 0x2d, 0xcd, 0x36, 0x63, 0x71, 0xb7, 0x63, 0xee, 0xa0, 0x0a, 0x88, 0xaf,
-	0xdd, 0x6f, 0x78, 0xb4, 0xdb, 0xae, 0x95, 0x2c, 0xcd, 0x2e, 0x3a, 0x80, 0x38, 0x11, 0x3b, 0x29,
-	0x85, 0x6e, 0xa7, 0x56, 0xb6, 0x34, 0xbb, 0x90, 0x28, 0x74, 0x3b, 0xe6, 0x13, 0xb4, 0xc6, 0x0f,
-	0x90, 0x14, 0xc8, 0xd2, 0xec, 0x4d, 0x07, 0x40, 0xbd, 0x68, 0x2b, 0xad, 0xd2, 0xed, 0xd4, 0x2a,
-	0x96, 0x66, 0x57, 0x15, 0x95, 0x6e, 0x47, 0x1a, 0xe8, 0x7a, 0x42, 0x06, 0xac, 0x76, 0xdf, 0xd2,
-	0x6c, 0x9d, 0x1b, 0xe8, 0x04, 0xd6, 0xf2, 0x0d, 0x23, 0x12, 0x0e, 0x27, 0xb8, 0xf6, 0xc0, 0xd2,
-	0x6c, 0x8d, 0xbf, 0xe1, 0x88, 0x6f, 0x48, 0xec, 0x70, 0xce, 0x70, 0x50, 0xdb, 0xb0, 0x34, 0x7b,
-	0x8d, 0x63, 0x0f, 0x61, 0x1d, 0xbf, 0x9f, 0x51, 0xd7, 0x1b, 0xd7, 0xd6, 0x2d, 0xcd, 0x2e, 0x8b,
-	0xf7, 0xf3, 0x8d, 0xc6, 0x4f, 0x3a, 0x2a, 0x3a, 0xd8, 0xc7, 0x03, 0xc6, 0x9d, 0x4b, 0x13, 0xe7,
-	0x1a, 0xe0, 0x5c, 0x9a, 0x38, 0x97, 0x2a, 0xce, 0x35, 0xc0, 0xb9, 0x54, 0x71, 0x2e, 0x55, 0x9c,
-	0x6b, 0x80, 0x73, 0xa9, 0xe2, 0x5c, 0xaa, 0x3a, 0xd7, 0x00, 0xe7, 0x52, 0xd5, 0xb9, 0x54, 0x75,
-	0xae, 0x01, 0xce, 0xa5, 0xb1, 0x73, 0x23, 0x6a, 0x61, 0x96, 0x82, 0x65, 0x80, 0x59, 0xa8, 0x62,
-	0x16, 0x9a, 0x98, 0xa5, 0x68, 0x19, 0x60, 0x16, 0x1a, 0x9b, 0x25, 0x12, 0x47, 0x2f, 0xdf, 0xb4,
-	0x0c, 0x78, 0x39, 0x95, 0x2f, 0x97, 0xd4, 0xd2, 0x6a, 0x06, 0x58, 0x8d, 0x46, 0x56, 0x6b, 0xfc,
-	0xa5, 0xa1, 0xfc, 0xb1, 0x17, 0x4e, 0x03, 0xf3, 0xa9, 0x88, 0x78, 0xec, 0x85, 0x53, 0x1e, 0xf1,
-	0x1b, 0xed, 0x72, 0xd3, 0x1f, 0xb6, 0x9b, 0x20, 0xe5, 0xc1, 0x0f, 0x1f, 0xa0, 0x45, 0xa5, 0x16,
-	0x98, 0x27, 0xad, 0x45, 0x23, 0xad, 0x57, 0x68, 0x13, 0xb8, 0x3c, 0x1c, 0x30, 0x3c, 0x12, 0xca,
-	0x06, 0xa7, 0x7c, 0x10, 0x2b, 0x07, 0xcd, 0x33, 0x2e, 0xe5, 0xc0, 0x75, 0xe2, 0xb3, 0x64, 0x09,
-	0x70, 0x9a, 0x81, 0xe7, 0xf8, 0x59, 0xab, 0xe0, 0x54, 0x85, 0x37, 0x6c, 0x84, 0x14, 0xb2, 0x22,
-	0x32, 0x2e, 0xce, 0xce, 0xab, 0x1a, 0x7c, 0x1c, 0x9d, 0xf7, 0xaa, 0xba, 0x59, 0x42, 0xb9, 0xa3,
-	0xd3, 0xe3, 0x4f, 0x55, 0xd4, 0xf8, 0xdd, 0x40, 0x79, 0x50, 0x0d, 0xcc, 0x67, 0x22, 0x7a, 0xc4,
-	0x91, 0xfc, 0xfd, 0x95, 0x76, 0x85, 0x9f, 0x26, 0xa8, 0x78, 0x28, 0x89, 0x4f, 0xb3, 0xc5, 0x2d,
-	0x35, 0xa6, 0x24, 0xf4, 0x79, 0xfe, 0xa3, 0xf6, 0xbd, 0x58, 0x33, 0x68, 0x9e, 0xfb, 0xec, 0x2d,
-	0x88, 0x9c, 0x58, 0x09, 0xc8, 0x93, 0xf7, 0xf0, 0xc0, 0xc9, 0x92, 0x53, 0x95, 0x9c, 0x4a, 0x72,
-	0x78, 0x74, 0x9a, 0xdc, 0x89, 0xc9, 0xa5, 0x52, 0xfd, 0x0f, 0x0d, 0x95, 0xe4, 0x99, 0x37, 0x95,
-	0xad, 0x74, 0x7e, 0xe8, 0x99, 0xfc, 0xc8, 0x18, 0xc0, 0xb8, 0xd1, 0x00, 0xef, 0xd1, 0x06, 0xf1,
-	0x99, 0x50, 0x95, 0x37, 0x05, 0x33, 0x34, 0x96, 0x98, 0x01, 0x3e, 0x04, 0x4c, 0x5c, 0x3c, 0x83,
-	0xac, 0x77, 0xd1, 0x46, 0x5a, 0xe3, 0x76, 0x81, 0x58, 0xff, 0x17, 0x2a, 0x39, 0xca, 0xab, 0x57,
-	0xe4, 0xb3, 0xb3, 0x41, 0x71, 0x80, 0xe9, 0x17, 0x3c, 0xba, 0xbc, 0x76, 0xf1, 0x64, 0xd4, 0xe8,
-	0xa1, 0x42, 0xf4, 0x88, 0xb4, 0x3d, 0xb4, 0x9b, 0xed, 0xa1, 0xdf, 0x64, 0x8f, 0xc6, 0x9f, 0x3a,
-	0x2a, 0x3b, 0x78, 0x16, 0xba, 0x14, 0x8f, 0x44, 0x75, 0xc1, 0x33, 0x79, 0x1b, 0x9d, 0xdf, 0x06,
-	0xcf, 0xb8, 0x0f, 0x76, 0x50, 0x05, 0x44, 0xb2, 0x82, 0xea, 0x96, 0x0e, 0x45, 0x98, 0xe2, 0x99,
-	0x52, 0x84, 0x63, 0x05, 0x5e, 0x63, 0x74, 0x28, 0xc2, 0x52, 0x41, 0x14, 0x61, 0x50, 0x88, 0x8b,
-	0x70, 0xce, 0xd2, 0xa1, 0x08, 0x53, 0x3c, 0x53, 0x8b, 0x70, 0xa2, 0xc2, 0x6b, 0x8d, 0x0e, 0x45,
-	0x38, 0x56, 0x89, 0xaa, 0x0d, 0x1c, 0x13, 0x55, 0x1b, 0x9d, 0x57, 0x1b, 0x3c, 0x4b, 0xaa, 0x0d,
-	0x9e, 0x25, 0xd5, 0x46, 0xe7, 0xd5, 0x06, 0xcf, 0x94, 0x6a, 0x03, 0xf4, 0xc2, 0x6e, 0x25, 0x4b,
-	0xe7, 0xd5, 0x06, 0xcf, 0x94, 0x6a, 0x03, 0xaf, 0xe7, 0xd5, 0xa6, 0x6c, 0xe9, 0xbc, 0xda, 0xe0,
-	0x99, 0xa8, 0xd1, 0x4f, 0x85, 0x69, 0xb8, 0x6b, 0x91, 0xa5, 0x67, 0xab, 0x07, 0x9e, 0xf1, 0x8c,
-	0x7d, 0x26, 0x4e, 0x88, 0x4c, 0x5f, 0xb1, 0xf4, 0xc5, 0x74, 0xc1, 0xb3, 0xc8, 0xf4, 0xe7, 0x68,
-	0xf3, 0xfb, 0x01, 0x65, 0xee, 0x60, 0x22, 0x1d, 0x90, 0xb9, 0xa0, 0x96, 0xbd, 0xe0, 0xcd, 0x79,
-	0xd0, 0x38, 0x41, 0x85, 0x73, 0x0f, 0x93, 0xeb, 0xc0, 0x34, 0x91, 0x11, 0x30, 0x2a, 0x22, 0xe3,
-	0xdd, 0x1d, 0x07, 0x16, 0xe6, 0x0e, 0x32, 0xa6, 0xc1, 0x78, 0x49, 0x38, 0x80, 0xc2, 0x34, 0x18,
-	0x1f, 0x16, 0x51, 0x3e, 0xf4, 0x5c, 0xe2, 0x35, 0x7e, 0x2d, 0xa0, 0xdc, 0x77, 0x03, 0x3f, 0x30,
-	0xf7, 0xd1, 0x1a, 0xef, 0x00, 0x97, 0x8c, 0x5c, 0x0a, 0x3e, 0x48, 0xff, 0x2d, 0x8e, 0x05, 0x85,
-	0x26, 0xef, 0x2d, 0x7d, 0xd2, 0x63, 0xf4, 0xd8, 0x63, 0x74, 0xee, 0x20, 0x37, 0xde, 0x30, 0xdf,
-	0xa2, 0xaa, 0xf4, 0x23, 0xe0, 0x79, 0x4c, 0xe9, 0x9c, 0xe0, 0x51, 0x42, 0x20, 0xdd, 0xda, 0x27,
-	0x10, 0x64, 0x82, 0x64, 0x23, 0x48, 0x6d, 0x9a, 0x07, 0x68, 0x03, 0xc0, 0x40, 0x12, 0x75, 0x28,
-	0x51, 0x86, 0xb6, 0x13, 0x1a, 0xd0, 0xeb, 0x13, 0xd1, 0xae, 0x04, 0xc9, 0xda, 0x50, 0xd9, 0x02,
-	0x0a, 0xd1, 0xbd, 0x80, 0x24, 0x2e, 0xca, 0x29, 0x0a, 0xd1, 0xcc, 0xfa, 0x04, 0xdc, 0x18, 0x51,
-	0x84, 0xca, 0x96, 0xf9, 0x1a, 0xad, 0x07, 0x8c, 0x02, 0x3e, 0x72, 0x6e, 0x9e, 0x33, 0xd4, 0x95,
-	0xb7, 0x30, 0xda, 0x27, 0xb2, 0x7a, 0x03, 0x41, 0x25, 0x48, 0x76, 0x14, 0x3c, 0xe1, 0x3e, 0xe2,
-	0x9d, 0x72, 0x11, 0x2f, 0x1c, 0xa8, 0xe2, 0xc5, 0x4e, 0xfd, 0x15, 0xda, 0xcc, 0x58, 0xdb, 0xac,
-	0x22, 0xe3, 0x47, 0x3c, 0xe7, 0x5e, 0xce, 0x3b, 0xf0, 0x69, 0xde, 0x47, 0xf9, 0x2f, 0x83, 0x49,
-	0x88, 0xa3, 0xd8, 0x10, 0x8b, 0xff, 0xea, 0x7b, 0x5a, 0xfd, 0x00, 0xdd, 0x5b, 0x62, 0x6b, 0x95,
-	0xa2, 0xba, 0x84, 0xa2, 0xa4, 0x52, 0xbc, 0x41, 0x77, 0x17, 0xec, 0xac, 0x12, 0x94, 0x96, 0x10,
-	0xac, 0xab, 0x04, 0xef, 0xd1, 0xdd, 0x05, 0x2b, 0xab, 0x04, 0x39, 0x41, 0xb0, 0xa3, 0x12, 0xa4,
-	0xd2, 0x4c, 0xe1, 0xfa, 0x80, 0xaa, 0x59, 0x7b, 0xab, 0x54, 0x65, 0x41, 0xf5, 0x44, 0xa5, 0xca,
-	0x64, 0xe2, 0x12, 0x32, 0xc5, 0xf8, 0xb7, 0x25, 0x13, 0x10, 0x85, 0xac, 0xb1, 0x8b, 0x4c, 0x71,
-	0xc2, 0x47, 0x97, 0x7d, 0xbe, 0x65, 0x66, 0x37, 0x7e, 0xd1, 0x51, 0xf5, 0xd4, 0x1b, 0xb9, 0x14,
-	0x5f, 0xb1, 0x18, 0xd3, 0x5d, 0xd2, 0xd8, 0xff, 0xa9, 0x3c, 0x41, 0x3d, 0x40, 0xed, 0x71, 0xdd,
-	0x54, 0xcf, 0x16, 0x39, 0xb7, 0x1a, 0x47, 0x95, 0xde, 0x98, 0x09, 0x71, 0x91, 0x67, 0xff, 0xe6,
-	0xd0, 0xec, 0xed, 0x6e, 0x0e, 0xf7, 0xfa, 0xc7, 0x5b, 0xf9, 0xe7, 0x79, 0xda, 0xa4, 0x2b, 0x2f,
-	0xa9, 0x98, 0xf7, 0xe7, 0x22, 0x42, 0x1f, 0x3c, 0xf2, 0xd5, 0xeb, 0xcf, 0x7d, 0x1c, 0x98, 0x2f,
-	0x32, 0xbf, 0x1a, 0x20, 0xa3, 0xc4, 0xac, 0xd4, 0x94, 0xb3, 0x12, 0xaf, 0x0e, 0x3f, 0x00, 0x41,
-	0xf2, 0x8b, 0x62, 0x2f, 0x3b, 0x08, 0x41, 0x2d, 0xc8, 0xe2, 0x78, 0xbe, 0x09, 0x60, 0x32, 0x25,
-	0xed, 0x65, 0xa7, 0xa4, 0x15, 0xc8, 0x6e, 0x27, 0x85, 0xec, 0x76, 0xcc, 0xfd, 0x85, 0x11, 0xaa,
-	0xd2, 0x7e, 0xb8, 0x00, 0xbd, 0x50, 0x4e, 0x55, 0x06, 0xac, 0xfd, 0x85, 0x01, 0x6b, 0x15, 0x58,
-	0x1e, 0xac, 0x8c, 0x5f, 0x7b, 0xea, 0xe0, 0x52, 0x58, 0x71, 0x67, 0xde, 0x41, 0x93, 0x3b, 0x8b,
-	0x86, 0xba, 0x9f, 0x9a, 0x6a, 0x8a, 0x2b, 0x8e, 0x15, 0xed, 0x35, 0x39, 0x36, 0x6a, 0xb7, 0xfb,
-	0xa9, 0x76, 0x55, 0x5a, 0x01, 0x16, 0x19, 0x90, 0x80, 0xa3, 0x5e, 0xb7, 0xa7, 0x0e, 0x4c, 0xe5,
-	0x15, 0x77, 0xe6, 0xad, 0x39, 0xb9, 0xb3, 0xe8, 0xd4, 0x2f, 0xc5, 0x24, 0x27, 0x07, 0x70, 0x3e,
-	0xa9, 0x41, 0xd7, 0x5a, 0xb8, 0x75, 0xa4, 0xc0, 0x87, 0x3c, 0xb9, 0x30, 0xdf, 0x20, 0xf8, 0x45,
-	0x7f, 0x19, 0x0f, 0xe0, 0x7c, 0x94, 0x5b, 0x16, 0x55, 0x7d, 0xa9, 0xe1, 0xc0, 0x71, 0xf1, 0x4a,
-	0x66, 0xad, 0x98, 0xef, 0x6b, 0x5b, 0x51, 0x60, 0x2f, 0x79, 0x75, 0x78, 0xc5, 0xe4, 0x83, 0xc3,
-	0x2b, 0x26, 0x23, 0x79, 0xe2, 0x06, 0xac, 0x56, 0x5f, 0x71, 0xe6, 0xff, 0xdd, 0x80, 0x25, 0x91,
-	0x0c, 0x2b, 0x73, 0x57, 0xd8, 0x49, 0xa4, 0xd1, 0x36, 0xc7, 0xfd, 0x63, 0x01, 0x97, 0x98, 0x88,
-	0x7f, 0x49, 0x10, 0xff, 0x03, 0xa3, 0xf6, 0x78, 0x05, 0xe8, 0x18, 0xa4, 0x1c, 0xc4, 0xbf, 0xcc,
-	0xe7, 0x08, 0x0e, 0xbd, 0x1c, 0x78, 0xf3, 0x9a, 0xc5, 0x21, 0xf7, 0x17, 0x20, 0x07, 0xde, 0xdc,
-	0x29, 0x10, 0x9f, 0x1d, 0x78, 0xf3, 0x67, 0x2f, 0x50, 0x8e, 0x37, 0xce, 0x0a, 0x2a, 0x5e, 0x9c,
-	0x7d, 0x38, 0x3b, 0xff, 0x78, 0x56, 0xbd, 0x63, 0x96, 0x51, 0xfe, 0xe4, 0xd4, 0xe9, 0xf5, 0xab,
-	0x9a, 0x89, 0x50, 0xa1, 0x77, 0xfc, 0xbf, 0xf3, 0xb3, 0xa3, 0xaa, 0x0e, 0xdb, 0xfd, 0xe3, 0xb3,
-	0xfe, 0xbb, 0x2a, 0x3a, 0x7c, 0xfd, 0xe9, 0xe5, 0xd8, 0x65, 0x9f, 0xc3, 0x61, 0xf3, 0x8a, 0x4c,
-	0x5b, 0x63, 0x32, 0x19, 0x78, 0xe3, 0xe4, 0x6f, 0x8f, 0x2f, 0xed, 0xd6, 0xcd, 0x7f, 0xe8, 0xfc,
-	0x1d, 0x00, 0x00, 0xff, 0xff, 0xcc, 0x1a, 0x6e, 0x85, 0xf1, 0x11, 0x00, 0x00,
+	// 1945 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x58, 0xdb, 0x6e, 0x1b, 0xc9,
+	0x11, 0xdd, 0x99, 0xe1, 0xb5, 0xa9, 0x0b, 0x3d, 0x92, 0xbd, 0x14, 0xbd, 0xbb, 0x1a, 0x13, 0x9b,
+	0x80, 0x11, 0xb0, 0x12, 0x32, 0xa2, 0x19, 0x81, 0x5a, 0xdb, 0xb0, 0xd6, 0xf4, 0xae, 0xd7, 0x59,
+	0x29, 0x20, 0xe9, 0x18, 0x58, 0x20, 0x10, 0x48, 0xb1, 0xc5, 0x1d, 0x84, 0x9c, 0x1e, 0xf6, 0x34,
+	0x6d, 0xe9, 0x3f, 0xf2, 0x0d, 0xc9, 0x1f, 0xe4, 0x21, 0xf9, 0x93, 0xfc, 0x44, 0x5e, 0xf2, 0x10,
+	0x20, 0x0f, 0x0e, 0xaa, 0x7a, 0x2e, 0xcd, 0x19, 0xde, 0xde, 0xa6, 0xbb, 0xea, 0x9c, 0xaa, 0xae,
+	0xea, 0xae, 0xea, 0x69, 0xf2, 0x1b, 0xea, 0xde, 0xb0, 0xa1, 0xe3, 0x8e, 0x4e, 0x04, 0xbd, 0x13,
+	0xde, 0xe0, 0x44, 0x50, 0x5f, 0x78, 0x9c, 0x09, 0xe6, 0x9f, 0x78, 0x03, 0x1b, 0x87, 0xc7, 0x38,
+	0x36, 0x0d, 0x6f, 0x60, 0x57, 0x0f, 0x46, 0x8c, 0x8d, 0xc6, 0xf4, 0x04, 0xa7, 0x06, 0xb3, 0xdb,
+	0x93, 0xbe, 0x7b, 0x2f, 0xe5, 0xd5, 0xc7, 0x49, 0x11, 0x9d, 0x78, 0x22, 0x14, 0x7e, 0x95, 0x14,
+	0x0e, 0x67, 0xbc, 0x2f, 0x1c, 0xe6, 0x06, 0xf2, 0x2f, 0x92, 0x72, 0x5f, 0xf0, 0xd9, 0x4d, 0x60,
+	0xba, 0x7a, 0x98, 0x94, 0x0a, 0x67, 0x42, 0x7d, 0xd1, 0x9f, 0x78, 0xcb, 0xe8, 0x3f, 0xf2, 0xbe,
+	0xe7, 0x51, 0xee, 0x4b, 0x79, 0xed, 0x5f, 0x06, 0xc9, 0x77, 0x6f, 0xfa, 0xe3, 0x3e, 0xf7, 0xcd,
+	0x03, 0x52, 0x60, 0x9e, 0xb8, 0x1e, 0x30, 0x36, 0xae, 0x68, 0x96, 0x56, 0x2f, 0x74, 0xf2, 0xcc,
+	0x13, 0x17, 0x8c, 0x8d, 0xcd, 0xc7, 0xa4, 0x08, 0x22, 0xc7, 0x15, 0xa7, 0x76, 0x45, 0xb7, 0xb4,
+	0x7a, 0xb6, 0x03, 0xba, 0x6f, 0x60, 0xac, 0x08, 0x9b, 0x8d, 0x8a, 0x61, 0x69, 0x75, 0x23, 0x14,
+	0x36, 0x1b, 0xe6, 0x97, 0x84, 0x80, 0x70, 0x26, 0xa1, 0x19, 0x4b, 0xab, 0x6f, 0x77, 0x40, 0xfd,
+	0x1d, 0x4e, 0xa8, 0xe2, 0x66, 0xa3, 0x92, 0xb5, 0xb4, 0x7a, 0x26, 0x12, 0xc7, 0x68, 0x5f, 0xa2,
+	0x73, 0x96, 0x56, 0x7f, 0x80, 0xe2, 0xee, 0x1c, 0xda, 0x97, 0xe8, 0xbc, 0xa5, 0xd5, 0xcd, 0x48,
+	0xdc, 0x6c, 0x98, 0x87, 0xa4, 0x04, 0xe2, 0x5b, 0xe7, 0x8e, 0x0e, 0x4f, 0xed, 0x4a, 0xc1, 0xd2,
+	0xea, 0xf9, 0x0e, 0x20, 0x5e, 0xcb, 0x99, 0x39, 0x85, 0x66, 0xa3, 0x52, 0xb4, 0xb4, 0x7a, 0x2e,
+	0x56, 0x68, 0x36, 0xcc, 0x27, 0x64, 0x0b, 0x0d, 0x84, 0x14, 0xc4, 0xd2, 0xea, 0xbb, 0x1d, 0x00,
+	0x75, 0x83, 0xa9, 0x79, 0x95, 0x66, 0xa3, 0x52, 0xb2, 0xb4, 0x7a, 0x59, 0x51, 0x69, 0x36, 0xc2,
+	0x00, 0xdd, 0x8e, 0x59, 0x5f, 0x54, 0xf6, 0x2d, 0xad, 0xae, 0x63, 0x80, 0x5e, 0xc3, 0x38, 0x5c,
+	0xc3, 0x90, 0xcd, 0x06, 0x63, 0x5a, 0x79, 0x68, 0x69, 0x75, 0x0d, 0xd7, 0xf0, 0x0a, 0x27, 0x42,
+	0xec, 0xe0, 0x5e, 0x50, 0xbf, 0xb2, 0x63, 0x69, 0xf5, 0x2d, 0xc4, 0x5e, 0xc0, 0x38, 0x5a, 0xbf,
+	0xe0, 0x8e, 0x3b, 0xaa, 0x6c, 0x5b, 0x5a, 0xbd, 0x28, 0xd7, 0x8f, 0x13, 0xb5, 0xbf, 0xe8, 0x24,
+	0xdf, 0xa1, 0x1e, 0xed, 0x0b, 0x4c, 0x2e, 0x8f, 0x93, 0x6b, 0x40, 0x72, 0x79, 0x9c, 0x5c, 0xae,
+	0x24, 0xd7, 0x80, 0xe4, 0x72, 0x25, 0xb9, 0x5c, 0x49, 0xae, 0x01, 0xc9, 0xe5, 0x4a, 0x72, 0xb9,
+	0x9a, 0x5c, 0x03, 0x92, 0xcb, 0xd5, 0xe4, 0x72, 0x35, 0xb9, 0x06, 0x24, 0x97, 0x47, 0xc9, 0x0d,
+	0xa8, 0x65, 0x58, 0x72, 0x96, 0x01, 0x61, 0xe1, 0x4a, 0x58, 0x78, 0x1c, 0x96, 0xbc, 0x65, 0x40,
+	0x58, 0x78, 0x14, 0x96, 0x40, 0x1c, 0xac, 0x7c, 0xd7, 0x32, 0x60, 0xe5, 0x3c, 0x5c, 0x79, 0x48,
+	0x1d, 0x46, 0xcd, 0x80, 0xa8, 0xf1, 0x20, 0x6a, 0xb5, 0xff, 0x69, 0x24, 0xdb, 0x76, 0x67, 0x13,
+	0xdf, 0xfc, 0x5a, 0xee, 0x78, 0xea, 0xce, 0x26, 0xb8, 0xe3, 0x77, 0xec, 0xe2, 0xb1, 0x37, 0xb0,
+	0x8f, 0x41, 0x8a, 0x9b, 0x1f, 0x3e, 0x40, 0x8b, 0x87, 0x5a, 0x10, 0x9e, 0x79, 0x2d, 0x1e, 0x68,
+	0x3d, 0x23, 0xbb, 0xc0, 0xe5, 0x52, 0x5f, 0xd0, 0xa1, 0x54, 0x36, 0x90, 0xf2, 0x61, 0xa4, 0xec,
+	0x1f, 0x5f, 0xa2, 0x14, 0x81, 0xdb, 0xcc, 0x13, 0xf1, 0x10, 0xe0, 0x3c, 0x01, 0xcf, 0xa0, 0xad,
+	0x65, 0x70, 0xae, 0xc2, 0x6b, 0x75, 0x42, 0x14, 0xb2, 0x3c, 0x31, 0xde, 0x5d, 0x5e, 0x95, 0x35,
+	0xf8, 0x78, 0x75, 0xd5, 0x2d, 0xeb, 0x66, 0x81, 0x64, 0x5e, 0xbd, 0x69, 0xff, 0x5c, 0x26, 0xb5,
+	0x7f, 0x1b, 0x24, 0x0b, 0xaa, 0xbe, 0x79, 0x24, 0x77, 0x8f, 0x34, 0x89, 0xeb, 0x2f, 0xd9, 0x25,
+	0xb4, 0x26, 0xa9, 0x70, 0x2b, 0xc9, 0x4f, 0xf3, 0x04, 0x23, 0x35, 0xe2, 0x6c, 0xe6, 0xe1, 0xf9,
+	0x27, 0xf6, 0x5e, 0xa4, 0xe9, 0x1f, 0x5f, 0x79, 0xe2, 0x7b, 0x10, 0x75, 0x22, 0x25, 0x20, 0x8f,
+	0xd7, 0x83, 0x1b, 0x27, 0x49, 0xce, 0x55, 0x72, 0x1e, 0x92, 0xc3, 0xa2, 0xe7, 0xc9, 0x3b, 0x11,
+	0x79, 0xa8, 0x54, 0xfd, 0x8f, 0x46, 0x0a, 0xa1, 0xcd, 0x55, 0x65, 0x6b, 0xfe, 0x7c, 0xe8, 0x89,
+	0xf3, 0x91, 0x08, 0x80, 0xb1, 0x32, 0x00, 0x3f, 0x92, 0x1d, 0xe6, 0x09, 0xa9, 0x1a, 0x7a, 0x0a,
+	0x61, 0xa8, 0x2d, 0x08, 0x03, 0x7c, 0x48, 0x98, 0x74, 0x3c, 0x81, 0xac, 0x36, 0xc9, 0xce, 0xbc,
+	0xc6, 0x66, 0x1b, 0xb1, 0xfa, 0x2b, 0x52, 0xe8, 0x28, 0xab, 0x5e, 0x72, 0x9e, 0x3b, 0x3b, 0x9c,
+	0xfa, 0x94, 0x7f, 0xa0, 0xc3, 0xeb, 0x5b, 0x87, 0x8e, 0x87, 0xb5, 0x2e, 0xc9, 0x05, 0x8b, 0x98,
+	0x8f, 0x87, 0xb6, 0x3a, 0x1e, 0xfa, 0xaa, 0x78, 0xd4, 0xfe, 0xab, 0x93, 0x62, 0x87, 0x4e, 0x67,
+	0x0e, 0xa7, 0x43, 0x59, 0x5d, 0xe8, 0x34, 0xf4, 0x46, 0x47, 0x6f, 0xe8, 0x14, 0x73, 0x70, 0x48,
+	0x4a, 0x20, 0x0a, 0x2b, 0xa8, 0x6e, 0xe9, 0x50, 0x84, 0x39, 0x9d, 0x2a, 0x45, 0x38, 0x52, 0xc0,
+	0x1a, 0xa3, 0x43, 0x11, 0x0e, 0x15, 0x64, 0x11, 0x06, 0x85, 0xa8, 0x08, 0x67, 0x2c, 0x1d, 0x8a,
+	0x30, 0xa7, 0x53, 0xb5, 0x08, 0xc7, 0x2a, 0x58, 0x6b, 0x74, 0x28, 0xc2, 0x91, 0x4a, 0x50, 0x6d,
+	0xc0, 0x4c, 0x50, 0x6d, 0x74, 0xac, 0x36, 0x74, 0x1a, 0x57, 0x1b, 0x3a, 0x8d, 0xab, 0x8d, 0x8e,
+	0xd5, 0x86, 0x4e, 0x95, 0x6a, 0x03, 0xf4, 0x32, 0x6e, 0x05, 0x4b, 0xc7, 0x6a, 0x43, 0xa7, 0x4a,
+	0xb5, 0x81, 0xd5, 0x63, 0xb5, 0x29, 0x5a, 0x3a, 0x56, 0x1b, 0x3a, 0x95, 0x35, 0xfa, 0x6b, 0x19,
+	0x1a, 0x4c, 0x2d, 0xb1, 0xf4, 0x64, 0xf5, 0xa0, 0x53, 0x3c, 0xb1, 0x47, 0xd2, 0x42, 0x10, 0xfa,
+	0x92, 0xa5, 0xa7, 0x8f, 0x0b, 0x9d, 0x06, 0xa1, 0xbf, 0x22, 0xbb, 0x7f, 0xe8, 0x73, 0xe1, 0xf4,
+	0xc7, 0x61, 0x02, 0x12, 0x0e, 0x6a, 0x49, 0x07, 0x57, 0x9f, 0x83, 0xda, 0x6b, 0x92, 0xbb, 0x72,
+	0x29, 0xbb, 0xf5, 0x4d, 0x93, 0x18, 0xbe, 0xe0, 0x72, 0x67, 0xfc, 0xf0, 0x59, 0x07, 0x06, 0xe6,
+	0x21, 0x31, 0x26, 0xfe, 0x68, 0xc1, 0x76, 0x00, 0x85, 0x89, 0x3f, 0xba, 0xc8, 0x93, 0xec, 0xcc,
+	0x75, 0x98, 0x5b, 0xfb, 0x67, 0x8e, 0x64, 0x7e, 0xea, 0x7b, 0xbe, 0x79, 0x4e, 0xb6, 0xb0, 0x03,
+	0x5c, 0x0b, 0x76, 0x2d, 0xf9, 0xe0, 0xf8, 0x1f, 0x20, 0x16, 0x14, 0x8e, 0xb1, 0xb7, 0xf4, 0x58,
+	0x57, 0xf0, 0xb6, 0x2b, 0xf8, 0x7d, 0x87, 0x38, 0xd1, 0x84, 0xf9, 0x3d, 0x29, 0x87, 0x79, 0x04,
+	0x3c, 0xee, 0x29, 0x1d, 0x09, 0xbe, 0x8c, 0x09, 0xc2, 0xb4, 0xf6, 0x18, 0x6c, 0x32, 0x49, 0xb2,
+	0xe3, 0xcf, 0x4d, 0x9a, 0x2f, 0xc9, 0x0e, 0x80, 0x81, 0x24, 0xe8, 0x50, 0xb2, 0x0c, 0x3d, 0x8e,
+	0x69, 0x40, 0xaf, 0xc7, 0x64, 0xbb, 0x92, 0x24, 0x5b, 0x03, 0x65, 0x0a, 0x28, 0x64, 0xf7, 0x02,
+	0x92, 0xa8, 0x28, 0xcf, 0x51, 0xc8, 0x66, 0xd6, 0x63, 0x90, 0xc6, 0x80, 0x62, 0xa6, 0x4c, 0x99,
+	0xcf, 0xc9, 0xb6, 0x2f, 0x38, 0xe0, 0x83, 0xe4, 0x66, 0x91, 0xa1, 0xaa, 0xac, 0x45, 0xf0, 0x1e,
+	0x0b, 0xab, 0x37, 0x10, 0x94, 0xfc, 0x78, 0x46, 0xc1, 0x33, 0xcc, 0x11, 0x76, 0xca, 0x34, 0x5e,
+	0x26, 0x50, 0xc5, 0xcb, 0x99, 0xea, 0x33, 0xb2, 0x9b, 0x88, 0xb6, 0x59, 0x26, 0xc6, 0x9f, 0xe9,
+	0x3d, 0x66, 0x39, 0xdb, 0x81, 0x4f, 0x73, 0x9f, 0x64, 0x3f, 0xf4, 0xc7, 0x33, 0x1a, 0xec, 0x0d,
+	0x39, 0x68, 0xe9, 0x67, 0x5a, 0xf5, 0x25, 0xd9, 0x5b, 0x10, 0x6b, 0x95, 0xa2, 0xbc, 0x80, 0xa2,
+	0xa0, 0x52, 0xbc, 0x20, 0x0f, 0x52, 0x71, 0x56, 0x09, 0x0a, 0x0b, 0x08, 0xb6, 0x55, 0x82, 0x1f,
+	0xc9, 0x83, 0x54, 0x94, 0x55, 0x82, 0x8c, 0x24, 0x38, 0x54, 0x09, 0xe6, 0x8e, 0x99, 0xc2, 0xf5,
+	0x96, 0x94, 0x93, 0xf1, 0x56, 0xa9, 0x8a, 0x92, 0xea, 0x89, 0x4a, 0x95, 0x38, 0x89, 0x0b, 0xc8,
+	0x94, 0xe0, 0x6f, 0x4a, 0x26, 0x21, 0x0a, 0x59, 0xed, 0x94, 0x98, 0xd2, 0xc2, 0x7b, 0x47, 0xfc,
+	0xb2, 0xe1, 0xc9, 0xae, 0xfd, 0x4d, 0x27, 0xe5, 0x37, 0xee, 0xd0, 0xe1, 0xf4, 0x46, 0x44, 0x98,
+	0xe6, 0x82, 0xc6, 0xfe, 0xb9, 0xb2, 0x04, 0xd5, 0x80, 0xda, 0xe3, 0x9a, 0x73, 0x3d, 0x5b, 0x9e,
+	0xb9, 0xe5, 0x38, 0xae, 0xf4, 0xc6, 0xc4, 0x16, 0x97, 0xe7, 0xec, 0xd7, 0x08, 0x4d, 0x7a, 0xb7,
+	0x7a, 0xbb, 0x57, 0xdf, 0x6f, 0x94, 0x9f, 0x6f, 0xe6, 0x43, 0xba, 0xd4, 0x49, 0x25, 0xbc, 0x0e,
+	0x21, 0xed, 0x3b, 0x41, 0x5d, 0xdf, 0x61, 0xae, 0xbf, 0xae, 0x13, 0xaa, 0x77, 0x0a, 0xba, 0xf9,
+	0xaf, 0xd0, 0x51, 0xa6, 0xb0, 0x5f, 0xa6, 0xb5, 0x7f, 0x18, 0x64, 0x2f, 0xb6, 0xf5, 0x1d, 0x73,
+	0x45, 0xdf, 0x71, 0x29, 0xb7, 0x7f, 0x2b, 0x7f, 0x15, 0xe8, 0x9d, 0x64, 0x36, 0x77, 0xe5, 0x0e,
+	0x8d, 0x34, 0x2b, 0xa7, 0x68, 0x0a, 0x3c, 0x6b, 0xdf, 0xa1, 0x35, 0xfb, 0x29, 0x5e, 0x3b, 0x10,
+	0x22, 0x7d, 0x4d, 0x83, 0x1a, 0xe8, 0xfc, 0x96, 0x04, 0x49, 0xff, 0xed, 0x6f, 0x63, 0x4b, 0x50,
+	0xb5, 0xd2, 0xa0, 0xa7, 0xc9, 0x23, 0x12, 0x18, 0x85, 0x6f, 0xfb, 0x22, 0x36, 0x2a, 0x13, 0x9a,
+	0xc6, 0x37, 0xd3, 0xe7, 0x22, 0xf0, 0x40, 0x8e, 0xc0, 0x71, 0xbe, 0xc6, 0xf1, 0x67, 0x78, 0x6b,
+	0xdf, 0xe2, 0x09, 0xc7, 0xf9, 0x4a, 0xc7, 0x9f, 0x27, 0x2f, 0xe0, 0x84, 0xcf, 0x39, 0xce, 0xd7,
+	0x38, 0xfe, 0x22, 0x7d, 0x13, 0x0d, 0x3c, 0x08, 0xba, 0x6b, 0x95, 0x90, 0x9f, 0xa8, 0xef, 0xf7,
+	0x47, 0xb4, 0x4b, 0xc5, 0x51, 0xa1, 0x90, 0x29, 0x7f, 0xfa, 0xf4, 0xe9, 0x53, 0xbe, 0xa5, 0x17,
+	0xb4, 0xda, 0xdf, 0x75, 0xb2, 0x17, 0x0b, 0x23, 0xd6, 0x35, 0xbb, 0xc9, 0xfe, 0x13, 0x79, 0x38,
+	0x91, 0xa8, 0x6b, 0x9f, 0xa2, 0x7b, 0x01, 0x4e, 0x7a, 0x17, 0x33, 0xe2, 0xff, 0x65, 0xc9, 0xae,
+	0x24, 0xa6, 0x23, 0x43, 0x9d, 0xbd, 0x49, 0x7a, 0xd2, 0x1e, 0x92, 0x03, 0x97, 0x89, 0xeb, 0x0d,
+	0x4d, 0xec, 0xaf, 0x31, 0xf1, 0xc8, 0x65, 0x62, 0xc1, 0xbc, 0x7d, 0x4e, 0x48, 0x2a, 0xae, 0x0a,
+	0xed, 0x57, 0x0b, 0x6e, 0x8b, 0x34, 0x0a, 0xea, 0x5f, 0xf3, 0x84, 0xbc, 0x75, 0xd9, 0x47, 0xb7,
+	0x77, 0xef, 0x51, 0xdf, 0x7c, 0x9a, 0xb8, 0xb2, 0x43, 0x3b, 0x93, 0x0f, 0x15, 0xc7, 0xe1, 0x43,
+	0x05, 0xb6, 0xe6, 0x3f, 0xc2, 0xe9, 0x8d, 0x8f, 0xde, 0x59, 0xf2, 0xe8, 0x41, 0x23, 0x4e, 0xe2,
+	0xf0, 0x20, 0x4a, 0x60, 0xfc, 0x44, 0x71, 0x96, 0x7c, 0xa2, 0x58, 0x82, 0x6c, 0x36, 0xe6, 0x90,
+	0xcd, 0x86, 0x79, 0x9e, 0x7a, 0xbf, 0x28, 0xd9, 0x5f, 0xa4, 0xa0, 0xef, 0x14, 0xab, 0xca, 0xeb,
+	0xc6, 0x79, 0xea, 0x75, 0x63, 0x19, 0x38, 0x34, 0xac, 0xbc, 0x7d, 0x9c, 0xa9, 0xaf, 0x06, 0xb9,
+	0x25, 0x3e, 0xe3, 0xf5, 0x35, 0xf6, 0x59, 0xde, 0x66, 0xcf, 0xe7, 0x9e, 0x14, 0xf2, 0x4b, 0xcc,
+	0xca, 0xbb, 0x6d, 0x6c, 0x36, 0xb8, 0xeb, 0x9e, 0xcf, 0xed, 0xe5, 0xc2, 0x12, 0xb0, 0xdc, 0xd9,
+	0x31, 0x38, 0xa8, 0x9b, 0x67, 0xea, 0x6b, 0x45, 0x71, 0x89, 0xcf, 0x78, 0x2f, 0x8e, 0x7d, 0x96,
+	0xd7, 0xe4, 0xa0, 0x62, 0x85, 0xaf, 0x5f, 0xc1, 0x36, 0x3d, 0x48, 0x7b, 0x1d, 0x28, 0xe0, 0x0b,
+	0x4b, 0x38, 0x30, 0x5f, 0x10, 0xf8, 0x9d, 0xbe, 0x8e, 0x5e, 0xbf, 0xf0, 0x1d, 0x65, 0xd1, 0xae,
+	0xea, 0x85, 0x1a, 0x58, 0xae, 0xa2, 0x51, 0xd8, 0x32, 0xe5, 0xe3, 0x5a, 0xe5, 0x20, 0xe8, 0x2a,
+	0x0b, 0x56, 0x3d, 0xbb, 0x11, 0xe1, 0x82, 0x67, 0x37, 0x22, 0xdc, 0xc9, 0x63, 0xc7, 0x17, 0x95,
+	0xea, 0x12, 0x9b, 0xbf, 0x77, 0x7c, 0x11, 0xef, 0x64, 0x18, 0x99, 0xa7, 0x32, 0x4e, 0xb2, 0x87,
+	0x3d, 0x46, 0xdc, 0xa3, 0x14, 0x2e, 0x0e, 0x11, 0x7e, 0x85, 0x20, 0x7c, 0x3d, 0x0c, 0xce, 0x5b,
+	0x1a, 0xd4, 0x06, 0x29, 0x82, 0xf0, 0xcb, 0xfc, 0x86, 0x80, 0xd1, 0xeb, 0xbe, 0x7b, 0x5f, 0xb1,
+	0x10, 0xb2, 0x9f, 0x82, 0xbc, 0x74, 0xef, 0x3b, 0x39, 0xe6, 0x89, 0x97, 0xee, 0xfd, 0xd1, 0x53,
+	0x92, 0xc1, 0x5b, 0x6b, 0x89, 0xe4, 0xdf, 0x5d, 0xbe, 0xbd, 0xbc, 0x7a, 0x7f, 0x59, 0xfe, 0xcc,
+	0x2c, 0x92, 0xec, 0xeb, 0x37, 0x9d, 0x6e, 0xaf, 0xac, 0x99, 0x84, 0xe4, 0xba, 0xed, 0xef, 0xae,
+	0x2e, 0x5f, 0x95, 0x75, 0x98, 0xee, 0xb5, 0x2f, 0x7b, 0x3f, 0x94, 0x49, 0x6b, 0x6d, 0x67, 0x7b,
+	0x98, 0xec, 0x6c, 0xad, 0x0d, 0x3a, 0xdb, 0xa3, 0x74, 0x67, 0x6b, 0xad, 0xed, 0x6c, 0x9f, 0xaf,
+	0xe8, 0x6c, 0xad, 0x0d, 0x3a, 0x5b, 0x65, 0x4d, 0x67, 0x6b, 0xfd, 0x4e, 0xbe, 0xd4, 0x00, 0x47,
+	0xf8, 0xfb, 0x99, 0x22, 0x39, 0xb4, 0x8c, 0x7a, 0x1e, 0xdf, 0x68, 0xda, 0x77, 0xe1, 0x6b, 0x63,
+	0x6b, 0x6d, 0x6f, 0xb3, 0x56, 0xf4, 0xb6, 0xd6, 0x06, 0xbd, 0xed, 0xc9, 0x9a, 0xde, 0x76, 0xf1,
+	0xfc, 0xe7, 0x6f, 0x47, 0x8e, 0xf8, 0x65, 0x36, 0x38, 0xbe, 0x61, 0x93, 0x93, 0x11, 0x1b, 0xf7,
+	0xdd, 0x51, 0xfc, 0x34, 0xfc, 0xc1, 0x3e, 0x59, 0xfd, 0xe8, 0xfd, 0xff, 0x00, 0x00, 0x00, 0xff,
+	0xff, 0x59, 0x20, 0x4f, 0x36, 0x15, 0x17, 0x00, 0x00,
 }
 
 func init() {
 	xxx_Test_ProtoFile_FileDesc.Enums = xxx_Test_ProtoFile_EnumDescs[0:1]
-	xxx_Test_ProtoFile_FileDesc.Messages = xxx_Test_ProtoFile_MessageDescs[0:12]
+	xxx_Test_ProtoFile_FileDesc.Messages = xxx_Test_ProtoFile_MessageDescs[0:16]
 	xxx_Test_ProtoFile_MessageDescs[2].Enums = xxx_Test_ProtoFile_EnumDescs[1:2]
-	xxx_Test_ProtoFile_MessageDescs[3].Messages = xxx_Test_ProtoFile_MessageDescs[12:14]
-	xxx_Test_ProtoFile_MessageDescs[8].Messages = xxx_Test_ProtoFile_MessageDescs[15:21]
-	xxx_Test_ProtoFile_MessageDescs[10].Messages = xxx_Test_ProtoFile_MessageDescs[21:22]
-	xxx_Test_ProtoFile_MessageDescs[12].Messages = xxx_Test_ProtoFile_MessageDescs[14:15]
+	xxx_Test_ProtoFile_MessageDescs[3].Messages = xxx_Test_ProtoFile_MessageDescs[16:18]
+	xxx_Test_ProtoFile_MessageDescs[8].Messages = xxx_Test_ProtoFile_MessageDescs[19:25]
+	xxx_Test_ProtoFile_MessageDescs[10].Messages = xxx_Test_ProtoFile_MessageDescs[25:26]
+	xxx_Test_ProtoFile_MessageDescs[16].Messages = xxx_Test_ProtoFile_MessageDescs[18:19]
 	xxx_Test_ProtoFile_MessageDescs[2].Fields[0].EnumType = xxx_Test_ProtoFile_EnumTypes[0]
 	xxx_Test_ProtoFile_MessageDescs[2].Fields[1].EnumType = xxx_Test_ProtoFile_EnumTypes[0]
 	xxx_Test_ProtoFile_MessageDescs[2].Fields[2].EnumType = xxx_Test_ProtoFile_EnumTypes[1]
 	xxx_Test_ProtoFile_MessageDescs[2].Fields[3].EnumType = xxx_Test_ProtoFile_EnumTypes[1]
 	xxx_Test_ProtoFile_MessageDescs[3].Fields[0].MessageType = xxx_Test_ProtoFile_MessageTypes[4].Type
-	xxx_Test_ProtoFile_MessageDescs[3].Fields[1].MessageType = xxx_Test_ProtoFile_MessageTypes[12].Type
+	xxx_Test_ProtoFile_MessageDescs[3].Fields[1].MessageType = xxx_Test_ProtoFile_MessageTypes[16].Type
 	xxx_Test_ProtoFile_MessageDescs[3].Fields[2].MessageType = xxx_Test_ProtoFile_MessageTypes[4].Type
-	xxx_Test_ProtoFile_MessageDescs[3].Fields[3].MessageType = xxx_Test_ProtoFile_MessageTypes[13].Type
+	xxx_Test_ProtoFile_MessageDescs[3].Fields[3].MessageType = xxx_Test_ProtoFile_MessageTypes[17].Type
 	xxx_Test_ProtoFile_MessageDescs[4].Fields[1].MessageType = xxx_Test_ProtoFile_MessageTypes[4].Type
 	xxx_Test_ProtoFile_MessageDescs[5].Fields[9].EnumType = xxx_Test_ProtoFile_EnumTypes[0]
 	xxx_Test_ProtoFile_MessageDescs[5].Fields[10].MessageType = xxx_Test_ProtoFile_MessageTypes[4].Type
 	xxx_Test_ProtoFile_MessageDescs[7].Fields[1].MessageType = xxx_Test_ProtoFile_MessageTypes[4].Type
-	xxx_Test_ProtoFile_MessageDescs[8].Fields[0].MessageType = xxx_Test_ProtoFile_MessageDescs[15].Reference()
-	xxx_Test_ProtoFile_MessageDescs[8].Fields[1].MessageType = xxx_Test_ProtoFile_MessageDescs[16].Reference()
-	xxx_Test_ProtoFile_MessageDescs[8].Fields[2].MessageType = xxx_Test_ProtoFile_MessageDescs[17].Reference()
-	xxx_Test_ProtoFile_MessageDescs[8].Fields[3].MessageType = xxx_Test_ProtoFile_MessageDescs[18].Reference()
-	xxx_Test_ProtoFile_MessageDescs[8].Fields[4].MessageType = xxx_Test_ProtoFile_MessageDescs[19].Reference()
-	xxx_Test_ProtoFile_MessageDescs[8].Fields[5].MessageType = xxx_Test_ProtoFile_MessageDescs[20].Reference()
+	xxx_Test_ProtoFile_MessageDescs[8].Fields[0].MessageType = xxx_Test_ProtoFile_MessageDescs[19].Reference()
+	xxx_Test_ProtoFile_MessageDescs[8].Fields[1].MessageType = xxx_Test_ProtoFile_MessageDescs[20].Reference()
+	xxx_Test_ProtoFile_MessageDescs[8].Fields[2].MessageType = xxx_Test_ProtoFile_MessageDescs[21].Reference()
+	xxx_Test_ProtoFile_MessageDescs[8].Fields[3].MessageType = xxx_Test_ProtoFile_MessageDescs[22].Reference()
+	xxx_Test_ProtoFile_MessageDescs[8].Fields[4].MessageType = xxx_Test_ProtoFile_MessageDescs[23].Reference()
+	xxx_Test_ProtoFile_MessageDescs[8].Fields[5].MessageType = xxx_Test_ProtoFile_MessageDescs[24].Reference()
 	xxx_Test_ProtoFile_MessageDescs[10].Fields[0].MessageType = xxx_Test_ProtoFile_MessageTypes[9].Type
 	xxx_Test_ProtoFile_MessageDescs[10].Fields[1].MessageType = xxx_Test_ProtoFile_MessageTypes[9].Type
-	xxx_Test_ProtoFile_MessageDescs[10].Fields[2].MessageType = xxx_Test_ProtoFile_MessageDescs[21].Reference()
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[0].MessageType = protoimpl.X.MessageTypeOf((*wrappers.BoolValue)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[1].MessageType = protoimpl.X.MessageTypeOf((*wrappers.Int32Value)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[2].MessageType = protoimpl.X.MessageTypeOf((*wrappers.Int64Value)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[3].MessageType = protoimpl.X.MessageTypeOf((*wrappers.UInt32Value)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[4].MessageType = protoimpl.X.MessageTypeOf((*wrappers.UInt64Value)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[5].MessageType = protoimpl.X.MessageTypeOf((*wrappers.FloatValue)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[6].MessageType = protoimpl.X.MessageTypeOf((*wrappers.DoubleValue)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[7].MessageType = protoimpl.X.MessageTypeOf((*wrappers.StringValue)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[8].MessageType = protoimpl.X.MessageTypeOf((*wrappers.BytesValue)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[9].MessageType = protoimpl.X.MessageTypeOf((*duration.Duration)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[10].MessageType = protoimpl.X.MessageTypeOf((*timestamp.Timestamp)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[11].MessageType = protoimpl.X.MessageTypeOf((*_struct.Struct)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[12].MessageType = protoimpl.X.MessageTypeOf((*_struct.ListValue)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[13].MessageType = protoimpl.X.MessageTypeOf((*_struct.Value)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[14].MessageType = protoimpl.X.MessageTypeOf((*empty.Empty)(nil))
-	xxx_Test_ProtoFile_MessageDescs[11].Fields[15].MessageType = protoimpl.X.MessageTypeOf((*any.Any)(nil))
-	xxx_Test_ProtoFile_MessageDescs[12].Fields[2].MessageType = xxx_Test_ProtoFile_MessageTypes[4].Type
-	xxx_Test_ProtoFile_MessageDescs[12].Fields[3].MessageType = xxx_Test_ProtoFile_MessageTypes[14].Type
-	xxx_Test_ProtoFile_MessageDescs[14].Fields[0].EnumType = xxx_Test_ProtoFile_EnumTypes[0]
-	xxx_Test_ProtoFile_MessageDescs[18].Fields[1].EnumType = xxx_Test_ProtoFile_EnumTypes[0]
-	xxx_Test_ProtoFile_MessageDescs[19].Fields[1].MessageType = xxx_Test_ProtoFile_MessageTypes[4].Type
-	xxx_Test_ProtoFile_MessageDescs[20].Fields[1].MessageType = xxx_Test_ProtoFile_MessageTypes[7].Type
-	xxx_Test_ProtoFile_MessageDescs[21].Fields[1].MessageType = xxx_Test_ProtoFile_MessageTypes[9].Type
+	xxx_Test_ProtoFile_MessageDescs[10].Fields[2].MessageType = xxx_Test_ProtoFile_MessageDescs[25].Reference()
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[0].MessageType = protoimpl.X.MessageTypeOf((*wrappers.BoolValue)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[1].MessageType = protoimpl.X.MessageTypeOf((*wrappers.Int32Value)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[2].MessageType = protoimpl.X.MessageTypeOf((*wrappers.Int64Value)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[3].MessageType = protoimpl.X.MessageTypeOf((*wrappers.UInt32Value)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[4].MessageType = protoimpl.X.MessageTypeOf((*wrappers.UInt64Value)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[5].MessageType = protoimpl.X.MessageTypeOf((*wrappers.FloatValue)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[6].MessageType = protoimpl.X.MessageTypeOf((*wrappers.DoubleValue)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[7].MessageType = protoimpl.X.MessageTypeOf((*wrappers.StringValue)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[8].MessageType = protoimpl.X.MessageTypeOf((*wrappers.BytesValue)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[9].MessageType = protoimpl.X.MessageTypeOf((*duration.Duration)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[10].MessageType = protoimpl.X.MessageTypeOf((*timestamp.Timestamp)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[11].MessageType = protoimpl.X.MessageTypeOf((*_struct.Struct)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[12].MessageType = protoimpl.X.MessageTypeOf((*_struct.ListValue)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[13].MessageType = protoimpl.X.MessageTypeOf((*_struct.Value)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[14].MessageType = protoimpl.X.MessageTypeOf((*empty.Empty)(nil))
+	xxx_Test_ProtoFile_MessageDescs[15].Fields[15].MessageType = protoimpl.X.MessageTypeOf((*any.Any)(nil))
+	xxx_Test_ProtoFile_MessageDescs[16].Fields[2].MessageType = xxx_Test_ProtoFile_MessageTypes[4].Type
+	xxx_Test_ProtoFile_MessageDescs[16].Fields[3].MessageType = xxx_Test_ProtoFile_MessageTypes[18].Type
+	xxx_Test_ProtoFile_MessageDescs[18].Fields[0].EnumType = xxx_Test_ProtoFile_EnumTypes[0]
+	xxx_Test_ProtoFile_MessageDescs[22].Fields[1].EnumType = xxx_Test_ProtoFile_EnumTypes[0]
+	xxx_Test_ProtoFile_MessageDescs[23].Fields[1].MessageType = xxx_Test_ProtoFile_MessageTypes[4].Type
+	xxx_Test_ProtoFile_MessageDescs[24].Fields[1].MessageType = xxx_Test_ProtoFile_MessageTypes[7].Type
+	xxx_Test_ProtoFile_MessageDescs[25].Fields[1].MessageType = xxx_Test_ProtoFile_MessageTypes[9].Type
 	var err error
 	Test_ProtoFile, err = prototype.NewFile(&xxx_Test_ProtoFile_FileDesc)
 	if err != nil {
@@ -1807,7 +2246,7 @@
 		},
 	},
 }
-var xxx_Test_ProtoFile_MessageTypes = [22]protoimpl.MessageType{
+var xxx_Test_ProtoFile_MessageTypes = [26]protoimpl.MessageType{
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[0].Reference(),
 		func(protoreflect.MessageType) protoreflect.ProtoMessage {
@@ -1877,24 +2316,48 @@
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[11].Reference(),
 		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(KnownTypes)
+			return new(Extensions)
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[12].Reference(),
 		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Nests_OptGroup)
+			return new(ExtensionsContainer)
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[13].Reference(),
 		func(protoreflect.MessageType) protoreflect.ProtoMessage {
-			return new(Nests_RptGroup)
+			return new(MessageSet)
 		},
 	)},
 	{Type: prototype.GoMessage(
 		xxx_Test_ProtoFile_MessageDescs[14].Reference(),
 		func(protoreflect.MessageType) protoreflect.ProtoMessage {
+			return new(MessageSetExtension)
+		},
+	)},
+	{Type: prototype.GoMessage(
+		xxx_Test_ProtoFile_MessageDescs[15].Reference(),
+		func(protoreflect.MessageType) protoreflect.ProtoMessage {
+			return new(KnownTypes)
+		},
+	)},
+	{Type: prototype.GoMessage(
+		xxx_Test_ProtoFile_MessageDescs[16].Reference(),
+		func(protoreflect.MessageType) protoreflect.ProtoMessage {
+			return new(Nests_OptGroup)
+		},
+	)},
+	{Type: prototype.GoMessage(
+		xxx_Test_ProtoFile_MessageDescs[17].Reference(),
+		func(protoreflect.MessageType) protoreflect.ProtoMessage {
+			return new(Nests_RptGroup)
+		},
+	)},
+	{Type: prototype.GoMessage(
+		xxx_Test_ProtoFile_MessageDescs[18].Reference(),
+		func(protoreflect.MessageType) protoreflect.ProtoMessage {
 			return new(Nests_OptGroup_OptNestedGroup)
 		},
 	)},
@@ -1906,7 +2369,7 @@
 	{ /* no message type for Maps_StrToOneofsEntry */ },
 	{ /* no message type for IndirectRequired_StrToNestedEntry */ },
 }
-var xxx_Test_ProtoFile_MessageDescs = [22]prototype.Message{
+var xxx_Test_ProtoFile_MessageDescs = [26]prototype.Message{
 	{
 		Name: "Scalars",
 		Fields: []prototype.Field{
@@ -2441,6 +2904,56 @@
 		},
 	},
 	{
+		Name: "Extensions",
+		Fields: []prototype.Field{
+			{
+				Name:        "opt_string",
+				Number:      1,
+				Cardinality: protoreflect.Optional,
+				Kind:        protoreflect.StringKind,
+				JSONName:    "optString",
+				IsPacked:    prototype.False,
+			},
+			{
+				Name:        "opt_bool",
+				Number:      101,
+				Cardinality: protoreflect.Optional,
+				Kind:        protoreflect.BoolKind,
+				JSONName:    "optBool",
+				IsPacked:    prototype.False,
+			},
+			{
+				Name:        "opt_int32",
+				Number:      2,
+				Cardinality: protoreflect.Optional,
+				Kind:        protoreflect.Int32Kind,
+				JSONName:    "optInt32",
+				IsPacked:    prototype.False,
+			},
+		},
+		ExtensionRanges: [][2]protoreflect.FieldNumber{{20, 101}},
+	},
+	{
+		Name: "ExtensionsContainer",
+	},
+	{
+		Name:            "MessageSet",
+		ExtensionRanges: [][2]protoreflect.FieldNumber{{4, 2147483647}},
+	},
+	{
+		Name: "MessageSetExtension",
+		Fields: []prototype.Field{
+			{
+				Name:        "opt_string",
+				Number:      1,
+				Cardinality: protoreflect.Optional,
+				Kind:        protoreflect.StringKind,
+				JSONName:    "optString",
+				IsPacked:    prototype.False,
+			},
+		},
+	},
+	{
 		Name: "KnownTypes",
 		Fields: []prototype.Field{
 			{
diff --git a/encoding/textpb/testprotos/pb2/test.proto b/encoding/textpb/testprotos/pb2/test.proto
index 35f585b..861dd24 100644
--- a/encoding/textpb/testprotos/pb2/test.proto
+++ b/encoding/textpb/testprotos/pb2/test.proto
@@ -138,6 +138,7 @@
 }
 
 // Following messages are for testing required field nested in optional, repeated and map fields.
+
 message NestedWithRequired {
   required string req_string = 1;
 }
@@ -148,6 +149,57 @@
   map<string, NestedWithRequired> str_to_nested = 3;
 }
 
+// Following messages are for testing extensions.
+
+message Extensions {
+  optional string opt_string = 1;
+  extensions 20 to 100;
+  optional bool opt_bool = 101;
+  optional int32 opt_int32 = 2;
+}
+
+extend Extensions {
+  optional bool opt_ext_bool = 21;
+  optional string opt_ext_string = 22;
+  optional Enum opt_ext_enum = 23;
+  optional Nested opt_ext_nested = 24;
+
+  repeated fixed32 rpt_ext_fixed32 = 31;
+  repeated Enum rpt_ext_enum = 32;
+  repeated Nested rpt_ext_nested = 33;
+}
+
+message ExtensionsContainer {
+  extend Extensions {
+    optional bool opt_ext_bool = 51;
+    optional string opt_ext_string = 52;
+    optional Enum opt_ext_enum = 53;
+    optional Nested opt_ext_nested = 54;
+
+    repeated string rpt_ext_string = 61;
+    repeated Enum rpt_ext_enum = 62;
+    repeated Nested rpt_ext_nested = 63;
+  }
+}
+
+// Following messages are for testing MessageSet.
+
+message MessageSet {
+  option message_set_wire_format = true;
+
+  extensions 4 to max;
+}
+
+message MessageSetExtension {
+  optional string opt_string = 1;
+
+  extend MessageSet {
+    optional MessageSetExtension message_set_extension = 10;
+    optional MessageSetExtension not_message_set_extension = 20;
+    optional Nested ext_nested = 30;
+  }
+}
+
 // Message contains well-known type fields.
 message KnownTypes {
   optional google.protobuf.BoolValue opt_bool = 1;