// Generated by the protocol buffer compiler.  DO NOT EDIT!

#import "Identification_profile.pb.h"
// @@protoc_insertion_point(imports)

@implementation IdentificationProfileRoot
static PBExtensionRegistry* extensionRegistry = nil;
+ (PBExtensionRegistry*) extensionRegistry {
  return extensionRegistry;
}

+ (void) initialize {
  if (self == [IdentificationProfileRoot class]) {
    PBMutableExtensionRegistry* registry = [PBMutableExtensionRegistry registry];
    [self registerAllExtensions:registry];
    extensionRegistry = registry;
  }
}
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry {
}
@end

@interface IdentificationProfile ()
@property (strong) NSString* deviceId;
@property UInt64 nodeIdentifier;
@property (strong) NSString* serialNumber;
@property UInt32 vendorId;
@property (strong) NSString* vendorDescription;
@property UInt32 productId;
@property (strong) NSString* productDescription;
@property (strong) NSString* revision;
@end

@implementation IdentificationProfile

- (BOOL) hasDeviceId {
  return !!hasDeviceId_;
}
- (void) setHasDeviceId:(BOOL) value_ {
  hasDeviceId_ = !!value_;
}
@synthesize deviceId;
- (BOOL) hasNodeIdentifier {
  return !!hasNodeIdentifier_;
}
- (void) setHasNodeIdentifier:(BOOL) value_ {
  hasNodeIdentifier_ = !!value_;
}
@synthesize nodeIdentifier;
- (BOOL) hasSerialNumber {
  return !!hasSerialNumber_;
}
- (void) setHasSerialNumber:(BOOL) value_ {
  hasSerialNumber_ = !!value_;
}
@synthesize serialNumber;
- (BOOL) hasVendorId {
  return !!hasVendorId_;
}
- (void) setHasVendorId:(BOOL) value_ {
  hasVendorId_ = !!value_;
}
@synthesize vendorId;
- (BOOL) hasVendorDescription {
  return !!hasVendorDescription_;
}
- (void) setHasVendorDescription:(BOOL) value_ {
  hasVendorDescription_ = !!value_;
}
@synthesize vendorDescription;
- (BOOL) hasProductId {
  return !!hasProductId_;
}
- (void) setHasProductId:(BOOL) value_ {
  hasProductId_ = !!value_;
}
@synthesize productId;
- (BOOL) hasProductDescription {
  return !!hasProductDescription_;
}
- (void) setHasProductDescription:(BOOL) value_ {
  hasProductDescription_ = !!value_;
}
@synthesize productDescription;
- (BOOL) hasRevision {
  return !!hasRevision_;
}
- (void) setHasRevision:(BOOL) value_ {
  hasRevision_ = !!value_;
}
@synthesize revision;
- (id) init {
  if ((self = [super init])) {
    self.deviceId = @"";
    self.nodeIdentifier = 0L;
    self.serialNumber = @"";
    self.vendorId = 0;
    self.vendorDescription = @"";
    self.productId = 0;
    self.productDescription = @"";
    self.revision = @"";
  }
  return self;
}
static IdentificationProfile* defaultIdentificationProfileInstance = nil;
+ (void) initialize {
  if (self == [IdentificationProfile class]) {
    defaultIdentificationProfileInstance = [[IdentificationProfile alloc] init];
  }
}
+ (IdentificationProfile*) defaultInstance {
  return defaultIdentificationProfileInstance;
}
- (IdentificationProfile*) defaultInstance {
  return defaultIdentificationProfileInstance;
}
- (BOOL) isInitialized {
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasDeviceId) {
    [output writeString:1 value:self.deviceId];
  }
  if (self.hasNodeIdentifier) {
    [output writeUInt64:2 value:self.nodeIdentifier];
  }
  if (self.hasSerialNumber) {
    [output writeString:3 value:self.serialNumber];
  }
  if (self.hasVendorId) {
    [output writeUInt32:4 value:self.vendorId];
  }
  if (self.hasVendorDescription) {
    [output writeString:5 value:self.vendorDescription];
  }
  if (self.hasProductId) {
    [output writeUInt32:6 value:self.productId];
  }
  if (self.hasProductDescription) {
    [output writeString:7 value:self.productDescription];
  }
  if (self.hasRevision) {
    [output writeString:8 value:self.revision];
  }
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasDeviceId) {
    size_ += computeStringSize(1, self.deviceId);
  }
  if (self.hasNodeIdentifier) {
    size_ += computeUInt64Size(2, self.nodeIdentifier);
  }
  if (self.hasSerialNumber) {
    size_ += computeStringSize(3, self.serialNumber);
  }
  if (self.hasVendorId) {
    size_ += computeUInt32Size(4, self.vendorId);
  }
  if (self.hasVendorDescription) {
    size_ += computeStringSize(5, self.vendorDescription);
  }
  if (self.hasProductId) {
    size_ += computeUInt32Size(6, self.productId);
  }
  if (self.hasProductDescription) {
    size_ += computeStringSize(7, self.productDescription);
  }
  if (self.hasRevision) {
    size_ += computeStringSize(8, self.revision);
  }
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (IdentificationProfile*) parseFromData:(NSData*) data {
  return (IdentificationProfile*)[[[IdentificationProfile builder] mergeFromData:data] build];
}
+ (IdentificationProfile*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (IdentificationProfile*)[[[IdentificationProfile builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (IdentificationProfile*) parseFromInputStream:(NSInputStream*) input {
  return (IdentificationProfile*)[[[IdentificationProfile builder] mergeFromInputStream:input] build];
}
+ (IdentificationProfile*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (IdentificationProfile*)[[[IdentificationProfile builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (IdentificationProfile*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (IdentificationProfile*)[[[IdentificationProfile builder] mergeFromCodedInputStream:input] build];
}
+ (IdentificationProfile*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (IdentificationProfile*)[[[IdentificationProfile builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (IdentificationProfileBuilder*) builder {
  return [[IdentificationProfileBuilder alloc] init];
}
+ (IdentificationProfileBuilder*) builderWithPrototype:(IdentificationProfile*) prototype {
  return [[IdentificationProfile builder] mergeFrom:prototype];
}
- (IdentificationProfileBuilder*) builder {
  return [IdentificationProfile builder];
}
- (IdentificationProfileBuilder*) toBuilder {
  return [IdentificationProfile builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasDeviceId) {
    [output appendFormat:@"%@%@: %@\n", indent, @"deviceId", self.deviceId];
  }
  if (self.hasNodeIdentifier) {
    [output appendFormat:@"%@%@: %@\n", indent, @"nodeIdentifier", [NSNumber numberWithLongLong:self.nodeIdentifier]];
  }
  if (self.hasSerialNumber) {
    [output appendFormat:@"%@%@: %@\n", indent, @"serialNumber", self.serialNumber];
  }
  if (self.hasVendorId) {
    [output appendFormat:@"%@%@: %@\n", indent, @"vendorId", [NSNumber numberWithInteger:self.vendorId]];
  }
  if (self.hasVendorDescription) {
    [output appendFormat:@"%@%@: %@\n", indent, @"vendorDescription", self.vendorDescription];
  }
  if (self.hasProductId) {
    [output appendFormat:@"%@%@: %@\n", indent, @"productId", [NSNumber numberWithInteger:self.productId]];
  }
  if (self.hasProductDescription) {
    [output appendFormat:@"%@%@: %@\n", indent, @"productDescription", self.productDescription];
  }
  if (self.hasRevision) {
    [output appendFormat:@"%@%@: %@\n", indent, @"revision", self.revision];
  }
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[IdentificationProfile class]]) {
    return NO;
  }
  IdentificationProfile *otherMessage = other;
  return
      self.hasDeviceId == otherMessage.hasDeviceId &&
      (!self.hasDeviceId || [self.deviceId isEqual:otherMessage.deviceId]) &&
      self.hasNodeIdentifier == otherMessage.hasNodeIdentifier &&
      (!self.hasNodeIdentifier || self.nodeIdentifier == otherMessage.nodeIdentifier) &&
      self.hasSerialNumber == otherMessage.hasSerialNumber &&
      (!self.hasSerialNumber || [self.serialNumber isEqual:otherMessage.serialNumber]) &&
      self.hasVendorId == otherMessage.hasVendorId &&
      (!self.hasVendorId || self.vendorId == otherMessage.vendorId) &&
      self.hasVendorDescription == otherMessage.hasVendorDescription &&
      (!self.hasVendorDescription || [self.vendorDescription isEqual:otherMessage.vendorDescription]) &&
      self.hasProductId == otherMessage.hasProductId &&
      (!self.hasProductId || self.productId == otherMessage.productId) &&
      self.hasProductDescription == otherMessage.hasProductDescription &&
      (!self.hasProductDescription || [self.productDescription isEqual:otherMessage.productDescription]) &&
      self.hasRevision == otherMessage.hasRevision &&
      (!self.hasRevision || [self.revision isEqual:otherMessage.revision]) &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasDeviceId) {
    hashCode = hashCode * 31 + [self.deviceId hash];
  }
  if (self.hasNodeIdentifier) {
    hashCode = hashCode * 31 + [[NSNumber numberWithLongLong:self.nodeIdentifier] hash];
  }
  if (self.hasSerialNumber) {
    hashCode = hashCode * 31 + [self.serialNumber hash];
  }
  if (self.hasVendorId) {
    hashCode = hashCode * 31 + [[NSNumber numberWithInteger:self.vendorId] hash];
  }
  if (self.hasVendorDescription) {
    hashCode = hashCode * 31 + [self.vendorDescription hash];
  }
  if (self.hasProductId) {
    hashCode = hashCode * 31 + [[NSNumber numberWithInteger:self.productId] hash];
  }
  if (self.hasProductDescription) {
    hashCode = hashCode * 31 + [self.productDescription hash];
  }
  if (self.hasRevision) {
    hashCode = hashCode * 31 + [self.revision hash];
  }
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface IdentificationProfileBuilder()
@property (strong) IdentificationProfile* result;
@end

@implementation IdentificationProfileBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[IdentificationProfile alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (IdentificationProfileBuilder*) clear {
  self.result = [[IdentificationProfile alloc] init];
  return self;
}
- (IdentificationProfileBuilder*) clone {
  return [IdentificationProfile builderWithPrototype:result];
}
- (IdentificationProfile*) defaultInstance {
  return [IdentificationProfile defaultInstance];
}
- (IdentificationProfile*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (IdentificationProfile*) buildPartial {
  IdentificationProfile* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (IdentificationProfileBuilder*) mergeFrom:(IdentificationProfile*) other {
  if (other == [IdentificationProfile defaultInstance]) {
    return self;
  }
  if (other.hasDeviceId) {
    [self setDeviceId:other.deviceId];
  }
  if (other.hasNodeIdentifier) {
    [self setNodeIdentifier:other.nodeIdentifier];
  }
  if (other.hasSerialNumber) {
    [self setSerialNumber:other.serialNumber];
  }
  if (other.hasVendorId) {
    [self setVendorId:other.vendorId];
  }
  if (other.hasVendorDescription) {
    [self setVendorDescription:other.vendorDescription];
  }
  if (other.hasProductId) {
    [self setProductId:other.productId];
  }
  if (other.hasProductDescription) {
    [self setProductDescription:other.productDescription];
  }
  if (other.hasRevision) {
    [self setRevision:other.revision];
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (IdentificationProfileBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (IdentificationProfileBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        [self setDeviceId:[input readString]];
        break;
      }
      case 16: {
        [self setNodeIdentifier:[input readUInt64]];
        break;
      }
      case 26: {
        [self setSerialNumber:[input readString]];
        break;
      }
      case 32: {
        [self setVendorId:[input readUInt32]];
        break;
      }
      case 42: {
        [self setVendorDescription:[input readString]];
        break;
      }
      case 48: {
        [self setProductId:[input readUInt32]];
        break;
      }
      case 58: {
        [self setProductDescription:[input readString]];
        break;
      }
      case 66: {
        [self setRevision:[input readString]];
        break;
      }
    }
  }
}
- (BOOL) hasDeviceId {
  return result.hasDeviceId;
}
- (NSString*) deviceId {
  return result.deviceId;
}
- (IdentificationProfileBuilder*) setDeviceId:(NSString*) value {
  result.hasDeviceId = YES;
  result.deviceId = value;
  return self;
}
- (IdentificationProfileBuilder*) clearDeviceId {
  result.hasDeviceId = NO;
  result.deviceId = @"";
  return self;
}
- (BOOL) hasNodeIdentifier {
  return result.hasNodeIdentifier;
}
- (UInt64) nodeIdentifier {
  return result.nodeIdentifier;
}
- (IdentificationProfileBuilder*) setNodeIdentifier:(UInt64) value {
  result.hasNodeIdentifier = YES;
  result.nodeIdentifier = value;
  return self;
}
- (IdentificationProfileBuilder*) clearNodeIdentifier {
  result.hasNodeIdentifier = NO;
  result.nodeIdentifier = 0L;
  return self;
}
- (BOOL) hasSerialNumber {
  return result.hasSerialNumber;
}
- (NSString*) serialNumber {
  return result.serialNumber;
}
- (IdentificationProfileBuilder*) setSerialNumber:(NSString*) value {
  result.hasSerialNumber = YES;
  result.serialNumber = value;
  return self;
}
- (IdentificationProfileBuilder*) clearSerialNumber {
  result.hasSerialNumber = NO;
  result.serialNumber = @"";
  return self;
}
- (BOOL) hasVendorId {
  return result.hasVendorId;
}
- (UInt32) vendorId {
  return result.vendorId;
}
- (IdentificationProfileBuilder*) setVendorId:(UInt32) value {
  result.hasVendorId = YES;
  result.vendorId = value;
  return self;
}
- (IdentificationProfileBuilder*) clearVendorId {
  result.hasVendorId = NO;
  result.vendorId = 0;
  return self;
}
- (BOOL) hasVendorDescription {
  return result.hasVendorDescription;
}
- (NSString*) vendorDescription {
  return result.vendorDescription;
}
- (IdentificationProfileBuilder*) setVendorDescription:(NSString*) value {
  result.hasVendorDescription = YES;
  result.vendorDescription = value;
  return self;
}
- (IdentificationProfileBuilder*) clearVendorDescription {
  result.hasVendorDescription = NO;
  result.vendorDescription = @"";
  return self;
}
- (BOOL) hasProductId {
  return result.hasProductId;
}
- (UInt32) productId {
  return result.productId;
}
- (IdentificationProfileBuilder*) setProductId:(UInt32) value {
  result.hasProductId = YES;
  result.productId = value;
  return self;
}
- (IdentificationProfileBuilder*) clearProductId {
  result.hasProductId = NO;
  result.productId = 0;
  return self;
}
- (BOOL) hasProductDescription {
  return result.hasProductDescription;
}
- (NSString*) productDescription {
  return result.productDescription;
}
- (IdentificationProfileBuilder*) setProductDescription:(NSString*) value {
  result.hasProductDescription = YES;
  result.productDescription = value;
  return self;
}
- (IdentificationProfileBuilder*) clearProductDescription {
  result.hasProductDescription = NO;
  result.productDescription = @"";
  return self;
}
- (BOOL) hasRevision {
  return result.hasRevision;
}
- (NSString*) revision {
  return result.revision;
}
- (IdentificationProfileBuilder*) setRevision:(NSString*) value {
  result.hasRevision = YES;
  result.revision = value;
  return self;
}
- (IdentificationProfileBuilder*) clearRevision {
  result.hasRevision = NO;
  result.revision = @"";
  return self;
}
@end


// @@protoc_insertion_point(global_scope)
