# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: build_api.proto

import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()


from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2


DESCRIPTOR = _descriptor.FileDescriptor(
  name='build_api.proto',
  package='',
  syntax='proto2',
  serialized_options=None,
  serialized_pb=_b('\n\x0f\x62uild_api.proto\x1a google/protobuf/descriptor.proto\"(\n\x16\x42uildApiServiceOptions\x12\x0e\n\x06module\x18\x01 \x02(\t\"4\n\x15\x42uildApiMethodOptions\x12\x1b\n\x13implementation_name\x18\x01 \x01(\t:S\n\x0fservice_options\x12\x1f.google.protobuf.ServiceOptions\x18\xd8\xad\x03 \x01(\x0b\x32\x17.BuildApiServiceOptions:P\n\x0emethod_options\x12\x1e.google.protobuf.MethodOptions\x18\xd8\xad\x03 \x01(\x0b\x32\x16.BuildApiMethodOptions')
  ,
  dependencies=[google_dot_protobuf_dot_descriptor__pb2.DESCRIPTOR,])


SERVICE_OPTIONS_FIELD_NUMBER = 55000
service_options = _descriptor.FieldDescriptor(
  name='service_options', full_name='service_options', index=0,
  number=55000, type=11, cpp_type=10, label=1,
  has_default_value=False, default_value=None,
  message_type=None, enum_type=None, containing_type=None,
  is_extension=True, extension_scope=None,
  serialized_options=None, file=DESCRIPTOR)
METHOD_OPTIONS_FIELD_NUMBER = 55000
method_options = _descriptor.FieldDescriptor(
  name='method_options', full_name='method_options', index=1,
  number=55000, type=11, cpp_type=10, label=1,
  has_default_value=False, default_value=None,
  message_type=None, enum_type=None, containing_type=None,
  is_extension=True, extension_scope=None,
  serialized_options=None, file=DESCRIPTOR)


_BUILDAPISERVICEOPTIONS = _descriptor.Descriptor(
  name='BuildApiServiceOptions',
  full_name='BuildApiServiceOptions',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='module', full_name='BuildApiServiceOptions.module', index=0,
      number=1, type=9, cpp_type=9, label=2,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=53,
  serialized_end=93,
)


_BUILDAPIMETHODOPTIONS = _descriptor.Descriptor(
  name='BuildApiMethodOptions',
  full_name='BuildApiMethodOptions',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='implementation_name', full_name='BuildApiMethodOptions.implementation_name', index=0,
      number=1, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=95,
  serialized_end=147,
)

DESCRIPTOR.message_types_by_name['BuildApiServiceOptions'] = _BUILDAPISERVICEOPTIONS
DESCRIPTOR.message_types_by_name['BuildApiMethodOptions'] = _BUILDAPIMETHODOPTIONS
DESCRIPTOR.extensions_by_name['service_options'] = service_options
DESCRIPTOR.extensions_by_name['method_options'] = method_options
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

BuildApiServiceOptions = _reflection.GeneratedProtocolMessageType('BuildApiServiceOptions', (_message.Message,), dict(
  DESCRIPTOR = _BUILDAPISERVICEOPTIONS,
  __module__ = 'build_api_pb2'
  # @@protoc_insertion_point(class_scope:BuildApiServiceOptions)
  ))
_sym_db.RegisterMessage(BuildApiServiceOptions)

BuildApiMethodOptions = _reflection.GeneratedProtocolMessageType('BuildApiMethodOptions', (_message.Message,), dict(
  DESCRIPTOR = _BUILDAPIMETHODOPTIONS,
  __module__ = 'build_api_pb2'
  # @@protoc_insertion_point(class_scope:BuildApiMethodOptions)
  ))
_sym_db.RegisterMessage(BuildApiMethodOptions)

service_options.message_type = _BUILDAPISERVICEOPTIONS
google_dot_protobuf_dot_descriptor__pb2.ServiceOptions.RegisterExtension(service_options)
method_options.message_type = _BUILDAPIMETHODOPTIONS
google_dot_protobuf_dot_descriptor__pb2.MethodOptions.RegisterExtension(method_options)

# @@protoc_insertion_point(module_scope)
