// Copyright 2024 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Test Protobuf definitions with proto2 syntax.

// Code generated by protoc-gen-go. DO NOT EDIT.
// source: internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto

//go:build protoopaque

package textpbeditions_hybrid

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	_ "google.golang.org/protobuf/types/gofeaturespb"
	anypb "google.golang.org/protobuf/types/known/anypb"
	durationpb "google.golang.org/protobuf/types/known/durationpb"
	emptypb "google.golang.org/protobuf/types/known/emptypb"
	fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb"
	structpb "google.golang.org/protobuf/types/known/structpb"
	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
	wrapperspb "google.golang.org/protobuf/types/known/wrapperspb"
	reflect "reflect"
	unsafe "unsafe"
)

type Enum int32

const (
	Enum_ONE Enum = 1
	Enum_TWO Enum = 2
	Enum_TEN Enum = 10
)

// Enum value maps for Enum.
var (
	Enum_name = map[int32]string{
		1:  "ONE",
		2:  "TWO",
		10: "TEN",
	}
	Enum_value = map[string]int32{
		"ONE": 1,
		"TWO": 2,
		"TEN": 10,
	}
)

func (x Enum) Enum() *Enum {
	p := new(Enum)
	*p = x
	return p
}

func (x Enum) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Enum) Descriptor() protoreflect.EnumDescriptor {
	return file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_enumTypes[0].Descriptor()
}

func (Enum) Type() protoreflect.EnumType {
	return &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_enumTypes[0]
}

func (x Enum) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

type OpenEnum int32

const (
	OpenEnum_UNKNOWN OpenEnum = 0
	OpenEnum_EINS    OpenEnum = 1
	OpenEnum_ZWEI    OpenEnum = 2
	OpenEnum_ZEHN    OpenEnum = 10
)

// Enum value maps for OpenEnum.
var (
	OpenEnum_name = map[int32]string{
		0:  "UNKNOWN",
		1:  "EINS",
		2:  "ZWEI",
		10: "ZEHN",
	}
	OpenEnum_value = map[string]int32{
		"UNKNOWN": 0,
		"EINS":    1,
		"ZWEI":    2,
		"ZEHN":    10,
	}
)

func (x OpenEnum) Enum() *OpenEnum {
	p := new(OpenEnum)
	*p = x
	return p
}

func (x OpenEnum) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (OpenEnum) Descriptor() protoreflect.EnumDescriptor {
	return file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_enumTypes[1].Descriptor()
}

func (OpenEnum) Type() protoreflect.EnumType {
	return &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_enumTypes[1]
}

func (x OpenEnum) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

type Enums_NestedEnum int32

const (
	Enums_UNO  Enums_NestedEnum = 1
	Enums_DOS  Enums_NestedEnum = 2
	Enums_DIEZ Enums_NestedEnum = 10
)

// Enum value maps for Enums_NestedEnum.
var (
	Enums_NestedEnum_name = map[int32]string{
		1:  "UNO",
		2:  "DOS",
		10: "DIEZ",
	}
	Enums_NestedEnum_value = map[string]int32{
		"UNO":  1,
		"DOS":  2,
		"DIEZ": 10,
	}
)

func (x Enums_NestedEnum) Enum() *Enums_NestedEnum {
	p := new(Enums_NestedEnum)
	*p = x
	return p
}

func (x Enums_NestedEnum) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Enums_NestedEnum) Descriptor() protoreflect.EnumDescriptor {
	return file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_enumTypes[2].Descriptor()
}

func (Enums_NestedEnum) Type() protoreflect.EnumType {
	return &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_enumTypes[2]
}

func (x Enums_NestedEnum) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

type Enums_NestedOpenEnum int32

const (
	Enums_UNKNOWN Enums_NestedOpenEnum = 0
	Enums_EINS    Enums_NestedOpenEnum = 1
	Enums_ZWEI    Enums_NestedOpenEnum = 2
	Enums_ZEHN    Enums_NestedOpenEnum = 10
)

// Enum value maps for Enums_NestedOpenEnum.
var (
	Enums_NestedOpenEnum_name = map[int32]string{
		0:  "UNKNOWN",
		1:  "EINS",
		2:  "ZWEI",
		10: "ZEHN",
	}
	Enums_NestedOpenEnum_value = map[string]int32{
		"UNKNOWN": 0,
		"EINS":    1,
		"ZWEI":    2,
		"ZEHN":    10,
	}
)

func (x Enums_NestedOpenEnum) Enum() *Enums_NestedOpenEnum {
	p := new(Enums_NestedOpenEnum)
	*p = x
	return p
}

func (x Enums_NestedOpenEnum) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Enums_NestedOpenEnum) Descriptor() protoreflect.EnumDescriptor {
	return file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_enumTypes[3].Descriptor()
}

func (Enums_NestedOpenEnum) Type() protoreflect.EnumType {
	return &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_enumTypes[3]
}

func (x Enums_NestedOpenEnum) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Scalars contains scalar fields.
type Scalars struct {
	state                  protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_OptBool     bool                   `protobuf:"varint,1,opt,name=opt_bool,json=optBool"`
	xxx_hidden_OptInt32    int32                  `protobuf:"varint,2,opt,name=opt_int32,json=optInt32"`
	xxx_hidden_OptInt64    int64                  `protobuf:"varint,3,opt,name=opt_int64,json=optInt64"`
	xxx_hidden_OptUint32   uint32                 `protobuf:"varint,4,opt,name=opt_uint32,json=optUint32"`
	xxx_hidden_OptUint64   uint64                 `protobuf:"varint,5,opt,name=opt_uint64,json=optUint64"`
	xxx_hidden_OptSint32   int32                  `protobuf:"zigzag32,6,opt,name=opt_sint32,json=optSint32"`
	xxx_hidden_OptSint64   int64                  `protobuf:"zigzag64,7,opt,name=opt_sint64,json=optSint64"`
	xxx_hidden_OptFixed32  uint32                 `protobuf:"fixed32,8,opt,name=opt_fixed32,json=optFixed32"`
	xxx_hidden_OptFixed64  uint64                 `protobuf:"fixed64,9,opt,name=opt_fixed64,json=optFixed64"`
	xxx_hidden_OptSfixed32 int32                  `protobuf:"fixed32,10,opt,name=opt_sfixed32,json=optSfixed32"`
	xxx_hidden_OptSfixed64 int64                  `protobuf:"fixed64,11,opt,name=opt_sfixed64,json=optSfixed64"`
	xxx_hidden_OptFloat    float32                `protobuf:"fixed32,20,opt,name=opt_float,json=optFloat"`
	xxx_hidden_OptDouble   float64                `protobuf:"fixed64,21,opt,name=opt_double,json=optDouble"`
	xxx_hidden_OptBytes    []byte                 `protobuf:"bytes,14,opt,name=opt_bytes,json=optBytes"`
	xxx_hidden_OptString   *string                `protobuf:"bytes,13,opt,name=opt_string,json=optString"`
	XXX_raceDetectHookData protoimpl.RaceDetectHookData
	XXX_presence           [1]uint32
	unknownFields          protoimpl.UnknownFields
	sizeCache              protoimpl.SizeCache
}

func (x *Scalars) Reset() {
	*x = Scalars{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[0]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Scalars) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Scalars) ProtoMessage() {}

func (x *Scalars) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[0]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *Scalars) GetOptBool() bool {
	if x != nil {
		return x.xxx_hidden_OptBool
	}
	return false
}

func (x *Scalars) GetOptInt32() int32 {
	if x != nil {
		return x.xxx_hidden_OptInt32
	}
	return 0
}

func (x *Scalars) GetOptInt64() int64 {
	if x != nil {
		return x.xxx_hidden_OptInt64
	}
	return 0
}

func (x *Scalars) GetOptUint32() uint32 {
	if x != nil {
		return x.xxx_hidden_OptUint32
	}
	return 0
}

func (x *Scalars) GetOptUint64() uint64 {
	if x != nil {
		return x.xxx_hidden_OptUint64
	}
	return 0
}

func (x *Scalars) GetOptSint32() int32 {
	if x != nil {
		return x.xxx_hidden_OptSint32
	}
	return 0
}

func (x *Scalars) GetOptSint64() int64 {
	if x != nil {
		return x.xxx_hidden_OptSint64
	}
	return 0
}

func (x *Scalars) GetOptFixed32() uint32 {
	if x != nil {
		return x.xxx_hidden_OptFixed32
	}
	return 0
}

func (x *Scalars) GetOptFixed64() uint64 {
	if x != nil {
		return x.xxx_hidden_OptFixed64
	}
	return 0
}

func (x *Scalars) GetOptSfixed32() int32 {
	if x != nil {
		return x.xxx_hidden_OptSfixed32
	}
	return 0
}

func (x *Scalars) GetOptSfixed64() int64 {
	if x != nil {
		return x.xxx_hidden_OptSfixed64
	}
	return 0
}

func (x *Scalars) GetOptFloat() float32 {
	if x != nil {
		return x.xxx_hidden_OptFloat
	}
	return 0
}

func (x *Scalars) GetOptDouble() float64 {
	if x != nil {
		return x.xxx_hidden_OptDouble
	}
	return 0
}

func (x *Scalars) GetOptBytes() []byte {
	if x != nil {
		return x.xxx_hidden_OptBytes
	}
	return nil
}

func (x *Scalars) GetOptString() string {
	if x != nil {
		if x.xxx_hidden_OptString != nil {
			return *x.xxx_hidden_OptString
		}
		return ""
	}
	return ""
}

func (x *Scalars) SetOptBool(v bool) {
	x.xxx_hidden_OptBool = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 15)
}

func (x *Scalars) SetOptInt32(v int32) {
	x.xxx_hidden_OptInt32 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 15)
}

func (x *Scalars) SetOptInt64(v int64) {
	x.xxx_hidden_OptInt64 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 2, 15)
}

func (x *Scalars) SetOptUint32(v uint32) {
	x.xxx_hidden_OptUint32 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 3, 15)
}

func (x *Scalars) SetOptUint64(v uint64) {
	x.xxx_hidden_OptUint64 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 4, 15)
}

func (x *Scalars) SetOptSint32(v int32) {
	x.xxx_hidden_OptSint32 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 5, 15)
}

func (x *Scalars) SetOptSint64(v int64) {
	x.xxx_hidden_OptSint64 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 6, 15)
}

func (x *Scalars) SetOptFixed32(v uint32) {
	x.xxx_hidden_OptFixed32 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 7, 15)
}

func (x *Scalars) SetOptFixed64(v uint64) {
	x.xxx_hidden_OptFixed64 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 8, 15)
}

func (x *Scalars) SetOptSfixed32(v int32) {
	x.xxx_hidden_OptSfixed32 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 9, 15)
}

func (x *Scalars) SetOptSfixed64(v int64) {
	x.xxx_hidden_OptSfixed64 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 10, 15)
}

func (x *Scalars) SetOptFloat(v float32) {
	x.xxx_hidden_OptFloat = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 11, 15)
}

func (x *Scalars) SetOptDouble(v float64) {
	x.xxx_hidden_OptDouble = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 12, 15)
}

func (x *Scalars) SetOptBytes(v []byte) {
	if v == nil {
		v = []byte{}
	}
	x.xxx_hidden_OptBytes = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 13, 15)
}

func (x *Scalars) SetOptString(v string) {
	x.xxx_hidden_OptString = &v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 14, 15)
}

func (x *Scalars) HasOptBool() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 0)
}

func (x *Scalars) HasOptInt32() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 1)
}

func (x *Scalars) HasOptInt64() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 2)
}

func (x *Scalars) HasOptUint32() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 3)
}

func (x *Scalars) HasOptUint64() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 4)
}

func (x *Scalars) HasOptSint32() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 5)
}

func (x *Scalars) HasOptSint64() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 6)
}

func (x *Scalars) HasOptFixed32() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 7)
}

func (x *Scalars) HasOptFixed64() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 8)
}

func (x *Scalars) HasOptSfixed32() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 9)
}

func (x *Scalars) HasOptSfixed64() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 10)
}

func (x *Scalars) HasOptFloat() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 11)
}

func (x *Scalars) HasOptDouble() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 12)
}

func (x *Scalars) HasOptBytes() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 13)
}

func (x *Scalars) HasOptString() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 14)
}

func (x *Scalars) ClearOptBool() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0)
	x.xxx_hidden_OptBool = false
}

func (x *Scalars) ClearOptInt32() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 1)
	x.xxx_hidden_OptInt32 = 0
}

func (x *Scalars) ClearOptInt64() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 2)
	x.xxx_hidden_OptInt64 = 0
}

func (x *Scalars) ClearOptUint32() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 3)
	x.xxx_hidden_OptUint32 = 0
}

func (x *Scalars) ClearOptUint64() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 4)
	x.xxx_hidden_OptUint64 = 0
}

func (x *Scalars) ClearOptSint32() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 5)
	x.xxx_hidden_OptSint32 = 0
}

func (x *Scalars) ClearOptSint64() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 6)
	x.xxx_hidden_OptSint64 = 0
}

func (x *Scalars) ClearOptFixed32() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 7)
	x.xxx_hidden_OptFixed32 = 0
}

func (x *Scalars) ClearOptFixed64() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 8)
	x.xxx_hidden_OptFixed64 = 0
}

func (x *Scalars) ClearOptSfixed32() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 9)
	x.xxx_hidden_OptSfixed32 = 0
}

func (x *Scalars) ClearOptSfixed64() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 10)
	x.xxx_hidden_OptSfixed64 = 0
}

func (x *Scalars) ClearOptFloat() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 11)
	x.xxx_hidden_OptFloat = 0
}

func (x *Scalars) ClearOptDouble() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 12)
	x.xxx_hidden_OptDouble = 0
}

func (x *Scalars) ClearOptBytes() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 13)
	x.xxx_hidden_OptBytes = nil
}

func (x *Scalars) ClearOptString() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 14)
	x.xxx_hidden_OptString = nil
}

type Scalars_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	OptBool     *bool
	OptInt32    *int32
	OptInt64    *int64
	OptUint32   *uint32
	OptUint64   *uint64
	OptSint32   *int32
	OptSint64   *int64
	OptFixed32  *uint32
	OptFixed64  *uint64
	OptSfixed32 *int32
	OptSfixed64 *int64
	OptFloat    *float32
	OptDouble   *float64
	OptBytes    []byte
	OptString   *string
}

func (b0 Scalars_builder) Build() *Scalars {
	m0 := &Scalars{}
	b, x := &b0, m0
	_, _ = b, x
	if b.OptBool != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 15)
		x.xxx_hidden_OptBool = *b.OptBool
	}
	if b.OptInt32 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 15)
		x.xxx_hidden_OptInt32 = *b.OptInt32
	}
	if b.OptInt64 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 2, 15)
		x.xxx_hidden_OptInt64 = *b.OptInt64
	}
	if b.OptUint32 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 3, 15)
		x.xxx_hidden_OptUint32 = *b.OptUint32
	}
	if b.OptUint64 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 4, 15)
		x.xxx_hidden_OptUint64 = *b.OptUint64
	}
	if b.OptSint32 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 5, 15)
		x.xxx_hidden_OptSint32 = *b.OptSint32
	}
	if b.OptSint64 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 6, 15)
		x.xxx_hidden_OptSint64 = *b.OptSint64
	}
	if b.OptFixed32 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 7, 15)
		x.xxx_hidden_OptFixed32 = *b.OptFixed32
	}
	if b.OptFixed64 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 8, 15)
		x.xxx_hidden_OptFixed64 = *b.OptFixed64
	}
	if b.OptSfixed32 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 9, 15)
		x.xxx_hidden_OptSfixed32 = *b.OptSfixed32
	}
	if b.OptSfixed64 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 10, 15)
		x.xxx_hidden_OptSfixed64 = *b.OptSfixed64
	}
	if b.OptFloat != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 11, 15)
		x.xxx_hidden_OptFloat = *b.OptFloat
	}
	if b.OptDouble != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 12, 15)
		x.xxx_hidden_OptDouble = *b.OptDouble
	}
	if b.OptBytes != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 13, 15)
		x.xxx_hidden_OptBytes = b.OptBytes
	}
	if b.OptString != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 14, 15)
		x.xxx_hidden_OptString = b.OptString
	}
	return m0
}

// ImplicitScalars contains scalar field types with implicit field_presence
type ImplicitScalars struct {
	state                protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_SBool     bool                   `protobuf:"varint,1,opt,name=s_bool,json=sBool"`
	xxx_hidden_SInt32    int32                  `protobuf:"varint,2,opt,name=s_int32,json=sInt32"`
	xxx_hidden_SInt64    int64                  `protobuf:"varint,3,opt,name=s_int64,json=sInt64"`
	xxx_hidden_SUint32   uint32                 `protobuf:"varint,4,opt,name=s_uint32,json=sUint32"`
	xxx_hidden_SUint64   uint64                 `protobuf:"varint,5,opt,name=s_uint64,json=sUint64"`
	xxx_hidden_SSint32   int32                  `protobuf:"zigzag32,6,opt,name=s_sint32,json=sSint32"`
	xxx_hidden_SSint64   int64                  `protobuf:"zigzag64,7,opt,name=s_sint64,json=sSint64"`
	xxx_hidden_SFixed32  uint32                 `protobuf:"fixed32,8,opt,name=s_fixed32,json=sFixed32"`
	xxx_hidden_SFixed64  uint64                 `protobuf:"fixed64,9,opt,name=s_fixed64,json=sFixed64"`
	xxx_hidden_SSfixed32 int32                  `protobuf:"fixed32,10,opt,name=s_sfixed32,json=sSfixed32"`
	xxx_hidden_SSfixed64 int64                  `protobuf:"fixed64,11,opt,name=s_sfixed64,json=sSfixed64"`
	xxx_hidden_SFloat    float32                `protobuf:"fixed32,20,opt,name=s_float,json=sFloat"`
	xxx_hidden_SDouble   float64                `protobuf:"fixed64,21,opt,name=s_double,json=sDouble"`
	xxx_hidden_SBytes    []byte                 `protobuf:"bytes,14,opt,name=s_bytes,json=sBytes"`
	xxx_hidden_SString   string                 `protobuf:"bytes,13,opt,name=s_string,json=sString"`
	unknownFields        protoimpl.UnknownFields
	sizeCache            protoimpl.SizeCache
}

func (x *ImplicitScalars) Reset() {
	*x = ImplicitScalars{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[1]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ImplicitScalars) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ImplicitScalars) ProtoMessage() {}

func (x *ImplicitScalars) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[1]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *ImplicitScalars) GetSBool() bool {
	if x != nil {
		return x.xxx_hidden_SBool
	}
	return false
}

func (x *ImplicitScalars) GetSInt32() int32 {
	if x != nil {
		return x.xxx_hidden_SInt32
	}
	return 0
}

func (x *ImplicitScalars) GetSInt64() int64 {
	if x != nil {
		return x.xxx_hidden_SInt64
	}
	return 0
}

func (x *ImplicitScalars) GetSUint32() uint32 {
	if x != nil {
		return x.xxx_hidden_SUint32
	}
	return 0
}

func (x *ImplicitScalars) GetSUint64() uint64 {
	if x != nil {
		return x.xxx_hidden_SUint64
	}
	return 0
}

func (x *ImplicitScalars) GetSSint32() int32 {
	if x != nil {
		return x.xxx_hidden_SSint32
	}
	return 0
}

func (x *ImplicitScalars) GetSSint64() int64 {
	if x != nil {
		return x.xxx_hidden_SSint64
	}
	return 0
}

func (x *ImplicitScalars) GetSFixed32() uint32 {
	if x != nil {
		return x.xxx_hidden_SFixed32
	}
	return 0
}

func (x *ImplicitScalars) GetSFixed64() uint64 {
	if x != nil {
		return x.xxx_hidden_SFixed64
	}
	return 0
}

func (x *ImplicitScalars) GetSSfixed32() int32 {
	if x != nil {
		return x.xxx_hidden_SSfixed32
	}
	return 0
}

func (x *ImplicitScalars) GetSSfixed64() int64 {
	if x != nil {
		return x.xxx_hidden_SSfixed64
	}
	return 0
}

func (x *ImplicitScalars) GetSFloat() float32 {
	if x != nil {
		return x.xxx_hidden_SFloat
	}
	return 0
}

func (x *ImplicitScalars) GetSDouble() float64 {
	if x != nil {
		return x.xxx_hidden_SDouble
	}
	return 0
}

func (x *ImplicitScalars) GetSBytes() []byte {
	if x != nil {
		return x.xxx_hidden_SBytes
	}
	return nil
}

func (x *ImplicitScalars) GetSString() string {
	if x != nil {
		return x.xxx_hidden_SString
	}
	return ""
}

func (x *ImplicitScalars) SetSBool(v bool) {
	x.xxx_hidden_SBool = v
}

func (x *ImplicitScalars) SetSInt32(v int32) {
	x.xxx_hidden_SInt32 = v
}

func (x *ImplicitScalars) SetSInt64(v int64) {
	x.xxx_hidden_SInt64 = v
}

func (x *ImplicitScalars) SetSUint32(v uint32) {
	x.xxx_hidden_SUint32 = v
}

func (x *ImplicitScalars) SetSUint64(v uint64) {
	x.xxx_hidden_SUint64 = v
}

func (x *ImplicitScalars) SetSSint32(v int32) {
	x.xxx_hidden_SSint32 = v
}

func (x *ImplicitScalars) SetSSint64(v int64) {
	x.xxx_hidden_SSint64 = v
}

func (x *ImplicitScalars) SetSFixed32(v uint32) {
	x.xxx_hidden_SFixed32 = v
}

func (x *ImplicitScalars) SetSFixed64(v uint64) {
	x.xxx_hidden_SFixed64 = v
}

func (x *ImplicitScalars) SetSSfixed32(v int32) {
	x.xxx_hidden_SSfixed32 = v
}

func (x *ImplicitScalars) SetSSfixed64(v int64) {
	x.xxx_hidden_SSfixed64 = v
}

func (x *ImplicitScalars) SetSFloat(v float32) {
	x.xxx_hidden_SFloat = v
}

func (x *ImplicitScalars) SetSDouble(v float64) {
	x.xxx_hidden_SDouble = v
}

func (x *ImplicitScalars) SetSBytes(v []byte) {
	if v == nil {
		v = []byte{}
	}
	x.xxx_hidden_SBytes = v
}

func (x *ImplicitScalars) SetSString(v string) {
	x.xxx_hidden_SString = v
}

type ImplicitScalars_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	SBool     bool
	SInt32    int32
	SInt64    int64
	SUint32   uint32
	SUint64   uint64
	SSint32   int32
	SSint64   int64
	SFixed32  uint32
	SFixed64  uint64
	SSfixed32 int32
	SSfixed64 int64
	SFloat    float32
	SDouble   float64
	SBytes    []byte
	SString   string
}

func (b0 ImplicitScalars_builder) Build() *ImplicitScalars {
	m0 := &ImplicitScalars{}
	b, x := &b0, m0
	_, _ = b, x
	x.xxx_hidden_SBool = b.SBool
	x.xxx_hidden_SInt32 = b.SInt32
	x.xxx_hidden_SInt64 = b.SInt64
	x.xxx_hidden_SUint32 = b.SUint32
	x.xxx_hidden_SUint64 = b.SUint64
	x.xxx_hidden_SSint32 = b.SSint32
	x.xxx_hidden_SSint64 = b.SSint64
	x.xxx_hidden_SFixed32 = b.SFixed32
	x.xxx_hidden_SFixed64 = b.SFixed64
	x.xxx_hidden_SSfixed32 = b.SSfixed32
	x.xxx_hidden_SSfixed64 = b.SSfixed64
	x.xxx_hidden_SFloat = b.SFloat
	x.xxx_hidden_SDouble = b.SDouble
	x.xxx_hidden_SBytes = b.SBytes
	x.xxx_hidden_SString = b.SString
	return m0
}

type UTF8Validated struct {
	state                      protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_ValidatedString string                 `protobuf:"bytes,1,opt,name=validated_string,json=validatedString"`
	unknownFields              protoimpl.UnknownFields
	sizeCache                  protoimpl.SizeCache
}

func (x *UTF8Validated) Reset() {
	*x = UTF8Validated{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[2]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *UTF8Validated) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*UTF8Validated) ProtoMessage() {}

func (x *UTF8Validated) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[2]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *UTF8Validated) GetValidatedString() string {
	if x != nil {
		return x.xxx_hidden_ValidatedString
	}
	return ""
}

func (x *UTF8Validated) SetValidatedString(v string) {
	x.xxx_hidden_ValidatedString = v
}

type UTF8Validated_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	ValidatedString string
}

func (b0 UTF8Validated_builder) Build() *UTF8Validated {
	m0 := &UTF8Validated{}
	b, x := &b0, m0
	_, _ = b, x
	x.xxx_hidden_ValidatedString = b.ValidatedString
	return m0
}

type NestsUTF8Validated struct {
	state                       protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_ValidatedMessage *UTF8Validated         `protobuf:"bytes,1,opt,name=validated_message,json=validatedMessage"`
	unknownFields               protoimpl.UnknownFields
	sizeCache                   protoimpl.SizeCache
}

func (x *NestsUTF8Validated) Reset() {
	*x = NestsUTF8Validated{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[3]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *NestsUTF8Validated) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*NestsUTF8Validated) ProtoMessage() {}

func (x *NestsUTF8Validated) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[3]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *NestsUTF8Validated) GetValidatedMessage() *UTF8Validated {
	if x != nil {
		return x.xxx_hidden_ValidatedMessage
	}
	return nil
}

func (x *NestsUTF8Validated) SetValidatedMessage(v *UTF8Validated) {
	x.xxx_hidden_ValidatedMessage = v
}

func (x *NestsUTF8Validated) HasValidatedMessage() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_ValidatedMessage != nil
}

func (x *NestsUTF8Validated) ClearValidatedMessage() {
	x.xxx_hidden_ValidatedMessage = nil
}

type NestsUTF8Validated_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	ValidatedMessage *UTF8Validated
}

func (b0 NestsUTF8Validated_builder) Build() *NestsUTF8Validated {
	m0 := &NestsUTF8Validated{}
	b, x := &b0, m0
	_, _ = b, x
	x.xxx_hidden_ValidatedMessage = b.ValidatedMessage
	return m0
}

// Message contains enum fields.
type Enums struct {
	state                         protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_OptEnum            Enum                   `protobuf:"varint,1,opt,name=opt_enum,json=optEnum,enum=hybrid.pbeditions.Enum"`
	xxx_hidden_RptEnum            []Enum                 `protobuf:"varint,2,rep,packed,name=rpt_enum,json=rptEnum,enum=hybrid.pbeditions.Enum"`
	xxx_hidden_ImplicitEnum       OpenEnum               `protobuf:"varint,5,opt,name=implicit_enum,json=implicitEnum,enum=hybrid.pbeditions.OpenEnum"`
	xxx_hidden_OptNestedEnum      Enums_NestedEnum       `protobuf:"varint,3,opt,name=opt_nested_enum,json=optNestedEnum,enum=hybrid.pbeditions.Enums_NestedEnum"`
	xxx_hidden_RptNestedEnum      []Enums_NestedEnum     `protobuf:"varint,4,rep,packed,name=rpt_nested_enum,json=rptNestedEnum,enum=hybrid.pbeditions.Enums_NestedEnum"`
	xxx_hidden_ImplicitNestedEnum Enums_NestedOpenEnum   `protobuf:"varint,6,opt,name=implicit_nested_enum,json=implicitNestedEnum,enum=hybrid.pbeditions.Enums_NestedOpenEnum"`
	XXX_raceDetectHookData        protoimpl.RaceDetectHookData
	XXX_presence                  [1]uint32
	unknownFields                 protoimpl.UnknownFields
	sizeCache                     protoimpl.SizeCache
}

func (x *Enums) Reset() {
	*x = Enums{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[4]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Enums) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Enums) ProtoMessage() {}

func (x *Enums) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[4]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *Enums) GetOptEnum() Enum {
	if x != nil {
		if protoimpl.X.Present(&(x.XXX_presence[0]), 0) {
			return x.xxx_hidden_OptEnum
		}
	}
	return Enum_ONE
}

func (x *Enums) GetRptEnum() []Enum {
	if x != nil {
		return x.xxx_hidden_RptEnum
	}
	return nil
}

func (x *Enums) GetImplicitEnum() OpenEnum {
	if x != nil {
		return x.xxx_hidden_ImplicitEnum
	}
	return OpenEnum_UNKNOWN
}

func (x *Enums) GetOptNestedEnum() Enums_NestedEnum {
	if x != nil {
		if protoimpl.X.Present(&(x.XXX_presence[0]), 3) {
			return x.xxx_hidden_OptNestedEnum
		}
	}
	return Enums_UNO
}

func (x *Enums) GetRptNestedEnum() []Enums_NestedEnum {
	if x != nil {
		return x.xxx_hidden_RptNestedEnum
	}
	return nil
}

func (x *Enums) GetImplicitNestedEnum() Enums_NestedOpenEnum {
	if x != nil {
		return x.xxx_hidden_ImplicitNestedEnum
	}
	return Enums_UNKNOWN
}

func (x *Enums) SetOptEnum(v Enum) {
	x.xxx_hidden_OptEnum = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 6)
}

func (x *Enums) SetRptEnum(v []Enum) {
	x.xxx_hidden_RptEnum = v
}

func (x *Enums) SetImplicitEnum(v OpenEnum) {
	x.xxx_hidden_ImplicitEnum = v
}

func (x *Enums) SetOptNestedEnum(v Enums_NestedEnum) {
	x.xxx_hidden_OptNestedEnum = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 3, 6)
}

func (x *Enums) SetRptNestedEnum(v []Enums_NestedEnum) {
	x.xxx_hidden_RptNestedEnum = v
}

func (x *Enums) SetImplicitNestedEnum(v Enums_NestedOpenEnum) {
	x.xxx_hidden_ImplicitNestedEnum = v
}

func (x *Enums) HasOptEnum() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 0)
}

func (x *Enums) HasOptNestedEnum() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 3)
}

func (x *Enums) ClearOptEnum() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0)
	x.xxx_hidden_OptEnum = Enum_ONE
}

func (x *Enums) ClearOptNestedEnum() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 3)
	x.xxx_hidden_OptNestedEnum = Enums_UNO
}

type Enums_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	OptEnum            *Enum
	RptEnum            []Enum
	ImplicitEnum       OpenEnum
	OptNestedEnum      *Enums_NestedEnum
	RptNestedEnum      []Enums_NestedEnum
	ImplicitNestedEnum Enums_NestedOpenEnum
}

func (b0 Enums_builder) Build() *Enums {
	m0 := &Enums{}
	b, x := &b0, m0
	_, _ = b, x
	if b.OptEnum != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 6)
		x.xxx_hidden_OptEnum = *b.OptEnum
	}
	x.xxx_hidden_RptEnum = b.RptEnum
	x.xxx_hidden_ImplicitEnum = b.ImplicitEnum
	if b.OptNestedEnum != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 3, 6)
		x.xxx_hidden_OptNestedEnum = *b.OptNestedEnum
	}
	x.xxx_hidden_RptNestedEnum = b.RptNestedEnum
	x.xxx_hidden_ImplicitNestedEnum = b.ImplicitNestedEnum
	return m0
}

// Message contains repeated fields.
type Repeats struct {
	state                protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_RptBool   []bool                 `protobuf:"varint,1,rep,packed,name=rpt_bool,json=rptBool"`
	xxx_hidden_RptInt32  []int32                `protobuf:"varint,2,rep,packed,name=rpt_int32,json=rptInt32"`
	xxx_hidden_RptInt64  []int64                `protobuf:"varint,3,rep,packed,name=rpt_int64,json=rptInt64"`
	xxx_hidden_RptUint32 []uint32               `protobuf:"varint,4,rep,packed,name=rpt_uint32,json=rptUint32"`
	xxx_hidden_RptUint64 []uint64               `protobuf:"varint,5,rep,packed,name=rpt_uint64,json=rptUint64"`
	xxx_hidden_RptFloat  []float32              `protobuf:"fixed32,6,rep,packed,name=rpt_float,json=rptFloat"`
	xxx_hidden_RptDouble []float64              `protobuf:"fixed64,7,rep,packed,name=rpt_double,json=rptDouble"`
	xxx_hidden_RptString []string               `protobuf:"bytes,8,rep,name=rpt_string,json=rptString"`
	xxx_hidden_RptBytes  [][]byte               `protobuf:"bytes,9,rep,name=rpt_bytes,json=rptBytes"`
	unknownFields        protoimpl.UnknownFields
	sizeCache            protoimpl.SizeCache
}

func (x *Repeats) Reset() {
	*x = Repeats{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[5]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Repeats) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Repeats) ProtoMessage() {}

func (x *Repeats) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[5]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *Repeats) GetRptBool() []bool {
	if x != nil {
		return x.xxx_hidden_RptBool
	}
	return nil
}

func (x *Repeats) GetRptInt32() []int32 {
	if x != nil {
		return x.xxx_hidden_RptInt32
	}
	return nil
}

func (x *Repeats) GetRptInt64() []int64 {
	if x != nil {
		return x.xxx_hidden_RptInt64
	}
	return nil
}

func (x *Repeats) GetRptUint32() []uint32 {
	if x != nil {
		return x.xxx_hidden_RptUint32
	}
	return nil
}

func (x *Repeats) GetRptUint64() []uint64 {
	if x != nil {
		return x.xxx_hidden_RptUint64
	}
	return nil
}

func (x *Repeats) GetRptFloat() []float32 {
	if x != nil {
		return x.xxx_hidden_RptFloat
	}
	return nil
}

func (x *Repeats) GetRptDouble() []float64 {
	if x != nil {
		return x.xxx_hidden_RptDouble
	}
	return nil
}

func (x *Repeats) GetRptString() []string {
	if x != nil {
		return x.xxx_hidden_RptString
	}
	return nil
}

func (x *Repeats) GetRptBytes() [][]byte {
	if x != nil {
		return x.xxx_hidden_RptBytes
	}
	return nil
}

func (x *Repeats) SetRptBool(v []bool) {
	x.xxx_hidden_RptBool = v
}

func (x *Repeats) SetRptInt32(v []int32) {
	x.xxx_hidden_RptInt32 = v
}

func (x *Repeats) SetRptInt64(v []int64) {
	x.xxx_hidden_RptInt64 = v
}

func (x *Repeats) SetRptUint32(v []uint32) {
	x.xxx_hidden_RptUint32 = v
}

func (x *Repeats) SetRptUint64(v []uint64) {
	x.xxx_hidden_RptUint64 = v
}

func (x *Repeats) SetRptFloat(v []float32) {
	x.xxx_hidden_RptFloat = v
}

func (x *Repeats) SetRptDouble(v []float64) {
	x.xxx_hidden_RptDouble = v
}

func (x *Repeats) SetRptString(v []string) {
	x.xxx_hidden_RptString = v
}

func (x *Repeats) SetRptBytes(v [][]byte) {
	x.xxx_hidden_RptBytes = v
}

type Repeats_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	RptBool   []bool
	RptInt32  []int32
	RptInt64  []int64
	RptUint32 []uint32
	RptUint64 []uint64
	RptFloat  []float32
	RptDouble []float64
	RptString []string
	RptBytes  [][]byte
}

func (b0 Repeats_builder) Build() *Repeats {
	m0 := &Repeats{}
	b, x := &b0, m0
	_, _ = b, x
	x.xxx_hidden_RptBool = b.RptBool
	x.xxx_hidden_RptInt32 = b.RptInt32
	x.xxx_hidden_RptInt64 = b.RptInt64
	x.xxx_hidden_RptUint32 = b.RptUint32
	x.xxx_hidden_RptUint64 = b.RptUint64
	x.xxx_hidden_RptFloat = b.RptFloat
	x.xxx_hidden_RptDouble = b.RptDouble
	x.xxx_hidden_RptString = b.RptString
	x.xxx_hidden_RptBytes = b.RptBytes
	return m0
}

// Message contains map fields.
type Maps struct {
	state                  protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_Int32ToStr  map[int32]string       `protobuf:"bytes,1,rep,name=int32_to_str,json=int32ToStr" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	xxx_hidden_StrToNested map[string]*Nested     `protobuf:"bytes,4,rep,name=str_to_nested,json=strToNested" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	unknownFields          protoimpl.UnknownFields
	sizeCache              protoimpl.SizeCache
}

func (x *Maps) Reset() {
	*x = Maps{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[6]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Maps) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Maps) ProtoMessage() {}

func (x *Maps) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[6]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *Maps) GetInt32ToStr() map[int32]string {
	if x != nil {
		return x.xxx_hidden_Int32ToStr
	}
	return nil
}

func (x *Maps) GetStrToNested() map[string]*Nested {
	if x != nil {
		return x.xxx_hidden_StrToNested
	}
	return nil
}

func (x *Maps) SetInt32ToStr(v map[int32]string) {
	x.xxx_hidden_Int32ToStr = v
}

func (x *Maps) SetStrToNested(v map[string]*Nested) {
	x.xxx_hidden_StrToNested = v
}

type Maps_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	Int32ToStr  map[int32]string
	StrToNested map[string]*Nested
}

func (b0 Maps_builder) Build() *Maps {
	m0 := &Maps{}
	b, x := &b0, m0
	_, _ = b, x
	x.xxx_hidden_Int32ToStr = b.Int32ToStr
	x.xxx_hidden_StrToNested = b.StrToNested
	return m0
}

// Message type used as submessage.
type Nested struct {
	state                  protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_OptString   *string                `protobuf:"bytes,1,opt,name=opt_string,json=optString"`
	xxx_hidden_OptNested   *Nested                `protobuf:"bytes,2,opt,name=opt_nested,json=optNested"`
	XXX_raceDetectHookData protoimpl.RaceDetectHookData
	XXX_presence           [1]uint32
	unknownFields          protoimpl.UnknownFields
	sizeCache              protoimpl.SizeCache
}

func (x *Nested) Reset() {
	*x = Nested{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[7]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Nested) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Nested) ProtoMessage() {}

func (x *Nested) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[7]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *Nested) GetOptString() string {
	if x != nil {
		if x.xxx_hidden_OptString != nil {
			return *x.xxx_hidden_OptString
		}
		return ""
	}
	return ""
}

func (x *Nested) GetOptNested() *Nested {
	if x != nil {
		return x.xxx_hidden_OptNested
	}
	return nil
}

func (x *Nested) SetOptString(v string) {
	x.xxx_hidden_OptString = &v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 2)
}

func (x *Nested) SetOptNested(v *Nested) {
	x.xxx_hidden_OptNested = v
}

func (x *Nested) HasOptString() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 0)
}

func (x *Nested) HasOptNested() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptNested != nil
}

func (x *Nested) ClearOptString() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0)
	x.xxx_hidden_OptString = nil
}

func (x *Nested) ClearOptNested() {
	x.xxx_hidden_OptNested = nil
}

type Nested_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	OptString *string
	OptNested *Nested
}

func (b0 Nested_builder) Build() *Nested {
	m0 := &Nested{}
	b, x := &b0, m0
	_, _ = b, x
	if b.OptString != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 2)
		x.xxx_hidden_OptString = b.OptString
	}
	x.xxx_hidden_OptNested = b.OptNested
	return m0
}

// Message contains message and group fields.
type Nests struct {
	state                     protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_OptNested      *Nested                `protobuf:"bytes,1,opt,name=opt_nested,json=optNested"`
	xxx_hidden_Optgroup       *Nests_OptGroup        `protobuf:"group,2,opt,name=OptGroup,json=optgroup"`
	xxx_hidden_DelimitedField *Nests_OptGroup        `protobuf:"group,3,opt,name=OptGroup,json=delimitedField"`
	xxx_hidden_RptNested      *[]*Nested             `protobuf:"bytes,4,rep,name=rpt_nested,json=rptNested"`
	xxx_hidden_Rptgroup       *[]*Nests_RptGroup     `protobuf:"group,5,rep,name=RptGroup,json=rptgroup"`
	unknownFields             protoimpl.UnknownFields
	sizeCache                 protoimpl.SizeCache
}

func (x *Nests) Reset() {
	*x = Nests{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[8]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Nests) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Nests) ProtoMessage() {}

func (x *Nests) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[8]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *Nests) GetOptNested() *Nested {
	if x != nil {
		return x.xxx_hidden_OptNested
	}
	return nil
}

func (x *Nests) GetOptgroup() *Nests_OptGroup {
	if x != nil {
		return x.xxx_hidden_Optgroup
	}
	return nil
}

func (x *Nests) GetDelimitedField() *Nests_OptGroup {
	if x != nil {
		return x.xxx_hidden_DelimitedField
	}
	return nil
}

func (x *Nests) GetRptNested() []*Nested {
	if x != nil {
		if x.xxx_hidden_RptNested != nil {
			return *x.xxx_hidden_RptNested
		}
	}
	return nil
}

func (x *Nests) GetRptgroup() []*Nests_RptGroup {
	if x != nil {
		if x.xxx_hidden_Rptgroup != nil {
			return *x.xxx_hidden_Rptgroup
		}
	}
	return nil
}

func (x *Nests) SetOptNested(v *Nested) {
	x.xxx_hidden_OptNested = v
}

func (x *Nests) SetOptgroup(v *Nests_OptGroup) {
	x.xxx_hidden_Optgroup = v
}

func (x *Nests) SetDelimitedField(v *Nests_OptGroup) {
	x.xxx_hidden_DelimitedField = v
}

func (x *Nests) SetRptNested(v []*Nested) {
	x.xxx_hidden_RptNested = &v
}

func (x *Nests) SetRptgroup(v []*Nests_RptGroup) {
	x.xxx_hidden_Rptgroup = &v
}

func (x *Nests) HasOptNested() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptNested != nil
}

func (x *Nests) HasOptgroup() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_Optgroup != nil
}

func (x *Nests) HasDelimitedField() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_DelimitedField != nil
}

func (x *Nests) ClearOptNested() {
	x.xxx_hidden_OptNested = nil
}

func (x *Nests) ClearOptgroup() {
	x.xxx_hidden_Optgroup = nil
}

func (x *Nests) ClearDelimitedField() {
	x.xxx_hidden_DelimitedField = nil
}

type Nests_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	OptNested      *Nested
	Optgroup       *Nests_OptGroup
	DelimitedField *Nests_OptGroup
	RptNested      []*Nested
	Rptgroup       []*Nests_RptGroup
}

func (b0 Nests_builder) Build() *Nests {
	m0 := &Nests{}
	b, x := &b0, m0
	_, _ = b, x
	x.xxx_hidden_OptNested = b.OptNested
	x.xxx_hidden_Optgroup = b.Optgroup
	x.xxx_hidden_DelimitedField = b.DelimitedField
	x.xxx_hidden_RptNested = &b.RptNested
	x.xxx_hidden_Rptgroup = &b.Rptgroup
	return m0
}

// Message contains required fields.
type Requireds struct {
	state                  protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_ReqBool     bool                   `protobuf:"varint,1,req,name=req_bool,json=reqBool"`
	xxx_hidden_ReqSfixed64 int64                  `protobuf:"fixed64,2,req,name=req_sfixed64,json=reqSfixed64"`
	xxx_hidden_ReqDouble   float64                `protobuf:"fixed64,3,req,name=req_double,json=reqDouble"`
	xxx_hidden_ReqString   *string                `protobuf:"bytes,4,req,name=req_string,json=reqString"`
	xxx_hidden_ReqEnum     Enum                   `protobuf:"varint,5,req,name=req_enum,json=reqEnum,enum=hybrid.pbeditions.Enum"`
	xxx_hidden_ReqNested   *Nested                `protobuf:"bytes,6,req,name=req_nested,json=reqNested"`
	XXX_raceDetectHookData protoimpl.RaceDetectHookData
	XXX_presence           [1]uint32
	unknownFields          protoimpl.UnknownFields
	sizeCache              protoimpl.SizeCache
}

func (x *Requireds) Reset() {
	*x = Requireds{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[9]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Requireds) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Requireds) ProtoMessage() {}

func (x *Requireds) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[9]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *Requireds) GetReqBool() bool {
	if x != nil {
		return x.xxx_hidden_ReqBool
	}
	return false
}

func (x *Requireds) GetReqSfixed64() int64 {
	if x != nil {
		return x.xxx_hidden_ReqSfixed64
	}
	return 0
}

func (x *Requireds) GetReqDouble() float64 {
	if x != nil {
		return x.xxx_hidden_ReqDouble
	}
	return 0
}

func (x *Requireds) GetReqString() string {
	if x != nil {
		if x.xxx_hidden_ReqString != nil {
			return *x.xxx_hidden_ReqString
		}
		return ""
	}
	return ""
}

func (x *Requireds) GetReqEnum() Enum {
	if x != nil {
		if protoimpl.X.Present(&(x.XXX_presence[0]), 4) {
			return x.xxx_hidden_ReqEnum
		}
	}
	return Enum_ONE
}

func (x *Requireds) GetReqNested() *Nested {
	if x != nil {
		return x.xxx_hidden_ReqNested
	}
	return nil
}

func (x *Requireds) SetReqBool(v bool) {
	x.xxx_hidden_ReqBool = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 6)
}

func (x *Requireds) SetReqSfixed64(v int64) {
	x.xxx_hidden_ReqSfixed64 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 6)
}

func (x *Requireds) SetReqDouble(v float64) {
	x.xxx_hidden_ReqDouble = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 2, 6)
}

func (x *Requireds) SetReqString(v string) {
	x.xxx_hidden_ReqString = &v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 3, 6)
}

func (x *Requireds) SetReqEnum(v Enum) {
	x.xxx_hidden_ReqEnum = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 4, 6)
}

func (x *Requireds) SetReqNested(v *Nested) {
	x.xxx_hidden_ReqNested = v
}

func (x *Requireds) HasReqBool() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 0)
}

func (x *Requireds) HasReqSfixed64() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 1)
}

func (x *Requireds) HasReqDouble() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 2)
}

func (x *Requireds) HasReqString() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 3)
}

func (x *Requireds) HasReqEnum() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 4)
}

func (x *Requireds) HasReqNested() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_ReqNested != nil
}

func (x *Requireds) ClearReqBool() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0)
	x.xxx_hidden_ReqBool = false
}

func (x *Requireds) ClearReqSfixed64() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 1)
	x.xxx_hidden_ReqSfixed64 = 0
}

func (x *Requireds) ClearReqDouble() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 2)
	x.xxx_hidden_ReqDouble = 0
}

func (x *Requireds) ClearReqString() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 3)
	x.xxx_hidden_ReqString = nil
}

func (x *Requireds) ClearReqEnum() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 4)
	x.xxx_hidden_ReqEnum = Enum_ONE
}

func (x *Requireds) ClearReqNested() {
	x.xxx_hidden_ReqNested = nil
}

type Requireds_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	ReqBool     *bool
	ReqSfixed64 *int64
	ReqDouble   *float64
	ReqString   *string
	ReqEnum     *Enum
	ReqNested   *Nested
}

func (b0 Requireds_builder) Build() *Requireds {
	m0 := &Requireds{}
	b, x := &b0, m0
	_, _ = b, x
	if b.ReqBool != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 6)
		x.xxx_hidden_ReqBool = *b.ReqBool
	}
	if b.ReqSfixed64 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 6)
		x.xxx_hidden_ReqSfixed64 = *b.ReqSfixed64
	}
	if b.ReqDouble != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 2, 6)
		x.xxx_hidden_ReqDouble = *b.ReqDouble
	}
	if b.ReqString != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 3, 6)
		x.xxx_hidden_ReqString = b.ReqString
	}
	if b.ReqEnum != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 4, 6)
		x.xxx_hidden_ReqEnum = *b.ReqEnum
	}
	x.xxx_hidden_ReqNested = b.ReqNested
	return m0
}

// Message contains both required and optional fields.
type PartialRequired struct {
	state                  protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_ReqString   *string                `protobuf:"bytes,1,req,name=req_string,json=reqString"`
	xxx_hidden_OptString   *string                `protobuf:"bytes,2,opt,name=opt_string,json=optString"`
	XXX_raceDetectHookData protoimpl.RaceDetectHookData
	XXX_presence           [1]uint32
	unknownFields          protoimpl.UnknownFields
	sizeCache              protoimpl.SizeCache
}

func (x *PartialRequired) Reset() {
	*x = PartialRequired{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[10]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *PartialRequired) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PartialRequired) ProtoMessage() {}

func (x *PartialRequired) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[10]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *PartialRequired) GetReqString() string {
	if x != nil {
		if x.xxx_hidden_ReqString != nil {
			return *x.xxx_hidden_ReqString
		}
		return ""
	}
	return ""
}

func (x *PartialRequired) GetOptString() string {
	if x != nil {
		if x.xxx_hidden_OptString != nil {
			return *x.xxx_hidden_OptString
		}
		return ""
	}
	return ""
}

func (x *PartialRequired) SetReqString(v string) {
	x.xxx_hidden_ReqString = &v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 2)
}

func (x *PartialRequired) SetOptString(v string) {
	x.xxx_hidden_OptString = &v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 2)
}

func (x *PartialRequired) HasReqString() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 0)
}

func (x *PartialRequired) HasOptString() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 1)
}

func (x *PartialRequired) ClearReqString() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0)
	x.xxx_hidden_ReqString = nil
}

func (x *PartialRequired) ClearOptString() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 1)
	x.xxx_hidden_OptString = nil
}

type PartialRequired_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	ReqString *string
	OptString *string
}

func (b0 PartialRequired_builder) Build() *PartialRequired {
	m0 := &PartialRequired{}
	b, x := &b0, m0
	_, _ = b, x
	if b.ReqString != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 2)
		x.xxx_hidden_ReqString = b.ReqString
	}
	if b.OptString != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 2)
		x.xxx_hidden_OptString = b.OptString
	}
	return m0
}

type NestedWithRequired struct {
	state                  protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_ReqString   *string                `protobuf:"bytes,1,req,name=req_string,json=reqString"`
	XXX_raceDetectHookData protoimpl.RaceDetectHookData
	XXX_presence           [1]uint32
	unknownFields          protoimpl.UnknownFields
	sizeCache              protoimpl.SizeCache
}

func (x *NestedWithRequired) Reset() {
	*x = NestedWithRequired{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[11]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *NestedWithRequired) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*NestedWithRequired) ProtoMessage() {}

func (x *NestedWithRequired) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[11]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *NestedWithRequired) GetReqString() string {
	if x != nil {
		if x.xxx_hidden_ReqString != nil {
			return *x.xxx_hidden_ReqString
		}
		return ""
	}
	return ""
}

func (x *NestedWithRequired) SetReqString(v string) {
	x.xxx_hidden_ReqString = &v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 1)
}

func (x *NestedWithRequired) HasReqString() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 0)
}

func (x *NestedWithRequired) ClearReqString() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0)
	x.xxx_hidden_ReqString = nil
}

type NestedWithRequired_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	ReqString *string
}

func (b0 NestedWithRequired_builder) Build() *NestedWithRequired {
	m0 := &NestedWithRequired{}
	b, x := &b0, m0
	_, _ = b, x
	if b.ReqString != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 1)
		x.xxx_hidden_ReqString = b.ReqString
	}
	return m0
}

type IndirectRequired struct {
	state                  protoimpl.MessageState         `protogen:"opaque.v1"`
	xxx_hidden_OptNested   *NestedWithRequired            `protobuf:"bytes,1,opt,name=opt_nested,json=optNested"`
	xxx_hidden_RptNested   *[]*NestedWithRequired         `protobuf:"bytes,2,rep,name=rpt_nested,json=rptNested"`
	xxx_hidden_StrToNested map[string]*NestedWithRequired `protobuf:"bytes,3,rep,name=str_to_nested,json=strToNested" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	xxx_hidden_Union       isIndirectRequired_Union       `protobuf_oneof:"union"`
	unknownFields          protoimpl.UnknownFields
	sizeCache              protoimpl.SizeCache
}

func (x *IndirectRequired) Reset() {
	*x = IndirectRequired{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[12]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *IndirectRequired) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*IndirectRequired) ProtoMessage() {}

func (x *IndirectRequired) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[12]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *IndirectRequired) GetOptNested() *NestedWithRequired {
	if x != nil {
		return x.xxx_hidden_OptNested
	}
	return nil
}

func (x *IndirectRequired) GetRptNested() []*NestedWithRequired {
	if x != nil {
		if x.xxx_hidden_RptNested != nil {
			return *x.xxx_hidden_RptNested
		}
	}
	return nil
}

func (x *IndirectRequired) GetStrToNested() map[string]*NestedWithRequired {
	if x != nil {
		return x.xxx_hidden_StrToNested
	}
	return nil
}

func (x *IndirectRequired) GetOneofNested() *NestedWithRequired {
	if x != nil {
		if x, ok := x.xxx_hidden_Union.(*indirectRequired_OneofNested); ok {
			return x.OneofNested
		}
	}
	return nil
}

func (x *IndirectRequired) SetOptNested(v *NestedWithRequired) {
	x.xxx_hidden_OptNested = v
}

func (x *IndirectRequired) SetRptNested(v []*NestedWithRequired) {
	x.xxx_hidden_RptNested = &v
}

func (x *IndirectRequired) SetStrToNested(v map[string]*NestedWithRequired) {
	x.xxx_hidden_StrToNested = v
}

func (x *IndirectRequired) SetOneofNested(v *NestedWithRequired) {
	if v == nil {
		x.xxx_hidden_Union = nil
		return
	}
	x.xxx_hidden_Union = &indirectRequired_OneofNested{v}
}

func (x *IndirectRequired) HasOptNested() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptNested != nil
}

func (x *IndirectRequired) HasUnion() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_Union != nil
}

func (x *IndirectRequired) HasOneofNested() bool {
	if x == nil {
		return false
	}
	_, ok := x.xxx_hidden_Union.(*indirectRequired_OneofNested)
	return ok
}

func (x *IndirectRequired) ClearOptNested() {
	x.xxx_hidden_OptNested = nil
}

func (x *IndirectRequired) ClearUnion() {
	x.xxx_hidden_Union = nil
}

func (x *IndirectRequired) ClearOneofNested() {
	if _, ok := x.xxx_hidden_Union.(*indirectRequired_OneofNested); ok {
		x.xxx_hidden_Union = nil
	}
}

const IndirectRequired_Union_not_set_case case_IndirectRequired_Union = 0
const IndirectRequired_OneofNested_case case_IndirectRequired_Union = 4

func (x *IndirectRequired) WhichUnion() case_IndirectRequired_Union {
	if x == nil {
		return IndirectRequired_Union_not_set_case
	}
	switch x.xxx_hidden_Union.(type) {
	case *indirectRequired_OneofNested:
		return IndirectRequired_OneofNested_case
	default:
		return IndirectRequired_Union_not_set_case
	}
}

type IndirectRequired_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	OptNested   *NestedWithRequired
	RptNested   []*NestedWithRequired
	StrToNested map[string]*NestedWithRequired
	// Fields of oneof xxx_hidden_Union:
	OneofNested *NestedWithRequired
	// -- end of xxx_hidden_Union
}

func (b0 IndirectRequired_builder) Build() *IndirectRequired {
	m0 := &IndirectRequired{}
	b, x := &b0, m0
	_, _ = b, x
	x.xxx_hidden_OptNested = b.OptNested
	x.xxx_hidden_RptNested = &b.RptNested
	x.xxx_hidden_StrToNested = b.StrToNested
	if b.OneofNested != nil {
		x.xxx_hidden_Union = &indirectRequired_OneofNested{b.OneofNested}
	}
	return m0
}

type case_IndirectRequired_Union protoreflect.FieldNumber

func (x case_IndirectRequired_Union) String() string {
	md := file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[12].Descriptor()
	if x == 0 {
		return "not set"
	}
	return protoimpl.X.MessageFieldStringOf(md, protoreflect.FieldNumber(x))
}

type isIndirectRequired_Union interface {
	isIndirectRequired_Union()
}

type indirectRequired_OneofNested struct {
	OneofNested *NestedWithRequired `protobuf:"bytes,4,opt,name=oneof_nested,json=oneofNested,oneof"`
}

func (*indirectRequired_OneofNested) isIndirectRequired_Union() {}

type Extensions struct {
	state                  protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_OptString   *string                `protobuf:"bytes,1,opt,name=opt_string,json=optString"`
	xxx_hidden_OptBool     bool                   `protobuf:"varint,101,opt,name=opt_bool,json=optBool"`
	xxx_hidden_OptInt32    int32                  `protobuf:"varint,2,opt,name=opt_int32,json=optInt32"`
	XXX_raceDetectHookData protoimpl.RaceDetectHookData
	XXX_presence           [1]uint32
	extensionFields        protoimpl.ExtensionFields
	unknownFields          protoimpl.UnknownFields
	sizeCache              protoimpl.SizeCache
}

func (x *Extensions) Reset() {
	*x = Extensions{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[13]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Extensions) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Extensions) ProtoMessage() {}

func (x *Extensions) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[13]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *Extensions) GetOptString() string {
	if x != nil {
		if x.xxx_hidden_OptString != nil {
			return *x.xxx_hidden_OptString
		}
		return ""
	}
	return ""
}

func (x *Extensions) GetOptBool() bool {
	if x != nil {
		return x.xxx_hidden_OptBool
	}
	return false
}

func (x *Extensions) GetOptInt32() int32 {
	if x != nil {
		return x.xxx_hidden_OptInt32
	}
	return 0
}

func (x *Extensions) SetOptString(v string) {
	x.xxx_hidden_OptString = &v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 3)
}

func (x *Extensions) SetOptBool(v bool) {
	x.xxx_hidden_OptBool = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 3)
}

func (x *Extensions) SetOptInt32(v int32) {
	x.xxx_hidden_OptInt32 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 2, 3)
}

func (x *Extensions) HasOptString() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 0)
}

func (x *Extensions) HasOptBool() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 1)
}

func (x *Extensions) HasOptInt32() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 2)
}

func (x *Extensions) ClearOptString() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0)
	x.xxx_hidden_OptString = nil
}

func (x *Extensions) ClearOptBool() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 1)
	x.xxx_hidden_OptBool = false
}

func (x *Extensions) ClearOptInt32() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 2)
	x.xxx_hidden_OptInt32 = 0
}

type Extensions_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	OptString *string
	OptBool   *bool
	OptInt32  *int32
}

func (b0 Extensions_builder) Build() *Extensions {
	m0 := &Extensions{}
	b, x := &b0, m0
	_, _ = b, x
	if b.OptString != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 3)
		x.xxx_hidden_OptString = b.OptString
	}
	if b.OptBool != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 3)
		x.xxx_hidden_OptBool = *b.OptBool
	}
	if b.OptInt32 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 2, 3)
		x.xxx_hidden_OptInt32 = *b.OptInt32
	}
	return m0
}

type ExtensionsContainer struct {
	state         protoimpl.MessageState `protogen:"opaque.v1"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ExtensionsContainer) Reset() {
	*x = ExtensionsContainer{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[14]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ExtensionsContainer) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExtensionsContainer) ProtoMessage() {}

func (x *ExtensionsContainer) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[14]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

type ExtensionsContainer_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

}

func (b0 ExtensionsContainer_builder) Build() *ExtensionsContainer {
	m0 := &ExtensionsContainer{}
	b, x := &b0, m0
	_, _ = b, x
	return m0
}

type MessageSet struct {
	state           protoimpl.MessageState `protogen:"opaque.v1"`
	extensionFields protoimpl.ExtensionFields
	unknownFields   protoimpl.UnknownFields
	sizeCache       protoimpl.SizeCache
}

func (x *MessageSet) Reset() {
	*x = MessageSet{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[15]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *MessageSet) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*MessageSet) ProtoMessage() {}

func (x *MessageSet) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[15]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

type MessageSet_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

}

func (b0 MessageSet_builder) Build() *MessageSet {
	m0 := &MessageSet{}
	b, x := &b0, m0
	_, _ = b, x
	return m0
}

type MessageSetExtension struct {
	state                  protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_OptString   *string                `protobuf:"bytes,1,opt,name=opt_string,json=optString"`
	XXX_raceDetectHookData protoimpl.RaceDetectHookData
	XXX_presence           [1]uint32
	unknownFields          protoimpl.UnknownFields
	sizeCache              protoimpl.SizeCache
}

func (x *MessageSetExtension) Reset() {
	*x = MessageSetExtension{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[16]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *MessageSetExtension) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*MessageSetExtension) ProtoMessage() {}

func (x *MessageSetExtension) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[16]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *MessageSetExtension) GetOptString() string {
	if x != nil {
		if x.xxx_hidden_OptString != nil {
			return *x.xxx_hidden_OptString
		}
		return ""
	}
	return ""
}

func (x *MessageSetExtension) SetOptString(v string) {
	x.xxx_hidden_OptString = &v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 1)
}

func (x *MessageSetExtension) HasOptString() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 0)
}

func (x *MessageSetExtension) ClearOptString() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0)
	x.xxx_hidden_OptString = nil
}

type MessageSetExtension_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	OptString *string
}

func (b0 MessageSetExtension_builder) Build() *MessageSetExtension {
	m0 := &MessageSetExtension{}
	b, x := &b0, m0
	_, _ = b, x
	if b.OptString != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 1)
		x.xxx_hidden_OptString = b.OptString
	}
	return m0
}

type FakeMessageSet struct {
	state           protoimpl.MessageState `protogen:"opaque.v1"`
	extensionFields protoimpl.ExtensionFields
	unknownFields   protoimpl.UnknownFields
	sizeCache       protoimpl.SizeCache
}

func (x *FakeMessageSet) Reset() {
	*x = FakeMessageSet{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[17]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *FakeMessageSet) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FakeMessageSet) ProtoMessage() {}

func (x *FakeMessageSet) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[17]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

type FakeMessageSet_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

}

func (b0 FakeMessageSet_builder) Build() *FakeMessageSet {
	m0 := &FakeMessageSet{}
	b, x := &b0, m0
	_, _ = b, x
	return m0
}

type FakeMessageSetExtension struct {
	state                  protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_OptString   *string                `protobuf:"bytes,1,opt,name=opt_string,json=optString"`
	XXX_raceDetectHookData protoimpl.RaceDetectHookData
	XXX_presence           [1]uint32
	unknownFields          protoimpl.UnknownFields
	sizeCache              protoimpl.SizeCache
}

func (x *FakeMessageSetExtension) Reset() {
	*x = FakeMessageSetExtension{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[18]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *FakeMessageSetExtension) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FakeMessageSetExtension) ProtoMessage() {}

func (x *FakeMessageSetExtension) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[18]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *FakeMessageSetExtension) GetOptString() string {
	if x != nil {
		if x.xxx_hidden_OptString != nil {
			return *x.xxx_hidden_OptString
		}
		return ""
	}
	return ""
}

func (x *FakeMessageSetExtension) SetOptString(v string) {
	x.xxx_hidden_OptString = &v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 1)
}

func (x *FakeMessageSetExtension) HasOptString() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 0)
}

func (x *FakeMessageSetExtension) ClearOptString() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0)
	x.xxx_hidden_OptString = nil
}

type FakeMessageSetExtension_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	OptString *string
}

func (b0 FakeMessageSetExtension_builder) Build() *FakeMessageSetExtension {
	m0 := &FakeMessageSetExtension{}
	b, x := &b0, m0
	_, _ = b, x
	if b.OptString != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 1)
		x.xxx_hidden_OptString = b.OptString
	}
	return m0
}

// Message contains well-known type fields.
type KnownTypes struct {
	state                   protoimpl.MessageState  `protogen:"opaque.v1"`
	xxx_hidden_OptBool      *wrapperspb.BoolValue   `protobuf:"bytes,1,opt,name=opt_bool,json=optBool"`
	xxx_hidden_OptInt32     *wrapperspb.Int32Value  `protobuf:"bytes,2,opt,name=opt_int32,json=optInt32"`
	xxx_hidden_OptInt64     *wrapperspb.Int64Value  `protobuf:"bytes,3,opt,name=opt_int64,json=optInt64"`
	xxx_hidden_OptUint32    *wrapperspb.UInt32Value `protobuf:"bytes,4,opt,name=opt_uint32,json=optUint32"`
	xxx_hidden_OptUint64    *wrapperspb.UInt64Value `protobuf:"bytes,5,opt,name=opt_uint64,json=optUint64"`
	xxx_hidden_OptFloat     *wrapperspb.FloatValue  `protobuf:"bytes,6,opt,name=opt_float,json=optFloat"`
	xxx_hidden_OptDouble    *wrapperspb.DoubleValue `protobuf:"bytes,7,opt,name=opt_double,json=optDouble"`
	xxx_hidden_OptString    *wrapperspb.StringValue `protobuf:"bytes,8,opt,name=opt_string,json=optString"`
	xxx_hidden_OptBytes     *wrapperspb.BytesValue  `protobuf:"bytes,9,opt,name=opt_bytes,json=optBytes"`
	xxx_hidden_OptDuration  *durationpb.Duration    `protobuf:"bytes,20,opt,name=opt_duration,json=optDuration"`
	xxx_hidden_OptTimestamp *timestamppb.Timestamp  `protobuf:"bytes,21,opt,name=opt_timestamp,json=optTimestamp"`
	xxx_hidden_OptStruct    *structpb.Struct        `protobuf:"bytes,25,opt,name=opt_struct,json=optStruct"`
	xxx_hidden_OptList      *structpb.ListValue     `protobuf:"bytes,26,opt,name=opt_list,json=optList"`
	xxx_hidden_OptValue     *structpb.Value         `protobuf:"bytes,27,opt,name=opt_value,json=optValue"`
	xxx_hidden_OptNull      structpb.NullValue      `protobuf:"varint,28,opt,name=opt_null,json=optNull,enum=google.protobuf.NullValue"`
	xxx_hidden_OptEmpty     *emptypb.Empty          `protobuf:"bytes,30,opt,name=opt_empty,json=optEmpty"`
	xxx_hidden_OptAny       *anypb.Any              `protobuf:"bytes,32,opt,name=opt_any,json=optAny"`
	xxx_hidden_OptFieldmask *fieldmaskpb.FieldMask  `protobuf:"bytes,40,opt,name=opt_fieldmask,json=optFieldmask"`
	XXX_raceDetectHookData  protoimpl.RaceDetectHookData
	XXX_presence            [1]uint32
	unknownFields           protoimpl.UnknownFields
	sizeCache               protoimpl.SizeCache
}

func (x *KnownTypes) Reset() {
	*x = KnownTypes{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[19]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *KnownTypes) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*KnownTypes) ProtoMessage() {}

func (x *KnownTypes) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[19]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *KnownTypes) GetOptBool() *wrapperspb.BoolValue {
	if x != nil {
		return x.xxx_hidden_OptBool
	}
	return nil
}

func (x *KnownTypes) GetOptInt32() *wrapperspb.Int32Value {
	if x != nil {
		return x.xxx_hidden_OptInt32
	}
	return nil
}

func (x *KnownTypes) GetOptInt64() *wrapperspb.Int64Value {
	if x != nil {
		return x.xxx_hidden_OptInt64
	}
	return nil
}

func (x *KnownTypes) GetOptUint32() *wrapperspb.UInt32Value {
	if x != nil {
		return x.xxx_hidden_OptUint32
	}
	return nil
}

func (x *KnownTypes) GetOptUint64() *wrapperspb.UInt64Value {
	if x != nil {
		return x.xxx_hidden_OptUint64
	}
	return nil
}

func (x *KnownTypes) GetOptFloat() *wrapperspb.FloatValue {
	if x != nil {
		return x.xxx_hidden_OptFloat
	}
	return nil
}

func (x *KnownTypes) GetOptDouble() *wrapperspb.DoubleValue {
	if x != nil {
		return x.xxx_hidden_OptDouble
	}
	return nil
}

func (x *KnownTypes) GetOptString() *wrapperspb.StringValue {
	if x != nil {
		return x.xxx_hidden_OptString
	}
	return nil
}

func (x *KnownTypes) GetOptBytes() *wrapperspb.BytesValue {
	if x != nil {
		return x.xxx_hidden_OptBytes
	}
	return nil
}

func (x *KnownTypes) GetOptDuration() *durationpb.Duration {
	if x != nil {
		return x.xxx_hidden_OptDuration
	}
	return nil
}

func (x *KnownTypes) GetOptTimestamp() *timestamppb.Timestamp {
	if x != nil {
		return x.xxx_hidden_OptTimestamp
	}
	return nil
}

func (x *KnownTypes) GetOptStruct() *structpb.Struct {
	if x != nil {
		return x.xxx_hidden_OptStruct
	}
	return nil
}

func (x *KnownTypes) GetOptList() *structpb.ListValue {
	if x != nil {
		return x.xxx_hidden_OptList
	}
	return nil
}

func (x *KnownTypes) GetOptValue() *structpb.Value {
	if x != nil {
		return x.xxx_hidden_OptValue
	}
	return nil
}

func (x *KnownTypes) GetOptNull() structpb.NullValue {
	if x != nil {
		if protoimpl.X.Present(&(x.XXX_presence[0]), 14) {
			return x.xxx_hidden_OptNull
		}
	}
	return structpb.NullValue(0)
}

func (x *KnownTypes) GetOptEmpty() *emptypb.Empty {
	if x != nil {
		return x.xxx_hidden_OptEmpty
	}
	return nil
}

func (x *KnownTypes) GetOptAny() *anypb.Any {
	if x != nil {
		return x.xxx_hidden_OptAny
	}
	return nil
}

func (x *KnownTypes) GetOptFieldmask() *fieldmaskpb.FieldMask {
	if x != nil {
		return x.xxx_hidden_OptFieldmask
	}
	return nil
}

func (x *KnownTypes) SetOptBool(v *wrapperspb.BoolValue) {
	x.xxx_hidden_OptBool = v
}

func (x *KnownTypes) SetOptInt32(v *wrapperspb.Int32Value) {
	x.xxx_hidden_OptInt32 = v
}

func (x *KnownTypes) SetOptInt64(v *wrapperspb.Int64Value) {
	x.xxx_hidden_OptInt64 = v
}

func (x *KnownTypes) SetOptUint32(v *wrapperspb.UInt32Value) {
	x.xxx_hidden_OptUint32 = v
}

func (x *KnownTypes) SetOptUint64(v *wrapperspb.UInt64Value) {
	x.xxx_hidden_OptUint64 = v
}

func (x *KnownTypes) SetOptFloat(v *wrapperspb.FloatValue) {
	x.xxx_hidden_OptFloat = v
}

func (x *KnownTypes) SetOptDouble(v *wrapperspb.DoubleValue) {
	x.xxx_hidden_OptDouble = v
}

func (x *KnownTypes) SetOptString(v *wrapperspb.StringValue) {
	x.xxx_hidden_OptString = v
}

func (x *KnownTypes) SetOptBytes(v *wrapperspb.BytesValue) {
	x.xxx_hidden_OptBytes = v
}

func (x *KnownTypes) SetOptDuration(v *durationpb.Duration) {
	x.xxx_hidden_OptDuration = v
}

func (x *KnownTypes) SetOptTimestamp(v *timestamppb.Timestamp) {
	x.xxx_hidden_OptTimestamp = v
}

func (x *KnownTypes) SetOptStruct(v *structpb.Struct) {
	x.xxx_hidden_OptStruct = v
}

func (x *KnownTypes) SetOptList(v *structpb.ListValue) {
	x.xxx_hidden_OptList = v
}

func (x *KnownTypes) SetOptValue(v *structpb.Value) {
	x.xxx_hidden_OptValue = v
}

func (x *KnownTypes) SetOptNull(v structpb.NullValue) {
	x.xxx_hidden_OptNull = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 14, 18)
}

func (x *KnownTypes) SetOptEmpty(v *emptypb.Empty) {
	x.xxx_hidden_OptEmpty = v
}

func (x *KnownTypes) SetOptAny(v *anypb.Any) {
	x.xxx_hidden_OptAny = v
}

func (x *KnownTypes) SetOptFieldmask(v *fieldmaskpb.FieldMask) {
	x.xxx_hidden_OptFieldmask = v
}

func (x *KnownTypes) HasOptBool() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptBool != nil
}

func (x *KnownTypes) HasOptInt32() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptInt32 != nil
}

func (x *KnownTypes) HasOptInt64() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptInt64 != nil
}

func (x *KnownTypes) HasOptUint32() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptUint32 != nil
}

func (x *KnownTypes) HasOptUint64() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptUint64 != nil
}

func (x *KnownTypes) HasOptFloat() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptFloat != nil
}

func (x *KnownTypes) HasOptDouble() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptDouble != nil
}

func (x *KnownTypes) HasOptString() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptString != nil
}

func (x *KnownTypes) HasOptBytes() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptBytes != nil
}

func (x *KnownTypes) HasOptDuration() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptDuration != nil
}

func (x *KnownTypes) HasOptTimestamp() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptTimestamp != nil
}

func (x *KnownTypes) HasOptStruct() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptStruct != nil
}

func (x *KnownTypes) HasOptList() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptList != nil
}

func (x *KnownTypes) HasOptValue() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptValue != nil
}

func (x *KnownTypes) HasOptNull() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 14)
}

func (x *KnownTypes) HasOptEmpty() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptEmpty != nil
}

func (x *KnownTypes) HasOptAny() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptAny != nil
}

func (x *KnownTypes) HasOptFieldmask() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptFieldmask != nil
}

func (x *KnownTypes) ClearOptBool() {
	x.xxx_hidden_OptBool = nil
}

func (x *KnownTypes) ClearOptInt32() {
	x.xxx_hidden_OptInt32 = nil
}

func (x *KnownTypes) ClearOptInt64() {
	x.xxx_hidden_OptInt64 = nil
}

func (x *KnownTypes) ClearOptUint32() {
	x.xxx_hidden_OptUint32 = nil
}

func (x *KnownTypes) ClearOptUint64() {
	x.xxx_hidden_OptUint64 = nil
}

func (x *KnownTypes) ClearOptFloat() {
	x.xxx_hidden_OptFloat = nil
}

func (x *KnownTypes) ClearOptDouble() {
	x.xxx_hidden_OptDouble = nil
}

func (x *KnownTypes) ClearOptString() {
	x.xxx_hidden_OptString = nil
}

func (x *KnownTypes) ClearOptBytes() {
	x.xxx_hidden_OptBytes = nil
}

func (x *KnownTypes) ClearOptDuration() {
	x.xxx_hidden_OptDuration = nil
}

func (x *KnownTypes) ClearOptTimestamp() {
	x.xxx_hidden_OptTimestamp = nil
}

func (x *KnownTypes) ClearOptStruct() {
	x.xxx_hidden_OptStruct = nil
}

func (x *KnownTypes) ClearOptList() {
	x.xxx_hidden_OptList = nil
}

func (x *KnownTypes) ClearOptValue() {
	x.xxx_hidden_OptValue = nil
}

func (x *KnownTypes) ClearOptNull() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 14)
	x.xxx_hidden_OptNull = structpb.NullValue_NULL_VALUE
}

func (x *KnownTypes) ClearOptEmpty() {
	x.xxx_hidden_OptEmpty = nil
}

func (x *KnownTypes) ClearOptAny() {
	x.xxx_hidden_OptAny = nil
}

func (x *KnownTypes) ClearOptFieldmask() {
	x.xxx_hidden_OptFieldmask = nil
}

type KnownTypes_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	OptBool      *wrapperspb.BoolValue
	OptInt32     *wrapperspb.Int32Value
	OptInt64     *wrapperspb.Int64Value
	OptUint32    *wrapperspb.UInt32Value
	OptUint64    *wrapperspb.UInt64Value
	OptFloat     *wrapperspb.FloatValue
	OptDouble    *wrapperspb.DoubleValue
	OptString    *wrapperspb.StringValue
	OptBytes     *wrapperspb.BytesValue
	OptDuration  *durationpb.Duration
	OptTimestamp *timestamppb.Timestamp
	OptStruct    *structpb.Struct
	OptList      *structpb.ListValue
	OptValue     *structpb.Value
	OptNull      *structpb.NullValue
	OptEmpty     *emptypb.Empty
	OptAny       *anypb.Any
	OptFieldmask *fieldmaskpb.FieldMask
}

func (b0 KnownTypes_builder) Build() *KnownTypes {
	m0 := &KnownTypes{}
	b, x := &b0, m0
	_, _ = b, x
	x.xxx_hidden_OptBool = b.OptBool
	x.xxx_hidden_OptInt32 = b.OptInt32
	x.xxx_hidden_OptInt64 = b.OptInt64
	x.xxx_hidden_OptUint32 = b.OptUint32
	x.xxx_hidden_OptUint64 = b.OptUint64
	x.xxx_hidden_OptFloat = b.OptFloat
	x.xxx_hidden_OptDouble = b.OptDouble
	x.xxx_hidden_OptString = b.OptString
	x.xxx_hidden_OptBytes = b.OptBytes
	x.xxx_hidden_OptDuration = b.OptDuration
	x.xxx_hidden_OptTimestamp = b.OptTimestamp
	x.xxx_hidden_OptStruct = b.OptStruct
	x.xxx_hidden_OptList = b.OptList
	x.xxx_hidden_OptValue = b.OptValue
	if b.OptNull != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 14, 18)
		x.xxx_hidden_OptNull = *b.OptNull
	}
	x.xxx_hidden_OptEmpty = b.OptEmpty
	x.xxx_hidden_OptAny = b.OptAny
	x.xxx_hidden_OptFieldmask = b.OptFieldmask
	return m0
}

type Nests_OptGroup struct {
	state                           protoimpl.MessageState         `protogen:"opaque.v1"`
	xxx_hidden_OptString            *string                        `protobuf:"bytes,1,opt,name=opt_string,json=optString"`
	xxx_hidden_OptNested            *Nested                        `protobuf:"bytes,2,opt,name=opt_nested,json=optNested"`
	xxx_hidden_Optnestedgroup       *Nests_OptGroup_OptNestedGroup `protobuf:"group,3,opt,name=OptNestedGroup,json=optnestedgroup"`
	xxx_hidden_NestedDelimitedField *Nests_OptGroup_OptNestedGroup `protobuf:"group,4,opt,name=OptNestedGroup,json=nestedDelimitedField"`
	XXX_raceDetectHookData          protoimpl.RaceDetectHookData
	XXX_presence                    [1]uint32
	unknownFields                   protoimpl.UnknownFields
	sizeCache                       protoimpl.SizeCache
}

func (x *Nests_OptGroup) Reset() {
	*x = Nests_OptGroup{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[22]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Nests_OptGroup) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Nests_OptGroup) ProtoMessage() {}

func (x *Nests_OptGroup) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[22]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *Nests_OptGroup) GetOptString() string {
	if x != nil {
		if x.xxx_hidden_OptString != nil {
			return *x.xxx_hidden_OptString
		}
		return ""
	}
	return ""
}

func (x *Nests_OptGroup) GetOptNested() *Nested {
	if x != nil {
		return x.xxx_hidden_OptNested
	}
	return nil
}

func (x *Nests_OptGroup) GetOptnestedgroup() *Nests_OptGroup_OptNestedGroup {
	if x != nil {
		return x.xxx_hidden_Optnestedgroup
	}
	return nil
}

func (x *Nests_OptGroup) GetNestedDelimitedField() *Nests_OptGroup_OptNestedGroup {
	if x != nil {
		return x.xxx_hidden_NestedDelimitedField
	}
	return nil
}

func (x *Nests_OptGroup) SetOptString(v string) {
	x.xxx_hidden_OptString = &v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 4)
}

func (x *Nests_OptGroup) SetOptNested(v *Nested) {
	x.xxx_hidden_OptNested = v
}

func (x *Nests_OptGroup) SetOptnestedgroup(v *Nests_OptGroup_OptNestedGroup) {
	x.xxx_hidden_Optnestedgroup = v
}

func (x *Nests_OptGroup) SetNestedDelimitedField(v *Nests_OptGroup_OptNestedGroup) {
	x.xxx_hidden_NestedDelimitedField = v
}

func (x *Nests_OptGroup) HasOptString() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 0)
}

func (x *Nests_OptGroup) HasOptNested() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_OptNested != nil
}

func (x *Nests_OptGroup) HasOptnestedgroup() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_Optnestedgroup != nil
}

func (x *Nests_OptGroup) HasNestedDelimitedField() bool {
	if x == nil {
		return false
	}
	return x.xxx_hidden_NestedDelimitedField != nil
}

func (x *Nests_OptGroup) ClearOptString() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0)
	x.xxx_hidden_OptString = nil
}

func (x *Nests_OptGroup) ClearOptNested() {
	x.xxx_hidden_OptNested = nil
}

func (x *Nests_OptGroup) ClearOptnestedgroup() {
	x.xxx_hidden_Optnestedgroup = nil
}

func (x *Nests_OptGroup) ClearNestedDelimitedField() {
	x.xxx_hidden_NestedDelimitedField = nil
}

type Nests_OptGroup_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	OptString            *string
	OptNested            *Nested
	Optnestedgroup       *Nests_OptGroup_OptNestedGroup
	NestedDelimitedField *Nests_OptGroup_OptNestedGroup
}

func (b0 Nests_OptGroup_builder) Build() *Nests_OptGroup {
	m0 := &Nests_OptGroup{}
	b, x := &b0, m0
	_, _ = b, x
	if b.OptString != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 4)
		x.xxx_hidden_OptString = b.OptString
	}
	x.xxx_hidden_OptNested = b.OptNested
	x.xxx_hidden_Optnestedgroup = b.Optnestedgroup
	x.xxx_hidden_NestedDelimitedField = b.NestedDelimitedField
	return m0
}

type Nests_RptGroup struct {
	state                protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_RptString []string               `protobuf:"bytes,1,rep,name=rpt_string,json=rptString"`
	unknownFields        protoimpl.UnknownFields
	sizeCache            protoimpl.SizeCache
}

func (x *Nests_RptGroup) Reset() {
	*x = Nests_RptGroup{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[23]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Nests_RptGroup) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Nests_RptGroup) ProtoMessage() {}

func (x *Nests_RptGroup) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[23]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *Nests_RptGroup) GetRptString() []string {
	if x != nil {
		return x.xxx_hidden_RptString
	}
	return nil
}

func (x *Nests_RptGroup) SetRptString(v []string) {
	x.xxx_hidden_RptString = v
}

type Nests_RptGroup_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	RptString []string
}

func (b0 Nests_RptGroup_builder) Build() *Nests_RptGroup {
	m0 := &Nests_RptGroup{}
	b, x := &b0, m0
	_, _ = b, x
	x.xxx_hidden_RptString = b.RptString
	return m0
}

type Nests_OptGroup_OptNestedGroup struct {
	state                  protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_OptFixed32  uint32                 `protobuf:"fixed32,1,opt,name=opt_fixed32,json=optFixed32"`
	XXX_raceDetectHookData protoimpl.RaceDetectHookData
	XXX_presence           [1]uint32
	unknownFields          protoimpl.UnknownFields
	sizeCache              protoimpl.SizeCache
}

func (x *Nests_OptGroup_OptNestedGroup) Reset() {
	*x = Nests_OptGroup_OptNestedGroup{}
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[24]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Nests_OptGroup_OptNestedGroup) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Nests_OptGroup_OptNestedGroup) ProtoMessage() {}

func (x *Nests_OptGroup_OptNestedGroup) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[24]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *Nests_OptGroup_OptNestedGroup) GetOptFixed32() uint32 {
	if x != nil {
		return x.xxx_hidden_OptFixed32
	}
	return 0
}

func (x *Nests_OptGroup_OptNestedGroup) SetOptFixed32(v uint32) {
	x.xxx_hidden_OptFixed32 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 1)
}

func (x *Nests_OptGroup_OptNestedGroup) HasOptFixed32() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 0)
}

func (x *Nests_OptGroup_OptNestedGroup) ClearOptFixed32() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0)
	x.xxx_hidden_OptFixed32 = 0
}

type Nests_OptGroup_OptNestedGroup_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	OptFixed32 *uint32
}

func (b0 Nests_OptGroup_OptNestedGroup_builder) Build() *Nests_OptGroup_OptNestedGroup {
	m0 := &Nests_OptGroup_OptNestedGroup{}
	b, x := &b0, m0
	_, _ = b, x
	if b.OptFixed32 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 1)
		x.xxx_hidden_OptFixed32 = *b.OptFixed32
	}
	return m0
}

var file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes = []protoimpl.ExtensionInfo{
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: (*bool)(nil),
		Field:         21,
		Name:          "hybrid.pbeditions.opt_ext_bool",
		Tag:           "varint,21,opt,name=opt_ext_bool",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: (*string)(nil),
		Field:         22,
		Name:          "hybrid.pbeditions.opt_ext_string",
		Tag:           "bytes,22,opt,name=opt_ext_string",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: (*Enum)(nil),
		Field:         23,
		Name:          "hybrid.pbeditions.opt_ext_enum",
		Tag:           "varint,23,opt,name=opt_ext_enum,enum=hybrid.pbeditions.Enum",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: (*Nested)(nil),
		Field:         24,
		Name:          "hybrid.pbeditions.opt_ext_nested",
		Tag:           "bytes,24,opt,name=opt_ext_nested",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: (*PartialRequired)(nil),
		Field:         25,
		Name:          "hybrid.pbeditions.opt_ext_partial",
		Tag:           "bytes,25,opt,name=opt_ext_partial",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: ([]uint32)(nil),
		Field:         31,
		Name:          "hybrid.pbeditions.rpt_ext_fixed32",
		Tag:           "fixed32,31,rep,packed,name=rpt_ext_fixed32",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: ([]Enum)(nil),
		Field:         32,
		Name:          "hybrid.pbeditions.rpt_ext_enum",
		Tag:           "varint,32,rep,packed,name=rpt_ext_enum,enum=hybrid.pbeditions.Enum",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: ([]*Nested)(nil),
		Field:         33,
		Name:          "hybrid.pbeditions.rpt_ext_nested",
		Tag:           "bytes,33,rep,name=rpt_ext_nested",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*MessageSet)(nil),
		ExtensionType: (*FakeMessageSetExtension)(nil),
		Field:         50,
		Name:          "hybrid.pbeditions.message_set_extension",
		Tag:           "bytes,50,opt,name=message_set_extension",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: (*bool)(nil),
		Field:         51,
		Name:          "hybrid.pbeditions.ExtensionsContainer.opt_ext_bool",
		Tag:           "varint,51,opt,name=opt_ext_bool",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: (*string)(nil),
		Field:         52,
		Name:          "hybrid.pbeditions.ExtensionsContainer.opt_ext_string",
		Tag:           "bytes,52,opt,name=opt_ext_string",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: (*Enum)(nil),
		Field:         53,
		Name:          "hybrid.pbeditions.ExtensionsContainer.opt_ext_enum",
		Tag:           "varint,53,opt,name=opt_ext_enum,enum=hybrid.pbeditions.Enum",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: (*Nested)(nil),
		Field:         54,
		Name:          "hybrid.pbeditions.ExtensionsContainer.opt_ext_nested",
		Tag:           "bytes,54,opt,name=opt_ext_nested",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: (*PartialRequired)(nil),
		Field:         55,
		Name:          "hybrid.pbeditions.ExtensionsContainer.opt_ext_partial",
		Tag:           "bytes,55,opt,name=opt_ext_partial",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: ([]string)(nil),
		Field:         61,
		Name:          "hybrid.pbeditions.ExtensionsContainer.rpt_ext_string",
		Tag:           "bytes,61,rep,name=rpt_ext_string",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: ([]Enum)(nil),
		Field:         62,
		Name:          "hybrid.pbeditions.ExtensionsContainer.rpt_ext_enum",
		Tag:           "varint,62,rep,packed,name=rpt_ext_enum,enum=hybrid.pbeditions.Enum",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*Extensions)(nil),
		ExtensionType: ([]*Nested)(nil),
		Field:         63,
		Name:          "hybrid.pbeditions.ExtensionsContainer.rpt_ext_nested",
		Tag:           "bytes,63,rep,name=rpt_ext_nested",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*MessageSet)(nil),
		ExtensionType: (*MessageSetExtension)(nil),
		Field:         10,
		Name:          "hybrid.pbeditions.MessageSetExtension.message_set_extension",
		Tag:           "bytes,10,opt,name=message_set_extension",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*MessageSet)(nil),
		ExtensionType: (*MessageSetExtension)(nil),
		Field:         20,
		Name:          "hybrid.pbeditions.MessageSetExtension.not_message_set_extension",
		Tag:           "bytes,20,opt,name=not_message_set_extension",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*MessageSet)(nil),
		ExtensionType: (*Nested)(nil),
		Field:         30,
		Name:          "hybrid.pbeditions.MessageSetExtension.ext_nested",
		Tag:           "bytes,30,opt,name=ext_nested",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
	{
		ExtendedType:  (*FakeMessageSet)(nil),
		ExtensionType: (*FakeMessageSetExtension)(nil),
		Field:         10,
		Name:          "hybrid.pbeditions.FakeMessageSetExtension.message_set_extension",
		Tag:           "bytes,10,opt,name=message_set_extension",
		Filename:      "internal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.proto",
	},
}

// Extension fields to Extensions.
var (
	// optional bool opt_ext_bool = 21;
	E_OptExtBool = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[0]
	// optional string opt_ext_string = 22;
	E_OptExtString = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[1]
	// optional hybrid.pbeditions.Enum opt_ext_enum = 23;
	E_OptExtEnum = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[2]
	// optional hybrid.pbeditions.Nested opt_ext_nested = 24;
	E_OptExtNested = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[3]
	// optional hybrid.pbeditions.PartialRequired opt_ext_partial = 25;
	E_OptExtPartial = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[4]
	// repeated fixed32 rpt_ext_fixed32 = 31;
	E_RptExtFixed32 = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[5]
	// repeated hybrid.pbeditions.Enum rpt_ext_enum = 32;
	E_RptExtEnum = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[6]
	// repeated hybrid.pbeditions.Nested rpt_ext_nested = 33;
	E_RptExtNested = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[7]
	// optional bool opt_ext_bool = 51;
	E_ExtensionsContainer_OptExtBool = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[9]
	// optional string opt_ext_string = 52;
	E_ExtensionsContainer_OptExtString = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[10]
	// optional hybrid.pbeditions.Enum opt_ext_enum = 53;
	E_ExtensionsContainer_OptExtEnum = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[11]
	// optional hybrid.pbeditions.Nested opt_ext_nested = 54;
	E_ExtensionsContainer_OptExtNested = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[12]
	// optional hybrid.pbeditions.PartialRequired opt_ext_partial = 55;
	E_ExtensionsContainer_OptExtPartial = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[13]
	// repeated string rpt_ext_string = 61;
	E_ExtensionsContainer_RptExtString = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[14]
	// repeated hybrid.pbeditions.Enum rpt_ext_enum = 62;
	E_ExtensionsContainer_RptExtEnum = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[15]
	// repeated hybrid.pbeditions.Nested rpt_ext_nested = 63;
	E_ExtensionsContainer_RptExtNested = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[16]
)

// Extension fields to MessageSet.
var (
	// optional hybrid.pbeditions.FakeMessageSetExtension message_set_extension = 50;
	E_MessageSetExtension = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[8]
	// optional hybrid.pbeditions.MessageSetExtension message_set_extension = 10;
	E_MessageSetExtension_MessageSetExtension = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[17]
	// optional hybrid.pbeditions.MessageSetExtension not_message_set_extension = 20;
	E_MessageSetExtension_NotMessageSetExtension = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[18]
	// optional hybrid.pbeditions.Nested ext_nested = 30;
	E_MessageSetExtension_ExtNested = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[19]
)

// Extension fields to FakeMessageSet.
var (
	// optional hybrid.pbeditions.FakeMessageSetExtension message_set_extension = 10;
	E_FakeMessageSetExtension_MessageSetExtension = &file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes[20]
)

var File_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto protoreflect.FileDescriptor

const file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_rawDesc = "\nKinternal/testprotos/textpbeditions/textpbeditions_hybrid/test2.hybrid.protohybrid.pbeditionsgoogle/protobuf/any.protogoogle/protobuf/duration.protogoogle/protobuf/empty.proto google/protobuf/field_mask.protogoogle/protobuf/struct.protogoogle/protobuf/timestamp.protogoogle/protobuf/wrappers.proto!google/protobuf/go_features.proto\"\xda\nScalars\nopt_bool (RoptBool\n	opt_int32 (RoptInt32\n	opt_int64 (RoptInt64\n\nopt_uint32 (\rR	optUint32\n\nopt_uint64 (R	optUint64\n\nopt_sint32 (R	optSint32\n\nopt_sint64 (R	optSint64\nopt_fixed32 (R\noptFixed32\nopt_fixed64	 (R\noptFixed64!\nopt_sfixed32\n (RoptSfixed32!\nopt_sfixed64 (RoptSfixed64\n	opt_float (RoptFloat\n\nopt_double (R	optDouble\n	opt_bytes (RoptBytes\n\nopt_string\r (	R	optString\"\x8f\nImplicitScalars\ns_bool (B\xaaRsBool\ns_int32 (B\xaaRsInt32\ns_int64 (B\xaaRsInt64 \ns_uint32 (\rB\xaaRsUint32 \ns_uint64 (B\xaaRsUint64 \ns_sint32 (B\xaaRsSint32 \ns_sint64 (B\xaaRsSint64\"\n	s_fixed32 (B\xaaRsFixed32\"\n	s_fixed64	 (B\xaaRsFixed64$\n\ns_sfixed32\n (B\xaaR	sSfixed32$\n\ns_sfixed64 (B\xaaR	sSfixed64\ns_float (B\xaaRsFloat \ns_double (B\xaaRsDouble\ns_bytes (B\xaaRsBytes \ns_string\r (	B\xaaRsString\"C\n\rUTF8Validated2\nvalidated_string (	B\xaa RvalidatedString\"c\nNestsUTF8ValidatedM\nvalidated_message (2 .hybrid.pbeditions.UTF8ValidatedRvalidatedMessage\"\xa1\nEnums2\nopt_enum (2.hybrid.pbeditions.EnumRoptEnum2\nrpt_enum (2.hybrid.pbeditions.EnumRrptEnumG\n\rimplicit_enum (2.hybrid.pbeditions.OpenEnumB\xaaRimplicitEnumK\nopt_nested_enum (2#.hybrid.pbeditions.Enums.NestedEnumR\roptNestedEnumK\nrpt_nested_enum (2#.hybrid.pbeditions.Enums.NestedEnumR\rrptNestedEnum`\nimplicit_nested_enum (2'.hybrid.pbeditions.Enums.NestedOpenEnumB\xaaRimplicitNestedEnum\"(\n\nNestedEnum\nUNO\nDOS\nDIEZ\n\"A\nNestedOpenEnum\nUNKNOWN\x00\nEINS\nZWEI\nZEHN\n:\"\x94\nRepeats\nrpt_bool (RrptBool\n	rpt_int32 (RrptInt32\n	rpt_int64 (RrptInt64\n\nrpt_uint32 (\rR	rptUint32\n\nrpt_uint64 (R	rptUint64\n	rpt_float (RrptFloat\n\nrpt_double (R	rptDouble\n\nrpt_string (	R	rptString\n	rpt_bytes	 (RrptBytes\"\xb9\nMapsI\nint32_to_str (2'.hybrid.pbeditions.Maps.Int32ToStrEntryR\nint32ToStrL\n\rstr_to_nested (2(.hybrid.pbeditions.Maps.StrToNestedEntryRstrToNested=\nInt32ToStrEntry\nkey (Rkey\nvalue (	Rvalue:8Y\nStrToNestedEntry\nkey (	Rkey/\nvalue (2.hybrid.pbeditions.NestedRvalue:8\"a\nNested\n\nopt_string (	R	optString8\n\nopt_nested (2.hybrid.pbeditions.NestedR	optNested\"\x80\nNests8\n\nopt_nested (2.hybrid.pbeditions.NestedR	optNestedD\noptgroup (2!.hybrid.pbeditions.Nests.OptGroupB\xaa(RoptgroupQ\ndelimited_field (2!.hybrid.pbeditions.Nests.OptGroupB\xaa(RdelimitedField8\n\nrpt_nested (2.hybrid.pbeditions.NestedR	rptNestedF\nrptgroup (2!.hybrid.pbeditions.Nests.RptGroupB\xaa(Rrptgroup\xe6\nOptGroup\n\nopt_string (	R	optString8\n\nopt_nested (2.hybrid.pbeditions.NestedR	optNested_\noptnestedgroup (20.hybrid.pbeditions.Nests.OptGroup.OptNestedGroupB\xaa(Roptnestedgroupm\nnested_delimited_field (20.hybrid.pbeditions.Nests.OptGroup.OptNestedGroupB\xaa(RnestedDelimitedField1\nOptNestedGroup\nopt_fixed32 (R\noptFixed32)\nRptGroup\n\nrpt_string (	R	rptStringRreserved_field\"\x9f\n	Requireds \nreq_bool (B\xaaRreqBool(\nreq_sfixed64 (B\xaaRreqSfixed64$\n\nreq_double (B\xaaR	reqDouble$\n\nreq_string (	B\xaaR	reqString9\nreq_enum (2.hybrid.pbeditions.EnumB\xaaRreqEnum?\n\nreq_nested (2.hybrid.pbeditions.NestedB\xaaR	reqNested\"V\nPartialRequired$\n\nreq_string (	B\xaaR	reqString\n\nopt_string (	R	optString\":\nNestedWithRequired$\n\nreq_string (	B\xaaR	reqString\"\xb4\nIndirectRequiredD\n\nopt_nested (2%.hybrid.pbeditions.NestedWithRequiredR	optNestedD\n\nrpt_nested (2%.hybrid.pbeditions.NestedWithRequiredR	rptNestedX\n\rstr_to_nested (24.hybrid.pbeditions.IndirectRequired.StrToNestedEntryRstrToNestedJ\noneof_nested (2%.hybrid.pbeditions.NestedWithRequiredH\x00RoneofNestede\nStrToNestedEntry\nkey (	Rkey;\nvalue (2%.hybrid.pbeditions.NestedWithRequiredRvalue:8B\nunion\"i\n\nExtensions\n\nopt_string (	R	optString\nopt_boole (RoptBool\n	opt_int32 (RoptInt32*e\"\xbf\nExtensionsContainer2?\nopt_ext_bool.hybrid.pbeditions.Extensions3 (R\noptExtBool2C\nopt_ext_string.hybrid.pbeditions.Extensions4 (	RoptExtString2X\nopt_ext_enum.hybrid.pbeditions.Extensions5 (2.hybrid.pbeditions.EnumR\noptExtEnum2^\nopt_ext_nested.hybrid.pbeditions.Extensions6 (2.hybrid.pbeditions.NestedRoptExtNested2i\nopt_ext_partial.hybrid.pbeditions.Extensions7 (2\".hybrid.pbeditions.PartialRequiredR\roptExtPartial2C\nrpt_ext_string.hybrid.pbeditions.Extensions= (	RrptExtString2X\nrpt_ext_enum.hybrid.pbeditions.Extensions> (2.hybrid.pbeditions.EnumR\nrptExtEnum2^\nrpt_ext_nested.hybrid.pbeditions.Extensions? (2.hybrid.pbeditions.NestedRrptExtNested\"\n\nMessageSet*\xff\xff\xff\xff:\"\x8b\nMessageSetExtension\n\nopt_string (	R	optString2y\nmessage_set_extension.hybrid.pbeditions.MessageSet\n (2&.hybrid.pbeditions.MessageSetExtensionRmessageSetExtension2\x80\nnot_message_set_extension.hybrid.pbeditions.MessageSet (2&.hybrid.pbeditions.MessageSetExtensionRnotMessageSetExtension2W\n\next_nested.hybrid.pbeditions.MessageSet (2.hybrid.pbeditions.NestedR	extNested\"\nFakeMessageSet*\x80\x80\x80\x80\"\xbc\nFakeMessageSetExtension\n\nopt_string (	R	optString2\x81\nmessage_set_extension!.hybrid.pbeditions.FakeMessageSet\n (2*.hybrid.pbeditions.FakeMessageSetExtensionRmessageSetExtension\"\x9e\n\nKnownTypes5\nopt_bool (2.google.protobuf.BoolValueRoptBool8\n	opt_int32 (2.google.protobuf.Int32ValueRoptInt328\n	opt_int64 (2.google.protobuf.Int64ValueRoptInt64;\n\nopt_uint32 (2.google.protobuf.UInt32ValueR	optUint32;\n\nopt_uint64 (2.google.protobuf.UInt64ValueR	optUint648\n	opt_float (2.google.protobuf.FloatValueRoptFloat;\n\nopt_double (2.google.protobuf.DoubleValueR	optDouble;\n\nopt_string (2.google.protobuf.StringValueR	optString8\n	opt_bytes	 (2.google.protobuf.BytesValueRoptBytes<\nopt_duration (2.google.protobuf.DurationRoptDuration?\n\ropt_timestamp (2.google.protobuf.TimestampRoptTimestamp6\n\nopt_struct (2.google.protobuf.StructR	optStruct5\nopt_list (2.google.protobuf.ListValueRoptList3\n	opt_value (2.google.protobuf.ValueRoptValue5\nopt_null (2.google.protobuf.NullValueRoptNull3\n	opt_empty (2.google.protobuf.EmptyRoptEmpty-\nopt_any  (2.google.protobuf.AnyRoptAny?\n\ropt_fieldmask( (2.google.protobuf.FieldMaskRoptFieldmask*!\nEnum\nONE\nTWO\nTEN\n*;\nOpenEnum\nUNKNOWN\x00\nEINS\nZWEI\nZEHN\n::?\nopt_ext_bool.hybrid.pbeditions.Extensions (R\noptExtBool:C\nopt_ext_string.hybrid.pbeditions.Extensions (	RoptExtString:X\nopt_ext_enum.hybrid.pbeditions.Extensions (2.hybrid.pbeditions.EnumR\noptExtEnum:^\nopt_ext_nested.hybrid.pbeditions.Extensions (2.hybrid.pbeditions.NestedRoptExtNested:i\nopt_ext_partial.hybrid.pbeditions.Extensions (2\".hybrid.pbeditions.PartialRequiredR\roptExtPartial:E\nrpt_ext_fixed32.hybrid.pbeditions.Extensions (R\rrptExtFixed32:X\nrpt_ext_enum.hybrid.pbeditions.Extensions  (2.hybrid.pbeditions.EnumR\nrptExtEnum:^\nrpt_ext_nested.hybrid.pbeditions.Extensions! (2.hybrid.pbeditions.NestedRrptExtNested:}\nmessage_set_extension.hybrid.pbeditions.MessageSet2 (2*.hybrid.pbeditions.FakeMessageSetExtensionRmessageSetExtensionBaZSgoogle.golang.org/protobuf/internal/testprotos/textpbeditions/textpbeditions_hybrid\x92	\xd2> beditionsp\xe8"

var file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
var file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes = make([]protoimpl.MessageInfo, 26)
var file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_goTypes = []any{
	(Enum)(0),                             // 0: hybrid.pbeditions.Enum
	(OpenEnum)(0),                         // 1: hybrid.pbeditions.OpenEnum
	(Enums_NestedEnum)(0),                 // 2: hybrid.pbeditions.Enums.NestedEnum
	(Enums_NestedOpenEnum)(0),             // 3: hybrid.pbeditions.Enums.NestedOpenEnum
	(*Scalars)(nil),                       // 4: hybrid.pbeditions.Scalars
	(*ImplicitScalars)(nil),               // 5: hybrid.pbeditions.ImplicitScalars
	(*UTF8Validated)(nil),                 // 6: hybrid.pbeditions.UTF8Validated
	(*NestsUTF8Validated)(nil),            // 7: hybrid.pbeditions.NestsUTF8Validated
	(*Enums)(nil),                         // 8: hybrid.pbeditions.Enums
	(*Repeats)(nil),                       // 9: hybrid.pbeditions.Repeats
	(*Maps)(nil),                          // 10: hybrid.pbeditions.Maps
	(*Nested)(nil),                        // 11: hybrid.pbeditions.Nested
	(*Nests)(nil),                         // 12: hybrid.pbeditions.Nests
	(*Requireds)(nil),                     // 13: hybrid.pbeditions.Requireds
	(*PartialRequired)(nil),               // 14: hybrid.pbeditions.PartialRequired
	(*NestedWithRequired)(nil),            // 15: hybrid.pbeditions.NestedWithRequired
	(*IndirectRequired)(nil),              // 16: hybrid.pbeditions.IndirectRequired
	(*Extensions)(nil),                    // 17: hybrid.pbeditions.Extensions
	(*ExtensionsContainer)(nil),           // 18: hybrid.pbeditions.ExtensionsContainer
	(*MessageSet)(nil),                    // 19: hybrid.pbeditions.MessageSet
	(*MessageSetExtension)(nil),           // 20: hybrid.pbeditions.MessageSetExtension
	(*FakeMessageSet)(nil),                // 21: hybrid.pbeditions.FakeMessageSet
	(*FakeMessageSetExtension)(nil),       // 22: hybrid.pbeditions.FakeMessageSetExtension
	(*KnownTypes)(nil),                    // 23: hybrid.pbeditions.KnownTypes
	nil,                                   // 24: hybrid.pbeditions.Maps.Int32ToStrEntry
	nil,                                   // 25: hybrid.pbeditions.Maps.StrToNestedEntry
	(*Nests_OptGroup)(nil),                // 26: hybrid.pbeditions.Nests.OptGroup
	(*Nests_RptGroup)(nil),                // 27: hybrid.pbeditions.Nests.RptGroup
	(*Nests_OptGroup_OptNestedGroup)(nil), // 28: hybrid.pbeditions.Nests.OptGroup.OptNestedGroup
	nil,                                   // 29: hybrid.pbeditions.IndirectRequired.StrToNestedEntry
	(*wrapperspb.BoolValue)(nil),          // 30: google.protobuf.BoolValue
	(*wrapperspb.Int32Value)(nil),         // 31: google.protobuf.Int32Value
	(*wrapperspb.Int64Value)(nil),         // 32: google.protobuf.Int64Value
	(*wrapperspb.UInt32Value)(nil),        // 33: google.protobuf.UInt32Value
	(*wrapperspb.UInt64Value)(nil),        // 34: google.protobuf.UInt64Value
	(*wrapperspb.FloatValue)(nil),         // 35: google.protobuf.FloatValue
	(*wrapperspb.DoubleValue)(nil),        // 36: google.protobuf.DoubleValue
	(*wrapperspb.StringValue)(nil),        // 37: google.protobuf.StringValue
	(*wrapperspb.BytesValue)(nil),         // 38: google.protobuf.BytesValue
	(*durationpb.Duration)(nil),           // 39: google.protobuf.Duration
	(*timestamppb.Timestamp)(nil),         // 40: google.protobuf.Timestamp
	(*structpb.Struct)(nil),               // 41: google.protobuf.Struct
	(*structpb.ListValue)(nil),            // 42: google.protobuf.ListValue
	(*structpb.Value)(nil),                // 43: google.protobuf.Value
	(structpb.NullValue)(0),               // 44: google.protobuf.NullValue
	(*emptypb.Empty)(nil),                 // 45: google.protobuf.Empty
	(*anypb.Any)(nil),                     // 46: google.protobuf.Any
	(*fieldmaskpb.FieldMask)(nil),         // 47: google.protobuf.FieldMask
}
var file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_depIdxs = []int32{
	6,  // 0: hybrid.pbeditions.NestsUTF8Validated.validated_message:type_name -> hybrid.pbeditions.UTF8Validated
	0,  // 1: hybrid.pbeditions.Enums.opt_enum:type_name -> hybrid.pbeditions.Enum
	0,  // 2: hybrid.pbeditions.Enums.rpt_enum:type_name -> hybrid.pbeditions.Enum
	1,  // 3: hybrid.pbeditions.Enums.implicit_enum:type_name -> hybrid.pbeditions.OpenEnum
	2,  // 4: hybrid.pbeditions.Enums.opt_nested_enum:type_name -> hybrid.pbeditions.Enums.NestedEnum
	2,  // 5: hybrid.pbeditions.Enums.rpt_nested_enum:type_name -> hybrid.pbeditions.Enums.NestedEnum
	3,  // 6: hybrid.pbeditions.Enums.implicit_nested_enum:type_name -> hybrid.pbeditions.Enums.NestedOpenEnum
	24, // 7: hybrid.pbeditions.Maps.int32_to_str:type_name -> hybrid.pbeditions.Maps.Int32ToStrEntry
	25, // 8: hybrid.pbeditions.Maps.str_to_nested:type_name -> hybrid.pbeditions.Maps.StrToNestedEntry
	11, // 9: hybrid.pbeditions.Nested.opt_nested:type_name -> hybrid.pbeditions.Nested
	11, // 10: hybrid.pbeditions.Nests.opt_nested:type_name -> hybrid.pbeditions.Nested
	26, // 11: hybrid.pbeditions.Nests.optgroup:type_name -> hybrid.pbeditions.Nests.OptGroup
	26, // 12: hybrid.pbeditions.Nests.delimited_field:type_name -> hybrid.pbeditions.Nests.OptGroup
	11, // 13: hybrid.pbeditions.Nests.rpt_nested:type_name -> hybrid.pbeditions.Nested
	27, // 14: hybrid.pbeditions.Nests.rptgroup:type_name -> hybrid.pbeditions.Nests.RptGroup
	0,  // 15: hybrid.pbeditions.Requireds.req_enum:type_name -> hybrid.pbeditions.Enum
	11, // 16: hybrid.pbeditions.Requireds.req_nested:type_name -> hybrid.pbeditions.Nested
	15, // 17: hybrid.pbeditions.IndirectRequired.opt_nested:type_name -> hybrid.pbeditions.NestedWithRequired
	15, // 18: hybrid.pbeditions.IndirectRequired.rpt_nested:type_name -> hybrid.pbeditions.NestedWithRequired
	29, // 19: hybrid.pbeditions.IndirectRequired.str_to_nested:type_name -> hybrid.pbeditions.IndirectRequired.StrToNestedEntry
	15, // 20: hybrid.pbeditions.IndirectRequired.oneof_nested:type_name -> hybrid.pbeditions.NestedWithRequired
	30, // 21: hybrid.pbeditions.KnownTypes.opt_bool:type_name -> google.protobuf.BoolValue
	31, // 22: hybrid.pbeditions.KnownTypes.opt_int32:type_name -> google.protobuf.Int32Value
	32, // 23: hybrid.pbeditions.KnownTypes.opt_int64:type_name -> google.protobuf.Int64Value
	33, // 24: hybrid.pbeditions.KnownTypes.opt_uint32:type_name -> google.protobuf.UInt32Value
	34, // 25: hybrid.pbeditions.KnownTypes.opt_uint64:type_name -> google.protobuf.UInt64Value
	35, // 26: hybrid.pbeditions.KnownTypes.opt_float:type_name -> google.protobuf.FloatValue
	36, // 27: hybrid.pbeditions.KnownTypes.opt_double:type_name -> google.protobuf.DoubleValue
	37, // 28: hybrid.pbeditions.KnownTypes.opt_string:type_name -> google.protobuf.StringValue
	38, // 29: hybrid.pbeditions.KnownTypes.opt_bytes:type_name -> google.protobuf.BytesValue
	39, // 30: hybrid.pbeditions.KnownTypes.opt_duration:type_name -> google.protobuf.Duration
	40, // 31: hybrid.pbeditions.KnownTypes.opt_timestamp:type_name -> google.protobuf.Timestamp
	41, // 32: hybrid.pbeditions.KnownTypes.opt_struct:type_name -> google.protobuf.Struct
	42, // 33: hybrid.pbeditions.KnownTypes.opt_list:type_name -> google.protobuf.ListValue
	43, // 34: hybrid.pbeditions.KnownTypes.opt_value:type_name -> google.protobuf.Value
	44, // 35: hybrid.pbeditions.KnownTypes.opt_null:type_name -> google.protobuf.NullValue
	45, // 36: hybrid.pbeditions.KnownTypes.opt_empty:type_name -> google.protobuf.Empty
	46, // 37: hybrid.pbeditions.KnownTypes.opt_any:type_name -> google.protobuf.Any
	47, // 38: hybrid.pbeditions.KnownTypes.opt_fieldmask:type_name -> google.protobuf.FieldMask
	11, // 39: hybrid.pbeditions.Maps.StrToNestedEntry.value:type_name -> hybrid.pbeditions.Nested
	11, // 40: hybrid.pbeditions.Nests.OptGroup.opt_nested:type_name -> hybrid.pbeditions.Nested
	28, // 41: hybrid.pbeditions.Nests.OptGroup.optnestedgroup:type_name -> hybrid.pbeditions.Nests.OptGroup.OptNestedGroup
	28, // 42: hybrid.pbeditions.Nests.OptGroup.nested_delimited_field:type_name -> hybrid.pbeditions.Nests.OptGroup.OptNestedGroup
	15, // 43: hybrid.pbeditions.IndirectRequired.StrToNestedEntry.value:type_name -> hybrid.pbeditions.NestedWithRequired
	17, // 44: hybrid.pbeditions.opt_ext_bool:extendee -> hybrid.pbeditions.Extensions
	17, // 45: hybrid.pbeditions.opt_ext_string:extendee -> hybrid.pbeditions.Extensions
	17, // 46: hybrid.pbeditions.opt_ext_enum:extendee -> hybrid.pbeditions.Extensions
	17, // 47: hybrid.pbeditions.opt_ext_nested:extendee -> hybrid.pbeditions.Extensions
	17, // 48: hybrid.pbeditions.opt_ext_partial:extendee -> hybrid.pbeditions.Extensions
	17, // 49: hybrid.pbeditions.rpt_ext_fixed32:extendee -> hybrid.pbeditions.Extensions
	17, // 50: hybrid.pbeditions.rpt_ext_enum:extendee -> hybrid.pbeditions.Extensions
	17, // 51: hybrid.pbeditions.rpt_ext_nested:extendee -> hybrid.pbeditions.Extensions
	19, // 52: hybrid.pbeditions.message_set_extension:extendee -> hybrid.pbeditions.MessageSet
	17, // 53: hybrid.pbeditions.ExtensionsContainer.opt_ext_bool:extendee -> hybrid.pbeditions.Extensions
	17, // 54: hybrid.pbeditions.ExtensionsContainer.opt_ext_string:extendee -> hybrid.pbeditions.Extensions
	17, // 55: hybrid.pbeditions.ExtensionsContainer.opt_ext_enum:extendee -> hybrid.pbeditions.Extensions
	17, // 56: hybrid.pbeditions.ExtensionsContainer.opt_ext_nested:extendee -> hybrid.pbeditions.Extensions
	17, // 57: hybrid.pbeditions.ExtensionsContainer.opt_ext_partial:extendee -> hybrid.pbeditions.Extensions
	17, // 58: hybrid.pbeditions.ExtensionsContainer.rpt_ext_string:extendee -> hybrid.pbeditions.Extensions
	17, // 59: hybrid.pbeditions.ExtensionsContainer.rpt_ext_enum:extendee -> hybrid.pbeditions.Extensions
	17, // 60: hybrid.pbeditions.ExtensionsContainer.rpt_ext_nested:extendee -> hybrid.pbeditions.Extensions
	19, // 61: hybrid.pbeditions.MessageSetExtension.message_set_extension:extendee -> hybrid.pbeditions.MessageSet
	19, // 62: hybrid.pbeditions.MessageSetExtension.not_message_set_extension:extendee -> hybrid.pbeditions.MessageSet
	19, // 63: hybrid.pbeditions.MessageSetExtension.ext_nested:extendee -> hybrid.pbeditions.MessageSet
	21, // 64: hybrid.pbeditions.FakeMessageSetExtension.message_set_extension:extendee -> hybrid.pbeditions.FakeMessageSet
	0,  // 65: hybrid.pbeditions.opt_ext_enum:type_name -> hybrid.pbeditions.Enum
	11, // 66: hybrid.pbeditions.opt_ext_nested:type_name -> hybrid.pbeditions.Nested
	14, // 67: hybrid.pbeditions.opt_ext_partial:type_name -> hybrid.pbeditions.PartialRequired
	0,  // 68: hybrid.pbeditions.rpt_ext_enum:type_name -> hybrid.pbeditions.Enum
	11, // 69: hybrid.pbeditions.rpt_ext_nested:type_name -> hybrid.pbeditions.Nested
	22, // 70: hybrid.pbeditions.message_set_extension:type_name -> hybrid.pbeditions.FakeMessageSetExtension
	0,  // 71: hybrid.pbeditions.ExtensionsContainer.opt_ext_enum:type_name -> hybrid.pbeditions.Enum
	11, // 72: hybrid.pbeditions.ExtensionsContainer.opt_ext_nested:type_name -> hybrid.pbeditions.Nested
	14, // 73: hybrid.pbeditions.ExtensionsContainer.opt_ext_partial:type_name -> hybrid.pbeditions.PartialRequired
	0,  // 74: hybrid.pbeditions.ExtensionsContainer.rpt_ext_enum:type_name -> hybrid.pbeditions.Enum
	11, // 75: hybrid.pbeditions.ExtensionsContainer.rpt_ext_nested:type_name -> hybrid.pbeditions.Nested
	20, // 76: hybrid.pbeditions.MessageSetExtension.message_set_extension:type_name -> hybrid.pbeditions.MessageSetExtension
	20, // 77: hybrid.pbeditions.MessageSetExtension.not_message_set_extension:type_name -> hybrid.pbeditions.MessageSetExtension
	11, // 78: hybrid.pbeditions.MessageSetExtension.ext_nested:type_name -> hybrid.pbeditions.Nested
	22, // 79: hybrid.pbeditions.FakeMessageSetExtension.message_set_extension:type_name -> hybrid.pbeditions.FakeMessageSetExtension
	80, // [80:80] is the sub-list for method output_type
	80, // [80:80] is the sub-list for method input_type
	65, // [65:80] is the sub-list for extension type_name
	44, // [44:65] is the sub-list for extension extendee
	0,  // [0:44] is the sub-list for field type_name
}

func init() { file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_init() }
func file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_init() {
	if File_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto != nil {
		return
	}
	file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes[12].OneofWrappers = []any{
		(*indirectRequired_OneofNested)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_rawDesc), len(file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_rawDesc)),
			NumEnums:      4,
			NumMessages:   26,
			NumExtensions: 21,
			NumServices:   0,
		},
		GoTypes:           file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_goTypes,
		DependencyIndexes: file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_depIdxs,
		EnumInfos:         file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_enumTypes,
		MessageInfos:      file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_msgTypes,
		ExtensionInfos:    file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_extTypes,
	}.Build()
	File_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto = out.File
	file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_goTypes = nil
	file_internal_testprotos_textpbeditions_textpbeditions_hybrid_test2_hybrid_proto_depIdxs = nil
}
