// Code generated by protoc-gen-go. DO NOT EDIT.
// source: reflection/grpc_testing/proto2_ext.proto

package grpc_testing

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type Extension struct {
	Whatzit              *int32   `protobuf:"varint,1,opt,name=whatzit" json:"whatzit,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Extension) Reset()         { *m = Extension{} }
func (m *Extension) String() string { return proto.CompactTextString(m) }
func (*Extension) ProtoMessage()    {}
func (*Extension) Descriptor() ([]byte, []int) {
	return fileDescriptor_071dc827b8673a0c, []int{0}
}

func (m *Extension) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Extension.Unmarshal(m, b)
}
func (m *Extension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Extension.Marshal(b, m, deterministic)
}
func (m *Extension) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Extension.Merge(m, src)
}
func (m *Extension) XXX_Size() int {
	return xxx_messageInfo_Extension.Size(m)
}
func (m *Extension) XXX_DiscardUnknown() {
	xxx_messageInfo_Extension.DiscardUnknown(m)
}

var xxx_messageInfo_Extension proto.InternalMessageInfo

func (m *Extension) GetWhatzit() int32 {
	if m != nil && m.Whatzit != nil {
		return *m.Whatzit
	}
	return 0
}

var E_Foo = &proto.ExtensionDesc{
	ExtendedType:  (*ToBeExtended)(nil),
	ExtensionType: (*int32)(nil),
	Field:         13,
	Name:          "grpc.testing.foo",
	Tag:           "varint,13,opt,name=foo",
	Filename:      "reflection/grpc_testing/proto2_ext.proto",
}

var E_Bar = &proto.ExtensionDesc{
	ExtendedType:  (*ToBeExtended)(nil),
	ExtensionType: (*Extension)(nil),
	Field:         17,
	Name:          "grpc.testing.bar",
	Tag:           "bytes,17,opt,name=bar",
	Filename:      "reflection/grpc_testing/proto2_ext.proto",
}

var E_Baz = &proto.ExtensionDesc{
	ExtendedType:  (*ToBeExtended)(nil),
	ExtensionType: (*SearchRequest)(nil),
	Field:         19,
	Name:          "grpc.testing.baz",
	Tag:           "bytes,19,opt,name=baz",
	Filename:      "reflection/grpc_testing/proto2_ext.proto",
}

func init() {
	proto.RegisterType((*Extension)(nil), "grpc.testing.Extension")
	proto.RegisterExtension(E_Foo)
	proto.RegisterExtension(E_Bar)
	proto.RegisterExtension(E_Baz)
}

func init() {
	proto.RegisterFile("reflection/grpc_testing/proto2_ext.proto", fileDescriptor_071dc827b8673a0c)
}

var fileDescriptor_071dc827b8673a0c = []byte{
	// 224 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4b, 0x85, 0x40,
	0x10, 0xc6, 0x91, 0x47, 0x44, 0x5b, 0x1d, 0xb2, 0x43, 0x62, 0x97, 0x87, 0x14, 0x78, 0x88, 0x35,
	0x3c, 0x7a, 0x14, 0x3c, 0x74, 0xb5, 0x4e, 0x5d, 0x64, 0xd3, 0x71, 0x5d, 0x90, 0x1d, 0x5b, 0x27,
	0x12, 0xff, 0xfa, 0xd8, 0xb5, 0xe2, 0x79, 0xd0, 0xd3, 0xee, 0x30, 0xbf, 0xdf, 0xc7, 0xf0, 0xb1,
	0xd8, 0x40, 0xdb, 0x43, 0x4d, 0x0a, 0x75, 0x22, 0xcd, 0x50, 0x57, 0x04, 0x23, 0x29, 0x2d, 0x93,
	0xc1, 0x20, 0x61, 0x5a, 0xc1, 0x44, 0xdc, 0x7d, 0xfd, 0x2b, 0xbb, 0xe6, 0xbf, 0xeb, 0xf0, 0x61,
	0xdf, 0x5b, 0x9c, 0x30, 0xda, 0xa2, 0xec, 0xbb, 0x30, 0xd1, 0x23, 0xbb, 0x28, 0x26, 0x02, 0x3d,
	0x2a, 0xd4, 0x7e, 0xc0, 0xce, 0xbf, 0x3b, 0x41, 0xb3, 0xa2, 0xc0, 0x3b, 0x7a, 0xf1, 0x59, 0xf9,
	0x37, 0x66, 0x4f, 0xec, 0xd0, 0x22, 0xfa, 0x21, 0x3f, 0x3d, 0x83, 0xbf, 0x61, 0x0e, 0xce, 0x6e,
	0xa0, 0x09, 0xae, 0x9d, 0x61, 0xb1, 0xac, 0x60, 0x87, 0x0f, 0x61, 0x76, 0xe9, 0x9b, 0xa3, 0x17,
	0x5f, 0xa6, 0x77, 0x6b, 0xe2, 0xff, 0x92, 0xd2, 0xfa, 0xd9, 0x8b, 0x8d, 0x99, 0x77, 0x63, 0x6e,
	0x5d, 0xcc, 0xfd, 0x9a, 0x78, 0x05, 0x61, 0xea, 0xae, 0x84, 0xcf, 0x2f, 0x18, 0xc9, 0x46, 0xcd,
	0xf9, 0xf3, 0x3b, 0x97, 0x88, 0xb2, 0x07, 0x2e, 0xb1, 0x17, 0x5a, 0x72, 0x34, 0xd2, 0x75, 0x92,
	0x6c, 0x74, 0xf4, 0x13, 0x00, 0x00, 0xff, 0xff, 0x9a, 0x14, 0xcf, 0xc9, 0x9b, 0x01, 0x00, 0x00,
}
