Imported Upstream version 4.9 upstream/4.9
authorDariusz Michaluk <d.michaluk@samsung.com>
Fri, 15 Jun 2018 09:11:52 +0000 (11:11 +0200)
committerDariusz Michaluk <d.michaluk@samsung.com>
Fri, 15 Jun 2018 09:11:52 +0000 (11:11 +0200)
29 files changed:
Makefile.am
Makefile.in
NEWS
configure
configure.ac
doc/asn1Coding.1
doc/asn1Decoding.1
doc/asn1Parser.1
doc/libtasn1.html
doc/libtasn1.info
doc/libtasn1.pdf
doc/libtasn1.ps
doc/man/asn1_get_octet_der.3
doc/stamp-vti
doc/texi/asn1_get_octet_der.texi
doc/texi/decoding.c.texi
doc/version.texi
lib/coding.c
lib/decoding.c
lib/element.c
lib/int.h
lib/libtasn1.h
lib/parser_aux.c
lib/parser_aux.h
src/asn1Decoding.c
tests/Makefile.am
tests/Makefile.in
tests/coding-long-oid.c [new file with mode: 0644]
tests/object-id-decoding.c [new file with mode: 0644]

index 5041eb9..a31301c 100644 (file)
@@ -39,5 +39,18 @@ EXTRA_DIST += cfg.mk maint.mk .clcopying
 gnulib-update:
        gnulib-tool --add-import --dir=. --lib=libgnu --source-base=lib/gllib --m4-base=lib/glm4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl=2 --no-conditional-dependencies --libtool --macro-prefix=lgl --no-vc-files
 
-dist-hook:
+TMPFILE="abi-temp.xml"
+
+abi-check:
+       @rm -f $(TMPFILE)
+       @echo "Checking libtasn1 ABI"
+       @echo "<version>$(VERSION)</version>" >$(TMPFILE)
+       @echo "<headers>$(srcdir)/lib/libtasn1.h" >>$(TMPFILE)
+       @echo "$(builddir)/lib/libtasn1.h</headers>" >>$(TMPFILE)
+       @echo "<libs>$(builddir)/lib/.libs</libs>" >>$(TMPFILE)
+       test ! -f "$(srcdir)/devel/ABI-$$(uname -m).dump" || \
+               abi-compliance-checker -abi -lib libtasn1 -old "$(srcdir)/devel/ABI-$$(uname -m).dump" -new $(TMPFILE)
+       @rm -f $(TMPFILE)
+
+dist-hook: abi-check
        make -C doc/ compare-makefile
index 448016b..175253a 100644 (file)
@@ -936,6 +936,7 @@ EXTRA_DIST = windows/asn1-parser/asn1-parser.vcproj \
        cfg.mk maint.mk .clcopying
 SUBDIRS = gl lib src examples tests $(am__append_1)
 ACLOCAL_AMFLAGS = -I m4 -I gl/m4 -I lib/glm4
+TMPFILE = "abi-temp.xml"
 all: config.h
        $(MAKE) $(AM_MAKEFLAGS) all-recursive
 
@@ -1425,7 +1426,18 @@ uninstall-am:
 gnulib-update:
        gnulib-tool --add-import --dir=. --lib=libgnu --source-base=lib/gllib --m4-base=lib/glm4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl=2 --no-conditional-dependencies --libtool --macro-prefix=lgl --no-vc-files
 
-dist-hook:
+abi-check:
+       @rm -f $(TMPFILE)
+       @echo "Checking libtasn1 ABI"
+       @echo "<version>$(VERSION)</version>" >$(TMPFILE)
+       @echo "<headers>$(srcdir)/lib/libtasn1.h" >>$(TMPFILE)
+       @echo "$(builddir)/lib/libtasn1.h</headers>" >>$(TMPFILE)
+       @echo "<libs>$(builddir)/lib/.libs</libs>" >>$(TMPFILE)
+       test ! -f "$(srcdir)/devel/ABI-$$(uname -m).dump" || \
+               abi-compliance-checker -abi -lib libtasn1 -old "$(srcdir)/devel/ABI-$$(uname -m).dump" -new $(TMPFILE)
+       @rm -f $(TMPFILE)
+
+dist-hook: abi-check
        make -C doc/ compare-makefile
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/NEWS b/NEWS
index 2bf0977..d662de9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,8 @@
 GNU Libtasn1 NEWS                                     -*- outline -*-
 
+* Noteworthy changes in release 4.9 (released 2016-07-25) [stable]
+- Fixes to OID encoding of OIDs which have elements which exceed 2^32
+
 * Noteworthy changes in release 4.8 (released 2016-04-11) [stable]
 - Fixes to avoid reliance on C undefined behavior.
 - Fixes to avoid an infinite recursion when decoding without
index 05df042..7ea5912 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for GNU Libtasn1 4.8.
+# Generated by GNU Autoconf 2.69 for GNU Libtasn1 4.9.
 #
 # Report bugs to <help-libtasn1@gnu.org>.
 #
@@ -590,8 +590,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='GNU Libtasn1'
 PACKAGE_TARNAME='libtasn1'
-PACKAGE_VERSION='4.8'
-PACKAGE_STRING='GNU Libtasn1 4.8'
+PACKAGE_VERSION='4.9'
+PACKAGE_STRING='GNU Libtasn1 4.9'
 PACKAGE_BUGREPORT='help-libtasn1@gnu.org'
 PACKAGE_URL='http://www.gnu.org/software/libtasn1/'
 
@@ -1896,7 +1896,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures GNU Libtasn1 4.8 to adapt to many kinds of systems.
+\`configure' configures GNU Libtasn1 4.9 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1967,7 +1967,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of GNU Libtasn1 4.8:";;
+     short | recursive ) echo "Configuration of GNU Libtasn1 4.9:";;
    esac
   cat <<\_ACEOF
 
@@ -1995,7 +1995,7 @@ Optional Features:
   --enable-ld-version-script
                           enable linker version script (default is enabled
                           when possible)
-  --enable-gcc-warnings   turn on lots of GCC warnings (for developers)
+  --disable-gcc-warnings  disable GCC warnings (for developers)
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -2096,7 +2096,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-GNU Libtasn1 configure 4.8
+GNU Libtasn1 configure 4.9
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2748,7 +2748,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by GNU Libtasn1 $as_me 4.8, which was
+It was created by GNU Libtasn1 $as_me 4.9, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3625,7 +3625,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='libtasn1'
- VERSION='4.8'
+ VERSION='4.9'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -20758,7 +20758,7 @@ if test "${enable_gcc_warnings+set}" = set; then :
    esac
    gl_gcc_warnings=$enableval
 else
-  gl_gcc_warnings=no
+  gl_gcc_warnings=yes
 
 fi
 
@@ -21993,7 +21993,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by GNU Libtasn1 $as_me 4.8, which was
+This file was extended by GNU Libtasn1 $as_me 4.9, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -22065,7 +22065,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-GNU Libtasn1 config.status 4.8
+GNU Libtasn1 config.status 4.9
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
index cb6cb6e..7a14e04 100644 (file)
@@ -17,7 +17,7 @@ dnl Process this file with autoconf to produce a configure script.
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 AC_PREREQ([2.61])
-AC_INIT([GNU Libtasn1],[4.8],[help-libtasn1@gnu.org])
+AC_INIT([GNU Libtasn1],[4.9],[help-libtasn1@gnu.org])
 AC_CONFIG_AUX_DIR([build-aux])
 AC_CONFIG_MACRO_DIR([m4])
 AC_CONFIG_HEADERS(config.h)
@@ -59,14 +59,14 @@ gl_INIT
 lgl_INIT
 
 AC_ARG_ENABLE([gcc-warnings],
-  [AS_HELP_STRING([--enable-gcc-warnings],
-                 [turn on lots of GCC warnings (for developers)])],
+  [AS_HELP_STRING([--disable-gcc-warnings],
+                 [disable GCC warnings (for developers)])],
   [case $enableval in
      yes|no) ;;
      *)      AC_MSG_ERROR([bad value $enableval for gcc-warnings option]) ;;
    esac
    gl_gcc_warnings=$enableval],
-  [gl_gcc_warnings=no]
+  [gl_gcc_warnings=yes]
 )
 
 if test "$gl_gcc_warnings" = yes; then
index a3c4f26..65f1b5f 100644 (file)
@@ -1,5 +1,5 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.1.
-.TH ASN1CODING "1" "April 2016" "asn1Coding (libtasn1) 4.8" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
+.TH ASN1CODING "1" "July 2016" "asn1Coding (libtasn1) 4.9" "User Commands"
 .SH NAME
 asn1Coding \- ASN.1 DER encoder
 .SH SYNOPSIS
index e3d262f..334672e 100644 (file)
@@ -1,5 +1,5 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.1.
-.TH ASN1DECODING "1" "April 2016" "asn1Decoding (libtasn1) 4.8" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
+.TH ASN1DECODING "1" "July 2016" "asn1Decoding (libtasn1) 4.9" "User Commands"
 .SH NAME
 asn1Decoding \- ASN.1 DER decoder
 .SH SYNOPSIS
index 0b69f6a..43eb383 100644 (file)
@@ -1,5 +1,5 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.1.
-.TH ASN1PARSER "1" "April 2016" "asn1Parser (libtasn1) 4.8" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
+.TH ASN1PARSER "1" "July 2016" "asn1Parser (libtasn1) 4.9" "User Commands"
 .SH NAME
 asn1Parser \- ASN.1 syntax tree generator for libtasn1
 .SH SYNOPSIS
index 59d3da9..43522e5 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <!-- This manual is for GNU Libtasn1
-(version 4.8, 4 April 2016),
+(version 4.9, 4 April 2016),
 which is a library for Abstract Syntax Notation One (ASN.1) and
 Distinguished Encoding Rules (DER) manipulation.
 
@@ -13,12 +13,12 @@ any later version published by the Free Software Foundation; with no
 Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.  A
 copy of the license is included in the section entitled "GNU Free
 Documentation License". -->
-<!-- Created by GNU Texinfo 6.0, http://www.gnu.org/software/texinfo/ -->
+<!-- Created by GNU Texinfo 6.1, http://www.gnu.org/software/texinfo/ -->
 <head>
-<title>GNU Libtasn1 4.8</title>
+<title>GNU Libtasn1 4.9</title>
 
-<meta name="description" content="GNU Libtasn1 4.8">
-<meta name="keywords" content="GNU Libtasn1 4.8">
+<meta name="description" content="GNU Libtasn1 4.9">
+<meta name="keywords" content="GNU Libtasn1 4.9">
 <meta name="resource-type" content="document">
 <meta name="distribution" content="global">
 <meta name="Generator" content="makeinfo">
@@ -48,9 +48,8 @@ pre.smalldisplay {font-family: inherit; font-size: smaller}
 pre.smallexample {font-size: smaller}
 pre.smallformat {font-family: inherit; font-size: smaller}
 pre.smalllisp {font-size: smaller}
-span.nocodebreak {white-space: nowrap}
 span.nolinebreak {white-space: nowrap}
-span.roman {font-family: serif; font-weight: normal}
+span.roman {font-family: initial; font-weight: normal}
 span.sansserif {font-family: sans-serif; font-weight: normal}
 ul.no-bullet {list-style: none}
 body {
@@ -105,7 +104,7 @@ dd, li {
 </head>
 
 <body lang="en">
-<h1 class="settitle" align="center">GNU Libtasn1 4.8</h1>
+<h1 class="settitle" align="center">GNU Libtasn1 4.9</h1>
 
 
 
@@ -159,7 +158,7 @@ Next: <a href="#Introduction" accesskey="n" rel="next">Introduction</a>, Up: <a
 <h1 class="top">Libtasn1</h1>
 
 <p>This manual is for GNU Libtasn1
-(version 4.8, 4 April 2016),
+(version 4.9, 4 April 2016),
 which is a library for Abstract Syntax Notation One (ASN.1) and
 Distinguished Encoding Rules (DER) manipulation.
 </p>
@@ -187,6 +186,7 @@ Documentation License&rdquo;.
 <tr><td align="left" valign="top">&bull; <a href="#Copying-Information" accesskey="5">Copying Information</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
 </td></tr>
 <tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
 Indices
 
 </pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Concept-Index" accesskey="6">Concept Index</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Index of concepts and programs.
@@ -1363,17 +1363,19 @@ the value was too big.
 <dt><a name="index-asn1_005fget_005foctet_005fder"></a>Function: <em>int</em> <strong>asn1_get_octet_der</strong> <em>(const unsigned char * <var>der</var>, int <var>der_len</var>, int * <var>ret_len</var>, unsigned char * <var>str</var>, int <var>str_size</var>, int * <var>str_len</var>)</em></dt>
 <dd><p><var>der</var>: DER data to decode containing the OCTET SEQUENCE.
 </p>
-<p><var>der_len</var>: Length of DER data to decode.
+<p><var>der_len</var>: The length of the  <code>der</code> data to decode.
 </p>
-<p><var>ret_len</var>: Output variable containing the length of the DER data.
+<p><var>ret_len</var>: Output variable containing the encoded length of the DER data.
 </p>
 <p><var>str</var>: Pre-allocated output buffer to put decoded OCTET SEQUENCE in.
 </p>
 <p><var>str_size</var>: Length of pre-allocated output buffer.
 </p>
-<p><var>str_len</var>: Output variable containing the length of the OCTET SEQUENCE.
+<p><var>str_len</var>: Output variable containing the length of the contents of the OCTET SEQUENCE.
 </p>
-<p>Extract an OCTET SEQUENCE from DER data.
+<p>Extract an OCTET SEQUENCE from DER data. Note that this function
+expects the DER data past the tag field, i.e., the length and
+content octets.
 </p>
 <p><strong>Returns:</strong> Returns <code>ASN1_SUCCESS</code>  on success, or an error.
 </p></dd></dl>
index f004f50..2198910 100644 (file)
@@ -1,7 +1,7 @@
-This is libtasn1.info, produced by makeinfo version 6.0 from
+This is libtasn1.info, produced by makeinfo version 6.1 from
 libtasn1.texi.
 
-This manual is for GNU Libtasn1 (version 4.8, 4 April 2016), which is a
+This manual is for GNU Libtasn1 (version 4.9, 4 April 2016), which is a
 library for Abstract Syntax Notation One (ASN.1) and Distinguished
 Encoding Rules (DER) manipulation.
 
@@ -24,7 +24,7 @@ File: libtasn1.info,  Node: Top,  Next: Introduction,  Up: (dir)
 Libtasn1
 ********
 
-This manual is for GNU Libtasn1 (version 4.8, 4 April 2016), which is a
+This manual is for GNU Libtasn1 (version 4.9, 4 April 2016), which is a
 library for Abstract Syntax Notation One (ASN.1) and Distinguished
 Encoding Rules (DER) manipulation.
 
@@ -1126,18 +1126,21 @@ asn1_get_octet_der
           * STR_LEN)
      DER: DER data to decode containing the OCTET SEQUENCE.
 
-     DER_LEN: Length of DER data to decode.
+     DER_LEN: The length of the 'der' data to decode.
 
-     RET_LEN: Output variable containing the length of the DER data.
+     RET_LEN: Output variable containing the encoded length of the DER
+     data.
 
      STR: Pre-allocated output buffer to put decoded OCTET SEQUENCE in.
 
      STR_SIZE: Length of pre-allocated output buffer.
 
-     STR_LEN: Output variable containing the length of the OCTET
-     SEQUENCE.
+     STR_LEN: Output variable containing the length of the contents of
+     the OCTET SEQUENCE.
 
-     Extract an OCTET SEQUENCE from DER data.
+     Extract an OCTET SEQUENCE from DER data.  Note that this function
+     expects the DER data past the tag field, i.e., the length and
+     content octets.
 
      *Returns:* Returns 'ASN1_SUCCESS' on success, or an error.
 
@@ -2014,8 +2017,8 @@ Function and Data Index
                                                               (line 144)
 * asn1_create_element:                   ASN.1 field functions.
                                                               (line  72)
-* asn1_decode_simple_ber:                DER functions.       (line 453)
-* asn1_decode_simple_der:                DER functions.       (line 432)
+* asn1_decode_simple_ber:                DER functions.       (line 456)
+* asn1_decode_simple_der:                DER functions.       (line 435)
 * asn1_delete_element:                   ASN.1 field functions.
                                                               (line  57)
 * asn1_delete_structure:                 ASN.1 field functions.
@@ -2023,23 +2026,23 @@ Function and Data Index
 * asn1_delete_structure2:                ASN.1 field functions.
                                                               (line  42)
 * asn1_der_coding:                       DER functions.       (line 102)
-* asn1_der_decoding:                     DER functions.       (line 286)
-* asn1_der_decoding2:                    DER functions.       (line 250)
-* asn1_der_decoding_element:             DER functions.       (line 313)
-* asn1_der_decoding_startEnd:            DER functions.       (line 346)
+* asn1_der_decoding:                     DER functions.       (line 289)
+* asn1_der_decoding2:                    DER functions.       (line 253)
+* asn1_der_decoding_element:             DER functions.       (line 316)
+* asn1_der_decoding_startEnd:            DER functions.       (line 349)
 * asn1_dup_node:                         ASN.1 field functions.
                                                               (line 162)
 * asn1_encode_simple_der:                DER functions.       (line  51)
-* asn1_expand_any_defined_by:            DER functions.       (line 386)
-* asn1_expand_octet_string:              DER functions.       (line 406)
+* asn1_expand_any_defined_by:            DER functions.       (line 389)
+* asn1_expand_octet_string:              DER functions.       (line 409)
 * asn1_find_node:                        Auxilliary functions.
                                                               (line   9)
 * asn1_find_structure_from_oid:          ASN.1 field functions.
                                                               (line 129)
-* asn1_get_bit_der:                      DER functions.       (line 228)
+* asn1_get_bit_der:                      DER functions.       (line 231)
 * asn1_get_length_ber:                   DER functions.       (line 166)
 * asn1_get_length_der:                   DER functions.       (line 130)
-* asn1_get_object_id_der:                DER functions.       (line 209)
+* asn1_get_object_id_der:                DER functions.       (line 212)
 * asn1_get_octet_der:                    DER functions.       (line 186)
 * asn1_get_tag_der:                      DER functions.       (line 147)
 * asn1_length_der:                       DER functions.       (line   9)
@@ -2112,25 +2115,25 @@ Ref: asn1_get_length_der\7f34037
 Ref: asn1_get_tag_der\7f34577
 Ref: asn1_get_length_ber\7f35122
 Ref: asn1_get_octet_der\7f35715
-Ref: asn1_get_object_id_der\7f36422
-Ref: asn1_get_bit_der\7f37020
-Ref: asn1_der_decoding2\7f37693
-Ref: asn1_der_decoding\7f39091
-Ref: asn1_der_decoding_element\7f40030
-Ref: asn1_der_decoding_startEnd\7f41337
-Ref: asn1_expand_any_defined_by\7f42789
-Ref: asn1_expand_octet_string\7f43594
-Ref: asn1_decode_simple_der\7f44595
-Ref: asn1_decode_simple_ber\7f45237
-Node: Error handling functions\7f45938
-Ref: asn1_perror\7f46154
-Ref: asn1_strerror\7f46495
-Node: Auxilliary functions\7f46906
-Ref: asn1_find_node\7f47098
-Ref: asn1_check_version\7f47694
-Node: Copying Information\7f48293
-Node: GNU Free Documentation License\7f48546
-Node: Concept Index\7f73661
-Node: Function and Data Index\7f74767
+Ref: asn1_get_object_id_der\7f36574
+Ref: asn1_get_bit_der\7f37172
+Ref: asn1_der_decoding2\7f37845
+Ref: asn1_der_decoding\7f39243
+Ref: asn1_der_decoding_element\7f40182
+Ref: asn1_der_decoding_startEnd\7f41489
+Ref: asn1_expand_any_defined_by\7f42941
+Ref: asn1_expand_octet_string\7f43746
+Ref: asn1_decode_simple_der\7f44747
+Ref: asn1_decode_simple_ber\7f45389
+Node: Error handling functions\7f46090
+Ref: asn1_perror\7f46306
+Ref: asn1_strerror\7f46647
+Node: Auxilliary functions\7f47058
+Ref: asn1_find_node\7f47250
+Ref: asn1_check_version\7f47846
+Node: Copying Information\7f48445
+Node: GNU Free Documentation License\7f48698
+Node: Concept Index\7f73813
+Node: Function and Data Index\7f74919
 \1f
 End Tag Table
index e988718..207c7c1 100644 (file)
Binary files a/doc/libtasn1.pdf and b/doc/libtasn1.pdf differ
index 3c10f98..47e9fc3 100644 (file)
@@ -1,7 +1,7 @@
 %!PS-Adobe-2.0
 %%Creator: dvips(k) 5.995 Copyright 2015 Radical Eye Software
 %%Title: libtasn1.dvi
-%%CreationDate: Mon Apr 11 08:33:50 2016
+%%CreationDate: Mon Jul 25 22:29:01 2016
 %%Pages: 36
 %%PageOrder: Ascend
 %%BoundingBox: 0 0 612 792
@@ -12,7 +12,7 @@
 %DVIPSWebPage: (www.radicaleye.com)
 %DVIPSCommandLine: dvips -q -o libtasn1.ps libtasn1.dvi
 %DVIPSParameters: dpi=600
-%DVIPSSource:  TeX output 2016.04.11:0833
+%DVIPSSource:  TeX output 2016.07.25:2229
 %%BeginProcSet: tex.pro 0 0
 %!
 /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
@@ -1360,7 +1360,6 @@ dup 102 /f put
 dup 103 /g put
 dup 104 /h put
 dup 105 /i put
-dup 106 /j put
 dup 107 /k put
 dup 108 /l put
 dup 109 /m put
@@ -1565,227 +1564,223 @@ C3C67E71D8BE2B8D5784E8A6F19A9A8929DF9833440E160945274682F435DFAC
 575048CC768BB8F13AA21C6B125E6073611BE138AE06D13E62E7EDE3D0239474
 E040B3E446165FFE60E20B75D2A5F9EE021B22256621C290A8F3342F0347B8EC
 CFA6AD68D47C05268EE3AC8683F4840D736EAB585C6284018DC94FC103B4A882
-ADAEFB625EA966F3877B3FFEA518B809A4BD1977BF1902EB9F06FBAE30E8932A
-D1761807C92594B57F86E1E36BE9027B7D1E0C22A83A2140A91406D0289D3833
-C3361F8882CF720E445B144B633F199BD875EF97202DF88AB3EBA034E510A6A2
-D2F464F6D5AEDC833F8BB9BA74A6679F71D843D6BC4D40FCC68B411224212236
-3B94C160C14C57E0BF68104DF3C99880C25245EC98AE48F71BE243D4278C2B17
-1CAFBE0C365E96559B77E607BFFC6634D03B8E25BDEF3FD2E3D8B66473C7B425
-45A646CF3B68A56D1C64C5456A61E5ACDE212CDF6DCDF6D589049EF6C91C30AA
-8556424F309355355EA52E8F7342A91D122FAB2DFFDEAA78506228B49385C05B
-08793E912D338712173DD0DB44C7C3281FA3D8B14CBA99A3938B147564342923
-D53A2BF18D334DE5E31659A3434EAC96A8D7B363AAEF5CA4DAE67A27890C07AC
-F31A6BA7E4A3C2AF654C025F17FCEBEC864C0A9B7B68571CA56BFA4A249896FD
-96BB19B8F250672878B67BA411BBAFE3CBBD940F005DBF32F1D682F487A1D1B0
-854922FF69C8D6600E67142D651192A911ABE2602E5126FFDC351E1845A22D02
-AFC17BAF941906E5F7A3C35D2DAC2A2F1C958E637A0EB5401B195FF1E1908B3C
-EE13700E365119C68B8A0C3471D3E7911A6734A678F43E86FC55570385E5E107
-4CD618E7430A92C695F6ABA13A68FC71C573D62F6FEAE12D6C1EEE1F1C424C6B
-CFF56BDE7FC34F88A144A62CFCE0D377F8BA416827181FBC7FF8538FA19B1ADA
-1A12DAA904DE6087D90A750CF8B76F97E3AE0BE6F65145F7E99F566C8D18F817
-532DDE4EC38F5127D404053F3B6CB4694D9973209533D99DC44948178F9F976B
-697A04799D7FCEFB13B347143472353503A3DAC56A753E96F46E1AA1D736D7CC
-55E6E80EFF0FDBA4A7728E5B5BE6A98BDB93DF5E27253D9C646B595B0507DE97
-CEE5379120D39CA5F22E3952261C0205AFC2A7AFE07F0D8352072E6455A62FFD
-3FBAFB256E0B4288E8F6B724CCB0913026D7B19435183FEB0E7FDB7DA521A9DD
-EC933881FABA422199AF4F4FBE7BBF8F89F4733A31CF7814673A4BB142CBF3B1
-987E1BA9A6E3372A3ECC943A373940E4411F69F23477CDB2638C060A96023009
-555378908A27BBB6DA89D5D556A536E38DC41FC66F35EAEC9C948AFB2A826A6A
-5E8DE93976448E0DA8C81AC71B78F76FB1B265E446C05DDA5E049298BFE6A4B2
-DE4053742E11EC7FAEB122D6E3E30D91F075B38C7A4D0BBA4BD4EDB637BCAF9C
-D2A3E27AFD24071B4CB37722D8027E8604CB80E3EAAF45F7098F730B11016E29
-29E6E8460703BFC901B4314A825C3D1783A46F5947A46CAF30BF4A66C7EA7ACB
-A63A3FD2FFD9B7DD4D72EFBD5C0314885AC7EDEC9C04244B07CAFD993B9EF84A
-E12A23548EE99CF89A77C5990687BEE34FCEC3EA658448015BC90B0786E5402F
-9F432FF356324779145310A982E269789AE091E430A0F4C9F3EF03B93C2220E7
-CB0627B8C4193154081CE3A57E64F659ACE95511BF4FC4D4D4D78A503B68613B
-4E6DE03A7EAA69B0C6EF0C08A117D3F1416D077BE519E668A3D7826C924446CE
-08FB7DAE6E73301DCEB2312BC57401DB7CB38F2ED4567735C4792DF450C91F28
-35AD53A70F762499AD712984A65BC7561CB0B0E9FFDB1F961284DDF22C42DE23
-9A734C6EF90E453F1721890BA4056EE43FEF8743407CFDC3A4BCBD0D74CFC14B
-019585A4E0055F8A79C1ECA2EB40EC0639BEB7F11F82E006C772173319ED3765
-ED20E579EAFED984C0F83C694968E8BE5000C9F9BAF72F24462164578FBE03AF
-8779FDB09149BBB336335C58575B0476E8D97D06CFE4F8842348AAE075872F22
-6CE687C9C127C17720B7AB19B734670E7F241D493F71F7F670E3348E205E1243
-18D645C5B19C1F5359CCD9D3E9B5167BDC1FDA655AF47B45A7D15552583AA514
-FFC9A9E84D5D3EAAD53C17F42F650BD3E160635F8A4502F31A8781A72D893AE4
-7E65B5C524F5292E2D6DEC4DEB56BF52D612335401568F3B260DD73FE1E92219
-0F3FCDC127A654E3E258DF662815A673845C91131CBFEB5750A3BA225892FAB5
-2BC7341D758CFFFDD768983EF8CA9082CE935FACA20ADE200C148E4C97A81E45
-BC7C49D180E7640AB9CDEE1D03851AAA9A5DCF5EE98BA5AE501AEB4DD6C188E7
-8917B66C41523220E0722168D50264F000046A23102A0302F68E3A17BB370456
-FECA547897AC46F4E91D7A82401AB537041F144284F8A7AF17B723669E9AC554
-9A0F0874E4C471E01F2D53930493C52FD6C61175A67A4E16EC362B6CC4B242A0
-8AA814B7ECB7FF829F121E9016CD0F9E4DF347D00AA7A30C148BBD5D857E8685
-00B284B3CA2F0DF0E7C5871A1F2107A2AD69517B3DD43591058DD5C628E27073
-BE2A18DF6E768E8E25003F6A06FC0173673209F1DB7794C144466AE8B5E1271D
-37E874DCA477D70AAA8100F75425DB765BF94EA131CFE379632CFC31D907DBB7
-9F1C967FF459F490EDA15522E7C6E0399E7B76642DD67B2310987936074617F4
-4750B22CC1BD7AAB80B2C764118F317852B90580C369324CCD3AEC4B62D43004
-1B51981E02DD34A98B01A8508B189DE0C4E83813721D3B34417F63D4A25F640E
-D09CAF6958C35F1E1F17F2C846A623002A91B9FC2689D944F1BC4F265F71E3DA
-8CE72ADC538ED824DFE439634392FAE73FD525F563158CFC77E0E4F73C6E2297
-D9D1559BCD92805B4C92EEC03B61F313725A14BDB45D923733EE78E33EF3F43F
-36DF9D01307833C59F0F385921086E0888A660BA2F78AD31252AF074602AA100
-E149F7EA08A1F6BDC3895AE0090CC1C43545DD9C639FB9B39D52F3AE78BBDFC2
-A25C3AE98BEA9DCA8A4ABE31096CE36CEBE9BE231D7567115FD2FCA246ED3916
-A041B7B38140B3A85C1AAD83A5E7D540F3F5EA71B7D5A60E6B278C981962297A
-CE19E330B29652E763300876007240244775D1E3D78A3CA90A2516F68BD02677
-54899B8CDA19653E67C5B7CD73E173E4234F116E85B9FE48C50544A644523FC4
-E7472344E92271838CA7C85A11B028AE10A02771D3ABDEB514123D947859EB2C
-AC95A65233B92E29C00FED999E4ABE5470C7F5661A371B7E1D65C57E7951CA42
-89B2D52283208ECB114D13C0049ED6D128750D55D3230DB53DBB5D26DB7D2A6A
-1F70AF774E25ACB2037FE312A5EEDC40694A38BAAE1821CE515197F8D950857B
-7AB5552C30B3114899951A421299894A07249015D943D128043D14AF40837B48
-14650157A807E412AF4E9009C281AA161FA8EDA7A1B59B6DC8C92056941127DB
-8697F91BEA0847DD52FE27EF171DE0B4C6A03AD86C61C8A7D60ABF434FA8C7E1
-BFF12B8B21765D09795176CBCB70BADA370A6D5A6C55DA23C09A23663AD3D4B1
-3BC46E8DD66F74B8A9AC681A443F0341CBBB9920264EA6A1591A69882A46EE26
-0557E482A086AC5AB23B027D10E4B939A109DC2DC98B6A5F9E4CC9EC8D98FD54
-FA9540F5905F03093983FF900088332721E33B06CE903E133CB8FAE79C72284E
-05005AD63DF217244278AA0CF5E02E0686857D8DE1F74EFC620F0E2A0CDCEF00
-11D89F33A7CE21672FC42089A81A427AE0806C6E5E5C954D1B5DD54E00FA4CF3
-B628A88CDEA0D61147962F5812837FFE6E7EB6043001B7DD871F4A5FE994CAB2
-3F5088B577B1A80546DCED65F01893D51D2F5BEB330E1A1F7537D07B3E1124A9
-6E8F443034498841EB49E467791ECA165990D265D6B7DCAF0518A659DF3EE073
-01EE946984292152FBF2FD33363E2EC01BD6D0C64FEDF18AF375695080B9A152
-29609B360C1E08E04D685E9FA0238FEFCB44A533B46E69F293CEDB3497A252B1
-B94952182838E0BC28D7BDD56D5285179C325E91B3483F678A6037B67229E55C
-C6DB7175994B3B968FBAE1AAD369A61DB153FBD4E85F656E5BA6F47FC3EB9ABD
-E877461DA4327359FAEF13F31648A9E2611BA9F8F92C046DB0C790C9BF7190C8
-6664A22A8DCADC378C434E63807051EA2CD0C8A068052DA3532B74BEB7523FCC
-3E46B53C228AD100C962BC17C1A6120B22BC9BA7FABCC73C8D853CEAEE0CE4BE
-61361522BFB29DAD47D8C63161DD149DB3B4A56F69CE6F06E0B8A0F5C130795C
-CC75DE509A39AB65E6E948C57ECAFEFF85E48A33A344BCAC6D2B3A9E147CF412
-44B42D1E1999749013B86A54ADE9F21BB47ED0B9B0FBE6E04862CDF0A6EC36C8
-E278993B652E248FA402C96821FE3B4AA0A36E48897A176E3D7BFB8CAE2FB727
-67F1C9F310EA97B784EE5314972D59E0FB1DFCF1CD627228CBBBB78EA9295DED
-3AAA3E0237DE3F86A76AD6814D05355B0296FA57F55855AB17CA33082FC055FF
-FD15B98195A545958A1F7695ECE82216010A3B9B9E9F7CC95DB7649D011749B3
-6B21242D5C58C7F627DA1DE432DE5DCB6701AD43BE64ED5E129D654ABE811E2E
-A8148D1C87135BCFEB584C62839A13D1C3B9E3AD1B07E8F39852E90DAF725A61
-575F6D0D884A6A362BBDA1C04CBF86CC9B38F248011F18BDF2AD86F59FB9A748
-752D1AD5D0BB7868ED11C7C5A97895502D9955AEEE1273BC97B3585BC8E0F64F
-89A91959FE49CFB9E5090AAD27F3C9D9BD15E4CA2DF2F237897CA6945BCB862C
-E353B8BE6F2B1D4E1BCF7226494A2F1FB86008FFC8F5F461176B53A7BA4E03C8
-4FA72ECCF1F8919AFD9A7A886AEA9005B14A928D52997A7FA77730B4D1E7D366
-50E80C99E8F04D78099D320F7CC45791FE45F069B794A37F2C4C8E24002D7487
-494C7A1122751CF6ED23C2F991B65861D809E0EBDB71E36408FE840959AEF3E3
-427B1C3FB3F213BCF32528BC101C0BAE5FD1B874189FC51B86E821426F37CD4F
-98726B1553178576E8CB2CB6ED773EDD4FF7821A3AA19B5F170E7E0064E2D2ED
-F6237CBE00C3B7851102D8287D23926F21977FF11935EE0C1AEACF76159FC031
-1D522D600DEAF60A76C49FAC7EA9FBB25CEAB8EC0E06B55F5502DA23DE3E429E
-EE8677FAFA080E9644BF2401599E876B7D6B534A228DD92C137DDA792F24221E
-C16A7C5CCD2AB7B9F01C77FC23EB879D0F6023BBF59822DB6AEFFA993CB02BD2
-52214DABC729DA7939DDB909EED4B834E328459CA45AF906012BF058AF847AE0
-18EDF77AA15D12BB3F01449C225613EB5D11D93882F7F05E627E42F2B799BE7D
-9249C8F9226E929AE04ED6A51A66D789319721162E127379EE9514AB7A8308E8
-B3EEBA20F0C558EA68068BA71C9CEA158F49C295D5CCB312A6952B49F93BF4BA
-0643969797744812290640085654BDAE5E5CE8A78B252ABD6E2E8ADE87DF953A
-0EDF7411E58383B6A269D928DD4D3ABB621BB4FEECDD9E84B29452859B60222F
-170639491FC6F77F39A256341FD992156CBC45213AEFB43316F2C3E446D7806D
-6F56245B738E0F7CD2E1BDF80ACB163D425D05583AE7E7373D687F079F4A28DA
-8B6EDBAF5C3C741C2BBB3D33FA4FFD71AE242E52F68B6496AFC50097EF031824
-E7E43BBB6020F93BFD437F06CECF02194A8CB87B2652E97063FECC204E4F0398
-23743A81A2EA02BD016791E99403E67EADA4ECA4490279652933F42857351217
-62118964338C51F534C68B9B9BE719C166AD3AD9ED522514A99C97E8014D5852
-380A81B5890E0A277102130BE0969E6DBC015F676BC0B3B0DE30D07901B10BF9
-45B89F18EE13A0D617FE3ECA8E6EA04652AF6CDC7F009A52B531EA70522CC31E
-A0E91B6E9D60EEC4DD7F92B9083C7B019CE01AC885F6B5857AFD4123B1B87E58
-F0A889C898732E0D079184450F12BBCADBB249FB593D81738B8F69DBB5016F60
-3048F5C1D5CA2266259DD2CE37CDE4A7E1633C4D3577E390521F8A8D8BB7F6FA
-6063AB1089F18C8E30F87727C4CF78D5C54B0464E17E55C4347AB0EFB810C049
-C2307E4F520110A137DEC343CABC1F642EDDDF233B96AB7F8416676BB32D2479
-65C48F746E7019C839414CEE81A03DC435F10717A85286BBCFEACF24C9A671BD
-4820BCBBC896A30DA3450C4F4947CE3A07E717BC789DC4EEF25CE4AD2BEC0411
-FE152A289C1D26C9508D206386B65AA1B2AAC060163819C8496F3609E291FA71
-B29E5A529994FE4956C4EC6FA95AFFDADC2DE58ECF6C6E160D3306B8FD42E398
-4F9C0900EF120203684823BF309F03E23195F2848F51E321DFFD9BC24B6E3BB2
-474C7CA890DE8C0EFDD1085D37FC800173ECC63FAFEAD51B681F964EFDB5C0B2
-7DD7E8EF6F333497B3FEB72FE035324FBBB06E7488441083CBD10F2E6024BD4C
-72A0AED77847FBBADCA8B2880D3CC8E04BD1503C70DB1D8DA1C2BE303F0C7CE1
-7673488237350657DE4B7FC9775C13B6231DB84845755755F67D4ABCE6F45658
-E17CE8FAE0CAC26733FDD493E15CF5D1AD5BEFE23D6E1EB335A3706E3A71EB22
-40BAC5D469EEAB3686691127037D50A7B2AFDB496D2B1E9FAC69DC1E83A0D833
-AB839AAEACE34AAA0F4272774E7DDDA88586A381C6133F12A41EE11FDE813E59
-B6E5C3914AFB7F786C39CFA9C5A8E73D49B3511EEE9AEBAEED94B8D559DE5CE9
-CBE6BD710215DB65F041A230740F28BDDB46A89B38AC8767F252ACD1B297EA4C
-EE114AAB6EFF10D398CA1B788AE63B672C867474220F6F20FE9F0B1AC1650B2C
-EBB80EB68D62024EC5C2124F3607DF8776928BC25867C4730808308FBC326156
-5A99B88CD042F581A389B459A6F8FC484EE8C17DE640C7928A78CFBB9C6104FE
-004009DF77FAFE4E1C092F6E5FA048D771D7F25AAC0013D0402A1AFD1E8D0515
-BFDC767DB9BE89407322857519236AEAC3A076CEEEEE7FEECB30B6751EE09E9C
-472DBDA84A3D45A6CD9B9E7A29FB31852315389E7038F57923EC9225803A6A68
-7EA2F3EF394AA6CCB8336F34F75E2B5E577A4724663A0A35338A8E95C989B9C7
-CE48B675933214EE6FA7EE94B3249ABCEB5EC75A714C30CB88E27B9752DFD3DD
-0CC44FC1E3230D92274E1F35429B377DBE57867A40F37B8B88260C3A72ACDCD2
-C8AEF714124B838C638468A9405C46CB2BE67A118A117FBE0A0CAFD9A36D2882
-516B94676566B98BFA1EF6DB6D7258F9420EF010ACB3DAA97409CB272A60AE22
-0E03F9C40889C514E3A4D1BB3A10A6DCC439EBE37D8C28472060DB405F74E855
-27BAD6D66BFC8CCCA038F5BB9EE0F5F1EECB64311A731EA3A22B52AC2AA9933B
-7909A46DC299C3D701527E734C339955325265C0D5A3E30B1506239F803847ED
-0ED27F81C1B982FC881769BB5DB178405501DDD2507EE8B038FC9F440E849736
-2CA4A7CA8F25BC2DDB645DC96DA317DE9BA8A2207329D3A722D2D15663E47E19
-13058EAFA7BE4635666070C17BFA087FEE6244495F5E5AA6CA1FF1054215E9CF
-AD6160126243C941031D3675B73AB83602B8FD765A81D49A8D7AB9A3D107BAE8
-234D9FDFD2D720C1894FE036D249B7A19165A744F8A5D1C226258F8A6ABE0B3A
-65DBB2E761542D20EB327375A1B6738F0814C9273D30863144AF710492D90C61
-6861198193A64E9A6BC1093CFBA2890C4132D1B9F0D133AE52F0B8A39197534B
-22BBCF08BCA93A492FA327E92008F42BAC0AD14AF049D2C23CD92D84C9749282
-FD4A491333DCFCE526AA22C2C68C1A85D18199782807725C5D1363A72CEF75BD
-1ACFBF1B64590C6A24F09B6D4E0C433C49DC99ABE220361E98D25C594253DD5E
-903F487B4C2553F78B70C03B8E3658405FD8427065ACE263AAE8AEF2D92ECFDE
-71DF9CB7DD61A9EC5B0AAED868F91423A410527C057D8F543B93DA02F40CE88A
-E4F29A755430068AC26CF97EF481B5650AEDE5E6BE6E03AAA2F1BB0D04507028
-26C0166B4F91FADD73BD4C557C2B3BB477B3A73921821A704F18103489109533
-3B7F59422F9FF147EED3FEF9BD2EC6EE9C4305593C5563CB6C400353EF3DF249
-0E9CAB7918B61706BC300A39AEB4650ECCF7A3E9342297E4E6AB177F6CB63BF2
-C33DC31FCA946D8B4D33788CB6C91AACCE90DDF5F1B92DC2E7B2D0E244F3C893
-F37B7E2FFE10EF0D1AD762243840BBC99232B1CAC7A321AF88D2BA62B55E305E
-ABF6323CB529D0766E0E8F4230D9EE5BB6863B605A0DF56695C01AE054CCB502
-1905489F1A486FE00B284356D1AB83D27BEEDAAEC8DB318114590D0324755C61
-18521C015B5855F0992792E644D194BB3F52E4679659FC4B8AE383F7EF29ECB9
-6EBEA201A8875DEA6410CCBF09BF050D08182DEB13264F55E0F5FFAC218370E6
-5E9C8AF9E349856AB11D393B583F4FEED6EB4EFF9727084D69977D67EB7B61FB
-A79DB726E75FD817270B6CF8C8D0A57A6F83ED03B1D3DE572324E7F4BD4D1B99
-97140FF18BF45B6198202AB9A30DEF4ED9695D5FEC15942FC363E9CDEF782F04
-486F71CE6BFA5E8D53C969065D990700E3485967EC03EFEAF0F479CFFBED405A
-2D29B98307EA5D4E2CF536DA21F66A961F9A860EBA38B51EF6A106E009DCF099
-B0A2DB3D768850526B90ACE82FB6589D3459351DF1CD37F9CFA174D2F9597A50
-C1033304D971EC0C2314B2AF3E665DF1B53F751E913CB5D4808501B507059879
-769E3ADCC2D8E3875C7D6EF7E7CB48DD07E2F0B415E869D196B6D0B8B80023C5
-7501F75710AF487BD35DBC56BEA988EFB72A60D37DDB34A3E16E4C3302041FED
-F67725B1E85AA62C438D812902CD301CD6B0711356956B3EE81244634ACFE99B
-695465D6249EA7D73F0530B7A5C6C321E52608C33699498800E0B496288D2C91
-F85FE65F17A7127E7B24B965CA8901ACBADEEAC73A7DE07B53966F0A5D857486
-674B6BD44831C3DA3914E72DB66AC7F1F7553DD8F8125779348ACB28B313A5EC
-BFD42000EC537ECF0A191364CEE8F7557697852610AF5C00EC2E23DF58BDC5B4
-D7238CF054E0019259CFF06D29A7045757429F71ED61743C71A6CD09D0CC9DA9
-289B1C880D8E07C79E66FFB61682EB3162821C9DD3161EEB998269A42D64A160
-9E07F3D060E6D9055636B786218A103F8ECEE20933D1233FBFF0ECF9F01BAF09
-560441BB6A0B6931192496CF3485BEC03F10581B3C8936A6C3BB0C3D4AF346BB
-0FF8AC37DDAE5D82561F31DEA6107119F89EC25056E7FD5984EA349407EBE597
-BD71E2EE4E8034690BF158D2EECE68EA603FAD5E0258CE2084F898D7C7CE7625
-3D8990CAAAF8A87C730FCF7D9DA3E5991545CF680CE9CFF96FF99F2660E2164E
-44AF04EF697F3F3FC8940BCA00A526D8AB419FF20FE6A0A007301F9AEA8324FB
-5B069EDB2AAC535F5489F723BA457401417A63CC98BBC70C26FCE973F4AFF4DD
-B3F3CF7AAD27AACB8C23D7E421D512A82259212FBA5D6DE572A40D04BB05D470
-EDB61AE5E4358F11D3FE840D24AC2D9CE4F91B3B9A357CBC8DFAFC8A0776DF14
-32A016B0D5F8226A7F3FE390001BC336024657D1F7151DF5098030553D71F87B
-6A5C46D286D0AA3E946538ECD82EDAAF2C6B608041945232E52E27DE9928875F
-D2406BA32126FCC92FCA719DCFFA13CDF0367E294AE6A4DAE01CC1D70E59AFBF
-EAC961C6B3F63F3696FE3105F7980D24AD4F14BF7F35F84674AD400A94BE2A02
-9F243BE2AEDB5AA8BDC1A3FD5371E265149C110754A70412B068828C611EA981
-2907E87A12DEE88636F904F865C6CA994C0D139AAEEC147A2ED1955F527A7230
-51D5266D8C7CD0A1C1A9EA24CF1E65BCE6EBE21E04D7C94B0FF6DCE002F05BCE
-1FDFF4F6BB1C72A49CE1A78A2916382D3DFD5A8A9E6D27C170D1626B702231BB
-9921646CD185E87A367BDDB9DDC2F2239F3CBFAA9B73DDBFB2E5A6EBDCB0902E
-CD432D6171B96245102B362BB07BC33B677CD115B309E98C35E02A515BF3B651
-99789B6B3C8E81C983D1AC9B9E53F4B3BB0AF40D3861C206272B07433C091734
-8123BF670D0BD74E04131F26C7BE882288C3700D0C3E804C23843BBB689CEE18
-40BF8DE4C4A90327099E286377892C3BF307240D0012C3BF05551B1D66F57F6E
-D5409CF3C82F5AFFD40FD83C998626CBB46EB5B53317DB98C7D4C08F230DC51B
-393211EB6B
+ADAEFB625EA966F3877B3FFEA518B809A4BD1976F150D90CA8D3F4CD9BDE66D3
+C4EDAAD03F38F51BCDE46EDE3886162BD9BB261372533ABD34FED03C561B0130
+BBF8365B2289D193B45CA39A7A738A7D573E2345E7C90BBECA11CEDAEE221757
+21D744792446A018BF566063ED4B286F03DC5B7F675B6095FCB023CF330B9941
+F4CA0142BE88BB675436D0811B54A389DAF3C6742FE17ED4B6760401356C5F45
+2BA5CDE430A38B9DBBA11B96B48FD6B91492F12108A2BD5DCFEC68DCAC37B01F
+34829D2B458E78C57342FA33F4B6C22F4B14CDF101BC10E7705E095C1D41FF88
+847F3CA10F0CE5B61C99AA12085390CDB04303DAE42C682E8D51D67BFC9EBDDE
+E875AFE2C97AA54CB9CF4CDFA10D20C35A742BD05BF2610E3AB68D03444E830B
+140637754252B2735488BD1E0ED5C20050984E08E6072690862EEA0EECC2F630
+D6CA6E30A1C8C7E69C4DAEC4C75BC4FC4FCC6FEF365C73A4B3810591CC6D443D
+E7642EA8B6141FAE0D255B164DD0487C92E379BBF2C611A0CE138D81512A748A
+2F8839DA6FCE17A54327BE9D62897840729E1D46929C96685080240A13FF3217
+C9641EC494FC47B30938935CDA0B2C44BD08847F22D693485AA6A0F05AA5B483
+70BAA7AA0C3A14A5B5343666327A003001D221D9DA18EA194DC23E1301D171B6
+7C5EC1EB8370AB77BB0356CE8F299013E1C7F5BD9C6F2CB4E6145581F78591FC
+D029F91A54F29EB0FE77BFB5C8FE378E166955B2DCE364A71C3AD33DE1E745AD
+417E727BE5D2B02EA3932545F95EA4399C4CDCCFB49709B491FD6A1EA2733568
+4FBB320505889D4C5F32D4B4F10C28D0A661471869ADE7B824DCB6753D03C393
+E76B6DE5DAD6D5834739E426F3A0C660D784E5CD386E6A5441FF6B41F9448A7D
+56B14E40F0174365321667F84977BC33B2050D532A40397BDA697361BDC535F0
+53ED23C5EFBE4F7C6794304A0FF6B67A7C8E8001D47D7733A13FC672D9AEE1B7
+FEB0DBC7355F635C86461F1AB2F7E0B9C80F61E830599F2CAE67E85468336481
+E9E6433EC7EFFC359B70B98035F5D2CCCA4743B9EF41F19EBF3B550418D0D913
+C48E9D62580733D4E210AFEAA5B764A521F387CDE8411E3EA996347642BCC3B8
+05A60E6056EF0FF34F028ECAC78C19826F1EED90B01A47DCFDD769D78458647E
+505492642104B550D057D73C986E2CBE896B52CBD67FC056D968AECB5869C712
+4D52E0A774F3681832AEE1EEACE1DAE31B779ABE6E760072522C4EAEC7D5538D
+701B0C048713FC390B5E7D9729A5078AB46EE62B1B76857F65A3959DCBE8A409
+D8297851791989780C35328D8CF730881326E2C796A9A3161CEF031A068C42DD
+7E58F4B3B788CFD4F05195B4D58CB5FDBF7E06C44280723F27C20BCD234D5E85
+3B3AF6D9A49324CCD96C1B82B4DF94E182EC62C9822AD4EE33BAF810482F3EC1
+FEC1B87CE6039C60EDB6A8D189D1715A7CF542CEE4197488CDC0433518271D4C
+53EB8238C67DD01F7DD2DF798054EA8CD5922CB9A8E3D5522F71400DBCFAC866
+A8B37C0ACAEE6E8F18241BEE610415B7D7CD0F02302404862137AE9C9F9155ED
+DA5454C584E89277F40048DB5662A9A5C6106D16A51D3A5FFB7EA197DAD29ECB
+219353620641D310BF811DCF8701967FC99B937BA3D369D0A18A98EDBB2B1EAB
+C0534B458266976D1D872DF0E2EA702AE79A273054C28425B245154BEEFF874F
+5929DC8179D2DEF24B84CD7F8FA385B17ECD04E71DFFB618611C967040EBBF31
+867A1AF98AA82ACB6FA1E65115D06A5D10701D8077C7F93343D5CB255A565738
+A3AC97905293D0B83DF381AC9C3E9FEABDB49504BA5D04043A4473665488BABC
+F9FCB4A97167DC394327F0CA3510F8439843B6812ACAE6774C523EBE7434AA5B
+0134719857865320EB40001E310370BBB0AC48E4950B2C817A48E2EC92D04524
+EAEA30188E333AB95902DEF3088B9CEA52D14078A3FB8ED012F36118F8BA671B
+6215E1CB5A619A4EF1B390CE97E99FD0453A4493EB45C3793BE85CE13AE0C199
+C388BAD3D4ACADE0086056F62708B4E3CAB3864F3E0333E615894916B7334E43
+4DDE99CB3C92155F1A07464C5D3592E89CBD25D67CEEF0C29CF2501D0F9BD6D6
+9644EBFE95F2550A15A4E8CB6AE38F6CA4B006FCB5EAC6FB4A789EB88F891A87
+1747B5A5700CA2D8E531BC372A101783207E7FA42A019992A5AE22BF55B8538D
+538ABD912CEC58C5A9C5F78687A3A777391FBC5CB37B47CB70B7F965264E78E7
+57F9C81CBAD6693CB97300FBAEA8BA041E5E9ED3CEC9FC796F71F50823F2D2B4
+7CEDD0C6562D1B0F63AC218689002D09276EFA203860CE660E5B36A02ADCE68F
+5643412C907A028843F6FE8D05B734CC8F525C9D4F2D007E12F49256AD5A6C26
+414C48438AF65FD0A116091AA59679EF655804DE72D4A032C88E70E965289014
+4AF3B45395F2762F9ADE1CBB3570E9689694F3D77E1DCB65BE20460D077CF2A0
+344D1C07DAF4616BD52353032F50D5C640805D78448DF7E49ABBD2B2025ECBB8
+57536EB7EDE67E8647434B74C4D232E9628D2175D49DDEFA99236310B466268C
+E318689AF662B44D804E96D1CE5265678629E079D749554EEBD69278A4EE8795
+ABE7495DCEA3E85E3C97C91887EFE33C90D83C267379A67F7C86D812C63B56F3
+D605D45C36A0825B1CB352FF1D016744ACCA4D55A5A58D8651D023499D14F911
+6CD4C962EE7CD9110067F99C5CA5697E539FB78027C7FCD05060A22E220BCF85
+F4E3DD7F176B4615F53025F126E9BCF5647954FEEAA6382BA7D715867638EEFF
+A393E427329612E791A950FC84CA9EBF084D4A67A24CFD7536591229E67E4410
+1FE5D2E74468416E9720ACBD535E13641F39B38376C676B01629C6C39CA1158B
+0021A3C98C921B0C5BE8EAEFB0F489FA59834981F3D70E70E2C5CC9DD905BA8E
+03A6AE3DA98F9438064838B0FABCBD83071C7D49E37DE9D6C5289AB2825A62B0
+2A761A7E1BDD75D64EA0C2800699EBBEBFC97CB7212DD3DFF3284A966415E0A6
+668C25020BBAB3D885303AA85239B69C9C083D9D6251F35A20F63AB04ED2D7E1
+AE49EFD44BD620CD0B95929C815D8D17F909E2102027910DD813F5E4F20D0FF1
+D4E4541547AC5A6143439EAC27E0F1A11A430373FFA4401F7844FCBCC0D4D0E6
+C5E52E03157831BD6CBA03C00D2BB80C6CD64D69E885AE62D4ED452D2F4A864F
+0BF0CBD86C2780AAC052423F590DE3DE4D6E39EE05A15199DFC75F1FC1EA1D1E
+04514C061C4FB7FC872E099B526FF927F6AD8BDAB25CDDACF03E15E475979B53
+1AA25A8C9F77DC958A95A5F9A3B2D4B1CD759E0257510F850F148351846AB8E3
+34AA5CCA4CDDD6520C36789CBB281BA7DA20F5976A4E731681E47765896F4108
+2859376056F823A6E40587935455C22B1AB003F4C8053D57B521F1520009744F
+091644AD51BC329FD432CEFA48C7CAE415BBD7362DAFB92D997836EFBF9DC5D8
+3AB26A0DEC90F175F0222334BB7B4E97A84AE6A01E6CF113262443AF464B24AB
+1174DD4AA1760800CEF690AE6888E7A1E82D69DCD65CFD57CEEC83A52E28F299
+1FDD8D6BACD3F9F38F92F3E98D086437F44F55B49483C9F49A776191E7F26D7D
+9FF8642E1D69C6E97640A64BC981760CD1E423269EC8DE0166FC053D1DDE7AB0
+163DBF3EDBB6F91FF217BF62CF640E673056D030303550B3BA9B9EFE3886E79C
+015F68BEA5EEA461083D72F57DE6D38BB0F91829FE9B550B0A0E8BD802591A92
+494F50C8A2E29B2D13B7F930444C5CBAE371E3A32F56CE10DF8582B697E6E7D3
+80ACDB11EC9E080B0826D6CD8E378F5A98BD4CFFF1CA77CE5825EECE282A4C9D
+60458E57C15617D16CAE6114A65FD03CD57411C143EC678290410AFB7092B483
+C9A4F08AFDF5AC048ED7C0B5F04A86DFA1760C01E1A7B5629E9DB276BF04283C
+CBE698E90E635DCF162A543EA956500D2B499B17D1581B729DEEA5C5E141C164
+E290CF3A782497CA309959CD6E79E7E0F0989EF12631C7EFB79DDC27878BA445
+828C7EF4F4647683BAA41003E67515C4FD367D6DDFF53D987D82C123CCF4E1D6
+F6C0BD859F271BCCA27373CEAAA0DFB041B5A76C333B24F69CB46EAC0C58B3DE
+F7B9F95B2A6219BFD48AFDC471789AB6563D582B1DC2B55E657ED1F2DC33C718
+ACCB45AD417E725FCCA5E848AA997A5E2ADCD2FE85EF65B51BBA20A80D9CAF2E
+CDE7A216380C44B617C3965E82784856348A9FC8F8078DC34BD883A048C3DE73
+584E75F2F924990802906A334C45D82264E3806C1618F8645D15513E014AECBA
+CB8D02A925393174E3A0744D635A630DD984B7DAE5ED8D7B48A71C8580995E24
+E743E83AC57E445DB3B914A0C7743BD608CAED5F31AFA9ABFAC4EAC3B5F7C266
+13A496E1A546227BFB3A19ACE042D13954446409E09F4631C6EC967CA2B59E69
+185301A999A28106145843A60B963FD7CB0EA0AFF4D2F850B55C88A41B9AC5A5
+4A1D67A0622146A75224331421E38ED23A3FC11351B0FA8B2512D1A93C7B909D
+A1993FFC80B3F114A1468207592BFC34F49A15D77572EB129AB1393F557092ED
+59BD1E645940FCEFB4B3E39771E4983EAA2CFA33573B7FBA761067E54E6CAB15
+678536A2FE638A0A4C508A71001BAED69F3D4C2700C9ADDDB666B1754957A8B9
+E98DF835AED0544CF272ABA25FCAE349E0A24449E36A2719F2301426FB61069D
+3F8D24DBE1A3CF15EFBE64012D5A05FE5E81A7EB841909FB8C94C8CCA1357708
+C5E8BB923F791D721920C067A0A8065691CF400414C9E90D7AA794F2C7E845FC
+08FF4F8133F9C82BCFA699368ECBF6AC497EAB207E6F60419D91E5A0D7141E1C
+AF70DF40D7723923D15F4A33742D1C0439FAE7ABF110CDB6256FFADBF296F4B2
+651182F3FDDABDF8E6CE2EE98FEDECF192A750FCCE8D91A3D7C47B6FC3DDD73B
+925386537D7A9671B9887AF57AEA9A19610AF44C14EDC4CB00505A6D51492117
+BA96923DBB4F1C078764E81780E384FCE44944D68E843C0324A93511E394F3A0
+27DEB767145F4B28B353D6559D1731E07781F21B794C346779D59AC2A269FB10
+706ADBE2DFCF7FCA0D285906DB46B0CE4F54CC0C5C9BD85A1C1E1207AB6E0E2A
+C13B4C5D3B04D50C4686051BFB8C7C583104C5C06C98ED9793D2F90CD74F3B1F
+B4844E92D260D197D6F82C9161B78B509F86D0706DDB488119034CF8CE3F8AAC
+24A0D3145ACA773AFEE463E1ED290ACD704501400832572ADA4BC8CF3B45EE50
+5D6B0BEFE762E3E46681E856F031B50206F0EEC6FC48263FEBAC451E4CD5A577
+D0E85CFCC49645790DD11C5A939D589AE552BA5D1933ECB14BD54CBC6D8F036D
+76949367532CC57FF4DE38AAEC7F324691D5BD96C1A76D976EE267F4B6414CF6
+3F5F299C162BB63B5E64D284A97878ED05B770AE864607C538E0CEDD6541CF01
+5C22B9F702C119CDADE25AD23C31E78F46D215A6D65F37652C4D74C636CBA212
+8D4C6FA5667BE5D25F59F58C4D35319896060116ADD5B27F94205AEF4DDEB648
+C3DB1A06BCA363FA4538137B051D4BBC94B34BD94D9C8E728A99A067933649E9
+F57F1A08498E24783960D546B4F53AFBDD15F401C78A8982DC42DD2FCDAC4E47
+5DADE22DFE7E013275A619AA38B3889F8D81493BBBE04FF6E4815A7B51D6C162
+58B953BECD461972DA9952AA2F44D16465F0743C602CA583F436305FFFDB6F7E
+AA4398524C2D804BA3B3DD14850CAD0FD15E2793E3903D9809802F9FF33947DC
+56D1E63A6DDF36FA836D2A70DA1914954CFEC82E645FF3B17A6C18E9D1DAF11E
+EFD529C47B5FB67EB6925BEFDCB2965CD8D43375915B2141319293CF55912FC7
+9B7D7372DCFC480C344C0755B802DD31E82F7808DC99ADD39A6F37FE8417AFDE
+F6324B415C36FF87DF66543E5E411CB83985EC6972F350236B7DCE0E24B0E59E
+8F365F01803F62EA64DF9BF8A20755E1447BAF2FE8BE7662DEDF67BF37CFD088
+1BE20797FF44B62DC3A4AFA09FD64937C95E7085489099F185F66E3CEF6F6C8D
+A1362FA13C853D172096C0FA44F257F6270D22EFA230C261791EA6062D3BAACE
+F5A1EA0DB44BCDB834D28D02AC851440D145C1885A5B1E5DBF1F8EBD076550BE
+064452220616FDC46A7B92250F07C3D0440B8ACDB87E92DE5C567AF0CAD733EF
+66C90876469C5FBCE277EA1C85E76E00BAC14B824BF743D90AB86288A3D740D9
+6E402AAF6D223C11D7F4D03C47E39FC45F5CAA282EA30C0351D580A8734346EE
+735D909A2F6D23F1E1F55C2163AFDB42E528A1FB6D22FD3ACCC12CB771FE1E7C
+F5C946D682443A26BD0396FD44DC9484C75469B7CD0207EAFCFD6BBDD0A8989A
+A9B8FAFD59F3FC57F1C35ECF26EEA7B09A6505EA01CD8ADF8FE0664BE19D1E05
+56135EC7C89F64B7426E0DDE5CD424A834E576781A6179F63B7ABF41FA9A1EBB
+45C8D93D4C172353952D961C9D3BF0FC42F7EB4D4AC32750B0BC9596A4D9F610
+428239422891286815D66116A02DB58531B25CEDE819F7B5F044A9207C264DC1
+FD02DEB67B622DD3655D2FECD7C106F0104FA05C22D5221DAA6E134D3149608F
+03FC97DF783DEEB8F0757E2116B36BAB0384D18184177D97D947983550285B17
+1DAA6BE705219CB6ED34D02CFEB76D708014181B299F69F8B4CA7D0FCBDB43DE
+8AA73403A531D81A9290AE447184735B7C2FA4F81E59C07FC8454D690EFD9F36
+0D7DB4F0FD87DDA518387F342F9CCBA1B36985D8A2EF780793B79D4521AB828B
+5F0006E8A4F41976945501F3BCD6D8064311E6471E856D89903810B298D82560
+A04B927F04D6B8E062893466A2B98EAD6FAEA3866F0C43ACEA9695FC602F712C
+1A563759D399F56A38DFDF00A69BEBF7B52ECE48E1F40001C6A94825BA48A318
+399A5C879C7C70C913DFC8F0D26070AD1FADA158039ED6140B04D4ADEB2B3605
+B5EA9F670E2DD40180886053399EBF39FBED864034C95E378789FEFA0055BFB2
+148FEC39E0B80C4793BEE6D5109FDE9B405E5C32D8480A854838E22A7723AF08
+786FBE9A4D20207BF7A2B6AC3A8B38FBAC4EFFF1E961C0BF3750B99929A891E6
+7E3F4734230D98212410DDA8665ED6EC2CB22A4210AF6E7E0511214B6B714708
+644ABFC6D303CDEA42375BB856547B0CBDF73FD732B5FE2402C3BE286E391BDD
+70594242F300906C09747A66EAC5AC8D86E3F6D9123E5DEF6520C2104DAFBF29
+3575D497CC5C01DB31D97D5CD3A07C7A5D3C0ED470CF49BD885D7E2B5D336602
+09BB1BF76513175E98977D5AB84A0534FF60C8BA59ACF3E82011603B0ED4B691
+8435CAE6D4D937B84C14E8D58F5D0DFA6193491BA4DA4BE76D8FE65F3538D019
+A615B9624780817B43BC9980C5DACE3B92927622459284E0F337C53694E745CA
+9578F28788330B93D257C911558D443764E07C81B910B7752F53A2FB665DEBF3
+454D88067569006D1D55BC6C31A7E02632FC1AD74FA56CB95B0C7679CE4E917F
+4C364FC8FA6DFF3ABFBAA8193B559760C0ECA8FEB1EF4B1A7B09A412E9825215
+A5ED693F182EF3C51337A272CB2328875C437ECD0D387C93E25E69B82144804A
+AAF142E2C3054F59459D51F0AA663C50D317553B901712880C4B3FFD95F32C14
+424AE2A1CD3913497702E2BE6049CB6334A44CE727DEC48F259F8C5A514FD25F
+62EEDFD4CF170DD2CA4CAAF4B22C9FE090B4D52C96578B30646361D5EB942CB4
+B8A8251F02A22518E94ED659C193DCF48423DBFE0F909D10A84CB8AFF593D3F0
+E6EE31800E36249E0B7992E620CFBDA4B37B3A8C9EED8F13D9FCF96D517E6F79
+95C02E77A9615730264264B9524C7F5F63DC1827D7C6EED9F602D0D94B78BC6A
+1952BC2038E3D48FDCAB72DF8CE7B034AD9557AE9A3FDFE9D904D97DA83CBFD5
+4C90B52624876E17AF64D0E24FFCDD2BCCB66D98DEA7680537C79417A4F18BCD
+DD98CB487B447A317EE2F00E28716282A514B19EFA35CABAE5314ED349A50BDA
+82A0FF68C318D5212DA2FD9D3E7E440F2E592BF08F0DB0C901F9C3F8868CF2CC
+F50832676814B2A6832C1BFE1AF637A3AA129E160FD29898244A2D0145AC8332
+7269BC07364E7367CEBDCDF7DAC0E3745BB58EDBAF00618A7619F31E5A942286
+CBC91C0B565B57F9BB8C8BEB3FF3FD10E4063B85E8874C1DFA13031310FC2826
+3E67D0EC92DDF46F23F0AA4851DC75F92CED85821B3AFDB02D416B7D463947A6
+CA8F9409621B95631862A86002FFAD9FD0098A20961AD38B234DB08E5DF61D51
+6F85988ED8B0ADCCABE7F1ECDFAAB1DD9BD40629B1E65BD089396FDFE0A17C40
+99951F668BD116E812A245936D70E294285F89170447520CB556944F8DCBE076
+C4FC87625AE3D679A0ACE7DBC73FE4A28A22937E48C950802CC71D47DC551A9A
+3B8227D72952C46FF592DAF1746D996CF17996C146CED52610176221E9CF510F
+EAAA612D1265E4E1E4AE2FFE7094A99C139A44E7255D3A6105A21435ADA34ACE
+E82F071DE99F3A6289C0C04362EFE40997E9E15CDAA5DAAA4C16411F26C01C66
+A2A6EDEB969E9440CF7A8980103DB8D94538D149FDAE75FCDEFF3F90424DF294
+0EAFF17284A5DAA1D23F4BD74B0F5B50B78E1D8697C1A3CB203B59F50837E0CA
+D8ED77940E586EC519D0AA059F4A497D49635DB8D96DED66BF8F3CFBF7C12C13
+4693C3CC69C420B19810551ACC78E060C001610E0EACFA822BC9716D3671A62D
+2AF9B525B9043C67081A9C2B8D3B703AE5C407EA1C89610E4EC92A953711D45B
+C7801F58A316500BBE4794193AA9B21AE017416D1CCC2E4C6315EA0E6E1E825B
+972DA5B331175BDE7111FBA4F41C13CB40427A97D8B9A5F1702E9A9EB0BBFC9F
+0E00B4759F346D38E8A47F2F0C63C7D284EC8DB8FFC18AF0120F081126347A60
+2883E5EE4BC0858AE21F48CC271C90B37B191CC377126A41EA064D81C6200B7D
+340924B6F50564EA4D2A92327AFCB1D5B07D6B801125E41732D4F373CDA0B495
+98106652E949972B86BD3882AF0993C5A0B9368C20DC3CE87C00B53267188A7C
+2FE7EC5E443654DF30463A83069D90E7BBF0C787B8EA11C7D7CEB456B28B1ADC
+605A8956DF1B63938C2946B06629FD12BA5AD9D627ABC73DD7C18D919AE05198
+CB7274D81862195556F92EC63E1DE68C09D2C2A6AC9E049FE7A28410201A4D93
+D569C862EAC182B1FFC5715B68E40D666F59B8AED6526D0047AFE6891183925E
+3A2EA27C741B8C4FD031537A461737709443F63EA922D2DBB2C5519A72A78832
+619F190C31767FD4DA0521343C246C874F6B7F53F444A5155984062FD7FF2E4C
+FD12638DDF777F9AEC8EFA25643B2FF85180A73292F288A13EF1593D0245A90D
+A8E50B6870075310F9D0258F9626D577D64894561FAFAA31A7627B38F81BECD9
+B322EA2901D61545B7489D3AEA31BF314D236F7994517EFB8663F38D0DDBFD7A
+A992C19863C9B3F32D21AD970A8869592BB97508F7DE9544C360D87FA95FE33B
+796D41808589C67D6B0374AE0B7F55DDA11CB34F9C287119636A642AD3A40B2A
+7F6961CAA3FACA92D3815B68184595A93A903F73840DA1A3699A420CFFF61F8E
+E38B82E30C1E0F5F3E5518A9E87C2B4C0177AE246AB345A65388104584EF11E3
+88254BB0CCBFFD36A924EEF2D21C4030AD5F3CCEE563998ED48CFFFAA24DBBCD
+8C7F885585B3A8B3FB5B8A03D307D752D5174A5C450C4C64369A371BACA1C7BB
+4A7058108DBE6065DB0C64DFD4584C7362CF17F2442ADA0FA4D89E82E10E27CC
+133162A1DB6F2AF58AE0EF27904C89297E9BCADA2017140A52E267FBD44D5704
+E61C
 0000000000000000000000000000000000000000000000000000000000000000
 0000000000000000000000000000000000000000000000000000000000000000
 0000000000000000000000000000000000000000000000000000000000000000
@@ -3756,12 +3751,13 @@ dup 12 /fi put
 dup 40 /parenleft put
 dup 41 /parenright put
 dup 46 /period put
+dup 48 /zero put
 dup 49 /one put
 dup 50 /two put
 dup 51 /three put
 dup 52 /four put
 dup 53 /five put
-dup 56 /eight put
+dup 55 /seven put
 dup 58 /colon put
 dup 65 /A put
 dup 67 /C put
@@ -3997,291 +3993,295 @@ BBCFFB1ED92299DB0291CAB10A84529B7FE279C62628A24A2FC36B01976E13A9
 C528A198B8EC8654AD69CCB5C209964A2B25D6DA9BA0FFB366D19D8C69701D7E
 8ECBEA88569601C80E19A4165AC73F32D0ED08C8FD0D0407325DFF60D69BC8FB
 95D27536CFD07285E9FA0E957BD98B45C2E7A24AA33635C6683B801BC89AF92B
-57BDBD4C4FA2979D6344AC3198440DB1709FAF1D9DBD7EF56D6161464803216E
-9866C68434A3533C4372DB3C1CFA11ED5321C3F4CE7CF78E392506AAF7257AFC
-7C9AD27EB8EB637A93384B54EAC3BD084571DDF97EB5E82C643FAC667BC3DD3F
-D981A9E0DDB7320B07F23CCFFC4D74C034EC6C36DD66D907A4D34CB94409D362
-04EC03D1FB2A58E607C6ED3FDE67E97D9446876F6C685938EAC48CFE4A228E83
-FF5AEB1A4FE7EC29B33D17293570D43B501DA206F7CB0C5AF321C58E21F739B3
-49C19AEA6529CC550471E98E84DADA143F571A340759AC0809A695A56EBE8BF7
-6074197773630952FC57B9A3EE95B0E63CC4474A6ADB4D9E7FDD3B2B35294CC9
-D9F6B1C2786D00FD841BA8007988D6B4DA71736F63B1BA028230C46B0AD6A6AC
-8126FAA43863ADCE0DF29E8B4C9EF15CF7D80AF346C45A9C347273FBE528E1D5
-389D396B339BD8129B462513B063D931CCDF8F346959483BAB970A4428B9EFBB
-0773F9B2DFA2D6566AA2963DA654DC21F8F11EE928A083406353DEF3829EA553
-EB6EB0DAD22A4245AC88B5C509DF6C290D93AAE1E5BE9ED6BDA7D04AB0B0998C
-A1264CE0025B1B2E2463A5CDC5CF0F60AA49AAD32391A5F97E27115223C6D1B8
-CA9346C5E650DB86749EE83275610023D41A47D0E5425E74D16A6EB98EC38C6E
-00DFCE06B41D2FEAA761F5102718086A15E02717309F7D3B6140293E4B1A46D8
-6E8FEBBBAD104DFD4DE26B87E61A3C0043AC2C2DA283E1167D0E07DD24C80C94
-CBDDC86A09F86E651BAF3E059217118A0408612BAE85E4253C83E3AA5066CC08
-7E6528CCBDBDB5A63297B0BA85E9753B1C968783835EC4006D89F51C3E7D5DD3
-31C9CBC83D175E7832A643AA617DC3B38D8BDC98B7E806BA0F224E8AB73100C8
-A7ACE961DF33A8D97D6F86D5321B57EB2055525ABC17B676585E0DF57FD4E591
-1E6E9C8FB7991EFD37827EF2620B4BC0FDE501354F8ABD9997B508EA7731FFB3
-305944D9A5D4241F0A617F28587E7AE09F73C60B4D1FA1C37CB23B10A8E3FBAD
-A2E067B24AE9AC5715F62BD011EF14B6DEA21DA0F2E8BD27C918683CD1484950
-2C5DF9BEEE20A2F79E60B803E8E3D47DCB19F8F24AA44524361B5A8DE4017ED1
-0A04EE08C9E9724268FDF318A6D037F8344FB9DD23441CF3ADBE7EE059E00D4F
-B093E7216014B26A490F3779DC5E0D60635537BC8B0B681A20BC3106D4904947
-B6E8F68EC6B10B0B8D1304273BAE5D764FCB8A1C33CB55CA860258773A3C4A67
-794668D72813A662BA507A1EDB1316165E5148822ADAF61F31C8B4788D720A8B
-6437E764CCCDDFB1206E7B84AF01BFCA1A695B75D96C47DE7C62670DF0FF4C29
-D0340782B68BFB6CE59C43F54C83C645138BD08492A5D8DA321703B4FDBE8313
-A4C6A13B04618755B5DA2C506CA059B87DF17085F1181FE5A23359C2EC1B27CA
-E60567F112BAF14E9DAE8B749D28BF8263866E9019A963884A2DBF7F1F0B4A4E
-B7C7A0E084F4A8F76EF5B001E3052DF0CF80C56DD85057073E7A1C1FE182A81C
-B72098679C11A375F715270D5D834E94EA4F222F7D3DBAB1AB1AF1EAB16E7675
-42C5985A38613C54FF89DAD80417B054A826D5B6F47CC25FE6C5E831447674F6
-E7D0637D9E729D1F288075BAD89588DF7AEC9EFAB07A2B73D8245A4990A7DD94
-11A1D63F6E1F9934A807BE37EC1A897EFBA4DF6998C910DD75658BF6F133196F
-438C818B549AC11198008DEF1548AA8DB6CBBC8980C96513E790F19CC3A3C151
-1B12A9B524F6026F3551632A3BA2C9FF376AEFA6BAE9D99A990D6B5714C06D3D
-8F68CA21B985E93B0FCDCFB8A39F8DF7B996310B2C1C32FAE1189D6826363B69
-AE6B1B7231D8545A0863B20340CDD552B304B98236927CCBA7BABDE112C25380
-2D08885E8AD17C915908BBC9786D595A0C33A4E7EC1EB66825AE036892DFCB32
-F0576B232F99D99AF3E45D1F26FA0DAB711852AAE2523C6795478BA47E4883FC
-92A1223B740DF537FFCAEA617CE3E01DB8518D1B4F60633820F0583187D99EA5
-72E4CECAC883823E5F7EFB04E211AB3D3362FE18F9EBC87470E3C62AB782B5AD
-518B69458817EC3A7B8B026E624AE303D18E9E18768F3D3CC978DA4DA6926738
-678E2F96F751AC5F55FA5069B815AF3E06071937F0D013EB7791E718899D92E0
-F13260F6A4F8D6B0BA5405523919E543AE935DD6E1121D4F2DB2C46224CB23BC
-39D8537A61DE02008507809DC8906549846FE92F4A835E2217E45CB52E41C696
-98171C24A8F4EF4539F8FBD56355DC995E6E2033E6CC70686CBFA59C19E29A08
-3FB507DB7262FF4520CC3B9194EF5BEAD93EDD5CBBF775A894EEC324676DCF96
-24AEB7824D5B0A506A5838F4E8651795D1611577E86A55393644B2A13E5B075A
-FDB70F8619D12A0554476531F69011ACBEE38895BB29439BFB469759E13B9595
-AD5712F767893E2DA66E73C9A88BF9C131C2E1494B2BD04697CD7655966A2D7F
-4591E4FE21C817D5337856B6A17F4C2AB207CE750692DB20A25A13EDE487B3BC
-0AB2A5C821DB76C4E9100B0D7C4AAF737495DF622216064C01698126F8F237B6
-6016C1FCA6322E7733F0CA0EB83459B143C970CC26EFB1FBA673DE3043FE2489
-2B06DF11D30E1984F7B57DE00892890F36C445E0004DD0492D0BFC40D8DFA970
-4C18FE162CDA7DD31D69714E55E455399C3DEDE5A9A23151ACE7F23D34E70F98
-0F1AF32C7984263F920CDAED21D94CF9DDD72E8EA7AAA7EDDE944F167E318A43
-FAEAC3F77026C771C81017AB544FC6F81009D861402817ACA88FA41C36798168
-29E7204C78F0A89166C1F27B1151988825CB4330693F33B30E0B006352966677
-7FB5E5D522018FA4C7AEB791E84315D67D114481E4427F0D219BDDE0E10AC009
-677247624ACA604F41D4074B24DE54B57E9FBCFD202A40EDB497690935AFDE21
-0FAC4108BCEB82440D51DD0A0D0D61E3F21204E61AC15BD51061DD72EC27A4F4
-7EB24BB58BD6B081C68645E555F9EE3F5B71615BC98F03CE9F059BDE71F3C3B8
-C0283919A815DEFC70CD1C8C450C6E9CF1001371EEB6651EAE42C1848C0F271D
-0466DFB548B0DBAE1A0F79CC7F9CF5D113CAFA86A04048E0F6A0F6A0E0D42E29
-866D8AF62A565F302609905808DD338460BF75A75DDDDE4B38A569149B2EB856
-8AC05433CE5DF29CB9F653BAC71270C8BBFDDC4794FBBBD407134C1A2F4D22F3
-3D18EC493CAC8BC6EF887B78762B179B038D83C1C96A8F6D2C507AC5DF3E3003
-22E63A4F67DC02E2D59A44E5DFE529ACCE3A4CEE2567FBB6FD1CA178DBD1399D
-2CE138F853D68514F186EAAD924D9952D551504D7C95449248C979181BA3DF5A
-8925BCB229E63DA811716D82B56365629960DE392076FE533516CCE02E341137
-EC32EECBC9ECACF92B03BAA83859FBA0584EEA52B3904B69C1ACD8B56CD320B2
-3DEC1D1DA1B66741F1C32CB8F4DA6FC6C8C64C5C3D0A0BCED43C5CB88E5E2B84
-6C5E062278DF5F323E2BB59CBD5B1F41F43BB3C7AD92A69B048758C90E0D3A52
-6FB41FA9EB8BFC592793F45FDD2157DC92B4A910312DC2067C6C5179BC170DC2
-1E445045E7E5720410DB949BF761C9EA5830D2C474FAA17431B0B69D504C8F49
-52911906240AA7A6E649577251FBA1B694F34F6D382E8FDA76708690341646BB
-E4C8FC130D1EB7214C56A203983C0AAE490726E24D6CC83F06E29E117DDED606
-5ECDBDED5D5DF2F48F642A19F9E59B3A0C39D11050DC4895956B4ED5F71CB7CD
-806D50CD68C66C797BBC187FD3313474361A2EC0C30B98A7EAC314BE1049D354
-72F2C754771C49A3B8DE3BDD7D332D5FF160D2C128C7B4524B3C2191372AAA1A
-0A6BA0D4B8D440B4CB17098A59622AA62423C4F7CDCB2DCD45F7553E61FBD272
-EB86A952B821C8A360C531B77C49CE62BD37550DC26DBC8F1060D6710AED5646
-FB43A9845023ECE6444B084AC06E83393370C505874C1260117CFAECC1AEB626
-B9076582EB7F4BF3F5938AA89A3903E8FC147D4E3B89B06D7B51672391BB7F98
-003B1AF7980E84302BB8ED67B4456B6F45BD1F2155ECD5B60C9D8633D2BBA367
-2F503192AD0C9F3A204AA41B8AE03DD9D8A8E7FEAAA29F0AE5F18892E64A050F
-A44185D62296B9CADDBDAF78E769051D212D294B14265D37FD248C2F8370BACA
-D33E7785D00C79714D6F4C11D512033798826B3B711B7BF306133C9F536E18B0
-AC2169060D5B42FE9D70FE52C3CF104F2E28B872AADCB33422A5106EEDC941DC
-29FEE0EC5020582C0784556A74E3697EC5BBBFE08B7E878C06A13660F164C740
-2B6E26475AB9E4944EDBA4169A9D36B43D2D88948B53B1B9C8ACB8CE7880000B
-4226719FB522758866ED95E18B0965FA0BB633FBB79D67F12DC20AF71FEF1A5C
-7C895EA14CD857C5C79B5CD31B7A831905E7178E26657AA3026FB65E2FC0E201
-5489E6B9B60F361CE78514DA8A89FC3CC7C434EF6AA0E60C215DA385A8910697
-4C1B9562FC0016794C2A124E27FCA078404500FB9B3475B7A599F87CE00DD4D2
-745292C279F8907DD01EE660B88B41AC46524297065681BD24AA1979E00978D2
-7C33725AD1953F5BA713C8ABE20D350B00929A29FC28C5081D9745773108F37B
-D7064CF53AC0788B5F3445808E1A7FFA9064D1614EEC7D193F137D8BC89D4E4D
-7224D2C322B0C35A641ECF98048CF8A750C6CFB4E1EED164C354EF8DEFD02829
-0F91E7C1B1F3E98F9EF0C84FFE10197F116278A5EE0330DD552329B1177CC4F7
-C6A79F8D96C4392F22815A222BE811B4B81FF99E729F2D74BB86E59144C42092
-B2EC7CD29E91788DFFFEB6FC9E777B7638C3CFD777DCCDDF2EE14388482D89EA
-9413310C2834290131D8154DA17FD72260D811DE1C82B9761BD0FE86C799A163
-99AE61D5A271B610410346F4B9894AD72E9E6F6C63678C1FD1706B118BA4C60E
-69236F15FF65459E08D6942250D0A568DA1CCA3F85A0924C4CAEA475467D5D54
-B674EABB35604C4337382F8FB16194681FA11EC85677E57DCFCE6B7CF780FBE6
-1E8C9FACA71FAF605C03FA5880514AAA760C91C85F2B2190BEC2EAEA4E46EA02
-5172F34E607A0846126675E96859B1C657DCCDBB3A64CD8315BA8C88E833D217
-D352BF66F5FA87940EE2A1777C9E1E867D8D2DCB33B242C491763629311B1E84
-38EF9B80554E5F8DA022BE06F57838FB5327592B97853E6DA510BB5FD2142DF8
-E602A1635AA59CAEE7FAE408B381CC505ED188354A7D56707B3B5B7F2A83DE3D
-9D3C34B160DE3BBB0602C0102F8BF5D17D739F2FAD17C5E403A0C6E9D3EBB864
-39A015CBE7ADADE67C60414A78DC6856AD0EA0998F51352485E48B1539F42531
-2E10B6E3FB27E60D445C9755DEF5BFF503573B06FE971C769B0026A866389FD6
-6FB25812D7C06D5799BC6A271F1F9B0FB41C0E3F466EB109C8D0DCE23D3D2B6B
-3566329ECE6951E6C5AF424C7C7ED0C1F3B1BB7B212BF4A5FC7859465FFB90BB
-57BA658CD542A24049F2E6897A812AADE9B1642AA573B6AB80277DEC2A869787
-070B4F72EF11D1DE9C79A34858997DB1A7789D7590FEEAC1E6150E01BACE5334
-7CFB81CCC5D42E3A395807AC19177AC8667B9C71AC0CA9D048989DE54E6BE675
-BAF3F13BC331E3AF75F6AB2B14E234CFC3EC303A22AA64A2A3B21DD02996460A
-0BBB2431B58D0667D8EAA51D3E03C27C1CD779FB914D02BEE1E544EC44A0A4AD
-936713AB7729B634FE216181F4D5508B680893A2F28EA451EF35701091195A25
-2D5C727A723D589EAB2DB1AA45B271FC9AE17C0B387C627510EE80DB03FE64AD
-A453C9CAEBAB4BDF449FE9A0E00911C10ECDD8A9CE2FF49BB9FD2F92660B31C5
-9811ACC24162DBE7992660A880B5493D03F4B7B0FC512B22A33A1E3AB3BABC0F
-4B3648E710959103A0D5F6E6E9A86BF3F4EAC6BEF1AFAD3038AA48D0A38B4C90
-B0B7005D8D3725C8563FD71DAD5F59E7F14C2E2327BADD45EE4854E4790F8D3E
-8F2CF554208DA4789A198489AA1D0FA3B358FB2E8245D6A6E2B449B9F91F2241
-E79504B052E33581DC98F440ABB4B48AFDDFF1939DC3F52EB07DB9FA636F5F7C
-6A0076210981C77D0126260CE1D224519469AD53E5ECB0FF473F960463A8C353
-18033ADC1CECF34BE3D751F59EF711AF0B00188ADC2D215C2BEFD52B63E0478B
-553B3BAFF351AF373F3C94B2C279A9E0964FA918719657D270B4DF14CEDF43C0
-230F467F10B3B814C7472E7B0301298E67F518DCAE3DD02F34661896828145AD
-9CDF4D547747DCC70E1A43ED757B6FBA6BD2D2229F2EE00D5D6DCDDE1A5765C9
-532A98A6BA32238AD2767BFDCFD271F009B778D152DFFC5F7B3E93FB30B479D0
-95CB3DA664F7037FE20B286C7C21BD14D1C11537097674E4774AE403915DCD42
-4BF85C7A06F5C721CD92EFEE90DC0ECDF37F8C4723CAC2ECE44271954B67C721
-89634E05E351C4B3F360356B2C02727A46F2A0721CDC42D5FBAD1968DA46B729
-E72BE77930740652E4E56CE02DF5A881B61968166F07E36088B5451EB870C14A
-D9A07E34EF0D7C92156DCEA851F625F933E61F36DA3320F7A4535289FAEC6883
-42955C50434FDB86A1830D48FFC598774D502584D6CC867FC50238EC24D2B58A
-6CF0AF823822CEFC74F874B84658F4CD54370AFBCAEEBBE60AA457AA5DA1A06C
-C8F92A48460E94E7CC3E28791F2885E28544FA5ACB0F4125DE6F8D532DDF420B
-7283A6591659F5B56E61504B5322B4B1CC80A0463DCD00B6821F56446E43F029
-E56E69F8C28B3112EDA3AA5E69046FBA5E57ECF686979BE5B243819BC34CA308
-FE1258B6A1127E701593AE44C88715CF4D3547DC6C66E85F8C14494AF4F07F9F
-22723D40A8D483B725246DF4757706783AF56C1A953DD68BC97285C5315CCD5A
-4350D8742CF7FA13D1A46042ABFA25CC6120EDA9948D262FBB66055C464C14A0
-B8977B5BB2DAD142F46CFEB4A36B7EC51D55E728883F50672F3E1D4FFE41E5CF
-30571C3EE09101C213AECAF90EE8698B740FA5717FF2198C005568E9DB201600
-833437B707AF68F52E9B68EFC36D73E9D4582AB0F135EA890D939FB1BE866144
-67CC07007B66C9CE3F7B204E75369E22D09B4F88E6DF4F7918A79AF5819C7A77
-3DDA23B3F1242BC2A61545E112255DFD97B86E859EA508CC77577BD9404AC9C6
-7A998CC511760C3CBFCD9F6F53A7B1F7B5EB6ECCC074A05E533A67FCA3CA63B0
-552D00C4D31149B29173A8667D9713756D64911540A9D4F3D071C90A76E8B9B4
-B0066037E9359AB21FF5855ED9E71BD1E9848D6A663694BE34FCC171305B2826
-BE177DDDC9B1B97BBC79E45EFC7E70FB11AF79699F373E700CE4D171086461DE
-D8E061B240997646FFBD6D273FA9604861DBBF3A50DA307E28AE218C3D0818C1
-4331CF7C0F448650AD20A77AB23CC5F40C48CCD602D0B32D4C7CD7B4B607E262
-D07B5214069C6856D31F40B0D50A63B079D065F79C3ACFA853C2C8A3DC2572D0
-B5DD285BB0ADD7596FDED62DF7C68EFF979DB5E0182FD061DF55362EDE0B03CB
-70A15526CBE98186701557FFD27556E64DF68EB38234AA13770C733477CE8A39
-0B65A272D1DB66EBA12234F1AD36E0F2B0289820CEDCBDD4CC852F53207BED97
-CB93E853456D631D7DC397ED5A6ADF59E8D04756921A319E8A85DEE2FD175D86
-A5094BFFE6FF5BA43715E2E2941741E63570CF3489C7DDF94AE79A0021F76384
-6E76CA3C1AC552EE4B66DFD560EBDA38EF5E93DDA803BD06E2EE8003E2276790
-896D51B88E4FA90061EE472BECF58A133B35920E47BBA565727DFBEF612ED98E
-895C8936833C52C5703B5F79F58F4C3171F2071040881EEABBD9D4313F246856
-AFCCF15AA4A087A9483BD95C260BF5B59485B74E1E3E98F92505B0D27F46F832
-CD562D0649886F2CAD709585334B034F3C4B93692C0082EACFFBFF259ADAA6D1
-9F863393DC0C772B2A9230FDB5FF02E8F0B5C059DBAC8D8F75BE0B3650AFA3E4
-4292F1CF0A4AF45D9BD8856FF82D93AD77ECD217024A8F619A5B8667D286FA94
-587224B5CF48327FBA64FDEB58FEE11560EA78252F6F3E3520319090EDF0B565
-EECA2CB5FEAD5B42A95B19D4CF41BAC211CEE425FE833DC7F67146FA46AEEAFA
-2AC315DD3D7017B652AB372D6941E9AE38D8BF6F48F5032CC938C7F8AAC3ADA8
-ABAEDC939E982B4C92C666CB24A5242D5504A788338BC5663222F502094EBEC4
-007B13BB67213B30783987029BF3458DD1714F59421AAAD0C298519EA2A4F4E5
-38703C5CFFD13C621EB988C6EDEE218B5D5315164FBF0C41F32B5A48E50FF7F4
-B60B005B69ACA39396DA5969BFD468B28BEA77413E80A3F7027A31A81FCAC929
-108189FD78D3D3B6B22529ACDC418F7D8050A4DA3275FD84E7F2822325CD1E5B
-B0CD6685FA050D53B892CDD028FBE94BA9E2F1C61BD56DEFD7789C2BAAF164B4
-F8FBBF983001B91D0A667F94EE096CC9695C0F84B3BA9BCA6B50787EF1DDC483
-C5DEC8B12C00B19F9D1C680BBC3751E3F9C964F3302B4B9CECB9F6DBA34BEAA3
-CA2F39CC530488640FC1A7CC894E4AED03A08176F3AC15C3FA26FE85C9D9BAFB
-9F4CC02255074CCB951B7E878D7AB997737417BC010499D7F91610D5E2A67AC6
-F8D95510738B83B43DFF22C451A3096F758616FF223882017663DA7AB0AA0D87
-4CE2C31640489CB32EA91176D5C39531746330ADC7925AAEB086075BBFD5E9E2
-4D8967A73090B20310432A8D7FB3D0A756F6D73B36020F040E710792561FA99E
-3307619D6B65F1AE55F0B053FA8DE24D54619AA5ED9F0C1A7157AD8B9D97A142
-386DB15AC36D6CCF453C2EFA6A4615935D388250A11B296307A45B90D7E76BDA
-609198C8FA31C6E5CE1A1AEDD544CBE2D7C6FCEF1CA63BA2D57D2744578956FE
-D463214CEE5C154966E10F0A64E25DF25BE8538F9CDF5D480BD8004082070F38
-C88473561C641E815A6D94820D0CDE56829F0AAE4BE1315D360DEB4CB25B4FBF
-791999D4FA7206256B177D8450D50A32A7F806D89471EE96CC7E85356D2C1E35
-288B7FBC0036792A4E7DE77DEB347F2168B3BD9AFD31177AB5E4990957869944
-243087BC9F048C218368BD6C738832CEC99D7F31159A33026442ED4D27771E12
-BF02554203415B1877941037C72CB762B51471C79365C018D506AAD55464A248
-7EB6E55D9B0527CAC8A915BA84F4DAE556B427F48E3120142AED5705789C2708
-AE94395B1F7B875EFF7F19B9AB8AF28737FC304E32C8633625DAE96D1D732E29
-59879BACFBB15ABFE8A6EE1150AEB29713B428FFAFB619206D71FC382B1215EE
-759318C5CFEA9C0E5E8E3B7F47DE607B6F93C19AF28467568A3F373AEDC78AC0
-CE99A407D97154FD68220CA66F7D3EA77B323A7015FA9D9E8AC5927D0E7F4A4F
-1FC871BFA999EC749E09FE2AEB8220705B0AC8CB4DBBC409CEA6B47F98B67CED
-DED64869A1F9B3BCA0A85D66B1C27301DE7542FDEEAB005F2FB76CA066664B94
-968C3E637E055EFB165093574FB6EA732B959FE708C52FFEF012CC1117C85EF6
-56B97BA4B30322F7B3F1F95233A3C897E5316BB86E8C331FF1A858429E0D98FC
-DA67AA525C035606A8ABDBE35B742B53183CE047EA2CDE1C08EDF08E5355F694
-1C34925DB0D5314CC0B205F40775A500B76491789B90D4604D3545E2D7DAC1EA
-400B2CF72EADCE9C7409900ADD1C6057DBBD97D332F6435C0B91B14D081EBE01
-EC9230E6D12B6455E401CB100C7B3590D23CE094C79BE8266F1F24937448FEA7
-C74CE914AE8DFE853F3E068433A6DA96F156A0014C457040587BAE7DB4CAE2C0
-EC1FF60747BAFB376D5F87DB5CE2A8512453088742214C38F5B6E0D7644A0C1A
-F67087FA502BB43C27B32931D8315CB8A425341ABC3E7656588AB563E9CC456C
-E46CC1E57DD4B2A83CEE5FD154001568DB6AFBCEBE8FAA4458AFA35BF37E4C71
-1D112063753E5B66C8B4E801A5E46F6053C8B55A95086615D6601924A6633C4A
-C4D8EB0B7A5C8AA7E49FCFDC8182EEA53DB300AADBCA3836FC88A140A155C726
-54CA5DDD926DDD0C1555C26E30AAE25D1CA4A2478D0FDE0EC996A1399D5C0F69
-C349AAA9206B2554D7D6C68DA845053641E22B965314B6F28D69628FE8D5C243
-E978E6B81B3F916E722DBAF355B18812021267A9E3C324B3D9F6BCF7B5B50CC2
-D5B72D9DE9D485E103F25E1F42FF7BF040B3B6B5DFBB36BCD8E8B6379CA3198A
-7AEC551899A044FEE3CAAD9A2C3D839DD370C97C194D5A4F2815785E413A0597
-C61887CC4842988FBB321DCF73FB977402DA1E3D9EFAA176230295ABFD079DD9
-9B2D187B82BD7FCAFF1EA271FF74ED0210D616BCBB443800C9FCA4F467A19717
-DD0D36AD7CD6CBA51AEB15755E68789368851FAE22F39F3CBA9CA1DEFC304E17
-33BF87828DE7758DADAF45CB27CB0A64DEB8F4CCE7FF05CEB0E4E016B9675CA4
-E7E001E16FB153610F077EDE525873CE46E0A3997EF7F73D8DF38B916A8AF808
-93C2463BF8B9C5875B76FD983F00311BE872F5CDB5B1647508F422FBF2A56986
-6358FA3C232E7E6063C82F74823036BB7AF8F8D545D12D82B2195DCEC5969DF2
-0EE8CE3123CB3010FBEF3FCCD7F1920ACC42FFB593697B786E6A6F52E10C1A15
-208783D4280FC31CC679F9E4A00E684B74EF11900CCBF5554CFCE34B65A9A999
-68AB22E0A438B4DC1CBFC32755F7DC8FE58A7956C1BBBD29983200DDDAA59C5B
-4CE550F5E0AB048E98DA80BDEBA63ADD9DB6C7DC3A3F6E25C1FB6B638120925D
-C897B2C05C4179A0E48740439BEA3FFCD35C71B21ADFD7C8412706D3868C4BDE
-30F6B8CAE82D86AF842CFEDCAB3CF67BDF0AF7FCE6A0E7AD2D247446C38B2CF3
-26CD3D7E09F5CE2535283C43D04C9391C7A1CDFA6F2571F786A1F0189B9BAFCB
-AB1CDDF8190D7CE364F8FF8EBCBBD5F646C095CF27A34B7235566BFE8B012E01
-CC721A7B3FFD795A0EBAF81A8A0A7820B99E98166C1AF177B87446927CC0C239
-54BBAE855E9FBD704DE67917FABE3034A953930949AFCF79A59AD8A387CA1FA4
-58131723EB2935C02EBBE6F9554BDDBEA5EA55E3FD6BCF25DA52765D65054BB8
-4A5C2AD1312892297E1C45570F0622D145BE35C8758391F28C04B3AC4282D1AE
-084E080892C76C1B9C9F738760879908EC5B3A90DAB7A6538080A484E54B9FF0
-1C2885E93F1F16E52E0A3C9F6802E6345BBC5DBC5E7C57C85104427CA3182C7A
-54E95B22D149BFBA403CC8A960EC62EDABA1881F31B92C54DD21C96298A7703E
-E9D2DBA4B91A23C4E5F3D225A38C07818DA8C2F261D950FC8AB6042023248E37
-6BA0AE50B9A85F04EB48523143AE40695F127E34E070331620415B95A5ECB24F
-C46696AC6F75020F6322DFD03B42788C535DB541FEA6F846380E8F5800B7E060
-51A387FC9AAF598C88CEF209FA38E008D8707A34245EFB722BB373D7E6B1E6CF
-BDF2DBCE22FD2C85F78C4C4FC31F3C2F6B553C4295A1E26665BD166FFB7DF6BE
-A6E9D18FB735F2DA53138A4A4352B36A08B662528FE0237FF37FFF218D88F2EC
-50741BC5E98E856B17D8015869044657657BDB90D69A0FD5D5D0CF4A6A091E56
-938D444D0618D7B45C22F65E18B034282849355ACE83A188D164FA36367AE6C3
-35C775F72A89A4017A4071EAE1118B88C58CB1DE4E20EE1955BE0BFE8646CCF7
-05322E5566D14B5318A2328648CE7C1AC36B077D1A8AF17AC827E500B09FF496
-69CF7446403EF7B00C4F1832F1F6692B5FBACFA7FF9A719E5DDC8F25A798CEE9
-F4F114E522F00B7A415AFBCE48D09958DE98CAAF427FFDFD635A7ED5DCFD5F7B
-6D7AF2B5E78F4446753C8CE59F923D4728ACE448F35BF3FBBC8B2ABCF49432D3
-AA49924191FC8AFDAD01863EE8716B6D76A6512B40BDE9C18C7D321646539DB5
-A09047ACE1815F462E82DC593548CF68B78D52049AED0E44627779613BC02BCD
-2B5BDC8D2091271D44BA1362DE0E44E46CAA9D966D429848FA422A73061A12F2
-B1BE7A81533D810479F91C9656D3AB7F00B9332AB851743C0F25E32F37E943FA
-370B4EB25781068D8DFAAEC50CF86028610CDB59CEEC4AB547EB3908897AF9ED
-CA74EA35D2CA70A70BC83B0AC2E4A5E558098AE2B12EB42397CFCA0F9C9E15BC
-9431FB2F10224F22F0E191291110FC5E1313A99EA12B3E3318263AAD516BCF66
-C71C825091984E21010B29025E3FBDC518E8960AABEAE236F03611CAB6F87D03
-EF0DA8DAC4D2C58A9ABD40E592B2756FB21E4D7D2F2D3259F51CEB6BCBB1B4E2
-33BC3B474D779565D69F0FF19113A20553F85DFDB4FF9E175606240A7562B12D
-4B8B8F938AFDCFDAD721A64972573F6251D363FA971FDC41F2E02F7DF28C0AED
-EAD3A9CBBED541FA7E6AD7BEA83945118B83564782FBCEC5B466B96DA7809BFD
-A86907AA67FCC568533218DDB3D201301379A1B9EA8A32DE36B1F7F93F99F0BB
-FA3F4D002793063ADB685A8935EA4A5E549767853A6488C6DFC2E70B3A455D0A
-29E8F6FD949E810C0EC0F6F835DDD975EF68B4DA83F23A14945195248F667B32
-EF2F958253C7F5FD49AD7E545911E963D76006C57322D2CE2FF3F1DD1256152B
-3226C0CA03B72F409C91151FF59EC80C2B7431C656E94E19904AB842D63BC797
-1C6552AB4B265ABC2AA8B66096AEC22E778232043288EE0F60D6ABB319B9D2BD
-0FBF6F0BFFF5DEDC3A39AECD6821EDE1B213F7A2E6A7BA475389D647F663642D
-E4C5C3F0DE1C0030EE381006CB01B5E5947AE6E837DD2ADBFC967557A0182EDD
-16B10FE9BDD490CA0A3C351B025FC63A08D1415163EBD31ECEFC3F50586142BB
-205E41E1ECEC46CD2209D760D75E743AD13AF1E761A8B7F996ABCAEA43645546
-F42C87F6909258CC74419B96A39D6DA3233834894CC60B03F867B6ADAA2C18F6
-0040A9D8E70BAB12221217095DFC57117CDEB536FDA09E11787D4F7B448F88
+57BDBD4C4FA2979D6344AC3198440DB1709FAF1D9DBD7EF56D61664EC7BC0921
+2A51FE14DE1E2F1297F9DFD716BC08D5EED44C02A449C5F2F57D79D8806114F7
+A29CF906ABE31DD46AAB5562977194ECD03E78CBB9B405F3E2C4288D963F1B0A
+CF60D94F28A813767BC40D2BF2B7808804D86B70DBF94654C66BA1C9ACE1D8C0
+DDC96E86F83000882EB43B827B54D499205F00CD9ABA1488A5ACF8A1C67DA1A7
+319BC9466FAAD8DC6178411A7665B719C8A2C9C08752199137D18C07F050F920
+D99A80697D9906F17C34D9F7002E243231D0605A10BA62A5BE24BA9370D67895
+2974D9AC107A45FC80B6CE4737F49921FB1F14CCEA0968E7ADE73F081A24938D
+E19CC21EB81FE8100D478C6584A25876B1E2F4DC29C866CA5E854FE495F46B38
+311FE43A7E8FE3F9646507D23259F2D4970ADF7AF7E4ADBA8A1A5A8A7C621F0E
+F2A1A4E4D5FE16E7B0E897D1896F4ED012A454FCE7AB1ADEF996780956884795
+90DBD63C5828FB8BB6702048EE10A62CDE24D71D6B901128F9C6CDB76BC5C7FC
+E39362BBCDDB4318EF08C9B3CF7A0DC30E5D92AE4F93E4C3F6C8684395BF4DEA
+AD736D39569007E8D020D26FECDE65B054B2A8B33442200B6E61DD0CFCAA50F6
+BD827C0BBDCD78C5867AB1E712C372FDDD5DD3ADA48BF40A5442876A53E5E34D
+9EEA9A4DDEA7B00004FE8B5A2F74A65266BD4E6D81FC5B2DE06AD5405A353CE7
+999ECC2189BBF0E02581E4FD6B08F3709D92053B91F58AAAEF526449B3994159
+9C32F9D5C58EF1C8643359280E2712A42083D51AA7E2C7E3AFFBECA3ABF7E65B
+40D29A06619AA6CCBC3DD8C650EAF46E7A4205D0AC073D975AE628F88935027B
+36CCA945C0CB9CEF075D30897740E4696E90C5AEEB567EF45D8BEAAE811D5394
+5C56EF1060A048B764AEF895642899A64D1B43DDCC7F000B38C6F9E8F8E18B33
+E52241A7028A30C0E7A3E923C145B66ADD817E1142B09ACC1794F733CD09C893
+E7CAF8B9EAAA17FE2D99FE9414B0044735ED4697F40919329E03BDCD4B7D2126
+D51080F01C44F0C6B20E7A82AA5DF30B585AEC9F950BB82101C19895ADCD7668
+F8FFDBD6D559C40F27872C9DB1640EC248F8C1E2B852F244DA57F46F8F36E34F
+672F649DF741D281A5D92B77D14A35BD71E1BD18E1009BD5852D099AB6C6DFD9
+81363038ECC5CD2F6C9EFBBE0556CF468290624E7A9FA0A119596C2CC05901AD
+0FB432FCF9B79098D2501C46875F44CA438EE63670527EAB66AB620EE152ADFF
+F63309400BC9BB2C93DA80BAEFF91CA0059965B743C7658ED2999CCAD0B6CB30
+7E549BE6CC5A3320A9321924DAB511B9D1F871218787070B7706F5DA180E567C
+30B036869F297BE6F67C4519947BA83D9C24FED8DE0D02B7B9CAE1A03F82AB51
+75F707A65DBBA797653C1CBB3E5A0DF49D94CFCFC68BCB9ECAFBAAF03673ABA3
+B8321A0458EB3C91CC6DD69EE0941D9429C9C5092693B607A67E0AEAE55053F4
+D74CC02F87B891CC50BD8634543845BB44585404ECF2E512AD455D80EA2820A5
+0A853919C11791C0BB81303C5532623A1CE3AE964361AA2F2E241AC8C731056A
+89727610875875A1D03A09E6F54E5606C808973770064E6C9CACA9F195512163
+BF99DEE1A715907E2772BC68D16508BC1DB50D7BC9198D23527C9581FDA43BF1
+D40A0DBBD96D65CF2D23360390E61E4C05CF743CFB31E58B1EA9DF7B80DA8141
+D26D09B3B3864B45C0495C56BCA163C00B6C77C747037AA8A1C0AB5FA2B8EDB7
+E7F305ED235246237A265F52A3223AA6F478533F4634CB6FB6DE6E81910265AE
+83A4C384EC4897CD9A044A892079834755212800BCA31BFF1F67C31C975C8FDB
+767C1D80DF27485468D48FB0B16F0D3C191705EAE8DA6B41A570A2D5DDE994CB
+0ABF11EB4B4E420A5DD8725E870EE3958DF71590FD2317896FAA4C6F3F1558A1
+D829D5B8BA4C59364363D3C20A3F778A72914EB3707E562F244CF96FC90F506C
+26349EE971AD5C91723922EECCA11B8D23E94EC119C5F3BAD9018342AF2E1934
+69E49E93524360C250A02544FA58E92E6E39B760E740DAF416938E412B1AF7F6
+D9FA3C9DC7835DE730C93344DD7B02848A4578C8810FF104F2E2A2EF38F52598
+5ABCE06308B024EA70486182FD2BCD88B02EB78420A3145F3E310DB94BBB9889
+F52EB14E39BAA497BBD563E39EBAADA2AF1320341F0D0B865F91EAF2CA91956E
+B288D71F0FD38FC462D866082E9A6515AE23D63460EFFF2E3EFC4BC51F799CA0
+4DE2E555C64F9CD1375ACA5698A8EFBCE478F1C9BD344ECC534D83E6E233E709
+C8DF1AC21329965344A747067B03B791AE5C1ED0106412447291FED0A19ADB9C
+7D3ABF0E596CADDF5021DF61A98BB2BEB3C7DE70C95407772D070407F28142AD
+DB62C727D13483746DAC3CF262BC68B833AD874166B4D0EC10C7E2A4DB5ADDAC
+5F248B8CD6ECB789AC03CA093B86700490CFA49D063DCB2A694A52886F2D256A
+A59047BA8AA6F15CB5DA0466A857B66FC9E437678BD7EC602903337BF4700C71
+621A7813F120A934EBF5303EC5C0DC42780F3CAE043BF763B542309CFF3F2B87
+2AA14CADBD8D000A67298EE5AE4DFC4ACBC2CD873C4D9098086BD2B2F597E9AB
+32E22A86E43A7A2D127C8E50112CA4A224FD28A1F26FD75A3440F0C7CD685414
+A0A738EBD355A62FEA6D46E4F82663AC49A6E91C1BF1D6337DCEDF19AE5C685B
+C1224DC47603225DAB9072D54E49C0D51AA35777F1ACB4BF32AC7D01168C3976
+FD5257A7CD8CBAF17DCC98CD31C79839043A8EBD0E54EABE20AB3E113B751578
+C43C2030F99159D7709B6CCEEF4EA02ADFAB59DE70F6BB276EAB521E4E1BD371
+0C665CF7081813BC8A3714A403E2E7989FF396D9196C6A5DBAE6BE6CDB40DD7C
+193F91A2911D7D791B8494E2CAFA72079842FF6F84D637C211E2BABE7DE62D11
+E41B8D400AEB3C3272C71CE684F478633151831716B99F52336D731F5BDC09E0
+9F392C58157236596F053A9A9A6AFB440C2C900A539E16E4C37289DD58E94DBE
+8BE05D1547265F64C0F65AE960376C074791233175642B9F566C110FD4564480
+4751A13E9EDCBEFCAC10C90CBDF49C8C9D0B5F187F0FA7F3EED161CB038A278F
+F08AAB6B033F38D4232D8E1C0543CD85F1ACFE35DA7153385490CD97DD3EE416
+BF37FAC61FFF85D4716A0AFDC45E922791977AD32AD61399565060C26C41F706
+7AAD2D27C3F54986284D3F6E0192DD8EC20BB4DCA8431E4B09CAA7E9C0186A48
+68D3D61DEBBD627AB139868AB0141630559387C58ADF13FD021B323AEC6002BE
+51D85A9EB90FC8B47274B02BCE13269FDA90944FDAA40C74B988B23A575A6FF7
+596819BA5F075A6F488F69F7B9C80C4DB4A73CC57EE4C2D4FE07ACD2F163B87C
+F7F9BC47308FE26F51C5F52BE9C2C5B2598936B349F8FAA3F1541EE2A0DF756A
+EBF16D3C35E97CAD5A9C3AE9F62119B46D2EA30C07C679624297A0B6DF4C9BA2
+810BAFF711FD7D503AA68811A1FAE8F172EFC53F585A278E9C954BB1B4E219E8
+34944BE31B6AE71DC217D7DE08EFD59CDB71BD35D8F229BF4F6B36555BCEFAD2
+92E2B687A353BB608372817B5A598323650137C16CB01F02275F688262C57A3D
+ADA0853699372E36A5E94EA76D7F577793EFF2693C13EDF5CAA5D85642408B3B
+E12FE05B17CAE8A3F532EF0AEDFBCC352765C4B2DC50D7300721BB2D503152CE
+A8BB4A5170E59C049F458666446E52CAFAFCCDDF01067869262E3BB799B06D1B
+D44D76A284614D0D02D3A2BC46DCD9F629E9B825A3794802BEF28AF223A3EBEB
+E824030274263BA0A9FD91FAA31C1E4A339DE586E37CCBEF60B5571A4831B438
+80C9E24B4D257683B785FF7256367EB2FAB5E79A4BB42901EF4FABB6D3762131
+8FBBBE115F69EFFBFCFE246D7714BE509BE8642954FC6D2DD2B0DEBE1AB9DF80
+DEF7DC1DC786247DE28B62D9630F2C451252D7B60622ED4F0185FC1F8B4BA312
+FF5127B7E2AB7756EA9B3054E9F354635E08267F1D3721061A7119B47B4EE5FD
+45E883C73FF64BD9C0F57051D88D3F6F549F6E94E6F69F580B6B297DA0249681
+E02ED4F7B1B84E51F4ACA217D400DAF584A1D0C0997BBE90279B27C97C584964
+482E961EC31C364324011DF04FC850083D6FE0180E31FF62ED4EB02228FB69D1
+2894BCAF37AD240FE874AB293A55EF453E4C0744D2AAA5C5F2910BC281E3D8EF
+E706D713A8E074B77EC010AA500506DC82F105C0613FD4E35F06D7C0FEF73B7F
+B1F74490EAC3AB9A4F61BA95B02A714987623952E754B225B3E21A18BDE46B20
+0D06B7F1751F9BFF9B30D6C4C20622BA7AF0C43017447BA5630F28A6B2126EC9
+DB901B662FDF6C1A6C8A81AEBC1504531FF542017FF3D54327FA743B21C9021F
+36DB6FC504221B93F838C3D7D5731E892F75DF1FFEC5344E867B174052CEDF30
+BE1372B054E3A3A346CC67DE6E608BFFD09BC8B9B8F881C020D74BCA542B85F6
+41E7282E7AA1FB5CFBF4A60530572FBF36F156F6A31F9AE6D026A033D6D78ED6
+441463B179BBEAEDF9ABD9BAFE7CA0CC98B342DB21D0A902F21C5F505DA85FFF
+174D2A13DDA547936B84DD7692DC1EEBE9CD9CDAD94E7A0485F17D82B65E3954
+53565E1D6440C3F327E58864AF3284563C013FA1AD1EDED9A38E6283DFF88C5B
+E552D23477B453C25E9D9680ED01A27D9F502293D3A40A0BF1E738BDA066314F
+771D56EFAB5D2C7EDD5BABEC11C79465A972D8436BB8D5D25CF62CDC741903FF
+42757B15F41DBAA2B8BB6958FCAAE52C2DE8B2D5F3B26391B7619F25580934A9
+E7ED5375476EF1DF4764FFF07BAAEF3C0D4DED9CA0E7AC9A82AAB196CDC7AA04
+CFE43427BA049BC17FB567E836DF6E0EC22D7A58D6BB428BF42814C0B071F652
+16EBC9D7FEECCA6DAA2217AAF7564F55FD51261A8E33AE11585A0CED9FAA0890
+5BB9F2EB0504A2F800940FF58FE7F620B719BDD197C65418AAE51310BF8EA272
+4F2C6F732C9F16DE4906291305FC250EEC2F143038F5B919BD79CF0420EAE0BD
+E30AB5E9DF473BEC21AD9CD2E78FD2074C435B1B50B7030DFB9B8F2AAA94A19A
+BBE3874753A1BAD35782CA78AFF1B7E38AF95674DEEB8464029E146AD48C3319
+0AB788299303914F00FDCE64076CB051C5C0548CDCD55F5E131E02F07A94F146
+0CBA373C6F0FEEF8716D6CDAAB4ACA93B865DB7CC050C3C11A1D1DCCE06F5766
+3E7892BEAF800D4282448477DA3CDE8940A61A561F720960031D0CBB4BA6DB83
+5E098AD2DD4D6C25CF4FFDD5D3E13ED47EE3E7736757C49D650CAE11BF5CF5CC
+741EE453447EF37174294A56D503B6551B85C67FDFEF4D2932F8181928713793
+88C22E9036B61F4035DB35544B09D1AE8161AF16A5CA02EBFA117430B2BD5BFA
+D7750BDC3ACDB2B466A0FB813820FF6C560650DE37527E4BE4A12E1F6957FDBF
+0AC8C8AF75982D4739C752F00E5A23379C572DE45C396A2E657E06E6E04C56FE
+4C61BEB991479C1584C31778F604BB8222AA77C7C0F9160ECBCAA3449AF2ED8F
+856A66F1039B8B67AB8DFDC4A76BE89F30FC78CB48880B116A602C309BA0D67A
+14CF4BC34D81AED5D28A204558443DE85FFA073992162DE80B9F389E6E49B0C7
+231EE73075A3161B7E9A0D7591C96EF8B297935C3D9DEC1F9D7CF2DD6EEC2FF8
+54438D57DE87CEFC9499CC06A39B20498E9FB17358333790E4B0159B8FA20B0B
+9E29AE280757001669B4E33EABF675B94F362095CE6A43A1ECDB0E9C952B13EA
+CD1AA7A6EF2323D14AA7DF03052F415CE0F712ED4166D40714520ACB06E4D56A
+E4CE3E0E1C3C17CA1844AA0DCC2933DDB0C7798C2BFD71E9F520158DA3F8D2AC
+D17EB82566E5FDD1075270136A2AC0183E490ABBEF3F94E1D6D59A81687F4FB1
+80C00A63891F0485BA87B5EB29B41070785A8A6EFED488064A4B76DF948465BE
+EB0656C214E842EE09DC7E14B9604E5A050394571DC09C7AE76DE6B184A01DE4
+4E24AABE28C1E1B7CF56B3279976224B16C342D130D2A7265315A52BE20BB652
+4DC16E8CD1FC19FC77C94D864385D5AFE19114297AD7E9D74DF5528CC892F1E7
+A57AB51BFD096E2C8F4B30CCE769A0C375AC95F5E8F4217ECD10F65CE78BDEA1
+F157399AFC01B0E3305FCD9E4DD24D51314C0A8F07A10574DE0B62CC86551BB5
+E4CDE434EB44785CBECBD233E81AF34678AECA3912D73AC18D34E9331689E686
+BC2C087B8C091E6CBE80E514E6E0B309E763832EF6A8D653DFF1C988C86C8AC7
+9CECC6FF0F0CCD586FEC597D333C79941FF24B26895FDAE930C76C3DB747087D
+16979EB594DE9FF9443ADC35EFE957E5ADCF1F26687E2FDF81D7A205BD7F5A00
+5FFC16CF7ADA9C4228CF55AD85FDB8898C34501F9CCE90E3BC27D13581C0F553
+20628A3E31056757A13134C0E89907CDED524E832DCDE52FB4E0DBFB10E6BFDA
+863DF6751767B63BF33166E17070D83E94791D4639CE3AD4B41BF09B41BA96DE
+FE756072626D1835234D7B831ACFB832C80244AEB0AB1427C2F3E97B76BBBD67
+9257C8D3864E135B16D933B8DCC2B25D9019F2C5CD0AB7343D39BC3B4E14A957
+123D6F7A6D1BB2B4BC74866666C70A891A5E3AB15941D899F3C5BEC36C0F85E1
+F86F0DC872E66C9B323954C9D7B6F0AA25ABB694D39D5361B2874B193FE93453
+88DE1ADEBB5904C51DE77F623CECA4FC2F14C79AA521E45019D491EADEC7369C
+8B569CC8F94553D64BF9D63E0CBCDBF8EA4EA95F951280F6482D36A5D84995F1
+7D6D5C5C853E1D8B9E44EDD50395B56A25D0A256D8046F1AC3D575C2591BFCBB
+141C4CFC0433A5DA4BF1125FB31B4E465D67EFED81236FA8AFD8F1F1C8DFB0EB
+B3711D9FA6660DAC7DB14A4CB99381BF1FC1F033525B61322513681E4B6DF2B8
+79BD0057573347EECB82EA0144DABB181D9DB4169E934FD7AE90682839FBB17D
+20351F9485C49DE403EEA86E791A381FF672442A6600864AB854A23497C928F3
+9DA080BB70DBEDC5F97E7660D4FEFD49790C6AB4512EF0942A095927327BE557
+000723101B1936D7CAD4CEDB9BBA459C29A82878A02EB2B250F486B9E57AFAC9
+611551C0DC60E6654BB5ED253D7D18C386D2E5899ADF6FE07D2632889A2BEF0A
+B7E16E04B97E8F290AE461B6A59C194211DBE87FEDF37800CE2EDA3108D9E169
+F1CF3DBE028C2AFAF04094C696AEC52D74BB6747FB3916166D211C8690C478F3
+C1997DBC5EC873170CF61AD6BDD708DE2C1BB428E230C1111AEDDB0A89934966
+A446BB8D7A7646A316071469F314E5499793BF004473DF012EDACF0E3B872C30
+05AE996DE5B7064CB88EA8ACD37B3EB7A3E2D533EFFF9834009FE92329EF76B7
+1BBC9E32659888D5520D5D3B0D7498AC89DE03B975B0BBFA621B34805BA4D999
+ED8BF2877E08E69971D08922D1A7AC0B61FE258BB33509B4780A2163EBA6A39E
+644E96E348B00B13A6818EDDB568F6F70D9E530B43F6EC1BCB801D0F2E3EFFC0
+F4F36E528A2AC4C9A961BE96E6CFEDE623DBFC2AEF1D7C5DB9243CFEA4CFD360
+3D9554F129AF3905AB774C6F335A17F6B15A40BE518324C5F7232530C1430372
+E170BB98B7882DCFBBD415E4B826575650418BEB0D6689C86F2DB01A44EA9D1A
+748AC9B5C71113BABF43E556F578D4CD562A711FF8CFAE0DB27A6F7522818A5C
+CCDAFF81F25BA563A43DC10D995FD0A8CC2C02FBDE62ABDC2A8F48046ADE94A5
+EF141B54D71F0586D2DBA09CF06295CF354F1896B6218326FEAE271BBD922C0C
+2A065C71B9CBBFF433C6D32E1191EDC9D68CEA7E9466BC398B444E39CAA07879
+43FA87AF9DB2D129966EAC73400558EE4287A1DD4AC364CC4080803673025078
+028452B925CD6951B3807803804A88345426BD6E59FB1DDF4CB843710BA96300
+18D336294A6BC4E45BAAB2DE0D9A778D88A17FF2588F7AF8B03B5C6BBA17A89E
+8B929F83F9B3463F5592A8E710B677C0142FAE8F892CE79FC857A51A8D59DE97
+413DBE7D67C82C0F4E3EF5E26FE61DB3346CCAF36A307E5474B3FE81FA20A925
+58AE61EF420F47B8CC372EE0333A40CCE66817530B3235D9A936FDE388A76AC3
+30EC98D33C16E4BF9188702D5EBCE85192B39811148B08E7E630CCEA8559790E
+B89577821CD6428F3FB6F680CA00FE07F1F06C94D5419E2E54AF8A194DA645FD
+FE45207B2819C5F178F08E3A08C672AD5C8B3FD0D98DF452A7C633F5B87A0D01
+6B3AC6E85BDE9BAC172EA888A5C86FAF2D4731EC390DE13AD65AF950951B0B1B
+3E93836F683BC12AA1F1B6DC371A7E66F0604A43503562B63DF3F45B493A6ED9
+5D9BE9B0B8F5F7BEE60756CF79BBE7A47028CACFEAB637015E4E00BE7F2C9C1F
+B3EEB5AC0C9AE3054EED9CCD146B12B56FE435AAB2D92FA4404E44D2E8EACBB9
+C1E21C4DF10F316BAE384E31175CE82C195A79F9B3A3B74123E6A2DAAF54045A
+7425E9038AE77B9D1E5AB33F8AAF91D314623BE41A21F1D5F8206AD4A32E5237
+519A42641F18408BEBB6CAC319A74B941D8D3D728ED8D8A0BB3515323315CA1F
+23295FB8973BFD3A9D8E66A0FAC8CE431E8E377697F5CD56CB80CC88AF851C60
+DA9DE2711B63B86857AD083838F3936A9E881D96FB03DCEE804C3D6D0CB3AB3C
+DB03743E634D80F16E36237BFC44E40C560943924DD7516BD43AC60055C9D7F5
+50484CCB471E014E49C923200CD10390CE92A5B200D5C86ABBCBD6A2C57ED393
+81C45736399B9EAF73B052B5543F8433622DB6C0D36CDF714DC88AB68009BCB4
+2C9219ED28C4ACE9B1ACDA70C35FC07D71C381BCF27A436CC278BE98E28F94D3
+6A41910C08A2AC5E389ADCA56DB69661497EB1ADE463AACC817BDDAB170E578F
+8051D01C889ED8F24BA57A7C217DCE931C115321737991FFD542F2E80EC7C91A
+1EB513844C9738ED7BC1A280D0AE34D03A77B7AA84CD78DA561B1AAD225F8921
+A3F0374CCA3883CF1CE01B4F993816C2E713D20AC4EB63D3EDAAC9C0FE3D7AA6
+93FAE755A8FC98C9CA35325DDEC153313E2567FC9FDE6400AD44AE31B73010D2
+768A7D2B5D48969ECA35BE603D54FF0CB95CEF1BA064E71CEC8D4D264337F91C
+BCB94CE6DCDF2B05E1CD21EA9EC218FDDCD99A461FB5C1076D9B800A86014064
+AA534A2AF51264E34BA27AA23B8314C97230B40C3D05A82A59B19624C9335D39
+EDBE2F2AE3E504ACF475AED646D079C86AB811262E9932D158388AD5A36FA7FD
+6B35ECFFA820632720C56761535E504EC4BAE46B5A070FA29816A3B0BF298BD5
+833007A6BAC43BF4971553A69196A166630A96474C338759A03E7E89DA5D2CA4
+98848D52AA5F996ADA1799C4630D27255FC8FA440EE1D6F5886A7540A383167C
+C88140B9B3EC4A2927C8442FE853D54EF8C5B076271C7245D979E515C58BDC1F
+B927A7ECDADF60CC9353489290155DCF4EA4BD49D8FAA20AE573C1CEA1EEFB4E
+2304A568B84CF539A9F01B9566D25A65EBB942AC4E6CDAEC9398D2833C4A3D60
+FD1AED5B25BF4DBBD34D8AF23C0CCB0C4C3A4C56D825689D816F670516D08E6F
+788DF52162C2A52A3AA85688E9867E35302BC9323A94881D6FE922928DC71FD2
+ADD02130A509D5E0933BCB3B59849EB0D8B09AB24C7176BBB42479FD8D8581D3
+BE7CE3FA1B6749D977148AF2C06711861A46B57339D8B3D241E300D87E3241AB
+1B0AE5918B4F1545BD096C05F50E5C5C6BD8C644BA96940C5DE5EBA2FA47D172
+4F19C22D36B1E2F90D568DA2CDBE55BEFC76257FD6D4D0B2FF4D7E16EED9620B
+BF5B043689C355CCC2ED4401C7ADABC3F0370EB1ADE5082581789102D0ED304B
+270EFEB8E109CF0F09D1B524C2EB4249820DF8F29FC128F48704596F119766DE
+4A790984CA3D87F680CB931EA21666186B7B9FAA695176C83E970A6918EC8292
+41BF38DD48D7C8B449E0C925E2B932D09B9509163C9008812FBFAC8A72E97976
+A78369E181799E338BED92B6A8B03C3B8CABFA98B7DF98E34FE324C52251E0F2
+AAAF32D038C855994C4F45B57DBA59028B1AE0A5BF522C3556875DD84936C7A9
+38B8FD6CCD7250E321C884A6AD0CEB7505D378F96A3F7F76D05D154758605715
+20086DE04410EB8CAFA719879A2DED0E52018A6D9EA748AF20E2C7DF717603AD
+09EBE3B8AA7B55131315B98AA4FDD2F83755249EB7E3E7E438FF59C008ED7BD8
+B6825B78B8D441F223B66A797488C24C549DCC355D90964847B598FE681A1986
+F3AAB186EB4A7F340E75CBE6F4B2F0D072696BABBB4617C84E016ED6C33B3EBF
+B1EDD2191641AC285CF5E49A8BBEB678547A30EE0DAFCED16F68B2FEFB93342C
+1825FE06E871AC15ABCEB0E263C83EB19AFAB1BBF4F38CE080984C9AA22EB892
+4E2A7A8B42B08D51D6C55CBE511A7BCC34674F8947A1512B03BA9A7FCB517702
+81C5D37A5F4A3A9419B0409A75DF568C0FD33A0D7F3F4FBB41E0192876F32186
+B22FD853B181570C16A5B614428FC38F54B7E3779BEEE365360358B63955F774
+38145829FD05B48BE957FA98C435573B918E2883982CAAFF408D5DB3AE15BFCE
+7038796F5F0F1E98314C578497C1151AA044212C90D00FE6FD43EE858D362BC2
+18E962635CBC13FC5CA1E3D4C5125C97B37A1F5322C2E4463F7EB92713544EB1
+0D06FE4D23BDE0820440F126F67D4E305C5793D7B3B0C04C1612702FBBC3EDEE
+B82F047462AB0E38CB7933FB7A2B939F43976832C7FB90507AD55C5DB6711BB6
+01622290982CD086D6A42FD506A460E7C1DB7CFE3BC9E4307AAD5EC874F5A517
+DE217DC82BE40CFCFDDC44787F71D921C7FDA4679DEC9DACBF17A3142ABF5DCD
+F9E640BCFC011B9CB38E0093AA5432E3D468FAF915DDFE924076DA6FE19A81D1
+158F7E756C483015DDEF6F2AF2FE5BC82EFFCA4B4E6CAF441154B6AEC5AF4B5D
+C61B919957D886979D0CB320F23AE98258C4FD861FA69BA8FD39E4E8C6171CB9
+D4D1095C65BD5B653B91C5A15DCD3096BD715216456114260530E483ECA9A8CA
+F587FA9AD60FF1DDBBAE43BB0BAC1C39367DA374182C74F2937B1C6FD1B7BEDE
+95DF3A267C40C160F845E3E98421E2EBCFFB030A26BD0D5750B05FAA8C5A72CA
+448A3213463DD4316768C4DE0AFA9B47DC2D9D10C52B9FC14AA5ACA08B83AA8F
+09EAD993ECAAA2D31B66B165A0EA8A204B03EEFE675FA0085EDA5FBBEAEF8690
+54643C7B2A345DA3E366AE0B7A7969471AE1384E868238A95158631F86133C63
+B4A70244B216403AEE0600F77D3142CE0BBED4FA9A4BF6D956A86F180606B9C9
+025F7B30E29634708280E7BC03A0FA51BB17BE5CB94D257F1DB542F13E0970CE
+42DFFB1307E6F5F7EBCD9292D03850748AB0D22D7F5314E3654D5EFCADBF68FC
+751559760FDEF4F078E57F2CCBC3F99F64681648B38E9F26E5B0BF98BD0E7DD5
+6CB55D07A202A2C9A2817E4240E4B00DC0E60C26D4338C7E7C2907FF1CD34127
+5E048B5F55AD11F69843856459750DEA7D7EF76DB9A50F487F6BA4788F3680AF
+29621BDA707B3C138F9ABE2F5B7E5D7C3119A5F535FE575E82F65E97AE078020
+36FD51A751CDDB98147074CD6481A96145FCF656DE28FC3A00573FBE06FC429F
+E06F918AB3AA095DD3B9DBCDBEBDE69DB459600C46B50D49A563DDCE26A1A5AC
+504E07BBC2A48D858B51F51B7A06D56695F8BAFC0518AD8B21E7DCF5C2047EB9
+FC8995D139FB37794ABD9A7387DAC9FD9F2F3E80578928E3F1AB70A50F16591A
+034E29CD0C6AC1BD531CFF53478828A1F9A0BE3DFFEEEFAA0C7EF53750427ACE
+2BC4A5591FCFF121A9A62CA0EB1069ADB7E51CFFDC8902361575E0E71700DC8C
+86B43E1D697A8847C210C5FBB66E2B4E306AF90E0CB97D7FA008F76B1E6B489A
+4CABB68EDBB9AFF604E3B355730436FC1A25F72C1FC4DCF6B1C40EA52D3AD46C
+BB47EE3098E12CB98015F18B45AF2DF2712CD1187661F4EA24106FA51DD90262
+4FE3EB0D95B3EA446502A33091F2004D1C8F001DBAA7AE9FCAC74B0704D04902
+F832B25C7FBB9304D834A18F22259B81A0C400FE9CC0D811E58F8C3E1D107129
+D1CA233FD481FC6C03BAE7D00AAB2AAED4CEC3A7C8ECB087DF77065D1328A4EB
+912CA8AFE5C7DEF3C5A3F42E40E6E60FB241F3FB6A11B5ACF4E6005471881DE6
+156BAE8ED4C75CE8FAC9C3A9B3DA52B07F09C28FF67BAF5767EAF202B3D5FDB8
+1EFAA98B59BF281BCFD45CDEC7707ED4167491F716322CB08248A65BED4FF628
+44AE351D9657BD03E41625E2D855D06444D441CF01330EF8FEEA0D42E0A054B9
+A05A5ADB518607299CECE64A59D52B2902DAB10F37A9F6DA24D95619860A69DE
+D9915F414A8B63F8931099AC051C8671F6891F2563FBF902D30734C23E647D7B
+A3FBAF4CEFA1F860B1EA1F2633E0E77665767CCB3332C311B8798E35557D3751
+919B770BD244FAC769980699F76C8E1B2D5BC85CC1DFE11017F0FD3878C60F4D
+5A33D97AFB822CE4CF8BB50E0B89D73560D05A9053053011E49084204D551707
+2D4356FE5ACE352BDF99638AA07603979AF946D33A96266D7646B724994305AA
+C231BCBF8B6D80A47464C242960127160C70E49121A04E986B4845402326C24A
+1D5394D26028FE87EB6A6374CB0D0242212E6F7D939487220BD6347FBDB68F34
+415C7438F92D016F3B1EA7429A18B31FA26FCD33B7E60255522272740E31E5A7
+EBFD72F9FE0B6D85C50D9B868E1052FB2197A68EF52B4E59D8439286C96E832F
+E01E2DA3EBF151FBABE3D39581D564BF8554C9FA2F3303BD5D0EEE6B2A739838
+37E67D38EBCDBDA0E5A784F4A7C165CB6ABBC00286AE34433766C3FFC6574B3B
+BE4B8D36DE246BAB3FA365A33697AB07DEFA881A347470C89951B92D2D820487
+8A6935CFD404E696C61B0BE3D16FB91D5316DED8A003FE55AAD565FBBA8D5928
+D973BA86AF7B9F1BE4C5F157053504D6695DEEE925FA8041E3F76CA7A3C37B3A
+B95C181C32E1466EC738C817369C6DB8364920C6F3FBA3BEE10E87B1AF334043
+200A789BD86697F54B344F11D528620B602AD2840C4755B32C4869DDB2DFBBC1
+F6863C0A4FB43835FA8620A2387E58E9CC430FC75162992E6FFB30A72B7686BA
+3392399A5F79492531EA995BC1BAD1344E5D1AA70C11E6
 0000000000000000000000000000000000000000000000000000000000000000
 0000000000000000000000000000000000000000000000000000000000000000
 0000000000000000000000000000000000000000000000000000000000000000
@@ -6070,9 +6070,9 @@ TeXDict begin 40258431 52099146 1000 600 600 (libtasn1.dvi)
 12[{}45 74.7198 /CMR9 rf /Fc 134[39 3[39 39 39 39 2[39
 39 39 39 2[39 39 2[39 3[39 97[{}13 74.7198 /CMSLTT10
 rf /Fd 134[39 39 39 39 39 39 39 39 1[39 39 39 39 39 39
-39 39 39 39 39 39 39 39 39 39 39 39 8[39 39 39 39 2[39
+1[39 39 39 39 39 39 39 39 39 39 39 8[39 39 39 39 2[39
 1[39 1[39 2[39 1[39 39 39 39 39 39 39 5[39 7[39 39 39
-1[39 39 39 39 2[39 39 39 39[{}52 74.7198 /CMTT9 rf /Fe
+1[39 39 39 39 2[39 39 39 39[{}51 74.7198 /CMTT9 rf /Fe
 133[40 4[51 35 36 39 3[51 76 25 2[25 1[45 1[42 51 40
 1[44 7[69 3[70 63 51 69 2[68 71 86 55 2[36 71 71 1[60
 70 66 65 69 6[25 58[{}32 90.9091 /CMB10 rf /Ff 133[52
@@ -6102,13 +6102,13 @@ rf /Fm 197[33 58[{}1 119.552 /CMMI12 rf /Fn 134[85 85
 45[{}18 119.552 /CMTT12 rf /Fq 134[71 71 97 71 75 52
 53 55 1[75 67 75 112 37 71 1[37 75 67 41 61 75 60 75
 65 11[103 94 75 100 1[92 1[105 128 81 1[69 50 105 106
-85 88 103 97 1[102 6[37 1[67 2[67 67 67 67 67 2[37 4[52
-52 27[75 12[{}51 119.552 /CMBX12 rf /Fr 131[91 1[40 48
-48 66 48 51 35 36 36 48 51 45 51 76 25 48 28 25 51 45
-28 40 51 40 51 45 25 2[25 45 25 56 68 68 93 68 68 66
-51 67 71 62 71 68 83 57 71 47 33 68 71 59 62 69 66 64
-68 1[43 1[71 1[25 25 45 45 45 45 45 45 45 45 45 45 45
-25 30 25 1[45 35 35 25 2[45 1[45 25 19[51 51 53 11[{}85
+85 88 103 97 1[102 6[37 2[67 1[67 67 67 67 67 67 1[37
+4[52 52 27[75 12[{}52 119.552 /CMBX12 rf /Fr 131[91 1[40
+48 48 66 48 51 35 36 36 48 51 45 51 76 25 48 28 25 51
+45 28 40 51 40 51 45 25 2[25 45 25 56 68 68 93 68 68
+66 51 67 71 62 71 68 83 57 71 47 33 68 71 59 62 69 66
+64 68 1[43 1[71 1[25 25 45 45 45 45 45 45 45 45 45 45
+45 25 30 25 1[45 35 35 25 2[45 1[45 25 19[51 51 53 11[{}85
 90.9091 /CMR10 rf /Fs 139[75 76 4[108 4[54 6[108 94 20[116
 26[97 49[{}8 172.154 /CMBX12 rf end
 %%EndProlog
@@ -6127,13 +6127,13 @@ ifelse
 TeXDict begin 1 0 bop 150 1318 a Fs(Libtasn1)p 150 1385
 3600 34 v 1035 1486 a Fr(Abstract)31 b(Syn)m(tax)f(Notation)j(One)d
 (\(ASN.1\))h(library)f(for)g(the)h(GNU)g(system)2638
-1594 y(for)f(v)m(ersion)h(4.8,)g(4)g(April)f(2016)150
+1594 y(for)f(v)m(ersion)h(4.9,)g(4)g(April)f(2016)150
 4795 y Fq(F)-11 b(abio)45 b(Fiorina)150 4928 y(Simon)g(Josefsson)150
 5061 y(Nik)l(os)h(Ma)l(vrogiannop)t(oulos)g(\()p Fp(help-libtasn1@)o
 (gn)o(u.o)o(rg)o Fq(\))p 150 5141 3600 17 v eop end
 %%Page: 2 2
 TeXDict begin 2 1 bop 150 4523 a Fr(This)24 b(man)m(ual)i(is)f(for)g
-(GNU)h(Libtasn1)f(\(v)m(ersion)h(4.8,)i(4)d(April)g(2016\),)k(whic)m(h)
+(GNU)h(Libtasn1)f(\(v)m(ersion)h(4.9,)i(4)d(April)g(2016\),)k(whic)m(h)
 c(is)g(a)h(library)e(for)h(Abstract)150 4633 y(Syn)m(tax)31
 b(Notation)h(One)e(\(ASN.1\))h(and)f(Distinguished)h(Enco)s(ding)e
 (Rules)i(\(DER\))g(manipulation.)150 4767 y(Cop)m(yrigh)m(t)602
@@ -6195,35 +6195,35 @@ h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h
 (:)f(:)47 b Fr(6)150 2327 y Fq(4)135 b(F)-11 b(unction)44
 b(reference)21 b Fm(:)g(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h
 (:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)66
-b Fq(8)275 2464 y Fr(4.1)92 b(ASN.1)30 b(sc)m(hema)i(functions)13
+b Fq(7)275 2464 y Fr(4.1)92 b(ASN.1)30 b(sc)m(hema)i(functions)13
 b Fl(:)i(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)
 h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g
-(:)h(:)f(:)h(:)f(:)g(:)44 b Fr(8)275 2574 y(4.2)92 b(ASN.1)30
+(:)h(:)f(:)h(:)f(:)g(:)44 b Fr(7)275 2574 y(4.2)92 b(ASN.1)30
 b(\014eld)g(functions)12 b Fl(:)k(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h
 (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
 h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)43
-b Fr(8)275 2683 y(4.3)92 b(DER)30 b(functions)17 b Fl(:)e(:)g(:)h(:)f
+b Fr(7)275 2683 y(4.3)92 b(DER)30 b(functions)17 b Fl(:)e(:)g(:)h(:)f
 (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
 g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g
-(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)46 b Fr(15)275 2793
+(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)46 b Fr(14)275 2793
 y(4.4)92 b(Error)29 b(handling)h(functions)23 b Fl(:)16
 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h
 (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)
-f(:)g(:)54 b Fr(22)275 2902 y(4.5)92 b(Auxilliary)31
+f(:)g(:)54 b Fr(20)275 2902 y(4.5)92 b(Auxilliary)31
 b(functions)19 b Fl(:)14 b(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h
 (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)
 f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)48
-b Fr(22)150 3145 y Fq(App)t(endix)c(A)160 b(Cop)l(ying)45
+b Fr(21)150 3145 y Fq(App)t(endix)c(A)160 b(Cop)l(ying)45
 b(Information)25 b Fm(:)c(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f
-(:)70 b Fq(24)275 3282 y Fr(A.1)91 b(GNU)31 b(F)-8 b(ree)32
+(:)70 b Fq(22)275 3282 y Fr(A.1)91 b(GNU)31 b(F)-8 b(ree)32
 b(Do)s(cumen)m(tation)g(License)21 b Fl(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h
 (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)
-f(:)h(:)f(:)51 b Fr(24)150 3524 y Fq(Concept)45 b(Index)18
+f(:)h(:)f(:)51 b Fr(22)150 3524 y Fq(Concept)45 b(Index)18
 b Fm(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
 h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
-(:)h(:)f(:)63 b Fq(32)150 3794 y(F)-11 b(unction)44 b(and)h(Data)h
+(:)h(:)f(:)63 b Fq(30)150 3794 y(F)-11 b(unction)44 b(and)h(Data)h
 (Index)24 b Fm(:)19 b(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f
-(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)69 b Fq(33)p
+(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)69 b Fq(31)p
 eop end
 %%Page: 1 4
 TeXDict begin 1 3 bop 150 -116 a Fr(Chapter)30 b(1:)41
@@ -6345,9 +6345,9 @@ b(simple)f(t)m(yp)s(es)h(lik)m(e)g Fk(OCTET)d(STRING)h
 Fr(the)h(simple)g(parsing)g(functions)g(listed)h(b)s(elo)m(w)f(ma)m(y)h
 (b)s(e)f(used)150 568 y(instead.)225 702 y Fo(\017)60
 b Fr([asn1)p 538 702 28 4 v 41 w(deco)s(de)p 849 702
-V 40 w(simple)p 1142 702 V 40 w(der],)30 b(page)h(21)225
+V 40 w(simple)p 1142 702 V 40 w(der],)30 b(page)h(20)225
 837 y Fo(\017)60 b Fr([asn1)p 538 837 V 41 w(enco)s(de)p
-849 837 V 40 w(simple)p 1142 837 V 40 w(der],)30 b(page)h(16)150
+849 837 V 40 w(simple)p 1142 837 V 40 w(der],)30 b(page)h(15)150
 1069 y Fq(2.4)68 b(Library)45 b(Notes)150 1229 y Fr(The)30
 b(header)g(\014le)h(of)f(this)g(library)g(is)h Fk(libtasn1.h)p
 Fr(.)275 1363 y(The)d(main)g(t)m(yp)s(e)h(used)f(in)h(it)g(is)g
@@ -7204,69 +7204,73 @@ b(a)g(length)f(\014eld)g(from)g(BER)g(data.)41 b(The)30
 b(di\013erence)h(to)g Fk(asn1_get_length_der\(\))24 b
 Fr(is)390 408 y(that)31 b(this)f(function)g(will)h(return)e(a)i(length)
 g(ev)m(en)g(if)f(the)h(v)-5 b(alue)31 b(has)f(inde\014nite)g(enco)s
-(ding.)390 543 y Fe(Returns:)40 b Fr(Return)27 b(the)i(deco)s(ded)g
+(ding.)390 537 y Fe(Returns:)40 b Fr(Return)27 b(the)i(deco)s(ded)g
 (length)g(v)-5 b(alue,)30 b(or)e(negativ)m(e)j(v)-5 b(alue)29
-b(when)f(the)h(v)-5 b(alue)29 b(w)m(as)g(to)s(o)390 653
-y(big.)390 787 y Fe(Since:)41 b Fr(2.0)150 986 y Fj(asn1)p
-396 986 37 5 v 55 w(get)p 616 986 V 54 w(o)s(ctet)p 941
-986 V 53 w(der)3350 1183 y Fr([F)-8 b(unction])-3599
+b(when)f(the)h(v)-5 b(alue)29 b(w)m(as)g(to)s(o)390 646
+y(big.)390 774 y Fe(Since:)41 b Fr(2.0)150 960 y Fj(asn1)p
+396 960 37 5 v 55 w(get)p 616 960 V 54 w(o)s(ctet)p 941
+960 V 53 w(der)3350 1144 y Fr([F)-8 b(unction])-3599
 b Fi(int)53 b(asn1_get_octet_der)e Fh(\()p Fg(const)31
 b(unsigned)f(c)m(har)g(*)h Ff(der)p Fg(,)h(in)m(t)f Ff(der_len)p
-Fg(,)h(in)m(t)565 1293 y(*)f Ff(ret_len)p Fg(,)i(unsigned)c(c)m(har)i
+Fg(,)h(in)m(t)565 1254 y(*)f Ff(ret_len)p Fg(,)i(unsigned)c(c)m(har)i
 (*)f Ff(str)p Fg(,)i(in)m(t)f Ff(str_size)p Fg(,)i(in)m(t)e(*)f
-Ff(str_len)p Fh(\))390 1402 y Fg(der)7 b Fr(:)40 b(DER)30
+Ff(str_len)p Fh(\))390 1364 y Fg(der)7 b Fr(:)40 b(DER)30
 b(data)h(to)g(deco)s(de)g(con)m(taining)h(the)e(OCTET)f(SEQUENCE.)390
-1537 y Fg(der)p 523 1537 28 4 v 40 w(len)p Fr(:)40 b(Length)31
-b(of)f(DER)h(data)g(to)g(deco)s(de.)390 1671 y Fg(ret)p
-507 1671 V 40 w(len)p Fr(:)41 b(Output)29 b(v)-5 b(ariable)32
-b(con)m(taining)f(the)g(length)g(of)f(the)h(DER)f(data.)390
-1806 y Fg(str)7 b Fr(:)40 b(Pre-allo)s(cated)33 b(output)d(bu\013er)f
-(to)i(put)f(deco)s(ded)g(OCTET)f(SEQUENCE)g(in.)390 1940
-y Fg(str)p 503 1940 V 40 w(size)5 b Fr(:)41 b(Length)31
-b(of)f(pre-allo)s(cated)j(output)d(bu\013er.)390 2075
-y Fg(str)p 503 2075 V 40 w(len)p Fr(:)41 b(Output)29
-b(v)-5 b(ariable)31 b(con)m(taining)h(the)f(length)f(of)h(the)f(OCTET)f
-(SEQUENCE.)390 2209 y(Extract)i(an)g(OCTET)d(SEQUENCE)i(from)f(DER)i
-(data.)390 2344 y Fe(Returns:)40 b Fr(Returns)30 b Fk(ASN1_SUCCESS)d
-Fr(on)j(success,)h(or)f(an)h(error.)150 2543 y Fj(asn1)p
-396 2543 37 5 v 55 w(get)p 616 2543 V 54 w(ob)7 b(ject)p
-1002 2543 V 54 w(id)p 1158 2543 V 54 w(der)3350 2740
-y Fr([F)-8 b(unction])-3599 b Fi(int)53 b(asn1_get_object_id_de)q(r)e
+1492 y Fg(der)p 523 1492 28 4 v 40 w(len)p Fr(:)40 b(The)30
+b(length)h(of)g(the)f Fk(der)g Fr(data)h(to)g(deco)s(de.)390
+1620 y Fg(ret)p 507 1620 V 40 w(len)p Fr(:)41 b(Output)29
+b(v)-5 b(ariable)32 b(con)m(taining)f(the)g(enco)s(ded)f(length)h(of)f
+(the)h(DER)f(data.)390 1748 y Fg(str)7 b Fr(:)40 b(Pre-allo)s(cated)33
+b(output)d(bu\013er)f(to)i(put)f(deco)s(ded)g(OCTET)f(SEQUENCE)g(in.)
+390 1876 y Fg(str)p 503 1876 V 40 w(size)5 b Fr(:)41
+b(Length)31 b(of)f(pre-allo)s(cated)j(output)d(bu\013er.)390
+2004 y Fg(str)p 503 2004 V 40 w(len)p Fr(:)57 b(Output)38
+b(v)-5 b(ariable)40 b(con)m(taining)g(the)f(length)g(of)g(the)g(con)m
+(ten)m(ts)h(of)f(the)g(OCTET)e(SE-)390 2113 y(QUENCE.)390
+2241 y(Extract)g(an)f(OCTET)e(SEQUENCE)h(from)h(DER)g(data.)58
+b(Note)37 b(that)g(this)f(function)g(exp)s(ects)390 2351
+y(the)31 b(DER)f(data)h(past)g(the)f(tag)i(\014eld,)e(i.e.,)i(the)e
+(length)h(and)f(con)m(ten)m(t)i(o)s(ctets.)390 2479 y
+Fe(Returns:)40 b Fr(Returns)30 b Fk(ASN1_SUCCESS)d Fr(on)j(success,)h
+(or)f(an)h(error.)150 2665 y Fj(asn1)p 396 2665 37 5
+v 55 w(get)p 616 2665 V 54 w(ob)7 b(ject)p 1002 2665
+V 54 w(id)p 1158 2665 V 54 w(der)3350 2849 y Fr([F)-8
+b(unction])-3599 b Fi(int)53 b(asn1_get_object_id_de)q(r)e
 Fh(\()p Fg(const)32 b(unsigned)d(c)m(har)i(*)f Ff(der)p
-Fg(,)i(in)m(t)565 2849 y Ff(der_len)p Fg(,)h(in)m(t)e(*)f
+Fg(,)i(in)m(t)565 2959 y Ff(der_len)p Fg(,)h(in)m(t)e(*)f
 Ff(ret_len)p Fg(,)j(c)m(har)e(*)g Ff(str)p Fg(,)g(in)m(t)g
-Ff(str_size)p Fh(\))390 2959 y Fg(der)7 b Fr(:)40 b(DER)30
+Ff(str_size)p Fh(\))390 3068 y Fg(der)7 b Fr(:)40 b(DER)30
 b(data)h(to)g(deco)s(de)g(con)m(taining)h(the)e(OBJECT)g(IDENTIFIER)390
-3093 y Fg(der)p 523 3093 28 4 v 40 w(len)p Fr(:)40 b(Length)31
-b(of)f(DER)h(data)g(to)g(deco)s(de.)390 3228 y Fg(ret)p
-507 3228 V 40 w(len)p Fr(:)41 b(Output)29 b(v)-5 b(ariable)32
+3196 y Fg(der)p 523 3196 28 4 v 40 w(len)p Fr(:)40 b(Length)31
+b(of)f(DER)h(data)g(to)g(deco)s(de.)390 3324 y Fg(ret)p
+507 3324 V 40 w(len)p Fr(:)41 b(Output)29 b(v)-5 b(ariable)32
 b(con)m(taining)f(the)g(length)g(of)f(the)h(DER)f(data.)390
-3362 y Fg(str)7 b Fr(:)40 b(Pre-allo)s(cated)33 b(output)d(bu\013er)f
+3452 y Fg(str)7 b Fr(:)40 b(Pre-allo)s(cated)33 b(output)d(bu\013er)f
 (to)i(put)f(the)g(textual)i(ob)5 b(ject)31 b(id)f(in.)390
-3497 y Fg(str)p 503 3497 V 40 w(size)5 b Fr(:)41 b(Length)31
-b(of)f(pre-allo)s(cated)j(output)d(bu\013er.)390 3631
+3581 y Fg(str)p 503 3581 V 40 w(size)5 b Fr(:)41 b(Length)31
+b(of)f(pre-allo)s(cated)j(output)d(bu\013er.)390 3709
 y(Con)m(v)m(erts)h(a)g(DER)f(enco)s(ded)g(ob)5 b(ject)32
-b(iden)m(ti\014er)e(to)h(its)g(textual)h(form.)390 3766
+b(iden)m(ti\014er)e(to)h(its)g(textual)h(form.)390 3837
 y Fe(Returns:)40 b Fk(ASN1_SUCCESS)27 b Fr(on)k(success,)g(or)f(an)g
-(error.)150 3965 y Fj(asn1)p 396 3965 37 5 v 55 w(get)p
-616 3965 V 54 w(bit)p 820 3965 V 54 w(der)3350 4162 y
+(error.)150 4023 y Fj(asn1)p 396 4023 37 5 v 55 w(get)p
+616 4023 V 54 w(bit)p 820 4023 V 54 w(der)3350 4207 y
 Fr([F)-8 b(unction])-3599 b Fi(int)53 b(asn1_get_bit_der)e
 Fh(\()p Fg(const)31 b(unsigned)e(c)m(har)i(*)g Ff(der)p
-Fg(,)g(in)m(t)g Ff(der_len)p Fg(,)i(in)m(t)d(*)565 4271
+Fg(,)g(in)m(t)g Ff(der_len)p Fg(,)i(in)m(t)d(*)565 4316
 y Ff(ret_len)p Fg(,)j(unsigned)c(c)m(har)i(*)g Ff(str)p
 Fg(,)g(in)m(t)g Ff(str_size)p Fg(,)i(in)m(t)e(*)g Ff(bit_len)p
-Fh(\))390 4381 y Fg(der)7 b Fr(:)40 b(DER)30 b(data)h(to)g(deco)s(de)g
-(con)m(taining)h(the)e(BIT)h(SEQUENCE.)390 4515 y Fg(der)p
-523 4515 28 4 v 40 w(len)p Fr(:)40 b(Length)31 b(of)f(DER)h(data)g(to)g
-(deco)s(de.)390 4650 y Fg(ret)p 507 4650 V 40 w(len)p
+Fh(\))390 4426 y Fg(der)7 b Fr(:)40 b(DER)30 b(data)h(to)g(deco)s(de)g
+(con)m(taining)h(the)e(BIT)h(SEQUENCE.)390 4554 y Fg(der)p
+523 4554 28 4 v 40 w(len)p Fr(:)40 b(Length)31 b(of)f(DER)h(data)g(to)g
+(deco)s(de.)390 4682 y Fg(ret)p 507 4682 V 40 w(len)p
 Fr(:)41 b(Output)29 b(v)-5 b(ariable)32 b(con)m(taining)f(the)g(length)
-g(of)f(the)h(DER)f(data.)390 4784 y Fg(str)7 b Fr(:)40
+g(of)f(the)h(DER)f(data.)390 4810 y Fg(str)7 b Fr(:)40
 b(Pre-allo)s(cated)33 b(output)d(bu\013er)f(to)i(put)f(deco)s(ded)g
-(BIT)g(SEQUENCE)f(in.)390 4919 y Fg(str)p 503 4919 V
+(BIT)g(SEQUENCE)f(in.)390 4938 y Fg(str)p 503 4938 V
 40 w(size)5 b Fr(:)41 b(Length)31 b(of)f(pre-allo)s(cated)j(output)d
-(bu\013er.)390 5053 y Fg(bit)p 507 5053 V 40 w(len)p
+(bu\013er.)390 5066 y Fg(bit)p 507 5066 V 40 w(len)p
 Fr(:)41 b(Output)29 b(v)-5 b(ariable)31 b(con)m(taining)h(the)f(size)g
-(of)g(the)f(BIT)g(SEQUENCE.)390 5188 y(Extract)h(a)g(BIT)f(SEQUENCE)f
+(of)g(the)f(BIT)g(SEQUENCE.)390 5194 y(Extract)h(a)g(BIT)f(SEQUENCE)f
 (from)h(DER)h(data.)390 5322 y Fe(Returns:)40 b Fk(ASN1_SUCCESS)27
 b Fr(on)k(success,)g(or)f(an)g(error.)p eop end
 %%Page: 19 22
@@ -8208,34 +8212,34 @@ b(Public)f(License,)i(to)f(p)s(ermit)e(their)i(use)f(in)g(free)g(soft)m
 %%Page: 32 35
 TeXDict begin 32 34 bop 150 -116 a Fr(Concept)31 b(Index)2927
 b(32)150 299 y Fn(Concept)52 b(Index)150 638 y Fq(A)150
-758 y Fb(asn1Co)r(ding)27 b(program)10 b Fa(:)k(:)f(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
-g(:)g(:)g(:)37 b Fb(5)150 846 y(asn1Deco)r(ding)27 b(program)8
-b Fa(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 b Fb(6)150
-935 y(asn1P)n(arser)27 b(program)7 b Fa(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g
-(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
-g(:)g(:)g(:)h(:)33 b Fb(5)150 1024 y(ASN.1)25 b(sc)n(hema)14
-b Fa(:)g(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
-g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41
-b Fb(2)150 1266 y Fq(F)150 1385 y Fb(FDL,)26 b(GNU)f(F)-6
+757 y Fb(ASN.1)25 b(sc)n(hema)14 b Fa(:)g(:)f(:)g(:)g(:)g(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
+g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 b Fb(2)150 846 y(asn1Co)r(ding)27
+b(program)10 b Fa(:)k(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)37
+b Fb(5)150 935 y(asn1Deco)r(ding)27 b(program)8 b Fa(:)14
+b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 b Fb(6)150 1023 y(asn1P)n(arser)27
+b(program)7 b Fa(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33
+b Fb(5)150 1281 y Fq(F)150 1400 y Fb(FDL,)26 b(GNU)f(F)-6
 b(ree)25 b(Do)r(cumen)n(tation)h(License)20 b Fa(:)13
-b(:)g(:)g(:)g(:)h(:)f(:)45 b Fb(24)150 1474 y(F)-6 b(uture)25
+b(:)g(:)g(:)g(:)h(:)f(:)45 b Fb(22)150 1489 y(F)-6 b(uture)25
 b(dev)n(elopmen)n(ts)9 b Fa(:)k(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
 (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36
-b Fb(4)150 1733 y Fq(H)150 1852 y Fb(Header)26 b(\014le)f(libtasn1.h)18
+b Fb(4)150 1746 y Fq(H)150 1866 y Fb(Header)26 b(\014le)f(libtasn1.h)18
 b Fa(:)d(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)
 f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)45 b Fb(4)2025
-638 y Fq(M)2025 759 y Fb(Main)26 b(t)n(yp)r(e)f(asn1)p
-2550 759 24 4 v 34 w(no)r(de)19 b Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g
+638 y Fq(M)2025 760 y Fb(Main)26 b(t)n(yp)r(e)f(asn1)p
+2550 760 24 4 v 34 w(no)r(de)19 b Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g
 (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
-g(:)46 b Fb(4)2025 1021 y Fq(P)2025 1141 y Fb(P)n(orting)12
+g(:)46 b Fb(4)2025 1023 y Fq(P)2025 1145 y Fb(P)n(orting)12
 b Fa(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
 g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(1)2025 1403 y Fq(S)2025
-1524 y Fb(Supp)r(orted)24 b(ASN.1)h(t)n(yp)r(es,)h(list)g(of)14
+(:)f(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(1)2025 1408 y Fq(S)2025
+1530 y Fb(Supp)r(orted)24 b(ASN.1)h(t)n(yp)r(es,)h(list)g(of)14
 b Fa(:)g(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
-g(:)41 b Fb(2)2025 1785 y Fq(T)2025 1906 y Fb(threads)13
+g(:)41 b Fb(2)2025 1793 y Fq(T)2025 1915 y Fb(threads)13
 b Fa(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
 g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
 (:)g(:)g(:)h(:)f(:)g(:)g(:)40 b Fb(1)p eop end
@@ -8245,100 +8249,96 @@ b(and)f(Data)i(Index)2503 b(33)150 299 y Fn(F)-13 b(unction)52
 b(and)h(Data)i(Index)150 610 y Fd(asn1_array2tree)13
 b Fa(:)k(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
 g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40
-b Fb(9)150 697 y Fd(asn1_bit_der)22 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h
+b Fb(8)150 697 y Fd(asn1_bit_der)22 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h
 (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
-g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(16)150 785 y
+g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(15)150 785 y
 Fd(asn1_check_version)25 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
 g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47
-b Fb(22)150 872 y Fd(asn1_copy_node)14 b Fa(:)i(:)d(:)g(:)h(:)f(:)g(:)g
+b Fb(21)150 872 y Fd(asn1_copy_node)14 b Fa(:)i(:)d(:)g(:)h(:)f(:)g(:)g
 (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
-g(:)g(:)h(:)f(:)g(:)g(:)40 b Fb(11)150 959 y Fd(asn1_create_element)18
-b Fa(:)g(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)44 b Fb(10)150 1046
-y Fd(asn1_decode_simple_ber)10 b Fa(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37
-b Fb(21)150 1133 y Fd(asn1_decode_simple_der)10 b Fa(:)19
-b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
-g(:)g(:)g(:)g(:)37 b Fb(21)150 1220 y Fd(asn1_delete_element)25
+g(:)g(:)h(:)f(:)g(:)g(:)40 b Fb(10)150 959 y Fd(asn1_create_element)25
 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
 (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fb(9)150
-1308 y Fd(asn1_delete_structure)15 b Fa(:)j(:)13 b(:)g(:)g(:)h(:)f(:)g
+1046 y Fd(asn1_decode_simple_der)10 b Fa(:)19 b(:)13
+b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
+(:)g(:)g(:)37 b Fb(20)150 1133 y Fd(asn1_delete_element)25
+b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f
+(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fb(8)150
+1220 y Fd(asn1_delete_structure)15 b Fa(:)j(:)13 b(:)g(:)g(:)h(:)f(:)g
 (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)42
-b Fb(9)150 1395 y Fd(asn1_delete_structure2)13 b Fa(:)18
+b Fb(8)150 1308 y Fd(asn1_delete_structure2)13 b Fa(:)18
 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
-g(:)g(:)g(:)g(:)g(:)40 b Fb(9)150 1482 y Fd(asn1_der_coding)11
+g(:)g(:)g(:)g(:)g(:)40 b Fb(8)150 1395 y Fd(asn1_der_coding)11
 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f
 (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38
-b Fb(16)150 1569 y Fd(asn1_der_decoding)6 b Fa(:)17 b(:)c(:)g(:)h(:)f
+b Fb(15)150 1482 y Fd(asn1_der_decoding)6 b Fa(:)17 b(:)c(:)g(:)h(:)f
 (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
-g(:)g(:)g(:)g(:)h(:)32 b Fb(19)150 1656 y Fd(asn1_der_decoding_element)
+g(:)g(:)g(:)g(:)h(:)32 b Fb(18)150 1569 y Fd(asn1_der_decoding_element)
 26 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)46 b Fb(19)150 1743 y Fd(asn1_der_decoding_startEnd)18
+(:)f(:)g(:)46 b Fb(18)150 1656 y Fd(asn1_der_decoding_startEnd)18
 b Fa(:)g(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
-44 b Fb(20)150 1831 y Fd(asn1_der_decoding2)25 b Fa(:)13
+44 b Fb(19)150 1743 y Fd(asn1_der_decoding2)25 b Fa(:)13
 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fb(19)150 1918 y
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fb(17)150 1831 y
 Fd(asn1_dup_node)16 b Fa(:)g(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
 g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)43 b Fb(11)150 2005 y Fd(asn1_encode_simple_der)10
+(:)g(:)g(:)43 b Fb(10)150 1918 y Fd(asn1_encode_simple_der)10
 b Fa(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fb(16)150 2092 y Fd
+(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fb(15)150 2005 y Fd
 (asn1_expand_any_defined_by)18 b Fa(:)g(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(20)150 2179 y
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(19)150 2092 y
 Fd(asn1_expand_octet_string)28 b Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(21)150
-2267 y Fd(asn1_find_node)14 b Fa(:)i(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(19)150
+2179 y Fd(asn1_find_node)14 b Fa(:)i(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
 g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)40 b Fb(22)2025 610 y Fd(asn1_find_structure_from_oid)13
-b Fa(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)39
-b Fb(10)2025 697 y Fd(asn1_get_bit_der)9 b Fa(:)16 b(:)d(:)g(:)h(:)f(:)
-g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)35 b Fb(18)2025 785 y Fd(asn1_get_length_ber)18
-b Fa(:)f(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
-g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fb(17)2025 872 y
-Fd(asn1_get_length_der)18 b Fa(:)f(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45
-b Fb(17)2025 959 y Fd(asn1_get_object_id_der)10 b Fa(:)18
-b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)37 b Fb(18)2025 1046 y Fd(asn1_get_octet_der)25
+(:)f(:)g(:)g(:)40 b Fb(21)2025 610 y Fd(asn1_find_structure_from_oid)15
+b Fa(:)k(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
+42 b Fb(9)2025 697 y Fd(asn1_get_bit_der)9 b Fa(:)16
+b(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
+(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 b Fb(17)2025
+785 y Fd(asn1_get_length_ber)18 b Fa(:)f(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45
+b Fb(16)2025 872 y Fd(asn1_get_length_der)18 b Fa(:)f(:)c(:)h(:)f(:)g
+(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
+g(:)g(:)45 b Fb(16)2025 959 y Fd(asn1_get_octet_der)25
 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fb(18)2025
-1133 y Fd(asn1_get_tag_der)9 b Fa(:)16 b(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)
+(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fb(17)2025
+1046 y Fd(asn1_get_tag_der)9 b Fa(:)16 b(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)
 g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
-(:)f(:)g(:)35 b Fb(17)2025 1220 y Fd(asn1_length_der)11
+(:)f(:)g(:)35 b Fb(16)2025 1133 y Fd(asn1_length_der)11
 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h
 (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)38
-b Fb(15)2025 1308 y Fd(asn1_number_of_elements)8 b Fa(:)18
-b(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
-g(:)g(:)h(:)34 b Fb(10)2025 1395 y Fd(asn1_octet_der)14
+b Fb(14)2025 1220 y Fd(asn1_number_of_elements)10 b Fa(:)18
+b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
+g(:)h(:)f(:)g(:)37 b Fb(9)2025 1308 y Fd(asn1_octet_der)14
 b Fa(:)i(:)d(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
 g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40
-b Fb(15)2025 1482 y Fd(asn1_parser2array)8 b Fa(:)17
+b Fb(14)2025 1395 y Fd(asn1_parser2array)8 b Fa(:)17
 b(:)c(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fb(8)2025
-1569 y Fd(asn1_parser2tree)11 b Fa(:)16 b(:)d(:)h(:)f(:)g(:)g(:)g(:)g
+(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fb(7)2025
+1482 y Fd(asn1_parser2tree)11 b Fa(:)16 b(:)d(:)h(:)f(:)g(:)g(:)g(:)g
 (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)
-f(:)g(:)g(:)g(:)38 b Fb(8)2025 1656 y Fd(asn1_perror)24
+f(:)g(:)g(:)g(:)38 b Fb(7)2025 1569 y Fd(asn1_perror)24
 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
 (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
-48 b Fb(22)2025 1743 y Fd(asn1_print_structure)16 b Fa(:)h(:)c(:)g(:)g
-(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
-g(:)g(:)42 b Fb(10)2025 1831 y Fd(asn1_read_node_value)16
+48 b Fb(20)2025 1656 y Fd(asn1_print_structure)18 b Fa(:)f(:)c(:)g(:)h
+(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)
+g(:)g(:)g(:)45 b Fb(9)2025 1743 y Fd(asn1_read_node_value)16
 b Fa(:)h(:)c(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
-g(:)g(:)g(:)h(:)f(:)g(:)g(:)42 b Fb(15)2025 1918 y Fd(asn1_read_tag)16
+g(:)g(:)g(:)h(:)f(:)g(:)g(:)42 b Fb(14)2025 1831 y Fd(asn1_read_tag)16
 b Fa(:)g(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
 g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43
-b Fb(15)2025 2005 y Fd(asn1_read_value)11 b Fa(:)17 b(:)c(:)g(:)g(:)g
+b Fb(14)2025 1918 y Fd(asn1_read_value)11 b Fa(:)17 b(:)c(:)g(:)g(:)g
 (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
-g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fb(13)2025 2092 y Fd
+g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fb(12)2025 2005 y Fd
 (asn1_read_value_type)16 b Fa(:)h(:)c(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
 (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)42
-b Fb(14)2025 2179 y Fd(asn1_strerror)16 b Fa(:)g(:)d(:)g(:)h(:)f(:)g(:)
+b Fb(13)2025 2092 y Fd(asn1_strerror)16 b Fa(:)g(:)d(:)g(:)h(:)f(:)g(:)
 g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
-(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fb(22)2025 2267 y
+(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fb(20)2025 2179 y
 Fd(asn1_write_value)9 b Fa(:)16 b(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
 (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
-g(:)35 b Fb(11)p eop end
+g(:)35 b Fb(10)p eop end
 %%Trailer
 
 userdict /end-hook known{end-hook}if
index e142e52..22fe3d8 100644 (file)
@@ -10,17 +10,19 @@ asn1_get_octet_der \- API function
 .IP "const unsigned char * der" 12
 DER data to decode containing the OCTET SEQUENCE.
 .IP "int der_len" 12
-Length of DER data to decode.
+The length of the  \fIder\fP data to decode.
 .IP "int * ret_len" 12
-Output variable containing the length of the DER data.
+Output variable containing the encoded length of the DER data.
 .IP "unsigned char * str" 12
 Pre\-allocated output buffer to put decoded OCTET SEQUENCE in.
 .IP "int str_size" 12
 Length of pre\-allocated output buffer.
 .IP "int * str_len" 12
-Output variable containing the length of the OCTET SEQUENCE.
+Output variable containing the length of the contents of the OCTET SEQUENCE.
 .SH "DESCRIPTION"
-Extract an OCTET SEQUENCE from DER data.
+Extract an OCTET SEQUENCE from DER data. Note that this function
+expects the DER data past the tag field, i.e., the length and
+content octets.
 .SH "RETURNS"
 Returns \fBASN1_SUCCESS\fP on success, or an error.
 .SH COPYRIGHT
index b76228e..45609da 100644 (file)
@@ -1,4 +1,4 @@
 @set UPDATED 4 April 2016
 @set UPDATED-MONTH April 2016
-@set EDITION 4.8
-@set VERSION 4.8
+@set EDITION 4.9
+@set VERSION 4.9
index 14a8422..5376533 100644 (file)
@@ -3,17 +3,19 @@
 @deftypefun {int} {asn1_get_octet_der} (const unsigned char * @var{der}, int @var{der_len}, int * @var{ret_len}, unsigned char * @var{str}, int @var{str_size}, int * @var{str_len})
 @var{der}: DER data to decode containing the OCTET SEQUENCE.
 
-@var{der_len}: Length of DER data to decode.
+@var{der_len}: The length of the  @code{der} data to decode.
 
-@var{ret_len}: Output variable containing the length of the DER data.
+@var{ret_len}: Output variable containing the encoded length of the DER data.
 
 @var{str}: Pre-allocated output buffer to put decoded OCTET SEQUENCE in.
 
 @var{str_size}: Length of pre-allocated output buffer.
 
-@var{str_len}: Output variable containing the length of the OCTET SEQUENCE.
+@var{str_len}: Output variable containing the length of the contents of the OCTET SEQUENCE.
 
-Extract an OCTET SEQUENCE from DER data.
+Extract an OCTET SEQUENCE from DER data. Note that this function
+expects the DER data past the tag field, i.e., the length and
+content octets.
 
 @strong{Returns:} Returns @code{ASN1_SUCCESS}  on success, or an error.
 @end deftypefun
index 7c04d30..b9a3003 100644 (file)
@@ -56,17 +56,19 @@ the value was too big.
 @deftypefun {int} {asn1_get_octet_der} (const unsigned char * @var{der}, int @var{der_len}, int * @var{ret_len}, unsigned char * @var{str}, int @var{str_size}, int * @var{str_len})
 @var{der}: DER data to decode containing the OCTET SEQUENCE.
 
-@var{der_len}: Length of DER data to decode.
+@var{der_len}: The length of the  @code{der} data to decode.
 
-@var{ret_len}: Output variable containing the length of the DER data.
+@var{ret_len}: Output variable containing the encoded length of the DER data.
 
 @var{str}: Pre-allocated output buffer to put decoded OCTET SEQUENCE in.
 
 @var{str_size}: Length of pre-allocated output buffer.
 
-@var{str_len}: Output variable containing the length of the OCTET SEQUENCE.
+@var{str_len}: Output variable containing the length of the contents of the OCTET SEQUENCE.
 
-Extract an OCTET SEQUENCE from DER data.
+Extract an OCTET SEQUENCE from DER data. Note that this function
+expects the DER data past the tag field, i.e., the length and
+content octets.
 
 @strong{Returns:} Returns @code{ASN1_SUCCESS}  on success, or an error.
 @end deftypefun
index b76228e..45609da 100644 (file)
@@ -1,4 +1,4 @@
 @set UPDATED 4 April 2016
 @set UPDATED-MONTH April 2016
-@set EDITION 4.8
-@set VERSION 4.8
+@set EDITION 4.9
+@set VERSION 4.9
index 0c0f69c..7141df7 100644 (file)
@@ -337,7 +337,7 @@ _asn1_objectid_der (unsigned char *str, unsigned char *der, int *der_len)
   int len_len, counter, k, first, max_len;
   char *temp, *n_end, *n_start;
   unsigned char bit7;
-  unsigned long val, val1 = 0;
+  uint64_t val, val1 = 0;
   int str_len = _asn1_strlen (str);
 
   max_len = *der_len;
@@ -355,7 +355,7 @@ _asn1_objectid_der (unsigned char *str, unsigned char *der, int *der_len)
   while ((n_end = strchr (n_start, '.')))
     {
       *n_end = 0;
-      val = strtoul (n_start, NULL, 10);
+      val = _asn1_strtou64 (n_start, NULL, 10);
       counter++;
 
       if (counter == 1)
@@ -369,7 +369,7 @@ _asn1_objectid_der (unsigned char *str, unsigned char *der, int *der_len)
       else
        {
          first = 0;
-         for (k = 4; k >= 0; k--)
+         for (k = sizeof(val); k >= 0; k--)
            {
              bit7 = (val >> (k * 7)) & 0x7F;
              if (bit7 || first || !k)
@@ -757,7 +757,7 @@ _asn1_ordering_set (unsigned char *der, int der_len, asn1_node node)
       if (err != ASN1_SUCCESS)
        goto error;
 
-      t = class << 24;
+      t = ((unsigned int)class) << 24;
       p_vet->value = t | tag;
       counter += len2;
 
index e5513a3..2cd9ac3 100644 (file)
@@ -384,7 +384,8 @@ _asn1_get_time_der (unsigned type, const unsigned char *der, int der_len, int *r
  * @str: Pre-allocated output buffer to put the textual object id in.
  * @str_size: Length of pre-allocated output buffer.
  *
- * Converts a DER encoded object identifier to its textual form.
+ * Converts a DER encoded object identifier to its textual form. This
+ * function expects the DER object identifier without the tag.
  *
  * Returns: %ASN1_SUCCESS on success, or an error.
  **/
@@ -395,7 +396,7 @@ asn1_get_object_id_der (const unsigned char *der, int der_len, int *ret_len,
   int len_len, len, k;
   int leading;
   char temp[LTOSTR_MAX_SIZE];
-  unsigned long val, val1;
+  uint64_t val, val1;
 
   *ret_len = 0;
   if (str && str_size > 0)
@@ -1361,7 +1362,15 @@ asn1_der_decoding2 (asn1_node *element, const void *ider, int *max_ider_len,
                        {       /* indefinite length method */
                          p->tmp_ival = -1;
                        }
+
                      p2 = p->down;
+                      if (p2 == NULL)
+                       {
+                         result = ASN1_DER_ERROR;
+                          warn();
+                         goto cleanup;
+                       }
+
                      while ((type_field (p2->type) == ASN1_ETYPE_TAG)
                             || (type_field (p2->type) == ASN1_ETYPE_SIZE))
                        p2 = p2->right;
@@ -1532,11 +1541,6 @@ asn1_der_decoding (asn1_node * element, const void *ider, int ider_len,
   return asn1_der_decoding2 (element, ider, &ider_len, 0, errorDescription);
 }
 
-#define FOUND        1
-#define SAME_BRANCH  2
-#define OTHER_BRANCH 3
-#define EXIT         4
-
 /**
  * asn1_der_decoding_element:
  * @structure: pointer to an ASN1 structure
index dceb8ba..b7a0905 100644 (file)
@@ -152,7 +152,10 @@ _asn1_append_sequence_set (asn1_node node, struct node_tail_cache_st *pcache)
   while ((type_field (p->type) == ASN1_ETYPE_TAG)
         || (type_field (p->type) == ASN1_ETYPE_SIZE))
     p = p->right;
+
   p2 = _asn1_copy_structure3 (p);
+  if (p2 == NULL)
+    return ASN1_GENERIC_ERROR;
 
   if (pcache == NULL || pcache->tail == NULL || pcache->head != node)
     {
index f1f1302..7d2eea3 100644 (file)
--- a/lib/int.h
+++ b/lib/int.h
@@ -118,6 +118,12 @@ extern const tag_and_class_st _asn1_tags[];
 #define _asn1_strcpy(a,b) strcpy((char *)a, (const char *)b)
 #define _asn1_strcat(a,b) strcat((char *)a, (const char *)b)
 
+#if SIZEOF_UNSIGNED_LONG_INT == 8
+# define _asn1_strtou64(n,e,b) strtoul((const char *) n, e, b)
+#else
+# define _asn1_strtou64(n,e,b) strtoull((const char *) n, e, b)
+#endif
+
 #define MAX_LOG_SIZE 1024      /* maximum number of characters of a log message */
 
 /* Define used for visiting trees. */
index aa9e8a4..5c4340f 100644 (file)
@@ -44,7 +44,7 @@ extern "C"
 {
 #endif
 
-#define ASN1_VERSION "4.8"
+#define ASN1_VERSION "4.9"
 
 #if defined(__GNUC__) && !defined(ASN1_INTERNAL_BUILD)
 # define _ASN1_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
index 52700c6..2285b20 100644 (file)
@@ -549,9 +549,9 @@ _asn1_delete_list_and_nodes (void)
 
 
 char *
-_asn1_ltostr (long v, char str[LTOSTR_MAX_SIZE])
+_asn1_ltostr (int64_t v, char str[LTOSTR_MAX_SIZE])
 {
-  long d, r;
+  int64_t d, r;
   char temp[LTOSTR_MAX_SIZE];
   int count, k, start;
 
index 10b864b..9f91833 100644 (file)
@@ -54,7 +54,7 @@ void _asn1_delete_list_and_nodes (void);
 
 /* Max 64-bit integer length is 20 chars + 1 for sign + 1 for null termination */
 #define LTOSTR_MAX_SIZE 22
-char *_asn1_ltostr (long v, char str[LTOSTR_MAX_SIZE]);
+char *_asn1_ltostr (int64_t v, char str[LTOSTR_MAX_SIZE]);
 
 asn1_node _asn1_find_up (asn1_node node);
 
index b52e791..078963e 100644 (file)
@@ -142,14 +142,18 @@ main (int argc, char *argv[])
       usage (EXIT_FAILURE);
     }
 
-  inputFileAsnName = (char *) malloc (strlen (argv[optind]) + 1);
-  strcpy (inputFileAsnName, argv[optind]);
+  inputFileAsnName = strdup(argv[optind]);
+  inputFileDerName = strdup(argv[optind + 1]);
+  typeName = strdup(argv[optind + 2]);
 
-  inputFileDerName = (char *) malloc (strlen (argv[optind + 1]) + 1);
-  strcpy (inputFileDerName, argv[optind + 1]);
-
-  typeName = (char *) malloc (strlen (argv[optind + 2]) + 1);
-  strcpy (typeName, argv[optind + 2]);
+  if (!(inputFileAsnName && inputFileDerName && typeName))
+    {
+      fprintf(stderr, "allocation failed\n");
+      free(inputFileAsnName);
+      free(inputFileDerName);
+      free(typeName);
+      exit(1);
+    }
 
   asn1_result =
     asn1_parser2tree (inputFileAsnName, &definitions, errorDescription);
index d637ce0..379525e 100644 (file)
@@ -54,13 +54,13 @@ MOSTLYCLEANFILES = Test_parser_ERROR.asn
 check_PROGRAMS = Test_parser Test_tree Test_encoding Test_indefinite \
        Test_errors Test_simple Test_overflow Test_strings Test_choice \
        Test_encdec copynode coding-decoding2 strict-der Test_choice_ocsp \
-       ocsp-basic-response octet-string
+       ocsp-basic-response octet-string coding-long-oid object-id-decoding
 
 TESTS = Test_parser Test_tree Test_encoding Test_indefinite    \
        Test_errors Test_simple Test_overflow crlf threadsafety \
        Test_strings Test_choice Test_encdec copynode coding-decoding2 \
        strict-der Test_choice_ocsp decoding decoding-invalid-x509 \
-       ocsp-basic-response octet-string
+       ocsp-basic-response octet-string coding-long-oid object-id-decoding
 
 TESTS_ENVIRONMENT = \
        ASN1PARSER=$(srcdir)/Test_parser.asn \
index c1ad745..f51866d 100644 (file)
@@ -111,7 +111,8 @@ check_PROGRAMS = Test_parser$(EXEEXT) Test_tree$(EXEEXT) \
        Test_choice$(EXEEXT) Test_encdec$(EXEEXT) copynode$(EXEEXT) \
        coding-decoding2$(EXEEXT) strict-der$(EXEEXT) \
        Test_choice_ocsp$(EXEEXT) ocsp-basic-response$(EXEEXT) \
-       octet-string$(EXEEXT)
+       octet-string$(EXEEXT) coding-long-oid$(EXEEXT) \
+       object-id-decoding$(EXEEXT)
 TESTS = Test_parser$(EXEEXT) Test_tree$(EXEEXT) Test_encoding$(EXEEXT) \
        Test_indefinite$(EXEEXT) Test_errors$(EXEEXT) \
        Test_simple$(EXEEXT) Test_overflow$(EXEEXT) crlf threadsafety \
@@ -119,7 +120,8 @@ TESTS = Test_parser$(EXEEXT) Test_tree$(EXEEXT) Test_encoding$(EXEEXT) \
        Test_encdec$(EXEEXT) copynode$(EXEEXT) \
        coding-decoding2$(EXEEXT) strict-der$(EXEEXT) \
        Test_choice_ocsp$(EXEEXT) decoding decoding-invalid-x509 \
-       ocsp-basic-response$(EXEEXT) octet-string$(EXEEXT)
+       ocsp-basic-response$(EXEEXT) octet-string$(EXEEXT) \
+       coding-long-oid$(EXEEXT) object-id-decoding$(EXEEXT)
 subdir = tests
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/lib/glm4/gnulib-comp.m4 \
@@ -231,10 +233,18 @@ coding_decoding2_SOURCES = coding-decoding2.c
 coding_decoding2_OBJECTS = coding-decoding2.$(OBJEXT)
 coding_decoding2_LDADD = $(LDADD)
 coding_decoding2_DEPENDENCIES = ../lib/libtasn1.la ../gl/libgnu.la
+coding_long_oid_SOURCES = coding-long-oid.c
+coding_long_oid_OBJECTS = coding-long-oid.$(OBJEXT)
+coding_long_oid_LDADD = $(LDADD)
+coding_long_oid_DEPENDENCIES = ../lib/libtasn1.la ../gl/libgnu.la
 copynode_SOURCES = copynode.c
 copynode_OBJECTS = copynode.$(OBJEXT)
 copynode_LDADD = $(LDADD)
 copynode_DEPENDENCIES = ../lib/libtasn1.la ../gl/libgnu.la
+object_id_decoding_SOURCES = object-id-decoding.c
+object_id_decoding_OBJECTS = object-id-decoding.$(OBJEXT)
+object_id_decoding_LDADD = $(LDADD)
+object_id_decoding_DEPENDENCIES = ../lib/libtasn1.la ../gl/libgnu.la
 ocsp_basic_response_SOURCES = ocsp-basic-response.c
 ocsp_basic_response_OBJECTS = ocsp-basic-response.$(OBJEXT)
 ocsp_basic_response_LDADD = $(LDADD)
@@ -284,13 +294,15 @@ am__v_CCLD_1 =
 SOURCES = Test_choice.c Test_choice_ocsp.c Test_encdec.c \
        Test_encoding.c Test_errors.c Test_indefinite.c \
        Test_overflow.c Test_parser.c Test_simple.c Test_strings.c \
-       Test_tree.c coding-decoding2.c copynode.c \
-       ocsp-basic-response.c octet-string.c strict-der.c
+       Test_tree.c coding-decoding2.c coding-long-oid.c copynode.c \
+       object-id-decoding.c ocsp-basic-response.c octet-string.c \
+       strict-der.c
 DIST_SOURCES = Test_choice.c Test_choice_ocsp.c Test_encdec.c \
        Test_encoding.c Test_errors.c Test_indefinite.c \
        Test_overflow.c Test_parser.c Test_simple.c Test_strings.c \
-       Test_tree.c coding-decoding2.c copynode.c \
-       ocsp-basic-response.c octet-string.c strict-der.c
+       Test_tree.c coding-decoding2.c coding-long-oid.c copynode.c \
+       object-id-decoding.c ocsp-basic-response.c octet-string.c \
+       strict-der.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -1312,10 +1324,18 @@ coding-decoding2$(EXEEXT): $(coding_decoding2_OBJECTS) $(coding_decoding2_DEPEND
        @rm -f coding-decoding2$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(coding_decoding2_OBJECTS) $(coding_decoding2_LDADD) $(LIBS)
 
+coding-long-oid$(EXEEXT): $(coding_long_oid_OBJECTS) $(coding_long_oid_DEPENDENCIES) $(EXTRA_coding_long_oid_DEPENDENCIES) 
+       @rm -f coding-long-oid$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(coding_long_oid_OBJECTS) $(coding_long_oid_LDADD) $(LIBS)
+
 copynode$(EXEEXT): $(copynode_OBJECTS) $(copynode_DEPENDENCIES) $(EXTRA_copynode_DEPENDENCIES) 
        @rm -f copynode$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(copynode_OBJECTS) $(copynode_LDADD) $(LIBS)
 
+object-id-decoding$(EXEEXT): $(object_id_decoding_OBJECTS) $(object_id_decoding_DEPENDENCIES) $(EXTRA_object_id_decoding_DEPENDENCIES) 
+       @rm -f object-id-decoding$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(object_id_decoding_OBJECTS) $(object_id_decoding_LDADD) $(LIBS)
+
 ocsp-basic-response$(EXEEXT): $(ocsp_basic_response_OBJECTS) $(ocsp_basic_response_DEPENDENCIES) $(EXTRA_ocsp_basic_response_DEPENDENCIES) 
        @rm -f ocsp-basic-response$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(ocsp_basic_response_OBJECTS) $(ocsp_basic_response_LDADD) $(LIBS)
@@ -1346,7 +1366,9 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Test_strings.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Test_tree.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coding-decoding2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coding-long-oid.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copynode.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/object-id-decoding.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ocsp-basic-response.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/octet-string.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strict-der.Po@am__quote@
@@ -1711,6 +1733,20 @@ octet-string.log: octet-string$(EXEEXT)
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
        "$$tst" $(AM_TESTS_FD_REDIRECT)
+coding-long-oid.log: coding-long-oid$(EXEEXT)
+       @p='coding-long-oid$(EXEEXT)'; \
+       b='coding-long-oid'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+object-id-decoding.log: object-id-decoding$(EXEEXT)
+       @p='object-id-decoding$(EXEEXT)'; \
+       b='object-id-decoding'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
 .test.log:
        @p='$<'; \
        $(am__set_b); \
diff --git a/tests/coding-long-oid.c b/tests/coding-long-oid.c
new file mode 100644 (file)
index 0000000..bc2cd56
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2016 Free Software Foundation, Inc.
+ *
+ * This file is part of LIBTASN1.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libtasn1.h>
+
+/* This checks the decoding and re-encoding of OIDs which contain elements
+ * >= 2^32 bits.
+ */
+
+const unsigned char der_data[] =
+       "\x30\x82\x06\xdc\x30\x82\x05\xc4\xa0\x03\x02\x01\x02\x02\x08\x35"
+       "\x73\x8c\xaf\x21\xea\xbd\x2d\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7"
+       "\x0d\x01\x01\x05\x05\x00\x30\x81\x8e\x31\x0b\x30\x09\x06\x03\x55"
+       "\x04\x06\x13\x02\x55\x53\x31\x17\x30\x15\x06\x03\x55\x04\x08\x13"
+       "\x0e\x4e\x6f\x72\x74\x68\x20\x43\x61\x72\x6f\x6c\x69\x6e\x61\x31"
+       "\x10\x30\x0e\x06\x03\x55\x04\x07\x13\x07\x52\x61\x6c\x65\x69\x67"
+       "\x68\x31\x10\x30\x0e\x06\x03\x55\x04\x0a\x13\x07\x4b\x61\x74\x65"
+       "\x6c\x6c\x6f\x31\x14\x30\x12\x06\x03\x55\x04\x0b\x13\x0b\x53\x6f"
+       "\x6d\x65\x4f\x72\x67\x55\x6e\x69\x74\x31\x2c\x30\x2a\x06\x03\x55"
+       "\x04\x03\x13\x23\x73\x61\x74\x2d\x72\x32\x32\x30\x2d\x31\x30\x2e"
+       "\x6c\x61\x62\x2e\x65\x6e\x67\x2e\x72\x64\x75\x32\x2e\x72\x65\x64"
+       "\x68\x61\x74\x2e\x63\x6f\x6d\x30\x1e\x17\x0d\x31\x36\x30\x37\x30"
+       "\x31\x31\x38\x35\x34\x31\x37\x5a\x17\x0d\x34\x39\x31\x32\x30\x31"
+       "\x31\x33\x30\x30\x30\x30\x5a\x30\x2b\x31\x29\x30\x27\x06\x03\x55"
+       "\x04\x03\x13\x20\x38\x61\x38\x38\x38\x30\x31\x37\x35\x35\x61\x37"
+       "\x63\x39\x30\x37\x30\x31\x35\x35\x61\x37\x63\x66\x62\x65\x33\x36"
+       "\x30\x30\x30\x34\x30\x82\x01\x22\x30\x0d\x06\x09\x2a\x86\x48\x86"
+       "\xf7\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x00\x30\x82\x01\x0a"
+       "\x02\x82\x01\x01\x00\xdc\x70\x8b\x9c\x84\xe9\x3e\x79\x8f\x03\xe5"
+       "\x5f\x21\xf0\x29\x9e\xd9\x94\x4e\x0f\x37\x45\x47\x42\xda\x2a\xe0"
+       "\xda\xf5\x8b\xfa\xe1\xf8\x62\x51\x14\x9d\x9e\xe0\xc7\x69\xd0\x3d"
+       "\xfc\x25\x2f\xb6\x10\x45\xbd\x0d\xbc\x92\x86\x54\xbb\x4e\x7d\xd4"
+       "\x92\x75\x65\xba\x48\xa4\x64\xa1\xeb\xf7\xe7\xdc\xc0\xd7\x0a\x5e"
+       "\x36\x13\x0e\x4e\x35\xcc\x2c\xc6\xf3\xe7\xe7\xe5\x32\x8a\x0c\xf7"
+       "\x47\x28\x7a\x02\xc2\x68\x66\x19\x3a\xba\xca\x31\xe2\xdd\x43\xbe"
+       "\x26\x4c\x80\x12\x0c\xae\x44\x40\xeb\x69\x7d\x9e\x58\xd3\xab\xaf"
+       "\x69\xe6\x54\xae\x7d\x80\xee\x2c\x10\xe9\xbb\x5e\x6b\x89\x15\x2e"
+       "\x2c\x72\x26\xba\x7f\xe5\xa3\x66\xc5\x98\xc6\x57\xbf\x05\x1e\x55"
+       "\x93\xa6\x16\x83\xa6\x88\x79\x8f\x4e\xb5\x7e\x70\xeb\xf0\xa9\xa6"
+       "\xd5\xf9\x1f\xe6\xab\x70\x06\x43\xe0\xde\x82\xad\x0e\x04\x17\x2b"
+       "\x69\x82\x40\x98\x84\x14\x00\x2a\xa2\xda\x61\x7b\x35\xac\x71\x05"
+       "\x43\x6f\x55\x3a\x28\x4b\xd1\xa4\xeb\x3b\xf5\x03\xc2\xf8\x3c\xfd"
+       "\x0a\xc4\x99\x1d\xa7\x7d\x08\x5c\xd1\x15\x70\x73\xb9\xdc\x5c\xf2"
+       "\xfe\x2c\xc6\x21\x8a\xbe\xbd\x52\x37\x64\x04\xe5\x06\x3e\xc6\x62"
+       "\xa1\xe9\x8e\xcb\xc1\x02\x03\x01\x00\x01\xa3\x82\x03\x9e\x30\x82"
+       "\x03\x9a\x30\x11\x06\x09\x60\x86\x48\x01\x86\xf8\x42\x01\x01\x04"
+       "\x04\x03\x02\x05\xa0\x30\x0b\x06\x03\x55\x1d\x0f\x04\x04\x03\x02"
+       "\x04\xb0\x30\x81\xc3\x06\x03\x55\x1d\x23\x04\x81\xbb\x30\x81\xb8"
+       "\x80\x14\xca\xca\x62\x86\x04\x05\xf0\xf5\x9b\x38\xd2\x2c\x3c\x8c"
+       "\x65\x0f\xc6\xba\xa5\x3c\xa1\x81\x94\xa4\x81\x91\x30\x81\x8e\x31"
+       "\x0b\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x17\x30\x15"
+       "\x06\x03\x55\x04\x08\x13\x0e\x4e\x6f\x72\x74\x68\x20\x43\x61\x72"
+       "\x6f\x6c\x69\x6e\x61\x31\x10\x30\x0e\x06\x03\x55\x04\x07\x13\x07"
+       "\x52\x61\x6c\x65\x69\x67\x68\x31\x10\x30\x0e\x06\x03\x55\x04\x0a"
+       "\x13\x07\x4b\x61\x74\x65\x6c\x6c\x6f\x31\x14\x30\x12\x06\x03\x55"
+       "\x04\x0b\x13\x0b\x53\x6f\x6d\x65\x4f\x72\x67\x55\x6e\x69\x74\x31"
+       "\x2c\x30\x2a\x06\x03\x55\x04\x03\x13\x23\x73\x61\x74\x2d\x72\x32"
+       "\x32\x30\x2d\x31\x30\x2e\x6c\x61\x62\x2e\x65\x6e\x67\x2e\x72\x64"
+       "\x75\x32\x2e\x72\x65\x64\x68\x61\x74\x2e\x63\x6f\x6d\x82\x09\x00"
+       "\xa4\xe7\xca\xeb\xbe\x43\x5d\xcc\x30\x1d\x06\x03\x55\x1d\x0e\x04"
+       "\x16\x04\x14\x0e\x8d\x7b\x53\xba\x5a\x9e\x92\x44\xe5\x64\x58\xa1"
+       "\xdb\x83\x47\x05\x3e\x32\xd3\x30\x13\x06\x03\x55\x1d\x25\x04\x0c"
+       "\x30\x0a\x06\x08\x2b\x06\x01\x05\x05\x07\x03\x02\x30\x2a\x06\x10"
+       "\x2b\x06\x01\x04\x01\x92\x08\x09\x01\xaa\xda\xbe\xbe\xfa\x5b\x01"
+       "\x04\x16\x0c\x14\x6d\x6f\x72\x64\x6f\x72\x5f\x75\x65\x62\x65\x72"
+       "\x5f\x70\x72\x6f\x64\x75\x63\x74\x30\x16\x06\x10\x2b\x06\x01\x04"
+       "\x01\x92\x08\x09\x01\xaa\xda\xbe\xbe\xfa\x5b\x03\x04\x02\x0c\x00"
+       "\x30\x16\x06\x10\x2b\x06\x01\x04\x01\x92\x08\x09\x01\xaa\xda\xbe"
+       "\xbe\xfa\x5b\x02\x04\x02\x0c\x00\x30\x16\x06\x10\x2b\x06\x01\x04"
+       "\x01\x92\x08\x09\x01\xaa\xda\xbe\xbe\xfa\x5b\x05\x04\x02\x0c\x00"
+       "\x30\x19\x06\x10\x2b\x06\x01\x04\x01\x92\x08\x09\x02\xaa\xda\xbe"
+       "\xbe\xfa\x72\x01\x04\x05\x0c\x03\x79\x75\x6d\x30\x24\x06\x11\x2b"
+       "\x06\x01\x04\x01\x92\x08\x09\x02\xaa\xda\xbe\xbe\xfa\x72\x01\x01"
+       "\x04\x0f\x0c\x0d\x75\x65\x62\x65\x72\x5f\x63\x6f\x6e\x74\x65\x6e"
+       "\x74\x30\x32\x06\x11\x2b\x06\x01\x04\x01\x92\x08\x09\x02\xaa\xda"
+       "\xbe\xbe\xfa\x72\x01\x02\x04\x1d\x0c\x1b\x31\x34\x36\x37\x33\x39"
+       "\x39\x32\x35\x37\x34\x33\x35\x5f\x75\x65\x62\x65\x72\x5f\x63\x6f"
+       "\x6e\x74\x65\x6e\x74\x30\x1d\x06\x11\x2b\x06\x01\x04\x01\x92\x08"
+       "\x09\x02\xaa\xda\xbe\xbe\xfa\x72\x01\x05\x04\x08\x0c\x06\x43\x75"
+       "\x73\x74\x6f\x6d\x30\x1e\x06\x11\x2b\x06\x01\x04\x01\x92\x08\x09"
+       "\x02\xaa\xda\xbe\xbe\xfa\x72\x01\x06\x04\x09\x0c\x07\x2f\x6d\x6f"
+       "\x72\x64\x6f\x72\x30\x17\x06\x11\x2b\x06\x01\x04\x01\x92\x08\x09"
+       "\x02\xaa\xda\xbe\xbe\xfa\x72\x01\x07\x04\x02\x0c\x00\x30\x18\x06"
+       "\x11\x2b\x06\x01\x04\x01\x92\x08\x09\x02\xaa\xda\xbe\xbe\xfa\x72"
+       "\x01\x08\x04\x03\x0c\x01\x31\x30\x24\x06\x0a\x2b\x06\x01\x04\x01"
+       "\x92\x08\x09\x04\x01\x04\x16\x0c\x14\x6d\x6f\x72\x64\x6f\x72\x5f"
+       "\x75\x65\x62\x65\x72\x5f\x70\x72\x6f\x64\x75\x63\x74\x30\x10\x06"
+       "\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x04\x02\x04\x02\x0c\x00\x30"
+       "\x1d\x06\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x04\x03\x04\x0f\x0c"
+       "\x0d\x31\x34\x36\x37\x33\x39\x39\x32\x35\x37\x34\x33\x35\x30\x11"
+       "\x06\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x04\x05\x04\x03\x0c\x01"
+       "\x31\x30\x24\x06\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x04\x06\x04"
+       "\x16\x0c\x14\x32\x30\x31\x36\x2d\x30\x37\x2d\x30\x31\x54\x31\x38"
+       "\x3a\x35\x34\x3a\x31\x37\x5a\x30\x24\x06\x0a\x2b\x06\x01\x04\x01"
+       "\x92\x08\x09\x04\x07\x04\x16\x0c\x14\x32\x30\x34\x39\x2d\x31\x32"
+       "\x2d\x30\x31\x54\x31\x33\x3a\x30\x30\x3a\x30\x30\x5a\x30\x11\x06"
+       "\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x04\x0c\x04\x03\x0c\x01\x30"
+       "\x30\x11\x06\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x04\x0e\x04\x03"
+       "\x0c\x01\x30\x30\x11\x06\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x04"
+       "\x0b\x04\x03\x0c\x01\x31\x30\x34\x06\x0a\x2b\x06\x01\x04\x01\x92"
+       "\x08\x09\x05\x01\x04\x26\x0c\x24\x39\x34\x35\x33\x66\x38\x65\x36"
+       "\x2d\x38\x34\x62\x32\x2d\x34\x38\x32\x65\x2d\x61\x33\x65\x61\x2d"
+       "\x30\x31\x63\x33\x62\x33\x65\x32\x36\x36\x61\x35\x30\x0d\x06\x09"
+       "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00"
+       "\xf7\x4d\xf3\x30\x53\xcd\x35\xbf\x49\x07\x29\x9b\xf0\x7a\xaa\x49"
+       "\x60\xda\xce\x14\x45\xb5\x32\x8f\xda\xc3\xce\x6b\xec\xbf\x20\xc0"
+       "\x05\xa3\x3a\x89\xc4\x7d\x66\x34\xfc\xf3\x16\xb8\xf3\x03\xda\xfc"
+       "\x82\x4a\xb8\x97\xf8\x67\x3d\xc2\x8c\x78\xb4\x6d\xb8\xbb\x18\xec"
+       "\x36\xee\xc4\x28\x79\xda\xfe\xa1\x1f\xaf\x0b\x3f\xe4\x75\xde\x83"
+       "\xff\x6b\xf9\x11\x60\x09\x57\xea\x85\x34\xed\x60\xe2\x94\x8b\xd6"
+       "\xf2\x21\x9b\xda\x97\x99\xf3\x0d\xa9\x0f\xb5\x3b\x3a\x8f\x96\x8d"
+       "\x0b\xdf\x30\x17\x03\xe6\x47\xc3\x71\x32\x09\x18\xbc\xc0\xa9\x83"
+       "\x7e\xb7\x5f\x5c\xbb\xeb\x0a\x18\x3f\xa9\x40\x98\xae\x57\xab\x99"
+       "\x3d\x47\x1b\x98\x8a\xdc\x6e\x85\xa2\xea\x5e\x21\x80\xa9\xb5\x48"
+       "\xc9\x1d\x63\xc1\x1b\xe6\x01\xa1\xbd\x84\x38\x7f\x1a\x43\xa5\xd4"
+       "\x7f\x41\x5b\xf6\x88\x33\xb0\xf1\xb8\x8f\xe1\x39\x69\x6f\x60\x13"
+       "\xd3\x5d\x70\xde\x95\x0d\x2f\xa9\x89\x6c\xd4\x3a\xeb\x22\x59\xe6"
+       "\x31\x67\x71\xa5\xed\xfb\xcb\x20\x11\x0c\x31\x2e\xe0\x98\x9a\x3b"
+       "\x9c\x7b\xa2\x74\x6f\x87\x97\xa1\xd9\x82\x7f\x7d\x62\x6b\x45\x6c"
+       "\x0b\x5e\x25\x43\x8a\x20\x16\x7d\xe5\x84\x18\x3f\x7c\xda\xfc\xf9";
+
+int der_data_size = sizeof(der_data)-1;
+
+char new_data[4*1024];
+
+int
+main (int argc, char** argv)
+{
+  int result = 0;
+  asn1_node definitions = NULL, node1 = NULL;
+  char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE];
+  const char *pkixfile = getenv ("ASN1PKIX");
+  int new_data_size;
+
+  if (!pkixfile)
+    pkixfile = "pkix.asn";
+
+  /* Encode */
+  result = asn1_parser2tree (pkixfile, &definitions, errorDescription);
+  if (result != ASN1_SUCCESS)
+    {
+      printf ("error in %d\n", __LINE__);
+      exit (1);
+    }
+
+  result = asn1_create_element (definitions, "PKIX1.Certificate", &node1);
+  if (result != ASN1_SUCCESS)
+    {
+      printf ("error in %d\n", __LINE__);
+      exit (1);
+    }
+
+  result = asn1_der_decoding (&node1, der_data, der_data_size, errorDescription);
+  if (result != ASN1_SUCCESS)
+    {
+      printf ("error in %d: %s\n", __LINE__, errorDescription);
+      exit (1);
+    }
+
+  new_data_size = sizeof(new_data);
+  result = asn1_der_coding (node1, "", new_data, &new_data_size, errorDescription);
+  if (result != ASN1_SUCCESS)
+    {
+      printf ("error in %d\n", __LINE__);
+      exit (1);
+    }
+
+  if (new_data_size != der_data_size)
+    {
+      printf ("error in %d\n", __LINE__);
+      printf ("new_size is %d, expected: %d\n", new_data_size, der_data_size);
+      exit (1);
+    }
+
+  if (memcmp(new_data, der_data, der_data_size) != 0)
+    {
+      printf ("error in %d\n", __LINE__);
+      exit (1);
+    }
+
+  asn1_delete_structure (&node1);
+  asn1_delete_structure (&definitions);
+
+  return 0;
+}
diff --git a/tests/object-id-decoding.c b/tests/object-id-decoding.c
new file mode 100644 (file)
index 0000000..e3e9669
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2016 Red Hat, Inc.
+ *
+ * This file is part of LIBTASN1.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "libtasn1.h"
+
+struct tv
+{
+  int der_len;
+  const unsigned char *der_str;
+  const char *oid;
+  int expected_error;
+};
+
+static const struct tv tv[] = {
+  {.der_len = 12,
+   .der_str = (void *) "\x06\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x05\x01",
+   .oid = "1.3.6.1.4.1.2312.9.5.1",
+   .expected_error = ASN1_SUCCESS},
+  {.der_len = 19,
+   .der_str =
+   (void *)
+   "\x06\x11\x2b\x06\x01\x04\x01\x92\x08\x09\x02\xaa\xda\xbe\xbe\xfa\x72\x01\x07",
+   .oid = "1.3.6.1.4.1.2312.9.2.1467399257458.1.7",
+   .expected_error = ASN1_SUCCESS},
+};
+
+int
+main (int argc, char *argv[])
+{
+  char str[128];
+  int ret, ret_len;
+  size_t i;
+
+  for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
+    {
+      /* decode */
+      ret =
+       asn1_get_object_id_der (tv[i].der_str+1,
+                               tv[i].der_len-1, &ret_len, str,
+                               sizeof (str));
+      if (ret != tv[i].expected_error)
+       {
+         fprintf (stderr,
+                  "%d: asn1_get_object_id_der iter %lu: got %d expected %d\n",
+                  __LINE__, (unsigned long) i, ret, tv[i].expected_error);
+         return 1;
+       }
+
+      if (ret_len != tv[i].der_len-1)
+       {
+         fprintf (stderr,
+                  "%d: iter %lu: error in DER, length returned is %d, had %d\n",
+                  __LINE__, (unsigned long)i, ret_len, tv[i].der_len-1);
+         return 1;
+       }
+
+      if (strcmp (tv[i].oid, str) != 0)
+       {
+         fprintf (stderr,
+                  "%d: strcmp iter %lu: got invalid OID: %s, expected: %s\n",
+                  __LINE__, (unsigned long) i, str, tv[i].oid);
+         return 1;
+       }
+
+    }
+
+  return 0;
+}