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

#include "ErrorInd.h"

static asn_TYPE_member_t asn_MBR_ErrorInd_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ErrorInd, sender),
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		&asn_DEF_ComponentType,
		0,	/* Defer constraints checking to the member type */
		0,	/* PER is not compiled, use -gen-PER */
		0,
		"sender"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ErrorInd, severity),
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		&asn_DEF_ErrorSeverity,
		0,	/* Defer constraints checking to the member type */
		0,	/* PER is not compiled, use -gen-PER */
		0,
		"severity"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ErrorInd, code),
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		&asn_DEF_ErrorCode,
		0,	/* Defer constraints checking to the member type */
		0,	/* PER is not compiled, use -gen-PER */
		0,
		"code"
		},
	{ ATF_POINTER, 3, offsetof(struct ErrorInd, bankSlot),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_BankSlot,
		0,	/* Defer constraints checking to the member type */
		0,	/* PER is not compiled, use -gen-PER */
		0,
		"bankSlot"
		},
	{ ATF_POINTER, 2, offsetof(struct ErrorInd, clientSlot),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ClientSlot,
		0,	/* Defer constraints checking to the member type */
		0,	/* PER is not compiled, use -gen-PER */
		0,
		"clientSlot"
		},
	{ ATF_POINTER, 1, offsetof(struct ErrorInd, errorString),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ErrorString,
		0,	/* Defer constraints checking to the member type */
		0,	/* PER is not compiled, use -gen-PER */
		0,
		"errorString"
		},
};
static const ber_tlv_tag_t asn_DEF_ErrorInd_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ErrorInd_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, 0, 2 }, /* sender */
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, -1, 1 }, /* severity */
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 2, -2, 0 }, /* code */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 3, 0, 0 }, /* bankSlot */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 4, 0, 0 }, /* clientSlot */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 5, 0, 0 } /* errorString */
};
static asn_SEQUENCE_specifics_t asn_SPC_ErrorInd_specs_1 = {
	sizeof(struct ErrorInd),
	offsetof(struct ErrorInd, _asn_ctx),
	asn_MAP_ErrorInd_tag2el_1,
	6,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	5,	/* Start extensions */
	7	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_ErrorInd = {
	"ErrorInd",
	"ErrorInd",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0, 0,	/* No UPER support, use "-gen-PER" to enable */
	0, 0,	/* No APER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_ErrorInd_tags_1,
	sizeof(asn_DEF_ErrorInd_tags_1)
		/sizeof(asn_DEF_ErrorInd_tags_1[0]), /* 1 */
	asn_DEF_ErrorInd_tags_1,	/* Same as above */
	sizeof(asn_DEF_ErrorInd_tags_1)
		/sizeof(asn_DEF_ErrorInd_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_ErrorInd_1,
	6,	/* Elements count */
	&asn_SPC_ErrorInd_specs_1	/* Additional specs */
};

