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

#import "ProtocolBuffers.h"

// @@protoc_insertion_point(imports)

@class ST_DeviceInfo;
@class ST_DeviceInfoBuilder;
@class ST_InitSetup;
@class ST_InitSetupBuilder;
@class ST_JpakeBegin;
@class ST_JpakeBeginBuilder;
@class ST_JpakeResponse;
@class ST_JpakeResponseBuilder;
@class ST_JpakeStep;
@class ST_JpakeStepBuilder;
@class ST_WifiConnect;
@class ST_WifiConnectBuilder;
@class ST_WifiConnectStatus;
@class ST_WifiConnectStatusBuilder;
@class ST_WifiScan;
@class ST_WifiScanBuilder;
@class ST_WifiScanList;
@class ST_WifiScanListBuilder;
#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

typedef enum {
  ST_PacketTypePacketTypeInitSetup = 1,
  ST_PacketTypePacketTypeWifiScan = 2,
  ST_PacketTypePacketTypeWifiConnect = 3,
  ST_PacketTypePacketTypeJpakeBegin = 32,
  ST_PacketTypePacketTypeJpakeResponse = 48,
  ST_PacketTypePacketTypeDeviceInfo = 64,
  ST_PacketTypePacketTypeWifiScanList = 65,
  ST_PacketTypePacketTypeWifiConnectStatus = 66,
} ST_PacketType;

BOOL ST_PacketTypeIsValidValue(ST_PacketType value);

typedef enum {
  ST_WifiConnectNetworkSecurityTypeNone = 0,
  ST_WifiConnectNetworkSecurityTypeWep = 1,
  ST_WifiConnectNetworkSecurityTypeWpaPersonal = 2,
} ST_WifiConnectNetworkSecurityType;

BOOL ST_WifiConnectNetworkSecurityTypeIsValidValue(ST_WifiConnectNetworkSecurityType value);

typedef enum {
  ST_WifiConnectStatusResultSuccess = 0,
  ST_WifiConnectStatusResultBadPassword = 1,
  ST_WifiConnectStatusResultNetworkNotFound = 2,
  ST_WifiConnectStatusResultNoDhcp = 3,
  ST_WifiConnectStatusResultNoInternet = 4,
  ST_WifiConnectStatusResultNoAuth = 5,
} ST_WifiConnectStatusResult;

BOOL ST_WifiConnectStatusResultIsValidValue(ST_WifiConnectStatusResult value);


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

@interface ST_JpakeStep : PBGeneratedMessage {
@private
  BOOL hasGx_:1;
  BOOL hasGr_:1;
  BOOL hasB_:1;
  NSData* gx;
  NSData* gr;
  NSData* b;
}
- (BOOL) hasGx;
- (BOOL) hasGr;
- (BOOL) hasB;
@property (readonly, strong) NSData* gx;
@property (readonly, strong) NSData* gr;
@property (readonly, strong) NSData* b;

+ (ST_JpakeStep*) defaultInstance;
- (ST_JpakeStep*) defaultInstance;

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

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

@interface ST_JpakeStepBuilder : PBGeneratedMessageBuilder {
@private
  ST_JpakeStep* result;
}

- (ST_JpakeStep*) defaultInstance;

- (ST_JpakeStepBuilder*) clear;
- (ST_JpakeStepBuilder*) clone;

- (ST_JpakeStep*) build;
- (ST_JpakeStep*) buildPartial;

- (ST_JpakeStepBuilder*) mergeFrom:(ST_JpakeStep*) other;
- (ST_JpakeStepBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (ST_JpakeStepBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasGx;
- (NSData*) gx;
- (ST_JpakeStepBuilder*) setGx:(NSData*) value;
- (ST_JpakeStepBuilder*) clearGx;

- (BOOL) hasGr;
- (NSData*) gr;
- (ST_JpakeStepBuilder*) setGr:(NSData*) value;
- (ST_JpakeStepBuilder*) clearGr;

- (BOOL) hasB;
- (NSData*) b;
- (ST_JpakeStepBuilder*) setB:(NSData*) value;
- (ST_JpakeStepBuilder*) clearB;
@end

@interface ST_JpakeBegin : PBGeneratedMessage {
@private
  BOOL hasAstep1P1_:1;
  BOOL hasAstep1P2_:1;
  ST_JpakeStep* astep1P1;
  ST_JpakeStep* astep1P2;
}
- (BOOL) hasAstep1P1;
- (BOOL) hasAstep1P2;
@property (readonly, strong) ST_JpakeStep* astep1P1;
@property (readonly, strong) ST_JpakeStep* astep1P2;

+ (ST_JpakeBegin*) defaultInstance;
- (ST_JpakeBegin*) defaultInstance;

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

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

@interface ST_JpakeBeginBuilder : PBGeneratedMessageBuilder {
@private
  ST_JpakeBegin* result;
}

- (ST_JpakeBegin*) defaultInstance;

- (ST_JpakeBeginBuilder*) clear;
- (ST_JpakeBeginBuilder*) clone;

- (ST_JpakeBegin*) build;
- (ST_JpakeBegin*) buildPartial;

- (ST_JpakeBeginBuilder*) mergeFrom:(ST_JpakeBegin*) other;
- (ST_JpakeBeginBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (ST_JpakeBeginBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasAstep1P1;
- (ST_JpakeStep*) astep1P1;
- (ST_JpakeBeginBuilder*) setAstep1P1:(ST_JpakeStep*) value;
- (ST_JpakeBeginBuilder*) setAstep1P1Builder:(ST_JpakeStepBuilder*) builderForValue;
- (ST_JpakeBeginBuilder*) mergeAstep1P1:(ST_JpakeStep*) value;
- (ST_JpakeBeginBuilder*) clearAstep1P1;

- (BOOL) hasAstep1P2;
- (ST_JpakeStep*) astep1P2;
- (ST_JpakeBeginBuilder*) setAstep1P2:(ST_JpakeStep*) value;
- (ST_JpakeBeginBuilder*) setAstep1P2Builder:(ST_JpakeStepBuilder*) builderForValue;
- (ST_JpakeBeginBuilder*) mergeAstep1P2:(ST_JpakeStep*) value;
- (ST_JpakeBeginBuilder*) clearAstep1P2;
@end

@interface ST_JpakeResponse : PBGeneratedMessage {
@private
  BOOL hasCstep1P1_:1;
  BOOL hasCstep1P2_:1;
  BOOL hasCstep2_:1;
  ST_JpakeStep* cstep1P1;
  ST_JpakeStep* cstep1P2;
  ST_JpakeStep* cstep2;
}
- (BOOL) hasCstep1P1;
- (BOOL) hasCstep1P2;
- (BOOL) hasCstep2;
@property (readonly, strong) ST_JpakeStep* cstep1P1;
@property (readonly, strong) ST_JpakeStep* cstep1P2;
@property (readonly, strong) ST_JpakeStep* cstep2;

+ (ST_JpakeResponse*) defaultInstance;
- (ST_JpakeResponse*) defaultInstance;

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

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

@interface ST_JpakeResponseBuilder : PBGeneratedMessageBuilder {
@private
  ST_JpakeResponse* result;
}

- (ST_JpakeResponse*) defaultInstance;

- (ST_JpakeResponseBuilder*) clear;
- (ST_JpakeResponseBuilder*) clone;

- (ST_JpakeResponse*) build;
- (ST_JpakeResponse*) buildPartial;

- (ST_JpakeResponseBuilder*) mergeFrom:(ST_JpakeResponse*) other;
- (ST_JpakeResponseBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (ST_JpakeResponseBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasCstep1P1;
- (ST_JpakeStep*) cstep1P1;
- (ST_JpakeResponseBuilder*) setCstep1P1:(ST_JpakeStep*) value;
- (ST_JpakeResponseBuilder*) setCstep1P1Builder:(ST_JpakeStepBuilder*) builderForValue;
- (ST_JpakeResponseBuilder*) mergeCstep1P1:(ST_JpakeStep*) value;
- (ST_JpakeResponseBuilder*) clearCstep1P1;

- (BOOL) hasCstep1P2;
- (ST_JpakeStep*) cstep1P2;
- (ST_JpakeResponseBuilder*) setCstep1P2:(ST_JpakeStep*) value;
- (ST_JpakeResponseBuilder*) setCstep1P2Builder:(ST_JpakeStepBuilder*) builderForValue;
- (ST_JpakeResponseBuilder*) mergeCstep1P2:(ST_JpakeStep*) value;
- (ST_JpakeResponseBuilder*) clearCstep1P2;

- (BOOL) hasCstep2;
- (ST_JpakeStep*) cstep2;
- (ST_JpakeResponseBuilder*) setCstep2:(ST_JpakeStep*) value;
- (ST_JpakeResponseBuilder*) setCstep2Builder:(ST_JpakeStepBuilder*) builderForValue;
- (ST_JpakeResponseBuilder*) mergeCstep2:(ST_JpakeStep*) value;
- (ST_JpakeResponseBuilder*) clearCstep2;
@end

@interface ST_InitSetup : PBGeneratedMessage {
@private
  BOOL hasAstep2_:1;
  BOOL hasStep3A_:1;
  ST_JpakeStep* astep2;
  NSData* step3A;
}
- (BOOL) hasAstep2;
- (BOOL) hasStep3A;
@property (readonly, strong) ST_JpakeStep* astep2;
@property (readonly, strong) NSData* step3A;

+ (ST_InitSetup*) defaultInstance;
- (ST_InitSetup*) defaultInstance;

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

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

@interface ST_InitSetupBuilder : PBGeneratedMessageBuilder {
@private
  ST_InitSetup* result;
}

- (ST_InitSetup*) defaultInstance;

- (ST_InitSetupBuilder*) clear;
- (ST_InitSetupBuilder*) clone;

- (ST_InitSetup*) build;
- (ST_InitSetup*) buildPartial;

- (ST_InitSetupBuilder*) mergeFrom:(ST_InitSetup*) other;
- (ST_InitSetupBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (ST_InitSetupBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasAstep2;
- (ST_JpakeStep*) astep2;
- (ST_InitSetupBuilder*) setAstep2:(ST_JpakeStep*) value;
- (ST_InitSetupBuilder*) setAstep2Builder:(ST_JpakeStepBuilder*) builderForValue;
- (ST_InitSetupBuilder*) mergeAstep2:(ST_JpakeStep*) value;
- (ST_InitSetupBuilder*) clearAstep2;

- (BOOL) hasStep3A;
- (NSData*) step3A;
- (ST_InitSetupBuilder*) setStep3A:(NSData*) value;
- (ST_InitSetupBuilder*) clearStep3A;
@end

@interface ST_DeviceInfo : PBGeneratedMessage {
@private
  BOOL hasNonce_:1;
  BOOL hasToken_:1;
  BOOL hasFlags_:1;
  BOOL hasStep3B_:1;
  NSData* nonce;
  NSData* token;
  NSData* flags;
  NSData* step3B;
}
- (BOOL) hasNonce;
- (BOOL) hasToken;
- (BOOL) hasFlags;
- (BOOL) hasStep3B;
@property (readonly, strong) NSData* nonce;
@property (readonly, strong) NSData* token;
@property (readonly, strong) NSData* flags;
@property (readonly, strong) NSData* step3B;

+ (ST_DeviceInfo*) defaultInstance;
- (ST_DeviceInfo*) defaultInstance;

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

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

@interface ST_DeviceInfoBuilder : PBGeneratedMessageBuilder {
@private
  ST_DeviceInfo* result;
}

- (ST_DeviceInfo*) defaultInstance;

- (ST_DeviceInfoBuilder*) clear;
- (ST_DeviceInfoBuilder*) clone;

- (ST_DeviceInfo*) build;
- (ST_DeviceInfo*) buildPartial;

- (ST_DeviceInfoBuilder*) mergeFrom:(ST_DeviceInfo*) other;
- (ST_DeviceInfoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (ST_DeviceInfoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasNonce;
- (NSData*) nonce;
- (ST_DeviceInfoBuilder*) setNonce:(NSData*) value;
- (ST_DeviceInfoBuilder*) clearNonce;

- (BOOL) hasToken;
- (NSData*) token;
- (ST_DeviceInfoBuilder*) setToken:(NSData*) value;
- (ST_DeviceInfoBuilder*) clearToken;

- (BOOL) hasFlags;
- (NSData*) flags;
- (ST_DeviceInfoBuilder*) setFlags:(NSData*) value;
- (ST_DeviceInfoBuilder*) clearFlags;

- (BOOL) hasStep3B;
- (NSData*) step3B;
- (ST_DeviceInfoBuilder*) setStep3B:(NSData*) value;
- (ST_DeviceInfoBuilder*) clearStep3B;
@end

@interface ST_WifiScan : PBGeneratedMessage {
@private
  BOOL hasAuthTag_:1;
  NSData* authTag;
}
- (BOOL) hasAuthTag;
@property (readonly, strong) NSData* authTag;

+ (ST_WifiScan*) defaultInstance;
- (ST_WifiScan*) defaultInstance;

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

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

@interface ST_WifiScanBuilder : PBGeneratedMessageBuilder {
@private
  ST_WifiScan* result;
}

- (ST_WifiScan*) defaultInstance;

- (ST_WifiScanBuilder*) clear;
- (ST_WifiScanBuilder*) clone;

- (ST_WifiScan*) build;
- (ST_WifiScan*) buildPartial;

- (ST_WifiScanBuilder*) mergeFrom:(ST_WifiScan*) other;
- (ST_WifiScanBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (ST_WifiScanBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasAuthTag;
- (NSData*) authTag;
- (ST_WifiScanBuilder*) setAuthTag:(NSData*) value;
- (ST_WifiScanBuilder*) clearAuthTag;
@end

@interface ST_WifiConnect : PBGeneratedMessage {
@private
  BOOL hasIsManual_:1;
  BOOL hasBssid_:1;
  BOOL hasSsid_:1;
  BOOL hasEncryptedPassword_:1;
  BOOL hasAuthTag_:1;
  BOOL hasJpakeHmac_:1;
  BOOL hasType_:1;
  BOOL isManual_:1;
  NSString* bssid;
  NSString* ssid;
  NSData* encryptedPassword;
  NSData* authTag;
  NSData* jpakeHmac;
  ST_WifiConnectNetworkSecurityType type;
}
- (BOOL) hasBssid;
- (BOOL) hasSsid;
- (BOOL) hasEncryptedPassword;
- (BOOL) hasType;
- (BOOL) hasIsManual;
- (BOOL) hasAuthTag;
- (BOOL) hasJpakeHmac;
@property (readonly, strong) NSString* bssid;
@property (readonly, strong) NSString* ssid;
@property (readonly, strong) NSData* encryptedPassword;
@property (readonly) ST_WifiConnectNetworkSecurityType type;
- (BOOL) isManual;
@property (readonly, strong) NSData* authTag;
@property (readonly, strong) NSData* jpakeHmac;

+ (ST_WifiConnect*) defaultInstance;
- (ST_WifiConnect*) defaultInstance;

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

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

@interface ST_WifiConnectBuilder : PBGeneratedMessageBuilder {
@private
  ST_WifiConnect* result;
}

- (ST_WifiConnect*) defaultInstance;

- (ST_WifiConnectBuilder*) clear;
- (ST_WifiConnectBuilder*) clone;

- (ST_WifiConnect*) build;
- (ST_WifiConnect*) buildPartial;

- (ST_WifiConnectBuilder*) mergeFrom:(ST_WifiConnect*) other;
- (ST_WifiConnectBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (ST_WifiConnectBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasBssid;
- (NSString*) bssid;
- (ST_WifiConnectBuilder*) setBssid:(NSString*) value;
- (ST_WifiConnectBuilder*) clearBssid;

- (BOOL) hasSsid;
- (NSString*) ssid;
- (ST_WifiConnectBuilder*) setSsid:(NSString*) value;
- (ST_WifiConnectBuilder*) clearSsid;

- (BOOL) hasEncryptedPassword;
- (NSData*) encryptedPassword;
- (ST_WifiConnectBuilder*) setEncryptedPassword:(NSData*) value;
- (ST_WifiConnectBuilder*) clearEncryptedPassword;

- (BOOL) hasType;
- (ST_WifiConnectNetworkSecurityType) type;
- (ST_WifiConnectBuilder*) setType:(ST_WifiConnectNetworkSecurityType) value;
- (ST_WifiConnectBuilder*) clearType;

- (BOOL) hasIsManual;
- (BOOL) isManual;
- (ST_WifiConnectBuilder*) setIsManual:(BOOL) value;
- (ST_WifiConnectBuilder*) clearIsManual;

- (BOOL) hasAuthTag;
- (NSData*) authTag;
- (ST_WifiConnectBuilder*) setAuthTag:(NSData*) value;
- (ST_WifiConnectBuilder*) clearAuthTag;

- (BOOL) hasJpakeHmac;
- (NSData*) jpakeHmac;
- (ST_WifiConnectBuilder*) setJpakeHmac:(NSData*) value;
- (ST_WifiConnectBuilder*) clearJpakeHmac;
@end

@interface ST_WifiScanList : PBGeneratedMessage {
@private
  BOOL hasList_:1;
  NSString* list;
}
- (BOOL) hasList;
@property (readonly, strong) NSString* list;

+ (ST_WifiScanList*) defaultInstance;
- (ST_WifiScanList*) defaultInstance;

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

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

@interface ST_WifiScanListBuilder : PBGeneratedMessageBuilder {
@private
  ST_WifiScanList* result;
}

- (ST_WifiScanList*) defaultInstance;

- (ST_WifiScanListBuilder*) clear;
- (ST_WifiScanListBuilder*) clone;

- (ST_WifiScanList*) build;
- (ST_WifiScanList*) buildPartial;

- (ST_WifiScanListBuilder*) mergeFrom:(ST_WifiScanList*) other;
- (ST_WifiScanListBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (ST_WifiScanListBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasList;
- (NSString*) list;
- (ST_WifiScanListBuilder*) setList:(NSString*) value;
- (ST_WifiScanListBuilder*) clearList;
@end

@interface ST_WifiConnectStatus : PBGeneratedMessage {
@private
  BOOL hasDebugLog_:1;
  BOOL hasConnectResult_:1;
  NSString* debugLog;
  ST_WifiConnectStatusResult connectResult;
}
- (BOOL) hasConnectResult;
- (BOOL) hasDebugLog;
@property (readonly) ST_WifiConnectStatusResult connectResult;
@property (readonly, strong) NSString* debugLog;

+ (ST_WifiConnectStatus*) defaultInstance;
- (ST_WifiConnectStatus*) defaultInstance;

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

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

@interface ST_WifiConnectStatusBuilder : PBGeneratedMessageBuilder {
@private
  ST_WifiConnectStatus* result;
}

- (ST_WifiConnectStatus*) defaultInstance;

- (ST_WifiConnectStatusBuilder*) clear;
- (ST_WifiConnectStatusBuilder*) clone;

- (ST_WifiConnectStatus*) build;
- (ST_WifiConnectStatus*) buildPartial;

- (ST_WifiConnectStatusBuilder*) mergeFrom:(ST_WifiConnectStatus*) other;
- (ST_WifiConnectStatusBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (ST_WifiConnectStatusBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasConnectResult;
- (ST_WifiConnectStatusResult) connectResult;
- (ST_WifiConnectStatusBuilder*) setConnectResult:(ST_WifiConnectStatusResult) value;
- (ST_WifiConnectStatusBuilder*) clearConnectResult;

- (BOOL) hasDebugLog;
- (NSString*) debugLog;
- (ST_WifiConnectStatusBuilder*) setDebugLog:(NSString*) value;
- (ST_WifiConnectStatusBuilder*) clearDebugLog;
@end


// @@protoc_insertion_point(global_scope)
