// Code generated by protoc-gen-go. DO NOT EDIT.
// source: proto2.proto

/*
Package grpc_testing is a generated protocol buffer package.

It is generated from these files:
	proto2.proto
	proto2_ext.proto
	proto2_ext2.proto
	test.proto

It has these top-level messages:
	ToBeExtended
	Extension
	AnotherExtension
	SearchResponse
	SearchRequest
*/
package grpc_testing

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import 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.ProtoPackageIsVersion2 // please upgrade the proto package

type ToBeExtended struct {
	Foo                          *int32 `protobuf:"varint,1,req,name=foo" json:"foo,omitempty"`
	proto.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized             []byte `json:"-"`
}

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

var extRange_ToBeExtended = []proto.ExtensionRange{
	{10, 30},
}

func (*ToBeExtended) ExtensionRangeArray() []proto.ExtensionRange {
	return extRange_ToBeExtended
}

func (m *ToBeExtended) GetFoo() int32 {
	if m != nil && m.Foo != nil {
		return *m.Foo
	}
	return 0
}

func init() {
	proto.RegisterType((*ToBeExtended)(nil), "grpc.testing.ToBeExtended")
}

func init() { proto.RegisterFile("proto2.proto", fileDescriptor0) }

var fileDescriptor0 = []byte{
	// 86 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x29, 0x28, 0xca, 0x2f,
	0xc9, 0x37, 0xd2, 0x03, 0x53, 0x42, 0x3c, 0xe9, 0x45, 0x05, 0xc9, 0x7a, 0x25, 0xa9, 0xc5, 0x25,
	0x99, 0x79, 0xe9, 0x4a, 0x6a, 0x5c, 0x3c, 0x21, 0xf9, 0x4e, 0xa9, 0xae, 0x15, 0x25, 0xa9, 0x79,
	0x29, 0xa9, 0x29, 0x42, 0x02, 0x5c, 0xcc, 0x69, 0xf9, 0xf9, 0x12, 0x8c, 0x0a, 0x4c, 0x1a, 0xac,
	0x41, 0x20, 0xa6, 0x16, 0x0b, 0x07, 0x97, 0x80, 0x3c, 0x20, 0x00, 0x00, 0xff, 0xff, 0x74, 0x86,
	0x9c, 0x08, 0x44, 0x00, 0x00, 0x00,
}
