
/*** <<< INCLUDES [T1] >>> ***/

#include <T2.h>

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


typedef T2_t	 T1_t;

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

extern asn1_TYPE_descriptor_t asn1_DEF_T1;
asn_struct_free_f T1_free;
asn_struct_print_f T1_print;
asn_constr_check_f T1_constraint;
ber_type_decoder_f T1_decode_ber;
der_type_encoder_f T1_encode_der;
xer_type_encoder_f T1_encode_xer;

/*** <<< CODE [T1] >>> ***/

int
T1_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	/* Replace with underlying type checker */
	td->check_constraints = asn1_DEF_T2.check_constraints;
	return td->check_constraints(td, sptr, app_errlog, app_key);
}

/*
 * This type is implemented using T2,
 * so here we adjust the DEF accordingly.
 */
static void
T1_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {
	td->free_struct    = asn1_DEF_T2.free_struct;
	td->print_struct   = asn1_DEF_T2.print_struct;
	td->ber_decoder    = asn1_DEF_T2.ber_decoder;
	td->der_encoder    = asn1_DEF_T2.der_encoder;
	td->xer_decoder    = asn1_DEF_T2.xer_decoder;
	td->xer_encoder    = asn1_DEF_T2.xer_encoder;
	td->elements       = asn1_DEF_T2.elements;
	td->elements_count = asn1_DEF_T2.elements_count;
	td->specifics      = asn1_DEF_T2.specifics;
}

void
T1_free(asn1_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	T1_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
T1_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	T1_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

ber_dec_rval_t
T1_decode_ber(asn1_TYPE_descriptor_t *td,
		void **structure, void *bufptr, size_t size, int tag_mode) {
	T1_inherit_TYPE_descriptor(td);
	return td->ber_decoder(td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
T1_encode_der(asn1_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	T1_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_enc_rval_t
T1_encode_xer(asn1_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	T1_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


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

static ber_tlv_tag_t asn1_DEF_T1_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (6 << 2))
};
static ber_tlv_tag_t asn1_DEF_T1_all_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
asn1_TYPE_descriptor_t asn1_DEF_T1 = {
	"T1",
	T1_free,
	T1_print,
	T1_constraint,
	T1_decode_ber,
	T1_encode_der,
	0,				/* Not implemented yet */
	T1_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_T1_tags,
	sizeof(asn1_DEF_T1_tags)
		/sizeof(asn1_DEF_T1_tags[0]), /* 4 */
	asn1_DEF_T1_all_tags,
	sizeof(asn1_DEF_T1_all_tags)
		/sizeof(asn1_DEF_T1_all_tags[0]), /* 6 */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [T2] >>> ***/

#include <T3.h>

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


typedef T3_t	 T2_t;

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

extern asn1_TYPE_descriptor_t asn1_DEF_T2;
asn_struct_free_f T2_free;
asn_struct_print_f T2_print;
asn_constr_check_f T2_constraint;
ber_type_decoder_f T2_decode_ber;
der_type_encoder_f T2_encode_der;
xer_type_encoder_f T2_encode_xer;

/*** <<< CODE [T2] >>> ***/

int
T2_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	/* Replace with underlying type checker */
	td->check_constraints = asn1_DEF_T3.check_constraints;
	return td->check_constraints(td, sptr, app_errlog, app_key);
}

/*
 * This type is implemented using T3,
 * so here we adjust the DEF accordingly.
 */
static void
T2_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {
	td->free_struct    = asn1_DEF_T3.free_struct;
	td->print_struct   = asn1_DEF_T3.print_struct;
	td->ber_decoder    = asn1_DEF_T3.ber_decoder;
	td->der_encoder    = asn1_DEF_T3.der_encoder;
	td->xer_decoder    = asn1_DEF_T3.xer_decoder;
	td->xer_encoder    = asn1_DEF_T3.xer_encoder;
	td->elements       = asn1_DEF_T3.elements;
	td->elements_count = asn1_DEF_T3.elements_count;
	td->specifics      = asn1_DEF_T3.specifics;
}

void
T2_free(asn1_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	T2_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
T2_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	T2_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

ber_dec_rval_t
T2_decode_ber(asn1_TYPE_descriptor_t *td,
		void **structure, void *bufptr, size_t size, int tag_mode) {
	T2_inherit_TYPE_descriptor(td);
	return td->ber_decoder(td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
T2_encode_der(asn1_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	T2_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_enc_rval_t
T2_encode_xer(asn1_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	T2_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


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

static ber_tlv_tag_t asn1_DEF_T2_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (6 << 2))
};
static ber_tlv_tag_t asn1_DEF_T2_all_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
asn1_TYPE_descriptor_t asn1_DEF_T2 = {
	"T2",
	T2_free,
	T2_print,
	T2_constraint,
	T2_decode_ber,
	T2_encode_der,
	0,				/* Not implemented yet */
	T2_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_T2_tags,
	sizeof(asn1_DEF_T2_tags)
		/sizeof(asn1_DEF_T2_tags[0]), /* 3 */
	asn1_DEF_T2_all_tags,
	sizeof(asn1_DEF_T2_all_tags)
		/sizeof(asn1_DEF_T2_all_tags[0]), /* 5 */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [T3] >>> ***/

#include <T4.h>

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


typedef T4_t	 T3_t;

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

extern asn1_TYPE_descriptor_t asn1_DEF_T3;
asn_struct_free_f T3_free;
asn_struct_print_f T3_print;
asn_constr_check_f T3_constraint;
ber_type_decoder_f T3_decode_ber;
der_type_encoder_f T3_encode_der;
xer_type_encoder_f T3_encode_xer;

/*** <<< CODE [T3] >>> ***/

int
T3_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	/* Replace with underlying type checker */
	td->check_constraints = asn1_DEF_T4.check_constraints;
	return td->check_constraints(td, sptr, app_errlog, app_key);
}

/*
 * This type is implemented using T4,
 * so here we adjust the DEF accordingly.
 */
static void
T3_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {
	td->free_struct    = asn1_DEF_T4.free_struct;
	td->print_struct   = asn1_DEF_T4.print_struct;
	td->ber_decoder    = asn1_DEF_T4.ber_decoder;
	td->der_encoder    = asn1_DEF_T4.der_encoder;
	td->xer_decoder    = asn1_DEF_T4.xer_decoder;
	td->xer_encoder    = asn1_DEF_T4.xer_encoder;
	td->elements       = asn1_DEF_T4.elements;
	td->elements_count = asn1_DEF_T4.elements_count;
	td->specifics      = asn1_DEF_T4.specifics;
}

void
T3_free(asn1_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	T3_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
T3_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	T3_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

ber_dec_rval_t
T3_decode_ber(asn1_TYPE_descriptor_t *td,
		void **structure, void *bufptr, size_t size, int tag_mode) {
	T3_inherit_TYPE_descriptor(td);
	return td->ber_decoder(td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
T3_encode_der(asn1_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	T3_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_enc_rval_t
T3_encode_xer(asn1_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	T3_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


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

static ber_tlv_tag_t asn1_DEF_T3_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (6 << 2))
};
static ber_tlv_tag_t asn1_DEF_T3_all_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
asn1_TYPE_descriptor_t asn1_DEF_T3 = {
	"T3",
	T3_free,
	T3_print,
	T3_constraint,
	T3_decode_ber,
	T3_encode_der,
	0,				/* Not implemented yet */
	T3_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_T3_tags,
	sizeof(asn1_DEF_T3_tags)
		/sizeof(asn1_DEF_T3_tags[0]), /* 2 */
	asn1_DEF_T3_all_tags,
	sizeof(asn1_DEF_T3_all_tags)
		/sizeof(asn1_DEF_T3_all_tags[0]), /* 4 */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [T4] >>> ***/

#include <T5.h>

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


typedef T5_t	 T4_t;

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

extern asn1_TYPE_descriptor_t asn1_DEF_T4;
asn_struct_free_f T4_free;
asn_struct_print_f T4_print;
asn_constr_check_f T4_constraint;
ber_type_decoder_f T4_decode_ber;
der_type_encoder_f T4_encode_der;
xer_type_encoder_f T4_encode_xer;

/*** <<< CODE [T4] >>> ***/

int
T4_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	/* Replace with underlying type checker */
	td->check_constraints = asn1_DEF_T5.check_constraints;
	return td->check_constraints(td, sptr, app_errlog, app_key);
}

/*
 * This type is implemented using T5,
 * so here we adjust the DEF accordingly.
 */
static void
T4_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {
	td->free_struct    = asn1_DEF_T5.free_struct;
	td->print_struct   = asn1_DEF_T5.print_struct;
	td->ber_decoder    = asn1_DEF_T5.ber_decoder;
	td->der_encoder    = asn1_DEF_T5.der_encoder;
	td->xer_decoder    = asn1_DEF_T5.xer_decoder;
	td->xer_encoder    = asn1_DEF_T5.xer_encoder;
	td->elements       = asn1_DEF_T5.elements;
	td->elements_count = asn1_DEF_T5.elements_count;
	td->specifics      = asn1_DEF_T5.specifics;
}

void
T4_free(asn1_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	T4_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
T4_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	T4_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

ber_dec_rval_t
T4_decode_ber(asn1_TYPE_descriptor_t *td,
		void **structure, void *bufptr, size_t size, int tag_mode) {
	T4_inherit_TYPE_descriptor(td);
	return td->ber_decoder(td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
T4_encode_der(asn1_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	T4_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_enc_rval_t
T4_encode_xer(asn1_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	T4_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


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

static ber_tlv_tag_t asn1_DEF_T4_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
asn1_TYPE_descriptor_t asn1_DEF_T4 = {
	"T4",
	T4_free,
	T4_print,
	T4_constraint,
	T4_decode_ber,
	T4_encode_der,
	0,				/* Not implemented yet */
	T4_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_T4_tags,
	sizeof(asn1_DEF_T4_tags)
		/sizeof(asn1_DEF_T4_tags[0]) - 1, /* 2 */
	asn1_DEF_T4_tags,	/* Same as above */
	sizeof(asn1_DEF_T4_tags)
		/sizeof(asn1_DEF_T4_tags[0]), /* 3 */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [T5] >>> ***/

#include <T6.h>

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


typedef T6_t	 T5_t;

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

extern asn1_TYPE_descriptor_t asn1_DEF_T5;
asn_struct_free_f T5_free;
asn_struct_print_f T5_print;
asn_constr_check_f T5_constraint;
ber_type_decoder_f T5_decode_ber;
der_type_encoder_f T5_encode_der;
xer_type_encoder_f T5_encode_xer;

/*** <<< CODE [T5] >>> ***/

int
T5_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	/* Replace with underlying type checker */
	td->check_constraints = asn1_DEF_T6.check_constraints;
	return td->check_constraints(td, sptr, app_errlog, app_key);
}

/*
 * This type is implemented using T6,
 * so here we adjust the DEF accordingly.
 */
static void
T5_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {
	td->free_struct    = asn1_DEF_T6.free_struct;
	td->print_struct   = asn1_DEF_T6.print_struct;
	td->ber_decoder    = asn1_DEF_T6.ber_decoder;
	td->der_encoder    = asn1_DEF_T6.der_encoder;
	td->xer_decoder    = asn1_DEF_T6.xer_decoder;
	td->xer_encoder    = asn1_DEF_T6.xer_encoder;
	td->elements       = asn1_DEF_T6.elements;
	td->elements_count = asn1_DEF_T6.elements_count;
	td->specifics      = asn1_DEF_T6.specifics;
}

void
T5_free(asn1_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	T5_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
T5_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	T5_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

ber_dec_rval_t
T5_decode_ber(asn1_TYPE_descriptor_t *td,
		void **structure, void *bufptr, size_t size, int tag_mode) {
	T5_inherit_TYPE_descriptor(td);
	return td->ber_decoder(td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
T5_encode_der(asn1_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	T5_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_enc_rval_t
T5_encode_xer(asn1_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	T5_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


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

static ber_tlv_tag_t asn1_DEF_T5_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
asn1_TYPE_descriptor_t asn1_DEF_T5 = {
	"T5",
	T5_free,
	T5_print,
	T5_constraint,
	T5_decode_ber,
	T5_encode_der,
	0,				/* Not implemented yet */
	T5_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_T5_tags,
	sizeof(asn1_DEF_T5_tags)
		/sizeof(asn1_DEF_T5_tags[0]) - 1, /* 1 */
	asn1_DEF_T5_tags,	/* Same as above */
	sizeof(asn1_DEF_T5_tags)
		/sizeof(asn1_DEF_T5_tags[0]), /* 2 */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [T6] >>> ***/

#include <NativeReal.h>

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


typedef double	 T6_t;

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

/* This type is equivalent to NativeReal */
#define	asn1_DEF_T6	asn1_DEF_NativeReal

/*** <<< CODE [T6] >>> ***/

/* This type is equivalent to NativeReal */


/*** <<< INCLUDES [T] >>> ***/

#include <Ts.h>

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


typedef Ts_t	 T_t;

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

extern asn1_TYPE_descriptor_t asn1_DEF_T;
asn_struct_free_f T_free;
asn_struct_print_f T_print;
asn_constr_check_f T_constraint;
ber_type_decoder_f T_decode_ber;
der_type_encoder_f T_encode_der;
xer_type_encoder_f T_encode_xer;

/*** <<< CODE [T] >>> ***/

int
T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	/* Replace with underlying type checker */
	td->check_constraints = asn1_DEF_Ts.check_constraints;
	return td->check_constraints(td, sptr, app_errlog, app_key);
}

/*
 * This type is implemented using Ts,
 * so here we adjust the DEF accordingly.
 */
static void
T_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {
	td->free_struct    = asn1_DEF_Ts.free_struct;
	td->print_struct   = asn1_DEF_Ts.print_struct;
	td->ber_decoder    = asn1_DEF_Ts.ber_decoder;
	td->der_encoder    = asn1_DEF_Ts.der_encoder;
	td->xer_decoder    = asn1_DEF_Ts.xer_decoder;
	td->xer_encoder    = asn1_DEF_Ts.xer_encoder;
	td->elements       = asn1_DEF_Ts.elements;
	td->elements_count = asn1_DEF_Ts.elements_count;
	td->specifics      = asn1_DEF_Ts.specifics;
}

void
T_free(asn1_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	T_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	T_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

ber_dec_rval_t
T_decode_ber(asn1_TYPE_descriptor_t *td,
		void **structure, void *bufptr, size_t size, int tag_mode) {
	T_inherit_TYPE_descriptor(td);
	return td->ber_decoder(td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
T_encode_der(asn1_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	T_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_enc_rval_t
T_encode_xer(asn1_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	T_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


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

static ber_tlv_tag_t asn1_DEF_T_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (123 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
asn1_TYPE_descriptor_t asn1_DEF_T = {
	"T",
	T_free,
	T_print,
	T_constraint,
	T_decode_ber,
	T_encode_der,
	0,				/* Not implemented yet */
	T_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_T_tags,
	sizeof(asn1_DEF_T_tags)
		/sizeof(asn1_DEF_T_tags[0]) - 2, /* 1 */
	asn1_DEF_T_tags,	/* Same as above */
	sizeof(asn1_DEF_T_tags)
		/sizeof(asn1_DEF_T_tags[0]), /* 3 */
	0, 0,	/* Defined elsewhere */
	0	/* No specifics */
};


/*** <<< INCLUDES [Ts] >>> ***/

#include <T2.h>
#include <T3.h>
#include <constr_SEQUENCE.h>

/*** <<< DEPS [Ts] >>> ***/

extern asn1_TYPE_descriptor_t asn1_DEF_Ts;

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


typedef struct Ts {
	T2_t	 m1;
	T3_t	*m2	/* OPTIONAL */;
	T3_t	 m3;
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} Ts_t;

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

static asn1_TYPE_member_t asn1_MBR_Ts[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Ts, m1),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_T2,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "m1"
		},
	{ ATF_POINTER, 1, offsetof(struct Ts, m2),
		.tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		.tag_mode = +1,	/* EXPLICIT tag at current level */
		.type = (void *)&asn1_DEF_T3,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "m2"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Ts, m3),
		.tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_T3,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "m3"
		},
};
static ber_tlv_tag_t asn1_DEF_Ts_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (123 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_Ts_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* m1 at 24 */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* m2 at 25 */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* m3 at 27 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_Ts_specs = {
	sizeof(struct Ts),
	offsetof(struct Ts, _ber_dec_ctx),
	asn1_DEF_Ts_tag2el,
	3,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_Ts = {
	"Ts",
	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 */
	asn1_DEF_Ts_tags,
	sizeof(asn1_DEF_Ts_tags)
		/sizeof(asn1_DEF_Ts_tags[0]) - 1, /* 1 */
	asn1_DEF_Ts_tags,	/* Same as above */
	sizeof(asn1_DEF_Ts_tags)
		/sizeof(asn1_DEF_Ts_tags[0]), /* 2 */
	asn1_MBR_Ts,
	3,	/* Elements count */
	&asn1_DEF_Ts_specs	/* Additional specs */
};

