/*
 * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
 * From ASN.1 module "HNBAP-IEs"
 * 	found in "../../asn1/hnbap/HNBAP-IEs.asn"
 * 	`asn1c -gen-PER`
 */

#include <osmocom/hnbap/UE-Capabilities.h>

static asn_TYPE_member_t asn_MBR_UE_Capabilities_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct UE_Capabilities, access_stratum_release_indicator),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Access_stratum_release_indicator,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"access-stratum-release-indicator"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct UE_Capabilities, csg_capability),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_CSG_Capability,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"csg-capability"
		},
	{ ATF_POINTER, 1, offsetof(struct UE_Capabilities, iE_Extensions),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_IE_Extensions,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iE-Extensions"
		},
};
static const int asn_MAP_UE_Capabilities_oms_1[] = { 2 };
static const ber_tlv_tag_t asn_DEF_UE_Capabilities_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_UE_Capabilities_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* access-stratum-release-indicator */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* csg-capability */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
};
static asn_SEQUENCE_specifics_t asn_SPC_UE_Capabilities_specs_1 = {
	sizeof(struct UE_Capabilities),
	offsetof(struct UE_Capabilities, _asn_ctx),
	asn_MAP_UE_Capabilities_tag2el_1,
	3,	/* Count of tags in the map */
	asn_MAP_UE_Capabilities_oms_1,	/* Optional members */
	1, 0,	/* Root/Additions */
	2,	/* Start extensions */
	4	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_UE_Capabilities = {
	"UE-Capabilities",
	"UE-Capabilities",
	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_UE_Capabilities_tags_1,
	sizeof(asn_DEF_UE_Capabilities_tags_1)
		/sizeof(asn_DEF_UE_Capabilities_tags_1[0]), /* 1 */
	asn_DEF_UE_Capabilities_tags_1,	/* Same as above */
	sizeof(asn_DEF_UE_Capabilities_tags_1)
		/sizeof(asn_DEF_UE_Capabilities_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_UE_Capabilities_1,
	3,	/* Elements count */
	&asn_SPC_UE_Capabilities_specs_1	/* Additional specs */
};

