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

#import "ProtocolBuffers.h"

// @@protoc_insertion_point(imports)

@class Pair;
@class PairBuilder;
#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 PairRoot : NSObject {
}
+ (PBExtensionRegistry*) extensionRegistry;
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry;
@end

@interface Pair : PBGeneratedMessage {
@private
  BOOL hasKey_:1;
  BOOL hasValue_:1;
  NSString* key;
  NSString* value;
}
- (BOOL) hasKey;
- (BOOL) hasValue;
@property (readonly, strong) NSString* key;
@property (readonly, strong) NSString* value;

+ (Pair*) defaultInstance;
- (Pair*) defaultInstance;

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

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

@interface PairBuilder : PBGeneratedMessageBuilder {
@private
  Pair* result;
}

- (Pair*) defaultInstance;

- (PairBuilder*) clear;
- (PairBuilder*) clone;

- (Pair*) build;
- (Pair*) buildPartial;

- (PairBuilder*) mergeFrom:(Pair*) other;
- (PairBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (PairBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasKey;
- (NSString*) key;
- (PairBuilder*) setKey:(NSString*) value;
- (PairBuilder*) clearKey;

- (BOOL) hasValue;
- (NSString*) value;
- (PairBuilder*) setValue:(NSString*) value;
- (PairBuilder*) clearValue;
@end


// @@protoc_insertion_point(global_scope)
