/*
 * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
 * From ASN.1 module "RANAP-IEs"
 * 	found in "../../asn1/ranap/RANAP-IEs.asn"
 */

#include "RANAP_M4-Collection-Parameters.h"

static asn_TYPE_member_t asn_MBR_RANAP_M4_Collection_Parameters_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_M4_Collection_Parameters, m4_period),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_M4_Period,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"m4-period"
		},
	{ ATF_POINTER, 2, offsetof(struct RANAP_M4_Collection_Parameters, m4_threshold),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_M4_Threshold,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"m4-threshold"
		},
	{ ATF_POINTER, 1, offsetof(struct RANAP_M4_Collection_Parameters, iE_Extensions),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_IE_Extensions,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iE-Extensions"
		},
};
static const int asn_MAP_RANAP_M4_Collection_Parameters_oms_1[] = { 1, 2 };
static const ber_tlv_tag_t asn_DEF_RANAP_M4_Collection_Parameters_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_RANAP_M4_Collection_Parameters_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* m4-period */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* m4-threshold */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
};
static asn_SEQUENCE_specifics_t asn_SPC_RANAP_M4_Collection_Parameters_specs_1 = {
	sizeof(struct RANAP_M4_Collection_Parameters),
	offsetof(struct RANAP_M4_Collection_Parameters, _asn_ctx),
	asn_MAP_RANAP_M4_Collection_Parameters_tag2el_1,
	3,	/* Count of tags in the map */
	asn_MAP_RANAP_M4_Collection_Parameters_oms_1,	/* Optional members */
	2, 0,	/* Root/Additions */
	2,	/* Start extensions */
	4	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_M4_Collection_Parameters = {
	"RANAP_M4-Collection-Parameters",
	"RANAP_M4-Collection-Parameters",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	SEQUENCE_decode_uper,
	SEQUENCE_encode_uper,
	SEQUENCE_decode_aper,
	SEQUENCE_encode_aper,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_RANAP_M4_Collection_Parameters_tags_1,
	sizeof(asn_DEF_RANAP_M4_Collection_Parameters_tags_1)
		/sizeof(asn_DEF_RANAP_M4_Collection_Parameters_tags_1[0]), /* 1 */
	asn_DEF_RANAP_M4_Collection_Parameters_tags_1,	/* Same as above */
	sizeof(asn_DEF_RANAP_M4_Collection_Parameters_tags_1)
		/sizeof(asn_DEF_RANAP_M4_Collection_Parameters_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_RANAP_M4_Collection_Parameters_1,
	3,	/* Elements count */
	&asn_SPC_RANAP_M4_Collection_Parameters_specs_1	/* Additional specs */
};

