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

#import "ProtocolBuffers.h"

// @@protoc_insertion_point(imports)

@class AccountInfo;
@class AccountInfoBuilder;
#ifndef __has_feature
  #define __has_feature(x) 0 // Compatibility with non-clang compilers.
#endif // __has_feature

#ifndef NS_RETURNS_NOT_RETAINED
  #if __has_feature(attribute_ns_returns_not_retained)
    #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
  #else
    #define NS_RETURNS_NOT_RETAINED
  #endif
#endif


@interface AccountInfoRoot : NSObject {
}
+ (PBExtensionRegistry*) extensionRegistry;
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry;
@end

@interface AccountInfo : PBGeneratedMessage {
@private
  BOOL hasUserId_:1;
  BOOL hasStructureId_:1;
  NSString* userId;
  NSString* structureId;
}
- (BOOL) hasUserId;
- (BOOL) hasStructureId;
@property (readonly, strong) NSString* userId;
@property (readonly, strong) NSString* structureId;

+ (AccountInfo*) defaultInstance;
- (AccountInfo*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (AccountInfoBuilder*) builder;
+ (AccountInfoBuilder*) builder;
+ (AccountInfoBuilder*) builderWithPrototype:(AccountInfo*) prototype;
- (AccountInfoBuilder*) toBuilder;

+ (AccountInfo*) parseFromData:(NSData*) data;
+ (AccountInfo*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (AccountInfo*) parseFromInputStream:(NSInputStream*) input;
+ (AccountInfo*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (AccountInfo*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (AccountInfo*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface AccountInfoBuilder : PBGeneratedMessageBuilder {
@private
  AccountInfo* result;
}

- (AccountInfo*) defaultInstance;

- (AccountInfoBuilder*) clear;
- (AccountInfoBuilder*) clone;

- (AccountInfo*) build;
- (AccountInfo*) buildPartial;

- (AccountInfoBuilder*) mergeFrom:(AccountInfo*) other;
- (AccountInfoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (AccountInfoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasUserId;
- (NSString*) userId;
- (AccountInfoBuilder*) setUserId:(NSString*) value;
- (AccountInfoBuilder*) clearUserId;

- (BOOL) hasStructureId;
- (NSString*) structureId;
- (AccountInfoBuilder*) setStructureId:(NSString*) value;
- (AccountInfoBuilder*) clearStructureId;
@end


// @@protoc_insertion_point(global_scope)
