
/*** <<< INCLUDES [Forest] >>> ***/

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

/*** <<< DEPS [Forest] >>> ***/

extern asn1_TYPE_descriptor_t asn1_DEF_Forest;

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


typedef struct Forest {
	A_SET_OF(struct Tree) list;
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} Forest_t;

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

static asn1_TYPE_member_t asn1_MBR_Forest[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_Tree,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn1_DEF_Forest_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn1_SET_OF_specifics_t asn1_DEF_Forest_specs = {
	sizeof(struct Forest),
	offsetof(struct Forest, _ber_dec_ctx),
};
asn1_TYPE_descriptor_t asn1_DEF_Forest = {
	"Forest",
	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_Forest_tags,
	sizeof(asn1_DEF_Forest_tags)
		/sizeof(asn1_DEF_Forest_tags[0]), /* 1 */
	asn1_DEF_Forest_tags,	/* Same as above */
	sizeof(asn1_DEF_Forest_tags)
		/sizeof(asn1_DEF_Forest_tags[0]), /* 1 */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_Forest,
	1,	/* Single element */
	&asn1_DEF_Forest_specs	/* Additional specs */
};


/*** <<< INCLUDES [Tree] >>> ***/

#include <INTEGER.h>
#include <constr_SEQUENCE.h>

/*** <<< DEPS [Tree] >>> ***/

extern asn1_TYPE_descriptor_t asn1_DEF_Tree;

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


typedef struct Tree {
	INTEGER_t	 height;
	INTEGER_t	 width;
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} Tree_t;

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

static asn1_TYPE_member_t asn1_MBR_Tree[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Tree, height),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "height"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Tree, width),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "width"
		},
};
static ber_tlv_tag_t asn1_DEF_Tree_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_Tree_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 1 }, /* height at 17 */
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, -1, 0 }, /* width at 19 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_Tree_specs = {
	sizeof(struct Tree),
	offsetof(struct Tree, _ber_dec_ctx),
	asn1_DEF_Tree_tag2el,
	2,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_Tree = {
	"Tree",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_Tree_tags,
	sizeof(asn1_DEF_Tree_tags)
		/sizeof(asn1_DEF_Tree_tags[0]), /* 1 */
	asn1_DEF_Tree_tags,	/* Same as above */
	sizeof(asn1_DEF_Tree_tags)
		/sizeof(asn1_DEF_Tree_tags[0]), /* 1 */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_Tree,
	2,	/* Elements count */
	&asn1_DEF_Tree_specs	/* Additional specs */
};


/*** <<< INCLUDES [Stuff] >>> ***/

#include <Forest.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>
#include <BIT_STRING.h>
#include <constr_SEQUENCE.h>
#include <constr_SET.h>

/*** <<< DEPS [Stuff] >>> ***/


/*
 * Method of determining the components presence
 */
typedef enum Stuff_PR {
	Stuff_PR_trees,	/* Member trees is present */
	Stuff_PR_anything,	/* Member anything is present */
} Stuff_PR;
extern asn1_TYPE_descriptor_t asn1_DEF_Stuff;

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


typedef struct Stuff {
	struct trees {
		A_SET_OF(struct Forest) list;
		
		/* Context for parsing across buffer boundaries */
		ber_dec_ctx_t _ber_dec_ctx;
	} *trees;
	struct anything {
		A_SET_OF(struct anything_member {
			BIT_STRING_t	 cup_of_coffee;
			/*
			 * This type is extensible,
			 * possible extensions are below.
			 */
			
			/* Context for parsing across buffer boundaries */
			ber_dec_ctx_t _ber_dec_ctx;
		} ) list;
		
		/* Context for parsing across buffer boundaries */
		ber_dec_ctx_t _ber_dec_ctx;
	} *anything;
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pStuff, Stuff_PR_x) */
	unsigned int _presence_map
		[((2+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} Stuff_t;

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

static asn1_TYPE_member_t asn1_MBR_trees[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_Forest,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn1_DEF_trees_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn1_SET_OF_specifics_t asn1_DEF_trees_specs = {
	sizeof(struct trees),
	offsetof(struct trees, _ber_dec_ctx),
};
static /* Use -fall-defs-global to expose */
asn1_TYPE_descriptor_t asn1_DEF_trees = {
	"trees",
	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_trees_tags,
	sizeof(asn1_DEF_trees_tags)
		/sizeof(asn1_DEF_trees_tags[0]) - 1, /* 1 */
	asn1_DEF_trees_tags,	/* Same as above */
	sizeof(asn1_DEF_trees_tags)
		/sizeof(asn1_DEF_trees_tags[0]), /* 2 */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_trees,
	1,	/* Single element */
	&asn1_DEF_trees_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_MBR_anything_member[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct anything_member, cup_of_coffee),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_BIT_STRING,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "cup-of-coffee"
		},
};
static ber_tlv_tag_t asn1_DEF_anything_member_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_anything_member_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 }, /* cup-of-coffee at 26 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_anything_member_specs = {
	sizeof(struct anything_member),
	offsetof(struct anything_member, _ber_dec_ctx),
	asn1_DEF_anything_member_tag2el,
	1,	/* Count of tags in the map */
	0,	/* Start extensions */
	2	/* Stop extensions */
};
static /* Use -fall-defs-global to expose */
asn1_TYPE_descriptor_t asn1_DEF_anything_member = {
	"",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_anything_member_tags,
	sizeof(asn1_DEF_anything_member_tags)
		/sizeof(asn1_DEF_anything_member_tags[0]), /* 1 */
	asn1_DEF_anything_member_tags,	/* Same as above */
	sizeof(asn1_DEF_anything_member_tags)
		/sizeof(asn1_DEF_anything_member_tags[0]), /* 1 */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_anything_member,
	1,	/* Elements count */
	&asn1_DEF_anything_member_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_MBR_anything[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_anything_member,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn1_DEF_anything_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn1_SET_OF_specifics_t asn1_DEF_anything_specs = {
	sizeof(struct anything),
	offsetof(struct anything, _ber_dec_ctx),
};
static /* Use -fall-defs-global to expose */
asn1_TYPE_descriptor_t asn1_DEF_anything = {
	"anything",
	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_anything_tags,
	sizeof(asn1_DEF_anything_tags)
		/sizeof(asn1_DEF_anything_tags[0]) - 1, /* 1 */
	asn1_DEF_anything_tags,	/* Same as above */
	sizeof(asn1_DEF_anything_tags)
		/sizeof(asn1_DEF_anything_tags[0]), /* 2 */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_anything,
	1,	/* Single element */
	&asn1_DEF_anything_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_MBR_Stuff[] = {
	{ ATF_POINTER, 2, offsetof(struct Stuff, trees),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_trees,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "trees"
		},
	{ ATF_POINTER, 1, offsetof(struct Stuff, anything),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_anything,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "anything"
		},
};
static ber_tlv_tag_t asn1_DEF_Stuff_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_Stuff_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* trees at 23 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* anything at 28 */
};
static uint8_t asn1_DEF_Stuff_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(0 << 7) | (0 << 6)
};
static asn1_SET_specifics_t asn1_DEF_Stuff_specs = {
	sizeof(struct Stuff),
	offsetof(struct Stuff, _ber_dec_ctx),
	offsetof(struct Stuff, _presence_map),
	asn1_DEF_Stuff_tag2el,
	2,	/* Count of tags in the map */
	0,	/* Whether extensible */
	(unsigned int *)asn1_DEF_Stuff_mmap	/* Mandatory elements map */
};
asn1_TYPE_descriptor_t asn1_DEF_Stuff = {
	"Stuff",
	SET_constraint,
	SET_decode_ber,
	SET_encode_der,
	SET_print,
	SET_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_Stuff_tags,
	sizeof(asn1_DEF_Stuff_tags)
		/sizeof(asn1_DEF_Stuff_tags[0]), /* 1 */
	asn1_DEF_Stuff_tags,	/* Same as above */
	sizeof(asn1_DEF_Stuff_tags)
		/sizeof(asn1_DEF_Stuff_tags[0]), /* 1 */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_Stuff,
	2,	/* Elements count */
	&asn1_DEF_Stuff_specs	/* Additional specs */
};

