diff --git a/.gitignore b/.gitignore index b1c2198..9d33cd2 100644 --- a/.gitignore +++ b/.gitignore @@ -72,4 +72,9 @@ fabric.properties .idea/httpRequests # Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser \ No newline at end of file +.idea/caches/build_file_checksums.ser +managed_components/ + +*.lock + +.cache/ diff --git a/CMakeLists.txt b/CMakeLists.txt index fa30c0b..3d088dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ # The following lines of boilerplate have to be in your project's # CMakeLists in this exact order for cmake to work correctly -cmake_minimum_required(VERSION 3.2) +cmake_minimum_required(VERSION 3.22) set(SUPPORTED_TARGETS esp32) diff --git a/components/ethernet_helper/CMakeLists.txt b/components/ethernet_helper/CMakeLists.txt index bdc699c..deecdcc 100644 --- a/components/ethernet_helper/CMakeLists.txt +++ b/components/ethernet_helper/CMakeLists.txt @@ -1,4 +1,4 @@ idf_component_register(SRCS "connect.c" INCLUDE_DIRS "include" - REQUIRES lwip mdns + REQUIRES lwip mdns esp_wifi esp_eth ) diff --git a/components/ethernet_helper/connect.c b/components/ethernet_helper/connect.c index 50fd230..e7c4fdb 100644 --- a/components/ethernet_helper/connect.c +++ b/components/ethernet_helper/connect.c @@ -203,7 +203,7 @@ static void start(void) }; ESP_LOGI(TAG, "Connecting to %s...", wifi_config.sta.ssid); ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); - ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)); + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); ESP_ERROR_CHECK(esp_wifi_start()); #ifdef CONFIG_ETHERNET_HELPER_CUSTOM_HOSTNAME diff --git a/components/open62541/CMakeLists.txt b/components/open62541/CMakeLists.txt index 7e733cb..d6eda7b 100644 --- a/components/open62541/CMakeLists.txt +++ b/components/open62541/CMakeLists.txt @@ -9,26 +9,41 @@ endif() idf_component_register( SRCS custom_getaddrinfo.c REQUIRES lwip vfs freertos ${ADDITIONAL_REQUIRES} - PRIV_INCLUDE_DIRS ${IDF_PATH}/components/freertos/include/freertos ) set_property(SOURCE ${CMAKE_BINARY_DIR}/open62541/open62541.c PROPERTY GENERATED 1) +set_source_files_properties(${CMAKE_BINARY_DIR}/open62541/open62541.c + PROPERTIES COMPILE_FLAGS "-w") target_sources(${COMPONENT_LIB} PRIVATE ${CMAKE_BINARY_DIR}/open62541/open62541.c) -target_include_directories(${COMPONENT_LIB} PUBLIC ${CMAKE_BINARY_DIR}/open62541) +target_include_directories(${COMPONENT_LIB} BEFORE PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/compat_includes + ${CMAKE_BINARY_DIR}/open62541) set(open62541_OPTIONS - "-DUA_ARCHITECTURE=freertosLWIP" + "-DUA_ARCHITECTURE=freertos-lwip" + "-DFREERTOS_KERNEL_PATH=${CMAKE_CURRENT_SOURCE_DIR}/freertos_stub" + "-DFREERTOS_PORT_PATH=${CMAKE_CURRENT_SOURCE_DIR}/freertos_stub" "-DUA_ENABLE_AMALGAMATION=ON" - "-DUA_NAMESPACE_ZERO=FULL" - "-DUA_ENABLE_SUBSCRIPTIONS_EVENTS=ON" + # REDUCED uses open62541's own curated minimal NS0 (Opc.Ua.NodeSet2.Reduced.xml + # + per-feature *Minimal.xml nodesets), gated by the UA_ENABLE_* flags below. + # This replaces the old FULL + hand-maintained nodes_blacklist.txt approach, + # which broke whenever a blacklisted node was still transitively referenced. + "-DUA_NAMESPACE_ZERO=REDUCED" + "-DUA_ENABLE_DIAGNOSTICS=OFF" + "-DUA_ENABLE_HISTORIZING=OFF" + "-DUA_ENABLE_PUBSUB=OFF" + "-DUA_ENABLE_DA=OFF" + "-DUA_ENABLE_SUBSCRIPTIONS_EVENTS=OFF" + "-DUA_ENABLE_JSON_ENCODING=OFF" + "-DUA_ENABLE_XML_ENCODING=OFF" + "-DUA_ENABLE_STATUSCODE_DESCRIPTIONS=OFF" "-DUA_ENABLE_DISCOVERY=ON" - "-DUA_ENABLE_DISCOVERY_MULTICAST=ON" - "-DUA_ENABLE_TYPEDESCRIPTION=OFF" - "-DUA_ENABLE_STATUSCODE_DESCRIPTIONS=ON" + "-DUA_ENABLE_DISCOVERY_MULTICAST=MDNSD" "-DUA_LOGLEVEL=300" "-DUA_ENABLE_NODESET_COMPILER_DESCRIPTIONS=OFF" - "-DUA_FILE_NS0_BLACKLIST=${CMAKE_CURRENT_SOURCE_DIR}/../../nodes_blacklist.txt" "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" + "-DLWIP_LIBRARIES=${CMAKE_BINARY_DIR}/esp-idf/lwip/liblwip.a" + "-DCMAKE_PROJECT_INCLUDE_BEFORE=${CMAKE_CURRENT_SOURCE_DIR}/no_install.cmake" ) @@ -36,16 +51,26 @@ if (USE_ENCRYPTION) set(open62541_OPTIONS ${open62541_OPTIONS} "-DUA_ENABLE_ENCRYPTION=ON") endif() +set(open62541_CONFIG_H "${CMAKE_BINARY_DIR}/open62541/src_generated/open62541/config.h") + externalproject_add(open62541_build SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/repo #GIT_REPOSITORY https://github.com/open62541/open62541.git # Latest tested commit on master branch. Newer may work. You can also use 'master' directly as GIT_TAG value #GIT_TAG 76a6cab604fb5309c91a8849183417da1383d3d9 BINARY_DIR "${CMAKE_BINARY_DIR}/open62541" + LIST_SEPARATOR "|" CMAKE_ARGS ${open62541_OPTIONS} - BUILD_COMMAND cmake --build . --target open62541-code-generation + "-DLWIP_INCLUDE_DIRS=${IDF_PATH}/components/lwip/lwip/src/include|${IDF_PATH}/components/lwip/port/include|${IDF_PATH}/components/lwip/include" + PATCH_COMMAND ${CMAKE_COMMAND} -E echo "Patching config.h for ESP32 target" + BUILD_COMMAND + ${CMAKE_COMMAND} -DCONFIG_H=${open62541_CONFIG_H} -P + ${CMAKE_CURRENT_SOURCE_DIR}/patch_config.cmake + && cmake --build . --target open62541-amalgamation INSTALL_COMMAND "" ) add_dependencies(${COMPONENT_TARGET} open62541_build) -target_compile_options(${COMPONENT_LIB} PUBLIC -DUA_getaddrinfo=custom_getaddrinfo -DUA_ENABLE_AMALGAMATION -DUA_ARCHITECTURE_FREERTOSLWIP -DUA_ARCHITECTURE_FREERTOSLWIP_POSIX_CLOCK) \ No newline at end of file +# Note: UA_getaddrinfo is internally mapped to lwip_getaddrinfo in open62541 v1.5.4. +# The custom_getaddrinfo workaround for ESP32 hostname resolution would need +# a linker-level override (--wrap=lwip_getaddrinfo) if still required. \ No newline at end of file diff --git a/components/open62541/compat_includes/FreeRTOS.h b/components/open62541/compat_includes/FreeRTOS.h new file mode 100644 index 0000000..235f85e --- /dev/null +++ b/components/open62541/compat_includes/FreeRTOS.h @@ -0,0 +1 @@ +#include diff --git a/components/open62541/compat_includes/task.h b/components/open62541/compat_includes/task.h new file mode 100644 index 0000000..2ccfade --- /dev/null +++ b/components/open62541/compat_includes/task.h @@ -0,0 +1 @@ +#include diff --git a/components/open62541/custom_getaddrinfo.c b/components/open62541/custom_getaddrinfo.c index 83b6bf2..47b6f70 100644 --- a/components/open62541/custom_getaddrinfo.c +++ b/components/open62541/custom_getaddrinfo.c @@ -2,6 +2,18 @@ #include #include +#include +#include "sdkconfig.h" + +int gethostname(char *name, size_t len) { +#ifdef CONFIG_ETHERNET_HELPER_CUSTOM_HOSTNAME + strncpy(name, CONFIG_ETHERNET_HELPER_CUSTOM_HOSTNAME_STR, len - 1); +#else + strncpy(name, CONFIG_LWIP_LOCAL_HOSTNAME, len - 1); +#endif + name[len - 1] = '\0'; + return 0; +} int custom_getaddrinfo(const char *nodename, const char *servname, diff --git a/components/open62541/freertos_stub/CMakeLists.txt b/components/open62541/freertos_stub/CMakeLists.txt new file mode 100644 index 0000000..b29489d --- /dev/null +++ b/components/open62541/freertos_stub/CMakeLists.txt @@ -0,0 +1,4 @@ +# Stub for FreeRTOS kernel used during open62541 amalgamation generation. +# The real FreeRTOS is provided by ESP-IDF when cross-compiling for ESP32. +cmake_minimum_required(VERSION 3.16) +add_library(freertos_kernel INTERFACE) diff --git a/components/open62541/no_install.cmake b/components/open62541/no_install.cmake new file mode 100644 index 0000000..8ce51e9 --- /dev/null +++ b/components/open62541/no_install.cmake @@ -0,0 +1,6 @@ +# Override install() and export() for the open62541 ExternalProject build. +# We only need the amalgamation, not a proper CMake install. +macro(install) +endmacro() +macro(export) +endmacro() diff --git a/components/open62541/patch_config.cmake b/components/open62541/patch_config.cmake new file mode 100644 index 0000000..5b4477d --- /dev/null +++ b/components/open62541/patch_config.cmake @@ -0,0 +1,7 @@ +# Patch open62541 config.h to remove host-detected defines not available on ESP32/FreeRTOS +if(EXISTS "${CONFIG_H}") + file(READ "${CONFIG_H}" config_content) + string(REPLACE "#define UA_HAS_GETIFADDR 1" "/* #undef UA_HAS_GETIFADDR (not available on FreeRTOS/ESP32) */" config_content "${config_content}") + file(WRITE "${CONFIG_H}" "${config_content}") + message(STATUS "Patched ${CONFIG_H}: disabled UA_HAS_GETIFADDR") +endif() diff --git a/components/open62541/repo b/components/open62541/repo index 5478e56..dfd44a2 160000 --- a/components/open62541/repo +++ b/components/open62541/repo @@ -1 +1 @@ -Subproject commit 5478e563159ecc3269ccce3d3088135776ca933a +Subproject commit dfd44a234645ed29cc6d190048bc8ae80c5454cd diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 64403fd..85fe5f9 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,15 +1,12 @@ idf_component_register(SRCS "main.c" - PRIV_INCLUDE_DIRS ${IDF_PATH}/components/freertos/include/freertos - REQUIRES open62541 ethernet_helper nvs_flash esp_adc_cal) + REQUIRES open62541 ethernet_helper nvs_flash esp_adc spi_flash) # Build static library, do not build test executables option(BUILD_SHARED_LIBS OFF) option(BUILD_TESTING OFF) # ESP32 is little endian -#add_definitions(-DUA_ENABLE_AMALGAMATION -DUA_ARCHITECTURE_FREERTOSLWIP -DUA_ARCHITECTURE_FREERTOSLWIP_POSIX_CLOCK) -#add_definitions(-Wno-ignored-qualifiers) # Unfortunately the library performs install and export. Would # have been nice if devs made that an option like BUILD_SHARED_LIBS diff --git a/main/idf_component.yml b/main/idf_component.yml new file mode 100644 index 0000000..c084576 --- /dev/null +++ b/main/idf_component.yml @@ -0,0 +1,4 @@ +dependencies: + espressif/mdns: + version: ^1.0.0 + idf: '>=5.0' diff --git a/main/main.c b/main/main.c index 11d0884..160b6af 100644 --- a/main/main.c +++ b/main/main.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -19,7 +20,11 @@ #include "freertos/task.h" #include "esp_netif.h" +#include "esp_chip_info.h" #include "ethernet_helper.h" +#ifdef CONFIG_ETHERNET_HELPER_WIFI +#include "esp_wifi.h" +#endif #ifdef CONFIG_IDF_TARGET_ESP32 #define CHIP_NAME "ESP32" @@ -29,12 +34,12 @@ #define CHIP_NAME "ESP32-S2 Beta" #endif -#ifndef UA_ARCHITECTURE_FREERTOSLWIP -#error UA_ARCHITECTURE_FREERTOSLWIP needs to be defined -#endif - #include +#if !defined(UA_ARCHITECTURE_LWIP) || !defined(UA_ARCHITECTURE_FREERTOS) +#error UA_ARCHITECTURE_LWIP and UA_ARCHITECTURE_FREERTOS need to be defined +#endif + #include #include @@ -54,16 +59,16 @@ RTC_DATA_ATTR static int boot_count = 0; static UA_StatusCode UA_ServerConfig_setUriName(UA_ServerConfig *uaServerConfig, const char *uri, const char *name) { // delete pre-initialized values - UA_String_deleteMembers(&uaServerConfig->applicationDescription.applicationUri); - UA_LocalizedText_deleteMembers(&uaServerConfig->applicationDescription.applicationName); + UA_String_clear(&uaServerConfig->applicationDescription.applicationUri); + UA_LocalizedText_clear(&uaServerConfig->applicationDescription.applicationName); uaServerConfig->applicationDescription.applicationUri = UA_String_fromChars(uri); uaServerConfig->applicationDescription.applicationName.locale = UA_STRING_NULL; uaServerConfig->applicationDescription.applicationName.text = UA_String_fromChars(name); for (size_t i = 0; i < uaServerConfig->endpointsSize; i++) { - UA_String_deleteMembers(&uaServerConfig->endpoints[i].server.applicationUri); - UA_LocalizedText_deleteMembers( + UA_String_clear(&uaServerConfig->endpoints[i].server.applicationUri); + UA_LocalizedText_clear( &uaServerConfig->endpoints[i].server.applicationName); UA_String_copy(&uaServerConfig->applicationDescription.applicationUri, @@ -103,30 +108,21 @@ static void opcua_task(void *arg) { caps[1] = UA_String_fromChars("NA"); config->mdnsConfig.serverCapabilities = caps; - // We need to set the default IP address for mDNS since internally it's not able to detect it. - tcpip_adapter_ip_info_t default_ip; - esp_err_t ret = tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_STA, &default_ip); - if ((ESP_OK == ret) && (default_ip.ip.addr != INADDR_ANY)) { - config->mdnsIpAddressListSize = 1; - config->mdnsIpAddressList = (uint32_t *)UA_malloc(sizeof(uint32_t)*config->mdnsIpAddressListSize); - memcpy(config->mdnsIpAddressList, &default_ip.ip.addr, sizeof(uint32_t)); - } else { - ESP_LOGI(TAG_OPC, "Could not get default IP Address!"); - } #endif UA_ServerConfig_setUriName(config, appUri, "open62541 ESP32 Demo"); #ifndef CONFIG_ETHERNET_HELPER_CUSTOM_HOSTNAME - #ifndef ETHERNET_HELPER_STATIC_IP4 + #ifndef CONFIG_ETHERNET_HELPER_STATIC_IP4 #error You need to set a static IP or a custom hostname with menuconfig #else - UA_String str = UA_STRING(CONFIG_ETHERNET_HELPER_STATIC_IP4_ADDRESS); + #define UA_SERVER_HOSTNAME CONFIG_ETHERNET_HELPER_STATIC_IP4_ADDRESS #endif #else - UA_String str = UA_STRING(CONFIG_ETHERNET_HELPER_CUSTOM_HOSTNAME_STR); + #define UA_SERVER_HOSTNAME CONFIG_ETHERNET_HELPER_CUSTOM_HOSTNAME_STR #endif - UA_String_clear(&config->customHostname); - UA_String_copy(&str, &config->customHostname); + config->serverUrls = (UA_String *)UA_Array_new(1, &UA_TYPES[UA_TYPES_STRING]); + config->serverUrlsSize = 1; + config->serverUrls[0] = UA_STRING_ALLOC("opc.tcp://" UA_SERVER_HOSTNAME ":4840"); printf("xPortGetFreeHeapSize before create = %d bytes\n", xPortGetFreeHeapSize()); @@ -168,10 +164,10 @@ void time_sync_notification_cb(struct timeval *tv) static void initialize_sntp(void) { ESP_LOGI(TAG, "Initializing SNTP"); - sntp_setoperatingmode(SNTP_OPMODE_POLL); - sntp_setservername(0, "pool.ntp.org"); - sntp_set_time_sync_notification_cb(time_sync_notification_cb); - sntp_init(); + esp_sntp_setoperatingmode(SNTP_OPMODE_POLL); + esp_sntp_setservername(0, "pool.ntp.org"); + esp_sntp_set_time_sync_notification_cb(time_sync_notification_cb); + esp_sntp_init(); } static bool obtain_time(void) @@ -185,7 +181,7 @@ static bool obtain_time(void) memset(&timeinfo, 0, sizeof(struct tm)); int retry = 0; const int retry_count = 10; - while (sntp_get_sync_status() == SNTP_SYNC_STATUS_RESET && ++retry <= retry_count) { + while (esp_sntp_get_sync_status() == SNTP_SYNC_STATUS_RESET && ++retry <= retry_count) { ESP_LOGI(TAG, "Waiting for system time to be set... (%d/%d)", retry, retry_count); vTaskDelay(2000 / portTICK_PERIOD_MS); ESP_ERROR_CHECK(esp_task_wdt_reset()); @@ -239,11 +235,11 @@ void app_main(void) (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "", (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : ""); - spi_flash_init(); - printf("silicon revision %d, ", chip_info.revision); - printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024), + uint32_t flash_size = 0; + esp_flash_get_size(NULL, &flash_size); + printf("%dMB %s flash\n", (int)(flash_size / (1024 * 1024)), (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external"); printf("Heap Info:\n"); @@ -259,10 +255,12 @@ void app_main(void) esp_netif_init(); ESP_ERROR_CHECK(esp_event_loop_create_default()); - ESP_ERROR_CHECK(esp_task_wdt_init(10, true)); - // Remove idle tasks from watchdog - ESP_ERROR_CHECK(esp_task_wdt_delete(xTaskGetIdleTaskHandleForCPU(0))); - ESP_ERROR_CHECK(esp_task_wdt_delete(xTaskGetIdleTaskHandleForCPU(1))); + const esp_task_wdt_config_t wdt_config = { + .timeout_ms = 10000, + .idle_core_mask = 0, + .trigger_panic = true, + }; + ESP_ERROR_CHECK(esp_task_wdt_init(&wdt_config)); /* Register event handlers to stop the server when Wi-Fi or Ethernet is disconnected, * and re-start it upon connection. @@ -280,4 +278,4 @@ void app_main(void) ESP_ERROR_CHECK(ethernet_helper_connect()); -} \ No newline at end of file +} diff --git a/nodes_blacklist.txt b/nodes_blacklist.txt deleted file mode 100644 index 3285716..0000000 --- a/nodes_blacklist.txt +++ /dev/null @@ -1,3896 +0,0 @@ -i=79 -i=83 -i=94 -#i=95 -#i=96 -i=97 -i=98 -i=99 -i=100 -i=101 -i=102 -i=104 -i=105 -i=106 -i=107 -i=111 -i=112 -i=113 -i=114 -i=116 -i=117 -i=120 -i=121 -i=122 -i=123 -i=124 -i=125 -i=126 -i=127 -i=128 -i=129 -i=131 -#i=256 -i=257 -i=288 -i=289 -#i=290 -#i=291 -i=292 -i=293 -#i=294 -#i=295 -#i=296 -i=297 -i=298 -i=299 -i=300 -i=301 -i=302 -i=303 -i=304 -i=305 -i=306 -i=307 -i=308 -i=309 -i=310 -i=311 -i=312 -i=313 -i=314 -i=315 -i=316 -i=317 -i=318 -i=319 -i=320 -i=321 -i=322 -i=323 -i=324 -i=325 -i=326 -i=327 -i=331 -i=332 -i=333 -#i=338 -i=339 -i=340 -i=344 -i=345 -i=346 -i=347 -i=348 -i=376 -i=377 -i=378 -i=379 -i=380 -i=381 -i=382 -i=383 -i=384 -i=385 -i=386 -i=387 -i=388 -i=432 -i=433 -i=434 -i=521 -i=537 -i=538 -i=539 -i=540 -i=541 -i=542 -i=576 -i=583 -i=584 -i=585 -i=586 -i=587 -i=588 -i=589 -i=590 -i=591 -i=592 -i=593 -i=594 -i=595 -i=596 -i=597 -i=598 -i=599 -i=600 -i=601 -i=602 -i=603 -i=659 -i=660 -i=661 -i=719 -i=720 -i=721 -i=725 -i=726 -i=727 -#i=851 -#i=852 -i=853 -i=854 -i=855 -i=856 -i=857 -i=858 -#i=859 -i=860 -i=861 -#i=862 -i=863 -i=864 -i=865 -i=866 -i=867 -i=868 -i=869 -i=870 -i=871 -i=872 -i=873 -i=874 -i=875 -i=876 -i=877 -i=878 -i=879 -#i=884 -i=885 -i=886 -i=887 -i=888 -i=889 -i=890 -i=891 -i=892 -i=893 -i=894 -i=895 -i=896 -i=897 -i=898 -i=899 -i=920 -i=921 -i=922 -i=938 -i=939 -i=940 -i=948 -i=949 -i=950 -i=2000 -i=2001 -i=2002 -i=2003 -#i=2004 -#i=2005 -#i=2006 -#i=2007 -i=2008 -i=2009 -i=2010 -i=2011 -i=2012 -#i=2013 -i=2014 -i=2016 -i=2017 -i=2019 -#i=2020 -i=2021 -i=2022 -i=2023 -i=2025 -i=2026 -i=2027 -i=2028 -i=2029 -i=2030 -i=2031 -i=2032 -#i=2033 -#i=2034 -#i=2035 -i=2036 -i=2037 -i=2038 -i=2039 -i=2040 -#i=2041 -#i=2042 -#i=2043 -#i=2044 -#i=2045 -#i=2046 -#i=2047 -#i=2050 -#i=2051 -i=2052 -i=2053 -i=2054 -i=2055 -i=2056 -i=2057 -i=2058 -i=2059 -i=2060 -i=2061 -i=2062 -i=2063 -i=2065 -i=2066 -i=2069 -i=2070 -i=2071 -i=2072 -i=2073 -i=2074 -i=2075 -i=2076 -i=2077 -i=2078 -i=2079 -i=2080 -i=2081 -i=2082 -i=2083 -i=2084 -i=2085 -i=2086 -i=2087 -i=2088 -i=2089 -i=2090 -i=2091 -i=2092 -i=2093 -i=2094 -i=2095 -i=2096 -i=2097 -i=2098 -i=2099 -i=2100 -i=2101 -i=2102 -i=2103 -i=2104 -i=2127 -i=2128 -i=2129 -i=2130 -i=2131 -i=2132 -i=2133 -i=2134 -i=2137 -#i=2138 -#i=2139 -#i=2140 -#i=2141 -#i=2142 -#i=2150 -i=2151 -i=2152 -i=2153 -i=2154 -i=2155 -i=2156 -i=2157 -i=2159 -i=2160 -i=2161 -i=2162 -i=2163 -i=2164 -i=2165 -i=2166 -i=2171 -i=2172 -i=2173 -i=2174 -i=2175 -i=2176 -i=2177 -i=2179 -i=2180 -i=2181 -i=2182 -i=2183 -i=2184 -i=2185 -i=2186 -i=2187 -i=2188 -i=2189 -i=2190 -i=2191 -i=2193 -i=2196 -i=2197 -i=2198 -i=2199 -i=2200 -i=2201 -i=2202 -i=2203 -i=2204 -i=2205 -i=2206 -i=2207 -i=2208 -i=2209 -i=2217 -i=2218 -i=2219 -i=2220 -i=2221 -i=2222 -i=2223 -i=2224 -i=2225 -i=2226 -i=2227 -i=2228 -i=2229 -i=2230 -i=2231 -i=2232 -i=2233 -i=2234 -i=2235 -i=2236 -i=2237 -i=2238 -i=2239 -i=2240 -i=2241 -i=2242 -i=2243 -i=2244 -i=2245 -i=2246 -i=2247 -i=2248 -i=2249 -i=2250 -i=2251 -i=2252 -#i=2253 -#i=2254 -#i=2255 -#i=2256 -#i=2257 -#i=2258 -#i=2259 -#i=2260 -#i=2261 -#i=2262 -#i=2263 -#i=2264 -#i=2265 -#i=2266 -#i=2267 -#i=2268 -#i=2269 -#i=2271 -#i=2272 -#i=2274 -#i=2275 -i=2276 -i=2277 -i=2278 -i=2279 -i=2281 -i=2282 -i=2284 -i=2285 -i=2286 -i=2287 -i=2288 -i=2289 -i=2290 -#i=2294 -#i=2295 -#i=2296 -#i=2299 -#i=2307 -i=2308 -i=2309 -#i=2310 -#i=2311 -i=2312 -i=2315 -i=2318 -i=2323 -i=2324 -i=2325 -i=2326 -i=2327 -i=2328 -i=2330 -i=2331 -i=2332 -i=2334 -i=2335 -i=2336 -i=2337 -i=2338 -i=2340 -i=2341 -i=2342 -i=2343 -i=2344 -i=2346 -i=2347 -i=2348 -i=2349 -i=2350 -i=2351 -i=2352 -i=2355 -i=2357 -i=2358 -i=2359 -i=2360 -i=2361 -i=2362 -i=2363 -i=2364 -#i=2365 -i=2366 -i=2367 -#i=2368 -#i=2369 -i=2372 -i=2373 -i=2374 -i=2375 -i=2376 -i=2377 -#i=2378 -#i=2379 -i=2380 -i=2381 -i=2382 -i=2383 -i=2384 -i=2385 -i=2386 -i=2387 -i=2388 -i=2389 -i=2390 -#i=2391 -#i=2392 -#i=2393 -#i=2394 -#i=2395 -#i=2396 -#i=2397 -#i=2398 -i=2399 -#i=2400 -#i=2401 -#i=2402 -#i=2403 -#i=2404 -#i=2405 -#i=2406 -#i=2407 -#i=2408 -#i=2409 -#i=2410 -#i=2411 -#i=2412 -#i=2413 -#i=2414 -#i=2415 -#i=2416 -#i=2417 -#i=2418 -#i=2419 -#i=2420 -#i=2421 -#i=2422 -#i=2423 -#i=2424 -#i=2425 -#i=2426 -#i=2427 -#i=2428 -#i=2429 -#i=2430 -i=2730 -i=2731 -i=2732 -i=2733 -i=2734 -#i=2735 -#i=2736 -#i=2737 -i=2738 -i=2739 -i=2742 -i=2744 -i=2745 -i=2746 -i=2747 -i=2748 -i=2749 -i=2750 -i=2751 -i=2752 -i=2753 -i=2754 -#i=2755 -#i=2756 -#i=2757 -#i=2758 -#i=2759 -#i=2760 -#i=2761 -#i=2762 -#i=2763 -#i=2764 -#i=2765 -#i=2766 -#i=2767 -#i=2768 -#i=2769 -#i=2770 -#i=2771 -#i=2772 -#i=2773 -#i=2774 -#i=2775 -#i=2776 -i=2777 -i=2778 -i=2782 -i=2787 -i=2788 -i=2789 -i=2790 -i=2803 -i=2829 -i=2830 -i=2831 -i=2881 -i=2915 -i=2929 -i=2930 -i=2932 -i=2933 -i=2935 -i=2936 -i=2940 -i=2942 -i=2943 -i=2945 -i=2947 -i=2948 -i=2949 -i=2955 -i=2991 -#i=2992 -#i=2993 -#i=2994 -i=2996 -i=2997 -i=2998 -i=2999 -i=3003 -i=3006 -i=3012 -i=3014 -i=3015 -i=3016 -i=3017 -i=3019 -i=3020 -i=3021 -i=3022 -i=3023 -i=3024 -i=3025 -i=3026 -i=3027 -i=3028 -i=3029 -i=3030 -i=3031 -i=3032 -i=3033 -i=3034 -#i=3035 -i=3048 -i=3049 -i=3050 -#i=3051 -#i=3052 -#i=3053 -#i=3054 -#i=3055 -#i=3056 -#i=3057 -i=3058 -i=3059 -i=3062 -i=3063 -i=3065 -i=3067 -i=3068 -i=3069 -i=3070 -i=3071 -i=3072 -i=3073 -#i=3074 -#i=3075 -#i=3076 -#i=3077 -#i=3078 -#i=3079 -#i=3080 -#i=3081 -#i=3082 -#i=3083 -i=3084 -i=3085 -i=3086 -i=3087 -i=3088 -i=3089 -i=3090 -i=3091 -i=3092 -i=3093 -i=3094 -i=3095 -i=3096 -i=3097 -i=3098 -i=3099 -i=3100 -i=3101 -i=3102 -i=3104 -i=3105 -i=3106 -i=3107 -i=3108 -i=3110 -i=3111 -i=3112 -i=3113 -i=3114 -i=3115 -i=3116 -i=3117 -i=3118 -i=3119 -i=3120 -i=3121 -i=3122 -i=3124 -i=3125 -i=3126 -i=3127 -i=3128 -i=3129 -i=3130 -i=3131 -i=3132 -i=3133 -i=3134 -i=3135 -i=3136 -i=3137 -i=3138 -i=3139 -i=3140 -i=3141 -i=3142 -i=3143 -i=3151 -i=3152 -i=3153 -i=3154 -i=3155 -i=3156 -i=3157 -i=3158 -i=3159 -i=3160 -i=3161 -i=3162 -i=3163 -i=3164 -i=3165 -i=3166 -i=3167 -i=3168 -i=3169 -i=3170 -i=3171 -i=3172 -i=3173 -i=3174 -i=3175 -i=3176 -i=3177 -i=3178 -i=3179 -i=3180 -i=3181 -i=3182 -i=3183 -i=3184 -i=3185 -i=3186 -i=3187 -#i=3190 -i=3698 -i=3699 -i=3700 -i=3701 -i=3702 -i=3703 -i=3704 -i=3705 -i=3706 -i=3707 -i=3708 -#i=3709 -#i=3720 -#i=3724 -#i=3728 -#i=3732 -#i=3746 -#i=3750 -#i=3754 -i=3806 -i=3825 -i=3826 -#i=3830 -i=3831 -i=3833 -#i=3835 -i=3836 -i=3838 -i=3839 -i=3840 -i=3841 -i=3842 -i=3843 -i=3844 -i=3845 -i=3846 -i=3847 -i=3848 -i=3849 -#i=3850 -i=3874 -i=3875 -i=3876 -i=6098 -i=6100 -i=6101 -i=7591 -i=7594 -i=7595 -i=7596 -i=7597 -i=7598 -i=7605 -i=7611 -i=7612 -i=7614 -i=7616 -i=7617 -i=7619 -i=7650 -i=7656 -i=7659 -i=7662 -i=7665 -i=7668 -i=7671 -i=7674 -i=7677 -i=7680 -i=7683 -i=7686 -i=7692 -i=7698 -i=7728 -i=7731 -i=7734 -i=7737 -i=7782 -i=7929 -i=7932 -i=7935 -i=7938 -i=7941 -i=7944 -i=7947 -i=8004 -i=8067 -i=8073 -i=8076 -i=8172 -i=8208 -i=8211 -i=8214 -i=8217 -i=8220 -i=8223 -i=8226 -i=8229 -i=8232 -i=8235 -i=8238 -i=8241 -i=8244 -i=8247 -i=8251 -i=8252 -i=8254 -i=8285 -i=8291 -i=8294 -i=8297 -i=8300 -i=8303 -i=8306 -i=8309 -i=8312 -i=8315 -i=8318 -i=8321 -i=8327 -i=8333 -i=8363 -i=8366 -i=8369 -i=8372 -i=8417 -i=8564 -i=8567 -i=8570 -i=8573 -i=8576 -i=8579 -i=8582 -i=8639 -i=8702 -i=8708 -i=8711 -i=8807 -i=8843 -i=8846 -i=8849 -i=8852 -i=8855 -i=8858 -i=8861 -i=8864 -i=8867 -i=8870 -i=8873 -i=8876 -i=8879 -i=8882 -i=8888 -i=8889 -i=8890 -i=8891 -i=8892 -i=8893 -i=8894 -i=8895 -i=8896 -i=8897 -i=8898 -i=8900 -i=8902 -#i=8912 -i=8913 -i=8914 -i=8917 -i=8918 -i=8927 -i=8944 -i=8961 -i=8995 -i=8996 -i=9000 -i=9001 -i=9002 -i=9003 -i=9004 -i=9005 -i=9006 -i=9009 -i=9010 -i=9011 -i=9012 -i=9015 -i=9016 -i=9017 -i=9018 -i=9019 -i=9020 -i=9021 -i=9022 -i=9023 -i=9024 -i=9025 -i=9026 -i=9027 -i=9028 -i=9029 -i=9030 -i=9035 -i=9036 -i=9055 -i=9056 -i=9060 -i=9062 -i=9063 -i=9064 -i=9065 -i=9066 -i=9067 -i=9068 -i=9069 -i=9070 -i=9073 -i=9074 -i=9093 -i=9094 -i=9098 -i=9100 -i=9101 -i=9102 -i=9103 -i=9107 -i=9109 -i=9110 -i=9111 -i=9112 -i=9113 -i=9114 -i=9115 -i=9118 -i=9119 -i=9160 -i=9161 -i=9164 -i=9165 -i=9166 -i=9167 -i=9168 -i=9169 -i=9170 -i=9174 -i=9176 -i=9177 -i=9178 -i=9179 -i=9180 -i=9184 -i=9185 -i=9188 -i=9189 -i=9211 -i=9212 -i=9213 -i=9214 -i=9215 -i=9216 -i=9318 -i=9329 -i=9330 -i=9331 -i=9332 -i=9333 -i=9334 -i=9335 -i=9336 -i=9337 -i=9338 -i=9339 -i=9340 -i=9341 -i=9398 -i=9399 -i=9455 -i=9456 -i=9457 -i=9461 -i=9462 -i=9465 -i=9482 -i=9623 -i=9764 -i=9905 -i=9906 -i=9963 -i=9964 -i=10020 -i=10021 -i=10025 -i=10027 -i=10028 -i=10029 -i=10030 -i=10034 -i=10036 -i=10037 -i=10038 -i=10039 -i=10043 -i=10045 -i=10046 -i=10047 -i=10048 -i=10052 -i=10054 -i=10055 -i=10060 -i=10214 -i=10368 -i=10522 -i=10523 -i=10637 -i=10751 -i=11093 -i=11110 -i=11111 -i=11112 -i=11113 -i=11120 -i=11124 -i=11125 -i=11126 -i=11127 -i=11158 -i=11163 -i=11164 -i=11165 -i=11166 -i=11168 -i=11169 -i=11170 -i=11171 -i=11172 -i=11187 -i=11188 -i=11189 -i=11190 -i=11191 -i=11192 -i=11193 -i=11196 -i=11197 -i=11198 -i=11199 -i=11200 -i=11201 -i=11202 -i=11203 -i=11204 -i=11205 -i=11206 -i=11207 -i=11208 -i=11214 -i=11215 -i=11234 -i=11238 -i=11241 -i=11242 -i=11268 -i=11269 -i=11270 -i=11273 -i=11274 -i=11275 -i=11278 -i=11279 -i=11280 -i=11281 -i=11282 -i=11283 -i=11285 -i=11286 -i=11287 -i=11288 -i=11292 -i=11293 -i=11304 -i=11305 -i=11306 -i=11307 -i=11308 -i=11312 -i=11313 -i=11314 -i=11322 -i=11323 -i=11324 -i=11325 -i=11326 -i=11327 -i=11340 -i=11341 -i=11342 -i=11343 -i=11426 -i=11427 -i=11428 -i=11429 -i=11432 -i=11433 -i=11436 -i=11446 -i=11456 -i=11461 -i=11485 -i=11487 -i=11488 -i=11489 -i=11490 -i=11491 -#i=11492 -i=11493 -i=11494 -i=11498 -i=11499 -i=11500 -i=11501 -i=11502 -i=11505 -i=11506 -i=11507 -i=11508 -i=11509 -i=11510 -i=11511 -i=11512 -i=11513 -i=11527 -i=11549 -i=11550 -#i=11551 -i=11562 -#i=11564 -i=11565 -i=11567 -i=11569 -i=11570 -i=11571 -i=11572 -i=11573 -i=11574 -i=11575 -i=11576 -i=11579 -i=11580 -i=11581 -i=11582 -i=11583 -i=11584 -i=11585 -i=11586 -i=11587 -i=11588 -i=11589 -i=11590 -i=11591 -i=11592 -i=11593 -i=11594 -i=11595 -i=11615 -#i=11616 -i=11617 -i=11618 -i=11619 -i=11620 -i=11621 -i=11622 -i=11623 -i=11624 -i=11625 -i=11628 -i=11629 -i=11630 -i=11631 -i=11632 -i=11633 -i=11634 -i=11635 -i=11636 -i=11637 -i=11638 -i=11639 -i=11640 -i=11641 -i=11642 -i=11643 -#i=11645 -i=11646 -i=11647 -i=11648 -i=11649 -i=11650 -i=11651 -i=11652 -i=11653 -i=11696 -i=11697 -i=11698 -i=11699 -i=11701 -i=11702 -i=11703 -#i=11704 -#i=11705 -#i=11707 -#i=11709 -#i=11710 -#i=11711 -#i=11712 -#i=11713 -#i=11714 -#i=11715 -i=11737 -i=11753 -i=11851 -i=11852 -i=11853 -i=11854 -i=11855 -i=11856 -i=11875 -i=11876 -i=11878 -i=11881 -i=11884 -i=11885 -i=11891 -i=11892 -i=11939 -i=11940 -i=11943 -i=11944 -i=11945 -i=11948 -i=11949 -i=11950 -i=11951 -i=11954 -i=11957 -i=11958 -i=11959 -i=11962 -i=12021 -i=12024 -i=12025 -i=12026 -i=12027 -i=12028 -i=12029 -i=12037 -i=12038 -i=12046 -i=12047 -i=12055 -i=12056 -i=12057 -i=12065 -i=12066 -i=12067 -i=12068 -i=12076 -i=12077 -i=12078 -i=12079 -i=12080 -i=12081 -i=12082 -i=12083 -i=12086 -i=12089 -i=12090 -i=12091 -i=12094 -i=12097 -i=12098 -i=12099 -i=12100 -i=12101 -i=12102 -i=12103 -i=12104 -i=12105 -i=12106 -i=12107 -i=12108 -i=12109 -i=12110 -i=12111 -i=12112 -i=12113 -i=12114 -i=12115 -i=12116 -i=12117 -i=12118 -i=12119 -i=12120 -i=12121 -i=12122 -i=12123 -i=12124 -i=12125 -i=12126 -i=12127 -i=12128 -i=12129 -i=12130 -i=12131 -i=12132 -i=12133 -i=12134 -i=12135 -i=12136 -i=12137 -i=12138 -i=12139 -i=12140 -i=12141 -i=12142 -i=12143 -i=12144 -i=12145 -i=12146 -i=12147 -i=12148 -i=12149 -i=12150 -i=12151 -i=12152 -i=12161 -i=12162 -i=12163 -i=12164 -i=12165 -i=12166 -i=12167 -i=12168 -i=12169 -i=12170 -i=12171 -i=12172 -i=12173 -i=12174 -i=12175 -i=12178 -i=12181 -i=12182 -i=12183 -i=12186 -i=12189 -i=12195 -i=12201 -i=12207 -i=12213 -i=12502 -i=12503 -i=12522 -i=12542 -i=12543 -i=12544 -i=12545 -i=12546 -i=12547 -i=12548 -i=12549 -i=12550 -i=12551 -i=12552 -i=12553 -i=12554 -i=12555 -i=12556 -i=12557 -i=12558 -i=12559 -i=12560 -i=12561 -i=12581 -i=12583 -i=12584 -i=12585 -i=12616 -i=12617 -i=12618 -i=12620 -i=12637 -i=12639 -i=12640 -i=12641 -i=12642 -i=12643 -i=12646 -i=12647 -i=12648 -i=12649 -i=12650 -i=12651 -i=12652 -i=12653 -i=12654 -i=12655 -i=12656 -i=12657 -i=12658 -i=12659 -i=12660 -i=12661 -i=12662 -i=12663 -i=12664 -i=12665 -i=12666 -i=12667 -i=12668 -i=12669 -i=12670 -i=12671 -i=12676 -i=12677 -i=12680 -i=12681 -i=12686 -i=12687 -i=12690 -i=12691 -i=12705 -i=12708 -i=12710 -i=12712 -i=12715 -i=12718 -i=12721 -i=12731 -i=12732 -i=12733 -i=12734 -i=12737 -i=12738 -i=12739 -i=12740 -i=12745 -i=12746 -i=12747 -i=12748 -i=12749 -i=12750 -i=12751 -i=12755 -i=12756 -i=12757 -i=12758 -i=12759 -i=12762 -i=12765 -i=12766 -i=12767 -i=12770 -i=12775 -i=12776 -i=12777 -i=12778 -i=12779 -i=12780 -i=12781 -i=12782 -i=12783 -i=12784 -i=12785 -i=12786 -i=12787 -i=12788 -i=12789 -i=12790 -i=12791 -i=12792 -i=12793 -i=12794 -i=12795 -i=12796 -i=12797 -i=12798 -i=12799 -i=12800 -i=12801 -i=12802 -i=12803 -i=12804 -i=12805 -i=12806 -i=12807 -i=12808 -i=12809 -i=12810 -i=12811 -i=12812 -i=12813 -i=12814 -i=12815 -i=12816 -i=12817 -i=12818 -i=12819 -i=12820 -i=12821 -i=12822 -i=12823 -i=12824 -i=12825 -i=12826 -i=12827 -i=12828 -i=12829 -i=12830 -i=12831 -i=12832 -i=12833 -i=12834 -i=12835 -i=12836 -i=12837 -i=12838 -i=12839 -i=12840 -i=12841 -i=12842 -i=12843 -i=12844 -i=12845 -i=12846 -i=12847 -i=12848 -i=12849 -i=12850 -i=12851 -i=12852 -i=12853 -i=12854 -i=12855 -i=12856 -i=12857 -i=12858 -i=12859 -i=12860 -i=12861 -i=12862 -i=12863 -i=12864 -i=12865 -i=12866 -i=12867 -i=12868 -i=12869 -i=12871 -i=12872 -i=12873 -i=12874 -i=12877 -i=12878 -i=12879 -i=12880 -i=12881 -i=12882 -i=12883 -i=12884 -i=12885 -i=12886 -i=12887 -i=12890 -i=12891 -i=12892 -i=12893 -i=12894 -i=12897 -i=12900 -i=12901 -i=12902 -i=12905 -i=12908 -i=12910 -i=12911 -i=12912 -i=12913 -i=13225 -i=13325 -i=13326 -i=13327 -i=13341 -i=13353 -i=13354 -i=13355 -i=13356 -i=13357 -i=13358 -i=13359 -i=13360 -i=13363 -i=13364 -i=13365 -i=13366 -i=13367 -i=13368 -i=13369 -i=13370 -i=13372 -i=13373 -i=13374 -i=13375 -i=13376 -i=13377 -i=13378 -i=13379 -i=13380 -i=13381 -i=13382 -i=13383 -i=13384 -i=13385 -i=13386 -i=13387 -i=13388 -i=13389 -i=13390 -i=13391 -i=13392 -i=13393 -i=13394 -i=13395 -i=13396 -i=13397 -i=13599 -i=13600 -i=13601 -i=13602 -i=13603 -i=13605 -i=13606 -i=13607 -i=13608 -i=13609 -i=13610 -i=13611 -i=13612 -i=13613 -i=13614 -i=13615 -i=13616 -i=13617 -i=13618 -i=13619 -i=13620 -i=13621 -i=13622 -i=13623 -i=13631 -i=13735 -i=13736 -i=13737 -i=13738 -i=13739 -i=13813 -i=13814 -i=13815 -i=13816 -i=13817 -i=13818 -i=13819 -i=13821 -i=13822 -i=13823 -i=13824 -i=13825 -i=13826 -i=13827 -i=13828 -i=13829 -i=13830 -i=13831 -i=13832 -i=13833 -i=13834 -i=13835 -i=13836 -i=13837 -i=13838 -i=13839 -i=13847 -i=13848 -i=13849 -i=13850 -i=13851 -i=13852 -i=13853 -i=13855 -i=13856 -i=13857 -i=13858 -i=13859 -i=13860 -i=13861 -i=13862 -i=13863 -i=13864 -i=13865 -i=13866 -i=13867 -i=13868 -i=13869 -i=13870 -i=13871 -i=13872 -i=13873 -i=13881 -i=13882 -i=13883 -i=13884 -i=13885 -i=13886 -i=13887 -i=13889 -i=13890 -i=13891 -i=13892 -i=13893 -i=13894 -i=13895 -i=13896 -i=13897 -i=13898 -i=13899 -i=13900 -i=13901 -i=13902 -i=13903 -i=13904 -i=13905 -i=13906 -i=13907 -i=13915 -i=13916 -i=13917 -i=13918 -i=13919 -i=13920 -i=13921 -i=13923 -i=13924 -i=13925 -i=13926 -i=13927 -i=13928 -i=13929 -i=13930 -i=13931 -i=13932 -i=13933 -i=13934 -i=13935 -i=13936 -i=13937 -i=13938 -i=13939 -i=13940 -i=13941 -i=13949 -i=13950 -i=13951 -i=13952 -i=13953 -i=13954 -i=13955 -i=13956 -i=13958 -i=13959 -i=13960 -i=13961 -i=13962 -i=13963 -i=13964 -i=13965 -i=13966 -i=13967 -i=13968 -i=13969 -i=13970 -i=13971 -i=13972 -i=13973 -i=13974 -i=13975 -i=13976 -i=13984 -i=14053 -i=14088 -i=14089 -i=14090 -i=14091 -i=14092 -i=14093 -i=14095 -i=14096 -i=14097 -i=14098 -i=14099 -i=14100 -i=14101 -i=14102 -i=14103 -i=14104 -i=14105 -i=14106 -i=14107 -i=14108 -i=14109 -i=14110 -i=14111 -i=14112 -i=14113 -i=14114 -i=14115 -i=14116 -i=14117 -i=14118 -i=14119 -i=14120 -i=14121 -i=14122 -i=14123 -i=14124 -i=14125 -i=14126 -i=14127 -i=14129 -i=14130 -i=14131 -i=14132 -i=14133 -i=14134 -i=14135 -i=14136 -i=14137 -i=14138 -i=14139 -i=14140 -i=14141 -i=14142 -i=14143 -i=14144 -i=14145 -i=14146 -i=14147 -i=14148 -i=14149 -i=14150 -i=14151 -i=14152 -i=14153 -i=14154 -i=14155 -i=14156 -i=14157 -i=14158 -i=14160 -i=14161 -i=14209 -i=14221 -i=14225 -i=14226 -i=14232 -i=14273 -i=14319 -i=14320 -i=14323 -i=14324 -i=14415 -i=14416 -i=14417 -i=14418 -i=14419 -i=14420 -i=14423 -i=14432 -i=14433 -i=14434 -i=14443 -i=14476 -i=14477 -i=14478 -i=14479 -i=14480 -i=14481 -i=14482 -i=14483 -i=14484 -i=14485 -i=14486 -i=14487 -i=14489 -i=14493 -i=14494 -i=14495 -i=14496 -i=14497 -i=14498 -i=14499 -i=14500 -i=14509 -i=14519 -i=14523 -i=14524 -i=14525 -i=14528 -i=14533 -i=14534 -i=14548 -i=14555 -i=14556 -i=14557 -i=14558 -i=14559 -i=14560 -i=14572 -i=14586 -i=14587 -i=14588 -i=14593 -i=14595 -i=14600 -i=14601 -i=14643 -i=14644 -i=14645 -i=14646 -i=14647 -i=14648 -i=14744 -i=14794 -i=14795 -i=14796 -i=14797 -i=14798 -i=14799 -i=14800 -i=14801 -i=14802 -i=14803 -i=14804 -i=14805 -i=14808 -i=14811 -i=14826 -i=14829 -i=14832 -i=14835 -i=14839 -i=14844 -i=14845 -i=14846 -i=14847 -i=14848 -i=14849 -i=14852 -i=14855 -i=14870 -i=14873 -i=14876 -i=14900 -i=14936 -i=15001 -i=15002 -i=15003 -i=15005 -i=15006 -i=15007 -i=15008 -i=15009 -i=15010 -i=15011 -i=15012 -i=15013 -i=15030 -i=15031 -i=15032 -i=15033 -i=15034 -i=15035 -i=15036 -i=15037 -i=15038 -i=15039 -i=15040 -i=15041 -i=15042 -i=15043 -i=15044 -i=15046 -i=15047 -i=15048 -i=15049 -i=15050 -i=15051 -i=15052 -i=15053 -i=15056 -i=15057 -i=15058 -i=15059 -i=15060 -i=15061 -i=15062 -i=15063 -i=15064 -i=15065 -i=15066 -i=15067 -i=15072 -i=15081 -i=15082 -i=15083 -i=15084 -i=15085 -i=15086 -i=15087 -i=15095 -i=15098 -i=15099 -i=15102 -i=15105 -i=15106 -i=15108 -i=15109 -i=15111 -i=15112 -i=15113 -i=15114 -i=15115 -i=15116 -i=15117 -i=15118 -i=15119 -i=15120 -i=15127 -i=15128 -i=15129 -i=15136 -i=15140 -i=15141 -i=15142 -i=15143 -i=15144 -i=15154 -i=15155 -i=15156 -i=15165 -i=15169 -i=15172 -i=15175 -i=15178 -i=15181 -i=15188 -i=15189 -i=15199 -i=15204 -i=15205 -i=15206 -i=15207 -i=15208 -i=15209 -i=15210 -i=15215 -i=15216 -i=15217 -i=15221 -i=15222 -i=15223 -i=15224 -i=15229 -i=15246 -i=15247 -i=15249 -i=15250 -i=15251 -i=15265 -i=15266 -i=15273 -i=15293 -i=15295 -i=15296 -i=15297 -i=15298 -i=15299 -i=15300 -i=15303 -i=15304 -i=15305 -i=15306 -i=15307 -i=15308 -i=15311 -i=15316 -i=15317 -#i=15318 -i=15319 -i=15330 -i=15334 -i=15349 -i=15361 -i=15362 -i=15363 -i=15364 -i=15365 -i=15366 -i=15367 -i=15368 -i=15369 -i=15370 -i=15371 -i=15372 -i=15373 -i=15374 -i=15375 -i=15376 -i=15377 -i=15378 -i=15379 -i=15380 -i=15381 -i=15382 -i=15383 -i=15384 -i=15385 -i=15386 -i=15387 -i=15388 -i=15389 -i=15390 -i=15391 -i=15392 -i=15393 -i=15394 -i=15395 -i=15396 -i=15397 -i=15398 -i=15401 -i=15402 -i=15405 -i=15406 -i=15407 -i=15410 -i=15411 -i=15412 -i=15413 -i=15414 -i=15415 -i=15416 -i=15417 -i=15418 -i=15419 -i=15420 -i=15421 -i=15422 -i=15423 -i=15424 -i=15425 -i=15426 -i=15427 -i=15428 -i=15429 -i=15430 -i=15440 -i=15441 -i=15442 -i=15443 -i=15444 -i=15445 -i=15446 -i=15447 -i=15448 -i=15452 -i=15453 -i=15454 -i=15455 -i=15456 -i=15457 -i=15458 -i=15459 -i=15460 -i=15461 -i=15462 -i=15463 -i=15464 -i=15465 -i=15471 -i=15472 -i=15479 -i=15480 -i=15481 -i=15482 -i=15483 -i=15484 -i=15485 -i=15486 -i=15487 -i=15488 -i=15489 -i=15490 -i=15491 -i=15492 -i=15493 -i=15494 -i=15495 -i=15501 -i=15502 -i=15510 -i=15517 -i=15520 -i=15521 -i=15524 -i=15527 -i=15528 -i=15529 -i=15530 -i=15531 -i=15532 -i=15533 -i=15534 -i=15535 -i=15545 -i=15546 -i=15547 -i=15548 -i=15561 -i=15562 -i=15563 -i=15576 -i=15577 -i=15578 -i=15579 -i=15580 -i=15581 -i=15582 -i=15583 -i=15584 -i=15585 -i=15588 -i=15589 -i=15590 -i=15591 -i=15594 -i=15597 -i=15598 -i=15599 -i=15602 -i=15605 -i=15606 -i=15607 -i=15608 -i=15609 -i=15611 -i=15616 -i=15617 -i=15618 -i=15620 -i=15621 -i=15622 -i=15623 -i=15624 -i=15625 -i=15626 -i=15627 -i=15628 -i=15629 -i=15630 -i=15631 -i=15632 -i=15633 -i=15634 -i=15635 -i=15640 -i=15641 -i=15642 -i=15643 -i=15644 -i=15645 -i=15646 -i=15647 -i=15648 -i=15649 -i=15650 -i=15651 -i=15652 -i=15653 -i=15654 -i=15655 -i=15656 -i=15657 -i=15658 -i=15659 -i=15660 -i=15661 -i=15662 -i=15663 -i=15664 -i=15665 -i=15667 -i=15668 -i=15669 -i=15670 -i=15671 -i=15672 -i=15673 -i=15674 -i=15675 -i=15676 -i=15677 -i=15678 -i=15679 -i=15680 -i=15681 -i=15682 -i=15683 -i=15684 -i=15685 -i=15686 -i=15687 -i=15688 -i=15689 -i=15691 -i=15692 -i=15693 -i=15694 -i=15695 -i=15696 -i=15697 -i=15698 -i=15699 -i=15700 -i=15701 -i=15702 -i=15703 -i=15704 -i=15705 -i=15706 -i=15707 -i=15708 -i=15709 -i=15710 -i=15711 -i=15712 -i=15713 -i=15714 -i=15715 -i=15716 -i=15717 -i=15718 -i=15719 -i=15720 -i=15721 -i=15722 -i=15723 -i=15724 -i=15725 -i=15726 -i=15727 -i=15728 -i=15729 -i=15730 -i=15733 -i=15734 -i=15736 -i=15738 -i=15741 -i=15744 -i=15745 -i=15746 -i=15747 -i=15748 -i=15749 -i=15750 -i=15751 -i=15752 -i=15753 -i=15754 -i=15755 -i=15756 -i=15766 -i=15769 -i=15772 -i=15775 -i=15778 -i=15781 -i=15784 -i=15787 -i=15793 -i=15794 -i=15803 -i=15815 -i=15816 -i=15817 -i=15818 -i=15819 -i=15820 -i=15821 -i=15822 -i=15823 -i=15824 -i=15825 -i=15826 -i=15827 -i=15828 -i=15829 -i=15830 -i=15831 -i=15832 -i=15833 -i=15834 -i=15835 -i=15836 -i=15837 -i=15838 -i=15839 -i=15840 -i=15841 -i=15842 -i=15843 -i=15844 -i=15845 -i=15854 -i=15857 -i=15860 -i=15866 -i=15869 -i=15872 -i=15874 -i=15875 -i=15877 -i=15880 -i=15883 -i=15886 -i=15889 -i=15895 -i=15898 -i=15904 -i=15906 -i=15907 -i=15908 -i=15909 -i=15910 -i=15911 -i=15912 -i=15913 -i=15914 -i=15915 -i=15916 -i=15917 -i=15918 -i=15919 -i=15922 -i=15925 -i=15926 -i=15927 -i=15928 -i=15931 -i=15932 -i=15933 -i=15934 -i=15940 -i=15943 -i=15946 -i=15949 -i=15950 -i=15951 -i=15952 -i=15953 -i=15954 -i=15955 -i=15956 -i=15957 -i=15958 -i=15959 -i=15960 -i=15961 -i=15962 -i=15963 -i=15964 -i=15987 -i=15988 -i=15990 -i=15991 -i=15992 -i=15993 -i=15995 -i=15996 -i=15997 -i=15998 -i=15999 -i=16000 -i=16001 -i=16007 -i=16008 -i=16009 -i=16010 -i=16011 -i=16012 -i=16014 -i=16015 -i=16016 -i=16017 -i=16018 -i=16019 -i=16021 -i=16022 -i=16023 -i=16024 -i=16027 -i=16030 -i=16033 -i=16036 -i=16037 -i=16040 -i=16041 -i=16042 -i=16043 -i=16044 -i=16047 -i=16050 -i=16053 -i=16056 -i=16062 -i=16065 -i=16068 -i=16071 -i=16077 -i=16080 -i=16083 -i=16086 -i=16089 -i=16092 -i=16095 -i=16098 -i=16104 -i=16107 -i=16110 -i=16113 -i=16116 -i=16119 -i=16125 -i=16126 -i=16127 -i=16131 -i=16134 -i=16135 -i=16136 -i=16137 -i=16138 -i=16139 -i=16144 -i=16147 -i=16150 -i=16151 -i=16152 -i=16153 -i=16154 -i=16155 -i=16156 -i=16157 -i=16158 -i=16159 -i=16161 -i=16162 -i=16173 -i=16174 -i=16175 -i=16176 -i=16177 -i=16178 -i=16179 -i=16180 -i=16181 -i=16182 -i=16183 -i=16192 -i=16193 -i=16194 -i=16195 -i=16196 -i=16197 -i=16198 -i=16199 -i=16200 -i=16201 -i=16202 -i=16203 -i=16204 -i=16205 -i=16206 -i=16207 -i=16208 -i=16209 -i=16210 -i=16211 -i=16212 -i=16213 -i=16214 -i=16215 -i=16216 -i=16217 -i=16218 -i=16219 -i=16220 -i=16221 -i=16222 -i=16223 -i=16224 -i=16225 -i=16226 -i=16227 -i=16228 -i=16229 -i=16230 -i=16231 -i=16232 -i=16233 -i=16234 -i=16235 -i=16236 -i=16237 -i=16238 -i=16239 -i=16240 -i=16241 -i=16242 -i=16243 -i=16244 -i=16245 -i=16246 -i=16247 -i=16248 -i=16249 -i=16250 -i=16251 -i=16252 -i=16253 -i=16254 -i=16255 -i=16256 -i=16257 -i=16258 -i=16259 -i=16260 -i=16261 -i=16262 -i=16263 -i=16264 -i=16265 -i=16266 -i=16267 -i=16268 -i=16269 -i=16270 -i=16271 -i=16272 -i=16273 -i=16274 -i=16275 -i=16276 -i=16277 -i=16278 -i=16279 -i=16280 -i=16281 -i=16282 -i=16284 -i=16285 -i=16286 -i=16287 -i=16288 -i=16295 -i=16296 -i=16297 -i=16298 -i=16299 -i=16300 -i=16301 -i=16302 -i=16303 -i=16304 -i=16305 -i=16306 -i=16307 -i=16308 -i=16309 -i=16310 -i=16311 -i=16312 -i=16314 -i=16323 -i=16348 -i=16349 -i=16350 -i=16351 -i=16352 -i=16353 -i=16354 -i=16355 -i=16356 -i=16357 -i=16358 -i=16359 -i=16361 -i=16362 -i=16363 -i=16364 -i=16371 -i=16372 -i=16376 -i=16378 -i=16379 -i=16380 -i=16381 -i=16385 -i=16387 -i=16388 -i=16389 -i=16390 -i=16391 -i=16392 -i=16393 -i=16394 -i=16395 -i=16396 -i=16397 -i=16398 -i=16399 -i=16400 -i=16401 -i=16402 -i=16403 -i=16404 -i=16405 -i=16406 -i=16407 -i=16408 -i=16409 -i=16410 -i=16411 -i=16412 -i=16414 -i=16415 -i=16416 -i=16417 -i=16420 -i=16421 -i=16422 -i=16423 -i=16424 -i=16432 -i=16433 -i=16434 -i=16435 -i=16436 -i=16437 -i=16438 -i=16439 -i=16440 -i=16441 -i=16442 -i=16443 -i=16444 -i=16461 -i=16462 -i=16465 -i=16466 -i=16474 -i=16519 -i=16524 -i=16525 -i=16526 -i=16572 -i=16573 -i=16574 -i=16575 -i=16598 -i=16599 -i=16600 -i=16720 -i=16721 -i=16759 -i=16776 -i=16817 -i=16842 -i=16843 -i=16853 -i=16858 -i=16881 -i=16882 -i=16883 -i=16884 -i=16894 -i=16899 -i=16922 -i=16923 -i=16924 -i=16935 -i=16958 -i=16959 -i=16960 -i=16961 -i=16971 -i=16994 -i=16995 -i=16996 -i=16997 -i=17007 -i=17080 -i=17202 -i=17203 -i=17204 -i=17214 -i=17215 -i=17216 -i=17217 -i=17218 -i=17219 -i=17220 -i=17221 -i=17222 -i=17223 -i=17224 -i=17225 -i=17242 -i=17259 -i=17276 -i=17277 -i=17278 -i=17279 -i=17280 -i=17281 -i=17282 -i=17283 -i=17284 -i=17285 -i=17286 -i=17287 -i=17288 -i=17289 -i=17292 -i=17296 -i=17297 -i=17302 -i=17306 -i=17310 -i=17311 -i=17314 -i=17315 -i=17318 -i=17319 -i=17321 -i=17322 -i=17325 -i=17326 -i=17329 -i=17330 -i=17366 -i=17367 -i=17368 -i=17369 -i=17370 -i=17371 -i=17386 -i=17387 -i=17388 -i=17389 -i=17390 -i=17391 -i=17405 -i=17406 -i=17409 -i=17410 -i=17411 -i=17412 -i=17413 -i=17414 -i=17416 -i=17417 -i=17418 -i=17419 -i=17421 -i=17422 -i=17423 -i=17424 -i=17425 -i=17426 -i=17427 -i=17428 -i=17429 -i=17431 -i=17432 -i=17433 -i=17434 -i=17436 -i=17437 -i=17438 -i=17439 -i=17441 -i=17442 -i=17443 -i=17444 -i=17446 -i=17447 -i=17448 -i=17449 -i=17451 -i=17452 -i=17453 -i=17454 -i=17456 -i=17457 -i=17458 -i=17459 -i=17460 -i=17461 -i=17462 -i=17463 -i=17464 -i=17465 -i=17466 -i=17467 -i=17468 -i=17469 -i=17472 -i=17473 -i=17476 -i=17477 -i=17478 -i=17479 -i=17481 -i=17482 -i=17485 -i=17486 -i=17487 -i=17488 -i=17490 -i=17492 -i=17493 -i=17494 -i=17496 -i=17497 -i=17502 -i=17503 -i=17507 -i=17508 -i=17511 -i=17512 -i=17513 -i=17522 -i=17523 -i=17524 -i=17534 -i=17535 -i=17536 -i=17558 -i=17559 -i=17560 -i=17562 -i=17563 -i=17564 -i=17567 -i=17568 -i=17569 -i=17570 -i=17575 -i=17576 -i=17579 -i=17582 -i=17588 -i=17589 -i=17590 -i=17591 -i=17592 -i=17593 -i=17594 -i=17597 -i=17598 -i=17600 -#i=17602 -#i=17603 -i=17604 -i=17605 -i=17612 -i=17615 -i=17632 -i=17633 -i=17634 -#i=17635 -#i=17636 -i=17641 -i=17706 -#i=17708 -i=17709 -i=17710 -i=17712 -i=17713 -i=17714 -i=17715 -i=17716 -i=17718 -i=17719 -i=17721 -i=17724 -i=17725 -i=17732 -i=17736 -i=17737 -i=17738 -i=17739 -i=17740 -i=17741 -i=17742 -i=17743 -i=17744 -i=17745 -i=17749 -i=17750 -i=17812 -i=17813 -i=17814 -i=17815 -i=17816 -i=17817 -i=17819 -i=17820 -i=17821 -i=17822 -i=17824 -i=17825 -i=17826 -i=17827 -i=17828 -i=17829 -i=17830 -i=17832 -i=17833 -i=17834 -i=17835 -i=17837 -i=17838 -i=17839 -i=17840 -i=17842 -i=17843 -i=17844 -i=17845 -i=17847 -i=17848 -i=17849 -i=17850 -i=17852 -i=17853 -i=17854 -i=17855 -i=17856 -i=17858 -i=17859 -i=17860 -i=17864 -i=17868 -i=17869 -i=17870 -i=17871 -i=17872 -i=17874 -i=17878 -i=17885 -i=17892 -i=17900 -i=17901 -i=17902 -i=17903 -i=17913 -i=17920 -i=17927 -i=17934 -i=17969 -i=17976 -i=17983 -i=17984 -i=17985 -i=17986 -i=17987 -i=17988 -i=17989 -i=17990 -i=17991 -i=17992 -i=17993 -i=17997 -i=17998 -i=17999 -i=18001 -i=18004 -i=18005 -i=18006 -i=18007 -i=18008 -i=18011 -i=18028 -i=18029 -i=18047 -i=18069 -i=18072 -i=18073 -i=18076 -i=18077 -i=18078 -i=18079 -i=18080 -i=18081 -i=18082 -i=18088 -i=18089 -i=18155 -i=18165 -i=18166 -i=18169 -i=18172 -i=18175 -i=18178 -i=18181 -i=18184 -i=18187 -i=18190 -i=18191 -i=18195 -i=18197 -i=18198 -i=18199 -i=18347 -i=18496 -i=18665 -i=18666 -i=18715 -i=18716 -i=18717 -i=18718 -i=18719 -i=18720 -i=18722 -i=18723 -i=18724 -i=18725 -i=18727 -i=18728 -i=18729 -i=18730 -i=18731 -i=18732 -i=18733 -i=18735 -i=18736 -i=18737 -i=18738 -i=18740 -i=18741 -i=18742 -i=18743 -i=18745 -i=18746 -i=18747 -i=18748 -i=18750 -i=18751 -i=18752 -i=18753 -i=18755 -i=18756 -i=18757 -i=18758 -i=18760 -i=18761 -i=18762 -i=18763 -i=18764 -i=18765 -i=18766 -i=18767 -i=18768 -i=18769 -i=18770 -i=18771 -i=18772 -i=18773 -i=18774 -i=18776 -i=18777 -i=18778 -i=18779 -i=18780 -i=18781 -i=18783 -i=18784 -i=18785 -i=18786 -i=18787 -i=18788 -i=18789 -i=18790 -i=18791 -i=18792 -i=18796 -i=18798 -i=18799 -i=18800 -i=18801 -i=18806 -i=18807 -i=18808 -i=18809 -i=18810 -i=18811 -i=18812 -i=18813 -i=18814 -i=18815 -i=18816 -i=18817 -i=18818 -i=18819 -i=18820 -i=18821 -i=18822 -i=18823 -i=18824 -i=18827 -i=18830 -i=18833 -i=18836 -i=18839 -i=18842 -i=18845 -i=18848 -i=18851 -i=18852 -i=18853 -i=18854 -i=18855 -i=18856 -i=18857 -i=18858 -i=18859 -i=18860 -i=18863 -i=18866 -i=18869 -i=19049 -i=19052 -i=19055 -i=19058 -i=19061 -i=19064 -i=19065 -i=19066 -i=19067 -i=19068 -i=19069 -i=19070 -i=19071 -i=19072 -i=19074 -i=19075 -i=19076 -i=19077 -i=19082 -i=19083 -i=19084 -i=19090 -i=19095 -i=19241 -i=19242 -i=19243 -i=19244 -i=19245 -i=19246 -i=19248 -i=19249 -i=19250 -i=19251 -i=19253 -i=19254 -i=19255 -i=19256 -i=19257 -i=19258 -i=19259 -i=19261 -i=19262 -i=19263 -i=19264 -i=19266 -i=19267 -i=19268 -i=19269 -i=19271 -i=19272 -i=19273 -i=19274 -i=19276 -i=19277 -i=19278 -i=19279 -i=19281 -i=19282 -i=19283 -i=19284 -i=19286 -i=19287 -i=19288 -i=19293 -i=19294 -i=19295 -i=19297 -i=19450 -i=19451 -i=19452 -i=19453 -i=19454 -i=19455 -i=19456 -i=19458 -i=19459 -i=19460 -i=19461 -i=19464 -i=19465 -i=19466 -i=19467 -i=19476 -i=19478 -i=19480 -i=19482 -i=19483 -i=19484 -i=19485 -i=19487 -i=19505 -i=19509 -i=19518 -i=19550 -i=19551 -i=19552 -i=19553 -i=19554 -i=19555 -i=19557 -i=19558 -i=19559 -i=19560 -i=19562 -i=19563 -i=19564 -i=19565 -i=19566 -i=19567 -i=19568 -i=19570 -i=19571 -i=19572 -i=19573 -i=19575 -i=19576 -i=19577 -i=19578 -i=19580 -i=19581 -i=19582 -i=19583 -i=19585 -i=19586 -i=19587 -i=19588 -i=19590 -i=19591 -i=19592 -i=19593 -i=19595 -i=19596 -i=19597 -i=19598 -i=19599 -i=19609 -i=19610 -i=19611 -i=19612 -i=19613 -i=19614 -i=19616 -i=19617 -i=19618 -i=19619 -i=19621 -i=19622 -i=19623 -i=19624 -i=19625 -i=19626 -i=19627 -i=19629 -i=19630 -i=19631 -i=19632 -i=19634 -i=19635 -i=19636 -i=19637 -i=19639 -i=19640 -i=19641 -i=19642 -i=19644 -i=19645 -i=19646 -i=19647 -i=19649 -i=19650 -i=19651 -i=19652 -i=19654 -i=19655 -i=19656 -i=19657 -i=19658 -i=19677 -i=19678 -i=19679 -i=19680 -i=19681 -i=19682 -i=19684 -i=19685 -i=19686 -i=19687 -i=19689 -i=19690 -i=19691 -i=19692 -i=19693 -i=19694 -i=19695 -i=19697 -i=19698 -i=19699 -i=19700 -i=19702 -i=19703 -i=19704 -i=19705 -i=19707 -i=19708 -i=19709 -i=19710 -i=19712 -i=19713 -i=19714 -i=19715 -i=19717 -i=19718 -i=19719 -i=19720 -i=19722 -i=19723 -i=19724 -i=19725 -i=19726 -i=19727 -i=19728 -i=19729 -i=19730 -i=19731 -i=19732 -i=19777 -i=19778 -i=19779 -i=19780 -i=19781 -i=19782 -i=19783 -i=19784 -i=19785 -i=19786 -i=19831 -i=19832 -i=19833 -i=19834 -i=19848 -i=19879 -i=19880 -i=19881 -i=19882 -i=19883 -i=19885 -i=19886 -i=19887 -i=19888 -i=19890 -i=19891 -i=19892 -i=19893 -i=19895 -i=19896 -i=19897 -i=19898 -i=19899 -i=19900 -i=19901 -i=19902 -i=19903 -i=19917 -i=19948 -i=19949 -i=19950 -i=19951 -i=19952 -i=19954 -i=19955 -i=19956 -i=19957 -i=19959 -i=19960 -i=19961 -i=19962 -i=19964 -i=19965 -i=19966 -i=19967 -i=19968 -i=19982 -i=20013 -i=20014 -i=20015 -i=20016 -i=20017 -i=20019 -i=20020 -i=20021 -i=20022 -i=20023 -i=20024 -i=20025 -i=20026 -i=20027 -i=20041 -i=20072 -i=20073 -i=20074 -i=20075 -i=20076 -i=20078 -i=20079 -i=20080 -i=20081 -i=20083 -i=20084 -i=20085 -i=20086 -i=20087 -i=20088 -i=20089 -i=20090 -i=20091 -i=20092 -i=20093 -i=20094 -i=20101 -i=20138 -i=20139 -i=20141 -i=20142 -i=20143 -i=20144 -i=20145 -i=20146 -i=20147 -i=20148 -i=20149 -i=20151 -i=20152 -i=20153 -i=20154 -i=20157 -i=20158 -i=20159 -i=20160 -i=20169 -i=20171 -i=20173 -i=20175 -i=20176 -i=20177 -i=20178 -i=20180 -i=20198 -i=20202 -i=20211 -i=20249 -i=20286 -i=20287 -i=20288 -i=20289 -i=20408 -i=20998 -i=21002 -i=21006 -i=21015 -i=21016 -i=21017 -i=21018 -i=21019 -i=21020 -i=21022 -i=21023 -i=21024 -i=21025 -i=21027 -i=21028 -i=21029 -i=21030 -i=21031 -i=21032 -i=21033 -i=21035 -i=21036 -i=21037 -i=21038 -i=21040 -i=21041 -i=21042 -i=21043 -i=21045 -i=21046 -i=21047 -i=21048 -i=21050 -i=21051 -i=21052 -i=21053 -i=21055 -i=21056 -i=21057 -i=21058 -i=21060 -i=21061 -i=21062 -i=21063 -i=21064 -i=21076 -i=21077 -i=21078 -i=21079 -i=21080 -i=21081 -i=21082 -i=21083 -i=21084 -i=21085 -i=21086 -i=21090 -i=21091 -i=21092 -i=21093 -i=21094 -i=21095 -i=21096 -i=21097 -i=21098 -i=21099 -i=21100 -i=21101 -i=21102 -i=21103 -i=21104 -i=21105 -i=21106 -i=21107 -i=21108 -i=21109 -i=21110 -i=21111 -i=21112 -i=21113 -i=21114 -i=21115 -i=21116 -i=21117 -i=21119 -i=21120 -i=21121 -i=21122 -i=21123 -i=21124 -i=21125 -i=21126 -i=21127 -i=21128 -i=21129 -i=21130 -i=21131 -i=21132 -i=21133 -i=21134 -i=21135 -i=21136 -i=21137 -i=21138 -i=21139 -i=21140 -i=21141 -i=21142 -i=21143 -i=21144 -i=21145 -i=21146 -i=21147 -i=21149 -i=21150 -i=21151 -i=21152 -i=21153 -i=21154 -i=21155 -i=21156 -i=21159 -i=21162 -i=21165 -i=21168 -i=21171 -i=21174 -i=21175 -i=21176 -i=21177 -i=21178 -i=21179 -i=21180 -i=21183 -i=21186 -i=21189 -i=21192 -i=21195 -i=21198 -i=21199 -i=21200 -i=21201 -i=21202 -i=21203 - - -ns=http://opcfoundation.org/UA/DI/;i=6423 -ns=http://opcfoundation.org/UA/DI/;i=6425 -ns=http://opcfoundation.org/UA/DI/;i=6435 -ns=http://opcfoundation.org/UA/DI/;i=6437 -ns=http://opcfoundation.org/UA/DI/;i=6535 -ns=http://opcfoundation.org/UA/DI/;i=6538 -ns=http://opcfoundation.org/UA/DI/;i=6539 -ns=http://opcfoundation.org/UA/DI/;i=6548 -ns=http://opcfoundation.org/UA/DI/;i=6551 -ns=http://opcfoundation.org/UA/DI/;i=6554 -ns=http://opcfoundation.org/UA/DI/;i=6555 -ns=http://opcfoundation.org/UA/DI/;i=6564 -ns=http://opcfoundation.org/UA/DI/;i=15001 -ns=http://opcfoundation.org/UA/DI/;i=15002 -ns=http://opcfoundation.org/UA/DI/;i=15003 -ns=http://opcfoundation.org/UA/DI/;i=15004 -ns=http://opcfoundation.org/UA/DI/;i=15005 -ns=http://opcfoundation.org/UA/DI/;i=15006 -ns=http://opcfoundation.org/UA/DI/;i=15007 -ns=http://opcfoundation.org/UA/DI/;i=15008 -ns=http://opcfoundation.org/UA/DI/;i=15031 -ns=http://opcfoundation.org/UA/DI/;i=15032 -ns=http://opcfoundation.org/UA/DI/;i=15033 -ns=http://opcfoundation.org/UA/DI/;i=15035 -ns=http://opcfoundation.org/UA/DI/;i=15036 -ns=http://opcfoundation.org/UA/DI/;i=15037 -ns=http://opcfoundation.org/UA/DI/;i=15038 -ns=http://opcfoundation.org/UA/DI/;i=15039 -ns=http://opcfoundation.org/UA/DI/;i=15040 -ns=http://opcfoundation.org/UA/DI/;i=15041 -ns=http://opcfoundation.org/UA/DI/;i=15042 -ns=http://opcfoundation.org/UA/DI/;i=15043 -ns=http://opcfoundation.org/UA/DI/;i=15044 -ns=http://opcfoundation.org/UA/DI/;i=15045 -ns=http://opcfoundation.org/UA/DI/;i=15046 -ns=http://opcfoundation.org/UA/DI/;i=15047 -ns=http://opcfoundation.org/UA/DI/;i=15048 -ns=http://opcfoundation.org/UA/DI/;i=15049 -ns=http://opcfoundation.org/UA/DI/;i=15050 -ns=http://opcfoundation.org/UA/DI/;i=15051 -ns=http://opcfoundation.org/UA/DI/;i=15052 -ns=http://opcfoundation.org/UA/DI/;i=15053 -ns=http://opcfoundation.org/UA/DI/;i=15054 -ns=http://opcfoundation.org/UA/DI/;i=15055 -ns=http://opcfoundation.org/UA/DI/;i=15056 -ns=http://opcfoundation.org/UA/DI/;i=15057 -ns=http://opcfoundation.org/UA/DI/;i=15058 -ns=http://opcfoundation.org/UA/DI/;i=15059 -ns=http://opcfoundation.org/UA/DI/;i=15060 -ns=http://opcfoundation.org/UA/DI/;i=15061 -ns=http://opcfoundation.org/UA/DI/;i=15062 -ns=http://opcfoundation.org/UA/DI/;i=15143 -ns=http://opcfoundation.org/UA/DI/;i=15292 -ns=http://opcfoundation.org/UA/DI/;i=15441 -ns=http://opcfoundation.org/UA/DI/;i=15590 -ns=http://opcfoundation.org/UA/DI/;i=15739 -ns=http://opcfoundation.org/UA/DI/;i=15891 -ns=http://opcfoundation.org/UA/DI/;i=15892 -ns=http://opcfoundation.org/UA/DI/;i=15893 -ns=http://opcfoundation.org/UA/DI/;i=15894 -ns=http://opcfoundation.org/UA/DI/;i=15897 -ns=http://opcfoundation.org/UA/DI/;i=15900 -ns=http://opcfoundation.org/UA/DI/;i=15901 -ns=http://opcfoundation.org/UA/DI/;i=15902 -ns=http://opcfoundation.org/UA/DI/;i=15903 -ns=http://opcfoundation.org/UA/DI/;i=15906 -ns=http://opcfoundation.org/UA/DI/;i=15909 -ns=http://opcfoundation.org/UA/DI/;i=15910 -ns=http://opcfoundation.org/UA/DI/;i=15911 -ns=http://opcfoundation.org/UA/DI/;i=15912 diff --git a/partitions_example.csv b/partitions_example.csv index a132385..c205b4b 100644 --- a/partitions_example.csv +++ b/partitions_example.csv @@ -2,5 +2,5 @@ # Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap nvs, data, nvs, 0xa000, 0x5000, phy_init, data, phy, 0xf000, 0x1000, -factory, app, factory, 0x10000, 2M, -storage, data, fat, , 528K, \ No newline at end of file +factory, app, factory, 0x10000, 3M, +storage, data, fat, , 960K, \ No newline at end of file diff --git a/sdkconfig.defaults b/sdkconfig.defaults index 34fe26a..151bcd5 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -1,3 +1,5 @@ +CONFIG_ETHERNET_HELPER_CUSTOM_HOSTNAME=y +CONFIG_ETHERNET_HELPER_CUSTOM_HOSTNAME_STR="esp32-opcua" CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_example.csv" CONFIG_PARTITION_TABLE_FILENAME="partitions_example.csv"