ContainedSubtype support


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@822 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/ChangeLog b/ChangeLog
index 54ee870..7f771b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,7 @@
 	* Added extra const qualifiers into the support code.
 	* More RFC variations supported in crfc2asn1.pl.
 	* Refined string values compatibility. (Test cases 77, 78).
+	* Support for ContainedSubtype constraints. (Test case 16).
 
 0.9.12:	2005-Mar-10
 
diff --git a/TODO b/TODO
index 37f7607..a1414b7 100644
--- a/TODO
+++ b/TODO
@@ -16,6 +16,3 @@
 3. MINOR:
 
 3.1 Parsing of CONSTRAINED BY clauses
-
-3.2 Support for ContainedSubtype constraint.
-
diff --git a/libasn1parser/asn1p_constr.c b/libasn1parser/asn1p_constr.c
index 7a38f3c..6980269 100644
--- a/libasn1parser/asn1p_constr.c
+++ b/libasn1parser/asn1p_constr.c
@@ -22,6 +22,8 @@
 asn1p_constraint_free(asn1p_constraint_t *ct) {
 	if(ct) {
 
+		if(ct->containedSubtype)
+			asn1p_value_free(ct->containedSubtype);
 		if(ct->value)
 			asn1p_value_free(ct->value);
 		if(ct->range_start)
@@ -59,9 +61,10 @@
 
 		clone->type = src->type;
 		clone->presence = src->presence;
-		CLONE(value, asn1p_value_clone);
-		CLONE(range_start, asn1p_value_clone);
-		CLONE(range_stop, asn1p_value_clone);
+		CLONE(containedSubtype,	asn1p_value_clone);
+		CLONE(value,		asn1p_value_clone);
+		CLONE(range_start,	asn1p_value_clone);
+		CLONE(range_stop,	asn1p_value_clone);
 
 		for(i = 0; i < src->el_count; i++) {
 			asn1p_constraint_t *t;
@@ -115,6 +118,8 @@
 	switch(type) {
 	case ACT_INVALID:
 		return "INVALID";
+	case ACT_EL_TYPE:
+		return "ContainedSubtype";
 	case ACT_EL_VALUE:
 		return "SingleValue";
 	case ACT_EL_RANGE:
diff --git a/libasn1parser/asn1p_constr.h b/libasn1parser/asn1p_constr.h
index 27369fd..90035d7 100644
--- a/libasn1parser/asn1p_constr.h
+++ b/libasn1parser/asn1p_constr.h
@@ -11,7 +11,8 @@
 		/*
 		 * Constraint elements.
 		 */
-		ACT_EL_VALUE,		/* 123, "A", T (elementary value) */
+		ACT_EL_TYPE,		/* T (contained subtype) */
+		ACT_EL_VALUE,		/* 123, "A", (elementary value) */
 		ACT_EL_RANGE,		/* 1..2 (elementary range) */
 		ACT_EL_LLRANGE,		/* 1<..2 (elementary range) */
 		ACT_EL_RLRANGE,		/* 1..<2 (elementary range) */
@@ -43,8 +44,9 @@
 	} presence;
 
 	/*
-	 * A single values.
+	 * Separate types and values.
 	 */
+	asn1p_value_t *containedSubtype;
 	asn1p_value_t *value;
 	asn1p_value_t *range_start;
 	asn1p_value_t *range_stop;
diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c
index 82e1509..6aa1983 100644
--- a/libasn1parser/asn1p_y.c
+++ b/libasn1parser/asn1p_y.c
@@ -204,11 +204,11 @@
 
 
 
-#define	YYFINAL		417
+#define	YYFINAL		418
 #define	YYFLAG		-32768
 #define	YYNTBASE	116
 
-#define YYTRANSLATE(x) ((unsigned)(x) <= 354 ? yytranslate[x] : 217)
+#define YYTRANSLATE(x) ((unsigned)(x) <= 354 ? yytranslate[x] : 218)
 
 static const char yytranslate[] = {     0,
      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -270,65 +270,65 @@
    468,   471,   473,   476,   478,   480,   482,   484,   486,   488,
    490,   492,   494,   496,   498,   500,   502,   504,   506,   508,
    510,   512,   514,   515,   517,   519,   524,   528,   533,   535,
-   539,   545,   547,   551,   555,   559,   564,   568,   570,   574,
-   578,   582,   586,   588,   590,   592,   595,   598,   602,   604,
-   606,   608,   610,   612,   614,   616,   618,   624,   626,   630,
-   632,   636,   637,   639,   641,   643,   645,   647,   649,   653,
-   658,   660,   664,   667,   671,   673,   677,   678,   680,   682,
-   685,   688,   692,   694,   698,   700,   705,   710,   712,   714,
-   716,   718,   719,   721,   724,   729,   730,   732,   734,   736,
-   737,   739,   741,   743,   745,   747,   748,   750
+   539,   545,   547,   551,   555,   559,   564,   568,   570,   572,
+   576,   580,   584,   588,   590,   592,   594,   597,   600,   604,
+   606,   608,   610,   612,   614,   616,   618,   620,   626,   628,
+   632,   634,   638,   639,   641,   643,   645,   647,   649,   651,
+   655,   660,   662,   666,   669,   673,   675,   679,   680,   682,
+   684,   687,   690,   694,   696,   700,   702,   707,   712,   714,
+   716,   718,   720,   721,   723,   726,   731,   732,   734,   736,
+   738,   739,   741,   743,   745,   747,   749,   750,   752
 };
 
 static const short yyrhs[] = {   117,
-     0,   118,     0,   117,   118,     0,   213,   119,    34,   123,
+     0,   118,     0,   117,   118,     0,   214,   119,    34,   123,
      3,    21,   126,    39,     0,     0,   120,     0,   103,   121,
    104,     0,   103,   104,     0,   122,     0,   121,   122,     0,
-   216,     0,   216,   105,     9,   106,     0,     9,     0,     0,
+   217,     0,   217,   105,     9,   106,     0,     9,     0,     0,
    124,     0,   125,     0,   124,   125,     0,    41,    84,     0,
     52,    84,     0,    20,    84,     0,    43,    53,     0,    12,
     57,     0,     0,   127,     0,   128,     0,   127,   128,     0,
    130,     0,   135,     0,   143,     0,   170,     0,   138,     0,
      0,    38,    12,   129,     0,   178,     0,    54,   131,   107,
      0,    54,    46,     0,   132,     0,   131,   132,     0,   133,
-    46,   213,   119,     0,   134,     0,   133,   108,   134,     0,
-   213,     0,   213,   103,   104,     0,   216,     0,    42,   136,
+    46,   214,   119,     0,   134,     0,   133,   108,   134,     0,
+   214,     0,   214,   103,   104,     0,   217,     0,    42,   136,
    107,     0,    42,    17,   107,     0,    42,   107,     0,   137,
-     0,   136,   108,   137,     0,   213,     0,   213,   103,   104,
-     0,   216,     0,   213,   139,     3,   103,   140,   104,     0,
+     0,   136,   108,   137,     0,   214,     0,   214,   103,   104,
+     0,   217,     0,   214,   139,     3,   103,   140,   104,     0,
    165,     0,   175,     0,     0,   141,     0,   142,     0,   141,
-   108,   142,     0,   102,     0,   186,     0,   213,     3,   208,
-    87,     0,   213,     3,   163,     0,   213,     3,   153,     0,
-   213,   103,   144,   104,     3,   163,     0,   145,     0,   144,
-   108,   145,     0,   213,     0,   213,   109,   216,     0,   213,
-   109,   213,     0,   175,   109,   216,     0,   147,     0,   146,
-   108,   147,     0,   163,     0,   216,     0,     0,   149,     0,
-   150,     0,   149,   108,   150,     0,   216,   163,   202,     0,
+   108,   142,     0,   102,     0,   186,     0,   214,     3,   209,
+    87,     0,   214,     3,   163,     0,   214,     3,   153,     0,
+   214,   103,   144,   104,     3,   163,     0,   145,     0,   144,
+   108,   145,     0,   214,     0,   214,   109,   217,     0,   214,
+   109,   214,     0,   175,   109,   217,     0,   147,     0,   146,
+   108,   147,     0,   163,     0,   217,     0,     0,   149,     0,
+   150,     0,   149,   108,   150,     0,   217,   163,   203,     0,
     30,    68,   163,     0,   162,     0,   152,     0,   151,   108,
-   152,     0,   216,   163,     0,   162,     0,    28,   103,   155,
+   152,     0,   217,   163,     0,   162,     0,    28,   103,   155,
    104,   157,     0,     0,    88,     0,   156,     0,   155,   108,
-   156,     0,   168,   202,     0,   168,   163,   154,   202,     0,
-   168,   168,   154,   202,     0,     0,   158,     0,     0,    95,
+   156,     0,   168,   203,     0,   168,   163,   154,   203,     0,
+   168,   168,   154,   203,     0,     0,   158,     0,     0,    95,
     82,   103,   159,   160,   104,     0,   161,     0,   160,   161,
      0,     4,     0,   168,     0,   102,     0,   102,   110,   173,
-     0,   102,   110,   207,     0,   208,   164,   182,     0,   177,
+     0,   102,   110,   208,     0,   209,   164,   182,     0,   177,
      0,    27,   103,   151,   104,     0,    78,   103,   148,   104,
-     0,    79,   103,   148,   104,     0,    78,   182,    68,   215,
-   208,   164,     0,    79,   182,    68,   215,   208,   164,     0,
-    18,     0,    18,    35,    25,   216,     0,   213,   103,   146,
+     0,    79,   103,   148,   104,     0,    78,   182,    68,   216,
+   209,   164,     0,    79,   182,    68,   216,   209,   164,     0,
+    18,     0,    18,    35,    25,   217,     0,   214,   103,   146,
    104,     0,   165,     0,    56,    68,   165,     0,    11,     0,
-    11,   111,   213,     0,   214,   111,   213,     0,    11,   111,
-   216,     0,   214,     0,   214,   111,   166,     0,   167,     0,
+    11,   111,   214,     0,   215,   111,   214,     0,    11,   111,
+   217,     0,   215,     0,   215,   111,   166,     0,   167,     0,
    166,   111,   167,     0,   169,     0,   169,     0,    13,     0,
-    14,     0,   216,   139,     3,   171,     0,   216,   109,   171,
+    14,     0,   217,   139,     3,   171,     0,   217,   109,   171,
      0,     0,   103,   172,   174,     0,    63,     0,    45,     0,
-    86,     0,     5,     0,     7,     0,     6,     0,   207,     0,
-   173,     0,   216,     0,   213,   111,   216,     0,     4,     0,
+    86,     0,     5,     0,     7,     0,     6,     0,   208,     0,
+   173,     0,   217,     0,   214,   111,   217,     0,     4,     0,
    174,     4,     0,    24,     0,    63,     0,    76,     0,   176,
      0,    67,    81,     0,    65,    51,     0,    77,     0,    44,
      0,    36,    71,     0,    26,    81,     0,    91,     0,    47,
      0,   178,     0,    58,     0,    40,     0,    22,    81,     0,
-   175,     0,   176,   204,     0,    23,     0,    48,     0,    49,
+   175,     0,   176,   205,     0,    23,     0,    48,     0,    49,
      0,    50,     0,    59,     0,    64,     0,    74,     0,    83,
      0,    85,     0,    90,     0,    92,     0,    93,     0,    94,
      0,    66,     0,    99,     0,   100,     0,    97,     0,    98,
@@ -337,59 +337,59 @@
    106,     0,   186,     0,   186,   108,   102,     0,   186,   108,
    102,   108,   186,     0,   187,     0,   186,   179,   187,     0,
    186,   180,   187,     0,   187,   181,   187,     0,   189,   105,
-   185,   106,     0,   105,   185,   106,     0,   190,     0,   190,
-   188,   190,     0,    61,   188,   190,     0,   190,   188,    60,
-     0,    61,   188,    60,     0,   196,     0,   191,     0,   101,
-     0,   101,   112,     0,   112,   101,     0,   112,   101,   112,
-     0,    80,     0,    46,     0,    45,     0,    86,     0,   207,
-     0,     6,     0,   216,     0,   213,     0,    95,    30,   103,
-   192,   104,     0,   193,     0,   192,   108,   193,     0,   102,
-     0,   216,   182,   194,     0,     0,   195,     0,    73,     0,
-    15,     0,    69,     0,   197,     0,   198,     0,   103,   213,
-   104,     0,   197,   103,   199,   104,     0,   200,     0,   199,
-   108,   200,     0,   113,   201,     0,   113,   111,   201,     0,
-   216,     0,   201,   111,   216,     0,     0,   203,     0,    69,
-     0,    33,   171,     0,   103,   104,     0,   103,   205,   104,
-     0,   206,     0,   205,   108,   206,     0,   216,     0,   216,
-   105,   207,   106,     0,   216,   105,   173,   106,     0,   207,
-     0,   102,     0,     9,     0,    10,     0,     0,   209,     0,
-   210,   212,     0,   114,   211,     9,   115,     0,     0,    89,
-     0,    19,     0,    75,     0,     0,    52,     0,    41,     0,
-    11,     0,    12,     0,    12,     0,     0,   216,     0,     8,
-     0
+   185,   106,     0,   105,   185,   106,     0,   190,     0,   191,
+     0,   190,   188,   190,     0,    61,   188,   190,     0,   190,
+   188,    60,     0,    61,   188,    60,     0,   197,     0,   192,
+     0,   101,     0,   101,   112,     0,   112,   101,     0,   112,
+   101,   112,     0,    80,     0,    46,     0,    45,     0,    86,
+     0,   208,     0,     6,     0,   217,     0,   214,     0,    95,
+    30,   103,   193,   104,     0,   194,     0,   193,   108,   194,
+     0,   102,     0,   217,   182,   195,     0,     0,   196,     0,
+    73,     0,    15,     0,    69,     0,   198,     0,   199,     0,
+   103,   214,   104,     0,   198,   103,   200,   104,     0,   201,
+     0,   200,   108,   201,     0,   113,   202,     0,   113,   111,
+   202,     0,   217,     0,   202,   111,   217,     0,     0,   204,
+     0,    69,     0,    33,   171,     0,   103,   104,     0,   103,
+   206,   104,     0,   207,     0,   206,   108,   207,     0,   217,
+     0,   217,   105,   208,   106,     0,   217,   105,   173,   106,
+     0,   208,     0,   102,     0,     9,     0,    10,     0,     0,
+   210,     0,   211,   213,     0,   114,   212,     9,   115,     0,
+     0,    89,     0,    19,     0,    75,     0,     0,    52,     0,
+    41,     0,    11,     0,    12,     0,    12,     0,     0,   217,
+     0,     8,     0
 };
 
 #endif
 
 #if YYDEBUG != 0
 static const short yyrline[] = { 0,
-   301,   307,   313,   329,   354,   356,   359,   363,   368,   375,
-   383,   388,   392,   401,   403,   411,   415,   423,   427,   430,
-   433,   437,   457,   459,   467,   471,   503,   507,   516,   523,
-   536,   543,   545,   557,   570,   577,   582,   588,   594,   603,
-   609,   615,   622,   628,   636,   640,   643,   650,   656,   662,
-   669,   675,   684,   694,   702,   710,   712,   722,   725,   729,
-   732,   744,   756,   762,   778,   787,   797,   807,   812,   819,
-   826,   836,   842,   848,   852,   875,   877,   879,   885,   891,
-   898,   905,   910,   916,   922,   928,   933,   943,   945,   948,
-   956,   962,   971,   977,   994,   996,  1001,  1005,  1010,  1015,
-  1021,  1025,  1036,  1045,  1054,  1065,  1087,  1091,  1097,  1103,
-  1109,  1119,  1129,  1135,  1149,  1173,  1180,  1194,  1203,  1213,
-  1223,  1233,  1241,  1262,  1271,  1280,  1281,  1283,  1290,  1302,
-  1312,  1320,  1320,  1325,  1330,  1335,  1340,  1344,  1348,  1352,
-  1355,  1360,  1372,  1388,  1399,  1413,  1415,  1416,  1417,  1418,
-  1419,  1420,  1421,  1422,  1423,  1424,  1425,  1426,  1432,  1434,
-  1435,  1438,  1445,  1457,  1459,  1463,  1467,  1468,  1469,  1470,
-  1471,  1475,  1476,  1477,  1478,  1482,  1483,  1490,  1490,  1491,
-  1491,  1492,  1494,  1496,  1501,  1505,  1514,  1518,  1523,  1527,
-  1533,  1543,  1547,  1550,  1553,  1558,  1567,  1575,  1581,  1588,
-  1596,  1604,  1613,  1616,  1621,  1623,  1624,  1625,  1628,  1632,
-  1637,  1643,  1648,  1651,  1655,  1666,  1679,  1685,  1689,  1694,
-  1700,  1712,  1714,  1717,  1721,  1724,  1729,  1733,  1741,  1756,
-  1762,  1769,  1782,  1794,  1809,  1813,  1830,  1835,  1838,  1843,
-  1865,  1870,  1875,  1881,  1887,  1895,  1903,  1911,  1918,  1928,
-  1933,  1963,  1965,  1968,  1975,  1981,  1983,  1984,  1985,  1988,
-  1990,  1991,  1994,  1999,  2006,  2013,  2015,  2019
+   302,   308,   314,   330,   355,   357,   360,   364,   369,   376,
+   384,   389,   393,   402,   404,   412,   416,   424,   428,   431,
+   434,   438,   458,   460,   468,   472,   504,   508,   517,   524,
+   537,   544,   546,   558,   571,   578,   583,   589,   595,   604,
+   610,   616,   623,   629,   637,   641,   644,   651,   657,   663,
+   670,   676,   685,   695,   703,   711,   713,   723,   726,   730,
+   733,   745,   757,   763,   779,   788,   798,   808,   813,   820,
+   827,   837,   843,   849,   853,   876,   878,   880,   886,   892,
+   899,   906,   911,   917,   923,   929,   934,   944,   946,   949,
+   957,   963,   972,   978,   995,   997,  1002,  1006,  1011,  1016,
+  1022,  1026,  1037,  1046,  1055,  1066,  1088,  1092,  1098,  1104,
+  1110,  1120,  1130,  1136,  1150,  1174,  1181,  1195,  1204,  1214,
+  1224,  1234,  1242,  1263,  1272,  1281,  1282,  1284,  1291,  1303,
+  1313,  1321,  1321,  1326,  1331,  1336,  1341,  1345,  1349,  1353,
+  1356,  1361,  1373,  1389,  1400,  1414,  1416,  1417,  1418,  1419,
+  1420,  1421,  1422,  1423,  1424,  1425,  1426,  1427,  1433,  1435,
+  1436,  1439,  1446,  1458,  1460,  1464,  1468,  1469,  1470,  1471,
+  1472,  1476,  1477,  1478,  1479,  1483,  1484,  1491,  1491,  1492,
+  1492,  1493,  1495,  1497,  1502,  1506,  1515,  1519,  1524,  1528,
+  1534,  1544,  1548,  1551,  1554,  1559,  1568,  1576,  1582,  1588,
+  1595,  1603,  1611,  1620,  1623,  1628,  1630,  1631,  1632,  1635,
+  1639,  1644,  1650,  1655,  1658,  1662,  1675,  1689,  1695,  1699,
+  1704,  1710,  1722,  1724,  1727,  1731,  1734,  1739,  1743,  1751,
+  1766,  1772,  1779,  1792,  1804,  1819,  1823,  1840,  1845,  1848,
+  1853,  1875,  1880,  1885,  1891,  1897,  1905,  1913,  1921,  1928,
+  1938,  1943,  1973,  1975,  1978,  1985,  1991,  1993,  1994,  1995,
+  1998,  2000,  2001,  2004,  2009,  2016,  2023,  2025,  2029
 };
 #endif
 
@@ -432,12 +432,13 @@
 "Value","@3","DefinedValue","Opaque","BasicTypeId","BasicTypeId_UniverationCompatible",
 "BasicType","BasicString","Union","Intersection","Except","optConstraints","Constraints",
 "SetOfConstraints","ElementSetSpecs","ElementSetSpec","ConstraintSubtypeElement",
-"ConstraintRangeSpec","ConstraintSpec","ConstraintValue","WithComponents","WithComponentsList",
-"WithComponentsElement","optPresenceConstraint","PresenceConstraint","TableConstraint",
-"SimpleTableConstraint","ComponentRelationConstraint","AtNotationList","AtNotationElement",
-"ComponentIdList","optMarker","Marker","UniverationDefinition","UniverationList",
-"UniverationElement","SignedNumber","optTag","Tag","TagTypeValue","TagClass",
-"TagPlicit","TypeRefName","ObjectClassReference","optIdentifier","Identifier", NULL
+"ConstraintRangeSpec","ConstraintSpec","SingleValue","ContainedSubtype","WithComponents",
+"WithComponentsList","WithComponentsElement","optPresenceConstraint","PresenceConstraint",
+"TableConstraint","SimpleTableConstraint","ComponentRelationConstraint","AtNotationList",
+"AtNotationElement","ComponentIdList","optMarker","Marker","UniverationDefinition",
+"UniverationList","UniverationElement","SignedNumber","optTag","Tag","TagTypeValue",
+"TagClass","TagPlicit","TypeRefName","ObjectClassReference","optIdentifier",
+"Identifier", NULL
 };
 #endif
 
@@ -462,13 +463,13 @@
    178,   178,   178,   178,   178,   178,   178,   179,   179,   180,
    180,   181,   182,   182,   183,   183,   184,   184,   185,   185,
    185,   186,   186,   186,   186,   187,   187,   187,   187,   187,
-   187,   187,   187,   187,   188,   188,   188,   188,   189,   189,
-   190,   190,   190,   190,   190,   190,   191,   192,   192,   193,
-   193,   194,   194,   195,   195,   195,   196,   196,   197,   198,
-   199,   199,   200,   200,   201,   201,   202,   202,   203,   203,
-   204,   204,   205,   205,   206,   206,   206,   206,   206,   207,
-   207,   208,   208,   209,   210,   211,   211,   211,   211,   212,
-   212,   212,   213,   213,   214,   215,   215,   216
+   187,   187,   187,   187,   187,   188,   188,   188,   188,   189,
+   189,   190,   190,   190,   190,   190,   191,   192,   193,   193,
+   194,   194,   195,   195,   196,   196,   196,   197,   197,   198,
+   199,   200,   200,   201,   201,   202,   202,   203,   203,   204,
+   204,   205,   205,   206,   206,   207,   207,   207,   207,   207,
+   208,   208,   209,   209,   210,   211,   212,   212,   212,   212,
+   213,   213,   213,   214,   214,   215,   216,   216,   217
 };
 
 static const short yyr2[] = {     0,
@@ -491,18 +492,18 @@
      2,     1,     2,     1,     1,     1,     1,     1,     1,     1,
      1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
      1,     1,     0,     1,     1,     4,     3,     4,     1,     3,
-     5,     1,     3,     3,     3,     4,     3,     1,     3,     3,
-     3,     3,     1,     1,     1,     2,     2,     3,     1,     1,
-     1,     1,     1,     1,     1,     1,     5,     1,     3,     1,
-     3,     0,     1,     1,     1,     1,     1,     1,     3,     4,
-     1,     3,     2,     3,     1,     3,     0,     1,     1,     2,
-     2,     3,     1,     3,     1,     4,     4,     1,     1,     1,
-     1,     0,     1,     2,     4,     0,     1,     1,     1,     0,
-     1,     1,     1,     1,     1,     0,     1,     1
+     5,     1,     3,     3,     3,     4,     3,     1,     1,     3,
+     3,     3,     3,     1,     1,     1,     2,     2,     3,     1,
+     1,     1,     1,     1,     1,     1,     1,     5,     1,     3,
+     1,     3,     0,     1,     1,     1,     1,     1,     1,     3,
+     4,     1,     3,     2,     3,     1,     3,     0,     1,     1,
+     2,     2,     3,     1,     3,     1,     4,     4,     1,     1,
+     1,     1,     0,     1,     2,     4,     0,     1,     1,     1,
+     0,     1,     1,     1,     1,     1,     0,     1,     1
 };
 
 static const short yydefact[] = {     0,
-   263,   264,     1,     2,     5,     3,     0,     0,     6,   268,
+   264,   265,     1,     2,     5,     3,     0,     0,     6,   269,
     13,     8,     0,     9,    11,    14,     7,    10,     0,     0,
      0,     0,     0,     0,     0,    15,    16,     0,    22,    20,
     18,    21,    19,     0,    17,    12,    23,   164,     0,     0,
@@ -510,283 +511,287 @@
    173,   174,   175,   176,     0,    24,    25,    27,    28,    31,
     29,    30,    34,     0,     0,    32,     0,    47,     0,    48,
     50,    52,    36,     0,    37,     0,    40,    42,    44,     4,
-    26,   252,   118,   265,     0,   146,     0,     0,   160,   153,
+    26,   253,   118,   266,     0,   146,     0,     0,   160,   153,
    157,   159,   147,     0,     0,   148,   152,   156,     0,     0,
     54,    55,   149,   158,   122,     0,    33,    46,    45,     0,
-     0,    35,    38,     0,     0,     0,     0,   256,    64,    63,
-     0,   253,   260,     0,   161,   155,   154,   151,   150,     0,
+     0,    35,    38,     0,     0,     0,     0,   257,    64,    63,
+     0,   254,   261,     0,   161,   155,   154,   151,   150,     0,
     66,     0,    68,     0,     0,     0,    49,    51,     5,    41,
-    43,     0,   258,   259,   257,     0,   118,   265,   113,     0,
+    43,     0,   259,   260,   258,     0,   118,   266,   113,     0,
      0,   183,   183,    62,   183,   116,   162,   149,   107,     0,
-   262,   261,   254,   119,   121,     0,     0,     0,     0,    56,
-   128,   129,   123,   124,   126,   120,   137,   139,   138,   250,
-   251,   135,   134,   136,   132,   130,   141,   140,     0,   142,
-    39,     0,    90,   252,   127,     0,     0,     0,     0,     0,
+   263,   262,   255,   119,   121,     0,     0,     0,     0,    56,
+   128,   129,   123,   124,   126,   120,   137,   139,   138,   251,
+   252,   135,   134,   136,   132,   130,   141,   140,     0,   142,
+    39,     0,    90,   253,   127,     0,     0,     0,     0,     0,
     76,     0,     0,   184,   185,    76,     0,   106,     0,   163,
-   252,   252,    67,    71,    70,    69,   214,   211,   210,     0,
-   209,   212,     0,    60,     0,     0,     0,    57,    58,    61,
-   192,     0,   198,   204,   203,   227,   228,   213,   216,   215,
-     0,     0,     0,     0,    95,     0,     0,   239,    88,    88,
-    92,   238,     0,   255,     0,   103,     0,    83,    86,   252,
-   117,     0,     0,     0,    77,    78,    82,   252,     0,   189,
-   266,     0,     0,   266,   249,   241,     0,   243,   248,   245,
-     0,    72,    74,    75,    65,   205,     0,     0,     0,     0,
-     0,    53,     0,   180,   181,   178,   179,     0,     0,   182,
-     0,     0,     0,     0,   125,   144,   133,   143,   131,     0,
-    87,    96,    91,   240,    89,   237,   237,   114,     0,   108,
-     0,    85,     0,   252,   109,     0,   237,   187,     0,   252,
-   267,     0,   110,   252,   242,     0,     0,   115,   252,   206,
-   207,   202,   200,     0,   229,   197,    59,   193,   194,   195,
-     0,   201,   199,     0,     0,   231,   145,     0,    93,    94,
-   104,   105,   142,    84,   186,    81,    79,    80,   190,     0,
-   188,     0,   244,     0,     0,    73,   208,   220,     0,   218,
-   183,   196,     0,   233,   235,   230,     0,    97,     0,   111,
-   112,   247,   246,   217,     0,   222,   234,     0,   232,     0,
-   191,   219,   225,   226,   224,   221,   223,   236,   101,     0,
-    99,   102,    98,   100,     0,     0,     0
+   253,   253,    67,    71,    70,    69,   215,   212,   211,     0,
+   210,   213,     0,    60,     0,     0,     0,    57,    58,    61,
+   192,     0,   198,   199,   205,   204,   228,   229,   214,   217,
+   216,     0,     0,     0,     0,    95,     0,     0,   240,    88,
+    88,    92,   239,     0,   256,     0,   103,     0,    83,    86,
+   253,   117,     0,     0,     0,    77,    78,    82,   253,     0,
+   189,   267,     0,     0,   267,   250,   242,     0,   244,   249,
+   246,     0,    72,    74,    75,    65,   206,     0,     0,     0,
+     0,     0,    53,     0,   180,   181,   178,   179,     0,     0,
+   182,     0,     0,     0,     0,   125,   144,   133,   143,   131,
+     0,    87,    96,    91,   241,    89,   238,   238,   114,     0,
+   108,     0,    85,     0,   253,   109,     0,   238,   187,     0,
+   253,   268,     0,   110,   253,   243,     0,     0,   115,   253,
+   207,   208,   203,   201,     0,   230,   197,    59,   193,   194,
+   195,     0,   202,   200,     0,     0,   232,   145,     0,    93,
+    94,   104,   105,   142,    84,   186,    81,    79,    80,   190,
+     0,   188,     0,   245,     0,     0,    73,   209,   221,     0,
+   219,   183,   196,     0,   234,   236,   231,     0,    97,     0,
+   111,   112,   248,   247,   218,     0,   223,   235,     0,   233,
+     0,   191,   220,   226,   227,   225,   222,   224,   237,   101,
+     0,    99,   102,    98,   100,     0,     0,     0
 };
 
-static const short yydefgoto[] = {   415,
+static const short yydefgoto[] = {   416,
      3,     4,     8,     9,    13,    14,    25,    26,    27,    55,
     56,    57,   107,    58,    74,    75,    76,    77,    59,    69,
-    70,    60,   100,   227,   228,   229,    61,   130,   131,   281,
-   282,   264,   265,   266,   257,   258,   119,   316,   192,   193,
-   311,   312,   400,   410,   411,   267,   283,   155,   156,   173,
-   174,   194,   195,    62,   186,   242,   187,   307,   157,   103,
-   159,   104,   298,   299,   301,   203,   204,   205,   269,   270,
-   231,   288,   232,   233,   234,   379,   380,   406,   407,   235,
-   236,   237,   355,   356,   384,   251,   252,   210,   277,   278,
-   238,   253,   122,   123,   146,   163,   239,   105,   330,   240
+    70,    60,   100,   227,   228,   229,    61,   130,   131,   282,
+   283,   265,   266,   267,   258,   259,   119,   317,   192,   193,
+   312,   313,   401,   411,   412,   268,   284,   155,   156,   173,
+   174,   194,   195,    62,   186,   243,   187,   308,   157,   103,
+   159,   104,   299,   300,   302,   203,   204,   205,   270,   271,
+   231,   289,   232,   233,   234,   235,   380,   381,   407,   408,
+   236,   237,   238,   356,   357,   385,   252,   253,   210,   278,
+   279,   239,   254,   122,   123,   146,   163,   240,   105,   331,
+   241
 };
 
-static const short yypact[] = {   152,
--32768,-32768,   152,-32768,   -74,-32768,    12,     5,-32768,-32768,
--32768,-32768,    38,-32768,   -16,    54,-32768,-32768,    44,    56,
-    47,    72,    85,    81,   141,    54,-32768,    64,-32768,-32768,
--32768,-32768,-32768,   132,-32768,-32768,   407,-32768,   161,    33,
--32768,-32768,-32768,    53,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,   156,   407,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,   331,   636,-32768,   118,-32768,   105,-32768,
-   124,-32768,-32768,    16,-32768,   -23,-32768,   147,-32768,-32768,
--32768,    -3,   140,-32768,   176,-32768,   182,   203,-32768,-32768,
--32768,-32768,-32768,   225,   198,-32768,-32768,-32768,   711,   278,
--32768,-32768,-32768,-32768,   171,   283,-32768,-32768,-32768,    65,
-   189,-32768,-32768,   152,    65,   194,   200,     3,-32768,-32768,
-   484,-32768,    84,    65,-32768,-32768,-32768,-32768,-32768,    67,
--32768,   192,   195,   204,   248,   210,-32768,-32768,   -74,-32768,
--32768,   163,-32768,-32768,-32768,   306,   -10,   213,   282,   215,
-   253,    -1,    69,-32768,   -42,-32768,-32768,   219,-32768,   223,
--32768,-32768,-32768,-32768,-32768,   320,   711,   319,    65,   197,
--32768,-32768,   217,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   222,   226,
--32768,    82,-32768,    29,-32768,   216,   311,     7,   235,   233,
-    10,   279,   271,-32768,   236,    10,   276,-32768,    46,-32768,
-     1,   231,-32768,-32768,-32768,-32768,-32768,-32768,-32768,    27,
--32768,-32768,   318,-32768,   152,   279,   245,   243,-32768,   211,
-   256,   251,    27,-32768,-32768,   255,-32768,-32768,-32768,-32768,
-   163,   356,   319,   210,   266,   163,   210,-32768,   274,   274,
--32768,-32768,   561,-32768,   319,   254,    88,-32768,-32768,   231,
--32768,   279,   295,   262,   261,-32768,-32768,   231,   264,    60,
-   319,   279,   268,   319,-32768,-32768,    93,-32768,-32768,   272,
-   130,-32768,-32768,-32768,-32768,   273,   285,   220,   270,   288,
-   277,-32768,   197,-32768,-32768,-32768,-32768,   279,   279,-32768,
-   279,   279,   260,   280,-32768,-32768,   383,-32768,-32768,   317,
--32768,-32768,-32768,-32768,-32768,    19,    19,-32768,   173,-32768,
-     7,-32768,   294,   231,-32768,    10,    19,-32768,   300,   231,
--32768,   298,-32768,   231,-32768,    49,   173,-32768,     1,-32768,
-   297,-32768,-32768,    52,-32768,-32768,-32768,-32768,-32768,-32768,
-   304,-32768,-32768,    11,   131,-32768,-32768,   303,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   305,   561,
--32768,   561,-32768,   314,   321,-32768,-32768,-32768,   137,-32768,
-   -42,-32768,   319,   301,-32768,-32768,   280,-32768,   279,-32768,
--32768,-32768,-32768,-32768,    52,    17,   301,   319,-32768,   165,
-   211,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,    22,
--32768,-32768,-32768,-32768,   411,   417,-32768
+static const short yypact[] = {   228,
+-32768,-32768,   228,-32768,   -71,-32768,    38,    59,-32768,-32768,
+-32768,-32768,    49,-32768,    -3,    58,-32768,-32768,    74,    54,
+    60,    67,   112,    84,   136,    58,-32768,    82,-32768,-32768,
+-32768,-32768,-32768,   152,-32768,-32768,   419,-32768,   178,    33,
+-32768,-32768,-32768,    61,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,   181,   419,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,   332,   648,-32768,   121,-32768,   144,-32768,
+   132,-32768,-32768,    17,-32768,   -22,-32768,   143,-32768,-32768,
+-32768,   -17,   137,-32768,   183,-32768,   194,   186,-32768,-32768,
+-32768,-32768,-32768,   208,   203,-32768,-32768,-32768,   723,   275,
+-32768,-32768,-32768,-32768,   179,   288,-32768,-32768,-32768,   184,
+   190,-32768,-32768,   228,   184,   191,   193,    20,-32768,-32768,
+   496,-32768,    86,   184,-32768,-32768,-32768,-32768,-32768,    79,
+-32768,   188,   195,   200,   258,   355,-32768,-32768,   -71,-32768,
+-32768,   260,-32768,-32768,-32768,   284,    53,   202,   263,   205,
+   238,   -15,   -14,-32768,    55,-32768,-32768,   206,-32768,   207,
+-32768,-32768,-32768,-32768,-32768,   308,   723,   304,   184,   197,
+-32768,-32768,   210,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   211,   209,
+-32768,    93,-32768,    29,-32768,   199,   292,    11,   269,   214,
+    10,   221,   255,-32768,   220,    10,   259,-32768,    46,-32768,
+     6,   215,-32768,-32768,-32768,-32768,-32768,-32768,-32768,    62,
+-32768,-32768,   298,-32768,   228,   221,   230,   224,-32768,   189,
+   240,   232,    62,-32768,-32768,-32768,   236,-32768,-32768,-32768,
+-32768,   260,   336,   304,   355,   246,   260,   355,-32768,   254,
+   254,-32768,-32768,   573,-32768,   304,   235,   108,-32768,-32768,
+   215,-32768,   221,   278,   243,   241,-32768,-32768,   215,   244,
+    72,   304,   221,   248,   304,-32768,-32768,   109,-32768,-32768,
+   252,   110,-32768,-32768,-32768,-32768,   247,   270,    71,   250,
+   266,   267,-32768,   197,-32768,-32768,-32768,-32768,   221,   221,
+-32768,   221,   221,   176,   261,-32768,-32768,   371,-32768,-32768,
+   296,-32768,-32768,-32768,-32768,-32768,    15,    15,-32768,   167,
+-32768,    11,-32768,   277,   215,-32768,    10,    15,-32768,   282,
+   215,-32768,   279,-32768,   215,-32768,    13,   167,-32768,     6,
+-32768,   274,-32768,-32768,    52,-32768,-32768,-32768,-32768,-32768,
+-32768,   281,-32768,-32768,    12,   115,-32768,-32768,   285,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   286,
+   573,-32768,   573,-32768,   287,   295,-32768,-32768,-32768,   118,
+-32768,    55,-32768,   304,   294,-32768,-32768,   261,-32768,   221,
+-32768,-32768,-32768,-32768,-32768,    52,    23,   294,   304,-32768,
+   145,   189,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+    22,-32768,-32768,-32768,-32768,   403,   407,-32768
 };
 
 static const short yypgoto[] = {-32768,
--32768,   423,   289,-32768,-32768,   416,-32768,-32768,   405,-32768,
--32768,   376,-32768,-32768,-32768,   359,-32768,   322,-32768,-32768,
-   325,-32768,   371,-32768,-32768,   145,-32768,-32768,   275,-32768,
-   100,   234,-32768,   115,-32768,   122,-32768,   196,-32768,   201,
--32768,-32768,-32768,-32768,    34,  -187,   -80,  -183,   -52,-32768,
-   207,  -186,  -121,-32768,  -137,-32768,  -237,-32768,   -48,  -118,
--32768,    35,-32768,-32768,-32768,  -148,-32768,-32768,  -178,  -166,
-    -4,   218,-32768,  -207,-32768,-32768,    55,-32768,-32768,-32768,
--32768,-32768,-32768,    66,    71,  -247,-32768,-32768,-32768,   116,
-  -126,   -81,-32768,-32768,-32768,-32768,    31,-32768,   184,    -7
+-32768,   408,   271,-32768,-32768,   399,-32768,-32768,   387,-32768,
+-32768,   358,-32768,-32768,-32768,   342,-32768,   305,-32768,-32768,
+   309,-32768,   356,-32768,-32768,   134,-32768,-32768,   262,-32768,
+    92,   227,-32768,   107,-32768,   114,-32768,   187,-32768,   192,
+-32768,-32768,-32768,-32768,    26,  -188,   -80,  -312,   -52,-32768,
+   198,  -186,  -120,-32768,    -1,-32768,  -244,-32768,   -48,  -118,
+-32768,    69,-32768,-32768,-32768,  -148,-32768,-32768,  -199,  -166,
+   -39,   212,-32768,  -204,-32768,-32768,-32768,    47,-32768,-32768,
+-32768,-32768,-32768,-32768,    56,    63,  -265,-32768,-32768,-32768,
+   111,  -127,   -81,-32768,-32768,-32768,-32768,    31,-32768,   171,
+    -7
 };
 
 
-#define	YYLAST		805
+#define	YYLAST		817
 
 
 static const short yytable[] = {    15,
-   121,   120,   158,   230,   207,    15,   208,   250,    10,   188,
-   259,   101,   101,   175,    10,   102,   102,    10,    10,    10,
-    11,   143,   114,    10,   117,   409,     1,     2,     7,    65,
-     5,   403,    72,     5,   171,   172,    79,   200,    16,   263,
-    10,   171,   172,     1,     2,    10,    11,   291,    65,    67,
-   132,   247,    28,    10,   180,   181,    10,   180,   181,    10,
-    10,   247,   202,     1,     2,    20,    79,    64,   359,   360,
-    71,    63,    10,    21,    78,     1,     2,   144,   200,   368,
-   343,   361,   279,   323,   115,   404,    64,   248,    19,   405,
-    63,   145,  -263,   332,    22,   353,    23,   248,    73,   374,
-   124,   201,    72,   202,    78,    24,   309,    79,   256,   314,
-   118,   256,    29,   249,   118,    12,   165,   188,   132,   175,
-   188,   383,   112,   351,   161,   413,   230,   286,   190,   133,
-    30,   285,  -237,   259,   158,   162,  -237,    32,   287,    68,
-    71,    17,   118,    34,   139,    78,   261,   275,   200,   276,
-   275,   160,    37,   378,   164,    31,   294,   295,   296,   297,
-   214,   216,     1,     2,    33,   176,   189,   329,   409,    36,
-   166,   206,    66,   202,   167,   171,   172,   171,   172,   322,
-    10,   180,   181,     1,     2,   245,   390,   327,   391,   246,
-   260,   320,   362,   268,    80,   321,   335,   133,   268,   215,
-   336,   280,   217,   284,    10,   180,   181,     1,     2,   279,
-   375,   109,   110,   412,   177,   178,   179,    10,   180,   181,
-     1,     2,   401,   412,   108,   217,   111,    10,   180,   181,
-     1,     2,   396,   338,   386,   308,   190,   339,   387,   190,
-   394,   218,   219,   366,   395,    83,    84,   318,   370,   116,
-   124,   158,   372,   158,   182,   290,   125,   220,     1,     2,
-   171,   172,   126,   331,   218,   217,   331,    10,   180,   181,
-     1,     2,   183,   127,   189,   128,   221,   189,   129,   342,
-   134,   135,   222,   160,   217,   136,    10,   180,   181,     1,
-     2,   223,   138,   348,   349,   184,   350,   141,   224,   225,
-   168,   226,   142,   169,   218,   222,   170,   294,   295,   296,
-   297,   363,   185,   260,   196,  -264,   197,   198,   268,   352,
-   199,   209,   212,   218,   219,   211,    10,   241,   280,   363,
-   254,   284,   243,    82,   244,   255,   381,   262,   271,   220,
-   272,    83,    84,   274,   118,   222,   385,   289,   292,   189,
-   293,   300,    85,    38,    86,   302,    87,   304,   221,   306,
-   310,   315,   324,   319,   222,   325,    88,   189,   326,   328,
-    89,   333,   344,   223,    90,   385,   337,    91,    41,    42,
-    43,   225,   346,   226,   340,   341,   357,   381,    92,    45,
-   408,   345,   354,    93,    46,    94,    47,    95,   358,   365,
-   160,   369,   160,   371,    48,   388,    96,    97,   377,   382,
-   416,   398,   389,    49,    10,    50,   417,     1,     2,   392,
-    51,    98,    52,    53,    54,     6,   393,   191,    18,    38,
-    35,    81,   113,    99,   137,   106,   140,   347,   376,   273,
-   367,   213,   364,   414,    39,   317,   313,   305,    40,   402,
-   303,   373,   399,   397,    41,    42,    43,   334,     0,     0,
-    44,     0,     0,     0,     0,    45,     0,     0,     0,     0,
-    46,     0,    47,     0,     0,     0,     0,     0,     0,     0,
-    48,     0,     0,     0,     0,     0,     0,     0,     0,    49,
-     0,    50,     0,     0,   147,   148,    51,     0,    52,    53,
-    54,   149,     0,     0,     0,    85,    38,    86,     0,    87,
-   150,     0,     0,     0,     0,     0,     0,     0,     0,    88,
-     0,     0,     0,    89,     0,     0,     0,    90,     0,     0,
-    91,    41,    42,    43,     0,     0,     0,     0,     0,   151,
-     0,    92,    45,     0,     0,     0,    93,    46,    94,    47,
-    95,     0,     0,     0,     0,     0,     0,    48,     0,    96,
-    97,   152,   153,     0,     0,     0,    49,     0,    50,     0,
-   154,   147,   148,    51,    98,    52,    53,    54,   149,     0,
-     0,     0,    85,    38,    86,     0,    87,   150,     0,     0,
-     0,     0,     0,     0,     0,     0,    88,     0,     0,     0,
-    89,     0,     0,     0,    90,     0,     0,    91,    41,    42,
-    43,     0,     0,     0,     0,     0,   151,     0,    92,    45,
-     0,     0,     0,    93,    46,    94,    47,    95,     0,     0,
-     0,     0,     0,     0,    48,     0,    96,    97,   152,   153,
-     0,     0,     0,    49,     0,    50,    83,    84,     0,     0,
-    51,    98,    52,    53,    54,     0,     0,    85,    38,    86,
-     0,    87,     0,     0,     0,     0,     0,     0,     0,     0,
+   121,   120,   158,   230,   207,    15,   208,   251,   188,   260,
+   117,   101,   101,    10,   175,   102,   102,    10,    10,    10,
+    10,   180,   181,   114,    10,   410,   292,     1,     2,    65,
+     5,     7,    72,     5,   171,   172,    79,   404,   143,   264,
+    10,   171,   172,     1,     2,    10,    11,   248,    65,    67,
+   132,   360,   361,    10,   180,   181,    10,    11,   391,    10,
+   392,   248,   369,   324,   200,   200,    79,    64,    10,    20,
+    71,     1,     2,   333,    78,   362,   217,    21,    10,   180,
+   181,   280,    28,   249,   344,   115,    64,   201,   206,   202,
+   202,   405,    16,   375,   144,   406,   118,   249,    22,   354,
+    23,    19,    72,   352,    78,    63,    73,    79,   145,    24,
+    29,   257,   257,   250,   276,   218,   165,   188,   132,   118,
+   188,   175,   384,   112,    63,   414,   161,   230,   190,   133,
+   343,   286,  -238,   260,   200,   158,  -238,   162,    34,    68,
+    71,    12,   118,    30,   139,    78,   262,   276,   410,   277,
+    31,   160,    17,   379,   164,  -264,   222,   171,   172,   202,
+   214,   216,   287,   124,    32,   176,   189,    33,   295,   296,
+   297,   298,    37,   288,    10,   180,   181,     1,     2,   330,
+   323,   217,   166,    10,   180,   181,   167,    36,   328,    66,
+   261,    10,   363,   269,     1,     2,   246,   133,   269,   215,
+   247,   281,   217,   285,    10,   180,   181,     1,     2,   280,
+   376,   321,   336,   339,   413,   322,   337,   340,   387,    80,
+   218,   395,   388,   402,   413,   396,   217,   108,    10,   180,
+   181,     1,     2,   397,   111,   353,   309,   190,     1,     2,
+   190,   218,   219,   310,   367,   116,   315,   124,   319,   371,
+   109,   110,   158,   373,   158,   291,   127,   220,   128,   349,
+   350,   222,   351,   125,   332,   218,   219,   332,     1,     2,
+   171,   172,   171,   172,   126,   189,   221,   134,   189,    83,
+    84,   220,   222,   129,   160,   295,   296,   297,   298,   135,
+   136,   223,   196,   138,   141,   142,   168,   197,   224,   225,
+   221,   226,   170,   169,  -265,   199,   222,   198,   209,   211,
+   212,    10,   364,   255,   261,   223,   256,   245,   263,   269,
+   242,   244,   272,   225,   273,   226,   275,   290,   118,   281,
+   364,   294,   285,   293,    82,   301,   303,   382,   305,   307,
+   311,   316,    83,    84,   320,   325,   326,   386,   327,   329,
+   189,   334,   345,    85,    38,    86,   338,    87,   341,   177,
+   178,   179,    10,   180,   181,     1,     2,    88,   189,   346,
+   342,    89,   347,   355,   358,    90,   386,   359,    91,    41,
+    42,    43,   366,   370,   372,   378,   383,   389,   382,    92,
+    45,   409,   393,   390,    93,    46,    94,    47,    95,   182,
+   394,   160,   417,   160,   399,    48,   418,    96,    97,   191,
+     6,    18,    35,    81,    49,   113,    50,   183,   137,   140,
+   106,    51,    98,    52,    53,    54,    10,   348,   213,     1,
+     2,   377,   274,   368,    99,   365,   415,   318,   314,   306,
+   184,    38,   403,   400,   304,   335,   398,   374,     0,     0,
+     0,     0,     0,     0,     0,     0,    39,   185,     0,     0,
+    40,     0,     0,     0,     0,     0,    41,    42,    43,     0,
+     0,     0,    44,     0,     0,     0,     0,    45,     0,     0,
+     0,     0,    46,     0,    47,     0,     0,     0,     0,     0,
+     0,     0,    48,     0,     0,     0,     0,     0,     0,     0,
+     0,    49,     0,    50,     0,     0,   147,   148,    51,     0,
+    52,    53,    54,   149,     0,     0,     0,    85,    38,    86,
+     0,    87,   150,     0,     0,     0,     0,     0,     0,     0,
      0,    88,     0,     0,     0,    89,     0,     0,     0,    90,
      0,     0,    91,    41,    42,    43,     0,     0,     0,     0,
-     0,     0,     0,    92,    45,     0,     0,     0,    93,    46,
+     0,   151,     0,    92,    45,     0,     0,     0,    93,    46,
     94,    47,    95,     0,     0,     0,     0,     0,     0,    48,
-     0,    96,    97,     0,     0,     0,     0,     0,    49,     0,
-    50,     1,     2,     0,     0,    51,    98,    52,    53,    54,
-     0,     0,    85,    38,    86,     0,    87,     0,     0,     0,
-     0,     0,     0,     0,     0,     0,    88,     0,     0,     0,
-    89,     0,     0,     0,    90,     0,     0,    91,    41,    42,
-    43,     0,     0,     0,     0,     0,     0,     0,    92,    45,
-     0,     0,     0,    93,    46,    94,    47,    95,     0,     0,
-     0,     0,     0,     0,    48,     0,    96,    97,     0,     0,
-     0,     0,     0,    49,     0,    50,     0,     0,     0,     0,
-    51,    98,    52,    53,    54
+     0,    96,    97,   152,   153,     0,     0,     0,    49,     0,
+    50,     0,   154,   147,   148,    51,    98,    52,    53,    54,
+   149,     0,     0,     0,    85,    38,    86,     0,    87,   150,
+     0,     0,     0,     0,     0,     0,     0,     0,    88,     0,
+     0,     0,    89,     0,     0,     0,    90,     0,     0,    91,
+    41,    42,    43,     0,     0,     0,     0,     0,   151,     0,
+    92,    45,     0,     0,     0,    93,    46,    94,    47,    95,
+     0,     0,     0,     0,     0,     0,    48,     0,    96,    97,
+   152,   153,     0,     0,     0,    49,     0,    50,    83,    84,
+     0,     0,    51,    98,    52,    53,    54,     0,     0,    85,
+    38,    86,     0,    87,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,    88,     0,     0,     0,    89,     0,     0,
+     0,    90,     0,     0,    91,    41,    42,    43,     0,     0,
+     0,     0,     0,     0,     0,    92,    45,     0,     0,     0,
+    93,    46,    94,    47,    95,     0,     0,     0,     0,     0,
+     0,    48,     0,    96,    97,     0,     0,     0,     0,     0,
+    49,     0,    50,     1,     2,     0,     0,    51,    98,    52,
+    53,    54,     0,     0,    85,    38,    86,     0,    87,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,    88,     0,
+     0,     0,    89,     0,     0,     0,    90,     0,     0,    91,
+    41,    42,    43,     0,     0,     0,     0,     0,     0,     0,
+    92,    45,     0,     0,     0,    93,    46,    94,    47,    95,
+     0,     0,     0,     0,     0,     0,    48,     0,    96,    97,
+     0,     0,     0,     0,     0,    49,     0,    50,     0,     0,
+     0,     0,    51,    98,    52,    53,    54
 };
 
 static const short yycheck[] = {     7,
-    82,    82,   121,   170,   153,    13,   155,   194,     8,   136,
-   198,    64,    65,   135,     8,    64,    65,     8,     8,     8,
-     9,    19,    46,     8,    28,     4,    11,    12,   103,    37,
-     0,    15,    40,     3,    13,    14,    44,    80,    34,    30,
-     8,    13,    14,    11,    12,     8,     9,   226,    56,    17,
-    99,    33,     9,     8,     9,    10,     8,     9,    10,     8,
-     8,    33,   105,    11,    12,    12,    74,    37,   316,   317,
-    40,    37,     8,    20,    44,    11,    12,    75,    80,   327,
-   288,   319,   209,   262,   108,    69,    56,    69,   105,    73,
-    56,    89,   103,   272,    41,   303,    43,    69,    46,   337,
-   111,   103,   110,   105,    74,    52,   244,   115,   102,   247,
-   114,   102,    57,   194,   114,   104,   124,   244,   167,   241,
-   247,   111,   107,   302,    41,   104,   293,   101,   136,    99,
-    84,   212,   104,   321,   253,    52,   108,    53,   112,   107,
-   110,   104,   114,     3,   114,   115,   199,   102,    80,   104,
-   102,   121,    21,   102,   124,    84,    97,    98,    99,   100,
-   168,   169,    11,    12,    84,   135,   136,   108,     4,   106,
-   104,   103,    12,   105,   108,    13,    14,    13,    14,   260,
-     8,     9,    10,    11,    12,   104,   370,   268,   372,   108,
-   198,   104,   319,   201,    39,   108,   104,   167,   206,   169,
-   108,   209,     6,   211,     8,     9,    10,    11,    12,   336,
-   337,   107,   108,   400,     5,     6,     7,     8,     9,    10,
-    11,    12,   389,   410,   107,     6,   103,     8,     9,    10,
-    11,    12,   381,   104,   104,   243,   244,   108,   108,   247,
-   104,    45,    46,   324,   108,    11,    12,   255,   330,   103,
-   111,   370,   334,   372,    45,   225,    81,    61,    11,    12,
-    13,    14,    81,   271,    45,     6,   274,     8,     9,    10,
-    11,    12,    63,    71,   244,    51,    80,   247,    81,    60,
-     3,   111,    86,   253,     6,     3,     8,     9,    10,    11,
-    12,    95,   104,   298,   299,    86,   301,   104,   102,   103,
-   109,   105,   103,   109,    45,    86,   103,    97,    98,    99,
-   100,   319,   103,   321,     9,   103,    35,   103,   326,    60,
-    68,   103,     3,    45,    46,   103,     8,   111,   336,   337,
-   115,   339,   111,     3,   109,    25,   344,   105,    68,    61,
-   105,    11,    12,    68,   114,    86,   354,    30,   104,   319,
-   108,    96,    22,    23,    24,   105,    26,   103,    80,     4,
-    95,    88,    68,   110,    86,   104,    36,   337,   108,   106,
-    40,   104,   103,    95,    44,   383,   105,    47,    48,    49,
-    50,   103,   106,   105,   112,   101,     4,   395,    58,    59,
-   398,   104,   113,    63,    64,    65,    66,    67,    82,   106,
-   370,   102,   372,   106,    74,   103,    76,    77,   112,   106,
-     0,   111,   108,    83,     8,    85,     0,    11,    12,   106,
-    90,    91,    92,    93,    94,     3,   106,   139,    13,    23,
-    26,    56,    74,   103,   110,    65,   115,   293,   339,   206,
-   326,   167,   321,   410,    38,   250,   246,   241,    42,   395,
-   233,   336,   387,   383,    48,    49,    50,   274,    -1,    -1,
-    54,    -1,    -1,    -1,    -1,    59,    -1,    -1,    -1,    -1,
-    64,    -1,    66,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    74,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    83,
-    -1,    85,    -1,    -1,    11,    12,    90,    -1,    92,    93,
-    94,    18,    -1,    -1,    -1,    22,    23,    24,    -1,    26,
-    27,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    36,
-    -1,    -1,    -1,    40,    -1,    -1,    -1,    44,    -1,    -1,
-    47,    48,    49,    50,    -1,    -1,    -1,    -1,    -1,    56,
-    -1,    58,    59,    -1,    -1,    -1,    63,    64,    65,    66,
-    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    -1,    76,
-    77,    78,    79,    -1,    -1,    -1,    83,    -1,    85,    -1,
-    87,    11,    12,    90,    91,    92,    93,    94,    18,    -1,
-    -1,    -1,    22,    23,    24,    -1,    26,    27,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,
-    40,    -1,    -1,    -1,    44,    -1,    -1,    47,    48,    49,
-    50,    -1,    -1,    -1,    -1,    -1,    56,    -1,    58,    59,
-    -1,    -1,    -1,    63,    64,    65,    66,    67,    -1,    -1,
-    -1,    -1,    -1,    -1,    74,    -1,    76,    77,    78,    79,
-    -1,    -1,    -1,    83,    -1,    85,    11,    12,    -1,    -1,
-    90,    91,    92,    93,    94,    -1,    -1,    22,    23,    24,
-    -1,    26,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    82,    82,   121,   170,   153,    13,   155,   194,   136,   198,
+    28,    64,    65,     8,   135,    64,    65,     8,     8,     8,
+     8,     9,    10,    46,     8,     4,   226,    11,    12,    37,
+     0,   103,    40,     3,    13,    14,    44,    15,    19,    30,
+     8,    13,    14,    11,    12,     8,     9,    33,    56,    17,
+    99,   317,   318,     8,     9,    10,     8,     9,   371,     8,
+   373,    33,   328,   263,    80,    80,    74,    37,     8,    12,
+    40,    11,    12,   273,    44,   320,     6,    20,     8,     9,
+    10,   209,     9,    69,   289,   108,    56,   103,   103,   105,
+   105,    69,    34,   338,    75,    73,   114,    69,    41,   304,
+    43,   105,   110,   303,    74,    37,    46,   115,    89,    52,
+    57,   102,   102,   194,   102,    45,   124,   245,   167,   114,
+   248,   242,   111,   107,    56,   104,    41,   294,   136,    99,
+    60,   212,   104,   322,    80,   254,   108,    52,     3,   107,
+   110,   104,   114,    84,   114,   115,   199,   102,     4,   104,
+    84,   121,   104,   102,   124,   103,    86,    13,    14,   105,
+   168,   169,   101,   111,    53,   135,   136,    84,    97,    98,
+    99,   100,    21,   112,     8,     9,    10,    11,    12,   108,
+   261,     6,   104,     8,     9,    10,   108,   106,   269,    12,
+   198,     8,   320,   201,    11,    12,   104,   167,   206,   169,
+   108,   209,     6,   211,     8,     9,    10,    11,    12,   337,
+   338,   104,   104,   104,   401,   108,   108,   108,   104,    39,
+    45,   104,   108,   390,   411,   108,     6,   107,     8,     9,
+    10,    11,    12,   382,   103,    60,   244,   245,    11,    12,
+   248,    45,    46,   245,   325,   103,   248,   111,   256,   331,
+   107,   108,   371,   335,   373,   225,    71,    61,    51,   299,
+   300,    86,   302,    81,   272,    45,    46,   275,    11,    12,
+    13,    14,    13,    14,    81,   245,    80,     3,   248,    11,
+    12,    61,    86,    81,   254,    97,    98,    99,   100,   111,
+     3,    95,     9,   104,   104,   103,   109,    35,   102,   103,
+    80,   105,   103,   109,   103,    68,    86,   103,   103,   103,
+     3,     8,   320,   115,   322,    95,    25,   109,   105,   327,
+   111,   111,    68,   103,   105,   105,    68,    30,   114,   337,
+   338,   108,   340,   104,     3,    96,   105,   345,   103,     4,
+    95,    88,    11,    12,   110,    68,   104,   355,   108,   106,
+   320,   104,   103,    22,    23,    24,   105,    26,   112,     5,
+     6,     7,     8,     9,    10,    11,    12,    36,   338,   104,
+   101,    40,   106,   113,     4,    44,   384,    82,    47,    48,
+    49,    50,   106,   102,   106,   112,   106,   103,   396,    58,
+    59,   399,   106,   108,    63,    64,    65,    66,    67,    45,
+   106,   371,     0,   373,   111,    74,     0,    76,    77,   139,
+     3,    13,    26,    56,    83,    74,    85,    63,   110,   115,
+    65,    90,    91,    92,    93,    94,     8,   294,   167,    11,
+    12,   340,   206,   327,   103,   322,   411,   251,   247,   242,
+    86,    23,   396,   388,   233,   275,   384,   337,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    38,   103,    -1,    -1,
+    42,    -1,    -1,    -1,    -1,    -1,    48,    49,    50,    -1,
+    -1,    -1,    54,    -1,    -1,    -1,    -1,    59,    -1,    -1,
+    -1,    -1,    64,    -1,    66,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    74,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    83,    -1,    85,    -1,    -1,    11,    12,    90,    -1,
+    92,    93,    94,    18,    -1,    -1,    -1,    22,    23,    24,
+    -1,    26,    27,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
     -1,    36,    -1,    -1,    -1,    40,    -1,    -1,    -1,    44,
     -1,    -1,    47,    48,    49,    50,    -1,    -1,    -1,    -1,
-    -1,    -1,    -1,    58,    59,    -1,    -1,    -1,    63,    64,
+    -1,    56,    -1,    58,    59,    -1,    -1,    -1,    63,    64,
     65,    66,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,
-    -1,    76,    77,    -1,    -1,    -1,    -1,    -1,    83,    -1,
-    85,    11,    12,    -1,    -1,    90,    91,    92,    93,    94,
-    -1,    -1,    22,    23,    24,    -1,    26,    -1,    -1,    -1,
-    -1,    -1,    -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,
-    40,    -1,    -1,    -1,    44,    -1,    -1,    47,    48,    49,
-    50,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    58,    59,
-    -1,    -1,    -1,    63,    64,    65,    66,    67,    -1,    -1,
-    -1,    -1,    -1,    -1,    74,    -1,    76,    77,    -1,    -1,
-    -1,    -1,    -1,    83,    -1,    85,    -1,    -1,    -1,    -1,
-    90,    91,    92,    93,    94
+    -1,    76,    77,    78,    79,    -1,    -1,    -1,    83,    -1,
+    85,    -1,    87,    11,    12,    90,    91,    92,    93,    94,
+    18,    -1,    -1,    -1,    22,    23,    24,    -1,    26,    27,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    36,    -1,
+    -1,    -1,    40,    -1,    -1,    -1,    44,    -1,    -1,    47,
+    48,    49,    50,    -1,    -1,    -1,    -1,    -1,    56,    -1,
+    58,    59,    -1,    -1,    -1,    63,    64,    65,    66,    67,
+    -1,    -1,    -1,    -1,    -1,    -1,    74,    -1,    76,    77,
+    78,    79,    -1,    -1,    -1,    83,    -1,    85,    11,    12,
+    -1,    -1,    90,    91,    92,    93,    94,    -1,    -1,    22,
+    23,    24,    -1,    26,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    36,    -1,    -1,    -1,    40,    -1,    -1,
+    -1,    44,    -1,    -1,    47,    48,    49,    50,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    58,    59,    -1,    -1,    -1,
+    63,    64,    65,    66,    67,    -1,    -1,    -1,    -1,    -1,
+    -1,    74,    -1,    76,    77,    -1,    -1,    -1,    -1,    -1,
+    83,    -1,    85,    11,    12,    -1,    -1,    90,    91,    92,
+    93,    94,    -1,    -1,    22,    23,    24,    -1,    26,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    36,    -1,
+    -1,    -1,    40,    -1,    -1,    -1,    44,    -1,    -1,    47,
+    48,    49,    50,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    58,    59,    -1,    -1,    -1,    63,    64,    65,    66,    67,
+    -1,    -1,    -1,    -1,    -1,    -1,    74,    -1,    76,    77,
+    -1,    -1,    -1,    -1,    -1,    83,    -1,    85,    -1,    -1,
+    -1,    -1,    90,    91,    92,    93,    94
 };
 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
 #line 3 "/usr/share/bison.simple"
@@ -1332,13 +1337,13 @@
   switch (yyn) {
 
 case 1:
-#line 302 "asn1p_y.y"
+#line 303 "asn1p_y.y"
 {
 		*(void **)param = yyvsp[0].a_grammar;
 	;
     break;}
 case 2:
-#line 308 "asn1p_y.y"
+#line 309 "asn1p_y.y"
 {
 		yyval.a_grammar = asn1p_new();
 		checkmem(yyval.a_grammar);
@@ -1346,14 +1351,14 @@
 	;
     break;}
 case 3:
-#line 313 "asn1p_y.y"
+#line 314 "asn1p_y.y"
 {
 		yyval.a_grammar = yyvsp[-1].a_grammar;
 		TQ_ADD(&(yyval.a_grammar->modules), yyvsp[0].a_module, mod_next);
 	;
     break;}
 case 4:
-#line 334 "asn1p_y.y"
+#line 335 "asn1p_y.y"
 {
 
 		if(yyvsp[-1].a_module) {
@@ -1370,27 +1375,27 @@
 	;
     break;}
 case 5:
-#line 355 "asn1p_y.y"
+#line 356 "asn1p_y.y"
 { yyval.a_oid = 0; ;
     break;}
 case 6:
-#line 356 "asn1p_y.y"
+#line 357 "asn1p_y.y"
 { yyval.a_oid = yyvsp[0].a_oid; ;
     break;}
 case 7:
-#line 360 "asn1p_y.y"
+#line 361 "asn1p_y.y"
 {
 		yyval.a_oid = yyvsp[-1].a_oid;
 	;
     break;}
 case 8:
-#line 363 "asn1p_y.y"
+#line 364 "asn1p_y.y"
 {
 		yyval.a_oid = 0;
 	;
     break;}
 case 9:
-#line 369 "asn1p_y.y"
+#line 370 "asn1p_y.y"
 {
 		yyval.a_oid = asn1p_oid_new();
 		asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc);
@@ -1399,7 +1404,7 @@
 	;
     break;}
 case 10:
-#line 375 "asn1p_y.y"
+#line 376 "asn1p_y.y"
 {
 		yyval.a_oid = yyvsp[-1].a_oid;
 		asn1p_oid_add_arc(yyval.a_oid, &yyvsp[0].a_oid_arc);
@@ -1408,74 +1413,74 @@
 	;
     break;}
 case 11:
-#line 384 "asn1p_y.y"
+#line 385 "asn1p_y.y"
 {					/* iso */
 		yyval.a_oid_arc.name = yyvsp[0].tv_str;
 		yyval.a_oid_arc.number = -1;
 	;
     break;}
 case 12:
-#line 388 "asn1p_y.y"
+#line 389 "asn1p_y.y"
 {		/* iso(1) */
 		yyval.a_oid_arc.name = yyvsp[-3].tv_str;
 		yyval.a_oid_arc.number = yyvsp[-1].a_int;
 	;
     break;}
 case 13:
-#line 392 "asn1p_y.y"
+#line 393 "asn1p_y.y"
 {					/* 1 */
 		yyval.a_oid_arc.name = 0;
 		yyval.a_oid_arc.number = yyvsp[0].a_int;
 	;
     break;}
 case 14:
-#line 402 "asn1p_y.y"
+#line 403 "asn1p_y.y"
 { yyval.a_module_flags = MSF_NOFLAGS; ;
     break;}
 case 15:
-#line 403 "asn1p_y.y"
+#line 404 "asn1p_y.y"
 {
 		yyval.a_module_flags = yyvsp[0].a_module_flags;
 	;
     break;}
 case 16:
-#line 412 "asn1p_y.y"
+#line 413 "asn1p_y.y"
 {
 		yyval.a_module_flags = yyvsp[0].a_module_flags;
 	;
     break;}
 case 17:
-#line 415 "asn1p_y.y"
+#line 416 "asn1p_y.y"
 {
 		yyval.a_module_flags = yyvsp[-1].a_module_flags | yyvsp[0].a_module_flags;
 	;
     break;}
 case 18:
-#line 424 "asn1p_y.y"
+#line 425 "asn1p_y.y"
 {
 		yyval.a_module_flags = MSF_EXPLICIT_TAGS;
 	;
     break;}
 case 19:
-#line 427 "asn1p_y.y"
+#line 428 "asn1p_y.y"
 {
 		yyval.a_module_flags = MSF_IMPLICIT_TAGS;
 	;
     break;}
 case 20:
-#line 430 "asn1p_y.y"
+#line 431 "asn1p_y.y"
 {
 		yyval.a_module_flags = MSF_AUTOMATIC_TAGS;
 	;
     break;}
 case 21:
-#line 433 "asn1p_y.y"
+#line 434 "asn1p_y.y"
 {
 		yyval.a_module_flags = MSF_EXTENSIBILITY_IMPLIED;
 	;
     break;}
 case 22:
-#line 437 "asn1p_y.y"
+#line 438 "asn1p_y.y"
 {
 		/* X.680Amd1 specifies TAG and XER */
 		if(strcmp(yyvsp[-1].tv_str, "TAG") == 0) {
@@ -1493,23 +1498,23 @@
 	;
     break;}
 case 23:
-#line 458 "asn1p_y.y"
+#line 459 "asn1p_y.y"
 { yyval.a_module = 0; ;
     break;}
 case 24:
-#line 459 "asn1p_y.y"
+#line 460 "asn1p_y.y"
 {
 		yyval.a_module = yyvsp[0].a_module;
 	;
     break;}
 case 25:
-#line 468 "asn1p_y.y"
+#line 469 "asn1p_y.y"
 {
 		yyval.a_module = yyvsp[0].a_module;
 	;
     break;}
 case 26:
-#line 471 "asn1p_y.y"
+#line 472 "asn1p_y.y"
 {
 		yyval.a_module = yyvsp[-1].a_module;
 
@@ -1539,13 +1544,13 @@
 	;
     break;}
 case 27:
-#line 504 "asn1p_y.y"
+#line 505 "asn1p_y.y"
 {
 		yyval.a_module = yyvsp[0].a_module;
 	;
     break;}
 case 28:
-#line 507 "asn1p_y.y"
+#line 508 "asn1p_y.y"
 {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -1557,7 +1562,7 @@
 	;
     break;}
 case 29:
-#line 516 "asn1p_y.y"
+#line 517 "asn1p_y.y"
 {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -1567,7 +1572,7 @@
 	;
     break;}
 case 30:
-#line 523 "asn1p_y.y"
+#line 524 "asn1p_y.y"
 {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -1577,7 +1582,7 @@
 	;
     break;}
 case 31:
-#line 536 "asn1p_y.y"
+#line 537 "asn1p_y.y"
 {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -1587,11 +1592,11 @@
 	;
     break;}
 case 32:
-#line 544 "asn1p_y.y"
+#line 545 "asn1p_y.y"
 { asn1p_lexer_hack_push_encoding_control(); ;
     break;}
 case 33:
-#line 545 "asn1p_y.y"
+#line 546 "asn1p_y.y"
 {
 		fprintf(stderr,
 			"WARNING: ENCODING-CONTROL %s "
@@ -1602,7 +1607,7 @@
 	;
     break;}
 case 34:
-#line 557 "asn1p_y.y"
+#line 558 "asn1p_y.y"
 {
 		return yyerror(
 			"Attempt to redefine a standard basic type, "
@@ -1611,19 +1616,19 @@
 	;
     break;}
 case 35:
-#line 571 "asn1p_y.y"
+#line 572 "asn1p_y.y"
 {
 		yyval.a_module = yyvsp[-1].a_module;
 	;
     break;}
 case 36:
-#line 577 "asn1p_y.y"
+#line 578 "asn1p_y.y"
 {
 		return yyerror("Empty IMPORTS list");
 	;
     break;}
 case 37:
-#line 583 "asn1p_y.y"
+#line 584 "asn1p_y.y"
 {
 		yyval.a_module = asn1p_module_new();
 		checkmem(yyval.a_module);
@@ -1631,14 +1636,14 @@
 	;
     break;}
 case 38:
-#line 588 "asn1p_y.y"
+#line 589 "asn1p_y.y"
 {
 		yyval.a_module = yyvsp[-1].a_module;
 		TQ_ADD(&(yyval.a_module->imports), yyvsp[0].a_xports, xp_next);
 	;
     break;}
 case 39:
-#line 595 "asn1p_y.y"
+#line 596 "asn1p_y.y"
 {
 		yyval.a_xports = yyvsp[-3].a_xports;
 		yyval.a_xports->from = yyvsp[-1].tv_str;
@@ -1647,7 +1652,7 @@
 	;
     break;}
 case 40:
-#line 604 "asn1p_y.y"
+#line 605 "asn1p_y.y"
 {
 		yyval.a_xports = asn1p_xports_new();
 		checkmem(yyval.a_xports);
@@ -1655,14 +1660,14 @@
 	;
     break;}
 case 41:
-#line 609 "asn1p_y.y"
+#line 610 "asn1p_y.y"
 {
 		yyval.a_xports = yyvsp[-2].a_xports;
 		TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next);
 	;
     break;}
 case 42:
-#line 616 "asn1p_y.y"
+#line 617 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1671,7 +1676,7 @@
 	;
     break;}
 case 43:
-#line 622 "asn1p_y.y"
+#line 623 "asn1p_y.y"
 {		/* Completely equivalent to above */
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1680,7 +1685,7 @@
 	;
     break;}
 case 44:
-#line 628 "asn1p_y.y"
+#line 629 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1689,19 +1694,19 @@
 	;
     break;}
 case 45:
-#line 637 "asn1p_y.y"
+#line 638 "asn1p_y.y"
 {
 		yyval.a_xports = yyvsp[-1].a_xports;
 	;
     break;}
 case 46:
-#line 640 "asn1p_y.y"
+#line 641 "asn1p_y.y"
 {
 		yyval.a_xports = 0;
 	;
     break;}
 case 47:
-#line 643 "asn1p_y.y"
+#line 644 "asn1p_y.y"
 {
 		/* Empty EXPORTS clause effectively prohibits export. */
 		yyval.a_xports = asn1p_xports_new();
@@ -1709,7 +1714,7 @@
 	;
     break;}
 case 48:
-#line 651 "asn1p_y.y"
+#line 652 "asn1p_y.y"
 {
 		yyval.a_xports = asn1p_xports_new();
 		assert(yyval.a_xports);
@@ -1717,14 +1722,14 @@
 	;
     break;}
 case 49:
-#line 656 "asn1p_y.y"
+#line 657 "asn1p_y.y"
 {
 		yyval.a_xports = yyvsp[-2].a_xports;
 		TQ_ADD(&(yyval.a_xports->members), yyvsp[0].a_expr, next);
 	;
     break;}
 case 50:
-#line 663 "asn1p_y.y"
+#line 664 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1733,7 +1738,7 @@
 	;
     break;}
 case 51:
-#line 669 "asn1p_y.y"
+#line 670 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1742,7 +1747,7 @@
 	;
     break;}
 case 52:
-#line 675 "asn1p_y.y"
+#line 676 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1751,7 +1756,7 @@
 	;
     break;}
 case 53:
-#line 685 "asn1p_y.y"
+#line 686 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-4].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -1761,7 +1766,7 @@
 	;
     break;}
 case 54:
-#line 695 "asn1p_y.y"
+#line 696 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1771,7 +1776,7 @@
 	;
     break;}
 case 55:
-#line 702 "asn1p_y.y"
+#line 703 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1780,36 +1785,36 @@
 	;
     break;}
 case 56:
-#line 711 "asn1p_y.y"
+#line 712 "asn1p_y.y"
 { ;
     break;}
 case 57:
-#line 712 "asn1p_y.y"
+#line 713 "asn1p_y.y"
 {
 	;
     break;}
 case 58:
-#line 723 "asn1p_y.y"
+#line 724 "asn1p_y.y"
 {
 	;
     break;}
 case 59:
-#line 725 "asn1p_y.y"
+#line 726 "asn1p_y.y"
 {
 	;
     break;}
 case 60:
-#line 730 "asn1p_y.y"
+#line 731 "asn1p_y.y"
 {
 	;
     break;}
 case 61:
-#line 732 "asn1p_y.y"
+#line 733 "asn1p_y.y"
 {
 	;
     break;}
 case 62:
-#line 748 "asn1p_y.y"
+#line 749 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1820,7 +1825,7 @@
 	;
     break;}
 case 63:
-#line 756 "asn1p_y.y"
+#line 757 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
@@ -1829,7 +1834,7 @@
 	;
     break;}
 case 64:
-#line 762 "asn1p_y.y"
+#line 763 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 		yyval.a_expr->Identifier = yyvsp[-2].tv_str;
@@ -1838,7 +1843,7 @@
 	;
     break;}
 case 65:
-#line 778 "asn1p_y.y"
+#line 779 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -1848,7 +1853,7 @@
 	;
     break;}
 case 66:
-#line 788 "asn1p_y.y"
+#line 789 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_plist = asn1p_paramlist_new(yylineno);
@@ -1860,7 +1865,7 @@
 	;
     break;}
 case 67:
-#line 797 "asn1p_y.y"
+#line 798 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_plist = yyvsp[-2].a_plist;
@@ -1871,14 +1876,14 @@
 	;
     break;}
 case 68:
-#line 808 "asn1p_y.y"
+#line 809 "asn1p_y.y"
 {
 		yyval.a_parg.governor = NULL;
 		yyval.a_parg.argument = yyvsp[0].tv_str;
 	;
     break;}
 case 69:
-#line 812 "asn1p_y.y"
+#line 813 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -1888,7 +1893,7 @@
 	;
     break;}
 case 70:
-#line 819 "asn1p_y.y"
+#line 820 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -1898,7 +1903,7 @@
 	;
     break;}
 case 71:
-#line 826 "asn1p_y.y"
+#line 827 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_parg.governor = asn1p_ref_new(yylineno);
@@ -1909,7 +1914,7 @@
 	;
     break;}
 case 72:
-#line 837 "asn1p_y.y"
+#line 838 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1917,20 +1922,20 @@
 	;
     break;}
 case 73:
-#line 842 "asn1p_y.y"
+#line 843 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
 case 74:
-#line 849 "asn1p_y.y"
+#line 850 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 	;
     break;}
 case 75:
-#line 852 "asn1p_y.y"
+#line 853 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1940,15 +1945,15 @@
 	;
     break;}
 case 76:
-#line 876 "asn1p_y.y"
+#line 877 "asn1p_y.y"
 { yyval.a_expr = asn1p_expr_new(yylineno); ;
     break;}
 case 77:
-#line 877 "asn1p_y.y"
+#line 878 "asn1p_y.y"
 { yyval.a_expr = yyvsp[0].a_expr; ;
     break;}
 case 78:
-#line 880 "asn1p_y.y"
+#line 881 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1956,14 +1961,14 @@
 	;
     break;}
 case 79:
-#line 885 "asn1p_y.y"
+#line 886 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
 case 80:
-#line 892 "asn1p_y.y"
+#line 893 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -1972,7 +1977,7 @@
 	;
     break;}
 case 81:
-#line 898 "asn1p_y.y"
+#line 899 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1982,13 +1987,13 @@
 	;
     break;}
 case 82:
-#line 905 "asn1p_y.y"
+#line 906 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 	;
     break;}
 case 83:
-#line 911 "asn1p_y.y"
+#line 912 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -1996,14 +2001,14 @@
 	;
     break;}
 case 84:
-#line 916 "asn1p_y.y"
+#line 917 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
 case 85:
-#line 923 "asn1p_y.y"
+#line 924 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 		assert(yyval.a_expr->Identifier == 0);
@@ -2011,13 +2016,13 @@
 	;
     break;}
 case 86:
-#line 928 "asn1p_y.y"
+#line 929 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 	;
     break;}
 case 87:
-#line 934 "asn1p_y.y"
+#line 935 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		checkmem(yyval.a_expr);
@@ -2027,15 +2032,15 @@
 	;
     break;}
 case 88:
-#line 944 "asn1p_y.y"
+#line 945 "asn1p_y.y"
 { yyval.a_int = 0; ;
     break;}
 case 89:
-#line 945 "asn1p_y.y"
+#line 946 "asn1p_y.y"
 { yyval.a_int = 1; ;
     break;}
 case 90:
-#line 949 "asn1p_y.y"
+#line 950 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2045,14 +2050,14 @@
 	;
     break;}
 case 91:
-#line 956 "asn1p_y.y"
+#line 957 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
 case 92:
-#line 963 "asn1p_y.y"
+#line 964 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2063,7 +2068,7 @@
 	;
     break;}
 case 93:
-#line 971 "asn1p_y.y"
+#line 972 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		yyval.a_expr->Identifier = yyvsp[-3].a_refcomp.name;
@@ -2072,7 +2077,7 @@
 	;
     break;}
 case 94:
-#line 977 "asn1p_y.y"
+#line 978 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_expr = asn1p_expr_new(yylineno);
@@ -2090,47 +2095,47 @@
 	;
     break;}
 case 95:
-#line 995 "asn1p_y.y"
+#line 996 "asn1p_y.y"
 { yyval.a_wsynt = 0; ;
     break;}
 case 96:
-#line 996 "asn1p_y.y"
+#line 997 "asn1p_y.y"
 {
 		yyval.a_wsynt = yyvsp[0].a_wsynt;
 	;
     break;}
 case 97:
-#line 1003 "asn1p_y.y"
+#line 1004 "asn1p_y.y"
 { asn1p_lexer_hack_enable_with_syntax(); ;
     break;}
 case 98:
-#line 1005 "asn1p_y.y"
+#line 1006 "asn1p_y.y"
 {
 		yyval.a_wsynt = yyvsp[-1].a_wsynt;
 	;
     break;}
 case 99:
-#line 1011 "asn1p_y.y"
+#line 1012 "asn1p_y.y"
 {
 		yyval.a_wsynt = asn1p_wsyntx_new();
 		TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next);
 	;
     break;}
 case 100:
-#line 1015 "asn1p_y.y"
+#line 1016 "asn1p_y.y"
 {
 		yyval.a_wsynt = yyvsp[-1].a_wsynt;
 		TQ_ADD(&(yyval.a_wsynt->chunks), yyvsp[0].a_wchunk, next);
 	;
     break;}
 case 101:
-#line 1022 "asn1p_y.y"
+#line 1023 "asn1p_y.y"
 {
 		yyval.a_wchunk = asn1p_wsyntx_chunk_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 	;
     break;}
 case 102:
-#line 1025 "asn1p_y.y"
+#line 1026 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -2142,7 +2147,7 @@
 	;
     break;}
 case 103:
-#line 1037 "asn1p_y.y"
+#line 1038 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2153,7 +2158,7 @@
 	;
     break;}
 case 104:
-#line 1045 "asn1p_y.y"
+#line 1046 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2165,7 +2170,7 @@
 	;
     break;}
 case 105:
-#line 1054 "asn1p_y.y"
+#line 1055 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2177,7 +2182,7 @@
 	;
     break;}
 case 106:
-#line 1066 "asn1p_y.y"
+#line 1067 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		yyval.a_expr->tag = yyvsp[-2].a_tag;
@@ -2199,13 +2204,13 @@
 	;
     break;}
 case 107:
-#line 1088 "asn1p_y.y"
+#line 1089 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[0].a_expr;
 	;
     break;}
 case 108:
-#line 1091 "asn1p_y.y"
+#line 1092 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2214,7 +2219,7 @@
 	;
     break;}
 case 109:
-#line 1097 "asn1p_y.y"
+#line 1098 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2223,7 +2228,7 @@
 	;
     break;}
 case 110:
-#line 1103 "asn1p_y.y"
+#line 1104 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 		assert(yyval.a_expr->expr_type == A1TC_INVALID);
@@ -2232,7 +2237,7 @@
 	;
     break;}
 case 111:
-#line 1109 "asn1p_y.y"
+#line 1110 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2245,7 +2250,7 @@
 	;
     break;}
 case 112:
-#line 1119 "asn1p_y.y"
+#line 1120 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2258,7 +2263,7 @@
 	;
     break;}
 case 113:
-#line 1129 "asn1p_y.y"
+#line 1130 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2267,7 +2272,7 @@
 	;
     break;}
 case 114:
-#line 1135 "asn1p_y.y"
+#line 1136 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_expr = asn1p_expr_new(yylineno);
@@ -2281,7 +2286,7 @@
 	;
     break;}
 case 115:
-#line 1149 "asn1p_y.y"
+#line 1150 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_expr = yyvsp[-1].a_expr;
@@ -2298,7 +2303,7 @@
 	;
     break;}
 case 116:
-#line 1173 "asn1p_y.y"
+#line 1174 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2308,7 +2313,7 @@
 	;
     break;}
 case 117:
-#line 1180 "asn1p_y.y"
+#line 1181 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2318,7 +2323,7 @@
 	;
     break;}
 case 118:
-#line 1195 "asn1p_y.y"
+#line 1196 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2329,7 +2334,7 @@
 	;
     break;}
 case 119:
-#line 1203 "asn1p_y.y"
+#line 1204 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2342,7 +2347,7 @@
 	;
     break;}
 case 120:
-#line 1213 "asn1p_y.y"
+#line 1214 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2355,7 +2360,7 @@
 	;
     break;}
 case 121:
-#line 1223 "asn1p_y.y"
+#line 1224 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2368,7 +2373,7 @@
 	;
     break;}
 case 122:
-#line 1233 "asn1p_y.y"
+#line 1234 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2379,7 +2384,7 @@
 	;
     break;}
 case 123:
-#line 1241 "asn1p_y.y"
+#line 1242 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = yyvsp[0].a_ref;
@@ -2401,7 +2406,7 @@
 	;
     break;}
 case 124:
-#line 1263 "asn1p_y.y"
+#line 1264 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = asn1p_ref_new(yylineno);
@@ -2412,7 +2417,7 @@
 	;
     break;}
 case 125:
-#line 1271 "asn1p_y.y"
+#line 1272 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_ref = yyvsp[-2].a_ref;
@@ -2422,21 +2427,21 @@
 	;
     break;}
 case 128:
-#line 1285 "asn1p_y.y"
+#line 1286 "asn1p_y.y"
 {
 		yyval.a_refcomp.lex_type = RLT_AmpUppercase;
 		yyval.a_refcomp.name = yyvsp[0].tv_str;
 	;
     break;}
 case 129:
-#line 1290 "asn1p_y.y"
+#line 1291 "asn1p_y.y"
 {
 		yyval.a_refcomp.lex_type = RLT_Amplowercase;
 		yyval.a_refcomp.name = yyvsp[0].tv_str;
 	;
     break;}
 case 130:
-#line 1303 "asn1p_y.y"
+#line 1304 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		assert(yyval.a_expr->Identifier == NULL);
@@ -2446,7 +2451,7 @@
 	;
     break;}
 case 131:
-#line 1313 "asn1p_y.y"
+#line 1314 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -2456,11 +2461,11 @@
 	;
     break;}
 case 132:
-#line 1320 "asn1p_y.y"
+#line 1321 "asn1p_y.y"
 { asn1p_lexer_hack_push_opaque_state(); ;
     break;}
 case 133:
-#line 1320 "asn1p_y.y"
+#line 1321 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 		checkmem(yyval.a_value);
@@ -2468,7 +2473,7 @@
 	;
     break;}
 case 134:
-#line 1325 "asn1p_y.y"
+#line 1326 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -2476,7 +2481,7 @@
 	;
     break;}
 case 135:
-#line 1330 "asn1p_y.y"
+#line 1331 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -2484,7 +2489,7 @@
 	;
     break;}
 case 136:
-#line 1335 "asn1p_y.y"
+#line 1336 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
@@ -2492,40 +2497,40 @@
 	;
     break;}
 case 137:
-#line 1340 "asn1p_y.y"
+#line 1341 "asn1p_y.y"
 {
 		yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'B');
 		checkmem(yyval.a_value);
 	;
     break;}
 case 138:
-#line 1344 "asn1p_y.y"
+#line 1345 "asn1p_y.y"
 {
 		yyval.a_value = _convert_bitstring2binary(yyvsp[0].tv_str, 'H');
 		checkmem(yyval.a_value);
 	;
     break;}
 case 139:
-#line 1348 "asn1p_y.y"
+#line 1349 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 		checkmem(yyval.a_value);
 	;
     break;}
 case 140:
-#line 1352 "asn1p_y.y"
+#line 1353 "asn1p_y.y"
 {
 		yyval.a_value = yyvsp[0].a_value;
 	;
     break;}
 case 141:
-#line 1355 "asn1p_y.y"
+#line 1356 "asn1p_y.y"
 {
 		yyval.a_value = yyvsp[0].a_value;
 	;
     break;}
 case 142:
-#line 1361 "asn1p_y.y"
+#line 1362 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -2539,7 +2544,7 @@
 	;
     break;}
 case 143:
-#line 1372 "asn1p_y.y"
+#line 1373 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -2556,7 +2561,7 @@
 	;
     break;}
 case 144:
-#line 1389 "asn1p_y.y"
+#line 1390 "asn1p_y.y"
 {
 		yyval.tv_opaque.len = yyvsp[0].tv_opaque.len + 2;
 		yyval.tv_opaque.buf = malloc(yyval.tv_opaque.len + 1);
@@ -2569,7 +2574,7 @@
 	;
     break;}
 case 145:
-#line 1399 "asn1p_y.y"
+#line 1400 "asn1p_y.y"
 {
 		int newsize = yyvsp[-1].tv_opaque.len + yyvsp[0].tv_opaque.len;
 		char *p = malloc(newsize + 1);
@@ -2584,71 +2589,71 @@
 	;
     break;}
 case 146:
-#line 1414 "asn1p_y.y"
+#line 1415 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_BOOLEAN; ;
     break;}
 case 147:
-#line 1415 "asn1p_y.y"
+#line 1416 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_NULL; ;
     break;}
 case 148:
-#line 1416 "asn1p_y.y"
+#line 1417 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_REAL; ;
     break;}
 case 149:
-#line 1417 "asn1p_y.y"
+#line 1418 "asn1p_y.y"
 { yyval.a_type = yyvsp[0].a_type; ;
     break;}
 case 150:
-#line 1418 "asn1p_y.y"
+#line 1419 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_OCTET_STRING; ;
     break;}
 case 151:
-#line 1419 "asn1p_y.y"
+#line 1420 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_OBJECT_IDENTIFIER; ;
     break;}
 case 152:
-#line 1420 "asn1p_y.y"
+#line 1421 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_RELATIVE_OID; ;
     break;}
 case 153:
-#line 1421 "asn1p_y.y"
+#line 1422 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_EXTERNAL; ;
     break;}
 case 154:
-#line 1422 "asn1p_y.y"
+#line 1423 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_EMBEDDED_PDV; ;
     break;}
 case 155:
-#line 1423 "asn1p_y.y"
+#line 1424 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_CHARACTER_STRING; ;
     break;}
 case 156:
-#line 1424 "asn1p_y.y"
+#line 1425 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_UTCTime; ;
     break;}
 case 157:
-#line 1425 "asn1p_y.y"
+#line 1426 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_GeneralizedTime; ;
     break;}
 case 158:
-#line 1426 "asn1p_y.y"
+#line 1427 "asn1p_y.y"
 { yyval.a_type = yyvsp[0].a_type; ;
     break;}
 case 159:
-#line 1433 "asn1p_y.y"
+#line 1434 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_INTEGER; ;
     break;}
 case 160:
-#line 1434 "asn1p_y.y"
+#line 1435 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_ENUMERATED; ;
     break;}
 case 161:
-#line 1435 "asn1p_y.y"
+#line 1436 "asn1p_y.y"
 { yyval.a_type = ASN_BASIC_BIT_STRING; ;
     break;}
 case 162:
-#line 1439 "asn1p_y.y"
+#line 1440 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -2657,7 +2662,7 @@
 	;
     break;}
 case 163:
-#line 1445 "asn1p_y.y"
+#line 1446 "asn1p_y.y"
 {
 		if(yyvsp[0].a_expr) {
 			yyval.a_expr = yyvsp[0].a_expr;
@@ -2670,91 +2675,91 @@
 	;
     break;}
 case 164:
-#line 1458 "asn1p_y.y"
+#line 1459 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_BMPString; ;
     break;}
 case 165:
-#line 1459 "asn1p_y.y"
+#line 1460 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_GeneralString;
 		fprintf(stderr, "WARNING: GeneralString is not fully supported\n");
 	;
     break;}
 case 166:
-#line 1463 "asn1p_y.y"
+#line 1464 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_GraphicString;
 		fprintf(stderr, "WARNING: GraphicString is not fully supported\n");
 	;
     break;}
 case 167:
-#line 1467 "asn1p_y.y"
+#line 1468 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_IA5String; ;
     break;}
 case 168:
-#line 1468 "asn1p_y.y"
+#line 1469 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_ISO646String; ;
     break;}
 case 169:
-#line 1469 "asn1p_y.y"
+#line 1470 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_NumericString; ;
     break;}
 case 170:
-#line 1470 "asn1p_y.y"
+#line 1471 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_PrintableString; ;
     break;}
 case 171:
-#line 1471 "asn1p_y.y"
+#line 1472 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_T61String;
 		fprintf(stderr, "WARNING: T61String is not fully supported\n");
 	;
     break;}
 case 172:
-#line 1475 "asn1p_y.y"
+#line 1476 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_TeletexString; ;
     break;}
 case 173:
-#line 1476 "asn1p_y.y"
+#line 1477 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_UniversalString; ;
     break;}
 case 174:
-#line 1477 "asn1p_y.y"
+#line 1478 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_UTF8String; ;
     break;}
 case 175:
-#line 1478 "asn1p_y.y"
+#line 1479 "asn1p_y.y"
 {
 		yyval.a_type = ASN_STRING_VideotexString;
 		fprintf(stderr, "WARNING: VideotexString is not fully supported\n");
 	;
     break;}
 case 176:
-#line 1482 "asn1p_y.y"
+#line 1483 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_VisibleString; ;
     break;}
 case 177:
-#line 1483 "asn1p_y.y"
+#line 1484 "asn1p_y.y"
 { yyval.a_type = ASN_STRING_ObjectDescriptor; ;
     break;}
 case 183:
-#line 1495 "asn1p_y.y"
+#line 1496 "asn1p_y.y"
 { yyval.a_constr = 0; ;
     break;}
 case 184:
-#line 1496 "asn1p_y.y"
+#line 1497 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
 case 185:
-#line 1502 "asn1p_y.y"
+#line 1503 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[0].a_constr, 0);
 	;
     break;}
 case 186:
-#line 1505 "asn1p_y.y"
+#line 1506 "asn1p_y.y"
 {
 		/*
 		 * This is a special case, for compatibility purposes.
@@ -2764,25 +2769,25 @@
 	;
     break;}
 case 187:
-#line 1515 "asn1p_y.y"
+#line 1516 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[-1].a_constr;
 	;
     break;}
 case 188:
-#line 1518 "asn1p_y.y"
+#line 1519 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_SET, yyvsp[-3].a_constr, yyvsp[-1].a_constr);
 	;
     break;}
 case 189:
-#line 1524 "asn1p_y.y"
+#line 1525 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
 case 190:
-#line 1527 "asn1p_y.y"
+#line 1528 "asn1p_y.y"
 {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -2791,7 +2796,7 @@
 	;
     break;}
 case 191:
-#line 1533 "asn1p_y.y"
+#line 1534 "asn1p_y.y"
 {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -2802,31 +2807,31 @@
 	;
     break;}
 case 192:
-#line 1544 "asn1p_y.y"
+#line 1545 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
 case 193:
-#line 1547 "asn1p_y.y"
+#line 1548 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_UNI, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
 case 194:
-#line 1550 "asn1p_y.y"
+#line 1551 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_INT, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
 case 195:
-#line 1553 "asn1p_y.y"
+#line 1554 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_EXC, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
 case 196:
-#line 1559 "asn1p_y.y"
+#line 1560 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_constr = asn1p_constraint_new(yylineno);
@@ -2837,7 +2842,7 @@
 	;
     break;}
 case 197:
-#line 1567 "asn1p_y.y"
+#line 1568 "asn1p_y.y"
 {
 		int ret;
 		yyval.a_constr = asn1p_constraint_new(yylineno);
@@ -2848,7 +2853,7 @@
 	;
     break;}
 case 198:
-#line 1575 "asn1p_y.y"
+#line 1576 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -2857,13 +2862,12 @@
 	;
     break;}
 case 199:
-#line 1581 "asn1p_y.y"
+#line 1582 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
-		yyval.a_constr->type = yyvsp[-1].a_ctype;
-		yyval.a_constr->range_start = yyvsp[-2].a_value;
-		yyval.a_constr->range_stop = yyvsp[0].a_value;
+		yyval.a_constr->type = ACT_EL_TYPE;
+		yyval.a_constr->containedSubtype = yyvsp[0].a_value;
 	;
     break;}
 case 200:
@@ -2872,13 +2876,23 @@
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
 		yyval.a_constr->type = yyvsp[-1].a_ctype;
+		yyval.a_constr->range_start = yyvsp[-2].a_value;
+		yyval.a_constr->range_stop = yyvsp[0].a_value;
+	;
+    break;}
+case 201:
+#line 1595 "asn1p_y.y"
+{
+		yyval.a_constr = asn1p_constraint_new(yylineno);
+		checkmem(yyval.a_constr);
+		yyval.a_constr->type = yyvsp[-1].a_ctype;
 		yyval.a_constr->range_start = asn1p_value_fromint(-123);
 		yyval.a_constr->range_stop = yyvsp[0].a_value;
 		yyval.a_constr->range_start->type = ATV_MIN;
 	;
     break;}
-case 201:
-#line 1596 "asn1p_y.y"
+case 202:
+#line 1603 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -2888,8 +2902,8 @@
 		yyval.a_constr->range_stop->type = ATV_MAX;
 	;
     break;}
-case 202:
-#line 1604 "asn1p_y.y"
+case 203:
+#line 1611 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -2900,77 +2914,77 @@
 		yyval.a_constr->range_stop->type = ATV_MAX;
 	;
     break;}
-case 203:
-#line 1613 "asn1p_y.y"
-{
-		yyval.a_constr = yyvsp[0].a_constr;
-	;
-    break;}
 case 204:
-#line 1616 "asn1p_y.y"
+#line 1620 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
 case 205:
-#line 1622 "asn1p_y.y"
-{ yyval.a_ctype = ACT_EL_RANGE; ;
+#line 1623 "asn1p_y.y"
+{
+		yyval.a_constr = yyvsp[0].a_constr;
+	;
     break;}
 case 206:
-#line 1623 "asn1p_y.y"
-{ yyval.a_ctype = ACT_EL_RLRANGE; ;
+#line 1629 "asn1p_y.y"
+{ yyval.a_ctype = ACT_EL_RANGE; ;
     break;}
 case 207:
-#line 1624 "asn1p_y.y"
-{ yyval.a_ctype = ACT_EL_LLRANGE; ;
+#line 1630 "asn1p_y.y"
+{ yyval.a_ctype = ACT_EL_RLRANGE; ;
     break;}
 case 208:
-#line 1625 "asn1p_y.y"
-{ yyval.a_ctype = ACT_EL_ULRANGE; ;
+#line 1631 "asn1p_y.y"
+{ yyval.a_ctype = ACT_EL_LLRANGE; ;
     break;}
 case 209:
-#line 1629 "asn1p_y.y"
+#line 1632 "asn1p_y.y"
+{ yyval.a_ctype = ACT_EL_ULRANGE; ;
+    break;}
+case 210:
+#line 1636 "asn1p_y.y"
 {
 		yyval.a_ctype = ACT_CT_SIZE;
 	;
     break;}
-case 210:
-#line 1632 "asn1p_y.y"
+case 211:
+#line 1639 "asn1p_y.y"
 {
 		yyval.a_ctype = ACT_CT_FROM;
 	;
     break;}
-case 211:
-#line 1638 "asn1p_y.y"
+case 212:
+#line 1645 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(0);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_FALSE;
 	;
     break;}
-case 212:
-#line 1643 "asn1p_y.y"
+case 213:
+#line 1650 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(1);
 		checkmem(yyval.a_value);
 		yyval.a_value->type = ATV_TRUE;
 	;
     break;}
-case 213:
-#line 1648 "asn1p_y.y"
+case 214:
+#line 1655 "asn1p_y.y"
 {
 		yyval.a_value = yyvsp[0].a_value;
 	;
     break;}
-case 214:
-#line 1651 "asn1p_y.y"
+case 215:
+#line 1658 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_frombuf(yyvsp[0].tv_opaque.buf, yyvsp[0].tv_opaque.len, 0);
 		checkmem(yyval.a_value);
 	;
     break;}
-case 215:
-#line 1655 "asn1p_y.y"
+case 216:
+#line 1662 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -2983,8 +2997,8 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 216:
-#line 1666 "asn1p_y.y"
+case 217:
+#line 1676 "asn1p_y.y"
 {
 		asn1p_ref_t *ref;
 		int ret;
@@ -2997,34 +3011,34 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 217:
-#line 1680 "asn1p_y.y"
+case 218:
+#line 1690 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-1].a_constr, 0);
 	;
     break;}
-case 218:
-#line 1686 "asn1p_y.y"
+case 219:
+#line 1696 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
-case 219:
-#line 1689 "asn1p_y.y"
+case 220:
+#line 1699 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CT_WCOMPS, yyvsp[-2].a_constr, yyvsp[0].a_constr);
 	;
     break;}
-case 220:
-#line 1695 "asn1p_y.y"
+case 221:
+#line 1705 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
 		yyval.a_constr->type = ACT_EL_EXT;
 	;
     break;}
-case 221:
-#line 1700 "asn1p_y.y"
+case 222:
+#line 1710 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3033,46 +3047,46 @@
 		yyval.a_constr->presence = yyvsp[0].a_pres;
 	;
     break;}
-case 222:
-#line 1713 "asn1p_y.y"
+case 223:
+#line 1723 "asn1p_y.y"
 { yyval.a_pres = ACPRES_DEFAULT; ;
     break;}
-case 223:
-#line 1714 "asn1p_y.y"
+case 224:
+#line 1724 "asn1p_y.y"
 { yyval.a_pres = yyvsp[0].a_pres; ;
     break;}
-case 224:
-#line 1718 "asn1p_y.y"
+case 225:
+#line 1728 "asn1p_y.y"
 {
 		yyval.a_pres = ACPRES_PRESENT;
 	;
     break;}
-case 225:
-#line 1721 "asn1p_y.y"
+case 226:
+#line 1731 "asn1p_y.y"
 {
 		yyval.a_pres = ACPRES_ABSENT;
 	;
     break;}
-case 226:
-#line 1724 "asn1p_y.y"
+case 227:
+#line 1734 "asn1p_y.y"
 {
 		yyval.a_pres = ACPRES_OPTIONAL;
 	;
     break;}
-case 227:
-#line 1730 "asn1p_y.y"
-{
-		yyval.a_constr = yyvsp[0].a_constr;
-	;
-    break;}
 case 228:
-#line 1733 "asn1p_y.y"
+#line 1740 "asn1p_y.y"
 {
 		yyval.a_constr = yyvsp[0].a_constr;
 	;
     break;}
 case 229:
-#line 1742 "asn1p_y.y"
+#line 1743 "asn1p_y.y"
+{
+		yyval.a_constr = yyvsp[0].a_constr;
+	;
+    break;}
+case 230:
+#line 1752 "asn1p_y.y"
 {
 		asn1p_ref_t *ref = asn1p_ref_new(yylineno);
 		asn1p_constraint_t *ct;
@@ -3086,14 +3100,14 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, ct, 0);
 	;
     break;}
-case 230:
-#line 1757 "asn1p_y.y"
+case 231:
+#line 1767 "asn1p_y.y"
 {
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CRC, yyvsp[-3].a_constr, yyvsp[-1].a_constr);
 	;
     break;}
-case 231:
-#line 1763 "asn1p_y.y"
+case 232:
+#line 1773 "asn1p_y.y"
 {
 		yyval.a_constr = asn1p_constraint_new(yylineno);
 		checkmem(yyval.a_constr);
@@ -3101,8 +3115,8 @@
 		yyval.a_constr->value = asn1p_value_fromref(yyvsp[0].a_ref, 0);
 	;
     break;}
-case 232:
-#line 1769 "asn1p_y.y"
+case 233:
+#line 1779 "asn1p_y.y"
 {
 		asn1p_constraint_t *ct;
 		ct = asn1p_constraint_new(yylineno);
@@ -3112,8 +3126,8 @@
 		CONSTRAINT_INSERT(yyval.a_constr, ACT_CA_CSV, yyvsp[-2].a_constr, ct);
 	;
     break;}
-case 233:
-#line 1783 "asn1p_y.y"
+case 234:
+#line 1793 "asn1p_y.y"
 {
 		char *p = malloc(strlen(yyvsp[0].tv_str) + 2);
 		int ret;
@@ -3126,8 +3140,8 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 234:
-#line 1794 "asn1p_y.y"
+case 235:
+#line 1804 "asn1p_y.y"
 {
 		char *p = malloc(strlen(yyvsp[0].tv_str) + 3);
 		int ret;
@@ -3141,14 +3155,14 @@
 		free(yyvsp[0].tv_str);
 	;
     break;}
-case 235:
-#line 1810 "asn1p_y.y"
+case 236:
+#line 1820 "asn1p_y.y"
 {
 		yyval.tv_str = yyvsp[0].tv_str;
 	;
     break;}
-case 236:
-#line 1813 "asn1p_y.y"
+case 237:
+#line 1823 "asn1p_y.y"
 {
 		int l1 = strlen(yyvsp[-2].tv_str);
 		int l3 = strlen(yyvsp[0].tv_str);
@@ -3159,61 +3173,61 @@
 		yyval.tv_str[l1 + 1 + l3] = '\0';
 	;
     break;}
-case 237:
-#line 1831 "asn1p_y.y"
+case 238:
+#line 1841 "asn1p_y.y"
 {
 		yyval.a_marker.flags = EM_NOMARK;
 		yyval.a_marker.default_value = 0;
 	;
     break;}
-case 238:
-#line 1835 "asn1p_y.y"
+case 239:
+#line 1845 "asn1p_y.y"
 { yyval.a_marker = yyvsp[0].a_marker; ;
     break;}
-case 239:
-#line 1839 "asn1p_y.y"
+case 240:
+#line 1849 "asn1p_y.y"
 {
 		yyval.a_marker.flags = EM_OPTIONAL;
 		yyval.a_marker.default_value = 0;
 	;
     break;}
-case 240:
-#line 1843 "asn1p_y.y"
+case 241:
+#line 1853 "asn1p_y.y"
 {
 		yyval.a_marker.flags = EM_DEFAULT;
 		yyval.a_marker.default_value = yyvsp[0].a_value;
 	;
     break;}
-case 241:
-#line 1866 "asn1p_y.y"
+case 242:
+#line 1876 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
 	;
     break;}
-case 242:
-#line 1870 "asn1p_y.y"
+case 243:
+#line 1880 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-1].a_expr;
 	;
     break;}
-case 243:
-#line 1876 "asn1p_y.y"
+case 244:
+#line 1886 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 244:
-#line 1881 "asn1p_y.y"
+case 245:
+#line 1891 "asn1p_y.y"
 {
 		yyval.a_expr = yyvsp[-2].a_expr;
 		asn1p_expr_add(yyval.a_expr, yyvsp[0].a_expr);
 	;
     break;}
-case 245:
-#line 1888 "asn1p_y.y"
+case 246:
+#line 1898 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -3222,19 +3236,8 @@
 		yyval.a_expr->Identifier = yyvsp[0].tv_str;
 	;
     break;}
-case 246:
-#line 1895 "asn1p_y.y"
-{
-		yyval.a_expr = asn1p_expr_new(yylineno);
-		checkmem(yyval.a_expr);
-		yyval.a_expr->expr_type = A1TC_UNIVERVAL;
-		yyval.a_expr->meta_type = AMT_VALUE;
-		yyval.a_expr->Identifier = yyvsp[-3].tv_str;
-		yyval.a_expr->value = yyvsp[-1].a_value;
-	;
-    break;}
 case 247:
-#line 1903 "asn1p_y.y"
+#line 1905 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -3245,7 +3248,18 @@
 	;
     break;}
 case 248:
-#line 1911 "asn1p_y.y"
+#line 1913 "asn1p_y.y"
+{
+		yyval.a_expr = asn1p_expr_new(yylineno);
+		checkmem(yyval.a_expr);
+		yyval.a_expr->expr_type = A1TC_UNIVERVAL;
+		yyval.a_expr->meta_type = AMT_VALUE;
+		yyval.a_expr->Identifier = yyvsp[-3].tv_str;
+		yyval.a_expr->value = yyvsp[-1].a_value;
+	;
+    break;}
+case 249:
+#line 1921 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -3254,8 +3268,8 @@
 		yyval.a_expr->value = yyvsp[0].a_value;
 	;
     break;}
-case 249:
-#line 1918 "asn1p_y.y"
+case 250:
+#line 1928 "asn1p_y.y"
 {
 		yyval.a_expr = asn1p_expr_new(yylineno);
 		checkmem(yyval.a_expr);
@@ -3265,103 +3279,103 @@
 		yyval.a_expr->meta_type = AMT_VALUE;
 	;
     break;}
-case 250:
-#line 1929 "asn1p_y.y"
-{
-		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
-		checkmem(yyval.a_value);
-	;
-    break;}
 case 251:
-#line 1933 "asn1p_y.y"
+#line 1939 "asn1p_y.y"
 {
 		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
 		checkmem(yyval.a_value);
 	;
     break;}
 case 252:
-#line 1964 "asn1p_y.y"
-{ memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ;
+#line 1943 "asn1p_y.y"
+{
+		yyval.a_value = asn1p_value_fromint(yyvsp[0].a_int);
+		checkmem(yyval.a_value);
+	;
     break;}
 case 253:
-#line 1965 "asn1p_y.y"
-{ yyval.a_tag = yyvsp[0].a_tag; ;
+#line 1974 "asn1p_y.y"
+{ memset(&yyval.a_tag, 0, sizeof(yyval.a_tag)); ;
     break;}
 case 254:
-#line 1969 "asn1p_y.y"
+#line 1975 "asn1p_y.y"
+{ yyval.a_tag = yyvsp[0].a_tag; ;
+    break;}
+case 255:
+#line 1979 "asn1p_y.y"
 {
 		yyval.a_tag = yyvsp[-1].a_tag;
 		yyval.a_tag.tag_mode = yyvsp[0].a_tag.tag_mode;
 	;
     break;}
-case 255:
-#line 1976 "asn1p_y.y"
+case 256:
+#line 1986 "asn1p_y.y"
 {
 		yyval.a_tag = yyvsp[-2].a_tag;
 		yyval.a_tag.tag_value = yyvsp[-1].a_int;
 	;
     break;}
-case 256:
-#line 1982 "asn1p_y.y"
+case 257:
+#line 1992 "asn1p_y.y"
 { yyval.a_tag.tag_class = TC_CONTEXT_SPECIFIC; ;
     break;}
-case 257:
-#line 1983 "asn1p_y.y"
+case 258:
+#line 1993 "asn1p_y.y"
 { yyval.a_tag.tag_class = TC_UNIVERSAL; ;
     break;}
-case 258:
-#line 1984 "asn1p_y.y"
+case 259:
+#line 1994 "asn1p_y.y"
 { yyval.a_tag.tag_class = TC_APPLICATION; ;
     break;}
-case 259:
-#line 1985 "asn1p_y.y"
+case 260:
+#line 1995 "asn1p_y.y"
 { yyval.a_tag.tag_class = TC_PRIVATE; ;
     break;}
-case 260:
-#line 1989 "asn1p_y.y"
+case 261:
+#line 1999 "asn1p_y.y"
 { yyval.a_tag.tag_mode = TM_DEFAULT; ;
     break;}
-case 261:
-#line 1990 "asn1p_y.y"
+case 262:
+#line 2000 "asn1p_y.y"
 { yyval.a_tag.tag_mode = TM_IMPLICIT; ;
     break;}
-case 262:
-#line 1991 "asn1p_y.y"
+case 263:
+#line 2001 "asn1p_y.y"
 { yyval.a_tag.tag_mode = TM_EXPLICIT; ;
     break;}
-case 263:
-#line 1995 "asn1p_y.y"
-{
-		checkmem(yyvsp[0].tv_str);
-		yyval.tv_str = yyvsp[0].tv_str;
-	;
-    break;}
 case 264:
-#line 1999 "asn1p_y.y"
+#line 2005 "asn1p_y.y"
 {
 		checkmem(yyvsp[0].tv_str);
 		yyval.tv_str = yyvsp[0].tv_str;
 	;
     break;}
 case 265:
-#line 2007 "asn1p_y.y"
+#line 2009 "asn1p_y.y"
 {
 		checkmem(yyvsp[0].tv_str);
 		yyval.tv_str = yyvsp[0].tv_str;
 	;
     break;}
 case 266:
-#line 2014 "asn1p_y.y"
-{ yyval.tv_str = 0; ;
+#line 2017 "asn1p_y.y"
+{
+		checkmem(yyvsp[0].tv_str);
+		yyval.tv_str = yyvsp[0].tv_str;
+	;
     break;}
 case 267:
-#line 2015 "asn1p_y.y"
+#line 2024 "asn1p_y.y"
+{ yyval.tv_str = 0; ;
+    break;}
+case 268:
+#line 2025 "asn1p_y.y"
 {
 		yyval.tv_str = yyvsp[0].tv_str;
 	;
     break;}
-case 268:
-#line 2020 "asn1p_y.y"
+case 269:
+#line 2030 "asn1p_y.y"
 {
 		checkmem(yyvsp[0].tv_str);
 		yyval.tv_str = yyvsp[0].tv_str;
@@ -3589,7 +3603,7 @@
     }
   return 1;
 }
-#line 2026 "asn1p_y.y"
+#line 2036 "asn1p_y.y"
 
 
 
diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y
index 9ae5017..b379667 100644
--- a/libasn1parser/asn1p_y.y
+++ b/libasn1parser/asn1p_y.y
@@ -282,7 +282,8 @@
 %type	<a_constr>		ComponentRelationConstraint
 %type	<a_constr>		AtNotationList
 %type	<a_ref>			AtNotationElement
-%type	<a_value>		ConstraintValue
+%type	<a_value>		SingleValue
+%type	<a_value>		ContainedSubtype
 %type	<a_ctype>		ConstraintSpec
 %type	<a_ctype>		ConstraintRangeSpec
 %type	<a_wsynt>		optWithSyntax
@@ -1572,20 +1573,26 @@
 		ret = asn1p_constraint_insert($$, $2);
 		checkmem(ret == 0);
 	}
-	| ConstraintValue {
+	| SingleValue {
 		$$ = asn1p_constraint_new(yylineno);
 		checkmem($$);
 		$$->type = ACT_EL_VALUE;
 		$$->value = $1;
 	}
-	| ConstraintValue ConstraintRangeSpec ConstraintValue {
+	| ContainedSubtype {
+		$$ = asn1p_constraint_new(yylineno);
+		checkmem($$);
+		$$->type = ACT_EL_TYPE;
+		$$->containedSubtype = $1;
+	}
+	| SingleValue ConstraintRangeSpec SingleValue {
 		$$ = asn1p_constraint_new(yylineno);
 		checkmem($$);
 		$$->type = $2;
 		$$->range_start = $1;
 		$$->range_stop = $3;
 	}
-	| TOK_MIN ConstraintRangeSpec ConstraintValue {
+	| TOK_MIN ConstraintRangeSpec SingleValue {
 		$$ = asn1p_constraint_new(yylineno);
 		checkmem($$);
 		$$->type = $2;
@@ -1593,7 +1600,7 @@
 		$$->range_stop = $3;
 		$$->range_start->type = ATV_MIN;
 	}
-	| ConstraintValue ConstraintRangeSpec TOK_MAX {
+	| SingleValue ConstraintRangeSpec TOK_MAX {
 		$$ = asn1p_constraint_new(yylineno);
 		checkmem($$);
 		$$->type = $2;
@@ -1634,7 +1641,7 @@
 	}
 	;
 
-ConstraintValue:
+SingleValue:
 	TOK_FALSE {
 		$$ = asn1p_value_fromint(0);
 		checkmem($$);
@@ -1663,7 +1670,10 @@
 		checkmem($$);
 		free($1);
 	}
-	| TypeRefName {
+	;
+
+ContainedSubtype:
+	TypeRefName {
 		asn1p_ref_t *ref;
 		int ret;
 		ref = asn1p_ref_new(yylineno);
diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c
index abef0b5..0cb7304 100644
--- a/libasn1print/asn1print.c
+++ b/libasn1print/asn1print.c
@@ -284,6 +284,9 @@
 		printf("(");
 
 	switch(ct->type) {
+	case ACT_EL_TYPE:
+		asn1print_value(ct->value, flags);
+		break;
 	case ACT_EL_VALUE:
 		asn1print_value(ct->value, flags);
 		break;
diff --git a/tests/16-constraint-OK.asn1 b/tests/16-constraint-OK.asn1
index 5625d7f..50ee2e2 100644
--- a/tests/16-constraint-OK.asn1
+++ b/tests/16-constraint-OK.asn1
@@ -12,11 +12,15 @@
 BEGIN
 
 	-- external reference
-	Type1 ::= IA5String (SIZE(1..10,...))(FROM("a".."z"|"#"))
+	Type0 ::= IA5String (Type6)
+	Type1 ::= IA5String (SIZE(1..ten,...))(FROM("a".."z"|"#",...))
 	Type2 ::= IA5String (SIZE (MIN..4)|FROM ("abc"))
 	Type3 ::= BMPString (SIZE(1))
 	Type4 ::= INTEGER (1..MAX)
 	Type5 ::= BOOLEAN (TRUE|FALSE)
+	Type6 ::= IA5String (Type1)
+
+	ten INTEGER ::= 10
 
 	v1 Type1 ::= "#value wi
 		th ""double quotes"""
diff --git a/tests/16-constraint-OK.asn1.-EF b/tests/16-constraint-OK.asn1.-EF
index 9fae28c..305fc3e 100644
--- a/tests/16-constraint-OK.asn1.-EF
+++ b/tests/16-constraint-OK.asn1.-EF
@@ -3,7 +3,9 @@
 DEFINITIONS ::=
 BEGIN
 
-Type1 ::= IA5String (SIZE(1..10,...))(FROM("a".."z" | "#"))
+Type0 ::= IA5String (((SIZE(1..10))(FROM("a".."z" | "#"))))
+
+Type1 ::= IA5String (SIZE(1..10,...))(FROM("a".."z" | "#",...))
 
 Type2 ::= IA5String (SIZE(MIN..4) | FROM("abc"))
 
@@ -13,6 +15,10 @@
 
 Type5 ::= BOOLEAN (TRUE | FALSE)
 
+Type6 ::= IA5String ((SIZE(1..10))(FROM("a".."z" | "#")))
+
+ten INTEGER ::= 10
+
 v1 Type1 ::= "#value with ""double quotes"""
 
 END
diff --git a/tests/16-constraint-OK.asn1.-EFprint-constraints b/tests/16-constraint-OK.asn1.-EFprint-constraints
new file mode 100644
index 0000000..f5f0ddf
--- /dev/null
+++ b/tests/16-constraint-OK.asn1.-EFprint-constraints
Binary files differ