Kutluhan Aktar
Published © CC BY

Irrigation Level Assessment by Thermal Imaging w/ TensorFlow

Collect irrigation level data by thermal imaging, build and train a neural network model, and run the model directly on Wio Terminal.

ExpertFull instructions provided5 hours3,405

Things used in this project

Hardware components

Wio Terminal
Seeed Studio Wio Terminal
×1
Seeed Studio Grove - Thermal Imaging Camera - MLX90641
×1
Seeed Studio Grove - Universal 4 Pin Cable
×1
Creality CR-6 SE 3D Printer
×1
Raspberry Pi 3 Model B+
Raspberry Pi 3 Model B+
Raspberry Pi 3B+ or 4
×1
Raspberry Pi 4 Model B
Raspberry Pi 4 Model B
Raspberry Pi 3B+ or 4
×1

Software apps and online services

Arduino IDE
Arduino IDE
TensorFlow
TensorFlow
Thonny
Fusion 360
Autodesk Fusion 360
Ultimaker Cura
Visual Studio 2017
Microsoft Visual Studio 2017

Hand tools and fabrication machines

Hot glue gun (generic)
Hot glue gun (generic)

Story

Read more

Custom parts and enclosures

irrigation detection case v1.stl

irrigation detection case tree bases v1.stl

irrigation_level_data_logger.zip

Schematics

Schematic-1

Schematic-2

Code

main.py

Python
# Irrigation Level Assessment by Thermal Imaging w/ TensorFlow
#
# Windows, Linux, or Ubuntu
#
# By Kutluhan Aktar
#
# Collect irrigation level data by thermal imaging, build and train a neural network model, and run the model directly on Wio Terminal.
#
#
# For more information:
# https://www.theamplituhedron.com/projects/Irrigation_Level_Assessment_by_Thermal_Imaging_w_TensorFlow/

import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from test_data import test_inputs, test_labels
from tflite_to_c_array import hex_to_c_array

# Create a class to build a neural network model after combining, visualizing, and scaling (normalizing) the thermal imaging data collected for each irrigation level. 
class Irrigation_Level:
    def __init__(self, data_files):
        self.scale_val = 22
        self.labels = []
        self.data_files = data_files
        self.model_name = "irrigation_model"
    # Combine data from all CSV files to define inputs and scale (normalize) inputs depending on the neural network model.     
    def combine_and_scale_data_to_define_inputs(self):
        # Define the output array.
        output = []
        for file in self.data_files:
            # Define the given CSV file path.
            csv_path = "data\{}.csv".format(file)
            # Read data from the given CSV file.
            with open(csv_path, 'r') as f:
                data = np.genfromtxt(f, dtype=float, delimiter=',')
                # Append the recently collated data to the output array.
                output.append(data)
            f.close()
        # Combine all data from each irrigation level (class) to create the inputs array.
        self.inputs = np.concatenate([output[i] for i in range(len(output))])     
        # Scale the inputs array.
        self.inputs = self.inputs / self.scale_val
    # Assign labels for each thermal imaging array (input) according to the given irrigation level.
    def define_and_assign_labels(self):
        _class = 0
        for file in self.data_files:
            # Define the irrigation classes:
            if (file == "dry"):
                _class = 0
            elif (file == "moderate"):
                _class = 1
            elif (file == "sufficient"):
                _class = 2
            elif (file == "excessive"):
                _class = 3
            # Define the given CSV file path.
            csv_path = "data\{}.csv".format(file)
            # Read data from the given CSV file.
            with open(csv_path, 'r') as f:
                data = np.genfromtxt(f, dtype=float, delimiter=',')
                # Assign labels for each input in the given irrigation level (CSV file).
                for i in range(len(data)):
                    self.labels.append(_class)
            f.close()
        self.labels = np.asarray(self.labels)
    # Split inputs and labels into training and test sets.
    def split_data(self):
        # (training)
        self.train_inputs = self.inputs
        self.train_labels = self.labels
        # (test)
        self.test_inputs = test_inputs / self.scale_val
        self.test_labels = test_labels
        # Print the total input and label numbers.
        print("\r\nTotal Input: " + str(len(self.train_inputs)) + "\r\nTotal Label: " + str(len(self.train_labels)) + "\r\n")
    # Build and train an artificial neural network (ANN) to make predictions on the irrigation levels (classes) based on thermal imaging. 
    def build_and_train_model(self):
        # Build the neural network:
        self.model = keras.Sequential([
            keras.Input(shape=(192,)),
            keras.layers.Dense(128, activation='relu'),
            keras.layers.Dense(4, activation='softmax')
        ])
        # Compile:
        self.model.compile(optimizer='adam', loss="sparse_categorical_crossentropy", metrics=['accuracy'])
        # Train:
        self.model.fit(self.train_inputs, self.train_labels, epochs=20)
        # Test the accuracy:
        print("\n\nModel Evaluation:")
        test_loss, test_acc = self.model.evaluate(self.test_inputs, self.test_labels) 
        print("Evaluated Accuracy: ", test_acc)
    # Save the model for further usage:
    def save_model(self):
        self.model.save("model/{}.h5".format(self.model_name))        
    # Convert the TensorFlow Keras H5 model (.h5) to a TensorFlow Lite model (.tflite).
    def convert_TF_model(self, path):
        #model = tf.keras.models.load_model(path + ".h5")
        converter = tf.lite.TFLiteConverter.from_keras_model(self.model)
        #converter.optimizations = [tf.lite.Optimize.DEFAULT]
        #converter.target_spec.supported_types = [tf.float16]
        tflite_model = converter.convert()
        # Save the TensorFlow Lite model.
        with open(path + '.tflite', 'wb') as f:
            f.write(tflite_model)
        print("\r\nTensorFlow Keras H5 model converted to a TensorFlow Lite model!\r\n")
        # Convert the recently created TensorFlow Lite model to hex bytes (C array) to generate a .h file string.
        with open("model/{}.h".format(self.model_name), 'w') as file:
            file.write(hex_to_c_array(tflite_model, self.model_name))
        print("\r\nTensorFlow Lite model converted to a C header (.h) file!\r\n")
    # Run Artificial Neural Network (ANN):
    def Neural_Network(self, save):
        self.combine_and_scale_data_to_define_inputs()
        self.define_and_assign_labels()
        self.split_data()
        self.build_and_train_model()
        if save:
            self.save_model()

# Define a new class object named 'irrigation_rate':
irrigation_rate = Irrigation_Level(["dry", "moderate", "sufficient", "excessive"])

# Artificial Neural Network (ANN):
irrigation_rate.Neural_Network(True)

# Convert the TensorFlow Keras H5 model to a TensorFlow Lite model:
irrigation_rate.convert_TF_model("model/{}".format(irrigation_rate.model_name))
            

test_data.py

Python
import numpy as np

test_inputs = np.array([
    [22.47,22.09,22.07,22.30,22.65,25.34,29.49,30.15,29.73,29.68,29.82,29.28,28.76,27.96,28.58,27.58,21.47,21.24,21.14,21.36,21.72,23.88,28.88,29.44,29.85,31.00,31.36,30.40,30.20,29.92,29.92,29.80,21.56,21.24,21.40,21.18,21.67,21.94,26.02,28.97,28.68,31.31,31.86,31.47,30.73,30.14,30.57,30.47,21.27,21.64,21.02,21.33,21.52,21.22,22.78,27.26,28.72,29.86,31.29,31.26,30.95,29.20,28.24,28.95,22.15,21.46,21.58,21.67,21.52,21.70,21.64,21.93,23.08,26.67,28.75,27.80,24.84,23.08,22.96,23.41,22.32,21.76,21.82,21.40,21.83,21.62,21.75,21.55,21.78,21.89,22.45,22.35,22.13,22.11,22.45,22.24,21.69,21.65,21.82,21.42,21.86,21.80,21.56,21.59,21.61,21.69,21.89,21.93,22.07,21.81,22.29,22.11,21.76,21.64,21.86,21.96,21.72,21.58,21.92,21.76,21.81,21.62,21.83,21.95,22.15,21.89,21.87,21.80,21.38,21.88,22.10,22.15,21.81,21.71,21.80,21.66,21.90,21.85,21.90,21.69,21.97,21.69,21.99,22.31,21.69,21.68,21.70,22.00,21.87,21.82,21.90,21.84,21.97,21.72,21.94,21.74,21.51,22.16,22.14,22.37,21.60,21.58,21.80,21.66,22.38,21.77,22.15,21.84,21.85,21.64,21.97,22.01,22.12,21.96,22.30,22.47,22.51,21.88,22.15,22.10,21.85,21.64,21.62,21.90,21.85,21.70,21.82,21.41,21.59,22.22,22.20,23.67],
    [22.47,22.50,22.61,22.54,22.87,25.55,29.42,29.62,30.39,30.09,30.50,30.44,29.69,29.08,29.08,29.05,22.16,21.73,21.93,21.88,22.42,24.29,29.10,29.46,30.73,31.53,31.25,31.18,30.70,30.63,30.55,30.44,21.95,21.70,21.67,21.79,22.07,22.04,27.15,29.50,29.41,31.30,32.30,32.31,31.05,31.10,31.09,31.20,22.07,22.24,22.24,21.78,21.94,21.56,24.27,28.66,29.22,29.98,31.24,31.16,30.55,29.21,28.58,28.83,22.16,22.03,21.96,21.86,21.62,21.94,22.19,23.00,23.68,27.03,29.47,28.50,25.11,23.28,22.86,23.23,22.50,22.13,22.06,21.71,22.07,21.90,22.05,21.98,22.11,22.13,23.10,22.68,22.58,22.83,22.57,22.43,22.22,22.26,22.02,22.12,21.92,22.00,22.16,21.98,21.94,22.23,22.13,22.26,22.63,22.16,22.25,22.57,22.53,22.06,21.97,21.89,22.05,21.68,21.90,21.96,22.04,22.07,22.04,22.32,22.17,22.29,22.61,22.39,22.42,22.47,22.30,22.21,22.10,22.07,22.08,22.10,21.67,22.02,21.92,22.37,22.16,22.05,22.51,22.38,22.27,22.59,22.37,22.25,22.10,22.24,22.18,21.90,22.18,21.98,22.16,22.36,22.05,22.59,22.15,22.74,22.16,22.00,22.15,22.36,21.94,22.17,22.50,22.23,21.99,22.29,22.34,22.46,21.98,22.42,22.30,23.73,22.88,22.14,22.57,22.06,21.91,22.08,21.96,22.31,22.09,21.80,22.57,22.57,22.22,22.73,22.35,25.33],
    [22.58,22.87,22.66,22.69,22.97,25.60,29.51,29.58,29.80,30.31,29.93,29.84,29.57,28.99,28.60,29.93,22.13,21.71,21.92,21.99,22.11,23.61,29.31,29.55,30.59,31.50,31.30,31.09,30.65,30.73,30.14,29.89,22.25,21.92,22.12,21.67,22.13,21.94,26.47,29.34,28.90,31.03,31.86,32.15,31.19,30.80,30.67,30.93,21.87,22.29,21.77,21.67,21.68,22.08,23.15,27.86,28.57,29.94,31.11,31.02,30.51,28.26,27.85,29.31,21.91,21.78,21.84,22.00,22.14,21.75,21.87,22.30,22.83,25.85,28.65,27.16,23.94,23.15,23.02,23.07,22.03,21.98,22.26,21.73,22.03,22.10,22.12,22.08,22.21,22.09,22.35,22.36,22.30,22.61,22.72,22.92,22.38,22.07,22.08,22.06,21.87,21.96,22.26,22.05,22.24,22.09,22.12,22.37,22.53,22.60,22.03,22.16,22.34,22.07,22.30,22.25,22.07,22.03,22.04,22.03,22.18,21.99,22.07,21.99,22.10,22.15,22.16,22.30,21.86,22.11,21.94,22.36,22.21,21.99,22.22,22.07,22.17,21.98,21.87,22.14,22.00,22.16,22.45,22.62,22.00,21.91,22.33,22.22,22.12,22.31,22.33,22.26,21.90,22.00,22.02,22.16,22.25,22.54,22.62,22.47,22.48,22.71,22.59,22.32,22.14,22.28,22.19,22.25,22.18,22.10,22.35,22.23,22.39,22.47,22.34,23.05,23.15,22.65,22.56,21.96,22.12,22.38,22.07,22.02,22.06,22.28,22.29,22.31,22.33,22.59,23.09,24.67],
    [24.19,24.26,24.44,25.27,27.30,29.12,31.72,30.05,27.90,27.08,26.72,25.32,26.23,27.23,27.83,28.88,23.01,23.04,22.85,23.32,28.91,29.21,30.57,30.76,30.04,30.23,30.00,29.14,29.06,28.32,27.94,29.27,22.66,22.06,22.40,23.24,28.58,29.50,30.50,31.26,31.14,30.37,30.06,29.79,30.55,31.11,30.51,29.57,22.29,22.24,22.15,22.02,23.67,28.36,29.63,30.30,30.51,29.20,27.50,25.65,26.00,27.00,29.42,30.42,22.39,22.16,21.95,22.24,21.86,22.60,23.50,25.01,23.85,22.40,21.98,21.96,22.45,21.99,22.72,25.22,22.22,22.21,22.15,22.25,22.40,22.73,21.98,22.12,21.98,22.02,22.06,22.26,22.10,22.24,22.39,22.77,21.72,22.21,22.51,21.82,22.10,22.09,22.00,22.03,22.02,22.06,21.84,22.11,22.30,21.85,22.46,22.33,22.06,22.55,22.09,21.98,22.18,22.09,21.93,21.85,21.98,21.88,22.03,21.92,22.07,22.01,22.47,22.33,22.23,22.01,22.09,22.20,22.10,21.95,22.05,22.16,21.83,22.13,22.05,21.97,22.39,22.49,22.47,22.30,22.16,22.23,22.10,22.19,22.13,21.99,22.01,21.85,21.93,22.10,21.84,22.17,22.49,22.28,22.61,22.13,22.68,22.36,22.24,22.31,22.12,22.34,22.55,22.00,22.09,22.04,22.03,22.18,21.95,22.50,22.29,23.53,23.55,22.23,22.75,22.17,22.21,21.83,22.09,22.10,22.37,21.98,22.13,22.43,22.64,22.50,22.86,24.21],
    [24.05,24.20,24.62,25.18,26.82,28.64,31.43,30.73,29.47,27.76,27.84,26.21,26.46,27.87,28.34,30.03,23.09,22.99,22.52,23.43,28.71,28.80,29.94,30.61,30.52,30.08,29.67,29.42,29.06,28.65,28.27,29.17,22.36,22.24,22.76,23.16,28.10,28.53,30.30,30.92,30.80,30.52,30.19,29.84,30.34,31.17,30.98,30.54,22.30,22.46,22.36,22.55,23.80,27.74,29.16,30.00,29.95,28.58,26.15,25.04,25.48,27.30,29.54,30.43,22.17,22.23,22.51,22.58,22.93,23.79,23.48,24.68,23.46,22.20,22.33,22.33,22.16,22.20,22.85,26.30,22.52,22.27,22.12,22.39,22.45,22.84,22.06,22.17,22.06,22.10,22.07,22.31,22.19,22.25,22.62,22.97,22.42,22.12,22.39,22.11,22.51,22.07,22.08,22.07,21.86,21.89,22.36,22.47,22.22,21.95,22.42,23.10,21.96,22.15,22.33,21.99,21.96,22.20,22.26,22.14,22.02,22.27,22.19,22.13,22.04,22.41,22.15,22.72,22.24,22.13,22.43,22.38,21.87,22.18,22.32,22.28,22.17,22.04,22.06,22.35,22.27,22.25,22.60,22.64,21.92,22.63,22.47,22.57,22.10,22.20,22.21,22.09,22.17,21.92,22.10,22.35,22.32,22.82,22.80,22.89,22.56,21.96,22.31,22.72,22.18,22.18,22.14,22.34,22.06,22.26,22.36,22.44,21.75,22.62,22.37,24.03,23.06,22.05,22.29,22.08,22.12,22.08,22.15,22.12,22.29,22.09,22.14,22.13,22.31,22.58,23.34,26.24],
    [23.82,24.28,24.35,25.42,27.25,29.22,29.45,25.61,24.65,24.32,24.51,24.37,25.59,27.01,26.82,27.75,23.24,23.07,22.50,23.66,28.96,28.68,29.99,29.95,29.31,29.44,27.97,27.27,26.95,26.30,27.44,29.33,21.99,22.33,22.00,23.25,29.12,29.15,29.96,30.58,30.39,30.21,30.51,30.52,31.26,30.91,29.85,29.87,21.83,22.12,22.01,22.64,25.57,28.60,29.63,30.09,30.78,30.33,29.38,27.42,27.46,28.49,29.78,30.25,22.01,22.06,21.87,22.42,22.99,26.10,28.19,29.10,27.82,24.17,22.20,22.38,22.08,22.00,22.99,26.57,22.03,21.90,21.98,21.99,22.54,22.87,22.43,23.24,22.26,22.19,22.12,22.05,22.46,22.29,22.32,22.41,22.33,22.30,21.59,22.05,21.83,22.16,22.04,21.73,21.99,22.13,22.06,21.90,22.23,22.28,22.45,22.35,22.10,22.08,22.05,22.09,22.24,22.26,22.04,22.06,21.98,22.12,22.03,21.83,21.92,22.16,22.46,22.42,22.26,21.95,22.00,22.00,21.81,22.05,21.91,21.98,21.94,21.91,22.27,22.23,22.18,22.59,22.39,22.39,22.64,21.93,22.05,22.15,22.19,22.09,21.96,21.88,21.89,22.09,21.90,21.97,22.12,22.05,22.58,22.67,22.29,22.28,22.06,22.02,22.09,21.84,21.98,21.90,22.03,21.76,22.00,22.14,22.10,22.31,22.39,22.13,22.17,22.13,22.25,22.16,22.26,21.93,21.91,21.94,22.06,22.27,21.94,21.95,22.11,22.91,22.32,24.57],
    [22.48,22.78,23.41,24.46,24.64,25.84,27.39,28.24,27.82,27.53,27.68,27.43,27.33,28.70,28.35,25.74,22.30,22.89,24.53,25.33,25.29,26.53,24.92,23.01,22.72,22.52,22.76,22.70,22.63,23.24,25.76,25.94,21.87,21.82,22.39,22.74,22.32,22.27,21.85,21.71,21.93,21.90,21.83,22.02,21.95,22.20,21.99,22.83,21.78,21.48,21.96,21.81,21.53,21.73,21.80,21.68,21.60,21.87,21.93,21.93,21.98,22.19,22.10,22.15,21.78,21.75,21.95,21.74,21.80,21.89,21.74,21.86,21.82,21.74,21.85,21.69,22.24,22.23,22.04,22.75,21.51,21.70,21.65,21.90,22.00,22.00,21.68,21.74,21.76,21.86,21.73,21.96,22.19,21.91,22.05,22.42,21.76,21.81,22.11,21.83,21.92,22.07,21.85,21.81,21.53,21.73,21.93,22.00,21.80,22.27,21.96,22.30,22.04,22.02,22.04,22.07,22.15,21.88,21.95,21.87,21.75,22.00,21.72,21.85,21.91,22.01,22.29,22.04,22.93,22.37,22.33,22.07,22.23,22.04,22.07,21.82,21.99,21.82,21.94,22.02,21.81,21.99,22.17,22.27,25.88,23.72,24.64,22.75,22.22,22.00,22.06,22.24,21.83,22.07,22.01,21.91,22.16,22.42,22.09,22.69,26.78,23.65,24.58,23.87,23.61,22.09,21.97,21.80,22.14,21.92,22.13,21.85,22.20,22.14,22.13,22.96,23.80,22.97,22.67,22.75,22.75,22.63,22.09,22.28,22.05,22.12,21.88,22.16,22.51,22.54,23.13,23.73],
    [22.32,22.96,24.10,24.80,25.10,25.33,27.26,29.15,28.26,28.11,28.75,28.76,28.52,29.72,29.26,27.80,22.62,23.47,25.04,25.59,25.43,27.08,26.79,25.65,25.00,24.42,25.75,25.36,24.41,25.88,28.40,27.54,22.23,22.46,23.44,23.97,23.34,23.15,22.88,22.28,22.23,22.20,22.32,22.39,22.24,22.38,22.83,24.07,22.30,22.30,22.06,22.15,21.88,21.99,22.01,21.95,21.98,22.05,22.20,22.23,22.22,22.51,22.42,22.68,22.34,22.07,22.00,21.99,21.98,22.13,21.83,21.95,21.80,22.15,22.13,22.08,22.07,22.10,22.40,22.73,22.24,22.52,22.20,21.97,22.07,22.02,22.01,21.99,21.98,22.01,22.13,22.22,22.27,22.48,22.51,22.40,22.48,21.77,21.94,22.06,22.02,22.09,22.00,22.06,21.85,22.16,21.88,22.19,22.17,22.23,22.41,22.53,22.19,22.30,22.10,22.23,22.03,21.91,22.00,22.16,21.87,21.80,22.07,22.08,22.08,22.50,22.43,22.53,22.24,22.18,22.38,22.42,22.06,21.91,22.23,22.41,22.01,21.88,22.24,22.30,22.17,22.55,22.54,22.58,24.19,22.91,22.71,22.57,22.39,22.11,22.24,22.04,22.27,22.37,22.05,22.13,21.93,22.50,22.68,22.37,26.63,23.91,27.69,24.17,22.99,22.30,22.26,22.37,22.01,22.37,22.35,22.29,22.21,22.68,22.11,23.76,25.81,22.69,23.59,23.84,24.20,22.73,22.23,22.11,22.24,22.08,22.33,21.97,22.37,22.83,23.04,24.89],
    [22.56,22.84,24.10,24.97,25.36,25.90,27.95,28.95,28.39,28.69,28.90,29.12,28.47,29.42,29.52,26.45,23.04,23.89,24.99,25.45,25.66,27.43,26.55,25.54,24.89,24.98,26.59,26.72,25.30,26.23,28.60,27.44,22.37,22.36,22.71,23.07,22.75,22.76,22.66,21.82,22.16,22.17,22.17,22.62,22.25,22.39,22.53,23.84,22.37,22.41,21.88,22.20,21.85,22.27,21.98,21.78,21.77,21.94,22.36,22.32,22.13,22.16,22.31,22.34,22.23,22.08,22.19,22.08,21.80,21.88,21.95,22.10,21.91,21.88,22.10,21.93,22.20,22.20,22.29,22.35,22.07,22.13,22.03,21.61,22.15,21.81,21.99,21.96,21.85,21.88,21.95,22.00,22.15,21.93,22.63,22.53,22.14,22.12,22.04,21.95,21.99,21.96,22.01,21.97,22.06,21.96,21.96,22.35,22.06,22.20,22.58,22.86,22.67,22.36,22.38,22.16,21.88,21.99,21.94,22.21,21.81,21.88,21.89,22.01,22.13,22.07,22.49,22.35,22.37,22.50,22.39,22.47,22.23,22.14,21.88,22.20,22.06,22.22,21.86,21.94,22.22,22.36,22.60,22.39,24.01,22.70,22.82,22.48,22.31,22.08,22.25,22.12,21.91,22.03,22.06,21.92,22.03,22.51,22.63,22.23,26.57,23.98,27.07,23.93,22.90,22.35,22.18,22.17,22.27,22.30,22.27,22.34,22.07,22.46,22.52,22.59,25.17,23.21,23.54,23.69,23.76,22.50,22.33,22.47,22.20,22.55,22.24,22.34,22.55,22.65,23.59,24.90],
    [22.93,22.29,22.59,22.44,23.87,29.05,30.95,29.63,27.69,28.07,28.76,28.68,26.55,25.47,26.95,27.02,22.21,21.46,21.72,22.39,24.19,28.55,30.05,29.97,29.96,29.95,30.05,30.19,29.57,28.47,27.43,28.15,21.96,21.77,22.07,22.75,27.57,27.94,29.38,30.15,31.13,30.83,30.56,30.17,29.90,29.90,30.90,30.19,21.49,21.53,21.69,21.93,22.39,25.88,28.93,29.33,30.26,30.79,30.40,29.95,29.02,28.61,29.57,30.62,21.97,21.73,21.50,21.52,21.89,21.85,22.82,23.79,24.84,25.72,24.69,23.49,22.63,22.44,23.98,25.85,21.81,21.98,21.43,21.80,21.68,21.78,21.85,21.86,22.12,21.92,21.74,22.05,22.05,21.97,22.48,22.13,21.36,21.53,21.72,21.73,21.86,21.86,21.73,21.97,22.06,21.75,21.86,21.94,22.04,21.91,21.95,21.88,22.05,21.54,21.50,21.61,21.86,21.92,21.87,21.86,21.78,21.82,21.91,21.99,21.95,21.93,22.23,22.20,21.62,21.88,21.82,22.03,22.05,21.82,21.67,21.93,21.99,21.82,21.45,21.92,21.99,22.01,22.00,22.04,22.48,21.87,21.98,22.01,21.70,21.94,21.77,21.95,21.88,21.89,22.04,21.82,22.18,22.41,22.36,21.93,22.07,22.35,21.89,21.99,21.91,22.12,21.79,21.83,21.80,21.99,21.68,22.15,22.18,22.14,22.30,23.01,22.10,21.78,21.73,22.04,21.68,21.66,21.82,21.53,21.92,21.85,22.25,22.15,22.12,22.44,22.34,23.61],
    [22.68,23.18,22.37,22.40,22.92,28.00,30.90,29.61,28.93,29.03,29.89,29.93,28.18,27.32,27.94,29.03,22.10,21.36,21.84,21.93,21.72,23.25,27.94,29.36,29.54,30.13,30.08,29.86,29.62,29.78,29.06,28.82,21.73,21.44,21.72,21.69,21.65,21.75,22.11,25.64,29.04,30.55,29.84,29.61,29.40,29.40,30.29,30.96,22.18,22.11,21.92,21.92,21.73,21.52,22.10,22.05,23.19,24.81,24.23,23.72,23.89,24.97,27.43,29.37,22.10,22.03,21.86,22.17,21.82,21.97,21.88,21.93,21.92,22.38,22.20,22.32,22.13,22.34,22.66,23.45,22.28,22.23,21.87,22.06,21.98,22.25,22.02,22.06,22.16,22.17,22.12,21.87,22.17,22.10,22.32,22.85,22.12,22.02,21.79,21.79,21.79,21.97,22.07,22.13,21.86,21.79,22.23,22.03,22.23,22.38,22.39,22.48,22.12,22.32,22.23,22.33,21.91,21.75,22.01,21.86,21.99,22.00,21.91,22.08,22.01,22.36,22.57,22.22,22.54,22.25,22.05,22.14,22.15,22.13,22.29,21.82,21.78,21.98,21.97,22.06,22.02,22.41,22.53,22.80,22.63,22.61,22.07,22.42,22.03,21.92,21.89,22.25,22.12,21.95,22.27,22.11,22.50,22.47,22.81,22.65,22.45,22.72,22.23,21.98,22.12,22.23,22.27,22.14,22.15,21.93,22.12,22.24,22.23,22.32,22.33,23.01,23.83,23.09,22.34,22.37,22.12,22.30,22.18,22.27,22.13,22.12,22.64,21.83,22.35,22.90,22.79,24.92],
    [18.99,17.61,17.74,17.38,17.74,17.68,17.84,17.45,17.51,17.77,17.86,18.25,18.92,19.36,19.30,20.42,18.89,17.94,17.36,17.32,17.42,17.31,17.26,17.71,17.63,17.17,16.60,16.76,17.72,18.39,19.26,20.39,18.62,17.46,17.42,17.09,17.63,17.07,17.43,17.35,17.79,16.67,16.32,16.35,16.50,17.41,17.51,19.38,18.52,17.70,17.08,17.28,17.72,16.74,16.98,17.34,17.89,17.06,16.43,16.53,17.09,17.12,16.95,17.56,17.41,17.35,17.07,17.32,17.89,17.06,16.93,17.23,17.20,17.21,16.83,16.93,17.08,17.18,17.24,17.36,17.93,17.51,17.48,17.04,16.96,16.98,17.02,16.65,16.87,17.09,16.72,16.96,17.31,17.23,16.75,18.25,17.69,17.77,17.46,17.39,17.37,17.51,17.10,16.96,17.17,17.13,17.02,16.92,17.06,17.45,17.11,17.59,18.21,18.03,17.62,17.06,17.77,17.55,17.02,17.02,17.48,17.32,17.13,17.32,17.11,17.21,16.90,17.40,17.74,18.09,17.64,17.17,17.60,17.59,17.24,17.37,17.26,17.17,17.35,17.14,17.22,17.03,16.95,17.17,18.20,18.10,17.63,17.65,17.64,17.23,17.63,17.13,16.90,17.51,17.39,17.27,17.28,17.44,17.52,17.18,17.75,18.17,18.00,17.86,17.65,17.71,17.30,17.25,17.35,16.96,17.60,17.03,17.56,17.09,17.38,17.56,18.52,18.03,17.28,17.66,18.22,17.74,17.16,17.27,17.20,16.82,16.77,16.76,17.84,18.28,17.80,19.97]
])

test_labels = np.array([0,0,0,1,1,1,2,2,2,3,3,3])

tflite_to_c_array.py

Python
# Code from:
# https://www.digikey.com/en/maker/projects/intro-to-tinyml-part-1-training-a-model-for-arduino-in-tensorflow/8f1fc8c0b83d417ab521c48864d2a8ec
# By Shawn Hymel

# Function: Convert some hex value into an array for C programming
def hex_to_c_array(hex_data, var_name):

  c_str = ''

  # Create header guard
  c_str += '#ifndef ' + var_name.upper() + '_H\n'
  c_str += '#define ' + var_name.upper() + '_H\n\n'

  # Add array length at top of file
  c_str += '\nunsigned int ' + var_name + '_len = ' + str(len(hex_data)) + ';\n'

  # Declare C variable
  c_str += 'unsigned char ' + var_name + '[] = {'
  hex_array = []
  for i, val in enumerate(hex_data) :

    # Construct string from hex
    hex_str = format(val, '#04x')

    # Add formatting so each line stays within 80 characters
    if (i + 1) < len(hex_data):
      hex_str += ','
    if (i + 1) % 12 == 0:
      hex_str += '\n '
    hex_array.append(hex_str)

  # Add closing brace
  c_str += '\n ' + format(' '.join(hex_array)) + '\n};\n\n'

  # Close out header guard
  c_str += '#endif //' + var_name.upper() + '_H'

  return c_str

irrigation_level_detection_data_collect.ino

Arduino
         /////////////////////////////////////////////  
        //     Irrigation Level Assessment by      //
       //      Thermal Imaging w/ TensorFlow      //
      //             ---------------             //
     //              (Wio Terminal)             //           
    //             by Kutluhan Aktar           // 
   //                                         //
  /////////////////////////////////////////////

//
// Collect irrigation level data by thermal imaging, build and train a neural network model, and run the model directly on Wio Terminal.
//
// For more information:
// https://www.theamplituhedron.com/projects/Irrigation_Level_Assessment_by_Thermal_Imaging_w_TensorFlow/
//
//
// Connections
// Wio Terminal :  
//                                MLX90641 Thermal Imaging Camera (16x12 w/ 110 FOV)
// Grove Connector  -------------- Grove Connector


// Include the required libraries.
#include <rpcWiFi.h>
#include <TFT_eSPI.h>
#include <Wire.h>
#include "MLX90641_API.h"
#include "MLX9064X_I2C_Driver.h"

// Define the Wi-Fi network settings:
const char* ssid = "<_SSID_>";
const char* password =  "<_PASSWORD_>";

// Define the server settings:
const uint16_t port = 80; // Default port
const char* host = "192.168.1.20";  // Target Server IP Address

// Use the WiFiClient class to create TCP connections:
WiFiClient client;

// Define the TFT screen:
TFT_eSPI tft;

// Define the MLX90641 Thermal Imaging Camera settings:
const byte MLX90641_address = 0x33; // Default 7-bit unshifted address of the MLX90641.
#define TA_SHIFT 12 // Default shift value for MLX90641 in the open air.
uint16_t eeMLX90641[832];
float MLX90641To[192];
uint16_t MLX90641Frame[242];
paramsMLX90641 MLX90641;
int errorno = 0;

// Define the maximum and minimum temperature values:
uint16_t MinTemp = 21;
uint16_t MaxTemp = 45;

// Define the data holders:
String MLX90641_data = "";
byte red, green, blue;
float a, b, c, d;

void setup(){  
  // Initialize the I2C clock for the MLX90641 Thermal Imaging Camera.
  Wire.begin();
  Wire.setClock(2000000); // Increase the I2C clock speed to 2M.  

  // Initiate the TFT screen:
  tft.begin();
  tft.setRotation(3);
  tft.fillScreen(TFT_BLACK);
  tft.setTextColor(TFT_BLACK);
  tft.setTextSize(1);
  
  // Check the connection status between the MLX90641 Thermal Imaging Camera and Wio Terminal.
  if(isConnected() == false){
    tft.fillScreen(TFT_RED);
    tft.drawString("MLX90641 not detected at default I2C address!", 5, 10);
    tft.drawString("Please check wiring. Freezing.", 5, 25);
    while (1);
  }
  // Get the MLX90641 Thermal Imaging Camera parameters:
  int status;
  status = MLX90641_DumpEE(MLX90641_address, eeMLX90641);
  errorno = status;//MLX90641_CheckEEPROMValid(eeMLX90641);//eeMLX90641[10] & 0x0040;//
 
  if(status != 0){
    tft.fillScreen(TFT_RED);
    tft.drawString("Failed to load system parameters!", 5, 10);
    while(1);
  }
 
  status = MLX90641_ExtractParameters(eeMLX90641, &MLX90641);
  //errorno = status;
  if(status != 0){
    tft.fillScreen(TFT_RED);
    tft.drawString("Parameter extraction failed!", 5, 10);
    while(1);
  }

  // Once params are extracted, release eeMLX90641 array:
  MLX90641_SetRefreshRate(MLX90641_address, 0x05); // Set rate to 16Hz.

  // Get the cutoff points:
  Getabcd();
  
  // 5-Way Switch
  pinMode(WIO_5S_UP, INPUT_PULLUP);
  pinMode(WIO_5S_DOWN, INPUT_PULLUP);
  pinMode(WIO_5S_LEFT, INPUT_PULLUP);
  pinMode(WIO_5S_RIGHT, INPUT_PULLUP);
  pinMode(WIO_5S_PRESS, INPUT_PULLUP);

  // Set Wi-Fi to station mode and disconnect from an AP if it was previously connected:
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(2000);
 
  WiFi.begin(ssid, password);

  // Attempt to connect to the given Wi-Fi network:
  while(WiFi.status() != WL_CONNECTED){
    delay(500);
    tft.fillScreen(TFT_RED);
    tft.drawString("Connecting to Wi-Fi...", 5, 10);
  }
  tft.setTextSize(2);
  tft.fillScreen(TFT_GREENYELLOW);
  tft.drawString("Connected to", 5, 10);
  tft.drawString("the Wi-Fi network!", 5, 40);
  delay(3000);
  tft.fillScreen(TFT_BLUE);

}
 
void loop(){  
  get_and_display_data_from_MLX90641(64, 20, 12, 12);
  
  // Define the data (CSV) files:
  if(digitalRead(WIO_5S_UP) == LOW) make_a_get_request("excessive");
  if(digitalRead(WIO_5S_LEFT) == LOW) make_a_get_request("sufficient");
  if(digitalRead(WIO_5S_RIGHT) == LOW) make_a_get_request("moderate");
  if(digitalRead(WIO_5S_DOWN) == LOW) make_a_get_request("dry");

}

void draw_menu(int start_x, int start_y, int w, int h){
  // Draw the border:
  int offset = 10;
  tft.drawRoundRect(start_x-offset, start_y-offset, (2*offset)+(w*16), (2*offset)+(h*12), 10, TFT_WHITE);
  // Draw options:
  int x_c = 52; int x_s = x_c - 7; int y_c = 210; int y_s = y_c - 11; int sp = 72;
  tft.setTextSize(1);
  /////////////////////////////////////
  tft.fillCircle(x_c, y_c, 20, TFT_WHITE);
  tft.drawChar(x_s, y_s, 'U', TFT_BLACK, TFT_WHITE, 3);
  tft.drawString("Excessive", x_c - 25, y_c - 33);
  /////////////////////////////////////
  tft.fillCircle(x_c + sp, y_c, 20, TFT_WHITE);
  tft.drawChar(x_s + sp, y_s, 'L', TFT_BLACK, TFT_WHITE, 3);
  tft.drawString("Sufficient", x_c + sp - 28, y_c - 33);
  /////////////////////////////////////
  tft.fillCircle(x_c + (2*sp), y_c, 20, TFT_WHITE);
  tft.drawChar(x_s + (2*sp), y_s, 'R', TFT_BLACK, TFT_WHITE, 3);
  tft.drawString("Moderate", x_s + (2*sp) - 16, y_c - 33);
  /////////////////////////////////////
  tft.fillCircle(x_c + (3*sp), y_c, 20, TFT_WHITE);
  tft.drawChar(x_s + (3*sp), y_s, 'D', TFT_BLACK, TFT_WHITE, 3);
  tft.drawString("Dry", x_c + (3*sp) - 8, y_c - 33);
}

void get_and_display_data_from_MLX90641(int start_x, int start_y, int w, int h){
  // Draw the options menu:
  draw_menu(start_x, start_y, w, h);
  // Elicit the 16x12 pixel IR thermal imaging array generated by the MLX90641 Thermal Imaging Camera:
  for(byte x = 0 ; x < 2 ; x++){
    int status = MLX90641_GetFrameData(MLX90641_address, MLX90641Frame);
    // Obtain the required variables to calculate the thermal imaging array:
    float vdd = MLX90641_GetVdd(MLX90641Frame, &MLX90641);
    float Ta = MLX90641_GetTa(MLX90641Frame, &MLX90641);
    // Define the reflected temperature based on the sensor's ambient temperature:
    float tr = Ta - TA_SHIFT; 
    float emissivity = 0.95;
    // Create the thermal imaging array:
    MLX90641_CalculateTo(MLX90641Frame, &MLX90641, emissivity, tr, MLX90641To);
  }
  // Define parameters: 
  MLX90641_data = "";
  int x = start_x;
  int y = start_y + (h*11);
  uint32_t c = TFT_BLUE; 
  for(int i = 0 ; i < 192 ; i++){
    // Convert the 16x12 pixel IR thermal imaging array to string (MLX90641_data) so as to transfer it to the web application:
    MLX90641_data += String(MLX90641To[i]);
    if(i != 191) MLX90641_data += ",";
    // Display a simple image version of the collected data (array) on the screen:
    // Define the color palette:
    c = GetColor(MLX90641To[i]);
    // Draw image pixels (rectangles):
    tft.fillRect(x, y, w, h, c);
    x = x + w;
    // Start a new row:
    int l = i + 1;
    if (l%16 == 0) { x = start_x; y = y - h; }
  }
}

void make_a_get_request(String level){
  if(!client.connect(host, port)){
    tft.fillScreen(TFT_RED);
    tft.setTextSize(1);  
    tft.drawString("Connection failed!", 5, 10);
    tft.drawString("Waiting 5 seconds before retrying...", 5, 25);
    delay(5000);
    return;
  }
  // Make a Get request to the given server to send the recently generated IR thermal imaging array.
  String application = "/irrigation_level_data_logger/"; // Define the application name.
  String query = application + "?thermal_img=" + MLX90641_data + "&level=" + level;
  client.println("GET " + query + " HTTP/1.1");
  client.println("Host: 192.168.1.20");
  client.println("Connection: close");
  client.println();
  // Wait until the client is available.
  int maxloops = 0;
  while (!client.available() && maxloops < 2000) {
    maxloops++;
    delay(1);
  }
  // Fetch the response from the given application.
  if(client.available() > 0){
    String response = client.readString();
    if(response != "" && response.indexOf("The given line is added to the") > 0){
      tft.fillScreen(TFT_GREEN);
      tft.setTextSize(2);  
      tft.drawString("Data transferred", 5, 10);
      tft.drawString("successfully", 5, 40);
      tft.drawString("to the web application! ", 5, 70);
      tft.setTextSize(3); 
      tft.drawString(level + ".csv", 5, 130);
      
    }
  }else{    
    tft.fillScreen(TFT_RED);
    tft.setTextSize(2);  
    tft.drawString("Client Timeout!", 5, 10);
  }
  // Stop the client:
  client.stop();
  delay(3000);
  tft.fillScreen(TFT_BLUE);
}

boolean isConnected(){
  // Return true if the MLX90641 Thermal Imaging Camera is detected on the I2C bus:
  Wire.beginTransmission((uint8_t)MLX90641_address);
  if(Wire.endTransmission() != 0){
    return (false);
  }
  return (true);
}

uint16_t GetColor(float val){
  /*
 
    equations based on
    http://web-tech.ga-usa.com/2012/05/creating-a-custom-hot-to-cold-temperature-color-gradient-for-use-with-rrdtool/index.html
 
  */

  // Assign colors to the given temperature readings:
  // R:
  red = constrain(255.0 / (c - b) * val - ((b * 255.0) / (c - b)), 0, 255);
  // G:
  if((val > MinTemp) & (val < a)){
    green = constrain(255.0 / (a - MinTemp) * val - (255.0 * MinTemp) / (a - MinTemp), 0, 255);
  }else if((val >= a) & (val <= c)){
    green = 255;
  }else if(val > c){
    green = constrain(255.0 / (c - d) * val - (d * 255.0) / (c - d), 0, 255);
  }else if((val > d) | (val < a)){
    green = 0;
  }
  // B:
  if(val <= b){
    blue = constrain(255.0 / (a - b) * val - (255.0 * b) / (a - b), 0, 255);
  }else if((val > b) & (val <= d)){
    blue = 0;
  }else if (val > d){
    blue = constrain(240.0 / (MaxTemp - d) * val - (d * 240.0) / (MaxTemp - d), 0, 240);
  }
 
  // Utilize the built-in color mapping function to get a 5-6-5 color palette (R=5 bits, G=6 bits, B-5 bits):
  return tft.color565(red, green, blue);
}

void Getabcd() {
  // Get the cutoff points based on the given maximum and minimum temperature values.
  a = MinTemp + (MaxTemp - MinTemp) * 0.2121;
  b = MinTemp + (MaxTemp - MinTemp) * 0.3182;
  c = MinTemp + (MaxTemp - MinTemp) * 0.4242;
  d = MinTemp + (MaxTemp - MinTemp) * 0.8182;
}

irrigation_level_detection_run_model.ino

Arduino
         /////////////////////////////////////////////  
        //     Irrigation Level Assessment by      //
       //      Thermal Imaging w/ TensorFlow      //
      //             ---------------             //
     //              (Wio Terminal)             //           
    //             by Kutluhan Aktar           // 
   //                                         //
  /////////////////////////////////////////////

//
// Collect irrigation level data by thermal imaging, build and train a neural network model, and run the model directly on Wio Terminal.
//
// For more information:
// https://www.theamplituhedron.com/projects/Irrigation_Level_Assessment_by_Thermal_Imaging_w_TensorFlow/
//
//
// Connections
// Wio Terminal :  
//                                MLX90641 Thermal Imaging Camera (16x12 w/ 110 FOV)
// Grove Connector  -------------- Grove Connector


// Include the required libraries.
#include <TFT_eSPI.h>
//////////////////////////////
// Add to avoid system errors.
#undef max 
#undef min
//////////////////////////////
#include <Wire.h>
#include "MLX90641_API.h"
#include "MLX9064X_I2C_Driver.h"

// Import the required TensorFlow modules.
#include "TensorFlowLite.h"
#include "tensorflow/lite/micro/kernels/micro_ops.h"
#include "tensorflow/lite/micro/micro_error_reporter.h"
#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/micro/all_ops_resolver.h"
#include "tensorflow/lite/version.h"

// Import the converted TensorFlow Lite model.
#include "irrigation_model.h"

// TFLite globals, used for compatibility with Arduino-style sketches:
namespace {
  tflite::ErrorReporter* error_reporter = nullptr;
  const tflite::Model* model = nullptr;
  tflite::MicroInterpreter* interpreter = nullptr;
  TfLiteTensor* model_input = nullptr;
  TfLiteTensor* model_output = nullptr;

  // Create an area of memory to use for input, output, and other TensorFlow arrays.
  constexpr int kTensorArenaSize = 15 * 1024;
  uint8_t tensor_arena[kTensorArenaSize];
} // namespace

// Define the threshold value for the model outputs (results).
float threshold = 0.75;

// Define the irrigation level (class) names and color codes: 
String classes[] = {"Dry", "Moderate", "Sufficient", "Excessive"};
uint32_t class_color_codes[] = {TFT_GREEN, TFT_GREENYELLOW, TFT_ORANGE, TFT_RED};

// Define the TFT screen:
TFT_eSPI tft;

// Define the MLX90641 Thermal Imaging Camera settings:
const byte MLX90641_address = 0x33; // Default 7-bit unshifted address of the MLX90641.
#define TA_SHIFT 12 // Default shift value for MLX90641 in the open air.
uint16_t eeMLX90641[832];
float MLX90641To[192];
uint16_t MLX90641Frame[242];
paramsMLX90641 MLX90641;
int errorno = 0;

// Define the maximum and minimum temperature values:
uint16_t MinTemp = 21;
uint16_t MaxTemp = 45;

// Define the data holders:
byte red, green, blue;
float a, b, c, d;

void setup() {
  Serial.begin(115200);

  // Initialize the I2C clock for the MLX90641 Thermal Imaging Camera.
  Wire.begin();
  Wire.setClock(2000000); // Increase the I2C clock speed to 2M.  

  // Initiate the TFT screen:
  tft.begin();
  tft.setRotation(3);
  tft.fillScreen(TFT_BLACK);
  tft.setTextColor(TFT_BLACK);
  tft.setTextSize(1);
  
  // Check the connection status between the MLX90641 Thermal Imaging Camera and Wio Terminal.
  if(isConnected() == false){
    tft.fillScreen(TFT_RED);
    tft.drawString("MLX90641 not detected at default I2C address!", 5, 10);
    tft.drawString("Please check wiring. Freezing.", 5, 25);
    while (1);
  }
  // Get the MLX90641 Thermal Imaging Camera parameters:
  int status;
  status = MLX90641_DumpEE(MLX90641_address, eeMLX90641);
  errorno = status;//MLX90641_CheckEEPROMValid(eeMLX90641);//eeMLX90641[10] & 0x0040;//
 
  if(status != 0){
    tft.fillScreen(TFT_RED);
    tft.drawString("Failed to load system parameters!", 5, 10);
    while(1);
  }
 
  status = MLX90641_ExtractParameters(eeMLX90641, &MLX90641);
  //errorno = status;
  if(status != 0){
    tft.fillScreen(TFT_RED);
    tft.drawString("Parameter extraction failed!", 5, 10);
    while(1);
  }

  // Once params are extracted, release eeMLX90641 array:
  MLX90641_SetRefreshRate(MLX90641_address, 0x05); // Set rate to 16Hz.

  // Get the cutoff points:
  Getabcd();

  // TensorFlow Lite Model settings:
  
  // Set up logging (will report to Serial, even within TFLite functions).
  static tflite::MicroErrorReporter micro_error_reporter;
  error_reporter = &micro_error_reporter;

  // Map the model into a usable data structure.
  model = tflite::GetModel(irrigation_model);
  if (model->version() != TFLITE_SCHEMA_VERSION) {
    error_reporter->Report("Model version does not match Schema");
    while(1);
  }

  // This pulls in all the operation implementations we need.
  // NOLINTNEXTLINE(runtime-global-variables)
  static tflite::AllOpsResolver resolver;

  // Build an interpreter to run the model.
  static tflite::MicroInterpreter static_interpreter(
    model, resolver, tensor_arena, kTensorArenaSize,
    error_reporter);
  interpreter = &static_interpreter;

  // Allocate memory from the tensor_arena for the model's tensors.
  TfLiteStatus allocate_status = interpreter->AllocateTensors();
  if (allocate_status != kTfLiteOk) {
    error_reporter->Report("AllocateTensors() failed");
    while(1);
  }

  // Assign model input and output buffers (tensors) to pointers.
  model_input = interpreter->input(0);
  model_output = interpreter->output(0);

  // 5-Way Switch
  pinMode(WIO_5S_PRESS, INPUT_PULLUP);

  delay(1000);
  tft.fillScreen(TFT_BLUE);
}

void loop(){
 get_and_display_data_from_MLX90641(64, 20, 12, 12);

 // Execute the TensorFlow Lite model to make predictions on the irrigation levels (classes).
 if(digitalRead(WIO_5S_PRESS) == LOW) run_inference_to_make_predictions();

}

void run_inference_to_make_predictions(){
    // Initiate the results screen.
    tft.fillScreen(TFT_PURPLE);
    
    // Copy values (thermal imaging array) to the input buffer (tensor):
    for(int i = 0; i < 192; i++){
      model_input->data.f[i] = MLX90641To[i];
    }

    // Run inference:
    TfLiteStatus invoke_status = interpreter->Invoke();
    if (invoke_status != kTfLiteOk) {
      error_reporter->Report("Invoke failed on the given input.");
    }

    // Read predicted y values (irrigation classes) from the output buffer (tensor):
    for(int i = 0; i<4; i++){
      if(model_output->data.f[i] >= threshold){
        // Display the detection result (class).
        // Border:
        int w = 200; int h = 60;
        int x = (320 - w) / 2;
        int y = (240 - h) / 2;
        int offset = 15; int border = 1;
        int r = 20;
        tft.drawRoundRect(x - offset - border, y - offset - border, w + (2*offset) + (2*border), h + (2*offset) + (2*border), r, TFT_WHITE);
        tft.fillRoundRect(x - offset, y - offset, w + (2*offset), h + (2*offset), r, TFT_MAGENTA);
        tft.fillRoundRect(x, y, w, h, r, class_color_codes[i]);
        // Print:
        int str_x = classes[i].length() * 11;
        int str_y = 12;
        tft.setTextSize(2);
        tft.drawString(classes[i], (320 - str_x) / 2, (240 - str_y) / 2);
      }
    }
    
    // Exit and clear.
    delay(3000);
    tft.setTextSize(1);
    tft.fillScreen(TFT_BLUE);
}

void draw_menu(int start_x, int start_y, int w, int h){
  // Draw the border:
  int offset = 10;
  tft.drawRoundRect(start_x-offset, start_y-offset, (2*offset)+(w*16), (2*offset)+(h*12), 10, TFT_WHITE);
  // Draw options:
  int x_c = 320 / 2; int x_s = x_c - 7; int y_c = 210; int y_s = y_c - 11;
  tft.setTextSize(1);
  /////////////////////////////////////
  tft.fillCircle(x_c, y_c, 20, TFT_WHITE);
  tft.drawChar(x_s, y_s, 'P', TFT_BLACK, TFT_WHITE, 3);
  tft.drawString("'Press' to run the NN model", x_c - 80, y_c - 33);
  /////////////////////////////////////
}

void get_and_display_data_from_MLX90641(int start_x, int start_y, int w, int h){
  // Draw the options menu:
  draw_menu(start_x, start_y, w, h);
  // Elicit the 16x12 pixel IR thermal imaging array generated by the MLX90641 Thermal Imaging Camera:
  for(byte x = 0 ; x < 2 ; x++){
    int status = MLX90641_GetFrameData(MLX90641_address, MLX90641Frame);
    // Obtain the required variables to calculate the thermal imaging array:
    float vdd = MLX90641_GetVdd(MLX90641Frame, &MLX90641);
    float Ta = MLX90641_GetTa(MLX90641Frame, &MLX90641);
    // Define the reflected temperature based on the sensor's ambient temperature:
    float tr = Ta - TA_SHIFT; 
    float emissivity = 0.95;
    // Create the thermal imaging array:
    MLX90641_CalculateTo(MLX90641Frame, &MLX90641, emissivity, tr, MLX90641To);
  }
  // Define parameters: 
  int x = start_x;
  int y = start_y + (h*11);
  uint32_t c = TFT_BLUE; 
  for(int i = 0 ; i < 192 ; i++){
    // Display a simple image version of the collected data (array) on the screen:
    // Define the color palette:
    c = GetColor(MLX90641To[i]);
    // Draw image pixels (rectangles):
    tft.fillRect(x, y, w, h, c);
    x = x + w;
    // Start a new row:
    int l = i + 1;
    if (l%16 == 0) { x = start_x; y = y - h; }
  }
}

boolean isConnected(){
  // Return true if the MLX90641 Thermal Imaging Camera is detected on the I2C bus:
  Wire.beginTransmission((uint8_t)MLX90641_address);
  if(Wire.endTransmission() != 0){
    return (false);
  }
  return (true);
}

uint16_t GetColor(float val){
  /*
 
    equations based on
    http://web-tech.ga-usa.com/2012/05/creating-a-custom-hot-to-cold-temperature-color-gradient-for-use-with-rrdtool/index.html
 
  */

  // Assign colors to the given temperature readings:
  // R:
  red = constrain(255.0 / (c - b) * val - ((b * 255.0) / (c - b)), 0, 255);
  // G:
  if((val > MinTemp) & (val < a)){
    green = constrain(255.0 / (a - MinTemp) * val - (255.0 * MinTemp) / (a - MinTemp), 0, 255);
  }else if((val >= a) & (val <= c)){
    green = 255;
  }else if(val > c){
    green = constrain(255.0 / (c - d) * val - (d * 255.0) / (c - d), 0, 255);
  }else if((val > d) | (val < a)){
    green = 0;
  }
  // B:
  if(val <= b){
    blue = constrain(255.0 / (a - b) * val - (255.0 * b) / (a - b), 0, 255);
  }else if((val > b) & (val <= d)){
    blue = 0;
  }else if (val > d){
    blue = constrain(240.0 / (MaxTemp - d) * val - (d * 240.0) / (MaxTemp - d), 0, 240);
  }
 
  // Utilize the built-in color mapping function to get a 5-6-5 color palette (R=5 bits, G=6 bits, B-5 bits):
  return tft.color565(red, green, blue);
}

void Getabcd() {
  // Get the cutoff points based on the given maximum and minimum temperature values.
  a = MinTemp + (MaxTemp - MinTemp) * 0.2121;
  b = MinTemp + (MaxTemp - MinTemp) * 0.3182;
  c = MinTemp + (MaxTemp - MinTemp) * 0.4242;
  d = MinTemp + (MaxTemp - MinTemp) * 0.8182;
}

irrigation_model.h

Arduino
#ifndef IRRIGATION_MODEL_H
#define IRRIGATION_MODEL_H


unsigned int irrigation_model_len = 102256;
unsigned char irrigation_model[] = {
 0x1c, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x14, 0x00, 0x20, 0x00,
  0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00,
  0x18, 0x00, 0x1c, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
  0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00,
  0x20, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00,
  0x02, 0x00, 0x00, 0x00, 0xb4, 0x02, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00,
  0x01, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
  0x18, 0x8f, 0x01, 0x00, 0x14, 0x8f, 0x01, 0x00, 0x44, 0x8c, 0x01, 0x00,
  0xc0, 0x8b, 0x01, 0x00, 0x70, 0x0b, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x00,
  0x00, 0x8f, 0x01, 0x00, 0xfc, 0x8e, 0x01, 0x00, 0xf8, 0x8e, 0x01, 0x00,
  0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x08, 0x00,
  0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
  0x13, 0x00, 0x00, 0x00, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x75, 0x6e, 0x74,
  0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00,
  0x1a, 0x74, 0xfe, 0xff, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
  0x31, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x4d, 0x4c, 0x49, 0x52,
  0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x00,
  0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00,
  0x10, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
  0x34, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
  0x48, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x8e, 0x01, 0x00,
  0xa8, 0x8d, 0x01, 0x00, 0x24, 0x8b, 0x01, 0x00, 0xc4, 0x8a, 0x01, 0x00,
  0x70, 0x0a, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00,
  0x7c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
  0x68, 0x01, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
  0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x0e, 0x00,
  0x18, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x14, 0x00,
  0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00,
  0x1c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
  0xe6, 0x74, 0xfe, 0xff, 0x00, 0x00, 0x80, 0x3f, 0x01, 0x00, 0x00, 0x00,
  0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
  0xb0, 0xfe, 0xff, 0xff, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19,
  0x01, 0x00, 0x00, 0x00, 0x94, 0x72, 0xfe, 0xff, 0x14, 0x00, 0x00, 0x00,
  0x08, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
  0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
  0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x49, 0x64, 0x65, 0x6e,
  0x74, 0x69, 0x74, 0x79, 0x00, 0x00, 0x00, 0x00, 0x58, 0x75, 0xfe, 0xff,
  0x00, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00,
  0x07, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
  0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
  0xa8, 0x72, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
  0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
  0x02, 0x00, 0x00, 0x00, 0x18, 0x73, 0xfe, 0xff, 0x14, 0x00, 0x00, 0x00,
  0x07, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
  0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
  0x04, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75,
  0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65,
  0x5f, 0x31, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x3b, 0x73, 0x65,
  0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e,
  0x73, 0x65, 0x5f, 0x31, 0x2f, 0x42, 0x69, 0x61, 0x73, 0x41, 0x64, 0x64,
  0x00, 0x00, 0x00, 0x00, 0x08, 0x76, 0xfe, 0xff, 0x00, 0x00, 0x0e, 0x00,
  0x16, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x10, 0x00,
  0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x00, 0x00,
  0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
  0x08, 0x00, 0x07, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  0x0c, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x04, 0x00,
  0x0c, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
  0x01, 0x00, 0x00, 0x00, 0xf0, 0x73, 0xfe, 0xff, 0x14, 0x00, 0x00, 0x00,
  0x06, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00,
  0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
  0x80, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75,
  0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65,
  0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x3b, 0x73, 0x65, 0x71, 0x75,
  0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65,
  0x2f, 0x52, 0x65, 0x6c, 0x75, 0x3b, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e,
  0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x2f, 0x42,
  0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 0x00, 0x00, 0x18, 0x74, 0xfe, 0xff,
  0xea, 0x76, 0xfe, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
  0x28, 0x44, 0x85, 0x3c, 0x9b, 0x9d, 0xa7, 0x3d, 0xc4, 0xb1, 0x1c, 0xbd,
  0x12, 0x16, 0x58, 0xbe, 0x92, 0xf2, 0x31, 0x3e, 0x44, 0xb1, 0x34, 0x3e,
  0xe7, 0x6c, 0x2a, 0xbe, 0x1d, 0xff, 0x14, 0x3e, 0xc4, 0x54, 0xd1, 0x3c,
  0x5e, 0x35, 0x1b, 0xbe, 0xc1, 0x7e, 0x95, 0x3c, 0x35, 0xc3, 0xe1, 0xbc,
  0x9f, 0xb7, 0xba, 0x3e, 0xe0, 0xc8, 0xe6, 0x3d, 0xd8, 0xf4, 0xfa, 0x3c,
  0xde, 0x2c, 0x7e, 0x3c, 0x73, 0x55, 0x04, 0xbe, 0xbf, 0x14, 0xe1, 0xbd,
  0x2f, 0x92, 0xa3, 0xbe, 0xa2, 0x85, 0x50, 0x3e, 0xff, 0xf5, 0x28, 0x3e,
  0x44, 0x68, 0xb5, 0x3e, 0x5e, 0xf8, 0x32, 0x3e, 0x5d, 0x08, 0x3e, 0xbd,
  0x28, 0x89, 0xd4, 0x3c, 0x6b, 0x0c, 0x1c, 0xbe, 0x69, 0xb9, 0x59, 0xbe,
  0x1c, 0x54, 0x86, 0x3d, 0x66, 0x5a, 0x34, 0x3e, 0x40, 0xfd, 0x6d, 0x3d,
  0x6c, 0x47, 0x84, 0xbe, 0xa2, 0x98, 0x03, 0xbf, 0x56, 0xce, 0x22, 0x3e,
  0xe6, 0x67, 0x56, 0x3e, 0x00, 0x40, 0x80, 0x38, 0x0b, 0x3f, 0xf8, 0x3e,
  0xc0, 0x1b, 0x26, 0xbe, 0x30, 0x92, 0xe5, 0x3d, 0x1e, 0x66, 0x34, 0xbe,
  0x18, 0xf3, 0xa4, 0xbd, 0x33, 0x91, 0xc1, 0x3d, 0x80, 0x09, 0xbc, 0x3d,
  0xc2, 0xc0, 0x1e, 0x3e, 0xde, 0x39, 0x08, 0x3e, 0x79, 0xcc, 0x5b, 0xbe,
  0x45, 0xa3, 0x5f, 0x3e, 0x9a, 0x86, 0x25, 0xbe, 0xf4, 0x19, 0x1b, 0x3e,
  0xb4, 0x11, 0x4a, 0xbe, 0x95, 0x26, 0x96, 0xbd, 0xb5, 0xea, 0x2c, 0xbe,
  0x68, 0xd7, 0xa1, 0x3d, 0xe0, 0x3e, 0x82, 0x3c, 0xad, 0x02, 0x41, 0x3e,
  0xed, 0xb8, 0xd3, 0xbd, 0x07, 0xb8, 0x98, 0x3e, 0x88, 0xc5, 0x34, 0x3e,
  0x1c, 0xfe, 0x4c, 0xbd, 0xa8, 0xe3, 0x7c, 0x3e, 0x30, 0x79, 0x1f, 0xbc,
  0x5e, 0xfb, 0x08, 0x3e, 0x3c, 0x7f, 0x07, 0x3d, 0x44, 0xc2, 0x47, 0xbd,
  0xe0, 0xb1, 0x5c, 0x3e, 0x40, 0xa3, 0xa1, 0xbb, 0x70, 0x6a, 0x47, 0x3d,
  0x78, 0x32, 0xea, 0xbd, 0x3f, 0x91, 0x9a, 0x3e, 0x1e, 0x3c, 0xb4, 0xbe,
  0x8f, 0x53, 0x12, 0xbd, 0x86, 0xe5, 0x89, 0x3e, 0x73, 0x43, 0xb0, 0xbe,
  0x96, 0xda, 0x0d, 0xbe, 0x90, 0x84, 0x02, 0x3e, 0x99, 0x79, 0x01, 0xbe,
  0x94, 0xd3, 0x92, 0xbd, 0x60, 0x44, 0xa8, 0xbb, 0xe7, 0xcf, 0x13, 0x3e,
  0x7e, 0xb0, 0x09, 0x3e, 0x8b, 0x27, 0x3c, 0xbc, 0xc6, 0x7d, 0xbc, 0xbd,
  0x4e, 0xbc, 0x3c, 0xbe, 0x06, 0xcd, 0x09, 0x3e, 0x91, 0x8a, 0xe1, 0xbe,
  0x23, 0xac, 0x44, 0xbe, 0x82, 0xb5, 0x28, 0xbe, 0xba, 0x4d, 0x7e, 0xbc,
  0xbd, 0xe9, 0x96, 0xbd, 0x7d, 0x13, 0xfe, 0xbd, 0x20, 0x8c, 0x0b, 0x3d,
  0x28, 0x06, 0x4d, 0x3e, 0x9f, 0x69, 0x6e, 0xbe, 0x40, 0x41, 0x25, 0x3d,
  0x28, 0x8d, 0x63, 0xbd, 0xfe, 0xd4, 0x15, 0xbf, 0x27, 0xb1, 0xb7, 0xbd,
  0xda, 0x19, 0x41, 0x3e, 0x30, 0x97, 0x76, 0x3d, 0x78, 0x87, 0x4a, 0xbe,
  0x4d, 0x1b, 0xb1, 0xbe, 0x88, 0x16, 0x42, 0xbd, 0x78, 0x07, 0x2a, 0xbd,
  0xfe, 0x8f, 0x7a, 0xbe, 0x76, 0x78, 0x1f, 0xbe, 0xa4, 0xb5, 0x9f, 0xbe,
  0x76, 0xd6, 0x0d, 0x3c, 0x10, 0x37, 0x56, 0x3c, 0xd0, 0x1f, 0x02, 0x3e,
  0xe0, 0xaa, 0x46, 0x3e, 0xb9, 0xd7, 0x83, 0x3e, 0x28, 0xa5, 0x96, 0xbd,
  0xf1, 0xe8, 0xda, 0xbd, 0x66, 0x28, 0x88, 0xbd, 0x43, 0xc7, 0x5b, 0x3e,
  0x0f, 0xd5, 0x2e, 0xbe, 0xd4, 0x7b, 0x62, 0xbd, 0x72, 0xa6, 0xc5, 0x3c,
  0xb2, 0x3d, 0xf7, 0x3d, 0x01, 0x27, 0xee, 0xbe, 0x9c, 0xf3, 0xb5, 0x3d,
  0x6e, 0xcd, 0xb3, 0x3d, 0x82, 0x8d, 0x3d, 0xbe, 0xd6, 0x78, 0x58, 0xbe,
  0xa4, 0x70, 0x72, 0xbd, 0x64, 0x01, 0x37, 0x3e, 0xaf, 0xeb, 0x9f, 0x3e,
  0xf0, 0x99, 0xe7, 0x3c, 0xec, 0x06, 0xf3, 0x3d, 0x6c, 0xf1, 0x88, 0xbd,
  0x02, 0xc9, 0x51, 0x3e, 0xbc, 0x71, 0x00, 0x3d, 0xfd, 0x66, 0x7f, 0x3e,
  0xe7, 0x8a, 0xeb, 0x3d, 0x1c, 0xb1, 0xbf, 0x3d, 0xb6, 0xa0, 0x07, 0x3e,
  0xfd, 0x5a, 0x25, 0x3d, 0x4d, 0xea, 0xc2, 0x3d, 0xee, 0xe0, 0x10, 0xbe,
  0x19, 0x72, 0xaa, 0xbe, 0x35, 0x68, 0x88, 0xbe, 0xdc, 0xe5, 0x0c, 0xbe,
  0x88, 0x33, 0xc1, 0x3d, 0x70, 0x00, 0xfb, 0x3d, 0xad, 0xd6, 0xb1, 0xbd,
  0x91, 0x4d, 0x9b, 0xbd, 0xb0, 0xb4, 0x51, 0xbe, 0x51, 0x97, 0x77, 0x3e,
  0xf8, 0x6c, 0xf7, 0xbc, 0x84, 0xb6, 0x1e, 0xbe, 0x42, 0x9b, 0x2c, 0xbe,
  0x40, 0x14, 0xa5, 0xbd, 0x82, 0x7c, 0x08, 0x3e, 0x1c, 0xfa, 0xaf, 0xbd,
  0xa0, 0x6c, 0x8c, 0xbd, 0xfa, 0x07, 0x18, 0x3e, 0x3d, 0x86, 0x32, 0xbe,
  0x4a, 0xee, 0x18, 0x3e, 0xac, 0xb7, 0x2c, 0x3e, 0xb0, 0x4d, 0x86, 0x3e,
  0x97, 0xe6, 0x80, 0xbd, 0x23, 0x56, 0x0a, 0xbe, 0x26, 0xd0, 0x31, 0x3e,
  0x04, 0xa5, 0xce, 0xbd, 0x07, 0x80, 0x90, 0xbe, 0x77, 0xbc, 0xcd, 0xbd,
  0x00, 0xd0, 0xcc, 0x3a, 0xb7, 0xef, 0x93, 0x3d, 0xd2, 0xfa, 0x22, 0x3e,
  0xf1, 0x31, 0x55, 0x3e, 0x88, 0x2f, 0x9e, 0x3d, 0x5a, 0x28, 0x02, 0x3e,
  0xf8, 0x32, 0xc1, 0x3d, 0x0d, 0xd6, 0x2a, 0x3e, 0xe5, 0x89, 0x02, 0xbf,
  0xfc, 0x8c, 0x18, 0xbd, 0x48, 0x81, 0xfe, 0x3c, 0xf0, 0x14, 0x9d, 0x3d,
  0x89, 0xa3, 0xe9, 0xbd, 0xdb, 0x5d, 0xd7, 0xbd, 0x70, 0xa6, 0x18, 0xbe,
  0x1c, 0x0d, 0xae, 0xbd, 0x0d, 0x14, 0x1f, 0xbe, 0xb6, 0x5c, 0x48, 0x3e,
  0x07, 0xe6, 0xef, 0xbd, 0x60, 0x77, 0xb3, 0x3d, 0x57, 0x01, 0x26, 0x3d,
  0x82, 0x57, 0x3b, 0x3e, 0xba, 0xed, 0x4d, 0x3e, 0xe4, 0xe3, 0xb5, 0xbe,
  0x7b, 0xee, 0x06, 0xbe, 0xe4, 0xb2, 0x57, 0x3e, 0x10, 0x43, 0x50, 0xbd,
  0x84, 0x62, 0x36, 0x3e, 0x58, 0x4a, 0xce, 0x3c, 0x00, 0x75, 0x45, 0x3b,
  0x27, 0x80, 0x0c, 0xbd, 0xcd, 0xa3, 0x0d, 0x3e, 0xf5, 0x82, 0x12, 0xbe,
  0xb5, 0xf6, 0x62, 0xbd, 0xae, 0xe3, 0x1f, 0x3e, 0x70, 0xb3, 0xf3, 0x3d,
  0xcf, 0x4c, 0x45, 0xbe, 0x48, 0x08, 0x78, 0x3d, 0x1a, 0xcc, 0x80, 0xbd,
  0x40, 0x38, 0x31, 0x3e, 0xaa, 0xe0, 0x40, 0x3e, 0x3d, 0xfe, 0x42, 0xbd,
  0x30, 0xe3, 0x8b, 0x3e, 0xee, 0xfa, 0xc2, 0xbe, 0x04, 0x1c, 0x29, 0x3e,
  0x95, 0x51, 0x57, 0x3c, 0x70, 0x58, 0x01, 0xbd, 0x00, 0x9c, 0xef, 0x3d,
  0x5c, 0xf6, 0x24, 0x3e, 0xfa, 0x43, 0x93, 0x3d, 0xae, 0xec, 0x2a, 0xbe,
  0x2e, 0xc5, 0x0e, 0x3e, 0xe6, 0x7d, 0x32, 0xbe, 0xdc, 0x78, 0xb4, 0x3d,
  0xe4, 0xdb, 0x84, 0x3e, 0x10, 0xc2, 0x6d, 0xbc, 0xf8, 0xac, 0x1b, 0xbe,
  0x62, 0x2a, 0x0e, 0x3f, 0x7e, 0x91, 0x9d, 0x3e, 0x02, 0xf5, 0xc2, 0x3d,
  0x60, 0xaf, 0x54, 0x3e, 0x87, 0xae, 0x4d, 0x3e, 0x33, 0xf8, 0xb8, 0xbd,
  0xf8, 0xc2, 0x4b, 0xbe, 0x37, 0x09, 0xe8, 0x3d, 0xc1, 0x08, 0x4b, 0x3e,
  0x28, 0x99, 0x3d, 0xbe, 0xfb, 0xfc, 0x70, 0xbd, 0x3d, 0xbe, 0x22, 0xbe,
  0x3c, 0xa0, 0x32, 0x3e, 0x79, 0x18, 0x4c, 0xbe, 0xca, 0xa4, 0x18, 0xbe,
  0xc0, 0xf9, 0x23, 0xbe, 0x08, 0x4c, 0xd0, 0xbd, 0x49, 0x38, 0x1b, 0x3e,
  0x1a, 0x45, 0x23, 0xbe, 0x7e, 0xac, 0x14, 0xbf, 0x75, 0x45, 0xe2, 0xbc,
  0xec, 0xc0, 0xcf, 0x3d, 0x93, 0x9a, 0xa6, 0xbe, 0x1d, 0x08, 0xa8, 0x3d,
  0x8d, 0x2d, 0xf2, 0x3d, 0x6d, 0x11, 0x08, 0xbe, 0x18, 0x78, 0x47, 0xbe,
  0xba, 0xca, 0xdb, 0xbc, 0x8b, 0x50, 0x39, 0xbe, 0xa0, 0x52, 0xf9, 0x3d,
  0x51, 0x3f, 0x7e, 0xbe, 0x00, 0xb2, 0x9a, 0x3e, 0x00, 0x8b, 0x53, 0x3d,
  0x84, 0x5c, 0x9a, 0xbd, 0xa2, 0xdc, 0x26, 0x3e, 0x60, 0x11, 0x65, 0xbe,
  0x44, 0x83, 0xe3, 0x3d, 0xe9, 0x76, 0x85, 0x3e, 0x26, 0xd1, 0x3e, 0x3c,
  0x54, 0xf5, 0x09, 0xbe, 0x80, 0x26, 0xfa, 0xba, 0xc0, 0x50, 0x3a, 0x3d,
  0xe6, 0x4a, 0xd3, 0xbc, 0xee, 0x45, 0xd1, 0xbd, 0x50, 0x22, 0x5b, 0x3e,
  0x26, 0x49, 0x27, 0x3e, 0xc8, 0x64, 0xa2, 0xbd, 0x76, 0xe4, 0x40, 0x3e,
  0x8c, 0xce, 0xdf, 0xbd, 0xba, 0x4d, 0xbf, 0xbe, 0x37, 0x32, 0x45, 0xbe,
  0x30, 0x06, 0x1e, 0x3d, 0x9b, 0x2c, 0xa3, 0x3e, 0x64, 0x2d, 0xd8, 0x3d,
  0x2a, 0xf2, 0x19, 0xbe, 0xf5, 0xe5, 0x02, 0x3e, 0xb0, 0x62, 0x77, 0x3d,
  0x61, 0x48, 0xb1, 0xbd, 0x68, 0x20, 0x3c, 0x3e, 0x44, 0xb3, 0xe1, 0x3d,
  0xf8, 0xff, 0x49, 0xbe, 0xb4, 0x67, 0x07, 0x3e, 0x28, 0x36, 0x11, 0x3d,
  0xf4, 0x34, 0x05, 0xbe, 0xc0, 0xec, 0x95, 0xbe, 0xff, 0xeb, 0xd4, 0x3e,
  0xf1, 0x13, 0x0f, 0xbe, 0xbe, 0x7a, 0xc8, 0xbd, 0x7b, 0x49, 0x35, 0xbe,
  0xea, 0xdf, 0x92, 0x3e, 0xe8, 0xb1, 0x86, 0x3d, 0xd0, 0xca, 0x33, 0xbc,
  0xc8, 0xa2, 0xfd, 0xbd, 0x80, 0x2e, 0x59, 0xbc, 0x35, 0x9c, 0xc6, 0x3d,
  0x36, 0xa0, 0x55, 0x3e, 0x9c, 0x01, 0x50, 0xbe, 0x10, 0x17, 0x89, 0x3c,
  0x54, 0x7c, 0x04, 0x3d, 0x82, 0xc8, 0xc0, 0x3e, 0xc0, 0xcc, 0x3f, 0x3d,
  0x24, 0x13, 0x90, 0xbd, 0xd4, 0x2b, 0x0e, 0xbe, 0x11, 0xe1, 0x94, 0x3d,
  0x6d, 0xcf, 0xc4, 0x3d, 0x5c, 0x2e, 0x55, 0xbe, 0x86, 0xcf, 0xd2, 0xbd,
  0x6d, 0x81, 0x83, 0x3e, 0x2c, 0x9b, 0x85, 0x3d, 0x2f, 0x3e, 0x7d, 0xbe,
  0xec, 0xc1, 0x27, 0xbd, 0xff, 0x52, 0x11, 0xbe, 0x71, 0xdd, 0xb6, 0xbe,
  0xc8, 0xc6, 0x8f, 0x3d, 0x81, 0x0c, 0xf9, 0x3d, 0x5b, 0x74, 0x41, 0x3e,
  0x9e, 0xea, 0x56, 0x3e, 0x20, 0x1b, 0xc9, 0xbe, 0x9a, 0xb3, 0xb7, 0xbd,
  0x0c, 0xa1, 0x7f, 0xbd, 0xf8, 0x05, 0x2e, 0xbe, 0xd9, 0x9d, 0x69, 0xbe,
  0x39, 0x56, 0xa2, 0x3e, 0xbc, 0xb0, 0xbd, 0xbd, 0xdd, 0xfc, 0x73, 0xbd,
  0x49, 0xb7, 0xaf, 0x3d, 0x58, 0x61, 0x74, 0x3d, 0x40, 0x6a, 0xc8, 0x3d,
  0x7f, 0x70, 0xa5, 0xbe, 0xa3, 0xe2, 0x33, 0xbe, 0x1c, 0x07, 0x15, 0x3e,
  0x89, 0xdb, 0xf0, 0xbe, 0x77, 0x7f, 0xd9, 0x3d, 0x9e, 0xb8, 0xa5, 0xbe,
  0x9e, 0xb3, 0xde, 0x3e, 0xde, 0x25, 0xcc, 0xbd, 0x84, 0x56, 0x85, 0x3e,
  0x21, 0xd3, 0xd4, 0x3e, 0x04, 0xa5, 0xd9, 0x3d, 0x7e, 0xa9, 0x09, 0xbe,
  0x49, 0x6e, 0x47, 0xbe, 0xd4, 0x60, 0x65, 0x3d, 0x3b, 0xc9, 0x4f, 0x3e,
  0x5f, 0x84, 0x0c, 0xbe, 0x84, 0xbb, 0xd5, 0x3d, 0x71, 0x8e, 0x4d, 0xbe,
  0x32, 0x6a, 0x36, 0x3e, 0xfd, 0x4e, 0x4d, 0xbe, 0x7c, 0x6b, 0x91, 0xbd,
  0x02, 0x72, 0x9a, 0xbe, 0xa4, 0x4b, 0x0b, 0xbd, 0x8f, 0xab, 0x2c, 0xbe,
  0xdd, 0x0c, 0x31, 0xbe, 0x60, 0x92, 0xbc, 0x3e, 0xa8, 0xb9, 0x69, 0x3d,
  0x61, 0x5b, 0xe5, 0xbe, 0x9e, 0x0e, 0x72, 0x3d, 0x30, 0x22, 0x7a, 0x3c,
  0xf7, 0xf0, 0x92, 0x3d, 0x78, 0xc7, 0x36, 0xbe, 0x74, 0x93, 0xfc, 0x3d,
  0xad, 0xc8, 0xf7, 0xbd, 0xbf, 0xb9, 0x39, 0xbe, 0x54, 0x2f, 0xc9, 0xbe,
  0x02, 0x25, 0x57, 0xbe, 0x1a, 0x8e, 0x4b, 0xbd, 0xbb, 0x6a, 0x0f, 0xbc,
  0x32, 0xd7, 0xdd, 0x3c, 0x5b, 0xd0, 0x7b, 0x3e, 0x70, 0x48, 0x43, 0x3e,
  0xdb, 0x38, 0xfa, 0x3d, 0x22, 0x86, 0x48, 0x3e, 0xb1, 0x89, 0x51, 0x3e,
  0x34, 0x34, 0x24, 0x3e, 0x10, 0xd7, 0x63, 0x3e, 0x3b, 0x77, 0xa2, 0x3e,
  0xc7, 0x29, 0xe7, 0xbd, 0xd0, 0xfb, 0x3a, 0x3e, 0x2c, 0x95, 0x04, 0x3e,
  0xa0, 0x23, 0x83, 0xbe, 0xa4, 0x44, 0x47, 0x3e, 0xba, 0x6c, 0xa5, 0xbd,
  0x8c, 0x6e, 0x44, 0x3e, 0x61, 0xfa, 0x01, 0x3b, 0x28, 0x9f, 0x49, 0x3d,
  0x72, 0x67, 0x95, 0x3d, 0x84, 0x01, 0x00, 0xbe, 0xe0, 0xf9, 0xc1, 0xbb,
  0xc0, 0xfc, 0x40, 0xbe, 0x8c, 0x58, 0x8a, 0xbc, 0xa3, 0x2d, 0x43, 0xbe,
  0x5d, 0xeb, 0x57, 0xbe, 0xb1, 0x02, 0xc5, 0xbb, 0x7d, 0x06, 0x75, 0xbd,
  0xfd, 0xe4, 0x62, 0x3e, 0xbe, 0x4b, 0x10, 0xbe, 0x84, 0xb1, 0x89, 0xbd,
  0x6b, 0xb8, 0xd9, 0xbd, 0x90, 0x89, 0x06, 0xbe, 0x87, 0x3f, 0x27, 0xbe,
  0xcf, 0x6a, 0x7e, 0xbe, 0xa2, 0x48, 0x2f, 0x3e, 0x72, 0x01, 0x3e, 0xbe,
  0x5c, 0xc2, 0x2b, 0xbe, 0xb4, 0x01, 0x8f, 0x3d, 0x1b, 0xfa, 0x36, 0xbe,
  0x68, 0xac, 0x2f, 0xbd, 0xb8, 0xd4, 0x8a, 0xbd, 0xa8, 0x1d, 0x07, 0x3e,
  0xf8, 0x07, 0xe6, 0x3c, 0xe8, 0xac, 0x90, 0xbc, 0xd9, 0x33, 0xdd, 0xbd,
  0xb9, 0xb1, 0x26, 0x3e, 0x58, 0xb5, 0x88, 0x3e, 0xe4, 0x2a, 0x18, 0x3e,
  0xc8, 0xd6, 0x38, 0x3d, 0xdc, 0x3e, 0x1b, 0xbd, 0x36, 0x8f, 0x11, 0x3e,
  0xb0, 0xba, 0xb1, 0x3d, 0x06, 0x88, 0x31, 0x3e, 0x07, 0xbc, 0x5e, 0x3d,
  0x30, 0x21, 0xeb, 0x3c, 0x9d, 0xf4, 0x11, 0x3e, 0x70, 0x0d, 0x3a, 0xbc,
  0x8b, 0xc5, 0x0a, 0xbe, 0xcc, 0x15, 0xaf, 0x3d, 0xa2, 0x00, 0x50, 0xbe,
  0x32, 0x75, 0x3f, 0xbd, 0xab, 0x71, 0x49, 0xbe, 0x0c, 0x6e, 0x7f, 0xbd,
  0x12, 0x35, 0x3d, 0x3e, 0xac, 0x93, 0xad, 0x3d, 0x18, 0xf1, 0x3e, 0xbd,
  0x4e, 0x0e, 0x15, 0xbe, 0xec, 0xea, 0xaf, 0xbd, 0x1f, 0x53, 0x14, 0xbe,
  0x00, 0x93, 0x56, 0x3a, 0x73, 0xff, 0x0f, 0xbe, 0x2c, 0x10, 0x07, 0xbe,
  0x07, 0xfd, 0x41, 0x3e, 0x99, 0x7d, 0x08, 0xbe, 0x6e, 0x1b, 0x17, 0x3e,
  0xd9, 0xb1, 0xf3, 0x3d, 0x4d, 0x46, 0xc7, 0xbc, 0x3a, 0x5b, 0x0c, 0x3e,
  0xff, 0x4c, 0x4d, 0x3e, 0xa0, 0xaa, 0x3b, 0xbe, 0xec, 0x0f, 0x18, 0x3e,
  0xf0, 0x89, 0x7c, 0xbc, 0x61, 0x54, 0x1a, 0xbe, 0x3e, 0xd7, 0x83, 0x3c,
  0xdb, 0xa0, 0x28, 0x3e, 0xa4, 0xa7, 0x7a, 0x3e, 0xd9, 0x1b, 0xe8, 0x3d,
  0x0a, 0xb5, 0xb4, 0xbd, 0x44, 0xea, 0x3a, 0x3e, 0xff, 0xd1, 0x92, 0x3d,
  0xf4, 0x9f, 0x1c, 0x3e, 0xa0, 0x6e, 0xfc, 0x3d, 0x03, 0xd2, 0x8d, 0xbc,
  0x28, 0x2a, 0xe9, 0x3d, 0x2b, 0x86, 0x36, 0xbd, 0x1a, 0x4b, 0x93, 0x3d,
  0x50, 0x39, 0x6e, 0x3d, 0x46, 0xc1, 0xf1, 0xbd, 0x87, 0x02, 0x35, 0xbd,
  0x86, 0x94, 0x1e, 0x3e, 0xde, 0x51, 0x16, 0x3e, 0x17, 0xb8, 0x3f, 0x3e,
  0xec, 0xdb, 0x18, 0x3e, 0x79, 0x5b, 0x3c, 0xbe, 0x44, 0x34, 0x8d, 0x3d,
  0xa0, 0xb4, 0xd6, 0x3c, 0xb2, 0x72, 0xb6, 0x3d, 0x04, 0x70, 0x97, 0x3d,
  0xf8, 0xc3, 0xc8, 0xbc, 0x61, 0x2b, 0x83, 0x3c, 0x82, 0x72, 0x36, 0xbd,
  0xe9, 0x4b, 0x65, 0xbd, 0xdc, 0x35, 0x28, 0xbd, 0x36, 0x08, 0xe7, 0x3d,
  0x53, 0x13, 0x2b, 0xbe, 0xb6, 0xcd, 0x3f, 0x3e, 0xf5, 0xa3, 0x18, 0xbd,
  0x9c, 0x95, 0xd1, 0xbd, 0x68, 0x74, 0xc5, 0xbc, 0xe9, 0xca, 0x2f, 0x3e,
  0xf2, 0x87, 0x96, 0x3d, 0x76, 0x30, 0x4c, 0x3e, 0xa0, 0x4c, 0x93, 0xbd,
  0xa8, 0x70, 0xc9, 0x3c, 0xd9, 0x2d, 0x62, 0x3e, 0x54, 0x74, 0x75, 0xbd,
  0x93, 0xf5, 0x4a, 0xbd, 0xac, 0xca, 0xe5, 0x3d, 0x7b, 0xb1, 0x24, 0x3d,
  0x3c, 0xdf, 0xaa, 0x3d, 0x20, 0x18, 0x2f, 0xbd, 0x56, 0xaa, 0x17, 0x3d,
  0x37, 0x4d, 0xb6, 0x3d, 0x91, 0x01, 0x0a, 0xbd, 0x80, 0xd5, 0xbe, 0x3a,
  0x11, 0x8f, 0x8d, 0xbe, 0xfa, 0x7a, 0xb6, 0x3d, 0x00, 0x60, 0x5f, 0xb9,
  0x50, 0x1e, 0xb8, 0x3c, 0x04, 0xcb, 0x71, 0xbd, 0x11, 0x59, 0x72, 0x3d,
  0x50, 0x44, 0x04, 0xbe, 0xe4, 0xd9, 0xb2, 0x3d, 0xe2, 0x7c, 0xfe, 0xff,
  0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
  0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
  0x80, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75,
  0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65,
  0x5f, 0x31, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x00, 0x00, 0x00,
  0x68, 0x7c, 0xfe, 0xff, 0x3a, 0x7f, 0xfe, 0xff, 0x04, 0x00, 0x00, 0x00,
  0x00, 0x80, 0x01, 0x00, 0x8c, 0xe2, 0xbb, 0xbd, 0xe0, 0x2e, 0xd2, 0x3b,
  0x00, 0x06, 0x1a, 0x3c, 0x24, 0x22, 0x33, 0x3d, 0xe0, 0xf7, 0x0b, 0xbc,
  0x86, 0x33, 0xb6, 0x3d, 0xbd, 0xf4, 0x85, 0xbd, 0xf8, 0xe4, 0xc7, 0x3d,
  0x14, 0x65, 0xc2, 0xbd, 0x70, 0x98, 0x04, 0xbc, 0x0a, 0xb1, 0xa9, 0xbd,
  0xf4, 0xd9, 0xb6, 0xbc, 0x1c, 0x8b, 0x47, 0xbd, 0x97, 0x57, 0xe2, 0xbd,
  0x86, 0xfb, 0xac, 0xbd, 0xac, 0x97, 0xd1, 0xbd, 0x4a, 0xe6, 0x8e, 0xbd,
  0x90, 0x54, 0x2f, 0x3d, 0x90, 0x07, 0x64, 0x3c, 0x2c, 0x0b, 0x0b, 0x3e,
  0x38, 0x64, 0x06, 0x3e, 0x48, 0x5a, 0x01, 0xbe, 0xb8, 0x8f, 0x0b, 0x3e,
  0x20, 0x80, 0xef, 0x3c, 0x00, 0xc1, 0xb5, 0x3a, 0x0c, 0xa3, 0x63, 0x3d,
  0x00, 0x64, 0xda, 0x3a, 0xaa, 0x61, 0xac, 0xbd, 0xbc, 0x19, 0xd1, 0x3d,
  0xa4, 0x08, 0x4b, 0x3d, 0xe0, 0x68, 0x99, 0x3d, 0xc2, 0xa3, 0xf7, 0xbd,
  0xc0, 0x10, 0xf7, 0x3b, 0xea, 0xb8, 0x10, 0xbd, 0x86, 0x5e, 0xbc, 0xbd,
  0xbe, 0x40, 0x8e, 0x3d, 0x5e, 0xc8, 0x88, 0x3d, 0x3c, 0xfe, 0xd1, 0xbd,
  0x6e, 0xa8, 0xc0, 0x3d, 0x88, 0x51, 0x5b, 0x3d, 0x04, 0x4e, 0xe5, 0xbd,
  0x8c, 0xd2, 0xda, 0xbd, 0xc3, 0x4d, 0xe0, 0xbd, 0x00, 0x9e, 0x0d, 0x3d,
  0x7e, 0x57, 0xf0, 0xbd, 0x34, 0x3b, 0x09, 0x3d, 0xe7, 0xad, 0x93, 0xbd,
  0xb8, 0x3c, 0xd1, 0x3d, 0xc0, 0xcd, 0x57, 0xbc, 0xe2, 0x0e, 0xc0, 0xbd,
  0xc4, 0xc1, 0xfe, 0x3d, 0xdc, 0x6a, 0xae, 0x3d, 0x94, 0x6d, 0x09, 0x3e,
  0x72, 0x0f, 0xa7, 0xbd, 0xf0, 0x57, 0x14, 0xbd, 0x3c, 0x9b, 0xc2, 0x3d,
  0x99, 0xba, 0x07, 0xbe, 0x44, 0x47, 0xf9, 0x3d, 0x92, 0x50, 0x47, 0xbd,
  0x30, 0x25, 0xcf, 0x3c, 0x60, 0x6e, 0x8e, 0x3c, 0xc0, 0x5b, 0x33, 0x3c,
  0xa8, 0x33, 0x5f, 0x3d, 0x64, 0x70, 0x0a, 0x3d, 0x9c, 0x89, 0x9e, 0xbd,
  0x00, 0xc7, 0x22, 0xbc, 0x79, 0xd2, 0x01, 0xbe, 0x0d, 0xc6, 0xd2, 0xbd,
  0xfa, 0xac, 0x2c, 0xbd, 0x96, 0x10, 0x05, 0xbe, 0x2e, 0x9e, 0xaf, 0xbd,
  0x4e, 0x69, 0xba, 0xbd, 0x80, 0xb5, 0xf8, 0x3b, 0xaa, 0xef, 0x67, 0xbd,
  0x74, 0xf1, 0xff, 0xbc, 0x02, 0x8b, 0xea, 0xbd, 0xd0, 0x6c, 0x8e, 0xbd,
  0xc8, 0x79, 0xb2, 0x3c, 0x5f, 0xdf, 0x9d, 0xbd, 0x80, 0xfd, 0x1d, 0xbc,
  0xb8, 0xac, 0x2e, 0x3d, 0xda, 0x0c, 0x3f, 0xbd, 0x64, 0x49, 0x52, 0xbd,
  0xc0, 0xbb, 0xe5, 0x3b, 0x7c, 0x7b, 0x90, 0x3d, 0xa4, 0x82, 0xc4, 0x3d,
  0xe0, 0x46, 0x65, 0xbd, 0x00, 0x07, 0x12, 0xba, 0xe6, 0x8b, 0x94, 0xbd,
  0x48, 0x35, 0xf9, 0x3c, 0x7c, 0x71, 0xa5, 0x3d, 0xf8, 0x00, 0x9f, 0x3c,
  0x51, 0x41, 0xc3, 0xbd, 0x1c, 0x5d, 0x2c, 0xbd, 0xc0, 0x4c, 0x8f, 0x3c,
  0xb0, 0x97, 0x94, 0x3c, 0x34, 0x5b, 0xef, 0x3d, 0xa4, 0x90, 0xa9, 0x3d,
  0xac, 0xf7, 0x1c, 0x3d, 0x18, 0x16, 0x1e, 0xbd, 0x92, 0xe0, 0xe6, 0x3d,
  0xa0, 0x93, 0xe4, 0x3b, 0xc0, 0xec, 0xa2, 0x3b, 0x00, 0xe2, 0x18, 0x3b,
  0x36, 0x82, 0x0c, 0xbd, 0x1e, 0xae, 0x66, 0xbd, 0x1f, 0x41, 0xf4, 0xbd,
  0x40, 0xbd, 0x4f, 0xbc, 0x80, 0x85, 0xcb, 0x3c, 0x0a, 0x84, 0x05, 0x3e,
  0x78, 0xbb, 0xad, 0xbd, 0xa3, 0x62, 0xf8, 0xbd, 0x6c, 0x7a, 0x49, 0x3d,
  0x80, 0x26, 0x69, 0x3d, 0x20, 0x01, 0x20, 0x3d, 0xf0, 0x9b, 0x9c, 0x3c,
  0xe8, 0xd9, 0x3f, 0x3d, 0x94, 0x34, 0xb5, 0xbd, 0x08, 0xa6, 0xc2, 0x3c,
  0x20, 0xc1, 0xe3, 0xbb, 0xa8, 0x5a, 0x9d, 0x3c, 0xd6, 0x3c, 0x99, 0x3d,
  0x74, 0x28, 0xf5, 0x3d, 0x1c, 0x3e, 0xe1, 0xbd, 0x90, 0xb6, 0x0b, 0x3c,
  0x62, 0x84, 0xe0, 0x3d, 0xf0, 0x6c, 0x65, 0x3d, 0xd3, 0x79, 0xe6, 0xbd,
  0x00, 0x86, 0xcc, 0xbd, 0x5a, 0x7d, 0x3a, 0xbd, 0xff, 0xb9, 0x02, 0xbe,
  0x24, 0xee, 0x00, 0xbe, 0x00, 0xe3, 0xf9, 0x3b, 0x0c, 0xe2, 0xe5, 0xbc,
  0x3a, 0xf6, 0xad, 0xbd, 0x60, 0x4e, 0xd3, 0x3c, 0xe0, 0x07, 0xbd, 0x3d,
  0x3e, 0xe8, 0x72, 0xbd, 0xf6, 0xda, 0x02, 0xbe, 0x00, 0xca, 0x3a, 0x3d,
  0x97, 0x2b, 0xe1, 0xbd, 0x66, 0x33, 0xc3, 0xbd, 0x4e, 0x62, 0xcd, 0xbd,
  0xd6, 0xd9, 0xfa, 0xbd, 0xf8, 0x1a, 0x9a, 0xbd, 0xbc, 0x8d, 0xf7, 0x3d,
  0x8f, 0x70, 0xde, 0xbd, 0x14, 0x9c, 0xf4, 0x3d, 0x37, 0x0e, 0xc2, 0xbd,
  0x0c, 0xc1, 0x62, 0x3d, 0xf0, 0x8e, 0xc7, 0x3d, 0xf4, 0xbc, 0x29, 0xbd,
  0x50, 0x37, 0x6c, 0x3d, 0xea, 0x3d, 0x1d, 0xbd, 0x74, 0xa2, 0x0b, 0x3e,
  0x6d, 0xc8, 0x07, 0xbe, 0x00, 0xc0, 0xa6, 0x39, 0x1c, 0x72, 0x48, 0xbd,
  0xc8, 0xd5, 0x31, 0x3d, 0x27, 0xd5, 0x9b, 0xbd, 0x20, 0x28, 0x6f, 0x3d,
  0xae, 0x65, 0xa9, 0xbd, 0x32, 0xeb, 0x97, 0xbd, 0xb8, 0xdd, 0x94, 0x3d,
  0xd0, 0xc2, 0x94, 0x3c, 0x9a, 0x41, 0xa0, 0x3d, 0x02, 0xa1, 0xb3, 0xbd,
  0x76, 0x53, 0xcb, 0xbd, 0xc0, 0x15, 0xfb, 0x3b, 0x90, 0x58, 0xb0, 0x3d,
  0x2e, 0x97, 0x1a, 0xbd, 0x6b, 0x0b, 0x80, 0xbd, 0xa8, 0xaa, 0xff, 0xbc,
  0x94, 0x61, 0x7f, 0x3d, 0xce, 0x8b, 0x13, 0xbd, 0xec, 0x64, 0xe6, 0xbd,
  0x20, 0xd6, 0x43, 0x3c, 0xe0, 0xa3, 0x7e, 0x3c, 0x00, 0x8e, 0xae, 0x3c,
  0x38, 0x85, 0xf8, 0x3d, 0x90, 0xf7, 0xab, 0xbd, 0x24, 0x48, 0x59, 0x3d,
  0x5c, 0xb9, 0xc2, 0xbd, 0x15, 0x7e, 0x84, 0xbd, 0xd8, 0xfe, 0xa6, 0x3c,
  0x5f, 0xce, 0xe9, 0xbd, 0xfa, 0x34, 0x80, 0xbd, 0x4e, 0x76, 0xf4, 0xbd,
  0x0b, 0xef, 0x8f, 0xbd, 0x58, 0xa7, 0xd2, 0x3d, 0x00, 0x39, 0x8a, 0xbc,
  0xe2, 0x3a, 0x86, 0xbd, 0xe1, 0x6a, 0xa6, 0xbd, 0xac, 0xd4, 0xa4, 0x3d,
  0x15, 0xc6, 0x01, 0xbd, 0x39, 0x61, 0x25, 0x3d, 0x88, 0xbd, 0x61, 0x3d,
  0x39, 0xe2, 0xbe, 0xbd, 0xa5, 0x91, 0x74, 0x3c, 0xd7, 0x3b, 0x21, 0xbe,
  0x0b, 0x3e, 0x97, 0xbd, 0x9c, 0x2a, 0x52, 0x3d, 0x51, 0x6b, 0xbd, 0xbb,
  0x33, 0x9e, 0x57, 0xbe, 0x19, 0x56, 0x63, 0xbd, 0xc9, 0x5c, 0x32, 0xbe,
  0xcc, 0x22, 0x22, 0xbe, 0x00, 0x55, 0x3b, 0x3d, 0xf2, 0x53, 0xc7, 0x3c,
  0x1e, 0xa1, 0xfa, 0x3c, 0x9b, 0xcd, 0xd5, 0xbd, 0x31, 0x22, 0xa9, 0xbd,
  0xec, 0xe6, 0x63, 0x3d, 0x77, 0x10, 0x7b, 0xbd, 0x08, 0x2b, 0xfd, 0xbc,
  0xb1, 0x9b, 0x26, 0xbc, 0xfa, 0xf1, 0x00, 0x3d, 0x44, 0x4c, 0xba, 0x3d,
  0x99, 0xd7, 0xca, 0x3d, 0xe2, 0xe5, 0xfd, 0xbd, 0x5b, 0xd2, 0xe8, 0xbd,
  0x4c, 0xf1, 0xac, 0x3c, 0xbb, 0x81, 0x0f, 0xbe, 0xc3, 0x73, 0x51, 0x3d,
  0x31, 0xdc, 0x9c, 0xbc, 0xd6, 0x8b, 0x99, 0xbc, 0x92, 0x07, 0x93, 0x3c,
  0x92, 0x9b, 0x21, 0xbd, 0x88, 0x27, 0x5b, 0x3e, 0xbe, 0x64, 0x46, 0x3e,
  0xf8, 0xe4, 0x00, 0x3e, 0xd6, 0xdb, 0x7a, 0x3e, 0xf6, 0x96, 0xf1, 0x3d,
  0xee, 0xcb, 0x12, 0x3e, 0xdd, 0x9f, 0x0f, 0x3e, 0x91, 0x0a, 0xed, 0x3d,
  0x75, 0x58, 0x8f, 0x3e, 0xe2, 0x17, 0x36, 0x3c, 0xc0, 0x1b, 0xff, 0x3d,
  0x5d, 0x36, 0x1a, 0x3e, 0x1c, 0xd6, 0xcc, 0x3c, 0xa1, 0xeb, 0x72, 0xbd,
  0xf1, 0xdc, 0x5e, 0xbd, 0xe6, 0xe3, 0xb4, 0xbb, 0x07, 0xcc, 0xcc, 0x3d,
  0xa6, 0x58, 0xf6, 0x3b, 0x72, 0xde, 0x70, 0x3e, 0x42, 0xcf, 0x85, 0x3e,
  0xfd, 0x48, 0xa6, 0x3d, 0x50, 0x70, 0xb9, 0x3d, 0x3c, 0xa6, 0x29, 0x3d,
  0xd7, 0xf4, 0x09, 0x3e, 0xdd, 0x09, 0xd0, 0x3d, 0xe4, 0x71, 0x95, 0x3d,
  0xcf, 0x4a, 0x7e, 0x3b, 0xaf, 0xda, 0x2a, 0x3d, 0x1c, 0x01, 0x92, 0xbd,
  0xb9, 0xc7, 0x6e, 0x3c, 0x37, 0x80, 0x7e, 0xbd, 0x03, 0xe9, 0xe5, 0x3d,
  0x84, 0xb7, 0x82, 0xba, 0x6e, 0x92, 0xf6, 0x3d, 0xb1, 0xd5, 0x69, 0xbc,
  0xda, 0x1d, 0xbf, 0x3d, 0x90, 0xbb, 0x2f, 0xbd, 0x68, 0x15, 0x81, 0xbd,
  0x0d, 0x4f, 0xbe, 0xbd, 0xcd, 0xd2, 0x12, 0x3e, 0xd3, 0x7c, 0x2a, 0x3e,
  0xe6, 0xe0, 0xb2, 0xbd, 0x3c, 0x48, 0xb9, 0x3d, 0x17, 0xb3, 0xa4, 0xbb,
  0x5c, 0xed, 0xbb, 0x3d, 0xec, 0x28, 0x14, 0xbe, 0x18, 0x96, 0x01, 0xbe,
  0x24, 0xc0, 0xbc, 0xbd, 0x6a, 0xe0, 0x72, 0xbd, 0x48, 0x12, 0xea, 0x3d,
  0xec, 0x40, 0x95, 0x3d, 0xbc, 0x76, 0x5f, 0x3d, 0xcc, 0xff, 0x9b, 0x3d,
  0x5e, 0xf2, 0x0d, 0xbe, 0xed, 0x53, 0x9f, 0x3d, 0xdb, 0x5c, 0x62, 0x3b,
  0x12, 0xa3, 0x70, 0x3b, 0xb8, 0x94, 0xf4, 0xbd, 0x30, 0xcf, 0x00, 0x3d,
  0x88, 0x3c, 0x95, 0xbd, 0x1d, 0x51, 0xf3, 0xbc, 0xdb, 0x0a, 0x9d, 0xbd,
  0x15, 0xfc, 0x91, 0x3d, 0x3f, 0xc8, 0x23, 0xbe, 0x7a, 0xea, 0xbb, 0x3d,
  0x9a, 0x59, 0xb4, 0xbd, 0x2a, 0x9a, 0xbe, 0x3c, 0x86, 0xe0, 0x23, 0x3b,
  0x56, 0x29, 0x00, 0xbe, 0x07, 0x35, 0x05, 0x3c, 0x94, 0x00, 0x45, 0xbc,
  0xf6, 0xfc, 0x07, 0xbe, 0x25, 0x7c, 0xa8, 0xbd, 0xd0, 0x8f, 0xa9, 0x3d,
  0x0a, 0xc4, 0xb1, 0x3d, 0x37, 0xd7, 0xfc, 0xbd, 0x72, 0x9b, 0x75, 0xbd,
  0xb3, 0xd9, 0xcf, 0x3d, 0x8e, 0x1a, 0x9c, 0x3d, 0xf8, 0x13, 0xba, 0x3d,
  0x6b, 0x6c, 0x93, 0x3d, 0x4a, 0x22, 0x81, 0x3d, 0x95, 0xfe, 0x86, 0x3c,
  0x5f, 0xc3, 0x00, 0x3c, 0x96, 0x11, 0x94, 0x3d, 0x6f, 0x5d, 0xfa, 0xbd,
  0x28, 0xe3, 0x24, 0x3d, 0x25, 0xd7, 0xb1, 0xbc, 0x04, 0xdc, 0xbc, 0x3d,
  0x74, 0x8e, 0xf1, 0x3c, 0x76, 0xfa, 0x24, 0xbe, 0x6c, 0x59, 0x5c, 0xbd,
  0x0f, 0xbd, 0xb0, 0x3d, 0x7c, 0xca, 0x10, 0xbd, 0xa1, 0x82, 0x4b, 0x3d,
  0x5a, 0x15, 0xb5, 0x3d, 0x14, 0x5e, 0x47, 0xbc, 0x5f, 0x8b, 0x3d, 0xbd,
  0x21, 0x1c, 0x11, 0xbe, 0xfb, 0x41, 0xa4, 0x3d, 0x40, 0x5a, 0xdf, 0xbd,
  0x78, 0x28, 0xb6, 0x3d, 0xe3, 0xeb, 0x0f, 0xbd, 0xe1, 0x72, 0x40, 0xbd,
  0xd5, 0xd0, 0x93, 0xbd, 0xdf, 0xd0, 0xac, 0xbd, 0x19, 0x9d, 0xf9, 0xbd,
  0x93, 0x61, 0x0e, 0x3c, 0xd6, 0x90, 0xfa, 0x3c, 0xb7, 0x91, 0xc7, 0xbd,
  0x85, 0x04, 0x8f, 0xbd, 0x38, 0x38, 0xa3, 0x3d, 0x70, 0xa2, 0x6e, 0xbc,
  0x39, 0xa9, 0x5b, 0x3d, 0xbb, 0x15, 0x23, 0x3d, 0x69, 0xeb, 0x62, 0x3d,
  0x9a, 0xbc, 0x9d, 0x3b, 0x7b, 0x7a, 0x7b, 0x3d, 0xb1, 0x49, 0x18, 0xbe,
  0x5d, 0x5c, 0xdd, 0x3d, 0x51, 0x23, 0x62, 0xbc, 0xc4, 0xa2, 0x8d, 0x3d,
  0xa0, 0x9f, 0xdd, 0xbd, 0xb7, 0xb8, 0x28, 0x3d, 0x05, 0x25, 0x3c, 0xbe,
  0x3e, 0x4d, 0xe1, 0xbd, 0xf9, 0xe2, 0x25, 0xbe, 0x83, 0xc6, 0xd4, 0xbc,
  0x9d, 0x05, 0x2e, 0xbe, 0x64, 0x35, 0x05, 0x3d, 0xdd, 0xf1, 0xc4, 0x3d,
  0x8f, 0x89, 0xb1, 0xbd, 0xfc, 0x4c, 0xf1, 0x3c, 0x40, 0x5e, 0x82, 0x3d,
  0xb2, 0xc9, 0x11, 0xbe, 0xe0, 0xc1, 0x80, 0xbc, 0xdb, 0x86, 0xc3, 0x3b,
  0x5d, 0x4a, 0x17, 0x3d, 0x95, 0x01, 0x15, 0x3d, 0x10, 0x7d, 0x1e, 0xbb,
  0x33, 0x4c, 0xc1, 0x3b, 0xab, 0xdc, 0x83, 0x3d, 0x6c, 0xf4, 0xe5, 0xbd,
  0xae, 0x0a, 0xe9, 0xbc, 0xe1, 0x46, 0x70, 0x3d, 0x30, 0x9b, 0x02, 0xbe,
  0x12, 0xd9, 0xe1, 0xbd, 0xe7, 0xe4, 0x65, 0x3d, 0xe1, 0x11, 0x68, 0xbd,
  0x0f, 0x54, 0x81, 0x3d, 0x11, 0x83, 0xb2, 0xbd, 0x88, 0x29, 0x14, 0xbd,
  0x55, 0x26, 0x22, 0x3b, 0x50, 0x4c, 0x3d, 0xbc, 0xc6, 0xb7, 0xb9, 0xbd,
  0x93, 0xe4, 0x95, 0x3d, 0x80, 0x0a, 0x98, 0xbb, 0x7e, 0x3d, 0xdf, 0x3d,
  0xe8, 0x0f, 0xeb, 0x3d, 0x72, 0x3c, 0x4f, 0xbd, 0x88, 0xe9, 0x97, 0xbc,
  0x56, 0xa8, 0x02, 0x3e, 0x00, 0xaf, 0xf7, 0x3d, 0xe4, 0x6d, 0x7b, 0x3d,
  0x10, 0x72, 0xf3, 0x3c, 0x60, 0xe4, 0xf8, 0x3d, 0x4c, 0x12, 0x58, 0xbd,
  0x24, 0xb8, 0xa1, 0x3d, 0xa0, 0x3e, 0x5d, 0xbc, 0x40, 0x57, 0xc6, 0xbd,
  0x50, 0xce, 0xf4, 0xbd, 0x68, 0x9d, 0x05, 0x3d, 0xdf, 0x2a, 0x9e, 0xbd,
  0x04, 0x1e, 0x83, 0xbd, 0x1c, 0xa7, 0xde, 0x3d, 0x18, 0x3f, 0x5e, 0x3d,
  0x6e, 0xf9, 0xcc, 0x3d, 0xa0, 0x9f, 0xb0, 0xbb, 0x60, 0xc4, 0x9b, 0x3b,
  0x20, 0x75, 0xcf, 0x3b, 0xb1, 0x9f, 0x8d, 0xbd, 0xe8, 0xbb, 0xe7, 0x3d,
  0x95, 0x79, 0xf9, 0xbd, 0x74, 0x11, 0xec, 0x3d, 0x2a, 0x90, 0xb7, 0x3d,
  0x29, 0x54, 0xaa, 0xbd, 0x54, 0x49, 0x9b, 0xbd, 0x74, 0xc4, 0xca, 0x3d,
  0x12, 0x1f, 0xde, 0x3d, 0x98, 0xb8, 0x2b, 0x3d, 0x32, 0xf7, 0x9d, 0x3d,
  0x0b, 0x12, 0xc5, 0xbd, 0x38, 0x02, 0xc0, 0xbd, 0xde, 0xc6, 0x0a, 0x3e,
  0xc8, 0xce, 0xf4, 0x3d, 0x50, 0xce, 0xe6, 0x3c, 0xc6, 0x06, 0x05, 0x3e,
  0x4a, 0x1c, 0xdf, 0xbd, 0xca, 0x31, 0x65, 0xbd, 0xe0, 0x15, 0x4d, 0x3d,
  0x29, 0x3a, 0x82, 0xbd, 0xf0, 0xe1, 0x1f, 0x3d, 0x04, 0x60, 0xfc, 0x3d,
  0xb1, 0x85, 0xca, 0xbd, 0xc0, 0xb3, 0xd7, 0x3b, 0xe4, 0xee, 0x1a, 0x3d,
  0xcc, 0x64, 0xeb, 0xbd, 0x30, 0x88, 0x25, 0xbc, 0x73, 0x48, 0xa2, 0xbd,
  0xf4, 0x2f, 0x93, 0xbc, 0xf0, 0x72, 0xf5, 0xbd, 0x1c, 0xd4, 0x38, 0x3d,
  0x98, 0xd2, 0xb9, 0x3c, 0x08, 0xfe, 0xc7, 0x3c, 0x12, 0xcc, 0xb1, 0x3d,
  0xce, 0x39, 0xc3, 0xbd, 0x64, 0x98, 0xb6, 0xbd, 0x91, 0xf5, 0xe9, 0xbd,
  0x80, 0x45, 0x44, 0xbd, 0x62, 0x89, 0xfd, 0xbd, 0x99, 0xa4, 0x81, 0xbd,
  0x78, 0xe5, 0x01, 0xbd, 0xfe, 0x52, 0xa0, 0x3d, 0x96, 0x1d, 0xbc, 0x3d,
  0xa7, 0xaa, 0x8c, 0xbd, 0x00, 0x07, 0x18, 0x3c, 0x60, 0x13, 0x90, 0x3b,
  0xa0, 0xc3, 0x02, 0x3e, 0xb8, 0x55, 0xde, 0x3d, 0x26, 0xf4, 0x34, 0xbd,
  0x64, 0x2a, 0x3b, 0x3d, 0x11, 0x4f, 0xe4, 0xbd, 0x3a, 0xae, 0xd2, 0xbd,
  0x1e, 0xc8, 0x70, 0xbd, 0xbe, 0xf4, 0x00, 0xbd, 0x5d, 0xfd, 0x92, 0xbd,
  0x00, 0x59, 0xa9, 0x3c, 0xce, 0x84, 0xc7, 0x3d, 0xb7, 0x90, 0x91, 0xbd,
  0x00, 0xcc, 0x03, 0x39, 0x06, 0x61, 0x98, 0xbd, 0xf0, 0x17, 0xc5, 0xbc,
  0xba, 0x57, 0xcf, 0xbd, 0x58, 0x15, 0xb4, 0x3c, 0x68, 0x50, 0xf0, 0xbd,
  0x58, 0x98, 0x85, 0x3c, 0x06, 0xc1, 0x4f, 0xbd, 0xd8, 0x2c, 0x86, 0x3c,
  0x40, 0xf5, 0xe1, 0x3c, 0x2c, 0x24, 0x68, 0x3d, 0xa0, 0x37, 0xfe, 0x3d,
  0xbc, 0x8b, 0xe3, 0xbd, 0xe1, 0x6a, 0x8e, 0xbd, 0xd8, 0xaf, 0x83, 0xbc,
  0x2c, 0x5e, 0x09, 0x3e, 0x10, 0xe2, 0x31, 0xbd, 0xa0, 0x9f, 0x90, 0x3b,
  0x94, 0x9d, 0xbe, 0x3d, 0x78, 0x53, 0xf2, 0x3c, 0xf7, 0x8b, 0xf7, 0xbd,
  0x9e, 0x9b, 0xe7, 0xbd, 0x1b, 0xc8, 0x97, 0xbd, 0x90, 0x94, 0x42, 0xbd,
  0xa0, 0x21, 0xe8, 0x3c, 0x92, 0x01, 0xbf, 0x3d, 0xd4, 0xfe, 0x0b, 0x3d,
  0xbc, 0xdd, 0xf5, 0x3d, 0xc0, 0x98, 0xcc, 0x3b, 0x88, 0xc9, 0x01, 0x3d,
  0x20, 0x88, 0x3f, 0x3c, 0xc8, 0x23, 0xdb, 0x3d, 0x11, 0x84, 0xb9, 0xbd,
  0xfc, 0xc4, 0x1a, 0xbd, 0x5c, 0x11, 0xba, 0xbd, 0xae, 0x60, 0xb6, 0xbd,
  0xb2, 0x19, 0xf3, 0xbd, 0x28, 0x5d, 0xbe, 0x3d, 0xd4, 0x5f, 0x44, 0xbd,
  0x44, 0xdd, 0xbf, 0x3d, 0xa0, 0x3c, 0xe9, 0x3d, 0x61, 0xd2, 0xc9, 0xbd,
  0x54, 0xee, 0x28, 0x3d, 0x48, 0xae, 0x05, 0x3e, 0xc4, 0x3c, 0xd8, 0xbd,
  0xf2, 0x06, 0x52, 0xbd, 0xe0, 0x2c, 0x8b, 0x3d, 0xe0, 0x81, 0x40, 0xbc,
  0xe3, 0x6c, 0x00, 0xbe, 0xb7, 0xcd, 0xf4, 0xbd, 0x50, 0xf0, 0xa8, 0x3d,
  0x20, 0xfd, 0x6b, 0x3c, 0xc6, 0x62, 0xdf, 0xbd, 0x5c, 0xcc, 0xfb, 0xbd,
  0xb1, 0xe3, 0x87, 0xbd, 0xa6, 0xfd, 0x03, 0xbe, 0x58, 0x03, 0xb0, 0x3c,
  0x18, 0x25, 0x08, 0x3e, 0x00, 0x65, 0x0a, 0xbc, 0x23, 0x4b, 0xce, 0xbd,
  0x0c, 0xb8, 0xb7, 0xbd, 0xd0, 0xa7, 0x0e, 0x3c, 0x6c, 0x38, 0xa5, 0xbd,
  0xa0, 0x30, 0xbd, 0xbb, 0x10, 0xf3, 0xfa, 0x3c, 0xa8, 0x7c, 0x64, 0x3d,
  0x5a, 0x82, 0xc6, 0x3d, 0xad, 0x48, 0xfe, 0xbd, 0x00, 0x07, 0x12, 0x3c,
  0xb8, 0x2f, 0x30, 0x3d, 0x4e, 0x0e, 0xa0, 0x3d, 0x46, 0x33, 0xc6, 0x3d,
  0x74, 0x29, 0x8b, 0x3d, 0x72, 0xce, 0x8a, 0xbd, 0x1c, 0x94, 0x68, 0x3d,
  0x02, 0x7d, 0xc2, 0xbd, 0x68, 0x1a, 0x77, 0xbc, 0x0c, 0xd5, 0xb3, 0xbc,
  0x60, 0x40, 0x72, 0x3d, 0x90, 0x16, 0xb4, 0x3c, 0x3c, 0x1a, 0x87, 0xbd,
  0xa0, 0x9e, 0x2e, 0xbc, 0xd6, 0x79, 0xae, 0xbd, 0x8c, 0x9c, 0x0e, 0x3d,
  0x10, 0xa1, 0x1b, 0xbc, 0x64, 0x18, 0x10, 0x3d, 0xca, 0x96, 0x5f, 0xbd,
  0xd0, 0xd5, 0xa0, 0x3d, 0x90, 0x41, 0xad, 0xbd, 0x12, 0x32, 0x68, 0xbd,
  0x14, 0x93, 0x26, 0x3d, 0x05, 0x0e, 0xd8, 0xbd, 0xc0, 0xd4, 0xa7, 0x3b,
  0xfc, 0x21, 0x9c, 0xbd, 0x00, 0x06, 0x0f, 0xbc, 0x2c, 0x95, 0x71, 0xbd,
  0x04, 0xac, 0x35, 0x3d, 0x40, 0xb4, 0x34, 0x3c, 0xe8, 0x3e, 0x46, 0x3d,
  0x84, 0x08, 0xb6, 0xbc, 0xc8, 0xe3, 0x20, 0x3d, 0x58, 0xef, 0xc2, 0x3c,
  0x1b, 0xc5, 0x0b, 0xbe, 0x54, 0x22, 0x35, 0xbd, 0x40, 0xf3, 0xe3, 0x3d,
  0x04, 0x02, 0x78, 0x3d, 0x84, 0x54, 0x4e, 0x3d, 0x38, 0x64, 0x0a, 0xbe,
  0x0c, 0xe1, 0x06, 0xbd, 0x0f, 0x08, 0x25, 0x3d, 0x06, 0x02, 0x37, 0x3c,
  0x01, 0x23, 0xca, 0x3c, 0xa2, 0x5e, 0xa0, 0x3d, 0xf6, 0x0f, 0xcf, 0x3b,
  0xc2, 0xf8, 0x9f, 0xbd, 0x10, 0x20, 0x01, 0x3d, 0xdb, 0x2f, 0xb5, 0xbd,
  0x1f, 0xc6, 0x1e, 0xbd, 0xfc, 0xd5, 0x5e, 0xbd, 0x64, 0xc0, 0x1e, 0xbe,
  0xf2, 0x67, 0x95, 0xbb, 0xc6, 0x0f, 0xdf, 0xbd, 0x5e, 0x73, 0xf2, 0x3d,
  0x23, 0x77, 0xc1, 0x3d, 0x3b, 0x35, 0x80, 0x3d, 0x77, 0x60, 0xce, 0xbc,
  0xae, 0xf8, 0x08, 0x3d, 0xa5, 0xf7, 0x92, 0x3d, 0xda, 0x52, 0x9c, 0x3d,
  0x28, 0x93, 0xf9, 0x3d, 0xf5, 0x3b, 0x18, 0x3d, 0x3f, 0xf5, 0x29, 0x3b,
  0xdb, 0xe4, 0xae, 0xbd, 0x21, 0xc7, 0xab, 0xbd, 0x65, 0x8c, 0x13, 0x3d,
  0x0e, 0x61, 0x47, 0xbd, 0xf3, 0x0e, 0x0d, 0x3d, 0x1b, 0x4b, 0x65, 0xbe,
  0xf7, 0x97, 0x57, 0xbe, 0xc3, 0x0c, 0x01, 0xbe, 0x7c, 0x00, 0x61, 0xbd,
  0x0e, 0xd4, 0x0a, 0x3e, 0x84, 0x6c, 0x16, 0x3d, 0x16, 0x1c, 0xb8, 0x3d,
  0xce, 0x23, 0x20, 0xbd, 0xb4, 0xb6, 0xc1, 0x3d, 0x13, 0x6c, 0x4f, 0x3e,
  0x1e, 0x75, 0x51, 0xbd, 0x21, 0xea, 0x9f, 0x3d, 0x6e, 0x37, 0x11, 0xbe,
  0x48, 0x9a, 0xb2, 0xbd, 0x55, 0x27, 0x3e, 0xbe, 0xe8, 0x4a, 0x98, 0xbd,
  0xfc, 0xc8, 0x4f, 0xbe, 0xc6, 0x67, 0x3f, 0xbe, 0x0d, 0x57, 0xcf, 0xbb,
  0x69, 0x77, 0xbf, 0xbd, 0x6a, 0xa8, 0x75, 0xbd, 0x8b, 0x04, 0x18, 0xbb,
  0xd8, 0x87, 0x98, 0x3c, 0x0c, 0x43, 0x2f, 0x3e, 0x69, 0xce, 0x3e, 0x3e,
  0xe0, 0x16, 0xa2, 0x3d, 0x21, 0x9a, 0x0a, 0x3e, 0x72, 0xe6, 0xb9, 0xbd,
  0x29, 0x87, 0xd9, 0x3d, 0x0b, 0x2d, 0x18, 0xbe, 0x17, 0xa1, 0x8e, 0xbd,
  0x58, 0xaa, 0x6c, 0xbe, 0xcb, 0xac, 0x03, 0xba, 0xd3, 0x30, 0x2e, 0x3d,
  0x08, 0xdc, 0xa2, 0x3d, 0xfe, 0x39, 0xbc, 0x3d, 0x82, 0x68, 0xf0, 0xbb,
  0xfb, 0x59, 0x2a, 0x3d, 0xa4, 0x2b, 0x48, 0xbc, 0x9e, 0x19, 0xd4, 0x3d,
  0x64, 0x04, 0xb3, 0xbc, 0xd9, 0xfd, 0xa8, 0x3d, 0xb8, 0x1d, 0x3a, 0x3e,
  0xec, 0x77, 0xec, 0x3d, 0x4b, 0x14, 0x80, 0x3d, 0x4d, 0x27, 0x74, 0xbd,
  0xbe, 0x1b, 0x3b, 0xbe, 0x62, 0x81, 0x6a, 0xbe, 0x64, 0xa9, 0x1c, 0x3d,
  0x17, 0x86, 0xbf, 0xbd, 0xd2, 0x6f, 0x89, 0xbd, 0x27, 0x39, 0x51, 0xbd,
  0x60, 0x1c, 0xfc, 0xbd, 0x3c, 0x50, 0x9b, 0xba, 0x6d, 0x61, 0x4b, 0x3d,
  0x0a, 0xeb, 0xea, 0x3d, 0x82, 0x58, 0x00, 0x3e, 0x59, 0x94, 0xd0, 0x3d,
  0xa4, 0x7e, 0x07, 0x3d, 0xc1, 0x08, 0x34, 0xbb, 0xc1, 0xd4, 0x39, 0xbd,
  0xb9, 0xa6, 0x9c, 0xbd, 0x0d, 0x13, 0x0d, 0xbe, 0x5e, 0x2e, 0x27, 0xbc,
  0xea, 0xab, 0x38, 0x3d, 0x2a, 0xb4, 0xaa, 0xbd, 0x87, 0x96, 0x0d, 0xbe,
  0xad, 0xf7, 0x8e, 0x3d, 0xbc, 0x82, 0xf3, 0x3d, 0x6e, 0x9b, 0xf6, 0x3d,
  0x46, 0x8f, 0x6a, 0x3d, 0x34, 0xe9, 0x32, 0xbd, 0x07, 0xd6, 0x46, 0x3d,
  0xd2, 0x07, 0xda, 0x3d, 0x2c, 0xc6, 0xe5, 0xbd, 0x7d, 0x96, 0x0e, 0x3e,
  0xd5, 0x35, 0x93, 0xbc, 0xe7, 0x9f, 0xdf, 0xbd, 0x11, 0x4d, 0x93, 0x3d,
  0x04, 0x1d, 0x04, 0xbe, 0x7a, 0xdd, 0x77, 0x3d, 0x43, 0xc4, 0x96, 0xbc,
  0xaf, 0x4b, 0xf8, 0x3d, 0x35, 0x24, 0x0a, 0x3e, 0x93, 0x0f, 0xe0, 0x39,
  0xd7, 0x4d, 0x8a, 0x3d, 0x84, 0xea, 0x25, 0x3d, 0xbd, 0xba, 0x9f, 0xbd,
  0x8b, 0x11, 0xf3, 0xbc, 0x12, 0x3a, 0xe4, 0x3d, 0x59, 0x78, 0x74, 0x3d,
  0xac, 0xd6, 0xa3, 0xbd, 0x73, 0x67, 0xa0, 0xbd, 0xfc, 0xdf, 0xc3, 0xbd,
  0xbe, 0x0e, 0xea, 0x3d, 0x18, 0xa5, 0x90, 0xbd, 0x1c, 0x68, 0xaf, 0xbc,
  0xbf, 0x23, 0xd9, 0xbd, 0xc7, 0xd6, 0x3c, 0xbd, 0x37, 0xf1, 0x98, 0x3d,
  0x2a, 0x4d, 0xdd, 0x3d, 0x8d, 0x34, 0x77, 0x3d, 0x85, 0x5d, 0xa9, 0x3d,
  0x53, 0x35, 0xf5, 0x3b, 0x83, 0xb7, 0x79, 0xbd, 0x6f, 0x5b, 0xfb, 0xbd,
  0x67, 0x72, 0xcb, 0xbc, 0x98, 0x54, 0xcc, 0xbd, 0xcd, 0xe8, 0xb2, 0x3d,
  0xf1, 0x38, 0xfa, 0xbd, 0xcc, 0x3f, 0x8f, 0x3c, 0xb6, 0x8b, 0x0b, 0x3e,
  0x5d, 0x56, 0x87, 0x3d, 0xa7, 0xb5, 0x28, 0x3d, 0x1b, 0x82, 0x0a, 0x3e,
  0x25, 0x4d, 0x4f, 0x3c, 0xab, 0x6a, 0x4a, 0x3d, 0xdc, 0x4b, 0xdd, 0xbd,
  0x30, 0xe5, 0xe8, 0x3d, 0x47, 0x22, 0x9e, 0x3d, 0xfe, 0xff, 0xdb, 0xbd,
  0xf2, 0xf0, 0x45, 0x3c, 0xc8, 0x18, 0x5d, 0x3d, 0x1f, 0xf6, 0x9f, 0x3d,
  0xed, 0xd1, 0xc5, 0x3d, 0xe5, 0x31, 0x36, 0x3d, 0xaf, 0x43, 0xf7, 0xbd,
  0x78, 0x22, 0xff, 0x3c, 0x72, 0x33, 0x06, 0x3e, 0xce, 0x8f, 0x5b, 0x3d,
  0x30, 0x78, 0x85, 0xbd, 0x5c, 0x0f, 0xe6, 0xbd, 0xcc, 0x00, 0x16, 0x3d,
  0x77, 0xd3, 0xf7, 0x3d, 0x34, 0xf4, 0x99, 0xbd, 0x22, 0x4b, 0x81, 0xbc,
  0x6d, 0x37, 0x05, 0x3e, 0x45, 0xd5, 0x1f, 0x3d, 0x9c, 0x50, 0x16, 0x3d,
  0x7d, 0x55, 0xb2, 0xbd, 0x0c, 0x6d, 0xc2, 0x3c, 0xa6, 0x7a, 0xe9, 0x3c,
  0x6a, 0x4e, 0x01, 0x3e, 0xb7, 0xc6, 0xcc, 0x3d, 0x88, 0x57, 0xec, 0x3c,
  0x87, 0xee, 0xbb, 0x3d, 0xba, 0x80, 0x89, 0x3c, 0xa3, 0xe9, 0x48, 0x3d,
  0xcf, 0xa8, 0x95, 0x3d, 0x8f, 0x5a, 0x07, 0x3e, 0x3b, 0x44, 0xf9, 0x3d,
  0xe6, 0xcf, 0xb4, 0x3d, 0xe8, 0xfc, 0xbb, 0x3d, 0x6b, 0x24, 0xdd, 0xbd,
  0x11, 0x2c, 0x11, 0x3e, 0xa3, 0x79, 0x91, 0xbd, 0xaf, 0x5d, 0x00, 0xbd,
  0x29, 0x2a, 0xd2, 0xbc, 0x7c, 0x09, 0x08, 0xbd, 0x8e, 0xef, 0xd5, 0x3d,
  0xa4, 0x7d, 0xe4, 0x3c, 0x5d, 0xb7, 0x78, 0xbd, 0xcd, 0x22, 0xdd, 0x3d,
  0x7e, 0xdd, 0x13, 0x3e, 0x92, 0x5a, 0xc6, 0xbc, 0xbe, 0x55, 0xb9, 0x3d,
  0xbb, 0x69, 0xd4, 0xbd, 0x21, 0xc4, 0x4c, 0x3d, 0xbf, 0x36, 0xb1, 0xbd,
  0xc1, 0x7a, 0x8a, 0x3c, 0x51, 0x58, 0x64, 0xbd, 0x69, 0xe3, 0x19, 0xbe,
  0x7e, 0x8b, 0x9a, 0x3d, 0xef, 0x74, 0xaa, 0xbc, 0xd9, 0x38, 0x03, 0xbd,
  0x00, 0x09, 0x9f, 0x3d, 0x9a, 0xb3, 0x07, 0x3e, 0xb9, 0x10, 0xb4, 0x3d,
  0x16, 0xb4, 0x70, 0x3c, 0xc5, 0x37, 0xb0, 0xbd, 0x19, 0xd4, 0x5a, 0xbd,
  0x84, 0xd5, 0xa9, 0xbd, 0x20, 0x18, 0x85, 0x3d, 0xb2, 0xa0, 0x63, 0xbd,
  0x3f, 0xa3, 0x00, 0x3e, 0x0a, 0x14, 0x5f, 0x3d, 0xb6, 0x01, 0xc6, 0x3d,
  0x39, 0xae, 0xe8, 0xbd, 0x60, 0xe9, 0xc5, 0xbd, 0xd5, 0x7a, 0xc0, 0x3d,
  0x8d, 0x70, 0xca, 0x3b, 0x79, 0xf0, 0xa1, 0x3c, 0xb0, 0x61, 0x83, 0xbc,
  0x8e, 0xb8, 0x0a, 0xbd, 0x5e, 0xab, 0xe6, 0xbd, 0x1f, 0x60, 0xc2, 0xbd,
  0x8b, 0xa2, 0x01, 0x3e, 0x1d, 0x65, 0x61, 0xbd, 0x8b, 0xa0, 0x10, 0x3d,
  0x05, 0x19, 0xf5, 0x3c, 0xff, 0x91, 0xa8, 0xba, 0x3c, 0xc5, 0xa2, 0x3d,
  0x95, 0x24, 0xd2, 0xbd, 0x06, 0x63, 0x01, 0x3d, 0x60, 0xa3, 0x0b, 0x3d,
  0xd9, 0x2d, 0x74, 0x3d, 0x99, 0x98, 0xab, 0xbd, 0x43, 0xd6, 0x0f, 0x3e,
  0xbc, 0x1c, 0xdd, 0x3d, 0x10, 0x73, 0x2c, 0xbc, 0xc0, 0xee, 0xa2, 0xbd,
  0xfc, 0xff, 0xb6, 0xbc, 0x2a, 0x5e, 0xaf, 0xbd, 0xa8, 0x6c, 0xd9, 0xbd,
  0xad, 0x06, 0x47, 0xbd, 0xb0, 0x1c, 0x9d, 0x3d, 0xe8, 0x45, 0x17, 0x3c,
  0xfa, 0x8c, 0x99, 0x3d, 0x3f, 0xf8, 0xdd, 0xbc, 0x22, 0x0a, 0x41, 0x3e,
  0xbb, 0x4d, 0x0a, 0x3e, 0xe5, 0xbc, 0x20, 0x3e, 0xcd, 0x0e, 0x5e, 0xbd,
  0xe9, 0x05, 0x0c, 0x3e, 0x81, 0xb0, 0x81, 0x3d, 0x4f, 0x87, 0x36, 0x3e,
  0x3e, 0x84, 0x39, 0x3d, 0x45, 0xbe, 0xe6, 0x3d, 0xcb, 0xf6, 0x18, 0x3d,
  0xf3, 0xe6, 0x2a, 0x3d, 0x52, 0x4f, 0x08, 0xbd, 0xb0, 0x4e, 0x46, 0x3d,
  0x6c, 0x50, 0xf3, 0x3d, 0xba, 0x5a, 0x23, 0xbc, 0x08, 0x53, 0x8f, 0x3c,
  0x74, 0x77, 0x29, 0x3c, 0x3a, 0x6a, 0xba, 0xbd, 0x0d, 0xd5, 0x9b, 0x3b,
  0xcc, 0x82, 0x42, 0xbc, 0x14, 0x68, 0xf6, 0xbb, 0xef, 0xab, 0x0e, 0x3e,
  0xd6, 0x25, 0x31, 0xbc, 0x8f, 0xcc, 0x9a, 0x3d, 0xbc, 0x4f, 0x22, 0xbd,
  0xb6, 0xd4, 0xb7, 0xbd, 0x68, 0x26, 0xb8, 0xbd, 0x30, 0x3b, 0xf5, 0xbd,
  0xfd, 0xbe, 0xef, 0xbd, 0x6a, 0xb8, 0xb1, 0xbc, 0xa4, 0x38, 0xac, 0xbd,
  0x69, 0x43, 0x8d, 0x3d, 0xba, 0xad, 0x3b, 0xbd, 0xd3, 0x14, 0x97, 0xbd,
  0x50, 0xf4, 0xd5, 0x3d, 0x6a, 0xf4, 0x06, 0x3d, 0x3b, 0x66, 0x9d, 0x3d,
  0x5b, 0xd0, 0xf0, 0x3d, 0xdb, 0x35, 0xec, 0x3c, 0x30, 0x30, 0x8e, 0xbd,
  0x68, 0x94, 0xe8, 0xbd, 0xfa, 0x75, 0xf7, 0xbd, 0x0d, 0x8e, 0xf5, 0xbb,
  0xeb, 0x34, 0xbd, 0x3d, 0x59, 0x41, 0xdb, 0x3d, 0xe7, 0xf6, 0xc4, 0xbc,
  0x42, 0x02, 0x25, 0xbd, 0x75, 0x5d, 0x6f, 0xbd, 0x3f, 0xbc, 0x8c, 0xbd,
  0x94, 0x26, 0x8c, 0x3c, 0x85, 0xf0, 0x76, 0x3d, 0x0e, 0x60, 0x15, 0xbd,
  0xe7, 0x04, 0x56, 0x3c, 0xc3, 0xd2, 0xe7, 0xbc, 0x9f, 0x62, 0xff, 0x3d,
  0x07, 0x77, 0x4a, 0xbd, 0x70, 0x07, 0x03, 0x3e, 0x33, 0x66, 0xb1, 0x3d,
  0x41, 0x16, 0xf0, 0xbc, 0xb7, 0x85, 0xa9, 0x3d, 0x1e, 0x2b, 0x08, 0x3d,
  0xc4, 0x7a, 0xb0, 0x3c, 0x36, 0x02, 0x6a, 0xbd, 0x0c, 0xc7, 0xe3, 0xbd,
  0x93, 0x22, 0xaf, 0xbd, 0x42, 0x3a, 0xb4, 0xbd, 0xfe, 0xcb, 0x10, 0x3b,
  0x69, 0xc7, 0x94, 0x3c, 0xc9, 0xbc, 0x62, 0x3d, 0x33, 0xce, 0xfc, 0x3d,
  0x58, 0xd6, 0x01, 0xbe, 0xfc, 0xa1, 0x54, 0xbd, 0xfa, 0x94, 0x03, 0x3d,
  0x94, 0xd8, 0x8e, 0x3d, 0xd8, 0xa6, 0xe0, 0x3c, 0x9d, 0x37, 0x2f, 0xbc,
  0x94, 0xa0, 0xe3, 0xbd, 0x1a, 0x6c, 0xc4, 0x3d, 0x2d, 0x25, 0x63, 0xbd,
  0xdb, 0xc3, 0x64, 0xbd, 0xa2, 0x8f, 0xbb, 0x3d, 0x36, 0x24, 0xa6, 0xbd,
  0x9a, 0x51, 0x78, 0xbc, 0xcf, 0x38, 0xe3, 0xbd, 0x29, 0x15, 0x4c, 0x3c,
  0x6c, 0x0f, 0xa6, 0x3d, 0x0e, 0xe9, 0xa5, 0xbd, 0xf7, 0x64, 0x9f, 0x3d,
  0xe3, 0x02, 0x3f, 0xbd, 0xec, 0x37, 0x5e, 0xbd, 0x83, 0x32, 0xe9, 0xbd,
  0x33, 0x26, 0xcb, 0x3c, 0x1d, 0x70, 0xba, 0x3d, 0x2e, 0xce, 0x0e, 0xbd,
  0x41, 0xac, 0x1e, 0xbd, 0x72, 0xdd, 0x71, 0x3d, 0xee, 0xfb, 0x67, 0x3d,
  0x7a, 0x72, 0x59, 0xbd, 0xb9, 0x8a, 0x90, 0xbd, 0xc2, 0xef, 0x5d, 0xbd,
  0x26, 0x6f, 0x2f, 0xbd, 0xbe, 0x03, 0xf1, 0x3d, 0xa2, 0xc8, 0x9a, 0xbc,
  0x74, 0x84, 0xe2, 0x3d, 0xc0, 0x59, 0x7d, 0x3d, 0x9c, 0xba, 0x03, 0x3e,
  0x6f, 0x38, 0x94, 0xbd, 0x3d, 0x34, 0xb3, 0x3b, 0x9b, 0xf3, 0x12, 0xbd,
  0x98, 0x96, 0x0b, 0xbd, 0xde, 0xbe, 0x22, 0xbc, 0x84, 0xa4, 0x0d, 0xbd,
  0x47, 0x88, 0xa0, 0x3d, 0x46, 0xd7, 0x8b, 0xbc, 0xdf, 0x45, 0x84, 0xbc,
  0xe6, 0xf6, 0xb1, 0xbd, 0x26, 0xe9, 0xc9, 0x3d, 0x04, 0x10, 0x77, 0x3d,
  0x2c, 0xf3, 0x05, 0xbe, 0x3d, 0x17, 0x37, 0x3c, 0x22, 0x39, 0x8b, 0xbc,
  0xe0, 0xd7, 0x8a, 0x3b, 0x83, 0x57, 0xe8, 0x3d, 0x98, 0x07, 0xb8, 0xbd,
  0x8a, 0x23, 0x20, 0x3d, 0x99, 0x75, 0x09, 0x3e, 0xb0, 0xd1, 0xe5, 0xbd,
  0x4a, 0x2a, 0xaa, 0xbd, 0x61, 0x88, 0xf7, 0x3d, 0xfe, 0x87, 0xa3, 0x3d,
  0xa8, 0x03, 0x80, 0xbd, 0x23, 0xd2, 0xd0, 0x3d, 0x0e, 0x78, 0x3b, 0xbd,
  0xa2, 0x11, 0xd9, 0xba, 0x7f, 0xb3, 0xf5, 0xbd, 0xd8, 0x3b, 0x0d, 0xbe,
  0xd1, 0xbc, 0xd7, 0xbd, 0x32, 0x9c, 0x94, 0xbd, 0x0b, 0xd7, 0x05, 0xbe,
  0xa0, 0xcd, 0x53, 0x3d, 0x00, 0x01, 0x00, 0xbc, 0x14, 0x45, 0x3e, 0x3d,
  0xf0, 0x01, 0x58, 0xbc, 0x60, 0xf7, 0xaf, 0x3d, 0x86, 0x5c, 0x96, 0x3d,
  0xf8, 0xab, 0xed, 0xbd, 0x94, 0x9c, 0x3d, 0xbd, 0x00, 0xeb, 0x70, 0x3d,
  0xd0, 0x03, 0x04, 0x3e, 0xe0, 0xeb, 0x93, 0x3d, 0xf6, 0xf2, 0x4c, 0xbd,
  0xce, 0x59, 0x48, 0xbd, 0x04, 0xa2, 0x0f, 0x3d, 0xd4, 0xfe, 0x8a, 0x3d,
  0x32, 0xf9, 0x80, 0xbd, 0x84, 0xa1, 0xa7, 0x3d, 0x98, 0x56, 0x4d, 0xbc,
  0x7c, 0x45, 0x42, 0xbd, 0x5e, 0xf2, 0x97, 0x3d, 0xcf, 0x57, 0xda, 0xbd,
  0xe8, 0x67, 0x37, 0xbd, 0x5e, 0xdc, 0xe1, 0xbd, 0x26, 0xe0, 0xf6, 0xbd,
  0x4c, 0x25, 0x3e, 0x3d, 0x98, 0x37, 0x7c, 0x3d, 0x62, 0x3f, 0x32, 0xbd,
  0x6a, 0x73, 0xb5, 0x3d, 0x65, 0x8e, 0xf3, 0xbd, 0xd6, 0xfe, 0x33, 0xbd,
  0xf4, 0x1a, 0x48, 0x3d, 0x70, 0x8a, 0xeb, 0x3c, 0x06, 0xd1, 0xbb, 0xbd,
  0x04, 0xa2, 0xf2, 0xbd, 0x68, 0x1e, 0x55, 0x3d, 0x4c, 0x61, 0xc2, 0xbd,
  0x2a, 0x4b, 0x9a, 0x3d, 0xa8, 0x0c, 0x4b, 0xbc, 0x28, 0xa4, 0xf0, 0xbd,
  0xd8, 0x3d, 0xb6, 0x3d, 0xb8, 0x4b, 0x0a, 0xbe, 0xb8, 0xee, 0xaa, 0x3d,
  0x14, 0x44, 0xe2, 0x3d, 0xb4, 0x7e, 0x9c, 0xbd, 0x3e, 0x9e, 0xc9, 0xbd,
  0x01, 0x42, 0x08, 0xbe, 0x94, 0x44, 0xd5, 0xbc, 0xcf, 0xa0, 0xef, 0xbd,
  0x5e, 0xb3, 0x9b, 0x3d, 0x98, 0x55, 0x05, 0xbe, 0x64, 0x02, 0xa4, 0x3d,
  0x64, 0xe3, 0xe8, 0xbc, 0x2a, 0x26, 0x9c, 0x3d, 0xe0, 0xf1, 0xc3, 0x3d,
  0x7e, 0x08, 0xb2, 0x3d, 0x8e, 0xca, 0x9b, 0xbd, 0x0b, 0x86, 0x8a, 0xbd,
  0xd0, 0xf4, 0x3c, 0x3c, 0xfb, 0x21, 0x8e, 0xbd, 0x50, 0x7b, 0xbe, 0x3d,
  0x24, 0x7c, 0x3f, 0x3d, 0x8f, 0xea, 0xa4, 0xbd, 0x28, 0xb6, 0xfc, 0x3d,
  0x24, 0x29, 0x83, 0x3d, 0x3c, 0x81, 0xea, 0xbd, 0x1e, 0x02, 0xad, 0xbd,
  0x3c, 0x49, 0xb1, 0xbd, 0x48, 0x68, 0x85, 0x3c, 0x74, 0x88, 0x8f, 0xbc,
  0xda, 0x53, 0x93, 0x3d, 0xb0, 0xbb, 0xed, 0x3d, 0x09, 0x03, 0xd1, 0xbd,
  0x68, 0x8b, 0xd9, 0x3d, 0xbc, 0xec, 0x88, 0xbc, 0xb0, 0x26, 0xe2, 0x3c,
  0xd8, 0x30, 0xdf, 0x3c, 0x02, 0x07, 0xaf, 0x3d, 0x80, 0x04, 0xdf, 0x3a,
  0xd8, 0xb5, 0xdc, 0x3c, 0xac, 0xd4, 0x4f, 0x3d, 0x22, 0x3b, 0xdf, 0x3d,
  0xe0, 0x36, 0xaf, 0x3b, 0x18, 0xf7, 0x4d, 0x3d, 0x90, 0xd8, 0x55, 0xbd,
  0xd4, 0x3e, 0x89, 0xbd, 0xac, 0xfe, 0xac, 0x3d, 0xc7, 0x18, 0xc4, 0xbd,
  0x1a, 0x00, 0x80, 0xbd, 0xe0, 0xb6, 0x41, 0x3d, 0x18, 0xe9, 0xb0, 0xbd,
  0x62, 0x02, 0xe0, 0x3d, 0xfe, 0xca, 0xdb, 0x3d, 0x0a, 0x99, 0x0b, 0x3e,
  0xbe, 0xcf, 0x05, 0xbe, 0xf8, 0xc6, 0x8e, 0xbc, 0x50, 0x63, 0xb2, 0x3d,
  0xfd, 0x02, 0xc6, 0xbd, 0x90, 0xcd, 0x52, 0x3d, 0xca, 0xa1, 0xb6, 0x3d,
  0xa0, 0xef, 0xb9, 0xbc, 0x08, 0x43, 0xe8, 0x3d, 0x03, 0x4c, 0x95, 0xbd,
  0xe8, 0x3e, 0xac, 0x3d, 0x78, 0x26, 0xec, 0x3d, 0xb8, 0x79, 0xf9, 0x3d,
  0x08, 0x4c, 0xb0, 0x3d, 0x90, 0xe6, 0xf7, 0xbc, 0x8c, 0x82, 0x79, 0x3d,
  0x54, 0xb1, 0x0e, 0xbd, 0xa2, 0xff, 0x7e, 0xbd, 0x52, 0x0c, 0x70, 0xbd,
  0x8c, 0x73, 0xc6, 0x3d, 0x48, 0xe1, 0x8a, 0xbc, 0xe4, 0x76, 0x39, 0x3d,
  0xb8, 0xf9, 0xac, 0x3c, 0xe0, 0x92, 0x29, 0xbc, 0xc8, 0x5d, 0x90, 0x3c,
  0xd3, 0x08, 0xdb, 0xbd, 0x0a, 0xac, 0xda, 0xbd, 0xd6, 0x4d, 0x21, 0xbd,
  0x60, 0x75, 0xfe, 0x3d, 0x28, 0x68, 0xe1, 0x3c, 0xda, 0x99, 0x07, 0x3e,
  0xfe, 0xab, 0xe4, 0xbd, 0xa1, 0x08, 0x04, 0xbe, 0x8c, 0xf8, 0xc7, 0x3d,
  0xba, 0x62, 0xda, 0xbd, 0x40, 0xcc, 0x47, 0xbc, 0x28, 0x96, 0x27, 0x3d,
  0x4e, 0xe1, 0xcd, 0xbd, 0x2a, 0xf5, 0xbc, 0x3d, 0x10, 0x23, 0x72, 0xbd,
  0x40, 0xd3, 0x2c, 0xbd, 0xa4, 0xe4, 0x17, 0xbd, 0x88, 0xe4, 0x4e, 0xbd,
  0xd7, 0x48, 0x89, 0xbd, 0xa5, 0xb0, 0xe2, 0xbd, 0x48, 0x3c, 0xff, 0x3c,
  0x40, 0x57, 0xc6, 0x3b, 0x00, 0x63, 0xc9, 0x3a, 0xb0, 0x7f, 0x2b, 0x3c,
  0xc6, 0x74, 0x16, 0xbd, 0xed, 0x49, 0x06, 0xbe, 0x18, 0x80, 0x10, 0x3d,
  0xdc, 0xb2, 0x4b, 0x3d, 0x30, 0xaa, 0x28, 0x3c, 0x5a, 0x7c, 0x0b, 0x3e,
  0x98, 0xce, 0xae, 0x3d, 0x48, 0x85, 0x7a, 0x3d, 0xea, 0x26, 0x92, 0xbd,
  0x80, 0xdb, 0x34, 0xbb, 0x0c, 0xdc, 0x49, 0x3d, 0x9e, 0x77, 0x90, 0x3d,
  0xcc, 0xd6, 0x1d, 0x3d, 0xb6, 0xfa, 0x68, 0xbd, 0xa0, 0x5e, 0xb8, 0x3d,
  0x16, 0x51, 0x9f, 0xbd, 0xe8, 0x5f, 0xc3, 0xbd, 0xf6, 0xbf, 0x64, 0xbd,
  0x20, 0xe4, 0xea, 0x3c, 0xd6, 0x0c, 0xac, 0x3d, 0xc4, 0x30, 0xae, 0xbd,
  0xec, 0xac, 0x4c, 0xbd, 0xf0, 0x34, 0xf5, 0x3d, 0xd0, 0x44, 0xb2, 0xbd,
  0x90, 0x9a, 0xe5, 0x3c, 0xc2, 0x6e, 0xac, 0x3d, 0x66, 0x64, 0xc0, 0x3d,
  0xc0, 0x37, 0x88, 0x3d, 0x20, 0x53, 0xbc, 0xbd, 0x18, 0x8c, 0xb7, 0xbd,
  0x30, 0x96, 0xf2, 0xbd, 0xe2, 0x7c, 0x07, 0xbe, 0x52, 0xb9, 0xbd, 0x3d,
  0x58, 0x04, 0xa4, 0x3c, 0x68, 0x55, 0x83, 0xbc, 0x6c, 0x7a, 0x0e, 0xbd,
  0xac, 0x9c, 0xad, 0xbd, 0x68, 0x5d, 0x19, 0x3d, 0x0a, 0x66, 0x1c, 0xbd,
  0x6e, 0x7c, 0x0b, 0xbd, 0xc2, 0xdf, 0x95, 0x3d, 0x60, 0x50, 0xef, 0x3b,
  0xe4, 0x95, 0x76, 0x3d, 0x9e, 0x42, 0xb0, 0xbd, 0x78, 0x0a, 0xb2, 0x3c,
  0x32, 0x82, 0xa5, 0x3d, 0x5c, 0x3f, 0xce, 0xbd, 0xe2, 0xb1, 0x08, 0xbe,
  0xa4, 0xc2, 0xea, 0x3d, 0xbb, 0xca, 0xe0, 0xbd, 0x00, 0x4b, 0xa3, 0x3b,
  0xba, 0x3e, 0x65, 0xbd, 0xfb, 0xa0, 0x88, 0xbd, 0xd7, 0x0e, 0xd6, 0xbd,
  0x08, 0x6f, 0x0d, 0x3d, 0x8a, 0xb6, 0xaf, 0x3d, 0x78, 0x70, 0xeb, 0xbd,
  0x28, 0xe0, 0x80, 0xbd, 0xf3, 0x4d, 0xef, 0xbd, 0x4a, 0xfb, 0xdc, 0xbd,
  0xc8, 0xe9, 0xb3, 0x3c, 0xd0, 0x29, 0x68, 0x3c, 0x90, 0x1a, 0x67, 0xbd,
  0x8c, 0xfc, 0x7a, 0xbd, 0x82, 0x84, 0xd3, 0x3d, 0x38, 0x09, 0xd4, 0x3c,
  0xde, 0x2c, 0xa5, 0xbd, 0x48, 0xa1, 0x44, 0xbd, 0xb8, 0xb9, 0xee, 0x3c,
  0x3e, 0x68, 0xae, 0x3d, 0x40, 0xd7, 0x15, 0xbb, 0x20, 0x20, 0x87, 0x3d,
  0x75, 0x95, 0xce, 0xbd, 0x38, 0xaf, 0xdf, 0x3c, 0xe8, 0xa0, 0x1e, 0x3d,
  0x2e, 0x14, 0x15, 0xbd, 0xbc, 0x9f, 0x52, 0x3d, 0x40, 0x69, 0x76, 0x3b,
  0xf8, 0x61, 0xb1, 0x3d, 0xbd, 0x23, 0x80, 0xbd, 0x58, 0xda, 0x3c, 0xbd,
  0x77, 0x62, 0x0b, 0xbe, 0x5e, 0xec, 0x04, 0x3e, 0xb0, 0x5c, 0xe9, 0x3d,
  0xb8, 0xdd, 0x08, 0x3e, 0xaa, 0xaa, 0x33, 0xbd, 0x70, 0x0b, 0xf1, 0xbd,
  0x3e, 0x35, 0xa0, 0xbd, 0x20, 0x5f, 0x06, 0xbe, 0xce, 0xf0, 0x08, 0x3e,
  0xc8, 0xb7, 0x19, 0x3d, 0x62, 0xe8, 0x16, 0xbd, 0xb8, 0xbe, 0x40, 0x3d,
  0x74, 0x4a, 0xd7, 0xbc, 0xc0, 0xd2, 0x0b, 0x3e, 0x50, 0x19, 0x7f, 0x3d,
  0xd8, 0xaa, 0xa5, 0x3d, 0xc4, 0xdd, 0x16, 0xbd, 0xee, 0xaa, 0x07, 0x3e,
  0xe8, 0xf8, 0x39, 0x3d, 0x0a, 0xa9, 0x6f, 0xbd, 0xe4, 0x1b, 0xee, 0xbd,
  0xf4, 0xd1, 0x05, 0x3d, 0xee, 0x61, 0xa5, 0xbd, 0xfc, 0xe7, 0x07, 0x3d,
  0xa4, 0x37, 0xce, 0xbd, 0x50, 0x55, 0xc0, 0x3d, 0x1e, 0x75, 0x55, 0xbd,
  0x14, 0xfc, 0xe2, 0xbd, 0xa0, 0x88, 0xf7, 0xbc, 0x70, 0xd4, 0x8e, 0x3c,
  0x12, 0x08, 0xea, 0xbd, 0xab, 0x0b, 0x9e, 0xbd, 0xb3, 0x38, 0x08, 0xbe,
  0x00, 0xc8, 0xb7, 0xbd, 0x50, 0x20, 0xf2, 0x3c, 0x1c, 0x73, 0xbd, 0x3d,
  0x34, 0x23, 0xc4, 0xbd, 0x60, 0x33, 0x81, 0x3d, 0xbc, 0x24, 0xeb, 0x3d,
  0xff, 0x55, 0x08, 0xbe, 0x50, 0x67, 0xfa, 0x3c, 0x5e, 0x27, 0x39, 0xbd,
  0xe2, 0x9b, 0x09, 0xbe, 0x70, 0xe2, 0xa5, 0x3d, 0x00, 0xc5, 0x9a, 0x3d,
  0x8e, 0x61, 0x06, 0xbe, 0x10, 0xc6, 0xab, 0xbd, 0x6a, 0x20, 0xa8, 0x3d,
  0xa0, 0xcf, 0xdf, 0x3c, 0xd0, 0x03, 0xe4, 0x3c, 0x0c, 0xd6, 0xd3, 0x3d,
  0x48, 0x8a, 0x47, 0xbd, 0x1a, 0x62, 0x21, 0xbd, 0xe0, 0xf6, 0xf7, 0xbb,
  0x62, 0x36, 0xf9, 0xbd, 0x58, 0x78, 0x2e, 0x3d, 0xce, 0x3a, 0xc6, 0x3d,
  0x5c, 0x14, 0xf1, 0x3d, 0xf0, 0x8d, 0xca, 0x3d, 0xd4, 0x45, 0xe8, 0x3d,
  0xa0, 0xbd, 0x77, 0x3c, 0xf0, 0x6a, 0x87, 0xbd, 0xcc, 0x9b, 0xe9, 0x3d,
  0x17, 0xe5, 0xb6, 0xbd, 0x88, 0x41, 0xf2, 0x3c, 0xcc, 0x4c, 0x04, 0x3d,
  0x5a, 0xe2, 0xc9, 0xbd, 0xa0, 0x66, 0x8b, 0x3d, 0xf8, 0x4f, 0xec, 0x3d,
  0x74, 0xe3, 0x07, 0xbe, 0x60, 0xb9, 0xff, 0x3c, 0x60, 0x35, 0xfd, 0xbb,
  0x00, 0x9f, 0x62, 0x3a, 0x2c, 0xdd, 0xb3, 0xbd, 0x01, 0xe3, 0xff, 0xbd,
  0x8c, 0xc7, 0xd6, 0xbc, 0x6c, 0x7d, 0xc2, 0xbd, 0x1e, 0x76, 0x61, 0xbd,
  0x06, 0xf8, 0xbc, 0x3d, 0x34, 0x08, 0x2e, 0x3d, 0x66, 0x1f, 0xb8, 0x3d,
  0x02, 0x3d, 0xc0, 0x3d, 0xd4, 0x13, 0xb4, 0xbc, 0x2c, 0xe3, 0xde, 0x3d,
  0x50, 0xd3, 0x2f, 0xbc, 0xe0, 0x9c, 0xf1, 0xbc, 0xb4, 0x48, 0xe1, 0x3d,
  0x0c, 0x3e, 0x9d, 0xbd, 0x50, 0x90, 0x2f, 0x3c, 0xcc, 0x76, 0x76, 0xbd,
  0xc0, 0x87, 0x27, 0xbb, 0xec, 0xcf, 0x9e, 0xbd, 0x50, 0x34, 0x0b, 0x3e,
  0xe0, 0x81, 0x1e, 0x3c, 0x4c, 0x95, 0x27, 0x3d, 0x32, 0xb4, 0xca, 0x3d,
  0x56, 0x8f, 0x0b, 0x3e, 0x96, 0x9f, 0xdb, 0xbd, 0x7f, 0xe8, 0xa3, 0xbd,
  0x20, 0x61, 0xc2, 0xbb, 0x50, 0x20, 0x5e, 0x3c, 0x50, 0x1a, 0xe6, 0x3d,
  0xa8, 0x81, 0x97, 0xbd, 0x00, 0x4e, 0xf1, 0x3c, 0xfc, 0x8c, 0xd8, 0x3d,
  0x36, 0x2e, 0xfc, 0xbd, 0x30, 0x66, 0x12, 0xbd, 0x4c, 0xc5, 0x11, 0xbd,
  0x1c, 0x1c, 0x1f, 0x3d, 0x86, 0xca, 0xc7, 0x3d, 0x8e, 0x25, 0xa6, 0x3d,
  0x20, 0x37, 0x2c, 0xbc, 0x10, 0x3a, 0xfb, 0xbd, 0xde, 0x66, 0xd4, 0x3d,
  0x02, 0x03, 0xb7, 0x3d, 0xa3, 0x2e, 0x87, 0xbd, 0x66, 0xb9, 0x03, 0x3e,
  0x58, 0xf3, 0x07, 0xbe, 0xe0, 0xe5, 0x0a, 0x3c, 0x90, 0xea, 0x3f, 0xbc,
  0x70, 0x08, 0x72, 0xbc, 0xf0, 0xae, 0x45, 0x3c, 0x36, 0x64, 0xf6, 0xbd,
  0xc0, 0xe9, 0xf2, 0x3c, 0x20, 0x2f, 0x02, 0x3c, 0x30, 0xd5, 0xed, 0x3c,
  0x10, 0xa5, 0x35, 0xbd, 0x83, 0x6b, 0xb4, 0xbd, 0xd0, 0xd1, 0xc5, 0xbc,
  0x7c, 0xaa, 0x1e, 0x3d, 0x20, 0xe7, 0x7d, 0x3d, 0x7d, 0x67, 0x04, 0xbe,
  0x20, 0x86, 0x6f, 0xbd, 0x24, 0xf0, 0x35, 0xbd, 0xca, 0x85, 0xb3, 0x3d,
  0x2d, 0xce, 0x06, 0xbe, 0xb8, 0xf8, 0xf7, 0x3d, 0x4c, 0xb2, 0xd4, 0x3d,
  0x80, 0x3a, 0x53, 0x3d, 0x52, 0x72, 0xb2, 0xbd, 0xdc, 0x56, 0xce, 0xbd,
  0x80, 0xea, 0x9d, 0xba, 0x28, 0xe6, 0xf0, 0xbd, 0xce, 0xf7, 0x18, 0xbd,
  0x88, 0xf0, 0xcc, 0x3d, 0x23, 0xb8, 0xa8, 0xbd, 0x8f, 0x55, 0xf0, 0xbd,
  0xc6, 0x75, 0xa0, 0xbd, 0x24, 0x6b, 0xdc, 0xbc, 0xf8, 0x03, 0x1b, 0x3d,
  0xde, 0xc4, 0xb9, 0x3d, 0xbc, 0x78, 0x07, 0x3d, 0x60, 0x2f, 0xff, 0x3d,
  0x04, 0x21, 0x6a, 0x3d, 0x18, 0x57, 0x96, 0xbc, 0x00, 0x90, 0xbc, 0xb8,
  0xca, 0x4a, 0xd9, 0xbd, 0x0c, 0xd3, 0xde, 0xbc, 0x6c, 0x49, 0x08, 0x3d,
  0x74, 0x5d, 0x77, 0x3d, 0x81, 0x13, 0xf0, 0xbd, 0xd1, 0x98, 0xe8, 0x3d,
  0x61, 0xba, 0xf8, 0x3c, 0x9f, 0xd6, 0x85, 0xbc, 0x17, 0x15, 0xd5, 0xbb,
  0xd6, 0x47, 0x28, 0xbe, 0xa9, 0x7c, 0x02, 0xbe, 0x2f, 0x48, 0xf4, 0x3d,
  0x28, 0x24, 0xcb, 0x3d, 0xac, 0x5d, 0x97, 0xbd, 0x98, 0x72, 0x32, 0xbd,
  0x3a, 0x22, 0xdb, 0x3d, 0x90, 0x05, 0x46, 0xbd, 0xd9, 0xeb, 0x0a, 0x3c,
  0x39, 0x6f, 0x06, 0x3e, 0xbd, 0xa8, 0xbd, 0xbc, 0x59, 0xff, 0x46, 0x3b,
  0x76, 0x04, 0x0f, 0x3d, 0xc9, 0x8a, 0xd8, 0xbc, 0x59, 0x0b, 0xd9, 0xbd,
  0xa5, 0x1a, 0xb2, 0x3c, 0x54, 0x17, 0xae, 0xbd, 0xb4, 0x3d, 0xea, 0x3d,
  0x42, 0x95, 0x85, 0xb9, 0x0c, 0x18, 0xae, 0x3d, 0x9f, 0x0e, 0xfe, 0x3d,
  0x30, 0xa6, 0xa2, 0x3d, 0xbd, 0x28, 0x8c, 0x3c, 0xb9, 0x31, 0xa9, 0xbc,
  0x2e, 0x7a, 0x31, 0xbd, 0xc4, 0x32, 0xf8, 0xbc, 0xce, 0xec, 0x2c, 0x3d,
  0xbe, 0xa1, 0x4f, 0x3c, 0x16, 0x2c, 0xba, 0x3d, 0xad, 0x82, 0x28, 0x3d,
  0xd1, 0xde, 0xee, 0xbc, 0x5f, 0x52, 0x59, 0xbd, 0x39, 0xf8, 0x6c, 0xbd,
  0xdf, 0x92, 0xd5, 0xbd, 0x1b, 0xdb, 0x8a, 0xbc, 0x38, 0xd2, 0x05, 0xbe,
  0x36, 0xef, 0xa6, 0xbd, 0x9a, 0x17, 0xd4, 0xbd, 0x3c, 0xe7, 0x2c, 0x3e,
  0x57, 0xc0, 0xa5, 0xbb, 0xa7, 0x4e, 0xa0, 0x3c, 0xa2, 0x82, 0xdd, 0x3d,
  0xcd, 0x91, 0x58, 0x3d, 0xce, 0x7f, 0x3f, 0xbd, 0x4c, 0x58, 0xdf, 0x3d,
  0x66, 0xbd, 0x38, 0x3c, 0xd8, 0xe7, 0x02, 0xbd, 0xe7, 0x98, 0x2f, 0x3d,
  0x35, 0xc5, 0x34, 0x3d, 0x4a, 0x39, 0xd4, 0x3c, 0x3e, 0xfe, 0x0f, 0xbc,
  0xed, 0xd6, 0xa2, 0x3d, 0xe4, 0xc4, 0x47, 0xbc, 0x90, 0x93, 0x15, 0x3e,
  0xad, 0xfc, 0xda, 0xbc, 0xfe, 0xec, 0x09, 0x3d, 0x2e, 0x29, 0xff, 0x3b,
  0x31, 0x45, 0xa1, 0x3c, 0x47, 0x01, 0x07, 0xbd, 0xc8, 0xa8, 0x19, 0xbe,
  0x9c, 0xc3, 0xa3, 0xbc, 0xce, 0x7d, 0x4a, 0xbc, 0xaa, 0xbc, 0xec, 0xbd,
  0x7d, 0x20, 0x02, 0xbe, 0x06, 0x0b, 0xa3, 0xbc, 0xc5, 0xd1, 0xf7, 0x3d,
  0x87, 0xc4, 0xdf, 0xbd, 0x3d, 0x39, 0xe5, 0xbc, 0x69, 0x24, 0x0a, 0x3e,
  0x00, 0xa9, 0x5f, 0x3d, 0x59, 0x12, 0x63, 0x3e, 0xb6, 0x47, 0xf9, 0x3c,
  0x2d, 0xd6, 0x21, 0x3e, 0xff, 0x08, 0xc5, 0x3d, 0xe2, 0x65, 0xa1, 0x3c,
  0x49, 0xac, 0xdc, 0x3d, 0xe6, 0xe7, 0x6b, 0xbc, 0x13, 0x4b, 0xa4, 0x3d,
  0x92, 0xaa, 0x79, 0x3c, 0xf3, 0x3f, 0x02, 0xbe, 0x60, 0x70, 0xe7, 0x3c,
  0x69, 0xfe, 0x11, 0xbe, 0x59, 0xad, 0x3d, 0x3c, 0x3f, 0xa6, 0xcd, 0x3d,
  0x3a, 0xa0, 0x12, 0xbd, 0x53, 0x0b, 0x62, 0xbd, 0x2a, 0xe6, 0x36, 0x3d,
  0x73, 0xb5, 0xba, 0xbd, 0x9a, 0x1f, 0xe6, 0x3d, 0x27, 0xb4, 0xcb, 0x3d,
  0x5c, 0x06, 0xec, 0x3d, 0xda, 0x27, 0x77, 0x3d, 0x82, 0x62, 0xe5, 0xbd,
  0x47, 0xce, 0xf1, 0xbd, 0xf8, 0xab, 0x18, 0xbd, 0x15, 0x61, 0xfe, 0x3b,
  0x75, 0x62, 0x31, 0x3c, 0x47, 0x43, 0x03, 0x3d, 0x28, 0x0c, 0xd8, 0xbd,
  0x30, 0x67, 0xf6, 0xbd, 0xdf, 0x20, 0xaa, 0x3a, 0x33, 0x61, 0x52, 0xbd,
  0x3e, 0x4e, 0xb1, 0xbd, 0x03, 0xb6, 0x75, 0xbd, 0x07, 0xee, 0xfd, 0x3c,
  0xd4, 0xfa, 0x85, 0x3d, 0xa9, 0x66, 0xec, 0xbd, 0x16, 0xe6, 0xae, 0xbd,
  0x21, 0x35, 0xee, 0xbd, 0x79, 0x4e, 0x0a, 0xbd, 0xcd, 0x26, 0x59, 0x3d,
  0xfc, 0x33, 0xb6, 0xbd, 0x05, 0xee, 0xfd, 0xbd, 0x09, 0xae, 0x59, 0x3d,
  0xdc, 0xbe, 0x00, 0x3e, 0x0c, 0x54, 0xb8, 0x3d, 0xed, 0x64, 0x08, 0xbe,
  0x09, 0x77, 0xb8, 0x3d, 0xb2, 0x43, 0x9e, 0x3d, 0x54, 0x78, 0x67, 0xbd,
  0x4c, 0x9e, 0xbc, 0xbd, 0x74, 0x01, 0xdb, 0xbc, 0xea, 0x37, 0x28, 0xbc,
  0x8e, 0x20, 0x09, 0x3d, 0x6e, 0x20, 0x92, 0x3d, 0x01, 0x22, 0x17, 0xbe,
  0x36, 0x1c, 0x27, 0x3c, 0xe1, 0xb6, 0x57, 0x3d, 0x04, 0xe7, 0x94, 0xbd,
  0xe0, 0xcc, 0xa8, 0xbd, 0xef, 0xe9, 0xa4, 0x3b, 0xc5, 0x2e, 0x00, 0xbe,
  0xfa, 0xe2, 0x97, 0x3d, 0x5c, 0xe2, 0x2e, 0x3d, 0xe3, 0x2e, 0xef, 0x3c,
  0xb3, 0x81, 0xbd, 0x3d, 0x9f, 0x37, 0x0b, 0x3d, 0x63, 0x1f, 0xff, 0xbd,
  0xfe, 0x6a, 0x87, 0x3d, 0x0a, 0x13, 0x96, 0x3d, 0x72, 0xa3, 0xa9, 0xbd,
  0x45, 0xbd, 0xcf, 0x3d, 0xc7, 0x1a, 0xe3, 0x3c, 0x8c, 0x67, 0x0d, 0x3d,
  0xb3, 0x43, 0xeb, 0xbd, 0x54, 0xd8, 0x96, 0x3d, 0x7d, 0xdd, 0xc4, 0xbd,
  0xd8, 0x57, 0xe5, 0x3d, 0x26, 0xc3, 0xa2, 0x3d, 0x21, 0x90, 0x56, 0xbc,
  0xfe, 0xe9, 0x0f, 0xbe, 0x32, 0x56, 0x47, 0x3d, 0xfb, 0x30, 0x93, 0x3d,
  0xc1, 0xf0, 0x06, 0xbb, 0xfa, 0x21, 0x19, 0x3d, 0x7a, 0x51, 0x4f, 0xbb,
  0x7f, 0x12, 0x1b, 0xbe, 0xd5, 0xc5, 0xcf, 0x3d, 0xf8, 0x44, 0xe6, 0xbd,
  0x39, 0xb6, 0x47, 0x3d, 0xcc, 0x63, 0x8c, 0xbd, 0xe7, 0x51, 0xbc, 0xbd,
  0xe8, 0x7e, 0x72, 0x3d, 0x79, 0xb3, 0xc4, 0x3c, 0x6a, 0xb6, 0x81, 0x3d,
  0xdb, 0x77, 0x3c, 0xbd, 0x19, 0xad, 0x01, 0xbe, 0x16, 0xe8, 0x4f, 0x3d,
  0x4e, 0xb7, 0x82, 0xbd, 0xe5, 0x7b, 0x95, 0xbd, 0xfa, 0x8f, 0x4b, 0xbd,
  0xe9, 0xd8, 0xb1, 0xbd, 0xcf, 0xc7, 0x4e, 0xbd, 0x33, 0x0a, 0x42, 0x3d,
  0xde, 0xd3, 0xb3, 0x3c, 0xac, 0x9e, 0xe9, 0x3d, 0x3d, 0x6a, 0xd3, 0x3d,
  0x67, 0xa5, 0x8a, 0x3d, 0xe6, 0x30, 0xe3, 0x3d, 0xb2, 0x79, 0xf2, 0x3d,
  0xfd, 0x15, 0x9d, 0x3d, 0xd7, 0x3b, 0x22, 0x3d, 0x8c, 0xb5, 0xe4, 0x3d,
  0xfe, 0x25, 0x8d, 0xbd, 0x55, 0xb5, 0x1b, 0x3d, 0x83, 0x15, 0x0e, 0xbe,
  0xd9, 0x9f, 0xe0, 0x3c, 0xf4, 0x25, 0xd8, 0x3d, 0x8e, 0xee, 0x6e, 0xbd,
  0x70, 0xc5, 0xf3, 0xbc, 0x99, 0xd4, 0xe0, 0xbd, 0xe9, 0xcc, 0xc5, 0xbd,
  0xab, 0x94, 0xd3, 0xbd, 0xb0, 0x94, 0xdc, 0xbd, 0xd1, 0xf0, 0x8e, 0x3d,
  0x58, 0xfb, 0xd9, 0x3d, 0xd7, 0x2c, 0x52, 0x3d, 0x18, 0x32, 0x38, 0xbd,
  0x40, 0x1f, 0xe9, 0x3d, 0x8c, 0xf5, 0x97, 0x3c, 0xdc, 0x9d, 0xca, 0xbd,
  0x77, 0x12, 0x90, 0xbd, 0x5b, 0x9f, 0xd2, 0x3d, 0xb0, 0x82, 0xa0, 0xbc,
  0x5e, 0x8e, 0xff, 0xbc, 0x1e, 0x31, 0x97, 0xbd, 0x6f, 0xe6, 0x3c, 0x3d,
  0x9e, 0x3b, 0xda, 0x3c, 0x0e, 0xbb, 0xef, 0x3d, 0x8c, 0xff, 0x0c, 0xbe,
  0xa4, 0xf1, 0xc7, 0x3d, 0xc2, 0x8b, 0xfb, 0xbd, 0x9b, 0x97, 0x89, 0x3d,
  0xae, 0xf9, 0xa2, 0xbd, 0xd0, 0x03, 0x47, 0x3d, 0x77, 0xef, 0x02, 0x3d,
  0xa3, 0x40, 0x01, 0x3d, 0xf0, 0x3d, 0xc9, 0xbd, 0x02, 0x7f, 0xc6, 0xbd,
  0x24, 0x85, 0x3e, 0xbd, 0xac, 0xb4, 0x0a, 0xbe, 0x31, 0xc6, 0xce, 0xbd,
  0xf7, 0xaf, 0x80, 0xbd, 0x54, 0xc3, 0x0a, 0xbe, 0x97, 0x6c, 0x6c, 0xbd,
  0xd3, 0x95, 0xaf, 0xbd, 0x6b, 0xee, 0xa6, 0x3d, 0xd5, 0x50, 0x17, 0xbd,
  0xae, 0x0d, 0xa0, 0x3d, 0xc7, 0xc3, 0x63, 0x3d, 0xb7, 0x79, 0x95, 0x3d,
  0xf7, 0x58, 0xc9, 0x3c, 0xb6, 0x5b, 0x9f, 0x3d, 0x00, 0xe8, 0xf6, 0xba,
  0x6a, 0xc5, 0x5a, 0x3d, 0xe9, 0x7c, 0x92, 0xbc, 0xbe, 0xd2, 0x2e, 0xbd,
  0x88, 0x3c, 0x8a, 0xbd, 0x83, 0x42, 0xf7, 0x3d, 0x11, 0x91, 0xd5, 0x3d,
  0xb6, 0x5a, 0x1b, 0x3c, 0x7e, 0xe4, 0x08, 0xbe, 0xc9, 0xa9, 0xb9, 0x3c,
  0xcd, 0x21, 0x7c, 0xbd, 0xb5, 0xbd, 0x0a, 0xbb, 0x3d, 0x60, 0xc2, 0xbd,
  0x28, 0x8c, 0xe1, 0x3c, 0x1c, 0x99, 0xd3, 0x3d, 0x04, 0x2c, 0xd4, 0x3b,
  0x47, 0xc6, 0x77, 0xbd, 0xe9, 0xf1, 0x8d, 0xbd, 0x0b, 0x83, 0x99, 0x3c,
  0x5a, 0xec, 0xf6, 0x3d, 0x35, 0x55, 0xea, 0xbd, 0x3b, 0xef, 0x89, 0x3d,
  0xaf, 0xce, 0xd0, 0xbd, 0xc8, 0x8e, 0xaa, 0xbc, 0x88, 0x67, 0x38, 0xbd,
  0x46, 0xe3, 0x00, 0x3e, 0x67, 0x33, 0x8c, 0x3d, 0x8b, 0x93, 0x8a, 0x3b,
  0xf3, 0xf5, 0x96, 0xba, 0xa0, 0x14, 0xb8, 0xbc, 0x73, 0x49, 0x5f, 0xbd,
  0x3c, 0x76, 0x07, 0x3d, 0x88, 0x29, 0xa1, 0xbc, 0xb7, 0x13, 0xc8, 0x3d,
  0xc0, 0x27, 0x43, 0xba, 0xb9, 0x98, 0xf8, 0x3d, 0xfe, 0x5f, 0x21, 0xbd,
  0x1f, 0xe2, 0x0d, 0xbe, 0x68, 0xe7, 0xb3, 0x3b, 0x5e, 0x0a, 0x70, 0x3d,
  0x09, 0x04, 0x93, 0xbd, 0x24, 0x49, 0x61, 0x39, 0x7d, 0x3e, 0x13, 0xbe,
  0xa5, 0x74, 0xda, 0xbd, 0xf0, 0x6c, 0xa6, 0xbd, 0x0d, 0x76, 0x2f, 0x3d,
  0xf0, 0x60, 0x76, 0x3d, 0x2f, 0x73, 0x8d, 0xbd, 0x6d, 0xa4, 0x47, 0x3d,
  0x42, 0x11, 0xc1, 0x3b, 0xcb, 0x22, 0x85, 0x3c, 0xc4, 0x13, 0xab, 0xbd,
  0x9a, 0xb2, 0xe8, 0x3d, 0x55, 0xac, 0x0d, 0xbe, 0xad, 0x4e, 0x93, 0xbd,
  0xce, 0x07, 0x29, 0xbd, 0xf9, 0x03, 0x96, 0xbc, 0x8b, 0x4c, 0x11, 0xbe,
  0x54, 0xd2, 0x08, 0xbe, 0x97, 0xbc, 0x1c, 0xbd, 0x39, 0x08, 0xcb, 0xbd,
  0xad, 0xe1, 0x6b, 0x3c, 0xd5, 0xbc, 0x24, 0x3d, 0x12, 0xad, 0xc1, 0xbd,
  0x0d, 0x1d, 0x65, 0x3d, 0xa8, 0x97, 0x98, 0x3d, 0xa5, 0x89, 0x92, 0x3c,
  0x10, 0x79, 0xfc, 0xbc, 0x9b, 0xb6, 0xcb, 0xbd, 0x69, 0x10, 0xb5, 0x3d,
  0xf1, 0xa8, 0x05, 0xbe, 0xaf, 0x7c, 0xa3, 0xbb, 0x68, 0xe6, 0x30, 0x3c,
  0xab, 0x42, 0xf6, 0x3d, 0x70, 0xc3, 0x70, 0x3c, 0x25, 0x27, 0x9d, 0x3c,
  0x19, 0xfb, 0x77, 0xbd, 0x9f, 0x91, 0x44, 0x3d, 0xa9, 0x34, 0xed, 0xbc,
  0x98, 0x53, 0x42, 0xbc, 0xde, 0x70, 0x4a, 0x3d, 0xca, 0x40, 0xda, 0x3d,
  0x30, 0x98, 0xd5, 0xbd, 0xcd, 0x74, 0xbd, 0xbd, 0x15, 0xfe, 0x8f, 0xbd,
  0x9f, 0x69, 0x73, 0x3d, 0x3c, 0x30, 0xea, 0x3c, 0xe3, 0xe2, 0x61, 0xbb,
  0x05, 0xf0, 0x84, 0x3d, 0x68, 0x92, 0x19, 0x3d, 0x88, 0x1b, 0xdf, 0x3d,
  0x14, 0x7c, 0x42, 0xbd, 0x83, 0xff, 0x1a, 0xbc, 0x32, 0x97, 0x00, 0xbe,
  0x0c, 0x08, 0xdf, 0xbc, 0xaf, 0x96, 0xb6, 0xbd, 0xf8, 0xdf, 0xc6, 0x3d,
  0x8f, 0xc9, 0x5f, 0x3b, 0x8b, 0xaa, 0x10, 0xbe, 0xac, 0x5f, 0xb7, 0xbd,
  0x34, 0x31, 0x00, 0x3e, 0x6c, 0x60, 0x04, 0x3e, 0xe3, 0xe5, 0xaa, 0xbb,
  0xcf, 0xcd, 0x05, 0xbb, 0x84, 0x7a, 0x7c, 0xbc, 0xab, 0x3b, 0xa1, 0xbd,
  0x06, 0x6a, 0x47, 0xbc, 0x67, 0x01, 0x8b, 0x3d, 0x59, 0x4f, 0x8c, 0xbc,
  0x2b, 0xa2, 0xe3, 0x3d, 0xd1, 0x25, 0xeb, 0x3d, 0x87, 0x98, 0x79, 0xbd,
  0x74, 0x74, 0xd9, 0xbc, 0x42, 0x03, 0xd3, 0x3d, 0x47, 0x12, 0x5a, 0xbd,
  0x81, 0xc2, 0xbc, 0x3d, 0x79, 0xa6, 0x43, 0xbb, 0x98, 0x3e, 0xcf, 0x3c,
  0xc5, 0x9f, 0x4b, 0x3d, 0xce, 0x3c, 0xb1, 0x3d, 0x64, 0xcb, 0x08, 0xbe,
  0x38, 0x0e, 0x9e, 0xbd, 0xd6, 0xf9, 0x8f, 0xbd, 0x88, 0xd9, 0xa7, 0x3d,
  0xf9, 0x13, 0xc6, 0xbd, 0xa2, 0x18, 0xd9, 0x3d, 0xa8, 0x08, 0xeb, 0xba,
  0x9e, 0x9c, 0x25, 0x3d, 0xe1, 0x43, 0x03, 0xbe, 0x61, 0xa1, 0xe7, 0x3d,
  0x09, 0xa6, 0x4e, 0x3c, 0x1c, 0x5f, 0xda, 0xbc, 0xaa, 0x4a, 0xd6, 0xbd,
  0x5c, 0x19, 0xec, 0xbd, 0xb2, 0x68, 0xde, 0x3d, 0x08, 0x1a, 0x01, 0x3e,
  0xac, 0x09, 0xe4, 0xbd, 0x8b, 0x6b, 0xa4, 0xbd, 0xc1, 0x22, 0xc3, 0x3d,
  0x83, 0xb6, 0x55, 0x3d, 0xb5, 0xbb, 0x95, 0xbc, 0x8c, 0xe7, 0x36, 0x3c,
  0xf5, 0xc5, 0xb2, 0xbb, 0x20, 0xfe, 0x86, 0x3d, 0x8f, 0x1b, 0xf5, 0xbd,
  0xa6, 0xe6, 0xd6, 0xbd, 0xa0, 0x91, 0x82, 0x3d, 0x68, 0x65, 0x9c, 0xbd,
  0x98, 0x63, 0xa2, 0x3c, 0xb8, 0x40, 0xec, 0x3d, 0xd4, 0xf3, 0x94, 0x3d,
  0xeb, 0x84, 0x07, 0xbe, 0x35, 0xca, 0x06, 0xbe, 0xc8, 0x33, 0xb0, 0xbd,
  0x08, 0x9f, 0x2a, 0x3d, 0xb0, 0xd0, 0xfb, 0x3c, 0xa4, 0x63, 0x5f, 0x3d,
  0x5e, 0xde, 0xff, 0xbd, 0x00, 0x9f, 0xbd, 0x3c, 0xbc, 0x45, 0xcb, 0x3d,
  0xd4, 0x2e, 0x2c, 0x3d, 0xb8, 0x28, 0x74, 0xbc, 0x24, 0x52, 0xb3, 0xbc,
  0xdb, 0x12, 0x01, 0xbe, 0x5a, 0xb0, 0xe2, 0xbd, 0x40, 0x0d, 0x2e, 0x3c,
  0x40, 0xb6, 0x62, 0x3b, 0x86, 0x2d, 0xb7, 0x3d, 0xe8, 0xa2, 0x07, 0xbd,
  0x0c, 0x89, 0x12, 0x3d, 0x80, 0xa4, 0xd3, 0x3c, 0x50, 0x2c, 0x07, 0xbc,
  0x40, 0xf1, 0x3a, 0xbc, 0xc0, 0x5f, 0x7b, 0x3d, 0xb6, 0x6f, 0xc6, 0xbd,
  0x84, 0x06, 0x3b, 0x3d, 0xf8, 0x31, 0x2a, 0x3d, 0xce, 0x13, 0x9d, 0x3d,
  0x84, 0xdc, 0xb6, 0xbd, 0x63, 0x2a, 0x81, 0xbd, 0xb0, 0x3c, 0xd7, 0x3c,
  0x84, 0x64, 0xc0, 0xbd, 0x36, 0x2e, 0x17, 0xbd, 0x24, 0xc9, 0xf7, 0xbd,
  0xbc, 0xff, 0xe7, 0xbd, 0x3a, 0x90, 0x86, 0x3d, 0x87, 0xc2, 0xd6, 0xbd,
  0xa9, 0xbe, 0x01, 0xbe, 0xac, 0x7e, 0x72, 0x3d, 0xaf, 0x8b, 0xe7, 0xbd,
  0x6c, 0x25, 0x83, 0x3d, 0x0c, 0xdc, 0xda, 0x3d, 0xc0, 0x18, 0x78, 0xbb,
  0x9e, 0x35, 0xdb, 0xbd, 0x94, 0x83, 0xfe, 0xbc, 0xbc, 0xc1, 0xca, 0xbd,
  0xcc, 0x4e, 0x03, 0x3d, 0xa6, 0x76, 0x6f, 0xbd, 0xac, 0x3a, 0xa4, 0x3d,
  0xf8, 0xbd, 0x8d, 0x3d, 0xcf, 0xb2, 0xb5, 0xbd, 0xcc, 0x4a, 0xfc, 0xbd,
  0xec, 0x66, 0xc9, 0xbd, 0xeb, 0x90, 0xe1, 0xbd, 0x10, 0x21, 0x5d, 0x3c,
  0xd0, 0xca, 0xbf, 0x3c, 0x5e, 0xed, 0x8f, 0x3d, 0xd0, 0x75, 0xaa, 0x3d,
  0x94, 0xe0, 0x6e, 0x3d, 0x30, 0x1d, 0x3d, 0x3c, 0x4c, 0xf3, 0xa7, 0x3d,
  0xc0, 0x0b, 0x3e, 0xbc, 0x80, 0x55, 0x57, 0x3d, 0xc0, 0xd5, 0x33, 0xbb,
  0x78, 0x18, 0xb1, 0x3d, 0xe4, 0x83, 0xd9, 0x3d, 0x6c, 0x24, 0xd8, 0x3d,
  0x44, 0xed, 0xaa, 0x3d, 0xa0, 0xa9, 0x2e, 0x3c, 0xe0, 0x77, 0x53, 0x3d,
  0xb8, 0x28, 0x71, 0x3d, 0xcc, 0x49, 0x10, 0xbd, 0xfe, 0xb1, 0x9b, 0xbd,
  0x40, 0x39, 0xcc, 0xbb, 0xd1, 0x92, 0xee, 0xbd, 0x16, 0x32, 0xcd, 0xbd,
  0x40, 0x6d, 0x04, 0xbb, 0xac, 0xe0, 0x9f, 0x3d, 0x20, 0x51, 0x85, 0x3b,
  0xe0, 0xe3, 0x97, 0xbb, 0x74, 0x1d, 0x08, 0xbe, 0xc0, 0xc8, 0x11, 0xbc,
  0x84, 0x47, 0x2f, 0x3d, 0x08, 0x7d, 0xbb, 0xbd, 0xc6, 0x68, 0x08, 0xbd,
  0xc0, 0xac, 0x54, 0x3c, 0xd5, 0x7a, 0x8c, 0xbd, 0x31, 0x31, 0xa8, 0xbd,
  0x64, 0x5a, 0x7a, 0xbd, 0x2b, 0xb8, 0xe3, 0xbd, 0x5d, 0x73, 0x91, 0xbd,
  0xe0, 0x5c, 0x76, 0xbc, 0x66, 0xdc, 0xca, 0x3d, 0xa8, 0x19, 0xb9, 0x3d,
  0x20, 0x31, 0x86, 0xbb, 0xb0, 0x1d, 0x55, 0x3c, 0xa8, 0xa0, 0x4d, 0x3d,
  0x80, 0x42, 0xa1, 0x3d, 0x90, 0x9a, 0x13, 0x3d, 0x68, 0x4c, 0xd2, 0xbd,
  0x0e, 0xf8, 0x8e, 0x3d, 0xd8, 0xa0, 0xed, 0x3d, 0xd0, 0xbd, 0x84, 0x3c,
  0x46, 0xeb, 0x89, 0x3d, 0xb8, 0x8a, 0x38, 0xbd, 0x80, 0xe9, 0xd9, 0x3a,
  0xb3, 0xda, 0xf9, 0xbd, 0xe0, 0x2e, 0xb4, 0x3c, 0xcc, 0xaa, 0x77, 0x3d,
  0xc2, 0x7e, 0x14, 0xbd, 0xd6, 0x46, 0xfd, 0xbd, 0xf2, 0x94, 0x7c, 0xbd,
  0xe6, 0xef, 0x63, 0xbd, 0x1e, 0xbc, 0x2f, 0xbd, 0x62, 0xac, 0xa1, 0x3d,
  0xac, 0xaf, 0xcd, 0x3d, 0xb0, 0x24, 0x68, 0xbd, 0xe6, 0xd6, 0xda, 0x3d,
  0x36, 0x4e, 0xab, 0xbd, 0x88, 0x8a, 0x0b, 0x3d, 0xe0, 0x51, 0xc4, 0xbb,
  0xcc, 0x81, 0x9d, 0x3d, 0xbc, 0xd5, 0x82, 0x3d, 0xcb, 0x3f, 0xac, 0xbd,
  0xd4, 0x72, 0xf7, 0x3d, 0x48, 0xc6, 0x9f, 0x3d, 0x26, 0x34, 0xaf, 0x3d,
  0x68, 0x5b, 0xb0, 0x3c, 0x84, 0xb3, 0x39, 0xbd, 0xb8, 0x62, 0x42, 0x3d,
  0x1f, 0x7d, 0xeb, 0xbd, 0x72, 0xf2, 0xbc, 0x3d, 0xba, 0x30, 0x06, 0x3e,
  0x96, 0x79, 0x25, 0xbd, 0xe0, 0x9b, 0x46, 0x3c, 0x7c, 0x90, 0xfb, 0x3d,
  0xfa, 0xbe, 0xdf, 0x3d, 0x08, 0x08, 0x9d, 0x3c, 0x94, 0xb9, 0xef, 0xbd,
  0x58, 0x6f, 0xd7, 0xbc, 0x18, 0xab, 0x4a, 0x3d, 0xb7, 0x09, 0x09, 0xbe,
  0x50, 0xb0, 0x48, 0x3d, 0x20, 0xd8, 0xd5, 0xbc, 0xd6, 0xe9, 0xd5, 0x3d,
  0x00, 0x84, 0x2f, 0x39, 0x3e, 0xc9, 0xc2, 0x3d, 0x28, 0x2b, 0x94, 0xbd,
  0x8e, 0xa7, 0x8a, 0x3d, 0x3c, 0xf3, 0x08, 0xbe, 0x98, 0x89, 0xe5, 0xbd,
  0x28, 0x24, 0xff, 0xbd, 0xf6, 0x34, 0x12, 0xbd, 0xb0, 0x40, 0xb6, 0xbd,
  0x26, 0x21, 0xb9, 0x3d, 0xa0, 0x78, 0xfe, 0x3d, 0x51, 0x10, 0x8a, 0xbd,
  0x24, 0x5d, 0x78, 0xbd, 0xd4, 0x2e, 0xf9, 0x3d, 0xf0, 0xc0, 0x06, 0xbd,
  0xc5, 0xb7, 0xad, 0xbd, 0x35, 0xaa, 0x9b, 0xbd, 0x9c, 0xcc, 0xae, 0xbd,
  0x0a, 0xe6, 0xb9, 0x3d, 0x80, 0x98, 0x02, 0x3d, 0xd0, 0x2a, 0x9c, 0x3c,
  0x00, 0x1d, 0xd3, 0xbd, 0xc0, 0x1b, 0x2e, 0x3c, 0xc9, 0x4c, 0x82, 0xbd,
  0x0a, 0x8d, 0xe2, 0x3d, 0xf8, 0x22, 0xb9, 0x3d, 0xc8, 0xc5, 0x19, 0x3d,
  0x80, 0x60, 0x50, 0x3c, 0x63, 0x88, 0x09, 0xbe, 0x38, 0xc7, 0x09, 0x3e,
  0xe2, 0x81, 0x66, 0xbd, 0x22, 0x43, 0x8a, 0x3d, 0xb8, 0x58, 0x75, 0xbc,
  0xdc, 0xce, 0x18, 0x3d, 0x51, 0x8d, 0xb4, 0xbd, 0xba, 0xa2, 0xcb, 0x3d,
  0xe3, 0x83, 0x8a, 0xbd, 0x60, 0x9d, 0xf0, 0x3b, 0xec, 0xb3, 0xbb, 0xbd,
  0xc8, 0x33, 0xe9, 0xbc, 0x78, 0x70, 0x21, 0x3d, 0x98, 0xe9, 0xe2, 0x3c,
  0xb0, 0x5f, 0x6a, 0xbd, 0xe6, 0x85, 0x16, 0xbe, 0xe6, 0x8b, 0xee, 0x3c,
  0x48, 0x12, 0x9d, 0x3d, 0xcf, 0xc1, 0x0e, 0xbe, 0x18, 0x79, 0x2c, 0x3c,
  0x07, 0x18, 0xa7, 0xbd, 0xc6, 0xea, 0xdc, 0x3d, 0xbe, 0x23, 0x8c, 0xbd,
  0x09, 0x36, 0x3c, 0xbd, 0x87, 0xdb, 0xb7, 0x3d, 0x91, 0xe3, 0x83, 0x3e,
  0xfa, 0x2f, 0x32, 0x3e, 0xab, 0x23, 0x2f, 0x3e, 0xd6, 0x78, 0xed, 0xbc,
  0xd1, 0x19, 0x56, 0xbd, 0x9e, 0x0d, 0x04, 0x3d, 0xb7, 0x47, 0xda, 0xbd,
  0x99, 0xec, 0x0a, 0x3e, 0x14, 0x5d, 0x85, 0xbd, 0x93, 0x58, 0xc8, 0x3d,
  0x2d, 0x05, 0x2b, 0xbe, 0xaf, 0x9a, 0x0c, 0xbe, 0xe9, 0x86, 0x70, 0x3d,
  0x0e, 0x0f, 0x4d, 0x3d, 0xc5, 0xb7, 0x16, 0x3d, 0x09, 0x77, 0x84, 0x3c,
  0x83, 0x31, 0x25, 0x3e, 0x1f, 0x4a, 0x68, 0x3c, 0x59, 0x5a, 0xc5, 0x3c,
  0x68, 0xf4, 0x2e, 0x3e, 0x82, 0x79, 0x68, 0xbd, 0x26, 0xd5, 0xc2, 0xbc,
  0x1b, 0xbc, 0x1d, 0x3e, 0xe7, 0x85, 0x5e, 0xbd, 0x4d, 0xb0, 0xba, 0xbb,
  0x49, 0xef, 0x8e, 0xbd, 0x8b, 0xb0, 0x84, 0xbd, 0xbe, 0x0a, 0x67, 0xbe,
  0x64, 0x66, 0x41, 0xbe, 0x6a, 0xdd, 0x43, 0xbe, 0xba, 0xc3, 0x6d, 0xbe,
  0xd5, 0xc6, 0xf0, 0xbd, 0x0a, 0xa4, 0x46, 0xbd, 0x8d, 0x5e, 0x48, 0xbd,
  0x35, 0xba, 0x67, 0xbe, 0x5d, 0xfc, 0x8d, 0xbd, 0xd5, 0x22, 0x62, 0xbd,
  0x4d, 0x41, 0xc6, 0xbd, 0x3b, 0xfe, 0x0e, 0x3e, 0xfa, 0xe4, 0x13, 0xbd,
  0x5b, 0x06, 0xc4, 0xbd, 0x3e, 0x5e, 0x10, 0xbc, 0x86, 0xa5, 0x3b, 0xbb,
  0xf1, 0x4b, 0x5d, 0xbe, 0x07, 0x05, 0x26, 0xbe, 0x90, 0x54, 0x78, 0xbe,
  0x91, 0xa4, 0x54, 0xbe, 0x0d, 0xa3, 0x30, 0xbe, 0x7d, 0x93, 0x11, 0xbe,
  0x96, 0x4c, 0x74, 0xbd, 0xe3, 0x64, 0x4c, 0xbb, 0x7c, 0x68, 0x4a, 0xbe,
  0x6e, 0x2b, 0xbe, 0xbd, 0x2d, 0x4d, 0x20, 0xbe, 0x15, 0x7b, 0x06, 0xbd,
  0x6b, 0x6e, 0x14, 0x3e, 0xb6, 0xe0, 0x09, 0x3e, 0xdd, 0x55, 0x8f, 0xbd,
  0x70, 0x88, 0x3e, 0x3d, 0x14, 0x0d, 0xd5, 0xbd, 0x0c, 0x0a, 0xab, 0xbc,
  0xe8, 0x63, 0xf9, 0xbc, 0x15, 0xe6, 0x51, 0x3d, 0x75, 0xd8, 0x19, 0x3e,
  0x9f, 0x5d, 0x8d, 0x3d, 0x6b, 0x3b, 0x26, 0x3e, 0x83, 0x9c, 0x98, 0xbd,
  0xd2, 0x45, 0xb1, 0xb9, 0xea, 0xec, 0x06, 0xbe, 0x0b, 0xaa, 0x12, 0xbd,
  0xe4, 0xd2, 0x0d, 0xbd, 0xcd, 0x85, 0xd4, 0xbd, 0x02, 0xc4, 0xac, 0xbd,
  0xf3, 0x58, 0x24, 0x3d, 0x60, 0xf9, 0xfd, 0x3d, 0x08, 0x27, 0xed, 0xbd,
  0x1e, 0xaf, 0x19, 0x3e, 0x12, 0x7b, 0x34, 0xbd, 0xaf, 0xb2, 0x0e, 0xbd,
  0x6e, 0xd5, 0x77, 0xbd, 0x17, 0x36, 0x47, 0x3d, 0xd7, 0x6b, 0xb1, 0x3d,
  0x74, 0xac, 0xc0, 0xbc, 0xef, 0x0e, 0x1c, 0xbd, 0x44, 0x29, 0x91, 0x3d,
  0xc4, 0xd6, 0xa1, 0xba, 0x98, 0x8c, 0x38, 0x3d, 0x51, 0x7e, 0xa1, 0xbd,
  0x30, 0xe2, 0xc8, 0xbc, 0xa4, 0xba, 0xe4, 0x3d, 0x7c, 0xe2, 0x60, 0xbd,
  0xbf, 0x56, 0xab, 0x3c, 0x4c, 0xa5, 0x74, 0x3d, 0x6a, 0xae, 0x12, 0x3e,
  0xe0, 0x9b, 0x21, 0x3d, 0x82, 0x30, 0xb7, 0xbd, 0x8e, 0x62, 0x83, 0x3d,
  0xd7, 0x7a, 0x26, 0xbd, 0xcb, 0x7a, 0xf0, 0x3d, 0x21, 0x3d, 0x8e, 0x3d,
  0xc1, 0x85, 0x81, 0x3d, 0xb2, 0x7f, 0x7d, 0x3b, 0x44, 0x61, 0xc3, 0x3b,
  0xb2, 0x2d, 0x93, 0xbd, 0xb0, 0x18, 0x11, 0x3e, 0xe7, 0xd6, 0xe0, 0x3d,
  0x9e, 0x06, 0xc8, 0x3d, 0x7b, 0x21, 0xe6, 0x3d, 0x82, 0x3e, 0xa8, 0x3d,
  0x13, 0x06, 0x48, 0x3d, 0xa6, 0x41, 0xe1, 0x3d, 0x18, 0xb6, 0x12, 0x3e,
  0xf6, 0xf7, 0x1a, 0x3e, 0x52, 0xb5, 0xc7, 0x3d, 0x1b, 0xdc, 0xa3, 0xbd,
  0xf0, 0x7c, 0x94, 0xbc, 0x0a, 0x7d, 0x64, 0xbc, 0x49, 0xf5, 0x94, 0x3c,
  0x24, 0xbf, 0xbd, 0x3d, 0xcb, 0x5a, 0xbd, 0xbd, 0xfa, 0xac, 0xb9, 0xbb,
  0x5e, 0x2b, 0xa3, 0xbd, 0x0c, 0x15, 0x29, 0x3e, 0xe7, 0x55, 0xca, 0x3d,
  0x5b, 0x6f, 0xd2, 0x3d, 0x13, 0x57, 0x14, 0x3e, 0xb0, 0x87, 0x72, 0xbd,
  0xb9, 0x44, 0x32, 0xbd, 0xf0, 0xc9, 0x93, 0xbd, 0x7d, 0x55, 0x60, 0xbc,
  0xc8, 0x62, 0xc0, 0xbc, 0x8c, 0x89, 0x03, 0x3e, 0x61, 0x25, 0x3d, 0xbc,
  0xa5, 0x9d, 0x3e, 0x3d, 0x76, 0xa3, 0x86, 0xbd, 0x63, 0xee, 0x1d, 0x3e,
  0xcb, 0x13, 0xb1, 0x3d, 0x9c, 0x3f, 0xc2, 0x3d, 0xdb, 0x2a, 0x12, 0xbc,
  0x38, 0xb8, 0x0e, 0x3d, 0xb6, 0xea, 0x03, 0x3e, 0x82, 0x20, 0xc9, 0x3c,
  0xfa, 0xd5, 0x4c, 0xbd, 0xe6, 0x43, 0x90, 0x3b, 0x22, 0xa9, 0xbe, 0xbc,
  0xb7, 0x0d, 0x0d, 0xbd, 0xa1, 0x4f, 0xc2, 0x38, 0x70, 0xab, 0x99, 0xbd,
  0x39, 0x2f, 0x97, 0xbd, 0xaa, 0x39, 0xaa, 0x3d, 0xca, 0x67, 0x50, 0x3e,
  0x02, 0x60, 0x43, 0x3e, 0x89, 0x3c, 0x3e, 0x3e, 0x84, 0x51, 0x69, 0x3b,
  0x0a, 0xb8, 0x2a, 0x3e, 0x7a, 0xce, 0x42, 0x3c, 0x6b, 0x5b, 0xca, 0xbd,
  0x84, 0x6b, 0x61, 0xbd, 0x93, 0x9a, 0xae, 0xbd, 0x39, 0x1e, 0x29, 0x3d,
  0xb2, 0x8c, 0xdb, 0x3d, 0x66, 0xf3, 0xf2, 0x3d, 0xe2, 0x19, 0x94, 0x3b,
  0x91, 0x6a, 0x75, 0x3b, 0x10, 0xdb, 0xc0, 0x3a, 0xfb, 0x50, 0x9f, 0x3d,
  0xc5, 0x99, 0x18, 0x3e, 0xc7, 0x1c, 0x57, 0xbd, 0x24, 0xa0, 0xa5, 0xbc,
  0x81, 0xc4, 0x44, 0x3e, 0x1f, 0x72, 0x80, 0x3a, 0x9f, 0xeb, 0x92, 0xbd,
  0x24, 0xb0, 0x40, 0xbc, 0x95, 0x66, 0xa8, 0x3d, 0xd5, 0xf0, 0xca, 0x3d,
  0x42, 0xaf, 0x01, 0xbd, 0xa4, 0x43, 0x13, 0x3d, 0xf2, 0x20, 0x14, 0x3e,
  0xac, 0xae, 0x9f, 0xb9, 0xc9, 0x0f, 0xff, 0x3d, 0x21, 0x5b, 0x85, 0x3d,
  0x99, 0x59, 0x28, 0x3d, 0x21, 0x50, 0x74, 0xbd, 0x7e, 0xb2, 0x1d, 0xbe,
  0xc6, 0xf9, 0x43, 0xbd, 0xa6, 0x42, 0x08, 0xbe, 0x08, 0x95, 0xa4, 0xbd,
  0x03, 0x02, 0xd9, 0xbd, 0xdb, 0x2c, 0xd1, 0x3d, 0xd2, 0x42, 0xb5, 0xbd,
  0xd8, 0x07, 0x30, 0x3e, 0xea, 0xe0, 0x51, 0x3e, 0x05, 0x00, 0xd8, 0x3d,
  0x8e, 0x11, 0x8a, 0x3d, 0x04, 0x24, 0x11, 0x3e, 0xa9, 0x5e, 0x96, 0xbc,
  0x83, 0xf5, 0x0d, 0xbd, 0xf7, 0x1e, 0x14, 0x3d, 0x9c, 0x0c, 0x03, 0xbe,
  0xfa, 0x58, 0xa7, 0x3d, 0x8e, 0x8d, 0xe2, 0x3d, 0x6a, 0xb6, 0xd2, 0x3d,
  0x7b, 0x08, 0x59, 0xbe, 0xce, 0x5d, 0x05, 0xbe, 0xb1, 0xdf, 0x0f, 0xbe,
  0x4c, 0x64, 0xa0, 0xbd, 0xdc, 0xc5, 0x6a, 0xbd, 0x42, 0x29, 0xc1, 0x3d,
  0x94, 0x96, 0xe5, 0xbd, 0xe7, 0xce, 0x2c, 0x3c, 0x53, 0xd2, 0x79, 0xbc,
  0x47, 0x79, 0x71, 0xbd, 0xfa, 0xfc, 0xe1, 0x3d, 0x25, 0x1d, 0xd3, 0xbd,
  0x22, 0x44, 0xff, 0x3d, 0x60, 0xc6, 0x0a, 0x3e, 0xbb, 0xdf, 0x8f, 0x3d,
  0x6c, 0x64, 0xc4, 0xbd, 0xcc, 0x66, 0x1b, 0xbd, 0x23, 0x43, 0x55, 0xbd,
  0x1f, 0x01, 0x19, 0xbe, 0x9e, 0xf9, 0x20, 0xbd, 0x1f, 0x46, 0x8d, 0xbc,
  0x78, 0x29, 0xb4, 0x3c, 0x1d, 0x6c, 0x6a, 0xbd, 0xbe, 0x79, 0x34, 0xbe,
  0xd2, 0xe4, 0x84, 0xbc, 0xa4, 0xf5, 0x83, 0xbe, 0x98, 0x2e, 0x22, 0xbe,
  0x73, 0xf5, 0x25, 0x3d, 0x2c, 0xf3, 0x52, 0x3d, 0x40, 0x70, 0x48, 0xbd,
  0xa2, 0xf0, 0x4c, 0x3d, 0xaf, 0x3d, 0xd1, 0x3d, 0xa5, 0xef, 0xe0, 0xbd,
  0x39, 0x07, 0x02, 0xbd, 0xa5, 0x91, 0x07, 0xbe, 0x4a, 0x25, 0x8c, 0xbd,
  0xf1, 0xeb, 0x03, 0xbd, 0xa5, 0x82, 0x0a, 0x3d, 0x78, 0xcc, 0x3b, 0xbe,
  0x18, 0xc6, 0x7a, 0x3c, 0xc3, 0x22, 0xaf, 0xbd, 0x37, 0x09, 0x9e, 0xbd,
  0x75, 0xdb, 0xc3, 0xbd, 0xda, 0xc4, 0x27, 0xbe, 0x30, 0x00, 0xa0, 0xbd,
  0x0c, 0x06, 0xdd, 0x3d, 0x8b, 0xb4, 0x2f, 0xbd, 0x59, 0x15, 0xa6, 0xbd,
  0xf0, 0x5b, 0x6b, 0x3d, 0x61, 0x26, 0x23, 0xbe, 0x4e, 0x8d, 0x1b, 0x3c,
  0xf8, 0x1d, 0x08, 0xbd, 0x4c, 0x7c, 0xa9, 0xbd, 0xa2, 0xa0, 0xd4, 0xbb,
  0x05, 0xdf, 0x61, 0x3d, 0x68, 0x88, 0xa2, 0x3d, 0xec, 0x48, 0x6f, 0x3c,
  0x9e, 0x58, 0xb8, 0x3d, 0xea, 0x7e, 0x18, 0xbc, 0x41, 0xb8, 0x3f, 0xbd,
  0xfd, 0xd9, 0x17, 0x3e, 0x12, 0x1a, 0xa0, 0xbd, 0x98, 0xcb, 0x51, 0x3d,
  0xa4, 0xd4, 0xdd, 0x38, 0x39, 0x03, 0x13, 0x3e, 0xa9, 0x96, 0xba, 0x3d,
  0x9f, 0x65, 0xf8, 0xbd, 0xb1, 0x6a, 0x13, 0x3e, 0x2b, 0xf4, 0xe7, 0x3d,
  0x06, 0x71, 0xc7, 0x3d, 0xd9, 0x5d, 0xce, 0x3d, 0xab, 0xb1, 0x92, 0x3d,
  0x15, 0x8f, 0x5d, 0xbd, 0x83, 0xfc, 0x2a, 0x3c, 0xee, 0x4b, 0xa0, 0xbd,
  0x25, 0x13, 0xec, 0xbd, 0xd6, 0x9e, 0xc6, 0x3d, 0x2d, 0x89, 0x4b, 0xbd,
  0x04, 0xf0, 0xaa, 0x3d, 0xa7, 0x38, 0x8b, 0x3c, 0x04, 0x4f, 0xa3, 0x3d,
  0xe5, 0xa4, 0x11, 0x3e, 0xa5, 0x67, 0x05, 0x3e, 0x7d, 0x6d, 0x0c, 0x3d,
  0x2c, 0x1a, 0x2e, 0x3d, 0x7a, 0x93, 0x13, 0x3d, 0xd4, 0x7e, 0x73, 0xbd,
  0xd8, 0x83, 0xba, 0xbc, 0xa4, 0x77, 0x19, 0x3e, 0x92, 0xdf, 0xe4, 0xbc,
...

This file has been truncated, please download it to see its full contents.

index.php

PHP
(irrigation_level_data_logger)
<?php

// Insert a new row to the given CSV file:
function insert_new_line($csv_file, $line){
	$line = array($line);
	$f = fopen($csv_file.".csv", "a");
	fputcsv($f, explode(",", $line[0]));
	fclose($f);
	echo "The given line is added to the <i><b>".$csv_file.".csv</b></i> file successfully!";
}

// Create a new CSV file with the given name:
function create_csv_file($csv_file){
    $f = fopen($csv_file.'.csv', 'wb');
    fclose($f);
	echo "<i><b>".$csv_file.".csv</b></i> file created successfully!<br><br>";
}

// Create the required CSV files if requested.
if(isset($_GET["create_files"]) && $_GET["create_files"] == "ok"){
	create_csv_file("excessive"); create_csv_file("sufficient"); create_csv_file("moderate"); create_csv_file("dry");	
}

if(isset($_GET["thermal_img"]) && isset($_GET["level"])){
	insert_new_line($_GET["level"], $_GET["thermal_img"]);
}else{
	echo "Waiting Data...";
}

?>

Credits

Kutluhan Aktar

Kutluhan Aktar

66 projects • 215 followers
Self-Taught Full-Stack Developer | @EdgeImpulse Ambassador | Maker | Physics Enthusiast

Comments