
/*** <<< INCLUDES [TestType] >>> ***/

#include <NativeInteger.h>
#include <constr_SEQUENCE.h>
#include <BOOLEAN.h>

/*** <<< TYPE-DECLS [TestType] >>> ***/

typedef struct TestType_16P0 {
	long	 common;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} TestType_16P0_t;
typedef struct TestType_16P1 {
	BOOLEAN_t	 common;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} TestType_16P1_t;

/*** <<< FUNC-DECLS [TestType] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_TestType_16P0;
extern asn_TYPE_descriptor_t asn_DEF_TestType_16P1;

/*** <<< CODE [TestType] >>> ***/

static int
memb_common_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	long value;
	
	if(!sptr) {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 1 && value <= 10)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}


/*** <<< STAT-DEFS [TestType] >>> ***/

static asn_TYPE_member_t asn_MBR_TestType_16P0_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct TestType_16P0, common),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_NativeInteger,
		.memb_constraints = memb_common_constraint_1,
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "common"
		},
};
static ber_tlv_tag_t asn_DEF_TestType_16P0_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_TestType_16P0_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* common at 20 */
};
static asn_SEQUENCE_specifics_t asn_SPC_TestType_16P0_specs_1 = {
	sizeof(struct TestType_16P0),
	offsetof(struct TestType_16P0, _asn_ctx),
	asn_MAP_TestType_16P0_tag2el_1,
	1,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_TestType_16P0 = {
	"TestType",
	"TestType",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_TestType_16P0_tags_1,
	sizeof(asn_DEF_TestType_16P0_tags_1)
		/sizeof(asn_DEF_TestType_16P0_tags_1[0]), /* 1 */
	asn_DEF_TestType_16P0_tags_1,	/* Same as above */
	sizeof(asn_DEF_TestType_16P0_tags_1)
		/sizeof(asn_DEF_TestType_16P0_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_TestType_16P0_1,
	1,	/* Elements count */
	&asn_SPC_TestType_16P0_specs_1	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_TestType_16P1_3[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct TestType_16P1, common),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_BOOLEAN,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "common"
		},
};
static ber_tlv_tag_t asn_DEF_TestType_16P1_tags_3[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_TestType_16P1_tag2el_3[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 } /* common at 21 */
};
static asn_SEQUENCE_specifics_t asn_SPC_TestType_16P1_specs_3 = {
	sizeof(struct TestType_16P1),
	offsetof(struct TestType_16P1, _asn_ctx),
	asn_MAP_TestType_16P1_tag2el_3,
	1,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_TestType_16P1 = {
	"TestType",
	"TestType",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_TestType_16P1_tags_3,
	sizeof(asn_DEF_TestType_16P1_tags_3)
		/sizeof(asn_DEF_TestType_16P1_tags_3[0]), /* 1 */
	asn_DEF_TestType_16P1_tags_3,	/* Same as above */
	sizeof(asn_DEF_TestType_16P1_tags_3)
		/sizeof(asn_DEF_TestType_16P1_tags_3[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_TestType_16P1_3,
	1,	/* Elements count */
	&asn_SPC_TestType_16P1_specs_3	/* Additional specs */
};


/*** <<< INCLUDES [TestChoice] >>> ***/

#include <TestType.h>
#include <constr_CHOICE.h>

/*** <<< DEPS [TestChoice] >>> ***/

typedef enum TestChoice_PR {
	TestChoice_PR_NOTHING,	/* No components present */
	TestChoice_PR_type1,
	TestChoice_PR_type2,
} TestChoice_PR;

/*** <<< TYPE-DECLS [TestChoice] >>> ***/

typedef struct TestChoice {
	TestChoice_PR present;
	union TestChoice_u {
		TestType_16P0_t	 type1;
		TestType_16P1_t	 type2;
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} TestChoice_t;

/*** <<< FUNC-DECLS [TestChoice] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_TestChoice;

/*** <<< STAT-DEFS [TestChoice] >>> ***/

static asn_TYPE_member_t asn_MBR_TestChoice_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct TestChoice, choice.type1),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_TestType_16P0,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "type1"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct TestChoice, choice.type2),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_TestType_16P1,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "type2"
		},
};
static asn_TYPE_tag2member_t asn_MAP_TestChoice_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 }, /* type1 at 20 */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 } /* type2 at 21 */
};
static asn_CHOICE_specifics_t asn_SPC_TestChoice_specs_1 = {
	sizeof(struct TestChoice),
	offsetof(struct TestChoice, _asn_ctx),
	offsetof(struct TestChoice, present),
	sizeof(((struct TestChoice *)0)->present),
	asn_MAP_TestChoice_tag2el_1,
	2,	/* Count of tags in the map */
	.canonical_order = 0,
	.ext_start = -1	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_TestChoice = {
	"TestChoice",
	"TestChoice",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_decode_xer,
	CHOICE_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	0,	/* No PER visible constraints */
	asn_MBR_TestChoice_1,
	2,	/* Elements count */
	&asn_SPC_TestChoice_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [AutoType] >>> ***/

#include <NativeInteger.h>
#include <constr_SEQUENCE.h>
#include <BOOLEAN.h>

/*** <<< TYPE-DECLS [AutoType] >>> ***/

typedef struct AutoType_34P0 {
	long	 common;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} AutoType_34P0_t;
typedef struct AutoType_34P1 {
	BOOLEAN_t	 common;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} AutoType_34P1_t;

/*** <<< FUNC-DECLS [AutoType] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_AutoType_34P0;
extern asn_TYPE_descriptor_t asn_DEF_AutoType_34P1;

/*** <<< CODE [AutoType] >>> ***/

static int
memb_common_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	long value;
	
	if(!sptr) {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value == 0)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_common_constraint_3(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	BOOLEAN_t value;
	
	if(!sptr) {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = (*(const long *)sptr) ? 1 : 0;
	
	if((value <= 0)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}


/*** <<< STAT-DEFS [AutoType] >>> ***/

static asn_TYPE_member_t asn_MBR_AutoType_34P0_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct AutoType_34P0, common),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_NativeInteger,
		.memb_constraints = memb_common_constraint_1,
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "common"
		},
};
static ber_tlv_tag_t asn_DEF_AutoType_34P0_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_AutoType_34P0_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* common at 37 */
};
static asn_SEQUENCE_specifics_t asn_SPC_AutoType_34P0_specs_1 = {
	sizeof(struct AutoType_34P0),
	offsetof(struct AutoType_34P0, _asn_ctx),
	asn_MAP_AutoType_34P0_tag2el_1,
	1,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_AutoType_34P0 = {
	"AutoType",
	"AutoType",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_AutoType_34P0_tags_1,
	sizeof(asn_DEF_AutoType_34P0_tags_1)
		/sizeof(asn_DEF_AutoType_34P0_tags_1[0]), /* 1 */
	asn_DEF_AutoType_34P0_tags_1,	/* Same as above */
	sizeof(asn_DEF_AutoType_34P0_tags_1)
		/sizeof(asn_DEF_AutoType_34P0_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_AutoType_34P0_1,
	1,	/* Elements count */
	&asn_SPC_AutoType_34P0_specs_1	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_AutoType_34P1_3[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct AutoType_34P1, common),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_BOOLEAN,
		.memb_constraints = memb_common_constraint_3,
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "common"
		},
};
static ber_tlv_tag_t asn_DEF_AutoType_34P1_tags_3[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_AutoType_34P1_tag2el_3[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* common at 38 */
};
static asn_SEQUENCE_specifics_t asn_SPC_AutoType_34P1_specs_3 = {
	sizeof(struct AutoType_34P1),
	offsetof(struct AutoType_34P1, _asn_ctx),
	asn_MAP_AutoType_34P1_tag2el_3,
	1,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_AutoType_34P1 = {
	"AutoType",
	"AutoType",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_AutoType_34P1_tags_3,
	sizeof(asn_DEF_AutoType_34P1_tags_3)
		/sizeof(asn_DEF_AutoType_34P1_tags_3[0]), /* 1 */
	asn_DEF_AutoType_34P1_tags_3,	/* Same as above */
	sizeof(asn_DEF_AutoType_34P1_tags_3)
		/sizeof(asn_DEF_AutoType_34P1_tags_3[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_AutoType_34P1_3,
	1,	/* Elements count */
	&asn_SPC_AutoType_34P1_specs_3	/* Additional specs */
};


/*** <<< INCLUDES [AutoChoice] >>> ***/

#include <AutoType.h>
#include <constr_CHOICE.h>

/*** <<< DEPS [AutoChoice] >>> ***/

typedef enum AutoChoice_PR {
	AutoChoice_PR_NOTHING,	/* No components present */
	AutoChoice_PR_type1,
	AutoChoice_PR_type2,
} AutoChoice_PR;

/*** <<< TYPE-DECLS [AutoChoice] >>> ***/

typedef struct AutoChoice {
	AutoChoice_PR present;
	union AutoChoice_u {
		AutoType_34P0_t	 type1;
		AutoType_34P1_t	 type2;
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} AutoChoice_t;

/*** <<< FUNC-DECLS [AutoChoice] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_AutoChoice;

/*** <<< STAT-DEFS [AutoChoice] >>> ***/

static asn_TYPE_member_t asn_MBR_AutoChoice_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct AutoChoice, choice.type1),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_AutoType_34P0,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "type1"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct AutoChoice, choice.type2),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_AutoType_34P1,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "type2"
		},
};
static asn_TYPE_tag2member_t asn_MAP_AutoChoice_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* type1 at 37 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* type2 at 38 */
};
static asn_CHOICE_specifics_t asn_SPC_AutoChoice_specs_1 = {
	sizeof(struct AutoChoice),
	offsetof(struct AutoChoice, _asn_ctx),
	offsetof(struct AutoChoice, present),
	sizeof(((struct AutoChoice *)0)->present),
	asn_MAP_AutoChoice_tag2el_1,
	2,	/* Count of tags in the map */
	.canonical_order = 0,
	.ext_start = -1	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_AutoChoice = {
	"AutoChoice",
	"AutoChoice",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_decode_xer,
	CHOICE_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	0,	/* No PER visible constraints */
	asn_MBR_AutoChoice_1,
	2,	/* Elements count */
	&asn_SPC_AutoChoice_specs_1	/* Additional specs */
};

