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

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

/*** <<< DEPS [LogLine] >>> ***/

extern asn1_TYPE_descriptor_t asn1_DEF_LogLine;

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


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

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

	static asn1_SET_OF_element_t asn1_DEF_varsets_elements[] = {
		{ (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
			(void *)&asn1_DEF_VariablePartSet },
	};
	static ber_tlv_tag_t asn1_DEF_varsets_tags[] = {
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
	};
	static asn1_SET_OF_specifics_t asn1_DEF_varsets_specs = {
		sizeof(struct varsets),
		offsetof(struct varsets, _ber_dec_ctx),
		asn1_DEF_varsets_elements
	};
	asn1_TYPE_descriptor_t asn1_DEF_varsets = {
		"varsets",
		SEQUENCE_OF_constraint,
		SEQUENCE_OF_decode_ber,
		SEQUENCE_OF_encode_der,
		SEQUENCE_OF_print,
		SEQUENCE_OF_free,
		0,	/* Use generic outmost tag fetcher */
		asn1_DEF_varsets_tags,
		sizeof(asn1_DEF_varsets_tags)
			/sizeof(asn1_DEF_varsets_tags[0]), /* 1 */
		1,	/* Tags to skip */
		1,	/* Whether CONSTRUCTED */
		&asn1_DEF_varsets_specs	/* Additional specs */
	};
	
static asn1_SEQUENCE_element_t asn1_DEF_LogLine_elements[] = {
	{ offsetof(struct LogLine, line_digest), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (22 << 2)),
		0,
		(void *)&asn1_DEF_IA5String,
		"line-digest"
		},
	{ offsetof(struct LogLine, varsets), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		(void *)&asn1_DEF_varsets,
		"varsets"
		},
};
static ber_tlv_tag_t asn1_DEF_LogLine_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_LogLine_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 asn1_SEQUENCE_specifics_t asn1_DEF_LogLine_specs = {
	sizeof(struct LogLine),
	offsetof(struct LogLine, _ber_dec_ctx),
	asn1_DEF_LogLine_elements,
	2,	/* Elements count */
	asn1_DEF_LogLine_tag2el,
	2,	/* Count of tags in the map */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_LogLine = {
	"LogLine",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_LogLine_tags,
	sizeof(asn1_DEF_LogLine_tags)
		/sizeof(asn1_DEF_LogLine_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	&asn1_DEF_LogLine_specs	/* Additional specs */
};


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

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

/*** <<< DEPS [VariablePartSet] >>> ***/

extern asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet;

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


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

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

	static asn1_SET_OF_element_t asn1_DEF_vparts_elements[] = {
		{ -1 /* Ambiguous tag (CHOICE?) */,
			(void *)&asn1_DEF_VariablePart },
	};
	static ber_tlv_tag_t asn1_DEF_vparts_tags[] = {
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
	};
	static asn1_SET_OF_specifics_t asn1_DEF_vparts_specs = {
		sizeof(struct vparts),
		offsetof(struct vparts, _ber_dec_ctx),
		asn1_DEF_vparts_elements
	};
	asn1_TYPE_descriptor_t asn1_DEF_vparts = {
		"vparts",
		SEQUENCE_OF_constraint,
		SEQUENCE_OF_decode_ber,
		SEQUENCE_OF_encode_der,
		SEQUENCE_OF_print,
		SEQUENCE_OF_free,
		0,	/* Use generic outmost tag fetcher */
		asn1_DEF_vparts_tags,
		sizeof(asn1_DEF_vparts_tags)
			/sizeof(asn1_DEF_vparts_tags[0]), /* 1 */
		1,	/* Tags to skip */
		1,	/* Whether CONSTRUCTED */
		&asn1_DEF_vparts_specs	/* Additional specs */
	};
	
static asn1_SEQUENCE_element_t asn1_DEF_VariablePartSet_elements[] = {
	{ offsetof(struct VariablePartSet, vparts), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		(void *)&asn1_DEF_vparts,
		"vparts"
		},
	{ offsetof(struct VariablePartSet, resolution), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		(void *)&asn1_DEF_ActionItem,
		"resolution"
		},
};
static ber_tlv_tag_t asn1_DEF_VariablePartSet_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_VariablePartSet_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 asn1_SEQUENCE_specifics_t asn1_DEF_VariablePartSet_specs = {
	sizeof(struct VariablePartSet),
	offsetof(struct VariablePartSet, _ber_dec_ctx),
	asn1_DEF_VariablePartSet_elements,
	2,	/* Elements count */
	asn1_DEF_VariablePartSet_tag2el,
	2,	/* Count of tags in the map */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet = {
	"VariablePartSet",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_VariablePartSet_tags,
	sizeof(asn1_DEF_VariablePartSet_tags)
		/sizeof(asn1_DEF_VariablePartSet_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	&asn1_DEF_VariablePartSet_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;
extern asn1_TYPE_descriptor_t asn1_DEF_VariablePart;

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


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

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

		static asn1_SET_OF_element_t asn1_DEF_vset_elements[] = {
			{ (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)),
				(void *)&asn1_DEF_VisibleString },
		};
		static ber_tlv_tag_t asn1_DEF_vset_tags[] = {
			(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
		};
		static asn1_SET_OF_specifics_t asn1_DEF_vset_specs = {
			sizeof(struct vset),
			offsetof(struct vset, _ber_dec_ctx),
			asn1_DEF_vset_elements
		};
		asn1_TYPE_descriptor_t asn1_DEF_vset = {
			"vset",
			SET_OF_constraint,
			SET_OF_decode_ber,
			SET_OF_encode_der,
			SET_OF_print,
			SET_OF_free,
			0,	/* Use generic outmost tag fetcher */
			asn1_DEF_vset_tags,
			sizeof(asn1_DEF_vset_tags)
				/sizeof(asn1_DEF_vset_tags[0]), /* 1 */
			1,	/* Tags to skip */
			1,	/* Whether CONSTRUCTED */
			&asn1_DEF_vset_specs	/* Additional specs */
		};
		
		static asn1_SEQUENCE_element_t asn1_DEF_vrange_elements[] = {
			{ offsetof(struct vrange, from), 0,
				(ASN_TAG_CLASS_UNIVERSAL | (26 << 2)),
				0,
				(void *)&asn1_DEF_VisibleString,
				"from"
				},
			{ offsetof(struct vrange, to), 0,
				(ASN_TAG_CLASS_UNIVERSAL | (26 << 2)),
				0,
				(void *)&asn1_DEF_VisibleString,
				"to"
				},
		};
		static ber_tlv_tag_t asn1_DEF_vrange_tags[] = {
			(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
		};
		static asn1_TYPE_tag2member_t asn1_DEF_vrange_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 asn1_SEQUENCE_specifics_t asn1_DEF_vrange_specs = {
			sizeof(struct vrange),
			offsetof(struct vrange, _ber_dec_ctx),
			asn1_DEF_vrange_elements,
			2,	/* Elements count */
			asn1_DEF_vrange_tag2el,
			2,	/* Count of tags in the map */
			1,	/* Start extensions */
			3	/* Stop extensions */
		};
		asn1_TYPE_descriptor_t asn1_DEF_vrange = {
			"vrange",
			SEQUENCE_constraint,
			SEQUENCE_decode_ber,
			SEQUENCE_encode_der,
			SEQUENCE_print,
			SEQUENCE_free,
			0,	/* Use generic outmost tag fetcher */
			asn1_DEF_vrange_tags,
			sizeof(asn1_DEF_vrange_tags)
				/sizeof(asn1_DEF_vrange_tags[0]), /* 1 */
			1,	/* Tags to skip */
			1,	/* Whether CONSTRUCTED */
			&asn1_DEF_vrange_specs	/* Additional specs */
		};
		
static asn1_CHOICE_element_t asn1_DEF_VariablePart_elements[] = {
	{ offsetof(struct VariablePart, choice.vset), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		0,
		(void *)&asn1_DEF_vset,
		"vset"
		},
	{ offsetof(struct VariablePart, choice.vrange), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		(void *)&asn1_DEF_vrange,
		"vrange"
		},
};
static asn1_TYPE_tag2member_t asn1_DEF_VariablePart_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 asn1_CHOICE_specifics_t asn1_DEF_VariablePart_specs = {
	sizeof(struct VariablePart),
	offsetof(struct VariablePart, _ber_dec_ctx),
	offsetof(struct VariablePart, present),
	sizeof(((struct VariablePart *)0)->present),
	asn1_DEF_VariablePart_elements,
	2,	/* Elements count */
	asn1_DEF_VariablePart_tag2el,
	2,	/* Count of tags in the map */
	1	/* Whether extensible */
};
asn1_TYPE_descriptor_t asn1_DEF_VariablePart = {
	"VariablePart",
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_print,
	CHOICE_free,
	CHOICE_outmost_tag,
	0,	/* No explicit tags (pointer) */
	0,	/* No explicit tags (count) */
	0,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	&asn1_DEF_VariablePart_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;
extern asn1_TYPE_descriptor_t asn1_DEF_ActionItem;

/*** <<< 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 */
			ber_dec_ctx_t _ber_dec_ctx;
		} email;
		/*
		 * This type is extensible,
		 * possible extensions are below.
		 */
		
		/* Context for parsing across buffer boundaries */
		ber_dec_ctx_t _ber_dec_ctx;
	} *notify;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} ActionItem_t;

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

		static asn1_SET_OF_element_t asn1_DEF_email_elements[] = {
			{ (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)),
				(void *)&asn1_DEF_VisibleString },
		};
		static ber_tlv_tag_t asn1_DEF_email_tags[] = {
			(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
		};
		static asn1_SET_OF_specifics_t asn1_DEF_email_specs = {
			sizeof(struct email),
			offsetof(struct email, _ber_dec_ctx),
			asn1_DEF_email_elements
		};
		asn1_TYPE_descriptor_t asn1_DEF_email = {
			"email",
			SET_OF_constraint,
			SET_OF_decode_ber,
			SET_OF_encode_der,
			SET_OF_print,
			SET_OF_free,
			0,	/* Use generic outmost tag fetcher */
			asn1_DEF_email_tags,
			sizeof(asn1_DEF_email_tags)
				/sizeof(asn1_DEF_email_tags[0]), /* 1 */
			1,	/* Tags to skip */
			1,	/* Whether CONSTRUCTED */
			&asn1_DEF_email_specs	/* Additional specs */
		};
		
	static asn1_SEQUENCE_element_t asn1_DEF_notify_elements[] = {
		{ offsetof(struct notify, critical), 0,
			(ASN_TAG_CLASS_UNIVERSAL | (1 << 2)),
			0,
			(void *)&asn1_DEF_BOOLEAN,
			"critical"
			},
		{ offsetof(struct notify, email), 0,
			(ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
			0,
			(void *)&asn1_DEF_email,
			"email"
			},
	};
	static ber_tlv_tag_t asn1_DEF_notify_tags[] = {
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
	};
	static asn1_TYPE_tag2member_t asn1_DEF_notify_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 asn1_SEQUENCE_specifics_t asn1_DEF_notify_specs = {
		sizeof(struct notify),
		offsetof(struct notify, _ber_dec_ctx),
		asn1_DEF_notify_elements,
		2,	/* Elements count */
		asn1_DEF_notify_tag2el,
		2,	/* Count of tags in the map */
		1,	/* Start extensions */
		3	/* Stop extensions */
	};
	asn1_TYPE_descriptor_t asn1_DEF_notify = {
		"notify",
		SEQUENCE_constraint,
		SEQUENCE_decode_ber,
		SEQUENCE_encode_der,
		SEQUENCE_print,
		SEQUENCE_free,
		0,	/* Use generic outmost tag fetcher */
		asn1_DEF_notify_tags,
		sizeof(asn1_DEF_notify_tags)
			/sizeof(asn1_DEF_notify_tags[0]), /* 1 */
		1,	/* Tags to skip */
		1,	/* Whether CONSTRUCTED */
		&asn1_DEF_notify_specs	/* Additional specs */
	};
	
static asn1_SEQUENCE_element_t asn1_DEF_ActionItem_elements[] = {
	{ offsetof(struct ActionItem, accept_as), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		(void *)&asn1_DEF_ENUMERATED,
		"accept-as"
		},
	{ offsetof(struct ActionItem, notify), 1,
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		(void *)&asn1_DEF_notify,
		"notify"
		},
};
static ber_tlv_tag_t asn1_DEF_ActionItem_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_ActionItem_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 asn1_SEQUENCE_specifics_t asn1_DEF_ActionItem_specs = {
	sizeof(struct ActionItem),
	offsetof(struct ActionItem, _ber_dec_ctx),
	asn1_DEF_ActionItem_elements,
	2,	/* Elements count */
	asn1_DEF_ActionItem_tag2el,
	2,	/* Count of tags in the map */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_ActionItem = {
	"ActionItem",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_ActionItem_tags,
	sizeof(asn1_DEF_ActionItem_tags)
		/sizeof(asn1_DEF_ActionItem_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	&asn1_DEF_ActionItem_specs	/* Additional specs */
};

