// source: src/main/proto/TenantProfileService.proto
/**
 * @fileoverview
 * @enhanceable
 * @suppress {messageConventions} JS Compiler reports an error if a variable or
 *     field starts with 'MSG_' and isn't a translatable message.
 * @public
 */
// GENERATED CODE -- DO NOT EDIT!

var jspb = require('google-protobuf');
var goog = jspb;
var global = Function('return this')();

goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.AddTenantResponse', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.GetTenantRequest', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.GetTenantResponse', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.GetTenantsRequest', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.Tenant', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.TenantStatus', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse', null, global);
goog.exportSymbol('proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse', null, global);
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.Tenant = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, proto.org.apache.custos.tenant.profile.service.Tenant.repeatedFields_, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.Tenant, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.Tenant.displayName = 'proto.org.apache.custos.tenant.profile.service.Tenant';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.displayName = 'proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.displayName = 'proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.AddTenantResponse = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.AddTenantResponse, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.AddTenantResponse.displayName = 'proto.org.apache.custos.tenant.profile.service.AddTenantResponse';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse.displayName = 'proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.GetTenantRequest = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.GetTenantRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.GetTenantRequest.displayName = 'proto.org.apache.custos.tenant.profile.service.GetTenantRequest';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.GetTenantResponse = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.GetTenantResponse, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.GetTenantResponse.displayName = 'proto.org.apache.custos.tenant.profile.service.GetTenantResponse';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.repeatedFields_, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.displayName = 'proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest.displayName = 'proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse.displayName = 'proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.displayName = 'proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.repeatedFields_, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.displayName = 'proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.displayName = 'proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse.displayName = 'proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest.displayName = 'proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.repeatedFields_, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.displayName = 'proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.repeatedFields_, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.displayName = 'proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse';
}
/**
 * Generated by JsPbCodeGenerator.
 * @param {Array=} opt_data Optional initial data array, typically from a
 * server response, or constructed directly in Javascript. The array is used
 * in place and becomes part of the constructed object. It is not cloned.
 * If no data is provided, the constructed object will be empty, but still
 * valid.
 * @extends {jspb.Message}
 * @constructor
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest = function(opt_data) {
  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.org.apache.custos.tenant.profile.service.GetTenantsRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
  /**
   * @public
   * @override
   */
  proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.displayName = 'proto.org.apache.custos.tenant.profile.service.GetTenantsRequest';
}

/**
 * List of repeated fields within this message type.
 * @private {!Array<number>}
 * @const
 */
proto.org.apache.custos.tenant.profile.service.Tenant.repeatedFields_ = [11,12];



if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.Tenant.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.Tenant} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.Tenant.toObject = function(includeInstance, msg) {
  var f, obj = {
    tenantId: jspb.Message.getFieldWithDefault(msg, 1, 0),
    clientName: jspb.Message.getFieldWithDefault(msg, 2, ""),
    requesterEmail: jspb.Message.getFieldWithDefault(msg, 4, ""),
    adminFirstName: jspb.Message.getFieldWithDefault(msg, 5, ""),
    adminLastName: jspb.Message.getFieldWithDefault(msg, 6, ""),
    adminEmail: jspb.Message.getFieldWithDefault(msg, 7, ""),
    adminUsername: jspb.Message.getFieldWithDefault(msg, 8, ""),
    adminPassword: jspb.Message.getFieldWithDefault(msg, 9, ""),
    tenantStatus: jspb.Message.getFieldWithDefault(msg, 10, 0),
    contactsList: (f = jspb.Message.getRepeatedField(msg, 11)) == null ? undefined : f,
    redirectUrisList: (f = jspb.Message.getRepeatedField(msg, 12)) == null ? undefined : f,
    clientUri: jspb.Message.getFieldWithDefault(msg, 13, ""),
    scope: jspb.Message.getFieldWithDefault(msg, 14, ""),
    domain: jspb.Message.getFieldWithDefault(msg, 15, ""),
    comment: jspb.Message.getFieldWithDefault(msg, 16, ""),
    logoUri: jspb.Message.getFieldWithDefault(msg, 17, ""),
    parentTenantId: jspb.Message.getFieldWithDefault(msg, 18, 0),
    applicationType: jspb.Message.getFieldWithDefault(msg, 19, ""),
    tokenEndpointAuthMethod: jspb.Message.getFieldWithDefault(msg, 20, ""),
    jwksUri: jspb.Message.getFieldWithDefault(msg, 21, ""),
    exampleExtensionParameter: jspb.Message.getFieldWithDefault(msg, 22, ""),
    tosUri: jspb.Message.getFieldWithDefault(msg, 23, ""),
    policyUri: jspb.Message.getFieldWithDefault(msg, 24, ""),
    jwksMap: (f = msg.getJwksMap()) ? f.toObject(includeInstance, undefined) : [],
    softwareId: jspb.Message.getFieldWithDefault(msg, 26, ""),
    softwareVersion: jspb.Message.getFieldWithDefault(msg, 27, ""),
    refeshTokenLifetime: jspb.Message.getFieldWithDefault(msg, 28, 0),
    clientId: jspb.Message.getFieldWithDefault(msg, 29, "")
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.Tenant;
  return proto.org.apache.custos.tenant.profile.service.Tenant.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.Tenant} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = /** @type {number} */ (reader.readInt64());
      msg.setTenantId(value);
      break;
    case 2:
      var value = /** @type {string} */ (reader.readString());
      msg.setClientName(value);
      break;
    case 4:
      var value = /** @type {string} */ (reader.readString());
      msg.setRequesterEmail(value);
      break;
    case 5:
      var value = /** @type {string} */ (reader.readString());
      msg.setAdminFirstName(value);
      break;
    case 6:
      var value = /** @type {string} */ (reader.readString());
      msg.setAdminLastName(value);
      break;
    case 7:
      var value = /** @type {string} */ (reader.readString());
      msg.setAdminEmail(value);
      break;
    case 8:
      var value = /** @type {string} */ (reader.readString());
      msg.setAdminUsername(value);
      break;
    case 9:
      var value = /** @type {string} */ (reader.readString());
      msg.setAdminPassword(value);
      break;
    case 10:
      var value = /** @type {!proto.org.apache.custos.tenant.profile.service.TenantStatus} */ (reader.readEnum());
      msg.setTenantStatus(value);
      break;
    case 11:
      var value = /** @type {string} */ (reader.readString());
      msg.addContacts(value);
      break;
    case 12:
      var value = /** @type {string} */ (reader.readString());
      msg.addRedirectUris(value);
      break;
    case 13:
      var value = /** @type {string} */ (reader.readString());
      msg.setClientUri(value);
      break;
    case 14:
      var value = /** @type {string} */ (reader.readString());
      msg.setScope(value);
      break;
    case 15:
      var value = /** @type {string} */ (reader.readString());
      msg.setDomain(value);
      break;
    case 16:
      var value = /** @type {string} */ (reader.readString());
      msg.setComment(value);
      break;
    case 17:
      var value = /** @type {string} */ (reader.readString());
      msg.setLogoUri(value);
      break;
    case 18:
      var value = /** @type {number} */ (reader.readInt64());
      msg.setParentTenantId(value);
      break;
    case 19:
      var value = /** @type {string} */ (reader.readString());
      msg.setApplicationType(value);
      break;
    case 20:
      var value = /** @type {string} */ (reader.readString());
      msg.setTokenEndpointAuthMethod(value);
      break;
    case 21:
      var value = /** @type {string} */ (reader.readString());
      msg.setJwksUri(value);
      break;
    case 22:
      var value = /** @type {string} */ (reader.readString());
      msg.setExampleExtensionParameter(value);
      break;
    case 23:
      var value = /** @type {string} */ (reader.readString());
      msg.setTosUri(value);
      break;
    case 24:
      var value = /** @type {string} */ (reader.readString());
      msg.setPolicyUri(value);
      break;
    case 25:
      var value = msg.getJwksMap();
      reader.readMessage(value, function(message, reader) {
        jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", "");
         });
      break;
    case 26:
      var value = /** @type {string} */ (reader.readString());
      msg.setSoftwareId(value);
      break;
    case 27:
      var value = /** @type {string} */ (reader.readString());
      msg.setSoftwareVersion(value);
      break;
    case 28:
      var value = /** @type {number} */ (reader.readInt64());
      msg.setRefeshTokenLifetime(value);
      break;
    case 29:
      var value = /** @type {string} */ (reader.readString());
      msg.setClientId(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.Tenant.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.Tenant} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.Tenant.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getTenantId();
  if (f !== 0) {
    writer.writeInt64(
      1,
      f
    );
  }
  f = message.getClientName();
  if (f.length > 0) {
    writer.writeString(
      2,
      f
    );
  }
  f = message.getRequesterEmail();
  if (f.length > 0) {
    writer.writeString(
      4,
      f
    );
  }
  f = message.getAdminFirstName();
  if (f.length > 0) {
    writer.writeString(
      5,
      f
    );
  }
  f = message.getAdminLastName();
  if (f.length > 0) {
    writer.writeString(
      6,
      f
    );
  }
  f = message.getAdminEmail();
  if (f.length > 0) {
    writer.writeString(
      7,
      f
    );
  }
  f = message.getAdminUsername();
  if (f.length > 0) {
    writer.writeString(
      8,
      f
    );
  }
  f = message.getAdminPassword();
  if (f.length > 0) {
    writer.writeString(
      9,
      f
    );
  }
  f = message.getTenantStatus();
  if (f !== 0.0) {
    writer.writeEnum(
      10,
      f
    );
  }
  f = message.getContactsList();
  if (f.length > 0) {
    writer.writeRepeatedString(
      11,
      f
    );
  }
  f = message.getRedirectUrisList();
  if (f.length > 0) {
    writer.writeRepeatedString(
      12,
      f
    );
  }
  f = message.getClientUri();
  if (f.length > 0) {
    writer.writeString(
      13,
      f
    );
  }
  f = message.getScope();
  if (f.length > 0) {
    writer.writeString(
      14,
      f
    );
  }
  f = message.getDomain();
  if (f.length > 0) {
    writer.writeString(
      15,
      f
    );
  }
  f = message.getComment();
  if (f.length > 0) {
    writer.writeString(
      16,
      f
    );
  }
  f = message.getLogoUri();
  if (f.length > 0) {
    writer.writeString(
      17,
      f
    );
  }
  f = message.getParentTenantId();
  if (f !== 0) {
    writer.writeInt64(
      18,
      f
    );
  }
  f = message.getApplicationType();
  if (f.length > 0) {
    writer.writeString(
      19,
      f
    );
  }
  f = message.getTokenEndpointAuthMethod();
  if (f.length > 0) {
    writer.writeString(
      20,
      f
    );
  }
  f = message.getJwksUri();
  if (f.length > 0) {
    writer.writeString(
      21,
      f
    );
  }
  f = message.getExampleExtensionParameter();
  if (f.length > 0) {
    writer.writeString(
      22,
      f
    );
  }
  f = message.getTosUri();
  if (f.length > 0) {
    writer.writeString(
      23,
      f
    );
  }
  f = message.getPolicyUri();
  if (f.length > 0) {
    writer.writeString(
      24,
      f
    );
  }
  f = message.getJwksMap(true);
  if (f && f.getLength() > 0) {
    f.serializeBinary(25, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString);
  }
  f = message.getSoftwareId();
  if (f.length > 0) {
    writer.writeString(
      26,
      f
    );
  }
  f = message.getSoftwareVersion();
  if (f.length > 0) {
    writer.writeString(
      27,
      f
    );
  }
  f = message.getRefeshTokenLifetime();
  if (f !== 0) {
    writer.writeInt64(
      28,
      f
    );
  }
  f = message.getClientId();
  if (f.length > 0) {
    writer.writeString(
      29,
      f
    );
  }
};


/**
 * optional int64 tenant_id = 1;
 * @return {number}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getTenantId = function() {
  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
};


/**
 * @param {number} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setTenantId = function(value) {
  return jspb.Message.setProto3IntField(this, 1, value);
};


/**
 * optional string client_name = 2;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getClientName = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setClientName = function(value) {
  return jspb.Message.setProto3StringField(this, 2, value);
};


/**
 * optional string requester_email = 4;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getRequesterEmail = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setRequesterEmail = function(value) {
  return jspb.Message.setProto3StringField(this, 4, value);
};


/**
 * optional string admin_first_name = 5;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getAdminFirstName = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setAdminFirstName = function(value) {
  return jspb.Message.setProto3StringField(this, 5, value);
};


/**
 * optional string admin_last_name = 6;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getAdminLastName = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setAdminLastName = function(value) {
  return jspb.Message.setProto3StringField(this, 6, value);
};


/**
 * optional string admin_email = 7;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getAdminEmail = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setAdminEmail = function(value) {
  return jspb.Message.setProto3StringField(this, 7, value);
};


/**
 * optional string admin_username = 8;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getAdminUsername = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 8, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setAdminUsername = function(value) {
  return jspb.Message.setProto3StringField(this, 8, value);
};


/**
 * optional string admin_password = 9;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getAdminPassword = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 9, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setAdminPassword = function(value) {
  return jspb.Message.setProto3StringField(this, 9, value);
};


/**
 * optional TenantStatus tenant_status = 10;
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantStatus}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getTenantStatus = function() {
  return /** @type {!proto.org.apache.custos.tenant.profile.service.TenantStatus} */ (jspb.Message.getFieldWithDefault(this, 10, 0));
};


/**
 * @param {!proto.org.apache.custos.tenant.profile.service.TenantStatus} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setTenantStatus = function(value) {
  return jspb.Message.setProto3EnumField(this, 10, value);
};


/**
 * repeated string contacts = 11;
 * @return {!Array<string>}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getContactsList = function() {
  return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 11));
};


/**
 * @param {!Array<string>} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setContactsList = function(value) {
  return jspb.Message.setField(this, 11, value || []);
};


/**
 * @param {string} value
 * @param {number=} opt_index
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.addContacts = function(value, opt_index) {
  return jspb.Message.addToRepeatedField(this, 11, value, opt_index);
};


/**
 * Clears the list making it empty but non-null.
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.clearContactsList = function() {
  return this.setContactsList([]);
};


/**
 * repeated string redirect_uris = 12;
 * @return {!Array<string>}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getRedirectUrisList = function() {
  return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 12));
};


/**
 * @param {!Array<string>} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setRedirectUrisList = function(value) {
  return jspb.Message.setField(this, 12, value || []);
};


/**
 * @param {string} value
 * @param {number=} opt_index
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.addRedirectUris = function(value, opt_index) {
  return jspb.Message.addToRepeatedField(this, 12, value, opt_index);
};


/**
 * Clears the list making it empty but non-null.
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.clearRedirectUrisList = function() {
  return this.setRedirectUrisList([]);
};


/**
 * optional string client_uri = 13;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getClientUri = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 13, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setClientUri = function(value) {
  return jspb.Message.setProto3StringField(this, 13, value);
};


/**
 * optional string scope = 14;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getScope = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 14, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setScope = function(value) {
  return jspb.Message.setProto3StringField(this, 14, value);
};


/**
 * optional string domain = 15;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getDomain = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 15, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setDomain = function(value) {
  return jspb.Message.setProto3StringField(this, 15, value);
};


/**
 * optional string comment = 16;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getComment = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 16, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setComment = function(value) {
  return jspb.Message.setProto3StringField(this, 16, value);
};


/**
 * optional string logo_uri = 17;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getLogoUri = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 17, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setLogoUri = function(value) {
  return jspb.Message.setProto3StringField(this, 17, value);
};


/**
 * optional int64 parent_tenant_id = 18;
 * @return {number}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getParentTenantId = function() {
  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 18, 0));
};


/**
 * @param {number} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setParentTenantId = function(value) {
  return jspb.Message.setProto3IntField(this, 18, value);
};


/**
 * optional string application_type = 19;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getApplicationType = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 19, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setApplicationType = function(value) {
  return jspb.Message.setProto3StringField(this, 19, value);
};


/**
 * optional string token_endpoint_auth_method = 20;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getTokenEndpointAuthMethod = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 20, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setTokenEndpointAuthMethod = function(value) {
  return jspb.Message.setProto3StringField(this, 20, value);
};


/**
 * optional string jwks_uri = 21;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getJwksUri = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 21, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setJwksUri = function(value) {
  return jspb.Message.setProto3StringField(this, 21, value);
};


/**
 * optional string example_extension_parameter = 22;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getExampleExtensionParameter = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 22, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setExampleExtensionParameter = function(value) {
  return jspb.Message.setProto3StringField(this, 22, value);
};


/**
 * optional string tos_uri = 23;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getTosUri = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 23, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setTosUri = function(value) {
  return jspb.Message.setProto3StringField(this, 23, value);
};


/**
 * optional string policy_uri = 24;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getPolicyUri = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 24, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setPolicyUri = function(value) {
  return jspb.Message.setProto3StringField(this, 24, value);
};


/**
 * map<string, string> jwks = 25;
 * @param {boolean=} opt_noLazyCreate Do not create the map if
 * empty, instead returning `undefined`
 * @return {!jspb.Map<string,string>}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getJwksMap = function(opt_noLazyCreate) {
  return /** @type {!jspb.Map<string,string>} */ (
      jspb.Message.getMapField(this, 25, opt_noLazyCreate,
      null));
};


/**
 * Clears values from the map. The map will be non-null.
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.clearJwksMap = function() {
  this.getJwksMap().clear();
  return this;};


/**
 * optional string software_id = 26;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getSoftwareId = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 26, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setSoftwareId = function(value) {
  return jspb.Message.setProto3StringField(this, 26, value);
};


/**
 * optional string software_version = 27;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getSoftwareVersion = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 27, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setSoftwareVersion = function(value) {
  return jspb.Message.setProto3StringField(this, 27, value);
};


/**
 * optional int64 refesh_token_lifetime = 28;
 * @return {number}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getRefeshTokenLifetime = function() {
  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 28, 0));
};


/**
 * @param {number} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setRefeshTokenLifetime = function(value) {
  return jspb.Message.setProto3IntField(this, 28, value);
};


/**
 * optional string client_id = 29;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.getClientId = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 29, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant} returns this
 */
proto.org.apache.custos.tenant.profile.service.Tenant.prototype.setClientId = function(value) {
  return jspb.Message.setProto3StringField(this, 29, value);
};





if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.toObject = function(includeInstance, msg) {
  var f, obj = {
    updatedattribute: jspb.Message.getFieldWithDefault(msg, 1, ""),
    updatedattributevalue: jspb.Message.getFieldWithDefault(msg, 2, ""),
    updatedby: jspb.Message.getFieldWithDefault(msg, 3, ""),
    updatedat: jspb.Message.getFieldWithDefault(msg, 4, "")
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata}
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata;
  return proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata}
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = /** @type {string} */ (reader.readString());
      msg.setUpdatedattribute(value);
      break;
    case 2:
      var value = /** @type {string} */ (reader.readString());
      msg.setUpdatedattributevalue(value);
      break;
    case 3:
      var value = /** @type {string} */ (reader.readString());
      msg.setUpdatedby(value);
      break;
    case 4:
      var value = /** @type {string} */ (reader.readString());
      msg.setUpdatedat(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getUpdatedattribute();
  if (f.length > 0) {
    writer.writeString(
      1,
      f
    );
  }
  f = message.getUpdatedattributevalue();
  if (f.length > 0) {
    writer.writeString(
      2,
      f
    );
  }
  f = message.getUpdatedby();
  if (f.length > 0) {
    writer.writeString(
      3,
      f
    );
  }
  f = message.getUpdatedat();
  if (f.length > 0) {
    writer.writeString(
      4,
      f
    );
  }
};


/**
 * optional string updatedAttribute = 1;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.prototype.getUpdatedattribute = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata} returns this
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.prototype.setUpdatedattribute = function(value) {
  return jspb.Message.setProto3StringField(this, 1, value);
};


/**
 * optional string updatedAttributeValue = 2;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.prototype.getUpdatedattributevalue = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata} returns this
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.prototype.setUpdatedattributevalue = function(value) {
  return jspb.Message.setProto3StringField(this, 2, value);
};


/**
 * optional string updatedBy = 3;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.prototype.getUpdatedby = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata} returns this
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.prototype.setUpdatedby = function(value) {
  return jspb.Message.setProto3StringField(this, 3, value);
};


/**
 * optional string updatedAt = 4;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.prototype.getUpdatedat = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata} returns this
 */
proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.prototype.setUpdatedat = function(value) {
  return jspb.Message.setProto3StringField(this, 4, value);
};





if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.toObject = function(includeInstance, msg) {
  var f, obj = {
    updatedstatus: jspb.Message.getFieldWithDefault(msg, 1, 0),
    updatedby: jspb.Message.getFieldWithDefault(msg, 2, ""),
    updatedat: jspb.Message.getFieldWithDefault(msg, 3, "")
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata}
 */
proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata;
  return proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata}
 */
proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = /** @type {!proto.org.apache.custos.tenant.profile.service.TenantStatus} */ (reader.readEnum());
      msg.setUpdatedstatus(value);
      break;
    case 2:
      var value = /** @type {string} */ (reader.readString());
      msg.setUpdatedby(value);
      break;
    case 3:
      var value = /** @type {string} */ (reader.readString());
      msg.setUpdatedat(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getUpdatedstatus();
  if (f !== 0.0) {
    writer.writeEnum(
      1,
      f
    );
  }
  f = message.getUpdatedby();
  if (f.length > 0) {
    writer.writeString(
      2,
      f
    );
  }
  f = message.getUpdatedat();
  if (f.length > 0) {
    writer.writeString(
      3,
      f
    );
  }
};


/**
 * optional TenantStatus updatedStatus = 1;
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantStatus}
 */
proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.prototype.getUpdatedstatus = function() {
  return /** @type {!proto.org.apache.custos.tenant.profile.service.TenantStatus} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
};


/**
 * @param {!proto.org.apache.custos.tenant.profile.service.TenantStatus} value
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata} returns this
 */
proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.prototype.setUpdatedstatus = function(value) {
  return jspb.Message.setProto3EnumField(this, 1, value);
};


/**
 * optional string updatedBy = 2;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.prototype.getUpdatedby = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata} returns this
 */
proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.prototype.setUpdatedby = function(value) {
  return jspb.Message.setProto3StringField(this, 2, value);
};


/**
 * optional string updatedAt = 3;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.prototype.getUpdatedat = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata} returns this
 */
proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.prototype.setUpdatedat = function(value) {
  return jspb.Message.setProto3StringField(this, 3, value);
};





if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.AddTenantResponse.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.AddTenantResponse.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.AddTenantResponse} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.AddTenantResponse.toObject = function(includeInstance, msg) {
  var f, obj = {
    tenantid: jspb.Message.getFieldWithDefault(msg, 1, 0)
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.AddTenantResponse}
 */
proto.org.apache.custos.tenant.profile.service.AddTenantResponse.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.AddTenantResponse;
  return proto.org.apache.custos.tenant.profile.service.AddTenantResponse.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.AddTenantResponse} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.AddTenantResponse}
 */
proto.org.apache.custos.tenant.profile.service.AddTenantResponse.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = /** @type {number} */ (reader.readInt64());
      msg.setTenantid(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.AddTenantResponse.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.AddTenantResponse.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.AddTenantResponse} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.AddTenantResponse.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getTenantid();
  if (f !== 0) {
    writer.writeInt64(
      1,
      f
    );
  }
};


/**
 * optional int64 tenantId = 1;
 * @return {number}
 */
proto.org.apache.custos.tenant.profile.service.AddTenantResponse.prototype.getTenantid = function() {
  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
};


/**
 * @param {number} value
 * @return {!proto.org.apache.custos.tenant.profile.service.AddTenantResponse} returns this
 */
proto.org.apache.custos.tenant.profile.service.AddTenantResponse.prototype.setTenantid = function(value) {
  return jspb.Message.setProto3IntField(this, 1, value);
};





if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse.toObject = function(includeInstance, msg) {
  var f, obj = {
    tenant: (f = msg.getTenant()) && proto.org.apache.custos.tenant.profile.service.Tenant.toObject(includeInstance, f)
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse}
 */
proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse;
  return proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse}
 */
proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = new proto.org.apache.custos.tenant.profile.service.Tenant;
      reader.readMessage(value,proto.org.apache.custos.tenant.profile.service.Tenant.deserializeBinaryFromReader);
      msg.setTenant(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getTenant();
  if (f != null) {
    writer.writeMessage(
      1,
      f,
      proto.org.apache.custos.tenant.profile.service.Tenant.serializeBinaryToWriter
    );
  }
};


/**
 * optional Tenant tenant = 1;
 * @return {?proto.org.apache.custos.tenant.profile.service.Tenant}
 */
proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse.prototype.getTenant = function() {
  return /** @type{?proto.org.apache.custos.tenant.profile.service.Tenant} */ (
    jspb.Message.getWrapperField(this, proto.org.apache.custos.tenant.profile.service.Tenant, 1));
};


/**
 * @param {?proto.org.apache.custos.tenant.profile.service.Tenant|undefined} value
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse} returns this
*/
proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse.prototype.setTenant = function(value) {
  return jspb.Message.setWrapperField(this, 1, value);
};


/**
 * Clears the message field making it undefined.
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse} returns this
 */
proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse.prototype.clearTenant = function() {
  return this.setTenant(undefined);
};


/**
 * Returns whether this field is set.
 * @return {boolean}
 */
proto.org.apache.custos.tenant.profile.service.UpdateTenantResponse.prototype.hasTenant = function() {
  return jspb.Message.getField(this, 1) != null;
};





if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantRequest.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.GetTenantRequest.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.GetTenantRequest} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetTenantRequest.toObject = function(includeInstance, msg) {
  var f, obj = {
    tenantid: jspb.Message.getFieldWithDefault(msg, 1, 0)
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetTenantRequest}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantRequest.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.GetTenantRequest;
  return proto.org.apache.custos.tenant.profile.service.GetTenantRequest.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetTenantRequest} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetTenantRequest}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantRequest.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = /** @type {number} */ (reader.readInt64());
      msg.setTenantid(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantRequest.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.GetTenantRequest.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetTenantRequest} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetTenantRequest.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getTenantid();
  if (f !== 0) {
    writer.writeInt64(
      1,
      f
    );
  }
};


/**
 * optional int64 tenantId = 1;
 * @return {number}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantRequest.prototype.getTenantid = function() {
  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
};


/**
 * @param {number} value
 * @return {!proto.org.apache.custos.tenant.profile.service.GetTenantRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.GetTenantRequest.prototype.setTenantid = function(value) {
  return jspb.Message.setProto3IntField(this, 1, value);
};





if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantResponse.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.GetTenantResponse.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.GetTenantResponse} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetTenantResponse.toObject = function(includeInstance, msg) {
  var f, obj = {
    tenant: (f = msg.getTenant()) && proto.org.apache.custos.tenant.profile.service.Tenant.toObject(includeInstance, f)
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetTenantResponse}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantResponse.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.GetTenantResponse;
  return proto.org.apache.custos.tenant.profile.service.GetTenantResponse.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetTenantResponse} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetTenantResponse}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantResponse.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = new proto.org.apache.custos.tenant.profile.service.Tenant;
      reader.readMessage(value,proto.org.apache.custos.tenant.profile.service.Tenant.deserializeBinaryFromReader);
      msg.setTenant(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantResponse.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.GetTenantResponse.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetTenantResponse} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetTenantResponse.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getTenant();
  if (f != null) {
    writer.writeMessage(
      1,
      f,
      proto.org.apache.custos.tenant.profile.service.Tenant.serializeBinaryToWriter
    );
  }
};


/**
 * optional Tenant tenant = 1;
 * @return {?proto.org.apache.custos.tenant.profile.service.Tenant}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantResponse.prototype.getTenant = function() {
  return /** @type{?proto.org.apache.custos.tenant.profile.service.Tenant} */ (
    jspb.Message.getWrapperField(this, proto.org.apache.custos.tenant.profile.service.Tenant, 1));
};


/**
 * @param {?proto.org.apache.custos.tenant.profile.service.Tenant|undefined} value
 * @return {!proto.org.apache.custos.tenant.profile.service.GetTenantResponse} returns this
*/
proto.org.apache.custos.tenant.profile.service.GetTenantResponse.prototype.setTenant = function(value) {
  return jspb.Message.setWrapperField(this, 1, value);
};


/**
 * Clears the message field making it undefined.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetTenantResponse} returns this
 */
proto.org.apache.custos.tenant.profile.service.GetTenantResponse.prototype.clearTenant = function() {
  return this.setTenant(undefined);
};


/**
 * Returns whether this field is set.
 * @return {boolean}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantResponse.prototype.hasTenant = function() {
  return jspb.Message.getField(this, 1) != null;
};



/**
 * List of repeated fields within this message type.
 * @private {!Array<number>}
 * @const
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.repeatedFields_ = [1];



if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.toObject = function(includeInstance, msg) {
  var f, obj = {
    tenantList: jspb.Message.toObjectList(msg.getTenantList(),
    proto.org.apache.custos.tenant.profile.service.Tenant.toObject, includeInstance)
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse;
  return proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = new proto.org.apache.custos.tenant.profile.service.Tenant;
      reader.readMessage(value,proto.org.apache.custos.tenant.profile.service.Tenant.deserializeBinaryFromReader);
      msg.addTenant(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getTenantList();
  if (f.length > 0) {
    writer.writeRepeatedMessage(
      1,
      f,
      proto.org.apache.custos.tenant.profile.service.Tenant.serializeBinaryToWriter
    );
  }
};


/**
 * repeated Tenant tenant = 1;
 * @return {!Array<!proto.org.apache.custos.tenant.profile.service.Tenant>}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.prototype.getTenantList = function() {
  return /** @type{!Array<!proto.org.apache.custos.tenant.profile.service.Tenant>} */ (
    jspb.Message.getRepeatedWrapperField(this, proto.org.apache.custos.tenant.profile.service.Tenant, 1));
};


/**
 * @param {!Array<!proto.org.apache.custos.tenant.profile.service.Tenant>} value
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse} returns this
*/
proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.prototype.setTenantList = function(value) {
  return jspb.Message.setRepeatedWrapperField(this, 1, value);
};


/**
 * @param {!proto.org.apache.custos.tenant.profile.service.Tenant=} opt_value
 * @param {number=} opt_index
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.prototype.addTenant = function(opt_value, opt_index) {
  return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.apache.custos.tenant.profile.service.Tenant, opt_index);
};


/**
 * Clears the list making it empty but non-null.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse} returns this
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsResponse.prototype.clearTenantList = function() {
  return this.setTenantList([]);
};





if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest.toObject = function(includeInstance, msg) {
  var f, obj = {
    tenantid: jspb.Message.getFieldWithDefault(msg, 1, 0)
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest}
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest;
  return proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest}
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = /** @type {number} */ (reader.readInt64());
      msg.setTenantid(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getTenantid();
  if (f !== 0) {
    writer.writeInt64(
      1,
      f
    );
  }
};


/**
 * optional int64 tenantId = 1;
 * @return {number}
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest.prototype.getTenantid = function() {
  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
};


/**
 * @param {number} value
 * @return {!proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistRequest.prototype.setTenantid = function(value) {
  return jspb.Message.setProto3IntField(this, 1, value);
};





if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse.toObject = function(includeInstance, msg) {
  var f, obj = {
    isexist: jspb.Message.getBooleanFieldWithDefault(msg, 1, false)
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse}
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse;
  return proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse}
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = /** @type {boolean} */ (reader.readBool());
      msg.setIsexist(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getIsexist();
  if (f) {
    writer.writeBool(
      1,
      f
    );
  }
};


/**
 * optional bool isExist = 1;
 * @return {boolean}
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse.prototype.getIsexist = function() {
  return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false));
};


/**
 * @param {boolean} value
 * @return {!proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse} returns this
 */
proto.org.apache.custos.tenant.profile.service.IsTenantExistResponse.prototype.setIsexist = function(value) {
  return jspb.Message.setProto3BooleanField(this, 1, value);
};





if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.toObject = function(includeInstance, msg) {
  var f, obj = {
    requesteremail: jspb.Message.getFieldWithDefault(msg, 1, "")
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest;
  return proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = /** @type {string} */ (reader.readString());
      msg.setRequesteremail(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getRequesteremail();
  if (f.length > 0) {
    writer.writeString(
      1,
      f
    );
  }
};


/**
 * optional string requesterEmail = 1;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.prototype.getRequesteremail = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.prototype.setRequesteremail = function(value) {
  return jspb.Message.setProto3StringField(this, 1, value);
};



/**
 * List of repeated fields within this message type.
 * @private {!Array<number>}
 * @const
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.repeatedFields_ = [1];



if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.toObject = function(includeInstance, msg) {
  var f, obj = {
    tenantList: jspb.Message.toObjectList(msg.getTenantList(),
    proto.org.apache.custos.tenant.profile.service.Tenant.toObject, includeInstance)
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse;
  return proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = new proto.org.apache.custos.tenant.profile.service.Tenant;
      reader.readMessage(value,proto.org.apache.custos.tenant.profile.service.Tenant.deserializeBinaryFromReader);
      msg.addTenant(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getTenantList();
  if (f.length > 0) {
    writer.writeRepeatedMessage(
      1,
      f,
      proto.org.apache.custos.tenant.profile.service.Tenant.serializeBinaryToWriter
    );
  }
};


/**
 * repeated Tenant tenant = 1;
 * @return {!Array<!proto.org.apache.custos.tenant.profile.service.Tenant>}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.prototype.getTenantList = function() {
  return /** @type{!Array<!proto.org.apache.custos.tenant.profile.service.Tenant>} */ (
    jspb.Message.getRepeatedWrapperField(this, proto.org.apache.custos.tenant.profile.service.Tenant, 1));
};


/**
 * @param {!Array<!proto.org.apache.custos.tenant.profile.service.Tenant>} value
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse} returns this
*/
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.prototype.setTenantList = function(value) {
  return jspb.Message.setRepeatedWrapperField(this, 1, value);
};


/**
 * @param {!proto.org.apache.custos.tenant.profile.service.Tenant=} opt_value
 * @param {number=} opt_index
 * @return {!proto.org.apache.custos.tenant.profile.service.Tenant}
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.prototype.addTenant = function(opt_value, opt_index) {
  return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.apache.custos.tenant.profile.service.Tenant, opt_index);
};


/**
 * Clears the list making it empty but non-null.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse} returns this
 */
proto.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.prototype.clearTenantList = function() {
  return this.setTenantList([]);
};





if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.toObject = function(includeInstance, msg) {
  var f, obj = {
    clientId: jspb.Message.getFieldWithDefault(msg, 1, ""),
    status: jspb.Message.getFieldWithDefault(msg, 2, 0),
    updatedby: jspb.Message.getFieldWithDefault(msg, 3, ""),
    tenantid: jspb.Message.getFieldWithDefault(msg, 4, 0),
    superTenant: jspb.Message.getBooleanFieldWithDefault(msg, 5, false),
    accesstoken: jspb.Message.getFieldWithDefault(msg, 6, "")
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest;
  return proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = /** @type {string} */ (reader.readString());
      msg.setClientId(value);
      break;
    case 2:
      var value = /** @type {!proto.org.apache.custos.tenant.profile.service.TenantStatus} */ (reader.readEnum());
      msg.setStatus(value);
      break;
    case 3:
      var value = /** @type {string} */ (reader.readString());
      msg.setUpdatedby(value);
      break;
    case 4:
      var value = /** @type {number} */ (reader.readInt64());
      msg.setTenantid(value);
      break;
    case 5:
      var value = /** @type {boolean} */ (reader.readBool());
      msg.setSuperTenant(value);
      break;
    case 6:
      var value = /** @type {string} */ (reader.readString());
      msg.setAccesstoken(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getClientId();
  if (f.length > 0) {
    writer.writeString(
      1,
      f
    );
  }
  f = message.getStatus();
  if (f !== 0.0) {
    writer.writeEnum(
      2,
      f
    );
  }
  f = message.getUpdatedby();
  if (f.length > 0) {
    writer.writeString(
      3,
      f
    );
  }
  f = message.getTenantid();
  if (f !== 0) {
    writer.writeInt64(
      4,
      f
    );
  }
  f = message.getSuperTenant();
  if (f) {
    writer.writeBool(
      5,
      f
    );
  }
  f = message.getAccesstoken();
  if (f.length > 0) {
    writer.writeString(
      6,
      f
    );
  }
};


/**
 * optional string client_id = 1;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.prototype.getClientId = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.prototype.setClientId = function(value) {
  return jspb.Message.setProto3StringField(this, 1, value);
};


/**
 * optional TenantStatus status = 2;
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantStatus}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.prototype.getStatus = function() {
  return /** @type {!proto.org.apache.custos.tenant.profile.service.TenantStatus} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
};


/**
 * @param {!proto.org.apache.custos.tenant.profile.service.TenantStatus} value
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.prototype.setStatus = function(value) {
  return jspb.Message.setProto3EnumField(this, 2, value);
};


/**
 * optional string updatedBy = 3;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.prototype.getUpdatedby = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.prototype.setUpdatedby = function(value) {
  return jspb.Message.setProto3StringField(this, 3, value);
};


/**
 * optional int64 tenantId = 4;
 * @return {number}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.prototype.getTenantid = function() {
  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
};


/**
 * @param {number} value
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.prototype.setTenantid = function(value) {
  return jspb.Message.setProto3IntField(this, 4, value);
};


/**
 * optional bool super_tenant = 5;
 * @return {boolean}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.prototype.getSuperTenant = function() {
  return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false));
};


/**
 * @param {boolean} value
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.prototype.setSuperTenant = function(value) {
  return jspb.Message.setProto3BooleanField(this, 5, value);
};


/**
 * optional string accessToken = 6;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.prototype.getAccesstoken = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusRequest.prototype.setAccesstoken = function(value) {
  return jspb.Message.setProto3StringField(this, 6, value);
};





if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse.toObject = function(includeInstance, msg) {
  var f, obj = {
    tenantid: jspb.Message.getFieldWithDefault(msg, 1, 0),
    status: jspb.Message.getFieldWithDefault(msg, 2, 0)
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse;
  return proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = /** @type {number} */ (reader.readInt64());
      msg.setTenantid(value);
      break;
    case 2:
      var value = /** @type {!proto.org.apache.custos.tenant.profile.service.TenantStatus} */ (reader.readEnum());
      msg.setStatus(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getTenantid();
  if (f !== 0) {
    writer.writeInt64(
      1,
      f
    );
  }
  f = message.getStatus();
  if (f !== 0.0) {
    writer.writeEnum(
      2,
      f
    );
  }
};


/**
 * optional int64 tenantId = 1;
 * @return {number}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse.prototype.getTenantid = function() {
  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
};


/**
 * @param {number} value
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse} returns this
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse.prototype.setTenantid = function(value) {
  return jspb.Message.setProto3IntField(this, 1, value);
};


/**
 * optional TenantStatus status = 2;
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantStatus}
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse.prototype.getStatus = function() {
  return /** @type {!proto.org.apache.custos.tenant.profile.service.TenantStatus} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
};


/**
 * @param {!proto.org.apache.custos.tenant.profile.service.TenantStatus} value
 * @return {!proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse} returns this
 */
proto.org.apache.custos.tenant.profile.service.UpdateStatusResponse.prototype.setStatus = function(value) {
  return jspb.Message.setProto3EnumField(this, 2, value);
};





if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest.toObject = function(includeInstance, msg) {
  var f, obj = {
    tenantid: jspb.Message.getFieldWithDefault(msg, 1, 0)
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest}
 */
proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest;
  return proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest}
 */
proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = /** @type {number} */ (reader.readInt64());
      msg.setTenantid(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getTenantid();
  if (f !== 0) {
    writer.writeInt64(
      1,
      f
    );
  }
};


/**
 * optional int64 tenantId = 1;
 * @return {number}
 */
proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest.prototype.getTenantid = function() {
  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
};


/**
 * @param {number} value
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.GetAuditTrailRequest.prototype.setTenantid = function(value) {
  return jspb.Message.setProto3IntField(this, 1, value);
};



/**
 * List of repeated fields within this message type.
 * @private {!Array<number>}
 * @const
 */
proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.repeatedFields_ = [1];



if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.toObject = function(includeInstance, msg) {
  var f, obj = {
    metadataList: jspb.Message.toObjectList(msg.getMetadataList(),
    proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.toObject, includeInstance)
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse}
 */
proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse;
  return proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse}
 */
proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = new proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata;
      reader.readMessage(value,proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.deserializeBinaryFromReader);
      msg.addMetadata(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getMetadataList();
  if (f.length > 0) {
    writer.writeRepeatedMessage(
      1,
      f,
      proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.serializeBinaryToWriter
    );
  }
};


/**
 * repeated TenantStatusUpdateMetadata metadata = 1;
 * @return {!Array<!proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata>}
 */
proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.prototype.getMetadataList = function() {
  return /** @type{!Array<!proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata>} */ (
    jspb.Message.getRepeatedWrapperField(this, proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata, 1));
};


/**
 * @param {!Array<!proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata>} value
 * @return {!proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse} returns this
*/
proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.prototype.setMetadataList = function(value) {
  return jspb.Message.setRepeatedWrapperField(this, 1, value);
};


/**
 * @param {!proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata=} opt_value
 * @param {number=} opt_index
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata}
 */
proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.prototype.addMetadata = function(opt_value, opt_index) {
  return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata, opt_index);
};


/**
 * Clears the list making it empty but non-null.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse} returns this
 */
proto.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.prototype.clearMetadataList = function() {
  return this.setMetadataList([]);
};



/**
 * List of repeated fields within this message type.
 * @private {!Array<number>}
 * @const
 */
proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.repeatedFields_ = [2];



if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.toObject = function(includeInstance, msg) {
  var f, obj = {
    metadataList: jspb.Message.toObjectList(msg.getMetadataList(),
    proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.toObject, includeInstance)
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse}
 */
proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse;
  return proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse}
 */
proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 2:
      var value = new proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata;
      reader.readMessage(value,proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.deserializeBinaryFromReader);
      msg.addMetadata(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getMetadataList();
  if (f.length > 0) {
    writer.writeRepeatedMessage(
      2,
      f,
      proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.serializeBinaryToWriter
    );
  }
};


/**
 * repeated TenantAttributeUpdateMetadata metadata = 2;
 * @return {!Array<!proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata>}
 */
proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.prototype.getMetadataList = function() {
  return /** @type{!Array<!proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata>} */ (
    jspb.Message.getRepeatedWrapperField(this, proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata, 2));
};


/**
 * @param {!Array<!proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata>} value
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse} returns this
*/
proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.prototype.setMetadataList = function(value) {
  return jspb.Message.setRepeatedWrapperField(this, 2, value);
};


/**
 * @param {!proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata=} opt_value
 * @param {number=} opt_index
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata}
 */
proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.prototype.addMetadata = function(opt_value, opt_index) {
  return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata, opt_index);
};


/**
 * Clears the list making it empty but non-null.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse} returns this
 */
proto.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.prototype.clearMetadataList = function() {
  return this.setMetadataList([]);
};





if (jspb.Message.GENERATE_TO_OBJECT) {
/**
 * Creates an object representation of this proto.
 * Field names that are reserved in JavaScript and will be renamed to pb_name.
 * Optional fields that are not set will be set to undefined.
 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
 * For the list of reserved names please see:
 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
 *     JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @return {!Object}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.prototype.toObject = function(opt_includeInstance) {
  return proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.toObject(opt_includeInstance, this);
};


/**
 * Static version of the {@see toObject} method.
 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
 *     the JSPB instance for transitional soy proto support:
 *     http://goto/soy-param-migration
 * @param {!proto.org.apache.custos.tenant.profile.service.GetTenantsRequest} msg The msg instance to transform.
 * @return {!Object}
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.toObject = function(includeInstance, msg) {
  var f, obj = {
    offset: jspb.Message.getFieldWithDefault(msg, 1, 0),
    limit: jspb.Message.getFieldWithDefault(msg, 2, 0),
    parentId: jspb.Message.getFieldWithDefault(msg, 3, 0),
    status: jspb.Message.getFieldWithDefault(msg, 4, 0),
    requesterEmail: jspb.Message.getFieldWithDefault(msg, 5, "")
  };

  if (includeInstance) {
    obj.$jspbMessageInstance = msg;
  }
  return obj;
};
}


/**
 * Deserializes binary data (in protobuf wire format).
 * @param {jspb.ByteSource} bytes The bytes to deserialize.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetTenantsRequest}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.deserializeBinary = function(bytes) {
  var reader = new jspb.BinaryReader(bytes);
  var msg = new proto.org.apache.custos.tenant.profile.service.GetTenantsRequest;
  return proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.deserializeBinaryFromReader(msg, reader);
};


/**
 * Deserializes binary data (in protobuf wire format) from the
 * given reader into the given message object.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetTenantsRequest} msg The message object to deserialize into.
 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
 * @return {!proto.org.apache.custos.tenant.profile.service.GetTenantsRequest}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.deserializeBinaryFromReader = function(msg, reader) {
  while (reader.nextField()) {
    if (reader.isEndGroup()) {
      break;
    }
    var field = reader.getFieldNumber();
    switch (field) {
    case 1:
      var value = /** @type {number} */ (reader.readInt32());
      msg.setOffset(value);
      break;
    case 2:
      var value = /** @type {number} */ (reader.readInt32());
      msg.setLimit(value);
      break;
    case 3:
      var value = /** @type {number} */ (reader.readInt64());
      msg.setParentId(value);
      break;
    case 4:
      var value = /** @type {!proto.org.apache.custos.tenant.profile.service.TenantStatus} */ (reader.readEnum());
      msg.setStatus(value);
      break;
    case 5:
      var value = /** @type {string} */ (reader.readString());
      msg.setRequesterEmail(value);
      break;
    default:
      reader.skipField();
      break;
    }
  }
  return msg;
};


/**
 * Serializes the message to binary data (in protobuf wire format).
 * @return {!Uint8Array}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.prototype.serializeBinary = function() {
  var writer = new jspb.BinaryWriter();
  proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.serializeBinaryToWriter(this, writer);
  return writer.getResultBuffer();
};


/**
 * Serializes the given message to binary data (in protobuf wire
 * format), writing to the given BinaryWriter.
 * @param {!proto.org.apache.custos.tenant.profile.service.GetTenantsRequest} message
 * @param {!jspb.BinaryWriter} writer
 * @suppress {unusedLocalVariables} f is only used for nested messages
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.serializeBinaryToWriter = function(message, writer) {
  var f = undefined;
  f = message.getOffset();
  if (f !== 0) {
    writer.writeInt32(
      1,
      f
    );
  }
  f = message.getLimit();
  if (f !== 0) {
    writer.writeInt32(
      2,
      f
    );
  }
  f = message.getParentId();
  if (f !== 0) {
    writer.writeInt64(
      3,
      f
    );
  }
  f = message.getStatus();
  if (f !== 0.0) {
    writer.writeEnum(
      4,
      f
    );
  }
  f = message.getRequesterEmail();
  if (f.length > 0) {
    writer.writeString(
      5,
      f
    );
  }
};


/**
 * optional int32 offset = 1;
 * @return {number}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.prototype.getOffset = function() {
  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
};


/**
 * @param {number} value
 * @return {!proto.org.apache.custos.tenant.profile.service.GetTenantsRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.prototype.setOffset = function(value) {
  return jspb.Message.setProto3IntField(this, 1, value);
};


/**
 * optional int32 limit = 2;
 * @return {number}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.prototype.getLimit = function() {
  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
};


/**
 * @param {number} value
 * @return {!proto.org.apache.custos.tenant.profile.service.GetTenantsRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.prototype.setLimit = function(value) {
  return jspb.Message.setProto3IntField(this, 2, value);
};


/**
 * optional int64 parent_id = 3;
 * @return {number}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.prototype.getParentId = function() {
  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
};


/**
 * @param {number} value
 * @return {!proto.org.apache.custos.tenant.profile.service.GetTenantsRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.prototype.setParentId = function(value) {
  return jspb.Message.setProto3IntField(this, 3, value);
};


/**
 * optional TenantStatus status = 4;
 * @return {!proto.org.apache.custos.tenant.profile.service.TenantStatus}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.prototype.getStatus = function() {
  return /** @type {!proto.org.apache.custos.tenant.profile.service.TenantStatus} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
};


/**
 * @param {!proto.org.apache.custos.tenant.profile.service.TenantStatus} value
 * @return {!proto.org.apache.custos.tenant.profile.service.GetTenantsRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.prototype.setStatus = function(value) {
  return jspb.Message.setProto3EnumField(this, 4, value);
};


/**
 * optional string requester_email = 5;
 * @return {string}
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.prototype.getRequesterEmail = function() {
  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
};


/**
 * @param {string} value
 * @return {!proto.org.apache.custos.tenant.profile.service.GetTenantsRequest} returns this
 */
proto.org.apache.custos.tenant.profile.service.GetTenantsRequest.prototype.setRequesterEmail = function(value) {
  return jspb.Message.setProto3StringField(this, 5, value);
};


/**
 * @enum {number}
 */
proto.org.apache.custos.tenant.profile.service.TenantStatus = {
  REQUESTED: 0,
  APPROVED: 1,
  DENIED: 2,
  CANCELLED: 3,
  ACTIVE: 4,
  DEACTIVATED: 5
};

goog.object.extend(exports, proto.org.apache.custos.tenant.profile.service);
