/*************************************************************************** * 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; } }