
/*** <<< INCLUDES [LogLine] >>> ***/

#include <IA5String.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>
#include <constr_SEQUENCE.h>

/*** <<< FWD-DECLS [LogLine] >>> ***/

struct VariablePartSet;

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

typedef struct LogLine {
	IA5String_t	 line_digest;
	struct varsets {
		A_SEQUENCE_OF(struct VariablePartSet) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} varsets;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} LogLine_t;

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

extern asn_TYPE_descriptor_t asn_DEF_LogLine;

/*** <<< POST-INCLUDE [LogLine] >>> ***/

#include <VariablePartSet.h>

/*** <<< CODE [LogLine] >>> ***/

static int
memb_varsets_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	size_t size;
	
	if(!sptr) {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	{ /* Determine the number of elements */
		const A_SEQUENCE_OF(void) *list;
		(const void *)list = sptr;
		size = list->count;
	}
	
	if((size >= 1)) {
		/* Perform validation of the inner elements */
		return td->check_constraints(td, sptr, app_errlog, app_key);
	} else {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}


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

static asn_TYPE_member_t asn_MBR_varsets_3[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_VariablePartSet,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_varsets_3_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_varsets_3_specs = {
	sizeof(struct varsets),
	offsetof(struct varsets, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_varsets_3 = {
	"varsets",
	"varsets",
	SEQUENCE_OF_free,
	SEQUENCE_OF_print,
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	SEQUENCE_OF_decode_xer,
	SEQUENCE_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_varsets_3_tags,
	sizeof(asn_DEF_varsets_3_tags)
		/sizeof(asn_DEF_varsets_3_tags[0]), /* 1 */
	asn_DEF_varsets_3_tags,	/* Same as above */
	sizeof(asn_DEF_varsets_3_tags)
		/sizeof(asn_DEF_varsets_3_tags[0]), /* 1 */
	asn_MBR_varsets_3,
	1,	/* Single element */
	&asn_SPC_varsets_3_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_LogLine_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct LogLine, line_digest),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_IA5String,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "line-digest"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct LogLine, varsets),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_varsets_3,
		.memb_constraints = memb_varsets_1_constraint,
		.name = "varsets"
		},
};
static ber_tlv_tag_t asn_DEF_LogLine_1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_LogLine_1_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* varsets at 25 */
    { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), 0, 0, 0 } /* line-digest at 23 */
};
static asn_SEQUENCE_specifics_t asn_SPC_LogLine_1_specs = {
	sizeof(struct LogLine),
	offsetof(struct LogLine, _asn_ctx),
	asn_MAP_LogLine_1_tag2el,
	2,	/* Count of tags in the map */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_LogLine = {
	"LogLine",
	"LogLine",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_LogLine_1_tags,
	sizeof(asn_DEF_LogLine_1_tags)
		/sizeof(asn_DEF_LogLine_1_tags[0]), /* 1 */
	asn_DEF_LogLine_1_tags,	/* Same as above */
	sizeof(asn_DEF_LogLine_1_tags)
		/sizeof(asn_DEF_LogLine_1_tags[0]), /* 1 */
	asn_MBR_LogLine_1,
	2,	/* Elements count */
	&asn_SPC_LogLine_1_specs	/* Additional specs */
};


/*** <<< INCLUDES [VariablePartSet] >>> ***/

#include <ActionItem.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>
#include <constr_SEQUENCE.h>

/*** <<< FWD-DECLS [VariablePartSet] >>> ***/

struct VariablePart;

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

typedef struct VariablePartSet {
	struct vparts {
		A_SEQUENCE_OF(struct VariablePart) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} vparts;
	ActionItem_t	 resolution;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} VariablePartSet_t;

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

extern asn_TYPE_descriptor_t asn_DEF_VariablePartSet;

/*** <<< POST-INCLUDE [VariablePartSet] >>> ***/

#include <VariablePart.h>

/*** <<< CODE [VariablePartSet] >>> ***/

static int
memb_vparts_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	
	if(!sptr) {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->check_constraints(td, sptr, app_errlog, app_key);
}


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

static asn_TYPE_member_t asn_MBR_vparts_2[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = -1 /* Ambiguous tag (CHOICE?) */,
		.tag_mode = 0,
		.type = (void *)&asn_DEF_VariablePart,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_vparts_2_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_vparts_2_specs = {
	sizeof(struct vparts),
	offsetof(struct vparts, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_vparts_2 = {
	"vparts",
	"vparts",
	SEQUENCE_OF_free,
	SEQUENCE_OF_print,
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	SEQUENCE_OF_decode_xer,
	SEQUENCE_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_vparts_2_tags,
	sizeof(asn_DEF_vparts_2_tags)
		/sizeof(asn_DEF_vparts_2_tags[0]), /* 1 */
	asn_DEF_vparts_2_tags,	/* Same as above */
	sizeof(asn_DEF_vparts_2_tags)
		/sizeof(asn_DEF_vparts_2_tags[0]), /* 1 */
	asn_MBR_vparts_2,
	1,	/* Single element */
	&asn_SPC_vparts_2_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_VariablePartSet_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct VariablePartSet, vparts),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_vparts_2,
		.memb_constraints = memb_vparts_1_constraint,
		.name = "vparts"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct VariablePartSet, resolution),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_ActionItem,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "resolution"
		},
};
static ber_tlv_tag_t asn_DEF_VariablePartSet_1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_VariablePartSet_1_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* vparts at 33 */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* resolution at 35 */
};
static asn_SEQUENCE_specifics_t asn_SPC_VariablePartSet_1_specs = {
	sizeof(struct VariablePartSet),
	offsetof(struct VariablePartSet, _asn_ctx),
	asn_MAP_VariablePartSet_1_tag2el,
	2,	/* Count of tags in the map */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_VariablePartSet = {
	"VariablePartSet",
	"VariablePartSet",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_VariablePartSet_1_tags,
	sizeof(asn_DEF_VariablePartSet_1_tags)
		/sizeof(asn_DEF_VariablePartSet_1_tags[0]), /* 1 */
	asn_DEF_VariablePartSet_1_tags,	/* Same as above */
	sizeof(asn_DEF_VariablePartSet_1_tags)
		/sizeof(asn_DEF_VariablePartSet_1_tags[0]), /* 1 */
	asn_MBR_VariablePartSet_1,
	2,	/* Elements count */
	&asn_SPC_VariablePartSet_1_specs	/* Additional specs */
};


/*** <<< INCLUDES [VariablePart] >>> ***/

#include <VisibleString.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>
#include <constr_SEQUENCE.h>
#include <constr_CHOICE.h>

/*** <<< DEPS [VariablePart] >>> ***/

typedef enum VariablePart_PR {
	VariablePart_PR_NOTHING,	/* No components present */
	VariablePart_PR_vset,
	VariablePart_PR_vrange,
	/* Extensions may appear below */
} VariablePart_PR;

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

typedef struct VariablePart {
	VariablePart_PR present;
	union {
		struct vset {
			A_SET_OF(VisibleString_t) list;
			
			/* Context for parsing across buffer boundaries */
			asn_struct_ctx_t _asn_ctx;
		} vset;
		struct vrange {
			VisibleString_t	 from;
			VisibleString_t	 to;
			/*
			 * This type is extensible,
			 * possible extensions are below.
			 */
			
			/* Context for parsing across buffer boundaries */
			asn_struct_ctx_t _asn_ctx;
		} vrange;
		/*
		 * This type is extensible,
		 * possible extensions are below.
		 */
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} VariablePart_t;

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

extern asn_TYPE_descriptor_t asn_DEF_VariablePart;

/*** <<< CODE [VariablePart] >>> ***/

static int
memb_vset_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	size_t size;
	
	if(!sptr) {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	{ /* Determine the number of elements */
		const A_SET_OF(void) *list;
		(const void *)list = sptr;
		size = list->count;
	}
	
	if((size >= 1)) {
		/* Perform validation of the inner elements */
		return td->check_constraints(td, sptr, app_errlog, app_key);
	} else {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}


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

static asn_TYPE_member_t asn_MBR_vset_2[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_VisibleString,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_vset_2_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_vset_2_specs = {
	sizeof(struct vset),
	offsetof(struct vset, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_vset_2 = {
	"vset",
	"vset",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	SET_OF_decode_xer,
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_vset_2_tags,
	sizeof(asn_DEF_vset_2_tags)
		/sizeof(asn_DEF_vset_2_tags[0]), /* 1 */
	asn_DEF_vset_2_tags,	/* Same as above */
	sizeof(asn_DEF_vset_2_tags)
		/sizeof(asn_DEF_vset_2_tags[0]), /* 1 */
	asn_MBR_vset_2,
	1,	/* Single element */
	&asn_SPC_vset_2_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_vrange_4[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct vrange, from),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_VisibleString,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "from"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct vrange, to),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_VisibleString,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "to"
		},
};
static ber_tlv_tag_t asn_DEF_vrange_4_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_vrange_4_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 0, 0, 1 }, /* from at 45 */
    { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), 1, -1, 0 } /* to at 46 */
};
static asn_SEQUENCE_specifics_t asn_SPC_vrange_4_specs = {
	sizeof(struct vrange),
	offsetof(struct vrange, _asn_ctx),
	asn_MAP_vrange_4_tag2el,
	2,	/* Count of tags in the map */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_vrange_4 = {
	"vrange",
	"vrange",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_vrange_4_tags,
	sizeof(asn_DEF_vrange_4_tags)
		/sizeof(asn_DEF_vrange_4_tags[0]), /* 1 */
	asn_DEF_vrange_4_tags,	/* Same as above */
	sizeof(asn_DEF_vrange_4_tags)
		/sizeof(asn_DEF_vrange_4_tags[0]), /* 1 */
	asn_MBR_vrange_4,
	2,	/* Elements count */
	&asn_SPC_vrange_4_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_VariablePart_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct VariablePart, choice.vset),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_vset_2,
		.memb_constraints = memb_vset_1_constraint,
		.name = "vset"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct VariablePart, choice.vrange),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_vrange_4,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "vrange"
		},
};
static asn_TYPE_tag2member_t asn_MAP_VariablePart_1_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* vrange at 45 */
    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 } /* vset at 42 */
};
static asn_CHOICE_specifics_t asn_SPC_VariablePart_1_specs = {
	sizeof(struct VariablePart),
	offsetof(struct VariablePart, _asn_ctx),
	offsetof(struct VariablePart, present),
	sizeof(((struct VariablePart *)0)->present),
	asn_MAP_VariablePart_1_tag2el,
	2,	/* Count of tags in the map */
	1	/* Whether extensible */
};
asn_TYPE_descriptor_t asn_DEF_VariablePart = {
	"VariablePart",
	"VariablePart",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_decode_xer,
	CHOICE_encode_xer,
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	asn_MBR_VariablePart_1,
	2,	/* Elements count */
	&asn_SPC_VariablePart_1_specs	/* Additional specs */
};


/*** <<< INCLUDES [ActionItem] >>> ***/

#include <ENUMERATED.h>
#include <BOOLEAN.h>
#include <VisibleString.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>
#include <constr_SEQUENCE.h>

/*** <<< DEPS [ActionItem] >>> ***/

typedef enum accept_as {
	accept_as_unknown	= 0,
	accept_as_safe	= 1,
	accept_as_unsafe	= 2
	/*
	 * Enumeration is extensible
	 */
} accept_as_e;

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

typedef struct ActionItem {
	ENUMERATED_t	 accept_as;
	struct notify {
		BOOLEAN_t	 critical;
		struct email {
			A_SET_OF(VisibleString_t) list;
			
			/* Context for parsing across buffer boundaries */
			asn_struct_ctx_t _asn_ctx;
		} email;
		/*
		 * This type is extensible,
		 * possible extensions are below.
		 */
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} *notify;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} ActionItem_t;

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

/* extern asn_TYPE_descriptor_t asn_DEF_accept_as_2;	// (Use -fall-defs-global to expose) */
extern asn_TYPE_descriptor_t asn_DEF_ActionItem;

/*** <<< CODE [ActionItem] >>> ***/

static int
accept_as_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	/* Replace with underlying type checker */
	td->check_constraints = asn_DEF_ENUMERATED.check_constraints;
	return td->check_constraints(td, sptr, app_errlog, app_key);
}

/*
 * This type is implemented using ENUMERATED,
 * so here we adjust the DEF accordingly.
 */
static void
accept_as_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_ENUMERATED.free_struct;
	td->print_struct   = asn_DEF_ENUMERATED.print_struct;
	td->ber_decoder    = asn_DEF_ENUMERATED.ber_decoder;
	td->der_encoder    = asn_DEF_ENUMERATED.der_encoder;
	td->xer_decoder    = asn_DEF_ENUMERATED.xer_decoder;
	td->xer_encoder    = asn_DEF_ENUMERATED.xer_encoder;
	td->elements       = asn_DEF_ENUMERATED.elements;
	td->elements_count = asn_DEF_ENUMERATED.elements_count;
     /* td->specifics      = asn_DEF_ENUMERATED.specifics;	// Defined explicitly */
}

static void
accept_as_2_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	accept_as_2_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

static int
accept_as_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	accept_as_2_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

static asn_dec_rval_t
accept_as_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const void *bufptr, size_t size, int tag_mode) {
	accept_as_2_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

static asn_enc_rval_t
accept_as_2_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	accept_as_2_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

static asn_dec_rval_t
accept_as_2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
	accept_as_2_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

static asn_enc_rval_t
accept_as_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	accept_as_2_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


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

static asn_INTEGER_enum_map_t asn_MAP_accept_as_2_value2enum[] = {
	{ 0,	7,	"unknown" },
	{ 1,	4,	"safe" },
	{ 2,	6,	"unsafe" }
	/* This list is extensible */
};
static unsigned int asn_MAP_accept_as_2_enum2value[] = {
	1,	/* safe(1) */
	0,	/* unknown(0) */
	2	/* unsafe(2) */
	/* This list is extensible */
};
static asn_INTEGER_specifics_t asn_SPC_accept_as_2_specs = {
	asn_MAP_accept_as_2_value2enum,	/* "tag" => N; sorted by tag */
	asn_MAP_accept_as_2_enum2value,	/* N => "tag"; sorted by N */
	3,	/* Number of elements in the maps */
	1,	/* Enumeration is extensible */
	1	/* Strict enumeration */
};
static ber_tlv_tag_t asn_DEF_accept_as_2_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_accept_as_2 = {
	"accept-as",
	"accept-as",
	accept_as_2_free,
	accept_as_2_print,
	accept_as_2_constraint,
	accept_as_2_decode_ber,
	accept_as_2_encode_der,
	accept_as_2_decode_xer,
	accept_as_2_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_accept_as_2_tags,
	sizeof(asn_DEF_accept_as_2_tags)
		/sizeof(asn_DEF_accept_as_2_tags[0]), /* 1 */
	asn_DEF_accept_as_2_tags,	/* Same as above */
	sizeof(asn_DEF_accept_as_2_tags)
		/sizeof(asn_DEF_accept_as_2_tags[0]), /* 1 */
	0, 0,	/* Defined elsewhere */
	&asn_SPC_accept_as_2_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_email_9[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_VisibleString,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_email_9_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_email_9_specs = {
	sizeof(struct email),
	offsetof(struct email, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_email_9 = {
	"email",
	"email",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	SET_OF_decode_xer,
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_email_9_tags,
	sizeof(asn_DEF_email_9_tags)
		/sizeof(asn_DEF_email_9_tags[0]), /* 1 */
	asn_DEF_email_9_tags,	/* Same as above */
	sizeof(asn_DEF_email_9_tags)
		/sizeof(asn_DEF_email_9_tags[0]), /* 1 */
	asn_MBR_email_9,
	1,	/* Single element */
	&asn_SPC_email_9_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_notify_7[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct notify, critical),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_BOOLEAN,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "critical"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct notify, email),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_email_9,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "email"
		},
};
static ber_tlv_tag_t asn_DEF_notify_7_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_notify_7_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 }, /* critical at 61 */
    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 1, 0, 0 } /* email at 62 */
};
static asn_SEQUENCE_specifics_t asn_SPC_notify_7_specs = {
	sizeof(struct notify),
	offsetof(struct notify, _asn_ctx),
	asn_MAP_notify_7_tag2el,
	2,	/* Count of tags in the map */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_notify_7 = {
	"notify",
	"notify",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_notify_7_tags,
	sizeof(asn_DEF_notify_7_tags)
		/sizeof(asn_DEF_notify_7_tags[0]), /* 1 */
	asn_DEF_notify_7_tags,	/* Same as above */
	sizeof(asn_DEF_notify_7_tags)
		/sizeof(asn_DEF_notify_7_tags[0]), /* 1 */
	asn_MBR_notify_7,
	2,	/* Elements count */
	&asn_SPC_notify_7_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_ActionItem_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ActionItem, accept_as),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_accept_as_2,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "accept-as"
		},
	{ ATF_POINTER, 1, offsetof(struct ActionItem, notify),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_notify_7,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "notify"
		},
};
static ber_tlv_tag_t asn_DEF_ActionItem_1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_ActionItem_1_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, 0, 0 }, /* accept-as at 55 */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 } /* notify at 61 */
};
static asn_SEQUENCE_specifics_t asn_SPC_ActionItem_1_specs = {
	sizeof(struct ActionItem),
	offsetof(struct ActionItem, _asn_ctx),
	asn_MAP_ActionItem_1_tag2el,
	2,	/* Count of tags in the map */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_ActionItem = {
	"ActionItem",
	"ActionItem",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_ActionItem_1_tags,
	sizeof(asn_DEF_ActionItem_1_tags)
		/sizeof(asn_DEF_ActionItem_1_tags[0]), /* 1 */
	asn_DEF_ActionItem_1_tags,	/* Same as above */
	sizeof(asn_DEF_ActionItem_1_tags)
		/sizeof(asn_DEF_ActionItem_1_tags[0]), /* 1 */
	asn_MBR_ActionItem_1,
	2,	/* Elements count */
	&asn_SPC_ActionItem_1_specs	/* Additional specs */
};

