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

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

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

struct Fault;

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

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

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

extern asn_TYPE_descriptor_t asn_DEF_Programming;

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

#include "Fault.h"

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

static asn_TYPE_member_t asn_MBR_Programming_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_Fault,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		.default_value = 0,
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_Programming_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_Programming_specs_1 = {
	sizeof(struct Programming),
	offsetof(struct Programming, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Programming = {
	"Programming",
	"Programming",
	&asn_OP_SEQUENCE_OF,
	asn_DEF_Programming_tags_1,
	sizeof(asn_DEF_Programming_tags_1)
		/sizeof(asn_DEF_Programming_tags_1[0]), /* 1 */
	asn_DEF_Programming_tags_1,	/* Same as above */
	sizeof(asn_DEF_Programming_tags_1)
		/sizeof(asn_DEF_Programming_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_OF_constraint },
	asn_MBR_Programming_1,
	1,	/* Single element */
	&asn_SPC_Programming_specs_1	/* Additional specs */
};


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

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

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

struct Error;

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

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

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

extern asn_TYPE_descriptor_t asn_DEF_Fault;
extern asn_SET_OF_specifics_t asn_SPC_Fault_specs_1;
extern asn_TYPE_member_t asn_MBR_Fault_1[1];

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

#include "Error.h"

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

asn_TYPE_member_t asn_MBR_Fault_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Error,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		.default_value = 0,
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_Fault_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
asn_SET_OF_specifics_t asn_SPC_Fault_specs_1 = {
	sizeof(struct Fault),
	offsetof(struct Fault, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Fault = {
	"Fault",
	"Fault",
	&asn_OP_SET_OF,
	asn_DEF_Fault_tags_1,
	sizeof(asn_DEF_Fault_tags_1)
		/sizeof(asn_DEF_Fault_tags_1[0]), /* 1 */
	asn_DEF_Fault_tags_1,	/* Same as above */
	sizeof(asn_DEF_Fault_tags_1)
		/sizeof(asn_DEF_Fault_tags_1[0]), /* 1 */
	{ 0, 0, SET_OF_constraint },
	asn_MBR_Fault_1,
	1,	/* Single element */
	&asn_SPC_Fault_specs_1	/* Additional specs */
};


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

#include <constr_SEQUENCE.h>

/*** <<< 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;

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

extern asn_TYPE_descriptor_t asn_DEF_Error;
extern asn_SEQUENCE_specifics_t asn_SPC_Error_specs_1;

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

static const ber_tlv_tag_t asn_DEF_Error_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
asn_SEQUENCE_specifics_t asn_SPC_Error_specs_1 = {
	sizeof(struct Error),
	offsetof(struct Error, _asn_ctx),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Error = {
	"Error",
	"Error",
	&asn_OP_SEQUENCE,
	asn_DEF_Error_tags_1,
	sizeof(asn_DEF_Error_tags_1)
		/sizeof(asn_DEF_Error_tags_1[0]), /* 1 */
	asn_DEF_Error_tags_1,	/* Same as above */
	sizeof(asn_DEF_Error_tags_1)
		/sizeof(asn_DEF_Error_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	0, 0,	/* No members */
	&asn_SPC_Error_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SeqWithMandatory] >>> ***/

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

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

struct Error;

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

typedef struct SeqWithMandatory {
	UTF8String_t	 someString;
	struct seqOfMan {
		A_SEQUENCE_OF(struct Error) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} seqOfMan;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SeqWithMandatory_t;

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

extern asn_TYPE_descriptor_t asn_DEF_SeqWithMandatory;

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

#include "Error.h"

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

static asn_TYPE_member_t asn_MBR_seqOfMan_3[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Error,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		.default_value = 0,
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_seqOfMan_tags_3[] = {
	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_seqOfMan_specs_3 = {
	sizeof(struct seqOfMan),
	offsetof(struct seqOfMan, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_seqOfMan_3 = {
	"seqOfMan",
	"seqOfMan",
	&asn_OP_SEQUENCE_OF,
	asn_DEF_seqOfMan_tags_3,
	sizeof(asn_DEF_seqOfMan_tags_3)
		/sizeof(asn_DEF_seqOfMan_tags_3[0]), /* 2 */
	asn_DEF_seqOfMan_tags_3,	/* Same as above */
	sizeof(asn_DEF_seqOfMan_tags_3)
		/sizeof(asn_DEF_seqOfMan_tags_3[0]), /* 2 */
	{ 0, 0, SEQUENCE_OF_constraint },
	asn_MBR_seqOfMan_3,
	1,	/* Single element */
	&asn_SPC_seqOfMan_specs_3	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_SeqWithMandatory_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SeqWithMandatory, someString),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_UTF8String,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		.default_value = 0,
		.name = "someString"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct SeqWithMandatory, seqOfMan),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_seqOfMan_3,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		.default_value = 0,
		.name = "seqOfMan"
		},
};
static const ber_tlv_tag_t asn_DEF_SeqWithMandatory_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SeqWithMandatory_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), 0, 0, 0 }, /* someString */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 } /* seqOfMan */
};
static asn_SEQUENCE_specifics_t asn_SPC_SeqWithMandatory_specs_1 = {
	sizeof(struct SeqWithMandatory),
	offsetof(struct SeqWithMandatory, _asn_ctx),
	.tag2el = asn_MAP_SeqWithMandatory_tag2el_1,
	.tag2el_count = 2,	/* 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_SeqWithMandatory = {
	"SeqWithMandatory",
	"SeqWithMandatory",
	&asn_OP_SEQUENCE,
	asn_DEF_SeqWithMandatory_tags_1,
	sizeof(asn_DEF_SeqWithMandatory_tags_1)
		/sizeof(asn_DEF_SeqWithMandatory_tags_1[0]), /* 1 */
	asn_DEF_SeqWithMandatory_tags_1,	/* Same as above */
	sizeof(asn_DEF_SeqWithMandatory_tags_1)
		/sizeof(asn_DEF_SeqWithMandatory_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_SeqWithMandatory_1,
	2,	/* Elements count */
	&asn_SPC_SeqWithMandatory_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SeqWithOptional] >>> ***/

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

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

struct Error;

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

typedef struct SeqWithOptional {
	UTF8String_t	 someString;
	struct seqOfOpt {
		A_SEQUENCE_OF(struct Error) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} *seqOfOpt;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SeqWithOptional_t;

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

extern asn_TYPE_descriptor_t asn_DEF_SeqWithOptional;

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

#include "Error.h"

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

static asn_TYPE_member_t asn_MBR_seqOfOpt_3[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Error,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		.default_value = 0,
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_seqOfOpt_tags_3[] = {
	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_seqOfOpt_specs_3 = {
	sizeof(struct seqOfOpt),
	offsetof(struct seqOfOpt, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_seqOfOpt_3 = {
	"seqOfOpt",
	"seqOfOpt",
	&asn_OP_SEQUENCE_OF,
	asn_DEF_seqOfOpt_tags_3,
	sizeof(asn_DEF_seqOfOpt_tags_3)
		/sizeof(asn_DEF_seqOfOpt_tags_3[0]), /* 2 */
	asn_DEF_seqOfOpt_tags_3,	/* Same as above */
	sizeof(asn_DEF_seqOfOpt_tags_3)
		/sizeof(asn_DEF_seqOfOpt_tags_3[0]), /* 2 */
	{ 0, 0, SEQUENCE_OF_constraint },
	asn_MBR_seqOfOpt_3,
	1,	/* Single element */
	&asn_SPC_seqOfOpt_specs_3	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_SeqWithOptional_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SeqWithOptional, someString),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_UTF8String,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		.default_value = 0,
		.name = "someString"
		},
	{ ATF_POINTER, 1, offsetof(struct SeqWithOptional, seqOfOpt),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_seqOfOpt_3,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		.default_value = 0,
		.name = "seqOfOpt"
		},
};
static const ber_tlv_tag_t asn_DEF_SeqWithOptional_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SeqWithOptional_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), 0, 0, 0 }, /* someString */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 } /* seqOfOpt */
};
static asn_SEQUENCE_specifics_t asn_SPC_SeqWithOptional_specs_1 = {
	sizeof(struct SeqWithOptional),
	offsetof(struct SeqWithOptional, _asn_ctx),
	.tag2el = asn_MAP_SeqWithOptional_tag2el_1,
	.tag2el_count = 2,	/* 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_SeqWithOptional = {
	"SeqWithOptional",
	"SeqWithOptional",
	&asn_OP_SEQUENCE,
	asn_DEF_SeqWithOptional_tags_1,
	sizeof(asn_DEF_SeqWithOptional_tags_1)
		/sizeof(asn_DEF_SeqWithOptional_tags_1[0]), /* 1 */
	asn_DEF_SeqWithOptional_tags_1,	/* Same as above */
	sizeof(asn_DEF_SeqWithOptional_tags_1)
		/sizeof(asn_DEF_SeqWithOptional_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_SeqWithOptional_1,
	2,	/* Elements count */
	&asn_SPC_SeqWithOptional_specs_1	/* Additional specs */
};

