view src/scanner.cpp @ 142:b82e00146672 stable-5-22

always log smth auth rate counts
author carl
date Thu, 28 Sep 2006 08:43:32 -0700
parents df355d117199
children ecb40aa3eaa5
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

*/

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "includes.h"

static char* scanner_version="$Id$";

////////////////////////////////////////////////
// finite state machine
//
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,

			// uuencoding decoder states
			uu_init,
			uu_lf,
			uu_lf2,
			uu_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,
			uu_cr
		   };

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

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


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	 uu_init, uu_lf,   uu_lf2,	uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_lf,   uu_init, uu_lf2,	uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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,	 uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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,	 uu_init, uu_64,   uu_64,	uu_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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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,	 uu_init, uu_64,   uu_64,	uu_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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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,	 uu_init, uu_64,   uu_64,	uu_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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 0x5C backslash
	{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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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, uu_init, uu_64,   uu_64,	uu_64,	  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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,	 uu_init, uu_init, uu_init, uu_init,  },  // 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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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, uu_init, uu_init, uu_init, uu_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 backslash
	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 backslash
	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
};

u_char uu_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
	1,	// 0x21 !
	2,	// 0x22 "
	3,	// 0x23 #
	4,	// 0x24 $
	5,	// 0x25 %
	6,	// 0x26 &
	7,	// 0x27 '
	8,	// 0x28 (
	9,	// 0x29 )
   10,	// 0x2A *
   11,	// 0x2B +
   12,	// 0x2C ,
   13,	// 0x2D -
   14,	// 0x2E .
   15,	// 0x2F /
   16,	// 0x30 0
   17,	// 0x31 1
   18,	// 0x32 2
   19,	// 0x33 3
   20,	// 0x34 4
   21,	// 0x35 5
   22,	// 0x36 6
   23,	// 0x37 7
   24,	// 0x38 8
   25,	// 0x39 9
   26,	// 0x3A :
   27,	// 0x3B ;
   28,	// 0x3C <
   29,	// 0x3D =
   30,	// 0x3E >
   31,	// 0x3F ?
   32,	// 0x40 @
   33,	// 0x41 A
   34,	// 0x42 B
   35,	// 0x43 C
   36,	// 0x44 D
   37,	// 0x45 E
   38,	// 0x46 F
   39,	// 0x47 G
   40,	// 0x48 H
   41,	// 0x49 I
   42,	// 0x4A J
   43,	// 0x4B K
   44,	// 0x4C L
   45,	// 0x4D M
   46,	// 0x4E N
   47,	// 0x4F O
   48,	// 0x50 P
   49,	// 0x51 Q
   50,	// 0x52 R
   51,	// 0x53 S
   52,	// 0x54 T
   53,	// 0x55 U
   54,	// 0x56 V
   55,	// 0x57 W
   56,	// 0x58 X
   57,	// 0x59 Y
   58,	// 0x5A Z
   59,	// 0x5B [
   60,	// 0x5C backslash
   61,	// 0x5D ]
   62,	// 0x5E ^
   63,	// 0x5F _
	0,	// 0x60 `
	0,	// 0x61 a
	0,	// 0x62 b
	0,	// 0x63 c
	0,	// 0x64 d
	0,	// 0x65 e
	0,	// 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
};


////////////////////////////////////////////////
//
//
recorder::recorder(mlfiPriv *priv_, string_set &html_tags_, string_set &tlds_, string_set &cctlds_) {
	priv		  = priv_;
	html_tags	  = &html_tags_;
	tlds		  = &tlds_;
	cctlds		  = &cctlds_;
	bad_html_tags = 0;
	binary_tags   = 0;
}
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 > 2) && (bad_html_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);
		}
	}
}


////////////////////////////////////////////////
//
//
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(memory->get_priv(), err);
}

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

void fsa::validhost () {
	// remove trailing periods
	while (count && (pending[count-1]== '.')) pending[--count] = '\0';
	if (!count) return; // empty string
	if (!strchr((const char *)pending, '@')) {
		// not an email address or message id
		char *p1 = strchr((const char *)pending, '.');
		char *p2 = strrchr((const char *)pending, '.');
		char *p3 = strstr((const char *)pending, "..");
		if (p1 && (p1 != (char*)pending) & !p3) {
			// have a period, so at least two components, and no empty components
			in_addr ip;
			if (inet_aton((const char*)pending, &ip))
				memory->new_url((char*)pending);
			else {
				for (int i=0; i<count; i++) pending[i] = tolower(pending[i]);
				// is last component a tld?
				string_set::iterator i = memory->get_tlds()->find(p2+1);
				if (i != memory->get_tlds()->end()) memory->new_url((char*)pending);
			}
		}
	}
}

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: {
				if (count > 5) {
					// need some minimal length host name
					//otherwise binary files likely to generate false positives
					pending[--count] = '\0';  // null terminate host name by overwriting the terminator
					validhost();
				}
				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 > 11) {	// need some minimal length host name after the protocol
					pending[--count] = '\0';  // null terminate host name by overwriting the terminator
					// must start with protocol
					if (strncasecmp((const char *)pending, "http", 4) == 0) {
						char *p = strrchr((const char *)pending, '/');
						if (p) {
							count = strlen(p+1);
							memmove(pending, p+1, count+1);
							validhost();
						}
					}
				}
				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: {
				if ((count % 4) == 1) { 	// base64 data with trailing cr
					count--;				// ignore this cr
					// might have proper b64 data
					int cnt = 0;
					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;


			//////////////////////////////
			//	uuencoding decoder
			case uu_lf2: {
				count--;
				} break;

			case uu_cr: {
				if ((count % 4) == 2) { 	// leading count byte, uuencoded data, trailing cr
					count--;				// ignore this cr
					int bytes = uu_decode[pending[0]];		// bytes we are supposed to get from this line
					int size  = (bytes+2)/3*4;				// encoded size of those bytes
					if (size == count-1) {					// encoded size matches line length
						// might have proper uu data
						int cnt = 0;
						for (int i=1; i<count; i+=4) {
							unsigned long a1 = uu_decode[pending[i]];
							unsigned long a2 = uu_decode[pending[i+1]];
							unsigned long a3 = uu_decode[pending[i+2]];
							unsigned long a4 = uu_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);
						}
						count = bytes;
						st	  = uu_lf2;
					}
					else st = uu_init;
				}
				else st = uu_init;
				} // fall thru

			case uu_lf:
			case uu_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:
			case uu_64:
			default: {
				} break;
		}
	}
}


////////////////////////////////////////////////
//
//
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, memory);
	html_parser = new fsa(e_init,  urld_parser, NULL,		 memory);
	mime_parser = new fsa(m_init,  html_parser, NULL,		 memory);
	b64_parser	= new fsa(b_init,  mime_parser, NULL,		 memory);
	uu_parser	= new fsa(uu_init, b64_parser,	NULL,		 memory);
}

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;
	delete uu_parser;
}

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