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

package openapi_v2

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	any "github.com/golang/protobuf/ptypes/any"
	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 AdditionalPropertiesItem struct {
	// Types that are valid to be assigned to Oneof:
	//	*AdditionalPropertiesItem_Schema
	//	*AdditionalPropertiesItem_Boolean
	Oneof                isAdditionalPropertiesItem_Oneof `protobuf_oneof:"oneof"`
	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
	XXX_unrecognized     []byte                           `json:"-"`
	XXX_sizecache        int32                            `json:"-"`
}

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

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

var xxx_messageInfo_AdditionalPropertiesItem proto.InternalMessageInfo

type isAdditionalPropertiesItem_Oneof interface {
	isAdditionalPropertiesItem_Oneof()
}

type AdditionalPropertiesItem_Schema struct {
	Schema *Schema `protobuf:"bytes,1,opt,name=schema,proto3,oneof"`
}

type AdditionalPropertiesItem_Boolean struct {
	Boolean bool `protobuf:"varint,2,opt,name=boolean,proto3,oneof"`
}

func (*AdditionalPropertiesItem_Schema) isAdditionalPropertiesItem_Oneof() {}

func (*AdditionalPropertiesItem_Boolean) isAdditionalPropertiesItem_Oneof() {}

func (m *AdditionalPropertiesItem) GetOneof() isAdditionalPropertiesItem_Oneof {
	if m != nil {
		return m.Oneof
	}
	return nil
}

func (m *AdditionalPropertiesItem) GetSchema() *Schema {
	if x, ok := m.GetOneof().(*AdditionalPropertiesItem_Schema); ok {
		return x.Schema
	}
	return nil
}

func (m *AdditionalPropertiesItem) GetBoolean() bool {
	if x, ok := m.GetOneof().(*AdditionalPropertiesItem_Boolean); ok {
		return x.Boolean
	}
	return false
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*AdditionalPropertiesItem) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*AdditionalPropertiesItem_Schema)(nil),
		(*AdditionalPropertiesItem_Boolean)(nil),
	}
}

type Any struct {
	Value                *any.Any `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	Yaml                 string   `protobuf:"bytes,2,opt,name=yaml,proto3" json:"yaml,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Any) Reset()         { *m = Any{} }
func (m *Any) String() string { return proto.CompactTextString(m) }
func (*Any) ProtoMessage()    {}
func (*Any) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{1}
}

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

var xxx_messageInfo_Any proto.InternalMessageInfo

func (m *Any) GetValue() *any.Any {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *Any) GetYaml() string {
	if m != nil {
		return m.Yaml
	}
	return ""
}

type ApiKeySecurity struct {
	Type                 string      `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
	Name                 string      `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	In                   string      `protobuf:"bytes,3,opt,name=in,proto3" json:"in,omitempty"`
	Description          string      `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
	VendorExtension      []*NamedAny `protobuf:"bytes,5,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *ApiKeySecurity) Reset()         { *m = ApiKeySecurity{} }
func (m *ApiKeySecurity) String() string { return proto.CompactTextString(m) }
func (*ApiKeySecurity) ProtoMessage()    {}
func (*ApiKeySecurity) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{2}
}

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

var xxx_messageInfo_ApiKeySecurity proto.InternalMessageInfo

func (m *ApiKeySecurity) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *ApiKeySecurity) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *ApiKeySecurity) GetIn() string {
	if m != nil {
		return m.In
	}
	return ""
}

func (m *ApiKeySecurity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *ApiKeySecurity) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type BasicAuthenticationSecurity struct {
	Type                 string      `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
	Description          string      `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
	VendorExtension      []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *BasicAuthenticationSecurity) Reset()         { *m = BasicAuthenticationSecurity{} }
func (m *BasicAuthenticationSecurity) String() string { return proto.CompactTextString(m) }
func (*BasicAuthenticationSecurity) ProtoMessage()    {}
func (*BasicAuthenticationSecurity) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{3}
}

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

var xxx_messageInfo_BasicAuthenticationSecurity proto.InternalMessageInfo

func (m *BasicAuthenticationSecurity) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *BasicAuthenticationSecurity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *BasicAuthenticationSecurity) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type BodyParameter struct {
	// A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
	Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
	// The name of the parameter.
	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	// Determines the location of the parameter.
	In string `protobuf:"bytes,3,opt,name=in,proto3" json:"in,omitempty"`
	// Determines whether or not this parameter is required or optional.
	Required             bool        `protobuf:"varint,4,opt,name=required,proto3" json:"required,omitempty"`
	Schema               *Schema     `protobuf:"bytes,5,opt,name=schema,proto3" json:"schema,omitempty"`
	VendorExtension      []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *BodyParameter) Reset()         { *m = BodyParameter{} }
func (m *BodyParameter) String() string { return proto.CompactTextString(m) }
func (*BodyParameter) ProtoMessage()    {}
func (*BodyParameter) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{4}
}

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

var xxx_messageInfo_BodyParameter proto.InternalMessageInfo

func (m *BodyParameter) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *BodyParameter) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *BodyParameter) GetIn() string {
	if m != nil {
		return m.In
	}
	return ""
}

func (m *BodyParameter) GetRequired() bool {
	if m != nil {
		return m.Required
	}
	return false
}

func (m *BodyParameter) GetSchema() *Schema {
	if m != nil {
		return m.Schema
	}
	return nil
}

func (m *BodyParameter) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

// Contact information for the owners of the API.
type Contact struct {
	// The identifying name of the contact person/organization.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The URL pointing to the contact information.
	Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"`
	// The email address of the contact person/organization.
	Email                string      `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"`
	VendorExtension      []*NamedAny `protobuf:"bytes,4,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *Contact) Reset()         { *m = Contact{} }
func (m *Contact) String() string { return proto.CompactTextString(m) }
func (*Contact) ProtoMessage()    {}
func (*Contact) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{5}
}

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

var xxx_messageInfo_Contact proto.InternalMessageInfo

func (m *Contact) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Contact) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *Contact) GetEmail() string {
	if m != nil {
		return m.Email
	}
	return ""
}

func (m *Contact) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Default struct {
	AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *Default) Reset()         { *m = Default{} }
func (m *Default) String() string { return proto.CompactTextString(m) }
func (*Default) ProtoMessage()    {}
func (*Default) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{6}
}

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

var xxx_messageInfo_Default proto.InternalMessageInfo

func (m *Default) GetAdditionalProperties() []*NamedAny {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

// One or more JSON objects describing the schemas being consumed and produced by the API.
type Definitions struct {
	AdditionalProperties []*NamedSchema `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *Definitions) Reset()         { *m = Definitions{} }
func (m *Definitions) String() string { return proto.CompactTextString(m) }
func (*Definitions) ProtoMessage()    {}
func (*Definitions) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{7}
}

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

var xxx_messageInfo_Definitions proto.InternalMessageInfo

func (m *Definitions) GetAdditionalProperties() []*NamedSchema {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type Document struct {
	// The Swagger version of this document.
	Swagger string `protobuf:"bytes,1,opt,name=swagger,proto3" json:"swagger,omitempty"`
	Info    *Info  `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"`
	// The host (name or ip) of the API. Example: 'swagger.io'
	Host string `protobuf:"bytes,3,opt,name=host,proto3" json:"host,omitempty"`
	// The base path to the API. Example: '/api'.
	BasePath string `protobuf:"bytes,4,opt,name=base_path,json=basePath,proto3" json:"base_path,omitempty"`
	// The transfer protocol of the API.
	Schemes []string `protobuf:"bytes,5,rep,name=schemes,proto3" json:"schemes,omitempty"`
	// A list of MIME types accepted by the API.
	Consumes []string `protobuf:"bytes,6,rep,name=consumes,proto3" json:"consumes,omitempty"`
	// A list of MIME types the API can produce.
	Produces             []string               `protobuf:"bytes,7,rep,name=produces,proto3" json:"produces,omitempty"`
	Paths                *Paths                 `protobuf:"bytes,8,opt,name=paths,proto3" json:"paths,omitempty"`
	Definitions          *Definitions           `protobuf:"bytes,9,opt,name=definitions,proto3" json:"definitions,omitempty"`
	Parameters           *ParameterDefinitions  `protobuf:"bytes,10,opt,name=parameters,proto3" json:"parameters,omitempty"`
	Responses            *ResponseDefinitions   `protobuf:"bytes,11,opt,name=responses,proto3" json:"responses,omitempty"`
	Security             []*SecurityRequirement `protobuf:"bytes,12,rep,name=security,proto3" json:"security,omitempty"`
	SecurityDefinitions  *SecurityDefinitions   `protobuf:"bytes,13,opt,name=security_definitions,json=securityDefinitions,proto3" json:"security_definitions,omitempty"`
	Tags                 []*Tag                 `protobuf:"bytes,14,rep,name=tags,proto3" json:"tags,omitempty"`
	ExternalDocs         *ExternalDocs          `protobuf:"bytes,15,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"`
	VendorExtension      []*NamedAny            `protobuf:"bytes,16,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *Document) Reset()         { *m = Document{} }
func (m *Document) String() string { return proto.CompactTextString(m) }
func (*Document) ProtoMessage()    {}
func (*Document) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{8}
}

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

var xxx_messageInfo_Document proto.InternalMessageInfo

func (m *Document) GetSwagger() string {
	if m != nil {
		return m.Swagger
	}
	return ""
}

func (m *Document) GetInfo() *Info {
	if m != nil {
		return m.Info
	}
	return nil
}

func (m *Document) GetHost() string {
	if m != nil {
		return m.Host
	}
	return ""
}

func (m *Document) GetBasePath() string {
	if m != nil {
		return m.BasePath
	}
	return ""
}

func (m *Document) GetSchemes() []string {
	if m != nil {
		return m.Schemes
	}
	return nil
}

func (m *Document) GetConsumes() []string {
	if m != nil {
		return m.Consumes
	}
	return nil
}

func (m *Document) GetProduces() []string {
	if m != nil {
		return m.Produces
	}
	return nil
}

func (m *Document) GetPaths() *Paths {
	if m != nil {
		return m.Paths
	}
	return nil
}

func (m *Document) GetDefinitions() *Definitions {
	if m != nil {
		return m.Definitions
	}
	return nil
}

func (m *Document) GetParameters() *ParameterDefinitions {
	if m != nil {
		return m.Parameters
	}
	return nil
}

func (m *Document) GetResponses() *ResponseDefinitions {
	if m != nil {
		return m.Responses
	}
	return nil
}

func (m *Document) GetSecurity() []*SecurityRequirement {
	if m != nil {
		return m.Security
	}
	return nil
}

func (m *Document) GetSecurityDefinitions() *SecurityDefinitions {
	if m != nil {
		return m.SecurityDefinitions
	}
	return nil
}

func (m *Document) GetTags() []*Tag {
	if m != nil {
		return m.Tags
	}
	return nil
}

func (m *Document) GetExternalDocs() *ExternalDocs {
	if m != nil {
		return m.ExternalDocs
	}
	return nil
}

func (m *Document) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Examples struct {
	AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *Examples) Reset()         { *m = Examples{} }
func (m *Examples) String() string { return proto.CompactTextString(m) }
func (*Examples) ProtoMessage()    {}
func (*Examples) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{9}
}

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

var xxx_messageInfo_Examples proto.InternalMessageInfo

func (m *Examples) GetAdditionalProperties() []*NamedAny {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

// information about external documentation
type ExternalDocs struct {
	Description          string      `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
	Url                  string      `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"`
	VendorExtension      []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *ExternalDocs) Reset()         { *m = ExternalDocs{} }
func (m *ExternalDocs) String() string { return proto.CompactTextString(m) }
func (*ExternalDocs) ProtoMessage()    {}
func (*ExternalDocs) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{10}
}

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

var xxx_messageInfo_ExternalDocs proto.InternalMessageInfo

func (m *ExternalDocs) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *ExternalDocs) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *ExternalDocs) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

// A deterministic version of a JSON Schema object.
type FileSchema struct {
	Format               string        `protobuf:"bytes,1,opt,name=format,proto3" json:"format,omitempty"`
	Title                string        `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
	Description          string        `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	Default              *Any          `protobuf:"bytes,4,opt,name=default,proto3" json:"default,omitempty"`
	Required             []string      `protobuf:"bytes,5,rep,name=required,proto3" json:"required,omitempty"`
	Type                 string        `protobuf:"bytes,6,opt,name=type,proto3" json:"type,omitempty"`
	ReadOnly             bool          `protobuf:"varint,7,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"`
	ExternalDocs         *ExternalDocs `protobuf:"bytes,8,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"`
	Example              *Any          `protobuf:"bytes,9,opt,name=example,proto3" json:"example,omitempty"`
	VendorExtension      []*NamedAny   `protobuf:"bytes,10,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *FileSchema) Reset()         { *m = FileSchema{} }
func (m *FileSchema) String() string { return proto.CompactTextString(m) }
func (*FileSchema) ProtoMessage()    {}
func (*FileSchema) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{11}
}

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

var xxx_messageInfo_FileSchema proto.InternalMessageInfo

func (m *FileSchema) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *FileSchema) GetTitle() string {
	if m != nil {
		return m.Title
	}
	return ""
}

func (m *FileSchema) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *FileSchema) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *FileSchema) GetRequired() []string {
	if m != nil {
		return m.Required
	}
	return nil
}

func (m *FileSchema) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *FileSchema) GetReadOnly() bool {
	if m != nil {
		return m.ReadOnly
	}
	return false
}

func (m *FileSchema) GetExternalDocs() *ExternalDocs {
	if m != nil {
		return m.ExternalDocs
	}
	return nil
}

func (m *FileSchema) GetExample() *Any {
	if m != nil {
		return m.Example
	}
	return nil
}

func (m *FileSchema) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type FormDataParameterSubSchema struct {
	// Determines whether or not this parameter is required or optional.
	Required bool `protobuf:"varint,1,opt,name=required,proto3" json:"required,omitempty"`
	// Determines the location of the parameter.
	In string `protobuf:"bytes,2,opt,name=in,proto3" json:"in,omitempty"`
	// A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// The name of the parameter.
	Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
	// allows sending a parameter by name only or with an empty value.
	AllowEmptyValue      bool             `protobuf:"varint,5,opt,name=allow_empty_value,json=allowEmptyValue,proto3" json:"allow_empty_value,omitempty"`
	Type                 string           `protobuf:"bytes,6,opt,name=type,proto3" json:"type,omitempty"`
	Format               string           `protobuf:"bytes,7,opt,name=format,proto3" json:"format,omitempty"`
	Items                *PrimitivesItems `protobuf:"bytes,8,opt,name=items,proto3" json:"items,omitempty"`
	CollectionFormat     string           `protobuf:"bytes,9,opt,name=collection_format,json=collectionFormat,proto3" json:"collection_format,omitempty"`
	Default              *Any             `protobuf:"bytes,10,opt,name=default,proto3" json:"default,omitempty"`
	Maximum              float64          `protobuf:"fixed64,11,opt,name=maximum,proto3" json:"maximum,omitempty"`
	ExclusiveMaximum     bool             `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"`
	Minimum              float64          `protobuf:"fixed64,13,opt,name=minimum,proto3" json:"minimum,omitempty"`
	ExclusiveMinimum     bool             `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"`
	MaxLength            int64            `protobuf:"varint,15,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"`
	MinLength            int64            `protobuf:"varint,16,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"`
	Pattern              string           `protobuf:"bytes,17,opt,name=pattern,proto3" json:"pattern,omitempty"`
	MaxItems             int64            `protobuf:"varint,18,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"`
	MinItems             int64            `protobuf:"varint,19,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"`
	UniqueItems          bool             `protobuf:"varint,20,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"`
	Enum                 []*Any           `protobuf:"bytes,21,rep,name=enum,proto3" json:"enum,omitempty"`
	MultipleOf           float64          `protobuf:"fixed64,22,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"`
	VendorExtension      []*NamedAny      `protobuf:"bytes,23,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *FormDataParameterSubSchema) Reset()         { *m = FormDataParameterSubSchema{} }
func (m *FormDataParameterSubSchema) String() string { return proto.CompactTextString(m) }
func (*FormDataParameterSubSchema) ProtoMessage()    {}
func (*FormDataParameterSubSchema) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{12}
}

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

var xxx_messageInfo_FormDataParameterSubSchema proto.InternalMessageInfo

func (m *FormDataParameterSubSchema) GetRequired() bool {
	if m != nil {
		return m.Required
	}
	return false
}

func (m *FormDataParameterSubSchema) GetIn() string {
	if m != nil {
		return m.In
	}
	return ""
}

func (m *FormDataParameterSubSchema) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *FormDataParameterSubSchema) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *FormDataParameterSubSchema) GetAllowEmptyValue() bool {
	if m != nil {
		return m.AllowEmptyValue
	}
	return false
}

func (m *FormDataParameterSubSchema) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *FormDataParameterSubSchema) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *FormDataParameterSubSchema) GetItems() *PrimitivesItems {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *FormDataParameterSubSchema) GetCollectionFormat() string {
	if m != nil {
		return m.CollectionFormat
	}
	return ""
}

func (m *FormDataParameterSubSchema) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *FormDataParameterSubSchema) GetMaximum() float64 {
	if m != nil {
		return m.Maximum
	}
	return 0
}

func (m *FormDataParameterSubSchema) GetExclusiveMaximum() bool {
	if m != nil {
		return m.ExclusiveMaximum
	}
	return false
}

func (m *FormDataParameterSubSchema) GetMinimum() float64 {
	if m != nil {
		return m.Minimum
	}
	return 0
}

func (m *FormDataParameterSubSchema) GetExclusiveMinimum() bool {
	if m != nil {
		return m.ExclusiveMinimum
	}
	return false
}

func (m *FormDataParameterSubSchema) GetMaxLength() int64 {
	if m != nil {
		return m.MaxLength
	}
	return 0
}

func (m *FormDataParameterSubSchema) GetMinLength() int64 {
	if m != nil {
		return m.MinLength
	}
	return 0
}

func (m *FormDataParameterSubSchema) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *FormDataParameterSubSchema) GetMaxItems() int64 {
	if m != nil {
		return m.MaxItems
	}
	return 0
}

func (m *FormDataParameterSubSchema) GetMinItems() int64 {
	if m != nil {
		return m.MinItems
	}
	return 0
}

func (m *FormDataParameterSubSchema) GetUniqueItems() bool {
	if m != nil {
		return m.UniqueItems
	}
	return false
}

func (m *FormDataParameterSubSchema) GetEnum() []*Any {
	if m != nil {
		return m.Enum
	}
	return nil
}

func (m *FormDataParameterSubSchema) GetMultipleOf() float64 {
	if m != nil {
		return m.MultipleOf
	}
	return 0
}

func (m *FormDataParameterSubSchema) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Header struct {
	Type                 string           `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
	Format               string           `protobuf:"bytes,2,opt,name=format,proto3" json:"format,omitempty"`
	Items                *PrimitivesItems `protobuf:"bytes,3,opt,name=items,proto3" json:"items,omitempty"`
	CollectionFormat     string           `protobuf:"bytes,4,opt,name=collection_format,json=collectionFormat,proto3" json:"collection_format,omitempty"`
	Default              *Any             `protobuf:"bytes,5,opt,name=default,proto3" json:"default,omitempty"`
	Maximum              float64          `protobuf:"fixed64,6,opt,name=maximum,proto3" json:"maximum,omitempty"`
	ExclusiveMaximum     bool             `protobuf:"varint,7,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"`
	Minimum              float64          `protobuf:"fixed64,8,opt,name=minimum,proto3" json:"minimum,omitempty"`
	ExclusiveMinimum     bool             `protobuf:"varint,9,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"`
	MaxLength            int64            `protobuf:"varint,10,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"`
	MinLength            int64            `protobuf:"varint,11,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"`
	Pattern              string           `protobuf:"bytes,12,opt,name=pattern,proto3" json:"pattern,omitempty"`
	MaxItems             int64            `protobuf:"varint,13,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"`
	MinItems             int64            `protobuf:"varint,14,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"`
	UniqueItems          bool             `protobuf:"varint,15,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"`
	Enum                 []*Any           `protobuf:"bytes,16,rep,name=enum,proto3" json:"enum,omitempty"`
	MultipleOf           float64          `protobuf:"fixed64,17,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"`
	Description          string           `protobuf:"bytes,18,opt,name=description,proto3" json:"description,omitempty"`
	VendorExtension      []*NamedAny      `protobuf:"bytes,19,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *Header) Reset()         { *m = Header{} }
func (m *Header) String() string { return proto.CompactTextString(m) }
func (*Header) ProtoMessage()    {}
func (*Header) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{13}
}

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

var xxx_messageInfo_Header proto.InternalMessageInfo

func (m *Header) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *Header) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *Header) GetItems() *PrimitivesItems {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *Header) GetCollectionFormat() string {
	if m != nil {
		return m.CollectionFormat
	}
	return ""
}

func (m *Header) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *Header) GetMaximum() float64 {
	if m != nil {
		return m.Maximum
	}
	return 0
}

func (m *Header) GetExclusiveMaximum() bool {
	if m != nil {
		return m.ExclusiveMaximum
	}
	return false
}

func (m *Header) GetMinimum() float64 {
	if m != nil {
		return m.Minimum
	}
	return 0
}

func (m *Header) GetExclusiveMinimum() bool {
	if m != nil {
		return m.ExclusiveMinimum
	}
	return false
}

func (m *Header) GetMaxLength() int64 {
	if m != nil {
		return m.MaxLength
	}
	return 0
}

func (m *Header) GetMinLength() int64 {
	if m != nil {
		return m.MinLength
	}
	return 0
}

func (m *Header) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *Header) GetMaxItems() int64 {
	if m != nil {
		return m.MaxItems
	}
	return 0
}

func (m *Header) GetMinItems() int64 {
	if m != nil {
		return m.MinItems
	}
	return 0
}

func (m *Header) GetUniqueItems() bool {
	if m != nil {
		return m.UniqueItems
	}
	return false
}

func (m *Header) GetEnum() []*Any {
	if m != nil {
		return m.Enum
	}
	return nil
}

func (m *Header) GetMultipleOf() float64 {
	if m != nil {
		return m.MultipleOf
	}
	return 0
}

func (m *Header) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Header) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type HeaderParameterSubSchema struct {
	// Determines whether or not this parameter is required or optional.
	Required bool `protobuf:"varint,1,opt,name=required,proto3" json:"required,omitempty"`
	// Determines the location of the parameter.
	In string `protobuf:"bytes,2,opt,name=in,proto3" json:"in,omitempty"`
	// A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// The name of the parameter.
	Name                 string           `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
	Type                 string           `protobuf:"bytes,5,opt,name=type,proto3" json:"type,omitempty"`
	Format               string           `protobuf:"bytes,6,opt,name=format,proto3" json:"format,omitempty"`
	Items                *PrimitivesItems `protobuf:"bytes,7,opt,name=items,proto3" json:"items,omitempty"`
	CollectionFormat     string           `protobuf:"bytes,8,opt,name=collection_format,json=collectionFormat,proto3" json:"collection_format,omitempty"`
	Default              *Any             `protobuf:"bytes,9,opt,name=default,proto3" json:"default,omitempty"`
	Maximum              float64          `protobuf:"fixed64,10,opt,name=maximum,proto3" json:"maximum,omitempty"`
	ExclusiveMaximum     bool             `protobuf:"varint,11,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"`
	Minimum              float64          `protobuf:"fixed64,12,opt,name=minimum,proto3" json:"minimum,omitempty"`
	ExclusiveMinimum     bool             `protobuf:"varint,13,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"`
	MaxLength            int64            `protobuf:"varint,14,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"`
	MinLength            int64            `protobuf:"varint,15,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"`
	Pattern              string           `protobuf:"bytes,16,opt,name=pattern,proto3" json:"pattern,omitempty"`
	MaxItems             int64            `protobuf:"varint,17,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"`
	MinItems             int64            `protobuf:"varint,18,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"`
	UniqueItems          bool             `protobuf:"varint,19,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"`
	Enum                 []*Any           `protobuf:"bytes,20,rep,name=enum,proto3" json:"enum,omitempty"`
	MultipleOf           float64          `protobuf:"fixed64,21,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"`
	VendorExtension      []*NamedAny      `protobuf:"bytes,22,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *HeaderParameterSubSchema) Reset()         { *m = HeaderParameterSubSchema{} }
func (m *HeaderParameterSubSchema) String() string { return proto.CompactTextString(m) }
func (*HeaderParameterSubSchema) ProtoMessage()    {}
func (*HeaderParameterSubSchema) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{14}
}

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

var xxx_messageInfo_HeaderParameterSubSchema proto.InternalMessageInfo

func (m *HeaderParameterSubSchema) GetRequired() bool {
	if m != nil {
		return m.Required
	}
	return false
}

func (m *HeaderParameterSubSchema) GetIn() string {
	if m != nil {
		return m.In
	}
	return ""
}

func (m *HeaderParameterSubSchema) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *HeaderParameterSubSchema) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *HeaderParameterSubSchema) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *HeaderParameterSubSchema) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *HeaderParameterSubSchema) GetItems() *PrimitivesItems {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *HeaderParameterSubSchema) GetCollectionFormat() string {
	if m != nil {
		return m.CollectionFormat
	}
	return ""
}

func (m *HeaderParameterSubSchema) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *HeaderParameterSubSchema) GetMaximum() float64 {
	if m != nil {
		return m.Maximum
	}
	return 0
}

func (m *HeaderParameterSubSchema) GetExclusiveMaximum() bool {
	if m != nil {
		return m.ExclusiveMaximum
	}
	return false
}

func (m *HeaderParameterSubSchema) GetMinimum() float64 {
	if m != nil {
		return m.Minimum
	}
	return 0
}

func (m *HeaderParameterSubSchema) GetExclusiveMinimum() bool {
	if m != nil {
		return m.ExclusiveMinimum
	}
	return false
}

func (m *HeaderParameterSubSchema) GetMaxLength() int64 {
	if m != nil {
		return m.MaxLength
	}
	return 0
}

func (m *HeaderParameterSubSchema) GetMinLength() int64 {
	if m != nil {
		return m.MinLength
	}
	return 0
}

func (m *HeaderParameterSubSchema) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *HeaderParameterSubSchema) GetMaxItems() int64 {
	if m != nil {
		return m.MaxItems
	}
	return 0
}

func (m *HeaderParameterSubSchema) GetMinItems() int64 {
	if m != nil {
		return m.MinItems
	}
	return 0
}

func (m *HeaderParameterSubSchema) GetUniqueItems() bool {
	if m != nil {
		return m.UniqueItems
	}
	return false
}

func (m *HeaderParameterSubSchema) GetEnum() []*Any {
	if m != nil {
		return m.Enum
	}
	return nil
}

func (m *HeaderParameterSubSchema) GetMultipleOf() float64 {
	if m != nil {
		return m.MultipleOf
	}
	return 0
}

func (m *HeaderParameterSubSchema) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Headers struct {
	AdditionalProperties []*NamedHeader `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *Headers) Reset()         { *m = Headers{} }
func (m *Headers) String() string { return proto.CompactTextString(m) }
func (*Headers) ProtoMessage()    {}
func (*Headers) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{15}
}

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

var xxx_messageInfo_Headers proto.InternalMessageInfo

func (m *Headers) GetAdditionalProperties() []*NamedHeader {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

// General information about the API.
type Info struct {
	// A unique and precise title of the API.
	Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
	// A semantic version number of the API.
	Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	// A longer description of the API. Should be different from the title.  GitHub Flavored Markdown is allowed.
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// The terms of service for the API.
	TermsOfService       string      `protobuf:"bytes,4,opt,name=terms_of_service,json=termsOfService,proto3" json:"terms_of_service,omitempty"`
	Contact              *Contact    `protobuf:"bytes,5,opt,name=contact,proto3" json:"contact,omitempty"`
	License              *License    `protobuf:"bytes,6,opt,name=license,proto3" json:"license,omitempty"`
	VendorExtension      []*NamedAny `protobuf:"bytes,7,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *Info) Reset()         { *m = Info{} }
func (m *Info) String() string { return proto.CompactTextString(m) }
func (*Info) ProtoMessage()    {}
func (*Info) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{16}
}

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

var xxx_messageInfo_Info proto.InternalMessageInfo

func (m *Info) GetTitle() string {
	if m != nil {
		return m.Title
	}
	return ""
}

func (m *Info) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

func (m *Info) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Info) GetTermsOfService() string {
	if m != nil {
		return m.TermsOfService
	}
	return ""
}

func (m *Info) GetContact() *Contact {
	if m != nil {
		return m.Contact
	}
	return nil
}

func (m *Info) GetLicense() *License {
	if m != nil {
		return m.License
	}
	return nil
}

func (m *Info) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type ItemsItem struct {
	Schema               []*Schema `protobuf:"bytes,1,rep,name=schema,proto3" json:"schema,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *ItemsItem) Reset()         { *m = ItemsItem{} }
func (m *ItemsItem) String() string { return proto.CompactTextString(m) }
func (*ItemsItem) ProtoMessage()    {}
func (*ItemsItem) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{17}
}

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

var xxx_messageInfo_ItemsItem proto.InternalMessageInfo

func (m *ItemsItem) GetSchema() []*Schema {
	if m != nil {
		return m.Schema
	}
	return nil
}

type JsonReference struct {
	XRef                 string   `protobuf:"bytes,1,opt,name=_ref,json=Ref,proto3" json:"_ref,omitempty"`
	Description          string   `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *JsonReference) Reset()         { *m = JsonReference{} }
func (m *JsonReference) String() string { return proto.CompactTextString(m) }
func (*JsonReference) ProtoMessage()    {}
func (*JsonReference) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{18}
}

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

var xxx_messageInfo_JsonReference proto.InternalMessageInfo

func (m *JsonReference) GetXRef() string {
	if m != nil {
		return m.XRef
	}
	return ""
}

func (m *JsonReference) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

type License struct {
	// The name of the license type. It's encouraged to use an OSI compatible license.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The URL pointing to the license.
	Url                  string      `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"`
	VendorExtension      []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *License) Reset()         { *m = License{} }
func (m *License) String() string { return proto.CompactTextString(m) }
func (*License) ProtoMessage()    {}
func (*License) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{19}
}

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

var xxx_messageInfo_License proto.InternalMessageInfo

func (m *License) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *License) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *License) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs.
type NamedAny struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Mapped value
	Value                *Any     `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *NamedAny) Reset()         { *m = NamedAny{} }
func (m *NamedAny) String() string { return proto.CompactTextString(m) }
func (*NamedAny) ProtoMessage()    {}
func (*NamedAny) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{20}
}

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

var xxx_messageInfo_NamedAny proto.InternalMessageInfo

func (m *NamedAny) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedAny) GetValue() *Any {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of Header as ordered (name,value) pairs.
type NamedHeader struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Mapped value
	Value                *Header  `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *NamedHeader) Reset()         { *m = NamedHeader{} }
func (m *NamedHeader) String() string { return proto.CompactTextString(m) }
func (*NamedHeader) ProtoMessage()    {}
func (*NamedHeader) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{21}
}

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

var xxx_messageInfo_NamedHeader proto.InternalMessageInfo

func (m *NamedHeader) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedHeader) GetValue() *Header {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of Parameter as ordered (name,value) pairs.
type NamedParameter struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Mapped value
	Value                *Parameter `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *NamedParameter) Reset()         { *m = NamedParameter{} }
func (m *NamedParameter) String() string { return proto.CompactTextString(m) }
func (*NamedParameter) ProtoMessage()    {}
func (*NamedParameter) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{22}
}

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

var xxx_messageInfo_NamedParameter proto.InternalMessageInfo

func (m *NamedParameter) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedParameter) GetValue() *Parameter {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs.
type NamedPathItem struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Mapped value
	Value                *PathItem `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *NamedPathItem) Reset()         { *m = NamedPathItem{} }
func (m *NamedPathItem) String() string { return proto.CompactTextString(m) }
func (*NamedPathItem) ProtoMessage()    {}
func (*NamedPathItem) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{23}
}

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

var xxx_messageInfo_NamedPathItem proto.InternalMessageInfo

func (m *NamedPathItem) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedPathItem) GetValue() *PathItem {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of Response as ordered (name,value) pairs.
type NamedResponse struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Mapped value
	Value                *Response `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *NamedResponse) Reset()         { *m = NamedResponse{} }
func (m *NamedResponse) String() string { return proto.CompactTextString(m) }
func (*NamedResponse) ProtoMessage()    {}
func (*NamedResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{24}
}

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

var xxx_messageInfo_NamedResponse proto.InternalMessageInfo

func (m *NamedResponse) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedResponse) GetValue() *Response {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of ResponseValue as ordered (name,value) pairs.
type NamedResponseValue struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Mapped value
	Value                *ResponseValue `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *NamedResponseValue) Reset()         { *m = NamedResponseValue{} }
func (m *NamedResponseValue) String() string { return proto.CompactTextString(m) }
func (*NamedResponseValue) ProtoMessage()    {}
func (*NamedResponseValue) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{25}
}

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

var xxx_messageInfo_NamedResponseValue proto.InternalMessageInfo

func (m *NamedResponseValue) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedResponseValue) GetValue() *ResponseValue {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of Schema as ordered (name,value) pairs.
type NamedSchema struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Mapped value
	Value                *Schema  `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *NamedSchema) Reset()         { *m = NamedSchema{} }
func (m *NamedSchema) String() string { return proto.CompactTextString(m) }
func (*NamedSchema) ProtoMessage()    {}
func (*NamedSchema) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{26}
}

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

var xxx_messageInfo_NamedSchema proto.InternalMessageInfo

func (m *NamedSchema) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedSchema) GetValue() *Schema {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of SecurityDefinitionsItem as ordered (name,value) pairs.
type NamedSecurityDefinitionsItem struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Mapped value
	Value                *SecurityDefinitionsItem `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *NamedSecurityDefinitionsItem) Reset()         { *m = NamedSecurityDefinitionsItem{} }
func (m *NamedSecurityDefinitionsItem) String() string { return proto.CompactTextString(m) }
func (*NamedSecurityDefinitionsItem) ProtoMessage()    {}
func (*NamedSecurityDefinitionsItem) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{27}
}

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

var xxx_messageInfo_NamedSecurityDefinitionsItem proto.InternalMessageInfo

func (m *NamedSecurityDefinitionsItem) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedSecurityDefinitionsItem) GetValue() *SecurityDefinitionsItem {
	if m != nil {
		return m.Value
	}
	return nil
}

// Automatically-generated message used to represent maps of string as ordered (name,value) pairs.
type NamedString struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Mapped value
	Value                string   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *NamedString) Reset()         { *m = NamedString{} }
func (m *NamedString) String() string { return proto.CompactTextString(m) }
func (*NamedString) ProtoMessage()    {}
func (*NamedString) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{28}
}

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

var xxx_messageInfo_NamedString proto.InternalMessageInfo

func (m *NamedString) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedString) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

// Automatically-generated message used to represent maps of StringArray as ordered (name,value) pairs.
type NamedStringArray struct {
	// Map key
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Mapped value
	Value                *StringArray `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *NamedStringArray) Reset()         { *m = NamedStringArray{} }
func (m *NamedStringArray) String() string { return proto.CompactTextString(m) }
func (*NamedStringArray) ProtoMessage()    {}
func (*NamedStringArray) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{29}
}

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

var xxx_messageInfo_NamedStringArray proto.InternalMessageInfo

func (m *NamedStringArray) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *NamedStringArray) GetValue() *StringArray {
	if m != nil {
		return m.Value
	}
	return nil
}

type NonBodyParameter struct {
	// Types that are valid to be assigned to Oneof:
	//	*NonBodyParameter_HeaderParameterSubSchema
	//	*NonBodyParameter_FormDataParameterSubSchema
	//	*NonBodyParameter_QueryParameterSubSchema
	//	*NonBodyParameter_PathParameterSubSchema
	Oneof                isNonBodyParameter_Oneof `protobuf_oneof:"oneof"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *NonBodyParameter) Reset()         { *m = NonBodyParameter{} }
func (m *NonBodyParameter) String() string { return proto.CompactTextString(m) }
func (*NonBodyParameter) ProtoMessage()    {}
func (*NonBodyParameter) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{30}
}

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

var xxx_messageInfo_NonBodyParameter proto.InternalMessageInfo

type isNonBodyParameter_Oneof interface {
	isNonBodyParameter_Oneof()
}

type NonBodyParameter_HeaderParameterSubSchema struct {
	HeaderParameterSubSchema *HeaderParameterSubSchema `protobuf:"bytes,1,opt,name=header_parameter_sub_schema,json=headerParameterSubSchema,proto3,oneof"`
}

type NonBodyParameter_FormDataParameterSubSchema struct {
	FormDataParameterSubSchema *FormDataParameterSubSchema `protobuf:"bytes,2,opt,name=form_data_parameter_sub_schema,json=formDataParameterSubSchema,proto3,oneof"`
}

type NonBodyParameter_QueryParameterSubSchema struct {
	QueryParameterSubSchema *QueryParameterSubSchema `protobuf:"bytes,3,opt,name=query_parameter_sub_schema,json=queryParameterSubSchema,proto3,oneof"`
}

type NonBodyParameter_PathParameterSubSchema struct {
	PathParameterSubSchema *PathParameterSubSchema `protobuf:"bytes,4,opt,name=path_parameter_sub_schema,json=pathParameterSubSchema,proto3,oneof"`
}

func (*NonBodyParameter_HeaderParameterSubSchema) isNonBodyParameter_Oneof() {}

func (*NonBodyParameter_FormDataParameterSubSchema) isNonBodyParameter_Oneof() {}

func (*NonBodyParameter_QueryParameterSubSchema) isNonBodyParameter_Oneof() {}

func (*NonBodyParameter_PathParameterSubSchema) isNonBodyParameter_Oneof() {}

func (m *NonBodyParameter) GetOneof() isNonBodyParameter_Oneof {
	if m != nil {
		return m.Oneof
	}
	return nil
}

func (m *NonBodyParameter) GetHeaderParameterSubSchema() *HeaderParameterSubSchema {
	if x, ok := m.GetOneof().(*NonBodyParameter_HeaderParameterSubSchema); ok {
		return x.HeaderParameterSubSchema
	}
	return nil
}

func (m *NonBodyParameter) GetFormDataParameterSubSchema() *FormDataParameterSubSchema {
	if x, ok := m.GetOneof().(*NonBodyParameter_FormDataParameterSubSchema); ok {
		return x.FormDataParameterSubSchema
	}
	return nil
}

func (m *NonBodyParameter) GetQueryParameterSubSchema() *QueryParameterSubSchema {
	if x, ok := m.GetOneof().(*NonBodyParameter_QueryParameterSubSchema); ok {
		return x.QueryParameterSubSchema
	}
	return nil
}

func (m *NonBodyParameter) GetPathParameterSubSchema() *PathParameterSubSchema {
	if x, ok := m.GetOneof().(*NonBodyParameter_PathParameterSubSchema); ok {
		return x.PathParameterSubSchema
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*NonBodyParameter) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*NonBodyParameter_HeaderParameterSubSchema)(nil),
		(*NonBodyParameter_FormDataParameterSubSchema)(nil),
		(*NonBodyParameter_QueryParameterSubSchema)(nil),
		(*NonBodyParameter_PathParameterSubSchema)(nil),
	}
}

type Oauth2AccessCodeSecurity struct {
	Type                 string        `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
	Flow                 string        `protobuf:"bytes,2,opt,name=flow,proto3" json:"flow,omitempty"`
	Scopes               *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes,proto3" json:"scopes,omitempty"`
	AuthorizationUrl     string        `protobuf:"bytes,4,opt,name=authorization_url,json=authorizationUrl,proto3" json:"authorization_url,omitempty"`
	TokenUrl             string        `protobuf:"bytes,5,opt,name=token_url,json=tokenUrl,proto3" json:"token_url,omitempty"`
	Description          string        `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"`
	VendorExtension      []*NamedAny   `protobuf:"bytes,7,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *Oauth2AccessCodeSecurity) Reset()         { *m = Oauth2AccessCodeSecurity{} }
func (m *Oauth2AccessCodeSecurity) String() string { return proto.CompactTextString(m) }
func (*Oauth2AccessCodeSecurity) ProtoMessage()    {}
func (*Oauth2AccessCodeSecurity) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{31}
}

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

var xxx_messageInfo_Oauth2AccessCodeSecurity proto.InternalMessageInfo

func (m *Oauth2AccessCodeSecurity) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *Oauth2AccessCodeSecurity) GetFlow() string {
	if m != nil {
		return m.Flow
	}
	return ""
}

func (m *Oauth2AccessCodeSecurity) GetScopes() *Oauth2Scopes {
	if m != nil {
		return m.Scopes
	}
	return nil
}

func (m *Oauth2AccessCodeSecurity) GetAuthorizationUrl() string {
	if m != nil {
		return m.AuthorizationUrl
	}
	return ""
}

func (m *Oauth2AccessCodeSecurity) GetTokenUrl() string {
	if m != nil {
		return m.TokenUrl
	}
	return ""
}

func (m *Oauth2AccessCodeSecurity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Oauth2AccessCodeSecurity) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Oauth2ApplicationSecurity struct {
	Type                 string        `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
	Flow                 string        `protobuf:"bytes,2,opt,name=flow,proto3" json:"flow,omitempty"`
	Scopes               *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes,proto3" json:"scopes,omitempty"`
	TokenUrl             string        `protobuf:"bytes,4,opt,name=token_url,json=tokenUrl,proto3" json:"token_url,omitempty"`
	Description          string        `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"`
	VendorExtension      []*NamedAny   `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *Oauth2ApplicationSecurity) Reset()         { *m = Oauth2ApplicationSecurity{} }
func (m *Oauth2ApplicationSecurity) String() string { return proto.CompactTextString(m) }
func (*Oauth2ApplicationSecurity) ProtoMessage()    {}
func (*Oauth2ApplicationSecurity) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{32}
}

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

var xxx_messageInfo_Oauth2ApplicationSecurity proto.InternalMessageInfo

func (m *Oauth2ApplicationSecurity) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *Oauth2ApplicationSecurity) GetFlow() string {
	if m != nil {
		return m.Flow
	}
	return ""
}

func (m *Oauth2ApplicationSecurity) GetScopes() *Oauth2Scopes {
	if m != nil {
		return m.Scopes
	}
	return nil
}

func (m *Oauth2ApplicationSecurity) GetTokenUrl() string {
	if m != nil {
		return m.TokenUrl
	}
	return ""
}

func (m *Oauth2ApplicationSecurity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Oauth2ApplicationSecurity) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Oauth2ImplicitSecurity struct {
	Type                 string        `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
	Flow                 string        `protobuf:"bytes,2,opt,name=flow,proto3" json:"flow,omitempty"`
	Scopes               *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes,proto3" json:"scopes,omitempty"`
	AuthorizationUrl     string        `protobuf:"bytes,4,opt,name=authorization_url,json=authorizationUrl,proto3" json:"authorization_url,omitempty"`
	Description          string        `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"`
	VendorExtension      []*NamedAny   `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *Oauth2ImplicitSecurity) Reset()         { *m = Oauth2ImplicitSecurity{} }
func (m *Oauth2ImplicitSecurity) String() string { return proto.CompactTextString(m) }
func (*Oauth2ImplicitSecurity) ProtoMessage()    {}
func (*Oauth2ImplicitSecurity) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{33}
}

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

var xxx_messageInfo_Oauth2ImplicitSecurity proto.InternalMessageInfo

func (m *Oauth2ImplicitSecurity) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *Oauth2ImplicitSecurity) GetFlow() string {
	if m != nil {
		return m.Flow
	}
	return ""
}

func (m *Oauth2ImplicitSecurity) GetScopes() *Oauth2Scopes {
	if m != nil {
		return m.Scopes
	}
	return nil
}

func (m *Oauth2ImplicitSecurity) GetAuthorizationUrl() string {
	if m != nil {
		return m.AuthorizationUrl
	}
	return ""
}

func (m *Oauth2ImplicitSecurity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Oauth2ImplicitSecurity) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Oauth2PasswordSecurity struct {
	Type                 string        `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
	Flow                 string        `protobuf:"bytes,2,opt,name=flow,proto3" json:"flow,omitempty"`
	Scopes               *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes,proto3" json:"scopes,omitempty"`
	TokenUrl             string        `protobuf:"bytes,4,opt,name=token_url,json=tokenUrl,proto3" json:"token_url,omitempty"`
	Description          string        `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"`
	VendorExtension      []*NamedAny   `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *Oauth2PasswordSecurity) Reset()         { *m = Oauth2PasswordSecurity{} }
func (m *Oauth2PasswordSecurity) String() string { return proto.CompactTextString(m) }
func (*Oauth2PasswordSecurity) ProtoMessage()    {}
func (*Oauth2PasswordSecurity) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{34}
}

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

var xxx_messageInfo_Oauth2PasswordSecurity proto.InternalMessageInfo

func (m *Oauth2PasswordSecurity) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *Oauth2PasswordSecurity) GetFlow() string {
	if m != nil {
		return m.Flow
	}
	return ""
}

func (m *Oauth2PasswordSecurity) GetScopes() *Oauth2Scopes {
	if m != nil {
		return m.Scopes
	}
	return nil
}

func (m *Oauth2PasswordSecurity) GetTokenUrl() string {
	if m != nil {
		return m.TokenUrl
	}
	return ""
}

func (m *Oauth2PasswordSecurity) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Oauth2PasswordSecurity) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Oauth2Scopes struct {
	AdditionalProperties []*NamedString `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *Oauth2Scopes) Reset()         { *m = Oauth2Scopes{} }
func (m *Oauth2Scopes) String() string { return proto.CompactTextString(m) }
func (*Oauth2Scopes) ProtoMessage()    {}
func (*Oauth2Scopes) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{35}
}

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

var xxx_messageInfo_Oauth2Scopes proto.InternalMessageInfo

func (m *Oauth2Scopes) GetAdditionalProperties() []*NamedString {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type Operation struct {
	Tags []string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty"`
	// A brief summary of the operation.
	Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"`
	// A longer description of the operation, GitHub Flavored Markdown is allowed.
	Description  string        `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	ExternalDocs *ExternalDocs `protobuf:"bytes,4,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"`
	// A unique identifier of the operation.
	OperationId string `protobuf:"bytes,5,opt,name=operation_id,json=operationId,proto3" json:"operation_id,omitempty"`
	// A list of MIME types the API can produce.
	Produces []string `protobuf:"bytes,6,rep,name=produces,proto3" json:"produces,omitempty"`
	// A list of MIME types the API can consume.
	Consumes []string `protobuf:"bytes,7,rep,name=consumes,proto3" json:"consumes,omitempty"`
	// The parameters needed to send a valid API call.
	Parameters []*ParametersItem `protobuf:"bytes,8,rep,name=parameters,proto3" json:"parameters,omitempty"`
	Responses  *Responses        `protobuf:"bytes,9,opt,name=responses,proto3" json:"responses,omitempty"`
	// The transfer protocol of the API.
	Schemes              []string               `protobuf:"bytes,10,rep,name=schemes,proto3" json:"schemes,omitempty"`
	Deprecated           bool                   `protobuf:"varint,11,opt,name=deprecated,proto3" json:"deprecated,omitempty"`
	Security             []*SecurityRequirement `protobuf:"bytes,12,rep,name=security,proto3" json:"security,omitempty"`
	VendorExtension      []*NamedAny            `protobuf:"bytes,13,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *Operation) Reset()         { *m = Operation{} }
func (m *Operation) String() string { return proto.CompactTextString(m) }
func (*Operation) ProtoMessage()    {}
func (*Operation) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{36}
}

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

var xxx_messageInfo_Operation proto.InternalMessageInfo

func (m *Operation) GetTags() []string {
	if m != nil {
		return m.Tags
	}
	return nil
}

func (m *Operation) GetSummary() string {
	if m != nil {
		return m.Summary
	}
	return ""
}

func (m *Operation) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Operation) GetExternalDocs() *ExternalDocs {
	if m != nil {
		return m.ExternalDocs
	}
	return nil
}

func (m *Operation) GetOperationId() string {
	if m != nil {
		return m.OperationId
	}
	return ""
}

func (m *Operation) GetProduces() []string {
	if m != nil {
		return m.Produces
	}
	return nil
}

func (m *Operation) GetConsumes() []string {
	if m != nil {
		return m.Consumes
	}
	return nil
}

func (m *Operation) GetParameters() []*ParametersItem {
	if m != nil {
		return m.Parameters
	}
	return nil
}

func (m *Operation) GetResponses() *Responses {
	if m != nil {
		return m.Responses
	}
	return nil
}

func (m *Operation) GetSchemes() []string {
	if m != nil {
		return m.Schemes
	}
	return nil
}

func (m *Operation) GetDeprecated() bool {
	if m != nil {
		return m.Deprecated
	}
	return false
}

func (m *Operation) GetSecurity() []*SecurityRequirement {
	if m != nil {
		return m.Security
	}
	return nil
}

func (m *Operation) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Parameter struct {
	// Types that are valid to be assigned to Oneof:
	//	*Parameter_BodyParameter
	//	*Parameter_NonBodyParameter
	Oneof                isParameter_Oneof `protobuf_oneof:"oneof"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *Parameter) Reset()         { *m = Parameter{} }
func (m *Parameter) String() string { return proto.CompactTextString(m) }
func (*Parameter) ProtoMessage()    {}
func (*Parameter) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{37}
}

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

var xxx_messageInfo_Parameter proto.InternalMessageInfo

type isParameter_Oneof interface {
	isParameter_Oneof()
}

type Parameter_BodyParameter struct {
	BodyParameter *BodyParameter `protobuf:"bytes,1,opt,name=body_parameter,json=bodyParameter,proto3,oneof"`
}

type Parameter_NonBodyParameter struct {
	NonBodyParameter *NonBodyParameter `protobuf:"bytes,2,opt,name=non_body_parameter,json=nonBodyParameter,proto3,oneof"`
}

func (*Parameter_BodyParameter) isParameter_Oneof() {}

func (*Parameter_NonBodyParameter) isParameter_Oneof() {}

func (m *Parameter) GetOneof() isParameter_Oneof {
	if m != nil {
		return m.Oneof
	}
	return nil
}

func (m *Parameter) GetBodyParameter() *BodyParameter {
	if x, ok := m.GetOneof().(*Parameter_BodyParameter); ok {
		return x.BodyParameter
	}
	return nil
}

func (m *Parameter) GetNonBodyParameter() *NonBodyParameter {
	if x, ok := m.GetOneof().(*Parameter_NonBodyParameter); ok {
		return x.NonBodyParameter
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Parameter) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Parameter_BodyParameter)(nil),
		(*Parameter_NonBodyParameter)(nil),
	}
}

// One or more JSON representations for parameters
type ParameterDefinitions struct {
	AdditionalProperties []*NamedParameter `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *ParameterDefinitions) Reset()         { *m = ParameterDefinitions{} }
func (m *ParameterDefinitions) String() string { return proto.CompactTextString(m) }
func (*ParameterDefinitions) ProtoMessage()    {}
func (*ParameterDefinitions) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{38}
}

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

var xxx_messageInfo_ParameterDefinitions proto.InternalMessageInfo

func (m *ParameterDefinitions) GetAdditionalProperties() []*NamedParameter {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type ParametersItem struct {
	// Types that are valid to be assigned to Oneof:
	//	*ParametersItem_Parameter
	//	*ParametersItem_JsonReference
	Oneof                isParametersItem_Oneof `protobuf_oneof:"oneof"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *ParametersItem) Reset()         { *m = ParametersItem{} }
func (m *ParametersItem) String() string { return proto.CompactTextString(m) }
func (*ParametersItem) ProtoMessage()    {}
func (*ParametersItem) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{39}
}

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

var xxx_messageInfo_ParametersItem proto.InternalMessageInfo

type isParametersItem_Oneof interface {
	isParametersItem_Oneof()
}

type ParametersItem_Parameter struct {
	Parameter *Parameter `protobuf:"bytes,1,opt,name=parameter,proto3,oneof"`
}

type ParametersItem_JsonReference struct {
	JsonReference *JsonReference `protobuf:"bytes,2,opt,name=json_reference,json=jsonReference,proto3,oneof"`
}

func (*ParametersItem_Parameter) isParametersItem_Oneof() {}

func (*ParametersItem_JsonReference) isParametersItem_Oneof() {}

func (m *ParametersItem) GetOneof() isParametersItem_Oneof {
	if m != nil {
		return m.Oneof
	}
	return nil
}

func (m *ParametersItem) GetParameter() *Parameter {
	if x, ok := m.GetOneof().(*ParametersItem_Parameter); ok {
		return x.Parameter
	}
	return nil
}

func (m *ParametersItem) GetJsonReference() *JsonReference {
	if x, ok := m.GetOneof().(*ParametersItem_JsonReference); ok {
		return x.JsonReference
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ParametersItem) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ParametersItem_Parameter)(nil),
		(*ParametersItem_JsonReference)(nil),
	}
}

type PathItem struct {
	XRef    string     `protobuf:"bytes,1,opt,name=_ref,json=Ref,proto3" json:"_ref,omitempty"`
	Get     *Operation `protobuf:"bytes,2,opt,name=get,proto3" json:"get,omitempty"`
	Put     *Operation `protobuf:"bytes,3,opt,name=put,proto3" json:"put,omitempty"`
	Post    *Operation `protobuf:"bytes,4,opt,name=post,proto3" json:"post,omitempty"`
	Delete  *Operation `protobuf:"bytes,5,opt,name=delete,proto3" json:"delete,omitempty"`
	Options *Operation `protobuf:"bytes,6,opt,name=options,proto3" json:"options,omitempty"`
	Head    *Operation `protobuf:"bytes,7,opt,name=head,proto3" json:"head,omitempty"`
	Patch   *Operation `protobuf:"bytes,8,opt,name=patch,proto3" json:"patch,omitempty"`
	// The parameters needed to send a valid API call.
	Parameters           []*ParametersItem `protobuf:"bytes,9,rep,name=parameters,proto3" json:"parameters,omitempty"`
	VendorExtension      []*NamedAny       `protobuf:"bytes,10,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *PathItem) Reset()         { *m = PathItem{} }
func (m *PathItem) String() string { return proto.CompactTextString(m) }
func (*PathItem) ProtoMessage()    {}
func (*PathItem) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{40}
}

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

var xxx_messageInfo_PathItem proto.InternalMessageInfo

func (m *PathItem) GetXRef() string {
	if m != nil {
		return m.XRef
	}
	return ""
}

func (m *PathItem) GetGet() *Operation {
	if m != nil {
		return m.Get
	}
	return nil
}

func (m *PathItem) GetPut() *Operation {
	if m != nil {
		return m.Put
	}
	return nil
}

func (m *PathItem) GetPost() *Operation {
	if m != nil {
		return m.Post
	}
	return nil
}

func (m *PathItem) GetDelete() *Operation {
	if m != nil {
		return m.Delete
	}
	return nil
}

func (m *PathItem) GetOptions() *Operation {
	if m != nil {
		return m.Options
	}
	return nil
}

func (m *PathItem) GetHead() *Operation {
	if m != nil {
		return m.Head
	}
	return nil
}

func (m *PathItem) GetPatch() *Operation {
	if m != nil {
		return m.Patch
	}
	return nil
}

func (m *PathItem) GetParameters() []*ParametersItem {
	if m != nil {
		return m.Parameters
	}
	return nil
}

func (m *PathItem) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type PathParameterSubSchema struct {
	// Determines whether or not this parameter is required or optional.
	Required bool `protobuf:"varint,1,opt,name=required,proto3" json:"required,omitempty"`
	// Determines the location of the parameter.
	In string `protobuf:"bytes,2,opt,name=in,proto3" json:"in,omitempty"`
	// A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// The name of the parameter.
	Name                 string           `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
	Type                 string           `protobuf:"bytes,5,opt,name=type,proto3" json:"type,omitempty"`
	Format               string           `protobuf:"bytes,6,opt,name=format,proto3" json:"format,omitempty"`
	Items                *PrimitivesItems `protobuf:"bytes,7,opt,name=items,proto3" json:"items,omitempty"`
	CollectionFormat     string           `protobuf:"bytes,8,opt,name=collection_format,json=collectionFormat,proto3" json:"collection_format,omitempty"`
	Default              *Any             `protobuf:"bytes,9,opt,name=default,proto3" json:"default,omitempty"`
	Maximum              float64          `protobuf:"fixed64,10,opt,name=maximum,proto3" json:"maximum,omitempty"`
	ExclusiveMaximum     bool             `protobuf:"varint,11,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"`
	Minimum              float64          `protobuf:"fixed64,12,opt,name=minimum,proto3" json:"minimum,omitempty"`
	ExclusiveMinimum     bool             `protobuf:"varint,13,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"`
	MaxLength            int64            `protobuf:"varint,14,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"`
	MinLength            int64            `protobuf:"varint,15,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"`
	Pattern              string           `protobuf:"bytes,16,opt,name=pattern,proto3" json:"pattern,omitempty"`
	MaxItems             int64            `protobuf:"varint,17,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"`
	MinItems             int64            `protobuf:"varint,18,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"`
	UniqueItems          bool             `protobuf:"varint,19,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"`
	Enum                 []*Any           `protobuf:"bytes,20,rep,name=enum,proto3" json:"enum,omitempty"`
	MultipleOf           float64          `protobuf:"fixed64,21,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"`
	VendorExtension      []*NamedAny      `protobuf:"bytes,22,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *PathParameterSubSchema) Reset()         { *m = PathParameterSubSchema{} }
func (m *PathParameterSubSchema) String() string { return proto.CompactTextString(m) }
func (*PathParameterSubSchema) ProtoMessage()    {}
func (*PathParameterSubSchema) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{41}
}

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

var xxx_messageInfo_PathParameterSubSchema proto.InternalMessageInfo

func (m *PathParameterSubSchema) GetRequired() bool {
	if m != nil {
		return m.Required
	}
	return false
}

func (m *PathParameterSubSchema) GetIn() string {
	if m != nil {
		return m.In
	}
	return ""
}

func (m *PathParameterSubSchema) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *PathParameterSubSchema) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *PathParameterSubSchema) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *PathParameterSubSchema) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *PathParameterSubSchema) GetItems() *PrimitivesItems {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *PathParameterSubSchema) GetCollectionFormat() string {
	if m != nil {
		return m.CollectionFormat
	}
	return ""
}

func (m *PathParameterSubSchema) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *PathParameterSubSchema) GetMaximum() float64 {
	if m != nil {
		return m.Maximum
	}
	return 0
}

func (m *PathParameterSubSchema) GetExclusiveMaximum() bool {
	if m != nil {
		return m.ExclusiveMaximum
	}
	return false
}

func (m *PathParameterSubSchema) GetMinimum() float64 {
	if m != nil {
		return m.Minimum
	}
	return 0
}

func (m *PathParameterSubSchema) GetExclusiveMinimum() bool {
	if m != nil {
		return m.ExclusiveMinimum
	}
	return false
}

func (m *PathParameterSubSchema) GetMaxLength() int64 {
	if m != nil {
		return m.MaxLength
	}
	return 0
}

func (m *PathParameterSubSchema) GetMinLength() int64 {
	if m != nil {
		return m.MinLength
	}
	return 0
}

func (m *PathParameterSubSchema) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *PathParameterSubSchema) GetMaxItems() int64 {
	if m != nil {
		return m.MaxItems
	}
	return 0
}

func (m *PathParameterSubSchema) GetMinItems() int64 {
	if m != nil {
		return m.MinItems
	}
	return 0
}

func (m *PathParameterSubSchema) GetUniqueItems() bool {
	if m != nil {
		return m.UniqueItems
	}
	return false
}

func (m *PathParameterSubSchema) GetEnum() []*Any {
	if m != nil {
		return m.Enum
	}
	return nil
}

func (m *PathParameterSubSchema) GetMultipleOf() float64 {
	if m != nil {
		return m.MultipleOf
	}
	return 0
}

func (m *PathParameterSubSchema) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

// Relative paths to the individual endpoints. They must be relative to the 'basePath'.
type Paths struct {
	VendorExtension      []*NamedAny      `protobuf:"bytes,1,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	Path                 []*NamedPathItem `protobuf:"bytes,2,rep,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *Paths) Reset()         { *m = Paths{} }
func (m *Paths) String() string { return proto.CompactTextString(m) }
func (*Paths) ProtoMessage()    {}
func (*Paths) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{42}
}

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

var xxx_messageInfo_Paths proto.InternalMessageInfo

func (m *Paths) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

func (m *Paths) GetPath() []*NamedPathItem {
	if m != nil {
		return m.Path
	}
	return nil
}

type PrimitivesItems struct {
	Type                 string           `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
	Format               string           `protobuf:"bytes,2,opt,name=format,proto3" json:"format,omitempty"`
	Items                *PrimitivesItems `protobuf:"bytes,3,opt,name=items,proto3" json:"items,omitempty"`
	CollectionFormat     string           `protobuf:"bytes,4,opt,name=collection_format,json=collectionFormat,proto3" json:"collection_format,omitempty"`
	Default              *Any             `protobuf:"bytes,5,opt,name=default,proto3" json:"default,omitempty"`
	Maximum              float64          `protobuf:"fixed64,6,opt,name=maximum,proto3" json:"maximum,omitempty"`
	ExclusiveMaximum     bool             `protobuf:"varint,7,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"`
	Minimum              float64          `protobuf:"fixed64,8,opt,name=minimum,proto3" json:"minimum,omitempty"`
	ExclusiveMinimum     bool             `protobuf:"varint,9,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"`
	MaxLength            int64            `protobuf:"varint,10,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"`
	MinLength            int64            `protobuf:"varint,11,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"`
	Pattern              string           `protobuf:"bytes,12,opt,name=pattern,proto3" json:"pattern,omitempty"`
	MaxItems             int64            `protobuf:"varint,13,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"`
	MinItems             int64            `protobuf:"varint,14,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"`
	UniqueItems          bool             `protobuf:"varint,15,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"`
	Enum                 []*Any           `protobuf:"bytes,16,rep,name=enum,proto3" json:"enum,omitempty"`
	MultipleOf           float64          `protobuf:"fixed64,17,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"`
	VendorExtension      []*NamedAny      `protobuf:"bytes,18,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *PrimitivesItems) Reset()         { *m = PrimitivesItems{} }
func (m *PrimitivesItems) String() string { return proto.CompactTextString(m) }
func (*PrimitivesItems) ProtoMessage()    {}
func (*PrimitivesItems) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{43}
}

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

var xxx_messageInfo_PrimitivesItems proto.InternalMessageInfo

func (m *PrimitivesItems) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *PrimitivesItems) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *PrimitivesItems) GetItems() *PrimitivesItems {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *PrimitivesItems) GetCollectionFormat() string {
	if m != nil {
		return m.CollectionFormat
	}
	return ""
}

func (m *PrimitivesItems) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *PrimitivesItems) GetMaximum() float64 {
	if m != nil {
		return m.Maximum
	}
	return 0
}

func (m *PrimitivesItems) GetExclusiveMaximum() bool {
	if m != nil {
		return m.ExclusiveMaximum
	}
	return false
}

func (m *PrimitivesItems) GetMinimum() float64 {
	if m != nil {
		return m.Minimum
	}
	return 0
}

func (m *PrimitivesItems) GetExclusiveMinimum() bool {
	if m != nil {
		return m.ExclusiveMinimum
	}
	return false
}

func (m *PrimitivesItems) GetMaxLength() int64 {
	if m != nil {
		return m.MaxLength
	}
	return 0
}

func (m *PrimitivesItems) GetMinLength() int64 {
	if m != nil {
		return m.MinLength
	}
	return 0
}

func (m *PrimitivesItems) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *PrimitivesItems) GetMaxItems() int64 {
	if m != nil {
		return m.MaxItems
	}
	return 0
}

func (m *PrimitivesItems) GetMinItems() int64 {
	if m != nil {
		return m.MinItems
	}
	return 0
}

func (m *PrimitivesItems) GetUniqueItems() bool {
	if m != nil {
		return m.UniqueItems
	}
	return false
}

func (m *PrimitivesItems) GetEnum() []*Any {
	if m != nil {
		return m.Enum
	}
	return nil
}

func (m *PrimitivesItems) GetMultipleOf() float64 {
	if m != nil {
		return m.MultipleOf
	}
	return 0
}

func (m *PrimitivesItems) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Properties struct {
	AdditionalProperties []*NamedSchema `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *Properties) Reset()         { *m = Properties{} }
func (m *Properties) String() string { return proto.CompactTextString(m) }
func (*Properties) ProtoMessage()    {}
func (*Properties) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{44}
}

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

var xxx_messageInfo_Properties proto.InternalMessageInfo

func (m *Properties) GetAdditionalProperties() []*NamedSchema {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type QueryParameterSubSchema struct {
	// Determines whether or not this parameter is required or optional.
	Required bool `protobuf:"varint,1,opt,name=required,proto3" json:"required,omitempty"`
	// Determines the location of the parameter.
	In string `protobuf:"bytes,2,opt,name=in,proto3" json:"in,omitempty"`
	// A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed.
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// The name of the parameter.
	Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
	// allows sending a parameter by name only or with an empty value.
	AllowEmptyValue      bool             `protobuf:"varint,5,opt,name=allow_empty_value,json=allowEmptyValue,proto3" json:"allow_empty_value,omitempty"`
	Type                 string           `protobuf:"bytes,6,opt,name=type,proto3" json:"type,omitempty"`
	Format               string           `protobuf:"bytes,7,opt,name=format,proto3" json:"format,omitempty"`
	Items                *PrimitivesItems `protobuf:"bytes,8,opt,name=items,proto3" json:"items,omitempty"`
	CollectionFormat     string           `protobuf:"bytes,9,opt,name=collection_format,json=collectionFormat,proto3" json:"collection_format,omitempty"`
	Default              *Any             `protobuf:"bytes,10,opt,name=default,proto3" json:"default,omitempty"`
	Maximum              float64          `protobuf:"fixed64,11,opt,name=maximum,proto3" json:"maximum,omitempty"`
	ExclusiveMaximum     bool             `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"`
	Minimum              float64          `protobuf:"fixed64,13,opt,name=minimum,proto3" json:"minimum,omitempty"`
	ExclusiveMinimum     bool             `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"`
	MaxLength            int64            `protobuf:"varint,15,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"`
	MinLength            int64            `protobuf:"varint,16,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"`
	Pattern              string           `protobuf:"bytes,17,opt,name=pattern,proto3" json:"pattern,omitempty"`
	MaxItems             int64            `protobuf:"varint,18,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"`
	MinItems             int64            `protobuf:"varint,19,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"`
	UniqueItems          bool             `protobuf:"varint,20,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"`
	Enum                 []*Any           `protobuf:"bytes,21,rep,name=enum,proto3" json:"enum,omitempty"`
	MultipleOf           float64          `protobuf:"fixed64,22,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"`
	VendorExtension      []*NamedAny      `protobuf:"bytes,23,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *QueryParameterSubSchema) Reset()         { *m = QueryParameterSubSchema{} }
func (m *QueryParameterSubSchema) String() string { return proto.CompactTextString(m) }
func (*QueryParameterSubSchema) ProtoMessage()    {}
func (*QueryParameterSubSchema) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{45}
}

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

var xxx_messageInfo_QueryParameterSubSchema proto.InternalMessageInfo

func (m *QueryParameterSubSchema) GetRequired() bool {
	if m != nil {
		return m.Required
	}
	return false
}

func (m *QueryParameterSubSchema) GetIn() string {
	if m != nil {
		return m.In
	}
	return ""
}

func (m *QueryParameterSubSchema) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *QueryParameterSubSchema) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *QueryParameterSubSchema) GetAllowEmptyValue() bool {
	if m != nil {
		return m.AllowEmptyValue
	}
	return false
}

func (m *QueryParameterSubSchema) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *QueryParameterSubSchema) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *QueryParameterSubSchema) GetItems() *PrimitivesItems {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *QueryParameterSubSchema) GetCollectionFormat() string {
	if m != nil {
		return m.CollectionFormat
	}
	return ""
}

func (m *QueryParameterSubSchema) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *QueryParameterSubSchema) GetMaximum() float64 {
	if m != nil {
		return m.Maximum
	}
	return 0
}

func (m *QueryParameterSubSchema) GetExclusiveMaximum() bool {
	if m != nil {
		return m.ExclusiveMaximum
	}
	return false
}

func (m *QueryParameterSubSchema) GetMinimum() float64 {
	if m != nil {
		return m.Minimum
	}
	return 0
}

func (m *QueryParameterSubSchema) GetExclusiveMinimum() bool {
	if m != nil {
		return m.ExclusiveMinimum
	}
	return false
}

func (m *QueryParameterSubSchema) GetMaxLength() int64 {
	if m != nil {
		return m.MaxLength
	}
	return 0
}

func (m *QueryParameterSubSchema) GetMinLength() int64 {
	if m != nil {
		return m.MinLength
	}
	return 0
}

func (m *QueryParameterSubSchema) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *QueryParameterSubSchema) GetMaxItems() int64 {
	if m != nil {
		return m.MaxItems
	}
	return 0
}

func (m *QueryParameterSubSchema) GetMinItems() int64 {
	if m != nil {
		return m.MinItems
	}
	return 0
}

func (m *QueryParameterSubSchema) GetUniqueItems() bool {
	if m != nil {
		return m.UniqueItems
	}
	return false
}

func (m *QueryParameterSubSchema) GetEnum() []*Any {
	if m != nil {
		return m.Enum
	}
	return nil
}

func (m *QueryParameterSubSchema) GetMultipleOf() float64 {
	if m != nil {
		return m.MultipleOf
	}
	return 0
}

func (m *QueryParameterSubSchema) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type Response struct {
	Description          string      `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
	Schema               *SchemaItem `protobuf:"bytes,2,opt,name=schema,proto3" json:"schema,omitempty"`
	Headers              *Headers    `protobuf:"bytes,3,opt,name=headers,proto3" json:"headers,omitempty"`
	Examples             *Examples   `protobuf:"bytes,4,opt,name=examples,proto3" json:"examples,omitempty"`
	VendorExtension      []*NamedAny `protobuf:"bytes,5,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *Response) Reset()         { *m = Response{} }
func (m *Response) String() string { return proto.CompactTextString(m) }
func (*Response) ProtoMessage()    {}
func (*Response) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{46}
}

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

var xxx_messageInfo_Response proto.InternalMessageInfo

func (m *Response) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Response) GetSchema() *SchemaItem {
	if m != nil {
		return m.Schema
	}
	return nil
}

func (m *Response) GetHeaders() *Headers {
	if m != nil {
		return m.Headers
	}
	return nil
}

func (m *Response) GetExamples() *Examples {
	if m != nil {
		return m.Examples
	}
	return nil
}

func (m *Response) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

// One or more JSON representations for parameters
type ResponseDefinitions struct {
	AdditionalProperties []*NamedResponse `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *ResponseDefinitions) Reset()         { *m = ResponseDefinitions{} }
func (m *ResponseDefinitions) String() string { return proto.CompactTextString(m) }
func (*ResponseDefinitions) ProtoMessage()    {}
func (*ResponseDefinitions) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{47}
}

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

var xxx_messageInfo_ResponseDefinitions proto.InternalMessageInfo

func (m *ResponseDefinitions) GetAdditionalProperties() []*NamedResponse {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type ResponseValue struct {
	// Types that are valid to be assigned to Oneof:
	//	*ResponseValue_Response
	//	*ResponseValue_JsonReference
	Oneof                isResponseValue_Oneof `protobuf_oneof:"oneof"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *ResponseValue) Reset()         { *m = ResponseValue{} }
func (m *ResponseValue) String() string { return proto.CompactTextString(m) }
func (*ResponseValue) ProtoMessage()    {}
func (*ResponseValue) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{48}
}

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

var xxx_messageInfo_ResponseValue proto.InternalMessageInfo

type isResponseValue_Oneof interface {
	isResponseValue_Oneof()
}

type ResponseValue_Response struct {
	Response *Response `protobuf:"bytes,1,opt,name=response,proto3,oneof"`
}

type ResponseValue_JsonReference struct {
	JsonReference *JsonReference `protobuf:"bytes,2,opt,name=json_reference,json=jsonReference,proto3,oneof"`
}

func (*ResponseValue_Response) isResponseValue_Oneof() {}

func (*ResponseValue_JsonReference) isResponseValue_Oneof() {}

func (m *ResponseValue) GetOneof() isResponseValue_Oneof {
	if m != nil {
		return m.Oneof
	}
	return nil
}

func (m *ResponseValue) GetResponse() *Response {
	if x, ok := m.GetOneof().(*ResponseValue_Response); ok {
		return x.Response
	}
	return nil
}

func (m *ResponseValue) GetJsonReference() *JsonReference {
	if x, ok := m.GetOneof().(*ResponseValue_JsonReference); ok {
		return x.JsonReference
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ResponseValue) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ResponseValue_Response)(nil),
		(*ResponseValue_JsonReference)(nil),
	}
}

// Response objects names can either be any valid HTTP status code or 'default'.
type Responses struct {
	ResponseCode         []*NamedResponseValue `protobuf:"bytes,1,rep,name=response_code,json=responseCode,proto3" json:"response_code,omitempty"`
	VendorExtension      []*NamedAny           `protobuf:"bytes,2,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *Responses) Reset()         { *m = Responses{} }
func (m *Responses) String() string { return proto.CompactTextString(m) }
func (*Responses) ProtoMessage()    {}
func (*Responses) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{49}
}

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

var xxx_messageInfo_Responses proto.InternalMessageInfo

func (m *Responses) GetResponseCode() []*NamedResponseValue {
	if m != nil {
		return m.ResponseCode
	}
	return nil
}

func (m *Responses) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

// A deterministic version of a JSON Schema object.
type Schema struct {
	XRef                 string                    `protobuf:"bytes,1,opt,name=_ref,json=Ref,proto3" json:"_ref,omitempty"`
	Format               string                    `protobuf:"bytes,2,opt,name=format,proto3" json:"format,omitempty"`
	Title                string                    `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"`
	Description          string                    `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
	Default              *Any                      `protobuf:"bytes,5,opt,name=default,proto3" json:"default,omitempty"`
	MultipleOf           float64                   `protobuf:"fixed64,6,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"`
	Maximum              float64                   `protobuf:"fixed64,7,opt,name=maximum,proto3" json:"maximum,omitempty"`
	ExclusiveMaximum     bool                      `protobuf:"varint,8,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"`
	Minimum              float64                   `protobuf:"fixed64,9,opt,name=minimum,proto3" json:"minimum,omitempty"`
	ExclusiveMinimum     bool                      `protobuf:"varint,10,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"`
	MaxLength            int64                     `protobuf:"varint,11,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"`
	MinLength            int64                     `protobuf:"varint,12,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"`
	Pattern              string                    `protobuf:"bytes,13,opt,name=pattern,proto3" json:"pattern,omitempty"`
	MaxItems             int64                     `protobuf:"varint,14,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"`
	MinItems             int64                     `protobuf:"varint,15,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"`
	UniqueItems          bool                      `protobuf:"varint,16,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"`
	MaxProperties        int64                     `protobuf:"varint,17,opt,name=max_properties,json=maxProperties,proto3" json:"max_properties,omitempty"`
	MinProperties        int64                     `protobuf:"varint,18,opt,name=min_properties,json=minProperties,proto3" json:"min_properties,omitempty"`
	Required             []string                  `protobuf:"bytes,19,rep,name=required,proto3" json:"required,omitempty"`
	Enum                 []*Any                    `protobuf:"bytes,20,rep,name=enum,proto3" json:"enum,omitempty"`
	AdditionalProperties *AdditionalPropertiesItem `protobuf:"bytes,21,opt,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"`
	Type                 *TypeItem                 `protobuf:"bytes,22,opt,name=type,proto3" json:"type,omitempty"`
	Items                *ItemsItem                `protobuf:"bytes,23,opt,name=items,proto3" json:"items,omitempty"`
	AllOf                []*Schema                 `protobuf:"bytes,24,rep,name=all_of,json=allOf,proto3" json:"all_of,omitempty"`
	Properties           *Properties               `protobuf:"bytes,25,opt,name=properties,proto3" json:"properties,omitempty"`
	Discriminator        string                    `protobuf:"bytes,26,opt,name=discriminator,proto3" json:"discriminator,omitempty"`
	ReadOnly             bool                      `protobuf:"varint,27,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"`
	Xml                  *Xml                      `protobuf:"bytes,28,opt,name=xml,proto3" json:"xml,omitempty"`
	ExternalDocs         *ExternalDocs             `protobuf:"bytes,29,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"`
	Example              *Any                      `protobuf:"bytes,30,opt,name=example,proto3" json:"example,omitempty"`
	VendorExtension      []*NamedAny               `protobuf:"bytes,31,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *Schema) Reset()         { *m = Schema{} }
func (m *Schema) String() string { return proto.CompactTextString(m) }
func (*Schema) ProtoMessage()    {}
func (*Schema) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{50}
}

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

var xxx_messageInfo_Schema proto.InternalMessageInfo

func (m *Schema) GetXRef() string {
	if m != nil {
		return m.XRef
	}
	return ""
}

func (m *Schema) GetFormat() string {
	if m != nil {
		return m.Format
	}
	return ""
}

func (m *Schema) GetTitle() string {
	if m != nil {
		return m.Title
	}
	return ""
}

func (m *Schema) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Schema) GetDefault() *Any {
	if m != nil {
		return m.Default
	}
	return nil
}

func (m *Schema) GetMultipleOf() float64 {
	if m != nil {
		return m.MultipleOf
	}
	return 0
}

func (m *Schema) GetMaximum() float64 {
	if m != nil {
		return m.Maximum
	}
	return 0
}

func (m *Schema) GetExclusiveMaximum() bool {
	if m != nil {
		return m.ExclusiveMaximum
	}
	return false
}

func (m *Schema) GetMinimum() float64 {
	if m != nil {
		return m.Minimum
	}
	return 0
}

func (m *Schema) GetExclusiveMinimum() bool {
	if m != nil {
		return m.ExclusiveMinimum
	}
	return false
}

func (m *Schema) GetMaxLength() int64 {
	if m != nil {
		return m.MaxLength
	}
	return 0
}

func (m *Schema) GetMinLength() int64 {
	if m != nil {
		return m.MinLength
	}
	return 0
}

func (m *Schema) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *Schema) GetMaxItems() int64 {
	if m != nil {
		return m.MaxItems
	}
	return 0
}

func (m *Schema) GetMinItems() int64 {
	if m != nil {
		return m.MinItems
	}
	return 0
}

func (m *Schema) GetUniqueItems() bool {
	if m != nil {
		return m.UniqueItems
	}
	return false
}

func (m *Schema) GetMaxProperties() int64 {
	if m != nil {
		return m.MaxProperties
	}
	return 0
}

func (m *Schema) GetMinProperties() int64 {
	if m != nil {
		return m.MinProperties
	}
	return 0
}

func (m *Schema) GetRequired() []string {
	if m != nil {
		return m.Required
	}
	return nil
}

func (m *Schema) GetEnum() []*Any {
	if m != nil {
		return m.Enum
	}
	return nil
}

func (m *Schema) GetAdditionalProperties() *AdditionalPropertiesItem {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

func (m *Schema) GetType() *TypeItem {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *Schema) GetItems() *ItemsItem {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *Schema) GetAllOf() []*Schema {
	if m != nil {
		return m.AllOf
	}
	return nil
}

func (m *Schema) GetProperties() *Properties {
	if m != nil {
		return m.Properties
	}
	return nil
}

func (m *Schema) GetDiscriminator() string {
	if m != nil {
		return m.Discriminator
	}
	return ""
}

func (m *Schema) GetReadOnly() bool {
	if m != nil {
		return m.ReadOnly
	}
	return false
}

func (m *Schema) GetXml() *Xml {
	if m != nil {
		return m.Xml
	}
	return nil
}

func (m *Schema) GetExternalDocs() *ExternalDocs {
	if m != nil {
		return m.ExternalDocs
	}
	return nil
}

func (m *Schema) GetExample() *Any {
	if m != nil {
		return m.Example
	}
	return nil
}

func (m *Schema) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type SchemaItem struct {
	// Types that are valid to be assigned to Oneof:
	//	*SchemaItem_Schema
	//	*SchemaItem_FileSchema
	Oneof                isSchemaItem_Oneof `protobuf_oneof:"oneof"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *SchemaItem) Reset()         { *m = SchemaItem{} }
func (m *SchemaItem) String() string { return proto.CompactTextString(m) }
func (*SchemaItem) ProtoMessage()    {}
func (*SchemaItem) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{51}
}

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

var xxx_messageInfo_SchemaItem proto.InternalMessageInfo

type isSchemaItem_Oneof interface {
	isSchemaItem_Oneof()
}

type SchemaItem_Schema struct {
	Schema *Schema `protobuf:"bytes,1,opt,name=schema,proto3,oneof"`
}

type SchemaItem_FileSchema struct {
	FileSchema *FileSchema `protobuf:"bytes,2,opt,name=file_schema,json=fileSchema,proto3,oneof"`
}

func (*SchemaItem_Schema) isSchemaItem_Oneof() {}

func (*SchemaItem_FileSchema) isSchemaItem_Oneof() {}

func (m *SchemaItem) GetOneof() isSchemaItem_Oneof {
	if m != nil {
		return m.Oneof
	}
	return nil
}

func (m *SchemaItem) GetSchema() *Schema {
	if x, ok := m.GetOneof().(*SchemaItem_Schema); ok {
		return x.Schema
	}
	return nil
}

func (m *SchemaItem) GetFileSchema() *FileSchema {
	if x, ok := m.GetOneof().(*SchemaItem_FileSchema); ok {
		return x.FileSchema
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*SchemaItem) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*SchemaItem_Schema)(nil),
		(*SchemaItem_FileSchema)(nil),
	}
}

type SecurityDefinitions struct {
	AdditionalProperties []*NamedSecurityDefinitionsItem `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

func (m *SecurityDefinitions) Reset()         { *m = SecurityDefinitions{} }
func (m *SecurityDefinitions) String() string { return proto.CompactTextString(m) }
func (*SecurityDefinitions) ProtoMessage()    {}
func (*SecurityDefinitions) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{52}
}

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

var xxx_messageInfo_SecurityDefinitions proto.InternalMessageInfo

func (m *SecurityDefinitions) GetAdditionalProperties() []*NamedSecurityDefinitionsItem {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type SecurityDefinitionsItem struct {
	// Types that are valid to be assigned to Oneof:
	//	*SecurityDefinitionsItem_BasicAuthenticationSecurity
	//	*SecurityDefinitionsItem_ApiKeySecurity
	//	*SecurityDefinitionsItem_Oauth2ImplicitSecurity
	//	*SecurityDefinitionsItem_Oauth2PasswordSecurity
	//	*SecurityDefinitionsItem_Oauth2ApplicationSecurity
	//	*SecurityDefinitionsItem_Oauth2AccessCodeSecurity
	Oneof                isSecurityDefinitionsItem_Oneof `protobuf_oneof:"oneof"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

func (m *SecurityDefinitionsItem) Reset()         { *m = SecurityDefinitionsItem{} }
func (m *SecurityDefinitionsItem) String() string { return proto.CompactTextString(m) }
func (*SecurityDefinitionsItem) ProtoMessage()    {}
func (*SecurityDefinitionsItem) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{53}
}

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

var xxx_messageInfo_SecurityDefinitionsItem proto.InternalMessageInfo

type isSecurityDefinitionsItem_Oneof interface {
	isSecurityDefinitionsItem_Oneof()
}

type SecurityDefinitionsItem_BasicAuthenticationSecurity struct {
	BasicAuthenticationSecurity *BasicAuthenticationSecurity `protobuf:"bytes,1,opt,name=basic_authentication_security,json=basicAuthenticationSecurity,proto3,oneof"`
}

type SecurityDefinitionsItem_ApiKeySecurity struct {
	ApiKeySecurity *ApiKeySecurity `protobuf:"bytes,2,opt,name=api_key_security,json=apiKeySecurity,proto3,oneof"`
}

type SecurityDefinitionsItem_Oauth2ImplicitSecurity struct {
	Oauth2ImplicitSecurity *Oauth2ImplicitSecurity `protobuf:"bytes,3,opt,name=oauth2_implicit_security,json=oauth2ImplicitSecurity,proto3,oneof"`
}

type SecurityDefinitionsItem_Oauth2PasswordSecurity struct {
	Oauth2PasswordSecurity *Oauth2PasswordSecurity `protobuf:"bytes,4,opt,name=oauth2_password_security,json=oauth2PasswordSecurity,proto3,oneof"`
}

type SecurityDefinitionsItem_Oauth2ApplicationSecurity struct {
	Oauth2ApplicationSecurity *Oauth2ApplicationSecurity `protobuf:"bytes,5,opt,name=oauth2_application_security,json=oauth2ApplicationSecurity,proto3,oneof"`
}

type SecurityDefinitionsItem_Oauth2AccessCodeSecurity struct {
	Oauth2AccessCodeSecurity *Oauth2AccessCodeSecurity `protobuf:"bytes,6,opt,name=oauth2_access_code_security,json=oauth2AccessCodeSecurity,proto3,oneof"`
}

func (*SecurityDefinitionsItem_BasicAuthenticationSecurity) isSecurityDefinitionsItem_Oneof() {}

func (*SecurityDefinitionsItem_ApiKeySecurity) isSecurityDefinitionsItem_Oneof() {}

func (*SecurityDefinitionsItem_Oauth2ImplicitSecurity) isSecurityDefinitionsItem_Oneof() {}

func (*SecurityDefinitionsItem_Oauth2PasswordSecurity) isSecurityDefinitionsItem_Oneof() {}

func (*SecurityDefinitionsItem_Oauth2ApplicationSecurity) isSecurityDefinitionsItem_Oneof() {}

func (*SecurityDefinitionsItem_Oauth2AccessCodeSecurity) isSecurityDefinitionsItem_Oneof() {}

func (m *SecurityDefinitionsItem) GetOneof() isSecurityDefinitionsItem_Oneof {
	if m != nil {
		return m.Oneof
	}
	return nil
}

func (m *SecurityDefinitionsItem) GetBasicAuthenticationSecurity() *BasicAuthenticationSecurity {
	if x, ok := m.GetOneof().(*SecurityDefinitionsItem_BasicAuthenticationSecurity); ok {
		return x.BasicAuthenticationSecurity
	}
	return nil
}

func (m *SecurityDefinitionsItem) GetApiKeySecurity() *ApiKeySecurity {
	if x, ok := m.GetOneof().(*SecurityDefinitionsItem_ApiKeySecurity); ok {
		return x.ApiKeySecurity
	}
	return nil
}

func (m *SecurityDefinitionsItem) GetOauth2ImplicitSecurity() *Oauth2ImplicitSecurity {
	if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2ImplicitSecurity); ok {
		return x.Oauth2ImplicitSecurity
	}
	return nil
}

func (m *SecurityDefinitionsItem) GetOauth2PasswordSecurity() *Oauth2PasswordSecurity {
	if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2PasswordSecurity); ok {
		return x.Oauth2PasswordSecurity
	}
	return nil
}

func (m *SecurityDefinitionsItem) GetOauth2ApplicationSecurity() *Oauth2ApplicationSecurity {
	if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2ApplicationSecurity); ok {
		return x.Oauth2ApplicationSecurity
	}
	return nil
}

func (m *SecurityDefinitionsItem) GetOauth2AccessCodeSecurity() *Oauth2AccessCodeSecurity {
	if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2AccessCodeSecurity); ok {
		return x.Oauth2AccessCodeSecurity
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*SecurityDefinitionsItem) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*SecurityDefinitionsItem_BasicAuthenticationSecurity)(nil),
		(*SecurityDefinitionsItem_ApiKeySecurity)(nil),
		(*SecurityDefinitionsItem_Oauth2ImplicitSecurity)(nil),
		(*SecurityDefinitionsItem_Oauth2PasswordSecurity)(nil),
		(*SecurityDefinitionsItem_Oauth2ApplicationSecurity)(nil),
		(*SecurityDefinitionsItem_Oauth2AccessCodeSecurity)(nil),
	}
}

type SecurityRequirement struct {
	AdditionalProperties []*NamedStringArray `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *SecurityRequirement) Reset()         { *m = SecurityRequirement{} }
func (m *SecurityRequirement) String() string { return proto.CompactTextString(m) }
func (*SecurityRequirement) ProtoMessage()    {}
func (*SecurityRequirement) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{54}
}

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

var xxx_messageInfo_SecurityRequirement proto.InternalMessageInfo

func (m *SecurityRequirement) GetAdditionalProperties() []*NamedStringArray {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type StringArray struct {
	Value                []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *StringArray) Reset()         { *m = StringArray{} }
func (m *StringArray) String() string { return proto.CompactTextString(m) }
func (*StringArray) ProtoMessage()    {}
func (*StringArray) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{55}
}

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

var xxx_messageInfo_StringArray proto.InternalMessageInfo

func (m *StringArray) GetValue() []string {
	if m != nil {
		return m.Value
	}
	return nil
}

type Tag struct {
	Name                 string        `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Description          string        `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
	ExternalDocs         *ExternalDocs `protobuf:"bytes,3,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"`
	VendorExtension      []*NamedAny   `protobuf:"bytes,4,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *Tag) Reset()         { *m = Tag{} }
func (m *Tag) String() string { return proto.CompactTextString(m) }
func (*Tag) ProtoMessage()    {}
func (*Tag) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{56}
}

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

var xxx_messageInfo_Tag proto.InternalMessageInfo

func (m *Tag) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Tag) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Tag) GetExternalDocs() *ExternalDocs {
	if m != nil {
		return m.ExternalDocs
	}
	return nil
}

func (m *Tag) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

type TypeItem struct {
	Value                []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TypeItem) Reset()         { *m = TypeItem{} }
func (m *TypeItem) String() string { return proto.CompactTextString(m) }
func (*TypeItem) ProtoMessage()    {}
func (*TypeItem) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{57}
}

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

var xxx_messageInfo_TypeItem proto.InternalMessageInfo

func (m *TypeItem) GetValue() []string {
	if m != nil {
		return m.Value
	}
	return nil
}

// Any property starting with x- is valid.
type VendorExtension struct {
	AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *VendorExtension) Reset()         { *m = VendorExtension{} }
func (m *VendorExtension) String() string { return proto.CompactTextString(m) }
func (*VendorExtension) ProtoMessage()    {}
func (*VendorExtension) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{58}
}

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

var xxx_messageInfo_VendorExtension proto.InternalMessageInfo

func (m *VendorExtension) GetAdditionalProperties() []*NamedAny {
	if m != nil {
		return m.AdditionalProperties
	}
	return nil
}

type Xml struct {
	Name                 string      `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Namespace            string      `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"`
	Prefix               string      `protobuf:"bytes,3,opt,name=prefix,proto3" json:"prefix,omitempty"`
	Attribute            bool        `protobuf:"varint,4,opt,name=attribute,proto3" json:"attribute,omitempty"`
	Wrapped              bool        `protobuf:"varint,5,opt,name=wrapped,proto3" json:"wrapped,omitempty"`
	VendorExtension      []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension,proto3" json:"vendor_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *Xml) Reset()         { *m = Xml{} }
func (m *Xml) String() string { return proto.CompactTextString(m) }
func (*Xml) ProtoMessage()    {}
func (*Xml) Descriptor() ([]byte, []int) {
	return fileDescriptor_a43d10d209cd31c2, []int{59}
}

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

var xxx_messageInfo_Xml proto.InternalMessageInfo

func (m *Xml) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Xml) GetNamespace() string {
	if m != nil {
		return m.Namespace
	}
	return ""
}

func (m *Xml) GetPrefix() string {
	if m != nil {
		return m.Prefix
	}
	return ""
}

func (m *Xml) GetAttribute() bool {
	if m != nil {
		return m.Attribute
	}
	return false
}

func (m *Xml) GetWrapped() bool {
	if m != nil {
		return m.Wrapped
	}
	return false
}

func (m *Xml) GetVendorExtension() []*NamedAny {
	if m != nil {
		return m.VendorExtension
	}
	return nil
}

func init() {
	proto.RegisterType((*AdditionalPropertiesItem)(nil), "openapi.v2.AdditionalPropertiesItem")
	proto.RegisterType((*Any)(nil), "openapi.v2.Any")
	proto.RegisterType((*ApiKeySecurity)(nil), "openapi.v2.ApiKeySecurity")
	proto.RegisterType((*BasicAuthenticationSecurity)(nil), "openapi.v2.BasicAuthenticationSecurity")
	proto.RegisterType((*BodyParameter)(nil), "openapi.v2.BodyParameter")
	proto.RegisterType((*Contact)(nil), "openapi.v2.Contact")
	proto.RegisterType((*Default)(nil), "openapi.v2.Default")
	proto.RegisterType((*Definitions)(nil), "openapi.v2.Definitions")
	proto.RegisterType((*Document)(nil), "openapi.v2.Document")
	proto.RegisterType((*Examples)(nil), "openapi.v2.Examples")
	proto.RegisterType((*ExternalDocs)(nil), "openapi.v2.ExternalDocs")
	proto.RegisterType((*FileSchema)(nil), "openapi.v2.FileSchema")
	proto.RegisterType((*FormDataParameterSubSchema)(nil), "openapi.v2.FormDataParameterSubSchema")
	proto.RegisterType((*Header)(nil), "openapi.v2.Header")
	proto.RegisterType((*HeaderParameterSubSchema)(nil), "openapi.v2.HeaderParameterSubSchema")
	proto.RegisterType((*Headers)(nil), "openapi.v2.Headers")
	proto.RegisterType((*Info)(nil), "openapi.v2.Info")
	proto.RegisterType((*ItemsItem)(nil), "openapi.v2.ItemsItem")
	proto.RegisterType((*JsonReference)(nil), "openapi.v2.JsonReference")
	proto.RegisterType((*License)(nil), "openapi.v2.License")
	proto.RegisterType((*NamedAny)(nil), "openapi.v2.NamedAny")
	proto.RegisterType((*NamedHeader)(nil), "openapi.v2.NamedHeader")
	proto.RegisterType((*NamedParameter)(nil), "openapi.v2.NamedParameter")
	proto.RegisterType((*NamedPathItem)(nil), "openapi.v2.NamedPathItem")
	proto.RegisterType((*NamedResponse)(nil), "openapi.v2.NamedResponse")
	proto.RegisterType((*NamedResponseValue)(nil), "openapi.v2.NamedResponseValue")
	proto.RegisterType((*NamedSchema)(nil), "openapi.v2.NamedSchema")
	proto.RegisterType((*NamedSecurityDefinitionsItem)(nil), "openapi.v2.NamedSecurityDefinitionsItem")
	proto.RegisterType((*NamedString)(nil), "openapi.v2.NamedString")
	proto.RegisterType((*NamedStringArray)(nil), "openapi.v2.NamedStringArray")
	proto.RegisterType((*NonBodyParameter)(nil), "openapi.v2.NonBodyParameter")
	proto.RegisterType((*Oauth2AccessCodeSecurity)(nil), "openapi.v2.Oauth2AccessCodeSecurity")
	proto.RegisterType((*Oauth2ApplicationSecurity)(nil), "openapi.v2.Oauth2ApplicationSecurity")
	proto.RegisterType((*Oauth2ImplicitSecurity)(nil), "openapi.v2.Oauth2ImplicitSecurity")
	proto.RegisterType((*Oauth2PasswordSecurity)(nil), "openapi.v2.Oauth2PasswordSecurity")
	proto.RegisterType((*Oauth2Scopes)(nil), "openapi.v2.Oauth2Scopes")
	proto.RegisterType((*Operation)(nil), "openapi.v2.Operation")
	proto.RegisterType((*Parameter)(nil), "openapi.v2.Parameter")
	proto.RegisterType((*ParameterDefinitions)(nil), "openapi.v2.ParameterDefinitions")
	proto.RegisterType((*ParametersItem)(nil), "openapi.v2.ParametersItem")
	proto.RegisterType((*PathItem)(nil), "openapi.v2.PathItem")
	proto.RegisterType((*PathParameterSubSchema)(nil), "openapi.v2.PathParameterSubSchema")
	proto.RegisterType((*Paths)(nil), "openapi.v2.Paths")
	proto.RegisterType((*PrimitivesItems)(nil), "openapi.v2.PrimitivesItems")
	proto.RegisterType((*Properties)(nil), "openapi.v2.Properties")
	proto.RegisterType((*QueryParameterSubSchema)(nil), "openapi.v2.QueryParameterSubSchema")
	proto.RegisterType((*Response)(nil), "openapi.v2.Response")
	proto.RegisterType((*ResponseDefinitions)(nil), "openapi.v2.ResponseDefinitions")
	proto.RegisterType((*ResponseValue)(nil), "openapi.v2.ResponseValue")
	proto.RegisterType((*Responses)(nil), "openapi.v2.Responses")
	proto.RegisterType((*Schema)(nil), "openapi.v2.Schema")
	proto.RegisterType((*SchemaItem)(nil), "openapi.v2.SchemaItem")
	proto.RegisterType((*SecurityDefinitions)(nil), "openapi.v2.SecurityDefinitions")
	proto.RegisterType((*SecurityDefinitionsItem)(nil), "openapi.v2.SecurityDefinitionsItem")
	proto.RegisterType((*SecurityRequirement)(nil), "openapi.v2.SecurityRequirement")
	proto.RegisterType((*StringArray)(nil), "openapi.v2.StringArray")
	proto.RegisterType((*Tag)(nil), "openapi.v2.Tag")
	proto.RegisterType((*TypeItem)(nil), "openapi.v2.TypeItem")
	proto.RegisterType((*VendorExtension)(nil), "openapi.v2.VendorExtension")
	proto.RegisterType((*Xml)(nil), "openapi.v2.Xml")
}

func init() { proto.RegisterFile("openapiv2/OpenAPIv2.proto", fileDescriptor_a43d10d209cd31c2) }

var fileDescriptor_a43d10d209cd31c2 = []byte{
	// 3130 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0x4b, 0x73, 0x1c, 0x57,
	0xd5, 0xf3, 0x7e, 0x1c, 0x69, 0x46, 0xa3, 0x96, 0x2c, 0xb7, 0x24, 0xc7, 0x71, 0xe4, 0x3c, 0x6c,
	0xe7, 0xb3, 0x9c, 0x4f, 0x29, 0x48, 0x05, 0x2a, 0x05, 0xf2, 0xab, 0xc6, 0xc4, 0x44, 0x4a, 0xcb,
	0x0e, 0x09, 0x04, 0xba, 0xae, 0x66, 0xee, 0x48, 0x9d, 0x74, 0xf7, 0x6d, 0x77, 0xf7, 0xc8, 0x1a,
	0x16, 0x2c, 0xa0, 0x8a, 0x35, 0x50, 0x59, 0x53, 0x15, 0x16, 0x14, 0x55, 0x59, 0xb0, 0x62, 0xc5,
	0x1f, 0x60, 0xc7, 0x3f, 0x60, 0x0d, 0x5b, 0xaa, 0x58, 0x51, 0x3c, 0xea, 0xbe, 0xa6, 0x5f, 0xb7,
	0xe7, 0x61, 0xb9, 0x80, 0x02, 0xad, 0x66, 0xee, 0x3d, 0xe7, 0x9e, 0x7b, 0xfa, 0xf4, 0x79, 0xdd,
	0x73, 0x6e, 0xc3, 0x3a, 0xf1, 0xb0, 0x8b, 0x3c, 0xeb, 0x64, 0xe7, 0xd6, 0x9e, 0x87, 0xdd, 0xdd,
	0xfd, 0x07, 0x27, 0x3b, 0xdb, 0x9e, 0x4f, 0x42, 0xa2, 0x81, 0x00, 0x6d, 0x9f, 0xec, 0x6c, 0xac,
	0x1f, 0x11, 0x72, 0x64, 0xe3, 0x5b, 0x0c, 0x72, 0x38, 0x1c, 0xdc, 0x42, 0xee, 0x88, 0xa3, 0x6d,
	0x39, 0xa0, 0xef, 0xf6, 0xfb, 0x56, 0x68, 0x11, 0x17, 0xd9, 0xfb, 0x3e, 0xf1, 0xb0, 0x1f, 0x5a,
	0x38, 0x78, 0x10, 0x62, 0x47, 0xfb, 0x3f, 0xa8, 0x05, 0xbd, 0x63, 0xec, 0x20, 0xbd, 0x78, 0xa5,
	0x78, 0x6d, 0x61, 0x47, 0xdb, 0x8e, 0x68, 0x6e, 0x1f, 0x30, 0x48, 0xb7, 0x60, 0x08, 0x1c, 0x6d,
	0x03, 0xea, 0x87, 0x84, 0xd8, 0x18, 0xb9, 0x7a, 0xe9, 0x4a, 0xf1, 0x5a, 0xa3, 0x5b, 0x30, 0xe4,
	0xc4, 0xed, 0x3a, 0x54, 0x89, 0x8b, 0xc9, 0x60, 0xeb, 0x1e, 0x94, 0x77, 0xdd, 0x91, 0x76, 0x03,
	0xaa, 0x27, 0xc8, 0x1e, 0x62, 0x41, 0x78, 0x75, 0x9b, 0x33, 0xb8, 0x2d, 0x19, 0xdc, 0xde, 0x75,
	0x47, 0x06, 0x47, 0xd1, 0x34, 0xa8, 0x8c, 0x90, 0x63, 0x33, 0xa2, 0x4d, 0x83, 0xfd, 0xdf, 0xfa,
	0xa2, 0x08, 0xed, 0x5d, 0xcf, 0x7a, 0x17, 0x8f, 0x0e, 0x70, 0x6f, 0xe8, 0x5b, 0xe1, 0x88, 0xa2,
	0x85, 0x23, 0x8f, 0x53, 0x6c, 0x1a, 0xec, 0x3f, 0x9d, 0x73, 0x91, 0x83, 0xe5, 0x52, 0xfa, 0x5f,
	0x6b, 0x43, 0xc9, 0x72, 0xf5, 0x32, 0x9b, 0x29, 0x59, 0xae, 0x76, 0x05, 0x16, 0xfa, 0x38, 0xe8,
	0xf9, 0x96, 0x47, 0x65, 0xa0, 0x57, 0x18, 0x20, 0x3e, 0xa5, 0x7d, 0x0d, 0x3a, 0x27, 0xd8, 0xed,
	0x13, 0xdf, 0xc4, 0xa7, 0x21, 0x76, 0x03, 0x8a, 0x56, 0xbd, 0x52, 0x66, 0x7c, 0xc7, 0x04, 0xf2,
	0x1e, 0x72, 0x70, 0x9f, 0xf2, 0xbd, 0xc4, 0xb1, 0xef, 0x49, 0xe4, 0xad, 0xcf, 0x8a, 0xb0, 0x79,
	0x1b, 0x05, 0x56, 0x6f, 0x77, 0x18, 0x1e, 0x63, 0x37, 0xb4, 0x7a, 0x88, 0x12, 0x9e, 0xc8, 0x7a,
	0x8a, 0xad, 0xd2, 0x6c, 0x6c, 0x95, 0xe7, 0x61, 0xeb, 0x0f, 0x45, 0x68, 0xdd, 0x26, 0xfd, 0xd1,
	0x3e, 0xf2, 0x91, 0x83, 0x43, 0xec, 0xa7, 0x37, 0x2d, 0x66, 0x37, 0x9d, 0x45, 0xa2, 0x1b, 0xd0,
	0xf0, 0xf1, 0x93, 0xa1, 0xe5, 0xe3, 0x3e, 0x13, 0x67, 0xc3, 0x18, 0x8f, 0xb5, 0x1b, 0x63, 0x95,
	0xaa, 0xe6, 0xa9, 0xd4, 0x58, 0xa1, 0x54, 0x0f, 0x58, 0x9b, 0xe7, 0x01, 0x7f, 0x5c, 0x84, 0xfa,
	0x1d, 0xe2, 0x86, 0xa8, 0x17, 0x8e, 0x19, 0x2f, 0xc6, 0x18, 0xef, 0x40, 0x79, 0xe8, 0x4b, 0xc5,
	0xa2, 0x7f, 0xb5, 0x55, 0xa8, 0x62, 0x07, 0x59, 0xb6, 0x78, 0x1a, 0x3e, 0x50, 0x32, 0x52, 0x99,
	0x87, 0x91, 0x47, 0x50, 0xbf, 0x8b, 0x07, 0x68, 0x68, 0x87, 0xda, 0x03, 0xb8, 0x80, 0xc6, 0xf6,
	0x66, 0x7a, 0x63, 0x83, 0xd3, 0x8b, 0x13, 0x08, 0xae, 0x22, 0x85, 0x89, 0x6e, 0x7d, 0x07, 0x16,
	0xee, 0xe2, 0x81, 0xe5, 0x32, 0x48, 0xa0, 0x3d, 0x9c, 0x4c, 0xf9, 0x62, 0x86, 0xb2, 0x10, 0xb7,
	0x9a, 0xf8, 0x1f, 0xab, 0xd0, 0xb8, 0x4b, 0x7a, 0x43, 0x07, 0xbb, 0xa1, 0xa6, 0x43, 0x3d, 0x78,
	0x8a, 0x8e, 0x8e, 0xb0, 0x2f, 0xe4, 0x27, 0x87, 0xda, 0xcb, 0x50, 0xb1, 0xdc, 0x01, 0x61, 0x32,
	0x5c, 0xd8, 0xe9, 0xc4, 0xf7, 0x78, 0xe0, 0x0e, 0x88, 0xc1, 0xa0, 0x54, 0xf8, 0xc7, 0x24, 0x08,
	0x85, 0x54, 0xd9, 0x7f, 0x6d, 0x13, 0x9a, 0x87, 0x28, 0xc0, 0xa6, 0x87, 0xc2, 0x63, 0x61, 0x75,
	0x0d, 0x3a, 0xb1, 0x8f, 0xc2, 0x63, 0xb6, 0x21, 0xe5, 0x0e, 0x07, 0xcc, 0xd2, 0xe8, 0x86, 0x7c,
	0x48, 0x95, 0xab, 0x47, 0xdc, 0x60, 0x48, 0x41, 0x35, 0x06, 0x1a, 0x8f, 0x29, 0xcc, 0xf3, 0x49,
	0x7f, 0xd8, 0xc3, 0x81, 0x5e, 0xe7, 0x30, 0x39, 0xd6, 0x5e, 0x83, 0x2a, 0xdd, 0x29, 0xd0, 0x1b,
	0x8c, 0xd3, 0xe5, 0x38, 0xa7, 0x74, 0xcb, 0xc0, 0xe0, 0x70, 0xed, 0x6d, 0x6a, 0x03, 0x63, 0xa9,
	0xea, 0x4d, 0x86, 0x9e, 0x10, 0x5e, 0x4c, 0xe8, 0x46, 0x1c, 0x57, 0xfb, 0x3a, 0x80, 0x27, 0x6d,
	0x29, 0xd0, 0x81, 0xad, 0xbc, 0x92, 0xdc, 0x48, 0x40, 0xe3, 0x24, 0x62, 0x6b, 0xb4, 0x77, 0xa0,
	0xe9, 0xe3, 0xc0, 0x23, 0x6e, 0x80, 0x03, 0x7d, 0x81, 0x11, 0x78, 0x31, 0x4e, 0xc0, 0x10, 0xc0,
	0xf8, 0xfa, 0x68, 0x85, 0xf6, 0x55, 0x68, 0x04, 0xc2, 0xa9, 0xe8, 0x8b, 0xec, 0xad, 0x27, 0x56,
	0x4b, 0x87, 0x63, 0x70, 0x6b, 0xa4, 0xaf, 0xd6, 0x18, 0x2f, 0xd0, 0x0c, 0x58, 0x95, 0xff, 0xcd,
	0xb8, 0x04, 0x5a, 0x59, 0x36, 0x24, 0xa1, 0x38, 0x1b, 0x2b, 0x41, 0x76, 0x52, 0xbb, 0x0a, 0x95,
	0x10, 0x1d, 0x05, 0x7a, 0x9b, 0x31, 0xb3, 0x14, 0xa7, 0xf1, 0x08, 0x1d, 0x19, 0x0c, 0xa8, 0xbd,
	0x03, 0x2d, 0x6a, 0x57, 0x3e, 0x55, 0xdb, 0x3e, 0xe9, 0x05, 0xfa, 0x12, 0xdb, 0x51, 0x8f, 0x63,
	0xdf, 0x13, 0x08, 0x77, 0x49, 0x2f, 0x30, 0x16, 0x71, 0x6c, 0xa4, 0xb4, 0xce, 0xce, 0x3c, 0xd6,
	0xf9, 0x18, 0x1a, 0xf7, 0x4e, 0x91, 0xe3, 0xd9, 0x38, 0x78, 0x9e, 0xe6, 0xf9, 0xa3, 0x22, 0x2c,
	0xc6, 0xd9, 0x9e, 0xc1, 0xbb, 0x66, 0x1d, 0xd2, 0x99, 0x9d, 0xfc, 0x3f, 0x4a, 0x00, 0xf7, 0x2d,
	0x1b, 0x73, 0x63, 0xd7, 0xd6, 0xa0, 0x36, 0x20, 0xbe, 0x83, 0x42, 0xb1, 0xbd, 0x18, 0x51, 0xc7,
	0x17, 0x5a, 0xa1, 0x2d, 0x1d, 0x3b, 0x1f, 0xa4, 0x39, 0x2e, 0x67, 0x39, 0xbe, 0x0e, 0xf5, 0x3e,
	0xf7, 0x6c, 0xcc, 0x86, 0x53, 0xef, 0x98, 0x72, 0x24, 0xe1, 0x89, 0xb0, 0xc0, 0x8d, 0x3a, 0x0a,
	0x0b, 0x32, 0x02, 0xd6, 0x62, 0x11, 0x70, 0x93, 0xda, 0x02, 0xea, 0x9b, 0xc4, 0xb5, 0x47, 0x7a,
	0x5d, 0xc6, 0x11, 0xd4, 0xdf, 0x73, 0xed, 0x51, 0x56, 0x67, 0x1a, 0x73, 0xe9, 0xcc, 0x75, 0xa8,
	0x63, 0xfe, 0xca, 0x85, 0x81, 0x67, 0xd9, 0x16, 0x70, 0xe5, 0x1b, 0x80, 0x79, 0xde, 0xc0, 0x17,
	0x35, 0xd8, 0xb8, 0x4f, 0x7c, 0xe7, 0x2e, 0x0a, 0xd1, 0xd8, 0x01, 0x1c, 0x0c, 0x0f, 0x0f, 0x64,
	0xda, 0x14, 0x89, 0xa5, 0x98, 0x8a, 0x96, 0x3c, 0xb2, 0x96, 0xf2, 0x72, 0x95, 0x72, 0x7e, 0x7c,
	0xae, 0xc4, 0xc2, 0xdc, 0x0d, 0x58, 0x46, 0xb6, 0x4d, 0x9e, 0x9a, 0xd8, 0xf1, 0xc2, 0x91, 0xc9,
	0x13, 0xaf, 0x2a, 0xdb, 0x6a, 0x89, 0x01, 0xee, 0xd1, 0xf9, 0x0f, 0x64, 0xb2, 0x95, 0x79, 0x11,
	0x91, 0xce, 0xd4, 0x13, 0x3a, 0xf3, 0xff, 0x50, 0xb5, 0x42, 0xec, 0x48, 0xd9, 0x6f, 0x26, 0x3c,
	0x9d, 0x6f, 0x39, 0x56, 0x68, 0x9d, 0xf0, 0x4c, 0x32, 0x30, 0x38, 0xa6, 0xf6, 0x3a, 0x2c, 0xf7,
	0x88, 0x6d, 0xe3, 0x1e, 0x65, 0xd6, 0x14, 0x54, 0x9b, 0x8c, 0x6a, 0x27, 0x02, 0xdc, 0xe7, 0xf4,
	0x63, 0xba, 0x05, 0x53, 0x74, 0x4b, 0x87, 0xba, 0x83, 0x4e, 0x2d, 0x67, 0xe8, 0x30, 0xaf, 0x59,
	0x34, 0xe4, 0x90, 0xee, 0x88, 0x4f, 0x7b, 0xf6, 0x30, 0xb0, 0x4e, 0xb0, 0x29, 0x71, 0x16, 0xd9,
	0xc3, 0x77, 0xc6, 0x80, 0x6f, 0x0a, 0x64, 0x4a, 0xc6, 0x72, 0x19, 0x4a, 0x4b, 0x90, 0xe1, 0xc3,
	0x14, 0x19, 0x81, 0xd3, 0x4e, 0x93, 0x11, 0xc8, 0x2f, 0x00, 0x38, 0xe8, 0xd4, 0xb4, 0xb1, 0x7b,
	0x14, 0x1e, 0x33, 0x6f, 0x56, 0x36, 0x9a, 0x0e, 0x3a, 0x7d, 0xc8, 0x26, 0x18, 0xd8, 0x72, 0x25,
	0xb8, 0x23, 0xc0, 0x96, 0x2b, 0xc0, 0x3a, 0xd4, 0x3d, 0x14, 0x52, 0x65, 0xd5, 0x97, 0x79, 0xb0,
	0x15, 0x43, 0x6a, 0x11, 0x94, 0x2e, 0x17, 0xba, 0xc6, 0xd6, 0x35, 0x1c, 0x74, 0xca, 0x24, 0xcc,
	0x80, 0x96, 0x2b, 0x80, 0x2b, 0x02, 0x68, 0xb9, 0x1c, 0xf8, 0x12, 0x2c, 0x0e, 0x5d, 0xeb, 0xc9,
	0x10, 0x0b, 0xf8, 0x2a, 0xe3, 0x7c, 0x81, 0xcf, 0x71, 0x94, 0xab, 0x50, 0xc1, 0xee, 0xd0, 0xd1,
	0x2f, 0x64, 0x5d, 0x35, 0x15, 0x35, 0x03, 0x6a, 0x2f, 0xc2, 0x82, 0x33, 0xb4, 0x43, 0xcb, 0xb3,
	0xb1, 0x49, 0x06, 0xfa, 0x1a, 0x13, 0x12, 0xc8, 0xa9, 0xbd, 0x81, 0xd2, 0x5a, 0x2e, 0xce, 0x65,
	0x2d, 0x55, 0xa8, 0x75, 0x31, 0xea, 0x63, 0x5f, 0x99, 0x16, 0x47, 0xba, 0x58, 0x52, 0xeb, 0x62,
	0xf9, 0x6c, 0xba, 0x58, 0x99, 0xae, 0x8b, 0xd5, 0xd9, 0x75, 0xb1, 0x36, 0x83, 0x2e, 0xd6, 0xa7,
	0xeb, 0x62, 0x63, 0x06, 0x5d, 0x6c, 0xce, 0xa4, 0x8b, 0x30, 0x59, 0x17, 0x17, 0x26, 0xe8, 0xe2,
	0xe2, 0x04, 0x5d, 0x6c, 0x4d, 0xd2, 0xc5, 0xf6, 0x14, 0x5d, 0x5c, 0xca, 0xd7, 0xc5, 0xce, 0x1c,
	0xba, 0xb8, 0x9c, 0xd1, 0xc5, 0x94, 0xb7, 0xd4, 0x66, 0x3b, 0x42, 0xad, 0xcc, 0xa3, 0xad, 0x7f,
	0xab, 0x82, 0xce, 0xb5, 0xf5, 0xdf, 0xe2, 0xd9, 0xa5, 0x85, 0x54, 0x95, 0x16, 0x52, 0x53, 0x5b,
	0x48, 0xfd, 0x6c, 0x16, 0xd2, 0x98, 0x6e, 0x21, 0xcd, 0xd9, 0x2d, 0x04, 0x66, 0xb0, 0x90, 0x85,
	0xe9, 0x16, 0xb2, 0x38, 0x83, 0x85, 0xb4, 0x66, 0xb2, 0x90, 0xf6, 0x64, 0x0b, 0x59, 0x9a, 0x60,
	0x21, 0x9d, 0x09, 0x16, 0xb2, 0x3c, 0xc9, 0x42, 0xb4, 0x29, 0x16, 0xb2, 0x92, 0x6f, 0x21, 0xab,
	0x73, 0x58, 0xc8, 0x85, 0x99, 0xbc, 0xf5, 0xda, 0x3c, 0xfa, 0xff, 0x2d, 0xa8, 0x73, 0xf5, 0x7f,
	0x86, 0xe3, 0x27, 0x5f, 0x98, 0x93, 0x3c, 0x7f, 0x5e, 0x82, 0x0a, 0x3d, 0x40, 0x46, 0x89, 0x69,
	0x31, 0x9e, 0x98, 0xea, 0x50, 0x3f, 0xc1, 0x7e, 0x10, 0x55, 0x46, 0xe4, 0x70, 0x06, 0x43, 0xba,
	0x06, 0x9d, 0x10, 0xfb, 0x4e, 0x60, 0x92, 0x81, 0x19, 0x60, 0xff, 0xc4, 0xea, 0x49, 0xa3, 0x6a,
	0xb3, 0xf9, 0xbd, 0xc1, 0x01, 0x9f, 0xd5, 0x6e, 0x42, 0xbd, 0xc7, 0xcb, 0x07, 0xc2, 0xe9, 0xaf,
	0xc4, 0x1f, 0x42, 0x54, 0x16, 0x0c, 0x89, 0x43, 0xd1, 0x6d, 0xab, 0x87, 0xdd, 0x80, 0xa7, 0x4f,
	0x29, 0xf4, 0x87, 0x1c, 0x64, 0x48, 0x1c, 0xa5, 0xf0, 0xeb, 0xf3, 0x08, 0xff, 0x2d, 0x68, 0x32,
	0x65, 0x60, 0xb5, 0xba, 0x1b, 0xb1, 0x5a, 0x5d, 0x79, 0x72, 0x61, 0x65, 0xeb, 0x2e, 0xb4, 0xbe,
	0x11, 0x10, 0xd7, 0xc0, 0x03, 0xec, 0x63, 0xb7, 0x87, 0xb5, 0x65, 0xa8, 0x98, 0x3e, 0x1e, 0x08,
	0x19, 0x97, 0x0d, 0x3c, 0x98, 0x5e, 0x7f, 0xda, 0xf2, 0xa0, 0x2e, 0x9e, 0x69, 0xc6, 0xe2, 0xca,
	0x99, 0xcf, 0x32, 0xf7, 0xa0, 0x21, 0x81, 0xca, 0x2d, 0x5f, 0x91, 0x55, 0xc5, 0x92, 0xda, 0x01,
	0x71, 0xe8, 0xd6, 0xbb, 0xb0, 0x10, 0x53, 0x40, 0x25, 0xa5, 0x6b, 0x49, 0x4a, 0x09, 0x61, 0x0a,
	0xbd, 0x15, 0xc4, 0xde, 0x87, 0x36, 0x23, 0x16, 0x15, 0xd1, 0x54, 0xf4, 0x5e, 0x4f, 0xd2, 0xbb,
	0xa0, 0x2c, 0x0a, 0x48, 0x92, 0x7b, 0xd0, 0x12, 0x24, 0xc3, 0x63, 0xf6, 0x6e, 0x55, 0x14, 0x6f,
	0x24, 0x29, 0xae, 0xa6, 0xeb, 0x19, 0x74, 0x61, 0x9a, 0xa0, 0xac, 0x1e, 0xcc, 0x4d, 0x50, 0x2e,
	0x94, 0x04, 0x3f, 0x02, 0x2d, 0x41, 0x70, 0x7c, 0x76, 0xc8, 0x50, 0xbd, 0x95, 0xa4, 0xba, 0xae,
	0xa2, 0xca, 0x56, 0xa7, 0x5f, 0x8e, 0x88, 0xa1, 0xf3, 0xbe, 0x1c, 0xa1, 0xe9, 0x82, 0x98, 0x03,
	0x97, 0x38, 0xb1, 0x6c, 0x69, 0x22, 0x57, 0xb0, 0x6f, 0x27, 0xa9, 0x5f, 0x9d, 0x52, 0xf7, 0x88,
	0xcb, 0xf9, 0x2d, 0xc9, 0x7b, 0xe8, 0x5b, 0xee, 0x91, 0x92, 0xfa, 0x6a, 0x9c, 0x7a, 0x53, 0x2e,
	0x7c, 0x0c, 0x9d, 0xd8, 0xc2, 0x5d, 0xdf, 0x47, 0x6a, 0x05, 0xbf, 0x99, 0xe4, 0x2d, 0xe1, 0x53,
	0x63, 0x6b, 0x25, 0xd9, 0xdf, 0x94, 0xa1, 0xf3, 0x1e, 0x71, 0x93, 0x35, 0x5e, 0x0c, 0x9b, 0xc7,
	0x4c, 0x83, 0xcd, 0x71, 0xdd, 0xc9, 0x0c, 0x86, 0x87, 0x66, 0xa2, 0xd2, 0xff, 0x72, 0x56, 0xe1,
	0xb3, 0x09, 0x4e, 0xb7, 0x60, 0xe8, 0xc7, 0x79, 0xc9, 0x8f, 0x0d, 0x97, 0x69, 0xc2, 0x60, 0xf6,
	0x51, 0x88, 0xd4, 0x3b, 0xf1, 0x67, 0x78, 0x35, 0xbe, 0x53, 0xfe, 0x31, 0xb9, 0x5b, 0x30, 0x36,
	0x06, 0xf9, 0x87, 0xe8, 0x43, 0xd8, 0x78, 0x32, 0xc4, 0xfe, 0x48, 0xbd, 0x53, 0x39, 0xfb, 0x26,
	0xdf, 0xa7, 0xd8, 0xca, 0x6d, 0x2e, 0x3e, 0x51, 0x83, 0x34, 0x13, 0xd6, 0x3d, 0x14, 0x1e, 0xab,
	0xb7, 0xe0, 0xc5, 0x8f, 0xad, 0xb4, 0x15, 0x2a, 0x77, 0x58, 0xf3, 0x94, 0x90, 0xa8, 0x49, 0xf2,
	0x79, 0x09, 0xf4, 0x3d, 0x34, 0x0c, 0x8f, 0x77, 0x76, 0x7b, 0x3d, 0x1c, 0x04, 0x77, 0x48, 0x1f,
	0x4f, 0xeb, 0x73, 0x0c, 0x6c, 0xf2, 0x54, 0x56, 0xe5, 0xe9, 0x7f, 0xed, 0x0d, 0x1a, 0x10, 0x88,
	0x87, 0xe5, 0x91, 0x28, 0x51, 0x1a, 0xe1, 0xd4, 0x0f, 0x18, 0xdc, 0x10, 0x78, 0x34, 0x6b, 0xa2,
	0xd3, 0xc4, 0xb7, 0xbe, 0xcf, 0xfa, 0x13, 0x26, 0xf5, 0xdf, 0xe2, 0x40, 0x94, 0x00, 0x3c, 0xf6,
	0x6d, 0x9a, 0xc0, 0x84, 0xe4, 0x53, 0xcc, 0x91, 0x78, 0xfe, 0xd9, 0x60, 0x13, 0x14, 0x98, 0x0a,
	0x1e, 0xb5, 0xd9, 0x32, 0xef, 0xb9, 0x82, 0xdf, 0x5f, 0x8a, 0xb0, 0x2e, 0x64, 0xe4, 0x79, 0xf6,
	0x2c, 0x1d, 0x95, 0xe7, 0x23, 0xa4, 0xc4, 0x73, 0x57, 0x26, 0x3f, 0x77, 0x75, 0xb6, 0xe7, 0x9e,
	0xab, 0xa7, 0xf1, 0xc3, 0x12, 0xac, 0x71, 0xc6, 0x1e, 0x38, 0xf4, 0xb9, 0xad, 0xf0, 0x3f, 0x4d,
	0x33, 0xfe, 0x05, 0x42, 0xf8, 0x73, 0x51, 0x0a, 0x61, 0x1f, 0x05, 0xc1, 0x53, 0xe2, 0xf7, 0xff,
	0x07, 0xde, 0xfc, 0xc7, 0xb0, 0x18, 0xe7, 0xeb, 0x19, 0xfa, 0x3d, 0x2c, 0x42, 0xe4, 0x24, 0xdc,
	0x3f, 0xaf, 0x40, 0x73, 0xcf, 0xc3, 0x3e, 0x92, 0x87, 0x4d, 0x56, 0xb7, 0x2f, 0xb2, 0x3a, 0x2d,
	0x2f, 0xd3, 0xeb, 0x50, 0x0f, 0x86, 0x8e, 0x83, 0xfc, 0x91, 0xcc, 0xb9, 0xc5, 0x70, 0x86, 0x9c,
	0x3b, 0x53, 0xae, 0xad, 0xcc, 0x55, 0xae, 0x7d, 0x09, 0x16, 0x89, 0xe4, 0xcd, 0xb4, 0xfa, 0x52,
	0xbc, 0xe3, 0xb9, 0x07, 0xfd, 0x44, 0xef, 0xa7, 0x96, 0xea, 0xfd, 0xc4, 0x7b, 0x46, 0xf5, 0x54,
	0xcf, 0xe8, 0x2b, 0x89, 0x9e, 0x4d, 0x83, 0x89, 0x6e, 0x43, 0x99, 0x9e, 0xf1, 0x50, 0x1f, 0xef,
	0xd6, 0xbc, 0x19, 0xef, 0xd6, 0x34, 0xb3, 0x99, 0x9d, 0x4c, 0x70, 0x12, 0x3d, 0x9a, 0x58, 0x6b,
	0x0b, 0x92, 0xad, 0xad, 0xcb, 0x00, 0x7d, 0xec, 0xf9, 0xb8, 0x87, 0x42, 0xdc, 0x17, 0xa7, 0xde,
	0xd8, 0xcc, 0xd9, 0xba, 0x3b, 0x2a, 0xf5, 0x6b, 0xcd, 0xa3, 0x7e, 0xbf, 0x2c, 0x42, 0x33, 0xca,
	0x22, 0x6e, 0x43, 0xfb, 0x90, 0xf4, 0x63, 0xf1, 0x56, 0x24, 0x0e, 0x89, 0x04, 0x2f, 0x91, 0x78,
	0x74, 0x0b, 0x46, 0xeb, 0x30, 0x91, 0x89, 0x3c, 0x04, 0xcd, 0x25, 0xae, 0x99, 0xa2, 0xc3, 0xd3,
	0x82, 0x4b, 0x09, 0xa6, 0x52, 0x39, 0x4c, 0xb7, 0x60, 0x74, 0xdc, 0xd4, 0x5c, 0x14, 0x3d, 0x8f,
	0x60, 0x55, 0xd5, 0x67, 0xd3, 0xf6, 0x26, 0xdb, 0xcb, 0x46, 0x46, 0x0c, 0x51, 0x62, 0xae, 0x36,
	0x99, 0xcf, 0x8a, 0xd0, 0x4e, 0x6a, 0x87, 0xf6, 0x25, 0x68, 0xa6, 0x25, 0xa2, 0xce, 0xf5, 0xbb,
	0x05, 0x23, 0xc2, 0xa4, 0xd2, 0xfc, 0x24, 0x20, 0x2e, 0x3d, 0x83, 0xf1, 0x13, 0x99, 0x2a, 0x5d,
	0x4e, 0x1c, 0xd9, 0xa8, 0x34, 0x3f, 0x89, 0x4f, 0x44, 0xcf, 0xff, 0xfb, 0x32, 0x34, 0xc6, 0x47,
	0x07, 0xc5, 0xc9, 0xee, 0x35, 0x28, 0x1f, 0xe1, 0x50, 0x75, 0x12, 0x19, 0xdb, 0xbf, 0x41, 0x31,
	0x28, 0xa2, 0x37, 0x0c, 0x85, 0x7f, 0xcc, 0x43, 0xf4, 0x86, 0xa1, 0x76, 0x1d, 0x2a, 0x1e, 0x09,
	0x64, 0x07, 0x28, 0x07, 0x93, 0xa1, 0x68, 0x37, 0xa1, 0xd6, 0xc7, 0x36, 0x0e, 0xb1, 0x38, 0x51,
	0xe7, 0x20, 0x0b, 0x24, 0xed, 0x16, 0xd4, 0x89, 0xc7, 0xdb, 0x90, 0xb5, 0x49, 0xf8, 0x12, 0x8b,
	0xb2, 0x42, 0x53, 0x52, 0x51, 0xe4, 0xca, 0x63, 0x85, 0xa2, 0xd0, 0x33, 0x99, 0x87, 0xc2, 0xde,
	0xb1, 0x68, 0x5f, 0xe4, 0xe0, 0x72, 0x9c, 0x94, 0x9b, 0x68, 0xce, 0xe5, 0x26, 0xce, 0xdc, 0x41,
	0xfa, 0x6b, 0x15, 0xd6, 0xd4, 0xd9, 0xe4, 0x79, 0x8d, 0xf1, 0xbc, 0xc6, 0xf8, 0xdf, 0x5e, 0x63,
	0x7c, 0x0a, 0x55, 0x76, 0x41, 0x43, 0x49, 0xa9, 0x38, 0x07, 0x25, 0xed, 0x26, 0x54, 0xd8, 0x6d,
	0x93, 0x12, 0x5b, 0xb4, 0xae, 0x70, 0xf8, 0xa2, 0x6e, 0xc2, 0xd0, 0xb6, 0x7e, 0x56, 0x85, 0xa5,
	0x94, 0xd6, 0x9e, 0xf7, 0xa4, 0xce, 0x7b, 0x52, 0x67, 0xea, 0x49, 0xa9, 0x74, 0x58, 0x9b, 0xc7,
	0x1a, 0xbe, 0x0d, 0x10, 0xa5, 0x20, 0xcf, 0xf9, 0xce, 0xd7, 0xaf, 0x6a, 0x70, 0x31, 0xa7, 0x30,
	0x72, 0x7e, 0x4d, 0xe1, 0xfc, 0x9a, 0xc2, 0xf9, 0x35, 0x85, 0xc8, 0x0c, 0xff, 0x5e, 0x84, 0xc6,
	0xb8, 0x9c, 0x3e, 0xfd, 0x62, 0xd7, 0xf6, 0xb8, 0x3b, 0xc3, 0xd3, 0xee, 0xb5, 0x6c, 0xcd, 0x9a,
	0x05, 0x1e, 0x79, 0xf5, 0xf5, 0x26, 0xd4, 0x79, 0x65, 0x55, 0x06, 0x8f, 0x95, 0x6c, 0x41, 0x36,
	0x30, 0x24, 0x8e, 0xf6, 0x06, 0x34, 0xc4, 0x75, 0x25, 0x79, 0xb2, 0x5e, 0x4d, 0x9e, 0xac, 0x39,
	0xcc, 0x18, 0x63, 0x9d, 0xfd, 0x4e, 0x33, 0x86, 0x15, 0xc5, 0x65, 0x44, 0xed, 0xbd, 0xc9, 0x0e,
	0x29, 0x1b, 0x73, 0xc7, 0xad, 0x05, 0xb5, 0x4b, 0xfa, 0x49, 0x11, 0x5a, 0xc9, 0x2e, 0xc3, 0x0e,
	0x75, 0x44, 0x7c, 0x62, 0x7c, 0x7b, 0x5c, 0x71, 0xe6, 0xee, 0x16, 0x8c, 0x31, 0xde, 0xf3, 0x3d,
	0x5f, 0xfd, 0xb4, 0x08, 0xcd, 0xf1, 0xc9, 0x5e, 0xbb, 0x03, 0x2d, 0xb9, 0x8d, 0xd9, 0x23, 0x7d,
	0x2c, 0x1e, 0xf4, 0x72, 0xee, 0x83, 0xf2, 0x6e, 0xc7, 0xa2, 0x5c, 0x74, 0x87, 0xf4, 0xd5, 0xad,
	0xc0, 0xd2, 0x3c, 0x6f, 0xe3, 0xd7, 0x4d, 0xa8, 0x09, 0x47, 0xad, 0x38, 0xf1, 0xe5, 0x25, 0x28,
	0xe3, 0xde, 0x6a, 0x79, 0xc2, 0xa5, 0xbf, 0xca, 0xc4, 0x4b, 0x7f, 0xd3, 0x12, 0x8f, 0x94, 0x25,
	0xd6, 0x32, 0x96, 0x18, 0x73, 0x89, 0xf5, 0x19, 0x5c, 0x62, 0x63, 0xba, 0x4b, 0x6c, 0xce, 0xe0,
	0x12, 0x61, 0x26, 0x97, 0xb8, 0x30, 0xd9, 0x25, 0x2e, 0x4e, 0x70, 0x89, 0xad, 0x09, 0x2e, 0xb1,
	0x3d, 0xc9, 0x25, 0x2e, 0x4d, 0x71, 0x89, 0x9d, 0xac, 0x4b, 0x7c, 0x05, 0xda, 0x94, 0x78, 0xcc,
	0xd8, 0xf8, 0x49, 0xa0, 0xe5, 0xa0, 0xd3, 0x58, 0xae, 0x40, 0xd1, 0x2c, 0x37, 0x8e, 0xa6, 0x09,
	0x34, 0xcb, 0x8d, 0xa1, 0xc5, 0x03, 0xfd, 0x4a, 0xea, 0x9a, 0xe6, 0x4c, 0x27, 0x82, 0x8f, 0xf2,
	0x5c, 0xc0, 0x85, 0x6c, 0x6b, 0x29, 0xef, 0xd3, 0x13, 0xb5, 0x37, 0xd0, 0xae, 0x89, 0xb0, 0xbf,
	0x96, 0xb5, 0xfb, 0x47, 0x23, 0x0f, 0xf3, 0xdc, 0x9d, 0x25, 0x03, 0xaf, 0xcb, 0xa0, 0x7f, 0x31,
	0x7b, 0xb8, 0x1f, 0x37, 0xcd, 0x65, 0xb8, 0xbf, 0x0e, 0x35, 0x64, 0xdb, 0x54, 0x3f, 0xf5, 0xdc,
	0xde, 0x79, 0x15, 0xd9, 0xf6, 0xde, 0x40, 0xfb, 0x32, 0x40, 0xec, 0x89, 0xd6, 0xb3, 0xce, 0x3c,
	0xe2, 0xd6, 0x88, 0x61, 0x6a, 0x2f, 0x43, 0xab, 0x6f, 0x51, 0x0b, 0x72, 0x2c, 0x17, 0x85, 0xc4,
	0xd7, 0x37, 0x98, 0x82, 0x24, 0x27, 0x93, 0x57, 0x5e, 0x37, 0x53, 0x57, 0x5e, 0x5f, 0x82, 0xf2,
	0xa9, 0x63, 0xeb, 0x97, 0xb2, 0x16, 0xf7, 0xa1, 0x63, 0x1b, 0x14, 0x96, 0x2d, 0xb3, 0xbe, 0xf0,
	0xac, 0xb7, 0x62, 0x2f, 0x3f, 0xc3, 0xad, 0xd8, 0x17, 0xe7, 0xf1, 0x58, 0x3f, 0x00, 0x88, 0xe2,
	0xde, 0x9c, 0x5f, 0x1a, 0xbd, 0x0d, 0x0b, 0x03, 0xcb, 0xc6, 0x66, 0x7e, 0x48, 0x8d, 0x6e, 0x3c,
	0x77, 0x0b, 0x06, 0x0c, 0xc6, 0xa3, 0xc8, 0x8b, 0x87, 0xb0, 0xa2, 0xe8, 0xe6, 0x6a, 0xdf, 0x9d,
	0x1c, 0xbf, 0xae, 0x65, 0x13, 0xea, 0x9c, 0x96, 0xb0, 0x3a, 0x9c, 0xfd, 0xa9, 0x02, 0x17, 0xf3,
	0x9a, 0xd1, 0x0e, 0xbc, 0x70, 0x88, 0x02, 0xab, 0x67, 0xa2, 0xc4, 0x57, 0x42, 0xe6, 0xb8, 0xe6,
	0xcb, 0x45, 0xf3, 0x5a, 0xa2, 0xc2, 0x9a, 0xff, 0x55, 0x51, 0xb7, 0x60, 0x6c, 0x1e, 0x4e, 0xf8,
	0xe8, 0xe8, 0x3e, 0x74, 0x90, 0x67, 0x99, 0x9f, 0xe2, 0x51, 0xb4, 0x03, 0x97, 0x64, 0xa2, 0xae,
	0x95, 0xfc, 0xca, 0xaa, 0x5b, 0x30, 0xda, 0x28, 0xf9, 0xdd, 0xd5, 0xf7, 0x40, 0x27, 0xac, 0x2d,
	0x61, 0x5a, 0xa2, 0x21, 0x15, 0xd1, 0x2b, 0x67, 0xbb, 0xa2, 0xea, 0xde, 0x55, 0xb7, 0x60, 0xac,
	0x11, 0x75, 0x57, 0x2b, 0xa2, 0xef, 0x89, 0x5e, 0x4f, 0x44, 0xbf, 0x92, 0x47, 0x3f, 0xdd, 0x16,
	0x8a, 0xe8, 0x67, 0x1a, 0x46, 0x47, 0xb0, 0x29, 0xe8, 0xa3, 0xa8, 0x91, 0x18, 0x6d, 0xc1, 0x03,
	0xdc, 0x2b, 0xd9, 0x2d, 0x14, 0x6d, 0xc7, 0x6e, 0xc1, 0x58, 0x27, 0xb9, 0x3d, 0x49, 0x1c, 0x6d,
	0xc4, 0xba, 0xba, 0x2c, 0x5d, 0x88, 0x36, 0xaa, 0x65, 0xbd, 0x63, 0x5e, 0x0f, 0xb8, 0x5b, 0x30,
	0x84, 0x4c, 0xb2, 0xb0, 0x48, 0xc3, 0x8f, 0x23, 0x0d, 0x8f, 0xb5, 0x04, 0xb4, 0xf7, 0x27, 0x6b,
	0xf8, 0xa5, 0x9c, 0xb6, 0x11, 0xbf, 0x58, 0xa0, 0xd6, 0xea, 0xab, 0xb0, 0x10, 0xbf, 0xb9, 0xb0,
	0x1a, 0x7d, 0xdc, 0x57, 0x8e, 0xee, 0x38, 0xfc, 0xb6, 0x08, 0xe5, 0x47, 0x48, 0x7d, 0x2b, 0x62,
	0xfa, 0xc7, 0x6e, 0x19, 0xcf, 0x56, 0x3e, 0xf3, 0x37, 0x22, 0x73, 0x7d, 0xc1, 0x75, 0x05, 0x1a,
	0x32, 0xc2, 0xe4, 0x3c, 0xdf, 0xc7, 0xb0, 0xf4, 0x41, 0xaa, 0xde, 0xf4, 0x1c, 0x3f, 0x26, 0xf9,
	0x5d, 0x11, 0xca, 0x1f, 0x3a, 0xb6, 0x52, 0x7a, 0x97, 0xa0, 0x49, 0x7f, 0x03, 0x0f, 0xf5, 0xe4,
	0xbd, 0x92, 0x68, 0x82, 0x26, 0x7f, 0x9e, 0x8f, 0x07, 0xd6, 0xa9, 0xc8, 0xf2, 0xc4, 0x88, 0xae,
	0x42, 0x61, 0xe8, 0x5b, 0x87, 0xc3, 0x10, 0x8b, 0xcf, 0xf4, 0xa2, 0x09, 0x9a, 0xca, 0x3c, 0xf5,
	0x91, 0xe7, 0xe1, 0xbe, 0x38, 0x82, 0xcb, 0xe1, 0x99, 0xfb, 0x98, 0xb7, 0x5f, 0x85, 0x36, 0xf1,
	0x8f, 0x24, 0xae, 0x79, 0xb2, 0x73, 0x7b, 0x51, 0x7c, 0xbb, 0xba, 0xef, 0x93, 0x90, 0xec, 0x17,
	0x7f, 0x51, 0x2a, 0xef, 0xed, 0x1e, 0x1c, 0xd6, 0xd8, 0xc7, 0xa0, 0x6f, 0xfe, 0x33, 0x00, 0x00,
	0xff, 0xff, 0xdc, 0xb2, 0x46, 0x98, 0xe4, 0x3a, 0x00, 0x00,
}
