summaryrefslogtreecommitdiffstats
path: root/fluent-bit/lib/monkey/qa
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-03-09 13:19:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-03-09 13:20:02 +0000
commit58daab21cd043e1dc37024a7f99b396788372918 (patch)
tree96771e43bb69f7c1c2b0b4f7374cb74d7866d0cb /fluent-bit/lib/monkey/qa
parentReleasing debian version 1.43.2-1. (diff)
downloadnetdata-58daab21cd043e1dc37024a7f99b396788372918.tar.xz
netdata-58daab21cd043e1dc37024a7f99b396788372918.zip
Merging upstream version 1.44.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'fluent-bit/lib/monkey/qa')
-rw-r--r--fluent-bit/lib/monkey/qa/README.txt20
-rw-r--r--fluent-bit/lib/monkey/qa/TEMPLATE26
-rw-r--r--fluent-bit/lib/monkey/qa/__CONFIG10
-rw-r--r--fluent-bit/lib/monkey/qa/__MACROS51
-rwxr-xr-xfluent-bit/lib/monkey/qa/checklog239
-rw-r--r--fluent-bit/lib/monkey/qa/connection_http10_01.htt26
-rw-r--r--fluent-bit/lib/monkey/qa/connection_http10_02.htt28
-rw-r--r--fluent-bit/lib/monkey/qa/connection_http10_03.htt27
-rw-r--r--fluent-bit/lib/monkey/qa/connection_http11_01.htt27
-rw-r--r--fluent-bit/lib/monkey/qa/connection_http11_02.htt28
-rw-r--r--fluent-bit/lib/monkey/qa/connection_http11_03.htt30
-rw-r--r--fluent-bit/lib/monkey/qa/directory_redirect_01.htt33
-rw-r--r--fluent-bit/lib/monkey/qa/directory_redirect_02.htt33
-rw-r--r--fluent-bit/lib/monkey/qa/directory_redirect_03.htt33
-rw-r--r--fluent-bit/lib/monkey/qa/docs_httest.txt181
-rw-r--r--fluent-bit/lib/monkey/qa/error_400_test01.htt26
-rw-r--r--fluent-bit/lib/monkey/qa/error_404.htt26
-rw-r--r--fluent-bit/lib/monkey/qa/error_411.htt26
-rw-r--r--fluent-bit/lib/monkey/qa/error_413_01.htt28
-rw-r--r--fluent-bit/lib/monkey/qa/error_413_02.htt297
-rw-r--r--fluent-bit/lib/monkey/qa/error_501.htt26
-rw-r--r--fluent-bit/lib/monkey/qa/error_505.htt27
-rw-r--r--fluent-bit/lib/monkey/qa/head_01.htt23
-rw-r--r--fluent-bit/lib/monkey/qa/head_02.htt29
-rw-r--r--fluent-bit/lib/monkey/qa/headers_case_insensitive.htt36
-rw-r--r--fluent-bit/lib/monkey/qa/hexa.htt26
-rw-r--r--fluent-bit/lib/monkey/qa/host_port_01.htt27
-rw-r--r--fluent-bit/lib/monkey/qa/host_port_02.htt25
-rw-r--r--fluent-bit/lib/monkey/qa/host_port_03.htt25
-rw-r--r--fluent-bit/lib/monkey/qa/http_parse_01.htt23
-rw-r--r--fluent-bit/lib/monkey/qa/if_modified_since_test01.htt32
-rw-r--r--fluent-bit/lib/monkey/qa/if_modified_since_test02.htt38
-rw-r--r--fluent-bit/lib/monkey/qa/if_modified_since_test03.htt50
-rw-r--r--fluent-bit/lib/monkey/qa/if_modified_since_test04.htt38
-rw-r--r--fluent-bit/lib/monkey/qa/keepalive_01.htt30
-rw-r--r--fluent-bit/lib/monkey/qa/keepalive_02.htt32
-rw-r--r--fluent-bit/lib/monkey/qa/last_modified_01.htt30
-rw-r--r--fluent-bit/lib/monkey/qa/path_traversal01.htt27
-rw-r--r--fluent-bit/lib/monkey/qa/path_traversal02.htt27
-rw-r--r--fluent-bit/lib/monkey/qa/path_traversal03.htt27
-rw-r--r--fluent-bit/lib/monkey/qa/post_test01.htt26
-rw-r--r--fluent-bit/lib/monkey/qa/post_test02.htt33
-rw-r--r--fluent-bit/lib/monkey/qa/post_test03.htt28
-rw-r--r--fluent-bit/lib/monkey/qa/protocol_01.htt26
-rw-r--r--fluent-bit/lib/monkey/qa/protocol_02.htt25
-rw-r--r--fluent-bit/lib/monkey/qa/protocol_03.htt25
-rw-r--r--fluent-bit/lib/monkey/qa/protocol_04.htt25
-rw-r--r--fluent-bit/lib/monkey/qa/protocol_05.htt25
-rw-r--r--fluent-bit/lib/monkey/qa/query.htt25
-rw-r--r--fluent-bit/lib/monkey/qa/ranges_test01.htt37
-rw-r--r--fluent-bit/lib/monkey/qa/ranges_test02.htt37
-rw-r--r--fluent-bit/lib/monkey/qa/ranges_test03.htt45
-rw-r--r--fluent-bit/lib/monkey/qa/ranges_test04.htt45
-rw-r--r--fluent-bit/lib/monkey/qa/ranges_test05.htt46
-rwxr-xr-xfluent-bit/lib/monkey/qa/run_tests.sh119
-rw-r--r--fluent-bit/lib/monkey/qa/simple.htt26
-rw-r--r--fluent-bit/lib/monkey/qa/uri_01.htt26
-rw-r--r--fluent-bit/lib/monkey/qa/uri_02.htt27
58 files changed, 2439 insertions, 0 deletions
diff --git a/fluent-bit/lib/monkey/qa/README.txt b/fluent-bit/lib/monkey/qa/README.txt
new file mode 100644
index 00000000..12c8c9e4
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/README.txt
@@ -0,0 +1,20 @@
+Monkey QA Test scripts
+======================
+This QA test script package has been written by
+Carlos Ghan (charlie.brown.uy@gmail.com) and is
+maintained by the Monkey developers team.
+
+In order to run this test you will need the
+HTTP Test Tool installed in your system, you can
+get the latest version from http://htt.sf.net/
+
+Running the tests
+=================
+To run all tests:
+ ./run-tests.sh
+
+[Variables in run-tests.sh]
+CONFIG_FILE Server parameters file (don't forget to set TEST_DOC_ROOT)
+LOGFILE Log errors to this file
+STOP_AT_ERRORS Stop at first error
+WITH_COLOR Enable/Disable color in output
diff --git a/fluent-bit/lib/monkey/qa/TEMPLATE b/fluent-bit/lib/monkey/qa/TEMPLATE
new file mode 100644
index 00000000..0303d986
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/TEMPLATE
@@ -0,0 +1,26 @@
+###############################################################################
+# DESCRIPTION
+# Test description
+#
+# AUTHOR
+# Author Name <author@email.here>
+#
+# DATE
+# Month_text Day_number Year_number
+#
+# COMMENTS
+# Anything pertinent.
+###############################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: $HOST
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/__CONFIG b/fluent-bit/lib/monkey/qa/__CONFIG
new file mode 100644
index 00000000..74b9f117
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/__CONFIG
@@ -0,0 +1,10 @@
+# Global server settings
+SET HOST=localhost
+SET PORT=2001
+SET HTTPVER=HTTP/1.1
+SET HTTPVER10=HTTP/1.0
+
+SET DOC_ROOT=../htdocs
+SET TEST_DOC=index.html
+
+SET TEST_LOG_LEVEL=4
diff --git a/fluent-bit/lib/monkey/qa/__MACROS b/fluent-bit/lib/monkey/qa/__MACROS
new file mode 100644
index 00000000..5e0352fe
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/__MACROS
@@ -0,0 +1,51 @@
+# ----------------------------------------------------------------------------
+# INIT: Common client-initialization
+# ----------------------------------------------------------------------------
+BLOCK INIT
+_LOG_LEVEL $TEST_LOG_LEVEL
+END
+
+
+# ----------------------------------------------------------------------------
+# FMT_DATE: Format given time in seconds to RFC 1123 format
+# Param 1: time in seconds
+# Param 2: where to store result (variable-name)
+#
+# (note: httest' STRFTIME works with msec instead of sec)
+# ----------------------------------------------------------------------------
+BLOCK FMT_DATE
+_OP $1 MUL 1000 aux
+_STRFTIME $aux "%a, %d %b %Y %H:%M:%S GMT" $2
+END
+
+
+# ----------------------------------------------------------------------------
+# TESTDOC_GETSIZE: Get TEST_DOC's file size & store it in TEST_DOC_LEN variable
+# ----------------------------------------------------------------------------
+BLOCK TESTDOC_GETSIZE
+_MATCH EXEC "(.*)" TEST_DOC_LEN
+_SH #!/bin/bash
+_SH stat -c %s $DOC_ROOT/$TEST_DOC
+_SH END
+END
+
+
+# ----------------------------------------------------------------------------
+# TESTDOC_GETEPOCH: Get TEST_DOC's Epoch time & store it in TEST_DOC_EPOCH
+# variable
+# ----------------------------------------------------------------------------
+BLOCK TESTDOC_GETEPOCH
+_MATCH EXEC "(.*)" TEST_DOC_EPOCH
+_SH #!/bin/bash
+_SH stat -c %Y $DOC_ROOT/$TEST_DOC
+_SH END
+END
+
+
+# ----------------------------------------------------------------------------
+# TESTDOC_GETDATE: Get TEST_DOC's date & store it in TEST_DOC_HTTPDATE variable
+# ----------------------------------------------------------------------------
+BLOCK TESTDOC_GETDATE
+_CALL TESTDOC_GETEPOCH
+_CALL FMT_DATE $TEST_DOC_EPOCH TEST_DOC_HTTPDATE
+END
diff --git a/fluent-bit/lib/monkey/qa/checklog b/fluent-bit/lib/monkey/qa/checklog
new file mode 100755
index 00000000..f1df314a
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/checklog
@@ -0,0 +1,239 @@
+#!/usr/bin/env python
+
+# Copyright (C) 2010, Eduardo Silva <edsiper@gmail.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import os
+import sys
+import re
+import getopt
+import ConfigParser
+
+RULES_PATH = 'log_rules'
+ACCESS_FILE = '../logs/access.log'
+ERROR_FILE = '../logs/error.log'
+
+class AccessRule:
+ def __init__(self,
+ ip = None, time = None,
+ method = None, uri = None,
+ protocol = None, status = None,
+ size = None):
+
+ self.type = 'access'
+ self.ip = ip
+ self.time = time
+ self.method = method
+ self.uri = uri
+ self.status = status
+ self.protocol = protocol
+ self.status = status
+
+ if size is not None:
+ if size.isdigit():
+ self.size = size
+ else:
+ if size[:8] == 'FILESIZE':
+ target = size[8:].strip()
+ self.size = os.path.getsize(target)
+ else:
+ self.size = size
+ else:
+ self.size = size
+
+class ErrorRule:
+ def __init__(self,
+ ip = None, time = None,
+ error = None, message = None):
+
+ self.type = 'error'
+ self.ip = ip
+ self.time = time
+ self.error = error
+ self.message = message
+
+class Config(ConfigParser.ConfigParser):
+ def __init__(self):
+ ConfigParser.ConfigParser.__init__(self)
+
+ def _get_value(self, section, key):
+ try:
+ value = self.get(section, key)
+ except:
+ value = None
+
+ return value
+
+ def get_rules(self, path):
+ self.read(path)
+
+ rules = []
+ for section in self.sections():
+ if section == 'access':
+ ip = self._get_value(section, 'ip')
+ time = self._get_value(section, 'time')
+ method = self._get_value(section, 'method')
+ uri = self._get_value(section, 'uri')
+ protocol = self._get_value(section, 'protocol')
+ status = self._get_value(section, 'status')
+ size = self._get_value(section, 'size')
+
+ rule = AccessRule(ip, time, method, uri, protocol, status, size)
+
+ elif section == 'error':
+ ip = self._get_value(section, 'ip')
+ time = self._get_value(section, 'time')
+ error = self._get_value(section, 'error')
+ message = self._get_value(section, 'message')
+
+ rule = ErrorRule(ip, time, error, message)
+
+ # Add rule to list
+ rules.append(rule)
+
+ return rules
+
+class Logfile:
+
+ def __init__(self):
+ self.silent_mode = False
+ self.target_logfile = None
+
+ self.check_arguments()
+
+ # Check if file exists
+ if os.path.isfile(self.target_logfile) is False:
+ # No rules exists for this test
+ if self.silent_mode is False:
+ print "No rules for target"
+ exit(2)
+
+ # Read rules
+ config = Config()
+ rules = config.get_rules(self.target_logfile)
+
+ if len(rules) == 0:
+ if self.silent_mode is False:
+ print "Error, no rules found on target file"
+ exit(2)
+
+ # Check rules
+ self.check_rules(rules)
+
+ def check_arguments(self):
+ optlist, args = getopt.getopt(sys.argv[1:], 'shl:')
+ for key, val in optlist:
+ if key == '-s':
+ self.silent_mode = True
+ elif key == '-l':
+ self.target_logfile = val
+ elif key == '-h':
+ self.help()
+
+ if self.target_logfile is None:
+ self.help()
+
+ def help(self):
+ print "** Monkey QA Checklog **"
+ print "Usage: ./checklog [-s] [-l logfile_rules]"
+ print "\nAvailable options"
+ print " -s Run checklog in silent mode, no messages to stdout"
+ print " -l logfile Specify the logfile rule"
+ print " -h Show this help"
+ print
+ exit(1)
+
+ def get_last_file_line(self, file):
+ f = open(file, 'r')
+ lines = f.readlines()
+ f.close()
+
+ if len(lines) < 1:
+
+ return None
+
+ # get last file line
+ last = lines[len(lines) - 1]
+ return last
+
+ def check_field(self, rule, log):
+ if rule is not None:
+ if str(rule) != str(log):
+ if self.silent_mode is False:
+ print "Rule does not match, expect '" + str(rule) + '\' got \'' + log + '\''
+ exit(1)
+ else:
+ return 0
+ else:
+ return 0
+
+ def check_rules(self, rules):
+ # Parse access log format, anyone is invited to fix this nasty regex
+ access_re = re.compile("^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})( - )(\[.*\])( .* ){1,4}(/.* )(.*/.* )(\d.* )(.*)\n$")
+ error_re = re.compile("^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})( - )(\[.*\])( \[.*\])(.*)$")
+
+ for r in rules:
+ if r.type == 'access':
+ line = self.get_last_file_line(ACCESS_FILE)
+ fields = access_re.split(line)
+
+ data = {'ip': fields[1],
+ 'time': fields[3],
+ 'method': fields[4].strip(),
+ 'uri': fields[5].strip(),
+ 'protocol': fields[6].strip(),
+ 'status': fields[7].strip(),
+ 'size': fields[8]
+ }
+
+ self.check_field(r.ip, data['ip'])
+ self.check_field(r.time, data['time'])
+ self.check_field(r.method, data['method'])
+ self.check_field(r.uri, data['uri'])
+ self.check_field(r.protocol, data['protocol'])
+ self.check_field(r.status, data['status'])
+ self.check_field(r.size, data['size'])
+
+ elif r.type == 'error':
+ line = self.get_last_file_line(ERROR_FILE)
+ fields = error_re.split(line)
+
+ # We always expect at least 4 fields
+ if len(fields) < 4:
+ if self.silent_mode is False:
+ print "Error: we did not find the expected fields"
+ print "Logfile line"
+ print " %s " % line
+ exit(1)
+
+ data = {'ip': fields[1],
+ 'time': fields[3],
+ 'error': fields[4].strip('[error (\d)]'),
+ 'message': fields[5].strip()
+ }
+
+ self.check_field(r.ip, data['ip'])
+ self.check_field(r.time, data['time'])
+ self.check_field(r.error, data['error'])
+ self.check_field(r.message, data['message'])
+
+
+ if self.silent_mode is False:
+ print "Check passed :)"
+
+if __name__ == '__main__':
+ Logfile()
+
diff --git a/fluent-bit/lib/monkey/qa/connection_http10_01.htt b/fluent-bit/lib/monkey/qa/connection_http10_01.htt
new file mode 100644
index 00000000..125c519e
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/connection_http10_01.htt
@@ -0,0 +1,26 @@
+###############################################################################
+# DESCRIPTION
+# HTTP/1.0 request expect 'Connection: close'
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# March 16 2010
+#
+# COMMENTS
+# Server must return a 200 response.
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_REQ $HOST $PORT
+__GET / $HTTPVER10
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_EXPECT . "Connection: Close"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/connection_http10_02.htt b/fluent-bit/lib/monkey/qa/connection_http10_02.htt
new file mode 100644
index 00000000..be17928e
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/connection_http10_02.htt
@@ -0,0 +1,28 @@
+###############################################################################
+# DESCRIPTION
+# HTTP/1.0 Request with 'Connection: Keep-Alive'.
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# March 16 2010
+#
+# COMMENTS
+# Do not expect header response with keep-alive header
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_REQ $HOST $PORT
+__GET / $HTTPVER10
+__Connection: Keep-Alive
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_EXPECT . "!Keep-Alive: timeout=5, max=1000"
+_EXPECT . "Connection: Keep-Alive"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/connection_http10_03.htt b/fluent-bit/lib/monkey/qa/connection_http10_03.htt
new file mode 100644
index 00000000..4fbaa7bd
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/connection_http10_03.htt
@@ -0,0 +1,27 @@
+###############################################################################
+# DESCRIPTION
+# HTTP/1.0 Request with an invalid 'Connection' header
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# March 16 2010
+#
+# COMMENTS
+# Expect 'Connection: closed' from server
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_REQ $HOST $PORT
+__GET / $HTTPVER10
+__Connection: an invalid value
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_EXPECT . "Connection: Close"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/connection_http11_01.htt b/fluent-bit/lib/monkey/qa/connection_http11_01.htt
new file mode 100644
index 00000000..f8a32f57
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/connection_http11_01.htt
@@ -0,0 +1,27 @@
+###############################################################################
+# DESCRIPTION
+# Server must not send connection header
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# March 17 2010
+#
+# COMMENTS
+# Do not Expect 'Connection:' from server
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: $HOST
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_EXPECT . "!Connection:"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/connection_http11_02.htt b/fluent-bit/lib/monkey/qa/connection_http11_02.htt
new file mode 100644
index 00000000..f120fbcb
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/connection_http11_02.htt
@@ -0,0 +1,28 @@
+###############################################################################
+# DESCRIPTION
+# Server must not send connection header
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# March 17 2011
+#
+# COMMENTS
+# Do Expect 'Connection:' from server
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: $HOST
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_EXPECT . "Connection: Close"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/connection_http11_03.htt b/fluent-bit/lib/monkey/qa/connection_http11_03.htt
new file mode 100644
index 00000000..e032a945
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/connection_http11_03.htt
@@ -0,0 +1,30 @@
+###############################################################################
+# DESCRIPTION
+# HTTP/1.1 Request with an invalid connection header, server must
+# not send a connection header, must assume keepalive by default
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# March 17 2010
+#
+# COMMENTS
+# Do not Expect 'Connection:' header
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: $HOST
+__Connection: an invalid value
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_EXPECT . "!Connection:"
+_EXPECT . "!Keep-Alive:"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/directory_redirect_01.htt b/fluent-bit/lib/monkey/qa/directory_redirect_01.htt
new file mode 100644
index 00000000..3af2181f
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/directory_redirect_01.htt
@@ -0,0 +1,33 @@
+###############################################################################
+# DESCRIPTION
+# Check directory redirect
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# Jun 2 2010
+#
+# COMMENTS
+# Server must return a 301 moved permanently header.
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_CALL INIT
+_CALL TESTDOC_GETDATE
+
+_REQ $HOST $PORT
+__GET /img $HTTPVER
+__Host: $HOST:$PORT
+__If-Modified-Since: $TEST_DOC_HTTPDATE
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 301 Moved Permanently"
+_EXPECT . "Content-Length: 0"
+_EXPECT . "Location: http://$HOST:$PORT/img/
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/directory_redirect_02.htt b/fluent-bit/lib/monkey/qa/directory_redirect_02.htt
new file mode 100644
index 00000000..959a15b9
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/directory_redirect_02.htt
@@ -0,0 +1,33 @@
+###############################################################################
+# DESCRIPTION
+# Check directory redirect, we do not set port in the Host header
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# May 19 2012
+#
+# COMMENTS
+# Server must return a 301 moved permanently header.
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_CALL INIT
+_CALL TESTDOC_GETDATE
+
+_REQ $HOST $PORT
+__GET /img $HTTPVER
+__Host: $HOST
+__If-Modified-Since: $TEST_DOC_HTTPDATE
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 301 Moved Permanently"
+_EXPECT . "Content-Length: 0"
+_EXPECT . "Location: http://$HOST/img/
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/directory_redirect_03.htt b/fluent-bit/lib/monkey/qa/directory_redirect_03.htt
new file mode 100644
index 00000000..1ff1f932
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/directory_redirect_03.htt
@@ -0,0 +1,33 @@
+###############################################################################
+# DESCRIPTION
+# Check directory redirect, we set a different port in the Host header
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# May 19 2012
+#
+# COMMENTS
+# Server must return a 301 moved permanently header.
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_CALL INIT
+_CALL TESTDOC_GETDATE
+
+_REQ $HOST $PORT
+__GET /img $HTTPVER
+__Host: $HOST:12345
+__If-Modified-Since: $TEST_DOC_HTTPDATE
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 301 Moved Permanently"
+_EXPECT . "Content-Length: 0"
+_EXPECT . "Location: http://$HOST:12345/img/
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/docs_httest.txt b/fluent-bit/lib/monkey/qa/docs_httest.txt
new file mode 100644
index 00000000..07556c95
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/docs_httest.txt
@@ -0,0 +1,181 @@
+Global Commands
+---------------
+BLOCK <name>
+Store a block of commands to call it from a CLIENT/SERVER/BLOCK
+
+CLIENT [<number of concurrent clients>]
+Client body start, close it with END and a newline
+
+DAEMON
+Daemon body start, close it with END and a newline.
+A daemon will not join CLIENT/SERVER and could therefore be used
+for supervisor jobs
+
+END
+Close CLIENT|SERVER body
+
+EXEC <shell command>
+Execute a shell command, attention executes will not join CLIENT/SERVER
+
+GO
+Starts all client in sync mode
+
+INCLUDE <include file>
+Load and execute defined include file,
+current path is taken the callers current path
+
+SERVER [<SSL>:]<port> [<number of concurrent servers>]
+Server body start, close it with END and a newline,
+Do load server.cert.pem and server.key.pem if found in local directory,
+number of concurrent servers, -1 for unlimited,
+<SSL>: SSL, SSL2, SSL3, TLS
+
+SET <variable>=<value>
+Store a value in a global variable
+
+TIMEOUT <timeout in ms>
+Defines global socket timeout
+
+
+Local Commands
+-------------
+-__ <string>
+Send <string> to the socket with a CRLF at the end of line
+
+_- <string>
+Same like __ but no CRLF at the end of line
+
+_ADD_HEADER <header> <value>
+Add additional header to received headers to force forexample chunked encoding
+
+_BPS <n>
+Send not more than defined Bytes per second
+close body with _END BPS
+
+_CALL <name of block>
+Call a defined block
+
+_CERT <cert-file> <key-file> [<ca-cert-file>]
+Sets cert for the current ssl connection, mainly used for server cert
+
+_CHUNK
+Mark the end of a chunk block, all data after last _FLUSH are counted,
+does automatic add chunk info
+
+_CLOSE
+Close the current connection and set the connection state to CLOSED
+
+_DEBUG <string>
+Prints to stderr for debugging reasons
+
+_DOWN
+Shutdown listener
+
+_EXEC <shell command>
+Execute a shell command, _EXEC| will pipe the incoming stream on the
+socket in to the called shell command
+
+_EXIT [OK|FAILED]
+Exits with OK or FAILED default is FAILED
+
+_EXPECT . "[!]<regex>"
+Define what data we do or do not expect on a WAIT command.
+Negation with a leading '!' in the <regex>
+
+_FLUSH
+Flush the cached lines,
+the AUTO Content-Length calculation will take place here
+
+_HEADER ALLOW|FILTER <header name>
+Defines allowed headers or headers to filter,
+default all headers are allowed and no headers are filtered.
+Filter only for receive mechanisme
+
+_IF "<expression>" MATCH "[!]<regex>"
+Test if variable do or do not match the regex, close body with _END IF,
+negation with a leading '!' in the <regex>,
+<expression> must not be empty
+
+_IGNORE_ERR <regex>
+This command is Depreciated, do not use it
+Ignores errors specified in <regex>,
+i.e. ".*" would ignore all errors, only .* is implemented
+
+_LOG_LEVEL <level>
+Level is a number 0-4
+
+_LOOP <n>
+Do loop the body <n> times,
+close body with _END LOOP
+
+_MATCH (headers|body|error) "<regex>" <variable>
+Define a regex with a match which should be stored in <variable>
+
+_MATCH EXEC "<regex>" <variable>
+_EXEC algun_comando
+(No documentado; aparece en los ejemplos de la página web)
+Hace lo mismo que _MATCH pero con la salida del comando ejecutado en _EXEC
+
+_ONLY_PRINTABLE on|off
+Replace all chars below 32 and above 127 with a space
+
+_OP <left> ADD|SUB|DIV|MUL <right> <variable>
+Store evaluated expression
+
+_PIPE [chunked [<chunk_size>]]
+Start a pipe for stream the output of EXEC to the socket stream,
+wiht optional chunk support
+
+_RAND <start> <end>
+Generates a number between <start> and <end>
+
+_RECV <bytes>|POLL
+Receive an amount of bytes, either specified by a number
+or as much until socket timeout will in POLL mode
+
+_REQ <host> [<SSL>:]<port>[:<tag>] [<cert-file> <key-file> [<ca-cert-file>]]
+Start a request to defined host:port, with SSL support.
+Does only open a new connection if we are in connection state CLOSED
+<SSL>: SSL, SSL2, SSL3, TLS<tag>:Additional tag info do support multiple connection to one target
+<cert-file>, <key-file> and <ca-cert-file> are optional for client/server authentication
+
+_RES
+Wait for a connection accept
+
+_SENDFILE <file>
+Send file over http
+
+_SET <variable>=<value>
+Store a value in a local variable
+
+_SH shell script line or END
+Embedded shell script within a tmp file, execute if END is found
+
+_SLEEP <milisecond>
+Sleep for defined amount of time
+
+_SOCKSTATE <variable>
+Stores connection state CLOSED or CONNECTED in the <variable>
+
+_SYNC
+Synchronise to the next full second
+
+_TIME <variable>
+Store time in variable [ms]
+
+_TIMEOUT <miliseconds>
+Set socket timeout of current socket
+
+_UP
+Setup listener
+
+_VERIFY_PEER
+Gets peer cert and validate it
+
+_WAIT [<amount of bytes>]
+Wait for data and receive them.
+EXPECT and MATCH definitions will be checked here on the incoming data.
+Optional you could receive a specific amount of bytes
+
+_WHICH <variable>
+Stores the concurrency number of current thread
diff --git a/fluent-bit/lib/monkey/qa/error_400_test01.htt b/fluent-bit/lib/monkey/qa/error_400_test01.htt
new file mode 100644
index 00000000..e6d7e7fa
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/error_400_test01.htt
@@ -0,0 +1,26 @@
+################################################################################
+# DESCRIPTION
+# Exercise error 400
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# June 29 2009
+#
+# COMMENTS
+# Sending a bad request. In this case, one with missing "Host" header.
+# ("Host" header is required in HTTP v1.1)
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 400 Bad Request"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/error_404.htt b/fluent-bit/lib/monkey/qa/error_404.htt
new file mode 100644
index 00000000..2860048c
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/error_404.htt
@@ -0,0 +1,26 @@
+################################################################################
+# DESCRIPTION
+# Exercise error 404
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# June 29 2009
+#
+# COMMENTS
+# Requesting an inexistent object should return "Not Found"
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET /a_file_that_doesnt_exists.html $HTTPVER
+__Host: $HOST
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 404 Not Found"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/error_411.htt b/fluent-bit/lib/monkey/qa/error_411.htt
new file mode 100644
index 00000000..95c8d22b
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/error_411.htt
@@ -0,0 +1,26 @@
+################################################################################
+# DESCRIPTION
+# Exercise error 411
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# June 29 2009
+#
+# COMMENTS
+# A POST request without "Content-Length" should return "Length Required"
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__POST / $HTTPVER
+__Host: $HOST
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 411 Length Required"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/error_413_01.htt b/fluent-bit/lib/monkey/qa/error_413_01.htt
new file mode 100644
index 00000000..d9b519d2
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/error_413_01.htt
@@ -0,0 +1,28 @@
+################################################################################
+# DESCRIPTION
+# Exercise error 413
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# July 11 2010
+#
+# COMMENTS
+# A POST request with a higher content-lengt header, it should
+# return "413 Request Entity Too Large"
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__POST / $HTTPVER
+__Host: $HOST
+__Content-Length: 999999999999999999999
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 413 Request Entity Too Large"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/error_413_02.htt b/fluent-bit/lib/monkey/qa/error_413_02.htt
new file mode 100644
index 00000000..7a5b6af2
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/error_413_02.htt
@@ -0,0 +1,297 @@
+################################################################################
+# DESCRIPTION
+# Exercise error 413
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# July 11 2010
+#
+# COMMENTS
+# A very long request, it should return "413 Request Entity Too Large"
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: $HOST
+__Header1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+__Header2: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+__Header3: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
+__Header4: dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__HeaderD: mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
+__HeaderE: nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
+__HeaderF: oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
+__Header1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+__Header2: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+__Header3: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
+__Header4: dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__HeaderD: mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
+__HeaderE: nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
+__HeaderF: oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
+__Header1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+__Header2: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+__Header3: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
+__Header4: dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header5: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__Header6: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+__Header8: gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+__Header9: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+__Header0: iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__HeaderC: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+__HeaderA: jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+__HeaderB: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 413 Request Entity Too Large"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/error_501.htt b/fluent-bit/lib/monkey/qa/error_501.htt
new file mode 100644
index 00000000..275bca4f
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/error_501.htt
@@ -0,0 +1,26 @@
+################################################################################
+# DESCRIPTION
+# Exercise error 501
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# June 29 2009
+#
+# COMMENTS
+# Requesting an unsupported method should return "Not Implemented"
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__1234 / $HTTPVER
+__Host: $HOST
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 501 Not Implemented"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/error_505.htt b/fluent-bit/lib/monkey/qa/error_505.htt
new file mode 100644
index 00000000..f50fafe3
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/error_505.htt
@@ -0,0 +1,27 @@
+################################################################################
+# DESCRIPTION
+# Exercise error 505
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# June 29 2009
+#
+# COMMENTS
+# Requesting an unsupported HTTP version should return "HTTP Version Not
+# Supported"
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET / HTTP/1.9
+__Host: $HOST
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 505 HTTP Version Not Supported"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/head_01.htt b/fluent-bit/lib/monkey/qa/head_01.htt
new file mode 100644
index 00000000..6956c474
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/head_01.htt
@@ -0,0 +1,23 @@
+################################################################################
+# DESCRIPTION
+# HEAD method.
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# June 29 2009
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__HEAD / $HTTPVER
+__Host: $HOST
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_WAIT 0
+END
diff --git a/fluent-bit/lib/monkey/qa/head_02.htt b/fluent-bit/lib/monkey/qa/head_02.htt
new file mode 100644
index 00000000..149cbce9
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/head_02.htt
@@ -0,0 +1,29 @@
+################################################################################
+# DESCRIPTION
+# HEAD method must return content length
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# February 17 2011
+#
+# COMMENTS
+# In some recent versions (0.12.x), the content-length is not being
+# sent for HEAD request method, adding this QA file to avoid regressions.
+#
+################################################################################
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__HEAD / $HTTPVER
+__Host: $HOST
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_EXPECT . "Content-Length"
+_EXPECT . "Content-Type"
+_WAIT 0
+END
diff --git a/fluent-bit/lib/monkey/qa/headers_case_insensitive.htt b/fluent-bit/lib/monkey/qa/headers_case_insensitive.htt
new file mode 100644
index 00000000..d2154bfa
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/headers_case_insensitive.htt
@@ -0,0 +1,36 @@
+################################################################################
+# DESCRIPTION
+# Test that headers are treated as case insensitive. (RFC2616 Section 4.2)
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# June 29 2009
+################################################################################
+
+
+INCLUDE __CONFIG
+CLIENT
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__HOST: $HOST
+__CONNECTION: close
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_WAIT
+_CLOSE
+
+_REQ $HOST $PORT
+__POST / $HTTPVER
+__HOST: $HOST
+__CONNECTION: close
+__CONTENT-TYPE: text/plain
+__CONTENT-LENGTH: AUTO
+__
+_-This is a test entity body.
+_EXPECT . "HTTP/1.1 200 OK"
+_WAIT
+_CLOSE
+
+END
diff --git a/fluent-bit/lib/monkey/qa/hexa.htt b/fluent-bit/lib/monkey/qa/hexa.htt
new file mode 100644
index 00000000..059df4fb
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/hexa.htt
@@ -0,0 +1,26 @@
+################################################################################
+# DESCRIPTION
+# Test request in hexadecimal format.
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# March 16 2010
+#
+# COMMENTS
+# Simple "index.html"
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET /%69%6E%64%65%78.%68%74%6D%6C $HTTPVER
+__Host: $HOST
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/host_port_01.htt b/fluent-bit/lib/monkey/qa/host_port_01.htt
new file mode 100644
index 00000000..9dd58cf6
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/host_port_01.htt
@@ -0,0 +1,27 @@
+################################################################################
+# DESCRIPTION
+# Validation for TCP port in the Host header
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# Jun 15 2012
+#
+# COMMENTS
+# It send a valid host TCP port with the max length allowed
+#
+################################################################################
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__HEAD / $HTTPVER
+__Host: $HOST:20000
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_EXPECT . "Content-Length"
+_EXPECT . "Content-Type"
+_WAIT 0
+END
diff --git a/fluent-bit/lib/monkey/qa/host_port_02.htt b/fluent-bit/lib/monkey/qa/host_port_02.htt
new file mode 100644
index 00000000..56172db6
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/host_port_02.htt
@@ -0,0 +1,25 @@
+################################################################################
+# DESCRIPTION
+# Validation for TCP port in the Host header
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# Jun 15 2012
+#
+# COMMENTS
+# It send an invalid host TCP port, length >= 6
+#
+################################################################################
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__HEAD / $HTTPVER
+__Host: $HOST:202001
+__
+_EXPECT . "HTTP/1.1 400 Bad Request"
+_WAIT 0
+END
diff --git a/fluent-bit/lib/monkey/qa/host_port_03.htt b/fluent-bit/lib/monkey/qa/host_port_03.htt
new file mode 100644
index 00000000..f78e2ea0
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/host_port_03.htt
@@ -0,0 +1,25 @@
+################################################################################
+# DESCRIPTION
+# Validation for TCP port in the Host header
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# Jun 15 2012
+#
+# COMMENTS
+# It send a valid host TCP port using not numeric values
+#
+################################################################################
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__HEAD / $HTTPVER
+__Host: $HOST:2000a
+__
+_EXPECT . "HTTP/1.1 400 Bad Request"
+_WAIT 0
+END
diff --git a/fluent-bit/lib/monkey/qa/http_parse_01.htt b/fluent-bit/lib/monkey/qa/http_parse_01.htt
new file mode 100644
index 00000000..ec11658b
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/http_parse_01.htt
@@ -0,0 +1,23 @@
+################################################################################
+# DESCRIPTION
+# It sends an invalid Host header
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# April 04 2012
+################################################################################
+
+
+INCLUDE __CONFIG
+CLIENT
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: [::1]:AABB
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 400 Bad Request"
+_WAIT
+_CLOSE
+END
diff --git a/fluent-bit/lib/monkey/qa/if_modified_since_test01.htt b/fluent-bit/lib/monkey/qa/if_modified_since_test01.htt
new file mode 100644
index 00000000..3124e700
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/if_modified_since_test01.htt
@@ -0,0 +1,32 @@
+###############################################################################
+# DESCRIPTION
+# Trivial test for If-Modified-Since header.
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# January 27 2010
+#
+# COMMENTS
+# Server must return a 304 response, since we are passing the requested file's
+# date as If-Modified-Since's parameter.
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_CALL INIT
+_CALL TESTDOC_GETDATE
+
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: $HOST
+__If-Modified-Since: $TEST_DOC_HTTPDATE
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 304 Not Modified"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/if_modified_since_test02.htt b/fluent-bit/lib/monkey/qa/if_modified_since_test02.htt
new file mode 100644
index 00000000..45a4f87a
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/if_modified_since_test02.htt
@@ -0,0 +1,38 @@
+###############################################################################
+# DESCRIPTION
+# Trivial test for If-Modified-Since header.
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# January 27 2010
+#
+# COMMENTS
+# Server must return a 304 response, since we are passing a date 1-week after
+# requested file's date as If-Modified-Since's parameter.
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_CALL INIT
+_CALL TESTDOC_GETEPOCH
+
+# 604800 seconds = 1 week
+_OP $TEST_DOC_EPOCH ADD 604800 TEST_DOC_EPOCH
+
+# Format date
+_CALL FMT_DATE $TEST_DOC_EPOCH TEST_DOC_HTTPDATE
+
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: $HOST
+__If-Modified-Since: $TEST_DOC_HTTPDATE
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 304 Not Modified"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/if_modified_since_test03.htt b/fluent-bit/lib/monkey/qa/if_modified_since_test03.htt
new file mode 100644
index 00000000..90f3cd03
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/if_modified_since_test03.htt
@@ -0,0 +1,50 @@
+###############################################################################
+# DESCRIPTION
+# Test server's response against invalid If-Modified-Since header values.
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# January 27 2010
+#
+# COMMENTS
+# Server must return a 200 response (RFC 2616 Section 14.25a)
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_CALL INIT
+
+# Garbage in If-Modified-Since header
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: $HOST
+__If-Modified-Since: i'm a bad monkey }:]
+__Connection: Keep-Alive
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_WAIT
+
+# Some invalid dates
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: $HOST
+__If-Modified-Since: Sat, 30 Feb 2009 14:40:57 GMT
+__Connection: Keep-Alive
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_WAIT
+
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: $HOST
+__If-Modified-Since: Sat, 21 Nov 9999 14:40:57 GMT
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 304 Not Modified"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/if_modified_since_test04.htt b/fluent-bit/lib/monkey/qa/if_modified_since_test04.htt
new file mode 100644
index 00000000..ca5e593d
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/if_modified_since_test04.htt
@@ -0,0 +1,38 @@
+###############################################################################
+# DESCRIPTION
+# Trivial test for If-Modified-Since header.
+#
+# AUTHOR
+# Sonny Karlsson <ksonny@lotrax.org>
+#
+# DATE
+# July 10 2013
+#
+# COMMENTS
+# Server must return a 200 response, since we are passing a time 1
+# min before requested file's date as If-Modified-Since's parameter.
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_CALL INIT
+_CALL TESTDOC_GETEPOCH
+
+# Test
+_OP $TEST_DOC_EPOCH SUB 60 TEST_DOC_EPOCH
+
+# Format date
+_CALL FMT_DATE $TEST_DOC_EPOCH TEST_DOC_HTTPDATE
+
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: $HOST
+__If-Modified-Since: $TEST_DOC_HTTPDATE
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/keepalive_01.htt b/fluent-bit/lib/monkey/qa/keepalive_01.htt
new file mode 100644
index 00000000..dd61649f
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/keepalive_01.htt
@@ -0,0 +1,30 @@
+###############################################################################
+# DESCRIPTION
+# HTTP/1.1 Request requesting Keep-Alive, we expect the server keeps the
+# keep-alive open and send proper header responses for that.
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# February 26 2011
+#
+# COMMENTS
+# Do not Expect 'Connection: Close'
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: $HOST
+__Connection: Keep-Alive
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_EXPECT . "!Connection: Closed"
+_WAIT
+
+END
diff --git a/fluent-bit/lib/monkey/qa/keepalive_02.htt b/fluent-bit/lib/monkey/qa/keepalive_02.htt
new file mode 100644
index 00000000..e618a01d
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/keepalive_02.htt
@@ -0,0 +1,32 @@
+###############################################################################
+# DESCRIPTION
+# HTTP/1.0 Request requesting Keep-Alive, we expect the server keeps the
+# keep-alive open and send proper header responses for that.
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# December 14 2014
+#
+# COMMENTS
+# This is a HTTP/1.0 test
+# Do not Expect 'Connection: Close'
+# Do Expect 'Connection: Keep-Alive'
+###############################################################################
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_REQ $HOST $PORT
+__GET / $HTTPVER10
+__Host: $HOST
+__Connection: Keep-Alive
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_EXPECT . "!Connection: Closed"
+_EXPECT . "Connection: Keep-Alive"
+_WAIT
+
+END
diff --git a/fluent-bit/lib/monkey/qa/last_modified_01.htt b/fluent-bit/lib/monkey/qa/last_modified_01.htt
new file mode 100644
index 00000000..dfc4c51a
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/last_modified_01.htt
@@ -0,0 +1,30 @@
+###############################################################################
+# DESCRIPTION
+# Trivial test to check Last-Modified header
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# Jun 26 2010
+#
+# COMMENTS
+# Server must return the Last-Modified header.
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_CALL INIT
+
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: $HOST
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_EXPECT . "Last-Modified:"
+_EXPECT . "Content-Length:"
+_WAIT 0
+END
diff --git a/fluent-bit/lib/monkey/qa/path_traversal01.htt b/fluent-bit/lib/monkey/qa/path_traversal01.htt
new file mode 100644
index 00000000..19a40abc
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/path_traversal01.htt
@@ -0,0 +1,27 @@
+################################################################################
+# DESCRIPTION
+# Test against directory traversal (client must not be allowed to "get out" of
+# DocumentRoot.
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# March 08 2010
+#
+# COMMENTS
+# Simple "../"
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET /../conf/monkey.conf $HTTPVER
+__Host: $HOST
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 403 Forbidden"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/path_traversal02.htt b/fluent-bit/lib/monkey/qa/path_traversal02.htt
new file mode 100644
index 00000000..793c383a
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/path_traversal02.htt
@@ -0,0 +1,27 @@
+################################################################################
+# DESCRIPTION
+# Test against directory traversal (client must not be allowed to "get out" of
+# DocumentRoot.
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# March 08 2010
+#
+# COMMENTS
+# Using URL-encoded hex values
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET /%2e%2e/conf/monkey.conf $HTTPVER
+__Host: $HOST
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 403 Forbidden"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/path_traversal03.htt b/fluent-bit/lib/monkey/qa/path_traversal03.htt
new file mode 100644
index 00000000..37e16533
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/path_traversal03.htt
@@ -0,0 +1,27 @@
+################################################################################
+# DESCRIPTION
+# Test against directory traversal (client must not be allowed to "get out" of
+# DocumentRoot.
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# March 08 2010
+#
+# COMMENTS
+# Mixing dots and %2e
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET /%2e%2e/../%2e./.%2e/../%2e%2e/../../%2e./.%2e/etc/motd $HTTPVER
+__Host: $HOST
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 403 Forbidden"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/post_test01.htt b/fluent-bit/lib/monkey/qa/post_test01.htt
new file mode 100644
index 00000000..856afdc5
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/post_test01.htt
@@ -0,0 +1,26 @@
+################################################################################
+# DESCRIPTION
+# POST method.
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# June 29 2009
+###############################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__POST / $HTTPVER
+__Host: $HOST
+__Content-Type: text/plain
+__Content-Length: AUTO
+__Connection: close
+__
+_-someVariable=1234&daemon=monkeyd&SESSION=e1d83283d597ca88f599e34c8ef2e8c3
+_EXPECT . "HTTP/1.1 200 OK"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/post_test02.htt b/fluent-bit/lib/monkey/qa/post_test02.htt
new file mode 100644
index 00000000..b323be88
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/post_test02.htt
@@ -0,0 +1,33 @@
+################################################################################
+# DESCRIPTION
+# An incomplete POST request.
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# June 29 2009
+#
+# COMMENTS
+# A POST request with missing Content-Length.(Should return "Length Required")
+################################################################################
+
+# Why post_test02.htt sometimes fail ?
+# ------------------------------------
+# it fails because the httest tool catch the close connection from Monkey before it
+# finish to send the whole request, Monkey will not continue working in a request
+# which will not work properly, bad monkey >:D
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__POST / $HTTPVER
+__Host: $HOST
+__Content-Type: text/plain
+__Connection: close
+__
+_-someVariable=1234&daemon=monkeyd&SESSION=e1d83283d597ca88f599e34c8ef2e8c3
+_EXPECT . "HTTP/1.1 411 Length Required"
+_WAIT 0
+END
diff --git a/fluent-bit/lib/monkey/qa/post_test03.htt b/fluent-bit/lib/monkey/qa/post_test03.htt
new file mode 100644
index 00000000..7604c823
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/post_test03.htt
@@ -0,0 +1,28 @@
+################################################################################
+# DESCRIPTION
+# An incomplete POST request.
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# July 25, 2010
+#
+# COMMENTS
+# A POST request with missing post data, the server must close the
+# connection due to timeout
+################################################################################
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__POST / $HTTPVER
+__Host: $HOST
+__Content-Length: 10
+__Content-Type: text/plain
+__Connection: close
+__
+_EXPECT ERROR "End of file found\(70014\)"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/protocol_01.htt b/fluent-bit/lib/monkey/qa/protocol_01.htt
new file mode 100644
index 00000000..6040a5c8
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/protocol_01.htt
@@ -0,0 +1,26 @@
+################################################################################
+# DESCRIPTION
+# Exercise error 400
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# June 23 2010
+#
+# COMMENTS
+# Sending a bad request. This request contain double \\ and an
+# unsupported protocol.
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET /\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ a
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 505 HTTP Version Not Supported"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/protocol_02.htt b/fluent-bit/lib/monkey/qa/protocol_02.htt
new file mode 100644
index 00000000..a94b62e2
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/protocol_02.htt
@@ -0,0 +1,25 @@
+################################################################################
+# DESCRIPTION
+# Exercise error 400
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# June 23 2010
+#
+# COMMENTS
+# Sending protocol in lower case.
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET / http/1.0
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 505 HTTP Version Not Supported"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/protocol_03.htt b/fluent-bit/lib/monkey/qa/protocol_03.htt
new file mode 100644
index 00000000..89258ddf
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/protocol_03.htt
@@ -0,0 +1,25 @@
+################################################################################
+# DESCRIPTION
+# Exercise error 400
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# June 23 2010
+#
+# COMMENTS
+# Request without HTTP protocol version (nothing after URI)
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET /
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 400 Bad Request"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/protocol_04.htt b/fluent-bit/lib/monkey/qa/protocol_04.htt
new file mode 100644
index 00000000..bdbde90b
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/protocol_04.htt
@@ -0,0 +1,25 @@
+################################################################################
+# DESCRIPTION
+# Exercise error 400
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# June 23 2010
+#
+# COMMENTS
+# Request without HTTP protocol version
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET /
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 505 HTTP Version Not Supported"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/protocol_05.htt b/fluent-bit/lib/monkey/qa/protocol_05.htt
new file mode 100644
index 00000000..91462803
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/protocol_05.htt
@@ -0,0 +1,25 @@
+################################################################################
+# DESCRIPTION
+# Exercise error 400
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# June 23 2010
+#
+# COMMENTS
+# Request with a Query String without HTTP protocol version,
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET /?a=1
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 400 Bad Request"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/query.htt b/fluent-bit/lib/monkey/qa/query.htt
new file mode 100644
index 00000000..eec3bd20
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/query.htt
@@ -0,0 +1,25 @@
+################################################################################
+# DESCRIPTION
+# A simple GET query.
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# June 29 2009
+################################################################################
+
+
+INCLUDE __CONFIG
+
+SET QUERY=server=monkeyd&version=0.10git&someVariable=someValue&num=1234
+
+CLIENT
+_REQ $HOST $PORT
+__GET /?$QUERY $HTTPVER
+__Host: $HOST
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/ranges_test01.htt b/fluent-bit/lib/monkey/qa/ranges_test01.htt
new file mode 100644
index 00000000..cb5b577a
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/ranges_test01.htt
@@ -0,0 +1,37 @@
+###############################################################################
+# DESCRIPTION
+# Test partial content request. Range type: 0- (from offset 0 to end)
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# February 02 2010
+#
+# COMMENTS
+# RFC 2616 Section 14.35
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_CALL INIT
+_CALL TESTDOC_GETSIZE
+
+# Last offset = document_length - 1
+_OP $TEST_DOC_LEN SUB 1 TEST_DOC_LAST
+
+_REQ $HOST $PORT
+__GET /$TEST_DOC $HTTPVER
+__Host: $HOST
+__Range: bytes=0-
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 206 Partial Content"
+_EXPECT . "Date:"
+_EXPECT . "Content-Range: bytes 0-${TEST_DOC_LAST}/${TEST_DOC_LEN}"
+_EXPECT . "Content-Length: $TEST_DOC_LEN"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/ranges_test02.htt b/fluent-bit/lib/monkey/qa/ranges_test02.htt
new file mode 100644
index 00000000..bdad83f9
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/ranges_test02.htt
@@ -0,0 +1,37 @@
+###############################################################################
+# DESCRIPTION
+# Test partial content request. Range type: -1 (last byte)
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# February 02 2010
+#
+# COMMENTS
+# RFC 2616 Section 14.35
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+CLIENT
+_CALL INIT
+_CALL TESTDOC_GETSIZE
+
+# Last offset = document_length - 1
+_OP $TEST_DOC_LEN SUB 1 TEST_DOC_LAST
+
+_REQ $HOST $PORT
+__GET /$TEST_DOC $HTTPVER
+__Host: $HOST
+__Range: bytes=-1
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 206 Partial Content"
+_EXPECT . "Date:"
+_EXPECT . "Content-Range: bytes ${TEST_DOC_LAST}-${TEST_DOC_LAST}/${TEST_DOC_LEN}"
+_EXPECT . "Content-Length: 1"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/ranges_test03.htt b/fluent-bit/lib/monkey/qa/ranges_test03.htt
new file mode 100644
index 00000000..6cbfeee3
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/ranges_test03.htt
@@ -0,0 +1,45 @@
+###############################################################################
+# DESCRIPTION
+# Test partial content request. Range type: x-y (between offsets x and y inc.)
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# February 02 2010
+#
+# COMMENTS
+# RFC 2616 Section 14.35
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+# Start offset
+SET OFF_START=100
+
+# End offset
+SET OFF_END=200
+
+CLIENT
+_CALL INIT
+_CALL TESTDOC_GETSIZE
+
+_REQ $HOST $PORT
+__GET /$TEST_DOC $HTTPVER
+__Host: $HOST
+__Range: bytes=${OFF_START}-${OFF_END}
+__Connection: close
+__
+
+# Content length = end_offset - start_offset + 1
+_OP $OFF_END SUB $OFF_START CLEN
+_OP $CLEN ADD 1 CLEN
+
+_EXPECT . "HTTP/1.1 206 Partial Content"
+_EXPECT . "Date:"
+_EXPECT . "Content-Range: bytes ${OFF_START}-${OFF_END}/${TEST_DOC_LEN}"
+_EXPECT . "Content-Length: $CLEN"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/ranges_test04.htt b/fluent-bit/lib/monkey/qa/ranges_test04.htt
new file mode 100644
index 00000000..8bb26d07
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/ranges_test04.htt
@@ -0,0 +1,45 @@
+###############################################################################
+# DESCRIPTION
+# Test partial content request. Range type is equal to the file size.
+# We expect this test to fail from server side as the file size is an
+# invalid offset, ranges starts from byte zero.
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# Jun 19 2013
+#
+# COMMENTS
+# RFC 2616 Section 10.4.17
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+# Start offset
+SET OFF_START=79718
+
+# End offset
+SET OFF_END=79718
+
+CLIENT
+_CALL INIT
+_CALL TESTDOC_GETSIZE
+
+_REQ $HOST $PORT
+__GET /img/mk_logo.png $HTTPVER
+__Host: $HOST
+__Range: bytes=${OFF_START}-${OFF_END}
+__Connection: close
+__
+
+# Content length = end_offset - start_offset + 1
+_OP $OFF_END SUB $OFF_START CLEN
+_OP $CLEN ADD 1 CLEN
+
+_EXPECT . "416 Requested Range Not Satisfiable"
+_EXPECT . "Date:"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/ranges_test05.htt b/fluent-bit/lib/monkey/qa/ranges_test05.htt
new file mode 100644
index 00000000..0e2ab1d8
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/ranges_test05.htt
@@ -0,0 +1,46 @@
+###############################################################################
+# DESCRIPTION
+# This test request one specific byte using the ranges HTTP feature,
+# the target file is imgs/monkey_logo.png, the byte number 3 contains
+# a value of 0x47 which is the letter 'G'.
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# Jun 19 2013
+#
+# COMMENTS
+# RFC 2616 Section 10.4.17
+###############################################################################
+
+
+INCLUDE __CONFIG
+INCLUDE __MACROS
+
+# Start offset
+SET OFF_START=3
+
+# End offset
+SET OFF_END=3
+
+CLIENT
+_CALL INIT
+_CALL TESTDOC_GETSIZE
+
+_REQ $HOST $PORT
+__GET /img/mk_logo.png $HTTPVER
+__Host: $HOST
+__Range: bytes=${OFF_START}-${OFF_END}
+__Connection: close
+__
+
+# Content length = end_offset - start_offset + 1
+_OP $OFF_END SUB $OFF_START CLEN
+_OP $CLEN ADD 1 CLEN
+
+_EXPECT . "HTTP/1.1 206 Partial Content"
+_EXPECT . "Date:"
+_EXPECT . "G"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/run_tests.sh b/fluent-bit/lib/monkey/qa/run_tests.sh
new file mode 100755
index 00000000..4c0b9fa7
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/run_tests.sh
@@ -0,0 +1,119 @@
+
+#!/bin/sh
+TEST_FILES=`ls *.htt`
+TOTAL_TESTS=`echo $TEST_FILES | wc -w`
+
+# Server parameters file
+CONFIG_FILE='__CONFIG'
+
+LOGFILE='errors.log'
+
+# Clear log file
+:>$LOGFILE
+
+# Should we stop at the first error? (yes | no)
+STOP_AT_ERRORS=no
+
+# httest error code for 'Connection refused'
+CONN_REFUSED=111
+
+# Enable colors in output :) (yes | no)
+WITH_COLOR=yes
+
+# httest command
+HTTEST_CMD='httest'
+
+NTEST=1
+TESTS_FAILED=0
+TESTS_OK=0
+TESTS_AVOIDED=0
+CHECKLOGS=0
+
+if [ "$1" = "-l" ]; then
+ CHECKLOGS=1
+ TOTAL_TESTS=`expr $TOTAL_TESTS \* 2`
+fi
+
+for test_file in $TEST_FILES; do
+# echo -ne "[TEST $NTEST/$TOTAL_TESTS]\t""case: $test_file\t\t"
+ printf "[%3d/%d] %-32s " $NTEST $TOTAL_TESTS "$test_file"
+
+ OUTPUT=`$HTTEST_CMD "$test_file" 2>&1`
+ ERRCODE=$?
+
+ case $ERRCODE in
+ 0)
+ TESTS_OK=$((TESTS_OK+1))
+ [ $WITH_COLOR = yes ] && echo -n ""
+ echo -n "=> [OK]"
+ [ $WITH_COLOR = yes ] && echo -n ""
+ ;;
+
+ $CONN_REFUSED)
+ echo
+ echo "Connection refused... (Is monkey running?)" >&2
+ exit $CONN_REFUSED
+ ;;
+
+ *)
+ TESTS_FAILED=$((TESTS_FAILED+1))
+ [ $WITH_COLOR = yes ] && echo -n ""
+ echo -n "=> [FAILED]"
+ [ $WITH_COLOR = yes ] && echo -n ""
+
+ perl -e 'print "-" x 78, "\n"' >>"$LOGFILE"
+ echo "$OUTPUT" >>"$LOGFILE"
+ perl -e 'print "-" x 78, "\n"' >>"$LOGFILE"
+
+ [ $STOP_AT_ERRORS = yes ] && exit 1
+ esac
+
+ # Check for logfiles rules
+ NTEST=$((NTEST+1))
+
+ if [ $CHECKLOGS = 0 ]; then
+ echo
+ continue
+ fi
+
+ echo
+ test_file=`echo $test_file | sed 's/\.htt/\.log/g'`
+ printf "[%3d/%d] %-32s " $NTEST $TOTAL_TESTS "$test_file"
+
+ if [ ! -e "log_rules/$test_file" ]; then
+ ERRCODE=2
+ else
+ # We need to sleep for a while as Monkey needs to flush
+ # the logs, that happens every 3 seconds
+ sleep 2
+ CHECKLOG=`./checklog -l log_rules/$test_file`
+ ERRCODE=$?
+ fi
+
+ case $ERRCODE in
+ 0)
+ [ $WITH_COLOR = yes ] && echo -n ""
+ echo "=> [OK]"
+ [ $WITH_COLOR = yes ] && echo -n ""
+ TESTS_OK=$((TESTS_OK+1))
+ ;;
+ 1)
+ [ $WITH_COLOR = yes ] && echo -n ""
+ echo "=> [FAILED]"
+ echo $CHECKLOG
+ [ $WITH_COLOR = yes ] && echo -n ""
+ TESTS_FAILED=$((TESTS_FAILED+1))
+ [ $STOP_AT_ERRORS = yes ] && exit 1
+ ;;
+
+ 2) [ $WITH_COLOR = yes ] && echo -n ""
+ echo "=> [NO RULES]"
+ [ $WITH_COLOR = yes ] && echo -n ""
+ TESTS_AVOIDED=$((TESTS_AVOIDED+1))
+ ;;
+ esac
+
+ NTEST=$((NTEST+1))
+done
+
+echo -e "\n$TESTS_OK test(s) succeeded, $TESTS_FAILED test(s) failed, $TESTS_AVOIDED test(s) avoided."
diff --git a/fluent-bit/lib/monkey/qa/simple.htt b/fluent-bit/lib/monkey/qa/simple.htt
new file mode 100644
index 00000000..a1538db1
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/simple.htt
@@ -0,0 +1,26 @@
+################################################################################
+# DESCRIPTION
+# The most basic request: GET /
+#
+# AUTHOR
+# Carlos Ghan <charlie.brown.uy@gmail.com>
+#
+# DATE
+# June 29 2009
+#
+# COMMENTS
+# This test shouldn't fail ;)
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET / $HTTPVER
+__Host: $HOST
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 200 OK"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/uri_01.htt b/fluent-bit/lib/monkey/qa/uri_01.htt
new file mode 100644
index 00000000..a7c66f51
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/uri_01.htt
@@ -0,0 +1,26 @@
+################################################################################
+# DESCRIPTION
+# Exercise error 400
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# June 23 2010
+#
+# COMMENTS
+# Sending a bad request. The URI should contains a / at the beginning
+# This Bug was reported by Rodrigo Escobar <ipax@dclabs.com.br>
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA HTTP/1.0
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 400 Bad Request"
+_WAIT
+END
diff --git a/fluent-bit/lib/monkey/qa/uri_02.htt b/fluent-bit/lib/monkey/qa/uri_02.htt
new file mode 100644
index 00000000..3ab16568
--- /dev/null
+++ b/fluent-bit/lib/monkey/qa/uri_02.htt
@@ -0,0 +1,27 @@
+################################################################################
+# DESCRIPTION
+# Exercise error 400
+#
+# AUTHOR
+# Eduardo Silva <edsiper@gmail.com>
+#
+# DATE
+# June 23 2010
+#
+# COMMENTS
+# Sending a bad request. This request contain double \\ and miss the protocol
+# field.
+# This Bug was reported by Rodrigo Escobar <ipax@dclabs.com.br>
+################################################################################
+
+
+INCLUDE __CONFIG
+
+CLIENT
+_REQ $HOST $PORT
+__GET /\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+__Connection: close
+__
+_EXPECT . "HTTP/1.1 400 Bad Request"
+_WAIT
+END