view src/scanner.cpp @ 41:d95af8129dfa

updates for 3.2, changing file layout, add queueid to messages
author carl
date Mon, 05 Jul 2004 10:52:02 -0700
parents ccf2c2651c1d
children afcf403709ef
line wrap: on
line source

/*

Copyright (c) 2004 Carl Byington - 510 Software Group, released under
the GPL version 2 or any later version at your choice available at
http://www.fsf.org/licenses/gpl.txt

*/

static char* scanner_version="$Id$";

using namespace std;


// object to record things we see in the body content
struct recorder
{
    mlfiPriv    *priv;      // needed for syslog
    string_set  *html_tags; // valid tags
    string_set  *tlds;      // valid tlds
    string_set  hosts;
    int         bad_html_tags;
    int         binary_tags;
    recorder(string_set *html_tags_, string_set *tlds_);
    ~recorder();
    void empty();
    void new_url(char *host);
    void new_tag(char *tag);
    void binary();
};
recorder::recorder(mlfiPriv *priv_, string_set *html_tags_, string_set *tlds_) {
    priv          = priv_;
    html_tags     = html_tags_;
    tlds          = tlds_;
    bad_html_tags = 0;
    binary_tags   = 0;
}
recorder::~recorder() {
    empty();
}
void recorder::empty() {
    bad_html_tags = 0;
    binary_tags   = 0;
    discard(hosts);
}
void recorder::new_url(char *host) {
    register_string(hosts, host);
}
void recorder::binary() {
    binary_tags++;
}
void recorder::new_tag(char *tag) {
    string_set::iterator i = html_tags->find(tag);
    if (i == html_tags->end()) {
        bad_html_tags++;
        if (debug_syslog && (bad_html_tags < 10) && (binary_tags < 10)) {
            // only log the first 10 bad tags
            char buf[200];
            snprintf(buf, sizeof(buf), "bad html tag %s", tag);
            my_syslog(priv, buf);
        }
    }
}



enum state {// host name recognizer states
            h_init,
            h_host,

            // html tag discarder states
            t_init,
            t_tag1,     // seen opening <
            t_tag2,     // not comment
            t_com1,     // seen !
            t_com2,     // seen first -
            t_com3,     // seen second -, looking for -->
            t_com4,     // seen first -
            t_com5,     // seen second -
            t_disc,     // looking for closing >

            // url recognizer states
            u_init,
            u_http,
            u_sla,
            u_url,

            // url decoder states  %xx
            d_init,
            d_pcnt,
            d_1,

            // html entity decoder states &#nnn;
            e_init,
            e_amp,
            e_num,

            // mime decoder states =xx
            m_init,
            m_eq,
            m_1,

            // base64 decoder states
            b_init,
            b_lf,
            b_lf2,
            b_64,

            // counter for number of columns in the table
            end_state,

            // temporary states
            h_end,
            t_bin,
            t_end,
            u_reco,
            d_2,
            e_semi,
            m_2,
            m_cr,
            m_nl,
            b_cr,
           };

typedef state PARSE[end_state];

static PARSE parse_table[256] = {
  // h_init, h_host, t_init, t_tag1, t_tag2, t_com1, t_com2, t_com3, t_com4, t_com5, t_disc, u_init, u_http, u_sla , u_url,  d_init, d_pcnt, d_1,    e_init, e_amp,  e_num,  m_init, m_eq,   m_1,    b_init, b_lf,   b_lf2,  b_64

    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x00
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x01
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x02
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x03
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x04
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x05
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x06
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x07
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x08
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com5, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x09 <tab>
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com5, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_nl,   m_init, b_lf,   b_init, b_lf2,  b_init,  },  // 0x0a <lf>
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x0b
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x0c
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com5, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_cr,   m_init, b_init, b_init, b_init, b_cr,    },  // 0x0d <cr>
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x0e
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x0f
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x10
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x11 xon char
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x12
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x13 xoff char
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x14
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x15
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x16
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x17
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x18
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x19
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x1a
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x1b
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x1c
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x1d
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x1e
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x1f
    {h_init, h_end,  t_init, t_end,  t_end,  t_end,  t_end,  t_com3, t_com3, t_com5, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x20 space
    {h_init, h_end,  t_init, t_com1, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x21 !
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x22 ""
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_num,  e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x23 #
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x24 $
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_pcnt, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x25 %
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_amp,  e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x26 &
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x27 '
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x28 (
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x29 )
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x2A *
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x2B +
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x2C ,
    {h_host, h_host, t_init, t_disc, t_disc, t_com2, t_com3, t_com4, t_com5, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x2D -
    {h_host, h_host, t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x2E .
    {h_init, h_end,  t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_sla,  u_sla,  u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x2F /
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x30 0
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x31 1
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x32 2
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x33 3
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x34 4
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x35 5
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x36 6
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x37 7
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x38 8
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x39 9
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_http, u_http, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x3A :
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_semi, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x3B ;
    {h_init, h_end,  t_tag1, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x3C <
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_eq,   m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x3D =
    {h_init, h_end,  t_init, t_end,  t_end,  t_end,  t_end,  t_com3, t_com3, t_end,  t_end,  u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x3E >
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x3F ?
    {h_init, h_host, t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x40 @
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x41 A
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x42 B
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x43 C
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x44 D
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x45 E
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x46 F
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x47 G
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_http, u_http, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x48 H
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x49 I
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x4A J
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x4B K
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x4C L
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x4D M
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x4E N
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x4F O
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_http, u_http, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x50 P
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x51 Q
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x52 R
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_http, u_http, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x53 S
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_http, u_http, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x54 T
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x55 U
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x56 V
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x57 W
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_num,  m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x58 X
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x59 Y
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x5A Z
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x5B [
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x5C brace
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x5D ]
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x5E ^
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x5F _
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x60 `
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x61 a
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x62 b
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x63 c
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x64 d
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x65 e
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_1,    d_2,    e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x66 f
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x67 g
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_http, u_http, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x68 h
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x69 i
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x6A j
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x6B k
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x6C l
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x6D m
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x6E n
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x6F o
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_http, u_http, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x70 p
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x71 q
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x72 r
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_http, u_http, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x73 s
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_http, u_http, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x74 t
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x75 u
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x76 v
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x77 w
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_num,  m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x78 x
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x79 y
    {h_host, h_host, t_init, t_tag2, t_tag2, t_tag2, t_tag2, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_url,  u_url,  d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x7A z
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x7B {
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x7C |
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x7D }
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x7E ~
    {h_init, h_end,  t_init, t_disc, t_disc, t_disc, t_disc, t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x7f
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x80
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x81
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x82
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x83
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x84
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x85
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x86
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x87
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x88
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x89
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x8a
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x8b
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x8c
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x8d
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x8e
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x8f
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x90
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x91
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x92
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x93
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x94
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x95
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x96
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x97
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x98
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x99
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x9a
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x9b
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x9c
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x9d
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x9e
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x9f
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa0
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa1
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa2
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa3
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa4
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa5
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa6
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa7
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa8
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa9
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xaa
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xab
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xac
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xad
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xae
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xaf
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb0
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb1
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb2
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb3
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb4
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb5
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb6
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb7
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb8
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb9
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xba
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xbb
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xbc
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xbd
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xbe
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xbf
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc0
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc1
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc2
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc3
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc4
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc5
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc6
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc7
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc8
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc9
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xca
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xcb
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xcc
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xcd
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xce
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xcf
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd0
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd1
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd2
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd3
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd4
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd5
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd6
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd7
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd8
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd9
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xda
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xdb
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xdc
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xdd
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xde
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xdf
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe0
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe1
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe2
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe3
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe4
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe5
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe6
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe7
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe8
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe9
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xea
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xeb
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xec
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xed
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xee
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xef
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf0
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf1
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf2
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf3
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf4
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf5
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf6
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf7
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf8
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf9
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xfa
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xfb
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xfc
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xfd
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xfe
    {h_init, h_end,  t_init, t_bin,  t_bin,  t_bin,  t_bin,  t_com3, t_com3, t_com3, t_disc, u_init, u_init, u_init, u_reco, d_init, d_init, d_init, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xff
};


u_char hex_decode[256] = {
    0,  // 0x00
    0,  // 0x01
    0,  // 0x02
    0,  // 0x03
    0,  // 0x04
    0,  // 0x05
    0,  // 0x06
    0,  // 0x07
    0,  // 0x08
    0,  // 0x09 <tab>
    0,  // 0x0a <lf>
    0,  // 0x0b
    0,  // 0x0c
    0,  // 0x0d <cr>
    0,  // 0x0e
    0,  // 0x0f
    0,  // 0x10
    0,  // 0x11 xon char
    0,  // 0x12
    0,  // 0x13 xoff char
    0,  // 0x14
    0,  // 0x15
    0,  // 0x16
    0,  // 0x17
    0,  // 0x18
    0,  // 0x19
    0,  // 0x1a
    0,  // 0x1b
    0,  // 0x1c
    0,  // 0x1d
    0,  // 0x1e
    0,  // 0x1f
    0,  // 0x20 space
    0,  // 0x21 !
    0,  // 0x22 ""
    0,  // 0x23 #
    0,  // 0x24 $
    0,  // 0x25 %
    0,  // 0x26 &
    0,  // 0x27 '
    0,  // 0x28 (
    0,  // 0x29 )
    0,  // 0x2A *
    0,  // 0x2B +
    0,  // 0x2C ,
    0,  // 0x2D -
    0,  // 0x2E .
    0,  // 0x2F /
    0,  // 0x30 0
    1,  // 0x31 1
    2,  // 0x32 2
    3,  // 0x33 3
    4,  // 0x34 4
    5,  // 0x35 5
    6,  // 0x36 6
    7,  // 0x37 7
    8,  // 0x38 8
    9,  // 0x39 9
    0,  // 0x3A :
    0,  // 0x3B ;
    0,  // 0x3C <
    0,  // 0x3D =
    0,  // 0x3E >
    0,  // 0x3F ?
    0,  // 0x40 @
    10, // 0x41 A
    11, // 0x42 B
    12, // 0x43 C
    13, // 0x44 D
    14, // 0x45 E
    15, // 0x46 F
    0,  // 0x47 G
    0,  // 0x48 H
    0,  // 0x49 I
    0,  // 0x4A J
    0,  // 0x4B K
    0,  // 0x4C L
    0,  // 0x4D M
    0,  // 0x4E N
    0,  // 0x4F O
    0,  // 0x50 P
    0,  // 0x51 Q
    0,  // 0x52 R
    0,  // 0x53 S
    0,  // 0x54 T
    0,  // 0x55 U
    0,  // 0x56 V
    0,  // 0x57 W
    0,  // 0x58 X
    0,  // 0x59 Y
    0,  // 0x5A Z
    0,  // 0x5B [
    0,  // 0x5C brace
    0,  // 0x5D ]
    0,  // 0x5E ^
    0,  // 0x5F _
    0,  // 0x60 `
    10, // 0x61 a
    11, // 0x62 b
    12, // 0x63 c
    13, // 0x64 d
    14, // 0x65 e
    15, // 0x66 f
    0,  // 0x67 g
    0,  // 0x68 h
    0,  // 0x69 i
    0,  // 0x6A j
    0,  // 0x6B k
    0,  // 0x6C l
    0,  // 0x6D m
    0,  // 0x6E n
    0,  // 0x6F o
    0,  // 0x70 p
    0,  // 0x71 q
    0,  // 0x72 r
    0,  // 0x73 s
    0,  // 0x74 t
    0,  // 0x75 u
    0,  // 0x76 v
    0,  // 0x77 w
    0,  // 0x78 x
    0,  // 0x79 y
    0,  // 0x7A z
    0,  // 0x7B {
    0,  // 0x7C |
    0,  // 0x7D }
    0,  // 0x7E ~
    0,  // 0x7f
    0,  // 0x80
    0,  // 0x81
    0,  // 0x82
    0,  // 0x83
    0,  // 0x84
    0,  // 0x85
    0,  // 0x86
    0,  // 0x87
    0,  // 0x88
    0,  // 0x89
    0,  // 0x8a
    0,  // 0x8b
    0,  // 0x8c
    0,  // 0x8d
    0,  // 0x8e
    0,  // 0x8f
    0,  // 0x90
    0,  // 0x91
    0,  // 0x92
    0,  // 0x93
    0,  // 0x94
    0,  // 0x95
    0,  // 0x96
    0,  // 0x97
    0,  // 0x98
    0,  // 0x99
    0,  // 0x9a
    0,  // 0x9b
    0,  // 0x9c
    0,  // 0x9d
    0,  // 0x9e
    0,  // 0x9f
    0,  // 0xa0
    0,  // 0xa1
    0,  // 0xa2
    0,  // 0xa3
    0,  // 0xa4
    0,  // 0xa5
    0,  // 0xa6
    0,  // 0xa7
    0,  // 0xa8
    0,  // 0xa9
    0,  // 0xaa
    0,  // 0xab
    0,  // 0xac
    0,  // 0xad
    0,  // 0xae
    0,  // 0xaf
    0,  // 0xb0
    0,  // 0xb1
    0,  // 0xb2
    0,  // 0xb3
    0,  // 0xb4
    0,  // 0xb5
    0,  // 0xb6
    0,  // 0xb7
    0,  // 0xb8
    0,  // 0xb9
    0,  // 0xba
    0,  // 0xbb
    0,  // 0xbc
    0,  // 0xbd
    0,  // 0xbe
    0,  // 0xbf
    0,  // 0xc0
    0,  // 0xc1
    0,  // 0xc2
    0,  // 0xc3
    0,  // 0xc4
    0,  // 0xc5
    0,  // 0xc6
    0,  // 0xc7
    0,  // 0xc8
    0,  // 0xc9
    0,  // 0xca
    0,  // 0xcb
    0,  // 0xcc
    0,  // 0xcd
    0,  // 0xce
    0,  // 0xcf
    0,  // 0xd0
    0,  // 0xd1
    0,  // 0xd2
    0,  // 0xd3
    0,  // 0xd4
    0,  // 0xd5
    0,  // 0xd6
    0,  // 0xd7
    0,  // 0xd8
    0,  // 0xd9
    0,  // 0xda
    0,  // 0xdb
    0,  // 0xdc
    0,  // 0xdd
    0,  // 0xde
    0,  // 0xdf
    0,  // 0xe0
    0,  // 0xe1
    0,  // 0xe2
    0,  // 0xe3
    0,  // 0xe4
    0,  // 0xe5
    0,  // 0xe6
    0,  // 0xe7
    0,  // 0xe8
    0,  // 0xe9
    0,  // 0xea
    0,  // 0xeb
    0,  // 0xec
    0,  // 0xed
    0,  // 0xee
    0,  // 0xef
    0,  // 0xf0
    0,  // 0xf1
    0,  // 0xf2
    0,  // 0xf3
    0,  // 0xf4
    0,  // 0xf5
    0,  // 0xf6
    0,  // 0xf7
    0,  // 0xf8
    0,  // 0xf9
    0,  // 0xfa
    0,  // 0xfb
    0,  // 0xfc
    0,  // 0xfd
    0,  // 0xfe
    0,  // 0xff
};

u_char b64_decode[256] = {
    0,  // 0x00
    0,  // 0x01
    0,  // 0x02
    0,  // 0x03
    0,  // 0x04
    0,  // 0x05
    0,  // 0x06
    0,  // 0x07
    0,  // 0x08
    0,  // 0x09 <tab>
    0,  // 0x0a <lf>
    0,  // 0x0b
    0,  // 0x0c
    0,  // 0x0d <cr>
    0,  // 0x0e
    0,  // 0x0f
    0,  // 0x10
    0,  // 0x11 xon char
    0,  // 0x12
    0,  // 0x13 xoff char
    0,  // 0x14
    0,  // 0x15
    0,  // 0x16
    0,  // 0x17
    0,  // 0x18
    0,  // 0x19
    0,  // 0x1a
    0,  // 0x1b
    0,  // 0x1c
    0,  // 0x1d
    0,  // 0x1e
    0,  // 0x1f
    0,  // 0x20 space
    0,  // 0x21 !
    0,  // 0x22 ""
    0,  // 0x23 #
    0,  // 0x24 $
    0,  // 0x25 %
    0,  // 0x26 &
    0,  // 0x27 '
    0,  // 0x28 (
    0,  // 0x29 )
    0,  // 0x2A *
    62, // 0x2B +
    0,  // 0x2C ,
    0,  // 0x2D -
    0,  // 0x2E .
    63, // 0x2F /
    52, // 0x30 0
    53, // 0x31 1
    54, // 0x32 2
    55, // 0x33 3
    56, // 0x34 4
    57, // 0x35 5
    58, // 0x36 6
    59, // 0x37 7
    60, // 0x38 8
    61, // 0x39 9
    0,  // 0x3A :
    0,  // 0x3B ;
    0,  // 0x3C <
    0,  // 0x3D =
    0,  // 0x3E >
    0,  // 0x3F ?
    0,  // 0x40 @
    0,  // 0x41 A
    1,  // 0x42 B
    2,  // 0x43 C
    3,  // 0x44 D
    4,  // 0x45 E
    5,  // 0x46 F
    6,  // 0x47 G
    7,  // 0x48 H
    8,  // 0x49 I
    9,  // 0x4A J
    10, // 0x4B K
    11, // 0x4C L
    12, // 0x4D M
    13, // 0x4E N
    14, // 0x4F O
    15, // 0x50 P
    16, // 0x51 Q
    17, // 0x52 R
    18, // 0x53 S
    19, // 0x54 T
    20, // 0x55 U
    21, // 0x56 V
    22, // 0x57 W
    23, // 0x58 X
    24, // 0x59 Y
    25, // 0x5A Z
    0,  // 0x5B [
    0,  // 0x5C brace
    0,  // 0x5D ]
    0,  // 0x5E ^
    0,  // 0x5F _
    0,  // 0x60 `
    26, // 0x61 a
    27, // 0x62 b
    28, // 0x63 c
    29, // 0x64 d
    30, // 0x65 e
    31, // 0x66 f
    32, // 0x67 g
    33, // 0x68 h
    34, // 0x69 i
    35, // 0x6A j
    36, // 0x6B k
    37, // 0x6C l
    38, // 0x6D m
    39, // 0x6E n
    40, // 0x6F o
    41, // 0x70 p
    42, // 0x71 q
    43, // 0x72 r
    44, // 0x73 s
    45, // 0x74 t
    46, // 0x75 u
    47, // 0x76 v
    48, // 0x77 w
    49, // 0x78 x
    50, // 0x79 y
    51, // 0x7A z
    0,  // 0x7B {
    0,  // 0x7C |
    0,  // 0x7D }
    0,  // 0x7E ~
    0,  // 0x7f
    0,  // 0x80
    0,  // 0x81
    0,  // 0x82
    0,  // 0x83
    0,  // 0x84
    0,  // 0x85
    0,  // 0x86
    0,  // 0x87
    0,  // 0x88
    0,  // 0x89
    0,  // 0x8a
    0,  // 0x8b
    0,  // 0x8c
    0,  // 0x8d
    0,  // 0x8e
    0,  // 0x8f
    0,  // 0x90
    0,  // 0x91
    0,  // 0x92
    0,  // 0x93
    0,  // 0x94
    0,  // 0x95
    0,  // 0x96
    0,  // 0x97
    0,  // 0x98
    0,  // 0x99
    0,  // 0x9a
    0,  // 0x9b
    0,  // 0x9c
    0,  // 0x9d
    0,  // 0x9e
    0,  // 0x9f
    0,  // 0xa0
    0,  // 0xa1
    0,  // 0xa2
    0,  // 0xa3
    0,  // 0xa4
    0,  // 0xa5
    0,  // 0xa6
    0,  // 0xa7
    0,  // 0xa8
    0,  // 0xa9
    0,  // 0xaa
    0,  // 0xab
    0,  // 0xac
    0,  // 0xad
    0,  // 0xae
    0,  // 0xaf
    0,  // 0xb0
    0,  // 0xb1
    0,  // 0xb2
    0,  // 0xb3
    0,  // 0xb4
    0,  // 0xb5
    0,  // 0xb6
    0,  // 0xb7
    0,  // 0xb8
    0,  // 0xb9
    0,  // 0xba
    0,  // 0xbb
    0,  // 0xbc
    0,  // 0xbd
    0,  // 0xbe
    0,  // 0xbf
    0,  // 0xc0
    0,  // 0xc1
    0,  // 0xc2
    0,  // 0xc3
    0,  // 0xc4
    0,  // 0xc5
    0,  // 0xc6
    0,  // 0xc7
    0,  // 0xc8
    0,  // 0xc9
    0,  // 0xca
    0,  // 0xcb
    0,  // 0xcc
    0,  // 0xcd
    0,  // 0xce
    0,  // 0xcf
    0,  // 0xd0
    0,  // 0xd1
    0,  // 0xd2
    0,  // 0xd3
    0,  // 0xd4
    0,  // 0xd5
    0,  // 0xd6
    0,  // 0xd7
    0,  // 0xd8
    0,  // 0xd9
    0,  // 0xda
    0,  // 0xdb
    0,  // 0xdc
    0,  // 0xdd
    0,  // 0xde
    0,  // 0xdf
    0,  // 0xe0
    0,  // 0xe1
    0,  // 0xe2
    0,  // 0xe3
    0,  // 0xe4
    0,  // 0xe5
    0,  // 0xe6
    0,  // 0xe7
    0,  // 0xe8
    0,  // 0xe9
    0,  // 0xea
    0,  // 0xeb
    0,  // 0xec
    0,  // 0xed
    0,  // 0xee
    0,  // 0xef
    0,  // 0xf0
    0,  // 0xf1
    0,  // 0xf2
    0,  // 0xf3
    0,  // 0xf4
    0,  // 0xf5
    0,  // 0xf6
    0,  // 0xf7
    0,  // 0xf8
    0,  // 0xf9
    0,  // 0xfa
    0,  // 0xfb
    0,  // 0xfc
    0,  // 0xfd
    0,  // 0xfe
    0,  // 0xff
};

#define PENDING_LIMIT 100
struct fsa {
    u_char      pending[PENDING_LIMIT];
    int         count;
    state       st;
    state       init;
    fsa*        next1;
    fsa*        next2;
    recorder    *memory;

    fsa(state init, fsa* next1_, fsa* next2_, recorder *memory_);
    void push(u_char *buf, int len);
    void pusher();
    void error(char *err);
};

fsa::fsa(state init_, fsa *next1_, fsa *next2_, recorder *memory_) {
    count  = 0;
    st     = init_;
    init   = init_;
    next1  = next1_;
    next2  = next2_;
    memory = memory_;
}

void fsa::error(char *err) {
    count = 0;
    st    = init;
    if (err) my_syslog(err);
}

void fsa::pusher() {
    if (next1) next1->push(pending, count);
    if (next2) next2->push(pending, count);
    count = 0;
}

void fsa::push(u_char *buf, int len) {
    for (int i=0; i<len; i++) {
        if (count == (PENDING_LIMIT-1)) error(NULL);
        if (st >= end_state)            error("finite state machine impossible state");
        u_char c = buf[i];
        pending[count++] = c;
        st = parse_table[c][st];
        switch (st) {

            //////////////////////////////
            //  host name recognizer
            case h_end: {
                pending[--count] = '\0';  // null terminate host name by overwriting the terminator
                if (!strchr((const char *)pending, '@')) {
                    // not an email address or message id
                    char *p1 = strchr((const char *)pending, '.');
                    char *p2 = strrchr((const char *)pending, '.');
                    if (p1 && (p1 != p2)) {
                        // have two periods, so three components
                        for (int i=1; i<count; i++) pending[i] = tolower(pending[i]);
                        // is last component a tld?
                        string_set::iterator i = memory->tlds->find(p2+1);
                        if (i != memory->tlds->end()) memory->new_url((char*)pending);
                    }
                }
                st = h_init;
                } // fall thru

            case h_init: {
                count = 0;
                } break;


            //////////////////////////////
            //  html tag discarder
            case t_bin: {
                memory->binary();
                st    = t_disc;
                count = 0;  // discard all characters
                } break;

            case t_end: {
                if (count > 1) {
                    pending[--count] = '\0';  // null terminate html tag
                    for (int i=0; i<count; i++) pending[i] = tolower(pending[i]);
                    memory->new_tag((char*)pending);
                }
                st = (c == ' ') ? t_disc : t_init;
                } // fall thru

            case t_tag1:
            case t_com2:
            case t_com3:
            case t_com4:
            case t_com5:
            case t_disc: {
                count = 0;  // discard all characters
                } break;

            case t_init: {
                pusher();
                } break;


            //////////////////////////////
            //  url recognizer
            case u_reco: {
                if (count > 13) {   // need some minimal length host name after the protocol
                    pending[--count] = '\0';  // null terminate host name by overwriting the terminator
                    char *p = strrchr((const char *)pending, '/');
                    if (p              &&                                       // have a leading /
                        strchr(p, '.') &&                                       // require at least one . in a dns name
                        (strncasecmp((const char *)pending, "http", 4) == 0)) { // must start with protocol
                        memory->new_url(++p);                           // we seem to have a host name, skip the last /
                    }
                }
                st = u_init;
                } // fall thru

            case u_init: {
                count = 0;  // discard all characters
                } break;


            //////////////////////////////
            //  url decoder %xx
            case d_2: {
                pending[0] = hex_decode[pending[1]] * 16 + hex_decode[pending[2]];
                count = 1;
                st    = d_init;
                } // fall thru

            case d_init: {
                pusher();
                } break;


            //////////////////////////////
            //  html entity decoder &#nnn;  &#xnnn;
            case e_semi: {
                pending[--count] = '\0';  // null terminate the digit string by overwriting the semicolon
                u_char f = pending[2];
                if ((f == 'x') || (f == 'X')) {
                    pending[0] = strtol((const char *)pending+2, (char **)NULL, 16);
                }
                else {
                    pending[0] = atoi((const char *)pending+2);
                }
                count = 1;
                st    = e_init;
                } // fall thru

            case e_init: {
                pusher();
                } break;


            //////////////////////////////
            //  mime decoder =xx
            case m_2: {
                pending[0] = hex_decode[pending[1]] * 16 + hex_decode[pending[2]];
                count = 1;
                st    = m_init;
                } // fall thru

            case m_init: {
                pusher();
                } break;

            case m_cr: {
                count = 1;
                st    = m_eq;
                } break;

            case m_nl: {
                count = 0;
                st    = m_init;
                } break;


            //////////////////////////////
            //  base64 decoder
            case b_lf2: {
                count--;
                } break;

            case b_cr: {
                int cnt = 0;
                if ((count % 4) == 1) {
                    count--;
                    // might have proper b64 data
                    for (int i=0; i<count; i+=4) {
                        unsigned long a1 = b64_decode[pending[i]];
                        unsigned long a2 = b64_decode[pending[i+1]];
                        unsigned long a3 = b64_decode[pending[i+2]];
                        unsigned long a4 = b64_decode[pending[i+3]];
                        unsigned long a = (a1 << 18) | (a2 << 12) | (a3 << 6) | a4;
                        pending[cnt++] = (a & 0x00ff0000) >> 16;
                        pending[cnt++] = (a & 0x0000ff00) >>  8;
                        pending[cnt++] = (a & 0x000000ff);
                        if ((char)pending[i+3] == '=') cnt--;
                        if ((char)pending[i+2] == '=') cnt--;
                    }
                    count = cnt;
                    st    = b_lf2;
                }
                else st = b_init;
                } // fall thru

            case b_lf:
            case b_init: {
                pusher();
                } break;


            //////////////////////////////
            //  states that just accumulate characters in the pending buffer
            case h_host:
            case t_tag2:
            case t_com1:
            case u_http:
            case u_url:
            case u_sla:
            case d_pcnt:
            case d_1:
            case e_amp:
            case e_num:
            case m_eq:
            case m_1:
            case b_64:
            default: {
                } break;
        }
    }
}

struct url_scanner {
    fsa *host_parser;
    fsa *tags_parser;
    fsa *urls_parser;
    fsa *urld_parser;
    fsa *html_parser;
    fsa *mime_parser;
    fsa *b64_parser;

    url_scanner(recorder *memory);
    ~url_scanner();
    void scan(u_char *buffer, size_t length);
};

url_scanner::url_scanner(recorder *memory) {
    host_parser = new fsa(h_init, NULL,        NULL,        memory);
    tags_parser = new fsa(t_init, host_parser, NULL,        memory);
    urls_parser = new fsa(u_init, NULL,        NULL,        memory);
    urld_parser = new fsa(d_init, urls_parser, tags_parser, NULL);
    html_parser = new fsa(e_init, urld_parser, NULL,        NULL);
    mime_parser = new fsa(m_init, html_parser, NULL,        NULL);
    b64_parser  = new fsa(b_init, mime_parser, NULL,        NULL);
}

url_scanner::~url_scanner() {
    delete host_parser;
    delete tags_parser;
    delete urls_parser;
    delete urld_parser;
    delete html_parser;
    delete mime_parser;
    delete b64_parser;
}

void url_scanner::scan(u_char *buffer, size_t length) {
    b64_parser->push(buffer, length);
}