
/*** <<< INCLUDES [Programming] >>> ***/

#include <Fault.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>

/*** <<< DEPS [Programming] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Programming;

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


typedef struct Programming {
	A_SEQUENCE_OF(Fault_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Programming_t;

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

static asn_TYPE_member_t asn_MBR_Programming[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_Fault,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_Programming_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_Programming_specs = {
	sizeof(struct Programming),
	offsetof(struct Programming, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Programming = {
	"Programming",
	SEQUENCE_OF_free,
	SEQUENCE_OF_print,
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	0,				/* Not implemented yet */
	SEQUENCE_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Programming_tags,
	sizeof(asn_DEF_Programming_tags)
		/sizeof(asn_DEF_Programming_tags[0]), /* 1 */
	asn_DEF_Programming_tags,	/* Same as above */
	sizeof(asn_DEF_Programming_tags)
		/sizeof(asn_DEF_Programming_tags[0]), /* 1 */
	asn_MBR_Programming,
	1,	/* Single element */
	&asn_DEF_Programming_specs	/* Additional specs */
};


/*** <<< INCLUDES [Fault] >>> ***/

#include <Error.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< DEPS [Fault] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Fault;

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


typedef struct Fault {
	A_SET_OF(Error_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Fault_t;

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

static asn_TYPE_member_t asn_MBR_Fault[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Error,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_Fault_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_Fault_specs = {
	sizeof(struct Fault),
	offsetof(struct Fault, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Fault = {
	"Fault",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	0,				/* Not implemented yet */
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Fault_tags,
	sizeof(asn_DEF_Fault_tags)
		/sizeof(asn_DEF_Fault_tags[0]), /* 1 */
	asn_DEF_Fault_tags,	/* Same as above */
	sizeof(asn_DEF_Fault_tags)
		/sizeof(asn_DEF_Fault_tags[0]), /* 1 */
	asn_MBR_Fault,
	1,	/* Single element */
	&asn_DEF_Fault_specs	/* Additional specs */
};


/*** <<< INCLUDES [Error] >>> ***/

#include <constr_SEQUENCE.h>

/*** <<< DEPS [Error] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Error;

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


typedef struct Error {
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Error_t;

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

static ber_tlv_tag_t asn_DEF_Error_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_Error_tag2el[] = {
};
static asn_SEQUENCE_specifics_t asn_DEF_Error_specs = {
	sizeof(struct Error),
	offsetof(struct Error, _asn_ctx),
	asn_DEF_Error_tag2el,
	0,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Error = {
	"Error",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	0,				/* Not implemented yet */
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Error_tags,
	sizeof(asn_DEF_Error_tags)
		/sizeof(asn_DEF_Error_tags[0]), /* 1 */
	asn_DEF_Error_tags,	/* Same as above */
	sizeof(asn_DEF_Error_tags)
		/sizeof(asn_DEF_Error_tags[0]), /* 1 */
	0, 0,	/* No members */
	&asn_DEF_Error_specs	/* Additional specs */
};

