diff --git a/CMarkGFM.hsc b/CMarkGFM.hsc
--- a/CMarkGFM.hsc
+++ b/CMarkGFM.hsc
@@ -15,6 +15,7 @@
   , optSourcePos
   , optHardBreaks
   , optSmart
+  , optSafe
   , optUnsafe
   , extStrikethrough
   , extTable
@@ -276,6 +277,11 @@
 -- | Convert straight quotes to curly, @---@ to em-dash, @--@ to en-dash.
 optSmart :: CMarkOption
 optSmart = CMarkOption #const CMARK_OPT_SMART
+
+-- | optSafe is defined here for API compatibility, but it no longer has any
+-- effect. "Safe" mode is now the default: set optUnsafe to disable it.
+optSafe :: CMarkOption
+optSafe = CMarkOption #const CMARK_OPT_SAFE
 
 -- | Allow rendering of raw HTML and potentially dangerous URLs in links
 -- and images.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -44,22 +44,17 @@
   - **Ease of installation:** cmark is portable and has minimal
     dependencies.
 
-cmark does not provide Haskell versions of the whole [libcmark-gfm]
+cmark-gfm does not provide Haskell versions of the whole [libcmark-gfm]
 API, which is built around mutable `cmark_node` objects.  Instead, it
 provides functions for converting CommonMark to HTML (and other
 formats), and a function for converting CommonMark to a `Node`
 tree that can be processed further using Haskell.
 
-**A note on security:**  This library does not attempt to sanitize
-HTML output.  We recommend using [xss-sanitize] to filter the output,
-or enabling `optSafe` to filter out all raw HTML and potentially
-dangerous URLs.
-
 **A note on stability:**  There is a good chance the API will change
 significantly after this early release.
 
 [GitHub Flavored Markdown]: https://github.github.com/gfm/
-[libcmark-gfm]: http://github.com/github/cmark
+[libcmark-gfm]: http://github.com/github/cmark-gfm
 [benchmarks]: https://github.com/jgm/cmark/blob/master/benchmarks.md
 [cheapskate]: https://hackage.haskell.org/package/cheapskate
 [pandoc]: https://hackage.haskell.org/package/pandoc
diff --git a/cbits/blocks.c b/cbits/blocks.c
--- a/cbits/blocks.c
+++ b/cbits/blocks.c
@@ -36,6 +36,10 @@
   return (node->flags & CMARK_NODE__LAST_LINE_BLANK) != 0;
 }
 
+static bool S_last_line_checked(const cmark_node *node) {
+  return (node->flags & CMARK_NODE__LAST_LINE_CHECKED) != 0;
+}
+
 static CMARK_INLINE cmark_node_type S_type(const cmark_node *node) {
   return (cmark_node_type)node->type;
 }
@@ -47,6 +51,10 @@
     node->flags &= ~CMARK_NODE__LAST_LINE_BLANK;
 }
 
+static void S_set_last_line_checked(cmark_node *node) {
+  node->flags |= CMARK_NODE__LAST_LINE_CHECKED;
+}
+
 static CMARK_INLINE bool S_is_line_end_char(char c) {
   return (c == '\n' || c == '\r');
 }
@@ -121,8 +129,6 @@
   parser->root = document;
   parser->current = document;
 
-  parser->last_buffer_ended_with_cr = false;
-
   parser->syntax_extensions = saved_exts;
   parser->inline_syntax_extensions = saved_inline_exts;
   parser->options = saved_options;
@@ -234,26 +240,43 @@
 
 // Check to see if a node ends with a blank line, descending
 // if needed into lists and sublists.
-static bool ends_with_blank_line(cmark_node *node) {
-  cmark_node *cur = node;
-  while (cur != NULL) {
-    if (S_last_line_blank(cur)) {
-      return true;
-    }
-    if (S_type(cur) == CMARK_NODE_LIST || S_type(cur) == CMARK_NODE_ITEM) {
-      cur = cur->last_child;
-    } else {
-      cur = NULL;
-    }
+static bool S_ends_with_blank_line(cmark_node *node) {
+  if (S_last_line_checked(node)) {
+    return(S_last_line_blank(node));
+  } else if ((S_type(node) == CMARK_NODE_LIST ||
+              S_type(node) == CMARK_NODE_ITEM) && node->last_child) {
+    S_set_last_line_checked(node);
+    return(S_ends_with_blank_line(node->last_child));
+  } else {
+    S_set_last_line_checked(node);
+    return (S_last_line_blank(node));
   }
-  return false;
 }
 
+// returns true if content remains after link defs are resolved.
+static bool resolve_reference_link_definitions(
+		cmark_parser *parser,
+                cmark_node *b) {
+  bufsize_t pos;
+  cmark_strbuf *node_content = &b->content;
+  cmark_chunk chunk = {node_content->ptr, node_content->size, 0};
+  while (chunk.len && chunk.data[0] == '[' &&
+         (pos = cmark_parse_reference_inline(parser->mem, &chunk,
+					     parser->refmap))) {
+
+    chunk.data += pos;
+    chunk.len -= pos;
+  }
+  cmark_strbuf_drop(node_content, (node_content->size - chunk.len));
+  return !is_blank(&b->content, 0);
+}
+
 static cmark_node *finalize(cmark_parser *parser, cmark_node *b) {
   bufsize_t pos;
   cmark_node *item;
   cmark_node *subitem;
   cmark_node *parent;
+  bool has_content;
 
   parent = b->parent;
   assert(b->flags &
@@ -283,15 +306,8 @@
   switch (S_type(b)) {
   case CMARK_NODE_PARAGRAPH:
   {
-    cmark_chunk chunk = {node_content->ptr, node_content->size, 0};
-    while (chunk.len && chunk.data[0] == '[' &&
-           (pos = cmark_parse_reference_inline(parser->mem, &chunk, parser->refmap))) {
-
-      chunk.data += pos;
-      chunk.len -= pos;
-    }
-    cmark_strbuf_drop(node_content, (node_content->size - chunk.len));
-    if (is_blank(node_content, 0)) {
+    has_content = resolve_reference_link_definitions(parser, b);
+    if (!has_content) {
       // remove blank node (former reference def)
       cmark_node_free(b);
     }
@@ -343,7 +359,8 @@
       // spaces between them:
       subitem = item->first_child;
       while (subitem) {
-        if (ends_with_blank_line(subitem) && (item->next || subitem->next)) {
+        if ((item->next || subitem->next) &&
+            S_ends_with_blank_line(subitem)) {
           b->as.list.tight = false;
           break;
         }
@@ -748,6 +765,40 @@
   }
 }
 
+// Check for thematic break.  On failure, return 0 and update
+// thematic_break_kill_pos with the index at which the
+// parse fails.  On success, return length of match.
+// "...three or more hyphens, asterisks,
+// or underscores on a line by themselves. If you wish, you may use
+// spaces between the hyphens or asterisks."
+static int S_scan_thematic_break(cmark_parser *parser, cmark_chunk *input,
+                                 bufsize_t offset) {
+  bufsize_t i;
+  char c;
+  char nextc = '\0';
+  int count;
+  i = offset;
+  c = peek_at(input, i);
+  if (!(c == '*' || c == '_' || c == '-')) {
+    parser->thematic_break_kill_pos = i;
+    return 0;
+  }
+  count = 1;
+  while ((nextc = peek_at(input, ++i))) {
+    if (nextc == c) {
+      count++;
+    } else if (nextc != ' ' && nextc != '\t') {
+      break;
+    }
+  }
+  if (count >= 3 && (nextc == '\r' || nextc == '\n')) {
+    return (i - offset) + 1;
+  } else {
+    parser->thematic_break_kill_pos = i;
+    return 0;
+  }
+}
+
 // Find first nonspace character from current offset, setting
 // parser->first_nonspace, parser->first_nonspace_column,
 // parser->indent, and parser->blank. Does not advance parser->offset.
@@ -1040,6 +1091,7 @@
   bufsize_t matched = 0;
   int lev = 0;
   bool save_partially_consumed_tab;
+  bool has_content;
   int save_offset;
   int save_column;
 
@@ -1112,13 +1164,20 @@
     } else if (!indented && cont_type == CMARK_NODE_PARAGRAPH &&
                (lev =
                     scan_setext_heading_line(input, parser->first_nonspace))) {
-      (*container)->type = (uint16_t)CMARK_NODE_HEADING;
-      (*container)->as.heading.level = lev;
-      (*container)->as.heading.setext = true;
-      S_advance_offset(parser, input, input->len - 1 - parser->offset, false);
+      // finalize paragraph, resolving reference links
+      has_content = resolve_reference_link_definitions(parser, *container);
+
+      if (has_content) {
+
+        (*container)->type = (uint16_t)CMARK_NODE_HEADING;
+        (*container)->as.heading.level = lev;
+        (*container)->as.heading.setext = true;
+        S_advance_offset(parser, input, input->len - 1 - parser->offset, false);
+      }
     } else if (!indented &&
                !(cont_type == CMARK_NODE_PARAGRAPH && !all_matched) &&
-               (matched = scan_thematic_break(input, parser->first_nonspace))) {
+	       (parser->thematic_break_kill_pos <= parser->first_nonspace) &&
+               (matched = S_scan_thematic_break(parser, input, parser->first_nonspace))) {
       // it's only now that we know the line is not part of a setext heading:
       *container = add_child(parser, *container, CMARK_NODE_THEMATIC_BREAK,
                              parser->first_nonspace + 1);
@@ -1377,6 +1436,7 @@
   parser->column = 0;
   parser->first_nonspace = 0;
   parser->first_nonspace_column = 0;
+  parser->thematic_break_kill_pos = 0;
   parser->indent = 0;
   parser->blank = false;
   parser->partially_consumed_tab = false;
diff --git a/cbits/buffer.c b/cbits/buffer.c
--- a/cbits/buffer.c
+++ b/cbits/buffer.c
@@ -10,7 +10,6 @@
 #include "config.h"
 #include "cmark_ctype.h"
 #include "buffer.h"
-#include "memory.h"
 
 /* Used as default value for cmark_strbuf->ptr so that people can always
  * assume ptr is non-NULL and zero terminated even for new cmark_strbufs.
diff --git a/cbits/chunk.h b/cbits/chunk.h
--- a/cbits/chunk.h
+++ b/cbits/chunk.h
@@ -6,7 +6,6 @@
 #include <assert.h>
 #include "cmark-gfm.h"
 #include "buffer.h"
-#include "memory.h"
 #include "cmark_ctype.h"
 
 #define CMARK_CHUNK_EMPTY                                                      \
diff --git a/cbits/cmark-gfm.h b/cbits/cmark-gfm.h
--- a/cbits/cmark-gfm.h
+++ b/cbits/cmark-gfm.h
@@ -690,6 +690,20 @@
  */
 #define CMARK_OPT_HARDBREAKS (1 << 2)
 
+/** `CMARK_OPT_SAFE` is defined here for API compatibility,
+    but it no longer has any effect. "Safe" mode is now the default:
+    set `CMARK_OPT_UNSAFE` to disable it.
+ */
+#define CMARK_OPT_SAFE (1 << 3)
+
+/** Render raw HTML and unsafe links (`javascript:`, `vbscript:`,
+ * `file:`, and `data:`, except for `image/png`, `image/gif`,
+ * `image/jpeg`, or `image/webp` mime types).  By default,
+ * raw HTML is replaced by a placeholder HTML comment. Unsafe
+ * links are replaced by empty strings.
+ */
+#define CMARK_OPT_UNSAFE (1 << 17)
+
 /** Render `softbreak` elements as spaces.
  */
 #define CMARK_OPT_NOBREAKS (1 << 4)
@@ -737,14 +751,6 @@
  * a separate attribute.
  */
 #define CMARK_OPT_FULL_INFO_STRING (1 << 16)
-
-/** Allow raw HTML and unsafe links, `javascript:`, `vbscript:`, `file:`, and
- * all `data:` URLs -- by default, only `image/png`, `image/gif`, `image/jpeg`,
- * or `image/webp` mime types are allowed. Without this option, raw HTML is
- * replaced by a placeholder HTML comment, and unsafe links are replaced by
- * empty strings.
- */
-#define CMARK_OPT_UNSAFE (1 << 17)
 
 /**
  * ## Version information
diff --git a/cbits/cmark-gfm_version.h b/cbits/cmark-gfm_version.h
--- a/cbits/cmark-gfm_version.h
+++ b/cbits/cmark-gfm_version.h
@@ -1,7 +1,7 @@
 #ifndef CMARK_GFM_VERSION_H
 #define CMARK_GFM_VERSION_H
 
-#define CMARK_GFM_VERSION ((0 << 24) | (28 << 16) | (3 << 8) | 20)
-#define CMARK_GFM_VERSION_STRING "0.28.3.gfm.20"
+#define CMARK_GFM_VERSION ((0 << 24) | (29 << 16) | (0 << 8) | 0)
+#define CMARK_GFM_VERSION_STRING "0.29.0.gfm.0"
 
 #endif
diff --git a/cbits/commonmark.c b/cbits/commonmark.c
--- a/cbits/commonmark.c
+++ b/cbits/commonmark.c
@@ -34,7 +34,8 @@
   needs_escaping =
       c < 0x80 && escape != LITERAL &&
       ((escape == NORMAL &&
-        (c == '*' || c == '_' || c == '[' || c == ']' || c == '#' || c == '<' ||
+        (c < 0x20 ||
+	 c == '*' || c == '_' || c == '[' || c == ']' || c == '#' || c == '<' ||
          c == '>' || c == '\\' || c == '`' || c == '~' || c == '!' ||
          (c == '&' && cmark_isalpha(nextc)) || (c == '!' && nextc == '[') ||
          (renderer->begin_content && (c == '-' || c == '+' || c == '=') &&
@@ -50,14 +51,18 @@
         (c == '`' || c == '<' || c == '>' || c == '"' || c == '\\')));
 
   if (needs_escaping) {
-    if (cmark_isspace((char)c)) {
+    if (escape == URL && cmark_isspace((char)c)) {
       // use percent encoding for spaces
-      snprintf(encoded, ENCODED_SIZE, "%%%2x", c);
+      snprintf(encoded, ENCODED_SIZE, "%%%2X", c);
       cmark_strbuf_puts(renderer->buffer, encoded);
       renderer->column += 3;
-    } else {
+    } else if (cmark_ispunct((char)c)) {
       cmark_render_ascii(renderer, "\\");
       cmark_render_code_point(renderer, c);
+    } else { // render as entity
+      snprintf(encoded, ENCODED_SIZE, "&#%d;", c);
+      cmark_strbuf_puts(renderer->buffer, encoded);
+      renderer->column += (int)strlen(encoded);
     }
   } else {
     cmark_render_code_point(renderer, c);
diff --git a/cbits/html.c b/cbits/html.c
--- a/cbits/html.c
+++ b/cbits/html.c
@@ -354,8 +354,8 @@
   case CMARK_NODE_LINK:
     if (entering) {
       cmark_strbuf_puts(html, "<a href=\"");
-      if (!(!(options & CMARK_OPT_UNSAFE) &&
-            scan_dangerous_url(&node->as.link.url, 0))) {
+      if ((options & CMARK_OPT_UNSAFE) ||
+            !(scan_dangerous_url(&node->as.link.url, 0))) {
         houdini_escape_href(html, node->as.link.url.data,
                             node->as.link.url.len);
       }
@@ -372,8 +372,8 @@
   case CMARK_NODE_IMAGE:
     if (entering) {
       cmark_strbuf_puts(html, "<img src=\"");
-      if (!(!(options & CMARK_OPT_UNSAFE) &&
-            scan_dangerous_url(&node->as.link.url, 0))) {
+      if ((options & CMARK_OPT_UNSAFE) ||
+            !(scan_dangerous_url(&node->as.link.url, 0))) {
         houdini_escape_href(html, node->as.link.url.data,
                             node->as.link.url.len);
       }
diff --git a/cbits/inlines.c b/cbits/inlines.c
--- a/cbits/inlines.c
+++ b/cbits/inlines.c
@@ -322,9 +322,11 @@
 }
 
 // Destructively modify string, converting newlines to
-// spaces, then removing a single leading + trailing space.
+// spaces, then removing a single leading + trailing space,
+// unless the code span consists entirely of space characters.
 static void S_normalize_code(cmark_strbuf *s) {
   bufsize_t r, w;
+  bool contains_nonspace = false;
 
   for (r = 0, w = 0; r < s->size; ++r) {
     switch (s->ptr[r]) {
@@ -339,10 +341,14 @@
     default:
       s->ptr[w++] = s->ptr[r];
     }
+    if (s->ptr[r] != ' ') {
+      contains_nonspace = true;
+    }
   }
 
   // begins and ends with space?
-  if (s->ptr[0] == ' ' && s->ptr[w - 1] == ' ') {
+  if (contains_nonspace &&
+      s->ptr[0] == ' ' && s->ptr[w - 1] == ' ') {
     cmark_strbuf_drop(s, 1);
     cmark_strbuf_truncate(s, w - 2);
   } else {
@@ -630,7 +636,6 @@
   delimiter *opener;
   delimiter *old_closer;
   bool opener_found;
-  bool odd_match;
   delimiter *openers_bottom[3][128];
   int i;
 
@@ -655,15 +660,14 @@
       // Now look backwards for first matching opener:
       opener = closer->previous;
       opener_found = false;
-      odd_match = false;
       while (opener != NULL && opener != stack_bottom &&
              opener != openers_bottom[closer->length % 3][closer->delim_char]) {
         if (opener->can_open && opener->delim_char == closer->delim_char) {
           // interior closer of size 2 can't match opener of size 1
           // or of size 1 can't match 2
-          odd_match = (closer->can_open || opener->can_close) &&
-                      ((opener->length + closer->length) % 3 == 0);
-          if (!odd_match) {
+          if (!(closer->can_open || opener->can_close) ||
+	      closer->length % 3 == 0 ||
+              (opener->length + closer->length) % 3 != 0) {
             opener_found = true;
             break;
           }
@@ -969,17 +973,21 @@
     else if (input->data[i] == '(') {
       ++nb_p;
       ++i;
-        if (nb_p > 32)
-          return -1;
+      if (nb_p > 32)
+        return -1;
     } else if (input->data[i] == ')') {
       if (nb_p == 0)
         break;
       --nb_p;
       ++i;
-    } else if (cmark_isspace(input->data[i]))
+    } else if (cmark_isspace(input->data[i])) {
+      if (i == offset) {
+        return -1;
+      }
       break;
-    else
+    } else {
       ++i;
+    }
   }
 
   if (i >= input->len)
@@ -1005,7 +1013,7 @@
       } else if (input->data[i] == '\\')
         i += 2;
       else if (input->data[i] == '\n' || input->data[i] == '<')
-        return manual_scan_link_url_2(input, offset, output);
+        return -1;
       else
         ++i;
     }
@@ -1432,8 +1440,7 @@
 
   // parse link url:
   spnl(&subj);
-  if ((matchlen = manual_scan_link_url(&subj.input, subj.pos, &url)) > -1 &&
-      url.len > 0) {
+  if ((matchlen = manual_scan_link_url(&subj.input, subj.pos, &url)) > -1) {
     subj.pos += matchlen;
   } else {
     return 0;
diff --git a/cbits/iterator.h b/cbits/iterator.h
--- a/cbits/iterator.h
+++ b/cbits/iterator.h
@@ -6,7 +6,6 @@
 #endif
 
 #include "cmark-gfm.h"
-#include "memory.h"
 
 typedef struct {
   cmark_event_type ev_type;
diff --git a/cbits/map.h b/cbits/map.h
--- a/cbits/map.h
+++ b/cbits/map.h
@@ -1,7 +1,6 @@
 #ifndef CMARK_MAP_H
 #define CMARK_MAP_H
 
-#include "memory.h"
 #include "chunk.h"
 
 #ifdef __cplusplus
diff --git a/cbits/node.h b/cbits/node.h
--- a/cbits/node.h
+++ b/cbits/node.h
@@ -50,6 +50,7 @@
 enum cmark_node__internal_flags {
   CMARK_NODE__OPEN = (1 << 0),
   CMARK_NODE__LAST_LINE_BLANK = (1 << 1),
+  CMARK_NODE__LAST_LINE_CHECKED = (1 << 2),
 };
 
 struct cmark_node {
diff --git a/cbits/parser.h b/cbits/parser.h
--- a/cbits/parser.h
+++ b/cbits/parser.h
@@ -2,9 +2,9 @@
 #define CMARK_PARSER_H
 
 #include <stdio.h>
+#include "references.h"
 #include "node.h"
 #include "buffer.h"
-#include "memory.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -30,6 +30,7 @@
   bufsize_t first_nonspace;
   /* See the documentation for cmark_parser_get_first_nonspace_column() in cmark.h */
   bufsize_t first_nonspace_column;
+  bufsize_t thematic_break_kill_pos;
   /* See the documentation for cmark_parser_get_indent() in cmark.h */
   int indent;
   /* See the documentation for cmark_parser_is_blank() in cmark.h */
diff --git a/cbits/render.c b/cbits/render.c
--- a/cbits/render.c
+++ b/cbits/render.c
@@ -98,21 +98,23 @@
         }
       }
 
-    } else if (c == 10) {
-      cmark_strbuf_putc(renderer->buffer, '\n');
-      renderer->column = 0;
-      renderer->begin_line = true;
-      renderer->begin_content = true;
-      renderer->last_breakable = 0;
     } else if (escape == LITERAL) {
-      cmark_render_code_point(renderer, c);
-      renderer->begin_line = false;
-      // we don't set 'begin_content' to false til we've
-      // finished parsing a digit.  Reason:  in commonmark
-      // we need to escape a potential list marker after
-      // a digit:
-      renderer->begin_content =
-          renderer->begin_content && cmark_isdigit((char)c) == 1;
+      if (c == 10) {
+        cmark_strbuf_putc(renderer->buffer, '\n');
+        renderer->column = 0;
+        renderer->begin_line = true;
+        renderer->begin_content = true;
+        renderer->last_breakable = 0;
+      } else {
+        cmark_render_code_point(renderer, c);
+        renderer->begin_line = false;
+        // we don't set 'begin_content' to false til we've
+        // finished parsing a digit.  Reason:  in commonmark
+        // we need to escape a potential list marker after
+        // a digit:
+        renderer->begin_content =
+            renderer->begin_content && cmark_isdigit((char)c) == 1;
+      }
     } else {
       (renderer->outc)(renderer, node, escape, c, nextc);
       renderer->begin_line = false;
diff --git a/cbits/render.h b/cbits/render.h
--- a/cbits/render.h
+++ b/cbits/render.h
@@ -8,7 +8,6 @@
 #include <stdlib.h>
 #include "buffer.h"
 #include "chunk.h"
-#include "memory.h"
 
 typedef enum { LITERAL, NORMAL, TITLE, URL } cmark_escaping;
 
diff --git a/cbits/scanners.c b/cbits/scanners.c
--- a/cbits/scanners.c
+++ b/cbits/scanners.c
@@ -8261,2432 +8261,2258 @@
 		208, 208, 208, 208, 208, 208, 208, 208, 
 		208, 208, 208, 208, 208, 208, 208, 208, 
 		208, 208, 192, 208, 208, 208, 208, 144, 
-		208,  80, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208,  32, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		208, 208, 208, 208, 208, 208, 208, 208, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych <= '&') {
-		if (yych == '"') goto yy722;
-	} else {
-		if (yych <= '\'') goto yy723;
-		if (yych <= '(') goto yy724;
-	}
-	++p;
-yy721:
-	{ return 0; }
-yy722:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x00) goto yy721;
-	if (yych <= 0x7F) goto yy726;
-	if (yych <= 0xC1) goto yy721;
-	if (yych <= 0xF4) goto yy726;
-	goto yy721;
-yy723:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x00) goto yy721;
-	if (yych <= 0x7F) goto yy740;
-	if (yych <= 0xC1) goto yy721;
-	if (yych <= 0xF4) goto yy740;
-	goto yy721;
-yy724:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x00) goto yy721;
-	if (yych <= 0x7F) goto yy753;
-	if (yych <= 0xC1) goto yy721;
-	if (yych <= 0xF4) goto yy753;
-	goto yy721;
-yy725:
-	yych = *++p;
-yy726:
-	if (yybm[0+yych] & 16) {
-		goto yy725;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy727;
-			if (yych <= '"') goto yy728;
-			goto yy730;
-		} else {
-			if (yych <= 0xC1) goto yy727;
-			if (yych <= 0xDF) goto yy732;
-			goto yy733;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy735;
-			goto yy734;
-		} else {
-			if (yych <= 0xF0) goto yy736;
-			if (yych <= 0xF3) goto yy737;
-			if (yych <= 0xF4) goto yy738;
-		}
-	}
-yy727:
-	p = marker;
-	if (yyaccept <= 1) {
-		if (yyaccept == 0) {
-			goto yy721;
-		} else {
-			goto yy729;
-		}
-	} else {
-		if (yyaccept == 2) {
-			goto yy742;
-		} else {
-			goto yy755;
-		}
-	}
-yy728:
-	++p;
-yy729:
-	{ return (bufsize_t)(p - start); }
-yy730:
-	yych = *++p;
-	if (yybm[0+yych] & 16) {
-		goto yy725;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy727;
-			if (yych <= '"') goto yy765;
-			goto yy730;
-		} else {
-			if (yych <= 0xC1) goto yy727;
-			if (yych >= 0xE0) goto yy733;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy735;
-			goto yy734;
-		} else {
-			if (yych <= 0xF0) goto yy736;
-			if (yych <= 0xF3) goto yy737;
-			if (yych <= 0xF4) goto yy738;
-			goto yy727;
-		}
-	}
-yy732:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy725;
-	goto yy727;
-yy733:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy727;
-	if (yych <= 0xBF) goto yy732;
-	goto yy727;
-yy734:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy732;
-	goto yy727;
-yy735:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0x9F) goto yy732;
-	goto yy727;
-yy736:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy727;
-	if (yych <= 0xBF) goto yy734;
-	goto yy727;
-yy737:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy734;
-	goto yy727;
-yy738:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0x8F) goto yy734;
-	goto yy727;
-yy739:
-	yych = *++p;
-yy740:
-	if (yybm[0+yych] & 64) {
-		goto yy739;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy727;
-			if (yych >= '(') goto yy743;
-		} else {
-			if (yych <= 0xC1) goto yy727;
-			if (yych <= 0xDF) goto yy745;
-			goto yy746;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy748;
-			goto yy747;
-		} else {
-			if (yych <= 0xF0) goto yy749;
-			if (yych <= 0xF3) goto yy750;
-			if (yych <= 0xF4) goto yy751;
-			goto yy727;
-		}
-	}
-yy741:
-	++p;
-yy742:
-	{ return (bufsize_t)(p - start); }
-yy743:
-	yych = *++p;
-	if (yybm[0+yych] & 64) {
-		goto yy739;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy727;
-			if (yych <= '\'') goto yy766;
-			goto yy743;
-		} else {
-			if (yych <= 0xC1) goto yy727;
-			if (yych >= 0xE0) goto yy746;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy748;
-			goto yy747;
-		} else {
-			if (yych <= 0xF0) goto yy749;
-			if (yych <= 0xF3) goto yy750;
-			if (yych <= 0xF4) goto yy751;
-			goto yy727;
-		}
-	}
-yy745:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy739;
-	goto yy727;
-yy746:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy727;
-	if (yych <= 0xBF) goto yy745;
-	goto yy727;
-yy747:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy745;
-	goto yy727;
-yy748:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0x9F) goto yy745;
-	goto yy727;
-yy749:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy727;
-	if (yych <= 0xBF) goto yy747;
-	goto yy727;
-yy750:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy747;
-	goto yy727;
-yy751:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0x8F) goto yy747;
-	goto yy727;
-yy752:
-	yych = *++p;
-yy753:
-	if (yybm[0+yych] & 128) {
-		goto yy752;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy727;
-			if (yych >= '*') goto yy756;
-		} else {
-			if (yych <= 0xC1) goto yy727;
-			if (yych <= 0xDF) goto yy758;
-			goto yy759;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy761;
-			goto yy760;
-		} else {
-			if (yych <= 0xF0) goto yy762;
-			if (yych <= 0xF3) goto yy763;
-			if (yych <= 0xF4) goto yy764;
-			goto yy727;
-		}
-	}
-yy754:
-	++p;
-yy755:
-	{ return (bufsize_t)(p - start); }
-yy756:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy752;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy727;
-			if (yych <= ')') goto yy767;
-			goto yy756;
-		} else {
-			if (yych <= 0xC1) goto yy727;
-			if (yych >= 0xE0) goto yy759;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy761;
-			goto yy760;
-		} else {
-			if (yych <= 0xF0) goto yy762;
-			if (yych <= 0xF3) goto yy763;
-			if (yych <= 0xF4) goto yy764;
-			goto yy727;
-		}
-	}
-yy758:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy752;
-	goto yy727;
-yy759:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy727;
-	if (yych <= 0xBF) goto yy758;
-	goto yy727;
-yy760:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy758;
-	goto yy727;
-yy761:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0x9F) goto yy758;
-	goto yy727;
-yy762:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy727;
-	if (yych <= 0xBF) goto yy760;
-	goto yy727;
-yy763:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0xBF) goto yy760;
-	goto yy727;
-yy764:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy727;
-	if (yych <= 0x8F) goto yy760;
-	goto yy727;
-yy765:
-	yyaccept = 1;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 16) {
-		goto yy725;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy729;
-			if (yych <= '"') goto yy728;
-			goto yy730;
-		} else {
-			if (yych <= 0xC1) goto yy729;
-			if (yych <= 0xDF) goto yy732;
-			goto yy733;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy735;
-			goto yy734;
-		} else {
-			if (yych <= 0xF0) goto yy736;
-			if (yych <= 0xF3) goto yy737;
-			if (yych <= 0xF4) goto yy738;
-			goto yy729;
-		}
-	}
-yy766:
-	yyaccept = 2;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 64) {
-		goto yy739;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy742;
-			if (yych <= '\'') goto yy741;
-			goto yy743;
-		} else {
-			if (yych <= 0xC1) goto yy742;
-			if (yych <= 0xDF) goto yy745;
-			goto yy746;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy748;
-			goto yy747;
-		} else {
-			if (yych <= 0xF0) goto yy749;
-			if (yych <= 0xF3) goto yy750;
-			if (yych <= 0xF4) goto yy751;
-			goto yy742;
-		}
-	}
-yy767:
-	yyaccept = 3;
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 128) {
-		goto yy752;
-	}
-	if (yych <= 0xE0) {
-		if (yych <= '\\') {
-			if (yych <= 0x00) goto yy755;
-			if (yych <= ')') goto yy754;
-			goto yy756;
-		} else {
-			if (yych <= 0xC1) goto yy755;
-			if (yych <= 0xDF) goto yy758;
-			goto yy759;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych == 0xED) goto yy761;
-			goto yy760;
-		} else {
-			if (yych <= 0xF0) goto yy762;
-			if (yych <= 0xF3) goto yy763;
-			if (yych <= 0xF4) goto yy764;
-			goto yy755;
-		}
-	}
-}
-
-}
-
-// Match space characters, including newlines.
-bufsize_t _scan_spacechars(const unsigned char *p)
-{
-  const unsigned char *start = p; \
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0, 128, 128, 128, 128, 128,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		128,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yybm[0+yych] & 128) {
-		goto yy772;
-	}
-	++p;
-	{ return 0; }
-yy772:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy772;
-	}
-	{ return (bufsize_t)(p - start); }
-}
-
-}
-
-// Match ATX heading start.
-bufsize_t _scan_atx_heading_start(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0, 128,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		128,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych == '#') goto yy779;
-	++p;
-yy778:
-	{ return 0; }
-yy779:
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 128) {
-		goto yy780;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy778;
-		if (yych <= '\n') goto yy783;
-		goto yy778;
-	} else {
-		if (yych <= '\r') goto yy783;
-		if (yych == '#') goto yy784;
-		goto yy778;
-	}
-yy780:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy780;
-	}
-yy782:
-	{ return (bufsize_t)(p - start); }
-yy783:
-	++p;
-	goto yy782;
-yy784:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy780;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy785;
-		if (yych <= '\n') goto yy783;
-	} else {
-		if (yych <= '\r') goto yy783;
-		if (yych == '#') goto yy786;
-	}
-yy785:
-	p = marker;
-	goto yy778;
-yy786:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy780;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy785;
-		if (yych <= '\n') goto yy783;
-		goto yy785;
-	} else {
-		if (yych <= '\r') goto yy783;
-		if (yych != '#') goto yy785;
-	}
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy780;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy785;
-		if (yych <= '\n') goto yy783;
-		goto yy785;
-	} else {
-		if (yych <= '\r') goto yy783;
-		if (yych != '#') goto yy785;
-	}
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy780;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy785;
-		if (yych <= '\n') goto yy783;
-		goto yy785;
-	} else {
-		if (yych <= '\r') goto yy783;
-		if (yych != '#') goto yy785;
-	}
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy780;
-	}
-	if (yych <= 0x08) goto yy785;
-	if (yych <= '\n') goto yy783;
-	if (yych == '\r') goto yy783;
-	goto yy785;
-}
-
-}
-
-// Match setext heading line.  Return 1 for level-1 heading,
-// 2 for level-2, 0 for no match.
-bufsize_t _scan_setext_heading_line(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,  32,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		 32,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,  64,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0, 128,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych == '-') goto yy794;
-	if (yych == '=') goto yy795;
-	++p;
-yy793:
-	{ return 0; }
-yy794:
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 64) {
-		goto yy801;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy793;
-		if (yych <= '\n') goto yy797;
-		goto yy793;
-	} else {
-		if (yych <= '\r') goto yy797;
-		if (yych == ' ') goto yy797;
-		goto yy793;
-	}
-yy795:
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 128) {
-		goto yy807;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy793;
-		if (yych <= '\n') goto yy804;
-		goto yy793;
-	} else {
-		if (yych <= '\r') goto yy804;
-		if (yych == ' ') goto yy804;
-		goto yy793;
-	}
-yy796:
-	yych = *++p;
-yy797:
-	if (yybm[0+yych] & 32) {
-		goto yy796;
-	}
-	if (yych <= 0x08) goto yy798;
-	if (yych <= '\n') goto yy799;
-	if (yych == '\r') goto yy799;
-yy798:
-	p = marker;
-	goto yy793;
-yy799:
-	++p;
-	{ return 2; }
-yy801:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy796;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy798;
-		if (yych <= '\n') goto yy799;
-		goto yy798;
-	} else {
-		if (yych <= '\r') goto yy799;
-		if (yych == '-') goto yy801;
-		goto yy798;
-	}
-yy803:
-	yych = *++p;
-yy804:
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy798;
-		if (yych <= '\t') goto yy803;
-		if (yych >= '\v') goto yy798;
-	} else {
-		if (yych <= '\r') goto yy805;
-		if (yych == ' ') goto yy803;
-		goto yy798;
-	}
-yy805:
-	++p;
-	{ return 1; }
-yy807:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy807;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy798;
-		if (yych <= '\t') goto yy803;
-		if (yych <= '\n') goto yy805;
-		goto yy798;
-	} else {
-		if (yych <= '\r') goto yy805;
-		if (yych == ' ') goto yy803;
-		goto yy798;
-	}
-}
-
-}
-
-// Scan a thematic break line: "...three or more hyphens, asterisks,
-// or underscores on a line by themselves. If you wish, you may use
-// spaces between the hyphens or asterisks."
-bufsize_t _scan_thematic_break(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0, 240,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		240,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,  32,   0,   0,  64,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0, 128, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych <= ',') {
-		if (yych == '*') goto yy813;
-	} else {
-		if (yych <= '-') goto yy814;
-		if (yych == '_') goto yy815;
-	}
-	++p;
-yy812:
-	{ return 0; }
-yy813:
-	yych = *(marker = ++p);
-	if (yybm[0+yych] & 16) {
-		goto yy816;
-	}
-	if (yych == '*') goto yy819;
-	goto yy812;
-yy814:
-	yych = *(marker = ++p);
-	if (yych <= 0x1F) {
-		if (yych == '\t') goto yy821;
-		goto yy812;
-	} else {
-		if (yych <= ' ') goto yy821;
-		if (yych == '-') goto yy823;
-		goto yy812;
-	}
-yy815:
-	yych = *(marker = ++p);
-	if (yych <= 0x1F) {
-		if (yych == '\t') goto yy825;
-		goto yy812;
-	} else {
-		if (yych <= ' ') goto yy825;
-		if (yych == '_') goto yy827;
-		goto yy812;
-	}
-yy816:
-	yych = *++p;
-	if (yybm[0+yych] & 16) {
-		goto yy816;
-	}
-	if (yych == '*') goto yy819;
-yy818:
-	p = marker;
-	goto yy812;
-yy819:
-	yych = *++p;
-	if (yych <= 0x1F) {
-		if (yych == '\t') goto yy819;
-		goto yy818;
-	} else {
-		if (yych <= ' ') goto yy819;
-		if (yych == '*') goto yy829;
-		goto yy818;
-	}
-yy821:
-	yych = *++p;
-	if (yych <= 0x1F) {
-		if (yych == '\t') goto yy821;
-		goto yy818;
-	} else {
-		if (yych <= ' ') goto yy821;
-		if (yych != '-') goto yy818;
-	}
-yy823:
-	yych = *++p;
-	if (yych <= 0x1F) {
-		if (yych == '\t') goto yy823;
-		goto yy818;
-	} else {
-		if (yych <= ' ') goto yy823;
-		if (yych == '-') goto yy831;
-		goto yy818;
-	}
-yy825:
-	yych = *++p;
-	if (yych <= 0x1F) {
-		if (yych == '\t') goto yy825;
-		goto yy818;
-	} else {
-		if (yych <= ' ') goto yy825;
-		if (yych != '_') goto yy818;
-	}
-yy827:
-	yych = *++p;
-	if (yych <= 0x1F) {
-		if (yych == '\t') goto yy827;
-		goto yy818;
-	} else {
-		if (yych <= ' ') goto yy827;
-		if (yych == '_') goto yy833;
-		goto yy818;
-	}
-yy829:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy829;
-	}
-	if (yych <= 0x08) goto yy818;
-	if (yych <= '\n') goto yy835;
-	if (yych == '\r') goto yy835;
-	goto yy818;
-yy831:
-	yych = *++p;
-	if (yybm[0+yych] & 64) {
-		goto yy831;
-	}
-	if (yych <= 0x08) goto yy818;
-	if (yych <= '\n') goto yy837;
-	if (yych == '\r') goto yy837;
-	goto yy818;
-yy833:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy833;
-	}
-	if (yych <= 0x08) goto yy818;
-	if (yych <= '\n') goto yy839;
-	if (yych == '\r') goto yy839;
-	goto yy818;
-yy835:
-	++p;
-	{ return (bufsize_t)(p - start); }
-yy837:
-	++p;
-	{ return (bufsize_t)(p - start); }
-yy839:
-	++p;
-	{ return (bufsize_t)(p - start); }
-}
-
-}
-
-// Scan an opening code fence.
-bufsize_t _scan_open_code_fence(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192,   0, 192, 192,   0, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		144, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 192, 192, 
-		192, 192, 192, 192, 192, 192, 224, 192, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych == '`') goto yy845;
-	if (yych == '~') goto yy846;
-	++p;
-yy844:
-	{ return 0; }
-yy845:
-	yych = *(marker = ++p);
-	if (yych == '`') goto yy847;
-	goto yy844;
-yy846:
-	yych = *(marker = ++p);
-	if (yych == '~') goto yy849;
-	goto yy844;
-yy847:
-	yych = *++p;
-	if (yybm[0+yych] & 16) {
-		goto yy850;
-	}
-yy848:
-	p = marker;
-	goto yy844;
-yy849:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy852;
-	}
-	goto yy848;
-yy850:
-	yych = *++p;
-	if (yybm[0+yych] & 16) {
-		goto yy850;
-	}
-	if (yych <= 0xDF) {
-		if (yych <= '\f') {
-			if (yych <= 0x00) goto yy848;
-			if (yych == '\n') {
-				marker = p;
-				goto yy856;
-			}
-			marker = p;
-			goto yy854;
-		} else {
-			if (yych <= '\r') {
-				marker = p;
-				goto yy856;
-			}
-			if (yych <= 0x7F) {
-				marker = p;
-				goto yy854;
-			}
-			if (yych <= 0xC1) goto yy848;
-			marker = p;
-			goto yy858;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych <= 0xE0) {
-				marker = p;
-				goto yy859;
-			}
-			if (yych == 0xED) {
-				marker = p;
-				goto yy861;
-			}
-			marker = p;
-			goto yy860;
-		} else {
-			if (yych <= 0xF0) {
-				marker = p;
-				goto yy862;
-			}
-			if (yych <= 0xF3) {
-				marker = p;
-				goto yy863;
-			}
-			if (yych <= 0xF4) {
-				marker = p;
-				goto yy864;
-			}
-			goto yy848;
-		}
-	}
-yy852:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy852;
-	}
-	if (yych <= 0xDF) {
-		if (yych <= '\f') {
-			if (yych <= 0x00) goto yy848;
-			if (yych == '\n') {
-				marker = p;
-				goto yy867;
-			}
-			marker = p;
-			goto yy865;
-		} else {
-			if (yych <= '\r') {
-				marker = p;
-				goto yy867;
-			}
-			if (yych <= 0x7F) {
-				marker = p;
-				goto yy865;
-			}
-			if (yych <= 0xC1) goto yy848;
-			marker = p;
-			goto yy869;
-		}
-	} else {
-		if (yych <= 0xEF) {
-			if (yych <= 0xE0) {
-				marker = p;
-				goto yy870;
-			}
-			if (yych == 0xED) {
-				marker = p;
-				goto yy872;
-			}
-			marker = p;
-			goto yy871;
-		} else {
-			if (yych <= 0xF0) {
-				marker = p;
-				goto yy873;
-			}
-			if (yych <= 0xF3) {
-				marker = p;
-				goto yy874;
-			}
-			if (yych <= 0xF4) {
-				marker = p;
-				goto yy875;
-			}
-			goto yy848;
-		}
-	}
-yy854:
-	yych = *++p;
-	if (yybm[0+yych] & 64) {
-		goto yy854;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= 0x00) goto yy848;
-			if (yych >= 0x0E) goto yy848;
-		} else {
-			if (yych <= 0xDF) goto yy858;
-			if (yych <= 0xE0) goto yy859;
-			goto yy860;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy861;
-			if (yych <= 0xEF) goto yy860;
-			goto yy862;
-		} else {
-			if (yych <= 0xF3) goto yy863;
-			if (yych <= 0xF4) goto yy864;
-			goto yy848;
-		}
-	}
-yy856:
-	++p;
-	p = marker;
-	{ return (bufsize_t)(p - start); }
-yy858:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0xBF) goto yy854;
-	goto yy848;
-yy859:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy848;
-	if (yych <= 0xBF) goto yy858;
-	goto yy848;
-yy860:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0xBF) goto yy858;
-	goto yy848;
-yy861:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0x9F) goto yy858;
-	goto yy848;
-yy862:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy848;
-	if (yych <= 0xBF) goto yy860;
-	goto yy848;
-yy863:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0xBF) goto yy860;
-	goto yy848;
-yy864:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0x8F) goto yy860;
-	goto yy848;
-yy865:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy865;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= 0x00) goto yy848;
-			if (yych >= 0x0E) goto yy848;
-		} else {
-			if (yych <= 0xDF) goto yy869;
-			if (yych <= 0xE0) goto yy870;
-			goto yy871;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy872;
-			if (yych <= 0xEF) goto yy871;
-			goto yy873;
-		} else {
-			if (yych <= 0xF3) goto yy874;
-			if (yych <= 0xF4) goto yy875;
-			goto yy848;
-		}
-	}
-yy867:
-	++p;
-	p = marker;
-	{ return (bufsize_t)(p - start); }
-yy869:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0xBF) goto yy865;
-	goto yy848;
-yy870:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy848;
-	if (yych <= 0xBF) goto yy869;
-	goto yy848;
-yy871:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0xBF) goto yy869;
-	goto yy848;
-yy872:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0x9F) goto yy869;
-	goto yy848;
-yy873:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy848;
-	if (yych <= 0xBF) goto yy871;
-	goto yy848;
-yy874:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0xBF) goto yy871;
-	goto yy848;
-yy875:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy848;
-	if (yych <= 0x8F) goto yy871;
-	goto yy848;
-}
-
-}
-
-// Scan a closing code fence with length at least len.
-bufsize_t _scan_close_code_fence(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0, 128,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		128,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		 32,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,  64,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych == '`') goto yy880;
-	if (yych == '~') goto yy881;
-	++p;
-yy879:
-	{ return 0; }
-yy880:
-	yych = *(marker = ++p);
-	if (yych == '`') goto yy882;
-	goto yy879;
-yy881:
-	yych = *(marker = ++p);
-	if (yych == '~') goto yy884;
-	goto yy879;
-yy882:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy885;
-	}
-yy883:
-	p = marker;
-	goto yy879;
-yy884:
-	yych = *++p;
-	if (yybm[0+yych] & 64) {
-		goto yy887;
-	}
-	goto yy883;
-yy885:
-	yych = *++p;
-	if (yybm[0+yych] & 32) {
-		goto yy885;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy883;
-		if (yych <= '\t') {
-			marker = p;
-			goto yy889;
-		}
-		if (yych <= '\n') {
-			marker = p;
-			goto yy891;
-		}
-		goto yy883;
-	} else {
-		if (yych <= '\r') {
-			marker = p;
-			goto yy891;
-		}
-		if (yych == ' ') {
-			marker = p;
-			goto yy889;
-		}
-		goto yy883;
-	}
-yy887:
-	yych = *++p;
-	if (yybm[0+yych] & 64) {
-		goto yy887;
-	}
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy883;
-		if (yych <= '\t') {
-			marker = p;
-			goto yy893;
-		}
-		if (yych <= '\n') {
-			marker = p;
-			goto yy895;
-		}
-		goto yy883;
-	} else {
-		if (yych <= '\r') {
-			marker = p;
-			goto yy895;
-		}
-		if (yych == ' ') {
-			marker = p;
-			goto yy893;
-		}
-		goto yy883;
-	}
-yy889:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy889;
-	}
-	if (yych <= 0x08) goto yy883;
-	if (yych <= '\n') goto yy891;
-	if (yych != '\r') goto yy883;
-yy891:
-	++p;
-	p = marker;
-	{ return (bufsize_t)(p - start); }
-yy893:
-	yych = *++p;
-	if (yych <= '\f') {
-		if (yych <= 0x08) goto yy883;
-		if (yych <= '\t') goto yy893;
-		if (yych >= '\v') goto yy883;
-	} else {
-		if (yych <= '\r') goto yy895;
-		if (yych == ' ') goto yy893;
-		goto yy883;
-	}
-yy895:
-	++p;
-	p = marker;
-	{ return (bufsize_t)(p - start); }
-}
-
-}
-
-// Scans an entity.
-// Returns number of chars matched.
-bufsize_t _scan_entity(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	yych = *p;
-	if (yych == '&') goto yy901;
-	++p;
-yy900:
-	{ return 0; }
-yy901:
-	yych = *(marker = ++p);
-	if (yych <= '@') {
-		if (yych != '#') goto yy900;
-	} else {
-		if (yych <= 'Z') goto yy904;
-		if (yych <= '`') goto yy900;
-		if (yych <= 'z') goto yy904;
-		goto yy900;
-	}
-	yych = *++p;
-	if (yych <= 'W') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy905;
-	} else {
-		if (yych <= 'X') goto yy906;
-		if (yych == 'x') goto yy906;
-	}
-yy903:
-	p = marker;
-	goto yy900;
-yy904:
-	yych = *++p;
-	if (yych <= '@') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy907;
-		goto yy903;
-	} else {
-		if (yych <= 'Z') goto yy907;
-		if (yych <= '`') goto yy903;
-		if (yych <= 'z') goto yy907;
-		goto yy903;
-	}
-yy905:
-	yych = *++p;
-	if (yych <= '/') goto yy903;
-	if (yych <= '9') goto yy908;
-	if (yych == ';') goto yy909;
-	goto yy903;
-yy906:
-	yych = *++p;
-	if (yych <= '@') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy911;
-		goto yy903;
-	} else {
-		if (yych <= 'F') goto yy911;
-		if (yych <= '`') goto yy903;
-		if (yych <= 'f') goto yy911;
-		goto yy903;
-	}
-yy907:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy912;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-			goto yy912;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'z') goto yy912;
-			goto yy903;
-		}
-	}
-yy908:
-	yych = *++p;
-	if (yych <= '/') goto yy903;
-	if (yych <= '9') goto yy913;
-	if (yych != ';') goto yy903;
-yy909:
-	++p;
-	{ return (bufsize_t)(p - start); }
-yy911:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy914;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'F') {
-			if (yych <= '@') goto yy903;
-			goto yy914;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'f') goto yy914;
-			goto yy903;
-		}
-	}
-yy912:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy915;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-			goto yy915;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'z') goto yy915;
-			goto yy903;
-		}
-	}
-yy913:
-	yych = *++p;
-	if (yych <= '/') goto yy903;
-	if (yych <= '9') goto yy916;
-	if (yych == ';') goto yy909;
-	goto yy903;
-yy914:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy917;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'F') {
-			if (yych <= '@') goto yy903;
-			goto yy917;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'f') goto yy917;
-			goto yy903;
-		}
-	}
-yy915:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy918;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-			goto yy918;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'z') goto yy918;
-			goto yy903;
-		}
-	}
-yy916:
-	yych = *++p;
-	if (yych <= '/') goto yy903;
-	if (yych <= '9') goto yy919;
-	if (yych == ';') goto yy909;
-	goto yy903;
-yy917:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy920;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'F') {
-			if (yych <= '@') goto yy903;
-			goto yy920;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'f') goto yy920;
-			goto yy903;
-		}
-	}
-yy918:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy921;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-			goto yy921;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'z') goto yy921;
-			goto yy903;
-		}
-	}
-yy919:
-	yych = *++p;
-	if (yych <= '/') goto yy903;
-	if (yych <= '9') goto yy922;
-	if (yych == ';') goto yy909;
-	goto yy903;
-yy920:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy923;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'F') {
-			if (yych <= '@') goto yy903;
-			goto yy923;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'f') goto yy923;
-			goto yy903;
-		}
-	}
-yy921:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy924;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-			goto yy924;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'z') goto yy924;
-			goto yy903;
-		}
-	}
-yy922:
-	yych = *++p;
-	if (yych <= '/') goto yy903;
-	if (yych <= '9') goto yy925;
-	if (yych == ';') goto yy909;
-	goto yy903;
-yy923:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy925;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'F') {
-			if (yych <= '@') goto yy903;
-			goto yy925;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'f') goto yy925;
-			goto yy903;
-		}
-	}
-yy924:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy926;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-			goto yy926;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'z') goto yy926;
-			goto yy903;
-		}
-	}
-yy925:
-	yych = *++p;
-	if (yych == ';') goto yy909;
-	goto yy903;
-yy926:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy927;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy927:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy928;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy928:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy929;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy929:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy930;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy930:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy931;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy931:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy932;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy932:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy933;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy933:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy934;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy934:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy935;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy935:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy936;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy936:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy937;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy937:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy938;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy938:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy939;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy939:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy940;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy940:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy941;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy941:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy942;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy942:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy943;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy943:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy944;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy944:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy945;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy945:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy946;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy946:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy947;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy947:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy948;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy948:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy949;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych >= '{') goto yy903;
-		}
-	}
-yy949:
-	yych = *++p;
-	if (yych <= ';') {
-		if (yych <= '/') goto yy903;
-		if (yych <= '9') goto yy925;
-		if (yych <= ':') goto yy903;
-		goto yy909;
-	} else {
-		if (yych <= 'Z') {
-			if (yych <= '@') goto yy903;
-			goto yy925;
-		} else {
-			if (yych <= '`') goto yy903;
-			if (yych <= 'z') goto yy925;
-			goto yy903;
-		}
-	}
-}
-
-}
-
-// Returns positive value if a URL begins in a way that is potentially
-// dangerous, with javascript:, vbscript:, file:, or data:, otherwise 0.
-bufsize_t _scan_dangerous_url(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	unsigned int yyaccept = 0;
-	yych = *p;
-	if (yych <= 'V') {
-		if (yych <= 'F') {
-			if (yych == 'D') goto yy954;
-			if (yych >= 'F') goto yy955;
-		} else {
-			if (yych == 'J') goto yy956;
-			if (yych >= 'V') goto yy957;
-		}
-	} else {
-		if (yych <= 'f') {
-			if (yych == 'd') goto yy954;
-			if (yych >= 'f') goto yy955;
-		} else {
-			if (yych <= 'j') {
-				if (yych >= 'j') goto yy956;
-			} else {
-				if (yych == 'v') goto yy957;
-			}
-		}
-	}
-	++p;
-yy953:
-	{ return 0; }
-yy954:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych == 'A') goto yy958;
-	if (yych == 'a') goto yy958;
-	goto yy953;
-yy955:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych == 'I') goto yy960;
-	if (yych == 'i') goto yy960;
-	goto yy953;
-yy956:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych == 'A') goto yy961;
-	if (yych == 'a') goto yy961;
-	goto yy953;
-yy957:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych == 'B') goto yy962;
-	if (yych == 'b') goto yy962;
-	goto yy953;
-yy958:
-	yych = *++p;
-	if (yych == 'T') goto yy963;
-	if (yych == 't') goto yy963;
-yy959:
-	p = marker;
-	if (yyaccept == 0) {
-		goto yy953;
-	} else {
-		goto yy971;
-	}
-yy960:
-	yych = *++p;
-	if (yych == 'L') goto yy964;
-	if (yych == 'l') goto yy964;
-	goto yy959;
-yy961:
-	yych = *++p;
-	if (yych == 'V') goto yy965;
-	if (yych == 'v') goto yy965;
-	goto yy959;
-yy962:
-	yych = *++p;
-	if (yych == 'S') goto yy966;
-	if (yych == 's') goto yy966;
-	goto yy959;
-yy963:
-	yych = *++p;
-	if (yych == 'A') goto yy967;
-	if (yych == 'a') goto yy967;
-	goto yy959;
-yy964:
-	yych = *++p;
-	if (yych == 'E') goto yy968;
-	if (yych == 'e') goto yy968;
-	goto yy959;
-yy965:
-	yych = *++p;
-	if (yych == 'A') goto yy962;
-	if (yych == 'a') goto yy962;
-	goto yy959;
-yy966:
-	yych = *++p;
-	if (yych == 'C') goto yy969;
-	if (yych == 'c') goto yy969;
-	goto yy959;
-yy967:
-	yych = *++p;
-	if (yych == ':') goto yy970;
-	goto yy959;
-yy968:
-	yych = *++p;
-	if (yych == ':') goto yy972;
-	goto yy959;
-yy969:
-	yych = *++p;
-	if (yych == 'R') goto yy973;
-	if (yych == 'r') goto yy973;
-	goto yy959;
-yy970:
-	yyaccept = 1;
-	yych = *(marker = ++p);
-	if (yych == 'I') goto yy974;
-	if (yych == 'i') goto yy974;
-yy971:
-	{ return (bufsize_t)(p - start); }
-yy972:
-	++p;
-	goto yy971;
-yy973:
-	yych = *++p;
-	if (yych == 'I') goto yy975;
-	if (yych == 'i') goto yy975;
-	goto yy959;
-yy974:
-	yych = *++p;
-	if (yych == 'M') goto yy976;
-	if (yych == 'm') goto yy976;
-	goto yy959;
-yy975:
-	yych = *++p;
-	if (yych == 'P') goto yy977;
-	if (yych == 'p') goto yy977;
-	goto yy959;
-yy976:
-	yych = *++p;
-	if (yych == 'A') goto yy978;
-	if (yych == 'a') goto yy978;
-	goto yy959;
-yy977:
-	yych = *++p;
-	if (yych == 'T') goto yy968;
-	if (yych == 't') goto yy968;
-	goto yy959;
-yy978:
-	yych = *++p;
-	if (yych == 'G') goto yy979;
-	if (yych != 'g') goto yy959;
-yy979:
-	yych = *++p;
-	if (yych == 'E') goto yy980;
-	if (yych != 'e') goto yy959;
-yy980:
-	yych = *++p;
-	if (yych != '/') goto yy959;
-	yych = *++p;
-	if (yych <= 'W') {
-		if (yych <= 'J') {
-			if (yych == 'G') goto yy982;
-			if (yych <= 'I') goto yy959;
-			goto yy983;
-		} else {
-			if (yych == 'P') goto yy984;
-			if (yych <= 'V') goto yy959;
-			goto yy985;
-		}
-	} else {
-		if (yych <= 'j') {
-			if (yych == 'g') goto yy982;
-			if (yych <= 'i') goto yy959;
-			goto yy983;
-		} else {
-			if (yych <= 'p') {
-				if (yych <= 'o') goto yy959;
-				goto yy984;
-			} else {
-				if (yych == 'w') goto yy985;
-				goto yy959;
-			}
-		}
-	}
-yy982:
-	yych = *++p;
-	if (yych == 'I') goto yy986;
-	if (yych == 'i') goto yy986;
-	goto yy959;
-yy983:
-	yych = *++p;
-	if (yych == 'P') goto yy987;
-	if (yych == 'p') goto yy987;
-	goto yy959;
-yy984:
-	yych = *++p;
-	if (yych == 'N') goto yy988;
-	if (yych == 'n') goto yy988;
-	goto yy959;
-yy985:
-	yych = *++p;
-	if (yych == 'E') goto yy989;
-	if (yych == 'e') goto yy989;
-	goto yy959;
-yy986:
-	yych = *++p;
-	if (yych == 'F') goto yy990;
-	if (yych == 'f') goto yy990;
-	goto yy959;
-yy987:
-	yych = *++p;
-	if (yych == 'E') goto yy988;
-	if (yych != 'e') goto yy959;
-yy988:
-	yych = *++p;
-	if (yych == 'G') goto yy990;
-	if (yych == 'g') goto yy990;
-	goto yy959;
-yy989:
-	yych = *++p;
-	if (yych == 'B') goto yy992;
-	if (yych == 'b') goto yy992;
-	goto yy959;
-yy990:
-	++p;
-	{ return 0; }
-yy992:
-	yych = *++p;
-	if (yych == 'P') goto yy990;
-	if (yych == 'p') goto yy990;
-	goto yy959;
-}
-
-}
-
-// Scans a footnote definition opening.
-bufsize_t _scan_footnote_definition(const unsigned char *p)
-{
-  const unsigned char *marker = NULL;
-  const unsigned char *start = p;
-
-{
-	unsigned char yych;
-	static const unsigned char yybm[] = {
-		  0,  64,  64,  64,  64,  64,  64,  64, 
-		 64, 128,   0,  64,  64,   0,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		128,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,   0,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		 64,  64,  64,  64,  64,  64,  64,  64, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-		  0,   0,   0,   0,   0,   0,   0,   0, 
-	};
-	yych = *p;
-	if (yych == '[') goto yy997;
-	++p;
-yy996:
-	{ return 0; }
-yy997:
-	yych = *(marker = ++p);
-	if (yych != '^') goto yy996;
-	yych = *++p;
-	if (yych != ']') goto yy1001;
-yy999:
-	p = marker;
-	goto yy996;
-yy1000:
-	yych = *++p;
-yy1001:
-	if (yybm[0+yych] & 64) {
-		goto yy1000;
-	}
-	if (yych <= 0xEC) {
-		if (yych <= 0xC1) {
-			if (yych <= ' ') goto yy999;
-			if (yych <= ']') goto yy1009;
-			goto yy999;
-		} else {
-			if (yych <= 0xDF) goto yy1002;
-			if (yych <= 0xE0) goto yy1003;
-			goto yy1004;
-		}
-	} else {
-		if (yych <= 0xF0) {
-			if (yych <= 0xED) goto yy1005;
-			if (yych <= 0xEF) goto yy1004;
-			goto yy1006;
-		} else {
-			if (yych <= 0xF3) goto yy1007;
-			if (yych <= 0xF4) goto yy1008;
-			goto yy999;
-		}
-	}
-yy1002:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy999;
-	if (yych <= 0xBF) goto yy1000;
-	goto yy999;
-yy1003:
-	yych = *++p;
-	if (yych <= 0x9F) goto yy999;
-	if (yych <= 0xBF) goto yy1002;
-	goto yy999;
-yy1004:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy999;
-	if (yych <= 0xBF) goto yy1002;
-	goto yy999;
-yy1005:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy999;
-	if (yych <= 0x9F) goto yy1002;
-	goto yy999;
-yy1006:
-	yych = *++p;
-	if (yych <= 0x8F) goto yy999;
-	if (yych <= 0xBF) goto yy1004;
-	goto yy999;
-yy1007:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy999;
-	if (yych <= 0xBF) goto yy1004;
-	goto yy999;
-yy1008:
-	yych = *++p;
-	if (yych <= 0x7F) goto yy999;
-	if (yych <= 0x8F) goto yy1004;
-	goto yy999;
-yy1009:
-	yych = *++p;
-	if (yych != ':') goto yy999;
-yy1010:
-	yych = *++p;
-	if (yybm[0+yych] & 128) {
-		goto yy1010;
+		 80,  80, 208, 208, 208, 208, 208, 208, 
+		208, 208, 208, 208, 208, 208, 208, 208, 
+		208, 208, 208, 208, 208, 208, 208, 208, 
+		208, 208, 208, 208, 208, 208, 208, 208, 
+		208, 208, 208, 208, 208, 208, 208, 208, 
+		208, 208, 208, 208, 208, 208, 208, 208, 
+		208, 208, 208, 208,  32, 208, 208, 208, 
+		208, 208, 208, 208, 208, 208, 208, 208, 
+		208, 208, 208, 208, 208, 208, 208, 208, 
+		208, 208, 208, 208, 208, 208, 208, 208, 
+		208, 208, 208, 208, 208, 208, 208, 208, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+	};
+	yych = *p;
+	if (yych <= '&') {
+		if (yych == '"') goto yy722;
+	} else {
+		if (yych <= '\'') goto yy723;
+		if (yych <= '(') goto yy724;
+	}
+	++p;
+yy721:
+	{ return 0; }
+yy722:
+	yyaccept = 0;
+	yych = *(marker = ++p);
+	if (yych <= 0x00) goto yy721;
+	if (yych <= 0x7F) goto yy726;
+	if (yych <= 0xC1) goto yy721;
+	if (yych <= 0xF4) goto yy726;
+	goto yy721;
+yy723:
+	yyaccept = 0;
+	yych = *(marker = ++p);
+	if (yych <= 0x00) goto yy721;
+	if (yych <= 0x7F) goto yy740;
+	if (yych <= 0xC1) goto yy721;
+	if (yych <= 0xF4) goto yy740;
+	goto yy721;
+yy724:
+	yyaccept = 0;
+	yych = *(marker = ++p);
+	if (yych <= '(') {
+		if (yych <= 0x00) goto yy721;
+		if (yych <= '\'') goto yy753;
+		goto yy721;
+	} else {
+		if (yych <= 0x7F) goto yy753;
+		if (yych <= 0xC1) goto yy721;
+		if (yych <= 0xF4) goto yy753;
+		goto yy721;
+	}
+yy725:
+	yych = *++p;
+yy726:
+	if (yybm[0+yych] & 16) {
+		goto yy725;
+	}
+	if (yych <= 0xE0) {
+		if (yych <= '\\') {
+			if (yych <= 0x00) goto yy727;
+			if (yych <= '"') goto yy728;
+			goto yy730;
+		} else {
+			if (yych <= 0xC1) goto yy727;
+			if (yych <= 0xDF) goto yy732;
+			goto yy733;
+		}
+	} else {
+		if (yych <= 0xEF) {
+			if (yych == 0xED) goto yy735;
+			goto yy734;
+		} else {
+			if (yych <= 0xF0) goto yy736;
+			if (yych <= 0xF3) goto yy737;
+			if (yych <= 0xF4) goto yy738;
+		}
+	}
+yy727:
+	p = marker;
+	if (yyaccept <= 1) {
+		if (yyaccept == 0) {
+			goto yy721;
+		} else {
+			goto yy729;
+		}
+	} else {
+		if (yyaccept == 2) {
+			goto yy742;
+		} else {
+			goto yy755;
+		}
+	}
+yy728:
+	++p;
+yy729:
+	{ return (bufsize_t)(p - start); }
+yy730:
+	yych = *++p;
+	if (yybm[0+yych] & 16) {
+		goto yy725;
+	}
+	if (yych <= 0xE0) {
+		if (yych <= '\\') {
+			if (yych <= 0x00) goto yy727;
+			if (yych <= '"') goto yy765;
+			goto yy730;
+		} else {
+			if (yych <= 0xC1) goto yy727;
+			if (yych >= 0xE0) goto yy733;
+		}
+	} else {
+		if (yych <= 0xEF) {
+			if (yych == 0xED) goto yy735;
+			goto yy734;
+		} else {
+			if (yych <= 0xF0) goto yy736;
+			if (yych <= 0xF3) goto yy737;
+			if (yych <= 0xF4) goto yy738;
+			goto yy727;
+		}
+	}
+yy732:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0xBF) goto yy725;
+	goto yy727;
+yy733:
+	yych = *++p;
+	if (yych <= 0x9F) goto yy727;
+	if (yych <= 0xBF) goto yy732;
+	goto yy727;
+yy734:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0xBF) goto yy732;
+	goto yy727;
+yy735:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0x9F) goto yy732;
+	goto yy727;
+yy736:
+	yych = *++p;
+	if (yych <= 0x8F) goto yy727;
+	if (yych <= 0xBF) goto yy734;
+	goto yy727;
+yy737:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0xBF) goto yy734;
+	goto yy727;
+yy738:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0x8F) goto yy734;
+	goto yy727;
+yy739:
+	yych = *++p;
+yy740:
+	if (yybm[0+yych] & 64) {
+		goto yy739;
+	}
+	if (yych <= 0xE0) {
+		if (yych <= '\\') {
+			if (yych <= 0x00) goto yy727;
+			if (yych >= '(') goto yy743;
+		} else {
+			if (yych <= 0xC1) goto yy727;
+			if (yych <= 0xDF) goto yy745;
+			goto yy746;
+		}
+	} else {
+		if (yych <= 0xEF) {
+			if (yych == 0xED) goto yy748;
+			goto yy747;
+		} else {
+			if (yych <= 0xF0) goto yy749;
+			if (yych <= 0xF3) goto yy750;
+			if (yych <= 0xF4) goto yy751;
+			goto yy727;
+		}
+	}
+yy741:
+	++p;
+yy742:
+	{ return (bufsize_t)(p - start); }
+yy743:
+	yych = *++p;
+	if (yybm[0+yych] & 64) {
+		goto yy739;
+	}
+	if (yych <= 0xE0) {
+		if (yych <= '\\') {
+			if (yych <= 0x00) goto yy727;
+			if (yych <= '\'') goto yy766;
+			goto yy743;
+		} else {
+			if (yych <= 0xC1) goto yy727;
+			if (yych >= 0xE0) goto yy746;
+		}
+	} else {
+		if (yych <= 0xEF) {
+			if (yych == 0xED) goto yy748;
+			goto yy747;
+		} else {
+			if (yych <= 0xF0) goto yy749;
+			if (yych <= 0xF3) goto yy750;
+			if (yych <= 0xF4) goto yy751;
+			goto yy727;
+		}
+	}
+yy745:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0xBF) goto yy739;
+	goto yy727;
+yy746:
+	yych = *++p;
+	if (yych <= 0x9F) goto yy727;
+	if (yych <= 0xBF) goto yy745;
+	goto yy727;
+yy747:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0xBF) goto yy745;
+	goto yy727;
+yy748:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0x9F) goto yy745;
+	goto yy727;
+yy749:
+	yych = *++p;
+	if (yych <= 0x8F) goto yy727;
+	if (yych <= 0xBF) goto yy747;
+	goto yy727;
+yy750:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0xBF) goto yy747;
+	goto yy727;
+yy751:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0x8F) goto yy747;
+	goto yy727;
+yy752:
+	yych = *++p;
+yy753:
+	if (yybm[0+yych] & 128) {
+		goto yy752;
+	}
+	if (yych <= 0xE0) {
+		if (yych <= '\\') {
+			if (yych <= '(') goto yy727;
+			if (yych >= '*') goto yy756;
+		} else {
+			if (yych <= 0xC1) goto yy727;
+			if (yych <= 0xDF) goto yy758;
+			goto yy759;
+		}
+	} else {
+		if (yych <= 0xEF) {
+			if (yych == 0xED) goto yy761;
+			goto yy760;
+		} else {
+			if (yych <= 0xF0) goto yy762;
+			if (yych <= 0xF3) goto yy763;
+			if (yych <= 0xF4) goto yy764;
+			goto yy727;
+		}
+	}
+yy754:
+	++p;
+yy755:
+	{ return (bufsize_t)(p - start); }
+yy756:
+	yych = *++p;
+	if (yych <= 0xDF) {
+		if (yych <= '[') {
+			if (yych <= 0x00) goto yy727;
+			if (yych == ')') goto yy767;
+			goto yy752;
+		} else {
+			if (yych <= '\\') goto yy756;
+			if (yych <= 0x7F) goto yy752;
+			if (yych <= 0xC1) goto yy727;
+		}
+	} else {
+		if (yych <= 0xEF) {
+			if (yych <= 0xE0) goto yy759;
+			if (yych == 0xED) goto yy761;
+			goto yy760;
+		} else {
+			if (yych <= 0xF0) goto yy762;
+			if (yych <= 0xF3) goto yy763;
+			if (yych <= 0xF4) goto yy764;
+			goto yy727;
+		}
+	}
+yy758:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0xBF) goto yy752;
+	goto yy727;
+yy759:
+	yych = *++p;
+	if (yych <= 0x9F) goto yy727;
+	if (yych <= 0xBF) goto yy758;
+	goto yy727;
+yy760:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0xBF) goto yy758;
+	goto yy727;
+yy761:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0x9F) goto yy758;
+	goto yy727;
+yy762:
+	yych = *++p;
+	if (yych <= 0x8F) goto yy727;
+	if (yych <= 0xBF) goto yy760;
+	goto yy727;
+yy763:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0xBF) goto yy760;
+	goto yy727;
+yy764:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy727;
+	if (yych <= 0x8F) goto yy760;
+	goto yy727;
+yy765:
+	yyaccept = 1;
+	yych = *(marker = ++p);
+	if (yybm[0+yych] & 16) {
+		goto yy725;
+	}
+	if (yych <= 0xE0) {
+		if (yych <= '\\') {
+			if (yych <= 0x00) goto yy729;
+			if (yych <= '"') goto yy728;
+			goto yy730;
+		} else {
+			if (yych <= 0xC1) goto yy729;
+			if (yych <= 0xDF) goto yy732;
+			goto yy733;
+		}
+	} else {
+		if (yych <= 0xEF) {
+			if (yych == 0xED) goto yy735;
+			goto yy734;
+		} else {
+			if (yych <= 0xF0) goto yy736;
+			if (yych <= 0xF3) goto yy737;
+			if (yych <= 0xF4) goto yy738;
+			goto yy729;
+		}
+	}
+yy766:
+	yyaccept = 2;
+	yych = *(marker = ++p);
+	if (yybm[0+yych] & 64) {
+		goto yy739;
+	}
+	if (yych <= 0xE0) {
+		if (yych <= '\\') {
+			if (yych <= 0x00) goto yy742;
+			if (yych <= '\'') goto yy741;
+			goto yy743;
+		} else {
+			if (yych <= 0xC1) goto yy742;
+			if (yych <= 0xDF) goto yy745;
+			goto yy746;
+		}
+	} else {
+		if (yych <= 0xEF) {
+			if (yych == 0xED) goto yy748;
+			goto yy747;
+		} else {
+			if (yych <= 0xF0) goto yy749;
+			if (yych <= 0xF3) goto yy750;
+			if (yych <= 0xF4) goto yy751;
+			goto yy742;
+		}
+	}
+yy767:
+	yyaccept = 3;
+	yych = *(marker = ++p);
+	if (yybm[0+yych] & 128) {
+		goto yy752;
+	}
+	if (yych <= 0xE0) {
+		if (yych <= '\\') {
+			if (yych <= '(') goto yy755;
+			if (yych <= ')') goto yy754;
+			goto yy756;
+		} else {
+			if (yych <= 0xC1) goto yy755;
+			if (yych <= 0xDF) goto yy758;
+			goto yy759;
+		}
+	} else {
+		if (yych <= 0xEF) {
+			if (yych == 0xED) goto yy761;
+			goto yy760;
+		} else {
+			if (yych <= 0xF0) goto yy762;
+			if (yych <= 0xF3) goto yy763;
+			if (yych <= 0xF4) goto yy764;
+			goto yy755;
+		}
+	}
+}
+
+}
+
+// Match space characters, including newlines.
+bufsize_t _scan_spacechars(const unsigned char *p)
+{
+  const unsigned char *start = p; \
+
+{
+	unsigned char yych;
+	static const unsigned char yybm[] = {
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0, 128, 128, 128, 128, 128,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		128,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+	};
+	yych = *p;
+	if (yybm[0+yych] & 128) {
+		goto yy772;
+	}
+	++p;
+	{ return 0; }
+yy772:
+	yych = *++p;
+	if (yybm[0+yych] & 128) {
+		goto yy772;
+	}
+	{ return (bufsize_t)(p - start); }
+}
+
+}
+
+// Match ATX heading start.
+bufsize_t _scan_atx_heading_start(const unsigned char *p)
+{
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+{
+	unsigned char yych;
+	static const unsigned char yybm[] = {
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0, 128,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		128,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+	};
+	yych = *p;
+	if (yych == '#') goto yy779;
+	++p;
+yy778:
+	{ return 0; }
+yy779:
+	yych = *(marker = ++p);
+	if (yybm[0+yych] & 128) {
+		goto yy780;
+	}
+	if (yych <= '\f') {
+		if (yych <= 0x08) goto yy778;
+		if (yych <= '\n') goto yy783;
+		goto yy778;
+	} else {
+		if (yych <= '\r') goto yy783;
+		if (yych == '#') goto yy784;
+		goto yy778;
+	}
+yy780:
+	yych = *++p;
+	if (yybm[0+yych] & 128) {
+		goto yy780;
+	}
+yy782:
+	{ return (bufsize_t)(p - start); }
+yy783:
+	++p;
+	goto yy782;
+yy784:
+	yych = *++p;
+	if (yybm[0+yych] & 128) {
+		goto yy780;
+	}
+	if (yych <= '\f') {
+		if (yych <= 0x08) goto yy785;
+		if (yych <= '\n') goto yy783;
+	} else {
+		if (yych <= '\r') goto yy783;
+		if (yych == '#') goto yy786;
+	}
+yy785:
+	p = marker;
+	goto yy778;
+yy786:
+	yych = *++p;
+	if (yybm[0+yych] & 128) {
+		goto yy780;
+	}
+	if (yych <= '\f') {
+		if (yych <= 0x08) goto yy785;
+		if (yych <= '\n') goto yy783;
+		goto yy785;
+	} else {
+		if (yych <= '\r') goto yy783;
+		if (yych != '#') goto yy785;
+	}
+	yych = *++p;
+	if (yybm[0+yych] & 128) {
+		goto yy780;
+	}
+	if (yych <= '\f') {
+		if (yych <= 0x08) goto yy785;
+		if (yych <= '\n') goto yy783;
+		goto yy785;
+	} else {
+		if (yych <= '\r') goto yy783;
+		if (yych != '#') goto yy785;
+	}
+	yych = *++p;
+	if (yybm[0+yych] & 128) {
+		goto yy780;
+	}
+	if (yych <= '\f') {
+		if (yych <= 0x08) goto yy785;
+		if (yych <= '\n') goto yy783;
+		goto yy785;
+	} else {
+		if (yych <= '\r') goto yy783;
+		if (yych != '#') goto yy785;
+	}
+	yych = *++p;
+	if (yybm[0+yych] & 128) {
+		goto yy780;
+	}
+	if (yych <= 0x08) goto yy785;
+	if (yych <= '\n') goto yy783;
+	if (yych == '\r') goto yy783;
+	goto yy785;
+}
+
+}
+
+// Match setext heading line.  Return 1 for level-1 heading,
+// 2 for level-2, 0 for no match.
+bufsize_t _scan_setext_heading_line(const unsigned char *p)
+{
+  const unsigned char *marker = NULL;
+
+{
+	unsigned char yych;
+	static const unsigned char yybm[] = {
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,  32,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		 32,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,  64,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0, 128,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+	};
+	yych = *p;
+	if (yych == '-') goto yy794;
+	if (yych == '=') goto yy795;
+	++p;
+yy793:
+	{ return 0; }
+yy794:
+	yych = *(marker = ++p);
+	if (yybm[0+yych] & 64) {
+		goto yy801;
+	}
+	if (yych <= '\f') {
+		if (yych <= 0x08) goto yy793;
+		if (yych <= '\n') goto yy797;
+		goto yy793;
+	} else {
+		if (yych <= '\r') goto yy797;
+		if (yych == ' ') goto yy797;
+		goto yy793;
+	}
+yy795:
+	yych = *(marker = ++p);
+	if (yybm[0+yych] & 128) {
+		goto yy807;
+	}
+	if (yych <= '\f') {
+		if (yych <= 0x08) goto yy793;
+		if (yych <= '\n') goto yy804;
+		goto yy793;
+	} else {
+		if (yych <= '\r') goto yy804;
+		if (yych == ' ') goto yy804;
+		goto yy793;
+	}
+yy796:
+	yych = *++p;
+yy797:
+	if (yybm[0+yych] & 32) {
+		goto yy796;
+	}
+	if (yych <= 0x08) goto yy798;
+	if (yych <= '\n') goto yy799;
+	if (yych == '\r') goto yy799;
+yy798:
+	p = marker;
+	goto yy793;
+yy799:
+	++p;
+	{ return 2; }
+yy801:
+	yych = *++p;
+	if (yybm[0+yych] & 32) {
+		goto yy796;
+	}
+	if (yych <= '\f') {
+		if (yych <= 0x08) goto yy798;
+		if (yych <= '\n') goto yy799;
+		goto yy798;
+	} else {
+		if (yych <= '\r') goto yy799;
+		if (yych == '-') goto yy801;
+		goto yy798;
+	}
+yy803:
+	yych = *++p;
+yy804:
+	if (yych <= '\f') {
+		if (yych <= 0x08) goto yy798;
+		if (yych <= '\t') goto yy803;
+		if (yych >= '\v') goto yy798;
+	} else {
+		if (yych <= '\r') goto yy805;
+		if (yych == ' ') goto yy803;
+		goto yy798;
+	}
+yy805:
+	++p;
+	{ return 1; }
+yy807:
+	yych = *++p;
+	if (yybm[0+yych] & 128) {
+		goto yy807;
+	}
+	if (yych <= '\f') {
+		if (yych <= 0x08) goto yy798;
+		if (yych <= '\t') goto yy803;
+		if (yych <= '\n') goto yy805;
+		goto yy798;
+	} else {
+		if (yych <= '\r') goto yy805;
+		if (yych == ' ') goto yy803;
+		goto yy798;
+	}
+}
+
+}
+
+// Scan an opening code fence.
+bufsize_t _scan_open_code_fence(const unsigned char *p)
+{
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+{
+	unsigned char yych;
+	static const unsigned char yybm[] = {
+		  0, 192, 192, 192, 192, 192, 192, 192, 
+		192, 192,   0, 192, 192,   0, 192, 192, 
+		192, 192, 192, 192, 192, 192, 192, 192, 
+		192, 192, 192, 192, 192, 192, 192, 192, 
+		192, 192, 192, 192, 192, 192, 192, 192, 
+		192, 192, 192, 192, 192, 192, 192, 192, 
+		192, 192, 192, 192, 192, 192, 192, 192, 
+		192, 192, 192, 192, 192, 192, 192, 192, 
+		192, 192, 192, 192, 192, 192, 192, 192, 
+		192, 192, 192, 192, 192, 192, 192, 192, 
+		192, 192, 192, 192, 192, 192, 192, 192, 
+		192, 192, 192, 192, 192, 192, 192, 192, 
+		144, 192, 192, 192, 192, 192, 192, 192, 
+		192, 192, 192, 192, 192, 192, 192, 192, 
+		192, 192, 192, 192, 192, 192, 192, 192, 
+		192, 192, 192, 192, 192, 192, 224, 192, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+	};
+	yych = *p;
+	if (yych == '`') goto yy813;
+	if (yych == '~') goto yy814;
+	++p;
+yy812:
+	{ return 0; }
+yy813:
+	yych = *(marker = ++p);
+	if (yych == '`') goto yy815;
+	goto yy812;
+yy814:
+	yych = *(marker = ++p);
+	if (yych == '~') goto yy817;
+	goto yy812;
+yy815:
+	yych = *++p;
+	if (yybm[0+yych] & 16) {
+		goto yy818;
+	}
+yy816:
+	p = marker;
+	goto yy812;
+yy817:
+	yych = *++p;
+	if (yybm[0+yych] & 32) {
+		goto yy820;
+	}
+	goto yy816;
+yy818:
+	yych = *++p;
+	if (yybm[0+yych] & 16) {
+		goto yy818;
+	}
+	if (yych <= 0xDF) {
+		if (yych <= '\f') {
+			if (yych <= 0x00) goto yy816;
+			if (yych == '\n') {
+				marker = p;
+				goto yy824;
+			}
+			marker = p;
+			goto yy822;
+		} else {
+			if (yych <= '\r') {
+				marker = p;
+				goto yy824;
+			}
+			if (yych <= 0x7F) {
+				marker = p;
+				goto yy822;
+			}
+			if (yych <= 0xC1) goto yy816;
+			marker = p;
+			goto yy826;
+		}
+	} else {
+		if (yych <= 0xEF) {
+			if (yych <= 0xE0) {
+				marker = p;
+				goto yy827;
+			}
+			if (yych == 0xED) {
+				marker = p;
+				goto yy829;
+			}
+			marker = p;
+			goto yy828;
+		} else {
+			if (yych <= 0xF0) {
+				marker = p;
+				goto yy830;
+			}
+			if (yych <= 0xF3) {
+				marker = p;
+				goto yy831;
+			}
+			if (yych <= 0xF4) {
+				marker = p;
+				goto yy832;
+			}
+			goto yy816;
+		}
+	}
+yy820:
+	yych = *++p;
+	if (yybm[0+yych] & 32) {
+		goto yy820;
+	}
+	if (yych <= 0xDF) {
+		if (yych <= '\f') {
+			if (yych <= 0x00) goto yy816;
+			if (yych == '\n') {
+				marker = p;
+				goto yy835;
+			}
+			marker = p;
+			goto yy833;
+		} else {
+			if (yych <= '\r') {
+				marker = p;
+				goto yy835;
+			}
+			if (yych <= 0x7F) {
+				marker = p;
+				goto yy833;
+			}
+			if (yych <= 0xC1) goto yy816;
+			marker = p;
+			goto yy837;
+		}
+	} else {
+		if (yych <= 0xEF) {
+			if (yych <= 0xE0) {
+				marker = p;
+				goto yy838;
+			}
+			if (yych == 0xED) {
+				marker = p;
+				goto yy840;
+			}
+			marker = p;
+			goto yy839;
+		} else {
+			if (yych <= 0xF0) {
+				marker = p;
+				goto yy841;
+			}
+			if (yych <= 0xF3) {
+				marker = p;
+				goto yy842;
+			}
+			if (yych <= 0xF4) {
+				marker = p;
+				goto yy843;
+			}
+			goto yy816;
+		}
+	}
+yy822:
+	yych = *++p;
+	if (yybm[0+yych] & 64) {
+		goto yy822;
+	}
+	if (yych <= 0xEC) {
+		if (yych <= 0xC1) {
+			if (yych <= 0x00) goto yy816;
+			if (yych >= 0x0E) goto yy816;
+		} else {
+			if (yych <= 0xDF) goto yy826;
+			if (yych <= 0xE0) goto yy827;
+			goto yy828;
+		}
+	} else {
+		if (yych <= 0xF0) {
+			if (yych <= 0xED) goto yy829;
+			if (yych <= 0xEF) goto yy828;
+			goto yy830;
+		} else {
+			if (yych <= 0xF3) goto yy831;
+			if (yych <= 0xF4) goto yy832;
+			goto yy816;
+		}
+	}
+yy824:
+	++p;
+	p = marker;
+	{ return (bufsize_t)(p - start); }
+yy826:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy816;
+	if (yych <= 0xBF) goto yy822;
+	goto yy816;
+yy827:
+	yych = *++p;
+	if (yych <= 0x9F) goto yy816;
+	if (yych <= 0xBF) goto yy826;
+	goto yy816;
+yy828:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy816;
+	if (yych <= 0xBF) goto yy826;
+	goto yy816;
+yy829:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy816;
+	if (yych <= 0x9F) goto yy826;
+	goto yy816;
+yy830:
+	yych = *++p;
+	if (yych <= 0x8F) goto yy816;
+	if (yych <= 0xBF) goto yy828;
+	goto yy816;
+yy831:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy816;
+	if (yych <= 0xBF) goto yy828;
+	goto yy816;
+yy832:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy816;
+	if (yych <= 0x8F) goto yy828;
+	goto yy816;
+yy833:
+	yych = *++p;
+	if (yybm[0+yych] & 128) {
+		goto yy833;
+	}
+	if (yych <= 0xEC) {
+		if (yych <= 0xC1) {
+			if (yych <= 0x00) goto yy816;
+			if (yych >= 0x0E) goto yy816;
+		} else {
+			if (yych <= 0xDF) goto yy837;
+			if (yych <= 0xE0) goto yy838;
+			goto yy839;
+		}
+	} else {
+		if (yych <= 0xF0) {
+			if (yych <= 0xED) goto yy840;
+			if (yych <= 0xEF) goto yy839;
+			goto yy841;
+		} else {
+			if (yych <= 0xF3) goto yy842;
+			if (yych <= 0xF4) goto yy843;
+			goto yy816;
+		}
+	}
+yy835:
+	++p;
+	p = marker;
+	{ return (bufsize_t)(p - start); }
+yy837:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy816;
+	if (yych <= 0xBF) goto yy833;
+	goto yy816;
+yy838:
+	yych = *++p;
+	if (yych <= 0x9F) goto yy816;
+	if (yych <= 0xBF) goto yy837;
+	goto yy816;
+yy839:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy816;
+	if (yych <= 0xBF) goto yy837;
+	goto yy816;
+yy840:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy816;
+	if (yych <= 0x9F) goto yy837;
+	goto yy816;
+yy841:
+	yych = *++p;
+	if (yych <= 0x8F) goto yy816;
+	if (yych <= 0xBF) goto yy839;
+	goto yy816;
+yy842:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy816;
+	if (yych <= 0xBF) goto yy839;
+	goto yy816;
+yy843:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy816;
+	if (yych <= 0x8F) goto yy839;
+	goto yy816;
+}
+
+}
+
+// Scan a closing code fence with length at least len.
+bufsize_t _scan_close_code_fence(const unsigned char *p)
+{
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+{
+	unsigned char yych;
+	static const unsigned char yybm[] = {
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0, 128,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		128,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		 32,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,  64,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+	};
+	yych = *p;
+	if (yych == '`') goto yy848;
+	if (yych == '~') goto yy849;
+	++p;
+yy847:
+	{ return 0; }
+yy848:
+	yych = *(marker = ++p);
+	if (yych == '`') goto yy850;
+	goto yy847;
+yy849:
+	yych = *(marker = ++p);
+	if (yych == '~') goto yy852;
+	goto yy847;
+yy850:
+	yych = *++p;
+	if (yybm[0+yych] & 32) {
+		goto yy853;
+	}
+yy851:
+	p = marker;
+	goto yy847;
+yy852:
+	yych = *++p;
+	if (yybm[0+yych] & 64) {
+		goto yy855;
+	}
+	goto yy851;
+yy853:
+	yych = *++p;
+	if (yybm[0+yych] & 32) {
+		goto yy853;
+	}
+	if (yych <= '\f') {
+		if (yych <= 0x08) goto yy851;
+		if (yych <= '\t') {
+			marker = p;
+			goto yy857;
+		}
+		if (yych <= '\n') {
+			marker = p;
+			goto yy859;
+		}
+		goto yy851;
+	} else {
+		if (yych <= '\r') {
+			marker = p;
+			goto yy859;
+		}
+		if (yych == ' ') {
+			marker = p;
+			goto yy857;
+		}
+		goto yy851;
+	}
+yy855:
+	yych = *++p;
+	if (yybm[0+yych] & 64) {
+		goto yy855;
+	}
+	if (yych <= '\f') {
+		if (yych <= 0x08) goto yy851;
+		if (yych <= '\t') {
+			marker = p;
+			goto yy861;
+		}
+		if (yych <= '\n') {
+			marker = p;
+			goto yy863;
+		}
+		goto yy851;
+	} else {
+		if (yych <= '\r') {
+			marker = p;
+			goto yy863;
+		}
+		if (yych == ' ') {
+			marker = p;
+			goto yy861;
+		}
+		goto yy851;
+	}
+yy857:
+	yych = *++p;
+	if (yybm[0+yych] & 128) {
+		goto yy857;
+	}
+	if (yych <= 0x08) goto yy851;
+	if (yych <= '\n') goto yy859;
+	if (yych != '\r') goto yy851;
+yy859:
+	++p;
+	p = marker;
+	{ return (bufsize_t)(p - start); }
+yy861:
+	yych = *++p;
+	if (yych <= '\f') {
+		if (yych <= 0x08) goto yy851;
+		if (yych <= '\t') goto yy861;
+		if (yych >= '\v') goto yy851;
+	} else {
+		if (yych <= '\r') goto yy863;
+		if (yych == ' ') goto yy861;
+		goto yy851;
+	}
+yy863:
+	++p;
+	p = marker;
+	{ return (bufsize_t)(p - start); }
+}
+
+}
+
+// Scans an entity.
+// Returns number of chars matched.
+bufsize_t _scan_entity(const unsigned char *p)
+{
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+{
+	unsigned char yych;
+	yych = *p;
+	if (yych == '&') goto yy869;
+	++p;
+yy868:
+	{ return 0; }
+yy869:
+	yych = *(marker = ++p);
+	if (yych <= '@') {
+		if (yych != '#') goto yy868;
+	} else {
+		if (yych <= 'Z') goto yy872;
+		if (yych <= '`') goto yy868;
+		if (yych <= 'z') goto yy872;
+		goto yy868;
+	}
+	yych = *++p;
+	if (yych <= 'W') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy873;
+	} else {
+		if (yych <= 'X') goto yy874;
+		if (yych == 'x') goto yy874;
+	}
+yy871:
+	p = marker;
+	goto yy868;
+yy872:
+	yych = *++p;
+	if (yych <= '@') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy875;
+		goto yy871;
+	} else {
+		if (yych <= 'Z') goto yy875;
+		if (yych <= '`') goto yy871;
+		if (yych <= 'z') goto yy875;
+		goto yy871;
+	}
+yy873:
+	yych = *++p;
+	if (yych <= '/') goto yy871;
+	if (yych <= '9') goto yy876;
+	if (yych == ';') goto yy877;
+	goto yy871;
+yy874:
+	yych = *++p;
+	if (yych <= '@') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy879;
+		goto yy871;
+	} else {
+		if (yych <= 'F') goto yy879;
+		if (yych <= '`') goto yy871;
+		if (yych <= 'f') goto yy879;
+		goto yy871;
+	}
+yy875:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy880;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+			goto yy880;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych <= 'z') goto yy880;
+			goto yy871;
+		}
+	}
+yy876:
+	yych = *++p;
+	if (yych <= '/') goto yy871;
+	if (yych <= '9') goto yy881;
+	if (yych != ';') goto yy871;
+yy877:
+	++p;
+	{ return (bufsize_t)(p - start); }
+yy879:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy882;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'F') {
+			if (yych <= '@') goto yy871;
+			goto yy882;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych <= 'f') goto yy882;
+			goto yy871;
+		}
+	}
+yy880:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy883;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+			goto yy883;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych <= 'z') goto yy883;
+			goto yy871;
+		}
+	}
+yy881:
+	yych = *++p;
+	if (yych <= '/') goto yy871;
+	if (yych <= '9') goto yy884;
+	if (yych == ';') goto yy877;
+	goto yy871;
+yy882:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy885;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'F') {
+			if (yych <= '@') goto yy871;
+			goto yy885;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych <= 'f') goto yy885;
+			goto yy871;
+		}
+	}
+yy883:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy886;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+			goto yy886;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych <= 'z') goto yy886;
+			goto yy871;
+		}
+	}
+yy884:
+	yych = *++p;
+	if (yych <= '/') goto yy871;
+	if (yych <= '9') goto yy887;
+	if (yych == ';') goto yy877;
+	goto yy871;
+yy885:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy888;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'F') {
+			if (yych <= '@') goto yy871;
+			goto yy888;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych <= 'f') goto yy888;
+			goto yy871;
+		}
+	}
+yy886:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy889;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+			goto yy889;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych <= 'z') goto yy889;
+			goto yy871;
+		}
+	}
+yy887:
+	yych = *++p;
+	if (yych <= '/') goto yy871;
+	if (yych <= '9') goto yy890;
+	if (yych == ';') goto yy877;
+	goto yy871;
+yy888:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy891;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'F') {
+			if (yych <= '@') goto yy871;
+			goto yy891;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych <= 'f') goto yy891;
+			goto yy871;
+		}
+	}
+yy889:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy892;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+			goto yy892;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych <= 'z') goto yy892;
+			goto yy871;
+		}
+	}
+yy890:
+	yych = *++p;
+	if (yych <= '/') goto yy871;
+	if (yych <= '9') goto yy893;
+	if (yych == ';') goto yy877;
+	goto yy871;
+yy891:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy893;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'F') {
+			if (yych <= '@') goto yy871;
+			goto yy893;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych <= 'f') goto yy893;
+			goto yy871;
+		}
+	}
+yy892:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy894;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+			goto yy894;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych <= 'z') goto yy894;
+			goto yy871;
+		}
+	}
+yy893:
+	yych = *++p;
+	if (yych == ';') goto yy877;
+	goto yy871;
+yy894:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy895;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy895:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy896;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy896:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy897;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy897:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy898;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy898:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy899;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy899:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy900;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy900:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy901;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy901:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy902;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy902:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy903;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy903:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy904;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy904:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy905;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy905:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy906;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy906:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy907;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy907:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy908;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy908:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy909;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy909:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy910;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy910:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy911;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy911:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy912;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy912:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy913;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy913:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy914;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy914:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy915;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy915:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy916;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy916:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy917;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych >= '{') goto yy871;
+		}
+	}
+yy917:
+	yych = *++p;
+	if (yych <= ';') {
+		if (yych <= '/') goto yy871;
+		if (yych <= '9') goto yy893;
+		if (yych <= ':') goto yy871;
+		goto yy877;
+	} else {
+		if (yych <= 'Z') {
+			if (yych <= '@') goto yy871;
+			goto yy893;
+		} else {
+			if (yych <= '`') goto yy871;
+			if (yych <= 'z') goto yy893;
+			goto yy871;
+		}
+	}
+}
+
+}
+
+// Returns positive value if a URL begins in a way that is potentially
+// dangerous, with javascript:, vbscript:, file:, or data:, otherwise 0.
+bufsize_t _scan_dangerous_url(const unsigned char *p)
+{
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+{
+	unsigned char yych;
+	unsigned int yyaccept = 0;
+	yych = *p;
+	if (yych <= 'V') {
+		if (yych <= 'F') {
+			if (yych == 'D') goto yy922;
+			if (yych >= 'F') goto yy923;
+		} else {
+			if (yych == 'J') goto yy924;
+			if (yych >= 'V') goto yy925;
+		}
+	} else {
+		if (yych <= 'f') {
+			if (yych == 'd') goto yy922;
+			if (yych >= 'f') goto yy923;
+		} else {
+			if (yych <= 'j') {
+				if (yych >= 'j') goto yy924;
+			} else {
+				if (yych == 'v') goto yy925;
+			}
+		}
+	}
+	++p;
+yy921:
+	{ return 0; }
+yy922:
+	yyaccept = 0;
+	yych = *(marker = ++p);
+	if (yych == 'A') goto yy926;
+	if (yych == 'a') goto yy926;
+	goto yy921;
+yy923:
+	yyaccept = 0;
+	yych = *(marker = ++p);
+	if (yych == 'I') goto yy928;
+	if (yych == 'i') goto yy928;
+	goto yy921;
+yy924:
+	yyaccept = 0;
+	yych = *(marker = ++p);
+	if (yych == 'A') goto yy929;
+	if (yych == 'a') goto yy929;
+	goto yy921;
+yy925:
+	yyaccept = 0;
+	yych = *(marker = ++p);
+	if (yych == 'B') goto yy930;
+	if (yych == 'b') goto yy930;
+	goto yy921;
+yy926:
+	yych = *++p;
+	if (yych == 'T') goto yy931;
+	if (yych == 't') goto yy931;
+yy927:
+	p = marker;
+	if (yyaccept == 0) {
+		goto yy921;
+	} else {
+		goto yy939;
+	}
+yy928:
+	yych = *++p;
+	if (yych == 'L') goto yy932;
+	if (yych == 'l') goto yy932;
+	goto yy927;
+yy929:
+	yych = *++p;
+	if (yych == 'V') goto yy933;
+	if (yych == 'v') goto yy933;
+	goto yy927;
+yy930:
+	yych = *++p;
+	if (yych == 'S') goto yy934;
+	if (yych == 's') goto yy934;
+	goto yy927;
+yy931:
+	yych = *++p;
+	if (yych == 'A') goto yy935;
+	if (yych == 'a') goto yy935;
+	goto yy927;
+yy932:
+	yych = *++p;
+	if (yych == 'E') goto yy936;
+	if (yych == 'e') goto yy936;
+	goto yy927;
+yy933:
+	yych = *++p;
+	if (yych == 'A') goto yy930;
+	if (yych == 'a') goto yy930;
+	goto yy927;
+yy934:
+	yych = *++p;
+	if (yych == 'C') goto yy937;
+	if (yych == 'c') goto yy937;
+	goto yy927;
+yy935:
+	yych = *++p;
+	if (yych == ':') goto yy938;
+	goto yy927;
+yy936:
+	yych = *++p;
+	if (yych == ':') goto yy940;
+	goto yy927;
+yy937:
+	yych = *++p;
+	if (yych == 'R') goto yy941;
+	if (yych == 'r') goto yy941;
+	goto yy927;
+yy938:
+	yyaccept = 1;
+	yych = *(marker = ++p);
+	if (yych == 'I') goto yy942;
+	if (yych == 'i') goto yy942;
+yy939:
+	{ return (bufsize_t)(p - start); }
+yy940:
+	++p;
+	goto yy939;
+yy941:
+	yych = *++p;
+	if (yych == 'I') goto yy943;
+	if (yych == 'i') goto yy943;
+	goto yy927;
+yy942:
+	yych = *++p;
+	if (yych == 'M') goto yy944;
+	if (yych == 'm') goto yy944;
+	goto yy927;
+yy943:
+	yych = *++p;
+	if (yych == 'P') goto yy945;
+	if (yych == 'p') goto yy945;
+	goto yy927;
+yy944:
+	yych = *++p;
+	if (yych == 'A') goto yy946;
+	if (yych == 'a') goto yy946;
+	goto yy927;
+yy945:
+	yych = *++p;
+	if (yych == 'T') goto yy936;
+	if (yych == 't') goto yy936;
+	goto yy927;
+yy946:
+	yych = *++p;
+	if (yych == 'G') goto yy947;
+	if (yych != 'g') goto yy927;
+yy947:
+	yych = *++p;
+	if (yych == 'E') goto yy948;
+	if (yych != 'e') goto yy927;
+yy948:
+	yych = *++p;
+	if (yych != '/') goto yy927;
+	yych = *++p;
+	if (yych <= 'W') {
+		if (yych <= 'J') {
+			if (yych == 'G') goto yy950;
+			if (yych <= 'I') goto yy927;
+			goto yy951;
+		} else {
+			if (yych == 'P') goto yy952;
+			if (yych <= 'V') goto yy927;
+			goto yy953;
+		}
+	} else {
+		if (yych <= 'j') {
+			if (yych == 'g') goto yy950;
+			if (yych <= 'i') goto yy927;
+			goto yy951;
+		} else {
+			if (yych <= 'p') {
+				if (yych <= 'o') goto yy927;
+				goto yy952;
+			} else {
+				if (yych == 'w') goto yy953;
+				goto yy927;
+			}
+		}
+	}
+yy950:
+	yych = *++p;
+	if (yych == 'I') goto yy954;
+	if (yych == 'i') goto yy954;
+	goto yy927;
+yy951:
+	yych = *++p;
+	if (yych == 'P') goto yy955;
+	if (yych == 'p') goto yy955;
+	goto yy927;
+yy952:
+	yych = *++p;
+	if (yych == 'N') goto yy956;
+	if (yych == 'n') goto yy956;
+	goto yy927;
+yy953:
+	yych = *++p;
+	if (yych == 'E') goto yy957;
+	if (yych == 'e') goto yy957;
+	goto yy927;
+yy954:
+	yych = *++p;
+	if (yych == 'F') goto yy958;
+	if (yych == 'f') goto yy958;
+	goto yy927;
+yy955:
+	yych = *++p;
+	if (yych == 'E') goto yy956;
+	if (yych != 'e') goto yy927;
+yy956:
+	yych = *++p;
+	if (yych == 'G') goto yy958;
+	if (yych == 'g') goto yy958;
+	goto yy927;
+yy957:
+	yych = *++p;
+	if (yych == 'B') goto yy960;
+	if (yych == 'b') goto yy960;
+	goto yy927;
+yy958:
+	++p;
+	{ return 0; }
+yy960:
+	yych = *++p;
+	if (yych == 'P') goto yy958;
+	if (yych == 'p') goto yy958;
+	goto yy927;
+}
+
+}
+
+// Scans a footnote definition opening.
+bufsize_t _scan_footnote_definition(const unsigned char *p)
+{
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+{
+	unsigned char yych;
+	static const unsigned char yybm[] = {
+		  0,  64,  64,  64,  64,  64,  64,  64, 
+		 64, 128,   0,  64,  64,   0,  64,  64, 
+		 64,  64,  64,  64,  64,  64,  64,  64, 
+		 64,  64,  64,  64,  64,  64,  64,  64, 
+		128,  64,  64,  64,  64,  64,  64,  64, 
+		 64,  64,  64,  64,  64,  64,  64,  64, 
+		 64,  64,  64,  64,  64,  64,  64,  64, 
+		 64,  64,  64,  64,  64,  64,  64,  64, 
+		 64,  64,  64,  64,  64,  64,  64,  64, 
+		 64,  64,  64,  64,  64,  64,  64,  64, 
+		 64,  64,  64,  64,  64,  64,  64,  64, 
+		 64,  64,  64,  64,  64,   0,  64,  64, 
+		 64,  64,  64,  64,  64,  64,  64,  64, 
+		 64,  64,  64,  64,  64,  64,  64,  64, 
+		 64,  64,  64,  64,  64,  64,  64,  64, 
+		 64,  64,  64,  64,  64,  64,  64,  64, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+		  0,   0,   0,   0,   0,   0,   0,   0, 
+	};
+	yych = *p;
+	if (yych == '[') goto yy965;
+	++p;
+yy964:
+	{ return 0; }
+yy965:
+	yych = *(marker = ++p);
+	if (yych != '^') goto yy964;
+	yych = *++p;
+	if (yych != ']') goto yy969;
+yy967:
+	p = marker;
+	goto yy964;
+yy968:
+	yych = *++p;
+yy969:
+	if (yybm[0+yych] & 64) {
+		goto yy968;
+	}
+	if (yych <= 0xEC) {
+		if (yych <= 0xC1) {
+			if (yych <= ' ') goto yy967;
+			if (yych <= ']') goto yy977;
+			goto yy967;
+		} else {
+			if (yych <= 0xDF) goto yy970;
+			if (yych <= 0xE0) goto yy971;
+			goto yy972;
+		}
+	} else {
+		if (yych <= 0xF0) {
+			if (yych <= 0xED) goto yy973;
+			if (yych <= 0xEF) goto yy972;
+			goto yy974;
+		} else {
+			if (yych <= 0xF3) goto yy975;
+			if (yych <= 0xF4) goto yy976;
+			goto yy967;
+		}
+	}
+yy970:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy967;
+	if (yych <= 0xBF) goto yy968;
+	goto yy967;
+yy971:
+	yych = *++p;
+	if (yych <= 0x9F) goto yy967;
+	if (yych <= 0xBF) goto yy970;
+	goto yy967;
+yy972:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy967;
+	if (yych <= 0xBF) goto yy970;
+	goto yy967;
+yy973:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy967;
+	if (yych <= 0x9F) goto yy970;
+	goto yy967;
+yy974:
+	yych = *++p;
+	if (yych <= 0x8F) goto yy967;
+	if (yych <= 0xBF) goto yy972;
+	goto yy967;
+yy975:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy967;
+	if (yych <= 0xBF) goto yy972;
+	goto yy967;
+yy976:
+	yych = *++p;
+	if (yych <= 0x7F) goto yy967;
+	if (yych <= 0x8F) goto yy972;
+	goto yy967;
+yy977:
+	yych = *++p;
+	if (yych != ':') goto yy967;
+yy978:
+	yych = *++p;
+	if (yybm[0+yych] & 128) {
+		goto yy978;
 	}
 	{ return (bufsize_t)(p - start); }
 }
diff --git a/cbits/scanners.h b/cbits/scanners.h
--- a/cbits/scanners.h
+++ b/cbits/scanners.h
@@ -26,7 +26,6 @@
 bufsize_t _scan_spacechars(const unsigned char *p);
 bufsize_t _scan_atx_heading_start(const unsigned char *p);
 bufsize_t _scan_setext_heading_line(const unsigned char *p);
-bufsize_t _scan_thematic_break(const unsigned char *p);
 bufsize_t _scan_open_code_fence(const unsigned char *p);
 bufsize_t _scan_close_code_fence(const unsigned char *p);
 bufsize_t _scan_entity(const unsigned char *p);
@@ -50,7 +49,6 @@
 #define scan_atx_heading_start(c, n) _scan_at(&_scan_atx_heading_start, c, n)
 #define scan_setext_heading_line(c, n)                                         \
   _scan_at(&_scan_setext_heading_line, c, n)
-#define scan_thematic_break(c, n) _scan_at(&_scan_thematic_break, c, n)
 #define scan_open_code_fence(c, n) _scan_at(&_scan_open_code_fence, c, n)
 #define scan_close_code_fence(c, n) _scan_at(&_scan_close_code_fence, c, n)
 #define scan_entity(c, n) _scan_at(&_scan_entity, c, n)
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,13 @@
+cmark-gfm 0.2.0 (8 Apr 2019)
+
+  * Pull in upstream changes.
+
+cmark 0.6 (08 Apr 2019)
+
+  * Update to cmark 0.29.0.
+  * Export optUnsafe.  Note that the default is now to suppress
+    potentially unsafe HTML; set optUnsafe to return to the old behavior.
+
 cmark-gfm 0.1.8 (14 Mar 2019)
 
   * Pull in upstream changes.
diff --git a/cmark-gfm.cabal b/cmark-gfm.cabal
--- a/cmark-gfm.cabal
+++ b/cmark-gfm.cabal
@@ -1,12 +1,12 @@
 name:                cmark-gfm
-version:             0.1.8
+version:             0.2.0
 synopsis:            Fast, accurate GitHub Flavored Markdown parser and renderer
 description:
   This package provides Haskell bindings for
   <https://github.com/github/cmark-gfm libcmark-gfm>, the reference
   parser for <https://github.github.com/gfm/ GitHub Flavored Markdown>, a fully
   specified variant of Markdown. It includes sources for
-  libcmark-gfm (0.28.3.gfm.20) and does not require prior installation of the
+  libcmark-gfm (0.29.0.gfm.0) and does not require prior installation of the
   C library.
 
 homepage:            https://github.com/kivikakk/cmark-gfm-hs
@@ -16,7 +16,6 @@
 maintainer:          kivikakk@github.com
 copyright:           (C) 2015--17 John MacFarlane, (C) 2017--19 Ashe Connor
 category:            Text
-tested-with:         GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.2, GHC == 7.10.3
 build-type:          Simple
 extra-source-files:  README.md
                      changelog
@@ -136,4 +135,4 @@
   hs-source-dirs: test
   build-depends:  base, cmark-gfm, text, HUnit >= 1.2 && < 1.7
   ghc-options:    -Wall -fno-warn-unused-do-bind -threaded
-  default-language: Haskell98
+  default-language: Haskell2010
diff --git a/test/test-cmark.hs b/test/test-cmark.hs
--- a/test/test-cmark.hs
+++ b/test/test-cmark.hs
@@ -16,11 +16,11 @@
 -- Here we just make sure it's basically working.
 tests :: Test
 tests = TestList [
-    "<h1>Hi</h1>\n" ~=? commonmarkToHtml [] [] "# Hi"
+    "<h1>Hi</h1>\n<p><em>there</em></p>\n" ~=? commonmarkToHtml [] [] "# Hi\n\n*there*"
   , "<p>dog’s</p>\n" ~=? commonmarkToHtml [optSmart] [] "dog's"
-  , "<p><a href=\"\">trick</a></p>\n" ~=? commonmarkToHtml [] [] "[trick](javascript:alert('hi'))"
+  , "<p><a href=\"\">trick</a></p>\n" ~=? commonmarkToHtml [optSafe] [] "[trick](javascript:alert('hi'))"
   , ".RS\n.PP\nquote\n.RE\n" ~=? commonmarkToMan [] [] Nothing "> quote"
-  , (Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 13})) DOCUMENT [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 13})) PARAGRAPH [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 6})) (TEXT "Hello ") [],Node (Just (PosInfo {startLine = 1, startColumn = 7, endLine = 1, endColumn = 13})) EMPH [Node (Just (PosInfo {startLine = 1, startColumn = 8, endLine = 1, endColumn = 12})) (TEXT "world") []]]]) ~=? commonmarkToNode [] [] "Hello *world*"
+  , Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 13})) DOCUMENT [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 13})) PARAGRAPH [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 6})) (TEXT "Hello ") [],Node (Just (PosInfo {startLine = 1, startColumn = 7, endLine = 1, endColumn = 13})) EMPH [Node (Just (PosInfo {startLine = 1, startColumn = 8, endLine = 1, endColumn = 12})) (TEXT "world") []]]] ~=? commonmarkToNode [] [] "Hello *world*"
   , "> Hello\n> *world*\n" ~=? nodeToCommonmark [] (Just 12) (Node Nothing DOCUMENT [Node Nothing BLOCK_QUOTE [Node Nothing PARAGRAPH [Node Nothing (TEXT "Hello ") [],Node Nothing EMPH [Node Nothing (TEXT "world") []]]]])
   , "<p>~hi~</p>\n" ~=? commonmarkToHtml [] [] "~hi~"
   , "<p><del>hi</del></p>\n" ~=? commonmarkToHtml [] [extStrikethrough] "~hi~"
