/***************************************************************************
* Copyright (c) 2024 Microsoft Corporation
*
* This program and the accompanying materials are made available under the
* terms of the MIT License which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** NetX Utility */
/** */
/** NetX Duo IPerf Test Program */
/** */
/**************************************************************************/
/**************************************************************************/
#include "tx_api.h"
#include "nx_api.h"
#include "nx_iperf.h"
#ifndef NX_WEB_HTTP_NO_FILEX
#include "fx_api.h"
#else
#include "filex_stub.h"
#endif
#include "nx_web_http_server.h"
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
#include "tx_execution_profile.h"
#endif /* TX_EXECUTION_PROFILE_ENABLE */
/* Define the counters used in the demo application... */
NX_WEB_HTTP_SERVER nx_iperf_web_server;
FX_MEDIA nx_iperf_ram_disk;
NX_IP *nx_iperf_test_ip;
NX_PACKET_POOL *nx_iperf_test_pool;
UCHAR *nx_iperf_stack_area;
ULONG nx_iperf_stack_area_size;
ULONG nx_iperf_test_error_counter;
ctrl_info nx_iperf_ctrl_info;
static NXD_ADDRESS udp_tx_ip_address;
static NXD_ADDRESS tcp_tx_ip_address;
static ULONG udp_tx_port = NX_IPERF_DESTINATION_PORT;
static ULONG tcp_tx_port = NX_IPERF_DESTINATION_PORT;
static UINT udp_tx_packet_size = 1470;
static UINT udp_tx_test_time = 10;
static UINT udp_rx_test_time = 10;
static UINT tcp_tx_test_time = 10;
static UINT tcp_rx_test_time = 10;
static ULONG error_counter;
NX_TCP_SOCKET tcp_server_socket;
NX_TCP_SOCKET tcp_client_socket;
NX_UDP_SOCKET udp_server_socket;
NX_UDP_SOCKET udp_client_socket;
ULONG thread_tcp_rx_counter;
ULONG thread_tcp_tx_counter;
ULONG thread_udp_rx_counter;
ULONG thread_udp_tx_counter;
static TX_THREAD thread_tcp_rx_iperf;
static TX_THREAD thread_tcp_tx_iperf;
static TX_THREAD thread_udp_rx_iperf;
static TX_THREAD thread_udp_tx_iperf;
extern ULONG _tx_timer_system_clock;
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
EXECUTION_TIME thread_time = 0;
EXECUTION_TIME isr_time = 0;
EXECUTION_TIME idle_time = 0;
extern TX_THREAD *_tx_thread_created_ptr;
#endif
UCHAR udp_client_socket_vlan_priority = NX_VLAN_PRIORITY_INVALID;
UCHAR tcp_client_socket_vlan_priority = NX_VLAN_PRIORITY_INVALID;
/* Define the constants. */
const unsigned char mslogo_jpg[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x01, 0xd7, 0x00, 0x00, 0x00, 0x9c,
0x08, 0x06, 0x00, 0x00, 0x00, 0x2d, 0x6c, 0xe1,
0xda, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47,
0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00,
0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00,
0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00,
0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00,
0x2e, 0x22, 0x00, 0x00, 0x2e, 0x22, 0x01, 0xaa,
0xe2, 0xdd, 0x92, 0x00, 0x00, 0x19, 0xc7, 0x49,
0x44, 0x41, 0x54, 0x78, 0x5e, 0xed, 0xdd, 0x07,
0xb8, 0x2c, 0x67, 0x5d, 0xc7, 0xf1, 0x7b, 0x91,
0x2a, 0x10, 0x08, 0x08, 0xa1, 0xb7, 0x18, 0x20,
0x14, 0xe9, 0x01, 0x44, 0x40, 0x5a, 0x00, 0x43,
0x53, 0x8c, 0x08, 0x04, 0x43, 0x4d, 0x10, 0x94,
0x26, 0x20, 0xc2, 0x23, 0x21, 0x54, 0x45, 0x10,
0x69, 0x81, 0x50, 0x05, 0x42, 0x53, 0xe0, 0x41,
0x50, 0x90, 0xa0, 0x14, 0x41, 0x41, 0x88, 0x0a,
0xc6, 0x12, 0x5a, 0x10, 0x41, 0xa2, 0xb4, 0x20,
0xd2, 0x04, 0x21, 0xfe, 0xbe, 0xb3, 0xb3, 0xcb,
0xec, 0xbb, 0xef, 0xec, 0xee, 0xec, 0xd9, 0xbd,
0xf7, 0x9c, 0x73, 0xbf, 0x9f, 0xe7, 0xf9, 0x9f,
0x99, 0xdd, 0x9d, 0x99, 0xdd, 0xb3, 0x3b, 0x33,
0xef, 0xbc, 0x75, 0xf6, 0x48, 0x92, 0x24, 0x49,
0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92,
0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49,
0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92,
0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49,
0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92,
0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49,
0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92,
0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49,
0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92,
0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49,
0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92,
0x24, 0x49, 0x3a, 0xa0, 0xec, 0x6d, 0xa7, 0xbb,
0xc2, 0x37, 0xee, 0x76, 0x15, 0xfe, 0x9f, 0x7f,
0x4d, 0x5c, 0xa2, 0x79, 0x62, 0x33, 0xce, 0x3a,
0xe8, 0xad, 0x67, 0x5e, 0x8b, 0x99, 0x13, 0x4e,
0xdd, 0x73, 0x52, 0x26, 0xf7, 0x60, 0x7e, 0x83,
0x8e, 0x38, 0xf1, 0xc8, 0x3d, 0x9f, 0x69, 0xe7,
0x25, 0x49, 0x3b, 0xc0, 0xb9, 0xda, 0xe9, 0x6e,
0x72, 0xd1, 0xc4, 0xc5, 0x36, 0x18, 0x07, 0x27,
0xc6, 0x2e, 0x94, 0xa8, 0x2d, 0xb3, 0xce, 0xd8,
0x8d, 0xbf, 0x91, 0x24, 0xed, 0x6a, 0x9e, 0xb8,
0x25, 0x49, 0x5a, 0x33, 0x13, 0x57, 0x49, 0x92,
0xd6, 0xcc, 0xc4, 0x55, 0x92, 0xa4, 0x35, 0x33,
0x71, 0x95, 0x24, 0x69, 0xcd, 0x4c, 0x5c, 0x25,
0x49, 0x5a, 0x33, 0x13, 0x57, 0x49, 0x92, 0xd6,
0xcc, 0xc4, 0x55, 0xd2, 0xda, 0x9c, 0x73, 0xce,
0x39, 0x17, 0x49, 0x1c, 0x9b, 0x78, 0x45, 0xe2,
0xbd, 0x89, 0x0f, 0x27, 0xde, 0x9d, 0x38, 0x39,
0x71, 0x58, 0xbb, 0x98, 0xb4, 0xeb, 0x99, 0xb8,
0x6a, 0xbf, 0xc9, 0xc9, 0x76, 0x6f, 0xe2, 0xd2,
0x89, 0xab, 0x25, 0xce, 0xdb, 0x3e, 0xad, 0x1d,
0xa8, 0xfd, 0x2d, 0x7f, 0x35, 0xb3, 0x9f, 0x4e,
0xfc, 0x61, 0xe2, 0x7e, 0x89, 0x9f, 0x4d, 0xdc,
0x38, 0x71, 0xdb, 0xc4, 0x71, 0x89, 0xeb, 0x24,
0xa4, 0x03, 0xc2, 0x6e, 0x1c, 0xa1, 0xe9, 0xac,
0xc4, 0x21, 0xcd, 0x13, 0x9b, 0xf1, 0xc5, 0x83,
0xde, 0x7a, 0xe6, 0x65, 0x99, 0x39, 0xe1, 0xd4,
0x3d, 0xaf, 0xce, 0xe4, 0x3e, 0xcc, 0x6f, 0xd0,
0x55, 0x4f, 0x3c, 0x72, 0xcf, 0xa7, 0xda, 0xf9,
0x41, 0x72, 0xb2, 0x23, 0xa7, 0x30, 0x6f, 0x04,
0xa9, 0xd3, 0xf6, 0xee, 0xdd, 0xfb, 0xe7, 0xed,
0xfc, 0xca, 0xf2, 0x3e, 0x0c, 0xa6, 0xf1, 0xf0,
0x44, 0xdf, 0xfe, 0xf4, 0xfe, 0xbc, 0xcf, 0x07,
0xda, 0xf9, 0x46, 0xd6, 0x61, 0x80, 0x0c, 0x4e,
0xc2, 0x47, 0x25, 0xb8, 0xc8, 0xfb, 0x8f, 0xc4,
0x71, 0x59, 0xee, 0x1d, 0x99, 0x6a, 0x07, 0xc9,
0x6f, 0xc9, 0xef, 0xf7, 0xc2, 0xc4, 0x83, 0x9b,
0x27, 0xfa, 0x1d, 0x9d, 0xdf, 0xf7, 0x4d, 0xed,
0xfc, 0x7e, 0x91, 0xcf, 0xca, 0xe4, 0x81, 0x89,
0x4b, 0x31, 0x53, 0xf8, 0x40, 0x3e, 0xdf, 0xfb,
0xdb, 0x79, 0x69, 0x4b, 0x4c, 0x5c, 0x87, 0xdb,
0x49, 0x89, 0xeb, 0x9d, 0x33, 0x79, 0xdb, 0xe8,
0x51, 0x15, 0xb9, 0x8c, 0xc3, 0x73, 0x42, 0xf9,
0xbf, 0xd1, 0xc3, 0xd5, 0xe4, 0x7d, 0x38, 0x59,
0xbd, 0x74, 0xf4, 0xa8, 0xea, 0x89, 0x79, 0x8f,
0xa7, 0xb4, 0xf3, 0x8d, 0xac, 0xf3, 0xc7, 0x99,
0xfc, 0xe2, 0xe8, 0xd1, 0xc4, 0xb7, 0x12, 0xd7,
0xcc, 0xb2, 0x9f, 0x1b, 0x3d, 0xd4, 0x4e, 0x90,
0xdf, 0xf2, 0x31, 0x99, 0x3c, 0x73, 0xf4, 0x68,
0xae, 0xed, 0x90, 0xb8, 0x5e, 0x26, 0x93, 0xcf,
0x26, 0x6a, 0x25, 0x25, 0x7f, 0x9b, 0xb8, 0x69,
0x3e, 0x63, 0x93, 0x02, 0x4b, 0x5b, 0x61, 0xb1,
0xf0, 0x81, 0xed, 0x27, 0x13, 0xb7, 0x18, 0xcd,
0xae, 0x26, 0x27, 0x2b, 0x2e, 0x68, 0x8e, 0x1f,
0x3d, 0x5a, 0x4e, 0xd6, 0x39, 0x4f, 0x26, 0x77,
0x1c, 0x3d, 0x9a, 0x72, 0xc1, 0xc4, 0xed, 0x47,
0xb3, 0xda, 0x09, 0xf2, 0x5b, 0x72, 0xa1, 0xf9,
0xc4, 0xd1, 0xa3, 0x19, 0x67, 0x26, 0xde, 0x90,
0xe0, 0x42, 0x8a, 0xf9, 0xaa, 0x6c, 0xe3, 0x7c,
0x89, 0xcb, 0xb7, 0x0f, 0x37, 0xed, 0xde, 0x89,
0xbe, 0x2a, 0x88, 0x1b, 0x25, 0xae, 0x31, 0x9a,
0x95, 0xb6, 0xc6, 0xc4, 0x55, 0x0f, 0x68, 0xa7,
0xab, 0xe2, 0x84, 0x74, 0x83, 0xd1, 0xec, 0xd2,
0xc8, 0x19, 0xf4, 0xe5, 0x96, 0xff, 0xb7, 0x9d,
0x6a, 0x67, 0x20, 0xb1, 0xa2, 0x5a, 0xa0, 0xf4,
0x07, 0x89, 0xab, 0x27, 0x17, 0x78, 0xcf, 0xc4,
0x2f, 0x65, 0xfe, 0x6a, 0x89, 0x49, 0x15, 0x44,
0x12, 0xd3, 0x8b, 0x26, 0x8e, 0x4e, 0xbc, 0x26,
0x0f, 0x3f, 0x9f, 0xf8, 0xed, 0xe6, 0x85, 0x0d,
0xca, 0x7b, 0x71, 0xbe, 0x9b, 0x57, 0xd2, 0xc4,
0xeb, 0xbf, 0x32, 0x9a, 0x95, 0xb6, 0xc6, 0xc4,
0x55, 0x77, 0xcd, 0x49, 0xe7, 0xe2, 0xed, 0xfc,
0x2a, 0xc8, 0xb5, 0x0e, 0xaa, 0x5e, 0xc8, 0xc9,
0x96, 0x84, 0x95, 0xfa, 0xd6, 0x12, 0x45, 0xfa,
0x7f, 0x36, 0x9a, 0xd5, 0x0e, 0x71, 0xab, 0x76,
0xda, 0xc5, 0x5d, 0x9c, 0x1e, 0x9b, 0xdf, 0xf9,
0xfb, 0xa3, 0x87, 0xa3, 0xdf, 0x3c, 0xf1, 0x4d,
0xe6, 0xb3, 0xbf, 0x3d, 0x3b, 0x93, 0x2f, 0x26,
0xfe, 0x28, 0x71, 0x4c, 0x82, 0xbb, 0x58, 0xed,
0x8b, 0x2a, 0xaa, 0x1b, 0x26, 0x9a, 0x3b, 0x5a,
0xcd, 0x71, 0xaf, 0x7c, 0x3e, 0x1b, 0xd7, 0x69,
0xcb, 0x4c, 0x5c, 0x45, 0x51, 0xec, 0x2f, 0x8f,
0x66, 0x87, 0xc9, 0x49, 0x88, 0x3b, 0x10, 0xad,
0xb4, 0x6e, 0x3c, 0x36, 0xf1, 0x8c, 0x04, 0x0d,
0x99, 0xfe, 0x3b, 0xf1, 0xae, 0xc4, 0x6d, 0x72,
0x02, 0xfe, 0x4a, 0xa6, 0xda, 0x39, 0xae, 0xd2,
0x4e, 0xbb, 0xde, 0xdd, 0x4d, 0x58, 0x2b, 0xae,
0x99, 0xb8, 0xc0, 0x68, 0x76, 0x9f, 0x3a, 0x36,
0xb1, 0x28, 0x11, 0xbf, 0x5c, 0x82, 0xd6, 0xcd,
0xd2, 0x96, 0x98, 0xb8, 0x0a, 0xf7, 0x4f, 0x42,
0xd9, 0xce, 0x0e, 0xc2, 0xc9, 0xea, 0xc7, 0x47,
0xb3, 0xc3, 0xe4, 0xe4, 0xfb, 0xbd, 0xc4, 0xe3,
0x33, 0x7b, 0x85, 0xc4, 0x4f, 0x24, 0xee, 0x90,
0xc7, 0xdc, 0x8b, 0x57, 0x3b, 0x0b, 0x17, 0x67,
0x25, 0x72, 0xa5, 0xdb, 0x4a, 0xf6, 0x6f, 0xf6,
0x53, 0x8a, 0xa7, 0xbb, 0x7e, 0x98, 0x38, 0x6d,
0x34, 0x3b, 0xe5, 0xbe, 0xed, 0x54, 0x5a, 0x99,
0x89, 0xeb, 0x81, 0xe7, 0x0b, 0x09, 0x4e, 0x2a,
0x5d, 0xd7, 0x4b, 0x0c, 0xaa, 0x37, 0xcd, 0xc9,
0xea, 0xc7, 0x32, 0x79, 0xd0, 0xe8, 0xd1, 0xc4,
0x7f, 0x26, 0x06, 0xd5, 0x99, 0x26, 0x41, 0xfd,
0x61, 0x82, 0x22, 0xc3, 0xf6, 0x19, 0xed, 0x02,
0x3f, 0x68, 0xa7, 0xdb, 0x09, 0x5d, 0xbe, 0xb8,
0x88, 0xeb, 0xfa, 0x87, 0xc4, 0x93, 0x47, 0xb3,
0x53, 0xee, 0x94, 0xfd, 0x9b, 0xa2, 0x6a, 0x69,
0x65, 0x26, 0xae, 0x07, 0x1e, 0x72, 0x87, 0x1f,
0x1a, 0xcd, 0x4e, 0x90, 0xb2, 0xd1, 0xe9, 0x7f,
0x88, 0x9b, 0x27, 0x28, 0xde, 0xeb, 0xa2, 0x1e,
0x75, 0x9f, 0x9e, 0x58, 0x49, 0xe4, 0x13, 0x17,
0x4b, 0x1c, 0x9e, 0xb8, 0x41, 0x82, 0x01, 0x29,
0x2e, 0x9c, 0xd8, 0x52, 0x6a, 0xcd, 0xfa, 0x89,
0xf3, 0xb4, 0xb1, 0x70, 0x5b, 0x59, 0x86, 0x38,
0x77, 0xe2, 0x12, 0x89, 0xc3, 0x12, 0x57, 0x4d,
0x5c, 0x92, 0xe7, 0xda, 0x45, 0x56, 0x96, 0x6d,
0x9c, 0x2b, 0x71, 0xf1, 0xc4, 0xb5, 0x12, 0xd7,
0x4f, 0x5c, 0x25, 0x71, 0xfe, 0xc4, 0x4a, 0xff,
0x23, 0xeb, 0x25, 0x2e, 0x90, 0xb8, 0x6c, 0xe2,
0xea, 0x09, 0xb6, 0x77, 0x50, 0x62, 0x37, 0x9f,
0x0f, 0x6a, 0xb9, 0x51, 0x5a, 0x32, 0xbf, 0x3b,
0xf1, 0xa5, 0xe6, 0xd1, 0x8f, 0x50, 0x64, 0x5d,
0xe6, 0x72, 0x0f, 0x48, 0xd9, 0x27, 0x86, 0x1e,
0x07, 0x2c, 0x4f, 0xeb, 0x6f, 0x8e, 0xc9, 0x83,
0x13, 0xe7, 0xe5, 0xb9, 0xf6, 0xe5, 0x03, 0xca,
0xae, 0xfa, 0xa7, 0xed, 0xe7, 0x3a, 0x2d, 0x3b,
0x75, 0xad, 0x9f, 0xeb, 0xa9, 0x89, 0x53, 0x12,
0x7c, 0xf6, 0xae, 0xb3, 0x13, 0x97, 0x4d, 0x0e,
0xf2, 0x3b, 0xa3, 0x87, 0xf3, 0x65, 0xdb, 0x9c,
0x98, 0xba, 0x03, 0x54, 0x90, 0xa8, 0x92, 0xd8,
0xfe, 0x7d, 0xa2, 0x2c, 0x2a, 0xae, 0xf5, 0x73,
0xbd, 0x6b, 0x26, 0x65, 0x3f, 0xd7, 0x2f, 0x66,
0xb9, 0xdf, 0x6c, 0xe7, 0x7b, 0x71, 0xc0, 0x66,
0xf2, 0x0b, 0x09, 0xd6, 0xff, 0xe9, 0xc4, 0xa5,
0x13, 0x5d, 0x34, 0x98, 0xfa, 0x44, 0xe2, 0x9d,
0x89, 0x57, 0x67, 0x9b, 0xa7, 0xf3, 0x24, 0xb2,
0x2e, 0x8d, 0xb7, 0x68, 0xc9, 0x5a, 0x7a, 0x52,
0x96, 0xfb, 0x4c, 0x5e, 0xbf, 0x64, 0xe6, 0x1f,
0x9d, 0xe0, 0xbb, 0xa3, 0x7b, 0x08, 0xe5, 0xe5,
0xac, 0x7f, 0xcb, 0xbc, 0x3e, 0x53, 0x8f, 0x98,
0xe5, 0xaf, 0x98, 0x09, 0x8d, 0x72, 0xee, 0x90,
0xb8, 0x76, 0xe2, 0x22, 0x89, 0xae, 0x6f, 0x24,
0xc8, 0x21, 0xfd, 0x69, 0xe2, 0x55, 0xd9, 0xc6,
0x97, 0x79, 0x72, 0x19, 0xd9, 0x36, 0xdb, 0x63,
0xd4, 0x23, 0xba, 0x2d, 0xf1, 0x3e, 0xdd, 0xe3,
0xf5, 0x7b, 0x89, 0x4f, 0x26, 0xde, 0x9b, 0x78,
0x7e, 0xb6, 0x3b, 0x77, 0x1f, 0xc9, 0xb6, 0x58,
0x97, 0x6e, 0x57, 0xd4, 0x91, 0xdf, 0x32, 0x41,
0x37, 0x2c, 0xba, 0x44, 0x8d, 0xf1, 0x7f, 0x52,
0xff, 0xfd, 0x37, 0x09, 0x1a, 0x1a, 0xbd, 0xad,
0xe7, 0xff, 0xa5, 0xb4, 0xa2, 0xdb, 0x7d, 0x8b,
0xdf, 0xa1, 0xfc, 0xbd, 0x3f, 0x96, 0xf8, 0xa7,
0xd1, 0x6c, 0xd5, 0xad, 0x13, 0xf4, 0x37, 0xed,
0xa2, 0xcf, 0xf5, 0x87, 0x47, 0xb3, 0x13, 0xdf,
0xca, 0x67, 0x58, 0x34, 0x30, 0xc5, 0x42, 0xf9,
0xcc, 0xbc, 0xd7, 0xbf, 0x27, 0x28, 0x6d, 0x19,
0x63, 0x7f, 0xbd, 0x72, 0xb6, 0xff, 0xf9, 0xbc,
0xfe, 0xe2, 0xcc, 0x97, 0xdd, 0xc9, 0x3e, 0x9a,
0xd7, 0x8e, 0x68, 0xe7, 0xe7, 0xca, 0xfa, 0x74,
0xdf, 0xf9, 0xad, 0xd1, 0xa3, 0x2d, 0xe1, 0x3d,
0x9f, 0xc7, 0x4c, 0xb6, 0xc9, 0x85, 0x6a, 0xf7,
0xf3, 0xe2, 0x65, 0x79, 0x7d, 0xee, 0x20, 0x17,
0x59, 0x8f, 0x3a, 0xf0, 0x13, 0x47, 0x8f, 0xa6,
0x3c, 0x22, 0xeb, 0x7e, 0xb5, 0x9d, 0x67, 0x39,
0x5a, 0x78, 0xbf, 0x68, 0xf4, 0x68, 0xca, 0x09,
0x59, 0xee, 0xcc, 0xbc, 0xce, 0x39, 0xf4, 0x37,
0x12, 0x77, 0x49, 0x50, 0x0f, 0xcd, 0xfe, 0x71,
0x46, 0x5e, 0xa3, 0x77, 0xc0, 0x8c, 0x2c, 0x7f,
0xdd, 0x4c, 0xb8, 0x40, 0xa7, 0xbe, 0x9a, 0x7d,
0x6b, 0xdc, 0x28, 0xec, 0xbb, 0x09, 0x7e, 0xdb,
0xbf, 0x4c, 0xbc, 0x32, 0xeb, 0x7f, 0x9c, 0x27,
0x0f, 0x04, 0x26, 0xae, 0xc3, 0xed, 0x86, 0xc4,
0xf5, 0xe7, 0x13, 0x0c, 0xd4, 0x50, 0x16, 0x93,
0x1d, 0x93, 0x9d, 0xff, 0xb5, 0xed, 0x7c, 0xaf,
0x6c, 0x97, 0x93, 0x15, 0x2d, 0x42, 0xcf, 0xdf,
0x3c, 0x31, 0x42, 0x0e, 0x80, 0x04, 0xe6, 0x7f,
0x12, 0xcb, 0x24, 0xae, 0x4f, 0xc8, 0xe4, 0xa9,
0xa3, 0x47, 0x13, 0x9f, 0xc8, 0x72, 0x57, 0x6f,
0xe7, 0x67, 0x64, 0x1d, 0x7e, 0x5f, 0x4e, 0xe6,
0xbf, 0x97, 0xb8, 0x32, 0xcf, 0x2d, 0x81, 0xc4,
0xed, 0x52, 0xd9, 0x6e, 0x73, 0xd1, 0x90, 0x6d,
0x90, 0x60, 0x72, 0xa2, 0x2d, 0xdd, 0x24, 0x41,
0xa2, 0x4c, 0x6b, 0xe5, 0x72, 0xff, 0xa1, 0xc1,
0xd5, 0x21, 0xd9, 0xc6, 0xa4, 0xc8, 0x3b, 0xdb,
0x61, 0x84, 0xa9, 0xa7, 0x25, 0xee, 0x9f, 0x58,
0xb6, 0x75, 0x29, 0xad, 0x65, 0x7f, 0x27, 0xf1,
0xcc, 0x6c, 0xab, 0xb7, 0xc1, 0x4f, 0xb6, 0xcd,
0xf6, 0x58, 0xee, 0x61, 0x89, 0xf2, 0x04, 0x5b,
0xc3, 0x89, 0xf3, 0xb9, 0xed, 0xfc, 0x8c, 0x6c,
0x8f, 0x13, 0xe2, 0xf3, 0x13, 0x0c, 0x45, 0xb8,
0x2c, 0x2e, 0x4e, 0x1e, 0x9a, 0xed, 0x72, 0x52,
0x9c, 0xc8, 0xb6, 0x5e, 0x91, 0xc9, 0xd0, 0x52,
0x8e, 0x55, 0x9d, 0x9d, 0xf7, 0xe7, 0x7b, 0xde,
0x92, 0x7c, 0x66, 0x2e, 0xd8, 0xf8, 0x3e, 0xbb,
0xde, 0x97, 0xb8, 0x55, 0xb6, 0xcf, 0xeb, 0x5c,
0x6c, 0xf0, 0xb8, 0x74, 0xed, 0xbc, 0x3e, 0xef,
0x22, 0xa1, 0x91, 0xf5, 0xb9, 0x58, 0x98, 0xfa,
0x9e, 0x56, 0xf4, 0xe6, 0xbc, 0x5f, 0x73, 0xc1,
0x99, 0x6d, 0xb2, 0x7f, 0x94, 0xa5, 0x1e, 0x0f,
0xcc, 0xeb, 0x2f, 0x6f, 0xe7, 0xab, 0xb2, 0x1e,
0x17, 0x04, 0x0c, 0x86, 0x51, 0xba, 0x62, 0xd6,
0x9d, 0xec, 0xf7, 0x59, 0x8e, 0x8b, 0xcc, 0x5a,
0xe3, 0x41, 0xf6, 0x11, 0xaa, 0x8d, 0xde, 0x9e,
0x28, 0x47, 0xb1, 0xfa, 0x4e, 0xb6, 0x31, 0x75,
0x6c, 0x67, 0x3b, 0x9c, 0x43, 0xd8, 0xf7, 0xee,
0x99, 0x58, 0x94, 0x9e, 0xb0, 0x5d, 0xce, 0x99,
0x0f, 0xcf, 0x76, 0x38, 0x2e, 0x77, 0x35, 0x8b,
0x85, 0x0f, 0x40, 0xd9, 0xb1, 0xbf, 0x9d, 0x49,
0x99, 0x73, 0xc5, 0xb2, 0x0d, 0x9b, 0x28, 0x62,
0xeb, 0x26, 0xac, 0x78, 0x59, 0x3b, 0xdd, 0x88,
0x7c, 0x2e, 0x12, 0x19, 0xba, 0x70, 0x90, 0xab,
0x5a, 0x36, 0x61, 0xc5, 0xb2, 0x17, 0x90, 0x24,
0xa8, 0x9c, 0x50, 0x16, 0x5e, 0x98, 0xe5, 0xb3,
0x90, 0x53, 0xf9, 0x48, 0x82, 0x5c, 0xd5, 0x90,
0x6e, 0x1b, 0xe4, 0x16, 0xb8, 0xa0, 0x78, 0x7b,
0xb6, 0x71, 0xe1, 0xe6, 0x99, 0x42, 0x9e, 0x27,
0x37, 0xf9, 0xc6, 0xc4, 0x23, 0x13, 0xcb, 0x24,
0xac, 0xbd, 0xf8, 0x2d, 0x13, 0xe4, 0x34, 0x19,
0x7a, 0x72, 0x48, 0xc2, 0x8a, 0xa6, 0x5f, 0x6a,
0xd6, 0x7f, 0x18, 0xdb, 0xd9, 0xa9, 0xf2, 0xd9,
0x39, 0xc7, 0xd5, 0x2e, 0x80, 0x5f, 0x9f, 0xe3,
0xa0, 0x9d, 0xdd, 0xf3, 0xd7, 0x09, 0xfa, 0xda,
0x96, 0xf6, 0x75, 0xc3, 0xa6, 0xb2, 0x78, 0x7a,
0x7f, 0xa0, 0xe4, 0xa6, 0x96, 0xb0, 0xce, 0xc8,
0x77, 0xcb, 0x3e, 0x42, 0x42, 0x7e, 0xaf, 0xc4,
0x32, 0xc7, 0x19, 0xbf, 0x05, 0xdf, 0xe9, 0xfb,
0xb2, 0xee, 0x56, 0xba, 0xff, 0xed, 0x08, 0x26,
0xae, 0x07, 0x2e, 0x86, 0x2b, 0x2c, 0x1b, 0x36,
0x8d, 0x8b, 0x0b, 0x7b, 0xe5, 0xa0, 0xe0, 0xe4,
0x5f, 0x0e, 0x3c, 0x41, 0x43, 0x26, 0x0e, 0xc8,
0x8d, 0x68, 0x4f, 0xee, 0x0c, 0xaf, 0x47, 0x82,
0xb3, 0xa9, 0x7d, 0x96, 0x62, 0xbd, 0xb2, 0x78,
0x79, 0x46, 0x3e, 0xcb, 0x95, 0x32, 0xf9, 0x8b,
0xc4, 0xa1, 0xcd, 0x13, 0xab, 0x61, 0x14, 0xaa,
0xd7, 0x65, 0x5b, 0xb5, 0xc4, 0xf3, 0x11, 0x89,
0xbb, 0x8d, 0x66, 0x67, 0xf0, 0x45, 0x94, 0xbf,
0xd9, 0x3c, 0xe4, 0xaa, 0x29, 0xf2, 0x3c, 0x5f,
0xf3, 0x68, 0x38, 0x72, 0x4e, 0xcf, 0x49, 0xec,
0xe4, 0xd6, 0xb3, 0xe4, 0xda, 0xcb, 0xb6, 0x01,
0x14, 0xa9, 0xbf, 0x65, 0x34, 0xdb, 0x5c, 0x6c,
0x52, 0x62, 0xc1, 0x45, 0x5b, 0xe9, 0x9e, 0xf9,
0x8d, 0x86, 0x5c, 0x3c, 0x6d, 0x05, 0x25, 0x49,
0x7d, 0x23, 0x5d, 0xed, 0x4b, 0xb4, 0xe0, 0x5f,
0x26, 0x61, 0xa5, 0xa8, 0x98, 0x52, 0xb0, 0x5a,
0x57, 0x2c, 0xf0, 0x1d, 0x13, 0x35, 0x34, 0xa0,
0x3c, 0x25, 0xdb, 0xd8, 0xd5, 0xe9, 0x8f, 0x89,
0xeb, 0x01, 0x2a, 0x27, 0x94, 0x33, 0x32, 0x29,
0xeb, 0x6f, 0x38, 0xd9, 0xd3, 0xbd, 0x66, 0x9e,
0x23, 0x13, 0xe5, 0x01, 0xf5, 0xda, 0x6c, 0x6f,
0xa9, 0xba, 0xda, 0x15, 0xdd, 0x3d, 0xf1, 0xa8,
0xd1, 0xec, 0x0c, 0xea, 0x74, 0xc8, 0xe9, 0x3d,
0x24, 0x41, 0x71, 0xf7, 0xd1, 0x89, 0x13, 0x12,
0xd4, 0xfd, 0x0e, 0x41, 0xb1, 0xf0, 0x18, 0x27,
0x5b, 0x8a, 0xe2, 0x19, 0x83, 0x76, 0xd2, 0x40,
0x2b, 0x27, 0x03, 0x12, 0x9b, 0xd7, 0x27, 0x6a,
0x89, 0x30, 0x89, 0x1e, 0x27, 0x1b, 0xc6, 0xd9,
0xa5, 0x0e, 0x96, 0xa2, 0x53, 0x72, 0xda, 0xb5,
0x1c, 0x11, 0xee, 0x94, 0xf8, 0xb5, 0xd1, 0xec,
0x48, 0xb6, 0x4f, 0x69, 0x00, 0xf5, 0xbd, 0x25,
0xba, 0xb6, 0x90, 0x50, 0x92, 0x53, 0x20, 0x71,
0xbf, 0x69, 0x82, 0x7e, 0xc2, 0xbd, 0xf5, 0x57,
0xd9, 0x16, 0xf5, 0xb5, 0x2f, 0x48, 0xd4, 0x8e,
0x71, 0x8a, 0xe4, 0x28, 0x5e, 0x24, 0xe7, 0xcd,
0x08, 0x4b, 0x0f, 0x4d, 0xf0, 0x7f, 0xf1, 0x5d,
0x96, 0x58, 0xff, 0x05, 0xd9, 0xde, 0xf8, 0x37,
0xa7, 0x41, 0x1c, 0xf5, 0xbc, 0xe3, 0xa8, 0xb5,
0x0e, 0x67, 0xa8, 0xc3, 0xee, 0x32, 0x65, 0x7c,
0x2d, 0x51, 0xe2, 0x7f, 0x2c, 0x97, 0xfb, 0x60,
0x62, 0xab, 0x6a, 0x17, 0x06, 0xa7, 0x66, 0x7f,
0x2d, 0x8b, 0x44, 0x69, 0x43, 0x50, 0xa2, 0xfa,
0x83, 0xfd, 0x7d, 0x11, 0xaa, 0xa2, 0x28, 0x2e,
0x5f, 0x26, 0x6a, 0xfb, 0x03, 0xfb, 0xdb, 0xb1,
0x95, 0xcf, 0xb4, 0x3f, 0xb0, 0x6f, 0x8d, 0x75,
0x8f, 0x03, 0xe6, 0x1b, 0xd9, 0x17, 0x38, 0x4f,
0x30, 0xb2, 0x16, 0xdd, 0xe8, 0xba, 0xb8, 0xf8,
0x63, 0x3f, 0xa2, 0x94, 0x84, 0xe2, 0x7c, 0x8a,
0x8c, 0x6f, 0x96, 0xa8, 0x8d, 0x6f, 0x4e, 0x15,
0x12, 0x45, 0xc9, 0xbb, 0xd6, 0xb2, 0x45, 0x66,
0x3b, 0x42, 0x5b, 0xe7, 0xfa, 0x2f, 0x09, 0x8a,
0x36, 0x36, 0xe5, 0xac, 0x83, 0xde, 0x7a, 0x66,
0x33, 0xca, 0xcb, 0x09, 0xa7, 0xee, 0x39, 0x29,
0x93, 0x79, 0x77, 0x9d, 0x59, 0x87, 0x23, 0x4e,
0x3c, 0xb2, 0xa9, 0xdf, 0x1c, 0x2c, 0x07, 0x41,
0xb5, 0xce, 0x35, 0x07, 0x71, 0x33, 0x7e, 0x6f,
0x5e, 0xa7, 0x45, 0x24, 0x09, 0x53, 0x17, 0xf5,
0x32, 0x87, 0x65, 0x99, 0xea, 0x55, 0x67, 0xd6,
0x21, 0x87, 0x4a, 0xc2, 0x30, 0x46, 0xa2, 0xc2,
0x60, 0xfb, 0x67, 0xe4, 0x35, 0x4e, 0xc4, 0x6b,
0xad, 0x73, 0xcd, 0x72, 0x14, 0x9f, 0x72, 0x21,
0x50, 0x36, 0x80, 0x01, 0xf5, 0xbc, 0xe4, 0xa2,
0x3f, 0x9f, 0xf5, 0x9a, 0x27, 0xc6, 0xb2, 0x1e,
0x93, 0xdb, 0x24, 0x78, 0x5f, 0x06, 0xa7, 0x58,
0x54, 0xe7, 0x0a, 0x56, 0x22, 0xa7, 0x47, 0xe2,
0x3c, 0x6e, 0x78, 0xc4, 0x49, 0x82, 0xdf, 0x98,
0x62, 0x6f, 0x2e, 0x3c, 0x6a, 0x37, 0x28, 0x20,
0xe7, 0x4e, 0xa2, 0xfe, 0xc1, 0xca, 0xe7, 0x20,
0xc1, 0xa4, 0xbe, 0x8f, 0xbb, 0x06, 0x95, 0x68,
0x44, 0x76, 0x68, 0xd6, 0x61, 0xca, 0xb2, 0x9c,
0x94, 0xca, 0x46, 0x3d, 0xb8, 0x59, 0x96, 0xa1,
0xa1, 0xd1, 0x94, 0xf6, 0x7f, 0xa4, 0xb1, 0xd3,
0xb9, 0xf3, 0xfa, 0xa4, 0xe4, 0x20, 0xcf, 0xf3,
0x21, 0xf8, 0x6e, 0xf8, 0xff, 0x4b, 0xd4, 0x29,
0xdf, 0x37, 0xcb, 0x4f, 0x9d, 0xc8, 0xdb, 0x6d,
0x91, 0x80, 0x92, 0x83, 0xab, 0x75, 0xcb, 0xe2,
0xa4, 0x79, 0xaf, 0xca, 0xff, 0x47, 0xd7, 0xae,
0xa6, 0x0d, 0x42, 0xc7, 0x13, 0xb2, 0xdc, 0xd3,
0xdb, 0xf9, 0x19, 0x59, 0x87, 0x61, 0x10, 0xcb,
0x31, 0xa4, 0x69, 0xac, 0x53, 0x76, 0xed, 0xda,
0x92, 0xbc, 0x0f, 0x7d, 0x70, 0xc9, 0x11, 0x96,
0x45, 0x90, 0xfc, 0x1f, 0xfc, 0x3f, 0x13, 0xed,
0x77, 0xc6, 0x7e, 0x76, 0xd5, 0xe6, 0x89, 0x1f,
0x79, 0x4b, 0x96, 0xe5, 0xe2, 0x6e, 0xcb, 0xf2,
0x1e, 0x24, 0x34, 0x5c, 0x34, 0x74, 0x1b, 0x92,
0xe1, 0x49, 0x89, 0x13, 0xbb, 0xdf, 0x6d, 0x96,
0xdd, 0x5f, 0x75, 0xae, 0x60, 0x67, 0x38, 0x39,
0x41, 0x4e, 0xba, 0x7b, 0x1c, 0xf0, 0xbd, 0x71,
0xa1, 0xc5, 0x10, 0x91, 0xaf, 0x6a, 0x9e, 0xfd,
0x11, 0xce, 0x03, 0x34, 0xbe, 0x7b, 0x49, 0xf7,
0xff, 0x40, 0x96, 0xe7, 0x09, 0x8e, 0x1f, 0x2e,
0x10, 0xbb, 0xfe, 0x31, 0x71, 0xbd, 0x2c, 0x3f,
0xa4, 0x34, 0x66, 0xc7, 0xd8, 0x6d, 0x39, 0x57,
0x76, 0x8a, 0x9f, 0x4a, 0x50, 0xac, 0xb1, 0xa9,
0xa0, 0x55, 0xdc, 0xd8, 0xaf, 0x27, 0x6a, 0xcb,
0xac, 0x33, 0x7a, 0x07, 0x3c, 0x5f, 0x03, 0x12,
0x5e, 0xae, 0xba, 0xbb, 0xb8, 0x1a, 0xad, 0x8e,
0x50, 0x93, 0x83, 0x84, 0x5c, 0x13, 0x57, 0x9c,
0x5d, 0xd4, 0xe7, 0xd1, 0xf8, 0x65, 0x53, 0xb8,
0xe3, 0x4e, 0x2d, 0x61, 0x25, 0x91, 0x38, 0x2a,
0x07, 0xe6, 0x4c, 0xc2, 0x0a, 0x9e, 0x4b, 0xd0,
0xc8, 0x84, 0x7b, 0x8a, 0xd6, 0x72, 0x64, 0x35,
0xe4, 0x34, 0x1f, 0x92, 0xf5, 0xbe, 0xdc, 0xae,
0x4f, 0x7c, 0x2d, 0x41, 0xab, 0x4a, 0x4e, 0x00,
0xb4, 0x9e, 0x2c, 0x91, 0x68, 0xdf, 0x31, 0xcb,
0xcc, 0x24, 0xac, 0xc8, 0x73, 0xbc, 0x37, 0xc5,
0xd9, 0xb5, 0x3a, 0xee, 0x83, 0x13, 0xdd, 0xab,
0x77, 0x8a, 0xda, 0x4a, 0xe4, 0x9c, 0xab, 0xdf,
0x2f, 0xef, 0x97, 0x78, 0x67, 0xa2, 0x2c, 0x92,
0x67, 0x98, 0xbf, 0xda, 0xb0, 0x84, 0x24, 0xdc,
0x77, 0xcf, 0xf2, 0x33, 0x27, 0xd5, 0x76, 0x5b,
0xec, 0x6b, 0x3f, 0x97, 0xa0, 0xd5, 0x70, 0x89,
0x04, 0x66, 0x61, 0xb1, 0xf9, 0x36, 0xc3, 0x45,
0x60, 0x99, 0xb0, 0x92, 0x6b, 0x9f, 0x19, 0x62,
0x33, 0xff, 0x3b, 0xe7, 0x8e, 0xa9, 0x04, 0xb7,
0x75, 0xc7, 0xec, 0xf7, 0x5b, 0xbe, 0x58, 0x6f,
0x13, 0x33, 0x72, 0x7b, 0x65, 0xc2, 0x4a, 0xe9,
0xd1, 0xd3, 0xf8, 0xfe, 0xb7, 0x91, 0xdf, 0x4f,
0xd4, 0x8e, 0x03, 0x12, 0x56, 0x3e, 0x68, 0xad,
0x65, 0x34, 0x89, 0xf1, 0x4c, 0xc2, 0x8a, 0x3c,
0xc7, 0x77, 0x4b, 0x89, 0x4e, 0xd9, 0x88, 0x89,
0xd2, 0x95, 0xb2, 0xc8, 0x5e, 0xda, 0xfe, 0x72,
0x20, 0xdc, 0x39, 0x51, 0x62, 0x98, 0xc1, 0x89,
0x3c, 0x7e, 0xc6, 0xe8, 0xe9, 0x29, 0x6f, 0x6e,
0x5f, 0x9e, 0x92, 0xe7, 0x9f, 0x3a, 0x7a, 0x79,
0x0a, 0xc5, 0x8a, 0x8d, 0xcc, 0xd3, 0x1f, 0xf3,
0x5b, 0xcd, 0xb3, 0xd3, 0x66, 0x06, 0x65, 0xcf,
0x73, 0x4f, 0x18, 0xbd, 0x34, 0x85, 0x9c, 0xc3,
0x44, 0x1e, 0xd3, 0x67, 0xee, 0x63, 0xcd, 0x2b,
0xd3, 0xbe, 0x92, 0x28, 0x5b, 0x3a, 0x2f, 0x25,
0xeb, 0x5d, 0xbe, 0xd9, 0xc2, 0xac, 0x2f, 0x24,
0x7a, 0x87, 0xe4, 0xcb, 0x6b, 0x37, 0x6c, 0x96,
0x9a, 0xf5, 0xac, 0x76, 0x91, 0xb9, 0xb2, 0xdc,
0xa5, 0x12, 0xdf, 0x6e, 0xd6, 0x98, 0x46, 0x0e,
0xb3, 0x91, 0xf9, 0xa3, 0x46, 0x4f, 0xcd, 0x18,
0x34, 0x98, 0x7c, 0x96, 0x7f, 0xf6, 0x68, 0xb5,
0x29, 0x3f, 0x48, 0x2c, 0xdb, 0xb5, 0xe4, 0xb8,
0x66, 0x8d, 0x59, 0x33, 0x37, 0x79, 0xc8, 0x73,
0x7c, 0x6f, 0x25, 0xea, 0xed, 0x7a, 0xe5, 0x75,
0x1a, 0x4a, 0x95, 0xe6, 0xdd, 0xb2, 0x70, 0x25,
0xd9, 0x66, 0xed, 0x7d, 0x5e, 0xd7, 0xbe, 0x3c,
0x23, 0xaf, 0x5d, 0x23, 0xc1, 0xf7, 0x54, 0xe2,
0x22, 0x7a, 0x65, 0x59, 0x9f, 0xe3, 0xe2, 0x4d,
0xcd, 0x96, 0xa6, 0xb1, 0x1f, 0xd3, 0xc5, 0x6a,
0x46, 0x9e, 0xff, 0x7e, 0xb3, 0xc4, 0xb4, 0x85,
0x37, 0xd9, 0xc8, 0x32, 0x47, 0x8c, 0x16, 0x9d,
0x31, 0x55, 0x84, 0x9b, 0xc7, 0xf4, 0x9b, 0xae,
0x59, 0x74, 0x1c, 0xd4, 0xb6, 0xff, 0xdd, 0x44,
0xed, 0x02, 0x78, 0x4a, 0x96, 0x79, 0x5b, 0xb3,
0xf4, 0xb4, 0xa9, 0xaa, 0x91, 0xdd, 0x64, 0x5b,
0x5d, 0x2e, 0x6d, 0xd9, 0x29, 0x67, 0xf3, 0xff,
0xd0, 0xf0, 0xe5, 0xa0, 0xe6, 0xf1, 0x66, 0x7c,
0x7d, 0xcf, 0x31, 0x07, 0x37, 0x7d, 0x31, 0x93,
0x4c, 0x51, 0xaf, 0xd6, 0xad, 0xab, 0xdb, 0x84,
0x27, 0xee, 0xbd, 0xfd, 0x9e, 0xff, 0x6a, 0xe7,
0x07, 0xc9, 0x8e, 0x3b, 0xb7, 0x58, 0x18, 0x59,
0x86, 0x06, 0x4c, 0xd4, 0xa3, 0x75, 0x8b, 0xa0,
0xc8, 0x6d, 0xd1, 0x07, 0x90, 0xe2, 0xce, 0x46,
0x96, 0xa3, 0x61, 0xc7, 0xbf, 0x25, 0xba, 0xb9,
0x17, 0xea, 0xce, 0xe8, 0x1b, 0xdb, 0xe4, 0x0c,
0xb3, 0xcc, 0x5a, 0x8b, 0x85, 0xb3, 0x0c, 0x39,
0x65, 0x8a, 0xc4, 0xcb, 0x12, 0x96, 0xa7, 0x67,
0x39, 0xd6, 0x1f, 0x2c, 0xdb, 0xec, 0x2b, 0x16,
0x7e, 0x6e, 0xb6, 0x49, 0x63, 0xa2, 0xaa, 0xac,
0x47, 0x1d, 0xe7, 0xef, 0x8e, 0x1e, 0x4d, 0x70,
0x45, 0x7e, 0xad, 0xac, 0x47, 0x55, 0xc4, 0x42,
0xd9, 0x06, 0xbf, 0x05, 0xbf, 0x49, 0x17, 0x45,
0xc2, 0x74, 0x15, 0xfa, 0x5e, 0x5e, 0xe7, 0xe6,
0xf6, 0x5c, 0x60, 0x94, 0xff, 0x2f, 0xb9, 0x63,
0xbe, 0xbf, 0xe7, 0x65, 0x39, 0xee, 0x79, 0x3b,
0x57, 0xb6, 0xf3, 0x77, 0x99, 0x5c, 0x7f, 0xf4,
0x68, 0x82, 0xbe, 0xa7, 0xd7, 0xcf, 0xfa, 0x7c,
0xe6, 0xb9, 0xb2, 0x3e, 0x63, 0x46, 0xd3, 0x72,
0xb5, 0xcc, 0x65, 0xbd, 0x3c, 0xeb, 0x53, 0x92,
0x30, 0x91, 0x65, 0xb7, 0x65, 0xb1, 0x70, 0xde,
0x83, 0xc4, 0x84, 0xfe, 0x95, 0xe5, 0xff, 0x70,
0xe7, 0xbc, 0x0f, 0x7d, 0x8e, 0x67, 0x64, 0x1d,
0xce, 0x1f, 0x7c, 0x77, 0x34, 0xb8, 0xe9, 0xe2,
0xb9, 0x1b, 0x2d, 0xf3, 0xdd, 0xd5, 0x64, 0xbb,
0xb4, 0x07, 0xe0, 0x66, 0xf2, 0x5d, 0x94, 0x84,
0x70, 0x7f, 0xdb, 0x49, 0xc3, 0xaa, 0xae, 0xac,
0xb3, 0xbf, 0x8a, 0x85, 0xe9, 0x33, 0x4d, 0x17,
0xb0, 0xaa, 0xac, 0x57, 0x3b, 0x6e, 0xb9, 0x40,
0x3c, 0x32, 0xeb, 0x8d, 0x1e, 0xf5, 0xc8, 0xba,
0x5c, 0x88, 0x96, 0xa5, 0x3f, 0x27, 0x65, 0x3d,
0xea, 0xfc, 0x77, 0x9d, 0xdd, 0x98, 0xb8, 0x6e,
0xbc, 0x9f, 0x6b, 0x12, 0xd7, 0xe6, 0x64, 0x92,
0xc4, 0x75, 0x9f, 0xf4, 0x73, 0x4d, 0x52, 0xb8,
0xd6, 0x7e, 0xae, 0xd9, 0x99, 0xa7, 0x4e, 0x6c,
0x59, 0xee, 0x1d, 0x99, 0x94, 0xf7, 0x57, 0x7d,
0x4c, 0x96, 0x9b, 0xe4, 0xca, 0xb2, 0x4c, 0xad,
0x7e, 0x96, 0x93, 0xfd, 0xa4, 0x2e, 0x31, 0xcb,
0xac, 0x3b, 0x71, 0xa5, 0x4f, 0x6b, 0x2d, 0x17,
0x7d, 0xe3, 0x2c, 0x47, 0x57, 0x98, 0xc1, 0xb2,
0xcd, 0xbe, 0xc4, 0x75, 0x6e, 0x1f, 0xdf, 0xac,
0x47, 0x91, 0x1e, 0x0d, 0x95, 0xba, 0xb8, 0xe8,
0xb9, 0x4c, 0xd6, 0x5b, 0xaa, 0xce, 0x28, 0xdb,
0x20, 0x47, 0x47, 0xdf, 0xd8, 0x2e, 0x4e, 0xd8,
0x57, 0xc8, 0x36, 0xc8, 0x31, 0xb0, 0xff, 0x72,
0x62, 0xac, 0x76, 0xd4, 0x0f, 0x4e, 0x86, 0xe4,
0xf0, 0x48, 0x88, 0xaa, 0xd5, 0x05, 0xd9, 0x06,
0x17, 0x41, 0x5f, 0x4f, 0x94, 0xb9, 0x8f, 0xa9,
0xdf, 0x6a, 0x91, 0x6c, 0x87, 0xfa, 0x30, 0x8a,
0xed, 0xba, 0x3e, 0x90, 0x6d, 0x4c, 0xdd, 0xff,
0x37, 0xcb, 0x6d, 0xd7, 0xc4, 0xf5, 0x71, 0x99,
0x70, 0x63, 0x88, 0x2e, 0xea, 0x0f, 0xf9, 0xae,
0x7b, 0xab, 0x09, 0xb2, 0x1e, 0x0d, 0xca, 0xe8,
0x47, 0xdd, 0xc5, 0xef, 0x7b, 0x83, 0xac, 0xc7,
0x05, 0xca, 0x20, 0xd9, 0x1e, 0xd5, 0x48, 0xd4,
0x97, 0x97, 0xbf, 0x07, 0x55, 0x0d, 0x14, 0xbd,
0x8e, 0x1e, 0x15, 0xb2, 0xde, 0xfe, 0x4a, 0x5c,
0x17, 0x1d, 0x07, 0xdc, 0xec, 0xbe, 0xac, 0x83,
0xa6, 0xc1, 0xd3, 0x3f, 0x8f, 0x66, 0xe7, 0xe2,
0xd8, 0x2e, 0x7b, 0x23, 0xac, 0xad, 0x4e, 0x7b,
0xbb, 0xd9, 0x6d, 0x75, 0xae, 0x5a, 0xcd, 0x4b,
0xda, 0x69, 0xd7, 0xfd, 0x72, 0x20, 0x35, 0x47,
0x7e, 0x3b, 0x2d, 0x47, 0xca, 0xe1, 0x84, 0xb3,
0xd1, 0xbe, 0xad, 0x51, 0x6b, 0xe6, 0x4f, 0x43,
0xab, 0x95, 0x2e, 0x36, 0x16, 0x20, 0x91, 0x98,
0xa7, 0x56, 0x1f, 0xfa, 0xd9, 0x9c, 0x18, 0x96,
0x4a, 0x58, 0x5b, 0xb5, 0x44, 0x9d, 0xef, 0xb6,
0xa9, 0x17, 0xcc, 0xb6, 0x48, 0x68, 0xb9, 0xb2,
0xef, 0x1b, 0x9f, 0x99, 0xa2, 0x70, 0xea, 0xbb,
0x68, 0x3c, 0xf6, 0x9a, 0x44, 0xad, 0xbf, 0x2f,
0xdb, 0xaa, 0x75, 0xbd, 0x19, 0x5a, 0x77, 0x4f,
0x43, 0xa0, 0xd2, 0x8e, 0x18, 0x6f, 0xb7, 0xdd,
0x5f, 0x6b, 0xad, 0xde, 0xb9, 0xe8, 0x38, 0x21,
0xaf, 0x53, 0x15, 0x52, 0x8d, 0xbc, 0x5e, 0xab,
0x03, 0xe4, 0x3c, 0x39, 0xf8, 0x3e, 0xaf, 0xd9,
0x1e, 0xfd, 0x9a, 0x29, 0x86, 0x2e, 0x13, 0x56,
0x5a, 0x79, 0x3f, 0x3a, 0xbf, 0xf7, 0xe8, 0xd1,
0xf6, 0x52, 0xab, 0x6f, 0xef, 0xe2, 0xe2, 0xb4,
0xc4, 0x7e, 0x48, 0xfd, 0xf6, 0xa2, 0xa8, 0x75,
0xf3, 0x2b, 0x2f, 0xc4, 0x77, 0x0d, 0x13, 0x57,
0x81, 0x06, 0x1e, 0x65, 0x17, 0x01, 0x06, 0x4a,
0x18, 0x37, 0xcb, 0x3f, 0x3c, 0x31, 0x95, 0x63,
0x09, 0xae, 0x8e, 0x27, 0xc3, 0x0a, 0x6e, 0x08,
0x0d, 0x7e, 0x4a, 0x24, 0xae, 0xe4, 0x8e, 0xd7,
0x6d, 0x51, 0xa3, 0xa7, 0xda, 0xa0, 0x0f, 0x43,
0x3f, 0x47, 0x73, 0x3f, 0xd3, 0x8a, 0x49, 0x62,
0x98, 0x13, 0x2e, 0x0d, 0xc4, 0x68, 0x9d, 0xcc,
0xa8, 0x50, 0x7d, 0x28, 0xea, 0x24, 0x17, 0xfd,
0xf1, 0x9c, 0xc0, 0xef, 0x93, 0x68, 0x9e, 0x6c,
0xd1, 0x42, 0xb6, 0x76, 0x5c, 0x0f, 0x1d, 0x11,
0xa7, 0x56, 0xfc, 0x5c, 0x16, 0xb1, 0x6e, 0x57,
0xec, 0xb7, 0xb5, 0x91, 0xbe, 0x28, 0x76, 0x27,
0x47, 0x3b, 0x2f, 0xfa, 0xfa, 0xf4, 0x0e, 0xea,
0xf3, 0x9a, 0x65, 0x49, 0x39, 0x19, 0xca, 0x90,
0x63, 0xa7, 0x8b, 0x01, 0x5c, 0xc8, 0x1d, 0x32,
0xdd, 0x8e, 0x16, 0x7d, 0xae, 0xea, 0xe0, 0x27,
0x9a, 0x65, 0xe2, 0x2a, 0x4e, 0xe8, 0x14, 0x41,
0xd1, 0x07, 0xaf, 0x34, 0x6e, 0x3a, 0x7f, 0x5c,
0xa2, 0x1c, 0xf0, 0xe0, 0xa5, 0xfb, 0xe0, 0xca,
0xbb, 0x76, 0x32, 0x67, 0x9f, 0xdd, 0x1f, 0x27,
0xf9, 0x5a, 0x0e, 0xb5, 0x2c, 0xb6, 0x5b, 0xa4,
0xef, 0xe4, 0x3c, 0xd5, 0x47, 0x38, 0xdf, 0xeb,
0x9f, 0x64, 0x42, 0xbd, 0x1f, 0x45, 0xe2, 0xf3,
0x72, 0xc6, 0x9c, 0xe8, 0x18, 0x83, 0x76, 0xd2,
0xa8, 0x2c, 0xfa, 0xea, 0x05, 0x87, 0x0e, 0x24,
0x51, 0x8e, 0xc0, 0x85, 0x41, 0x77, 0x3c, 0xda,
0x8f, 0x16, 0xf5, 0xd5, 0x5e, 0x05, 0x2d, 0xf7,
0xcb, 0xaa, 0x93, 0x79, 0xf8, 0x4d, 0x6a, 0x09,
0xf5, 0xa3, 0xf2, 0xfb, 0x2e, 0x1c, 0x52, 0x71,
0x1b, 0x1b, 0x52, 0x52, 0x73, 0x40, 0x33, 0x71,
0xd5, 0x18, 0x75, 0x39, 0x93, 0x8e, 0xe2, 0xad,
0xa3, 0x73, 0x05, 0x4e, 0x2b, 0xc0, 0xb2, 0xae,
0x91, 0x46, 0x38, 0xd5, 0x16, 0xc5, 0x6b, 0x56,
0xcb, 0x6d, 0x71, 0xd2, 0xdf, 0x1f, 0xc5, 0x93,
0x14, 0x29, 0x96, 0x86, 0x76, 0x4d, 0xe9, 0x1b,
0x7c, 0xa2, 0xd6, 0x35, 0x86, 0x22, 0x67, 0xc6,
0x99, 0xa5, 0xce, 0x8e, 0x6e, 0x0e, 0x7d, 0xb9,
0x5e, 0x8e, 0xe1, 0xe7, 0xe5, 0x77, 0x1a, 0x8f,
0xc1, 0x4b, 0x6e, 0xba, 0x76, 0x67, 0xa2, 0xa1,
0xed, 0x10, 0x48, 0x4c, 0x4a, 0x2b, 0x35, 0xac,
0xdb, 0x97, 0xf2, 0x3d, 0x90, 0x73, 0xa7, 0xcf,
0xf1, 0x26, 0x1c, 0x9b, 0xed, 0xb7, 0xb3, 0xfd,
0xb2, 0x0c, 0x7d, 0x65, 0x19, 0xc0, 0xa3, 0xbc,
0xfa, 0xa4, 0xbe, 0xb2, 0x56, 0x05, 0xb3, 0x4e,
0x9b, 0x3e, 0xa7, 0xd7, 0x8e, 0x49, 0x72, 0xe8,
0xb4, 0x13, 0x58, 0x25, 0x7a, 0x1b, 0x4f, 0xed,
0x74, 0x26, 0xae, 0x6a, 0xe4, 0x44, 0x4e, 0xb1,
0x70, 0xd9, 0xff, 0x8f, 0x56, 0xd7, 0xd4, 0x19,
0x35, 0x75, 0x82, 0x1d, 0x6f, 0xc8, 0xf2, 0x43,
0x8b, 0x19, 0x57, 0x41, 0x43, 0x89, 0x12, 0xfb,
0x2c, 0x77, 0xc2, 0xd9, 0xd7, 0x6a, 0x75, 0x96,
0x57, 0xce, 0x89, 0xb4, 0x56, 0x74, 0xdd, 0xe7,
0x3a, 0xed, 0xb4, 0x8b, 0x3b, 0x95, 0xf4, 0xde,
0x29, 0x27, 0xdf, 0xf3, 0xe9, 0x09, 0xea, 0xbb,
0xa9, 0x7f, 0xa6, 0xff, 0x21, 0xa5, 0x0c, 0x25,
0x12, 0x56, 0x46, 0xa7, 0x02, 0x09, 0x75, 0xad,
0xb8, 0xba, 0x6c, 0x3d, 0xdc, 0x2b, 0xff, 0x13,
0x25, 0x03, 0x54, 0x0b, 0x94, 0xa6, 0xba, 0x4a,
0x6d, 0x53, 0xdc, 0x6d, 0x69, 0xc8, 0x6f, 0x32,
0x04, 0x7d, 0x80, 0xe7, 0xf6, 0x79, 0xcd, 0x77,
0xc7, 0xc5, 0x1f, 0xc7, 0x4c, 0x79, 0x77, 0x24,
0xf6, 0xe5, 0xe3, 0xf3, 0x5b, 0x2e, 0x4e, 0x9d,
0xfb, 0x2d, 0x53, 0x24, 0xbb, 0xc9, 0x01, 0x74,
0x50, 0xab, 0x8b, 0xbf, 0x50, 0xfe, 0xaf, 0xd3,
0x56, 0x8c, 0x4d, 0xb4, 0x9f, 0xd8, 0x16, 0x4c,
0x5c, 0xd5, 0x45, 0x0e, 0xa9, 0xc4, 0x78, 0xc3,
0x5d, 0x9c, 0x1c, 0xe6, 0xb6, 0x58, 0x5c, 0x23,
0x5a, 0x04, 0xd7, 0x8a, 0xa1, 0x1e, 0xb0, 0x4c,
0x0e, 0x62, 0xcd, 0x3e, 0xda, 0x4e, 0xbb, 0x28,
0x6a, 0x2d, 0xbb, 0xd6, 0x54, 0xe5, 0xf3, 0xb2,
0x6c, 0x39, 0x00, 0x07, 0x3e, 0x94, 0x13, 0x4c,
0x59, 0x62, 0x30, 0x23, 0xcb, 0xd0, 0xa1, 0x9f,
0xc6, 0x4e, 0x0c, 0x3a, 0x51, 0xfb, 0x4e, 0x9a,
0xee, 0x23, 0x59, 0x86, 0xd7, 0xe8, 0x3a, 0x52,
0xba, 0x55, 0x3e, 0x43, 0x79, 0x91, 0xd4, 0x87,
0xbb, 0xbc, 0xd4, 0x4e, 0xe4, 0xd4, 0x07, 0x6f,
0xca, 0x96, 0x6e, 0x52, 0x80, 0x76, 0x9f, 0xa8,
0x15, 0xc5, 0x92, 0xeb, 0xa7, 0x45, 0x33, 0xff,
0xff, 0xb2, 0x41, 0xfd, 0x6b, 0x89, 0xdf, 0xb0,
0x77, 0xc8, 0xbe, 0xf6, 0xfd, 0x19, 0x8d, 0xab,
0x1c, 0xe1, 0x8a, 0x76, 0x02, 0x0c, 0x6f, 0x58,
0x1b, 0xf6, 0xb1, 0x4f, 0xed, 0x02, 0xa9, 0x1c,
0x3d, 0xaa, 0x66, 0xe8, 0x0d, 0x1a, 0x86, 0xaa,
0xb5, 0x98, 0xbe, 0x5d, 0xfe, 0xf7, 0x9d, 0x52,
0x1f, 0xbf, 0xcf, 0x98, 0xb8, 0xaa, 0x8b, 0xfe,
0x6a, 0x8b, 0x5a, 0x95, 0x9e, 0x96, 0x18, 0x3a,
0x6e, 0xef, 0xaa, 0xe8, 0xe3, 0x5a, 0xab, 0x9f,
0x62, 0x58, 0xbf, 0x7b, 0xb7, 0x27, 0xb3, 0xb9,
0xb2, 0x0c, 0x03, 0x51, 0xb4, 0x8f, 0xb6, 0x84,
0x71, 0x83, 0x6b, 0xb9, 0x46, 0x06, 0xc3, 0xa0,
0x28, 0xb2, 0x57, 0xfb, 0xfe, 0x74, 0x33, 0xa9,
0x15, 0x0b, 0x4f, 0x8a, 0xd7, 0xb3, 0x1c, 0x83,
0x0d, 0xb4, 0x8f, 0x7a, 0xb1, 0x7c, 0xad, 0xdb,
0x43, 0xb7, 0x6f, 0x77, 0xad, 0x1f, 0x27, 0x89,
0xe5, 0xe3, 0x16, 0x6d, 0x3f, 0xaf, 0x93, 0xc8,
0xd5, 0x46, 0xe0, 0xa1, 0x81, 0x13, 0x5d, 0x68,
0xd6, 0xa1, 0xf6, 0x21, 0x16, 0x0e, 0x42, 0xb0,
0x04, 0x06, 0x64, 0x60, 0x44, 0xae, 0xd2, 0x3b,
0x92, 0xb0, 0x71, 0xaf, 0x60, 0x46, 0x19, 0x5a,
0x2a, 0xb2, 0x0e, 0xdd, 0xec, 0x6a, 0xc5, 0xeb,
0x14, 0x0d, 0xf7, 0x35, 0x36, 0xe0, 0xde, 0xa7,
0xb5, 0x62, 0xce, 0xa7, 0x66, 0x9b, 0x43, 0x2f,
0x4c, 0x6a, 0xad, 0xd7, 0xef, 0x90, 0xf7, 0xee,
0x4d, 0xc4, 0xf2, 0x1a, 0xfb, 0xe1, 0xe0, 0x56,
0xcd, 0x03, 0x71, 0xd3, 0x8a, 0x12, 0x2d, 0x88,
0xb9, 0x33, 0xce, 0xd2, 0xd8, 0x0f, 0x89, 0xdd,
0xcc, 0xc4, 0x55, 0x13, 0x39, 0x01, 0x90, 0x83,
0x5a, 0x94, 0x2b, 0x7d, 0x45, 0x96, 0xdb, 0x27,
0x47, 0x45, 0xde, 0x87, 0x5c, 0x58, 0xd9, 0xf9,
0x1e, 0x9c, 0xdc, 0xe8, 0x06, 0x44, 0x4b, 0xd9,
0xde, 0x56, 0x55, 0x79, 0x8d, 0xa2, 0x4d, 0x12,
0xa3, 0xde, 0x11, 0x67, 0x96, 0x95, 0xcf, 0x42,
0xb1, 0x39, 0xfd, 0x81, 0x4b, 0xe4, 0x26, 0xb8,
0xc3, 0x0d, 0xdd, 0x2e, 0xfa, 0x70, 0x31, 0x50,
0x0e, 0x40, 0x01, 0x4e, 0xa0, 0xd4, 0xc3, 0x8d,
0x51, 0xb4, 0xfb, 0xdc, 0x6c, 0x6b, 0x5e, 0xd1,
0x1e, 0xff, 0x6f, 0xad, 0x21, 0xd5, 0x64, 0xc0,
0x8f, 0xa0, 0x58, 0xb2, 0x96, 0xf3, 0xe1, 0xe6,
0x07, 0x0f, 0xee, 0x3b, 0xa9, 0xe5, 0x79, 0x12,
0x56, 0xfa, 0x78, 0x96, 0xa5, 0x15, 0xe0, 0x46,
0xef, 0xcd, 0x18, 0xc8, 0x6b, 0x50, 0xdb, 0xce,
0x4d, 0xf3, 0xfe, 0xe4, 0x18, 0xb7, 0x82, 0xb6,
0x01, 0xb5, 0xc4, 0xa7, 0x36, 0xac, 0xe1, 0x22,
0xf4, 0x97, 0x7f, 0xcf, 0x68, 0x76, 0x0a, 0x75,
0xe0, 0xdd, 0x21, 0x50, 0x1b, 0xf9, 0xec, 0x24,
0x30, 0xec, 0x93, 0xe5, 0xfe, 0xc8, 0x58, 0xc2,
0xbd, 0x7d, 0x7e, 0xe7, 0xe0, 0x06, 0xfb, 0x25,
0xba, 0xbc, 0x54, 0x07, 0x5c, 0xc8, 0xfb, 0x73,
0x2e, 0xa7, 0xee, 0xb3, 0xd6, 0x65, 0x6c, 0x9d,
0x28, 0x15, 0xa1, 0x0f, 0x74, 0xe9, 0x39, 0xf9,
0x0c, 0xdd, 0x41, 0xff, 0x7b, 0x65, 0x39, 0x2e,
0xa4, 0xc8, 0xe1, 0xef, 0xea, 0xf4, 0xc7, 0xc4,
0x55, 0x25, 0x5a, 0x9f, 0xf6, 0x75, 0x4b, 0xe1,
0x84, 0xbd, 0xca, 0x89, 0x6a, 0x2b, 0xf8, 0x3c,
0xb5, 0x13, 0x0d, 0x75, 0x5b, 0x0c, 0x1e, 0xfe,
0x9e, 0x1c, 0xac, 0xe4, 0x26, 0x0e, 0x4f, 0x1c,
0x92, 0xa0, 0x1e, 0xf4, 0x1e, 0x09, 0x46, 0xbe,
0xe1, 0x24, 0x50, 0x1d, 0x27, 0x79, 0x45, 0x0c,
0x64, 0x5e, 0x6b, 0x31, 0x4b, 0x8e, 0xe5, 0xf4,
0xbc, 0xe7, 0x23, 0x13, 0xd7, 0x49, 0xf0, 0x39,
0x2e, 0x97, 0xb8, 0x6d, 0x82, 0x8b, 0x15, 0x72,
0x7c, 0xb5, 0xfe, 0x7c, 0x8f, 0x4f, 0x82, 0xd5,
0xed, 0xfa, 0x40, 0xa2, 0x49, 0xce, 0xe7, 0xd3,
0x59, 0xef, 0xe4, 0xc4, 0x6d, 0x12, 0x4d, 0x8e,
0x34, 0x53, 0x82, 0x44, 0xf7, 0xc9, 0x89, 0x5a,
0x37, 0x93, 0x49, 0xce, 0x28, 0xdb, 0x64, 0x74,
0x25, 0xc6, 0x49, 0x2e, 0x71, 0xbc, 0x33, 0x78,
0x01, 0xc3, 0x02, 0xd2, 0x58, 0xed, 0x50, 0xb6,
0x99, 0x38, 0x2c, 0x41, 0xc2, 0xc4, 0x5d, 0x68,
0x18, 0x07, 0xb9, 0x44, 0xbd, 0xf0, 0xd4, 0x20,
0x20, 0x5b, 0x54, 0xab, 0x67, 0xe3, 0xff, 0x64,
0x78, 0xbc, 0x5b, 0x24, 0x18, 0x2a, 0xf2, 0x46,
0x09, 0x46, 0x5b, 0x5b, 0x4a, 0x96, 0xe5, 0xc2,
0xa0, 0x36, 0xa0, 0x0b, 0x09, 0x39, 0xa5, 0x0e,
0x83, 0xe4, 0x3b, 0x64, 0x72, 0x4a, 0xf3, 0x60,
0x1a, 0x2f, 0x4c, 0xe5, 0x0e, 0xf3, 0xde, 0x24,
0xe8, 0x0c, 0x32, 0x52, 0x36, 0xb4, 0xe3, 0x2a,
0x86, 0x2e, 0x6b, 0xc7, 0x67, 0x99, 0x87, 0x2c,
0x11, 0xdd, 0x2a, 0x86, 0xda, 0x85, 0x1c, 0x9e,
0x95, 0xe5, 0x9e, 0x99, 0xe0, 0xb7, 0x3b, 0x5f,
0xe2, 0x82, 0x09, 0x6e, 0x08, 0x40, 0x7b, 0x89,
0x72, 0x60, 0xfc, 0xb5, 0x6b, 0xbf, 0x17, 0x06,
0x7f, 0x29, 0xaf, 0xd0, 0xa8, 0xe7, 0x7e, 0x6f,
0x3e, 0x0b, 0x8d, 0xeb, 0xae, 0x9d, 0x98, 0x2a,
0xe6, 0xcf, 0xe3, 0x0b, 0x25, 0xc6, 0xc7, 0x03,
0xbf, 0x7f, 0xb7, 0x85, 0xfb, 0xae, 0x54, 0x5e,
0x65, 0xed, 0x6c, 0x8e, 0xd0, 0x34, 0x25, 0x3b,
0xf2, 0x52, 0x23, 0x34, 0x95, 0xb2, 0x1e, 0x77,
0x46, 0xa9, 0xb5, 0xb8, 0x24, 0xd7, 0xda, 0x3b,
0xbe, 0x69, 0xd6, 0xe3, 0xe4, 0x4d, 0x02, 0xbc,
0xb6, 0xbb, 0xe2, 0x20, 0xcb, 0x92, 0x03, 0xe5,
0x86, 0xd6, 0x0c, 0xcb, 0x37, 0x0f, 0xc5, 0x78,
0x7c, 0x86, 0xee, 0x7e, 0xcd, 0xe7, 0x39, 0x24,
0xdb, 0x5d, 0x74, 0x57, 0x9c, 0x9b, 0x64, 0x99,
0xda, 0xc8, 0x36, 0x13, 0x59, 0x97, 0x09, 0xb9,
0xbf, 0x5a, 0xc2, 0xd5, 0xc5, 0xe7, 0xe0, 0x33,
0xcc, 0xbb, 0x78, 0x65, 0xdf, 0xe1, 0xee, 0x34,
0x93, 0x93, 0x54, 0xb6, 0x4f, 0xff, 0xd6, 0xf2,
0xd6, 0x67, 0x5c, 0xe8, 0xd0, 0x52, 0x99, 0x93,
0x15, 0xff, 0x7f, 0x2d, 0x67, 0x46, 0x43, 0xa3,
0xeb, 0x66, 0x5b, 0x93, 0x84, 0x3f, 0xdb, 0xa2,
0x7e, 0x90, 0x62, 0xfe, 0x9b, 0x37, 0x4f, 0xd4,
0xf1, 0xde, 0x7c, 0xd6, 0x79, 0x5d, 0x8a, 0x28,
0xcd, 0x60, 0xb0, 0xff, 0x72, 0x3f, 0x6a, 0xe4,
0x7d, 0x56, 0x19, 0xa1, 0x89, 0x3e, 0xd3, 0xe5,
0xed, 0x0e, 0xbb, 0xf8, 0x4c, 0xfc, 0xbf, 0x67,
0x67, 0x3b, 0xe3, 0x56, 0xd0, 0x73, 0x65, 0x9b,
0x3f, 0x93, 0xc9, 0x5f, 0x25, 0xca, 0x73, 0xda,
0x6b, 0xb2, 0x8d, 0x95, 0x8a, 0x4a, 0xb3, 0x4d,
0x1a, 0x25, 0xf1, 0xff, 0x95, 0xa5, 0x12, 0xb4,
0x9a, 0xbe, 0x52, 0xb6, 0x3b, 0x1e, 0xf6, 0xf3,
0xc4, 0x4c, 0xd6, 0x71, 0x2f, 0xd6, 0x77, 0x65,
0x9b, 0x4d, 0xbd, 0x7c, 0xb6, 0x49, 0x69, 0x0b,
0xc3, 0x92, 0x56, 0xc7, 0x1e, 0x0e, 0x4a, 0x75,
0xb8, 0x30, 0xe3, 0x7b, 0xea, 0x96, 0xcc, 0xf0,
0x7b, 0xd5, 0x7e, 0xcf, 0x65, 0x47, 0x68, 0x5a,
0x38, 0xfa, 0x59, 0xd6, 0xe5, 0x3b, 0xa6, 0xc4,
0x85, 0x11, 0xd4, 0x6a, 0xd8, 0xaf, 0xd8, 0x36,
0xe7, 0x62, 0xea, 0x9b, 0xd9, 0x6f, 0xd9, 0x47,
0xba, 0x9f, 0x93, 0xef, 0x95, 0xcf, 0x54, 0x6b,
0x3f, 0xb0, 0x2b, 0x98, 0x73, 0x55, 0x4d, 0xad,
0x61, 0x13, 0x07, 0xcc, 0xda, 0x07, 0x57, 0x5f,
0x46, 0x0e, 0x40, 0xc6, 0xee, 0xe5, 0x42, 0x61,
0x51, 0x83, 0x10, 0x4e, 0x34, 0xe5, 0xc9, 0x75,
0x6d, 0xf2, 0x39, 0x98, 0x70, 0xf3, 0x70, 0x46,
0xf2, 0x99, 0x24, 0x8a, 0x15, 0x7c, 0x8e, 0x79,
0xc7, 0x16, 0xc3, 0x48, 0x3e, 0x28, 0xdb, 0x9b,
0xb7, 0x8d, 0x31, 0x72, 0xe8, 0x74, 0x8b, 0x21,
0x57, 0x54, 0x4b, 0x58, 0xa9, 0x0b, 0xbd, 0x5f,
0xb6, 0x35, 0x95, 0xa3, 0x6e, 0x1f, 0x73, 0xd3,
0xf5, 0x79, 0x17, 0x0c, 0xfc, 0x43, 0xf3, 0x12,
0x56, 0xb6, 0xc1, 0x90, 0x7b, 0xd5, 0x84, 0x75,
0x0b, 0xb8, 0x50, 0xaa, 0x35, 0xba, 0x1a, 0xe3,
0xfb, 0x1b, 0x8a, 0xbe, 0xad, 0xb5, 0xdf, 0xbe,
0x76, 0x9f, 0xd6, 0xa5, 0xe4, 0xff, 0x66, 0x20,
0x8f, 0xb2, 0x05, 0x3d, 0xb8, 0x78, 0x1f, 0x27,
0x82, 0x24, 0x52, 0xcd, 0x58, 0xe3, 0xeb, 0x94,
0xf7, 0xe6, 0x62, 0x90, 0x41, 0xed, 0xfb, 0x1a,
0xbb, 0xb1, 0x7f, 0x91, 0xe8, 0x77, 0x13, 0x2c,
0x7e, 0x2f, 0x6e, 0x97, 0xb8, 0x51, 0xf9, 0x6c,
0xec, 0xb7, 0x8c, 0xab, 0x3e, 0x73, 0x1b, 0xc4,
0x16, 0xbf, 0x03, 0xfb, 0x2b, 0x77, 0x28, 0xe3,
0x0e, 0x4d, 0x8c, 0xcc, 0xb4, 0xe5, 0xaa, 0x99,
0x9d, 0xc6, 0xc4, 0x55, 0x35, 0xef, 0x4b, 0x94,
0xdd, 0x2e, 0x68, 0x58, 0x34, 0x37, 0x67, 0xb7,
0x49, 0x39, 0xa0, 0x29, 0xb2, 0xe4, 0x26, 0x09,
0x43, 0x6f, 0xa0, 0xbd, 0xd6, 0x2b, 0x63, 0x4e,
0x2c, 0x09, 0xc6, 0x08, 0xa6, 0x01, 0x07, 0xc5,
0xaf, 0x43, 0x90, 0x8b, 0xa6, 0xc5, 0x2f, 0xf7,
0xc5, 0xac, 0xde, 0x2f, 0x77, 0x20, 0xba, 0x45,
0xdc, 0x2e, 0xdb, 0xaa, 0xdd, 0x03, 0x96, 0xcf,
0xca, 0xc5, 0x08, 0x2d, 0x7f, 0xa9, 0xb7, 0x5e,
0xd8, 0x22, 0xb9, 0xc0, 0x05, 0xcd, 0xad, 0xb3,
0x8d, 0xf2, 0xbe, 0x9d, 0x5b, 0x96, 0x6d, 0x92,
0x33, 0xe5, 0xe4, 0x3c, 0xa4, 0xf5, 0x6c, 0xaf,
0x24, 0x70, 0x24, 0x32, 0xb5, 0x92, 0x16, 0xba,
0x38, 0xd5, 0xea, 0x4d, 0x87, 0xe8, 0x1b, 0x67,
0x77, 0xdc, 0x2a, 0x99, 0x0b, 0x9e, 0x79, 0x17,
0x28, 0x2b, 0xcb, 0xf7, 0x44, 0xc3, 0x34, 0x4a,
0xc6, 0x6a, 0xf5, 0xe7, 0x25, 0x86, 0x2d, 0x64,
0x90, 0x8b, 0x5a, 0x83, 0xa3, 0xb5, 0xcb, 0x67,
0xa3, 0x2b, 0x1e, 0x37, 0x92, 0xa7, 0xdf, 0xee,
0x2a, 0xc7, 0x18, 0xad, 0xef, 0x97, 0xb9, 0xb8,
0xdc, 0xb1, 0x36, 0x76, 0x95, 0xbf, 0x5f, 0x58,
0x2c, 0x3c, 0x25, 0x27, 0x1d, 0x8a, 0x04, 0xcb,
0x22, 0xcc, 0x0f, 0xe7, 0xc0, 0x58, 0xd8, 0x71,
0x3b, 0xeb, 0x72, 0xf7, 0x13, 0x46, 0x66, 0x1a,
0x7b, 0xe1, 0xa2, 0x13, 0x6d, 0xd6, 0xe1, 0x62,
0x8d, 0x84, 0xb9, 0x1c, 0xdd, 0xe7, 0xe4, 0xac,
0x3b, 0xd5, 0x50, 0x2a, 0xcb, 0x52, 0x3f, 0x54,
0x8e, 0x57, 0xfc, 0xb9, 0x2c, 0x37, 0x77, 0x00,
0x80, 0xf6, 0x3d, 0x18, 0xa7, 0xf4, 0xf8, 0x04,
0x2d, 0x43, 0x6b, 0x75, 0x99, 0x1c, 0xb4, 0x24,
0x3c, 0x9c, 0x9c, 0x48, 0x58, 0xce, 0xc8, 0x76,
0x33, 0x69, 0xd6, 0x67, 0xdf, 0x28, 0xef, 0x7f,
0x0a, 0x72, 0x7f, 0xcb, 0x0c, 0x3e, 0x3e, 0x91,
0x6d, 0x51, 0x4f, 0xc8, 0xf7, 0x44, 0x42, 0x4b,
0x1f, 0xd6, 0xda, 0x49, 0x96, 0x84, 0x84, 0x0b,
0x15, 0x8a, 0xda, 0x5f, 0x9c, 0xf7, 0xe8, 0x4d,
0x90, 0xb3, 0x3d, 0xc6, 0x0e, 0xa6, 0x55, 0x31,
0xff, 0x1f, 0x5d, 0x6b, 0x6a, 0x57, 0xfb, 0x6c,
0x8f, 0xcf, 0xc9, 0xbe, 0xc7, 0xf7, 0xda, 0x37,
0xb8, 0xc4, 0x44, 0xb6, 0xcb, 0x84, 0x61, 0xf8,
0x68, 0x0c, 0x43, 0xfd, 0x70, 0x6d, 0x7c, 0x58,
0x50, 0xcc, 0x48, 0xae, 0x92, 0xdf, 0xf9, 0x8d,
0xd9, 0xf6, 0xc2, 0x04, 0x39, 0xdb, 0xe6, 0x3b,
0x2e, 0x1b, 0x60, 0xbd, 0x28, 0xeb, 0xbe, 0xb2,
0x9d, 0xef, 0x95, 0x75, 0xe9, 0xbb, 0xcb, 0xcd,
0x21, 0x8e, 0x4a, 0x94, 0xa3, 0x57, 0xf1, 0xde,
0xef, 0xcf, 0x76, 0x16, 0xd6, 0x99, 0x67, 0x3b,
0xdc, 0xbb, 0xb6, 0xd6, 0x60, 0x8c, 0x7b, 0xdd,
0x6e, 0x29, 0x27, 0x97, 0x6d, 0xb3, 0x2f, 0x53,
0xff, 0x59, 0x16, 0x0d, 0x93, 0x4b, 0x24, 0x31,
0xa3, 0xf8, 0x9d, 0xef, 0x60, 0x95, 0xdc, 0x76,
0x89, 0x6e, 0x59, 0x33, 0x37, 0x57, 0xc8, 0x67,
0xa0, 0x91, 0x12, 0xb7, 0xbd, 0xa3, 0xf4, 0xe6,
0xd0, 0xc4, 0xf8, 0xbb, 0x22, 0x77, 0xcb, 0x45,
0x2f, 0xed, 0x20, 0x18, 0x31, 0xed, 0x9b, 0x59,
0x96, 0xb1, 0x91, 0x6b, 0xdf, 0xfd, 0x5d, 0xf2,
0x7a, 0xf7, 0x2e, 0x57, 0x14, 0x79, 0x4f, 0x6e,
0x77, 0xd8, 0x31, 0xe8, 0x38, 0xc8, 0x76, 0x98,
0xd0, 0xf5, 0x88, 0xcf, 0x47, 0x3f, 0xe0, 0xbe,
0x01, 0x5e, 0xf8, 0x3d, 0xb9, 0x2f, 0x31, 0x89,
0x3f, 0x17, 0x2c, 0x1f, 0xcd, 0xfb, 0x64, 0xb2,
0x7b, 0x99, 0xb8, 0x0e, 0xb7, 0x63, 0x12, 0xd7,
0xdd, 0x2e, 0x07, 0x36, 0x5d, 0x0f, 0xa8, 0xa3,
0xe5, 0xe4, 0xc3, 0xc9, 0x8f, 0xdc, 0x20, 0xb9,
0x15, 0x6e, 0x35, 0x76, 0x56, 0x0e, 0x5e, 0x12,
0xa2, 0x8d, 0xcb, 0xe7, 0x60, 0xbf, 0xa3, 0x6e,
0x90, 0x96, 0xc3, 0x74, 0xb7, 0x21, 0x51, 0xa4,
0x3e, 0x8e, 0xba, 0xb9, 0x4f, 0x26, 0xe8, 0xa3,
0xba, 0xf4, 0x55, 0x7a, 0x7b, 0xc2, 0xe2, 0x7f,
0xe3, 0x44, 0xca, 0xad, 0xd3, 0x48, 0xc4, 0xe9,
0x06, 0xc4, 0xf6, 0x38, 0x41, 0x7d, 0x69, 0xc8,
0xf6, 0xba, 0xb2, 0x6d, 0x12, 0x01, 0x12, 0x57,
0x8a, 0xea, 0x28, 0xd2, 0xe4, 0x82, 0x80, 0xe2,
0x4f, 0xea, 0xc0, 0x3e, 0x95, 0xed, 0x2e, 0xbc,
0xa5, 0xdd, 0x3a, 0xb5, 0xff, 0x2b, 0x9f, 0x83,
0x22, 0x44, 0x8e, 0x5b, 0x9e, 0xe0, 0x18, 0x26,
0xe7, 0xfc, 0xd5, 0x55, 0xff, 0xcf, 0xdd, 0xa8,
0xdd, 0xcf, 0xb8, 0x98, 0xa4, 0x5b, 0x15, 0xdf,
0x0b, 0xb9, 0xc7, 0xef, 0xe4, 0x3b, 0xca, 0x64,
0xff, 0xcb, 0xe7, 0x23, 0xd1, 0xa7, 0x45, 0x33,
0x31, 0x1e, 0xc8, 0x83, 0xcf, 0x48, 0xa2, 0x4e,
0x17, 0xbf, 0xaf, 0x1f, 0x48, 0xbf, 0xa7, 0x89,
0xeb, 0x70, 0x26, 0xae, 0x92, 0xa4, 0xb9, 0xac,
0x73, 0x95, 0x24, 0x69, 0xcd, 0x4c, 0x5c, 0x25,
0x49, 0x5a, 0x33, 0x13, 0x57, 0x49, 0x92, 0xd6,
0xcc, 0xc4, 0x55, 0x92, 0xa4, 0x35, 0x33, 0x71,
0x95, 0x24, 0x69, 0xcd, 0x4c, 0x5c, 0x25, 0x49,
0x5a, 0x33, 0x13, 0x57, 0x49, 0x92, 0xd6, 0xcc,
0xc4, 0x55, 0x92, 0xa4, 0x35, 0xdb, 0x6d, 0x83,
0x48, 0xf0, 0x97, 0x7b, 0x0a, 0x96, 0x43, 0xa9,
0xad, 0xd3, 0x77, 0xf7, 0x1c, 0x73, 0x70, 0x33,
0xc6, 0xee, 0x39, 0xef, 0x6a, 0x46, 0x07, 0xda,
0xe4, 0x80, 0x15, 0xf8, 0xc8, 0xde, 0xdb, 0x37,
0xc3, 0x9c, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92,
0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49,
0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92,
0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49,
0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92,
0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49,
0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92,
0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49,
0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92,
0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49,
0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92,
0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49,
0x5b, 0xb7, 0x67, 0xcf, 0xff, 0x03, 0x27, 0xa6,
0xaa, 0x9c, 0x80, 0xec, 0x5b, 0x07, 0x00, 0x00,
0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
0x60, 0x82,
};
unsigned int mslogo_jpg_size = sizeof(mslogo_jpg);
const unsigned char nxlogo_png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x01, 0x34, 0x00, 0x00,
0x00, 0x55, 0x08, 0x06, 0x00, 0x00, 0x00, 0xc7, 0x5e, 0x18, 0xd4,
0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2e,
0x23, 0x00, 0x00, 0x2e, 0x23, 0x01, 0x78, 0xa5, 0x3f, 0x76, 0x00,
0x00, 0x0a, 0x4f, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, 0x6f, 0x74,
0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x49, 0x43, 0x43, 0x20, 0x70,
0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x00, 0x00, 0x78, 0xda, 0x9d,
0x53, 0x67, 0x54, 0x53, 0xe9, 0x16, 0x3d, 0xf7, 0xde, 0xf4, 0x42,
0x4b, 0x88, 0x80, 0x94, 0x4b, 0x6f, 0x52, 0x15, 0x08, 0x20, 0x52,
0x42, 0x8b, 0x80, 0x14, 0x91, 0x26, 0x2a, 0x21, 0x09, 0x10, 0x4a,
0x88, 0x21, 0xa1, 0xd9, 0x15, 0x51, 0xc1, 0x11, 0x45, 0x45, 0x04,
0x1b, 0xc8, 0xa0, 0x88, 0x03, 0x8e, 0x8e, 0x80, 0x8c, 0x15, 0x51,
0x2c, 0x0c, 0x8a, 0x0a, 0xd8, 0x07, 0xe4, 0x21, 0xa2, 0x8e, 0x83,
0xa3, 0x88, 0x8a, 0xca, 0xfb, 0xe1, 0x7b, 0xa3, 0x6b, 0xd6, 0xbc,
0xf7, 0xe6, 0xcd, 0xfe, 0xb5, 0xd7, 0x3e, 0xe7, 0xac, 0xf3, 0x9d,
0xb3, 0xcf, 0x07, 0xc0, 0x08, 0x0c, 0x96, 0x48, 0x33, 0x51, 0x35,
0x80, 0x0c, 0xa9, 0x42, 0x1e, 0x11, 0xe0, 0x83, 0xc7, 0xc4, 0xc6,
0xe1, 0xe4, 0x2e, 0x40, 0x81, 0x0a, 0x24, 0x70, 0x00, 0x10, 0x08,
0xb3, 0x64, 0x21, 0x73, 0xfd, 0x23, 0x01, 0x00, 0xf8, 0x7e, 0x3c,
0x3c, 0x2b, 0x22, 0xc0, 0x07, 0xbe, 0x00, 0x01, 0x78, 0xd3, 0x0b,
0x08, 0x00, 0xc0, 0x4d, 0x9b, 0xc0, 0x30, 0x1c, 0x87, 0xff, 0x0f,
0xea, 0x42, 0x99, 0x5c, 0x01, 0x80, 0x84, 0x01, 0xc0, 0x74, 0x91,
0x38, 0x4b, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7a, 0x8e, 0x42, 0xa6,
0x00, 0x40, 0x46, 0x01, 0x80, 0x9d, 0x98, 0x26, 0x53, 0x00, 0xa0,
0x04, 0x00, 0x60, 0xcb, 0x63, 0x62, 0xe3, 0x00, 0x50, 0x2d, 0x00,
0x60, 0x27, 0x7f, 0xe6, 0xd3, 0x00, 0x80, 0x9d, 0xf8, 0x99, 0x7b,
0x01, 0x00, 0x5b, 0x94, 0x21, 0x15, 0x01, 0xa0, 0x91, 0x00, 0x20,
0x13, 0x65, 0x88, 0x44, 0x00, 0x68, 0x3b, 0x00, 0xac, 0xcf, 0x56,
0x8a, 0x45, 0x00, 0x58, 0x30, 0x00, 0x14, 0x66, 0x4b, 0xc4, 0x39,
0x00, 0xd8, 0x2d, 0x00, 0x30, 0x49, 0x57, 0x66, 0x48, 0x00, 0xb0,
0xb7, 0x00, 0xc0, 0xce, 0x10, 0x0b, 0xb2, 0x00, 0x08, 0x0c, 0x00,
0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7b, 0x00, 0x60, 0xc8,
0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, 0xf2, 0x57,
0x3c, 0xf1, 0x2b, 0xae, 0x10, 0xe7, 0x2a, 0x00, 0x00, 0x78, 0x99,
0xb2, 0x3c, 0xb9, 0x24, 0x39, 0x45, 0x81, 0x5b, 0x08, 0x2d, 0x71,
0x07, 0x57, 0x57, 0x2e, 0x1e, 0x28, 0xce, 0x49, 0x17, 0x2b, 0x14,
0x36, 0x61, 0x02, 0x61, 0x9a, 0x40, 0x2e, 0xc2, 0x79, 0x99, 0x19,
0x32, 0x81, 0x34, 0x0f, 0xe0, 0xf3, 0xcc, 0x00, 0x00, 0xa0, 0x91,
0x15, 0x11, 0xe0, 0x83, 0xf3, 0xfd, 0x78, 0xce, 0x0e, 0xae, 0xce,
0xce, 0x36, 0x8e, 0xb6, 0x0e, 0x5f, 0x2d, 0xea, 0xbf, 0x06, 0xff,
0x22, 0x62, 0x62, 0xe3, 0xfe, 0xe5, 0xcf, 0xab, 0x70, 0x40, 0x00,
0x00, 0xe1, 0x74, 0x7e, 0xd1, 0xfe, 0x2c, 0x2f, 0xb3, 0x1a, 0x80,
0x3b, 0x06, 0x80, 0x6d, 0xfe, 0xa2, 0x25, 0xee, 0x04, 0x68, 0x5e,
0x0b, 0xa0, 0x75, 0xf7, 0x8b, 0x66, 0xb2, 0x0f, 0x40, 0xb5, 0x00,
0xa0, 0xe9, 0xda, 0x57, 0xf3, 0x70, 0xf8, 0x7e, 0x3c, 0x3c, 0x45,
0xa1, 0x90, 0xb9, 0xd9, 0xd9, 0xe5, 0xe4, 0xe4, 0xd8, 0x4a, 0xc4,
0x42, 0x5b, 0x61, 0xca, 0x57, 0x7d, 0xfe, 0x67, 0xc2, 0x5f, 0xc0,
0x57, 0xfd, 0x6c, 0xf9, 0x7e, 0x3c, 0xfc, 0xf7, 0xf5, 0xe0, 0xbe,
0xe2, 0x24, 0x81, 0x32, 0x5d, 0x81, 0x47, 0x04, 0xf8, 0xe0, 0xc2,
0xcc, 0xf4, 0x4c, 0xa5, 0x1c, 0xcf, 0x92, 0x09, 0x84, 0x62, 0xdc,
0xe6, 0x8f, 0x47, 0xfc, 0xb7, 0x0b, 0xff, 0xfc, 0x1d, 0xd3, 0x22,
0xc4, 0x49, 0x62, 0xb9, 0x58, 0x2a, 0x14, 0xe3, 0x51, 0x12, 0x71,
0x8e, 0x44, 0x9a, 0x8c, 0xf3, 0x32, 0xa5, 0x22, 0x89, 0x42, 0x92,
0x29, 0xc5, 0x25, 0xd2, 0xff, 0x64, 0xe2, 0xdf, 0x2c, 0xfb, 0x03,
0x3e, 0xdf, 0x35, 0x00, 0xb0, 0x6a, 0x3e, 0x01, 0x7b, 0x91, 0x2d,
0xa8, 0x5d, 0x63, 0x03, 0xf6, 0x4b, 0x27, 0x10, 0x58, 0x74, 0xc0,
0xe2, 0xf7, 0x00, 0x00, 0xf2, 0xbb, 0x6f, 0xc1, 0xd4, 0x28, 0x08,
0x03, 0x80, 0x68, 0x83, 0xe1, 0xcf, 0x77, 0xff, 0xef, 0x3f, 0xfd,
0x47, 0xa0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00,
0x5e, 0x44, 0x24, 0x2e, 0x54, 0xca, 0xb3, 0x3f, 0xc7, 0x08, 0x00,
0x00, 0x44, 0xa0, 0x81, 0x2a, 0xb0, 0x41, 0x1b, 0xf4, 0xc1, 0x18,
0x2c, 0xc0, 0x06, 0x1c, 0xc1, 0x05, 0xdc, 0xc1, 0x0b, 0xfc, 0x60,
0x36, 0x84, 0x42, 0x24, 0xc4, 0xc2, 0x42, 0x10, 0x42, 0x0a, 0x64,
0x80, 0x1c, 0x72, 0x60, 0x29, 0xac, 0x82, 0x42, 0x28, 0x86, 0xcd,
0xb0, 0x1d, 0x2a, 0x60, 0x2f, 0xd4, 0x40, 0x1d, 0x34, 0xc0, 0x51,
0x68, 0x86, 0x93, 0x70, 0x0e, 0x2e, 0xc2, 0x55, 0xb8, 0x0e, 0x3d,
0x70, 0x0f, 0xfa, 0x61, 0x08, 0x9e, 0xc1, 0x28, 0xbc, 0x81, 0x09,
0x04, 0x41, 0xc8, 0x08, 0x13, 0x61, 0x21, 0xda, 0x88, 0x01, 0x62,
0x8a, 0x58, 0x23, 0x8e, 0x08, 0x17, 0x99, 0x85, 0xf8, 0x21, 0xc1,
0x48, 0x04, 0x12, 0x8b, 0x24, 0x20, 0xc9, 0x88, 0x14, 0x51, 0x22,
0x4b, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8a, 0x54, 0x20, 0x55, 0x48,
0x1d, 0xf2, 0x3d, 0x72, 0x02, 0x39, 0x87, 0x5c, 0x46, 0xba, 0x91,
0x3b, 0xc8, 0x00, 0x32, 0x82, 0xfc, 0x86, 0xbc, 0x47, 0x31, 0x94,
0x81, 0xb2, 0x51, 0x3d, 0xd4, 0x0c, 0xb5, 0x43, 0xb9, 0xa8, 0x37,
0x1a, 0x84, 0x46, 0xa2, 0x0b, 0xd0, 0x64, 0x74, 0x31, 0x9a, 0x8f,
0x16, 0xa0, 0x9b, 0xd0, 0x72, 0xb4, 0x1a, 0x3d, 0x8c, 0x36, 0xa1,
0xe7, 0xd0, 0xab, 0x68, 0x0f, 0xda, 0x8f, 0x3e, 0x43, 0xc7, 0x30,
0xc0, 0xe8, 0x18, 0x07, 0x33, 0xc4, 0x6c, 0x30, 0x2e, 0xc6, 0xc3,
0x42, 0xb1, 0x38, 0x2c, 0x09, 0x93, 0x63, 0xcb, 0xb1, 0x22, 0xac,
0x0c, 0xab, 0xc6, 0x1a, 0xb0, 0x56, 0xac, 0x03, 0xbb, 0x89, 0xf5,
0x63, 0xcf, 0xb1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xc0, 0x09, 0x36,
0x04, 0x77, 0x42, 0x20, 0x61, 0x1e, 0x41, 0x48, 0x58, 0x4c, 0x58,
0x4e, 0xd8, 0x48, 0xa8, 0x20, 0x1c, 0x24, 0x34, 0x11, 0xda, 0x09,
0x37, 0x09, 0x03, 0x84, 0x51, 0xc2, 0x27, 0x22, 0x93, 0xa8, 0x4b,
0xb4, 0x26, 0xba, 0x11, 0xf9, 0xc4, 0x18, 0x62, 0x32, 0x31, 0x87,
0x58, 0x48, 0x2c, 0x23, 0xd6, 0x12, 0x8f, 0x13, 0x2f, 0x10, 0x7b,
0x88, 0x43, 0xc4, 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xb9,
0x90, 0x02, 0x49, 0xb1, 0xa4, 0x54, 0xd2, 0x12, 0xd2, 0x46, 0xd2,
0x6e, 0x52, 0x23, 0xe9, 0x2c, 0xa9, 0x9b, 0x34, 0x48, 0x1a, 0x23,
0x93, 0xc9, 0xda, 0x64, 0x6b, 0xb2, 0x07, 0x39, 0x94, 0x2c, 0x20,
0x2b, 0xc8, 0x85, 0xe4, 0x9d, 0xe4, 0xc3, 0xe4, 0x33, 0xe4, 0x1b,
0xe4, 0x21, 0xf2, 0x5b, 0x0a, 0x9d, 0x62, 0x40, 0x71, 0xa4, 0xf8,
0x53, 0xe2, 0x28, 0x52, 0xca, 0x6a, 0x4a, 0x19, 0xe5, 0x10, 0xe5,
0x34, 0xe5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xa3, 0x9a, 0x52,
0xdd, 0xa8, 0xa1, 0x54, 0x11, 0x35, 0x8f, 0x5a, 0x42, 0xad, 0xa1,
0xb6, 0x52, 0xaf, 0x51, 0x87, 0xa8, 0x13, 0x34, 0x75, 0x9a, 0x39,
0xcd, 0x83, 0x16, 0x49, 0x4b, 0xa5, 0xad, 0xa2, 0x95, 0xd3, 0x1a,
0x68, 0x17, 0x68, 0xf7, 0x69, 0xaf, 0xe8, 0x74, 0xba, 0x11, 0xdd,
0x95, 0x1e, 0x4e, 0x97, 0xd0, 0x57, 0xd2, 0xcb, 0xe9, 0x47, 0xe8,
0x97, 0xe8, 0x03, 0xf4, 0x77, 0x0c, 0x0d, 0x86, 0x15, 0x83, 0xc7,
0x88, 0x67, 0x28, 0x19, 0x9b, 0x18, 0x07, 0x18, 0x67, 0x19, 0x77,
0x18, 0xaf, 0x98, 0x4c, 0xa6, 0x19, 0xd3, 0x8b, 0x19, 0xc7, 0x54,
0x30, 0x37, 0x31, 0xeb, 0x98, 0xe7, 0x99, 0x0f, 0x99, 0x6f, 0x55,
0x58, 0x2a, 0xb6, 0x2a, 0x7c, 0x15, 0x91, 0xca, 0x0a, 0x95, 0x4a,
0x95, 0x26, 0x95, 0x1b, 0x2a, 0x2f, 0x54, 0xa9, 0xaa, 0xa6, 0xaa,
0xde, 0xaa, 0x0b, 0x55, 0xf3, 0x55, 0xcb, 0x54, 0x8f, 0xa9, 0x5e,
0x53, 0x7d, 0xae, 0x46, 0x55, 0x33, 0x53, 0xe3, 0xa9, 0x09, 0xd4,
0x96, 0xab, 0x55, 0xaa, 0x9d, 0x50, 0xeb, 0x53, 0x1b, 0x53, 0x67,
0xa9, 0x3b, 0xa8, 0x87, 0xaa, 0x67, 0xa8, 0x6f, 0x54, 0x3f, 0xa4,
0x7e, 0x59, 0xfd, 0x89, 0x06, 0x59, 0xc3, 0x4c, 0xc3, 0x4f, 0x43,
0xa4, 0x51, 0xa0, 0xb1, 0x5f, 0xe3, 0xbc, 0xc6, 0x20, 0x0b, 0x63,
0x19, 0xb3, 0x78, 0x2c, 0x21, 0x6b, 0x0d, 0xab, 0x86, 0x75, 0x81,
0x35, 0xc4, 0x26, 0xb1, 0xcd, 0xd9, 0x7c, 0x76, 0x2a, 0xbb, 0x98,
0xfd, 0x1d, 0xbb, 0x8b, 0x3d, 0xaa, 0xa9, 0xa1, 0x39, 0x43, 0x33,
0x4a, 0x33, 0x57, 0xb3, 0x52, 0xf3, 0x94, 0x66, 0x3f, 0x07, 0xe3,
0x98, 0x71, 0xf8, 0x9c, 0x74, 0x4e, 0x09, 0xe7, 0x28, 0xa7, 0x97,
0xf3, 0x7e, 0x8a, 0xde, 0x14, 0xef, 0x29, 0xe2, 0x29, 0x1b, 0xa6,
0x34, 0x4c, 0xb9, 0x31, 0x65, 0x5c, 0x6b, 0xaa, 0x96, 0x97, 0x96,
0x58, 0xab, 0x48, 0xab, 0x51, 0xab, 0x47, 0xeb, 0xbd, 0x36, 0xae,
0xed, 0xa7, 0x9d, 0xa6, 0xbd, 0x45, 0xbb, 0x59, 0xfb, 0x81, 0x0e,
0x41, 0xc7, 0x4a, 0x27, 0x5c, 0x27, 0x47, 0x67, 0x8f, 0xce, 0x05,
0x9d, 0xe7, 0x53, 0xd9, 0x53, 0xdd, 0xa7, 0x0a, 0xa7, 0x16, 0x4d,
0x3d, 0x3a, 0xf5, 0xae, 0x2e, 0xaa, 0x6b, 0xa5, 0x1b, 0xa1, 0xbb,
0x44, 0x77, 0xbf, 0x6e, 0xa7, 0xee, 0x98, 0x9e, 0xbe, 0x5e, 0x80,
0x9e, 0x4c, 0x6f, 0xa7, 0xde, 0x79, 0xbd, 0xe7, 0xfa, 0x1c, 0x7d,
0x2f, 0xfd, 0x54, 0xfd, 0x6d, 0xfa, 0xa7, 0xf5, 0x47, 0x0c, 0x58,
0x06, 0xb3, 0x0c, 0x24, 0x06, 0xdb, 0x0c, 0xce, 0x18, 0x3c, 0xc5,
0x35, 0x71, 0x6f, 0x3c, 0x1d, 0x2f, 0xc7, 0xdb, 0xf1, 0x51, 0x43,
0x5d, 0xc3, 0x40, 0x43, 0xa5, 0x61, 0x95, 0x61, 0x97, 0xe1, 0x84,
0x91, 0xb9, 0xd1, 0x3c, 0xa3, 0xd5, 0x46, 0x8d, 0x46, 0x0f, 0x8c,
0x69, 0xc6, 0x5c, 0xe3, 0x24, 0xe3, 0x6d, 0xc6, 0x6d, 0xc6, 0xa3,
0x26, 0x06, 0x26, 0x21, 0x26, 0x4b, 0x4d, 0xea, 0x4d, 0xee, 0x9a,
0x52, 0x4d, 0xb9, 0xa6, 0x29, 0xa6, 0x3b, 0x4c, 0x3b, 0x4c, 0xc7,
0xcd, 0xcc, 0xcd, 0xa2, 0xcd, 0xd6, 0x99, 0x35, 0x9b, 0x3d, 0x31,
0xd7, 0x32, 0xe7, 0x9b, 0xe7, 0x9b, 0xd7, 0x9b, 0xdf, 0xb7, 0x60,
0x5a, 0x78, 0x5a, 0x2c, 0xb6, 0xa8, 0xb6, 0xb8, 0x65, 0x49, 0xb2,
0xe4, 0x5a, 0xa6, 0x59, 0xee, 0xb6, 0xbc, 0x6e, 0x85, 0x5a, 0x39,
0x59, 0xa5, 0x58, 0x55, 0x5a, 0x5d, 0xb3, 0x46, 0xad, 0x9d, 0xad,
0x25, 0xd6, 0xbb, 0xad, 0xbb, 0xa7, 0x11, 0xa7, 0xb9, 0x4e, 0x93,
0x4e, 0xab, 0x9e, 0xd6, 0x67, 0xc3, 0xb0, 0xf1, 0xb6, 0xc9, 0xb6,
0xa9, 0xb7, 0x19, 0xb0, 0xe5, 0xd8, 0x06, 0xdb, 0xae, 0xb6, 0x6d,
0xb6, 0x7d, 0x61, 0x67, 0x62, 0x17, 0x67, 0xb7, 0xc5, 0xae, 0xc3,
0xee, 0x93, 0xbd, 0x93, 0x7d, 0xba, 0x7d, 0x8d, 0xfd, 0x3d, 0x07,
0x0d, 0x87, 0xd9, 0x0e, 0xab, 0x1d, 0x5a, 0x1d, 0x7e, 0x73, 0xb4,
0x72, 0x14, 0x3a, 0x56, 0x3a, 0xde, 0x9a, 0xce, 0x9c, 0xee, 0x3f,
0x7d, 0xc5, 0xf4, 0x96, 0xe9, 0x2f, 0x67, 0x58, 0xcf, 0x10, 0xcf,
0xd8, 0x33, 0xe3, 0xb6, 0x13, 0xcb, 0x29, 0xc4, 0x69, 0x9d, 0x53,
0x9b, 0xd3, 0x47, 0x67, 0x17, 0x67, 0xb9, 0x73, 0x83, 0xf3, 0x88,
0x8b, 0x89, 0x4b, 0x82, 0xcb, 0x2e, 0x97, 0x3e, 0x2e, 0x9b, 0x1b,
0xc6, 0xdd, 0xc8, 0xbd, 0xe4, 0x4a, 0x74, 0xf5, 0x71, 0x5d, 0xe1,
0x7a, 0xd2, 0xf5, 0x9d, 0x9b, 0xb3, 0x9b, 0xc2, 0xed, 0xa8, 0xdb,
0xaf, 0xee, 0x36, 0xee, 0x69, 0xee, 0x87, 0xdc, 0x9f, 0xcc, 0x34,
0x9f, 0x29, 0x9e, 0x59, 0x33, 0x73, 0xd0, 0xc3, 0xc8, 0x43, 0xe0,
0x51, 0xe5, 0xd1, 0x3f, 0x0b, 0x9f, 0x95, 0x30, 0x6b, 0xdf, 0xac,
0x7e, 0x4f, 0x43, 0x4f, 0x81, 0x67, 0xb5, 0xe7, 0x23, 0x2f, 0x63,
0x2f, 0x91, 0x57, 0xad, 0xd7, 0xb0, 0xb7, 0xa5, 0x77, 0xaa, 0xf7,
0x61, 0xef, 0x17, 0x3e, 0xf6, 0x3e, 0x72, 0x9f, 0xe3, 0x3e, 0xe3,
0x3c, 0x37, 0xde, 0x32, 0xde, 0x59, 0x5f, 0xcc, 0x37, 0xc0, 0xb7,
0xc8, 0xb7, 0xcb, 0x4f, 0xc3, 0x6f, 0x9e, 0x5f, 0x85, 0xdf, 0x43,
0x7f, 0x23, 0xff, 0x64, 0xff, 0x7a, 0xff, 0xd1, 0x00, 0xa7, 0x80,
0x25, 0x01, 0x67, 0x03, 0x89, 0x81, 0x41, 0x81, 0x5b, 0x02, 0xfb,
0xf8, 0x7a, 0x7c, 0x21, 0xbf, 0x8e, 0x3f, 0x3a, 0xdb, 0x65, 0xf6,
0xb2, 0xd9, 0xed, 0x41, 0x8c, 0xa0, 0xb9, 0x41, 0x15, 0x41, 0x8f,
0x82, 0xad, 0x82, 0xe5, 0xc1, 0xad, 0x21, 0x68, 0xc8, 0xec, 0x90,
0xad, 0x21, 0xf7, 0xe7, 0x98, 0xce, 0x91, 0xce, 0x69, 0x0e, 0x85,
0x50, 0x7e, 0xe8, 0xd6, 0xd0, 0x07, 0x61, 0xe6, 0x61, 0x8b, 0xc3,
0x7e, 0x0c, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3f, 0x8e, 0x70,
0x88, 0x58, 0x1a, 0xd1, 0x31, 0x97, 0x35, 0x77, 0xd1, 0xdc, 0x43,
0x73, 0xdf, 0x44, 0xfa, 0x44, 0x96, 0x44, 0xde, 0x9b, 0x67, 0x31,
0x4f, 0x39, 0xaf, 0x2d, 0x4a, 0x35, 0x2a, 0x3e, 0xaa, 0x2e, 0x6a,
0x3c, 0xda, 0x37, 0xba, 0x34, 0xba, 0x3f, 0xc6, 0x2e, 0x66, 0x59,
0xcc, 0xd5, 0x58, 0x9d, 0x58, 0x49, 0x6c, 0x4b, 0x1c, 0x39, 0x2e,
0x2a, 0xae, 0x36, 0x6e, 0x6c, 0xbe, 0xdf, 0xfc, 0xed, 0xf3, 0x87,
0xe2, 0x9d, 0xe2, 0x0b, 0xe3, 0x7b, 0x17, 0x98, 0x2f, 0xc8, 0x5d,
0x70, 0x79, 0xa1, 0xce, 0xc2, 0xf4, 0x85, 0xa7, 0x16, 0xa9, 0x2e,
0x12, 0x2c, 0x3a, 0x96, 0x40, 0x4c, 0x88, 0x4e, 0x38, 0x94, 0xf0,
0x41, 0x10, 0x2a, 0xa8, 0x16, 0x8c, 0x25, 0xf2, 0x13, 0x77, 0x25,
0x8e, 0x0a, 0x79, 0xc2, 0x1d, 0xc2, 0x67, 0x22, 0x2f, 0xd1, 0x36,
0xd1, 0x88, 0xd8, 0x43, 0x5c, 0x2a, 0x1e, 0x4e, 0xf2, 0x48, 0x2a,
0x4d, 0x7a, 0x92, 0xec, 0x91, 0xbc, 0x35, 0x79, 0x24, 0xc5, 0x33,
0xa5, 0x2c, 0xe5, 0xb9, 0x84, 0x27, 0xa9, 0x90, 0xbc, 0x4c, 0x0d,
0x4c, 0xdd, 0x9b, 0x3a, 0x9e, 0x16, 0x9a, 0x76, 0x20, 0x6d, 0x32,
0x3d, 0x3a, 0xbd, 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xaa,
0x21, 0x4d, 0x93, 0xb6, 0x67, 0xea, 0x67, 0xe6, 0x66, 0x76, 0xcb,
0xac, 0x65, 0x85, 0xb2, 0xfe, 0xc5, 0x6e, 0x8b, 0xb7, 0x2f, 0x1e,
0x95, 0x07, 0xc9, 0x6b, 0xb3, 0x90, 0xac, 0x05, 0x59, 0x2d, 0x0a,
0xb6, 0x42, 0xa6, 0xe8, 0x54, 0x5a, 0x28, 0xd7, 0x2a, 0x07, 0xb2,
0x67, 0x65, 0x57, 0x66, 0xbf, 0xcd, 0x89, 0xca, 0x39, 0x96, 0xab,
0x9e, 0x2b, 0xcd, 0xed, 0xcc, 0xb3, 0xca, 0xdb, 0x90, 0x37, 0x9c,
0xef, 0x9f, 0xff, 0xed, 0x12, 0xc2, 0x12, 0xe1, 0x92, 0xb6, 0xa5,
0x86, 0x4b, 0x57, 0x2d, 0x1d, 0x58, 0xe6, 0xbd, 0xac, 0x6a, 0x39,
0xb2, 0x3c, 0x71, 0x79, 0xdb, 0x0a, 0xe3, 0x15, 0x05, 0x2b, 0x86,
0x56, 0x06, 0xac, 0x3c, 0xb8, 0x8a, 0xb6, 0x2a, 0x6d, 0xd5, 0x4f,
0xab, 0xed, 0x57, 0x97, 0xae, 0x7e, 0xbd, 0x26, 0x7a, 0x4d, 0x6b,
0x81, 0x5e, 0xc1, 0xca, 0x82, 0xc1, 0xb5, 0x01, 0x6b, 0xeb, 0x0b,
0x55, 0x0a, 0xe5, 0x85, 0x7d, 0xeb, 0xdc, 0xd7, 0xed, 0x5d, 0x4f,
0x58, 0x2f, 0x59, 0xdf, 0xb5, 0x61, 0xfa, 0x86, 0x9d, 0x1b, 0x3e,
0x15, 0x89, 0x8a, 0xae, 0x14, 0xdb, 0x17, 0x97, 0x15, 0x7f, 0xd8,
0x28, 0xdc, 0x78, 0xe5, 0x1b, 0x87, 0x6f, 0xca, 0xbf, 0x99, 0xdc,
0x94, 0xb4, 0xa9, 0xab, 0xc4, 0xb9, 0x64, 0xcf, 0x66, 0xd2, 0x66,
0xe9, 0xe6, 0xde, 0x2d, 0x9e, 0x5b, 0x0e, 0x96, 0xaa, 0x97, 0xe6,
0x97, 0x0e, 0x6e, 0x0d, 0xd9, 0xda, 0xb4, 0x0d, 0xdf, 0x56, 0xb4,
0xed, 0xf5, 0xf6, 0x45, 0xdb, 0x2f, 0x97, 0xcd, 0x28, 0xdb, 0xbb,
0x83, 0xb6, 0x43, 0xb9, 0xa3, 0xbf, 0x3c, 0xb8, 0xbc, 0x65, 0xa7,
0xc9, 0xce, 0xcd, 0x3b, 0x3f, 0x54, 0xa4, 0x54, 0xf4, 0x54, 0xfa,
0x54, 0x36, 0xee, 0xd2, 0xdd, 0xb5, 0x61, 0xd7, 0xf8, 0x6e, 0xd1,
0xee, 0x1b, 0x7b, 0xbc, 0xf6, 0x34, 0xec, 0xd5, 0xdb, 0x5b, 0xbc,
0xf7, 0xfd, 0x3e, 0xc9, 0xbe, 0xdb, 0x55, 0x01, 0x55, 0x4d, 0xd5,
0x66, 0xd5, 0x65, 0xfb, 0x49, 0xfb, 0xb3, 0xf7, 0x3f, 0xae, 0x89,
0xaa, 0xe9, 0xf8, 0x96, 0xfb, 0x6d, 0x5d, 0xad, 0x4e, 0x6d, 0x71,
0xed, 0xc7, 0x03, 0xd2, 0x03, 0xfd, 0x07, 0x23, 0x0e, 0xb6, 0xd7,
0xb9, 0xd4, 0xd5, 0x1d, 0xd2, 0x3d, 0x54, 0x52, 0x8f, 0xd6, 0x2b,
0xeb, 0x47, 0x0e, 0xc7, 0x1f, 0xbe, 0xfe, 0x9d, 0xef, 0x77, 0x2d,
0x0d, 0x36, 0x0d, 0x55, 0x8d, 0x9c, 0xc6, 0xe2, 0x23, 0x70, 0x44,
0x79, 0xe4, 0xe9, 0xf7, 0x09, 0xdf, 0xf7, 0x1e, 0x0d, 0x3a, 0xda,
0x76, 0x8c, 0x7b, 0xac, 0xe1, 0x07, 0xd3, 0x1f, 0x76, 0x1d, 0x67,
0x1d, 0x2f, 0x6a, 0x42, 0x9a, 0xf2, 0x9a, 0x46, 0x9b, 0x53, 0x9a,
0xfb, 0x5b, 0x62, 0x5b, 0xba, 0x4f, 0xcc, 0x3e, 0xd1, 0xd6, 0xea,
0xde, 0x7a, 0xfc, 0x47, 0xdb, 0x1f, 0x0f, 0x9c, 0x34, 0x3c, 0x59,
0x79, 0x4a, 0xf3, 0x54, 0xc9, 0x69, 0xda, 0xe9, 0x82, 0xd3, 0x93,
0x67, 0xf2, 0xcf, 0x8c, 0x9d, 0x95, 0x9d, 0x7d, 0x7e, 0x2e, 0xf9,
0xdc, 0x60, 0xdb, 0xa2, 0xb6, 0x7b, 0xe7, 0x63, 0xce, 0xdf, 0x6a,
0x0f, 0x6f, 0xef, 0xba, 0x10, 0x74, 0xe1, 0xd2, 0x45, 0xff, 0x8b,
0xe7, 0x3b, 0xbc, 0x3b, 0xce, 0x5c, 0xf2, 0xb8, 0x74, 0xf2, 0xb2,
0xdb, 0xe5, 0x13, 0x57, 0xb8, 0x57, 0x9a, 0xaf, 0x3a, 0x5f, 0x6d,
0xea, 0x74, 0xea, 0x3c, 0xfe, 0x93, 0xd3, 0x4f, 0xc7, 0xbb, 0x9c,
0xbb, 0x9a, 0xae, 0xb9, 0x5c, 0x6b, 0xb9, 0xee, 0x7a, 0xbd, 0xb5,
0x7b, 0x66, 0xf7, 0xe9, 0x1b, 0x9e, 0x37, 0xce, 0xdd, 0xf4, 0xbd,
0x79, 0xf1, 0x16, 0xff, 0xd6, 0xd5, 0x9e, 0x39, 0x3d, 0xdd, 0xbd,
0xf3, 0x7a, 0x6f, 0xf7, 0xc5, 0xf7, 0xf5, 0xdf, 0x16, 0xdd, 0x7e,
0x72, 0x27, 0xfd, 0xce, 0xcb, 0xbb, 0xd9, 0x77, 0x27, 0xee, 0xad,
0xbc, 0x4f, 0xbc, 0x5f, 0xf4, 0x40, 0xed, 0x41, 0xd9, 0x43, 0xdd,
0x87, 0xd5, 0x3f, 0x5b, 0xfe, 0xdc, 0xd8, 0xef, 0xdc, 0x7f, 0x6a,
0xc0, 0x77, 0xa0, 0xf3, 0xd1, 0xdc, 0x47, 0xf7, 0x06, 0x85, 0x83,
0xcf, 0xfe, 0x91, 0xf5, 0x8f, 0x0f, 0x43, 0x05, 0x8f, 0x99, 0x8f,
0xcb, 0x86, 0x0d, 0x86, 0xeb, 0x9e, 0x38, 0x3e, 0x39, 0x39, 0xe2,
0x3f, 0x72, 0xfd, 0xe9, 0xfc, 0xa7, 0x43, 0xcf, 0x64, 0xcf, 0x26,
0x9e, 0x17, 0xfe, 0xa2, 0xfe, 0xcb, 0xae, 0x17, 0x16, 0x2f, 0x7e,
0xf8, 0xd5, 0xeb, 0xd7, 0xce, 0xd1, 0x98, 0xd1, 0xa1, 0x97, 0xf2,
0x97, 0x93, 0xbf, 0x6d, 0x7c, 0xa5, 0xfd, 0xea, 0xc0, 0xeb, 0x19,
0xaf, 0xdb, 0xc6, 0xc2, 0xc6, 0x1e, 0xbe, 0xc9, 0x78, 0x33, 0x31,
0x5e, 0xf4, 0x56, 0xfb, 0xed, 0xc1, 0x77, 0xdc, 0x77, 0x1d, 0xef,
0xa3, 0xdf, 0x0f, 0x4f, 0xe4, 0x7c, 0x20, 0x7f, 0x28, 0xff, 0x68,
0xf9, 0xb1, 0xf5, 0x53, 0xd0, 0xa7, 0xfb, 0x93, 0x19, 0x93, 0x93,
0xff, 0x04, 0x03, 0x98, 0xf3, 0xfc, 0x63, 0x33, 0x2d, 0xdb, 0x00,
0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x25,
0x00, 0x00, 0x80, 0x83, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0x80,
0xe9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00,
0x3a, 0x98, 0x00, 0x00, 0x17, 0x6f, 0x92, 0x5f, 0xc5, 0x46, 0x00,
0x00, 0x25, 0xa0, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x9d,
0x79, 0x94, 0x25, 0x55, 0x9d, 0xe7, 0xbf, 0xbf, 0x1b, 0xf1, 0xf6,
0xf7, 0x72, 0xad, 0x5c, 0xaa, 0xa8, 0x3d, 0x6b, 0x2f, 0x76, 0x41,
0x60, 0x4a, 0xb4, 0xb1, 0x65, 0x5c, 0xda, 0xb6, 0x15, 0x6c, 0x04,
0xec, 0xd1, 0x43, 0xab, 0xad, 0x07, 0x41, 0x1a, 0xa4, 0x6d, 0x9d,
0x46, 0xa4, 0x68, 0xa8, 0xee, 0x39, 0x72, 0xa6, 0xad, 0xee, 0x71,
0x10, 0x97, 0x71, 0x03, 0xb4, 0x61, 0x46, 0x4b, 0xc7, 0x6d, 0xc0,
0x06, 0x51, 0xb1, 0x9a, 0x62, 0x69, 0x4a, 0xaa, 0x84, 0xda, 0xf7,
0x25, 0x2b, 0xf7, 0xcc, 0x97, 0x6f, 0x8d, 0xb8, 0x77, 0xfe, 0x78,
0x2f, 0x5f, 0x46, 0xc6, 0x8b, 0xe5, 0xde, 0xb7, 0x64, 0x15, 0x95,
0xf1, 0xcb, 0x13, 0xe7, 0x45, 0xdc, 0xb8, 0xb1, 0x64, 0x44, 0xdc,
0x4f, 0x7c, 0x7f, 0xbf, 0x7b, 0xe3, 0x5e, 0x12, 0x42, 0x20, 0xb0,
0xc0, 0x02, 0x0b, 0xec, 0x6c, 0x30, 0xbd, 0x32, 0xf7, 0x4a, 0x28,
0xb8, 0x1a, 0x73, 0xdb, 0xe8, 0x2c, 0xfb, 0x7f, 0x82, 0x37, 0xf5,
0x9c, 0x06, 0x5a, 0x60, 0x73, 0x11, 0x4a, 0xf4, 0x3a, 0xfa, 0xbf,
0x44, 0x8d, 0xff, 0x5b, 0x3d, 0x60, 0x0b, 0xa0, 0x18, 0x00, 0x2d,
0xb0, 0x26, 0x00, 0x85, 0x9a, 0xb0, 0xcf, 0x66, 0xc0, 0x8d, 0x6c,
0x30, 0x20, 0x17, 0x40, 0xf8, 0x1d, 0x4b, 0x34, 0x00, 0x68, 0x6e,
0xe7, 0xa0, 0x02, 0x32, 0xd5, 0xf3, 0x0c, 0xc0, 0x18, 0x00, 0x6d,
0x4e, 0x82, 0xaa, 0x11, 0x20, 0xa3, 0x1a, 0xd3, 0x65, 0x0b, 0xf9,
0xeb, 0xd1, 0x05, 0x15, 0x75, 0xae, 0xf7, 0xcb, 0x27, 0x6a, 0x54,
0x81, 0xd4, 0xa0, 0xe3, 0x07, 0x16, 0x00, 0xed, 0x8c, 0x51, 0x54,
0xb2, 0x70, 0xaa, 0x15, 0x54, 0x8d, 0x06, 0x2a, 0x35, 0xf1, 0xfa,
0x34, 0xa3, 0x40, 0x37, 0x1a, 0x56, 0x32, 0xfb, 0x15, 0x8a, 0x69,
0xd4, 0x60, 0x70, 0x05, 0xe0, 0x0b, 0x80, 0x36, 0x6b, 0xa0, 0x22,
0xc5, 0xe5, 0x46, 0xe4, 0x21, 0x0f, 0x05, 0x56, 0x0f, 0xe4, 0xfc,
0xd6, 0x89, 0x3a, 0xae, 0x6d, 0xb3, 0x63, 0x5c, 0x42, 0x61, 0x3b,
0xe1, 0xf2, 0xff, 0xd4, 0xbb, 0x2c, 0x9b, 0x26, 0x0b, 0x3e, 0x31,
0x0b, 0xd7, 0x36, 0x00, 0xda, 0xeb, 0x14, 0x5e, 0x24, 0xe1, 0x86,
0x91, 0x02, 0x50, 0x6a, 0x9d, 0xf7, 0x5a, 0xb6, 0x9e, 0x1f, 0x29,
0x9c, 0x5b, 0xbd, 0x10, 0x6e, 0x94, 0x02, 0xa3, 0x1a, 0x0b, 0x9c,
0x4a, 0xec, 0xac, 0x56, 0xa8, 0xd8, 0xd3, 0x6b, 0x81, 0x91, 0xdf,
0xb1, 0xb9, 0x87, 0xdb, 0xe9, 0xb4, 0x1f, 0xbf, 0x3c, 0xf5, 0x54,
0x78, 0x38, 0xc1, 0xf0, 0xac, 0x01, 0xdf, 0xd9, 0x08, 0x34, 0x55,
0xa5, 0x41, 0x92, 0xb0, 0x80, 0x4b, 0x3e, 0xf2, 0x59, 0x2f, 0xb3,
0x9d, 0xca, 0xbe, 0x6b, 0x85, 0x62, 0xbd, 0x8a, 0xd2, 0x0d, 0xb0,
0xb3, 0x61, 0xa2, 0xce, 0x3c, 0x2a, 0x8a, 0xaa, 0x96, 0x75, 0x7e,
0x79, 0x34, 0x8f, 0x3c, 0x2a, 0x40, 0x13, 0x8a, 0xe7, 0xe5, 0xf4,
0x42, 0x70, 0x4b, 0xf3, 0x52, 0xa8, 0x01, 0xd0, 0xce, 0x40, 0x17,
0xb1, 0x1e, 0x65, 0x45, 0x35, 0x02, 0x8d, 0x1a, 0xb8, 0x4f, 0x55,
0x78, 0xd6, 0x0b, 0xbe, 0x7a, 0x94, 0xdc, 0x6c, 0x83, 0x4d, 0x36,
0x5d, 0x45, 0x55, 0x89, 0x1a, 0xe0, 0xd3, 0x88, 0x34, 0xfb, 0x7a,
0xd9, 0xe3, 0xab, 0x9c, 0xa7, 0x9b, 0x5b, 0x4d, 0x75, 0x2a, 0xea,
0x00, 0x68, 0x0a, 0x50, 0x12, 0x35, 0xa8, 0x0b, 0xbf, 0x02, 0xed,
0x07, 0x1c, 0xaa, 0x03, 0x54, 0xcc, 0x03, 0x2c, 0x2a, 0x80, 0x53,
0x01, 0x9a, 0xaa, 0x02, 0x54, 0x51, 0x70, 0xf5, 0xac, 0x6b, 0x86,
0x22, 0x53, 0x8d, 0x4b, 0xc9, 0xaa, 0x23, 0x15, 0xd7, 0x4f, 0x16,
0x32, 0x42, 0x72, 0x1b, 0x51, 0xc3, 0x7e, 0x54, 0x20, 0x57, 0x8b,
0xbb, 0xeb, 0xe4, 0xa6, 0x8a, 0x1a, 0x42, 0x02, 0x73, 0x1a, 0x68,
0x7e, 0x6a, 0xa1, 0x96, 0xc2, 0x2e, 0x03, 0x18, 0xaa, 0x01, 0x68,
0xaa, 0xeb, 0x64, 0xd2, 0x1a, 0x01, 0xba, 0x7a, 0x21, 0x56, 0x4f,
0xcd, 0xab, 0x4a, 0x9e, 0x46, 0x34, 0x65, 0x10, 0x75, 0x02, 0x4d,
0x46, 0x9d, 0x71, 0x87, 0x02, 0x2c, 0x24, 0xe0, 0x21, 0x0b, 0x23,
0x2e, 0x01, 0x39, 0x21, 0x09, 0x41, 0xaf, 0x63, 0x92, 0xe5, 0x58,
0x4e, 0xe7, 0xac, 0x0a, 0xa9, 0x46, 0xd7, 0xdc, 0x9e, 0x15, 0x40,
0x93, 0xa9, 0x9d, 0x53, 0x71, 0xf3, 0xfc, 0xd2, 0x54, 0xd6, 0xcb,
0x6c, 0xe7, 0xb6, 0xec, 0x96, 0xa7, 0x51, 0xc0, 0x54, 0x01, 0x7d,
0xbd, 0x95, 0x09, 0xcd, 0xaa, 0x48, 0x68, 0x26, 0xd0, 0xbc, 0xd4,
0x46, 0xa3, 0xd5, 0x96, 0x97, 0x6a, 0x72, 0xcb, 0xa3, 0x9a, 0xae,
0x9a, 0xc7, 0x29, 0xff, 0xd4, 0xcb, 0x5d, 0xe5, 0x3c, 0x49, 0xe1,
0x85, 0x41, 0xa7, 0x53, 0xc1, 0xe9, 0xa7, 0x11, 0x60, 0x2a, 0xe0,
0x52, 0x2d, 0xf8, 0xa4, 0xb8, 0xae, 0x96, 0x3c, 0xaa, 0xfb, 0xf3,
0xdb, 0x4e, 0x15, 0x7e, 0x32, 0xea, 0x4e, 0x45, 0xd9, 0x9d, 0x89,
0x71, 0x35, 0x51, 0x47, 0x5a, 0x2d, 0x6e, 0x96, 0x1f, 0xe4, 0xb8,
0xc7, 0xbe, 0x65, 0x41, 0x63, 0xcf, 0xeb, 0x97, 0x66, 0xdf, 0x07,
0x57, 0x84, 0x98, 0xa8, 0x21, 0xbf, 0xd7, 0xf9, 0x93, 0xc3, 0xb2,
0xd7, 0x3d, 0x98, 0xd5, 0xda, 0x54, 0xfd, 0x34, 0x43, 0x4c, 0x36,
0xae, 0x54, 0x0b, 0xb4, 0x98, 0x0b, 0x64, 0xbc, 0x00, 0x44, 0x3e,
0xdb, 0xc8, 0x82, 0x4c, 0x45, 0xf1, 0x35, 0x5a, 0xdd, 0xb9, 0xb9,
0xd7, 0x24, 0x79, 0xcd, 0x9d, 0xe2, 0x96, 0xcd, 0x6a, 0xbc, 0xab,
0xaa, 0xd6, 0x54, 0x9a, 0x66, 0xa8, 0xa8, 0xad, 0x46, 0x2a, 0x30,
0x19, 0xd5, 0xa5, 0x02, 0x34, 0xbf, 0x6d, 0x55, 0xd6, 0x73, 0x17,
0x40, 0x3a, 0xad, 0x93, 0x85, 0x20, 0x24, 0x5c, 0xd5, 0x59, 0x6b,
0x2a, 0xa2, 0x9f, 0x06, 0x80, 0xc9, 0x2a, 0x30, 0x2f, 0xf5, 0x62,
0x2f, 0xe8, 0x4e, 0xf0, 0x62, 0x12, 0x70, 0x52, 0x99, 0x9c, 0xf6,
0x55, 0x0b, 0x34, 0x6b, 0x49, 0x53, 0x75, 0x9f, 0xa1, 0xb0, 0x5e,
0xc6, 0x05, 0x55, 0x6d, 0xd2, 0x51, 0x0f, 0xd0, 0xfc, 0xdc, 0x94,
0x7a, 0x63, 0x64, 0x8d, 0x70, 0x25, 0x9d, 0x00, 0x81, 0x1a, 0x81,
0x04, 0x05, 0x28, 0x35, 0x62, 0x72, 0x3b, 0x86, 0x17, 0xd8, 0x84,
0x24, 0x70, 0xdd, 0xd2, 0xc8, 0xe1, 0xda, 0x35, 0x25, 0xf6, 0xa6,
0x9f, 0x81, 0x10, 0xb3, 0x17, 0x42, 0xbb, 0xda, 0x60, 0x92, 0x00,
0x62, 0x0a, 0xdb, 0xb0, 0x06, 0x82, 0x4f, 0x55, 0x11, 0xaa, 0xa8,
0x36, 0x15, 0xc0, 0xc1, 0x27, 0x7d, 0x36, 0x9a, 0x77, 0x34, 0x22,
0x86, 0xa6, 0xda, 0x18, 0xb6, 0xd6, 0x66, 0x16, 0xaa, 0x2a, 0xab,
0x16, 0x80, 0x41, 0x41, 0x3d, 0xc9, 0x4c, 0xbc, 0x46, 0xa8, 0xf1,
0x06, 0xec, 0x4b, 0xe6, 0x9c, 0xfd, 0x62, 0x6c, 0x4e, 0x80, 0x13,
0x67, 0x0a, 0xd0, 0x64, 0xe2, 0x62, 0xb2, 0xae, 0x17, 0x73, 0x98,
0x67, 0x92, 0x10, 0x62, 0x1e, 0xdb, 0x31, 0x8f, 0xed, 0xdd, 0xf2,
0x63, 0x16, 0xa0, 0x67, 0x3d, 0x2e, 0x6a, 0x80, 0x9c, 0x9f, 0xcb,
0x5a, 0x6b, 0xe5, 0x01, 0x29, 0x42, 0xac, 0xd9, 0xdf, 0x72, 0xaa,
0x36, 0xc1, 0x90, 0x49, 0x53, 0x8d, 0x79, 0xf9, 0xc5, 0xc2, 0xb8,
0xa4, 0x22, 0xe3, 0x0a, 0xca, 0x8c, 0x37, 0x00, 0x52, 0xdc, 0x76,
0x7e, 0xc2, 0x63, 0xde, 0x2d, 0xcd, 0xbe, 0xcc, 0x6a, 0x50, 0x85,
0x7e, 0xf7, 0xb5, 0x2e, 0xb7, 0x54, 0x6f, 0x22, 0xc4, 0x64, 0x00,
0xa6, 0xaa, 0x9a, 0x98, 0x07, 0x98, 0xfc, 0xd2, 0x9c, 0xd2, 0xfd,
0x00, 0x47, 0x35, 0xa6, 0x91, 0xe2, 0xff, 0xd9, 0x58, 0xd7, 0x94,
0x2c, 0xf7, 0xa0, 0x1a, 0x69, 0x24, 0xa1, 0xff, 0x08, 0x64, 0x79,
0x73, 0x7a, 0x37, 0xb7, 0x24, 0x4b, 0xa8, 0x9c, 0x2c, 0x8f, 0x20,
0xd9, 0x1e, 0x59, 0x72, 0xd8, 0xb2, 0x1a, 0x38, 0x54, 0x4e, 0x17,
0xe5, 0x73, 0x20, 0x97, 0x87, 0x7a, 0xba, 0x78, 0x88, 0xca, 0x16,
0x53, 0xc7, 0x99, 0x9a, 0xf3, 0xd6, 0x5f, 0xc2, 0x56, 0xc4, 0x84,
0x65, 0x7f, 0xb2, 0xc1, 0x7c, 0xa1, 0x00, 0x37, 0x37, 0xd0, 0x71,
0x1b, 0xe4, 0xa0, 0x00, 0x1c, 0xbf, 0x3c, 0xdc, 0x07, 0x56, 0x7e,
0x70, 0xe3, 0x12, 0xfb, 0xf2, 0x02, 0xa1, 0x4c, 0x8c, 0x4e, 0x06,
0x6e, 0x62, 0x36, 0x80, 0xa6, 0xda, 0x8c, 0x82, 0x24, 0xd4, 0x8e,
0x1b, 0x68, 0x64, 0x97, 0x99, 0x47, 0x9a, 0xdb, 0x7a, 0x37, 0x55,
0xe7, 0x04, 0x38, 0xbb, 0x62, 0xf3, 0x53, 0x8f, 0xf0, 0xf9, 0x5f,
0xdd, 0x01, 0x4f, 0x16, 0x38, 0x4d, 0xef, 0xa9, 0x34, 0xa7, 0x01,
0x60, 0x65, 0x44, 0xd0, 0x0c, 0xec, 0x94, 0x96, 0x8a, 0xd0, 0x60,
0x82, 0x81, 0x43, 0x33, 0x0b, 0xd0, 0x8a, 0x26, 0x34, 0xd3, 0x84,
0x56, 0x28, 0x42, 0x2b, 0x1a, 0x60, 0x86, 0x09, 0x8d, 0x73, 0x68,
0x99, 0x9c, 0xd0, 0xf3, 0x05, 0x68, 0x86, 0x01, 0xdd, 0xe0, 0xd0,
0x0a, 0x05, 0x68, 0xb9, 0x02, 0xb4, 0xa2, 0x01, 0xcd, 0x30, 0xc1,
0x4c, 0x0e, 0x56, 0x28, 0x40, 0x1f, 0x1a, 0x15, 0xe1, 0x4c, 0x0e,
0xa1, 0x6c, 0x0e, 0x7a, 0xae, 0x80, 0x90, 0x61, 0x42, 0x2b, 0x16,
0x11, 0x32, 0x38, 0x34, 0xce, 0x41, 0x99, 0x1c, 0x34, 0x02, 0xc0,
0x05, 0xa8, 0x50, 0x84, 0x66, 0x7f, 0x50, 0x0c, 0x43, 0x30, 0x2e,
0x66, 0x84, 0x0e, 0x00, 0x00, 0x21, 0x9d, 0x4c, 0xb2, 0x00, 0x4b,
0x08, 0x40, 0xd7, 0xc1, 0x43, 0x1a, 0xb8, 0x00, 0x28, 0xa4, 0x83,
0x47, 0xc2, 0x30, 0x09, 0x40, 0x24, 0x8c, 0x3c, 0x63, 0x10, 0xb1,
0x08, 0xf2, 0x21, 0x1d, 0x66, 0x32, 0x8e, 0x42, 0x5b, 0x0a, 0xc5,
0x64, 0x82, 0x8a, 0x1a, 0x81, 0x6b, 0x1a, 0xb8, 0xae, 0xc3, 0x8c,
0x84, 0x60, 0xc6, 0x22, 0x30, 0x35, 0x0d, 0xa6, 0xae, 0xc1, 0x08,
0x87, 0x60, 0xc6, 0xa2, 0x64, 0x84, 0x42, 0x30, 0x35, 0x02, 0x0f,
0xe9, 0x30, 0x23, 0x61, 0x98, 0x1a, 0x2b, 0xe5, 0x09, 0x87, 0x61,
0x42, 0x07, 0x07, 0x83, 0x09, 0x1d, 0x26, 0x58, 0xb9, 0xb0, 0x89,
0x19, 0xa8, 0x2b, 0x15, 0x47, 0xb3, 0x0c, 0x4b, 0x6b, 0x0e, 0x2b,
0x36, 0x85, 0x2f, 0xe4, 0xb8, 0x43, 0x21, 0x97, 0x55, 0x45, 0x70,
0x80, 0x90, 0x90, 0x54, 0x5c, 0x6e, 0x80, 0xe2, 0x0e, 0xeb, 0xb9,
0x07, 0xf0, 0x64, 0xf7, 0xc9, 0x2c, 0xff, 0x23, 0xd9, 0x62, 0xa3,
0xf6, 0x89, 0xe0, 0x5f, 0x1b, 0x2d, 0xad, 0xda, 0xf4, 0x06, 0x83,
0xcc, 0xad, 0x86, 0xce, 0x4b, 0xd5, 0x30, 0x05, 0x30, 0xd9, 0xe7,
0xfd, 0x96, 0xc9, 0x63, 0x9f, 0x4c, 0x42, 0xb9, 0x31, 0x45, 0xc5,
0xe7, 0xfe, 0xbf, 0x52, 0x05, 0x39, 0xd3, 0xbf, 0xd5, 0x67, 0x59,
0xd2, 0x24, 0x26, 0x34, 0x70, 0x30, 0x70, 0x30, 0x18, 0xd0, 0x72,
0x39, 0x84, 0x0a, 0x05, 0xe8, 0xd9, 0x02, 0x42, 0x85, 0x02, 0x42,
0x27, 0x07, 0x45, 0x6c, 0x60, 0x14, 0xc9, 0xf1, 0x34, 0x62, 0x63,
0x69, 0x11, 0xc9, 0xe5, 0x11, 0x1e, 0x4f, 0x23, 0x9c, 0xce, 0x22,
0x92, 0xc9, 0x22, 0x7c, 0xfc, 0x94, 0x88, 0x0f, 0x8e, 0x21, 0x91,
0xc9, 0x22, 0x9a, 0xc9, 0x41, 0x2f, 0x14, 0xa1, 0x1b, 0x86, 0xd0,
0x72, 0x05, 0x68, 0x65, 0x80, 0x69, 0x06, 0x87, 0x66, 0x18, 0x20,
0x93, 0x83, 0x38, 0xaf, 0x86, 0xcd, 0xec, 0x58, 0x73, 0x6b, 0xf1,
0x89, 0x20, 0x34, 0x06, 0xa1, 0x6b, 0x65, 0xe0, 0x95, 0x01, 0x16,
0x0b, 0xc3, 0xd4, 0x75, 0x98, 0x21, 0x9d, 0xcc, 0x58, 0x14, 0x46,
0x3c, 0x86, 0x7c, 0x5b, 0x12, 0x93, 0xf3, 0xe7, 0x51, 0xb6, 0xb5,
0x05, 0xb9, 0x78, 0x04, 0x85, 0xd6, 0x24, 0x0a, 0xb1, 0x18, 0x0a,
0xa9, 0x38, 0xf2, 0x6d, 0x29, 0xca, 0xb5, 0x26, 0x31, 0x79, 0x4e,
0x37, 0x26, 0x13, 0x71, 0xca, 0x47, 0x42, 0x30, 0x23, 0x11, 0x14,
0xa3, 0x61, 0x14, 0xb5, 0x30, 0x8c, 0xd2, 0xab, 0xa3, 0xfc, 0x0a,
0x61, 0xe0, 0x15, 0xb4, 0xcd, 0x2c, 0xf2, 0xc2, 0x52, 0xf4, 0xed,
0xf0, 0x53, 0x71, 0x1b, 0xfd, 0x54, 0x96, 0x53, 0x7e, 0xd3, 0x05,
0x44, 0x32, 0x40, 0xe3, 0x35, 0x6c, 0x23, 0x3c, 0x7e, 0x9d, 0x20,
0x4d, 0x0e, 0x80, 0x23, 0xc8, 0x7f, 0xb6, 0x55, 0x13, 0xd0, 0x64,
0xaa, 0xfd, 0xdd, 0x9a, 0x4f, 0xc8, 0x42, 0x8c, 0xf9, 0xa4, 0xb9,
0x4d, 0x24, 0xb1, 0xad, 0x0c, 0xf8, 0x54, 0x80, 0xc6, 0x2c, 0x6a,
0x8a, 0xcd, 0x98, 0xd3, 0x20, 0xa0, 0xcd, 0xd0, 0x5a, 0x84, 0x02,
0x74, 0xe4, 0x11, 0xce, 0xe4, 0x10, 0xce, 0xe4, 0x10, 0xca, 0x64,
0x11, 0x19, 0x4d, 0x8b, 0x68, 0x09, 0x4a, 0x88, 0xf4, 0x0f, 0x89,
0xc4, 0xde, 0x23, 0x68, 0x1f, 0x1c, 0x46, 0xcb, 0x58, 0x5a, 0x44,
0xc6, 0xd3, 0x88, 0x8e, 0xa6, 0x11, 0xc9, 0x64, 0x11, 0x99, 0xcc,
0x22, 0x94, 0xcb, 0x8b, 0xd0, 0x64, 0x16, 0xa1, 0x7c, 0x11, 0x7a,
0x36, 0x07, 0x1d, 0x67, 0xdf, 0x18, 0x00, 0x8d, 0xc7, 0xa5, 0x00,
0x19, 0x26, 0xc8, 0x30, 0xdd, 0x80, 0x2d, 0x94, 0x00, 0x1b, 0xd2,
0x61, 0x46, 0x23, 0x30, 0xe2, 0x51, 0x14, 0x63, 0x51, 0x14, 0xe3,
0x11, 0x2a, 0x26, 0xe2, 0x28, 0x24, 0x63, 0xc8, 0xb7, 0xb5, 0x20,
0x9f, 0x8a, 0x23, 0xd7, 0xd9, 0x46, 0x99, 0x85, 0x3d, 0x18, 0x59,
0xbe, 0x90, 0xc6, 0x5a, 0x92, 0xc8, 0xb5, 0x24, 0x91, 0x6b, 0x4d,
0x52, 0x2e, 0x19, 0x47, 0x3e, 0x11, 0x43, 0x21, 0x16, 0x41, 0x21,
0x14, 0x45, 0x11, 0x11, 0x14, 0x2a, 0xf0, 0x43, 0x19, 0x39, 0x46,
0xd9, 0x75, 0xe6, 0x16, 0x87, 0x58, 0xf8, 0xaa, 0x2d, 0x2f, 0xc0,
0x08, 0x0f, 0x28, 0xb9, 0x81, 0xc8, 0x94, 0x48, 0xf3, 0x9a, 0xdc,
0x8e, 0x61, 0xdd, 0x0f, 0xb3, 0xe4, 0x23, 0x17, 0x77, 0xdd, 0xab,
0xe6, 0xdb, 0xd5, 0x15, 0xa5, 0xca, 0xa8, 0x4f, 0xde, 0x83, 0xa4,
0xf8, 0xa9, 0x32, 0x7b, 0xf3, 0x09, 0x37, 0x77, 0x4d, 0x15, 0x54,
0xf6, 0x49, 0xab, 0x63, 0x5b, 0x52, 0x4c, 0x9b, 0x5e, 0x37, 0x05,
0x25, 0xcd, 0x72, 0x06, 0x5a, 0x19, 0x56, 0x26, 0x74, 0x18, 0xd0,
0x50, 0x40, 0x28, 0x9d, 0x41, 0x38, 0x9d, 0x43, 0xe4, 0xe4, 0x80,
0x48, 0xee, 0x3b, 0x82, 0xce, 0xfe, 0x21, 0x91, 0x1c, 0x1c, 0x45,
0x62, 0x70, 0x04, 0xc9, 0x5d, 0x87, 0x44, 0xfb, 0x89, 0x53, 0x68,
0x9b, 0xc8, 0x88, 0x48, 0x7a, 0x12, 0xe1, 0xc9, 0x2c, 0x22, 0xb9,
0x02, 0x34, 0x21, 0x02, 0x30, 0x9d, 0xed, 0x16, 0xd2, 0x61, 0xc6,
0xa2, 0x28, 0xb6, 0x24, 0x90, 0x4f, 0xc4, 0xa9, 0xd0, 0xd1, 0x82,
0xc9, 0x95, 0x4b, 0x30, 0x34, 0xbf, 0x9b, 0x26, 0x7a, 0xda, 0x30,
0xd9, 0xd5, 0x89, 0xc9, 0x45, 0xbd, 0x34, 0xbc, 0xfc, 0x1c, 0x1a,
0x4b, 0xc6, 0x91, 0x4f, 0xc6, 0x91, 0x0b, 0x45, 0x51, 0x84, 0x0e,
0x03, 0x7a, 0x19, 0x73, 0x1c, 0x02, 0x66, 0x19, 0x01, 0x46, 0xa5,
0xe8, 0xbb, 0xc1, 0x4c, 0x46, 0x71, 0xc9, 0xac, 0xe3, 0x15, 0x67,
0x7b, 0x26, 0xdc, 0xb8, 0xe4, 0x64, 0x4a, 0x9c, 0x8f, 0x9b, 0xf2,
0x74, 0x8b, 0xb7, 0x79, 0xbe, 0x85, 0x64, 0x80, 0x26, 0xf3, 0x01,
0x37, 0xb9, 0x00, 0xcc, 0x0e, 0x07, 0xcd, 0x07, 0x52, 0x9a, 0x0f,
0xc0, 0x54, 0xf2, 0xaa, 0xc1, 0x6e, 0x4a, 0x65, 0x31, 0x10, 0x74,
0x00, 0x7a, 0x25, 0x2c, 0xcd, 0x60, 0x40, 0x47, 0x01, 0xa1, 0x53,
0x83, 0x48, 0xf5, 0x0f, 0x89, 0xd4, 0xa9, 0x51, 0x24, 0x0f, 0x1f,
0x13, 0xad, 0xaf, 0xec, 0x41, 0xef, 0xf1, 0x01, 0xd1, 0xda, 0x3f,
0x8c, 0xc4, 0xd0, 0x28, 0x12, 0x63, 0x13, 0x22, 0x3a, 0x96, 0x46,
0x64, 0x7c, 0x02, 0x51, 0x11, 0x28, 0xa8, 0xc0, 0x14, 0x2d, 0x16,
0x45, 0xb1, 0xb5, 0xac, 0xe8, 0xda, 0x5b, 0x91, 0xed, 0xe9, 0x40,
0xba, 0xab, 0x83, 0x26, 0x57, 0x2f, 0x45, 0xff, 0x9a, 0xe5, 0x34,
0xd4, 0xdd, 0x8e, 0x74, 0x57, 0x3b, 0xa5, 0x17, 0x74, 0x63, 0x3c,
0x92, 0x44, 0x0e, 0x3a, 0x0c, 0x30, 0x98, 0x65, 0x55, 0x27, 0x60,
0x80, 0xca, 0x08, 0x71, 0x72, 0x7a, 0xeb, 0x81, 0x96, 0xe9, 0x91,
0x5f, 0x65, 0x9d, 0x69, 0x3b, 0x27, 0x53, 0xc2, 0x3d, 0xf5, 0xaa,
0xa4, 0xa9, 0x82, 0x9a, 0x17, 0xd0, 0x54, 0x02, 0xfd, 0x5e, 0x71,
0x2a, 0x3f, 0x20, 0x59, 0x7f, 0x9d, 0xe6, 0xdd, 0x96, 0xfd, 0x00,
0xe7, 0x9c, 0x46, 0x60, 0x65, 0x68, 0x09, 0x68, 0xe5, 0x38, 0x16,
0x81, 0x50, 0x40, 0xb8, 0x50, 0x72, 0xf3, 0xe2, 0x07, 0x8f, 0x89,
0xb6, 0x3f, 0xec, 0x17, 0xbd, 0x47, 0x4e, 0xa2, 0xf5, 0xd8, 0x29,
0xb4, 0x1e, 0xeb, 0x17, 0xa9, 0x13, 0x03, 0x48, 0x1d, 0x38, 0x26,
0xda, 0x47, 0x26, 0x10, 0x17, 0x3c, 0x80, 0x55, 0x60, 0xa7, 0xc7,
0xa2, 0x61, 0x14, 0x17, 0xf6, 0xd2, 0xd8, 0x92, 0x05, 0x18, 0x9b,
0xdf, 0x85, 0xf1, 0x73, 0xba, 0x69, 0x7c, 0x51, 0x0f, 0xc6, 0x96,
0x2d, 0xa4, 0xc1, 0xf5, 0x7d, 0x34, 0xd0, 0xd9, 0x86, 0xc9, 0x64,
0x12, 0x59, 0xc4, 0x90, 0x07, 0x81, 0x97, 0x95, 0x9d, 0x80, 0x09,
0x82, 0x31, 0x03, 0x74, 0x66, 0x1d, 0xf0, 0xaa, 0xe7, 0xd7, 0x4f,
0xe1, 0x09, 0x97, 0xca, 0x0f, 0x3f, 0xb0, 0x89, 0x5a, 0x81, 0xe6,
0x57, 0x3b, 0xe9, 0xa5, 0x9e, 0x34, 0x0f, 0x70, 0xe9, 0x0e, 0xeb,
0x75, 0x1f, 0x80, 0x79, 0x83, 0x8e, 0x55, 0xdc, 0x44, 0x2a, 0xbb,
0x88, 0x0c, 0x45, 0x84, 0x26, 0xc7, 0x10, 0x3f, 0x78, 0x4c, 0x74,
0x1e, 0x3d, 0x85, 0xd6, 0x43, 0xc7, 0x45, 0xdb, 0xc1, 0xe3, 0xe8,
0x78, 0xf9, 0x35, 0xd1, 0xbb, 0xf7, 0x30, 0xe6, 0x0d, 0x8e, 0x8a,
0xf8, 0xc8, 0x18, 0xe2, 0x41, 0xd1, 0x09, 0xec, 0xf5, 0x66, 0xf1,
0x28, 0x0a, 0xf3, 0xda, 0x91, 0x99, 0xdf, 0x45, 0x63, 0x17, 0xaf,
0xc5, 0x89, 0xbe, 0xc5, 0x34, 0xb4, 0x74, 0x3e, 0x8d, 0x2e, 0xea,
0xc5, 0xc8, 0xe2, 0xf9, 0x34, 0xda, 0xdb, 0x83, 0x31, 0x84, 0x51,
0x80, 0x06, 0xa3, 0x1c, 0xb3, 0x03, 0xcc, 0xb2, 0xba, 0x13, 0x8e,
0x10, 0x73, 0x52, 0x5a, 0xa6, 0x0b, 0xa0, 0x0c, 0x5b, 0x9a, 0xe9,
0x92, 0xd7, 0x94, 0x50, 0x70, 0x6e, 0x8a, 0x0d, 0xf0, 0x6e, 0xb8,
0x2b, 0xdc, 0x80, 0x26, 0x0b, 0x33, 0xe6, 0x01, 0x33, 0x27, 0x88,
0x59, 0x27, 0xdd, 0x65, 0x99, 0xd9, 0xd2, 0xbc, 0xf6, 0x31, 0x7d,
0x1c, 0x02, 0x83, 0x06, 0x42, 0xa8, 0xbc, 0x15, 0x87, 0x66, 0x8c,
0x23, 0x3e, 0x38, 0x82, 0xd4, 0x91, 0x53, 0xa2, 0x75, 0xef, 0x61,
0x74, 0xfe, 0xf6, 0x25, 0xb1, 0x64, 0xf7, 0x61, 0xd1, 0xb5, 0xe7,
0xa0, 0xe8, 0x3c, 0x72, 0x12, 0xed, 0x3c, 0x50, 0x5a, 0x81, 0xcd,
0x11, 0x6b, 0x6f, 0x41, 0x66, 0xcd, 0x32, 0x1a, 0x58, 0xb6, 0x10,
0x23, 0x17, 0xaf, 0xa5, 0xa3, 0x17, 0xae, 0xa5, 0x13, 0x4b, 0xe6,
0xd3, 0x68, 0x6f, 0x27, 0xc6, 0x93, 0x6d, 0x48, 0x23, 0x8c, 0x02,
0x38, 0x80, 0x02, 0xc8, 0xe2, 0xc4, 0x72, 0x17, 0x20, 0xf1, 0x4a,
0x35, 0x86, 0x33, 0xac, 0x0c, 0xc9, 0x34, 0xa7, 0x7d, 0x0b, 0x07,
0xf7, 0xd7, 0x2b, 0xbe, 0x66, 0x85, 0x9a, 0x23, 0xd0, 0x54, 0x61,
0xe6, 0xe4, 0xe6, 0xb9, 0xc1, 0x4b, 0xb7, 0xa5, 0x79, 0x2d, 0x3b,
0x41, 0x6f, 0x5a, 0x6f, 0x4d, 0xc5, 0xba, 0x42, 0xe5, 0x38, 0x57,
0x0e, 0xd1, 0xe1, 0x51, 0x24, 0x5f, 0xdd, 0x27, 0xba, 0xb7, 0xed,
0x14, 0x8b, 0x5e, 0x7e, 0x55, 0xf4, 0x6e, 0xdb, 0x81, 0xc5, 0x27,
0x06, 0x44, 0xcb, 0xd8, 0x04, 0xa2, 0xc1, 0x23, 0x1d, 0x58, 0x60,
0x33, 0x2d, 0x1c, 0x86, 0xd1, 0xdb, 0x89, 0xf4, 0x9a, 0xe5, 0xd4,
0x7f, 0xf9, 0x05, 0x74, 0xe4, 0xdc, 0x15, 0x74, 0xf2, 0xb2, 0x73,
0xe9, 0xe8, 0xfc, 0x2e, 0x8c, 0x85, 0x12, 0xc8, 0x42, 0x47, 0x11,
0x26, 0x84, 0x45, 0xc9, 0xb9, 0x29, 0x30, 0x27, 0x68, 0x19, 0x96,
0x65, 0xb7, 0x5f, 0xfb, 0x76, 0x4e, 0x6e, 0xa9, 0xa9, 0xa0, 0xd6,
0xe0, 0x05, 0x34, 0xa7, 0x56, 0xe8, 0x5e, 0x31, 0x32, 0x37, 0x10,
0xe9, 0x36, 0xa0, 0x39, 0x4d, 0x1a, 0x50, 0xd1, 0x56, 0xce, 0x00,
0x64, 0x60, 0x08, 0x97, 0x73, 0x15, 0x11, 0x1a, 0x1b, 0x42, 0xcb,
0xc1, 0xe3, 0xa2, 0x73, 0xfb, 0x2e, 0xcc, 0xff, 0xb7, 0xad, 0x7c,
0xc5, 0xab, 0x07, 0xd1, 0x7d, 0xe8, 0xb8, 0x68, 0x3b, 0x35, 0x84,
0x54, 0xf0, 0xa8, 0x06, 0x16, 0x58, 0x6d, 0x96, 0x8c, 0xa3, 0x70,
0x4e, 0x0f, 0x8d, 0xad, 0x58, 0x8c, 0xc1, 0xcb, 0xcf, 0xa7, 0x43,
0x57, 0x5e, 0x42, 0x07, 0x57, 0x2c, 0xa4, 0xa1, 0x05, 0xdd, 0x18,
0xa5, 0x24, 0x32, 0x30, 0x21, 0x50, 0x28, 0x03, 0x4e, 0x54, 0x41,
0xc9, 0xb0, 0xcd, 0x3b, 0x2d, 0x1b, 0x2e, 0xeb, 0x9d, 0xe0, 0xe8,
0x04, 0x35, 0xaf, 0xd8, 0x9a, 0x2f, 0xd0, 0x54, 0x5d, 0x4c, 0x2f,
0x50, 0x59, 0xa7, 0x90, 0x6d, 0xbe, 0x3a, 0x1f, 0x41, 0x43, 0x08,
0x84, 0x30, 0x04, 0x4c, 0x84, 0xb2, 0xe3, 0x25, 0xf5, 0xf5, 0xd4,
0xf3, 0x62, 0xc5, 0x6f, 0x5e, 0x10, 0xcb, 0x5e, 0xd8, 0x29, 0x16,
0x9e, 0x18, 0x40, 0x4b, 0xd0, 0xec, 0x21, 0xb0, 0xc0, 0x9a, 0x6b,
0x2d, 0x49, 0xe4, 0x56, 0x2e, 0xa1, 0x81, 0xb7, 0x5d, 0x46, 0xfb,
0xae, 0xb8, 0x88, 0x0e, 0x6d, 0xb8, 0x90, 0x0e, 0xce, 0xeb, 0xc4,
0x38, 0xa2, 0xc8, 0x96, 0x01, 0x47, 0x30, 0x7d, 0xc1, 0x55, 0xf4,
0x59, 0x76, 0x02, 0xa0, 0x5b, 0x25, 0x85, 0x6b, 0x4d, 0xa8, 0x0a,
0xd0, 0xbc, 0x5c, 0x4c, 0x27, 0x05, 0x16, 0xb2, 0xfc, 0x7a, 0xcd,
0x4f, 0x2f, 0x97, 0x54, 0x18, 0x21, 0x04, 0x42, 0x1e, 0xd1, 0x3d,
0xfb, 0x45, 0xef, 0xd3, 0xcf, 0xa1, 0xef, 0xa7, 0xbf, 0xe6, 0x6b,
0x77, 0xec, 0x45, 0xef, 0x81, 0xa3, 0xa2, 0x23, 0x00, 0x58, 0x60,
0x5e, 0xa6, 0x31, 0xc0, 0xe4, 0xcd, 0x3d, 0x06, 0x51, 0xe9, 0x33,
0xad, 0xb9, 0x6a, 0x5d, 0xed, 0x48, 0xaf, 0x5a, 0x4a, 0x83, 0x57,
0xbe, 0x81, 0xf6, 0xff, 0xc9, 0x9b, 0xe9, 0xb5, 0x4b, 0xd6, 0xd1,
0x91, 0x68, 0x07, 0xc6, 0x21, 0x60, 0x22, 0x0f, 0xc0, 0xa8, 0x54,
0x12, 0x58, 0xc1, 0x55, 0xb0, 0xcc, 0x5b, 0x7f, 0xed, 0xf3, 0x76,
0xb5, 0x67, 0x3a, 0xb8, 0xa1, 0x6e, 0x1f, 0xde, 0x57, 0x01, 0x4d,
0x36, 0x66, 0xe6, 0x14, 0xbc, 0xd7, 0x5d, 0x60, 0x65, 0x9f, 0xc2,
0x33, 0x96, 0x19, 0x74, 0x44, 0x40, 0xd0, 0x41, 0xc5, 0x71, 0xa4,
0x5e, 0xd8, 0x21, 0x96, 0xfc, 0xe4, 0x19, 0xb1, 0xee, 0x77, 0x2f,
0x8b, 0xa5, 0xcf, 0x6d, 0x17, 0x8b, 0xb3, 0x79, 0x84, 0x82, 0x62,
0x1a, 0x98, 0xac, 0xad, 0x5c, 0x4c, 0xf8, 0xf2, 0xdd, 0x0c, 0xcc,
0xda, 0x73, 0x3e, 0xa6, 0x03, 0x26, 0x79, 0x03, 0xf8, 0xe4, 0x46,
0x8e, 0x83, 0xc7, 0x9d, 0x89, 0xc4, 0x08, 0x78, 0xe8, 0x6e, 0x0d,
0xcb, 0x96, 0x95, 0x8b, 0xd7, 0x0c, 0x92, 0x01, 0xa1, 0x30, 0x70,
0xf3, 0xbd, 0x1c, 0x3b, 0xf7, 0x06, 0x83, 0x96, 0x4f, 0xd9, 0xaa,
0xa5, 0x34, 0xb0, 0xe1, 0x22, 0x3a, 0xf0, 0xd6, 0xcb, 0x68, 0xef,
0x3b, 0xdf, 0x44, 0xaf, 0x75, 0xf6, 0x62, 0x08, 0x0c, 0x05, 0xe4,
0x40, 0x96, 0xfa, 0xd4, 0x82, 0x05, 0x5a, 0xd6, 0xf9, 0xa9, 0x65,
0xc3, 0xf2, 0x6b, 0x38, 0x40, 0xcd, 0x80, 0x7b, 0x33, 0x8f, 0xca,
0x24, 0x0b, 0x34, 0xb7, 0x78, 0x99, 0x55, 0x99, 0xb9, 0x81, 0x2b,
0xec, 0x38, 0x1f, 0x02, 0x43, 0x04, 0x84, 0x0c, 0x92, 0x5b, 0xb7,
0x8b, 0x65, 0x4f, 0x3c, 0x2b, 0xd6, 0x3c, 0xfe, 0xa4, 0xb8, 0x60,
0xe7, 0x1e, 0x31, 0x3f, 0x78, 0x44, 0x02, 0xab, 0x47, 0x3d, 0x3d,
0x74, 0xb7, 0x86, 0x8f, 0x7d, 0x92, 0x80, 0x31, 0x87, 0x0c, 0x09,
0xe0, 0x5f, 0xbf, 0x2b, 0x70, 0xfd, 0xdf, 0x9a, 0x8e, 0xdb, 0xbf,
0xf7, 0x2a, 0xc2, 0x0f, 0xbf, 0xa9, 0x4d, 0xeb, 0x01, 0xab, 0xa5,
0x80, 0x1f, 0x7d, 0x5f, 0xe0, 0xba, 0xbf, 0x31, 0x51, 0x28, 0x06,
0xd7, 0xda, 0xc9, 0xba, 0x3b, 0x90, 0x7e, 0xfb, 0x9b, 0xd8, 0xab,
0x7f, 0x7a, 0x15, 0xed, 0xbc, 0xea, 0x52, 0xda, 0x3d, 0xef, 0x1c,
0x0c, 0xa0, 0x08, 0x8e, 0x3c, 0x04, 0x44, 0x05, 0x5e, 0x05, 0x0b,
0xc8, 0x0a, 0x2e, 0x90, 0x2b, 0xba, 0xc4, 0xd9, 0x3c, 0xdd, 0x4f,
0x19, 0xa0, 0x4d, 0xc5, 0xcc, 0x9c, 0x9a, 0x61, 0xd8, 0x5d, 0xcc,
0xb0, 0xcb, 0x14, 0x01, 0xca, 0x11, 0xb1, 0x08, 0x18, 0x34, 0x68,
0x47, 0x0f, 0x63, 0xfe, 0x4f, 0x9e, 0xe6, 0xe7, 0x7f, 0xe7, 0xc7,
0xe2, 0x8d, 0x5b, 0x5f, 0x16, 0xcb, 0x82, 0x47, 0x21, 0xb0, 0x46,
0x59, 0x6b, 0x12, 0xd8, 0xf6, 0x7d, 0x0d, 0xab, 0x56, 0x11, 0x90,
0xab, 0x56, 0x69, 0x82, 0x01, 0x1b, 0x6e, 0x30, 0xb1, 0x75, 0xfb,
0x4c, 0x95, 0x95, 0x88, 0x03, 0x2f, 0x7e, 0x5f, 0xc3, 0xea, 0x35,
0x0e, 0xdb, 0x45, 0x80, 0x63, 0x47, 0x81, 0xf3, 0xde, 0x67, 0x60,
0x64, 0x3c, 0xb8, 0xc6, 0x32, 0xb6, 0xa0, 0x1b, 0xa3, 0xd7, 0x5c,
0xcd, 0xb6, 0x7f, 0xe8, 0x3d, 0xb4, 0xed, 0xd2, 0x73, 0xe9, 0x00,
0x62, 0x48, 0x23, 0x03, 0x02, 0x9f, 0x01, 0xb3, 0x7c, 0x19, 0x5e,
0x79, 0x17, 0xb8, 0x39, 0xa9, 0x35, 0x57, 0xa8, 0x79, 0x01, 0xcd,
0xad, 0x46, 0x53, 0x77, 0x71, 0x33, 0xad, 0x4a, 0x2c, 0x62, 0x99,
0xc2, 0x20, 0x84, 0x11, 0x05, 0x03, 0x10, 0xfe, 0xfd, 0x0e, 0xb1,
0xfc, 0x5f, 0x1e, 0x11, 0x57, 0x3d, 0xfe, 0xff, 0xf8, 0x1b, 0xc6,
0x26, 0x82, 0x06, 0xac, 0x81, 0x35, 0xc7, 0x36, 0x5c, 0x48, 0xf8,
0xcd, 0xf7, 0x34, 0x90, 0x93, 0xd2, 0x8a, 0x03, 0xcf, 0x6f, 0x13,
0xd8, 0xf0, 0x21, 0x13, 0x45, 0x63, 0x3a, 0xf9, 0xb6, 0x0f, 0x32,
0x7c, 0xe9, 0x7e, 0x06, 0x8c, 0x57, 0x43, 0x10, 0x61, 0xe0, 0xbd,
0x1f, 0x37, 0xf1, 0xa3, 0xa7, 0x03, 0x57, 0xb3, 0x16, 0x7b, 0xf3,
0x1b, 0x68, 0xf7, 0x2d, 0x7f, 0xc1, 0x7e, 0xf5, 0x67, 0x6f, 0xa5,
0x97, 0xc2, 0x29, 0x8c, 0x21, 0x0b, 0xc0, 0x84, 0x61, 0x01, 0x59,
0xde, 0x32, 0x5f, 0x70, 0x50, 0x6a, 0x45, 0x97, 0x78, 0x1a, 0x77,
0x53, 0x68, 0xf6, 0xf6, 0x67, 0x4e, 0xdf, 0x60, 0x3a, 0xc5, 0xcc,
0x42, 0x0e, 0xea, 0x2c, 0x5a, 0x01, 0x5a, 0x04, 0x0c, 0x84, 0xf0,
0x73, 0x2f, 0x8a, 0xb5, 0xff, 0xf8, 0x75, 0xfe, 0x27, 0x3f, 0xff,
0xb5, 0x38, 0x2f, 0x5f, 0x9c, 0x5b, 0x71, 0xb1, 0x68, 0x34, 0x0a,
0xc6, 0x18, 0x4c, 0xd3, 0x44, 0x3e, 0x9f, 0x97, 0xce, 0x2f, 0x84,
0x40, 0x36, 0x9b, 0x6d, 0xca, 0x39, 0xc5, 0xe3, 0x71, 0x44, 0xa3,
0x51, 0x14, 0x8b, 0x45, 0x18, 0x86, 0x01, 0xd3, 0x2c, 0xb9, 0x60,
0x9a, 0x56, 0xea, 0xce, 0x4c, 0xd7, 0x75, 0x70, 0xce, 0x31, 0x39,
0x39, 0xd9, 0x90, 0xe3, 0xa5, 0x52, 0x29, 0x68, 0x9a, 0x36, 0xe3,
0x58, 0xa6, 0x69, 0x82, 0x73, 0x0e, 0x4d, 0xd3, 0xc0, 0x18, 0xab,
0x1c, 0x57, 0xd7, 0x75, 0x64, 0x32, 0x19, 0xa9, 0x6b, 0xe5, 0x65,
0x5f, 0xbc, 0x83, 0xe1, 0xce, 0x5b, 0x19, 0x30, 0xe1, 0xb0, 0x32,
0x09, 0xdc, 0x74, 0x3b, 0xc7, 0xb7, 0x7e, 0x54, 0xa2, 0xdd, 0xc2,
0x1e, 0xe0, 0xc5, 0xc7, 0x75, 0x74, 0x77, 0x39, 0xc4, 0xce, 0x5a,
0x80, 0x6f, 0x7c, 0x8b, 0xe3, 0xa3, 0xf7, 0xf0, 0x80, 0x4c, 0x75,
0xda, 0xb9, 0x2b, 0xe9, 0xd8, 0x2d, 0x37, 0xb2, 0x7f, 0xfb, 0x8b,
0xf7, 0xd0, 0x6f, 0x13, 0xed, 0x18, 0xc6, 0x24, 0x50, 0x6e, 0x08,
0x92, 0x47, 0x49, 0x17, 0xdb, 0x95, 0x9b, 0x75, 0x32, 0x3d, 0x94,
0x9a, 0x2b, 0xd0, 0xbc, 0x2a, 0x02, 0xa6, 0x26, 0x7b, 0xf0, 0x3f,
0x5c, 0x51, 0x63, 0xa5, 0xdf, 0x28, 0x08, 0x11, 0x24, 0xc1, 0xf7,
0xef, 0xc1, 0xd2, 0xbb, 0x37, 0xf3, 0x0f, 0x3c, 0xfa, 0x33, 0xfe,
0x9f, 0xe6, 0x6a, 0x0d, 0xe5, 0x6d, 0xb7, 0xdd, 0x86, 0xdb, 0x6f,
0xbf, 0x1d, 0xe9, 0x74, 0x1a, 0xd7, 0x5f, 0x7f, 0x3d, 0x76, 0xec,
0xd8, 0xe1, 0x99, 0xff, 0xa6, 0x9b, 0x6e, 0xc2, 0x17, 0xbe, 0xf0,
0x05, 0xfc, 0xe0, 0x07, 0x3f, 0xc0, 0x1d, 0x77, 0xdc, 0xd1, 0x94,
0x73, 0xfa, 0xf8, 0xc7, 0x3f, 0x8e, 0x8d, 0x1b, 0x37, 0xa2, 0x50,
0x28, 0xc0, 0x34, 0x4d, 0x68, 0x9a, 0x56, 0x01, 0x8b, 0x69, 0x9a,
0x60, 0x8c, 0x61, 0xcb, 0x96, 0x2d, 0xb8, 0xf9, 0xe6, 0x9b, 0x1b,
0x72, 0xbc, 0x07, 0x1f, 0x7c, 0x10, 0xd7, 0x5e, 0x7b, 0x2d, 0x84,
0x10, 0xe0, 0x9c, 0x83, 0x73, 0x8e, 0x6c, 0x36, 0x0b, 0xd3, 0x34,
0xa1, 0xeb, 0x3a, 0xe2, 0xf1, 0x92, 0x58, 0x67, 0x8c, 0x81, 0x88,
0x70, 0xfd, 0xf5, 0xd7, 0xe3, 0xa9, 0xa7, 0x9e, 0xaa, 0xeb, 0x98,
0xe1, 0x10, 0xf0, 0xfc, 0xf7, 0x35, 0x9c, 0x7f, 0x01, 0x01, 0x19,
0xfb, 0x4a, 0xe0, 0xe4, 0x49, 0xe0, 0x82, 0x6b, 0x0c, 0x9c, 0x1a,
0x06, 0x1e, 0xbc, 0x4b, 0xc3, 0x27, 0x3e, 0x4a, 0xd5, 0xea, 0x2c,
0x0a, 0xec, 0xde, 0x0d, 0xbc, 0xf1, 0x06, 0x03, 0x63, 0x13, 0x01,
0x90, 0x1a, 0x65, 0x6b, 0x97, 0xd3, 0xd1, 0xfb, 0xff, 0x9a, 0x3d,
0xf6, 0xbe, 0x77, 0xd0, 0xef, 0xc0, 0x51, 0x44, 0x1e, 0x26, 0x08,
0x39, 0x8b, 0x52, 0xcb, 0x7b, 0xb8, 0x9f, 0xf6, 0x2f, 0x0b, 0x2a,
0x50, 0x93, 0xed, 0xd8, 0x4f, 0xa6, 0x82, 0x60, 0x5a, 0xb9, 0xe9,
0x60, 0x88, 0xc3, 0xfc, 0xf2, 0x37, 0xf8, 0xbb, 0x2f, 0xbb, 0xce,
0xfc, 0xfb, 0x47, 0x7e, 0xca, 0x37, 0xcc, 0xe5, 0xe6, 0x16, 0xd1,
0x68, 0x14, 0x4b, 0x96, 0x2c, 0xc1, 0xfa, 0xf5, 0xeb, 0xf1, 0xc3,
0x1f, 0xfe, 0x10, 0x8b, 0x16, 0x2d, 0xf2, 0xcc, 0x6f, 0x9a, 0x26,
0x96, 0x2c, 0x59, 0x82, 0x48, 0x24, 0xd2, 0xb4, 0x73, 0xca, 0xe5,
0x72, 0xe8, 0xe9, 0xe9, 0xc1, 0xa2, 0x45, 0x8b, 0xb0, 0x74, 0xe9,
0x52, 0x68, 0x9a, 0x86, 0xf1, 0xf1, 0x71, 0xe4, 0xf3, 0x79, 0xc4,
0xe3, 0x71, 0xf4, 0xf6, 0xf6, 0xa2, 0xb3, 0xb3, 0xb3, 0x61, 0xc7,
0x6b, 0x6b, 0x6b, 0x43, 0x2a, 0x95, 0x42, 0x3e, 0x9f, 0xc7, 0xc8,
0xc8, 0x08, 0x88, 0x08, 0x7d, 0x7d, 0x7d, 0x58, 0xb5, 0x6a, 0x15,
0x96, 0x2f, 0x5f, 0x8e, 0x89, 0x89, 0x09, 0x8c, 0x8f, 0x8f, 0xc3,
0x34, 0x4d, 0xcc, 0x9b, 0x37, 0x0f, 0xd1, 0x68, 0xfd, 0x1f, 0x77,
0x14, 0x8a, 0xc0, 0x27, 0x36, 0x72, 0x14, 0x26, 0xcb, 0x4f, 0xe7,
0x8c, 0x95, 0x40, 0xef, 0x32, 0xe0, 0x96, 0x1b, 0x18, 0x56, 0x2d,
0x25, 0xdc, 0xf4, 0x7e, 0x02, 0x26, 0x1d, 0x5c, 0x4d, 0x0e, 0xdc,
0x72, 0xbf, 0x19, 0xc0, 0xac, 0xc1, 0xf6, 0xea, 0x7e, 0xb1, 0xf0,
0x9a, 0x4f, 0x99, 0x77, 0x7c, 0xe0, 0x53, 0xe6, 0xed, 0x03, 0xc3,
0x68, 0x47, 0x12, 0x26, 0xaa, 0x1b, 0xd7, 0xdb, 0xbf, 0xdf, 0x76,
0xea, 0x93, 0xd0, 0xca, 0x28, 0xcf, 0x9e, 0x4a, 0x65, 0xfa, 0xc2,
0xaf, 0xfe, 0xd4, 0x29, 0x04, 0xe4, 0x0b, 0x08, 0xff, 0xe5, 0xa7,
0xf9, 0xa7, 0x6e, 0xb9, 0x8f, 0xff, 0xd5, 0xe0, 0xa8, 0x68, 0x9d,
0xeb, 0x37, 0xcf, 0xea, 0x36, 0xae, 0x58, 0xb1, 0x02, 0x5b, 0xb6,
0x6c, 0x41, 0x5b, 0x5b, 0x9b, 0x6b, 0xfe, 0xb1, 0xb1, 0xb1, 0x19,
0xbf, 0xcd, 0xb0, 0xe1, 0xe1, 0xe1, 0x2a, 0xc5, 0xb6, 0x76, 0xed,
0x5a, 0xf4, 0xf5, 0xf5, 0x61, 0xf9, 0xf2, 0xe5, 0x58, 0xb1, 0x62,
0x05, 0xee, 0xbc, 0xf3, 0xce, 0x86, 0x1d, 0xef, 0xb3, 0x9f, 0xfd,
0x2c, 0x56, 0xac, 0x58, 0x81, 0xbe, 0xbe, 0x3e, 0xac, 0x5b, 0xb7,
0x0e, 0x9f, 0xf9, 0xcc, 0x67, 0x66, 0xc0, 0xf5, 0x1d, 0xef, 0x78,
0x07, 0x56, 0xaf, 0x5e, 0x8d, 0xbe, 0xbe, 0x3e, 0xac, 0x5c, 0xb9,
0x12, 0x5b, 0xb7, 0x6e, 0x6d, 0xc8, 0x71, 0xb7, 0xfe, 0x5e, 0xe0,
0x8b, 0x5f, 0xe3, 0x40, 0xd2, 0x61, 0x65, 0x1a, 0xb8, 0xf5, 0x46,
0x86, 0x1f, 0xfc, 0x93, 0x86, 0x48, 0xb4, 0xfc, 0xbe, 0xb7, 0xb9,
0xa5, 0xff, 0xfd, 0xeb, 0x1c, 0x4f, 0x6e, 0x0d, 0xe2, 0x66, 0xcd,
0xb2, 0xc7, 0x7e, 0x21, 0x36, 0xbc, 0xe5, 0x83, 0xc6, 0xbd, 0xcf,
0x3d, 0x2f, 0xd6, 0x21, 0x85, 0x02, 0xaa, 0x3f, 0x81, 0x74, 0xeb,
0x65, 0xda, 0xb1, 0x8f, 0x46, 0xd5, 0xae, 0x97, 0xbd, 0x7b, 0xd9,
0xd0, 0x40, 0x06, 0x87, 0xf6, 0xc1, 0x3b, 0xcd, 0x3b, 0xbe, 0xb9,
0x85, 0x5f, 0x1d, 0xdc, 0xae, 0x92, 0xd9, 0x63, 0x41, 0x17, 0x5f,
0x7c, 0x31, 0x1e, 0x7b, 0xec, 0x31, 0xc4, 0x62, 0x31, 0x69, 0x10,
0x36, 0xda, 0xd2, 0xe9, 0xf4, 0x8c, 0xe5, 0x4c, 0x26, 0x53, 0x51,
0x87, 0xa3, 0xa3, 0xa3, 0xd8, 0xbf, 0x7f, 0x3f, 0x8e, 0x1c, 0x39,
0xd2, 0xb0, 0xe3, 0x1d, 0x3a, 0x74, 0x08, 0xc7, 0x8e, 0x1d, 0x43,
0xb1, 0x58, 0x0a, 0x50, 0x15, 0x0a, 0x85, 0xca, 0x3a, 0xce, 0x79,
0x25, 0xae, 0x96, 0xcd, 0x66, 0xb1, 0x6f, 0xdf, 0x3e, 0x8c, 0x8c,
0x8c, 0x34, 0xec, 0xd8, 0xf7, 0x7f, 0x9d, 0x63, 0xdb, 0xb3, 0x40,
0x55, 0x15, 0x94, 0x09, 0xb4, 0xb5, 0x01, 0xeb, 0xd7, 0x96, 0x1d,
0x1c, 0x9b, 0xab, 0xb9, 0x6b, 0x07, 0xb0, 0xf1, 0x2b, 0x41, 0xdc,
0xac, 0xe9, 0x6a, 0xed, 0x00, 0x16, 0xbf, 0xfb, 0x13, 0xe6, 0x5d,
0x5b, 0xb7, 0x8a, 0xf3, 0x10, 0x47, 0x11, 0xee, 0x1d, 0xb4, 0x7a,
0x8d, 0x9a, 0xe6, 0x09, 0x34, 0x99, 0xb1, 0x01, 0xaa, 0xfb, 0x19,
0x8b, 0xc0, 0xf8, 0xbb, 0x2f, 0xf2, 0x0f, 0xff, 0x9f, 0x5f, 0x8a,
0x2b, 0x83, 0xdb, 0xe4, 0x6d, 0x57, 0x5f, 0x7d, 0x35, 0xbe, 0xf1,
0x8d, 0x6f, 0x40, 0xd7, 0xab, 0x7b, 0x41, 0x9f, 0x82, 0x4b, 0x2e,
0x97, 0x6b, 0xaa, 0xcb, 0x69, 0x77, 0x73, 0x67, 0xd3, 0x84, 0xad,
0xa9, 0xfd, 0x54, 0xa5, 0x40, 0x53, 0x14, 0x72, 0x0e, 0xb8, 0x75,
0x93, 0x89, 0x42, 0xd6, 0xc1, 0xf5, 0x34, 0xcb, 0x51, 0x1a, 0xdb,
0xb8, 0xf3, 0x42, 0x00, 0x7f, 0xfd, 0x0f, 0x26, 0xc6, 0xd3, 0xc1,
0xb3, 0x3a, 0x1b, 0x36, 0x38, 0x8a, 0xf6, 0x1b, 0xef, 0xe4, 0x7f,
0x3b, 0xd4, 0x8f, 0x0e, 0x84, 0x2a, 0xdd, 0x74, 0xfb, 0x8d, 0xcc,
0x56, 0xc5, 0x2a, 0xbf, 0xa7, 0xc8, 0x0b, 0x6c, 0x33, 0xd3, 0xc3,
0x30, 0x5e, 0xdb, 0x29, 0xfa, 0x1e, 0xf8, 0x0e, 0xbf, 0x2e, 0xb8,
0x3d, 0xb6, 0x8b, 0x48, 0xa5, 0xcb, 0xb5, 0x69, 0xd3, 0x26, 0xf4,
0xf7, 0xf7, 0x57, 0xd2, 0x6f, 0xb8, 0xe1, 0x06, 0x6c, 0xde, 0xbc,
0xb9, 0x3a, 0xf6, 0x53, 0x56, 0x2f, 0xcd, 0x04, 0xda, 0xd4, 0x39,
0xcd, 0x86, 0x1a, 0x3c, 0x13, 0x6c, 0xdb, 0x0e, 0x81, 0x7f, 0xfa,
0xba, 0x8b, 0xeb, 0x89, 0x6a, 0x57, 0x73, 0xf3, 0xd7, 0x39, 0x7e,
0xf1, 0x6c, 0xe0, 0x6a, 0xce, 0xa6, 0x1d, 0x3c, 0x2e, 0xe6, 0xdf,
0xf3, 0x3f, 0xf8, 0x07, 0x11, 0x82, 0x01, 0xe7, 0x91, 0xd1, 0x7c,
0xcd, 0x2f, 0x86, 0x26, 0xef, 0x7e, 0x86, 0x60, 0x3c, 0xfc, 0x53,
0xf1, 0x16, 0xce, 0xab, 0x87, 0x31, 0x0b, 0x80, 0x56, 0xba, 0x94,
0x5b, 0xb6, 0x6c, 0xc1, 0xb5, 0xd7, 0x5e, 0x3b, 0xc3, 0xdd, 0xbb,
0xf9, 0xe6, 0x9b, 0xb1, 0x69, 0xd3, 0x26, 0xc7, 0xfc, 0xf5, 0x36,
0x5b, 0x50, 0xb1, 0xbe, 0xbe, 0x3e, 0xac, 0x59, 0xb3, 0x06, 0xe7,
0x9f, 0x7f, 0x3e, 0x2e, 0xbd, 0xf4, 0x52, 0xbc, 0xf9, 0xcd, 0x6f,
0xc6, 0xea, 0xd5, 0xab, 0xcf, 0xaa, 0xfb, 0x70, 0xef, 0x43, 0x1c,
0xcf, 0x3d, 0x2b, 0xe0, 0xd9, 0x99, 0x54, 0x04, 0x78, 0xed, 0xf7,
0x02, 0xf7, 0x3c, 0x18, 0xb8, 0x9a, 0xa7, 0xc3, 0x1e, 0x7f, 0x82,
0xbf, 0x65, 0x62, 0x10, 0x1d, 0xd0, 0x2b, 0x83, 0xa3, 0x78, 0x29,
0xb2, 0x2a, 0x5e, 0x79, 0x01, 0xcd, 0x3a, 0xac, 0x94, 0xd7, 0x70,
0x75, 0xe5, 0x40, 0x08, 0x68, 0xcf, 0x21, 0xb1, 0x38, 0xb8, 0x25,
0xd5, 0x16, 0x0e, 0x87, 0x01, 0x00, 0x2d, 0x2d, 0x2d, 0x78, 0xf6,
0xd9, 0x67, 0x71, 0xdd, 0x75, 0xd7, 0xc1, 0x30, 0xa6, 0x5b, 0x74,
0x7e, 0xee, 0x73, 0x9f, 0xc3, 0x2d, 0xb7, 0xdc, 0x52, 0xb5, 0x9d,
0x35, 0x4f, 0xb3, 0xed, 0xd1, 0x47, 0x1f, 0xc5, 0xab, 0xaf, 0xbe,
0x8a, 0xed, 0xdb, 0xb7, 0x63, 0xdb, 0xb6, 0x6d, 0x78, 0xe6, 0x99,
0x67, 0xf0, 0x91, 0x8f, 0x7c, 0xe4, 0xac, 0xba, 0x0f, 0x99, 0x1c,
0xf0, 0xa9, 0x4d, 0x1c, 0xbc, 0xe8, 0x52, 0x2c, 0x18, 0x50, 0x2c,
0x02, 0x7f, 0xf9, 0x79, 0x8e, 0xb1, 0xc0, 0xd5, 0x3c, 0x2d, 0x96,
0xce, 0x22, 0x39, 0x99, 0x45, 0x0c, 0xb0, 0x0c, 0x74, 0x5d, 0xcd,
0x25, 0x57, 0xb1, 0xe5, 0x37, 0x8c, 0x9d, 0xd3, 0x20, 0xa0, 0xce,
0xa3, 0x1e, 0x33, 0x88, 0x05, 0xdd, 0x34, 0xd0, 0xec, 0xb1, 0x16,
0x5f, 0x8f, 0x66, 0x8f, 0x93, 0xfd, 0xfc, 0xe7, 0x3f, 0xc7, 0x87,
0x3f, 0xfc, 0x61, 0x3c, 0xf2, 0xc8, 0x23, 0x95, 0xb4, 0xcd, 0x9b,
0x37, 0x63, 0x62, 0x62, 0x02, 0xdf, 0xfe, 0xf6, 0xb7, 0xab, 0x5c,
0xcf, 0x59, 0x79, 0x33, 0x3e, 0xfe, 0x38, 0x8e, 0x1e, 0x3d, 0x8a,
0x44, 0x22, 0x81, 0x78, 0x3c, 0x8e, 0x54, 0x2a, 0x85, 0xdd, 0xbb,
0x77, 0x9f, 0x75, 0xf7, 0x62, 0xc3, 0x45, 0x04, 0x0a, 0xa1, 0xfa,
0xd3, 0xa6, 0xf2, 0x93, 0xad, 0x85, 0x81, 0xab, 0xaf, 0xa0, 0xaa,
0xcf, 0xa2, 0x02, 0x9b, 0x1d, 0x8b, 0x86, 0x91, 0x8b, 0x85, 0x91,
0xaf, 0xd5, 0x73, 0x54, 0x1d, 0x68, 0xd8, 0x09, 0x6c, 0xa5, 0xc9,
0x84, 0x76, 0xfd, 0xdb, 0xe9, 0xd7, 0x5f, 0xfa, 0x2e, 0x3e, 0x10,
0xdc, 0x16, 0x9b, 0x17, 0xe3, 0xd0, 0x9e, 0xec, 0xd1, 0x47, 0x1f,
0x45, 0x57, 0x57, 0x17, 0xbe, 0xf4, 0xa5, 0x2f, 0x95, 0xde, 0x07,
0x8c, 0xe1, 0xc1, 0x07, 0x1f, 0xc4, 0x89, 0x13, 0x27, 0x66, 0xc4,
0xd9, 0x66, 0xcb, 0x36, 0x6d, 0xda, 0x84, 0x97, 0x5f, 0x7e, 0xf9,
0xac, 0xbe, 0x0f, 0x97, 0xac, 0x27, 0xdc, 0xf7, 0x69, 0x06, 0x2a,
0xba, 0x3f, 0xdd, 0xcc, 0x00, 0xee, 0xbe, 0x95, 0xe1, 0x89, 0x67,
0x05, 0xfe, 0xfd, 0x95, 0x00, 0x6a, 0xb3, 0x6d, 0x57, 0x5f, 0x41,
0xcf, 0xb7, 0x76, 0x61, 0x18, 0xf9, 0xca, 0xd8, 0x9d, 0x5e, 0x83,
0xa4, 0xc0, 0x96, 0xee, 0xdb, 0x6c, 0xc3, 0x6d, 0xc3, 0x6a, 0xb0,
0xe5, 0x10, 0x7a, 0xe3, 0x25, 0xf4, 0x87, 0xeb, 0xfe, 0x33, 0x3d,
0x1d, 0xdc, 0x16, 0xdb, 0x5b, 0xc7, 0xa5, 0x91, 0xe8, 0xe6, 0xcd,
0x9b, 0x71, 0xff, 0xfd, 0xf7, 0x57, 0x96, 0x63, 0xb1, 0x18, 0x1e,
0x7e, 0xf8, 0x61, 0xbc, 0xfb, 0xdd, 0xef, 0x06, 0x30, 0xbb, 0x31,
0xb4, 0x64, 0x32, 0x39, 0xab, 0xd7, 0x24, 0x14, 0x9a, 0xdd, 0xaf,
0xdf, 0x22, 0x61, 0xe0, 0x5f, 0x3e, 0xc7, 0x10, 0x4f, 0xa1, 0xba,
0xbd, 0x99, 0xd5, 0xcc, 0x92, 0x4a, 0x7b, 0xe8, 0x1e, 0x86, 0x54,
0x22, 0x78, 0x76, 0x67, 0xd3, 0xda, 0x52, 0x98, 0xb8, 0xf7, 0x16,
0xed, 0xe1, 0xca, 0x10, 0xcb, 0x70, 0x9c, 0x9c, 0xd8, 0x64, 0x8d,
0x1a, 0xf8, 0x82, 0xac, 0x8a, 0x82, 0x96, 0xf9, 0xe9, 0x6f, 0xa9,
0x04, 0x04, 0x09, 0xe0, 0xab, 0xf7, 0x69, 0xff, 0x7c, 0xe9, 0x7a,
0xda, 0x15, 0xdc, 0x1e, 0x7f, 0xa0, 0x01, 0xc0, 0x5d, 0x77, 0xdd,
0x85, 0xaf, 0x7e, 0xf5, 0xab, 0x95, 0xe5, 0xae, 0xae, 0x2e, 0xdc,
0x77, 0xdf, 0x7d, 0x00, 0x4a, 0xed, 0xb3, 0x9a, 0x65, 0xe2, 0x34,
0xf7, 0x50, 0x68, 0x6d, 0xa6, 0xa1, 0x69, 0x9a, 0x63, 0xf3, 0x95,
0x46, 0xda, 0xad, 0x37, 0x30, 0x5c, 0xbe, 0xc1, 0xe1, 0x6b, 0x00,
0xa7, 0x88, 0x70, 0x16, 0x38, 0xff, 0x12, 0xc2, 0xe7, 0x3e, 0xc2,
0x82, 0x87, 0x77, 0xb6, 0x5e, 0x70, 0x3a, 0x8a, 0x0f, 0xdd, 0xa3,
0x6d, 0x5e, 0xb9, 0x16, 0x07, 0x90, 0x2f, 0x0f, 0x73, 0xe4, 0xdc,
0xdd, 0xb6, 0x80, 0x7b, 0x5c, 0x4b, 0xea, 0xd3, 0x27, 0xe1, 0xf0,
0xeb, 0xd4, 0x75, 0x87, 0x89, 0x22, 0xa8, 0xb5, 0x0d, 0x13, 0x3f,
0x79, 0x48, 0xbb, 0x77, 0xc3, 0x85, 0xb4, 0x33, 0xb8, 0x4d, 0xd3,
0xca, 0xcb, 0xcb, 0x3e, 0xf9, 0xc9, 0x4f, 0xe2, 0x89, 0x27, 0x9e,
0x98, 0xd5, 0x73, 0x9a, 0xfa, 0x08, 0xfd, 0x4c, 0x30, 0x22, 0xaa,
0x6a, 0x46, 0xd2, 0x48, 0xbb, 0x68, 0x2d, 0xe1, 0xde, 0xdb, 0x59,
0xf5, 0xf7, 0x9c, 0x5e, 0xf5, 0x66, 0x69, 0xe0, 0x6f, 0x3e, 0xc6,
0x70, 0xe9, 0xfa, 0xa0, 0x83, 0xe4, 0x66, 0x5b, 0x4b, 0x02, 0x93,
0xdf, 0x7f, 0x40, 0xfb, 0xe2, 0x75, 0xd7, 0xd0, 0xd3, 0x48, 0x23,
0x0a, 0xff, 0x8e, 0x1c, 0xe1, 0xe2, 0x2d, 0x92, 0x4c, 0x2d, 0xa7,
0x7d, 0x08, 0x29, 0xfb, 0x60, 0xa0, 0x33, 0x07, 0x36, 0xc8, 0x82,
0x75, 0x77, 0x61, 0xf8, 0x97, 0xdf, 0xd2, 0x36, 0x7e, 0xfa, 0x26,
0xf6, 0xa3, 0x90, 0x0e, 0x63, 0xae, 0xdf, 0xb0, 0x44, 0x22, 0xe1,
0xe9, 0x66, 0x19, 0x86, 0x81, 0x1b, 0x6f, 0xbc, 0x11, 0x2f, 0xbc,
0xf0, 0xc2, 0xec, 0x3d, 0x44, 0x2d, 0x2d, 0x33, 0x96, 0xed, 0x6d,
0xde, 0x18, 0x63, 0x0d, 0xf9, 0x9e, 0xd2, 0xd5, 0x05, 0xb4, 0xc4,
0x15, 0x19, 0x63, 0x4d, 0x53, 0x68, 0x91, 0x30, 0xf0, 0x3f, 0xff,
0x8e, 0x21, 0xe6, 0xe4, 0x6a, 0x26, 0x80, 0x7f, 0xf8, 0x1a, 0xc7,
0x33, 0xdb, 0x04, 0x10, 0xab, 0x76, 0x3d, 0xf5, 0x68, 0xc9, 0xf5,
0x4c, 0x04, 0x9d, 0x5c, 0x35, 0xcd, 0xae, 0xb8, 0x80, 0x76, 0x3d,
0xf3, 0x5d, 0xed, 0xf3, 0xd7, 0xbc, 0x87, 0x7e, 0x8d, 0x09, 0x84,
0xe1, 0xdd, 0xf7, 0x99, 0x5d, 0x4c, 0x55, 0xb1, 0x8a, 0xf9, 0xb8,
0x9b, 0xc2, 0x05, 0x6e, 0xf6, 0xfe, 0xbc, 0xa7, 0xa1, 0x46, 0x30,
0x90, 0x07, 0x45, 0xc3, 0xc8, 0x3f, 0xf0, 0x79, 0xf6, 0xbf, 0x9e,
0xfe, 0xb6, 0xf6, 0xf7, 0x6f, 0xba, 0x98, 0x5e, 0x9b, 0xd3, 0x6f,
0xa0, 0x32, 0x3c, 0xbc, 0xe2, 0x46, 0x43, 0x43, 0x43, 0x78, 0xff,
0xfb, 0xdf, 0x8f, 0xc3, 0x87, 0x0f, 0xcf, 0x50, 0x2e, 0xcd, 0xb2,
0xd6, 0xd6, 0x99, 0x9f, 0xd8, 0x6e, 0xdc, 0xb8, 0x11, 0xdf, 0xfc,
0xe6, 0x37, 0xf1, 0xe8, 0xa3, 0x8f, 0xe2, 0x67, 0x3f, 0xfb, 0x19,
0x76, 0xee, 0xdc, 0x89, 0x07, 0x1e, 0x78, 0x60, 0x56, 0x54, 0xab,
0xae, 0xeb, 0x95, 0xa6, 0x2d, 0x8d, 0xb6, 0xbb, 0x3f, 0xce, 0x70,
0xf9, 0x9b, 0x1c, 0x5c, 0xcd, 0x30, 0x70, 0x64, 0x5f, 0xa9, 0x6d,
0xda, 0xe7, 0xbf, 0xcc, 0x21, 0x0c, 0x67, 0xd7, 0xf3, 0xa2, 0x37,
0x12, 0xee, 0xfa, 0x58, 0xe0, 0x7a, 0x36, 0xda, 0x3a, 0x5a, 0x90,
0xfe, 0xe2, 0x9d, 0xec, 0x91, 0x5f, 0x3f, 0xac, 0x6d, 0xbc, 0xf0,
0x3c, 0xda, 0x8b, 0x34, 0x42, 0x1e, 0x30, 0x73, 0x1a, 0xf1, 0x09,
0x4e, 0xae, 0xa7, 0xee, 0xa1, 0xce, 0xc8, 0x47, 0xa9, 0x99, 0x98,
0xf9, 0xf9, 0x93, 0x01, 0xeb, 0x97, 0xf1, 0x06, 0x18, 0xd2, 0x88,
0x6c, 0xb8, 0x8c, 0x76, 0xfc, 0xea, 0x3b, 0xda, 0x3f, 0xfe, 0xf0,
0x97, 0xe2, 0x92, 0xfb, 0x1e, 0xe4, 0xef, 0xd9, 0xbe, 0x6b, 0xee,
0xb5, 0x55, 0x8b, 0xc7, 0xe3, 0xe0, 0x9c, 0xfb, 0x2a, 0x9e, 0x43,
0x87, 0x0e, 0xe1, 0x9a, 0x6b, 0xae, 0xc1, 0x93, 0x4f, 0x3e, 0x89,
0xb6, 0xb6, 0xb6, 0xa6, 0xc6, 0xb9, 0xba, 0xba, 0xba, 0x00, 0x94,
0xe2, 0x74, 0x42, 0x08, 0xbc, 0xeb, 0x5d, 0xef, 0xaa, 0xca, 0xf3,
0xca, 0x2b, 0xaf, 0x34, 0xf5, 0x9a, 0x4c, 0x75, 0x25, 0xa4, 0x69,
0x5a, 0xa5, 0xfb, 0xa0, 0x46, 0xda, 0x65, 0xe7, 0x11, 0xee, 0xfc,
0x18, 0xab, 0x86, 0x59, 0x19, 0x68, 0x7f, 0xb7, 0x99, 0x23, 0x97,
0x07, 0x7e, 0xf3, 0xa2, 0xc0, 0x63, 0x3f, 0x16, 0xf8, 0xc0, 0x75,
0x54, 0xdd, 0x77, 0x5a, 0x1a, 0xb8, 0xf3, 0xaf, 0x18, 0x9e, 0xdc,
0x2a, 0xf0, 0xd4, 0xb6, 0xa0, 0xd6, 0xb3, 0xee, 0x17, 0x69, 0x12,
0x99, 0x8f, 0xfe, 0x39, 0x7b, 0xe6, 0xb6, 0x0f, 0xb1, 0x27, 0x16,
0x2d, 0xc1, 0x51, 0x64, 0x21, 0x90, 0x05, 0xa1, 0xba, 0x9b, 0x20,
0xa7, 0x01, 0x52, 0x5c, 0x87, 0xaf, 0xab, 0x88, 0x00, 0x89, 0x0e,
0x1e, 0xed, 0x9d, 0x3c, 0x3a, 0xf5, 0x58, 0xeb, 0xd4, 0xfd, 0xf6,
0x74, 0x8f, 0xb5, 0x0c, 0x61, 0xc4, 0x21, 0xb2, 0xa3, 0x68, 0xff,
0xbf, 0xbf, 0x12, 0x17, 0x7d, 0xed, 0x71, 0x7e, 0xe5, 0x2f, 0xb7,
0x8a, 0xb5, 0x73, 0xe5, 0x26, 0xf6, 0xf5, 0xf5, 0x21, 0x1a, 0x8d,
0xe2, 0xe4, 0xc9, 0x93, 0x18, 0x1a, 0x1a, 0xf2, 0xcd, 0xbf, 0x6c,
0xd9, 0x32, 0x24, 0x12, 0x09, 0x1c, 0x3b, 0x76, 0xac, 0xa1, 0x1f,
0x69, 0x5b, 0x6d, 0xc1, 0x82, 0x05, 0xe8, 0xe9, 0xe9, 0x41, 0x2e,
0x97, 0x83, 0x10, 0xa2, 0xa2, 0x06, 0x85, 0x10, 0xd0, 0x34, 0x0d,
0xd1, 0x68, 0x14, 0x63, 0x63, 0x63, 0xd8, 0xbb, 0x77, 0x6f, 0xd3,
0x8e, 0xdf, 0xd9, 0xd9, 0x89, 0x42, 0xa1, 0x80, 0x68, 0x34, 0x8a,
0x03, 0x07, 0x0e, 0x60, 0x7c, 0xbc, 0x71, 0x7d, 0x5b, 0xc7, 0x22,
0xc0, 0xb6, 0xef, 0x69, 0x38, 0xf7, 0x3c, 0x02, 0xec, 0x5f, 0x75,
0xc5, 0x81, 0x17, 0x9f, 0x17, 0xd8, 0xf0, 0x61, 0x13, 0xf9, 0x72,
0x53, 0xbf, 0xd5, 0x4b, 0x09, 0xcf, 0x3f, 0xae, 0x95, 0x6a, 0x36,
0x8d, 0xea, 0xfc, 0x3b, 0x77, 0x00, 0x97, 0xdd, 0x60, 0x60, 0x32,
0x1b, 0x40, 0xa9, 0x16, 0x5b, 0x7a, 0x0e, 0x06, 0x3f, 0xfa, 0x7e,
0xf6, 0xec, 0x07, 0xde, 0x49, 0xdb, 0x56, 0xac, 0xa6, 0x03, 0xc8,
0x43, 0x94, 0xc7, 0x6a, 0x9f, 0xea, 0xd4, 0x31, 0x6f, 0xfb, 0xad,
0xa5, 0x1b, 0x6e, 0xe9, 0x31, 0x05, 0xdc, 0x46, 0x45, 0x77, 0xea,
0xb9, 0x36, 0x84, 0xe9, 0xce, 0x1e, 0x67, 0x02, 0x4e, 0x43, 0x08,
0x31, 0x08, 0x14, 0x10, 0x7f, 0xe6, 0x39, 0xb1, 0xe6, 0x5f, 0x7f,
0x21, 0x2e, 0xf9, 0xe9, 0xaf, 0xf8, 0xfa, 0xc3, 0x27, 0xd0, 0x11,
0xdc, 0xf2, 0xc0, 0x1a, 0x69, 0xf7, 0xdf, 0xca, 0xf0, 0x5f, 0xef,
0x70, 0xe8, 0xad, 0x96, 0x01, 0x5c, 0x03, 0xde, 0xf6, 0x21, 0x13,
0x4f, 0x3f, 0x3f, 0x53, 0x71, 0x7d, 0xe1, 0x13, 0x0c, 0xf7, 0x7c,
0xd6, 0xa1, 0x0b, 0x6e, 0x00, 0x48, 0x01, 0xff, 0xfc, 0x15, 0x8e,
0xdb, 0xfe, 0x5b, 0xf0, 0x49, 0x94, 0xac, 0x85, 0x74, 0x18, 0x7f,
0x7c, 0x39, 0xed, 0x7e, 0xdf, 0xdb, 0x68, 0xfb, 0xf5, 0xef, 0x64,
0xcf, 0xb7, 0x74, 0x63, 0xa8, 0x0c, 0x32, 0xd3, 0x02, 0xad, 0x82,
0x03, 0xc8, 0xec, 0xa3, 0x40, 0x39, 0x0d, 0x46, 0xec, 0x54, 0x61,
0xc0, 0x55, 0x06, 0x49, 0x71, 0x1a, 0x57, 0xc0, 0x3e, 0x50, 0x4a,
0x18, 0xd5, 0xe3, 0x0b, 0x84, 0xab, 0x96, 0x09, 0x21, 0x44, 0x41,
0xd0, 0xc1, 0x46, 0x4e, 0x62, 0xde, 0x2f, 0x7e, 0x2b, 0xd6, 0x7d,
0xf7, 0xc7, 0xfc, 0xd2, 0xe7, 0x77, 0x88, 0x45, 0x83, 0x23, 0x48,
0x06, 0x8f, 0x42, 0x60, 0xf5, 0xd8, 0x95, 0x6f, 0x20, 0x3c, 0xf3,
0xb0, 0x06, 0x9a, 0x0a, 0x8c, 0x58, 0x2d, 0x09, 0xfc, 0xe4, 0x27,
0x02, 0x7f, 0xfa, 0xa9, 0xea, 0xc6, 0x68, 0x1d, 0xad, 0xc0, 0xcb,
0xff, 0x5b, 0xc7, 0xa2, 0xc5, 0xa8, 0xee, 0x4e, 0x48, 0x03, 0x04,
0x01, 0x6f, 0xf9, 0x2f, 0x26, 0x7e, 0xf3, 0x62, 0xe0, 0x7a, 0x7a,
0x40, 0xcc, 0x3c, 0x6f, 0x15, 0x9d, 0x78, 0xd7, 0x95, 0xf4, 0x87,
0xeb, 0xde, 0x45, 0x2f, 0x9d, 0xb7, 0x86, 0x0e, 0x23, 0x84, 0x5c,
0x79, 0x0c, 0x01, 0x13, 0x33, 0x7b, 0xa2, 0x75, 0x1a, 0xfd, 0xc9,
0x3a, 0xac, 0x9d, 0xdd, 0xfd, 0xf4, 0x1d, 0xca, 0xae, 0x11, 0xe3,
0x72, 0x3a, 0x8d, 0x8a, 0xee, 0x34, 0xa4, 0x9d, 0x8e, 0x99, 0x63,
0x72, 0x96, 0xe6, 0x75, 0x68, 0x88, 0x00, 0x30, 0x11, 0x3e, 0x75,
0x12, 0x9d, 0xbf, 0x78, 0x96, 0xaf, 0xf9, 0xd1, 0x53, 0x62, 0xfd,
0x6f, 0x5e, 0x14, 0xcb, 0x07, 0x86, 0x03, 0xb8, 0x05, 0xa6, 0x66,
0xdd, 0x1d, 0xc0, 0xbf, 0x7f, 0x4f, 0xc7, 0xb2, 0xf5, 0xa8, 0x76,
0x35, 0x75, 0x20, 0x3b, 0x0a, 0x5c, 0xf4, 0x3e, 0x13, 0xbb, 0x0e,
0x3a, 0x43, 0xe9, 0xfa, 0x77, 0x30, 0x7c, 0xef, 0x2b, 0xac, 0x54,
0x74, 0xec, 0x59, 0xa2, 0xc0, 0xc9, 0xbd, 0xc0, 0x45, 0x7f, 0x6e,
0xe0, 0xe4, 0x60, 0x70, 0xad, 0x2b, 0x97, 0x25, 0x8c, 0xe2, 0xfa,
0x95, 0x74, 0xf2, 0xcf, 0xae, 0xa2, 0x9d, 0xef, 0xb9, 0x8a, 0x76,
0x5e, 0xb0, 0x86, 0x8e, 0x21, 0x86, 0x49, 0x14, 0xcb, 0x6e, 0xa5,
0xa8, 0xc0, 0xc9, 0x6b, 0x6c, 0x4e, 0xaf, 0x21, 0xec, 0x7c, 0x07,
0x47, 0x91, 0x01, 0x9a, 0x97, 0xeb, 0xe9, 0x35, 0x3e, 0xa7, 0xcc,
0xc8, 0xe9, 0xd5, 0x69, 0x04, 0x1d, 0x1a, 0x18, 0xa2, 0x00, 0x0c,
0x84, 0x07, 0xfb, 0xd1, 0xbe, 0x73, 0x9f, 0x98, 0xbf, 0xe5, 0x29,
0xb1, 0xee, 0x77, 0xff, 0x21, 0x96, 0xed, 0x3e, 0x28, 0xe6, 0x8d,
0x4e, 0x20, 0x16, 0x3c, 0x3e, 0x81, 0x79, 0xd9, 0xc2, 0x1e, 0xe0,
0x8a, 0x0b, 0x09, 0xf9, 0x3c, 0xaa, 0x6a, 0x2d, 0x49, 0x03, 0x4e,
0x9d, 0x2a, 0xf5, 0x62, 0xeb, 0x66, 0x8c, 0x01, 0x6f, 0xbf, 0x82,
0x10, 0x8e, 0x38, 0x8c, 0x8e, 0x2e, 0x80, 0x48, 0x04, 0xf8, 0xed,
0x4b, 0x02, 0x27, 0x06, 0xe6, 0xee, 0x35, 0x66, 0x0c, 0x7c, 0xc5,
0x62, 0x1a, 0x3a, 0x6f, 0x25, 0x4e, 0xbc, 0xf7, 0x8f, 0xd9, 0xce,
0xcb, 0xcf, 0xa7, 0xc3, 0x7d, 0x0b, 0x31, 0x40, 0x29, 0xa4, 0xcb,
0x5a, 0x4b, 0x40, 0xc0, 0x84, 0xf3, 0xc8, 0xe8, 0x5e, 0xcb, 0x06,
0xdc, 0x07, 0x1a, 0xe6, 0xa8, 0xae, 0xf9, 0x94, 0x1e, 0x39, 0xdd,
0x4b, 0xa5, 0x11, 0xdc, 0x47, 0x50, 0x77, 0x52, 0x6c, 0x4e, 0x80,
0xd3, 0x1d, 0xe6, 0xa7, 0xa7, 0x29, 0xb8, 0x85, 0x40, 0xd0, 0x40,
0xc8, 0x22, 0x76, 0xbc, 0x1f, 0x6d, 0xcf, 0xbc, 0x28, 0x96, 0xff,
0xee, 0x3f, 0xc4, 0xd2, 0xa7, 0x9e, 0x13, 0xcb, 0x0f, 0x1e, 0x17,
0x1d, 0x99, 0x2c, 0xc2, 0x41, 0x11, 0x0e, 0x2c, 0xb0, 0xe6, 0x1a,
0x11, 0xc4, 0xfc, 0x2e, 0x8c, 0xbf, 0x61, 0x1d, 0x1d, 0xfb, 0xa3,
0xcb, 0x68, 0xdf, 0x5b, 0x2f, 0xa5, 0x7d, 0x6b, 0xfb, 0xa8, 0x3f,
0x92, 0x42, 0x1a, 0x04, 0xa3, 0x8c, 0x22, 0x01, 0x5e, 0x71, 0x0b,
0xad, 0xae, 0xa2, 0x15, 0x54, 0x5e, 0xf3, 0x26, 0x66, 0x0e, 0x55,
0x67, 0xb8, 0x80, 0xcc, 0xeb, 0x0b, 0x02, 0xd8, 0x81, 0x26, 0x03,
0x35, 0xaf, 0x81, 0x52, 0x18, 0xaa, 0xfb, 0x04, 0x77, 0x82, 0x9b,
0x66, 0x03, 0x9a, 0xe6, 0xb2, 0xbe, 0x34, 0x4f, 0x60, 0xd0, 0x41,
0x08, 0x43, 0x80, 0xa0, 0x19, 0x63, 0x48, 0x1e, 0x3d, 0x85, 0xb6,
0x5d, 0x07, 0x44, 0xf7, 0x2f, 0x9f, 0x13, 0xcb, 0x5f, 0xfa, 0x83,
0x58, 0xb8, 0x7d, 0x97, 0x98, 0x3f, 0x34, 0x8a, 0xe0, 0xeb, 0xbb,
0xc0, 0x02, 0x6b, 0x40, 0x1c, 0x6c, 0x5d, 0x1f, 0xf5, 0x9f, 0xbb,
0x0a, 0x27, 0xdf, 0x76, 0x19, 0xed, 0xbd, 0x68, 0x1d, 0x1d, 0x5f,
0x3a, 0x9f, 0x86, 0x5b, 0x3b, 0x31, 0x8e, 0x10, 0x0a, 0x15, 0x67,
0x91, 0x57, 0x60, 0x63, 0x8f, 0x73, 0x59, 0x87, 0x9c, 0xf3, 0x9a,
0x4c, 0x38, 0x8f, 0x8e, 0xee, 0x15, 0xfc, 0xb7, 0x36, 0xaa, 0x95,
0x02, 0x9a, 0x9f, 0xeb, 0xe9, 0x56, 0x51, 0xe0, 0xa4, 0xd6, 0x9c,
0x5c, 0x52, 0xcd, 0x03, 0x60, 0x4e, 0x79, 0xaa, 0xf7, 0xc7, 0xca,
0x80, 0xd3, 0x21, 0xc0, 0xa0, 0xa1, 0x80, 0x50, 0xff, 0x49, 0xb4,
0xed, 0x3e, 0x24, 0xba, 0x77, 0x1f, 0x12, 0x5d, 0x3b, 0xf6, 0xa0,
0xe7, 0xb7, 0x2f, 0x89, 0x25, 0x87, 0x4e, 0x88, 0xf6, 0x20, 0x0e,
0x17, 0x58, 0x60, 0xee, 0x96, 0x88, 0xa1, 0xb0, 0xa0, 0x9b, 0xc6,
0x2f, 0x5a, 0x8b, 0xa3, 0x97, 0x9c, 0x4b, 0xc7, 0xd6, 0x2d, 0xa3,
0xc1, 0xe5, 0x8b, 0x30, 0xb0, 0x7a, 0x29, 0x0d, 0xb0, 0x04, 0xb2,
0x20, 0x98, 0x16, 0x05, 0xc6, 0x21, 0xaa, 0xbe, 0x0e, 0x72, 0x02,
0x9a, 0xe9, 0x02, 0x2b, 0x37, 0x70, 0x39, 0xd5, 0x60, 0xba, 0xc1,
0x4c, 0xb8, 0x00, 0x0d, 0x32, 0x40, 0xb3, 0xc2, 0x0c, 0x2e, 0x50,
0xb3, 0xb6, 0x53, 0x23, 0x1b, 0x7c, 0xdc, 0x00, 0xe7, 0x04, 0x2b,
0xdd, 0x25, 0x8f, 0x93, 0x02, 0x9c, 0xd9, 0x2e, 0x8e, 0xc0, 0x2a,
0xa3, 0x85, 0x6a, 0x20, 0x10, 0x18, 0xd2, 0x88, 0x0e, 0x8d, 0x21,
0xf9, 0xda, 0x7e, 0xd1, 0xbd, 0x7d, 0x97, 0x58, 0xb0, 0xe7, 0x30,
0x3a, 0xf7, 0x1d, 0x15, 0x1d, 0xbb, 0x0e, 0x60, 0xde, 0xfe, 0xa3,
0xa2, 0xd3, 0x30, 0x82, 0x9e, 0x75, 0x03, 0x9b, 0x5b, 0xd6, 0xd3,
0x89, 0xf1, 0xb5, 0xcb, 0x69, 0x70, 0xe9, 0x39, 0x18, 0xe9, 0x5b,
0x4c, 0x83, 0x6b, 0x97, 0xd1, 0xa9, 0x4b, 0xd6, 0xe3, 0xd8, 0xfc,
0x79, 0x34, 0x1e, 0x6e, 0xc1, 0x24, 0x34, 0x98, 0x30, 0xcb, 0x8e,
0x63, 0x11, 0x54, 0x9e, 0xe3, 0x36, 0xc8, 0x58, 0xa1, 0xe3, 0xa4,
0xa8, 0x64, 0x61, 0xe7, 0x04, 0x30, 0x2b, 0xc4, 0x4c, 0x9b, 0x1a,
0xf3, 0x85, 0x99, 0x17, 0xd0, 0xbc, 0x54, 0x1a, 0x3c, 0xa0, 0xe6,
0x56, 0x71, 0xc0, 0x24, 0x21, 0xa7, 0x79, 0xc0, 0x4b, 0x43, 0x75,
0x03, 0x5f, 0xa7, 0x63, 0x4c, 0x0f, 0xda, 0xa2, 0x81, 0xca, 0x90,
0x03, 0x08, 0x0c, 0x06, 0xf4, 0xfc, 0x04, 0x62, 0x07, 0x8f, 0x89,
0x8e, 0x63, 0xa7, 0xd0, 0xb6, 0x7d, 0x97, 0xe8, 0x79, 0x79, 0x97,
0x38, 0xe7, 0xf0, 0x71, 0xb4, 0x9d, 0x18, 0x40, 0x6a, 0x60, 0x44,
0x24, 0x86, 0xc7, 0x10, 0x7c, 0xb9, 0x17, 0xd8, 0xeb, 0x5a, 0x71,
0xcd, 0x6b, 0xc7, 0x64, 0x77, 0x07, 0xa5, 0x17, 0xf5, 0x62, 0x6c,
0xe5, 0x62, 0x1a, 0xbc, 0xec, 0x7c, 0x3a, 0xb2, 0x64, 0x01, 0x46,
0x97, 0x2e, 0xa0, 0xa1, 0x8e, 0x79, 0x98, 0x40, 0x08, 0x45, 0x30,
0x98, 0xe0, 0x10, 0x28, 0x80, 0xca, 0xe8, 0x10, 0x1e, 0x50, 0xb1,
0xa7, 0x99, 0x2e, 0x90, 0xf3, 0x83, 0x95, 0x9b, 0x3b, 0xe9, 0x14,
0x23, 0x93, 0xf9, 0xe4, 0xa9, 0xea, 0x63, 0x75, 0x19, 0xa0, 0xc9,
0xb8, 0xa0, 0x32, 0xae, 0xa8, 0x17, 0xe0, 0x9c, 0x94, 0x97, 0xe6,
0x01, 0x33, 0xcd, 0x65, 0xff, 0x4e, 0xc7, 0xa2, 0x19, 0xe9, 0x0c,
0x34, 0x43, 0x0b, 0x0a, 0x68, 0x28, 0x22, 0x54, 0xcc, 0x20, 0x32,
0x9a, 0x46, 0x7c, 0xff, 0x51, 0xd1, 0xf6, 0xda, 0x01, 0xd1, 0x73,
0xa4, 0x1f, 0xad, 0x7b, 0x0e, 0xa2, 0x73, 0xc7, 0x1e, 0xd1, 0x3b,
0x30, 0x22, 0x12, 0x23, 0xe3, 0x88, 0x4d, 0x66, 0x11, 0x9e, 0xcb,
0x03, 0x26, 0x07, 0x76, 0x66, 0x58, 0x38, 0x04, 0xb3, 0xad, 0x05,
0xd9, 0x8e, 0x56, 0xca, 0x2c, 0x3f, 0x07, 0x43, 0xe7, 0xad, 0xa2,
0x53, 0x8b, 0x7a, 0x30, 0xd6, 0xb7, 0x90, 0x86, 0xd6, 0xad, 0xa0,
0xfe, 0xce, 0x36, 0x4c, 0x26, 0x12, 0xc8, 0x21, 0x8c, 0x22, 0x74,
0x18, 0xe0, 0xe5, 0x3a, 0xc7, 0x29, 0x7d, 0x24, 0x66, 0x40, 0xc3,
0x0d, 0x26, 0x5e, 0x30, 0x73, 0x5b, 0x36, 0x5c, 0xb6, 0x35, 0x5d,
0xd2, 0x38, 0xbc, 0xdb, 0x95, 0xf9, 0x7d, 0xee, 0x54, 0xf5, 0xdd,
0xb9, 0x17, 0xd0, 0x64, 0xa0, 0x26, 0x1b, 0x5f, 0x73, 0xab, 0x1d,
0x65, 0x92, 0x80, 0x92, 0xcd, 0xef, 0xb4, 0x6c, 0x3f, 0x7e, 0xf5,
0xe0, 0xa5, 0x54, 0x76, 0x53, 0xa7, 0xab, 0x34, 0x04, 0x08, 0x0c,
0x1c, 0x0c, 0x59, 0x44, 0x26, 0xd2, 0x88, 0x8d, 0xa7, 0x11, 0x1d,
0x1c, 0x11, 0xc9, 0x53, 0xa3, 0x48, 0xec, 0x3d, 0x2c, 0xda, 0x77,
0xec, 0xc1, 0xfc, 0xfe, 0x21, 0x91, 0xea, 0x1f, 0x42, 0x72, 0x78,
0x0c, 0xf1, 0xd1, 0x09, 0x11, 0x1d, 0x9b, 0x40, 0x74, 0x32, 0xa8,
0x79, 0x0d, 0xac, 0x0e, 0x0b, 0xe9, 0x30, 0x5b, 0x52, 0xc8, 0xb5,
0xa7, 0x90, 0x6b, 0x6b, 0xa1, 0x6c, 0x77, 0x3b, 0x26, 0xbb, 0x3b,
0x29, 0xbd, 0x7c, 0x21, 0x06, 0xcf, 0x5f, 0x49, 0xa7, 0xba, 0x3b,
0x91, 0xee, 0x6a, 0xa7, 0x74, 0x47, 0x2b, 0x32, 0x2d, 0x09, 0xe4,
0xf4, 0x04, 0xb2, 0x08, 0xc1, 0x80, 0x28, 0x63, 0xaa, 0x08, 0x4b,
0x0f, 0x85, 0x55, 0xbd, 0x53, 0xcc, 0xec, 0xee, 0x0b, 0x15, 0x55,
0xc6, 0x7d, 0xa0, 0xe6, 0x94, 0xdf, 0xf4, 0xc9, 0xcb, 0x15, 0x00,
0xe6, 0x07, 0x31, 0xaf, 0x1e, 0x6b, 0x21, 0x13, 0x43, 0x73, 0x83,
0x9a, 0x9f, 0x2b, 0xca, 0x7c, 0xe2, 0x6c, 0xcc, 0xa2, 0x98, 0xec,
0xdf, 0x88, 0x92, 0x0f, 0xa0, 0xc8, 0x03, 0x56, 0x32, 0x13, 0xc1,
0x79, 0x24, 0x66, 0xe6, 0x70, 0x7e, 0x33, 0x61, 0x37, 0xed, 0xc4,
0x4e, 0x9f, 0x01, 0xc0, 0x60, 0x42, 0x83, 0x01, 0xcd, 0xcc, 0x23,
0x9c, 0xce, 0x20, 0x92, 0xce, 0x20, 0xb2, 0xff, 0xa8, 0x68, 0x3b,
0x72, 0x12, 0x1d, 0x03, 0xc3, 0x22, 0xd1, 0x3f, 0x82, 0xc4, 0xe1,
0xe3, 0x68, 0xdd, 0x7f, 0x54, 0x74, 0x0e, 0x8f, 0x23, 0x3e, 0x31,
0x29, 0x22, 0x13, 0x93, 0x88, 0xe4, 0xf2, 0xd0, 0x8b, 0x41, 0x0c,
0x6f, 0x4e, 0x19, 0x63, 0x10, 0x91, 0x30, 0x8c, 0x44, 0x0c, 0xf9,
0x96, 0x04, 0x0a, 0x2d, 0x09, 0xca, 0xcf, 0xef, 0xc6, 0xe8, 0xea,
0xa5, 0x34, 0xdc, 0x53, 0x86, 0x54, 0x6f, 0x27, 0x26, 0x56, 0x2e,
0xc6, 0x50, 0x47, 0x3b, 0x65, 0x92, 0x31, 0xe4, 0xa3, 0x31, 0xe4,
0x11, 0x82, 0x01, 0x0d, 0x26, 0x58, 0x39, 0x24, 0x6f, 0x5a, 0x80,
0x55, 0x2a, 0xfa, 0x4e, 0xe0, 0x72, 0xeb, 0xea, 0xcb, 0x9a, 0x66,
0xba, 0xac, 0x93, 0x99, 0x64, 0x20, 0xe8, 0x04, 0x4e, 0xe1, 0x11,
0xe8, 0xf7, 0x82, 0x99, 0x9b, 0x2a, 0x83, 0x4a, 0x0c, 0x4d, 0x05,
0x6c, 0x4e, 0x90, 0x73, 0x82, 0x9b, 0x5b, 0xcc, 0x8d, 0x5c, 0xe0,
0xc3, 0x7c, 0xe2, 0x73, 0xcc, 0x67, 0x3f, 0x4c, 0x11, 0x60, 0x4e,
0xf3, 0x4e, 0xbf, 0xd3, 0xf3, 0xd3, 0x7f, 0x28, 0xbb, 0xb3, 0x62,
0xc6, 0x1a, 0x13, 0x0c, 0x05, 0x84, 0x8a, 0x39, 0x84, 0x33, 0xe5,
0x69, 0x3c, 0x2d, 0x22, 0xe3, 0x69, 0xc4, 0x46, 0xd3, 0x88, 0x0e,
0x8e, 0x20, 0xbe, 0xe7, 0xb0, 0x68, 0xeb, 0x1f, 0x44, 0xdb, 0xc8,
0x04, 0x62, 0xe3, 0x69, 0x11, 0x19, 0x4d, 0x23, 0x3a, 0x32, 0x8a,
0x58, 0xff, 0xb0, 0x48, 0x4c, 0x66, 0x11, 0x2d, 0x14, 0xa1, 0x71,
0x1e, 0xb8, 0xba, 0x67, 0xa2, 0x9a, 0x8a, 0x46, 0x50, 0xec, 0x68,
0xc5, 0x64, 0x6f, 0x27, 0x65, 0x92, 0x09, 0xe4, 0x3a, 0x52, 0xc8,
0xa7, 0x92, 0x94, 0xed, 0x6a, 0xc7, 0xe4, 0xd2, 0x73, 0x30, 0xbc,
0xa8, 0x97, 0x26, 0x5a, 0x93, 0xc8, 0xb7, 0x24, 0x91, 0x6d, 0x4f,
0x51, 0x36, 0x1e, 0x45, 0x21, 0x1e, 0x43, 0x31, 0x16, 0x45, 0x1e,
0x11, 0x14, 0xcb, 0x63, 0x50, 0x8a, 0x8a, 0xc2, 0x32, 0x40, 0x15,
0x50, 0xf1, 0x72, 0x30, 0x5c, 0xb8, 0x16, 0x78, 0x2f, 0x80, 0xc9,
0x40, 0xce, 0x4d, 0xa1, 0x09, 0x9f, 0x65, 0x3f, 0xa5, 0xc5, 0xe1,
0x5d, 0x43, 0x29, 0x5c, 0x80, 0x56, 0x33, 0xc8, 0x6a, 0x01, 0x9a,
0x8c, 0x1b, 0x6a, 0x77, 0x41, 0x9d, 0x54, 0x9b, 0xdb, 0x68, 0xc8,
0xf6, 0x5f, 0xcd, 0x53, 0x39, 0x79, 0x2f, 0x93, 0x4f, 0x1e, 0x92,
0x04, 0x98, 0x1f, 0xd4, 0xbc, 0x46, 0x76, 0x9e, 0x9e, 0xb7, 0x02,
0x6f, 0x7a, 0x2d, 0xcd, 0xd8, 0xa3, 0x00, 0x81, 0x43, 0x03, 0x2f,
0xb9, 0xba, 0x66, 0x16, 0xa1, 0x91, 0x09, 0xc4, 0x26, 0x33, 0x88,
0x8c, 0x4d, 0x8a, 0x48, 0x36, 0x87, 0xf0, 0x78, 0x49, 0xdd, 0x85,
0xc7, 0x26, 0x10, 0x99, 0xc8, 0x88, 0xc8, 0x64, 0x16, 0x91, 0xb1,
0x09, 0x84, 0x73, 0x05, 0x44, 0x4e, 0x0e, 0x88, 0xd8, 0x89, 0x21,
0x24, 0x26, 0x26, 0x91, 0xc8, 0x64, 0xa1, 0xe7, 0x8b, 0xd0, 0x0d,
0x03, 0x7a, 0x26, 0x27, 0xb4, 0x7c, 0x11, 0x9a, 0x61, 0x40, 0xcf,
0x17, 0xa0, 0xcd, 0x75, 0x65, 0x48, 0x04, 0x1e, 0x8b, 0xc0, 0xd4,
0x75, 0x98, 0x61, 0x1d, 0x66, 0x2c, 0x4a, 0x46, 0x38, 0x04, 0x33,
0x1c, 0x82, 0x11, 0x8b, 0xc0, 0x48, 0xc4, 0x91, 0xeb, 0x6c, 0x45,
0x7a, 0x61, 0x0f, 0x65, 0x92, 0x09, 0xe4, 0x53, 0x31, 0xe4, 0x5b,
0x52, 0x28, 0xc4, 0x23, 0x94, 0x6f, 0x4b, 0x21, 0x1f, 0x8b, 0x21,
0x9f, 0x8a, 0xa1, 0x90, 0x88, 0xa3, 0x90, 0x8c, 0x21, 0x9f, 0x4a,
0x50, 0x3e, 0x95, 0x40, 0x36, 0x91, 0x42, 0xbe, 0x7c, 0xf7, 0xcc,
0x72, 0xb0, 0x82, 0x5b, 0x8a, 0xab, 0x70, 0x68, 0x0e, 0x2a, 0x2c,
0xea, 0x4a, 0x78, 0xa8, 0x14, 0xee, 0x31, 0xef, 0xb4, 0xce, 0x0d,
0x6a, 0x7e, 0xeb, 0x4c, 0x87, 0x7d, 0xfb, 0xa9, 0x3d, 0xbf, 0xbc,
0x6e, 0xc7, 0x84, 0xa2, 0x1a, 0x93, 0x82, 0x59, 0xad, 0x40, 0x73,
0x52, 0x6b, 0x7e, 0xb1, 0x35, 0xaf, 0x8a, 0x04, 0x15, 0x90, 0xf8,
0x29, 0x27, 0x59, 0x70, 0x11, 0x54, 0x54, 0x98, 0xf7, 0x70, 0xf4,
0x5e, 0x69, 0xb0, 0x1c, 0xd7, 0xef, 0x1a, 0x4c, 0xc3, 0x0f, 0x15,
0x00, 0xda, 0x8f, 0x3c, 0x55, 0x25, 0x31, 0x95, 0x0f, 0x95, 0x5f,
0xb3, 0xec, 0x02, 0x9b, 0xd0, 0x78, 0x09, 0x5c, 0xba, 0x69, 0x82,
0xe5, 0x8b, 0xe5, 0x79, 0x0e, 0x36, 0x9e, 0x16, 0xe1, 0xe1, 0x31,
0x44, 0xd2, 0x19, 0x44, 0xf3, 0x05, 0x84, 0x27, 0xb3, 0x08, 0x65,
0x72, 0x08, 0x15, 0x0d, 0xa1, 0x15, 0xcb, 0xc0, 0xcb, 0xe4, 0xa0,
0x17, 0x8a, 0xd3, 0xdb, 0x9b, 0x1c, 0x5a, 0x26, 0x07, 0xcd, 0x30,
0xc1, 0x8a, 0x45, 0x30, 0xd3, 0x84, 0x66, 0x72, 0x41, 0x9c, 0x43,
0xe3, 0x02, 0xc4, 0x39, 0x28, 0x93, 0xab, 0x40, 0x92, 0x0a, 0x45,
0x30, 0x93, 0x83, 0x91, 0xf5, 0xa1, 0x23, 0xc0, 0x30, 0xca, 0x2a,
0x93, 0xa6, 0xd5, 0x0d, 0xd9, 0x1e, 0x4c, 0x51, 0x0a, 0x78, 0x73,
0x8d, 0x81, 0x0b, 0x01, 0x8a, 0x84, 0x61, 0x86, 0x43, 0xa5, 0x07,
0x5f, 0xd7, 0xc0, 0x89, 0x20, 0x74, 0x8d, 0x4c, 0x4d, 0x83, 0x28,
0xab, 0x23, 0x33, 0xa4, 0x83, 0xeb, 0x1a, 0x4c, 0x5d, 0x83, 0x19,
0xd2, 0x61, 0xc4, 0xa2, 0x30, 0xe3, 0x51, 0x18, 0xa5, 0x65, 0x32,
0xca, 0x6e, 0x9e, 0x11, 0x8b, 0xa2, 0x10, 0x8b, 0x20, 0xd7, 0x96,
0x42, 0x7e, 0x5e, 0x1b, 0xe5, 0x74, 0x1d, 0xa6, 0xa6, 0x81, 0x47,
0x42, 0x30, 0x43, 0x3a, 0x4c, 0x5d, 0x87, 0xa1, 0x87, 0x60, 0x42,
0x2f, 0x5f, 0xc9, 0x50, 0xe5, 0xb3, 0x76, 0x61, 0x29, 0x56, 0xc2,
0x02, 0x23, 0xaa, 0x68, 0x27, 0x5e, 0x56, 0x55, 0x70, 0x04, 0x94,
0xb5, 0xf0, 0xc2, 0x47, 0x91, 0x78, 0xb9, 0x5e, 0x6e, 0xa0, 0x93,
0x81, 0x9c, 0x4c, 0x7e, 0xd3, 0x07, 0x42, 0xdc, 0x63, 0x5b, 0x2e,
0x09, 0x60, 0xeb, 0x35, 0x00, 0xe4, 0x47, 0x74, 0x92, 0x82, 0x59,
0x3d, 0x40, 0xf3, 0x73, 0x43, 0xfd, 0x62, 0x6d, 0x7e, 0x60, 0x93,
0x55, 0x3f, 0xf5, 0xa4, 0xc9, 0xaa, 0x2e, 0xb7, 0xed, 0xa0, 0x00,
0xb7, 0x5a, 0x26, 0x48, 0xa4, 0xc1, 0x06, 0x43, 0xd8, 0x70, 0x87,
0xaa, 0x34, 0x0d, 0x02, 0x04, 0x61, 0x5b, 0x4f, 0x96, 0xbb, 0x46,
0x0e, 0x8f, 0x10, 0xb3, 0x3c, 0x72, 0xa5, 0x63, 0x09, 0xcb, 0x76,
0xbc, 0x72, 0x0e, 0x02, 0xc2, 0xf1, 0x99, 0x10, 0x96, 0x6d, 0xac,
0xc7, 0x15, 0x2e, 0x4f, 0xd4, 0xd4, 0xde, 0xad, 0xe7, 0x69, 0x3d,
0x03, 0xeb, 0x59, 0x54, 0xbf, 0xbd, 0x85, 0xc3, 0xbc, 0xa8, 0xa8,
0xe0, 0xea, 0xe2, 0x64, 0x45, 0xd1, 0xcc, 0x2d, 0xdd, 0x7a, 0x6c,
0x86, 0xcf, 0xb2, 0x9b, 0xf2, 0xe0, 0x1e, 0xcb, 0x32, 0x70, 0xf3,
0x52, 0x37, 0xdc, 0x07, 0x86, 0xb2, 0x40, 0x14, 0x35, 0x82, 0x4a,
0x48, 0xfe, 0x3f, 0x6e, 0x00, 0x13, 0xb5, 0x42, 0xcc, 0x6a, 0xf5,
0x76, 0xe4, 0x2e, 0x1c, 0x1e, 0x5c, 0xaf, 0xbc, 0x34, 0xe3, 0x01,
0xaf, 0x2e, 0x98, 0x5c, 0x01, 0x76, 0x5e, 0x40, 0xf2, 0x03, 0x24,
0x53, 0x38, 0x06, 0x49, 0x6e, 0x03, 0x49, 0x98, 0xc1, 0x01, 0x8a,
0xa8, 0x01, 0x68, 0xd5, 0xf3, 0xa2, 0x82, 0x03, 0xaf, 0xd1, 0xee,
0xdd, 0xd2, 0xdd, 0x42, 0x08, 0xfe, 0x2f, 0x2f, 0x92, 0x56, 0xf1,
0x2a, 0xcf, 0x93, 0x3d, 0x45, 0xf8, 0x6c, 0xe3, 0xf6, 0x66, 0xf7,
0x6a, 0xbb, 0xe4, 0x35, 0xe0, 0x86, 0x2c, 0xd0, 0x20, 0x51, 0x60,
0x1b, 0x35, 0xf9, 0xb9, 0x6b, 0x2a, 0xca, 0xce, 0x6f, 0x9d, 0x90,
0x3c, 0x0e, 0x57, 0x84, 0x3a, 0xe0, 0xd3, 0xeb, 0x6c, 0x2d, 0x20,
0x6b, 0x14, 0xd0, 0x9c, 0x0e, 0x4e, 0x0e, 0x0f, 0x10, 0x39, 0xcc,
0xab, 0x28, 0x37, 0x2a, 0x4b, 0x62, 0x27, 0x80, 0xa0, 0x06, 0x40,
0xd9, 0x21, 0xa2, 0xba, 0x3d, 0x24, 0xd7, 0xc9, 0xb9, 0x99, 0xb5,
0xc0, 0xcb, 0xbf, 0x52, 0xc6, 0xed, 0x1a, 0x7b, 0x81, 0x8b, 0x3c,
0x94, 0xb6, 0x3b, 0xa8, 0x9a, 0xd7, 0x36, 0x4f, 0xd4, 0x90, 0x26,
0x24, 0xa1, 0x06, 0x05, 0xc0, 0xf9, 0x15, 0x4a, 0x59, 0xd5, 0xd6,
0x0c, 0xc8, 0x09, 0x49, 0x08, 0xd5, 0x02, 0x3f, 0x95, 0xc9, 0xcf,
0x95, 0x94, 0x89, 0x8d, 0xd5, 0x04, 0xb1, 0x66, 0x01, 0x0d, 0x0e,
0xd0, 0xf2, 0x7b, 0x08, 0xad, 0xaa, 0x8e, 0xd9, 0xa0, 0xe8, 0x54,
0x50, 0x99, 0xe5, 0xa2, 0xa9, 0xaa, 0x20, 0xbf, 0xfc, 0x4c, 0x01,
0x40, 0xf5, 0xb8, 0x8d, 0xb2, 0x31, 0xc6, 0x7a, 0x20, 0x26, 0xdb,
0x7e, 0x50, 0x16, 0x70, 0xb2, 0xaa, 0x0d, 0x67, 0x08, 0xd8, 0xbc,
0xd4, 0x9a, 0x0c, 0xe8, 0xbc, 0x54, 0x18, 0x5c, 0x0a, 0xb0, 0x5f,
0x41, 0x56, 0x85, 0x9b, 0x1b, 0x20, 0x4e, 0xd7, 0x04, 0x0f, 0x35,
0x26, 0xe3, 0x3e, 0x0a, 0x09, 0x60, 0xd5, 0xdd, 0x73, 0xa6, 0x3e,
0x4b, 0x0f, 0x20, 0x49, 0x9c, 0x34, 0x97, 0x28, 0x84, 0x5c, 0x52,
0xd1, 0x01, 0xf5, 0xa9, 0x22, 0x26, 0xb1, 0x7f, 0x26, 0x09, 0x2c,
0x28, 0xc2, 0x0c, 0xa8, 0x4f, 0x89, 0xd5, 0x03, 0x31, 0x3f, 0x35,
0x46, 0x0a, 0x95, 0x44, 0xcd, 0x02, 0x99, 0x4c, 0xad, 0x97, 0xac,
0xfb, 0xa9, 0x0a, 0x39, 0x15, 0xe0, 0xd5, 0xa2, 0xda, 0x20, 0x09,
0x34, 0x48, 0xba, 0x7a, 0xb0, 0xb9, 0xa9, 0xa8, 0x11, 0xac, 0x7e,
0x0a, 0x0c, 0xf0, 0x6e, 0xf8, 0xda, 0x14, 0x35, 0x36, 0x9b, 0x40,
0x93, 0x05, 0x9c, 0x70, 0x51, 0x76, 0x76, 0xf5, 0xe6, 0x57, 0xa8,
0x65, 0xd6, 0xcb, 0x42, 0x05, 0x0a, 0x10, 0x83, 0xc7, 0x7a, 0x2f,
0x60, 0xfa, 0x41, 0xcc, 0x69, 0xbd, 0xdf, 0x75, 0x68, 0x96, 0x1a,
0x23, 0xc7, 0x00, 0x7f, 0x73, 0xa0, 0x26, 0x7c, 0x62, 0xb1, 0x4e,
0xeb, 0x55, 0x6a, 0xc5, 0x64, 0x5c, 0x1f, 0x59, 0xf7, 0xb3, 0x56,
0xe8, 0x01, 0xf2, 0xf1, 0x38, 0x59, 0x00, 0xd5, 0x53, 0x71, 0xa1,
0x72, 0x8e, 0xb5, 0x5c, 0xbb, 0xa6, 0x43, 0xec, 0x74, 0x00, 0xcd,
0xaf, 0x32, 0x01, 0x0a, 0x80, 0x53, 0xa9, 0x49, 0xad, 0x25, 0x4d,
0x56, 0x61, 0xa9, 0xc6, 0xb8, 0x64, 0xcf, 0xa1, 0x96, 0x3c, 0x50,
0x58, 0x27, 0x0b, 0xb5, 0x5a, 0xdc, 0x4c, 0x6a, 0xf0, 0xb3, 0x51,
0xab, 0x6a, 0x93, 0x55, 0x70, 0x2a, 0x40, 0x83, 0x42, 0x01, 0xf7,
0xfd, 0x88, 0x5a, 0x41, 0xdd, 0xa9, 0xe6, 0x57, 0x55, 0x92, 0x2a,
0xe7, 0xec, 0x05, 0x2d, 0x71, 0x3a, 0x00, 0x76, 0xa6, 0x00, 0xcd,
0xef, 0x1f, 0x26, 0x8f, 0x87, 0x4a, 0xb6, 0x90, 0xd6, 0xd2, 0x84,
0x64, 0xb6, 0x40, 0xe9, 0x74, 0x7e, 0x8d, 0x70, 0x23, 0x6b, 0x55,
0x65, 0x2a, 0xae, 0xe4, 0x99, 0x08, 0x34, 0x51, 0x07, 0xe0, 0xbc,
0x0a, 0x68, 0x3d, 0xea, 0x4e, 0xa5, 0x22, 0xa2, 0x56, 0xb7, 0xb6,
0x5e, 0xc8, 0xca, 0xfe, 0x3f, 0x2a, 0x0a, 0x6c, 0xd6, 0x21, 0x76,
0xa6, 0x01, 0xad, 0x51, 0x90, 0x73, 0x72, 0x47, 0x48, 0xa1, 0xa0,
0xab, 0xb8, 0x6e, 0x8d, 0xac, 0x61, 0xac, 0x57, 0x71, 0xa9, 0xb4,
0x05, 0x54, 0x75, 0x31, 0x67, 0x13, 0x64, 0x8d, 0x80, 0x9b, 0x0a,
0xd8, 0x54, 0x0b, 0xae, 0x6a, 0x4d, 0xaa, 0xac, 0xda, 0x51, 0x01,
0x4d, 0x23, 0x9a, 0xa3, 0xf8, 0x01, 0x5b, 0x15, 0x5e, 0xa7, 0x15,
0x60, 0xaf, 0x17, 0xa0, 0xa9, 0xb8, 0xa9, 0x4e, 0x17, 0x9f, 0x5c,
0x80, 0xa7, 0x12, 0x2b, 0x52, 0x85, 0x4c, 0xad, 0x79, 0x20, 0x19,
0x17, 0x53, 0xd9, 0x0f, 0x14, 0xf3, 0x9d, 0x2e, 0x35, 0xd6, 0x48,
0xc0, 0xc9, 0x28, 0x37, 0x55, 0xa0, 0xa9, 0xce, 0xd7, 0x0a, 0x42,
0x15, 0x08, 0xaa, 0xba, 0xcc, 0xb2, 0xff, 0xdb, 0x19, 0xad, 0xbc,
0xce, 0x46, 0xa0, 0xd5, 0x73, 0x61, 0x9d, 0xc0, 0xa6, 0x52, 0xc8,
0xeb, 0x89, 0x45, 0xd5, 0x52, 0xc3, 0x28, 0x0b, 0x3e, 0x48, 0xba,
0x90, 0xe4, 0xa2, 0x74, 0xfd, 0x3e, 0x61, 0xf3, 0x7b, 0x21, 0x34,
0x0b, 0x72, 0xc2, 0x63, 0xff, 0x4e, 0x71, 0x56, 0x21, 0xb1, 0xad,
0xf0, 0x51, 0xf9, 0xb5, 0xc6, 0xe1, 0xea, 0x55, 0x74, 0xaa, 0xdb,
0xa9, 0xee, 0xaf, 0x16, 0x25, 0xfb, 0xba, 0x35, 0x1d, 0x67, 0xa7,
0x09, 0xc5, 0x7c, 0xe4, 0xa2, 0x02, 0x65, 0xe1, 0xa7, 0x0a, 0x34,
0x81, 0xe9, 0x1a, 0xd1, 0x7a, 0xd5, 0x94, 0x5a, 0xab, 0xfe, 0xfa,
0xd2, 0x55, 0xd4, 0x9b, 0x6a, 0x01, 0x91, 0xdd, 0x46, 0xf8, 0xe4,
0x57, 0x09, 0x4e, 0xab, 0xaa, 0x3a, 0x55, 0xd7, 0xcc, 0x2f, 0x2e,
0xd7, 0x08, 0xb7, 0xb8, 0x51, 0x69, 0x67, 0x85, 0x9d, 0xad, 0x40,
0x6b, 0x84, 0xb2, 0x13, 0x0d, 0x72, 0xd1, 0xdc, 0xd2, 0xb8, 0x02,
0x50, 0x54, 0xa0, 0xe5, 0xd5, 0xb4, 0xc2, 0x0d, 0x88, 0x02, 0xcd,
0x6b, 0x63, 0x46, 0x0d, 0xbc, 0x27, 0x2a, 0xdb, 0x0b, 0x45, 0xe8,
0xd9, 0x41, 0x59, 0x0b, 0xec, 0x6a, 0x05, 0x22, 0x35, 0x70, 0xbb,
0xd7, 0xa5, 0xab, 0x18, 0x00, 0xed, 0xf4, 0xba, 0xb0, 0x6e, 0x0f,
0x94, 0x4a, 0x1c, 0xaa, 0x19, 0x79, 0x9b, 0x11, 0xd0, 0xa7, 0xd7,
0xf9, 0x7d, 0x13, 0x0d, 0x5c, 0x57, 0x6b, 0x43, 0x5f, 0x55, 0xe5,
0xa8, 0x0a, 0x65, 0x3f, 0xd5, 0x3a, 0x67, 0x2c, 0x00, 0x5a, 0x7d,
0x85, 0x47, 0xc0, 0xff, 0x2b, 0x08, 0x99, 0x36, 0x77, 0x2a, 0x0f,
0x63, 0x33, 0x82, 0xf7, 0xaa, 0xd0, 0xa2, 0x33, 0xec, 0x3e, 0x9c,
0x0e, 0xe0, 0xd5, 0x0a, 0x29, 0xd5, 0xff, 0x81, 0x2b, 0xec, 0x47,
0xcc, 0xf5, 0x42, 0x1a, 0x00, 0xed, 0xf4, 0x14, 0x30, 0x92, 0xdc,
0x0f, 0x29, 0x1e, 0x4f, 0x05, 0x34, 0xcd, 0x00, 0xdd, 0x99, 0x7e,
0x0f, 0x1a, 0x99, 0xcf, 0xad, 0x92, 0x21, 0x70, 0xfd, 0x02, 0xa0,
0x05, 0x10, 0x54, 0xc8, 0x47, 0x0d, 0x2a, 0x30, 0x14, 0x5c, 0xf7,
0xba, 0xf7, 0x11, 0x00, 0xea, 0x0c, 0xb3, 0xff, 0x3f, 0x00, 0x33,
0x7e, 0xb5, 0x01, 0x3c, 0x57, 0x93, 0xe4, 0x00, 0x00, 0x00, 0x00,
0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
};
unsigned int nxlogo_png_size = sizeof(nxlogo_png);
static void nx_iperf_send_image(NX_WEB_HTTP_SERVER *server_ptr, UCHAR *img, UINT imgsize);
static void nx_iperf_print_tcp_rx_results(NX_WEB_HTTP_SERVER *server_ptr, NXD_ADDRESS *peer_ip_address);
static void nx_iperf_print_tcp_tx_results(NX_WEB_HTTP_SERVER *server_ptr, NXD_ADDRESS *peer_ip_address);
static void nx_iperf_print_udp_rx_results(NX_WEB_HTTP_SERVER *server_ptr, NXD_ADDRESS *peer_ip_address);
static void nx_iperf_print_udp_tx_results(NX_WEB_HTTP_SERVER *server_ptr, NXD_ADDRESS *peer_ip_address);
void nx_iperf_tcp_rx_test(UCHAR *, ULONG);
void nx_iperf_tcp_tx_test(UCHAR *, ULONG);
void nx_iperf_udp_rx_test(UCHAR *, ULONG);
void nx_iperf_udp_tx_test(UCHAR *, ULONG);
void nx_iperf_tcp_rx_cleanup(void);
void nx_iperf_tcp_tx_cleanup(void);
void nx_iperf_udp_rx_cleanup(void);
void nx_iperf_udp_tx_cleanup(void);
char *nx_iperf_get_ip_addr_string(NXD_ADDRESS *ip_address, UINT *string_length);
void nx_iperf_test_info_parse(ctrl_info *iperf_ctrlInfo_ptr);
void nx_iperf_tcp_rx_connect_received(NX_TCP_SOCKET *socket_ptr, UINT port);
void nx_iperf_tcp_rx_disconnect_received(NX_TCP_SOCKET *socket_ptr);
UINT nx_iperf_authentication_check(struct NX_WEB_HTTP_SERVER_STRUCT *server_ptr, UINT request_type, CHAR *resource, CHAR **name, CHAR **password, CHAR **realm);
UINT nx_iperf_get_notify(NX_WEB_HTTP_SERVER *server_ptr, UINT request_type, CHAR *resource, NX_PACKET *packet_ptr);
void nx_iperf_entry(NX_PACKET_POOL *pool_ptr, NX_IP *ip_ptr, UCHAR *http_stack, ULONG http_stack_size, UCHAR *iperf_stack, ULONG iperf_stack_size);
void nx_iperf_thread_tcp_rx_entry(ULONG thread_input);
void nx_iperf_thread_tcp_tx_entry(ULONG thread_input);
void nx_iperf_thread_udp_tx_entry(ULONG thread_input);
void nx_iperf_thread_udp_rx_entry(ULONG thread_input);
void nx_iperf_udp_client_socket_vlan_priority_set(UCHAR vlan_priority);
void nx_iperf_tcp_client_socket_vlan_priority_set(UCHAR vlan_priority);
void nx_iperf_entry(NX_PACKET_POOL *pool_ptr, NX_IP *ip_ptr, UCHAR *http_stack, ULONG http_stack_size, UCHAR *iperf_stack, ULONG iperf_stack_size)
{
UINT status;
/* Set the iPerf Stack and Size. */
nx_iperf_stack_area = iperf_stack;
nx_iperf_stack_area_size = iperf_stack_size;
/* Set the IP instance and Packet Pool. */
nx_iperf_test_ip = ip_ptr;
nx_iperf_test_pool = pool_ptr;
/* Create a TCP server socket. */
status = nx_tcp_socket_create(nx_iperf_test_ip, &tcp_server_socket, "TCP Server Socket",
NX_IP_NORMAL, NX_FRAGMENT_OKAY, NX_IP_TIME_TO_LIVE, 32 * 1024,
NX_NULL, nx_iperf_tcp_rx_disconnect_received);
/* Check for error. */
if (status)
{
nx_iperf_test_error_counter++;
return;
}
/* Create a TCP client socket. */
status = nx_tcp_socket_create(nx_iperf_test_ip, &tcp_client_socket, "TCP Client Socket",
NX_IP_NORMAL, NX_FRAGMENT_OKAY, NX_IP_TIME_TO_LIVE, 32 * 1024,
NX_NULL, NX_NULL);
/* Check for error. */
if (status)
{
nx_iperf_test_error_counter++;
return;
}
if (tcp_client_socket_vlan_priority != NX_VLAN_PRIORITY_INVALID)
{
nx_tcp_socket_vlan_priority_set(&tcp_client_socket, (UINT)tcp_client_socket_vlan_priority);
}
/* Create a UDP server socket. */
status = nx_udp_socket_create(nx_iperf_test_ip, &udp_server_socket, "UDP Server Socket", NX_IP_NORMAL, NX_FRAGMENT_OKAY, 0x80, 5);
/* Check status. */
if (status)
{
nx_iperf_test_error_counter++;
return;
}
/* Create a UDP client socket. */
status = nx_udp_socket_create(nx_iperf_test_ip, &udp_client_socket, "UDP Client Socket", NX_IP_NORMAL, NX_FRAGMENT_OKAY, 0x80, 5);
/* Check status. */
if (status)
{
nx_iperf_test_error_counter++;
return;
}
if (udp_client_socket_vlan_priority != NX_VLAN_PRIORITY_INVALID)
{
nx_udp_socket_vlan_priority_set(&udp_client_socket, (UINT)udp_client_socket_vlan_priority);
}
/* Create the HTTP Server. */
status = nx_web_http_server_create(&nx_iperf_web_server, "My HTTP Server", ip_ptr, NX_WEB_HTTP_SERVER_PORT, &nx_iperf_ram_disk, http_stack, http_stack_size, pool_ptr, nx_iperf_authentication_check, nx_iperf_get_notify);
/* Check the status. */
if (status)
{
/* Update the error counter and return. */
nx_iperf_test_error_counter++;
return;
}
/* Start the HTTP Server. */
status = nx_web_http_server_start(&nx_iperf_web_server);
/* Check the status. */
if (status)
{
/* Update the error counter and return. */
nx_iperf_test_error_counter++;
return;
}
}
UINT nx_iperf_authentication_check(struct NX_WEB_HTTP_SERVER_STRUCT *server_ptr, UINT request_type, CHAR *resource, CHAR **name, CHAR **password, CHAR **realm)
{
#ifdef NX_IPERF_AUTH_ENABLE
NX_PARAMETER_NOT_USED(server_ptr);
NX_PARAMETER_NOT_USED(request_type);
NX_PARAMETER_NOT_USED(resource);
*name = "PlaceholderName";
*password = "PlaceholderPassword";
*realm = "test.htm";
return(NX_WEB_HTTP_BASIC_AUTHENTICATE);
#else
NX_PARAMETER_NOT_USED(server_ptr);
NX_PARAMETER_NOT_USED(request_type);
NX_PARAMETER_NOT_USED(resource);
NX_PARAMETER_NOT_USED(name);
NX_PARAMETER_NOT_USED(password);
NX_PARAMETER_NOT_USED(realm);
return(NX_SUCCESS);
#endif
}
static CHAR device_ip_addr_string[40];
char *nx_iperf_get_ip_addr_string(NXD_ADDRESS *ip_address, UINT *string_length)
{
UINT length = 0;
#ifdef FEATURE_NX_IPV6
UINT i;
#endif
memset(device_ip_addr_string, 0, sizeof(device_ip_addr_string));
#ifdef FEATURE_NX_IPV6
if (ip_address -> nxd_ip_version == NX_IP_VERSION_V6)
{
for (i = 0; i < 4; i ++)
{
length += _nx_utility_uint_to_string((UINT)ip_address -> nxd_ip_address.v6[i] >> 16, 16, &device_ip_addr_string[length], sizeof(device_ip_addr_string) - length);
device_ip_addr_string[length++] = ':';
length += _nx_utility_uint_to_string((UINT)ip_address -> nxd_ip_address.v6[i] & 0xFFFF, 16, &device_ip_addr_string[length], sizeof(device_ip_addr_string) - length);
if (i != 3)
{
device_ip_addr_string[length++] = ':';
}
}
}
else
#endif
{
#ifndef NX_DISABLE_IPV4
length = _nx_utility_uint_to_string(ip_address -> nxd_ip_address.v4 >> 24, 10, device_ip_addr_string, sizeof(device_ip_addr_string) - length);
device_ip_addr_string[length++] = '.';
length += _nx_utility_uint_to_string(((ip_address -> nxd_ip_address.v4 >> 16) & 0xFF), 10, &device_ip_addr_string[length], sizeof(device_ip_addr_string) - length);
device_ip_addr_string[length++] = '.';
length += _nx_utility_uint_to_string(((ip_address -> nxd_ip_address.v4 >> 8) & 0xFF), 10, &device_ip_addr_string[length], sizeof(device_ip_addr_string) - length);
device_ip_addr_string[length++] = '.';
length += _nx_utility_uint_to_string((ip_address -> nxd_ip_address.v4 & 0xFF), 10, &device_ip_addr_string[length], sizeof(device_ip_addr_string) - length);
#endif
}
*string_length = length;
return device_ip_addr_string;
}
/* This function takes the token/value pair, and stores the information in the ctrl_info_ptr. */
/* For example, a token/value pair can be: "TestType"="TC_Rx", and the ctrl_info_ptr stores the information. */
static void nx_iperf_check_token_value(char *token, char *value_ptr, ctrl_info *ctrl_info_ptr)
{
UINT val;
UINT i;
UINT token_length = 0;
UINT value_length = 0;
UINT status;
/* Check string length of token. */
status = _nx_utility_string_length_check(token, &token_length, NX_MAX_STRING_LENGTH);
if (status)
{
return;
}
/* Check string length of value. */
if (value_ptr)
{
status = _nx_utility_string_length_check(value_ptr, &value_length, NX_MAX_STRING_LENGTH);
if (status)
{
return;
}
}
/* Check for name. */
if ((token_length == sizeof("TestType") - 1 ) &&
(memcmp(token, "TestType", token_length) == 0))
{
/* Check for value. */
ctrl_info_ptr -> ctrl_sign = UNKNOWN_TEST;
if (value_ptr)
{
if ((value_length == sizeof(TCP_Rx) - 1 ) &&
(memcmp(value_ptr, TCP_Rx, value_length) == 0))
{
ctrl_info_ptr -> ctrl_sign = TCP_RX_START;
}
else if ((value_length == sizeof(TCP_Tx) - 1 ) &&
(memcmp(value_ptr, TCP_Tx, value_length) == 0))
{
ctrl_info_ptr -> ctrl_sign = TCP_TX_START;
}
else if ((value_length == sizeof(UDP_Rx) - 1 ) &&
(memcmp(value_ptr, UDP_Rx, value_length) == 0))
{
ctrl_info_ptr -> ctrl_sign = UDP_RX_START;
}
else if ((value_length == sizeof(UDP_Tx) - 1 ) &&
(memcmp(value_ptr, UDP_Tx, value_length) == 0))
{
ctrl_info_ptr -> ctrl_sign = UDP_TX_START;
}
}
}
else if ((token_length == (sizeof("ip") - 1)) &&
(memcmp(token, "ip", token_length) == 0))
{
char *ptr = value_ptr;
int colon_sum, colon_count;
ctrl_info_ptr -> ip = 0;
val = 0;
colon_sum = 0;
colon_count = 0;
if (value_ptr == 0)
{
ctrl_info_ptr -> version = NX_IP_VERSION_V4;
}
while (ptr && (*ptr != 0))
{
if (*ptr == '.')
{
ctrl_info_ptr -> version = NX_IP_VERSION_V4;
while (value_ptr && (*value_ptr != 0))
{
if (*value_ptr == '.')
{
ctrl_info_ptr -> ip = (ctrl_info_ptr -> ip << 8) + val;
val = 0;
}
else
{
val = val * 10 + ((UINT)(*value_ptr - '0'));
}
value_ptr++;
}
ctrl_info_ptr -> ip = (ctrl_info_ptr -> ip << 8) + val;
break;
}
else if (*ptr == '%')
{
if ((*(++ptr) == '3') && (*(++ptr) == 'A'))
{
ctrl_info_ptr -> version = NX_IP_VERSION_V6;
colon_sum++;
}
}
ptr++;
}
while (value_ptr && (*value_ptr != 0) && (colon_sum != 0))
{
if (*value_ptr == '%')
{
if ((*(++value_ptr) == '3') && (*(++value_ptr) == 'A'))
{
ctrl_info_ptr -> ipv6[colon_count / 2] = (ctrl_info_ptr -> ipv6[colon_count / 2] << 16) + val;
colon_count++;
if (*(value_ptr + 1) == '%')
{
value_ptr++;
if ((*(++value_ptr) == '3') && (*(++value_ptr) == 'A'))
{
for (i = 0; i <= (UINT)(7 - colon_sum); i++)
{
ctrl_info_ptr -> ipv6[colon_count / 2] = ctrl_info_ptr -> ipv6[colon_count / 2] << 16;
colon_count++;
}
}
}
val = 0;
}
}
else
{
if (*value_ptr >= '0' && *value_ptr <= '9')
{
val = val * 16 + ((UINT)(*value_ptr - '0'));
}
else if (*value_ptr >= 'a' && *value_ptr <= 'f')
{
val = val * 16 + ((UINT)(*value_ptr - 'a')) + 10;
}
else if (*value_ptr >= 'A' && *value_ptr <= 'F')
{
val = val * 16 + ((UINT)(*value_ptr - 'A')) + 10;
}
}
value_ptr++;
}
if (ctrl_info_ptr -> version == NX_IP_VERSION_V6)
{
ctrl_info_ptr -> ipv6[3] = (ctrl_info_ptr -> ipv6[3] << 16) + val;
}
}
else if ((token_length == (sizeof("test_time") - 1)) &&
(memcmp(token, "test_time", token_length) == 0))
{
ctrl_info_ptr -> TestTime = 0;
while (value_ptr && (*value_ptr != 0))
{
ctrl_info_ptr -> TestTime = ctrl_info_ptr -> TestTime * 10 + ((UINT)(*value_ptr - '0'));
value_ptr++;
}
ctrl_info_ptr -> TestTime = ctrl_info_ptr -> TestTime * NX_IP_PERIODIC_RATE;
}
else if ((token_length == (sizeof("rate") - 1)) &&
(memcmp(token, "rate", token_length) == 0))
{
ctrl_info_ptr -> Rate = 0;
while (value_ptr && (*value_ptr != 0))
{
ctrl_info_ptr -> Rate = ctrl_info_ptr -> Rate * 10 + ((UINT)(*value_ptr - '0'));
value_ptr++;
}
}
else if ((token_length == (sizeof("size") - 1)) &&
(memcmp(token, "size", token_length) == 0))
{
ctrl_info_ptr -> PacketSize = 0;
while (value_ptr && (*value_ptr != 0))
{
ctrl_info_ptr -> PacketSize = ctrl_info_ptr -> PacketSize * 10 + ((UINT)(*value_ptr - '0'));
value_ptr++;
}
}
else if ((token_length == (sizeof("port") - 1)) &&
(memcmp(token, "port", token_length) == 0))
{
ctrl_info_ptr -> port = 0;
while (value_ptr && (*value_ptr != 0))
{
ctrl_info_ptr -> port = ctrl_info_ptr -> port * 10 + ((UINT)(*value_ptr - '0'));
value_ptr++;
}
}
}
/* This function parses the incoming HTTP command line. For each token/value pair, it
invokes the nx_iperf_check_token_value routine to parse the values. */
static void nx_iperf_parse_command(NX_PACKET *packet_ptr, ctrl_info *ctrl_info_ptr)
{
UCHAR *cmd_string = packet_ptr -> nx_packet_prepend_ptr;
UCHAR *token = NX_NULL;
UCHAR *end_cmd;
UCHAR *next_token;
UCHAR *value_ptr;
/* At this point, cmd_string points to the beginning of the HTTP request,
which takes the form of:
"GET /test.htm?TestType=xxxxx&ip=....&rxed_pkts=xxxx&test_time=xxxx&tputs=xxxx" */
/* First skip the "Get /test.html?" string. */
cmd_string += (sizeof("GET /test.htm?") - 1);
/* Find the end of the cmd string, */
end_cmd = cmd_string;
while (end_cmd < packet_ptr -> nx_packet_append_ptr)
{
if (*end_cmd == ' ')
{
break;
}
end_cmd++;
}
*end_cmd = 0;
/* The first token starts from cmd_string. */
token = cmd_string;
next_token = cmd_string;
while (next_token < end_cmd)
{
/* Find the next token .*/
while (next_token < end_cmd)
{
if (*next_token == '=')
{
break;
}
next_token++;
}
if (*next_token == '=')
{
/* Find a name=value pair. Now we need to find the "=" sign. */
*next_token = 0;
value_ptr = next_token + 1;
next_token++;
while (next_token < end_cmd)
{
if (*next_token == '&')
{
*next_token = 0;
break;
}
next_token++;
}
if (value_ptr == next_token)
{
/* There is no value string. */
value_ptr = NX_NULL;
}
/* Move next_token beyond the NULL terminator. */
next_token++;
nx_iperf_check_token_value((char *)token, (char *)value_ptr, ctrl_info_ptr);
}
token = next_token;
}
/* Finished parsing the whole command. */
}
static CHAR mytempstring[30];
static VOID nx_iperf_print_main_test_window(NX_WEB_HTTP_SERVER *server_ptr)
{
NX_PACKET *resp_packet_ptr;
UINT status;
NXD_ADDRESS server_ip;
UINT length = 0;
CHAR *ip_addr_string;
#ifdef FEATURE_NX_IPV6
UINT address_index;
ULONG prefix_length;
UINT interface_index;
#endif
status = nx_packet_allocate(server_ptr -> nx_web_http_server_packet_pool_ptr, &resp_packet_ptr, NX_TCP_PACKET, NX_WAIT_FOREVER);
/* write HTML code into the packet */
/* htmlwrite(p,s,l) (nx_packet_data_append(p,s,l, server_ptr-> nx_web_http_server_packet_pool_ptr,NX_WAIT_FOREVER)) */
status += htmlwrite(resp_packet_ptr, outtermosttable, sizeof(outtermosttable) - 1);
status += htmlwrite(resp_packet_ptr, maintabletag, sizeof(maintabletag) - 1);
/* print the IP address line. */
status += htmlwrite(resp_packet_ptr, h1line1, sizeof(h1line1) - 1);
#ifndef NX_DISABLE_IPV4
server_ip.nxd_ip_version = NX_IP_VERSION_V4;
server_ip.nxd_ip_address.v4 = nx_iperf_test_ip -> nx_ip_interface[0].nx_interface_ip_address;
ip_addr_string = nx_iperf_get_ip_addr_string(&server_ip, &length);
status += htmlwrite(resp_packet_ptr, ip_addr_string, length);
status += htmlwrite(resp_packet_ptr, "\n", sizeof("\n") - 1);
#endif
#ifdef FEATURE_NX_IPV6
address_index = 0;
/* Loop to output the IPv6 address. */
while (1)
{
/* Get the IPv6 address. */
if (nxd_ipv6_address_get(nx_iperf_test_ip, address_index, &server_ip, &prefix_length, &interface_index) == NX_SUCCESS)
{
ip_addr_string = nx_iperf_get_ip_addr_string(&server_ip, &length);
status += htmlwrite(resp_packet_ptr, ip_addr_string, length);
status += htmlwrite(resp_packet_ptr, "\n", sizeof("\n") - 1);
address_index++;
}
else
{
break;
}
}
#endif
status += htmlwrite(resp_packet_ptr, h1line2, sizeof(h1line2) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
nx_iperf_test_error_counter++;
}
status = nx_packet_allocate(server_ptr -> nx_web_http_server_packet_pool_ptr, &resp_packet_ptr, NX_TCP_PACKET, NX_WAIT_FOREVER);
status += htmlwrite(resp_packet_ptr, udptxsubmittag1, sizeof(udptxsubmittag1) - 1);
ip_addr_string = nx_iperf_get_ip_addr_string(&udp_tx_ip_address, &length);
status += htmlwrite(resp_packet_ptr, ip_addr_string, length);
status += htmlwrite(resp_packet_ptr, udptxsubmittag2, sizeof(udptxsubmittag2) - 1);
length = _nx_utility_uint_to_string(udp_tx_port, 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, udptxsubmittag3, sizeof(udptxsubmittag3) - 1);
length = _nx_utility_uint_to_string(udp_tx_test_time, 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, udptxsubmittag4, sizeof(udptxsubmittag4) - 1);
length = _nx_utility_uint_to_string(udp_tx_packet_size, 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, udptxsubmittag5, sizeof(udptxsubmittag5) - 1);
status += nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
nx_iperf_test_error_counter++;
}
status = nx_packet_allocate(server_ptr -> nx_web_http_server_packet_pool_ptr, &resp_packet_ptr, NX_TCP_PACKET, NX_WAIT_FOREVER);
status += htmlwrite(resp_packet_ptr, udprxsubmittag1, sizeof(udprxsubmittag1) - 1);
length = _nx_utility_uint_to_string(udp_rx_test_time, 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, udprxsubmittag2, sizeof(udprxsubmittag2) - 1);
status += nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
nx_iperf_test_error_counter++;
}
status = nx_packet_allocate(server_ptr -> nx_web_http_server_packet_pool_ptr, &resp_packet_ptr, NX_TCP_PACKET, NX_WAIT_FOREVER);
status += htmlwrite(resp_packet_ptr, tcptxsubmittag1, sizeof(tcptxsubmittag1) - 1);
ip_addr_string = nx_iperf_get_ip_addr_string(&tcp_tx_ip_address, &length);
status += htmlwrite(resp_packet_ptr, ip_addr_string, length);
status += htmlwrite(resp_packet_ptr, tcptxsubmittag2, sizeof(tcptxsubmittag2) - 1);
length = _nx_utility_uint_to_string(tcp_tx_port, 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, tcptxsubmittag3, sizeof(tcptxsubmittag3) - 1);
length = _nx_utility_uint_to_string(tcp_tx_test_time, 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, tcptxsubmittag4, sizeof(tcptxsubmittag4) - 1);
status += nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
nx_iperf_test_error_counter++;
}
status = nx_packet_allocate(server_ptr -> nx_web_http_server_packet_pool_ptr, &resp_packet_ptr, NX_TCP_PACKET, NX_WAIT_FOREVER);
status += htmlwrite(resp_packet_ptr, tcprxsubmittag1, sizeof(tcprxsubmittag1) - 1);
length = _nx_utility_uint_to_string(tcp_rx_test_time, 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, tcprxsubmittag2, sizeof(tcprxsubmittag2) - 1);
status += nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
nx_iperf_test_error_counter++;
}
status = nx_packet_allocate(server_ptr -> nx_web_http_server_packet_pool_ptr, &resp_packet_ptr, NX_TCP_PACKET, NX_WAIT_FOREVER);
status += htmlwrite(resp_packet_ptr, tableendtag, sizeof(tableendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
nx_iperf_test_error_counter++;
}
}
static void nx_iperf_print_end_of_page(NX_WEB_HTTP_SERVER *server_ptr)
{
UINT status;
NX_PACKET *resp_packet_ptr;
status = nx_packet_allocate(server_ptr -> nx_web_http_server_packet_pool_ptr, &resp_packet_ptr, NX_TCP_PACKET, NX_WAIT_FOREVER);
/* End of the page. */
status += htmlwrite(resp_packet_ptr, tableendtag, sizeof(tableendtag) - 1); /* outtermost table. */
status += htmlwrite(resp_packet_ptr, doublebr, sizeof(doublebr) - 1);
status += htmlwrite(resp_packet_ptr, centerendtag, sizeof(centerendtag) - 1);
status += htmlwrite(resp_packet_ptr, bodyendtag, sizeof(bodyendtag) - 1);
status += htmlwrite(resp_packet_ptr, htmlendtag, sizeof(htmlendtag) - 1);
status += nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
nx_iperf_test_error_counter++;
}
}
static void nx_iperf_print_header(NX_WEB_HTTP_SERVER *server_ptr)
{
NX_PACKET *resp_packet_ptr;
UINT status;
status = nx_packet_allocate(server_ptr -> nx_web_http_server_packet_pool_ptr,
&resp_packet_ptr,
NX_TCP_PACKET,
NX_WAIT_FOREVER);
/* write HTML code into the packet */
/* htmlwrite(p,s,l) (nx_packet_data_append(p,s,l, server_ptr-> nx_web_http_server_packet_pool_ptr,NX_WAIT_FOREVER)) */
status += htmlwrite(resp_packet_ptr, htmlresponse, sizeof(htmlresponse) - 1);
status += htmlwrite(resp_packet_ptr, htmltag, sizeof(htmltag) - 1);
status += htmlwrite(resp_packet_ptr, titleline, sizeof(titleline) - 1);
status += htmlwrite(resp_packet_ptr, bodytag, sizeof(bodytag) - 1);
status += htmlwrite(resp_packet_ptr, logo_area, sizeof(logo_area) - 1);
status += htmlwrite(resp_packet_ptr, hrline, sizeof(hrline) - 1);
status += htmlwrite(resp_packet_ptr, centertag, sizeof(centertag) - 1);
status += nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
nx_iperf_test_error_counter++;
}
}
static void nx_iperf_print_test_inprogress(NX_WEB_HTTP_SERVER *server_ptr, char *msg)
{
NX_PACKET *resp_packet_ptr;
UINT status;
UINT length = 0;
status = nx_packet_allocate(server_ptr -> nx_web_http_server_packet_pool_ptr,
&resp_packet_ptr,
NX_TCP_PACKET,
NX_WAIT_FOREVER);
status += htmlwrite(resp_packet_ptr, tdcentertag, sizeof(tdcentertag) - 1);
status += htmlwrite(resp_packet_ptr, fontcolortag, sizeof(fontcolortag) - 1);
_nx_utility_string_length_check(msg, &length, NX_MAX_STRING_LENGTH);
status += htmlwrite(resp_packet_ptr, msg, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
nx_iperf_test_error_counter++;
}
}
static void nx_iperf_print_empty_line(NX_WEB_HTTP_SERVER *server_ptr)
{
NX_PACKET *resp_packet_ptr;
UINT status = 0;
status += nx_packet_allocate(server_ptr -> nx_web_http_server_packet_pool_ptr, &resp_packet_ptr, NX_TCP_PACKET, NX_WAIT_FOREVER);
status += htmlwrite(resp_packet_ptr, choosetesttag, sizeof(choosetesttag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
nx_iperf_test_error_counter++;
}
}
static void nx_iperf_send_test_result_info(NX_WEB_HTTP_SERVER *server_ptr)
{
char *response_string = NX_NULL;
NXD_ADDRESS peer_ip_address;
if (nx_iperf_ctrl_info.TestStatus == 0)
{
nx_iperf_print_empty_line(server_ptr);
/* No test is running. Do nothing. */
return;
}
else if (nx_iperf_ctrl_info.TestStatus == 1)
{
switch (nx_iperf_ctrl_info.ctrl_sign)
{
case UDP_RX_START:
response_string = "UDP Receive Test started. After the iperf test finishes, click here to get results.";
break;
case TCP_RX_START:
response_string = "TCP Receive Test started. After the iperf test finishes, click here to get results.";
break;
case UDP_TX_START:
response_string = "UDP Transmit Test starts in 2 seconds. After iperf test is done, click here to get results.";
break;
case TCP_TX_START:
response_string = "TCP Transmit test starts in 2 seconds. After iperf test is done, click here to get results.";
break;
}
nx_iperf_print_test_inprogress(server_ptr, response_string);
}
else if (nx_iperf_ctrl_info.TestStatus == 2)
{
/* Check the ThroughPut value and StartTime,
if the StartTime is zero means no connection.
if throughput value is zero means maybe user interrupt the test.
recalculate the ThroughPut before Interrupt. */
if ((!nx_iperf_ctrl_info.ThroughPut) && (nx_iperf_ctrl_info.StartTime))
{
/* Calculate the run time and Throughput(Mbps). */
nx_iperf_ctrl_info.RunTime = tx_time_get() - nx_iperf_ctrl_info.StartTime;
/* Check the run time. */
if (nx_iperf_ctrl_info.RunTime > nx_iperf_ctrl_info.TestTime)
{
nx_iperf_ctrl_info.RunTime = nx_iperf_ctrl_info.TestTime;
}
/* Calculate Throughput(Mbps). */
nx_iperf_ctrl_info.ThroughPut = (nx_iperf_ctrl_info.BytesTxed + nx_iperf_ctrl_info.BytesRxed) / nx_iperf_ctrl_info.RunTime * NX_IP_PERIODIC_RATE / 125000;
}
peer_ip_address.nxd_ip_version = nx_iperf_ctrl_info.version;
#ifdef FEATURE_NX_IPV6
if (peer_ip_address.nxd_ip_version == NX_IP_VERSION_V6)
{
peer_ip_address.nxd_ip_address.v6[0] = nx_iperf_ctrl_info.ipv6[0];
peer_ip_address.nxd_ip_address.v6[1] = nx_iperf_ctrl_info.ipv6[1];
peer_ip_address.nxd_ip_address.v6[2] = nx_iperf_ctrl_info.ipv6[2];
peer_ip_address.nxd_ip_address.v6[3] = nx_iperf_ctrl_info.ipv6[3];
}
else
#endif
{
#ifndef NX_DISABLE_IPV4
peer_ip_address.nxd_ip_address.v4 = nx_iperf_ctrl_info.ip;
#endif
}
switch (nx_iperf_ctrl_info.ctrl_sign)
{
case UDP_RX_START:
nx_iperf_print_udp_rx_results(server_ptr, &peer_ip_address);
break;
case TCP_RX_START:
nx_iperf_print_tcp_rx_results(server_ptr, &peer_ip_address);
break;
case UDP_TX_START:
nx_iperf_print_udp_tx_results(server_ptr, &peer_ip_address);
break;
case TCP_TX_START:
nx_iperf_print_tcp_tx_results(server_ptr, &peer_ip_address);
break;
}
memset(&nx_iperf_ctrl_info, 0, sizeof(nx_iperf_ctrl_info));
}
}
UINT nx_iperf_get_notify(NX_WEB_HTTP_SERVER *server_ptr, UINT request_type, CHAR *resource, NX_PACKET *packet_ptr)
{
ctrl_info new_cmd;
UINT status;
ULONG port;
UINT length;
NX_PARAMETER_NOT_USED(request_type);
memset(&new_cmd, 0, sizeof(ctrl_info));
/* Get peer IP address. */
status = nxd_tcp_socket_peer_info_get(&server_ptr -> nx_web_http_server_current_session_ptr -> nx_tcp_session_socket, &udp_tx_ip_address, &port);
if (status)
{
return(status);
}
tcp_tx_ip_address = udp_tx_ip_address;
/* Disconnect to mark the end of respond. */
#ifndef NX_WEB_HTTP_KEEPALIVE_DISABLE
server_ptr -> nx_web_http_server_keepalive = NX_FALSE;
#endif
_nx_utility_string_length_check(resource, &length, NX_WEB_HTTP_MAX_RESOURCE);
if (((length == sizeof("/test.htm") - 1) && (memcmp(resource, "/test.htm", length) == 0)) ||
((length == 1) && *resource == '/'))
{
/* Printer the header. */
nx_iperf_print_header(server_ptr);
/* Parse the command. */
nx_iperf_parse_command(packet_ptr, &new_cmd);
/* If the current test is still running, and we have a new command,
we need to clean up the current one. */
if (new_cmd.ctrl_sign)
{
if ((nx_iperf_ctrl_info.TestStatus != 0) || ((nx_iperf_ctrl_info.ctrl_sign & NX_IPERF_CLEAN_UP_MASK) == 1))
{
switch (nx_iperf_ctrl_info.ctrl_sign)
{
case TCP_RX_START:
nx_iperf_tcp_rx_cleanup();
break;
case TCP_TX_START:
nx_iperf_tcp_tx_cleanup();
break;
case UDP_RX_START:
nx_iperf_udp_rx_cleanup();
break;
case UDP_TX_START:
nx_iperf_udp_tx_cleanup();
break;
default:
break;
}
memset(&nx_iperf_ctrl_info, 0, sizeof(nx_iperf_ctrl_info));
}
memcpy(&nx_iperf_ctrl_info, &new_cmd, sizeof(ctrl_info)); /* Use case of memcpy is verified. */
/* Create the test thread and run the test. */
nx_iperf_test_info_parse(&nx_iperf_ctrl_info);
/* Update the TestStatus. */
nx_iperf_ctrl_info.TestStatus = 1;
}
/* Check the status, set the default value. */
if (nx_iperf_ctrl_info.TestStatus == 0)
{
/* Check the IP version. */
if (udp_tx_ip_address.nxd_ip_version == NX_IP_VERSION_V4)
{
udp_tx_packet_size = 1470;
}
else
{
udp_tx_packet_size = 1450;
}
}
/* Print the main window. */
nx_iperf_print_main_test_window(server_ptr);
/* If there is a new command, show the result of launching the command. */
nx_iperf_send_test_result_info(server_ptr);
nx_iperf_print_end_of_page(server_ptr);
/* Update the TestStatus. */
if (nx_iperf_ctrl_info.TestStatus == 1)
{
nx_iperf_ctrl_info.TestStatus = 2;
}
return(NX_WEB_HTTP_CALLBACK_COMPLETED);
}
/* send the logo files */
if ((length == sizeof("/nxlogo.png") - 1) && (memcmp(resource, "/nxlogo.png", length) == 0))
{
nx_iperf_send_image(server_ptr, (UCHAR *)nxlogo_png, nxlogo_png_size);
return(NX_WEB_HTTP_CALLBACK_COMPLETED);
}
if ((length == sizeof("/mslogo.jpg") - 1) && (memcmp(resource, "/mslogo.jpg", length) == 0))
{
nx_iperf_send_image(server_ptr, (UCHAR *)mslogo_jpg, mslogo_jpg_size);
return(NX_WEB_HTTP_CALLBACK_COMPLETED);
}
return(NX_SUCCESS);
}
static void nx_iperf_send_image(NX_WEB_HTTP_SERVER *server_ptr, UCHAR *img, UINT imgsize)
{
UINT remaining;
UCHAR *position;
UINT max_size;
UINT status;
NX_PACKET *resp_packet_ptr;
/* Generate HTTP header. */
status = nx_web_http_server_callback_generate_response_header(server_ptr,
&resp_packet_ptr, NX_WEB_HTTP_STATUS_OK, imgsize, "image/jpeg", NX_NULL);
if (status)
{
return;
}
status = nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
return;
}
status = nx_tcp_socket_mss_get(&(server_ptr -> nx_web_http_server_current_session_ptr -> nx_tcp_session_socket), (ULONG *)&max_size);
if (status)
{
return;
}
remaining = imgsize;
position = img;
while (remaining)
{
if (remaining > max_size)
{
nx_web_http_server_callback_data_send(server_ptr, (void *)position, max_size);
position += max_size;
remaining -= max_size;
}
else
{
nx_web_http_server_callback_data_send(server_ptr, (void *)position, remaining);
remaining = 0;
}
}
}
void nx_iperf_test_info_parse(ctrl_info *iperf_ctrlInfo_ptr)
{
/* Check the sign and set the related parameters. */
switch ((iperf_ctrlInfo_ptr -> ctrl_sign) & NX_IPERF_CTRL_SIGN_MASK)
{
case TCP_RX_START:
{
if (iperf_ctrlInfo_ptr -> TestTime == 0)
{
iperf_ctrlInfo_ptr -> TestTime = 10 * NX_IP_PERIODIC_RATE;
}
tcp_rx_test_time = (UINT)((iperf_ctrlInfo_ptr -> TestTime) / NX_IP_PERIODIC_RATE);
nx_iperf_tcp_rx_test(nx_iperf_stack_area, nx_iperf_stack_area_size);
break;
}
case TCP_TX_START:
{
if (iperf_ctrlInfo_ptr -> TestTime == 0)
{
iperf_ctrlInfo_ptr -> TestTime = 10 * NX_IP_PERIODIC_RATE;
}
tcp_tx_test_time = (UINT)((iperf_ctrlInfo_ptr -> TestTime) / NX_IP_PERIODIC_RATE);
/* Set the transmit ip address. */
if (iperf_ctrlInfo_ptr -> version == NX_IP_VERSION_V4)
{
#ifndef NX_DISABLE_IPV4
tcp_tx_ip_address.nxd_ip_version = NX_IP_VERSION_V4;
tcp_tx_ip_address.nxd_ip_address.v4 = iperf_ctrlInfo_ptr -> ip;
#else
break;
#endif
}
#ifdef FEATURE_NX_IPV6
else
{
tcp_tx_ip_address.nxd_ip_version = NX_IP_VERSION_V6;
tcp_tx_ip_address.nxd_ip_address.v6[0] = iperf_ctrlInfo_ptr -> ipv6[0];
tcp_tx_ip_address.nxd_ip_address.v6[1] = iperf_ctrlInfo_ptr -> ipv6[1];
tcp_tx_ip_address.nxd_ip_address.v6[2] = iperf_ctrlInfo_ptr -> ipv6[2];
tcp_tx_ip_address.nxd_ip_address.v6[3] = iperf_ctrlInfo_ptr -> ipv6[3];
}
#endif
tcp_tx_port = iperf_ctrlInfo_ptr -> port;
nx_iperf_tcp_tx_test(nx_iperf_stack_area, nx_iperf_stack_area_size);
break;
}
case UDP_RX_START:
{
if (iperf_ctrlInfo_ptr -> TestTime == 0)
{
iperf_ctrlInfo_ptr -> TestTime = 10 * NX_IP_PERIODIC_RATE;
}
udp_rx_test_time = (UINT)((iperf_ctrlInfo_ptr -> TestTime) / NX_IP_PERIODIC_RATE);
nx_iperf_udp_rx_test(nx_iperf_stack_area, nx_iperf_stack_area_size);
break;
}
case UDP_TX_START:
{
if (iperf_ctrlInfo_ptr -> TestTime == 0)
{
iperf_ctrlInfo_ptr -> TestTime = 10 * NX_IP_PERIODIC_RATE;
}
udp_tx_test_time = (UINT)((iperf_ctrlInfo_ptr -> TestTime) / NX_IP_PERIODIC_RATE);
if ((iperf_ctrlInfo_ptr -> PacketSize == 0) || (iperf_ctrlInfo_ptr -> PacketSize > 1470))
{
iperf_ctrlInfo_ptr -> PacketSize = 1470;
}
udp_tx_packet_size = (UINT)(iperf_ctrlInfo_ptr -> PacketSize);
udp_tx_port = iperf_ctrlInfo_ptr -> port;
/* Set the transmit ip address. */
if (iperf_ctrlInfo_ptr -> version == NX_IP_VERSION_V4)
{
#ifndef NX_DISABLE_IPV4
udp_tx_ip_address.nxd_ip_version = NX_IP_VERSION_V4;
udp_tx_ip_address.nxd_ip_address.v4 = iperf_ctrlInfo_ptr -> ip;
#else
break;
#endif
}
#ifdef FEATURE_NX_IPV6
else
{
udp_tx_ip_address.nxd_ip_version = NX_IP_VERSION_V6;
udp_tx_ip_address.nxd_ip_address.v6[0] = iperf_ctrlInfo_ptr -> ipv6[0];
udp_tx_ip_address.nxd_ip_address.v6[1] = iperf_ctrlInfo_ptr -> ipv6[1];
udp_tx_ip_address.nxd_ip_address.v6[2] = iperf_ctrlInfo_ptr -> ipv6[2];
udp_tx_ip_address.nxd_ip_address.v6[3] = iperf_ctrlInfo_ptr -> ipv6[3];
if (udp_tx_packet_size > 1450)
{
udp_tx_packet_size = 1450;
}
}
#endif
if (iperf_ctrlInfo_ptr -> Rate == 0)
{
iperf_ctrlInfo_ptr -> Rate = 10;
}
nx_iperf_udp_tx_test(nx_iperf_stack_area, nx_iperf_stack_area_size);
break;
}
default:
{
break;
}
}
}
static void nx_iperf_print_tcp_rx_results(NX_WEB_HTTP_SERVER *server_ptr, NXD_ADDRESS *peer_ip_address)
{
UINT status;
NX_PACKET *resp_packet_ptr;
UINT length = 0;
CHAR *ip_addr_string;
status = nx_packet_allocate(server_ptr -> nx_web_http_server_packet_pool_ptr,
&resp_packet_ptr,
NX_TCP_PACKET,
NX_WAIT_FOREVER);
htmlwrite(resp_packet_ptr, toptdtag, sizeof(toptdtag) - 1);
htmlwrite(resp_packet_ptr, tabletag, sizeof(tabletag) - 1);
status += htmlwrite(resp_packet_ptr, rightspanline, sizeof(rightspanline) - 1);
htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
htmlwrite(resp_packet_ptr, "TCP Receive Test Done:", sizeof("TCP Receive Test Done:") - 1);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, rightspanline, sizeof(rightspanline) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Source IP Address: ", sizeof("Source IP Address: ") - 1);
ip_addr_string = nx_iperf_get_ip_addr_string(peer_ip_address, &length);
status += htmlwrite(resp_packet_ptr, ip_addr_string, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Test Time(milliseconds): ", sizeof("Test Time(milliseconds): ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.RunTime * 1000 / NX_IP_PERIODIC_RATE), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Number of Packets Received: ", sizeof("Number of Packets Received: ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.PacketsRxed), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Number of Bytes Received: ", sizeof("Number of Bytes Received: ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.BytesRxed), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Throughput(Mbps): ", sizeof("Throughput(Mbps): ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.ThroughPut), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
length = _nx_utility_uint_to_string(nx_iperf_ctrl_info.idleTime, 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, "Idle Time: ", sizeof("Idle Time: ") - 1);
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, "%", sizeof("%") - 1);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
#endif
htmlwrite(resp_packet_ptr, tableendtag, sizeof(tableendtag) - 1);
htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
nx_iperf_test_error_counter++;
}
/* Delete the receive thread. */
nx_iperf_tcp_rx_cleanup();
}
static void nx_iperf_print_tcp_tx_results(NX_WEB_HTTP_SERVER *server_ptr, NXD_ADDRESS *peer_ip_address)
{
UINT status;
NX_PACKET *resp_packet_ptr;
UINT length = 0;
CHAR *ip_addr_string;
status = nx_packet_allocate(server_ptr -> nx_web_http_server_packet_pool_ptr,
&resp_packet_ptr,
NX_TCP_PACKET,
NX_WAIT_FOREVER);
htmlwrite(resp_packet_ptr, toptdtag, sizeof(toptdtag) - 1);
htmlwrite(resp_packet_ptr, tabletag, sizeof(tabletag) - 1);
status += htmlwrite(resp_packet_ptr, rightspanline, sizeof(rightspanline) - 1);
htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
htmlwrite(resp_packet_ptr, "TCP Transmit Test Done:", sizeof("TCP Transmit Test Done:") - 1);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, rightspanline, sizeof(rightspanline) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Destination IP Address: ", sizeof("Destination IP Address: ") - 1);
ip_addr_string = nx_iperf_get_ip_addr_string(peer_ip_address, &length);
status += htmlwrite(resp_packet_ptr, ip_addr_string, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Destination Port: ", sizeof("Destination Port: ") - 1);
length = _nx_utility_uint_to_string(nx_iperf_ctrl_info.port, 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Test Time(milliseconds): ", sizeof("Test Time(milliseconds): ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.RunTime * 1000 / NX_IP_PERIODIC_RATE), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Number of Packets Transmitted: ", sizeof("Number of Packets Transmitted: ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.PacketsTxed), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Number of Bytes Transmitted: ", sizeof("Number of Bytes Transmitted: ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.BytesTxed), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Throughput(Mbps): ", sizeof("Throughput(Mbps): ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.ThroughPut), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
length = _nx_utility_uint_to_string(nx_iperf_ctrl_info.idleTime, 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, "Idle Time: ", sizeof("Idle Time: ") - 1);
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, "%", sizeof("%") - 1);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
#endif
status += htmlwrite(resp_packet_ptr, tableendtag, sizeof(tableendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
nx_iperf_test_error_counter++;
}
/* Delete the receive thread. */
nx_iperf_tcp_tx_cleanup();
}
static void nx_iperf_print_udp_rx_results(NX_WEB_HTTP_SERVER *server_ptr, NXD_ADDRESS *peer_ip_address)
{
UINT status;
NX_PACKET *resp_packet_ptr;
UINT length = 0;
CHAR *ip_addr_string;
status = nx_packet_allocate(server_ptr -> nx_web_http_server_packet_pool_ptr,
&resp_packet_ptr,
NX_TCP_PACKET,
NX_WAIT_FOREVER);
/* now send the data back to the client. */
htmlwrite(resp_packet_ptr, toptdtag, sizeof(toptdtag) - 1);
htmlwrite(resp_packet_ptr, tabletag, sizeof(tabletag) - 1);
status += htmlwrite(resp_packet_ptr, rightspanline, sizeof(rightspanline) - 1);
htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
htmlwrite(resp_packet_ptr, "UDP Receive Test Done:", sizeof("UDP Receive Test Done:") - 1);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, rightspanline, sizeof(rightspanline) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Source IP Address: ", sizeof("Source IP Address: ") - 1);
ip_addr_string = nx_iperf_get_ip_addr_string(peer_ip_address, &length);
status += htmlwrite(resp_packet_ptr, ip_addr_string, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Test Time(milliseconds): ", sizeof("Test Time(milliseconds): ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.RunTime * 1000 / NX_IP_PERIODIC_RATE), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Number of Packets Received: ", sizeof("Number of Packets Received: ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.PacketsRxed), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Number of Bytes Received: ", sizeof("Number of Bytes Received: ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.BytesRxed), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Throughput(Mbps): ", sizeof("Throughput(Mbps): ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.ThroughPut), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.idleTime), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, "Idle Time: ", sizeof("Idle Time: ") - 1);
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, "%", sizeof("%") - 1);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
#endif
status += htmlwrite(resp_packet_ptr, tableendtag, sizeof(tableendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
nx_iperf_test_error_counter++;
}
nx_iperf_udp_rx_cleanup();
}
static void nx_iperf_print_udp_tx_results(NX_WEB_HTTP_SERVER *server_ptr, NXD_ADDRESS *peer_ip_address)
{
UINT status;
NX_PACKET *resp_packet_ptr;
UINT length = 0;
CHAR *ip_addr_string;
status = nx_packet_allocate(server_ptr -> nx_web_http_server_packet_pool_ptr,
&resp_packet_ptr,
NX_TCP_PACKET,
NX_WAIT_FOREVER);
/* now send the data back to the client. */
htmlwrite(resp_packet_ptr, toptdtag, sizeof(toptdtag) - 1);
htmlwrite(resp_packet_ptr, tabletag, sizeof(tabletag) - 1);
status += htmlwrite(resp_packet_ptr, rightspanline, sizeof(rightspanline) - 1);
htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
htmlwrite(resp_packet_ptr, "UDP Transmit Test Done:", sizeof("UDP Transmit Test Done:") - 1);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, rightspanline, sizeof(rightspanline) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Destination IP Address: ", sizeof("Destination IP Address: ") - 1);
ip_addr_string = nx_iperf_get_ip_addr_string(peer_ip_address, &length);
status += htmlwrite(resp_packet_ptr, ip_addr_string, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Destination Port: ", sizeof("Destination Port: ") - 1);
length = _nx_utility_uint_to_string(nx_iperf_ctrl_info.port, 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Test Time(milliseconds): ", sizeof("Test Time(milliseconds): ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.RunTime * 1000 / NX_IP_PERIODIC_RATE), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Number of Packets Transmitted: ", sizeof("Number of Packets Transmitted: ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.PacketsTxed), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Number of Bytes Transmitted: ", sizeof("Number of Bytes Transmitted: ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.BytesTxed), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
status += htmlwrite(resp_packet_ptr, "Throughput(Mbps): ", sizeof("Throughput(Mbps): ") - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.ThroughPut), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
status += htmlwrite(resp_packet_ptr, trtag, sizeof(trtag) - 1);
status += htmlwrite(resp_packet_ptr, tdtag, sizeof(tdtag) - 1);
status += htmlwrite(resp_packet_ptr, fonttag, sizeof(fonttag) - 1);
length = _nx_utility_uint_to_string((UINT)(nx_iperf_ctrl_info.idleTime), 10, mytempstring, sizeof(mytempstring));
status += htmlwrite(resp_packet_ptr, "Idle Time: ", sizeof("Idle Time: ") - 1);
status += htmlwrite(resp_packet_ptr, mytempstring, length);
status += htmlwrite(resp_packet_ptr, "%", sizeof("%") - 1);
status += htmlwrite(resp_packet_ptr, fontendtag, sizeof(fontendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += htmlwrite(resp_packet_ptr, trendtag, sizeof(trendtag) - 1);
#endif
status += htmlwrite(resp_packet_ptr, tableendtag, sizeof(tableendtag) - 1);
status += htmlwrite(resp_packet_ptr, tdendtag, sizeof(tdendtag) - 1);
status += nx_web_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
if (status)
{
nx_packet_release(resp_packet_ptr);
nx_iperf_test_error_counter++;
}
nx_iperf_udp_tx_cleanup();
}
void nx_iperf_thread_tcp_rx_entry(ULONG thread_input)
{
UINT status;
NX_PACKET *packet_ptr;
ULONG actual_status;
ULONG expire_time;
ctrl_info *ctrlInfo_ptr;
NXD_ADDRESS ip_address;
ULONG port;
/* Set the pointer. */
ctrlInfo_ptr = (ctrl_info *)thread_input;
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
/* Update the time. */
thread_time = 0;
isr_time = 0;
idle_time = 0;
#endif
/* Update the test result. */
ctrlInfo_ptr -> PacketsRxed = 0;
ctrlInfo_ptr -> BytesRxed = 0;
ctrlInfo_ptr -> ThroughPut = 0;
ctrlInfo_ptr -> StartTime = 0;
ctrlInfo_ptr -> RunTime = 0;
ctrlInfo_ptr -> ErrorCode = 0;
/* Ensure the IP instance has been initialized. */
status = nx_ip_status_check(nx_iperf_test_ip, NX_IP_INITIALIZE_DONE, &actual_status, NX_IP_PERIODIC_RATE);
/* Check status... */
if (status != NX_SUCCESS)
{
error_counter++;
return;
}
/* Setup this thread to listen. */
status = nx_tcp_server_socket_listen(nx_iperf_test_ip, NX_IPERF_TCP_RX_PORT, &tcp_server_socket, 5, nx_iperf_tcp_rx_connect_received);
/* Check for error. */
if (status)
{
error_counter++;
return;
}
/* Increment thread tcp rx's counter. */
thread_tcp_rx_counter++;
/* Accept a client socket connection. */
status = nx_tcp_server_socket_accept(&tcp_server_socket, NX_WAIT_FOREVER);
/* Check for error. */
if (status)
{
nx_tcp_server_socket_unlisten(nx_iperf_test_ip, NX_IPERF_TCP_RX_PORT);
error_counter++;
return;
}
/*Get source ip address*/
status = nxd_tcp_socket_peer_info_get(&tcp_server_socket, &ip_address, &port);
if (status)
{
nx_tcp_server_socket_unaccept(&tcp_server_socket);
nx_tcp_server_socket_unlisten(nx_iperf_test_ip, NX_IPERF_TCP_RX_PORT);
error_counter++;
return;
}
ctrlInfo_ptr -> version = ip_address.nxd_ip_version;
if (ctrlInfo_ptr -> version == NX_IP_VERSION_V4)
{
#ifndef NX_DISABLE_IPV4
ctrlInfo_ptr -> ip = ip_address.nxd_ip_address.v4;
#endif
}
#ifdef FEATURE_NX_IPV6
else if (ctrlInfo_ptr -> version == NX_IP_VERSION_V6)
{
memcpy(ctrlInfo_ptr -> ipv6, ip_address.nxd_ip_address.v6, sizeof(ULONG) * 4); /* Use case of memcpy is verified. */
}
#endif
/* Set the test start time. */
ctrlInfo_ptr -> StartTime = tx_time_get();
expire_time = (ULONG)(ctrlInfo_ptr -> StartTime + (ctrlInfo_ptr -> TestTime) + 20);
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
_tx_execution_thread_total_time_reset();
_tx_execution_isr_time_reset();
_tx_execution_idle_time_reset();
#endif
while (tx_time_get() < expire_time)
{
/* Receive a TCP message from the socket. */
status = nx_tcp_socket_receive(&tcp_server_socket, &packet_ptr, NX_WAIT_FOREVER);
/* Check for error. */
if (status)
{
error_counter++;
break;
}
/* Update the counter. */
ctrlInfo_ptr -> PacketsRxed++;
ctrlInfo_ptr -> BytesRxed += packet_ptr -> nx_packet_length;
/* Release the packet. */
nx_packet_release(packet_ptr);
}
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
_tx_execution_thread_total_time_get(&thread_time);
_tx_execution_isr_time_get(&isr_time);
_tx_execution_idle_time_get(&idle_time);
#endif
/* Calculate the test time and Throughput(Mbps). */
ctrlInfo_ptr -> RunTime = tx_time_get() - ctrlInfo_ptr -> StartTime;
ctrlInfo_ptr -> ThroughPut = ctrlInfo_ptr -> BytesRxed / ctrlInfo_ptr -> RunTime * NX_IP_PERIODIC_RATE / 125000;
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
ctrlInfo_ptr -> idleTime = (ULONG)((unsigned long long)idle_time * 100 / ((unsigned long long)thread_time + (unsigned long long)isr_time + (unsigned long long)idle_time));
#endif
/* Disconnect the server socket. */
status = nx_tcp_socket_disconnect(&tcp_server_socket, 10);
/* Check for error. */
if (status)
{
error_counter++;
}
/* Unaccept the server socket. */
status = nx_tcp_server_socket_unaccept(&tcp_server_socket);
status += nx_tcp_server_socket_unlisten(nx_iperf_test_ip, NX_IPERF_TCP_RX_PORT);
/* Check for error. */
if (status)
{
error_counter++;
}
if (error_counter)
{
ctrlInfo_ptr -> ErrorCode = error_counter;
}
}
void nx_iperf_tcp_rx_connect_received(NX_TCP_SOCKET *socket_ptr, UINT port)
{
/* Check for the proper socket and port. */
if ((socket_ptr != &tcp_server_socket) || (port != NX_IPERF_TCP_RX_PORT))
{
error_counter++;
}
}
void nx_iperf_tcp_rx_disconnect_received(NX_TCP_SOCKET *socket)
{
/* Check for proper disconnected socket. */
if (socket != &tcp_server_socket)
{
error_counter++;
}
}
void nx_iperf_tcp_rx_cleanup(void)
{
nx_tcp_socket_disconnect(&tcp_server_socket, NX_NO_WAIT);
nx_tcp_server_socket_unaccept(&tcp_server_socket);
nx_tcp_server_socket_unlisten(nx_iperf_test_ip, NX_IPERF_TCP_RX_PORT);
tx_thread_terminate(&thread_tcp_rx_iperf);
tx_thread_delete(&thread_tcp_rx_iperf);
}
void nx_iperf_tcp_rx_test(UCHAR *stack_space, ULONG stack_size)
{
UINT status;
status = tx_thread_create(&thread_tcp_rx_iperf, "thread tcp rx",
nx_iperf_thread_tcp_rx_entry,
(ULONG)&nx_iperf_ctrl_info,
stack_space, stack_size, NX_IPERF_THREAD_PRIORITY, NX_IPERF_THREAD_PRIORITY,
TX_NO_TIME_SLICE, TX_AUTO_START);
if (status)
{
nx_iperf_ctrl_info.ErrorCode = 1;
}
return;
}
void nx_iperf_thread_tcp_tx_entry(ULONG thread_input)
{
UINT status;
UINT is_first = NX_TRUE;
NX_PACKET *my_packet = NX_NULL;
#ifndef NX_DISABLE_PACKET_CHAIN
NX_PACKET *packet_ptr;
NX_PACKET *last_packet;
ULONG remaining_size;
#endif /* NX_DISABLE_PACKET_CHAIN */
ULONG expire_time;
ctrl_info *ctrlInfo_ptr;
ULONG packet_size;
NXD_ADDRESS server_ip;
/* Set the pointer. */
ctrlInfo_ptr = (ctrl_info *)thread_input;
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
thread_time = 0;
isr_time = 0;
idle_time = 0;
#endif
ctrlInfo_ptr -> PacketsTxed = 0;
ctrlInfo_ptr -> BytesTxed = 0;
ctrlInfo_ptr -> ThroughPut = 0;
ctrlInfo_ptr -> StartTime = 0;
ctrlInfo_ptr -> RunTime = 0;
ctrlInfo_ptr -> ErrorCode = 0;
server_ip.nxd_ip_version = ctrlInfo_ptr -> version;
#ifdef FEATURE_NX_IPV6
if (ctrlInfo_ptr -> version == NX_IP_VERSION_V6)
{
server_ip.nxd_ip_address.v6[0] = ctrlInfo_ptr -> ipv6[0];
server_ip.nxd_ip_address.v6[1] = ctrlInfo_ptr -> ipv6[1];
server_ip.nxd_ip_address.v6[2] = ctrlInfo_ptr -> ipv6[2];
server_ip.nxd_ip_address.v6[3] = ctrlInfo_ptr -> ipv6[3];
}
else if (ctrlInfo_ptr -> version == NX_IP_VERSION_V4)
#endif
{
#ifndef NX_DISABLE_IPV4
server_ip.nxd_ip_address.v4 = ctrlInfo_ptr -> ip;
#endif
}
/* TCP Transmit Test Starts in 2 seconds. */
tx_thread_sleep(200);
/* Bind the socket. */
status = nx_tcp_client_socket_bind(&tcp_client_socket, NX_ANY_PORT, NX_WAIT_FOREVER);
/* Check for error. */
if (status)
{
error_counter++;
return;
}
/* Attempt to connect the socket. */
status = nxd_tcp_client_socket_connect(&tcp_client_socket, &server_ip, ctrlInfo_ptr -> port, NX_WAIT_FOREVER);
/* Check for error. */
if (status)
{
nx_tcp_client_socket_unbind(&tcp_client_socket);
error_counter++;
return;
}
/* Set the test start time. */
ctrlInfo_ptr -> StartTime = tx_time_get();
expire_time = (ULONG)(ctrlInfo_ptr -> StartTime + (ctrlInfo_ptr -> TestTime));
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
_tx_execution_thread_total_time_reset();
_tx_execution_isr_time_reset();
_tx_execution_idle_time_reset();
#endif
/* Set the packet size. */
status = nx_tcp_socket_mss_get(&tcp_client_socket, &packet_size);
/* Check for error. */
if (status)
{
nx_tcp_socket_disconnect(&tcp_client_socket, NX_NO_WAIT);
nx_tcp_client_socket_unbind(&tcp_client_socket);
error_counter++;
return;
}
/* Loop to transmit the packet. */
while (tx_time_get() < expire_time)
{
/* Allocate a packet. */
status = nx_packet_allocate(nx_iperf_test_pool, &my_packet, NX_TCP_PACKET, NX_WAIT_FOREVER);
/* Check status. */
if (status != NX_SUCCESS)
{
break;
}
/* Write ABCs into the packet payload! */
/* Adjust the write pointer. */
if (my_packet -> nx_packet_prepend_ptr + packet_size <= my_packet -> nx_packet_data_end)
{
my_packet -> nx_packet_append_ptr = my_packet -> nx_packet_prepend_ptr + packet_size;
#ifndef NX_DISABLE_PACKET_CHAIN
remaining_size = 0;
#endif /* NX_DISABLE_PACKET_CHAIN */
}
else
{
#ifdef NX_DISABLE_PACKET_CHAIN
packet_size = (ULONG)(my_packet -> nx_packet_data_end - my_packet -> nx_packet_prepend_ptr);
my_packet -> nx_packet_append_ptr = my_packet -> nx_packet_prepend_ptr + packet_size;
#else
my_packet -> nx_packet_append_ptr = my_packet -> nx_packet_data_end;
remaining_size = packet_size - (ULONG)(my_packet -> nx_packet_append_ptr - my_packet -> nx_packet_prepend_ptr);
last_packet = my_packet;
#endif /* NX_DISABLE_PACKET_CHAIN */
}
my_packet -> nx_packet_length = packet_size;
#ifndef NX_DISABLE_PACKET_CHAIN
while (remaining_size)
{
/* Allocate a packet. */
status = nx_packet_allocate(nx_iperf_test_pool, &packet_ptr, NX_TCP_PACKET, NX_WAIT_FOREVER);
/* Check status. */
if (status != NX_SUCCESS)
{
break;
}
last_packet -> nx_packet_next = packet_ptr;
last_packet = packet_ptr;
if (remaining_size < (ULONG)(packet_ptr -> nx_packet_data_end - packet_ptr -> nx_packet_prepend_ptr))
{
packet_ptr -> nx_packet_append_ptr = packet_ptr -> nx_packet_prepend_ptr + remaining_size;
}
else
{
packet_ptr -> nx_packet_append_ptr = packet_ptr -> nx_packet_data_end;
}
remaining_size = remaining_size - (ULONG)(packet_ptr -> nx_packet_append_ptr - packet_ptr -> nx_packet_prepend_ptr);
}
#endif /* NX_DISABLE_PACKET_CHAIN */
if (is_first)
{
memset(my_packet -> nx_packet_prepend_ptr, 0, (UINT)(my_packet -> nx_packet_data_end - my_packet -> nx_packet_prepend_ptr));
is_first = NX_FALSE;
}
/* Send the packet out! */
status = nx_tcp_socket_send(&tcp_client_socket, my_packet, NX_WAIT_FOREVER);
/* Determine if the status is valid. */
if (status)
{
error_counter++;
nx_packet_release(my_packet);
break;
}
else
{
/* Update the counter. */
ctrlInfo_ptr -> PacketsTxed++;
ctrlInfo_ptr -> BytesTxed += packet_size;
}
}
/* Calculate the test time and Throughput(Mbps). */
ctrlInfo_ptr -> RunTime = tx_time_get() - ctrlInfo_ptr -> StartTime;
ctrlInfo_ptr -> ThroughPut = ctrlInfo_ptr -> BytesTxed / ctrlInfo_ptr -> RunTime * NX_IP_PERIODIC_RATE / 125000;
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
_tx_execution_thread_total_time_get(&thread_time);
_tx_execution_isr_time_get(&isr_time);
_tx_execution_idle_time_get(&idle_time);
#endif
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
ctrlInfo_ptr -> idleTime = (ULONG)((unsigned long long)idle_time * 100 / ((unsigned long long)thread_time + (unsigned long long)isr_time + (unsigned long long)idle_time));
#endif
/* Disconnect this socket. */
status = nx_tcp_socket_disconnect(&tcp_client_socket, NX_NO_WAIT);
/* Determine if the status is valid. */
if (status)
{
error_counter++;
}
/* Unbind the socket. */
status = nx_tcp_client_socket_unbind(&tcp_client_socket);
/* Check for error. */
if (status)
{
error_counter++;
}
if (error_counter)
{
ctrlInfo_ptr -> ErrorCode = error_counter;
}
}
void nx_iperf_tcp_tx_cleanup(void)
{
nx_tcp_socket_disconnect(&tcp_client_socket, NX_NO_WAIT);
nx_tcp_client_socket_unbind(&tcp_client_socket);
tx_thread_terminate(&thread_tcp_tx_iperf);
tx_thread_delete(&thread_tcp_tx_iperf);
}
void nx_iperf_tcp_tx_test(UCHAR *stack_space, ULONG stack_size)
{
UINT status;
status = tx_thread_create(&thread_tcp_tx_iperf, "thread tcp tx",
nx_iperf_thread_tcp_tx_entry,
(ULONG)&nx_iperf_ctrl_info,
stack_space, stack_size, NX_WEB_HTTP_SERVER_PRIORITY + 1, NX_WEB_HTTP_SERVER_PRIORITY + 1,
TX_NO_TIME_SLICE, TX_AUTO_START);
if (status)
{
nx_iperf_ctrl_info.ErrorCode = 1;
}
return;
}
void nx_iperf_thread_udp_rx_entry(ULONG thread_input)
{
UINT status;
ULONG expire_time;
NX_PACKET *my_packet;
ctrl_info *ctrlInfo_ptr;
int packetID = 0;
UINT sender_port;
ULONG tmp;
NXD_ADDRESS source_ip_address;
/* Set the pointer. */
ctrlInfo_ptr = (ctrl_info *)thread_input;
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
thread_time = 0;
isr_time = 0;
idle_time = 0;
#endif
/* Update the test result. */
ctrlInfo_ptr -> PacketsRxed = 0;
ctrlInfo_ptr -> BytesRxed = 0;
ctrlInfo_ptr -> ThroughPut = 0;
ctrlInfo_ptr -> StartTime = 0;
ctrlInfo_ptr -> RunTime = 0;
ctrlInfo_ptr -> ErrorCode = 0;
/* Bind the UDP socket to the IP port. */
status = nx_udp_socket_bind(&udp_server_socket, NX_IPERF_UDP_RX_PORT, TX_WAIT_FOREVER);
/* Check status. */
if (status)
{
error_counter++;
return;
}
/* Disable checksum for UDP. */
nx_udp_socket_checksum_disable(&udp_server_socket);
/* Receive a UDP packet. */
status = nx_udp_socket_receive(&udp_server_socket, &my_packet, TX_WAIT_FOREVER);
/* Check status. */
if (status)
{
nx_udp_socket_unbind(&udp_server_socket);
error_counter++;
return;
}
/* Get source ip address*/
nxd_udp_source_extract(my_packet, &source_ip_address, &sender_port);
/* Set the IP address Version. */
ctrlInfo_ptr -> version = source_ip_address.nxd_ip_version;
#ifndef NX_DISABLE_IPV4
if (ctrlInfo_ptr -> version == NX_IP_VERSION_V4)
{
ctrlInfo_ptr -> ip = source_ip_address.nxd_ip_address.v4;
}
#endif
#ifdef FEATURE_NX_IPV6
if (ctrlInfo_ptr -> version == NX_IP_VERSION_V6)
{
ctrlInfo_ptr -> ipv6[0] = source_ip_address.nxd_ip_address.v6[0];
ctrlInfo_ptr -> ipv6[1] = source_ip_address.nxd_ip_address.v6[1];
ctrlInfo_ptr -> ipv6[2] = source_ip_address.nxd_ip_address.v6[2];
ctrlInfo_ptr -> ipv6[3] = source_ip_address.nxd_ip_address.v6[3];
}
#endif
/* Release the packet. */
nx_packet_release(my_packet);
/* Set the test start time. */
ctrlInfo_ptr -> StartTime = tx_time_get();
expire_time = (ULONG)(ctrlInfo_ptr -> StartTime + (ctrlInfo_ptr -> TestTime) + 5); /* Wait 5 more ticks to synchronize. */
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
_tx_execution_thread_total_time_reset();
_tx_execution_isr_time_reset();
_tx_execution_idle_time_reset();
#endif
while (tx_time_get() < expire_time)
{
/* Receive a UDP packet. */
status = nx_udp_socket_receive(&udp_server_socket, &my_packet, TX_WAIT_FOREVER);
/* Check status. */
if (status != NX_SUCCESS)
{
error_counter++;
break;
}
/* Update the counter. */
ctrlInfo_ptr -> PacketsRxed++;
ctrlInfo_ptr -> BytesRxed += my_packet -> nx_packet_length;
/* Detect the end of the test signal. */
packetID = *(int *)(my_packet -> nx_packet_prepend_ptr);
tmp = (ULONG)packetID;
NX_CHANGE_ULONG_ENDIAN(tmp);
packetID = (int)tmp;
/* Check the packet ID. */
if (packetID < 0)
{
/* Test has finished. */
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
_tx_execution_thread_total_time_get(&thread_time);
_tx_execution_isr_time_get(&isr_time);
_tx_execution_idle_time_get(&idle_time);
#endif
/* Calculate the test time and Throughput. */
ctrlInfo_ptr -> RunTime = tx_time_get() - ctrlInfo_ptr -> StartTime;
ctrlInfo_ptr -> ThroughPut = ctrlInfo_ptr -> BytesRxed / ctrlInfo_ptr -> RunTime * NX_IP_PERIODIC_RATE / 125000;
/* received end of the test signal */
/* Send the UDP packet. */
status = nxd_udp_socket_send(&udp_server_socket, my_packet, &source_ip_address, sender_port);
/* Check the status. */
if (status)
{
/* Release the packet. */
nx_packet_release(my_packet);
}
else
{
/* Loop to receive the end of the test signal. */
while (1)
{
/* Receive a UDP packet. */
status = nx_udp_socket_receive(&udp_server_socket, &my_packet, 20);
/* Check the status. */
if (status)
{
break;
}
/* Send the UDP packet. */
status = nxd_udp_socket_send(&udp_server_socket, my_packet, &source_ip_address, sender_port);
/* Check the status. */
if (status)
{
/* Release the packet. */
nx_packet_release(my_packet);
}
}
}
break;
}
else
{
/* Release the packet. */
nx_packet_release(my_packet);
}
}
if (packetID >= 0)
{
/* Test is not synchronized. */
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
_tx_execution_thread_total_time_get(&thread_time);
_tx_execution_isr_time_get(&isr_time);
_tx_execution_idle_time_get(&idle_time);
#endif
/* Calculate the test time and Throughput. */
ctrlInfo_ptr -> RunTime = tx_time_get() - ctrlInfo_ptr -> StartTime;
ctrlInfo_ptr -> ThroughPut = ctrlInfo_ptr -> BytesRxed / ctrlInfo_ptr -> RunTime * NX_IP_PERIODIC_RATE / 125000;
}
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
ctrlInfo_ptr -> idleTime = (ULONG)((unsigned long long)idle_time * 100 / ((unsigned long long)thread_time + (unsigned long long)isr_time + (unsigned long long)idle_time));
#endif
/* Unbind the socket. */
nx_udp_socket_unbind(&udp_server_socket);
/* Check error counter. */
if (error_counter)
{
ctrlInfo_ptr -> ErrorCode = error_counter;
}
}
void nx_iperf_udp_rx_cleanup(void)
{
nx_udp_socket_unbind(&udp_server_socket);
tx_thread_terminate(&thread_udp_rx_iperf);
tx_thread_delete(&thread_udp_rx_iperf);
}
void nx_iperf_udp_rx_test(UCHAR *stack_space, ULONG stack_size)
{
UINT status;
status = tx_thread_create(&thread_udp_rx_iperf, "thread udp rx",
nx_iperf_thread_udp_rx_entry,
(ULONG)&nx_iperf_ctrl_info,
stack_space, stack_size, NX_WEB_HTTP_SERVER_PRIORITY + 1, NX_WEB_HTTP_SERVER_PRIORITY + 1,
TX_NO_TIME_SLICE, TX_AUTO_START);
if (status)
{
nx_iperf_ctrl_info.ErrorCode = 1;
}
return;
}
static void nx_iperf_send_udp_packet(int udp_id, ctrl_info *ctrlInfo_ptr)
{
UINT status;
NX_PACKET *my_packet = NX_NULL;
udp_payload *payload_ptr;
ULONG tmp;
NXD_ADDRESS server_ip;
server_ip.nxd_ip_version = ctrlInfo_ptr -> version;
#ifdef FEATURE_NX_IPV6
if (ctrlInfo_ptr -> version == NX_IP_VERSION_V6)
{
server_ip.nxd_ip_address.v6[0] = ctrlInfo_ptr -> ipv6[0];
server_ip.nxd_ip_address.v6[1] = ctrlInfo_ptr -> ipv6[1];
server_ip.nxd_ip_address.v6[2] = ctrlInfo_ptr -> ipv6[2];
server_ip.nxd_ip_address.v6[3] = ctrlInfo_ptr -> ipv6[3];
}
else if (ctrlInfo_ptr -> version == NX_IP_VERSION_V4)
#endif
{
#ifndef NX_DISABLE_IPV4
server_ip.nxd_ip_address.v4 = ctrlInfo_ptr -> ip;
#endif
}
/* Send the end of test indicator. */
nx_packet_allocate(nx_iperf_test_pool, &my_packet, NX_UDP_PACKET, TX_WAIT_FOREVER);
my_packet -> nx_packet_append_ptr = my_packet -> nx_packet_prepend_ptr + ctrlInfo_ptr -> PacketSize;
payload_ptr = (udp_payload *)my_packet -> nx_packet_prepend_ptr;
payload_ptr -> udp_id = udp_id;
payload_ptr -> tv_sec = _tx_timer_system_clock / NX_IP_PERIODIC_RATE;
payload_ptr -> tv_usec = _tx_timer_system_clock / NX_IP_PERIODIC_RATE * 1000000;
tmp = (ULONG)payload_ptr -> udp_id;
NX_CHANGE_ULONG_ENDIAN(tmp);
payload_ptr -> udp_id = (int)tmp;
NX_CHANGE_ULONG_ENDIAN(payload_ptr -> tv_sec);
NX_CHANGE_ULONG_ENDIAN(payload_ptr -> tv_usec);
/* Adjust the write pointer. */
my_packet -> nx_packet_length = (UINT)(ctrlInfo_ptr -> PacketSize);
/* Send the UDP packet. */
status = nxd_udp_socket_send(&udp_client_socket, my_packet, &server_ip, ctrlInfo_ptr -> port);
/* Check the status. */
if (status)
{
/* Release the packet. */
nx_packet_release(my_packet);
return;
}
}
void nx_iperf_thread_udp_tx_entry(ULONG thread_input)
{
UINT status;
ULONG expire_time;
ctrl_info *ctrlInfo_ptr;
NX_PACKET *my_packet;
int i;
long udp_id;
/* Initialize the value. */
udp_id = 0;
ctrlInfo_ptr = (ctrl_info *)thread_input;
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
thread_time = 0;
isr_time = 0;
idle_time = 0;
#endif
ctrlInfo_ptr -> PacketsTxed = 0;
ctrlInfo_ptr -> BytesTxed = 0;
ctrlInfo_ptr -> ThroughPut = 0;
ctrlInfo_ptr -> StartTime = 0;
ctrlInfo_ptr -> RunTime = 0;
ctrlInfo_ptr -> ErrorCode = 0;
/* UDP Transmit Test Starts in 2 seconds. */
tx_thread_sleep(200);
/* Bind the UDP socket to the IP port. */
status = nx_udp_socket_bind(&udp_client_socket, NX_ANY_PORT, TX_WAIT_FOREVER);
/* Check status. */
if (status)
{
error_counter++;
return;
}
/* Do not calculate checksum for UDP. */
nx_udp_socket_checksum_disable(&udp_client_socket);
/* Set the test start time. */
ctrlInfo_ptr -> StartTime = tx_time_get();
expire_time = (ULONG)(ctrlInfo_ptr -> StartTime + (ctrlInfo_ptr -> TestTime));
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
_tx_execution_thread_total_time_reset();
_tx_execution_isr_time_reset();
_tx_execution_idle_time_reset();
#endif
while (tx_time_get() < expire_time)
{
/* Write ABCs into the packet payload! */
nx_iperf_send_udp_packet(udp_id, ctrlInfo_ptr);
/* Update the ID. */
udp_id = (udp_id + 1) & 0x7FFFFFFF;
/* Update the counter. */
ctrlInfo_ptr -> PacketsTxed++;
ctrlInfo_ptr -> BytesTxed += ctrlInfo_ptr -> PacketSize;
}
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
_tx_execution_thread_total_time_get(&thread_time);
_tx_execution_isr_time_get(&isr_time);
_tx_execution_idle_time_get(&idle_time);
#endif
/* Calculate the test time and Throughput. */
ctrlInfo_ptr -> RunTime = tx_time_get() - ctrlInfo_ptr -> StartTime;
ctrlInfo_ptr -> ThroughPut = ctrlInfo_ptr -> BytesTxed / ctrlInfo_ptr -> RunTime * NX_IP_PERIODIC_RATE / 125000;
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
ctrlInfo_ptr -> idleTime = (ULONG)((unsigned long long)idle_time * 100 / ((unsigned long long)thread_time + (unsigned long long)isr_time + (unsigned long long)idle_time));
#endif
if (error_counter)
{
ctrlInfo_ptr -> ErrorCode = error_counter;
}
ctrlInfo_ptr -> PacketSize = 100;
for (i = 0; i < 10; i++)
{
/* Send the end of the test signal*/
nx_iperf_send_udp_packet((0 - udp_id), ctrlInfo_ptr);
/* Receive the packet. s*/
if (nx_udp_socket_receive(&udp_client_socket, &my_packet, 10) == NX_SUCCESS)
{
nx_packet_release(my_packet);
break;
}
}
/* Unbind the socket. */
nx_udp_socket_unbind(&udp_client_socket);
}
void nx_iperf_udp_tx_cleanup(void)
{
nx_udp_socket_unbind(&udp_client_socket);
tx_thread_terminate(&thread_udp_tx_iperf);
tx_thread_delete(&thread_udp_tx_iperf);
}
void nx_iperf_udp_tx_test(UCHAR *stack_space, ULONG stack_size)
{
UINT status;
status = tx_thread_create(&thread_udp_tx_iperf, "thread udp tx",
nx_iperf_thread_udp_tx_entry,
(ULONG)&nx_iperf_ctrl_info,
stack_space, stack_size, NX_WEB_HTTP_SERVER_PRIORITY + 1, NX_WEB_HTTP_SERVER_PRIORITY + 1,
TX_NO_TIME_SLICE, TX_AUTO_START);
if (status)
{
nx_iperf_ctrl_info.ErrorCode = 1;
}
return;
}
void nx_iperf_udp_client_socket_vlan_priority_set(UCHAR vlan_priority)
{
if (vlan_priority <= NX_VLAN_PRIORITY_MAX)
{
udp_client_socket_vlan_priority = vlan_priority;
}
}
void nx_iperf_tcp_client_socket_vlan_priority_set(UCHAR vlan_priority)
{
if (vlan_priority <= NX_VLAN_PRIORITY_MAX)
{
tcp_client_socket_vlan_priority = vlan_priority;
}
}