
/*** <<< INCLUDES [Collection] >>> ***/

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

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

typedef struct Collection_16P0 {
	A_SET_OF(REAL_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Collection_16P0_t;
typedef struct Collection_16P1 {
	A_SET_OF(IA5String_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Collection_16P1_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Collection_16P0;
extern asn_TYPE_descriptor_t asn_DEF_Collection_16P1;

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

static asn_TYPE_member_t asn_MBR_Collection_16P0_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_REAL,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_Collection_16P0_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_Collection_16P0_specs_1 = {
	sizeof(struct Collection_16P0),
	offsetof(struct Collection_16P0, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Collection_16P0 = {
	"Collection",
	"Collection",
	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, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Collection_16P0_tags_1,
	sizeof(asn_DEF_Collection_16P0_tags_1)
		/sizeof(asn_DEF_Collection_16P0_tags_1[0]), /* 1 */
	asn_DEF_Collection_16P0_tags_1,	/* Same as above */
	sizeof(asn_DEF_Collection_16P0_tags_1)
		/sizeof(asn_DEF_Collection_16P0_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_Collection_16P0_1,
	1,	/* Single element */
	&asn_SPC_Collection_16P0_specs_1	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_Collection_16P1_3[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_IA5String,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_Collection_16P1_tags_3[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_Collection_16P1_specs_3 = {
	sizeof(struct Collection_16P1),
	offsetof(struct Collection_16P1, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Collection_16P1 = {
	"Collection",
	"Collection",
	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, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Collection_16P1_tags_3,
	sizeof(asn_DEF_Collection_16P1_tags_3)
		/sizeof(asn_DEF_Collection_16P1_tags_3[0]), /* 1 */
	asn_DEF_Collection_16P1_tags_3,	/* Same as above */
	sizeof(asn_DEF_Collection_16P1_tags_3)
		/sizeof(asn_DEF_Collection_16P1_tags_3[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_Collection_16P1_3,
	1,	/* Single element */
	&asn_SPC_Collection_16P1_specs_3	/* Additional specs */
};


/*** <<< INCLUDES [Bunch] >>> ***/

#include "Collection.h"
#include <constr_SEQUENCE.h>

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

typedef struct Bunch {
	Collection_16P0_t	 field_REAL;
	Collection_16P1_t	 field_IA5String;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Bunch_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Bunch;

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

static asn_TYPE_member_t asn_MBR_Bunch_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Bunch, field_REAL),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Collection_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 = "field-REAL"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Bunch, field_IA5String),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Collection_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 = "field-IA5String"
		},
};
static const ber_tlv_tag_t asn_DEF_Bunch_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Bunch_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 1 }, /* field-REAL */
    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 1, -1, 0 } /* field-IA5String */
};
static asn_SEQUENCE_specifics_t asn_SPC_Bunch_specs_1 = {
	sizeof(struct Bunch),
	offsetof(struct Bunch, _asn_ctx),
	asn_MAP_Bunch_tag2el_1,
	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_Bunch = {
	"Bunch",
	"Bunch",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Bunch_tags_1,
	sizeof(asn_DEF_Bunch_tags_1)
		/sizeof(asn_DEF_Bunch_tags_1[0]), /* 1 */
	asn_DEF_Bunch_tags_1,	/* Same as above */
	sizeof(asn_DEF_Bunch_tags_1)
		/sizeof(asn_DEF_Bunch_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_Bunch_1,
	2,	/* Elements count */
	&asn_SPC_Bunch_specs_1	/* Additional specs */
};

