/*
 * 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 "ConfigurationInformation.h"

static asn_per_constraints_t asn_PER_type_ConfigurationInformation_constr_1 GCC_NOTUSED = {
	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_TYPE_member_t asn_MBR_ConfigurationInformation_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ConfigurationInformation, choice.provided),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_HNBConfigurationInformationProvided,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"provided"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ConfigurationInformation, choice.missing),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_HNBConfigurationInformationMissing,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"missing"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_ConfigurationInformation_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* provided */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* missing */
};
static asn_CHOICE_specifics_t asn_SPC_ConfigurationInformation_specs_1 = {
	sizeof(struct ConfigurationInformation),
	offsetof(struct ConfigurationInformation, _asn_ctx),
	offsetof(struct ConfigurationInformation, present),
	sizeof(((struct ConfigurationInformation *)0)->present),
	asn_MAP_ConfigurationInformation_tag2el_1,
	2,	/* Count of tags in the map */
	0,
	2	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_ConfigurationInformation = {
	"ConfigurationInformation",
	"ConfigurationInformation",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_decode_xer,
	CHOICE_encode_xer,
	CHOICE_decode_uper,
	CHOICE_encode_uper,
	CHOICE_decode_aper,
	CHOICE_encode_aper,
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	&asn_PER_type_ConfigurationInformation_constr_1,
	asn_MBR_ConfigurationInformation_1,
	2,	/* Elements count */
	&asn_SPC_ConfigurationInformation_specs_1	/* Additional specs */
};

